@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
  */
@@ -592,18 +592,23 @@
592
592
  function isPrimitive(value) {
593
593
  return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint';
594
594
  }
595
- function extractNumber(text, decimalDigitsLimit) {
596
- const cleanText = text.split('').filter(x => /[\d\-.]/.test(x)).filter((x, i, all) => i === 0 && /[-]/.test(x) ||
595
+ function escapeForRegex(sign) {
596
+ return '\\^$*+?.()|{}[]'.includes(sign) ? `\\${sign}` : sign;
597
+ }
598
+ function extractNumber(text, decimalDigitsLimit, decimalSeparator) {
599
+ const onlyValidCharacters = new RegExp(`[\\d\\-${escapeForRegex(decimalSeparator)}]`);
600
+ const cleanText = text.split('').filter(x => onlyValidCharacters.test(x)).filter((x, i, all) => i === 0 && /[-]/.test(x) ||
597
601
  // sign allowed at the start
598
- x === '.' && i === all.indexOf('.') ||
602
+ x === decimalSeparator && i === all.indexOf(x) ||
599
603
  // decimal separator allowed only once
600
604
  /\d/.test(x)).join('');
601
605
  if (decimalDigitsLimit === 0) {
602
- return cleanText.split('.')[0];
606
+ return cleanText.split(decimalSeparator)[0];
603
607
  }
604
- if (decimalDigitsLimit !== null && /\.\d/.test(cleanText)) {
605
- const parts = cleanText.split('.');
606
- return [parts[0], parts[1].substring(0, decimalDigitsLimit)].join('.');
608
+ const decimalPart = new RegExp(`${escapeForRegex(decimalSeparator)}\\d`);
609
+ if (decimalDigitsLimit !== null && decimalPart.test(cleanText)) {
610
+ const parts = cleanText.split(decimalSeparator);
611
+ return [parts[0], parts[1].substring(0, decimalDigitsLimit)].join(decimalSeparator);
607
612
  }
608
613
  return cleanText;
609
614
  }
@@ -2179,6 +2184,10 @@
2179
2184
  return numberFormat.format(value);
2180
2185
  };
2181
2186
  }
2187
+ function inferDecimalSeparator(current, fallback) {
2188
+ const format = createNumberFunction(current, fallback);
2189
+ return format(0.1).includes(',') ? ',' : '.';
2190
+ }
2182
2191
  function useProvided(props, prop, provided) {
2183
2192
  const internal = useProxiedModel(props, prop, props[prop] ?? provided.value);
2184
2193
 
@@ -2201,6 +2210,7 @@
2201
2210
  current,
2202
2211
  fallback,
2203
2212
  messages,
2213
+ decimalSeparator: vue.toRef(() => inferDecimalSeparator(current, fallback)),
2204
2214
  t: createTranslateFunction(current, fallback, messages),
2205
2215
  n: createNumberFunction(current, fallback),
2206
2216
  provide: createProvideFunction({
@@ -2223,6 +2233,7 @@
2223
2233
  current,
2224
2234
  fallback,
2225
2235
  messages,
2236
+ decimalSeparator: vue.toRef(() => options?.decimalSeparator ?? inferDecimalSeparator(current, fallback)),
2226
2237
  t: createTranslateFunction(current, fallback, messages),
2227
2238
  n: createNumberFunction(current, fallback),
2228
2239
  provide: createProvideFunction({
@@ -2387,8 +2398,8 @@
2387
2398
  'activated-opacity': 0.12,
2388
2399
  'pressed-opacity': 0.12,
2389
2400
  'dragged-opacity': 0.08,
2390
- 'theme-kbd': '#212529',
2391
- 'theme-on-kbd': '#FFFFFF',
2401
+ 'theme-kbd': '#EEEEEE',
2402
+ 'theme-on-kbd': '#000000',
2392
2403
  'theme-code': '#F5F5F5',
2393
2404
  'theme-on-code': '#000000'
2394
2405
  }
@@ -2424,7 +2435,7 @@
2424
2435
  'activated-opacity': 0.12,
2425
2436
  'pressed-opacity': 0.16,
2426
2437
  'dragged-opacity': 0.08,
2427
- 'theme-kbd': '#212529',
2438
+ 'theme-kbd': '#424242',
2428
2439
  'theme-on-kbd': '#FFFFFF',
2429
2440
  'theme-code': '#343434',
2430
2441
  'theme-on-code': '#CCCCCC'
@@ -11634,6 +11645,7 @@
11634
11645
  // disableKeys: Boolean,
11635
11646
  id: String,
11636
11647
  submenu: Boolean,
11648
+ disableInitialFocus: Boolean,
11637
11649
  ...omit(makeVOverlayProps({
11638
11650
  closeDelay: 250,
11639
11651
  closeOnContentClick: true,
@@ -11708,7 +11720,7 @@
11708
11720
  vue.watch(isActive, val => {
11709
11721
  if (val) {
11710
11722
  parent?.register();
11711
- if (IN_BROWSER) {
11723
+ if (IN_BROWSER && !props.disableInitialFocus) {
11712
11724
  document.addEventListener('focusin', onFocusIn, {
11713
11725
  once: true
11714
11726
  });
@@ -23009,7 +23021,9 @@
23009
23021
  "max": maxDate.value,
23010
23022
  "year": year.value,
23011
23023
  "allowedMonths": allowedMonths
23012
- }), null) : viewMode.value === 'year' ? vue.createVNode(VDatePickerYears, vue.mergeProps({
23024
+ }), {
23025
+ ...pick(slots, ['month'])
23026
+ }) : viewMode.value === 'year' ? vue.createVNode(VDatePickerYears, vue.mergeProps({
23013
23027
  "key": "date-picker-years"
23014
23028
  }, datePickerYearsProps, {
23015
23029
  "modelValue": year.value,
@@ -23017,7 +23031,9 @@
23017
23031
  "min": minDate.value,
23018
23032
  "max": maxDate.value,
23019
23033
  "allowedYears": allowedYears
23020
- }), null) : vue.createVNode(VDatePickerMonth, vue.mergeProps({
23034
+ }), {
23035
+ ...pick(slots, ['year'])
23036
+ }) : vue.createVNode(VDatePickerMonth, vue.mergeProps({
23021
23037
  "key": "date-picker-month"
23022
23038
  }, datePickerMonthProps, {
23023
23039
  "modelValue": model.value,
@@ -23028,7 +23044,9 @@
23028
23044
  "onUpdate:year": [$event => year.value = $event, onUpdateYear],
23029
23045
  "min": minDate.value,
23030
23046
  "max": maxDate.value
23031
- }), null)]
23047
+ }), {
23048
+ ...pick(slots, ['day'])
23049
+ })]
23032
23050
  })]),
23033
23051
  actions: slots.actions
23034
23052
  });
