@vuetify/nightly 3.9.5-dev.2025-08-12 → 3.9.5-dev.2025-08-24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/CHANGELOG.md +6 -3
  2. package/dist/json/attributes.json +2183 -2175
  3. package/dist/json/importMap-labs.json +40 -40
  4. package/dist/json/importMap.json +156 -156
  5. package/dist/json/tags.json +4 -1
  6. package/dist/json/web-types.json +4199 -4178
  7. package/dist/vuetify-labs.cjs +202 -98
  8. package/dist/vuetify-labs.css +5261 -5261
  9. package/dist/vuetify-labs.d.ts +112 -84
  10. package/dist/vuetify-labs.esm.js +202 -98
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +202 -98
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +85 -65
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +2218 -2218
  17. package/dist/vuetify.d.ts +91 -63
  18. package/dist/vuetify.esm.js +85 -65
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +85 -65
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +367 -366
  24. package/dist/vuetify.min.js.map +1 -1
  25. package/lib/components/VCard/VCardActions.d.ts +44 -0
  26. package/lib/components/VCard/VCardActions.js +11 -6
  27. package/lib/components/VCard/VCardActions.js.map +1 -1
  28. package/lib/components/VCard/VCardItem.d.ts +25 -0
  29. package/lib/components/VCard/VCardItem.js +64 -60
  30. package/lib/components/VCard/VCardItem.js.map +1 -1
  31. package/lib/composables/filter.d.ts +1 -0
  32. package/lib/composables/filter.js +13 -0
  33. package/lib/composables/filter.js.map +1 -1
  34. package/lib/entry-bundler.js +1 -1
  35. package/lib/framework.d.ts +63 -63
  36. package/lib/framework.js +1 -1
  37. package/lib/labs/VMaskInput/VMaskInput.d.ts +22 -21
  38. package/lib/labs/VMaskInput/VMaskInput.js +118 -34
  39. package/lib/labs/VMaskInput/VMaskInput.js.map +1 -1
  40. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.9.5-dev.2025-08-12
