@vuetify/nightly 3.9.1-dev.2025-07-17 → 3.9.2-master.2025-07-18

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 +3 -14
  2. package/dist/json/attributes.json +3514 -3534
  3. package/dist/json/importMap-labs.json +24 -24
  4. package/dist/json/importMap.json +192 -192
  5. package/dist/json/tags.json +0 -5
  6. package/dist/json/web-types.json +19798 -6490
  7. package/dist/vuetify-labs.cjs +88 -278
  8. package/dist/vuetify-labs.css +4475 -4477
  9. package/dist/vuetify-labs.d.ts +64 -126
  10. package/dist/vuetify-labs.esm.js +88 -278
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +88 -278
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +79 -240
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +2683 -2685
  17. package/dist/vuetify.d.ts +64 -116
  18. package/dist/vuetify.esm.js +79 -240
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +79 -240
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +702 -724
  24. package/dist/vuetify.min.js.map +1 -1
  25. package/lib/components/VAutocomplete/VAutocomplete.js +0 -1
  26. package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
  27. package/lib/components/VCombobox/VCombobox.js +0 -1
  28. package/lib/components/VCombobox/VCombobox.js.map +1 -1
  29. package/lib/components/VFileInput/VFileInput.d.ts +0 -15
  30. package/lib/components/VFileInput/VFileInput.js +9 -38
  31. package/lib/components/VFileInput/VFileInput.js.map +1 -1
  32. package/lib/components/VList/VList.js +1 -2
  33. package/lib/components/VList/VList.js.map +1 -1
  34. package/lib/components/VList/VListItem.js +1 -7
  35. package/lib/components/VList/VListItem.js.map +1 -1
  36. package/lib/components/VProgressLinear/VProgressLinear.css +1 -1
  37. package/lib/components/VProgressLinear/VProgressLinear.d.ts +0 -75
  38. package/lib/components/VProgressLinear/VProgressLinear.js +6 -32
  39. package/lib/components/VProgressLinear/VProgressLinear.js.map +1 -1
  40. package/lib/components/VProgressLinear/VProgressLinear.sass +2 -2
  41. package/lib/components/VSelect/VSelect.js +0 -1
  42. package/lib/components/VSelect/VSelect.js.map +1 -1
  43. package/lib/components/VTreeview/VTreeview.js +2 -3
  44. package/lib/components/VTreeview/VTreeview.js.map +1 -1
  45. package/lib/components/VTreeview/VTreeviewChildren.js +59 -59
  46. package/lib/components/VTreeview/VTreeviewChildren.js.map +1 -1
  47. package/lib/entry-bundler.js +1 -1
  48. package/lib/entry-bundler.js.map +1 -1
  49. package/lib/framework.d.ts +64 -64
  50. package/lib/framework.js +1 -1
  51. package/lib/framework.js.map +1 -1
  52. package/lib/labs/VFileUpload/VFileUpload.d.ts +0 -15
  53. package/lib/labs/VFileUpload/VFileUpload.js +9 -39
  54. package/lib/labs/VFileUpload/VFileUpload.js.map +1 -1
  55. package/package.json +1 -1
  56. package/lib/components/VProgressLinear/chunks.d.ts +0 -55
  57. package/lib/components/VProgressLinear/chunks.js +0 -62
  58. package/lib/components/VProgressLinear/chunks.js.map +0 -1
  59. package/lib/composables/fileFilter.d.ts +0 -18
  60. package/lib/composables/fileFilter.js +0 -38
  61. package/lib/composables/fileFilter.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.9.1-dev.2025-07-17
2
+ * Vuetify v3.9.2-master.2025-07-18
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -5169,69 +5169,6 @@
5169
5169
  };
5170
5170
  }
5171
5171
 