@@ -24338,8 +24356,47 @@
24338
24356
  }
24339
24357
  });
24340
24358
 
24341
- // Styles
24342
- const VKbd = createSimpleFunctional('v-kbd', 'kbd');
24359
+ const makeVKbdProps = propsFactory({
24360
+ ...makeBorderProps(),
24361
+ ...makeComponentProps(),
24362
+ ...makeRoundedProps(),
24363
+ ...makeTagProps({
24364
+ tag: 'kbd'
24365
+ }),
24366
+ ...makeThemeProps(),
24367
+ ...makeElevationProps(),
24368
+ color: String
24369
+ }, 'VKbd');
24370
+ const VKbd = genericComponent()({
24371
+ name: 'VKbd',
24372
+ props: makeVKbdProps(),
24373
+ setup(props, _ref) {
24374
+ let {
24375
+ slots
24376
+ } = _ref;
24377
+ const {
24378
+ themeClasses
24379
+ } = provideTheme(props);
24380
+ const {
24381
+ borderClasses
24382
+ } = useBorder(props);
24383
+ const {
24384
+ roundedClasses
24385
+ } = useRounded(props);
24386
+ const {
24387
+ backgroundColorClasses,
24388
+ backgroundColorStyles
24389
+ } = useBackgroundColor(() => props.color);
24390
+ const {
24391
+ elevationClasses
24392
+ } = useElevation(props);
24393
+ useRender(() => vue.createVNode(props.tag, {
24394
+ "class": vue.normalizeClass(['v-kbd', themeClasses.value, backgroundColorClasses.value, borderClasses.value, elevationClasses.value, roundedClasses.value, props.class]),
24395
+ "style": vue.normalizeStyle([backgroundColorStyles.value, props.style])
24396
+ }, slots));
24397
+ return {};
24398
+ }
24399
+ });
24343
24400
 
