@vuetify/nightly 3.8.8-master.2025-06-06 → 3.8.8-master.2025-06-08

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 (61) hide show
  1. package/CHANGELOG.md +14 -3
  2. package/dist/json/attributes.json +2080 -2080
  3. package/dist/json/importMap-labs.json +20 -20
  4. package/dist/json/importMap.json +160 -160
  5. package/dist/json/web-types.json +3925 -3925
  6. package/dist/vuetify-labs.cjs +117 -59
  7. package/dist/vuetify-labs.css +3446 -3446
  8. package/dist/vuetify-labs.d.ts +65 -59
  9. package/dist/vuetify-labs.esm.js +117 -59
  10. package/dist/vuetify-labs.esm.js.map +1 -1
  11. package/dist/vuetify-labs.js +117 -59
  12. package/dist/vuetify-labs.min.css +2 -2
  13. package/dist/vuetify.cjs +104 -40
  14. package/dist/vuetify.cjs.map +1 -1
  15. package/dist/vuetify.css +3061 -3061
  16. package/dist/vuetify.d.ts +60 -59
  17. package/dist/vuetify.esm.js +104 -40
  18. package/dist/vuetify.esm.js.map +1 -1
  19. package/dist/vuetify.js +104 -40
  20. package/dist/vuetify.js.map +1 -1
  21. package/dist/vuetify.min.css +2 -2
  22. package/dist/vuetify.min.js +147 -140
  23. package/dist/vuetify.min.js.map +1 -1
  24. package/lib/components/VDataTable/VDataTableColumn.js +1 -0
  25. package/lib/components/VDataTable/VDataTableColumn.js.map +1 -1
  26. package/lib/components/VDataTable/VDataTableFooter.js +3 -1
  27. package/lib/components/VDataTable/VDataTableFooter.js.map +1 -1
  28. package/lib/components/VDataTable/VDataTableHeaders.js +8 -1
  29. package/lib/components/VDataTable/VDataTableHeaders.js.map +1 -1
  30. package/lib/components/VDatePicker/VDatePickerMonth.js +2 -2
  31. package/lib/components/VDatePicker/VDatePickerMonth.js.map +1 -1
  32. package/lib/components/VFileInput/VFileInput.js +8 -3
  33. package/lib/components/VFileInput/VFileInput.js.map +1 -1
  34. package/lib/components/VNumberInput/VNumberInput.d.ts +5 -0
  35. package/lib/components/VNumberInput/VNumberInput.js +7 -11
  36. package/lib/components/VNumberInput/VNumberInput.js.map +1 -1
  37. package/lib/components/VOtpInput/VOtpInput.js +5 -2
  38. package/lib/components/VOtpInput/VOtpInput.js.map +1 -1
  39. package/lib/components/VSlider/VSliderThumb.js +1 -1
  40. package/lib/components/VSlider/VSliderThumb.js.map +1 -1
  41. package/lib/components/VTextField/VTextField.js +5 -4
  42. package/lib/components/VTextField/VTextField.js.map +1 -1
  43. package/lib/composables/date/date.d.ts +1 -4
  44. package/lib/composables/date/date.js +13 -14
  45. package/lib/composables/date/date.js.map +1 -1
  46. package/lib/composables/fileDrop.d.ts +4 -0
  47. package/lib/composables/fileDrop.js +50 -0
  48. package/lib/composables/fileDrop.js.map +1 -0
  49. package/lib/entry-bundler.d.ts +0 -3
  50. package/lib/entry-bundler.js +1 -1
  51. package/lib/framework.d.ts +55 -59
  52. package/lib/framework.js +1 -1
  53. package/lib/labs/VColorInput/VColorInput.js +3 -8
  54. package/lib/labs/VColorInput/VColorInput.js.map +1 -1
  55. package/lib/labs/VDateInput/VDateInput.d.ts +5 -0
  56. package/lib/labs/VDateInput/VDateInput.js +7 -10
  57. package/lib/labs/VDateInput/VDateInput.js.map +1 -1
  58. package/lib/labs/VFileUpload/VFileUpload.js +7 -3
  59. package/lib/labs/VFileUpload/VFileUpload.js.map +1 -1
  60. package/lib/labs/entry-bundler.d.ts +0 -3
  61. package/package.json +1 -1
package/dist/vuetify.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.8.8-master.2025-06-06
2
+ * Vuetify v3.8.8-master.2025-06-08
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -12396,10 +12396,12 @@
12396
12396
  const inputRef = vue.ref();
12397
12397
  const isActive = vue.computed(() => activeTypes.includes(props.type) || props.persistentPlaceholder || isFocused.value || props.active);