5172
- // Utilities
5173
-
5174
- // Types
5175
-
5176
- // Composables
5177
- const makeChunksProps = propsFactory({
5178
- chunkCount: {
5179
- type: [Number, String],
5180
- default: null
5181
- },
5182
- chunkWidth: {
5183
- type: [Number, String],
5184
- default: null
5185
- },
5186
- chunkGap: {
5187
- type: [Number, String],
5188
- default: 4
5189
- }
5190
- }, 'chunks');
5191
- function useChunks(props, containerWidth) {
5192
- const hasChunks = vue.toRef(() => !!props.chunkCount || !!props.chunkWidth);
5193
- const chunkWidth = vue.computed(() => {
5194
- const containerSize = vue.toValue(containerWidth);
5195
- if (!containerSize) {
5196
- return 0;
5197
- }
5198
- if (!props.chunkCount) {
5199
- return Number(props.chunkWidth);
5200
- }
5201
- const count = Number(props.chunkCount);
5202
- const availableWidth = containerSize - Number(props.chunkGap) * (count - 1);
5203
- return availableWidth / count;
5204
- });
5205
- const chunkGap = vue.toRef(() => Number(props.chunkGap));
5206
- const chunksMaskStyles = vue.computed(() => {
5207
- if (!hasChunks.value) {
5208
- return {};
5209
- }
5210
- const chunkGapPx = convertToUnit(chunkGap.value);
5211
- const chunkWidthPx = convertToUnit(chunkWidth.value);
5212
- return {
5213
- maskRepeat: 'repeat-x',
5214
- maskImage: `linear-gradient(90deg, #000, #000 ${chunkWidthPx}, transparent ${chunkWidthPx}, transparent)`,
5215
- maskSize: `calc(${chunkWidthPx} + ${chunkGapPx}) 100%`
5216
- };
5217
- });
5218
- function snapValueToChunk(val) {
5219
- const containerSize = vue.toValue(containerWidth);
5220
- if (!containerSize) {
5221
- return val;
5222
- }
5223
- const gapRelativeSize = 100 * chunkGap.value / containerSize;
5224
- const chunkRelativeSize = 100 * (chunkWidth.value + chunkGap.value) / containerSize;
5225
- const filledChunks = Math.floor((val + gapRelativeSize) / chunkRelativeSize);
5226
- return clamp(0, filledChunks * chunkRelativeSize - gapRelativeSize / 2, 100);
5227
- }
5228
- return {
5229
- hasChunks,
5230
- chunksMaskStyles,
5231
- snapValueToChunk
5232
- };
5233
- }
5234
-
5235
5172
  const makeVProgressLinearProps = propsFactory({
5236
5173
  absolute: Boolean,
5237
5174
  active: {
@@ -5266,7 +5203,6 @@
5266
5203
  stream: Boolean,
5267
5204
  striped: Boolean,
5268
5205
  roundedBar: Boolean,
5269
- ...makeChunksProps(),
5270
5206
  ...makeComponentProps(),
5271
5207
  ...makeLocationProps({
5272
5208
  location: 'top'
@@ -5285,7 +5221,6 @@
5285
5221
  let {
5286
5222
  slots
5287
5223
  } = _ref;
5288
- const root = vue.ref();
5289
5224
  const progress = useProxiedModel(props, 'modelValue');
5290
5225
  const {
5291
5226
  isRtl,
@@ -5327,24 +5262,6 @@
5327
5262
  const isReversed = vue.computed(() => isRtl.value !== props.reverse);
5328
5263
  const transition = vue.computed(() => props.indeterminate ? 'fade-transition' : 'slide-x-transition');
5329
5264
  const isForcedColorsModeActive = IN_BROWSER && window.matchMedia?.('(forced-colors: active)').matches;
5330
- const containerWidth = vue.shallowRef(0);
5331
- const {
5332
- hasChunks,
5333
- chunksMaskStyles,
5334
- snapValueToChunk
5335
- } = useChunks(props, containerWidth);
5336
- useToggleScope(hasChunks, () => {
5337
- const {
5338
- resizeRef
5339
- } = useResizeObserver(entries => containerWidth.value = entries[0].contentRect.width);
5340
- vue.watchEffect(() => resizeRef.value = root.value);
5341
- });
5342
- const bufferWidth = vue.computed(() => {
5343
- return hasChunks.value ? snapValueToChunk(normalizedBuffer.value) : normalizedBuffer.value;
5344
- });
5345
- const barWidth = vue.computed(() => {
5346
- return hasChunks.value ? snapValueToChunk(normalizedValue.value) : normalizedValue.value;
5347
- });
5348
5265
  function handleClick(e) {
5349
5266
  if (!intersectionRef.value) return;
5350
5267
  const {
@@ -5355,11 +5272,8 @@
5355
5272
  const value = isReversed.value ? width - e.clientX + (right - width) : e.clientX - left;
5356
5273
  progress.value = Math.round(value / width * max.value);
5357
5274
  }
5358
- vue.watchEffect(() => {
5359
- intersectionRef.value = root.value;
5360
- });
5361
5275
  useRender(() => vue.createVNode(props.tag, {
5362
- "ref": root,
5276
+ "ref": intersectionRef,
5363
5277
  "class": vue.normalizeClass(['v-progress-linear', {
5364
5278
  'v-progress-linear--absolute': props.absolute,
5365
5279
  'v-progress-linear--active': props.active && isIntersecting.value,
@@ -5374,7 +5288,7 @@
5374
5288
  height: props.active ? convertToUnit(height.value) : 0,
5375
5289
  '--v-progress-linear-height': convertToUnit(height.value),
5376
5290
  ...(props.absolute ? locationStyles.value : {})
5377
- }, chunksMaskStyles.value, props.style]),
5291
+ }, props.style]),
5378
5292
  "role": "progressbar",
5379
5293
  "aria-hidden": props.active ? 'false' : 'true',
5380
5294
  "aria-valuemin": "0",
@@ -5404,7 +5318,7 @@
5404
5318
  "class": vue.normalizeClass(['v-progress-linear__buffer', !isForcedColorsModeActive ? bufferColorClasses.value : undefined]),
5405
5319
  "style": vue.normalizeStyle([bufferColorStyles.value, {
5406
5320
  opacity: parseFloat(props.bufferOpacity),
5407
- width: convertToUnit(bufferWidth.value, '%')
5321
+ width: convertToUnit(normalizedBuffer.value, '%')
5408
5322
  }])
5409
5323
  }, null), vue.createVNode(vue.Transition, {
5410
5324
  "name": transition.value
@@ -5412,7 +5326,7 @@
5412
5326
  default: () => [!props.indeterminate ? vue.createElementVNode("div", {
5413
5327
  "class": vue.normalizeClass(['v-progress-linear__determinate', !isForcedColorsModeActive ? barColorClasses.value : undefined]),
5414
5328
  "style": vue.normalizeStyle([barColorStyles.value, {
5415
- width: convertToUnit(barWidth.value, '%')
5329
+ width: convertToUnit(normalizedValue.value, '%')
5416
5330
  }])
5417
5331
  }, null) : vue.createElementVNode("div", {
5418
5332
  "class": "v-progress-linear__indeterminate"
@@ -9630,11 +9544,6 @@
9630
9544
  const isLink = vue.toRef(() => props.link !== false && link.isLink.value);
9631
9545
  const isSelectable = vue.computed(() => !!list && (root.selectable.value || root.activatable.value || props.value != null));
9632
9546
  const isClickable = vue.computed(() => !props.disabled && props.link !== false && (props.link || link.isClickable.value || isSelectable.value));
9633
- const role = vue.computed(() => list ? isSelectable.value ? 'option' : 'listitem' : undefined);
9634
- const ariaSelected = vue.computed(() => {
9635
- if (!isSelectable.value) return undefined;
9636
- return root.activatable.value ? isActivated.value : root.selectable.value ? isSelected.value : isActive.value;
9637
- });
9638
9547
  const roundedProps = vue.toRef(() => props.rounded || props.nav);
9639
9548
  const color = vue.toRef(() => props.color ?? props.activeColor);
9640
9549
  const variantProps = vue.toRef(() => ({
@@ -9738,8 +9647,7 @@
9738
9647
  }, themeClasses.value, borderClasses.value, colorClasses.value, densityClasses.value, elevationClasses.value, lineClasses.value, roundedClasses.value, variantClasses.value, props.class],
9739
9648
  "style": [colorStyles.value, dimensionStyles.value, props.style],
9740
9649
  "tabindex": isClickable.value ? list ? -2 : 0 : undefined,
9741
- "aria-selected": ariaSelected.value,
9742
- "role": role.value,
9650
+ "aria-selected": isSelectable.value ? root.activatable.value ? isActivated.value : root.selectable.value ? isSelected.value : isActive.value : undefined,
9743
9651
  "onClick": onClick,
9744
9652
  "onKeydown": isClickable.value && !isLink.value && onKeyDown
9745
9653
  }, link.linkProps), {
@@ -10241,7 +10149,6 @@
10241
10149
  const activeColor = vue.toRef(() => props.activeColor);
10242
10150
  const baseColor = vue.toRef(() => props.baseColor);
10243
10151
  const color = vue.toRef(() => props.color);
10244
- const isSelectable = vue.toRef(() => props.selectable || props.activatable);
10245
10152
  createList({
10246
10153
  filterable: props.filterable
10247
10154
  });
@@ -10313,7 +10220,7 @@
10313
10220
  }, themeClasses.value, backgroundColorClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, lineClasses.value, roundedClasses.value, props.class]),
10314
10221
  "style": vue.normalizeStyle([backgroundColorStyles.value, dimensionStyles.value, props.style]),
10315
10222
  "tabindex": props.disabled ? -1 : 0,
10316
- "role": isSelectable.value ? 'listbox' : 'list',
10223
+ "role": "listbox",
10317
10224
  "aria-activedescendant": undefined,
10318
10225
  "onFocusin": onFocusin,
10319
10226
  "onFocusout": onFocusout,
@@ -13383,7 +13290,6 @@
13383
13290
  "onKeydown": onListKeydown,
13384
13291
  "onFocusin": onFocusin,
13385
13292
  "tabindex": "-1",
13386
- "selectable": true,
13387
13293
  "aria-live": "polite",
13388
13294
  "aria-label": `${props.label}-list`,
13389
13295
  "color": props.itemColor ?? props.color
@@ -14003,7 +13909,6 @@
14003
13909
  "onFocusin": onFocusin,
14004
13910
  "onFocusout": onFocusout,
14005
13911
  "tabindex": "-1",
14006
- "selectable": true,
14007
13912
  "aria-live": "polite",
14008
13913
  "color": props.itemColor ?? props.color
14009
13914
  }, listEvents, props.listProps), {
@@ -19091,7 +18996,6 @@
19091
18996
  "selected": selectedValues.value,
19092
18997
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
19093
18998
  "onMousedown": e => e.preventDefault(),
19094
- "selectable": true,
19095
18999
  "onKeydown": onListKeydown,
19096
19000
  "onFocusin": onFocusin,
19097
19001
  "onFocusout": onFocusout,
@@ -24190,42 +24094,6 @@
24190
24094
  return item.isDirectory ? `${path}/${item.name}` : path;
24191
24095
  }
24192
24096
 
24193
- // Utilities
24194
- // Composables
24195
- const makeFileFilterProps = propsFactory({
24196
- filterByType: String
24197
- }, 'file-accept');
24198
- function useFileFilter(props) {
24199
- const fileFilter = vue.computed(() => props.filterByType ? createFilter(props.filterByType) : null);
24200
- function filterAccepted(files) {
24201
- if (fileFilter.value) {
24202
- const accepted = files.filter(fileFilter.value);
24203
- return {
24204
- accepted,
24205
- rejected: files.filter(f => !accepted.includes(f))
24206
- };
24207
- }
24208
- return {
24209
- accepted: files,
24210
- rejected: []
24211
- };
24212
- }
24213
- return {
24214
- filterAccepted
24215
- };
24216
- }
24217
- function createFilter(v) {
24218
- const types = v.split(',').map(x => x.trim().toLowerCase());
24219
- const extensionsToMatch = types.filter(x => x.startsWith('.'));
24220
- const wildcards = types.filter(x => x.endsWith('/*'));
24221
- const typesToMatch = types.filter(x => !extensionsToMatch.includes(x) && !wildcards.includes(x));
24222
- return file => {
24223
- const extension = file.name.split('.').at(-1)?.toLowerCase() ?? '';
24224
- const typeGroup = file.type.split('/').at(0)?.toLowerCase() ?? '';
24225
- return typesToMatch.includes(file.type) || extensionsToMatch.includes(`.${extension}`) || wildcards.includes(`${typeGroup}/*`);
24226
- };
24227
- }
24228
-
24229
24097
  // Types
24230
24098
 
24231
24099
  const makeVFileInputProps = propsFactory({
@@ -24258,7 +24126,6 @@
24258
24126
  return wrapInArray(val).every(v => v != null && typeof v === 'object');
24259
24127
  }
24260
24128
  },
24261
- ...makeFileFilterProps(),
24262
24129
  ...makeVFieldProps({
24263
24130
  clearable: true
24264
24131
  })
@@ -24271,8 +24138,7 @@
24271
24138
  'click:control': e => true,
24272
24139
  'mousedown:control': e => true,
24273
24140
  'update:focused': focused => true,
24274
- 'update:modelValue': files => true,
24275
- rejected: files => true
24141
+ 'update:modelValue': files => true
24276
24142
  },
24277
24143
  setup(props, _ref) {
24278
24144
  let {
@@ -24283,9 +24149,6 @@
24283
24149
  const {
24284
24150
  t
24285
24151
  } = useLocale();
24286
- const {
24287
- filterAccepted
24288
- } = useFileFilter(props);
24289
24152
  const model = useProxiedModel(props, 'modelValue', props.modelValue, val => wrapInArray(val), val => !props.multiple && Array.isArray(val) ? val[0] : val);
24290
24153
  const {
24291
24154
  isFocused,
@@ -24359,38 +24222,14 @@
24359
24222
  e.stopImmediatePropagation();
24360
24223
  isDragging.value = false;
24361
24224
  if (!inputRef.value || !hasFilesOrFolders(e)) return;
24362
- const allDroppedFiles = await handleDrop(e);
24363
- selectAccepted(allDroppedFiles);
24364
- }
24365
- function onFileSelection(e) {
24366
- if (!e.target || e.repack) return; // prevent loop
24367
-
24368
- if (!props.filterByType) {
24369
- const target = e.target;
24370
- model.value = [...(target.files ?? [])];
24371
- } else {
24372
- selectAccepted([...e.target.files]);
24373
- }
24374
- }
24375
- function selectAccepted(files) {
24376
24225
  const dataTransfer = new DataTransfer();
24377
- const {
24378
- accepted,
24379
- rejected
24380
- } = filterAccepted(files);
24381
- if (rejected.length) {
24382
- emit('rejected', rejected);
24383
- }
24384
- for (const file of accepted) {
24226
+ for (const file of await handleDrop(e)) {
24385
24227
  dataTransfer.items.add(file);
24386
24228
  }
24387
24229
  inputRef.value.files = dataTransfer.files;
24388
- model.value = [...dataTransfer.files];
24389
- const event = new Event('change', {
24230
+ inputRef.value.dispatchEvent(new Event('change', {
24390
24231
  bubbles: true
24391
- });
24392
- event.repack = true;
24393
- inputRef.value.dispatchEvent(event);
24232
+ }));
24394
24233
  }
24395
24234
  vue.watch(model, newValue => {
24396
24235
  const hasModelReset = !Array.isArray(newValue) || !newValue.length;
@@ -24407,8 +24246,6 @@
24407
24246
  ...inputProps
24408
24247
  } = VInput.filterProps(props);
24409
24248
  const fieldProps = VField.filterProps(props);
24410
- const expectsDirectory = attrs.webkitdirectory !== undefined && attrs.webkitdirectory !== false;
24411
- const inputAccept = expectsDirectory ? undefined : props.filterByType ?? String(attrs.accept);
24412
24249
  return vue.createVNode(VInput, vue.mergeProps({
24413
24250
  "ref": vInputRef,
24414
24251
  "modelValue": props.multiple ? model.value : model.value[0],
@@ -24464,7 +24301,6 @@
24464
24301
  return vue.createElementVNode(vue.Fragment, null, [vue.createElementVNode("input", vue.mergeProps({
24465
24302
  "ref": inputRef,
24466
24303
  "type": "file",
24467
- "accept": inputAccept,
24468
24304
  "readonly": isReadonly.value,
24469
24305
  "disabled": isDisabled.value,
24470
24306
  "multiple": props.multiple,
@@ -24474,7 +24310,11 @@
24474
24310
  if (isReadonly.value) e.preventDefault();
24475
24311
  onFocus();
24476
24312
  },
24477
- "onChange": onFileSelection,
24313
+ "onChange": e => {
24314
+ if (!e.target) return;
24315
+ const target = e.target;
24316
+ model.value = [...(target.files ?? [])];
24317
+ },
24478
24318
  "onDragleave": onDragleave,
24479
24319
  "onFocus": onFocus,
24480
24320
  "onBlur": blur
@@ -30509,51 +30349,48 @@
30509
30349
  parentIndentLines: props.parentIndentLines,
30510
30350
  variant: props.indentLinesVariant
30511
30351
  });
30512
- function renderItem(itemProps) {
30513
- return vue.createVNode(VTreeviewItem, itemProps, {
30514
- prepend: slotProps => vue.createElementVNode(vue.Fragment, null, [props.selectable && (!children || children && !['leaf', 'single-leaf'].includes(props.selectStrategy)) && vue.createElementVNode("div", null, [vue.createVNode(VCheckboxBtn, {
30515
- "key": item.value,
30516
- "modelValue": slotProps.isSelected,
30517
- "disabled": props.disabled,
30518
- "loading": loading,
30519
- "color": props.selectedColor,
30520
- "density": props.density,
30521
- "indeterminate": slotProps.isIndeterminate,
30522
- "indeterminateIcon": props.indeterminateIcon,
30523
- "falseIcon": props.falseIcon,
30524
- "trueIcon": props.trueIcon,
30525
- "onUpdate:modelValue": v => selectItem(slotProps.select, v),
30526
- "onClick": e => e.stopPropagation(),
30527
- "onKeydown": e => {
30528
- if (!['Enter', 'Space'].includes(e.key)) return;
30529
- e.stopPropagation();
30530
- selectItem(slotProps.select, slotProps.isSelected);
30531
- }
30532
- }, null)]), slots.prepend?.({
30533
- ...slotProps,
30534
- ...treeItemProps,
30535
- item: item.raw,
30536
- internalItem: item
30537
- })]),
30538
- append: slots.append ? slotProps => slots.append?.({
30539
- ...slotProps,
30540
- ...treeItemProps,
30541
- item: item.raw,
30542
- internalItem: item
30543
- }) : undefined,
30544
- title: slots.title ? slotProps => slots.title?.({
30545
- ...slotProps,
30546
- item: item.raw,
30547
- internalItem: item
30548
- }) : undefined,
30549
- subtitle: slots.subtitle ? slotProps => slots.subtitle?.({
30550
- ...slotProps,
30551
- item: item.raw,
30552
- internalItem: item
30553
- }) : undefined,
30554
- $stable: true
30555
- });
30556
- }
30352
+ const slotsWithItem = {
30353
+ prepend: slotProps => vue.createElementVNode(vue.Fragment, null, [props.selectable && (!children || children && !['leaf', 'single-leaf'].includes(props.selectStrategy)) && vue.createElementVNode("div", null, [vue.createVNode(VCheckboxBtn, {
30354
+ "key": item.value,
30355
+ "modelValue": slotProps.isSelected,
30356
+ "disabled": props.disabled,
30357
+ "loading": loading,
30358
+ "color": props.selectedColor,
30359
+ "density": props.density,
30360
+ "indeterminate": slotProps.isIndeterminate,
30361
+ "indeterminateIcon": props.indeterminateIcon,
30362
+ "falseIcon": props.falseIcon,
30363
+ "trueIcon": props.trueIcon,
30364
+ "onUpdate:modelValue": v => selectItem(slotProps.select, v),
30365
+ "onClick": e => e.stopPropagation(),
30366
+ "onKeydown": e => {
30367
+ if (!['Enter', 'Space'].includes(e.key)) return;
30368
+ e.stopPropagation();
30369
+ selectItem(slotProps.select, slotProps.isSelected);
30370
+ }
30371
+ }, null)]), slots.prepend?.({
30372
+ ...slotProps,
30373
+ ...treeItemProps,
30374
+ item: item.raw,
30375
+ internalItem: item
30376
+ })]),
30377
+ append: slots.append ? slotProps => slots.append?.({
30378
+ ...slotProps,
30379
+ ...treeItemProps,
30380
+ item: item.raw,
30381
+ internalItem: item
30382
+ }) : undefined,
30383
+ title: slots.title ? slotProps => slots.title?.({
30384
+ ...slotProps,
30385
+ item: item.raw,
30386
+ internalItem: item
30387
+ }) : undefined,
30388
+ subtitle: slots.subtitle ? slotProps => slots.subtitle?.({
30389
+ ...slotProps,
30390
+ item: item.raw,
30391
+ internalItem: item
30392
+ }) : undefined
30393
+ };
30557
30394
  const treeviewGroupProps = VTreeviewGroup.filterProps(itemProps);
30558
30395
  const treeviewChildrenProps = VTreeviewChildren.filterProps({
30559
30396
  ...props,
@@ -30567,16 +30404,21 @@
30567
30404
  let {
30568
30405
  props: activatorProps
30569
30406
  } = _ref2;
30570
- return renderItem({
30407
+ const listItemProps = {
30571
30408
  ...itemProps,
30572
30409
  ...activatorProps,
30573
- loading,
30574
- hideActions: props.hideActions,
30575
- indentLines: indentLines.node,
30576
- value: props.returnObject ? item.raw : itemProps.value,
30410
+ value: itemProps?.value,
30577
30411
  onToggleExpand: [() => checkChildren(item), activatorProps.onClick],
30578
30412
  onClick: isClickOnOpen.value ? [() => checkChildren(item), activatorProps.onClick] : () => selectItem(activatorItems.value[index]?.select, !activatorItems.value[index]?.isSelected)
30579
- });
30413
+ };
30414
+ return vue.createVNode(VTreeviewItem, vue.mergeProps({
30415
+ "ref": el => activatorItems.value[index] = el
30416
+ }, listItemProps, {
30417
+ "hideActions": props.hideActions,
30418
+ "indentLines": indentLines.node,
30419
+ "value": props.returnObject ? item.raw : itemProps.value,
30420
+ "loading": loading
30421
+ }), slotsWithItem);
30580
30422
  },
30581
30423
  default: () => vue.createVNode(VTreeviewChildren, vue.mergeProps(treeviewChildrenProps, {
30582
30424
  "items": children,
@@ -30584,8 +30426,7 @@
30584
30426
  "parentIndentLines": indentLines.children,
30585
30427
  "isLastGroup": nextItemHasChildren,
30586
30428
  "returnObject": props.returnObject
30587
- }), slots),
30588
- $stable: true
30429
+ }), slots)
30589
30430
  }) : renderSlot(slots.item, {
30590
30431
  props: itemProps,
30591
30432
  item: item.raw,
@@ -30601,12 +30442,11 @@
30601
30442
  props: item.raw
30602
30443
  }, () => vue.createVNode(VListSubheader, item.props, null));
30603
30444
  }
30604
- return renderItem({
30605
- ...itemProps,
30606
- hideActions: props.hideActions,
30607
- indentLines: indentLines.leaf,
30608
- value: props.returnObject ? vue.toRaw(item.raw) : itemProps.value
30609
- });
30445
+ return vue.createVNode(VTreeviewItem, vue.mergeProps(itemProps, {
30446
+ "hideActions": props.hideActions,
30447
+ "indentLines": indentLines.leaf,
30448
+ "value": props.returnObject ? vue.toRaw(item.raw) : itemProps.value
30449
+ }), slotsWithItem);
30610
30450
  });
30611
30451
  });
30612
30452
  }
@@ -30745,14 +30585,13 @@
30745
30585
  "selected": selected.value,
30746
30586
  "onUpdate:selected": $event => selected.value = $event
30747
30587
  }), {
30748
- default: () => vue.createVNode(VTreeviewChildren, vue.mergeProps(treeviewChildrenProps, {
30588
+ default: () => [vue.createVNode(VTreeviewChildren, vue.mergeProps(treeviewChildrenProps, {
30749
30589
  "density": props.density,
30750
30590
  "returnObject": props.returnObject,
30751
30591
  "items": items.value,
30752
30592
  "parentIndentLines": props.indentLines ? [] : undefined,
30753
30593
  "indentLinesVariant": indentLinesVariant
30754
- }), slots),
30755
- $stable: true
30594
+ }), slots)]
30756
30595
  });