24344
24401
  const makeVLayoutProps = propsFactory({
24345
24402
  ...makeComponentProps(),
@@ -25181,6 +25238,10 @@
25181
25238
  type: Number,
25182
25239
  default: null
25183
25240
  },
25241
+ decimalSeparator: {
25242
+ type: String,
25243
+ validator: v => !v || v.length === 1
25244
+ },
25184
25245
  ...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
25185
25246
  }, 'VNumberInput');
25186
25247
  const VNumberInput = genericComponent()({
@@ -25206,21 +25267,24 @@
25206
25267
  const form = useForm(props);
25207
25268
  const controlsDisabled = vue.computed(() => form.isDisabled.value || form.isReadonly.value);
25208
25269
  const isFocused = vue.shallowRef(props.focused);
25270
+ const {
25271
+ decimalSeparator: decimalSeparatorFromLocale
25272
+ } = useLocale();
25273
+ const decimalSeparator = vue.computed(() => props.decimalSeparator?.[0] || decimalSeparatorFromLocale.value);
25209
25274
  function correctPrecision(val) {
25210
25275
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
25211
- if (precision == null) {
25212
- return String(val);
25213
- }
25214
- let fixed = val.toFixed(precision);
25215
- if (isFocused.value) {
25216
- return Number(fixed).toString(); // trim zeros
25276
+ let trim = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
25277
+ const fixed = precision == null ? String(val) : val.toFixed(precision);
25278
+ if (isFocused.value && trim) {
25279
+ return Number(fixed).toString() // trim zeros
25280
+ .replace('.', decimalSeparator.value);
25217
25281
  }
25218
- if ((props.minFractionDigits ?? precision) < precision) {
25219
- const trimLimit = precision - props.minFractionDigits;
25220
- const [baseDigits, fractionDigits] = fixed.split('.');
25221
- fixed = [baseDigits, fractionDigits.replace(new RegExp(`0{1,${trimLimit}}$`), '')].filter(Boolean).join('.');
25282
+ if (props.minFractionDigits === null || precision !== null && precision < props.minFractionDigits) {
25283
+ return fixed.replace('.', decimalSeparator.value);
25222
25284
  }
25223
- return fixed;
25285
+ let [baseDigits, fractionDigits] = fixed.split('.');
25286
+ fractionDigits = (fractionDigits ?? '').padEnd(props.minFractionDigits, '0').replace(new RegExp(`(?<=\\d{${props.minFractionDigits}})0`, 'g'), '');
25287
+ return [baseDigits, fractionDigits].filter(Boolean).join(decimalSeparator.value);
25224
25288
  }
25225
25289
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
25226
25290
  const _inputText = vue.shallowRef(null);
@@ -25237,8 +25301,11 @@
25237
25301
  if (val === null || val === '') {
25238
25302
  model.value = null;
25239
25303
  _inputText.value = null;
25240
- } else if (!isNaN(Number(val)) && Number(val) <= props.max && Number(val) >= props.min) {
25241
- model.value = Number(val);
25304
+ return;
25305
+ }
25306
+ const parsedValue = Number(val.replace(decimalSeparator.value, '.'));
25307
+ if (!isNaN(parsedValue) && parsedValue <= props.max && parsedValue >= props.min) {
25308
+ model.value = parsedValue;
25242
25309
  _inputText.value = val;
25243
25310
  }
25244
25311
  }
@@ -25309,24 +25376,24 @@
25309
25376
  selectionEnd
25310
25377
  } = inputElement ?? {};
25311
25378
  const potentialNewInputVal = existingTxt ? existingTxt.slice(0, selectionStart) + e.data + existingTxt.slice(selectionEnd) : e.data;
25312
- const potentialNewNumber = extractNumber(potentialNewInputVal, props.precision);
25379
+ const potentialNewNumber = extractNumber(potentialNewInputVal, props.precision, decimalSeparator.value);
25313
25380
 
25314
- // Only numbers, "-", "." are allowed
25315
- // AND "-", "." are allowed only once
25316
- // AND "-" is only allowed at the start
25317
- if (!/^-?(\d+(\.\d*)?|(\.\d+)|\d*|\.)$/.test(potentialNewInputVal)) {
25381
+ // Allow only numbers, "-" and {decimal separator}
25382
+ // Allow "-" and {decimal separator} only once
25383
+ // Allow "-" only at the start
25384
+ if (!new RegExp(`^-?\\d*${escapeForRegex(decimalSeparator.value)}?\\d*$`).test(potentialNewInputVal)) {
25318
25385
  e.preventDefault();
25319
25386
  inputElement.value = potentialNewNumber;
25320
25387
  }
25321
25388
  if (props.precision == null) return;
25322
25389
 
25323
25390
  // Ignore decimal digits above precision limit
25324
- if (potentialNewInputVal.split('.')[1]?.length > props.precision) {
25391
+ if (potentialNewInputVal.split(decimalSeparator.value)[1]?.length > props.precision) {
25325
25392
  e.preventDefault();
25326
25393
  inputElement.value = potentialNewNumber;
25327
25394
  }
25328
25395
  // Ignore decimal separator when precision = 0
25329
- if (props.precision === 0 && potentialNewInputVal.includes('.')) {
25396
+ if (props.precision === 0 && potentialNewInputVal.includes(decimalSeparator.value)) {
25330
25397
  e.preventDefault();
25331
25398
  inputElement.value = potentialNewNumber;
25332
25399
  }
@@ -25378,19 +25445,16 @@
25378
25445
  if (controlsDisabled.value) return;
25379
25446
  if (!vTextFieldRef.value) return;
25380
25447
  const actualText = vTextFieldRef.value.value;
25381
- if (actualText && !isNaN(Number(actualText))) {
25382
- inputText.value = correctPrecision(clamp(Number(actualText), props.min, props.max));
25448
+ const parsedValue = Number(actualText.replace(decimalSeparator.value, '.'));
25449
+ if (actualText && !isNaN(parsedValue)) {
25450
+ inputText.value = correctPrecision(clamp(parsedValue, props.min, props.max));
25383
25451
  } else {
25384
25452
  inputText.value = null;
25385
25453
  }
25386
25454
  }
25387
25455
  function formatInputValue() {
25388
25456
  if (controlsDisabled.value) return;
25389
- if (model.value === null || isNaN(model.value)) {
25390
- inputText.value = null;
25391
- return;
25392
- }
25393
- inputText.value = correctPrecision(model.value);
25457
+ inputText.value = model.value !== null && !isNaN(model.value) ? correctPrecision(model.value, props.precision, false) : null;
25394
25458
  }
25395
25459
  function trimDecimalZeros() {
25396
25460
  if (controlsDisabled.value) return;
@@ -25398,7 +25462,7 @@
25398
25462
  inputText.value = null;
25399
25463
  return;
25400
25464
  }
25401
- inputText.value = model.value.toString();
25465
+ inputText.value = model.value.toString().replace('.', decimalSeparator.value);
25402
25466
  }
25403
25467
  function onFocus() {
25404
25468
  trimDecimalZeros();
@@ -32642,7 +32706,7 @@
32642
32706
  };
32643
32707
  });
32644
32708
  }
32645
- const version$1 = "3.8.9-dev.2025-06-12";
32709
+ const version$1 = "3.8.9-dev.2025-06-13";
32646
32710
  createVuetify$1.version = version$1;
32647
32711
 
32648
32712
  // Vue's inject() can only be used in setup
@@ -32940,7 +33004,7 @@
32940
33004
 
32941
33005
  /* eslint-disable local-rules/sort-imports */
32942
33006
 
32943
- const version = "3.8.9-dev.2025-06-12";
33007
+ const version = "3.8.9-dev.2025-06-13";
32944
33008
 
32945
33009
  /* eslint-disable local-rules/sort-imports */
32946
33010