12398
12398
  function onFocus() {
12399
- if (inputRef.value !== document.activeElement) {
12400
- inputRef.value?.focus();
12401
- }
12402
12399
  if (!isFocused.value) focus();
12400
+ vue.nextTick(() => {
12401
+ if (inputRef.value !== document.activeElement) {
12402
+ inputRef.value?.focus();
12403
+ }
12404
+ });
12403
12405
  }
12404
12406
  function onControlMousedown(e) {
12405
12407
  emit('mousedown:control', e);
@@ -12408,7 +12410,6 @@
12408
12410
  e.preventDefault();
12409
12411
  }
12410
12412
  function onControlClick(e) {
12411
- onFocus();
12412
12413
  emit('click:control', e);
12413
12414
  }
12414
12415
  function onClear(e, reset) {
@@ -16537,7 +16538,7 @@
16537
16538
  default: () => [vue.withDirectives(vue.createElementVNode("div", {
16538
16539
  "class": "v-slider-thumb__label-container"
16539
16540
  }, [vue.createElementVNode("div", {
16540
- "class": vue.normalizeClass(['v-slider-thumb__label'])
16541
+ "class": vue.normalizeClass(['v-slider-thumb__label', textColorClasses.value])
16541
16542
  }, [vue.createElementVNode("div", null, [slots['thumb-label']?.({
16542
16543
  modelValue: props.modelValue
16543
16544
  }) ?? props.modelValue.toFixed(step.value ? decimals.value : 1)])])]), [[vue.vShow, thumbLabel.value && props.focused || thumbLabel.value === 'always']])]
@@ -18109,6 +18110,18 @@
18109
18110
  instance: createInstance(_options, locale)
18110
18111
  };
18111
18112
  }
