@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
  */
@@ -511,18 +511,23 @@ function checkPrintable(e) {
511
511
  function isPrimitive(value) {
512
512
  return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint';
513
513
  }
514
- function extractNumber(text, decimalDigitsLimit) {
515
- const cleanText = text.split('').filter(x => /[\d\-.]/.test(x)).filter((x, i, all) => i === 0 && /[-]/.test(x) ||
514
+ function escapeForRegex(sign) {
515
+ return '\\^$*+?.()|{}[]'.includes(sign) ? `\\${sign}` : sign;
516
+ }
517
+ function extractNumber(text, decimalDigitsLimit, decimalSeparator) {
518
+ const onlyValidCharacters = new RegExp(`[\\d\\-${escapeForRegex(decimalSeparator)}]`);
519
+ const cleanText = text.split('').filter(x => onlyValidCharacters.test(x)).filter((x, i, all) => i === 0 && /[-]/.test(x) ||
516
520
  // sign allowed at the start
517
- x === '.' && i === all.indexOf('.') ||
521
+ x === decimalSeparator && i === all.indexOf(x) ||
518
522
  // decimal separator allowed only once
519
523
  /\d/.test(x)).join('');
520
524
  if (decimalDigitsLimit === 0) {
521
- return cleanText.split('.')[0];
525
+ return cleanText.split(decimalSeparator)[0];
522
526
  }
523
- if (decimalDigitsLimit !== null && /\.\d/.test(cleanText)) {
524
- const parts = cleanText.split('.');
525
- return [parts[0], parts[1].substring(0, decimalDigitsLimit)].join('.');
527
+ const decimalPart = new RegExp(`${escapeForRegex(decimalSeparator)}\\d`);
528
+ if (decimalDigitsLimit !== null && decimalPart.test(cleanText)) {
529
+ const parts = cleanText.split(decimalSeparator);
530
+ return [parts[0], parts[1].substring(0, decimalDigitsLimit)].join(decimalSeparator);
526
531
  }
527
532
  return cleanText;
528
533
  }
@@ -2662,6 +2667,10 @@ function createNumberFunction(current, fallback) {
2662
2667
  return numberFormat.format(value);
2663
2668
  };
2664
2669
  }
2670
+ function inferDecimalSeparator(current, fallback) {
2671
+ const format = createNumberFunction(current, fallback);
2672
+ return format(0.1).includes(',') ? ',' : '.';
2673
+ }
2665
2674
  function useProvided(props, prop, provided) {
2666
2675
  const internal = useProxiedModel(props, prop, props[prop] ?? provided.value);
2667
2676
 
@@ -2684,6 +2693,7 @@ function createProvideFunction(state) {
2684
2693
  current,
2685
2694
  fallback,
2686
2695
  messages,
2696
+ decimalSeparator: toRef(() => inferDecimalSeparator(current, fallback)),
2687
2697
  t: createTranslateFunction(current, fallback, messages),
2688
2698
  n: createNumberFunction(current, fallback),
2689
2699
  provide: createProvideFunction({
@@ -2706,6 +2716,7 @@ function createVuetifyAdapter(options) {
2706
2716
  current,
2707
2717
  fallback,
2708
2718
  messages,
2719
+ decimalSeparator: toRef(() => options?.decimalSeparator ?? inferDecimalSeparator(current, fallback)),
2709
2720
  t: createTranslateFunction(current, fallback, messages),
2710
2721
  n: createNumberFunction(current, fallback),
2711
2722
  provide: createProvideFunction({
@@ -2870,8 +2881,8 @@ function genDefaults$1() {
2870
2881
  'activated-opacity': 0.12,
2871
2882
  'pressed-opacity': 0.12,
2872
2883
  'dragged-opacity': 0.08,
2873
- 'theme-kbd': '#212529',
2874
- 'theme-on-kbd': '#FFFFFF',
2884
+ 'theme-kbd': '#EEEEEE',
2885
+ 'theme-on-kbd': '#000000',
2875
2886
  'theme-code': '#F5F5F5',
2876
2887
  'theme-on-code': '#000000'
2877
2888
  }
@@ -2907,7 +2918,7 @@ function genDefaults$1() {
2907
2918
  'activated-opacity': 0.12,
2908
2919
  'pressed-opacity': 0.16,
2909
2920
  'dragged-opacity': 0.08,
2910
- 'theme-kbd': '#212529',
2921
+ 'theme-kbd': '#424242',
2911
2922
  'theme-on-kbd': '#FFFFFF',
2912
2923
  'theme-code': '#343434',
2913
2924
  'theme-on-code': '#CCCCCC'
@@ -11908,6 +11919,7 @@ const makeVMenuProps = propsFactory({
11908
11919
  // disableKeys: Boolean,
11909
11920
  id: String,
11910
11921
  submenu: Boolean,
11922
+ disableInitialFocus: Boolean,
11911
11923
  ...omit(makeVOverlayProps({
11912
11924
  closeDelay: 250,
11913
11925
  closeOnContentClick: true,
@@ -11982,7 +11994,7 @@ const VMenu = genericComponent()({
11982
11994
  watch(isActive, val => {
11983
11995
  if (val) {
11984
11996
  parent?.register();
11985
- if (IN_BROWSER) {
11997
+ if (IN_BROWSER && !props.disableInitialFocus) {
11986
11998
  document.addEventListener('focusin', onFocusIn, {
11987
11999
  once: true
11988
12000
  });
@@ -23283,7 +23295,9 @@ const VDatePicker = genericComponent()({
23283
23295
  "max": maxDate.value,
23284
23296
  "year": year.value,
23285
23297
  "allowedMonths": allowedMonths
23286
- }), null) : viewMode.value === 'year' ? createVNode(VDatePickerYears, mergeProps({
23298
+ }), {
23299
+ ...pick(slots, ['month'])
23300
+ }) : viewMode.value === 'year' ? createVNode(VDatePickerYears, mergeProps({
23287
23301
  "key": "date-picker-years"
23288
23302
  }, datePickerYearsProps, {
23289
23303
  "modelValue": year.value,
@@ -23291,7 +23305,9 @@ const VDatePicker = genericComponent()({
23291
23305
  "min": minDate.value,
23292
23306
  "max": maxDate.value,
23293
23307
  "allowedYears": allowedYears
23294
- }), null) : createVNode(VDatePickerMonth, mergeProps({
23308
+ }), {
23309
+ ...pick(slots, ['year'])
23310
+ }) : createVNode(VDatePickerMonth, mergeProps({
23295
23311
  "key": "date-picker-month"
23296
23312
  }, datePickerMonthProps, {
23297
23313
  "modelValue": model.value,
@@ -23302,7 +23318,9 @@ const VDatePicker = genericComponent()({
23302
23318
  "onUpdate:year": [$event => year.value = $event, onUpdateYear],
23303
23319
  "min": minDate.value,
23304
23320
  "max": maxDate.value
23305
- }), null)]
23321
+ }), {
23322
+ ...pick(slots, ['day'])
23323
+ })]
23306
23324
  })]),
23307
23325
  actions: slots.actions
23308
23326
  });
@@ -24612,8 +24630,47 @@ const VItem = genericComponent()({
24612
24630
  }
24613
24631
  });
24614
24632
 
24615
- // Styles
24616
- const VKbd = createSimpleFunctional('v-kbd', 'kbd');
24633
+ const makeVKbdProps = propsFactory({
24634
+ ...makeBorderProps(),
24635
+ ...makeComponentProps(),
24636
+ ...makeRoundedProps(),
24637
+ ...makeTagProps({
24638
+ tag: 'kbd'
24639
+ }),
24640
+ ...makeThemeProps(),
24641
+ ...makeElevationProps(),
24642
+ color: String
24643
+ }, 'VKbd');
24644
+ const VKbd = genericComponent()({
24645
+ name: 'VKbd',
24646
+ props: makeVKbdProps(),
24647
+ setup(props, _ref) {
24648
+ let {
24649
+ slots
24650
+ } = _ref;
24651
+ const {
24652
+ themeClasses
24653
+ } = provideTheme(props);
24654
+ const {
24655
+ borderClasses
24656
+ } = useBorder(props);
24657
+ const {
24658
+ roundedClasses
24659
+ } = useRounded(props);
24660
+ const {
24661
+ backgroundColorClasses,
24662
+ backgroundColorStyles
24663
+ } = useBackgroundColor(() => props.color);
24664
+ const {
24665
+ elevationClasses
24666
+ } = useElevation(props);
24667
+ useRender(() => createVNode(props.tag, {
24668
+ "class": normalizeClass(['v-kbd', themeClasses.value, backgroundColorClasses.value, borderClasses.value, elevationClasses.value, roundedClasses.value, props.class]),
24669
+ "style": normalizeStyle([backgroundColorStyles.value, props.style])
24670
+ }, slots));
24671
+ return {};
24672
+ }
24673
+ });
24617
24674
 
24618
24675
  const makeVLayoutProps = propsFactory({
24619
24676
  ...makeComponentProps(),
@@ -25455,6 +25512,10 @@ const makeVNumberInputProps = propsFactory({
25455
25512
  type: Number,
25456
25513
  default: null
25457
25514
  },
25515
+ decimalSeparator: {
25516
+ type: String,
25517
+ validator: v => !v || v.length === 1
25518
+ },
25458
25519
  ...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
25459
25520
  }, 'VNumberInput');
25460
25521
  const VNumberInput = genericComponent()({
@@ -25480,21 +25541,24 @@ const VNumberInput = genericComponent()({
25480
25541
  const form = useForm(props);
25481
25542
  const controlsDisabled = computed(() => form.isDisabled.value || form.isReadonly.value);
25482
25543
  const isFocused = shallowRef(props.focused);
25544
+ const {
25545
+ decimalSeparator: decimalSeparatorFromLocale
25546
+ } = useLocale();
25547
+ const decimalSeparator = computed(() => props.decimalSeparator?.[0] || decimalSeparatorFromLocale.value);
25483
25548
  function correctPrecision(val) {
25484
25549
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
25485
- if (precision == null) {
25486
- return String(val);
25487
- }
25488
- let fixed = val.toFixed(precision);
25489
- if (isFocused.value) {
25490
- return Number(fixed).toString(); // trim zeros
25550
+ let trim = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
25551
+ const fixed = precision == null ? String(val) : val.toFixed(precision);
25552
+ if (isFocused.value && trim) {
25553
+ return Number(fixed).toString() // trim zeros
25554
+ .replace('.', decimalSeparator.value);
25491
25555
  }
25492
- if ((props.minFractionDigits ?? precision) < precision) {
25493
- const trimLimit = precision - props.minFractionDigits;
25494
- const [baseDigits, fractionDigits] = fixed.split('.');
25495
- fixed = [baseDigits, fractionDigits.replace(new RegExp(`0{1,${trimLimit}}$`), '')].filter(Boolean).join('.');
25556
+ if (props.minFractionDigits === null || precision !== null && precision < props.minFractionDigits) {
25557
+ return fixed.replace('.', decimalSeparator.value);
25496
25558
  }
25497
- return fixed;
25559
+ let [baseDigits, fractionDigits] = fixed.split('.');
25560
+ fractionDigits = (fractionDigits ?? '').padEnd(props.minFractionDigits, '0').replace(new RegExp(`(?<=\\d{${props.minFractionDigits}})0`, 'g'), '');
25561
+ return [baseDigits, fractionDigits].filter(Boolean).join(decimalSeparator.value);
25498
25562
  }
25499
25563
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
25500
25564
  const _inputText = shallowRef(null);
@@ -25511,8 +25575,11 @@ const VNumberInput = genericComponent()({
25511
25575
  if (val === null || val === '') {
25512
25576
  model.value = null;
25513
25577
  _inputText.value = null;
25514
- } else if (!isNaN(Number(val)) && Number(val) <= props.max && Number(val) >= props.min) {
25515
- model.value = Number(val);
25578
+ return;
25579
+ }
25580
+ const parsedValue = Number(val.replace(decimalSeparator.value, '.'));
25581
+ if (!isNaN(parsedValue) && parsedValue <= props.max && parsedValue >= props.min) {
25582
+ model.value = parsedValue;
25516
25583
  _inputText.value = val;
25517
25584
  }
25518
25585
  }
@@ -25583,24 +25650,24 @@ const VNumberInput = genericComponent()({
25583
25650
  selectionEnd
25584
25651
  } = inputElement ?? {};
25585
25652
  const potentialNewInputVal = existingTxt ? existingTxt.slice(0, selectionStart) + e.data + existingTxt.slice(selectionEnd) : e.data;
25586
- const potentialNewNumber = extractNumber(potentialNewInputVal, props.precision);
25653
+ const potentialNewNumber = extractNumber(potentialNewInputVal, props.precision, decimalSeparator.value);
25587
25654
 
25588
- // Only numbers, "-", "." are allowed
25589
- // AND "-", "." are allowed only once
25590
- // AND "-" is only allowed at the start
25591
- if (!/^-?(\d+(\.\d*)?|(\.\d+)|\d*|\.)$/.test(potentialNewInputVal)) {
25655
+ // Allow only numbers, "-" and {decimal separator}
25656
+ // Allow "-" and {decimal separator} only once
25657
+ // Allow "-" only at the start
25658
+ if (!new RegExp(`^-?\\d*${escapeForRegex(decimalSeparator.value)}?\\d*$`).test(potentialNewInputVal)) {
25592
25659
  e.preventDefault();
25593
25660
  inputElement.value = potentialNewNumber;
25594
25661
  }
25595
25662
  if (props.precision == null) return;
25596
25663
 
25597
25664
  // Ignore decimal digits above precision limit
25598
- if (potentialNewInputVal.split('.')[1]?.length > props.precision) {
25665
+ if (potentialNewInputVal.split(decimalSeparator.value)[1]?.length > props.precision) {
25599
25666
  e.preventDefault();
25600
25667
  inputElement.value = potentialNewNumber;
25601
25668
  }
25602
25669
  // Ignore decimal separator when precision = 0
25603
- if (props.precision === 0 && potentialNewInputVal.includes('.')) {
25670
+ if (props.precision === 0 && potentialNewInputVal.includes(decimalSeparator.value)) {
25604
25671
  e.preventDefault();
25605
25672
  inputElement.value = potentialNewNumber;
25606
25673
  }
@@ -25652,19 +25719,16 @@ const VNumberInput = genericComponent()({
25652
25719
  if (controlsDisabled.value) return;
25653
25720
  if (!vTextFieldRef.value) return;
25654
25721
  const actualText = vTextFieldRef.value.value;
25655
- if (actualText && !isNaN(Number(actualText))) {
25656
- inputText.value = correctPrecision(clamp(Number(actualText), props.min, props.max));
25722
+ const parsedValue = Number(actualText.replace(decimalSeparator.value, '.'));
25723
+ if (actualText && !isNaN(parsedValue)) {
25724
+ inputText.value = correctPrecision(clamp(parsedValue, props.min, props.max));
25657
25725
  } else {
25658
25726
  inputText.value = null;
25659
25727
  }
25660
25728
  }
25661
25729
  function formatInputValue() {
25662
25730
  if (controlsDisabled.value) return;
25663
- if (model.value === null || isNaN(model.value)) {
25664
- inputText.value = null;
25665
- return;
25666
- }
25667
- inputText.value = correctPrecision(model.value);
25731
+ inputText.value = model.value !== null && !isNaN(model.value) ? correctPrecision(model.value, props.precision, false) : null;
25668
25732
  }
25669
25733
  function trimDecimalZeros() {
25670
25734
  if (controlsDisabled.value) return;
@@ -25672,7 +25736,7 @@ const VNumberInput = genericComponent()({
25672
25736
  inputText.value = null;
25673
25737
  return;
25674
25738
  }
25675
- inputText.value = model.value.toString();
25739
+ inputText.value = model.value.toString().replace('.', decimalSeparator.value);
25676
25740
  }
25677
25741
  function onFocus() {
25678
25742
  trimDecimalZeros();
@@ -29712,7 +29776,7 @@ function createVuetify$1() {
29712
29776
  };
29713
29777
  });
29714
29778
  }
29715
- const version$1 = "3.8.9-dev.2025-06-12";
29779
+ const version$1 = "3.8.9-dev.2025-06-13";
29716
29780
  createVuetify$1.version = version$1;
29717
29781
 
29718
29782
  // Vue's inject() can only be used in setup
@@ -29737,7 +29801,7 @@ const createVuetify = function () {
29737
29801
  ...options
29738
29802
  });
29739
29803
  };
29740
- const version = "3.8.9-dev.2025-06-12";
29804
+ const version = "3.8.9-dev.2025-06-13";
29741
29805
  createVuetify.version = version;
29742
29806
 
29743
29807
  export { index as blueprints, components, createVuetify, directives, useDate, useDefaults, useDisplay, useGoTo, useLayout, useLocale, useRtl, useTheme, version };