30757
30596
  });
30758
30597
  return {};
@@ -31993,7 +31832,6 @@
31993
31832
  },
31994
31833
  showSize: Boolean,
31995
31834
  name: String,
31996
- ...makeFileFilterProps(),
31997
31835
  ...makeDelayProps(),
31998
31836
  ...makeDensityProps(),
31999
31837
  ...pick(makeVDividerProps({
@@ -32006,13 +31844,11 @@
32006
31844
  inheritAttrs: false,
32007
31845
  props: makeVFileUploadProps(),
32008
31846
  emits: {
32009
- 'update:modelValue': files => true,
32010
- rejected: files => true
31847
+ 'update:modelValue': files => true
32011
31848
  },
32012
31849
  setup(props, _ref) {
32013
31850
  let {
32014
31851
  attrs,
32015
- emit,
32016
31852
  slots
32017
31853
  } = _ref;
32018
31854
  const {
@@ -32021,9 +31857,6 @@
32021
31857
  const {
32022
31858
  densityClasses
32023
31859
  } = useDensity(props);
32024
- const {
32025
- filterAccepted
32026
- } = useFileFilter(props);
32027
31860
  const model = useProxiedModel(props, 'modelValue', props.modelValue, val => wrapInArray(val), val => props.multiple || Array.isArray(props.modelValue) ? val : val[0]);
32028
31861
  const isDragging = vue.shallowRef(false);
32029
31862
  const vSheetRef = vue.ref(null);
@@ -32045,38 +31878,14 @@
32045
31878
  e.stopImmediatePropagation();
32046
31879
  isDragging.value = false;
32047
31880
  if (!inputRef.value) return;
32048
- const allDroppedFiles = await handleDrop(e);
32049
- selectAccepted(allDroppedFiles);
32050
- }
32051
- function onFileSelection(e) {
32052
- if (!e.target || e.repack) return; // prevent loop
32053
-
32054
- if (!props.filterByType) {
32055
- const target = e.target;
32056
- model.value = [...(target.files ?? [])];
32057
- } else {
32058
- selectAccepted([...e.target.files]);
32059
- }
32060
- }
32061
- function selectAccepted(files) {
32062
31881
  const dataTransfer = new DataTransfer();
32063
- const {
32064
- accepted,
32065
- rejected
32066
- } = filterAccepted(files);
32067
- if (rejected.length) {
32068
- emit('rejected', rejected);
32069
- }
32070
- for (const file of accepted) {
31882
+ for (const file of await handleDrop(e)) {
32071
31883
  dataTransfer.items.add(file);
32072
31884
  }
32073
31885
  inputRef.value.files = dataTransfer.files;
32074
- model.value = [...dataTransfer.files];
32075
- const event = new Event('change', {
31886
+ inputRef.value.dispatchEvent(new Event('change', {
32076
31887
  bubbles: true
32077
- });
32078
- event.repack = true;
32079
- inputRef.value.dispatchEvent(event);
31888
+ }));
32080
31889
  }
32081
31890
  function onClick() {
32082
31891
  inputRef.value?.click();
@@ -32094,16 +31903,17 @@
32094
31903
  const cardProps = VSheet.filterProps(props);
32095
31904
  const dividerProps = VDivider.filterProps(props);
32096
31905
  const [rootAttrs, inputAttrs] = filterInputAttrs(attrs);
32097
- const expectsDirectory = attrs.webkitdirectory !== undefined && attrs.webkitdirectory !== false;
32098
- const inputAccept = expectsDirectory ? undefined : props.filterByType ?? String(attrs.accept);
32099
31906
  const inputNode = vue.createElementVNode("input", vue.mergeProps({
32100
31907
  "ref": inputRef,
32101
31908
  "type": "file",
32102
- "accept": inputAccept,
32103
31909
  "disabled": props.disabled,
32104
31910
  "multiple": props.multiple,
32105
31911
  "name": props.name,
32106
- "onChange": onFileSelection
31912
+ "onChange": e => {
31913
+ if (!e.target) return;
31914
+ const target = e.target;
31915
+ model.value = [...(target.files ?? [])];
31916
+ }
32107
31917
  }, inputAttrs), null);
32108
31918
  return vue.createElementVNode(vue.Fragment, null, [vue.createVNode(VSheet, vue.mergeProps({
32109
31919
  "ref": vSheetRef
@@ -33882,7 +33692,7 @@
33882
33692
  };
33883
33693
  });
33884
33694
  }
33885
- const version$1 = "3.9.1-dev.2025-07-17";
33695
+ const version$1 = "3.9.2-master.2025-07-18";
33886
33696
  createVuetify$1.version = version$1;
33887
33697
 
33888
33698
  // Vue's inject() can only be used in setup
@@ -34180,7 +33990,7 @@
34180
33990
 
34181
33991
  /* eslint-disable local-rules/sort-imports */
34182
33992
 
34183
- const version = "3.9.1-dev.2025-07-17";
33993
+ const version = "3.9.2-master.2025-07-18";
34184
33994
 
34185
33995
  /* eslint-disable local-rules/sort-imports */
34186
33996