From 5b07a9fe49f59828a509995772e5923c8bb89526 Mon Sep 17 00:00:00 2001 From: Jindorf Date: Wed, 10 Jan 2024 15:30:56 +0100 Subject: [PATCH 01/22] fix(locale): memory leak with default rtl values #18965 (#18975) fixes #18965 Co-authored-by: Indorf, Jannik Co-authored-by: John Leider --- packages/vuetify/src/composables/locale.ts | 49 ++++++++++++++++++- .../src/locale/__tests__/index.spec.ts | 4 +- packages/vuetify/src/locale/index.ts | 44 ----------------- 3 files changed, 49 insertions(+), 48 deletions(-) diff --git a/packages/vuetify/src/composables/locale.ts b/packages/vuetify/src/composables/locale.ts index bcedbfe2ba4..bb06bc701c2 100644 --- a/packages/vuetify/src/composables/locale.ts +++ b/packages/vuetify/src/composables/locale.ts @@ -1,6 +1,5 @@ // Utilities import { computed, inject, provide, ref } from 'vue' -import { defaultRtl } from '@/locale' import { createVuetifyAdapter } from '@/locale/adapters/vuetify' // Types @@ -81,8 +80,54 @@ export interface RtlInstance { export const RtlSymbol: InjectionKey = Symbol.for('vuetify:rtl') +function genDefaults () { + return { + af: false, + ar: true, + bg: false, + ca: false, + ckb: false, + cs: false, + de: false, + el: false, + en: false, + es: false, + et: false, + fa: true, + fi: false, + fr: false, + hr: false, + hu: false, + he: true, + id: false, + it: false, + ja: false, + ko: false, + lv: false, + lt: false, + nl: false, + no: false, + pl: false, + pt: false, + ro: false, + ru: false, + sk: false, + sl: false, + srCyrl: false, + srLatn: false, + sv: false, + th: false, + tr: false, + az: false, + uk: false, + vi: false, + zhHans: false, + zhHant: false, + } +} + export function createRtl (i18n: LocaleInstance, options?: RtlOptions): RtlInstance { - const rtl = ref>(options?.rtl ?? defaultRtl) + const rtl = ref>(options?.rtl ?? genDefaults()) const isRtl = computed(() => rtl.value[i18n.current.value] ?? false) return { diff --git a/packages/vuetify/src/locale/__tests__/index.spec.ts b/packages/vuetify/src/locale/__tests__/index.spec.ts index 9c2635c0e13..d350805a4c9 100755 --- a/packages/vuetify/src/locale/__tests__/index.spec.ts +++ b/packages/vuetify/src/locale/__tests__/index.spec.ts @@ -6,7 +6,7 @@ import * as locales from '../' describe('locales', () => { it('should have listed all available locales in index.ts', async () => { - const imported = Object.keys(locales).filter(key => key !== 'defaultRtl') + const imported = Object.keys(locales).filter(key => key !== 'default') const dir = fs.readdirSync(path.resolve(__dirname, '..')) .filter(filename => !['adapters', 'index.ts', '__tests__'].includes(filename)) .map(filename => filename.replace(/\.ts$/, '').replace('-', '')) @@ -22,6 +22,6 @@ describe('locales', () => { }, {} as Record) const enUnfilled = unfill(locales.en) - Object.entries(locales).forEach(([locale, messages]) => locale !== 'defaultRtl' && expect(unfill(messages)).toStrictEqual(enUnfilled)) + Object.entries(locales).forEach(([locale, messages]) => locale !== 'default' && expect(unfill(messages)).toStrictEqual(enUnfilled)) }) }) diff --git a/packages/vuetify/src/locale/index.ts b/packages/vuetify/src/locale/index.ts index 9669aeb6179..14291b29252 100755 --- a/packages/vuetify/src/locale/index.ts +++ b/packages/vuetify/src/locale/index.ts @@ -40,47 +40,3 @@ export { default as uk } from './uk' export { default as vi } from './vi' export { default as zhHans } from './zh-Hans' export { default as zhHant } from './zh-Hant' - -export const defaultRtl = { - af: false, - ar: true, - bg: false, - ca: false, - ckb: false, - cs: false, - de: false, - el: false, - en: false, - es: false, - et: false, - fa: true, - fi: false, - fr: false, - hr: false, - hu: false, - he: true, - id: false, - it: false, - ja: false, - ko: false, - lv: false, - lt: false, - nl: false, - no: false, - pl: false, - pt: false, - ro: false, - ru: false, - sk: false, - sl: false, - srCyrl: false, - srLatn: false, - sv: false, - th: false, - tr: false, - az: false, - uk: false, - vi: false, - zhHans: false, - zhHant: false, -} From ae52427c26dc4a0739679100fa6a63dcf6304eb0 Mon Sep 17 00:00:00 2001 From: John Leider Date: Wed, 10 Jan 2024 09:02:43 -0600 Subject: [PATCH 02/22] docs(team): add legends --- packages/docs/src/data/team.json | 77 +++++++++++++++++-- .../docs/src/pages/en/about/meet-the-team.md | 6 ++ 2 files changed, 78 insertions(+), 5 deletions(-) diff --git a/packages/docs/src/data/team.json b/packages/docs/src/data/team.json index cb206c94dc2..74d69dbeed5 100644 --- a/packages/docs/src/data/team.json +++ b/packages/docs/src/data/team.json @@ -58,16 +58,13 @@ }, "nekosaur": { "discord": ".nekosaur", - "focus": [ - "[vuetifyjs](https://github.com/vuetifyjs)" - ], "languages": [ "Swedish", "English" ], "location": "Malmö, Sweden", "name": "Albert Kaaman", - "team": "core", + "team": "legends", "joined": "Jun 2017" }, "MajesticPotatoe": { @@ -106,7 +103,7 @@ "joined": "Feb 2021" }, "elvinagarcia": { - "avatar": "https://pbs.twimg.com/profile_images/1641112338995748866/lVvo6nob_400x400.png", + "avatar": "https://cdn.vuetifyjs.com/docs/images/team/elvinagarcia.png", "discord": "elvinagarcia", "focus": [ "Design/Animations" @@ -132,5 +129,75 @@ "name": "Yuchao Wu", "team": "core", "joined": "Mar 2023" + }, + "jacekkarczmarczyk": { + "discord": "jacek#3542", + "languages": [ + "Polish", + "English" + ], + "location": "Warsaw, Poland", + "name": "Jacek Karczmarczyk", + "team": "legends" + }, + "chewy94": { + "avatar": "https://cdn.vuetifyjs.com/docs/images/team/chewy94.jpg", + "discord": "Sean Kimball#0001", + "languages": [ + "English" + ], + "linkedin": "sean-kimball-b50922126", + "location": "Goodyear, Arizona, USA", + "name": "Sean Kimball", + "team": "legends" + }, + "bdeo": { + "avatar": "https://cdn.vuetifyjs.com/docs/images/team/bdeo.jpg", + "discord": "brandondeo#0001", + "languages": [ + "English" + ], + "linkedin": "brandondeo", + "location": "Philadelphia, PA, USA", + "name": "Brandon Deo", + "team": "legends" + }, + "ElijahKotyluk": { + "avatar": "https://cdn.vuetifyjs.com/docs/images/team/ElijahKotyluk.jpg", + "discord": "edk#4363", + "languages": [ + "English" + ], + "location": "USA", + "name": "Elijah Kotyluk", + "team": "legends" + }, + "santiagoaloi": { + "avatar": "https://cdn.vuetifyjs.com/docs/images/team/santiagoaloi.jpg", + "discord": "lannnister", + "languages": [ + "Swedish", + "English", + "Spanish" + ], + "linkedin": "santiagoaloi", + "location": "Stockholm, Sweden", + "name": "Santiago Aloi", + "team": "legends", + "joined": "Feb 2023" + }, + "yooneskh": { + "avatar": "https://cdn.vuetifyjs.com/docs/images/team/yooneskh.png", + "discord": "YoonesKh#7826", + "languages": [ + "English", + "Persian" + ], + "twitter": "yooneskh", + "linkedin": "yooneskh ", + "location": "Iran", + "name": "Yoones Khoshghadam", + "team": "legends", + "joined": "January 2023" } } diff --git a/packages/docs/src/pages/en/about/meet-the-team.md b/packages/docs/src/pages/en/about/meet-the-team.md index c2d55e59655..1f3a0247a05 100644 --- a/packages/docs/src/pages/en/about/meet-the-team.md +++ b/packages/docs/src/pages/en/about/meet-the-team.md @@ -32,3 +32,9 @@ The core development team are Open Source developers that help guide the directi + +## Legends + +Legends are inactive members of the core team. They have contributed a significant amount of time and effort to the project and are recognized for their contributions. + + From a2f16f44f43d8a0996ee4992b01f7a0ef13d42b7 Mon Sep 17 00:00:00 2001 From: John Leider Date: Wed, 10 Jan 2024 09:54:24 -0600 Subject: [PATCH 03/22] fix(paginate): emit current-items event on items change --- .../docs/src/pages/en/getting-started/upgrade-guide.md | 1 + .../src/components/VDataIterator/VDataIterator.tsx | 1 + .../vuetify/src/components/VDataTable/VDataTable.tsx | 1 + .../src/components/VDataTable/composables/paginate.ts | 10 ++++++++-- 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/docs/src/pages/en/getting-started/upgrade-guide.md b/packages/docs/src/pages/en/getting-started/upgrade-guide.md index 691288f30be..c812aeee4e1 100644 --- a/packages/docs/src/pages/en/getting-started/upgrade-guide.md +++ b/packages/docs/src/pages/en/getting-started/upgrade-guide.md @@ -245,6 +245,7 @@ app.use(vuetify) - `onRowClick (item, data, event)` should be changed to `onRowClick (event, { item })`. - `item-class` and `item-style` have been combined into `row-props`, and `cell-props` has been added. - `sort-desc` and `group-desc` have been combined into `sort-by` and `group-by`. These properties now take an array of `{ key: string, order: 'asc' | 'desc' }` objects instead of strings. +- `current-items` event has been renamed to `update:current-items`. ### v-slider/v-range-slider diff --git a/packages/vuetify/src/components/VDataIterator/VDataIterator.tsx b/packages/vuetify/src/components/VDataIterator/VDataIterator.tsx index b6e165e9424..63864bab2a9 100644 --- a/packages/vuetify/src/components/VDataIterator/VDataIterator.tsx +++ b/packages/vuetify/src/components/VDataIterator/VDataIterator.tsx @@ -84,6 +84,7 @@ export const VDataIterator = genericComponent()({ 'update:sortBy': (value: any) => true, 'update:options': (value: any) => true, 'update:expanded': (value: any) => true, + 'update:currentItems': (value: any) => true, }, setup (props, { slots }) { diff --git a/packages/vuetify/src/components/VDataTable/VDataTable.tsx b/packages/vuetify/src/components/VDataTable/VDataTable.tsx index e50e0536788..b18bc8cddbf 100644 --- a/packages/vuetify/src/components/VDataTable/VDataTable.tsx +++ b/packages/vuetify/src/components/VDataTable/VDataTable.tsx @@ -119,6 +119,7 @@ export const VDataTable = genericComponent( 'update:options': (value: any) => true, 'update:groupBy': (value: any) => true, 'update:expanded': (value: any) => true, + 'update:currentItems': (value: any) => true, }, setup (props, { attrs, slots }) { diff --git a/packages/vuetify/src/components/VDataTable/composables/paginate.ts b/packages/vuetify/src/components/VDataTable/composables/paginate.ts index c2a345d12b8..63515ee6195 100644 --- a/packages/vuetify/src/components/VDataTable/composables/paginate.ts +++ b/packages/vuetify/src/components/VDataTable/composables/paginate.ts @@ -2,8 +2,8 @@ import { useProxiedModel } from '@/composables/proxiedModel' // Utilities -import { computed, inject, provide, watchEffect } from 'vue' -import { clamp, propsFactory } from '@/util' +import { computed, inject, provide, watch, watchEffect } from 'vue' +import { clamp, getCurrentInstance, propsFactory } from '@/util' // Types import type { InjectionKey, Ref } from 'vue' @@ -117,6 +117,8 @@ export function usePaginatedItems (options: { stopIndex: Ref itemsPerPage: Ref }) { + const vm = getCurrentInstance('usePaginatedItems') + const { items, startIndex, stopIndex, itemsPerPage } = options const paginatedItems = computed(() => { if (itemsPerPage.value <= 0) return items.value @@ -124,5 +126,9 @@ export function usePaginatedItems (options: { return items.value.slice(startIndex.value, stopIndex.value) }) + watch(paginatedItems, val => { + vm.emit('update:currentItems', val) + }) + return { paginatedItems } } From 55b62fd61a84245476f4f64fe7634c66c0e21303 Mon Sep 17 00:00:00 2001 From: John Leider Date: Wed, 10 Jan 2024 13:05:36 -0600 Subject: [PATCH 04/22] fix(VSelectionControl): allow click events when readonly fixes #18024 doesn't break #16812 --- .../VSelectionControl/VSelectionControl.tsx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/vuetify/src/components/VSelectionControl/VSelectionControl.tsx b/packages/vuetify/src/components/VSelectionControl/VSelectionControl.tsx index e519cefb42f..f244c5a2cb9 100644 --- a/packages/vuetify/src/components/VSelectionControl/VSelectionControl.tsx +++ b/packages/vuetify/src/components/VSelectionControl/VSelectionControl.tsx @@ -173,10 +173,11 @@ export const VSelectionControl = genericComponent( trueValue, } = useSelectionControl(props) const uid = getUid() - const id = computed(() => props.id || `input-${uid}`) const isFocused = shallowRef(false) const isFocusVisible = shallowRef(false) const input = ref() + const id = computed(() => props.id || `input-${uid}`) + const isInteractive = computed(() => !props.disabled && !props.readonly) group?.onForceUpdate(() => { if (input.value) { @@ -185,6 +186,8 @@ export const VSelectionControl = genericComponent( }) function onFocus (e: FocusEvent) { + if (!isInteractive.value) return + isFocused.value = true if (matchesSelector(e.target as HTMLElement, ':focus-visible') !== false) { isFocusVisible.value = true @@ -197,6 +200,8 @@ export const VSelectionControl = genericComponent( } function onInput (e: Event) { + if (!isInteractive.value) return + if (props.readonly && group) { nextTick(() => group.forceUpdate()) } @@ -216,12 +221,12 @@ export const VSelectionControl = genericComponent( Date: Wed, 10 Jan 2024 14:13:08 -0600 Subject: [PATCH 05/22] fix(VTabs): set correct initial isSelected value fixes #18284 --- packages/vuetify/src/components/VBtn/VBtn.tsx | 2 +- packages/vuetify/src/components/VTabs/VTab.tsx | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/vuetify/src/components/VBtn/VBtn.tsx b/packages/vuetify/src/components/VBtn/VBtn.tsx index d5dad518650..9ebb439a418 100644 --- a/packages/vuetify/src/components/VBtn/VBtn.tsx +++ b/packages/vuetify/src/components/VBtn/VBtn.tsx @@ -292,7 +292,7 @@ export const VBtn = genericComponent()({ ) }) - return {} + return { group } }, }) diff --git a/packages/vuetify/src/components/VTabs/VTab.tsx b/packages/vuetify/src/components/VTabs/VTab.tsx index 855589bd6fe..98e0bbfab6b 100644 --- a/packages/vuetify/src/components/VTabs/VTab.tsx +++ b/packages/vuetify/src/components/VTabs/VTab.tsx @@ -6,9 +6,10 @@ import { makeVBtnProps, VBtn } from '@/components/VBtn/VBtn' // Composables import { useTextColor } from '@/composables/color' +import { forwardRefs } from '@/composables/forwardRefs' // Utilities -import { computed, ref, shallowRef } from 'vue' +import { computed, ref } from 'vue' import { VTabsSymbol } from './shared' import { animate, genericComponent, omit, propsFactory, standardEasing, useRender } from '@/util' @@ -47,15 +48,14 @@ export const VTab = genericComponent()({ setup (props, { slots, attrs }) { const { textColorClasses: sliderColorClasses, textColorStyles: sliderColorStyles } = useTextColor(props, 'sliderColor') - const isHorizontal = computed(() => props.direction === 'horizontal') - const isSelected = shallowRef(false) const rootEl = ref() const sliderEl = ref() - function updateSlider ({ value }: { value: boolean }) { - isSelected.value = value + const isHorizontal = computed(() => props.direction === 'horizontal') + const isSelected = computed(() => rootEl.value?.group?.isSelected.value ?? false) + function updateSlider ({ value }: { value: boolean }) { if (value) { const prevEl: HTMLElement | undefined = rootEl.value?.$el.parentElement?.querySelector('.v-tab--selected .v-tab__slider') const nextEl = sliderEl.value @@ -146,7 +146,7 @@ export const VTab = genericComponent()({ ) }) - return {} + return forwardRefs({}, rootEl) }, }) From 74be0648018cdfecf58f98bd784d08c47b380155 Mon Sep 17 00:00:00 2001 From: John Leider Date: Wed, 10 Jan 2024 14:31:42 -0600 Subject: [PATCH 06/22] fix(VList): set explicit break-word css value fixes #18609 display: -webkit-box is janky --- packages/vuetify/src/components/VList/VListItem.sass | 1 + packages/vuetify/src/components/VList/_variables.scss | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/vuetify/src/components/VList/VListItem.sass b/packages/vuetify/src/components/VList/VListItem.sass index 643840ecef7..95b3ed01b6c 100644 --- a/packages/vuetify/src/components/VList/VListItem.sass +++ b/packages/vuetify/src/components/VList/VListItem.sass @@ -168,6 +168,7 @@ overflow: hidden padding: $list-item-subtitle-padding text-overflow: ellipsis + word-break: $list-item-subtitle-word-break .v-list-item--one-line & -webkit-line-clamp: 1 diff --git a/packages/vuetify/src/components/VList/_variables.scss b/packages/vuetify/src/components/VList/_variables.scss index 7d0c484ad34..bffc7dfd5d3 100644 --- a/packages/vuetify/src/components/VList/_variables.scss +++ b/packages/vuetify/src/components/VList/_variables.scss @@ -98,6 +98,7 @@ $list-item-subtitle-letter-spacing: tools.map-deep-get(settings.$typography, 'bo $list-item-subtitle-line-height: 1rem !default; $list-item-subtitle-padding: 0 !default; $list-item-subtitle-text-transform: none !default; +$list-item-subtitle-word-break: break-all !default; $list-item-title-font-size: tools.map-deep-get(settings.$typography, 'body-1', 'size') !default; $list-item-title-font-weight: tools.map-deep-get(settings.$typography, 'body-1', 'weight') !default; From 3014429887ef60f882c0789233b8d2e5706e3493 Mon Sep 17 00:00:00 2001 From: John Leider Date: Wed, 10 Jan 2024 14:54:06 -0600 Subject: [PATCH 07/22] fix(date): properly use date from toJsDate fixes #18707 --- packages/vuetify/src/composables/date/date.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/vuetify/src/composables/date/date.ts b/packages/vuetify/src/composables/date/date.ts index ebc8787b782..b95c4297adf 100644 --- a/packages/vuetify/src/composables/date/date.ts +++ b/packages/vuetify/src/composables/date/date.ts @@ -118,14 +118,14 @@ export function useDate () { // https://stackoverflow.com/questions/274861/how-do-i-calculate-the-week-number-given-a-date/275024#275024 export function getWeek (adapter: DateAdapter, value: any) { const date = adapter.toJsDate(value) - let year = adapter.getYear(date) - let d1w1 = adapter.startOfYear(date) + let year = date.getFullYear() + let d1w1 = new Date(year, 0, 1) if (date < d1w1) { year = year - 1 - d1w1 = adapter.startOfYear(adapter.setYear(date, year)) + d1w1 = new Date(year, 0, 1) } else { - const tv = adapter.startOfYear(adapter.setYear(date, year + 1)) + const tv = new Date(year + 1, 0, 1) if (date >= tv) { year = year + 1 d1w1 = tv From d31a1a0e1bbf78ba76d8e46280788ab7d2d34653 Mon Sep 17 00:00:00 2001 From: John Leider Date: Wed, 10 Jan 2024 14:55:07 -0600 Subject: [PATCH 08/22] fix(calendar): use toJsDate before calling getDay --- packages/vuetify/src/composables/calendar.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vuetify/src/composables/calendar.ts b/packages/vuetify/src/composables/calendar.ts index 3696ac09c75..5b4d9552c7b 100644 --- a/packages/vuetify/src/composables/calendar.ts +++ b/packages/vuetify/src/composables/calendar.ts @@ -113,7 +113,7 @@ export function useCalendar (props: CalendarProps) { function genDays (days: Date[], today: Date) { return days.filter(date => { - return props.weekdays.includes(date.getDay()) + return props.weekdays.includes(adapter.toJsDate(date).getDay()) }).map((date, index) => { const isoDate = adapter.toISO(date) const isAdjacent = !adapter.isSameMonth(date, month.value) From 135a8c89759452f954ec8c83960b9e45c82e0ff5 Mon Sep 17 00:00:00 2001 From: John Leider Date: Wed, 10 Jan 2024 15:00:20 -0600 Subject: [PATCH 09/22] chore(dev): add dayjs package --- packages/vuetify/dev/vuetify/date.js | 2 ++ packages/vuetify/package.json | 1 + yarn.lock | 12 ++++++++++++ 3 files changed, 15 insertions(+) diff --git a/packages/vuetify/dev/vuetify/date.js b/packages/vuetify/dev/vuetify/date.js index 855a4dfe508..7f9c8169ac3 100644 --- a/packages/vuetify/dev/vuetify/date.js +++ b/packages/vuetify/dev/vuetify/date.js @@ -1,6 +1,8 @@ // import DateFnsAdapter from '@date-io/date-fns' // import { enAU, enUS, ja, sv } from 'date-fns/locale' +// import DayJsAdapter from '@date-io/dayjs' + export default { // adapter: DateFnsAdapter, formats: { diff --git a/packages/vuetify/package.json b/packages/vuetify/package.json index 7ad8fc0378c..1f163b796b6 100755 --- a/packages/vuetify/package.json +++ b/packages/vuetify/package.json @@ -121,6 +121,7 @@ "devDependencies": { "@date-io/core": "2.17.0", "@date-io/date-fns": "2.17.0", + "@date-io/dayjs": "^3.0.0", "@formatjs/intl": "^2.9.9", "@fortawesome/fontawesome-svg-core": "^6.4.2", "@fortawesome/free-solid-svg-icons": "^6.4.2", diff --git a/yarn.lock b/yarn.lock index 83b830d5bd3..033561caea1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1444,6 +1444,11 @@ resolved "https://registry.yarnpkg.com/@date-io/core/-/core-2.17.0.tgz#360a4d0641f069776ed22e457876e8a8a58c205e" integrity sha512-+EQE8xZhRM/hsY0CDTVyayMDDY5ihc4MqXCrPxooKw19yAzUIC6uUqsZeaOFNL9YKTNxYKrJP5DFgE8o5xRCOw== +"@date-io/core@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@date-io/core/-/core-3.0.0.tgz#9fd2375383b5791b7211dfce3e576211f9ddce5e" + integrity sha512-S3j+IAQVBYNkQzchVVhX40eBkGDreBpScy9RXwTS5j2+k07+62pMVPisQ44Gq76Rqy5AOG/EZXCwBpY/jbemvA== + "@date-io/date-fns@2.17.0": version "2.17.0" resolved "https://registry.yarnpkg.com/@date-io/date-fns/-/date-fns-2.17.0.tgz#1d9d0a02e0137524331819c9576a4e8e19a6142b" @@ -1451,6 +1456,13 @@ dependencies: "@date-io/core" "^2.17.0" +"@date-io/dayjs@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@date-io/dayjs/-/dayjs-3.0.0.tgz#46cf595d10639fe00b89e8c23cbcac22c0d542bb" + integrity sha512-vy7DSwoQiPA2L0stRqW3le7lcEBMjoMMEmbpCNkyoX3xXizKInFvhbnOBmCyusIQ7tL/WsNC4X5bVgdNWX0JLA== + dependencies: + "@date-io/core" "^3.0.0" + "@emailjs/browser@^3.11.0": version "3.11.0" resolved "https://registry.yarnpkg.com/@emailjs/browser/-/browser-3.11.0.tgz#0e78de2f85096d1a9ad5b5977b060bb5d1784cb4" From ae920de4a6976e3ac85398a65ea60c7fc814f374 Mon Sep 17 00:00:00 2001 From: John Leider Date: Wed, 10 Jan 2024 15:00:44 -0600 Subject: [PATCH 10/22] chore: remove deprecated files --- .../src/components/VDatePicker/utils.ts | 83 ----------- packages/vuetify/src/util/dateTimeUtils.ts | 139 ------------------ 2 files changed, 222 deletions(-) delete mode 100644 packages/vuetify/src/components/VDatePicker/utils.ts delete mode 100644 packages/vuetify/src/util/dateTimeUtils.ts diff --git a/packages/vuetify/src/components/VDatePicker/utils.ts b/packages/vuetify/src/components/VDatePicker/utils.ts deleted file mode 100644 index 8e8507a89fb..00000000000 --- a/packages/vuetify/src/components/VDatePicker/utils.ts +++ /dev/null @@ -1,83 +0,0 @@ -// Utilities -import { createRange, padStart } from '@/util' - -export function getFirstWeekdayOfMonth (year: number, month: number) { - return new Date(`${year}-${month}-01`).getDay() -} - -function getNumberOfDaysInMonth (year: number, month: number) { - return new Date(year, month, 0).getDate() -} - -// function getMonthName (month: number, locale = 'en-US') { -// const date = new Date(`2022-${month}-01`) -// return date.toLocaleString(locale, { month: 'long' }) -// } - -export function changeMonth (year: number, month: number, change: number) { - if (change < 0 && month + change < 1) { - return [year - 1, 12 + (month + change)] - } else if (change > 0 && month + change > 12) { - return [year + 1, (month + change) % 12] - } else { - return [year, month + change] - } -} - -export function getDate (year: number, month: number, day: number) { - return `${year}-${padStart(String(month), 2, '0')}-${padStart(String(day), 2, '0')}` -} - -export function addDays (date: string, days: number) { - const d = new Date(date) - - d.setDate(d.getDate() + days) - - return getDate(d.getFullYear(), d.getMonth() + 1, d.getDate()) -} - -export function parseDate (date: string): [number, number, number] { - const [year, month, day] = date.split('-').map(Number) - - return [year, month, day] -} - -function getMondayOfFirstWeekOfYear (year: number) { - const januaryFirst = new Date(year, 0, 1) - const mondayOfFirstWeek = new Date(januaryFirst) - - mondayOfFirstWeek.setDate(mondayOfFirstWeek.getDate() + ((11 - januaryFirst.getDay()) % 7) - 3) - - return mondayOfFirstWeek -} - -// https://stackoverflow.com/questions/274861/how-do-i-calculate-the-week-number-given-a-date/275024#275024 -export function getWeek (date: Date) { - let year = date.getFullYear() - let d1w1 = getMondayOfFirstWeekOfYear(year) - - if (date < d1w1) { - year = year - 1 - d1w1 = getMondayOfFirstWeekOfYear(year) - } else { - const tv = getMondayOfFirstWeekOfYear(year + 1) - if (date >= tv) { - year = year + 1 - d1w1 = tv - } - } - - const diffTime = Math.abs(date.getTime() - d1w1.getTime()) - const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)) - - return Math.floor(diffDays / 7) + 1 -} - -export function getDaysInMonth (year: number, month: number) { - return createRange(getNumberOfDaysInMonth(year, month), 1).map(day => ({ - year, - month, - day, - date: getDate(year, month, day), - })) -} diff --git a/packages/vuetify/src/util/dateTimeUtils.ts b/packages/vuetify/src/util/dateTimeUtils.ts deleted file mode 100644 index 26f2e6d0fae..00000000000 --- a/packages/vuetify/src/util/dateTimeUtils.ts +++ /dev/null @@ -1,139 +0,0 @@ -// Utilities -import { createRange, padStart } from '@/util' - -export function getFirstDayOfMonth (year: number, month: number) { - return new Date(year, month, 1) -} - -export function getLastDayOfMonth (year: number, month: number) { - return new Date(year, month + 1, 0) -} - -function getNumberOfDaysInMonth (year: number, month: number) { - return new Date(year, month, 0).getDate() -} - -export function changeMonth (year: number, month: number, change: number) { - if (change < 0 && month + change < 1) { - return [year - 1, 12 + (month + change)] - } else if (change > 0 && month + change > 12) { - return [year + 1, (month + change) % 12] - } else { - return [year, month + change] - } -} - -export function getDate (year: number, month: number, day: number) { - return `${year}-${padStart(String(month), 2, '0')}-${padStart(String(day), 2, '0')}` -} - -export function addDays (date: string, days: number) { - const d = new Date(date) - - d.setDate(d.getDate() + days) - - return getDate(d.getFullYear(), d.getMonth() + 1, d.getDate()) -} - -export function parseDate (date: string): [number, number, number] { - const [year, month, day] = date.split('-').map(Number) - - return [year, month, day] -} - -function getMondayOfFirstWeekOfYear (year: number) { - const januaryFirst = new Date(year, 0, 1) - const mondayOfFirstWeek = new Date(januaryFirst) - - mondayOfFirstWeek.setDate(mondayOfFirstWeek.getDate() + ((11 - januaryFirst.getDay()) % 7) - 3) - - return mondayOfFirstWeek -} - -// https://stackoverflow.com/questions/274861/how-do-i-calculate-the-week-number-given-a-date/275024#275024 -export function getWeek (date: Date) { - let year = date.getFullYear() - let d1w1 = getMondayOfFirstWeekOfYear(year) - - if (date < d1w1) { - year = year - 1 - d1w1 = getMondayOfFirstWeekOfYear(year) - } else { - const tv = getMondayOfFirstWeekOfYear(year + 1) - if (date >= tv) { - year = year + 1 - d1w1 = tv - } - } - - const diffTime = Math.abs(date.getTime() - d1w1.getTime()) - const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)) - - return Math.floor(diffDays / 7) + 1 -} - -export function getDaysInMonth (year: number, month: number) { - return createRange(getNumberOfDaysInMonth(year, month), 1).map(day => ({ - year, - month, - day, - date: getDate(year, month, day), - })) -} - -// old - -function createUTCDate (year: number, month = 0, day = 1) { - let date - if (year < 100 && year >= 0) { - date = new Date(Date.UTC(year, month, day)) - if (isFinite(date.getUTCFullYear())) { - date.setUTCFullYear(year) - } - } else { - date = new Date(Date.UTC(year, month, day)) - } - - return date -} - -function firstWeekOffset (year: number, firstDayOfWeek: number, firstDayOfYear: number) { - const firstWeekDayInFirstWeek = 7 + firstDayOfWeek - firstDayOfYear - const firstWeekDayOfYear = (7 + createUTCDate(year, 0, firstWeekDayInFirstWeek).getUTCDay() - firstDayOfWeek) % 7 - - return -firstWeekDayOfYear + firstWeekDayInFirstWeek - 1 -} - -function dayOfYear (year: number, month: number, day: number, firstDayOfWeek: number) { - let dayOfYear = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334][month] - if (month > 1 && isLeapYear(year)) { - dayOfYear++ - } - - return dayOfYear + day -} - -function weeksInYear (year: number, firstDayOfWeek: number, firstDayOfYear: number) { - const weekOffset = firstWeekOffset(year, firstDayOfWeek, firstDayOfYear) - const weekOffsetNext = firstWeekOffset(year + 1, firstDayOfWeek, firstDayOfYear) - const daysInYear = isLeapYear(year) ? 366 : 365 - - return (daysInYear - weekOffset + weekOffsetNext) / 7 -} - -export function weekNumber (year: number, month: number, day: number, firstDayOfWeek: number, localeFirstDayOfYear: number): number { - const weekOffset = firstWeekOffset(year, firstDayOfWeek, localeFirstDayOfYear) - const week = Math.ceil((dayOfYear(year, month, day, firstDayOfWeek) - weekOffset) / 7) - - if (week < 1) { - return week + weeksInYear(year - 1, firstDayOfWeek, localeFirstDayOfYear) - } else if (week > weeksInYear(year, firstDayOfWeek, localeFirstDayOfYear)) { - return week - weeksInYear(year, firstDayOfWeek, localeFirstDayOfYear) - } else { - return week - } -} - -export function isLeapYear (year: number): boolean { - return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0) -} From 0a64f7f62417c5ae3592e110147b9fb050aec702 Mon Sep 17 00:00:00 2001 From: John Leider Date: Wed, 10 Jan 2024 15:09:33 -0600 Subject: [PATCH 11/22] fix(VDatePicker): use startOfMonth date for text display fixes #18794 --- packages/vuetify/src/components/VDatePicker/VDatePicker.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vuetify/src/components/VDatePicker/VDatePicker.tsx b/packages/vuetify/src/components/VDatePicker/VDatePicker.tsx index c00b4a41139..414a24ba46f 100644 --- a/packages/vuetify/src/components/VDatePicker/VDatePicker.tsx +++ b/packages/vuetify/src/components/VDatePicker/VDatePicker.tsx @@ -121,7 +121,7 @@ export const VDatePicker = genericComponent { return adapter.format( - adapter.setYear(adapter.setMonth(adapter.date(), month.value), year.value), + adapter.setYear(adapter.setMonth(adapter.startOfMonth(adapter.date()), month.value), year.value), 'monthAndYear', ) }) From 62bc868a7edb7460a4e1f1d936261883f1cf8ec7 Mon Sep 17 00:00:00 2001 From: John Leider Date: Wed, 10 Jan 2024 15:22:19 -0600 Subject: [PATCH 12/22] chore: remove deprecated tests --- .../VDatePicker/__tests__/utils.spec.ts | 23 ---------------- .../src/util/__tests__/dateTimeUtils.spec.ts | 26 ------------------- 2 files changed, 49 deletions(-) delete mode 100644 packages/vuetify/src/components/VDatePicker/__tests__/utils.spec.ts delete mode 100644 packages/vuetify/src/util/__tests__/dateTimeUtils.spec.ts diff --git a/packages/vuetify/src/components/VDatePicker/__tests__/utils.spec.ts b/packages/vuetify/src/components/VDatePicker/__tests__/utils.spec.ts deleted file mode 100644 index 8895bf3875a..00000000000 --- a/packages/vuetify/src/components/VDatePicker/__tests__/utils.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -// @ts-nocheck -/* eslint-disable */ - -import { getWeek } from '../utils' -import { describe, expect, it } from '@jest/globals' - -describe('getWeek', () => { - it.each([ - [1, new Date(2001, 0, 1)], - [1, new Date(2001, 11, 31)], - [1, new Date(2002, 11, 30)], - [1, new Date(2003, 11, 29)], - [1, new Date(2010, 0, 4)], - [1, new Date(2005, 0, 3)], - [1, new Date(2006, 0, 2)], - [1, new Date(1996, 11, 30)], - [52, new Date(2006, 0, 1)], - [53, new Date(2005, 0, 1)], - [53, new Date(2010, 0, 3)], - ])('should return week %s for date %s', (expected, given) => { - expect(getWeek(given)).toBe(expected) - }) -}) diff --git a/packages/vuetify/src/util/__tests__/dateTimeUtils.spec.ts b/packages/vuetify/src/util/__tests__/dateTimeUtils.spec.ts deleted file mode 100644 index 0c94370797e..00000000000 --- a/packages/vuetify/src/util/__tests__/dateTimeUtils.spec.ts +++ /dev/null @@ -1,26 +0,0 @@ -// Utilities -import { describe, expect, it } from '@jest/globals' -import { weekNumber } from '../dateTimeUtils' - -describe('/util/dateTimeUtils.ts', () => { - it.each([ - [2010, 0, 1, 1, 4, 53], - [2016, 0, 1, 0, 4, 53], - [2006, 0, 1, 1, 4, 52], - [2005, 11, 31, 0, 4, 52], - [2006, 0, 1, 0, 4, 1], - [2017, 0, 1, 0, 4, 1], - [2019, 11, 31, 0, 4, 1], - [2020, 0, 1, 0, 4, 1], - [2020, 0, 1, 1, 4, 1], - [2020, 0, 8, 0, 4, 2], - [2020, 0, 8, 1, 4, 2], - [2020, 1, 1, 2, 4, 5], - // ISO 8601 (first day of week Monday, First week of year must contain a thurstday) - [2012, 0, 1, 1, 4, 52], - // American locale (first day of week Sunday, 1 Jan determines first week) - [2012, 0, 1, 0, 0, 1], - ])('should return correct weeknumber', (year, month, day, firstDayOfWeek, localFirstDayOfYear, week) => { - expect(weekNumber(year, month, day, firstDayOfWeek, localFirstDayOfYear)).toBe(week) - }) -}) From 834c91d0fd08c6c91c8c1d2a7ce69b04e5814de6 Mon Sep 17 00:00:00 2001 From: John Leider Date: Wed, 10 Jan 2024 15:55:28 -0600 Subject: [PATCH 13/22] docs(team): fix linting issue --- packages/docs/src/store/team.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/docs/src/store/team.ts b/packages/docs/src/store/team.ts index 69b321ce8ff..ba001be29e6 100644 --- a/packages/docs/src/store/team.ts +++ b/packages/docs/src/store/team.ts @@ -10,7 +10,7 @@ import team from '@/data/team.json' export type Member = { discord?: string - focus: string[] + focus?: string[] funding?: string[] languages: string[] linkedin?: string From 1866f973502422f1b8f8d6fea0a2e2cb6cb3860d Mon Sep 17 00:00:00 2001 From: Kael Date: Fri, 12 Jan 2024 21:58:36 +1100 Subject: [PATCH 14/22] chore(dev): remove duplicate uphead --- packages/vuetify/dev/index.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/packages/vuetify/dev/index.js b/packages/vuetify/dev/index.js index fa04ab04588..12cb8b05222 100644 --- a/packages/vuetify/dev/index.js +++ b/packages/vuetify/dev/index.js @@ -1,7 +1,6 @@ import vuetify from './vuetify' import App from './App.vue' -import { createHead } from '@unhead/vue' import { routes } from './router' import viteSSR from 'vite-ssr/vue' @@ -12,12 +11,6 @@ import { fas } from '@fortawesome/free-solid-svg-icons' library.add(fas) export default viteSSR(App, { routes }, ({ app }) => { - const head = createHead() - - // app.config.performance = true - app.use(head) app.use(vuetify) app.component('FontAwesomeIcon', FontAwesomeIcon) - - return { head } }) From 520b765c813b68324de75c82e0b78e9fa7376c92 Mon Sep 17 00:00:00 2001 From: Kael Date: Fri, 12 Jan 2024 22:03:57 +1100 Subject: [PATCH 15/22] docs(upgrade-guide): update menu section --- packages/docs/src/pages/en/getting-started/upgrade-guide.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/docs/src/pages/en/getting-started/upgrade-guide.md b/packages/docs/src/pages/en/getting-started/upgrade-guide.md index c812aeee4e1..80fc06e1f50 100644 --- a/packages/docs/src/pages/en/getting-started/upgrade-guide.md +++ b/packages/docs/src/pages/en/getting-started/upgrade-guide.md @@ -265,9 +265,9 @@ app.use(vuetify) ### v-menu - `rounded` prop has been removed. Apply a rounded css class to the menu content element instead. e.g. `.rounded-te` -- `internal-activator` prop has been removed without replacement -- `offset-y` and `offset-x` props have been removed. Use `offset` prop instead -- `absolute` variant has been removed. For absolute positioning use css instead +- `internal-activator` prop has been removed, use a ref or unique selector instead. +- `absolute`, `offset-y` and `offset-x` props have been removed. Manual positioning is now done by passing a `[x, y]` array to the `target` prop. +- `nudge-*` props have been removed. There is no direct replacement but `offset` can be used to achieve similar results. ### v-snackbar From f2dd5c037f7b6b4336af67fe5e382ebfba44b458 Mon Sep 17 00:00:00 2001 From: Blaine Landowski <42892508+blalan05@users.noreply.github.com> Date: Fri, 12 Jan 2024 19:13:43 -0600 Subject: [PATCH 16/22] fix(date): return unmodified DateTimeFormat (#19017) fixes #19013 --- packages/vuetify/src/composables/date/adapters/vuetify.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/vuetify/src/composables/date/adapters/vuetify.ts b/packages/vuetify/src/composables/date/adapters/vuetify.ts index a96db35935e..7d056fbb853 100644 --- a/packages/vuetify/src/composables/date/adapters/vuetify.ts +++ b/packages/vuetify/src/composables/date/adapters/vuetify.ts @@ -263,8 +263,7 @@ function getWeekdays (locale: string) { return createRange(7).map(i => { const weekday = new Date(sundayJanuarySecond2000) weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i) - const formattedDay = new Intl.DateTimeFormat(locale, { weekday: 'short' }).format(weekday) - return formattedDay.charAt(0).toUpperCase() + formattedDay.slice(1) + return new Intl.DateTimeFormat(locale, { weekday: 'narrow' }).format(weekday) }) } From 64618ffa80565e048b6ef89bac60687ca839d8e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Gyarmati?= Date: Sat, 13 Jan 2024 02:26:49 +0100 Subject: [PATCH 17/22] fix(VSliderThumb): patch memory leak in `VSliderThumb` (#19024) fixes #19022 Co-authored-by: John Leider --- packages/vuetify/src/components/VSlider/VSliderThumb.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/vuetify/src/components/VSlider/VSliderThumb.tsx b/packages/vuetify/src/components/VSlider/VSliderThumb.tsx index 69ab64540ea..1e8cce796df 100644 --- a/packages/vuetify/src/components/VSlider/VSliderThumb.tsx +++ b/packages/vuetify/src/components/VSlider/VSliderThumb.tsx @@ -84,6 +84,8 @@ export const VSliderThumb = genericComponent()({ indexFromEnd, } = slider + const elevationProps = computed(() => !disabled.value ? elevation.value : undefined) + const { elevationClasses } = useElevation(elevationProps) const { textColorClasses, textColorStyles } = useTextColor(thumbColor) const { pageup, pagedown, end, home, left, right, down, up } = keyValues @@ -129,7 +131,6 @@ export const VSliderThumb = genericComponent()({ useRender(() => { const positionPercentage = convertToUnit(indexFromEnd.value ? 100 - props.position : props.position, '%') - const { elevationClasses } = useElevation(computed(() => !disabled.value ? elevation.value : undefined)) return (
Date: Sat, 13 Jan 2024 10:51:33 -0600 Subject: [PATCH 18/22] fix(utilities): remove !important from font-family utility class fixes #5640 --- packages/vuetify/src/styles/settings/_utilities.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/vuetify/src/styles/settings/_utilities.scss b/packages/vuetify/src/styles/settings/_utilities.scss index ef6005fdcb9..24b8a7e8449 100644 --- a/packages/vuetify/src/styles/settings/_utilities.scss +++ b/packages/vuetify/src/styles/settings/_utilities.scss @@ -498,6 +498,7 @@ $utilities: () !default; ), class: text, unimportant: ( + font-family, font-weight, line-height ), From a5254a2bada424c0bbdbc9d86fcea2afb6a86dc2 Mon Sep 17 00:00:00 2001 From: John Leider Date: Sat, 13 Jan 2024 12:18:21 -0600 Subject: [PATCH 19/22] fix(VDataTableFooter): layout shift from element spacing --- .../src/components/VDataTable/VDataTableFooter.sass | 11 ++++++++--- .../vuetify/src/components/VDataTable/_variables.scss | 5 +++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/packages/vuetify/src/components/VDataTable/VDataTableFooter.sass b/packages/vuetify/src/components/VDataTable/VDataTableFooter.sass index a6002ad6412..40dce3db64d 100644 --- a/packages/vuetify/src/components/VDataTable/VDataTableFooter.sass +++ b/packages/vuetify/src/components/VDataTable/VDataTableFooter.sass @@ -10,21 +10,26 @@ justify-content: flex-end .v-data-table-footer__items-per-page - padding-inline-end: 24px display: flex align-items: center justify-content: space-between > span - padding-inline-end: 24px + padding-inline-end: $data-table-footer-items-per-page-padding + + > .v-select + width: $data-table-footer-select-width .v-data-table-footer__info display: flex - padding-inline-end: 24px + justify-content: flex-end + min-width: $data-table-footer-info-min-width + padding: $data-table-footer-info-padding .v-data-table-footer__pagination display: flex align-items: center + margin-inline-start: $data-table-footer-pagination-margin-inline-start .v-data-table-footer__page padding: 0 8px diff --git a/packages/vuetify/src/components/VDataTable/_variables.scss b/packages/vuetify/src/components/VDataTable/_variables.scss index 6f044e1b860..e0bb0224f7b 100644 --- a/packages/vuetify/src/components/VDataTable/_variables.scss +++ b/packages/vuetify/src/components/VDataTable/_variables.scss @@ -1,6 +1,11 @@ @use '../../styles/settings'; @use '../../styles/tools'; +$data-table-footer-info-min-width: 132px !default; +$data-table-footer-info-padding: 0 16px !default; $data-table-footer-padding: 4px !default; +$data-table-footer-pagination-margin-inline-start: 16px !default; +$data-table-footer-select-width: 90px !default; +$data-table-footer-items-per-page-padding: 8px !default; $data-table-header-sort-badge-size: 20px !default; $data-table-header-sort-badge-color: rgba(var(--v-border-color), var(--v-border-opacity)) !default; From 7e8dbcfd743f54d286a646d1cae58e2a659549a5 Mon Sep 17 00:00:00 2001 From: John Leider Date: Sat, 13 Jan 2024 15:40:57 -0600 Subject: [PATCH 20/22] chore(date): resolve linting issue --- .../src/composables/date/adapters/__tests__/vuetify.spec.ts | 2 +- packages/vuetify/src/composables/date/adapters/vuetify.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vuetify/src/composables/date/adapters/__tests__/vuetify.spec.ts b/packages/vuetify/src/composables/date/adapters/__tests__/vuetify.spec.ts index 3f72faf580c..736db0e3c15 100644 --- a/packages/vuetify/src/composables/date/adapters/__tests__/vuetify.spec.ts +++ b/packages/vuetify/src/composables/date/adapters/__tests__/vuetify.spec.ts @@ -14,7 +14,7 @@ describe('vuetify date adapter', () => { instance = new VuetifyDateAdapter({ locale: 'sv-se' }) - expect(instance.getWeekdays()).toStrictEqual(['Mån', 'Tis', 'Ons', 'Tors', 'Fre', 'Lör', 'Sön']) + expect(instance.getWeekdays()).toStrictEqual(['mån', 'tis', 'ons', 'tors', 'fre', 'lör', 'sön']) }) it('should format dates', () => { diff --git a/packages/vuetify/src/composables/date/adapters/vuetify.ts b/packages/vuetify/src/composables/date/adapters/vuetify.ts index 7d056fbb853..f0d7e30a0d3 100644 --- a/packages/vuetify/src/composables/date/adapters/vuetify.ts +++ b/packages/vuetify/src/composables/date/adapters/vuetify.ts @@ -263,7 +263,7 @@ function getWeekdays (locale: string) { return createRange(7).map(i => { const weekday = new Date(sundayJanuarySecond2000) weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i) - return new Intl.DateTimeFormat(locale, { weekday: 'narrow' }).format(weekday) + return new Intl.DateTimeFormat(locale, { weekday: 'short' }).format(weekday) }) } From 1a802cf44150a37304b0553d5a23d8f4edee3c30 Mon Sep 17 00:00:00 2001 From: John Leider Date: Sat, 13 Jan 2024 17:13:17 -0600 Subject: [PATCH 21/22] chore(VDataTableFooter): adjust element spacing --- .../vuetify/src/components/VDataTable/VDataTableFooter.sass | 2 +- packages/vuetify/src/components/VDataTable/_variables.scss | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vuetify/src/components/VDataTable/VDataTableFooter.sass b/packages/vuetify/src/components/VDataTable/VDataTableFooter.sass index 40dce3db64d..1e8ff47a3d0 100644 --- a/packages/vuetify/src/components/VDataTable/VDataTableFooter.sass +++ b/packages/vuetify/src/components/VDataTable/VDataTableFooter.sass @@ -12,7 +12,7 @@ .v-data-table-footer__items-per-page display: flex align-items: center - justify-content: space-between + justify-content: center > span padding-inline-end: $data-table-footer-items-per-page-padding diff --git a/packages/vuetify/src/components/VDataTable/_variables.scss b/packages/vuetify/src/components/VDataTable/_variables.scss index e0bb0224f7b..32e464ce6f6 100644 --- a/packages/vuetify/src/components/VDataTable/_variables.scss +++ b/packages/vuetify/src/components/VDataTable/_variables.scss @@ -1,7 +1,7 @@ @use '../../styles/settings'; @use '../../styles/tools'; -$data-table-footer-info-min-width: 132px !default; +$data-table-footer-info-min-width: 116px !default; $data-table-footer-info-padding: 0 16px !default; $data-table-footer-padding: 4px !default; $data-table-footer-pagination-margin-inline-start: 16px !default; From 07445bde713afa7a6078f70b5e3c64c5d63f884a Mon Sep 17 00:00:00 2001 From: John Leider Date: Sat, 13 Jan 2024 20:32:12 -0600 Subject: [PATCH 22/22] chore(helpers): remove unused functions --- packages/vuetify/src/util/helpers.ts | 69 +--------------------------- 1 file changed, 1 insertion(+), 68 deletions(-) diff --git a/packages/vuetify/src/util/helpers.ts b/packages/vuetify/src/util/helpers.ts index 5fbd71baa9b..3a777fd3a72 100644 --- a/packages/vuetify/src/util/helpers.ts +++ b/packages/vuetify/src/util/helpers.ts @@ -1,5 +1,5 @@ // Utilities -import { camelize, capitalize, Comment, computed, Fragment, isVNode, reactive, toRefs, unref, watchEffect } from 'vue' +import { capitalize, Comment, computed, Fragment, isVNode, reactive, toRefs, unref, watchEffect } from 'vue' import { IN_BROWSER } from '@/util/globals' // Types @@ -10,7 +10,6 @@ import type { InjectionKey, PropType, Ref, - Slots, ToRefs, VNode, VNodeArrayChildren, @@ -398,14 +397,6 @@ export function defaultFilter (value: any, search: string | null, item: any) { value.toString().toLocaleLowerCase().indexOf(search.toLocaleLowerCase()) !== -1 } -export function searchItems (items: T[], search: string): T[] { - if (!search) return items - search = search.toString().toLowerCase() - if (search.trim() === '') return items - - return items.filter((item: any) => Object.keys(item).some(key => defaultFilter(getObjectValueByPath(item, key), search, item))) -} - export function debounce (fn: Function, delay: MaybeRef) { let timeoutId = 0 as any const wrap = (...args: any[]) => { @@ -430,22 +421,6 @@ export function throttle any> (fn: T, limit: numbe } } -type Writable = { - -readonly [P in keyof T]: T[P] -} - -/** - * Filters slots to only those starting with `prefix`, removing the prefix - */ -export function getPrefixedSlots (prefix: string, slots: Slots): Slots { - return Object.keys(slots) - .filter(k => k.startsWith(prefix)) - .reduce>((obj, k) => { - obj[k.replace(prefix, '')] = slots[k] - return obj - }, {}) -} - export function clamp (value: number, min = 0, max = 1) { return Math.max(min, Math.min(max, value)) } @@ -495,15 +470,6 @@ export function humanReadableFileSize (bytes: number, base: 1000 | 1024 = 1000): return `${bytes.toFixed(1)} ${prefix[unit]}B` } -export function camelizeObjectKeys (obj: Record | null | undefined) { - if (!obj) return {} - - return Object.keys(obj).reduce((o: any, key: string) => { - o[camelize(key)] = obj[key] - return o - }, {}) -} - export function mergeDeep ( source: Record = {}, target: Record = {}, @@ -542,10 +508,6 @@ export function mergeDeep ( return out } -export function fillArray (length: number, obj: T) { - return Array(length).fill(obj) -} - export function flattenFragments (nodes: VNode[]): VNode[] { return nodes.map(node => { if (node.type === Fragment) { @@ -556,11 +518,6 @@ export function flattenFragments (nodes: VNode[]): VNode[] { }).flat() } -export const randomHexColor = () => { - const n = (Math.random() * 0xfffff * 1000000).toString(16) - return '#' + n.slice(0, 6) -} - export function toKebabCase (str = '') { if (toKebabCase.cache.has(str)) return toKebabCase.cache.get(str)! const kebab = str @@ -574,30 +531,6 @@ toKebabCase.cache = new Map() export type MaybeRef = T | Ref -export function findChildren (vnode?: VNodeChild): ComponentInternalInstance[] { - if (!vnode || typeof vnode !== 'object') { - return [] - } - - if (Array.isArray(vnode)) { - return vnode - .map(child => findChildren(child)) - .filter(v => v) - .flat(1) - } else if (Array.isArray(vnode.children)) { - return vnode.children - .map(child => findChildren(child)) - .filter(v => v) - .flat(1) - } else if (vnode.component) { - return [vnode.component, ...findChildren(vnode.component?.subTree)] - .filter(v => v) - .flat(1) - } - - return [] -} - export function findChildrenWithProvide ( key: InjectionKey | symbol, vnode?: VNodeChild,