From 73f4d0f57b54d53420b290748bfa0ae59ed9ea6c Mon Sep 17 00:00:00 2001 From: Cloyd Lau <31238760+cloydlau@users.noreply.github.com> Date: Sat, 3 Feb 2024 14:03:41 +0800 Subject: [PATCH 01/14] fix(components): [carousel] improve a11y (#15579) * fix(a11y): carousel buttons do not have an accessible name * fix: eslint warnings * chore: change the label content * feat: improve i18n --- packages/components/carousel/src/carousel.vue | 11 +++++++++-- packages/locale/lang/af.ts | 5 +++++ packages/locale/lang/ar-eg.ts | 5 +++++ packages/locale/lang/ar.ts | 5 +++++ packages/locale/lang/az.ts | 5 +++++ packages/locale/lang/bg.ts | 5 +++++ packages/locale/lang/bn.ts | 5 +++++ packages/locale/lang/ca.ts | 5 +++++ packages/locale/lang/ckb.ts | 5 +++++ packages/locale/lang/cs.ts | 5 +++++ packages/locale/lang/da.ts | 5 +++++ packages/locale/lang/de.ts | 5 +++++ packages/locale/lang/el.ts | 5 +++++ packages/locale/lang/en.ts | 5 +++++ packages/locale/lang/eo.ts | 5 +++++ packages/locale/lang/es.ts | 5 +++++ packages/locale/lang/et.ts | 5 +++++ packages/locale/lang/eu.ts | 5 +++++ packages/locale/lang/fa.ts | 5 +++++ packages/locale/lang/fi.ts | 5 +++++ packages/locale/lang/fr.ts | 5 +++++ packages/locale/lang/he.ts | 5 +++++ packages/locale/lang/hr.ts | 5 +++++ packages/locale/lang/hu.ts | 5 +++++ packages/locale/lang/hy-am.ts | 5 +++++ packages/locale/lang/id.ts | 5 +++++ packages/locale/lang/it.ts | 5 +++++ packages/locale/lang/ja.ts | 5 +++++ packages/locale/lang/kk.ts | 5 +++++ packages/locale/lang/km.ts | 5 +++++ packages/locale/lang/ko.ts | 5 +++++ packages/locale/lang/ku.ts | 5 +++++ packages/locale/lang/ky.ts | 5 +++++ packages/locale/lang/lt.ts | 5 +++++ packages/locale/lang/lv.ts | 5 +++++ packages/locale/lang/mg.ts | 5 +++++ packages/locale/lang/mn.ts | 5 +++++ packages/locale/lang/nb-no.ts | 5 +++++ packages/locale/lang/nl.ts | 5 +++++ packages/locale/lang/pa.ts | 5 +++++ packages/locale/lang/pl.ts | 5 +++++ packages/locale/lang/pt-br.ts | 5 +++++ packages/locale/lang/pt.ts | 5 +++++ packages/locale/lang/ro.ts | 5 +++++ packages/locale/lang/ru.ts | 5 +++++ packages/locale/lang/sk.ts | 5 +++++ packages/locale/lang/sl.ts | 5 +++++ packages/locale/lang/sr.ts | 5 +++++ packages/locale/lang/sv.ts | 5 +++++ packages/locale/lang/sw.ts | 5 +++++ packages/locale/lang/ta.ts | 5 +++++ packages/locale/lang/th.ts | 5 +++++ packages/locale/lang/tk.ts | 5 +++++ packages/locale/lang/tr.ts | 5 +++++ packages/locale/lang/ug-cn.ts | 5 +++++ packages/locale/lang/uk.ts | 5 +++++ packages/locale/lang/uz-uz.ts | 5 +++++ packages/locale/lang/vi.ts | 5 +++++ packages/locale/lang/zh-cn.ts | 5 +++++ packages/locale/lang/zh-tw.ts | 5 +++++ 60 files changed, 304 insertions(+), 2 deletions(-) diff --git a/packages/components/carousel/src/carousel.vue b/packages/components/carousel/src/carousel.vue index b8d111458ace4..7eb069568cbd2 100644 --- a/packages/components/carousel/src/carousel.vue +++ b/packages/components/carousel/src/carousel.vue @@ -13,6 +13,7 @@ " type="button" :class="[ns.e('arrow'), ns.em('arrow', 'left')]" + :aria-label="t('el.carousel.leftArrow')" @mouseenter="handleButtonEnter('left')" @mouseleave="handleButtonLeave" @click.stop="throttledArrowClick(activeIndex - 1)" @@ -30,6 +31,7 @@ " type="button" :class="[ns.e('arrow'), ns.em('arrow', 'right')]" + :aria-label="t('el.carousel.rightArrow')" @mouseenter="handleButtonEnter('right')" @mouseleave="handleButtonLeave" @click.stop="throttledArrowClick(activeIndex + 1)" @@ -55,7 +57,10 @@ @mouseenter="throttledIndicatorHover(index)" @click.stop="handleIndicatorClick(index)" > - @@ -67,7 +72,7 @@ import { computed, unref } from 'vue' import { ElIcon } from '@element-plus/components/icon' import { ArrowLeft, ArrowRight } from '@element-plus/icons-vue' -import { useNamespace } from '@element-plus/hooks' +import { useLocale, useNamespace } from '@element-plus/hooks' import { carouselEmits, carouselProps } from './carousel' import { useCarousel } from './use-carousel' @@ -103,6 +108,8 @@ const { } = useCarousel(props, emit, COMPONENT_NAME) const ns = useNamespace('carousel') +const { t } = useLocale() + const carouselClasses = computed(() => { const classes = [ns.b(), ns.m(props.direction)] if (unref(isCardType)) { diff --git a/packages/locale/lang/af.ts b/packages/locale/lang/af.ts index a18f0335b18d4..7ada1d06a11eb 100644 --- a/packages/locale/lang/af.ts +++ b/packages/locale/lang/af.ts @@ -123,5 +123,10 @@ export default { confirmButtonText: 'Yes', // to be translated cancelButtonText: 'No', // to be translated }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/ar-eg.ts b/packages/locale/lang/ar-eg.ts index 8054ae640dd1b..a3e4a49a174ad 100644 --- a/packages/locale/lang/ar-eg.ts +++ b/packages/locale/lang/ar-eg.ts @@ -148,5 +148,10 @@ export default { confirmButtonText: 'نعم', cancelButtonText: 'لا', }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/ar.ts b/packages/locale/lang/ar.ts index 12dec1b8523f4..73b0dd4145a8a 100644 --- a/packages/locale/lang/ar.ts +++ b/packages/locale/lang/ar.ts @@ -143,5 +143,10 @@ export default { confirmButtonText: 'Yes', // to be translated cancelButtonText: 'No', // to be translated }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/az.ts b/packages/locale/lang/az.ts index dea418694a8bb..245597f79fa05 100644 --- a/packages/locale/lang/az.ts +++ b/packages/locale/lang/az.ts @@ -126,5 +126,10 @@ export default { empty: { description: 'Məlumat yoxdur', }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/bg.ts b/packages/locale/lang/bg.ts index 0f4808431f4a5..563e436d96349 100644 --- a/packages/locale/lang/bg.ts +++ b/packages/locale/lang/bg.ts @@ -123,5 +123,10 @@ export default { confirmButtonText: 'Yes', // to be translated cancelButtonText: 'No', // to be translated }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/bn.ts b/packages/locale/lang/bn.ts index 4eb30cf0d7c30..edb826e9ce459 100644 --- a/packages/locale/lang/bn.ts +++ b/packages/locale/lang/bn.ts @@ -125,5 +125,10 @@ export default { confirmButtonText: 'হ্যা', cancelButtonText: 'না', }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/ca.ts b/packages/locale/lang/ca.ts index ae71e091c5378..34fd97ddde981 100644 --- a/packages/locale/lang/ca.ts +++ b/packages/locale/lang/ca.ts @@ -122,5 +122,10 @@ export default { confirmButtonText: 'Sí', cancelButtonText: 'No', }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/ckb.ts b/packages/locale/lang/ckb.ts index 332970bc2784a..6f03ac677e789 100644 --- a/packages/locale/lang/ckb.ts +++ b/packages/locale/lang/ckb.ts @@ -161,5 +161,10 @@ export default { confirmButtonText: 'بەڵێ', cancelButtonText: 'نەخێر', }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/cs.ts b/packages/locale/lang/cs.ts index 1cb7f5ee50f1c..42326b4985459 100644 --- a/packages/locale/lang/cs.ts +++ b/packages/locale/lang/cs.ts @@ -125,5 +125,10 @@ export default { confirmButtonText: 'Yes', // to be translated cancelButtonText: 'No', // to be translated }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/da.ts b/packages/locale/lang/da.ts index 683bf940f0819..8fb66ba235d37 100644 --- a/packages/locale/lang/da.ts +++ b/packages/locale/lang/da.ts @@ -122,5 +122,10 @@ export default { confirmButtonText: 'Yes', // to be translated cancelButtonText: 'No', // to be translated }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/de.ts b/packages/locale/lang/de.ts index 2210fc70d78ed..186d8a745e5c9 100644 --- a/packages/locale/lang/de.ts +++ b/packages/locale/lang/de.ts @@ -129,5 +129,10 @@ export default { confirmButtonText: 'Ja', cancelButtonText: 'Nein', }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/el.ts b/packages/locale/lang/el.ts index ad9eecb3d0ff3..167739e37847d 100644 --- a/packages/locale/lang/el.ts +++ b/packages/locale/lang/el.ts @@ -123,5 +123,10 @@ export default { confirmButtonText: 'Yes', // to be translated cancelButtonText: 'No', // to be translated }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/en.ts b/packages/locale/lang/en.ts index e1e07995bfdeb..e2432d9b5250d 100644 --- a/packages/locale/lang/en.ts +++ b/packages/locale/lang/en.ts @@ -166,5 +166,10 @@ export default { confirmButtonText: 'Yes', cancelButtonText: 'No', }, + carousel: { + leftArrow: 'Carousel arrow left', + rightArrow: 'Carousel arrow right', + indicator: 'Carousel switch to index {index}', + }, }, } diff --git a/packages/locale/lang/eo.ts b/packages/locale/lang/eo.ts index d7d20a9dbe14e..5a9c2559096bd 100644 --- a/packages/locale/lang/eo.ts +++ b/packages/locale/lang/eo.ts @@ -123,5 +123,10 @@ export default { confirmButtonText: 'Yes', // to be translated cancelButtonText: 'No', // to be translated }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/es.ts b/packages/locale/lang/es.ts index 88206f833fb0a..a6304fcf85b06 100644 --- a/packages/locale/lang/es.ts +++ b/packages/locale/lang/es.ts @@ -122,5 +122,10 @@ export default { confirmButtonText: 'Si', cancelButtonText: 'No', }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/et.ts b/packages/locale/lang/et.ts index 46ce66dc6055b..295e74aa9a71b 100644 --- a/packages/locale/lang/et.ts +++ b/packages/locale/lang/et.ts @@ -123,5 +123,10 @@ export default { confirmButtonText: 'Jah', cancelButtonText: 'Ei', }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/eu.ts b/packages/locale/lang/eu.ts index c543ae472b725..6768565e3dc56 100644 --- a/packages/locale/lang/eu.ts +++ b/packages/locale/lang/eu.ts @@ -128,5 +128,10 @@ export default { confirmButtonText: 'Yes', // to be translated cancelButtonText: 'No', // to be translated }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/fa.ts b/packages/locale/lang/fa.ts index 9089af6456f01..41c5a8bda22a4 100644 --- a/packages/locale/lang/fa.ts +++ b/packages/locale/lang/fa.ts @@ -128,5 +128,10 @@ export default { confirmButtonText: 'بله', cancelButtonText: 'خیر', }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/fi.ts b/packages/locale/lang/fi.ts index aefdea745561d..77996ca9571f8 100644 --- a/packages/locale/lang/fi.ts +++ b/packages/locale/lang/fi.ts @@ -123,5 +123,10 @@ export default { confirmButtonText: 'Yes', // to be translated cancelButtonText: 'No', // to be translated }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/fr.ts b/packages/locale/lang/fr.ts index 3ad21f526de0d..70b70d403a1d5 100644 --- a/packages/locale/lang/fr.ts +++ b/packages/locale/lang/fr.ts @@ -160,5 +160,10 @@ export default { confirmButtonText: 'Oui', cancelButtonText: 'Non', }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/he.ts b/packages/locale/lang/he.ts index a9c69d4e19c9b..ce4752c47c0e2 100644 --- a/packages/locale/lang/he.ts +++ b/packages/locale/lang/he.ts @@ -123,5 +123,10 @@ export default { confirmButtonText: 'כן', cancelButtonText: 'לא', }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/hr.ts b/packages/locale/lang/hr.ts index 1c9731d7b80ec..29451b8cedb42 100644 --- a/packages/locale/lang/hr.ts +++ b/packages/locale/lang/hr.ts @@ -123,5 +123,10 @@ export default { confirmButtonText: 'Yes', // to be translated cancelButtonText: 'No', // to be translated }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/hu.ts b/packages/locale/lang/hu.ts index 6e8edc6a7e330..3c3345533f6a7 100644 --- a/packages/locale/lang/hu.ts +++ b/packages/locale/lang/hu.ts @@ -122,5 +122,10 @@ export default { confirmButtonText: 'Yes', // to be translated cancelButtonText: 'No', // to be translated }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/hy-am.ts b/packages/locale/lang/hy-am.ts index 20783edef4134..365b5056239c4 100644 --- a/packages/locale/lang/hy-am.ts +++ b/packages/locale/lang/hy-am.ts @@ -123,5 +123,10 @@ export default { confirmButtonText: 'Yes', // to be translated cancelButtonText: 'No', // to be translated }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/id.ts b/packages/locale/lang/id.ts index 4401e72bcc34f..ff0f6514d59f8 100644 --- a/packages/locale/lang/id.ts +++ b/packages/locale/lang/id.ts @@ -125,5 +125,10 @@ export default { confirmButtonText: 'Ya', cancelButtonText: 'Tidak', }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/it.ts b/packages/locale/lang/it.ts index 4200e3a9f160f..a84cfd160e162 100644 --- a/packages/locale/lang/it.ts +++ b/packages/locale/lang/it.ts @@ -122,5 +122,10 @@ export default { confirmButtonText: 'Yes', // to be translated cancelButtonText: 'No', // to be translated }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/ja.ts b/packages/locale/lang/ja.ts index cf00878adbfa3..53a17d66e85c5 100644 --- a/packages/locale/lang/ja.ts +++ b/packages/locale/lang/ja.ts @@ -128,5 +128,10 @@ export default { confirmButtonText: 'はい', cancelButtonText: 'いいえ', }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/kk.ts b/packages/locale/lang/kk.ts index 684aa34b6bf4c..12cd3fd846eb6 100644 --- a/packages/locale/lang/kk.ts +++ b/packages/locale/lang/kk.ts @@ -123,5 +123,10 @@ export default { confirmButtonText: 'Yes', // to be translated cancelButtonText: 'No', // to be translated }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/km.ts b/packages/locale/lang/km.ts index 0a2d8ebe723bc..df7891b5c7c99 100644 --- a/packages/locale/lang/km.ts +++ b/packages/locale/lang/km.ts @@ -123,5 +123,10 @@ export default { confirmButtonText: 'យល់ព្រម', cancelButtonText: 'មិនព្រម', }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/ko.ts b/packages/locale/lang/ko.ts index 004f8e5a4eb9d..92e21a48dae60 100644 --- a/packages/locale/lang/ko.ts +++ b/packages/locale/lang/ko.ts @@ -156,5 +156,10 @@ export default { confirmButtonText: '예', cancelButtonText: '아니오', }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/ku.ts b/packages/locale/lang/ku.ts index d994f1234711a..063dfaf3d0797 100644 --- a/packages/locale/lang/ku.ts +++ b/packages/locale/lang/ku.ts @@ -123,5 +123,10 @@ export default { confirmButtonText: 'Yes', // to be translated cancelButtonText: 'No', // to be translated }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/ky.ts b/packages/locale/lang/ky.ts index 0eb8cd19eccf3..75fcfbe54b8f7 100644 --- a/packages/locale/lang/ky.ts +++ b/packages/locale/lang/ky.ts @@ -123,5 +123,10 @@ export default { confirmButtonText: 'Yes', // to be translated cancelButtonText: 'No', // to be translated }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/lt.ts b/packages/locale/lang/lt.ts index 12d7dace0079b..fb6e7ca282061 100644 --- a/packages/locale/lang/lt.ts +++ b/packages/locale/lang/lt.ts @@ -128,5 +128,10 @@ export default { confirmButtonText: 'Yes', // to be translated cancelButtonText: 'No', // to be translated }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/lv.ts b/packages/locale/lang/lv.ts index ec06a9cf33723..5ef795c90dce1 100644 --- a/packages/locale/lang/lv.ts +++ b/packages/locale/lang/lv.ts @@ -123,5 +123,10 @@ export default { confirmButtonText: 'Yes', // to be translated cancelButtonText: 'No', // to be translated }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/mg.ts b/packages/locale/lang/mg.ts index b92bebb6baf42..4038788369563 100644 --- a/packages/locale/lang/mg.ts +++ b/packages/locale/lang/mg.ts @@ -125,5 +125,10 @@ export default { confirmButtonText: 'Eny', cancelButtonText: 'Tsy', }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/mn.ts b/packages/locale/lang/mn.ts index 1a296c80096c4..7d07e30ebc31f 100644 --- a/packages/locale/lang/mn.ts +++ b/packages/locale/lang/mn.ts @@ -123,5 +123,10 @@ export default { confirmButtonText: 'Yes', // to be translated cancelButtonText: 'No', // to be translated }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/nb-no.ts b/packages/locale/lang/nb-no.ts index 6b8491705a084..6f9e6438efcc3 100644 --- a/packages/locale/lang/nb-no.ts +++ b/packages/locale/lang/nb-no.ts @@ -122,5 +122,10 @@ export default { confirmButtonText: 'Ja', cancelButtonText: 'Nei', }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/nl.ts b/packages/locale/lang/nl.ts index 1ee3072cb5946..9f1c448dd669e 100644 --- a/packages/locale/lang/nl.ts +++ b/packages/locale/lang/nl.ts @@ -123,5 +123,10 @@ export default { confirmButtonText: 'Ja', cancelButtonText: 'Nee', }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/pa.ts b/packages/locale/lang/pa.ts index 1507243af3acc..2469f25882553 100644 --- a/packages/locale/lang/pa.ts +++ b/packages/locale/lang/pa.ts @@ -123,5 +123,10 @@ export default { confirmButtonText: 'Yes', // to be translated cancelButtonText: 'No', // to be translated }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/pl.ts b/packages/locale/lang/pl.ts index 3a1e4d7ab0ef7..244f89e9d409e 100644 --- a/packages/locale/lang/pl.ts +++ b/packages/locale/lang/pl.ts @@ -128,5 +128,10 @@ export default { confirmButtonText: 'Tak', cancelButtonText: 'Nie', }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/pt-br.ts b/packages/locale/lang/pt-br.ts index 5a5a3a557ecf6..75d97cb5c3eaf 100644 --- a/packages/locale/lang/pt-br.ts +++ b/packages/locale/lang/pt-br.ts @@ -128,5 +128,10 @@ export default { confirmButtonText: 'Sim', cancelButtonText: 'Não', }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/pt.ts b/packages/locale/lang/pt.ts index 9780000cc9b6e..0a2079f8b2268 100644 --- a/packages/locale/lang/pt.ts +++ b/packages/locale/lang/pt.ts @@ -123,5 +123,10 @@ export default { confirmButtonText: 'Yes', // to be translated cancelButtonText: 'No', // to be translated }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/ro.ts b/packages/locale/lang/ro.ts index 9069335d75267..974260b651ace 100644 --- a/packages/locale/lang/ro.ts +++ b/packages/locale/lang/ro.ts @@ -123,5 +123,10 @@ export default { confirmButtonText: 'Yes', // to be translated cancelButtonText: 'No', // to be translated }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/ru.ts b/packages/locale/lang/ru.ts index bf61b6a9ca2ed..fb431cb4b464d 100644 --- a/packages/locale/lang/ru.ts +++ b/packages/locale/lang/ru.ts @@ -128,5 +128,10 @@ export default { confirmButtonText: 'OK', cancelButtonText: 'Отмена', }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/sk.ts b/packages/locale/lang/sk.ts index cbfd2449f331b..742d0d5a33936 100644 --- a/packages/locale/lang/sk.ts +++ b/packages/locale/lang/sk.ts @@ -125,5 +125,10 @@ export default { confirmButtonText: 'Yes', // to be translated cancelButtonText: 'No', // to be translated }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/sl.ts b/packages/locale/lang/sl.ts index 423d0562c5bb1..65d6e6017a616 100644 --- a/packages/locale/lang/sl.ts +++ b/packages/locale/lang/sl.ts @@ -123,5 +123,10 @@ export default { confirmButtonText: 'Yes', // to be translated cancelButtonText: 'No', // to be translated }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/sr.ts b/packages/locale/lang/sr.ts index 8d586ee346e4c..8a8d91b5ff253 100644 --- a/packages/locale/lang/sr.ts +++ b/packages/locale/lang/sr.ts @@ -123,5 +123,10 @@ export default { confirmButtonText: 'Да', cancelButtonText: 'Не', }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/sv.ts b/packages/locale/lang/sv.ts index 8ff9d4f94bfd4..92a9fffd2cb2d 100644 --- a/packages/locale/lang/sv.ts +++ b/packages/locale/lang/sv.ts @@ -128,5 +128,10 @@ export default { confirmButtonText: 'Ja', cancelButtonText: 'Nej', }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/sw.ts b/packages/locale/lang/sw.ts index 57e462ccb3025..cd112646aebf9 100644 --- a/packages/locale/lang/sw.ts +++ b/packages/locale/lang/sw.ts @@ -162,5 +162,10 @@ export default { confirmButtonText: 'ndio', cancelButtonText: 'hapana', }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/ta.ts b/packages/locale/lang/ta.ts index b52ecb53de1c8..2bf1db99ba248 100644 --- a/packages/locale/lang/ta.ts +++ b/packages/locale/lang/ta.ts @@ -122,5 +122,10 @@ export default { confirmButtonText: 'Yes', // to be translated cancelButtonText: 'No', // to be translated }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/th.ts b/packages/locale/lang/th.ts index b6cac8659e56e..33f9cd2fdf7a8 100644 --- a/packages/locale/lang/th.ts +++ b/packages/locale/lang/th.ts @@ -128,5 +128,10 @@ export default { confirmButtonText: 'Yes', // to be translated cancelButtonText: 'No', // to be translated }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/tk.ts b/packages/locale/lang/tk.ts index a43233cfab8c5..27b7ba4fcb773 100644 --- a/packages/locale/lang/tk.ts +++ b/packages/locale/lang/tk.ts @@ -123,5 +123,10 @@ export default { confirmButtonText: 'Yes', // to be translated cancelButtonText: 'No', // to be translated }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/tr.ts b/packages/locale/lang/tr.ts index 05bdd1268bf1f..e49fb4521c8fc 100644 --- a/packages/locale/lang/tr.ts +++ b/packages/locale/lang/tr.ts @@ -123,5 +123,10 @@ export default { confirmButtonText: 'Evet', cancelButtonText: 'Hayır', }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/ug-cn.ts b/packages/locale/lang/ug-cn.ts index 54e4a8b2cac87..c2b88291dbe99 100644 --- a/packages/locale/lang/ug-cn.ts +++ b/packages/locale/lang/ug-cn.ts @@ -123,5 +123,10 @@ export default { confirmButtonText: 'Yes', // to be translated cancelButtonText: 'No', // to be translated }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/uk.ts b/packages/locale/lang/uk.ts index dd17f344ea797..5e07c9579ad87 100644 --- a/packages/locale/lang/uk.ts +++ b/packages/locale/lang/uk.ts @@ -128,5 +128,10 @@ export default { confirmButtonText: 'Yes', // to be translated cancelButtonText: 'No', // to be translated }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/uz-uz.ts b/packages/locale/lang/uz-uz.ts index b59478ed42b2a..35d6cf4bb3348 100644 --- a/packages/locale/lang/uz-uz.ts +++ b/packages/locale/lang/uz-uz.ts @@ -123,5 +123,10 @@ export default { confirmButtonText: 'Yes', // to be translated cancelButtonText: 'No', // to be translated }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/vi.ts b/packages/locale/lang/vi.ts index caab5f8e1cead..8335482c943dd 100644 --- a/packages/locale/lang/vi.ts +++ b/packages/locale/lang/vi.ts @@ -128,5 +128,10 @@ export default { confirmButtonText: 'Ok', cancelButtonText: 'Huỷ', }, + carousel: { + leftArrow: 'Carousel arrow left', // to be translated + rightArrow: 'Carousel arrow right', // to be translated + indicator: 'Carousel switch to index {index}', // to be translated + }, }, } diff --git a/packages/locale/lang/zh-cn.ts b/packages/locale/lang/zh-cn.ts index 6d3854c56a0fc..2accc5fafabc7 100644 --- a/packages/locale/lang/zh-cn.ts +++ b/packages/locale/lang/zh-cn.ts @@ -130,5 +130,10 @@ export default { confirmButtonText: '确定', cancelButtonText: '取消', }, + carousel: { + leftArrow: '上一张幻灯片', + rightArrow: '下一张幻灯片', + indicator: '幻灯片切换至索引 {index}', + }, }, } diff --git a/packages/locale/lang/zh-tw.ts b/packages/locale/lang/zh-tw.ts index ffc94d13f23fc..ca509396eb248 100644 --- a/packages/locale/lang/zh-tw.ts +++ b/packages/locale/lang/zh-tw.ts @@ -164,5 +164,10 @@ export default { confirmButtonText: '確認', cancelButtonText: '取消', }, + carousel: { + leftArrow: '上一張投影片', + rightArrow: '下一張投影片', + indicator: '投影片切換至索引 {index}', + }, }, } From 9c9ebec0eaa5a331c8b61725a4a264739daed40d Mon Sep 17 00:00:00 2001 From: dopamine Date: Sun, 4 Feb 2024 11:06:39 +0800 Subject: [PATCH 02/14] fix(components): [number-input] cannot scroll the container when the mouse pointer over an input (#15211) --- packages/components/input-number/src/input-number.vue | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/components/input-number/src/input-number.vue b/packages/components/input-number/src/input-number.vue index 68306270fe6c9..ddced5bc5cc68 100755 --- a/packages/components/input-number/src/input-number.vue +++ b/packages/components/input-number/src/input-number.vue @@ -50,7 +50,7 @@ :name="name" :label="label" :validate-event="false" - @wheel.prevent + @wheel="handleWheel" @keydown.up.prevent="increase" @keydown.down.prevent="decrease" @blur="handleBlur" @@ -288,6 +288,10 @@ const setCurrentValueToModelValue = () => { data.currentValue = props.modelValue } } +const handleWheel = (e: MouseEvent) => { + if (document.activeElement === e.target) e.preventDefault() +} + watch( () => props.modelValue, (value, oldValue) => { From f379af8aabb723e609584e2f6308b13385289a67 Mon Sep 17 00:00:00 2001 From: Dewdew <57179957+yeonjulee1005@users.noreply.github.com> Date: Sun, 4 Feb 2024 16:56:02 +0900 Subject: [PATCH 03/14] feat(style): add og-image & apply lint (#15588) * feat(style): add og-image & apply lint * update Review --- .github/triage.yml | 2 +- docs/.vitepress/config/head.ts | 7 ++ docs/en-US/component/cascader.md | 2 +- docs/en-US/component/image.md | 40 ++++---- docs/en-US/component/link.md | 4 +- docs/en-US/component/select-v2.md | 8 +- docs/en-US/component/select.md | 4 +- docs/public/images/element-plus-og-image.png | Bin 0 -> 61402 bytes packages/theme-chalk/src/common/var.scss | 48 +++++----- packages/theme-chalk/src/form.scss | 69 +++++++------- packages/theme-chalk/src/input.scss | 92 ++++++++++--------- packages/theme-chalk/src/select.scss | 18 ++-- 12 files changed, 154 insertions(+), 140 deletions(-) create mode 100644 docs/public/images/element-plus-og-image.png diff --git a/.github/triage.yml b/.github/triage.yml index 0ce71fa5291a5..abad4de1a7ba4 100644 --- a/.github/triage.yml +++ b/.github/triage.yml @@ -14,4 +14,4 @@ PRGreetings: | - You can comment with `/label Components:[component_name]` to add a label for which component you are working on. - You may join our Discord for staying tuned. firstPRMergeComment: > - Thank you for your contribution! \ No newline at end of file + Thank you for your contribution! diff --git a/docs/.vitepress/config/head.ts b/docs/.vitepress/config/head.ts index d82ff32697c25..9864ba916a702 100644 --- a/docs/.vitepress/config/head.ts +++ b/docs/.vitepress/config/head.ts @@ -51,6 +51,13 @@ export const head: HeadConfig[] = [ content: '/browserconfig.xml', }, ], + [ + 'meta', + { + property: 'og:image', + content: '/images/element-plus-og-image.png', + }, + ], [ 'script', {}, diff --git a/docs/en-US/component/cascader.md b/docs/en-US/component/cascader.md index b23d72cf57fc6..aacec4e1f22b2 100644 --- a/docs/en-US/component/cascader.md +++ b/docs/en-US/component/cascader.md @@ -64,7 +64,7 @@ Do: ``` diff --git a/docs/en-US/component/image.md b/docs/en-US/component/image.md index e54fbdf4c5668..712e00bf95744 100644 --- a/docs/en-US/component/image.md +++ b/docs/en-US/component/image.md @@ -59,26 +59,26 @@ image/image-preview ### Image Attributes -| Name | Description | Type | Default | -| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | --------- | -| src | image source, same as native. | ^[string] | '' | -| fit | indicate how the image should be resized to fit its container, same as [object-fit](https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit). | ^[enum]`'' \| 'fill' \| 'contain' \| 'cover' \| 'none' \| 'scale-down'` | '' | -| hide-on-click-modal | when enabling preview, use this flag to control whether clicking on backdrop can exit preview mode. | ^[boolean] | false | -| loading ^(2.2.3) | Indicates how the browser should load the image, same as [native](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#attr-loading). | ^[enum]`'eager' \| 'lazy'` | — | -| lazy | whether to use lazy load. | ^[boolean] | false | -| scroll-container | the container to add scroll listener when using lazy load. By default, the container to add scroll listener when using lazy load. | ^[string] / ^[object]`HTMLElement` | — | -| alt | native attribute `alt`. | ^[string] | — | -| referrerpolicy | native attribute [referrerPolicy](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/referrerPolicy). | ^[string] | — | -| crossorigin | native attribute [crossorigin](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/crossorigin). | ^[enum]`'' \| 'anonymous' \| 'use-credentials'` | — | -| preview-src-list | allow big image preview. | ^[object]`string[]` | [] | -| z-index | set image preview z-index. | ^[number] | — | -| initial-index | initial preview image index, less than the length of `url-list`. | ^[number] | 0 | -| close-on-press-escape | whether the image-viewer can be closed by pressing ESC. | ^[boolean] | true | -| preview-teleported | whether to append image-viewer to body. A nested parent element attribute transform should have this attribute set to `true`. | ^[boolean] | false | -| infinite | whether the viewer preview is infinite. | ^[boolean] | true | -| zoom-rate | the zoom rate of the image viewer zoom event. | ^[number] | 1.2 | -| min-scale ^(2.4.0) | the min scale of the image viewer zoom event. | ^[number] | 0.2 | -| max-scale ^(2.4.0) | the max scale of the image viewer zoom event. | ^[number] | 7 | +| Name | Description | Type | Default | +| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | ------- | +| src | image source, same as native. | ^[string] | '' | +| fit | indicate how the image should be resized to fit its container, same as [object-fit](https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit). | ^[enum]`'' \| 'fill' \| 'contain' \| 'cover' \| 'none' \| 'scale-down'` | '' | +| hide-on-click-modal | when enabling preview, use this flag to control whether clicking on backdrop can exit preview mode. | ^[boolean] | false | +| loading ^(2.2.3) | Indicates how the browser should load the image, same as [native](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#attr-loading). | ^[enum]`'eager' \| 'lazy'` | — | +| lazy | whether to use lazy load. | ^[boolean] | false | +| scroll-container | the container to add scroll listener when using lazy load. By default, the container to add scroll listener when using lazy load. | ^[string] / ^[object]`HTMLElement` | — | +| alt | native attribute `alt`. | ^[string] | — | +| referrerpolicy | native attribute [referrerPolicy](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/referrerPolicy). | ^[string] | — | +| crossorigin | native attribute [crossorigin](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/crossorigin). | ^[enum]`'' \| 'anonymous' \| 'use-credentials'` | — | +| preview-src-list | allow big image preview. | ^[object]`string[]` | [] | +| z-index | set image preview z-index. | ^[number] | — | +| initial-index | initial preview image index, less than the length of `url-list`. | ^[number] | 0 | +| close-on-press-escape | whether the image-viewer can be closed by pressing ESC. | ^[boolean] | true | +| preview-teleported | whether to append image-viewer to body. A nested parent element attribute transform should have this attribute set to `true`. | ^[boolean] | false | +| infinite | whether the viewer preview is infinite. | ^[boolean] | true | +| zoom-rate | the zoom rate of the image viewer zoom event. | ^[number] | 1.2 | +| min-scale ^(2.4.0) | the min scale of the image viewer zoom event. | ^[number] | 0.2 | +| max-scale ^(2.4.0) | the max scale of the image viewer zoom event. | ^[number] | 7 | ### Image Events diff --git a/docs/en-US/component/link.md b/docs/en-US/component/link.md index 1d824b253ecda..17e5c7882e741 100644 --- a/docs/en-US/component/link.md +++ b/docs/en-US/component/link.md @@ -58,12 +58,12 @@ link/with-icon ### Attributes | Name | Description | Type | Default | -| --------- | ----------------------------------- | ------------------------------------------------------------------------------- | ------- | +| --------- | ----------------------------------- | ------------------------------------------------------------------------------- | ------- | -------- | --- | | type | type | ^[enum]`'primary' \| 'success' \| 'warning' \| 'danger' \| 'info' \| 'default'` | default | | underline | whether the component has underline | ^[boolean] | true | | disabled | whether the component is disabled | ^[boolean] | false | | href | same as native hyperlink's `href` | ^[string] | — | -| target | same as native hyperlink's `target` | ^[enum]`'_blank' \| '_parent' \| '_self' \| '_top'` | _self |[string] | — | +| target | same as native hyperlink's `target` | ^[enum]`'_blank' \| '_parent' \| '_self' \| '_top'` | \_self | [string] | — | | icon | icon component | ^[string] / ^[Component] | — | ### Slots diff --git a/docs/en-US/component/select-v2.md b/docs/en-US/component/select-v2.md index bfc5eedeffcd4..bdb4eed63b1cf 100644 --- a/docs/en-US/component/select-v2.md +++ b/docs/en-US/component/select-v2.md @@ -202,7 +202,7 @@ select-v2/custom-loading ### Attributes | Name | Description | Type | Default | -|-------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------| +| ----------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | | model-value / v-model | biding value | ^[string] / ^[number] / ^[boolean] / ^[object] / ^[array] | — | | options | data of the options, the key of `value` and `label` can be customize by `props` | ^[array] | — | | props ^(2.4.2) | configuration options, see the following table | ^[object] | — | @@ -247,7 +247,7 @@ select-v2/custom-loading ### props | Attribute | Description | Type | Default | -|-----------|-----------------------------------------------------------------|-----------|----------| +| --------- | --------------------------------------------------------------- | --------- | -------- | | value | specify which key of node object is used as the node's value | ^[string] | value | | label | specify which key of node object is used as the node's label | ^[string] | label | | options | specify which key of node object is used as the node's children | ^[string] | options | @@ -267,7 +267,7 @@ select-v2/custom-loading ### Slots | Name | Description | -|------------------|---------------------------------------| +| ---------------- | ------------------------------------- | | default | Option renderer | | header ^(2.5.2) | content at the top of the dropdown | | footer ^(2.5.2) | content at the bottom of the dropdown | @@ -279,6 +279,6 @@ select-v2/custom-loading ### Exposes | Method | Description | Type | -|--------|-------------------------------------------------|-------------------------| +| ------ | ----------------------------------------------- | ----------------------- | | focus | focus the Input component | ^[Function]`() => void` | | blur | blur the Input component, and hide the dropdown | ^[Function]`() => void` | diff --git a/docs/en-US/component/select.md b/docs/en-US/component/select.md index 042db22348186..a8368fd12e9fa 100644 --- a/docs/en-US/component/select.md +++ b/docs/en-US/component/select.md @@ -164,7 +164,7 @@ select/custom-loading ### Select Attributes | Name | Description | Type | Default | -| ------------------------------- |-----------------------------------------------------------------------------------------------------------------------| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | +| ------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | | model-value / v-model | binding value | ^[string] / ^[number] / ^[boolean] / ^[object] / ^[array] | — | | multiple | whether multiple-select is activated | ^[boolean] | false | | disabled | whether Select is disabled | ^[boolean] | false | @@ -225,7 +225,7 @@ select/custom-loading ### Select Slots | Name | Description | Subtags | -|------------------|---------------------------------------|-----------------------| +| ---------------- | ------------------------------------- | --------------------- | | default | option component list | Option Group / Option | | header ^(2.4.3) | content at the top of the dropdown | — | | footer ^(2.4.3) | content at the bottom of the dropdown | — | diff --git a/docs/public/images/element-plus-og-image.png b/docs/public/images/element-plus-og-image.png new file mode 100644 index 0000000000000000000000000000000000000000..ed110d9ef7c2b2e8790850c59ab6a403e7d315ab GIT binary patch literal 61402 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%0D1tsyR+(#KrydKX1)Fz6m@0fQZ!c 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 literal 0 HcmV?d00001 diff --git a/packages/theme-chalk/src/common/var.scss b/packages/theme-chalk/src/common/var.scss index a410b2a25f42c..3603a59f9defb 100644 --- a/packages/theme-chalk/src/common/var.scss +++ b/packages/theme-chalk/src/common/var.scss @@ -452,43 +452,43 @@ $select-dropdown: map.merge( $select-wrapper-padding: () !default; $select-wrapper-padding: map.merge( - ( - 'large': 8px 16px, - 'default': 4px 12px, - 'small': 2px 8px, - ), - $select-wrapper-padding + ( + 'large': 8px 16px, + 'default': 4px 12px, + 'small': 2px 8px, + ), + $select-wrapper-padding ); $select-near-margin-left: () !default; $select-near-margin-left: map.merge( - ( - 'large': -8px, - 'default': -8px, - 'small': -6px, - ), - $select-near-margin-left + ( + 'large': -8px, + 'default': -8px, + 'small': -6px, + ), + $select-near-margin-left ); $select-item-gap: () !default; $select-item-gap: map.merge( - ( - 'large': 6px, - 'default': 6px, - 'small': 4px, - ), - $select-item-gap + ( + 'large': 6px, + 'default': 6px, + 'small': 4px, + ), + $select-item-gap ); // the same height of el-tag $select-item-height: () !default; $select-item-height: map.merge( - ( - 'large': 24px, - 'default': 24px, - 'small': 20px, - ), - $select-item-height + ( + 'large': 24px, + 'default': 24px, + 'small': 20px, + ), + $select-item-height ); // Alert diff --git a/packages/theme-chalk/src/form.scss b/packages/theme-chalk/src/form.scss index 4e77b5cade1d4..3734dbc020b3d 100644 --- a/packages/theme-chalk/src/form.scss +++ b/packages/theme-chalk/src/form.scss @@ -7,52 +7,52 @@ $form-item-margin-bottom: () !default; $form-item-margin-bottom: map.merge( - ( - 'large': 22px, - 'default': 18px, - 'small': 18px, - ), - $form-item-margin-bottom + ( + 'large': 22px, + 'default': 18px, + 'small': 18px, + ), + $form-item-margin-bottom ); $form-item-line-height: () !default; $form-item-line-height: map.merge( - ( - 'large': 40px, - 'default': 32px, - 'small': 24px, - ), - $form-item-line-height + ( + 'large': 40px, + 'default': 32px, + 'small': 24px, + ), + $form-item-line-height ); $form-item-error-padding-top: () !default; $form-item-error-padding-top: map.merge( - ( - 'large': 4px, - 'default': 2px, - 'small': 2px, - ), - $form-item-error-padding-top + ( + 'large': 4px, + 'default': 2px, + 'small': 2px, + ), + $form-item-error-padding-top ); $form-item-label-top-line-height: () !default; $form-item-label-top-line-height: map.merge( - ( - 'large': 22px, - 'default': 22px, - 'small': 20px, - ), - $form-item-label-top-line-height + ( + 'large': 22px, + 'default': 22px, + 'small': 20px, + ), + $form-item-label-top-line-height ); $form-item-label-top-margin-bottom: () !default; $form-item-label-top-margin-bottom: map.merge( - ( - 'large': 12px, - 'default': 8px, - 'small': 4px, - ), - $form-item-label-top-margin-bottom + ( + 'large': 12px, + 'default': 8px, + 'small': 4px, + ), + $form-item-label-top-margin-bottom ); @include b(form) { @@ -196,7 +196,7 @@ $form-item-label-top-margin-bottom: map.merge( &.asterisk-left { > .#{$namespace}-form-item__label:before, > .#{$namespace}-form-item__label-wrap - > .#{$namespace}-form-item__label:before { + > .#{$namespace}-form-item__label:before { content: '*'; color: getCssVar('color-danger'); margin-right: 4px; @@ -205,7 +205,7 @@ $form-item-label-top-margin-bottom: map.merge( &.asterisk-right { > .#{$namespace}-form-item__label:after, > .#{$namespace}-form-item__label-wrap - > .#{$namespace}-form-item__label:after { + > .#{$namespace}-form-item__label:after { content: '*'; color: getCssVar('color-danger'); margin-left: 4px; @@ -218,7 +218,10 @@ $form-item-label-top-margin-bottom: map.merge( .#{$namespace}-input__wrapper, .#{$namespace}-textarea__inner, .#{$namespace}-select__wrapper { - &, &:hover, &:focus, &.is-focus { + &, + &:hover, + &:focus, + &.is-focus { box-shadow: 0 0 0 1px getCssVar('color-danger') inset; } } diff --git a/packages/theme-chalk/src/input.scss b/packages/theme-chalk/src/input.scss index 13ef5a228c023..60ffe977493a3 100644 --- a/packages/theme-chalk/src/input.scss +++ b/packages/theme-chalk/src/input.scss @@ -6,22 +6,22 @@ @mixin inset-prepend-border($color) { box-shadow: 1px 0 0 0 $color inset, 0 1px 0 0 $color inset, - 0 -1px 0 0 $color inset; + 0 -1px 0 0 $color inset; } @mixin inset-append-border($color) { box-shadow: 0 1px 0 0 $color inset, 0 -1px 0 0 $color inset, - -1px 0 0 0 $color inset; + -1px 0 0 0 $color inset; } @mixin inset-prepend-input-border($color) { box-shadow: 1px 0 0 0 $color inset, 1px 0 0 0 $color, 0 1px 0 0 $color inset, - 0 -1px 0 0 $color inset !important; + 0 -1px 0 0 $color inset !important; } @mixin inset-append-input-border($color) { box-shadow: -1px 0 0 0 $color, -1px 0 0 0 $color inset, 0 1px 0 0 $color inset, - 0 -1px 0 0 $color inset !important; + 0 -1px 0 0 $color inset !important; } @mixin mixed-input-border($color) { @@ -50,32 +50,32 @@ font-size: inherit; font-family: inherit; color: var( - #{getCssVarName('input-text-color')}, - map.get($input, 'text-color') + #{getCssVarName('input-text-color')}, + map.get($input, 'text-color') ); background-color: var( - #{getCssVarName('input-bg-color')}, - map.get($input, 'bg-color') + #{getCssVarName('input-bg-color')}, + map.get($input, 'bg-color') ); background-image: none; -webkit-appearance: none; @include inset-input-border( - var( - #{getCssVarName('input-border-color')}, - map.get($input, 'border-color') - ) + var( + #{getCssVarName('input-border-color')}, + map.get($input, 'border-color') + ) ); border-radius: getCssVarWithDefault( - 'input-border-radius', - map.get($input, 'border-radius') + 'input-border-radius', + map.get($input, 'border-radius') ); transition: getCssVar('transition-box-shadow'); border: none; &::placeholder { color: getCssVarWithDefault( - 'input-placeholder-color', - map.get($input, 'placeholder-color') + 'input-placeholder-color', + map.get($input, 'placeholder-color') ); } @@ -172,22 +172,22 @@ justify-content: center; padding: $border-width map.get($input-padding-horizontal, 'default')-$border-width; background-color: var( - #{getCssVarName('input-bg-color')}, - map.get($input, 'bg-color') + #{getCssVarName('input-bg-color')}, + map.get($input, 'bg-color') ); background-image: none; border-radius: getCssVarWithDefault( - 'input-border-radius', - map.get($input, 'border-radius') + 'input-border-radius', + map.get($input, 'border-radius') ); cursor: text; transition: getCssVar('transition-box-shadow'); transform: translate3d(0, 0, 0); @include inset-input-border( - var( - #{getCssVarName('input-border-color')}, - map.get($input, 'border-color') - ) + var( + #{getCssVarName('input-border-color')}, + map.get($input, 'border-color') + ) ); &:hover { @@ -202,19 +202,21 @@ @include e(inner) { // use map.get as default value for date picker range @include set-css-var-value( - 'input-inner-height', - calc( - var(#{getCssVarName('input-height')}, - #{map.get($input-height, 'default')}) - $border-width * 2 - ) + 'input-inner-height', + calc( + var( + #{getCssVarName('input-height')}, + #{map.get($input-height, 'default')} + ) - $border-width * 2 + ) ); width: 100%; flex-grow: 1; -webkit-appearance: none; color: var( - #{getCssVarName('input-text-color')}, - map.get($input, 'text-color') + #{getCssVarName('input-text-color')}, + map.get($input, 'text-color') ); font-size: inherit; height: getCssVar('input-inner-height'); @@ -231,8 +233,8 @@ &::placeholder { color: getCssVarWithDefault( - 'input-placeholder-color', - map.get($input, 'placeholder-color') + 'input-placeholder-color', + map.get($input, 'placeholder-color') ); } @@ -255,8 +257,8 @@ height: 100%; text-align: center; color: var( - #{getCssVarName('input-icon-color')}, - map.get($input, 'icon-color') + #{getCssVarName('input-icon-color')}, + map.get($input, 'icon-color') ); transition: all getCssVar('transition-duration'); pointer-events: none; @@ -304,10 +306,10 @@ @include when(active) { .#{$namespace}-input__wrapper { @include mixed-input-border( - var( - #{getCssVarName('input-focus-color')}, - map.get($input, 'focus-color') - ) + var( + #{getCssVarName('input-focus-color')}, + map.get($input, 'focus-color') + ) ); } } @@ -359,11 +361,13 @@ @include e(inner) { @include set-css-var-value( - 'input-inner-height', - calc( - var(#{getCssVarName('input-height')}, - #{map.get($input-height, $size)}) - $border-width * 2 - ) + 'input-inner-height', + calc( + var( + #{getCssVarName('input-height')}, + #{map.get($input-height, $size)} + ) - $border-width * 2 + ) ); } } diff --git a/packages/theme-chalk/src/select.scss b/packages/theme-chalk/src/select.scss index b36c937c92fb8..28910b0362d7f 100644 --- a/packages/theme-chalk/src/select.scss +++ b/packages/theme-chalk/src/select.scss @@ -88,8 +88,8 @@ flex-shrink: 0; gap: map.get($select-item-gap, 'default'); color: var( - #{getCssVarName('input-icon-color')}, - map.get($input, 'icon-color') + #{getCssVarName('input-icon-color')}, + map.get($input, 'icon-color') ); } @@ -99,8 +99,8 @@ flex-shrink: 0; gap: map.get($select-item-gap, 'default'); color: var( - #{getCssVarName('input-icon-color')}, - map.get($input, 'icon-color') + #{getCssVarName('input-icon-color')}, + map.get($input, 'icon-color') ); } @@ -159,8 +159,8 @@ width: 100%; @include utils-ellipsis; color: var( - #{getCssVarName('input-text-color')}, - map.get($input, 'text-color') + #{getCssVarName('input-text-color')}, + map.get($input, 'text-color') ); @include when(transparent) { @@ -171,9 +171,9 @@ @include e(popper) { @include picker-popper( - map.get($select-dropdown, 'bg-color'), - map.get($select-dropdown, 'border'), - map.get($select-dropdown, 'shadow') + map.get($select-dropdown, 'bg-color'), + map.get($select-dropdown, 'border'), + map.get($select-dropdown, 'shadow') ); } From b6987e9705eeb4aef14d477ddd443f1ceb8e7796 Mon Sep 17 00:00:00 2001 From: yujinpan <1192878390@qq.com> Date: Sun, 4 Feb 2024 17:58:48 +0800 Subject: [PATCH 04/14] fix(components): [tree-select] always focus when using filters (#15768) --- .../__tests__/tree-select.test.tsx | 36 +++++++++++++++++++ packages/components/tree-select/src/tree.ts | 3 ++ 2 files changed, 39 insertions(+) diff --git a/packages/components/tree-select/__tests__/tree-select.test.tsx b/packages/components/tree-select/__tests__/tree-select.test.tsx index cb9df9c270da9..8962ccc8a9685 100644 --- a/packages/components/tree-select/__tests__/tree-select.test.tsx +++ b/packages/components/tree-select/__tests__/tree-select.test.tsx @@ -699,4 +699,40 @@ describe('TreeSelect.vue', () => { select.vm.handleOptionSelect(select.vm.states.options.get(2)) expect(spy2).toBeCalledWith(2) }) + + test('always focus when using filters', async () => { + const { tree, select } = createComponent({ + props: { + filterable: true, + showCheckbox: true, + checkOnClickNode: true, + data: [ + { value: 1, label: 1 }, + { value: 2, label: 2 }, + ], + }, + }) + + await nextTick() + + const input = select.find('input') + + // mock browser blur events + tree.element.addEventListener('click', () => input.element.blur(), true) + + input.element.focus() + expect(document.activeElement).toBe(input.element) + + // normal click + await tree.find('.el-tree-node__content').trigger('click') + expect(select.vm.modelValue).toBe(1) + expect(document.activeElement).toBe(input.element) + + // checkbox click + await tree + .findAll('.el-tree-node__content .el-checkbox')[1] + .trigger('click') + expect(select.vm.modelValue).toBe(2) + expect(document.activeElement).toBe(input.element) + }) }) diff --git a/packages/components/tree-select/src/tree.ts b/packages/components/tree-select/src/tree.ts index 3a933ba388649..6ef64385c9adf 100644 --- a/packages/components/tree-select/src/tree.ts +++ b/packages/components/tree-select/src/tree.ts @@ -176,6 +176,7 @@ export const useTree = ( } else if (props.expandOnClickNode) { e.proxy.handleExpandIconClick() } + select.value?.focus() }, onCheck: (data, params) => { // ignore when no checkbox, like only `checkOnClickNode` is true @@ -255,6 +256,8 @@ export const useTree = ( halfCheckedNodes: tree.value.getHalfCheckedNodes(), }) }) + + select.value?.focus() }, // else From d2fbff70ebbab2e4f80ebba98e152e172be36888 Mon Sep 17 00:00:00 2001 From: Wayne <514435526@qq.com> Date: Sun, 4 Feb 2024 21:41:05 +0800 Subject: [PATCH 05/14] fix(components): [table] row has rowspan when hover it only has background on the first row of this rowspan (#15529) * fix(components): table table row has rowspan when hover it only has background on the first row of this colspan * fix(components): table fixed when hover on a rowspan > 1 cell give the whole rows background * fix(components): [table] fixed hover on merged cell give the background of the whole rows * Update events-helper.ts import addClass removeClass * Update events-helper.ts fixed rowspan > 2 and data not enough * fix(components): [table] add test case for hover on rowspan > 2 * fix(components): [table] use getTestData is better * Update table.test.ts use getTestData instead * Update table.test.ts change templete label prop * fix(components): [table] drop comments and clear hoveredCell array after use * fix(components): [table] when there is fixed row, hover on rowSpan > 1 should not clear the class --------- Co-authored-by: dwaynewdong --- .../components/table/__tests__/table.test.ts | 125 ++++++++++++++++++ .../table/src/table-body/events-helper.ts | 24 +++- .../components/table/src/table-body/index.ts | 46 ++++++- packages/theme-chalk/src/table.scss | 4 + 4 files changed, 192 insertions(+), 7 deletions(-) diff --git a/packages/components/table/__tests__/table.test.ts b/packages/components/table/__tests__/table.test.ts index 303cb5b6ae718..41a36bd4eff78 100644 --- a/packages/components/table/__tests__/table.test.ts +++ b/packages/components/table/__tests__/table.test.ts @@ -492,6 +492,68 @@ describe('Table.vue', () => { wrapper.unmount() }) + it('cell mouse enter on cell of which rowSpan > 2', async () => { + const wrapper = mount({ + components: { + ElTable, + ElTableColumn, + }, + template: ` + + + + + + + + `, + data() { + return { + testData: getTestData(), + } + }, + methods: { + objectSpanMethod({ rowIndex, columnIndex }) { + if (columnIndex === 0) { + if (rowIndex % 2 === 0) { + return { + rowspan: 2, + colspan: 1, + } + } else { + return { + rowspan: 0, + colspan: 0, + } + } + } + }, + }, + }) + const vm = wrapper.vm + await doubleWait() + const cell = vm.$el + .querySelectorAll('.el-table__body-wrapper tbody tr')[0] + .querySelector('.el-table__cell') + triggerEvent(cell, 'mouseenter', true, false) + await doubleWait() + await rAF() + await doubleWait() + const row = vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr')[1] + expect([...row.classList]).toContain('hover-row') + await doubleWait() + triggerEvent(cell, 'mouseleave', true, false) + await rAF() + await doubleWait() + expect([...row.classList]).not.toContain('hover-row') + wrapper.unmount() + }) + it('cell-mouse-leave', async () => { const wrapper = createTable('cell-mouse-leave') await doubleWait() @@ -950,6 +1012,69 @@ describe('Table.vue', () => { wrapper.unmount() }) + it('hover on which rowSpan > 1', async () => { + const wrapper = mount({ + components: { + ElTable, + ElTableColumn, + }, + template: ` + + + + + + + + `, + data() { + return { + testData: getTestData(), + } + }, + methods: { + objectSpanMethod({ rowIndex, columnIndex }) { + if (columnIndex === 0) { + if (rowIndex % 2 === 0) { + return { + rowspan: 2, + colspan: 1, + } + } else { + return { + rowspan: 0, + colspan: 0, + } + } + } + }, + }, + }) + const vm = wrapper.vm + await doubleWait() + const rows = vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr') + triggerEvent(rows[1], 'mouseenter', true, false) + await doubleWait() + await rAF() + await doubleWait() + const cell = vm.$el + .querySelectorAll('.el-table__body-wrapper tbody tr')[0] + .querySelector('.el-table__cell') + + expect([...cell.classList]).toContain('hover-cell') + await doubleWait() + triggerEvent(rows[1], 'mouseleave', true, false) + await rAF() + await doubleWait() + expect([...cell.classList]).not.toContain('hover-cell') + wrapper.unmount() + }) + it('highlight-current-row', async () => { const wrapper = mount({ components: { diff --git a/packages/components/table/src/table-body/events-helper.ts b/packages/components/table/src/table-body/events-helper.ts index 34df83abffeef..3070d4f14594f 100644 --- a/packages/components/table/src/table-body/events-helper.ts +++ b/packages/components/table/src/table-body/events-helper.ts @@ -1,7 +1,7 @@ // @ts-nocheck import { h, inject, ref } from 'vue' import { debounce } from 'lodash-unified' -import { hasClass } from '@element-plus/utils' +import { addClass, hasClass, removeClass } from '@element-plus/utils' import { createTablePopper, getCell, getColumnByCell } from '../util' import { TABLE_INJECTION_KEY } from '../tokens' import type { TableColumnCtx } from '../table-column/defaults' @@ -60,6 +60,21 @@ function useEvents(props: Partial>) { bottom: paddingBottom, } } + + const toggleRowClassByCell = ( + rowSpan: number, + event: MouseEvent, + toggle: (el: Element, cls: string) => void + ) => { + let node = event.target.parentNode + while (rowSpan > 1) { + node = node?.nextSibling + if (!node || node.nodeName !== 'TR') break + toggle(node, 'hover-row hover-fixed-row') + rowSpan-- + } + } + const handleCellMouseEnter = ( event: MouseEvent, row: T, @@ -76,6 +91,9 @@ function useEvents(props: Partial>) { cell, namespace ) + if (cell.rowSpan > 1) { + toggleRowClassByCell(cell.rowSpan, event, addClass) + } const hoverState = (table.hoverState = { cell, column, row }) table?.emit( 'cell-mouse-enter', @@ -143,7 +161,9 @@ function useEvents(props: Partial>) { const handleCellMouseLeave = (event) => { const cell = getCell(event) if (!cell) return - + if (cell.rowSpan > 1) { + toggleRowClassByCell(cell.rowSpan, event, removeClass) + } const oldHoverState = parent?.hoverState parent?.emit( 'cell-mouse-leave', diff --git a/packages/components/table/src/table-body/index.ts b/packages/components/table/src/table-body/index.ts index 0df091f51417e..fa80c25102fc9 100644 --- a/packages/components/table/src/table-body/index.ts +++ b/packages/components/table/src/table-body/index.ts @@ -28,18 +28,54 @@ export default defineComponent({ useRender(props) const { onColumnsChange, onScrollableChange } = useLayoutObserver(parent!) + const hoveredCellList = [] watch(props.store.states.hoverRow, (newVal: any, oldVal: any) => { + const el = instance?.vnode.el as HTMLElement + const rows = Array.from(el?.children || []).filter((e) => + e?.classList.contains(`${ns.e('row')}`) + ) + + // hover rowSpan > 1 choose the whole row + let rowNum = newVal + const childNodes = rows[rowNum]?.childNodes + if (childNodes?.length) { + const indexes = Array.from(childNodes).reduce((acc, item, index) => { + // drop colsSpan + const pre = childNodes[index - 1]?.colSpan > 1 + const next = childNodes[index + 1]?.colSpan > 1 + if (item.nodeName !== 'TD' && !pre && !next) { + acc.push(index) + } + return acc + }, []) + + indexes.forEach((rowIndex) => { + while (rowNum > 0) { + // find from previous + const preChildNodes = rows[rowNum - 1]?.childNodes + if ( + preChildNodes[rowIndex] && + preChildNodes[rowIndex].nodeName === 'TD' + ) { + addClass(preChildNodes[rowIndex], 'hover-cell') + hoveredCellList.push(preChildNodes[rowIndex]) + break + } + rowNum-- + } + }) + } else { + hoveredCellList.forEach((item) => removeClass(item, 'hover-cell')) + hoveredCellList.length = 0 + } if (!props.store.states.isComplex.value || !isClient) return rAF(() => { // just get first level children; fix #9723 - const el = instance?.vnode.el as HTMLElement - const rows = Array.from(el?.children || []).filter((e) => - e?.classList.contains(`${ns.e('row')}`) - ) const oldRow = rows[oldVal] const newRow = rows[newVal] - if (oldRow) { + // when there is fixed row, hover on rowSpan > 1 should not clear the class + if (oldRow && !oldRow.classList.contains('hover-fixed-row')) { removeClass(oldRow, 'hover-row') } if (newRow) { diff --git a/packages/theme-chalk/src/table.scss b/packages/theme-chalk/src/table.scss index a6f5a33bf9881..6bc7e93cda63b 100755 --- a/packages/theme-chalk/src/table.scss +++ b/packages/theme-chalk/src/table.scss @@ -556,6 +556,10 @@ } } + tr > td.hover-cell { + background-color: getCssVar('table-row-hover-bg-color'); + } + tr.current-row > td.#{$namespace}-table__cell { background-color: getCssVar('table-current-row-bg-color'); } From 3c364732892867ff106d67da8a5f2aedae8a59b6 Mon Sep 17 00:00:00 2001 From: heygsc <1596920983@qq.com> Date: Sun, 4 Feb 2024 21:46:07 +0800 Subject: [PATCH 06/14] fix : toc link overflow (#15276) * fix : toc link overflow * Update docs/.vitepress/vitepress/styles/content/table-of-content.scss Co-authored-by: btea <2356281422@qq.com> --------- Co-authored-by: btea <2356281422@qq.com> --- .../vitepress/styles/content/table-of-content.scss | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/.vitepress/vitepress/styles/content/table-of-content.scss b/docs/.vitepress/vitepress/styles/content/table-of-content.scss index ff878b3e80ab9..0a91efcaf9a9a 100644 --- a/docs/.vitepress/vitepress/styles/content/table-of-content.scss +++ b/docs/.vitepress/vitepress/styles/content/table-of-content.scss @@ -44,12 +44,11 @@ margin-top: 10px; font-size: 11px; color: var(--text-color-lighter); - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; color: inherit; + list-style: none; .toc-link { + width: 100%; display: inline-block; position: relative; color: var(--text-color-lighter); @@ -57,6 +56,11 @@ &.active { color: var(--brand-color); } + p{ + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + } } &.subitem { From f33979d228527e3a3571f88e0564609a9c8629da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E6=B7=BB?= <657454579@qq.com> Date: Mon, 5 Feb 2024 17:16:18 +0800 Subject: [PATCH 07/14] feat(components): [select] & [select-v2] add fallbackPlacements prop (#15765) --- docs/en-US/component/select-v2.md | 3 ++- docs/en-US/component/select.md | 1 + docs/en-US/component/tooltip.md | 1 + packages/components/select-v2/src/defaults.ts | 7 +++++++ packages/components/select-v2/src/select.vue | 2 +- packages/components/select/src/select.ts | 7 +++++++ packages/components/select/src/select.vue | 2 +- 7 files changed, 20 insertions(+), 3 deletions(-) diff --git a/docs/en-US/component/select-v2.md b/docs/en-US/component/select-v2.md index bdb4eed63b1cf..e3cff8ff184f8 100644 --- a/docs/en-US/component/select-v2.md +++ b/docs/en-US/component/select-v2.md @@ -203,7 +203,7 @@ select-v2/custom-loading | Name | Description | Type | Default | | ----------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | -| model-value / v-model | biding value | ^[string] / ^[number] / ^[boolean] / ^[object] / ^[array] | — | +| model-value / v-model | binding value | ^[string] / ^[number] / ^[boolean] / ^[object] / ^[array] | — | | options | data of the options, the key of `value` and `label` can be customize by `props` | ^[array] | — | | props ^(2.4.2) | configuration options, see the following table | ^[object] | — | | multiple | is multiple | ^[boolean] | false | @@ -239,6 +239,7 @@ select-v2/custom-loading | remote-method | function that gets called when the input value changes. Its parameter is the current input value. To use this, `filterable` must be true | ^[Function]`(keyword: string) => void` | — | | validate-event | whether to trigger form validation | ^[boolean] | true | | placement | position of dropdown | ^[enum]`'top' \| 'top-start' \| 'top-end' \| 'bottom' \| 'bottom-start' \| 'bottom-end' \| 'left' \| 'left-start' \| 'left-end' \| 'right' \| 'right-start' \| 'right-end'` | bottom-start | +| fallback-placements ^(2.5.6) | list of possible positions for dropdown [popper.js](https://popper.js.org/docs/v2/modifiers/flip/#fallbackplacements) | ^[arrary]`Placement[]` | ['bottom-start', 'top-start', 'right', 'left'] | | collapse-tags-tooltip ^(2.3.0) | whether show all selected tags when mouse hover text of collapse-tags. To use this, `collapse-tags` must be true | ^[boolean] | false | | max-collapse-tags ^(2.3.0) | The max tags number to be shown. To use this, `collapse-tags` must be true | ^[number] | 1 | | tag-type ^(2.5.0) | tag type | ^[enum]`'' \| 'success' \| 'info' \| 'warning' \| 'danger'` | info | diff --git a/docs/en-US/component/select.md b/docs/en-US/component/select.md index a8368fd12e9fa..b18b193b0d10a 100644 --- a/docs/en-US/component/select.md +++ b/docs/en-US/component/select.md @@ -201,6 +201,7 @@ select/custom-loading | tag-type | tag type | ^[enum]`'' \| 'success' \| 'info' \| 'warning' \| 'danger'` | info | | validate-event | whether to trigger form validation | ^[boolean] | true | | placement ^(2.2.17) | position of dropdown | ^[enum]`'top' \| 'top-start' \| 'top-end' \| 'bottom' \| 'bottom-start' \| 'bottom-end' \| 'left' \| 'left-start' \| 'left-end' \| 'right' \| 'right-start' \| 'right-end'` | bottom-start | +| fallback-placements ^(2.5.6) | list of possible positions for dropdown [popper.js](https://popper.js.org/docs/v2/modifiers/flip/#fallbackplacements) | ^[arrary]`Placement[]` | ['bottom-start', 'top-start', 'right', 'left'] | | max-collapse-tags ^(2.3.0) | the max tags number to be shown. To use this, `collapse-tags` must be true | ^[number] | 1 | | popper-options | [popper.js](https://popper.js.org/docs/v2/) parameters | ^[object]refer to [popper.js](https://popper.js.org/docs/v2/) doc | {} | | aria-label ^(a11y) | same as `aria-label` in native input | ^[string] | — | diff --git a/docs/en-US/component/tooltip.md b/docs/en-US/component/tooltip.md index 868c11698e561..b1edabebfb9ae 100644 --- a/docs/en-US/component/tooltip.md +++ b/docs/en-US/component/tooltip.md @@ -157,6 +157,7 @@ tooltip/animations | content | display content, can be overridden by `slot#content` | ^[string] | '' | | raw-content | whether `content` is treated as HTML string | ^[boolean] | false | | placement | position of Tooltip | ^[enum]`'top' \| 'top-start' \| 'top-end' \| 'bottom' \| 'bottom-start' \| 'bottom-end' \| 'left' \| 'left-start' \| 'left-end' \| 'right' \| 'right-start' \| 'right-end'` | bottom | +| fallback-placements | list of possible positions for Tooltip [popper.js](https://popper.js.org/docs/v2/modifiers/flip/#fallbackplacements) | ^[arrary]`Placement[]` | — | | visible / v-model:visible | visibility of Tooltip | ^[boolean] | — | | disabled | whether Tooltip is disabled | ^[boolean] | — | | offset | offset of the Tooltip | ^[number] | 12 | diff --git a/packages/components/select-v2/src/defaults.ts b/packages/components/select-v2/src/defaults.ts index 053da1d01fa05..5f22ebc85f350 100644 --- a/packages/components/select-v2/src/defaults.ts +++ b/packages/components/select-v2/src/defaults.ts @@ -229,6 +229,13 @@ export const SelectProps = buildProps({ values: placements, default: 'bottom-start', }, + /** + * @description list of possible positions for dropdown + */ + fallbackPlacements: { + type: definePropType(Array), + default: ['bottom-start', 'top-start', 'right', 'left'], + }, /** * @description tag type */ diff --git a/packages/components/select-v2/src/select.vue b/packages/components/select-v2/src/select.vue index 29321656cd7b1..ab261cbf162e4 100644 --- a/packages/components/select-v2/src/select.vue +++ b/packages/components/select-v2/src/select.vue @@ -15,7 +15,7 @@ :gpu-acceleration="false" :stop-popper-mouse-event="false" :popper-options="popperOptions" - :fallback-placements="['bottom-start', 'top-start', 'right', 'left']" + :fallback-placements="fallbackPlacements" :effect="effect" :placement="placement" pure diff --git a/packages/components/select/src/select.ts b/packages/components/select/src/select.ts index 2dc166935e815..c6576a634026d 100644 --- a/packages/components/select/src/select.ts +++ b/packages/components/select/src/select.ts @@ -212,6 +212,13 @@ export const SelectProps = buildProps({ values: placements, default: 'bottom-start', }, + /** + * @description list of possible positions for dropdown + */ + fallbackPlacements: { + type: definePropType(Array), + default: ['bottom-start', 'top-start', 'right', 'left'], + }, /** * @description native input aria-label */ diff --git a/packages/components/select/src/select.vue b/packages/components/select/src/select.vue index 0f16d62628b3d..43b29de4027d2 100644 --- a/packages/components/select/src/select.vue +++ b/packages/components/select/src/select.vue @@ -14,7 +14,7 @@ :teleported="teleported" :popper-class="[nsSelect.e('popper'), popperClass]" :popper-options="popperOptions" - :fallback-placements="['bottom-start', 'top-start', 'right', 'left']" + :fallback-placements="fallbackPlacements" :effect="effect" pure trigger="click" From 5e3fa20774fcb4f0562e4481fe1ce1e41fbb6a4d Mon Sep 17 00:00:00 2001 From: xingyixiang <452282988@qq.com> Date: Thu, 8 Feb 2024 17:59:02 +0800 Subject: [PATCH 08/14] fix(components): [scrollbar] multiple rendering (#15822) * fix:The namespace of the showOverflowTooltip is invalid. * fix(components): [scrollbar] multiple rendering * fix(components): [scrollbar] multiple rendering * fix(components): [scrollbar] multiple rendering * Update packages/components/scrollbar/src/bar.vue Co-authored-by: kooriookami <38392315+kooriookami@users.noreply.github.com> * test(components): [scrollbar] adjusting style attributes --------- Co-authored-by: kooriookami <38392315+kooriookami@users.noreply.github.com> --- .../scrollbar/__tests__/scrollbar.test.tsx | 22 +++++----- packages/components/scrollbar/src/bar.ts | 10 +---- packages/components/scrollbar/src/bar.vue | 42 ++++++++++++++++--- .../components/scrollbar/src/scrollbar.vue | 36 +--------------- 4 files changed, 52 insertions(+), 58 deletions(-) diff --git a/packages/components/scrollbar/__tests__/scrollbar.test.tsx b/packages/components/scrollbar/__tests__/scrollbar.test.tsx index 9d4aa24eb8bf3..a313f95c7dc4b 100644 --- a/packages/components/scrollbar/__tests__/scrollbar.test.tsx +++ b/packages/components/scrollbar/__tests__/scrollbar.test.tsx @@ -30,11 +30,11 @@ describe('ScrollBar', () => { await makeScroll(scrollDom, 'scrollTop', 100) expect(wrapper.find('.is-vertical div').attributes('style')).toContain( - 'height: 80px; transform: translateY(50%);' + 'transform: translateY(50%); height: 80px;' ) await makeScroll(scrollDom, 'scrollTop', 300) expect(wrapper.find('.is-vertical div').attributes('style')).toContain( - 'height: 80px; transform: translateY(150%);' + 'transform: translateY(150%); height: 80px;' ) offsetHeightRestore() scrollHeightRestore() @@ -64,11 +64,11 @@ describe('ScrollBar', () => { await makeScroll(scrollDom, 'scrollLeft', 100) expect(wrapper.find('.is-horizontal div').attributes('style')).toContain( - 'width: 80px; transform: translateX(50%);' + 'transform: translateX(50%); width: 80px;' ) await makeScroll(scrollDom, 'scrollLeft', 300) expect(wrapper.find('.is-horizontal div').attributes('style')).toContain( - 'width: 80px; transform: translateX(150%);' + 'transform: translateX(150%); width: 80px;' ) offsetWidthRestore() scrollWidthRestore() @@ -111,18 +111,18 @@ describe('ScrollBar', () => { await makeScroll(scrollDom, 'scrollTop', 100) await makeScroll(scrollDom, 'scrollLeft', 100) expect(wrapper.find('.is-vertical div').attributes('style')).toContain( - 'height: 80px; transform: translateY(50%);' + 'transform: translateY(50%); height: 80px;' ) expect(wrapper.find('.is-horizontal div').attributes('style')).toContain( - 'width: 80px; transform: translateX(50%);' + 'transform: translateX(50%); width: 80px;' ) await makeScroll(scrollDom, 'scrollTop', 300) await makeScroll(scrollDom, 'scrollLeft', 300) expect(wrapper.find('.is-vertical div').attributes('style')).toContain( - 'height: 80px; transform: translateY(150%);' + 'transform: translateY(150%); height: 80px;' ) expect(wrapper.find('.is-horizontal div').attributes('style')).toContain( - 'width: 80px; transform: translateX(150%);' + 'transform: translateX(150%); width: 80px;' ) offsetHeightRestore() @@ -221,10 +221,10 @@ describe('ScrollBar', () => { scrollbar.setScrollLeft(100) await nextTick() expect(wrapper.find('.is-vertical div').attributes('style')).toContain( - 'height: 80px; transform: translateY(0%);' + 'transform: translateY(0%); height: 80px;' ) expect(wrapper.find('.is-horizontal div').attributes('style')).toContain( - 'width: 80px; transform: translateX(0%);' + 'transform: translateX(0%); width: 80px;' ) offsetHeightRestore() @@ -257,7 +257,7 @@ describe('ScrollBar', () => { await makeScroll(scrollDom, 'scrollTop', 0) expect(wrapper.find('.is-vertical div').attributes('style')).toContain( - 'height: 20px; transform: translateY(0%);' + 'transform: translateY(0%); height: 20px;' ) offsetHeightRestore() scrollHeightRestore() diff --git a/packages/components/scrollbar/src/bar.ts b/packages/components/scrollbar/src/bar.ts index f0d1d4a1b8a2e..4307a0680d5fd 100644 --- a/packages/components/scrollbar/src/bar.ts +++ b/packages/components/scrollbar/src/bar.ts @@ -7,15 +7,9 @@ export const barProps = buildProps({ type: Boolean, default: true, }, - width: String, - height: String, - ratioX: { + minSize: { type: Number, - default: 1, - }, - ratioY: { - type: Number, - default: 1, + required: true, }, } as const) export type BarProps = ExtractPropTypes diff --git a/packages/components/scrollbar/src/bar.vue b/packages/components/scrollbar/src/bar.vue index b673996b01478..b5509efde4f8d 100644 --- a/packages/components/scrollbar/src/bar.vue +++ b/packages/components/scrollbar/src/bar.vue @@ -1,35 +1,67 @@ diff --git a/packages/components/scrollbar/src/scrollbar.vue b/packages/components/scrollbar/src/scrollbar.vue index be91ca89431cb..1a9b261d71f05 100644 --- a/packages/components/scrollbar/src/scrollbar.vue +++ b/packages/components/scrollbar/src/scrollbar.vue @@ -20,14 +20,7 @@ @@ -45,7 +38,6 @@ import { import { useEventListener, useResizeObserver } from '@vueuse/core' import { addUnit, debugWarn, isNumber, isObject } from '@element-plus/utils' import { useNamespace } from '@element-plus/hooks' -import { GAP } from './util' import Bar from './bar.vue' import { scrollbarContextKey } from './constants' import { scrollbarEmits, scrollbarProps } from './scrollbar' @@ -69,12 +61,7 @@ let stopResizeListener: (() => void) | undefined = undefined const scrollbarRef = ref() const wrapRef = ref() const resizeRef = ref() - -const sizeWidth = ref('0') -const sizeHeight = ref('0') const barRef = ref() -const ratioY = ref(1) -const ratioX = ref(1) const wrapStyle = computed(() => { const style: CSSProperties = {} @@ -135,26 +122,7 @@ const setScrollLeft = (value: number) => { } const update = () => { - if (!wrapRef.value) return - const offsetHeight = wrapRef.value.offsetHeight - GAP - const offsetWidth = wrapRef.value.offsetWidth - GAP - - const originalHeight = offsetHeight ** 2 / wrapRef.value.scrollHeight - const originalWidth = offsetWidth ** 2 / wrapRef.value.scrollWidth - const height = Math.max(originalHeight, props.minSize) - const width = Math.max(originalWidth, props.minSize) - - ratioY.value = - originalHeight / - (offsetHeight - originalHeight) / - (height / (offsetHeight - height)) - ratioX.value = - originalWidth / - (offsetWidth - originalWidth) / - (width / (offsetWidth - width)) - - sizeHeight.value = height + GAP < offsetHeight ? `${height}px` : '' - sizeWidth.value = width + GAP < offsetWidth ? `${width}px` : '' + barRef.value?.update() } watch( From c6d5bce18534301db2b35494c4e67828fe15710c Mon Sep 17 00:00:00 2001 From: kooriookami <38392315+kooriookami@users.noreply.github.com> Date: Fri, 9 Feb 2024 22:02:14 +0800 Subject: [PATCH 09/14] fix(components): [select-v2] Tags not update when options sync added (#15838) --- packages/components/select-v2/src/useSelect.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/components/select-v2/src/useSelect.ts b/packages/components/select-v2/src/useSelect.ts index 43ffd4525cf10..ea9fbd6d8a1ed 100644 --- a/packages/components/select-v2/src/useSelect.ts +++ b/packages/components/select-v2/src/useSelect.ts @@ -806,6 +806,7 @@ const useSelect = (props: ISelectV2Props, emit) => { }, { deep: true, + flush: 'post', } ) From d6dca5dec6a7c6f8db1c2d9ec83b4aaf25dbbf5e Mon Sep 17 00:00:00 2001 From: kooriookami <38392315+kooriookami@users.noreply.github.com> Date: Sun, 11 Feb 2024 19:57:39 +0800 Subject: [PATCH 10/14] docs: add upgrade changes link (#15844) docs: add Upgrade Changes Link --- docs/.vitepress/vitepress/components/globals/vp-changelog.vue | 2 +- docs/en-US/guide/changelog.md | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/.vitepress/vitepress/components/globals/vp-changelog.vue b/docs/.vitepress/vitepress/components/globals/vp-changelog.vue index 1270d8fd77f53..e5229518629b6 100644 --- a/docs/.vitepress/vitepress/components/globals/vp-changelog.vue +++ b/docs/.vitepress/vitepress/components/globals/vp-changelog.vue @@ -49,7 +49,7 @@ onMounted(async () => { From be64069d601e2b3d3152fb31f88e36f1890c9ebe Mon Sep 17 00:00:00 2001 From: kooriookami <38392315+kooriookami@users.noreply.github.com> Date: Tue, 13 Feb 2024 12:12:26 +0800 Subject: [PATCH 11/14] docs(link): fix link doc (#15847) refactor(components): fix link docs --- docs/en-US/component/link.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/en-US/component/link.md b/docs/en-US/component/link.md index 17e5c7882e741..450a1a1fdd7b2 100644 --- a/docs/en-US/component/link.md +++ b/docs/en-US/component/link.md @@ -58,17 +58,17 @@ link/with-icon ### Attributes | Name | Description | Type | Default | -| --------- | ----------------------------------- | ------------------------------------------------------------------------------- | ------- | -------- | --- | +|-----------|-------------------------------------|---------------------------------------------------------------------------------|---------| | type | type | ^[enum]`'primary' \| 'success' \| 'warning' \| 'danger' \| 'info' \| 'default'` | default | | underline | whether the component has underline | ^[boolean] | true | | disabled | whether the component is disabled | ^[boolean] | false | | href | same as native hyperlink's `href` | ^[string] | — | -| target | same as native hyperlink's `target` | ^[enum]`'_blank' \| '_parent' \| '_self' \| '_top'` | \_self | [string] | — | +| target | same as native hyperlink's `target` | ^[enum]`'_blank' \| '_parent' \| '_self' \| '_top'` | \_self | | icon | icon component | ^[string] / ^[Component] | — | ### Slots | Name | Description | -| ------- | ------------------------- | +|---------|---------------------------| | default | customize default content | | icon | customize icon component | From 66fc9a483f9e25bcb1b80cec349155009072cbbe Mon Sep 17 00:00:00 2001 From: btea <2356281422@qq.com> Date: Thu, 15 Feb 2024 18:35:50 +0800 Subject: [PATCH 12/14] chore: format code (#15855) --- .../styles/content/table-of-content.scss | 2 +- docs/en-US/component/dialog.md | 2 +- docs/en-US/component/link.md | 4 +- docs/en-US/component/message-box.md | 2 +- docs/en-US/component/select-v2.md | 84 +++++++++---------- docs/en-US/component/select.md | 82 +++++++++--------- docs/en-US/component/tag.md | 4 +- docs/en-US/component/tour.md | 8 +- docs/en-US/component/upload.md | 2 +- packages/theme-chalk/src/dialog.scss | 11 ++- packages/theme-chalk/src/message-box.scss | 11 ++- packages/theme-chalk/src/tour.scss | 11 ++- 12 files changed, 116 insertions(+), 107 deletions(-) diff --git a/docs/.vitepress/vitepress/styles/content/table-of-content.scss b/docs/.vitepress/vitepress/styles/content/table-of-content.scss index 0a91efcaf9a9a..90417583988ec 100644 --- a/docs/.vitepress/vitepress/styles/content/table-of-content.scss +++ b/docs/.vitepress/vitepress/styles/content/table-of-content.scss @@ -56,7 +56,7 @@ &.active { color: var(--brand-color); } - p{ + p { text-overflow: ellipsis; overflow: hidden; white-space: nowrap; diff --git a/docs/en-US/component/dialog.md b/docs/en-US/component/dialog.md index fbc9dbe9e7f7f..50a5b53851d38 100644 --- a/docs/en-US/component/dialog.md +++ b/docs/en-US/component/dialog.md @@ -116,7 +116,7 @@ When using `modal` = false, please make sure that `append-to-body` was set to ** ### Attributes | Name | Description | Type | Default | -|----------------------------|------------------------------------------------------------------------------------------------------| ----------------------------------- | ------- | +| -------------------------- | ---------------------------------------------------------------------------------------------------- | ----------------------------------- | ------- | | model-value / v-model | visibility of Dialog | ^[boolean] | — | | title | title of Dialog. Can also be passed with a named slot (see the following table) | ^[string] | '' | | width | width of Dialog, default is 50% | ^[string] / ^[number] | '' | diff --git a/docs/en-US/component/link.md b/docs/en-US/component/link.md index 450a1a1fdd7b2..6745e9b84fe4b 100644 --- a/docs/en-US/component/link.md +++ b/docs/en-US/component/link.md @@ -58,7 +58,7 @@ link/with-icon ### Attributes | Name | Description | Type | Default | -|-----------|-------------------------------------|---------------------------------------------------------------------------------|---------| +| --------- | ----------------------------------- | ------------------------------------------------------------------------------- | ------- | | type | type | ^[enum]`'primary' \| 'success' \| 'warning' \| 'danger' \| 'info' \| 'default'` | default | | underline | whether the component has underline | ^[boolean] | true | | disabled | whether the component is disabled | ^[boolean] | false | @@ -69,6 +69,6 @@ link/with-icon ### Slots | Name | Description | -|---------|---------------------------| +| ------- | ------------------------- | | default | customize default content | | icon | customize icon component | diff --git a/docs/en-US/component/message-box.md b/docs/en-US/component/message-box.md index 07943f237c006..a0b8030fa1ef2 100644 --- a/docs/en-US/component/message-box.md +++ b/docs/en-US/component/message-box.md @@ -159,7 +159,7 @@ The corresponding methods are: `ElMessageBox`, `ElMessageBox.alert`, `ElMessageB ### Options | Name | Description | Type | Default | -|------------------------------|------------------------------------------------------------------------------------------------------------------------------------------| ---------------------------------------------------------------------------------- | ------------------------------------------------ | +| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | ------------------------------------------------ | | autofocus | auto focus when open MessageBox | ^[boolean] | true | | title | title of the MessageBox | ^[string] | '' | | message | content of the MessageBox | ^[string] / ^[VNode] / ^[Function]`() => VNode` ^(2.2.17) | — | diff --git a/docs/en-US/component/select-v2.md b/docs/en-US/component/select-v2.md index e3cff8ff184f8..f345533c32e46 100644 --- a/docs/en-US/component/select-v2.md +++ b/docs/en-US/component/select-v2.md @@ -201,49 +201,49 @@ select-v2/custom-loading ### Attributes -| Name | Description | Type | Default | -| ----------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | -| model-value / v-model | binding value | ^[string] / ^[number] / ^[boolean] / ^[object] / ^[array] | — | -| options | data of the options, the key of `value` and `label` can be customize by `props` | ^[array] | — | -| props ^(2.4.2) | configuration options, see the following table | ^[object] | — | -| multiple | is multiple | ^[boolean] | false | -| disabled | is disabled | ^[boolean] | false | -| value-key | unique identity key name for value, required when value is an object | ^[string] | value | -| size | size of component | ^[enum]`'' \| 'large' \| 'default' \| 'small'` | '' | -| clearable | whether select can be cleared | ^[boolean] | false | -| clear-icon | custom clear icon | ^[string] / ^[object]`Component` | CircleClose | -| collapse-tags | whether to collapse tags to a text when multiple selecting | ^[boolean] | false | -| multiple-limit | maximum number of options user can select when multiple is true. No limit when set to 0 | ^[number] | 0 | -| name | the name attribute of select input | ^[string] | — | -| effect | tooltip theme, built-in theme: `dark` / `light` | ^[enum]`'dark' \| 'light'` / ^[string] | light | -| autocomplete | autocomplete of select input | ^[string] | off | -| placeholder | placeholder | ^[string] | Please select | -| filterable | is filterable | ^[boolean] | false | -| allow-create | whether creating new items is allowed. To use this, `filterable` must be true | ^[boolean] | false | -| filter-method | custom filter method | ^[Function]`() => void` | — | -| loading | whether Select is loading data from server | ^[boolean] | false | -| loading-text | displayed text while loading data from server, default is 'Loading' | ^[string] | — | -| reserve-keyword | whether reserve the keyword after select filtered option. | ^[boolean] | true | -| no-match-text | displayed text when no data matches the filtering query, you can also use slot `empty`, default is 'No matching data' | ^[string] | — | -| no-data-text | displayed text when there is no options, you can also use slot empty | ^[string] | No Data | -| popper-class | custom class name for Select's dropdown | ^[string] | '' | -| popper-append-to-body ^(deprecated) | whether to append the popper menu to body. If the positioning of the popper is wrong, you can try to set this prop to false | ^[boolean] | false | -| teleported | whether select dropdown is teleported to the body | ^[boolean] | true | -| persistent | when select dropdown is inactive and `persistent` is `false`, select dropdown will be destroyed | ^[boolean] | true | -| popper-options | [popper.js](https://popper.js.org/docs/v2/) parameters | ^[object]refer to [popper.js](https://popper.js.org/docs/v2/) doc | {} | -| automatic-dropdown | for non-filterable Select, this prop decides if the option menu pops up when the input is focused | ^[boolean] | false | -| height | The height of the dropdown panel, 34px for each item | ^[number] | 274 | -| item-height | The height of the dropdown item | ^[number] | 34 | -| scrollbar-always-on | Controls whether the scrollbar is always displayed | ^[boolean] | false | -| remote | whether search data from server | ^[boolean] | false | -| remote-method | function that gets called when the input value changes. Its parameter is the current input value. To use this, `filterable` must be true | ^[Function]`(keyword: string) => void` | — | -| validate-event | whether to trigger form validation | ^[boolean] | true | -| placement | position of dropdown | ^[enum]`'top' \| 'top-start' \| 'top-end' \| 'bottom' \| 'bottom-start' \| 'bottom-end' \| 'left' \| 'left-start' \| 'left-end' \| 'right' \| 'right-start' \| 'right-end'` | bottom-start | +| Name | Description | Type | Default | +| ----------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------- | +| model-value / v-model | binding value | ^[string] / ^[number] / ^[boolean] / ^[object] / ^[array] | — | +| options | data of the options, the key of `value` and `label` can be customize by `props` | ^[array] | — | +| props ^(2.4.2) | configuration options, see the following table | ^[object] | — | +| multiple | is multiple | ^[boolean] | false | +| disabled | is disabled | ^[boolean] | false | +| value-key | unique identity key name for value, required when value is an object | ^[string] | value | +| size | size of component | ^[enum]`'' \| 'large' \| 'default' \| 'small'` | '' | +| clearable | whether select can be cleared | ^[boolean] | false | +| clear-icon | custom clear icon | ^[string] / ^[object]`Component` | CircleClose | +| collapse-tags | whether to collapse tags to a text when multiple selecting | ^[boolean] | false | +| multiple-limit | maximum number of options user can select when multiple is true. No limit when set to 0 | ^[number] | 0 | +| name | the name attribute of select input | ^[string] | — | +| effect | tooltip theme, built-in theme: `dark` / `light` | ^[enum]`'dark' \| 'light'` / ^[string] | light | +| autocomplete | autocomplete of select input | ^[string] | off | +| placeholder | placeholder | ^[string] | Please select | +| filterable | is filterable | ^[boolean] | false | +| allow-create | whether creating new items is allowed. To use this, `filterable` must be true | ^[boolean] | false | +| filter-method | custom filter method | ^[Function]`() => void` | — | +| loading | whether Select is loading data from server | ^[boolean] | false | +| loading-text | displayed text while loading data from server, default is 'Loading' | ^[string] | — | +| reserve-keyword | whether reserve the keyword after select filtered option. | ^[boolean] | true | +| no-match-text | displayed text when no data matches the filtering query, you can also use slot `empty`, default is 'No matching data' | ^[string] | — | +| no-data-text | displayed text when there is no options, you can also use slot empty | ^[string] | No Data | +| popper-class | custom class name for Select's dropdown | ^[string] | '' | +| popper-append-to-body ^(deprecated) | whether to append the popper menu to body. If the positioning of the popper is wrong, you can try to set this prop to false | ^[boolean] | false | +| teleported | whether select dropdown is teleported to the body | ^[boolean] | true | +| persistent | when select dropdown is inactive and `persistent` is `false`, select dropdown will be destroyed | ^[boolean] | true | +| popper-options | [popper.js](https://popper.js.org/docs/v2/) parameters | ^[object]refer to [popper.js](https://popper.js.org/docs/v2/) doc | {} | +| automatic-dropdown | for non-filterable Select, this prop decides if the option menu pops up when the input is focused | ^[boolean] | false | +| height | The height of the dropdown panel, 34px for each item | ^[number] | 274 | +| item-height | The height of the dropdown item | ^[number] | 34 | +| scrollbar-always-on | Controls whether the scrollbar is always displayed | ^[boolean] | false | +| remote | whether search data from server | ^[boolean] | false | +| remote-method | function that gets called when the input value changes. Its parameter is the current input value. To use this, `filterable` must be true | ^[Function]`(keyword: string) => void` | — | +| validate-event | whether to trigger form validation | ^[boolean] | true | +| placement | position of dropdown | ^[enum]`'top' \| 'top-start' \| 'top-end' \| 'bottom' \| 'bottom-start' \| 'bottom-end' \| 'left' \| 'left-start' \| 'left-end' \| 'right' \| 'right-start' \| 'right-end'` | bottom-start | | fallback-placements ^(2.5.6) | list of possible positions for dropdown [popper.js](https://popper.js.org/docs/v2/modifiers/flip/#fallbackplacements) | ^[arrary]`Placement[]` | ['bottom-start', 'top-start', 'right', 'left'] | -| collapse-tags-tooltip ^(2.3.0) | whether show all selected tags when mouse hover text of collapse-tags. To use this, `collapse-tags` must be true | ^[boolean] | false | -| max-collapse-tags ^(2.3.0) | The max tags number to be shown. To use this, `collapse-tags` must be true | ^[number] | 1 | -| tag-type ^(2.5.0) | tag type | ^[enum]`'' \| 'success' \| 'info' \| 'warning' \| 'danger'` | info | -| aria-label ^(a11y) ^(2.5.0) | same as `aria-label` in native input | ^[string] | — | +| collapse-tags-tooltip ^(2.3.0) | whether show all selected tags when mouse hover text of collapse-tags. To use this, `collapse-tags` must be true | ^[boolean] | false | +| max-collapse-tags ^(2.3.0) | The max tags number to be shown. To use this, `collapse-tags` must be true | ^[number] | 1 | +| tag-type ^(2.5.0) | tag type | ^[enum]`'' \| 'success' \| 'info' \| 'warning' \| 'danger'` | info | +| aria-label ^(a11y) ^(2.5.0) | same as `aria-label` in native input | ^[string] | — | ### props diff --git a/docs/en-US/component/select.md b/docs/en-US/component/select.md index b18b193b0d10a..ec9e5f8046531 100644 --- a/docs/en-US/component/select.md +++ b/docs/en-US/component/select.md @@ -163,48 +163,48 @@ select/custom-loading ### Select Attributes -| Name | Description | Type | Default | -| ------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | -| model-value / v-model | binding value | ^[string] / ^[number] / ^[boolean] / ^[object] / ^[array] | — | -| multiple | whether multiple-select is activated | ^[boolean] | false | -| disabled | whether Select is disabled | ^[boolean] | false | -| value-key | unique identity key name for value, required when value is an object | ^[string] | value | -| size | size of Input | ^[enum]`'' \| 'large' \| 'default' \| 'small'` | — | -| clearable | whether select can be cleared | ^[boolean] | false | -| collapse-tags | whether to collapse tags to a text when multiple selecting | ^[boolean] | false | -| collapse-tags-tooltip ^(2.3.0) | whether show all selected tags when mouse hover text of collapse-tags. To use this, `collapse-tags` must be true | ^[boolean] | false | -| multiple-limit | maximum number of options user can select when `multiple` is `true`. No limit when set to 0 | ^[number] | 0 | -| name | the name attribute of select input | ^[string] | — | -| effect | tooltip theme, built-in theme: `dark` / `light` | ^[enum]`'dark' \| 'light'` / ^[string] | light | -| autocomplete | the autocomplete attribute of select input | ^[string] | off | -| placeholder | placeholder, default is 'Select' | ^[string] | — | -| filterable | whether Select is filterable | ^[boolean] | false | -| allow-create | whether creating new items is allowed. To use this, `filterable` must be true | ^[boolean] | false | -| filter-method | custom filter method | ^[Function]`() => void` | — | -| remote | whether options are loaded from server | ^[boolean] | false | -| remote-method | custom remote search method | ^[Function]`() => void` | — | -| remote-show-suffix | in remote search method show suffix icon | ^[boolean] | false | -| loading | whether Select is loading data from server | ^[boolean] | false | -| loading-text | displayed text while loading data from server, default is 'Loading' | ^[string] | — | -| no-match-text | displayed text when no data matches the filtering query, you can also use slot `empty`, default is 'No matching data' | ^[string] | — | -| no-data-text | displayed text when there is no options, you can also use slot `empty`, default is 'No data' | ^[string] | — | -| popper-class | custom class name for Select's dropdown | ^[string] | '' | -| reserve-keyword | when `multiple` and `filterable` is true, whether to reserve current keyword after selecting an option | ^[boolean] | true | -| default-first-option | select first matching option on enter key. Use with `filterable` or `remote` | ^[boolean] | false | -| teleported | whether select dropdown is teleported to the body | ^[boolean] | true | -| persistent | when select dropdown is inactive and `persistent` is `false`, select dropdown will be destroyed | ^[boolean] | true | -| automatic-dropdown | for non-filterable Select, this prop decides if the option menu pops up when the input is focused | ^[boolean] | false | -| clear-icon | custom clear icon component | ^[string] / ^[object]`Component` | CircleClose | -| fit-input-width | whether the width of the dropdown is the same as the input | ^[boolean] | false | -| suffix-icon | custom suffix icon component | ^[string] / ^[object]`Component` | ArrowDown | -| suffix-transition ^(deprecated) | animation when dropdown appears/disappears icon | ^[boolean] | true | -| tag-type | tag type | ^[enum]`'' \| 'success' \| 'info' \| 'warning' \| 'danger'` | info | -| validate-event | whether to trigger form validation | ^[boolean] | true | -| placement ^(2.2.17) | position of dropdown | ^[enum]`'top' \| 'top-start' \| 'top-end' \| 'bottom' \| 'bottom-start' \| 'bottom-end' \| 'left' \| 'left-start' \| 'left-end' \| 'right' \| 'right-start' \| 'right-end'` | bottom-start | +| Name | Description | Type | Default | +| ------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------- | +| model-value / v-model | binding value | ^[string] / ^[number] / ^[boolean] / ^[object] / ^[array] | — | +| multiple | whether multiple-select is activated | ^[boolean] | false | +| disabled | whether Select is disabled | ^[boolean] | false | +| value-key | unique identity key name for value, required when value is an object | ^[string] | value | +| size | size of Input | ^[enum]`'' \| 'large' \| 'default' \| 'small'` | — | +| clearable | whether select can be cleared | ^[boolean] | false | +| collapse-tags | whether to collapse tags to a text when multiple selecting | ^[boolean] | false | +| collapse-tags-tooltip ^(2.3.0) | whether show all selected tags when mouse hover text of collapse-tags. To use this, `collapse-tags` must be true | ^[boolean] | false | +| multiple-limit | maximum number of options user can select when `multiple` is `true`. No limit when set to 0 | ^[number] | 0 | +| name | the name attribute of select input | ^[string] | — | +| effect | tooltip theme, built-in theme: `dark` / `light` | ^[enum]`'dark' \| 'light'` / ^[string] | light | +| autocomplete | the autocomplete attribute of select input | ^[string] | off | +| placeholder | placeholder, default is 'Select' | ^[string] | — | +| filterable | whether Select is filterable | ^[boolean] | false | +| allow-create | whether creating new items is allowed. To use this, `filterable` must be true | ^[boolean] | false | +| filter-method | custom filter method | ^[Function]`() => void` | — | +| remote | whether options are loaded from server | ^[boolean] | false | +| remote-method | custom remote search method | ^[Function]`() => void` | — | +| remote-show-suffix | in remote search method show suffix icon | ^[boolean] | false | +| loading | whether Select is loading data from server | ^[boolean] | false | +| loading-text | displayed text while loading data from server, default is 'Loading' | ^[string] | — | +| no-match-text | displayed text when no data matches the filtering query, you can also use slot `empty`, default is 'No matching data' | ^[string] | — | +| no-data-text | displayed text when there is no options, you can also use slot `empty`, default is 'No data' | ^[string] | — | +| popper-class | custom class name for Select's dropdown | ^[string] | '' | +| reserve-keyword | when `multiple` and `filterable` is true, whether to reserve current keyword after selecting an option | ^[boolean] | true | +| default-first-option | select first matching option on enter key. Use with `filterable` or `remote` | ^[boolean] | false | +| teleported | whether select dropdown is teleported to the body | ^[boolean] | true | +| persistent | when select dropdown is inactive and `persistent` is `false`, select dropdown will be destroyed | ^[boolean] | true | +| automatic-dropdown | for non-filterable Select, this prop decides if the option menu pops up when the input is focused | ^[boolean] | false | +| clear-icon | custom clear icon component | ^[string] / ^[object]`Component` | CircleClose | +| fit-input-width | whether the width of the dropdown is the same as the input | ^[boolean] | false | +| suffix-icon | custom suffix icon component | ^[string] / ^[object]`Component` | ArrowDown | +| suffix-transition ^(deprecated) | animation when dropdown appears/disappears icon | ^[boolean] | true | +| tag-type | tag type | ^[enum]`'' \| 'success' \| 'info' \| 'warning' \| 'danger'` | info | +| validate-event | whether to trigger form validation | ^[boolean] | true | +| placement ^(2.2.17) | position of dropdown | ^[enum]`'top' \| 'top-start' \| 'top-end' \| 'bottom' \| 'bottom-start' \| 'bottom-end' \| 'left' \| 'left-start' \| 'left-end' \| 'right' \| 'right-start' \| 'right-end'` | bottom-start | | fallback-placements ^(2.5.6) | list of possible positions for dropdown [popper.js](https://popper.js.org/docs/v2/modifiers/flip/#fallbackplacements) | ^[arrary]`Placement[]` | ['bottom-start', 'top-start', 'right', 'left'] | -| max-collapse-tags ^(2.3.0) | the max tags number to be shown. To use this, `collapse-tags` must be true | ^[number] | 1 | -| popper-options | [popper.js](https://popper.js.org/docs/v2/) parameters | ^[object]refer to [popper.js](https://popper.js.org/docs/v2/) doc | {} | -| aria-label ^(a11y) | same as `aria-label` in native input | ^[string] | — | +| max-collapse-tags ^(2.3.0) | the max tags number to be shown. To use this, `collapse-tags` must be true | ^[number] | 1 | +| popper-options | [popper.js](https://popper.js.org/docs/v2/) parameters | ^[object]refer to [popper.js](https://popper.js.org/docs/v2/) doc | {} | +| aria-label ^(a11y) | same as `aria-label` in native input | ^[string] | — | :::warning diff --git a/docs/en-US/component/tag.md b/docs/en-US/component/tag.md index 25ed34b73acdd..47a2734693adf 100644 --- a/docs/en-US/component/tag.md +++ b/docs/en-US/component/tag.md @@ -78,7 +78,7 @@ tag/checkable ### Tag Attributes | Name | Description | Type | Default | -|---------------------|--------------------------------------|--------------------------------------------------------------------|---------| +| ------------------- | ------------------------------------ | ------------------------------------------------------------------ | ------- | | type | type of Tag | ^[enum]`'primary' \| 'success' \| 'info' \| 'warning' \| 'danger'` | primary | | closable | whether Tag can be removed | ^[boolean] | false | | disable-transitions | whether to disable animations | ^[boolean] | false | @@ -106,7 +106,7 @@ tag/checkable ### CheckTag Attributes | Name | Description | Type | Default | -|---------------------------|------------------|--------------------------------------------------------------------|---------| +| ------------------------- | ---------------- | ------------------------------------------------------------------ | ------- | | checked / v-model:checked | is checked | ^[boolean] | false | | type ^(2.5.4) | type of CheckTag | ^[enum]`'primary' \| 'success' \| 'info' \| 'warning' \| 'danger'` | primary | diff --git a/docs/en-US/component/tour.md b/docs/en-US/component/tour.md index 5bd8e1901c232..69e2328278dad 100644 --- a/docs/en-US/component/tour.md +++ b/docs/en-US/component/tour.md @@ -126,10 +126,10 @@ tour-step component configuration with the same name has higher priority ### TourStep slots -| Name | Description | -| -------- | ----------- | -| default | description | -| header | header | +| Name | Description | +| ------- | ----------- | +| default | description | +| header | header | ### TourStep events diff --git a/docs/en-US/component/upload.md b/docs/en-US/component/upload.md index 00655e7990057..c7889fc786610 100644 --- a/docs/en-US/component/upload.md +++ b/docs/en-US/component/upload.md @@ -105,7 +105,7 @@ upload/manual | show-file-list | whether to show the uploaded file list. | ^[boolean] | true | | drag | whether to activate drag and drop mode. | ^[boolean] | false | | accept | accepted [file types](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-accept), will not work when `thumbnail-mode === true`. | ^[string] | '' | -| crossorigin | native attribute [crossorigin](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/crossorigin). | ^[enum]`'' \| 'anonymous' \| 'use-credentials'` | — | +| crossorigin | native attribute [crossorigin](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/crossorigin). | ^[enum]`'' \| 'anonymous' \| 'use-credentials'` | — | | on-preview | hook function when clicking the uploaded files. | ^[Function]`(uploadFile: UploadFile) => void` | — | | on-remove | hook function when files are removed. | ^[Function]`(uploadFile: UploadFile, uploadFiles: UploadFiles) => void` | — | | on-success | hook function when uploaded successfully. | ^[Function]`(response: any, uploadFile: UploadFile, uploadFiles: UploadFiles) => void` | — | diff --git a/packages/theme-chalk/src/dialog.scss b/packages/theme-chalk/src/dialog.scss index 6c04f94d90544..58a9e763e1f9d 100644 --- a/packages/theme-chalk/src/dialog.scss +++ b/packages/theme-chalk/src/dialog.scss @@ -57,10 +57,13 @@ padding-bottom: getCssVar('dialog', 'padding-primary'); &.show-close { - padding-right: calc(getCssVar('dialog', 'padding-primary') + var( - #{getCssVarName('message-close-size')}, - map.get($message, 'close-size') - )); + padding-right: calc( + getCssVar('dialog', 'padding-primary') + + var( + #{getCssVarName('message-close-size')}, + map.get($message, 'close-size') + ) + ); } } diff --git a/packages/theme-chalk/src/message-box.scss b/packages/theme-chalk/src/message-box.scss index 7b7cc550ca37e..a50b8aa420184 100644 --- a/packages/theme-chalk/src/message-box.scss +++ b/packages/theme-chalk/src/message-box.scss @@ -63,10 +63,13 @@ padding-bottom: getCssVar('messagebox-padding-primary'); &.show-close { - padding-right: calc(getCssVar('messagebox-padding-primary') + var( - #{getCssVarName('message-close-size')}, - map.get($message, 'close-size') - )); + padding-right: calc( + getCssVar('messagebox-padding-primary') + + var( + #{getCssVarName('message-close-size')}, + map.get($message, 'close-size') + ) + ); } } diff --git a/packages/theme-chalk/src/tour.scss b/packages/theme-chalk/src/tour.scss index 8ec13ecea2d2a..44cfb164c65bf 100644 --- a/packages/theme-chalk/src/tour.scss +++ b/packages/theme-chalk/src/tour.scss @@ -93,10 +93,13 @@ padding-bottom: getCssVar('tour-padding-primary'); &.show-close { - padding-right: calc(getCssVar('tour-padding-primary') + var( - #{getCssVarName('message-close-size')}, - map.get($message, 'close-size') - )); + padding-right: calc( + getCssVar('tour-padding-primary') + + var( + #{getCssVarName('message-close-size')}, + map.get($message, 'close-size') + ) + ); } } From 725f1e08cdb78232ea7b4828db426dcadf53ea37 Mon Sep 17 00:00:00 2001 From: btea <2356281422@qq.com> Date: Sun, 18 Feb 2024 15:55:19 +0800 Subject: [PATCH 13/14] feat(docs): preview page jumps to github with pr number (#15854) * feat(docs): preview page jumps to github with pr number * feat: remove return * chore: update * chore: update * chore: use globalThis * feat: update --- .../components/navbar/vp-social-link.vue | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/docs/.vitepress/vitepress/components/navbar/vp-social-link.vue b/docs/.vitepress/vitepress/components/navbar/vp-social-link.vue index 916dfd680e4c2..e5889eea73e75 100644 --- a/docs/.vitepress/vitepress/components/navbar/vp-social-link.vue +++ b/docs/.vitepress/vitepress/components/navbar/vp-social-link.vue @@ -1,16 +1,28 @@