2
+ * Vuetify v3.9.5-dev.2025-08-24
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -13743,6 +13743,7 @@ function filterItems(items, query, options) {
13743
13743
  const keys = options?.filterKeys ? wrapInArray(options.filterKeys) : false;
13744
13744
  const customFiltersLength = Object.keys(options?.customKeyFilter ?? {}).length;
13745
13745
  if (!items?.length) return array;
13746
+ let lookAheadItem = null;
13746
13747
  loop: for (let i = 0; i < items.length; i++) {
13747
13748
  const [item, transformed = item] = wrapInArray(items[i]);
13748
13749
  const customMatches = {};
@@ -13751,6 +13752,14 @@ function filterItems(items, query, options) {
13751
13752
  if ((query || customFiltersLength > 0) && !options?.noFilter) {
13752
13753
  if (typeof item === 'object') {
13753
13754
  if (item.type === 'divider' || item.type === 'subheader') {
13755
+ if (lookAheadItem?.type === 'divider' && item.type === 'subheader') {
13756
+ array.push(lookAheadItem); // divider before subheader
13757
+ }
13758
+ lookAheadItem = {
13759
+ index: i,
13760
+ matches: {},
13761
+ type: item.type
13762
+ };
13754
13763
  continue;
13755
13764
  }
13756
13765
  const filterKeys = keys || Object.keys(transformed);
@@ -13776,6 +13785,10 @@ function filterItems(items, query, options) {
13776
13785
  if (options?.filterMode === 'union' && customMatchesLength !== customFiltersLength && !defaultMatchesLength) continue;
13777
13786
  if (options?.filterMode === 'intersection' && (customMatchesLength !== customFiltersLength || !defaultMatchesLength)) continue;
13778
13787
  }
13788
+ if (lookAheadItem) {
13789
+ array.push(lookAheadItem);
13790
+ lookAheadItem = null;
13791
+ }
13779
13792
  array.push({
13780
13793
  index: i,
13781
13794
  matches: {
@@ -15036,9 +15049,13 @@ const VBreadcrumbs = genericComponent()({
15036
15049
  }
15037
15050
  });
15038
15051
 
15052
+ const makeVCardActionsProps = propsFactory({
15053
+ ...makeComponentProps(),
15054
+ ...makeTagProps()
15055
+ }, 'VCardActions');
15039
15056
  const VCardActions = genericComponent()({
15040
15057
  name: 'VCardActions',
15041
- props: makeComponentProps(),
15058
+ props: makeVCardActionsProps(),
15042
15059
  setup(props, _ref) {
15043
15060
  let {
15044
15061
  slots
@@ -15049,10 +15066,10 @@ const VCardActions = genericComponent()({
15049
15066
  variant: 'text'
15050
15067
  }
15051
15068
  });
15052
- useRender(() => createElementVNode("div", {
15069
+ useRender(() => createVNode(props.tag, {
15053
15070
  "class": normalizeClass(['v-card-actions', props.class]),
15054
15071
  "style": normalizeStyle(props.style)
15055
- }, [slots.default?.()]));
15072
+ }, slots));
15056
15073
  return {};
15057
15074
  }
15058
15075
  });
@@ -15096,7 +15113,8 @@ const makeCardItemProps = propsFactory({
15096
15113
  default: undefined
15097
15114
  },
15098
15115
  ...makeComponentProps(),
15099
- ...makeDensityProps()
15116
+ ...makeDensityProps(),
15117
+ ...makeTagProps()
15100
15118
  }, 'VCardItem');
15101
15119
  const VCardItem = genericComponent()({
15102
15120
  name: 'VCardItem',
@@ -15112,68 +15130,70 @@ const VCardItem = genericComponent()({
15112
15130
  const hasAppend = !!(hasAppendMedia || slots.append);
15113
15131
  const hasTitle = !!(props.title != null || slots.title);
15114
15132
  const hasSubtitle = !!(props.subtitle != null || slots.subtitle);
15115
- return createElementVNode("div", {
15133
+ return createVNode(props.tag, {
15116
15134
  "class": normalizeClass(['v-card-item', props.class]),
15117
15135
  "style": normalizeStyle(props.style)
15118
- }, [hasPrepend && createElementVNode("div", {
15119
- "key": "prepend",
15120
- "class": "v-card-item__prepend"
15121
- }, [!slots.prepend ? createElementVNode(Fragment, null, [props.prependAvatar && createVNode(VAvatar, {
15122
- "key": "prepend-avatar",
15123
- "density": props.density,
15124
- "image": props.prependAvatar
15125
- }, null), props.prependIcon && createVNode(VIcon, {
15126
- "key": "prepend-icon",
15127
- "density": props.density,
15128
- "icon": props.prependIcon
15129
- }, null)]) : createVNode(VDefaultsProvider, {
15130
- "key": "prepend-defaults",
15131
- "disabled": !hasPrependMedia,
15132
- "defaults": {
15133
- VAvatar: {
15134
- density: props.density,
15135
- image: props.prependAvatar
15136
- },
15137
- VIcon: {
15138
- density: props.density,
15139
- icon: props.prependIcon
15140
- }
15141
- }
15142
- }, slots.prepend)]), createElementVNode("div", {
15143
- "class": "v-card-item__content"
15144
- }, [hasTitle && createVNode(VCardTitle, {
15145
- "key": "title"
15146
15136
  }, {
15147
- default: () => [slots.title?.() ?? toDisplayString(props.title)]
15148
- }), hasSubtitle && createVNode(VCardSubtitle, {
15149
- "key": "subtitle"
15150
- }, {
15151
- default: () => [slots.subtitle?.() ?? toDisplayString(props.subtitle)]
15152
- }), slots.default?.()]), hasAppend && createElementVNode("div", {
15153
- "key": "append",
15154
- "class": "v-card-item__append"
15155
- }, [!slots.append ? createElementVNode(Fragment, null, [props.appendIcon && createVNode(VIcon, {
15156
- "key": "append-icon",
15157
- "density": props.density,
15158
- "icon": props.appendIcon
15159
- }, null), props.appendAvatar && createVNode(VAvatar, {
15160
- "key": "append-avatar",
15161
- "density": props.density,
15162
- "image": props.appendAvatar
15163
- }, null)]) : createVNode(VDefaultsProvider, {
15164
- "key": "append-defaults",
15165
- "disabled": !hasAppendMedia,
15166
- "defaults": {
15167
- VAvatar: {
15168
- density: props.density,
15169
- image: props.appendAvatar
15170
- },
15171
- VIcon: {
15172
- density: props.density,
15173
- icon: props.appendIcon
15137
+ default: () => [hasPrepend && createElementVNode("div", {
15138
+ "key": "prepend",
15139
+ "class": "v-card-item__prepend"
15140
+ }, [!slots.prepend ? createElementVNode(Fragment, null, [props.prependAvatar && createVNode(VAvatar, {
15141
+ "key": "prepend-avatar",
15142
+ "density": props.density,
15143
+ "image": props.prependAvatar
15144
+ }, null), props.prependIcon && createVNode(VIcon, {
15145
+ "key": "prepend-icon",
15146
+ "density": props.density,
15147
+ "icon": props.prependIcon
15148
+ }, null)]) : createVNode(VDefaultsProvider, {
15149
+ "key": "prepend-defaults",
15150
+ "disabled": !hasPrependMedia,
15151
+ "defaults": {
15152
+ VAvatar: {
15153
+ density: props.density,
15154
+ image: props.prependAvatar
15155
+ },
15156
+ VIcon: {
15157
+ density: props.density,
15158
+ icon: props.prependIcon
15159
+ }
15174
15160
  }
15175
- }
15176
- }, slots.append)])]);
15161
+ }, slots.prepend)]), createElementVNode("div", {
15162
+ "class": "v-card-item__content"
15163
+ }, [hasTitle && createVNode(VCardTitle, {
15164
+ "key": "title"
15165
+ }, {
15166
+ default: () => [slots.title?.() ?? toDisplayString(props.title)]
15167
+ }), hasSubtitle && createVNode(VCardSubtitle, {
15168
+ "key": "subtitle"
15169
+ }, {
15170
+ default: () => [slots.subtitle?.() ?? toDisplayString(props.subtitle)]
15171
+ }), slots.default?.()]), hasAppend && createElementVNode("div", {
15172
+ "key": "append",
15173
+ "class": "v-card-item__append"
15174
+ }, [!slots.append ? createElementVNode(Fragment, null, [props.appendIcon && createVNode(VIcon, {
15175
+ "key": "append-icon",
15176
+ "density": props.density,
15177
+ "icon": props.appendIcon
15178
+ }, null), props.appendAvatar && createVNode(VAvatar, {
15179
+ "key": "append-avatar",
15180
+ "density": props.density,
15181
+ "image": props.appendAvatar
15182
+ }, null)]) : createVNode(VDefaultsProvider, {
15183
+ "key": "append-defaults",
15184
+ "disabled": !hasAppendMedia,
15185
+ "defaults": {
15186
+ VAvatar: {
15187
+ density: props.density,
15188
+ image: props.appendAvatar
15189
+ },
15190
+ VIcon: {
15191
+ density: props.density,
15192
+ icon: props.appendIcon
15193
+ }
15194
+ }
15195
+ }, slots.append)])]
15196
+ });
15177
15197
  });
15178
15198
  return {};
15179
15199
  }
@@ -33005,59 +33025,140 @@ const VMaskInput = genericComponent()({
33005
33025
  emit
33006
33026
  } = _ref;
33007
33027
  const vTextFieldRef = ref();
33008
- const selection = shallowRef(0);
33009
- const lazySelection = shallowRef(0);
33028
+ const inputAction = shallowRef();
33029
+ const caretPosition = shallowRef(0);
33010
33030
  const mask = useMask(props);
33011
33031
  const returnMaskedValue = computed(() => props.mask && props.returnMaskedValue);
33012
33032
  const model = useProxiedModel(props, 'modelValue', undefined,
33013
33033
  // Always display masked value in input when mask is applied
33014
33034
  val => props.mask ? mask.mask(mask.unmask(val)) : val, val => {
33015
33035
  if (props.mask) {
33016
- const valueBeforeChange = mask.unmask(model.value);
33036
+ const valueWithoutDelimiters = removeMaskDelimiters(val);
33037
+
33017
33038
  // E.g. mask is #-# and the input value is '2-23'
33018
33039
  // model-value should be enforced to '2-2'
33019
- const enforcedMaskedValue = mask.mask(mask.unmask(val));
33020
- const newUnmaskedValue = mask.unmask(enforcedMaskedValue);
33021
- if (newUnmaskedValue === valueBeforeChange) {
33022
- vTextFieldRef.value.value = enforcedMaskedValue;
33023
- }
33024
- val = newUnmaskedValue;
33025
- updateRange();
33026
- return returnMaskedValue.value ? mask.mask(val) : val;
33040
+ const newMaskedValue = mask.mask(valueWithoutDelimiters);
33041
+ const newUnmaskedValue = mask.unmask(newMaskedValue);
33042
+ const newCaretPosition = getNewCaretPosition({
33043
+ oldValue: model.value,
33044
+ newValue: newMaskedValue,
33045
+ oldCaret: caretPosition.value
33046
+ });
33047
+ vTextFieldRef.value.value = newMaskedValue;
33048
+ vTextFieldRef.value.setSelectionRange(newCaretPosition, newCaretPosition);
33049
+ return returnMaskedValue.value ? mask.mask(newUnmaskedValue) : newUnmaskedValue;
33027
33050
  }
33028
33051
  return val;
33029
33052
  });
33030
33053
  const validationValue = toRef(() => returnMaskedValue.value ? model.value : mask.unmask(model.value));
33054
+ function removeMaskDelimiters(val) {
33055
+ return val.split('').filter(ch => !isMaskDelimiter(ch)).join('');
33056
+ }
33057
+ function getNewCaretPosition(_ref2) {
33058
+ let {
33059
+ oldValue,
33060
+ newValue,
33061
+ oldCaret
33062
+ } = _ref2;
33063
+ if (!newValue) return 0;
33064
+ if (!oldValue) return newValue.length;
33065
+ let newCaret;
33066
+ if (inputAction.value === 'Backspace') {
33067
+ newCaret = oldCaret - 1;
33068
+ while (newCaret > 0 && isMaskDelimiter(newValue[newCaret - 1])) newCaret--;
33069
+ } else if (inputAction.value === 'Delete') {
33070
+ newCaret = oldCaret;
33071
+ } else {
33072
+ // insertion
33073
+ newCaret = oldCaret + 1;
33074
+ while (isMaskDelimiter(newValue[newCaret])) newCaret++;
33075
+ if (isMaskDelimiter(newValue[oldCaret])) newCaret++;
33076
+ }
33077
+ return newCaret;
33078
+ }
33031
33079
  onBeforeMount(() => {
33032
33080
  if (props.returnMaskedValue) {
33033
33081
  emit('update:modelValue', model.value);
33034
33082
  }
33035
33083
  });
33036
- function setCaretPosition(newSelection) {
33037
- selection.value = newSelection;
33038
- vTextFieldRef.value && vTextFieldRef.value.setSelectionRange(selection.value, selection.value);
33084
+ function onKeyDown(e) {
33085
+ if (e.metaKey) return;
33086
+ const inputElement = e.target;
33087
+ caretPosition.value = inputElement.selectionStart || 0;
33088
+ inputAction.value = e.key;
33089
+ const hasSelection = inputElement.selectionStart !== inputElement.selectionEnd;
33090
+ if (e.key === 'Backspace' && hasSelection) {
33091
+ e.preventDefault();
33092
+ deleteSelection(e);
33093
+ }
33094
+ }
33095
+ async function onCut(e) {
33096
+ e.preventDefault();
33097
+ copySelectionToClipboard(e);
33098
+ deleteSelection(e);
33039
33099
  }
33040
- function resetSelections() {
33041
- if (!vTextFieldRef.value?.selectionEnd) return;
33042
- selection.value = vTextFieldRef.value.selectionEnd;
33043
- lazySelection.value = 0;
33044
- for (let index = 0; index < selection.value; index++) {
33045
- isMaskDelimiter(vTextFieldRef.value.value[index]) || lazySelection.value++;
33100
+ async function onPaste(e) {
33101
+ e.preventDefault();
33102
+ const inputElement = e.target;
33103
+ const pastedString = removeMaskDelimiters(e.clipboardData?.getData('text') || '');
33104
+ if (!pastedString) return;
33105
+ const pastedCharacters = [...pastedString];
33106
+ const hasSelection = inputElement.selectionStart !== inputElement.selectionEnd;
33107
+ if (hasSelection) {
33108
+ replaceSelection(inputElement, pastedCharacters);
33109
+ } else {
33110
+ insertCharacters(inputElement, pastedCharacters);
33046
33111
  }
33047
33112
  }
33048
- function updateRange() {
33049
- if (!vTextFieldRef.value) return;
33050
- resetSelections();
33051
- let selection = 0;
33052
- const newValue = vTextFieldRef.value.value;
33053
- if (newValue) {
33054
- for (let index = 0; index < newValue.length; index++) {
33055
- if (lazySelection.value <= 0) break;
33056
- isMaskDelimiter(newValue[index]) || lazySelection.value--;
33057
- selection++;
33058
- }
33113
+ function copySelectionToClipboard(e) {
33114
+ const inputElement = e.target;
33115
+ const start = inputElement.selectionStart || 0;
33116
+ const end = inputElement.selectionEnd || 0;
33117
+ const selectedText = inputElement.value.substring(start, end);
33118
+ navigator.clipboard.writeText(selectedText);
33119
+ }
33120
+ async function deleteSelection(e) {
33121
+ const inputElement = e.target;
33122
+ const curStart = inputElement.selectionStart || 0;
33123
+ caretPosition.value = inputElement.selectionEnd || 0;
33124
+ while (caretPosition.value > curStart) {
33125
+ const success = await simulateBackspace(inputElement);
33126
+ if (!success) break;
33127
+ }
33128
+ }
33129
+ async function simulateBackspace(inputElement) {
33130
+ inputAction.value = 'Backspace';
33131
+ model.value = inputElement.value.slice(0, caretPosition.value - 1) + inputElement.value.slice(caretPosition.value);
33132
+ inputAction.value = '';
33133
+ if (caretPosition.value === inputElement.selectionEnd) return false;
33134
+ caretPosition.value = inputElement.selectionEnd || 0;
33135
+ await nextTick();
33136
+ return true;
33137
+ }
33138
+ async function insertCharacters(inputElement, pastedCharacters) {
33139
+ for (let i = 0; i < pastedCharacters.length; i++) {
33140
+ await insertCharacter(inputElement, pastedCharacters[i]);
33059
33141
  }
33060
- setCaretPosition(selection);
33142
+ }
33143
+ async function insertCharacter(inputElement, character) {
33144
+ caretPosition.value = inputElement.selectionEnd || 0;
33145
+ model.value = inputElement.value.slice(0, caretPosition.value) + character + inputElement.value.slice(caretPosition.value);
33146
+ await nextTick();
33147
+ }
33148
+ async function replaceSelection(inputElement, pastedCharacters) {
33149
+ caretPosition.value = inputElement.selectionStart || 0;
33150
+ for (let i = 0; i < pastedCharacters.length; i++) {
33151
+ await replaceCharacter(caretPosition.value, pastedCharacters[i]);
33152
+ caretPosition.value++;
33153
+ }
33154
+ }
33155
+ async function replaceCharacter(index, character) {
33156
+ let targetIndex = index;
33157
+
33158
+ // Find next non-delimiter position
33159
+ while (targetIndex < model.value.length && isMaskDelimiter(model.value[targetIndex])) targetIndex++;
33160
+ model.value = model.value.slice(0, targetIndex) + character + model.value.slice(targetIndex + 1);
33161
+ await nextTick();
33061
33162
  }
33062
33163
  useRender(() => {
33063
33164
  const textFieldProps = VTextField.filterProps(props);
@@ -33065,7 +33166,10 @@ const VMaskInput = genericComponent()({
33065
33166
  "modelValue": model.value,
33066
33167
  "onUpdate:modelValue": $event => model.value = $event,
33067
33168
  "ref": vTextFieldRef,
33068
- "validationValue": validationValue.value
33169
+ "validationValue": validationValue.value,
33170
+ "onCut": onCut,
33171
+ "onPaste": onPaste,
33172
+ "onKeydown": onKeyDown
33069
33173
  }), {
33070
33174
  ...slots
33071
33175
  });
@@ -35691,7 +35795,7 @@ function createVuetify$1() {
35691
35795
  };
35692
35796
  });
35693
35797
  }
35694
- const version$1 = "3.9.5-dev.2025-08-12";
35798
+ const version$1 = "3.9.5-dev.2025-08-24";
35695
35799
  createVuetify$1.version = version$1;
35696
35800
 
35697
35801
  // Vue's inject() can only be used in setup
@@ -35989,7 +36093,7 @@ var index = /*#__PURE__*/Object.freeze({
35989
36093
 
35990
36094
  /* eslint-disable local-rules/sort-imports */
35991
36095
 
35992
- const version = "3.9.5-dev.2025-08-12";
36096
+ const version = "3.9.5-dev.2025-08-24";
35993
36097
 
35994
36098
  /* eslint-disable local-rules/sort-imports */
35995
36099