@vuetify/nightly 3.8.9-dev.2025-06-12 → 3.8.9-dev.2025-06-13

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 (63) hide show
  1. package/CHANGELOG.md +7 -3
  2. package/dist/json/attributes.json +3443 -3407
  3. package/dist/json/importMap-labs.json +12 -12
  4. package/dist/json/importMap.json +172 -172
  5. package/dist/json/tags.json +10 -1
  6. package/dist/json/web-types.json +6311 -6174
  7. package/dist/vuetify-labs.cjs +111 -47
  8. package/dist/vuetify-labs.css +3296 -3285
  9. package/dist/vuetify-labs.d.ts +1602 -1406
  10. package/dist/vuetify-labs.esm.js +111 -47
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +111 -47
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +111 -47
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +4165 -4154
  17. package/dist/vuetify.d.ts +1355 -1159
  18. package/dist/vuetify.esm.js +111 -47
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +111 -47
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +1063 -1057
  24. package/dist/vuetify.min.js.map +1 -1
  25. package/lib/components/VAutocomplete/VAutocomplete.d.ts +21 -7
  26. package/lib/components/VCombobox/VCombobox.d.ts +21 -7
  27. package/lib/components/VDatePicker/VDatePicker.d.ts +70 -5
  28. package/lib/components/VDatePicker/VDatePicker.js +10 -4
  29. package/lib/components/VDatePicker/VDatePicker.js.map +1 -1
  30. package/lib/components/VKbd/VKbd.css +13 -2
  31. package/lib/components/VKbd/VKbd.d.ts +221 -0
  32. package/lib/components/VKbd/VKbd.js +55 -0
  33. package/lib/components/VKbd/VKbd.js.map +1 -0
  34. package/lib/components/VKbd/VKbd.sass +2 -1
  35. package/lib/components/VKbd/_variables.scss +12 -1
  36. package/lib/components/VKbd/index.d.ts +1 -95
  37. package/lib/components/VKbd/index.js +1 -4
  38. package/lib/components/VKbd/index.js.map +1 -1
  39. package/lib/components/VMenu/VMenu.d.ts +13 -0
  40. package/lib/components/VMenu/VMenu.js +2 -1
  41. package/lib/components/VMenu/VMenu.js.map +1 -1
  42. package/lib/components/VNumberInput/VNumberInput.d.ts +11 -0
  43. package/lib/components/VNumberInput/VNumberInput.js +37 -29
  44. package/lib/components/VNumberInput/VNumberInput.js.map +1 -1
  45. package/lib/components/VSelect/VSelect.d.ts +33 -11
  46. package/lib/components/VSpeedDial/VSpeedDial.d.ts +13 -0
  47. package/lib/composables/locale.d.ts +5 -1
  48. package/lib/composables/locale.js.map +1 -1
  49. package/lib/composables/theme.js +3 -3
  50. package/lib/composables/theme.js.map +1 -1
  51. package/lib/entry-bundler.d.ts +1 -0
  52. package/lib/entry-bundler.js +1 -1
  53. package/lib/framework.d.ts +59 -56
  54. package/lib/framework.js +1 -1
  55. package/lib/labs/entry-bundler.d.ts +1 -0
  56. package/lib/locale/adapters/vue-i18n.js +6 -1
  57. package/lib/locale/adapters/vue-i18n.js.map +1 -1
  58. package/lib/locale/adapters/vuetify.js +7 -1
  59. package/lib/locale/adapters/vuetify.js.map +1 -1
  60. package/lib/util/helpers.d.ts +2 -1
  61. package/lib/util/helpers.js +12 -7
  62. package/lib/util/helpers.js.map +1 -1
  63. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.8.9-dev.2025-06-12