18113
+ function createDateRange(adapter, start, stop) {
18114
+ const diff = adapter.getDiff(stop ?? start, start, 'days');
18115
+ const datesInRange = [start];
18116
+ for (let i = 1; i < diff; i++) {
18117
+ const nextDate = adapter.addDays(start, i);
18118
+ datesInRange.push(nextDate);
18119
+ }
18120
+ if (stop) {
18121
+ datesInRange.push(adapter.endOfDay(stop));
18122
+ }
18123
+ return datesInRange;
18124
+ }
18112
18125
  function createInstance(options, locale) {
18113
18126
  const instance = vue.reactive(typeof options.adapter === 'function'
18114
18127
  // eslint-disable-next-line new-cap
@@ -18119,20 +18132,7 @@
18119
18132
  vue.watch(locale.current, value => {
18120
18133
  instance.locale = options.locale[value] ?? value ?? instance.locale;
18121
18134
  });
18122
- return Object.assign(instance, {
18123
- createDateRange(start, stop) {
18124
- const diff = instance.getDiff(stop ?? start, start, 'days');
18125
- const datesInRange = [start];
18126
- for (let i = 1; i < diff; i++) {
18127
- const nextDate = instance.addDays(start, i);
18128
- datesInRange.push(nextDate);
18129
- }
18130
- if (stop) {
18131
- datesInRange.push(instance.endOfDay(stop));
18132
- }
18133
- return datesInRange;
18134
- }
18135
- });
18135
+ return instance;
18136
18136
  }
18137
18137
  function useDate() {
18138
18138
  const options = vue.inject(DateOptionsSymbol);
@@ -20221,7 +20221,9 @@
20221
20221
  "class": "v-data-table-footer"
20222
20222
  }, [slots.prepend?.(), vue.createElementVNode("div", {
20223
20223
  "class": "v-data-table-footer__items-per-page"
20224
- }, [vue.createElementVNode("span", null, [t(props.itemsPerPageText)]), vue.createVNode(VSelect, {
20224
+ }, [vue.createElementVNode("span", {
20225
+ "aria-label": t(props.itemsPerPageText)
20226
+ }, [t(props.itemsPerPageText)]), vue.createVNode(VSelect, {
20225
20227
  "items": itemsPerPageOptions.value,
20226
20228
  "modelValue": itemsPerPage.value,
20227
20229
  "onUpdate:modelValue": v => setItemsPerPage(Number(v)),
@@ -20273,6 +20275,7 @@
20273
20275
  } = _ref;
20274
20276
  const Tag = props.tag ?? 'td';
20275
20277
  return vue.createVNode(Tag, {
20278
+ "tabindex": "0",
20276
20279
  "class": vue.normalizeClass(['v-data-table__td', {
20277
20280
  'v-data-table-column--fixed': props.fixed,
20278
20281
  'v-data-table-column--last-fixed': props.lastFixed,
@@ -20617,6 +20620,11 @@
20617
20620
  top: props.sticky || props.fixedHeader ? `calc(var(--v-table-header-height) * ${y})` : undefined
20618
20621
  };
20619
20622
  }
20623
+ function handleEnterKeyPress(event, column) {
20624
+ if (event.key === 'Enter' && !props.disableSort) {
20625
+ toggleSort(column);
20626
+ }
20627
+ }
20620
20628
  function getSortIcon(column) {
20621
20629
  const item = sortBy.value.find(item => item.key === column.key);
20622
20630
  if (!item) return props.sortAscIcon;
@@ -20673,7 +20681,9 @@
20673
20681
  "nowrap": column.nowrap,
20674
20682
  "lastFixed": column.lastFixed,
20675
20683
  "noPadding": noPadding
20676
- }, headerProps), {
20684
+ }, headerProps, {
20685
+ "onKeydown": event => column.sortable && handleEnterKeyPress(event, column)
20686
+ }), {
20677
20687
  default: () => {
20678
20688
  const columnSlotName = `header.${column.key}`;
20679
20689
  const columnSlotProps = {
@@ -22526,7 +22536,7 @@
22526
22536
  } else {
22527
22537
  rangeStop.value = adapter.endOfDay(_value);
22528
22538
  }
22529
- model.value = adapter.createDateRange(rangeStart.value, rangeStop.value);
22539
+ model.value = createDateRange(adapter, rangeStart.value, rangeStop.value);
22530
22540
  } else {
22531
22541
  rangeStart.value = value;
22532
22542
  rangeStop.value = undefined;
@@ -23613,6 +23623,56 @@
23613
23623
 
23614
23624
  // Types
23615
23625
 
23626
+ function useFileDrop() {
23627
+ function hasFilesOrFolders(e) {
23628
+ const entries = [...(e.dataTransfer?.items ?? [])].filter(x => x.kind === 'file').map(x => x.webkitGetAsEntry()).filter(Boolean);
23629
+ return entries.length > 0 || [...(e.dataTransfer?.files ?? [])].length > 0;
23630
+ }
23631
+ async function handleDrop(e) {
23632
+ const result = [];
23633
+ const entries = [...(e.dataTransfer?.items ?? [])].filter(x => x.kind === 'file').map(x => x.webkitGetAsEntry()).filter(Boolean);
23634
+ if (entries.length) {
23635
+ for (const entry of entries) {
23636
+ const files = await traverseFileTree(entry, appendIfDirectory('.', entry));
23637
+ result.push(...files.map(x => x.file));
23638
+ }
23639
+ } else {
23640
+ result.push(...[...(e.dataTransfer?.files ?? [])]);
23641
+ }
23642
+ return result;
23643
+ }
23644
+ return {
23645
+ handleDrop,
23646
+ hasFilesOrFolders
23647
+ };
23648
+ }
23649
+ function traverseFileTree(item) {
23650
+ let path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
23651
+ return new Promise((resolve, reject) => {
23652
+ if (item.isFile) {
23653
+ const fileEntry = item;
23654
+ fileEntry.file(file => resolve([{
23655
+ file,
23656
+ path
23657
+ }]), reject);
23658
+ } else if (item.isDirectory) {
23659
+ const directoryReader = item.createReader();
23660
+ directoryReader.readEntries(async entries => {
23661
+ const files = [];
23662
+ for (const entry of entries) {
23663
+ files.push(...(await traverseFileTree(entry, appendIfDirectory(path, entry))));
23664
+ }
23665
+ resolve(files);
23666
+ });
23667
+ }
23668
+ });
23669
+ }
23670
+ function appendIfDirectory(path, item) {
23671
+ return item.isDirectory ? `${path}/${item.name}` : path;
23672
+ }
23673
+
23674
+ // Types
23675
+
23616
23676
  const makeVFileInputProps = propsFactory({
23617
23677
  chips: Boolean,
23618
23678
  counter: Boolean,
@@ -23697,6 +23757,10 @@
23697
23757
  const isActive = vue.toRef(() => isFocused.value || props.active);
23698
23758
  const isPlainOrUnderlined = vue.computed(() => ['plain', 'underlined'].includes(props.variant));
23699
23759
  const isDragging = vue.shallowRef(false);
23760
+ const {
23761
+ handleDrop,
23762
+ hasFilesOrFolders
23763
+ } = useFileDrop();
23700
23764
  function onFocus() {
23701
23765
  if (inputRef.value !== document.activeElement) {
23702
23766
  inputRef.value?.focus();
@@ -23730,13 +23794,13 @@
23730
23794
  e.preventDefault();
23731
23795
  isDragging.value = false;
23732
23796
  }
23733
- function onDrop(e) {
23797
+ async function onDrop(e) {
23734
23798
  e.preventDefault();
23735
23799
  e.stopImmediatePropagation();
23736
23800
  isDragging.value = false;
23737
- if (!e.dataTransfer?.files?.length || !inputRef.value) return;
23801
+ if (!inputRef.value || !hasFilesOrFolders(e)) return;
23738
23802
  const dataTransfer = new DataTransfer();
23739
- for (const file of e.dataTransfer.files) {
23803
+ for (const file of await handleDrop(e)) {
23740
23804
  dataTransfer.items.add(file);
23741
23805
  }
23742
23806
  inputRef.value.files = dataTransfer.files;
@@ -25167,6 +25231,7 @@
25167
25231
  ...makeVNumberInputProps()
25168
25232
  },
25169
25233
  emits: {
25234
+ 'update:focused': val => true,
25170
25235
  'update:modelValue': val => true
25171
25236
  },
25172
25237
  setup(props, _ref) {
@@ -25182,11 +25247,7 @@
25182
25247
  });
25183
25248
  const form = useForm(props);
25184
25249
  const controlsDisabled = vue.computed(() => form.isDisabled.value || form.isReadonly.value);
25185
- const {
25186
- isFocused,
25187
- focus,
25188
- blur
25189
- } = useFocus(props);
25250
+ const isFocused = vue.shallowRef(props.focused);
25190
25251
  function correctPrecision(val) {
25191
25252
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
25192
25253
  const fixed = precision == null ? String(val) : val.toFixed(precision);
@@ -25371,11 +25432,9 @@
25371
25432
  inputText.value = model.value.toString();
25372
25433
  }
25373
25434
  function onFocus() {
25374
- focus();
25375
25435
  trimDecimalZeros();
25376
25436
  }
25377
25437
  function onBlur() {
25378
- blur();
25379
25438
  clampModel();
25380
25439
  }
25381
25440
  useRender(() => {
@@ -25468,9 +25527,12 @@
25468
25527
  }, null)]) : props.reverse && controlVariant.value !== 'hidden' ? vue.createElementVNode(vue.Fragment, null, [controlNode(), dividerNode()]) : undefined;
25469
25528
  const hasPrependInner = slots['prepend-inner'] || prependInnerControl;
25470
25529
  return vue.createVNode(VTextField, vue.mergeProps({
25471
- "ref": vTextFieldRef,
25530
+ "ref": vTextFieldRef
25531
+ }, textFieldProps, {
25472
25532
  "modelValue": inputText.value,
25473
25533
  "onUpdate:modelValue": $event => inputText.value = $event,
25534
+ "focused": isFocused.value,
25535
+ "onUpdate:focused": $event => isFocused.value = $event,
25474
25536
  "validationValue": model.value,
25475
25537
  "onBeforeinput": onBeforeinput,
25476
25538
  "onFocus": onFocus,
@@ -25483,8 +25545,7 @@
25483
25545
  'v-number-input--reverse': props.reverse,
25484
25546
  'v-number-input--split': controlVariant.value === 'split',
25485
25547
  'v-number-input--stacked': controlVariant.value === 'stacked'
25486
- }, props.class]
25487
- }, textFieldProps, {
25548
+ }, props.class],
25488
25549
  "style": props.style,
25489
25550
  "inputmode": "decimal"
25490
25551
  }), {
@@ -25619,7 +25680,7 @@
25619
25680
  function onPaste(index, e) {
25620
25681
  e.preventDefault();
25621
25682
  e.stopPropagation();
25622
- const clipboardText = e?.clipboardData?.getData('Text').slice(0, length.value) ?? '';
25683
+ const clipboardText = e?.clipboardData?.getData('Text').trim().slice(0, length.value) ?? '';
25623
25684
  if (isValidNumber(clipboardText)) return;
25624
25685
  model.value = clipboardText.split('');
25625
25686
  inputRef.value?.[index].blur();
@@ -25651,7 +25712,10 @@
25651
25712
  scoped: true
25652
25713
  });
25653
25714
  vue.watch(model, val => {
25654
- if (val.length === length.value) emit('finish', val.join(''));
25715
+ if (val.length === length.value) {
25716
+ focusIndex.value = length.value - 1;
25717
+ emit('finish', val.join(''));
25718
+ }
25655
25719
  }, {
25656
25720
  deep: true
25657
25721
  });
@@ -29404,7 +29468,7 @@
29404
29468
  };
29405
29469
  });
29406
29470
  }
29407
- const version$1 = "3.8.8-master.2025-06-06";
29471
+ const version$1 = "3.8.8-master.2025-06-08";
29408
29472
  createVuetify$1.version = version$1;
29409
29473
 
29410
29474
  // Vue's inject() can only be used in setup
@@ -29429,7 +29493,7 @@
29429
29493
  ...options
29430
29494
  });
29431
29495
  };
29432
- const version = "3.8.8-master.2025-06-06";
29496
+ const version = "3.8.8-master.2025-06-08";
29433
29497
  createVuetify.version = version;
29434
29498
 
29435
29499
  exports.blueprints = index;