2
+ * Vuetify v3.8.9-dev.2025-06-13
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -588,18 +588,23 @@ function checkPrintable(e) {
588
588
  function isPrimitive(value) {
589
589
  return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint';
590
590
  }
591
- function extractNumber(text, decimalDigitsLimit) {
592
- const cleanText = text.split('').filter(x => /[\d\-.]/.test(x)).filter((x, i, all) => i === 0 && /[-]/.test(x) ||
591
+ function escapeForRegex(sign) {
592
+ return '\\^$*+?.()|{}[]'.includes(sign) ? `\\${sign}` : sign;
593
+ }
594
+ function extractNumber(text, decimalDigitsLimit, decimalSeparator) {
595
+ const onlyValidCharacters = new RegExp(`[\\d\\-${escapeForRegex(decimalSeparator)}]`);
596
+ const cleanText = text.split('').filter(x => onlyValidCharacters.test(x)).filter((x, i, all) => i === 0 && /[-]/.test(x) ||
593
597
  // sign allowed at the start
594
- x === '.' && i === all.indexOf('.') ||
598
+ x === decimalSeparator && i === all.indexOf(x) ||
595
599
  // decimal separator allowed only once
596
600
  /\d/.test(x)).join('');
597
601
  if (decimalDigitsLimit === 0) {
598
- return cleanText.split('.')[0];
602
+ return cleanText.split(decimalSeparator)[0];
599
603
  }
600
- if (decimalDigitsLimit !== null && /\.\d/.test(cleanText)) {
601
- const parts = cleanText.split('.');
602
- return [parts[0], parts[1].substring(0, decimalDigitsLimit)].join('.');
604
+ const decimalPart = new RegExp(`${escapeForRegex(decimalSeparator)}\\d`);
605
+ if (decimalDigitsLimit !== null && decimalPart.test(cleanText)) {
606
+ const parts = cleanText.split(decimalSeparator);
607
+ return [parts[0], parts[1].substring(0, decimalDigitsLimit)].join(decimalSeparator);
603
608
  }
604
609
  return cleanText;
605
610
  }
@@ -2175,6 +2180,10 @@ function createNumberFunction(current, fallback) {
2175
2180
  return numberFormat.format(value);
2176
2181
  };
2177
2182
  }
2183
+ function inferDecimalSeparator(current, fallback) {
2184
+ const format = createNumberFunction(current, fallback);
2185
+ return format(0.1).includes(',') ? ',' : '.';
2186
+ }
2178
2187
  function useProvided(props, prop, provided) {
2179
2188
  const internal = useProxiedModel(props, prop, props[prop] ?? provided.value);
2180
2189
 
@@ -2197,6 +2206,7 @@ function createProvideFunction(state) {
2197
2206
  current,
2198
2207
  fallback,
2199
2208
  messages,
2209
+ decimalSeparator: toRef(() => inferDecimalSeparator(current, fallback)),
2200
2210
  t: createTranslateFunction(current, fallback, messages),
2201
2211
  n: createNumberFunction(current, fallback),
2202
2212
  provide: createProvideFunction({
@@ -2219,6 +2229,7 @@ function createVuetifyAdapter(options) {
2219
2229
  current,
2220
2230
  fallback,
2221
2231
  messages,
2232
+ decimalSeparator: toRef(() => options?.decimalSeparator ?? inferDecimalSeparator(current, fallback)),
2222
2233
  t: createTranslateFunction(current, fallback, messages),
2223
2234
  n: createNumberFunction(current, fallback),
2224
2235
  provide: createProvideFunction({
@@ -2383,8 +2394,8 @@ function genDefaults$2() {
2383
2394
  'activated-opacity': 0.12,
2384
2395
  'pressed-opacity': 0.12,
2385
2396
  'dragged-opacity': 0.08,
2386
- 'theme-kbd': '#212529',
2387
- 'theme-on-kbd': '#FFFFFF',
2397
+ 'theme-kbd': '#EEEEEE',
2398
+ 'theme-on-kbd': '#000000',
2388
2399
  'theme-code': '#F5F5F5',
2389
2400
  'theme-on-code': '#000000'
2390
2401
  }
@@ -2420,7 +2431,7 @@ function genDefaults$2() {
2420
2431
  'activated-opacity': 0.12,
2421
2432
  'pressed-opacity': 0.16,
2422
2433
  'dragged-opacity': 0.08,
2423
- 'theme-kbd': '#212529',
2434
+ 'theme-kbd': '#424242',
2424
2435
  'theme-on-kbd': '#FFFFFF',
2425
2436
  'theme-code': '#343434',
2426
2437
  'theme-on-code': '#CCCCCC'
@@ -11630,6 +11641,7 @@ const makeVMenuProps = propsFactory({
11630
11641
  // disableKeys: Boolean,
11631
11642
  id: String,
11632
11643
  submenu: Boolean,
11644
+ disableInitialFocus: Boolean,
11633
11645
  ...omit(makeVOverlayProps({
11634
11646
  closeDelay: 250,
11635
11647
  closeOnContentClick: true,
@@ -11704,7 +11716,7 @@ const VMenu = genericComponent()({
11704
11716
  watch(isActive, val => {
11705
11717
  if (val) {
11706
11718
  parent?.register();
11707
- if (IN_BROWSER) {
11719
+ if (IN_BROWSER && !props.disableInitialFocus) {
11708
11720
  document.addEventListener('focusin', onFocusIn, {
11709
11721
  once: true
11710
11722
  });
@@ -23005,7 +23017,9 @@ const VDatePicker = genericComponent()({
23005
23017
  "max": maxDate.value,
23006
23018
  "year": year.value,
23007
23019
  "allowedMonths": allowedMonths
23008
- }), null) : viewMode.value === 'year' ? createVNode(VDatePickerYears, mergeProps({
23020
+ }), {
23021
+ ...pick(slots, ['month'])
23022
+ }) : viewMode.value === 'year' ? createVNode(VDatePickerYears, mergeProps({
23009
23023
  "key": "date-picker-years"
23010
23024
  }, datePickerYearsProps, {
23011
23025
  "modelValue": year.value,
@@ -23013,7 +23027,9 @@ const VDatePicker = genericComponent()({
23013
23027
  "min": minDate.value,
23014
23028
  "max": maxDate.value,
23015
23029
  "allowedYears": allowedYears
23016
- }), null) : createVNode(VDatePickerMonth, mergeProps({
23030
+ }), {
23031
+ ...pick(slots, ['year'])
23032
+ }) : createVNode(VDatePickerMonth, mergeProps({
23017
23033
  "key": "date-picker-month"
23018
23034
  }, datePickerMonthProps, {
23019
23035
  "modelValue": model.value,
@@ -23024,7 +23040,9 @@ const VDatePicker = genericComponent()({
23024
23040
  "onUpdate:year": [$event => year.value = $event, onUpdateYear],
23025
23041
  "min": minDate.value,
23026
23042
  "max": maxDate.value
23027
- }), null)]
23043
+ }), {
23044
+ ...pick(slots, ['day'])
23045
+ })]
23028
23046
  })]),
23029
23047
  actions: slots.actions
23030
23048
  });
@@ -24334,8 +24352,47 @@ const VItem = genericComponent()({
24334
24352
  }
24335
24353
  });
24336
24354
 
24337
- // Styles
24338
- const VKbd = createSimpleFunctional('v-kbd', 'kbd');
24355
+ const makeVKbdProps = propsFactory({
24356
+ ...makeBorderProps(),
24357
+ ...makeComponentProps(),
24358
+ ...makeRoundedProps(),
24359
+ ...makeTagProps({
24360
+ tag: 'kbd'
24361
+ }),
24362
+ ...makeThemeProps(),
24363
+ ...makeElevationProps(),
24364
+ color: String
24365
+ }, 'VKbd');
24366
+ const VKbd = genericComponent()({
24367
+ name: 'VKbd',
24368
+ props: makeVKbdProps(),
24369
+ setup(props, _ref) {
24370
+ let {
24371
+ slots
24372
+ } = _ref;
24373
+ const {
24374
+ themeClasses
24375
+ } = provideTheme(props);
24376
+ const {
24377
+ borderClasses
24378
+ } = useBorder(props);
24379
+ const {
24380
+ roundedClasses
24381
+ } = useRounded(props);
24382
+ const {
24383
+ backgroundColorClasses,
24384
+ backgroundColorStyles
24385
+ } = useBackgroundColor(() => props.color);
24386
+ const {
24387
+ elevationClasses
24388
+ } = useElevation(props);
24389
+ useRender(() => createVNode(props.tag, {
24390
+ "class": normalizeClass(['v-kbd', themeClasses.value, backgroundColorClasses.value, borderClasses.value, elevationClasses.value, roundedClasses.value, props.class]),
24391
+ "style": normalizeStyle([backgroundColorStyles.value, props.style])
24392
+ }, slots));
24393
+ return {};
24394
+ }
24395
+ });
24339
24396
 
24340
24397
  const makeVLayoutProps = propsFactory({
24341
24398
  ...makeComponentProps(),
@@ -25177,6 +25234,10 @@ const makeVNumberInputProps = propsFactory({
25177
25234
  type: Number,
25178
25235
  default: null
25179
25236
  },
25237
+ decimalSeparator: {
25238
+ type: String,
25239
+ validator: v => !v || v.length === 1
25240
+ },
25180
25241
  ...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
25181
25242
  }, 'VNumberInput');
25182
25243
  const VNumberInput = genericComponent()({
@@ -25202,21 +25263,24 @@ const VNumberInput = genericComponent()({
25202
25263
  const form = useForm(props);
25203
25264
  const controlsDisabled = computed(() => form.isDisabled.value || form.isReadonly.value);
25204
25265
  const isFocused = shallowRef(props.focused);
25266
+ const {
25267
+ decimalSeparator: decimalSeparatorFromLocale
25268
+ } = useLocale();
25269
+ const decimalSeparator = computed(() => props.decimalSeparator?.[0] || decimalSeparatorFromLocale.value);
25205
25270
  function correctPrecision(val) {
25206
25271
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
25207
- if (precision == null) {
25208
- return String(val);
25209
- }
25210
- let fixed = val.toFixed(precision);
25211
- if (isFocused.value) {
25212
- return Number(fixed).toString(); // trim zeros
25272
+ let trim = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
25273
+ const fixed = precision == null ? String(val) : val.toFixed(precision);
25274
+ if (isFocused.value && trim) {
25275
+ return Number(fixed).toString() // trim zeros
25276
+ .replace('.', decimalSeparator.value);
25213
25277
  }
25214
- if ((props.minFractionDigits ?? precision) < precision) {
25215
- const trimLimit = precision - props.minFractionDigits;
25216
- const [baseDigits, fractionDigits] = fixed.split('.');
25217
- fixed = [baseDigits, fractionDigits.replace(new RegExp(`0{1,${trimLimit}}$`), '')].filter(Boolean).join('.');
25278
+ if (props.minFractionDigits === null || precision !== null && precision < props.minFractionDigits) {
25279
+ return fixed.replace('.', decimalSeparator.value);
25218
25280
  }
25219
- return fixed;
25281
+ let [baseDigits, fractionDigits] = fixed.split('.');
25282
+ fractionDigits = (fractionDigits ?? '').padEnd(props.minFractionDigits, '0').replace(new RegExp(`(?<=\\d{${props.minFractionDigits}})0`, 'g'), '');
25283
+ return [baseDigits, fractionDigits].filter(Boolean).join(decimalSeparator.value);
25220
25284
  }
25221
25285
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
25222
25286
  const _inputText = shallowRef(null);
@@ -25233,8 +25297,11 @@ const VNumberInput = genericComponent()({
25233
25297
  if (val === null || val === '') {
25234
25298
  model.value = null;
25235
25299
  _inputText.value = null;
25236
- } else if (!isNaN(Number(val)) && Number(val) <= props.max && Number(val) >= props.min) {
25237
- model.value = Number(val);
25300
+ return;
25301
+ }
25302
+ const parsedValue = Number(val.replace(decimalSeparator.value, '.'));
25303
+ if (!isNaN(parsedValue) && parsedValue <= props.max && parsedValue >= props.min) {
25304
+ model.value = parsedValue;
25238
25305
  _inputText.value = val;
25239
25306
  }
25240
25307
  }
@@ -25305,24 +25372,24 @@ const VNumberInput = genericComponent()({
25305
25372
  selectionEnd
25306
25373
  } = inputElement ?? {};
25307
25374
  const potentialNewInputVal = existingTxt ? existingTxt.slice(0, selectionStart) + e.data + existingTxt.slice(selectionEnd) : e.data;
25308
- const potentialNewNumber = extractNumber(potentialNewInputVal, props.precision);
25375
+ const potentialNewNumber = extractNumber(potentialNewInputVal, props.precision, decimalSeparator.value);
25309
25376
 
25310
- // Only numbers, "-", "." are allowed
25311
- // AND "-", "." are allowed only once
25312
- // AND "-" is only allowed at the start
25313
- if (!/^-?(\d+(\.\d*)?|(\.\d+)|\d*|\.)$/.test(potentialNewInputVal)) {
25377
+ // Allow only numbers, "-" and {decimal separator}
25378
+ // Allow "-" and {decimal separator} only once
25379
+ // Allow "-" only at the start
25380
+ if (!new RegExp(`^-?\\d*${escapeForRegex(decimalSeparator.value)}?\\d*$`).test(potentialNewInputVal)) {
25314
25381
  e.preventDefault();
25315
25382
  inputElement.value = potentialNewNumber;
25316
25383
  }
25317
25384
  if (props.precision == null) return;
25318
25385
 
25319
25386
  // Ignore decimal digits above precision limit
25320
- if (potentialNewInputVal.split('.')[1]?.length > props.precision) {
25387
+ if (potentialNewInputVal.split(decimalSeparator.value)[1]?.length > props.precision) {
25321
25388
  e.preventDefault();
25322
25389
  inputElement.value = potentialNewNumber;
25323
25390
  }
25324
25391
  // Ignore decimal separator when precision = 0
25325
- if (props.precision === 0 && potentialNewInputVal.includes('.')) {
25392
+ if (props.precision === 0 && potentialNewInputVal.includes(decimalSeparator.value)) {
25326
25393
  e.preventDefault();
25327
25394
  inputElement.value = potentialNewNumber;
25328
25395
  }
@@ -25374,19 +25441,16 @@ const VNumberInput = genericComponent()({
25374
25441
  if (controlsDisabled.value) return;
25375
25442
  if (!vTextFieldRef.value) return;
25376
25443
  const actualText = vTextFieldRef.value.value;
25377
- if (actualText && !isNaN(Number(actualText))) {
25378
- inputText.value = correctPrecision(clamp(Number(actualText), props.min, props.max));
25444
+ const parsedValue = Number(actualText.replace(decimalSeparator.value, '.'));
25445
+ if (actualText && !isNaN(parsedValue)) {
25446
+ inputText.value = correctPrecision(clamp(parsedValue, props.min, props.max));
25379
25447
  } else {
25380
25448
  inputText.value = null;
25381
25449
  }
25382
25450
  }
25383
25451
  function formatInputValue() {
25384
25452
  if (controlsDisabled.value) return;
25385
- if (model.value === null || isNaN(model.value)) {
25386
- inputText.value = null;
25387
- return;
25388
- }
25389
- inputText.value = correctPrecision(model.value);
25453
+ inputText.value = model.value !== null && !isNaN(model.value) ? correctPrecision(model.value, props.precision, false) : null;
25390
25454
  }
25391
25455
  function trimDecimalZeros() {
25392
25456
  if (controlsDisabled.value) return;
@@ -25394,7 +25458,7 @@ const VNumberInput = genericComponent()({
25394
25458
  inputText.value = null;
25395
25459
  return;
25396
25460
  }
25397
- inputText.value = model.value.toString();
25461
+ inputText.value = model.value.toString().replace('.', decimalSeparator.value);
25398
25462
  }
25399
25463
  function onFocus() {
25400
25464
  trimDecimalZeros();
@@ -32638,7 +32702,7 @@ function createVuetify$1() {
32638
32702
  };
32639
32703
  });
32640
32704
  }
32641
- const version$1 = "3.8.9-dev.2025-06-12";
32705
+ const version$1 = "3.8.9-dev.2025-06-13";
32642
32706
  createVuetify$1.version = version$1;
32643
32707
 
32644
32708
  // Vue's inject() can only be used in setup
@@ -32936,7 +33000,7 @@ var index = /*#__PURE__*/Object.freeze({
32936
33000
 
32937
33001
  /* eslint-disable local-rules/sort-imports */
32938
33002
 
32939
- const version = "3.8.9-dev.2025-06-12";
33003
+ const version = "3.8.9-dev.2025-06-13";
32940
33004
 
32941
33005
  /* eslint-disable local-rules/sort-imports */
32942
33006