@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
@@ -39,6 +39,7 @@ export declare const makeVMenuProps: <Defaults extends {
39
39
  attach?: unknown;
40
40
  id?: unknown;
41
41
  submenu?: unknown;
42
+ disableInitialFocus?: unknown;
42
43
  } = {}>(defaults?: Defaults | undefined) => {
43
44
  offset: unknown extends Defaults["offset"] ? import("vue").PropType<string | number | number[] | undefined> : {
44
45
  type: import("vue").PropType<unknown extends Defaults["offset"] ? string | number | number[] | undefined : string | number | number[] | Defaults["offset"] | undefined>;
@@ -770,6 +771,10 @@ export declare const makeVMenuProps: <Defaults extends {
770
771
  type: import("vue").PropType<unknown extends Defaults["submenu"] ? boolean : boolean | Defaults["submenu"]>;
771
772
  default: unknown extends Defaults["submenu"] ? boolean : boolean | Defaults["submenu"];
772
773
  };
774
+ disableInitialFocus: unknown extends Defaults["disableInitialFocus"] ? BooleanConstructor : {
775
+ type: import("vue").PropType<unknown extends Defaults["disableInitialFocus"] ? boolean : boolean | Defaults["disableInitialFocus"]>;
776
+ default: unknown extends Defaults["disableInitialFocus"] ? boolean : boolean | Defaults["disableInitialFocus"];
777
+ };
773
778
  };
774
779
  export declare const VMenu: {
775
780
  new (...args: any[]): import("vue").CreateComponentPublicInstanceWithMixins<{
@@ -851,6 +856,7 @@ export declare const VMenu: {
851
856
  noClickAnimation: boolean;
852
857
  scrim: string | boolean;
853
858
  submenu: boolean;
859
+ disableInitialFocus: boolean;
854
860
  } & {
855
861
  offset?: string | number | number[] | undefined;
856
862
  id?: string | undefined;
@@ -1387,6 +1393,7 @@ export declare const VMenu: {
1387
1393
  noClickAnimation: boolean;
1388
1394
  scrim: string | boolean;
1389
1395
  submenu: boolean;
1396
+ disableInitialFocus: boolean;
1390
1397
  }, true, {}, import("vue").SlotsType<Partial<{
1391
1398
  default: (arg: {
1392
1399
  isActive: import("vue").Ref<boolean>;
@@ -1482,6 +1489,7 @@ export declare const VMenu: {
1482
1489
  noClickAnimation: boolean;
1483
1490
  scrim: string | boolean;
1484
1491
  submenu: boolean;
1492
+ disableInitialFocus: boolean;
1485
1493
  } & {
1486
1494
  offset?: string | number | number[] | undefined;
1487
1495
  id?: string | undefined;
@@ -2016,6 +2024,7 @@ export declare const VMenu: {
2016
2024
  noClickAnimation: boolean;
2017
2025
  scrim: string | boolean;
2018
2026
  submenu: boolean;
2027
+ disableInitialFocus: boolean;
2019
2028
  }>;
2020
2029
  __isFragment?: never;
2021
2030
  __isTeleport?: never;
@@ -2099,6 +2108,7 @@ export declare const VMenu: {
2099
2108
  noClickAnimation: boolean;
2100
2109
  scrim: string | boolean;
2101
2110
  submenu: boolean;
2111
+ disableInitialFocus: boolean;
2102
2112
  } & {
2103
2113
  offset?: string | number | number[] | undefined;
2104
2114
  id?: string | undefined;
@@ -2635,6 +2645,7 @@ export declare const VMenu: {
2635
2645
  noClickAnimation: boolean;
2636
2646
  scrim: string | boolean;
2637
2647
  submenu: boolean;
2648
+ disableInitialFocus: boolean;
2638
2649
  }, {}, string, import("vue").SlotsType<Partial<{
2639
2650
  default: (arg: {
2640
2651
  isActive: import("vue").Ref<boolean>;
@@ -2857,6 +2868,7 @@ export declare const VMenu: {
2857
2868
  attach: import("vue").PropType<boolean | string | Element>;
2858
2869
  id: StringConstructor;
2859
2870
  submenu: BooleanConstructor;
2871
+ disableInitialFocus: BooleanConstructor;
2860
2872
  }, import("vue").ExtractPropTypes<{
2861
2873
  offset: import("vue").PropType<import("../VOverlay/locationStrategies.js").StrategyProps["offset"]>;
2862
2874
  location: Omit<{
@@ -3070,5 +3082,6 @@ export declare const VMenu: {
3070
3082
  attach: import("vue").PropType<boolean | string | Element>;
3071
3083
  id: StringConstructor;
3072
3084
  submenu: BooleanConstructor;
3085
+ disableInitialFocus: BooleanConstructor;
3073
3086
  }>>;
3074
3087
  export type VMenu = InstanceType<typeof VMenu>;
@@ -19,6 +19,7 @@ export const makeVMenuProps = propsFactory({
19
19
  // disableKeys: Boolean,
20
20
  id: String,
21
21
  submenu: Boolean,
22
+ disableInitialFocus: Boolean,
22
23
  ...omit(makeVOverlayProps({
23
24
  closeDelay: 250,
24
25
  closeOnContentClick: true,
@@ -93,7 +94,7 @@ export const VMenu = genericComponent()({
93
94
  watch(isActive, val => {
94
95
  if (val) {
95
96
  parent?.register();
96
- if (IN_BROWSER) {
97
+ if (IN_BROWSER && !props.disableInitialFocus) {
97
98
  document.addEventListener('focusin', onFocusIn, {
98
99
  once: true
99
100
  });
@@ -1 +1 @@
1
- {"version":3,"file":"VMenu.js","names":["VDialogTransition","VDefaultsProvider","VOverlay","makeVOverlayProps","forwardRefs","useRtl","useProxiedModel","useScopeId","computed","inject","mergeProps","nextTick","onBeforeUnmount","onDeactivated","provide","ref","shallowRef","toRef","useId","watch","VMenuSymbol","focusableChildren","focusChild","genericComponent","getNextElement","IN_BROWSER","isClickInsideElement","omit","propsFactory","useRender","makeVMenuProps","id","String","submenu","Boolean","closeDelay","closeOnContentClick","locationStrategy","location","undefined","openDelay","scrim","scrollStrategy","transition","component","VMenu","name","props","emits","value","setup","_ref","slots","isActive","scopeId","isRtl","uid","overlay","parent","openChildren","Set","register","add","unregister","delete","closeParents","e","setTimeout","size","persistent","contentEl","document","removeEventListener","onFocusIn","before","relatedTarget","after","target","globalTop","includes","contains","focusable","focus","val","addEventListener","once","immediate","onClickOutside","onKeydown","disabled","key","HTMLTextAreaElement","HTMLInputElement","closest","preventDefault","nextElement","shiftKey","el","tabIndex","activatorEl","onActivatorKeydown","stopImmediatePropagation","activatorProps","overlayProps","filterProps","_createVNode","_mergeProps","class","style","$event","activator","default","_len","arguments","length","args","Array","_key","ΨopenChildren"],"sources":["../../../src/components/VMenu/VMenu.tsx"],"sourcesContent":["// Styles\nimport './VMenu.sass'\n\n// Components\nimport { VDialogTransition } from '@/components/transitions'\nimport { VDefaultsProvider } from '@/components/VDefaultsProvider'\nimport { VOverlay } from '@/components/VOverlay'\nimport { makeVOverlayProps } from '@/components/VOverlay/VOverlay'\n\n// Composables\nimport { forwardRefs } from '@/composables/forwardRefs'\nimport { useRtl } from '@/composables/locale'\nimport { useProxiedModel } from '@/composables/proxiedModel'\nimport { useScopeId } from '@/composables/scopeId'\n\n// Utilities\nimport {\n computed,\n inject,\n mergeProps,\n nextTick,\n onBeforeUnmount,\n onDeactivated,\n provide,\n ref,\n shallowRef, toRef,\n useId,\n watch,\n} from 'vue'\nimport { VMenuSymbol } from './shared'\nimport {\n focusableChildren,\n focusChild,\n genericComponent,\n getNextElement,\n IN_BROWSER,\n isClickInsideElement,\n omit,\n propsFactory,\n useRender,\n} from '@/util'\n\n// Types\nimport type { OverlaySlots } from '@/components/VOverlay/VOverlay'\n\nexport const makeVMenuProps = propsFactory({\n // TODO\n // disableKeys: Boolean,\n id: String,\n submenu: Boolean,\n\n ...omit(makeVOverlayProps({\n closeDelay: 250,\n closeOnContentClick: true,\n locationStrategy: 'connected' as const,\n location: undefined,\n openDelay: 300,\n scrim: false,\n scrollStrategy: 'reposition' as const,\n transition: { component: VDialogTransition },\n }), ['absolute']),\n}, 'VMenu')\n\nexport const VMenu = genericComponent<OverlaySlots>()({\n name: 'VMenu',\n\n props: makeVMenuProps(),\n\n emits: {\n 'update:modelValue': (value: boolean) => true,\n },\n\n setup (props, { slots }) {\n const isActive = useProxiedModel(props, 'modelValue')\n const { scopeId } = useScopeId()\n const { isRtl } = useRtl()\n\n const uid = useId()\n const id = toRef(() => props.id || `v-menu-${uid}`)\n\n const overlay = ref<VOverlay>()\n\n const parent = inject(VMenuSymbol, null)\n const openChildren = shallowRef(new Set<string>())\n provide(VMenuSymbol, {\n register () {\n openChildren.value.add(uid)\n },\n unregister () {\n openChildren.value.delete(uid)\n },\n closeParents (e) {\n setTimeout(() => {\n if (!openChildren.value.size &&\n !props.persistent &&\n (e == null || (overlay.value?.contentEl && !isClickInsideElement(e, overlay.value.contentEl)))\n ) {\n isActive.value = false\n parent?.closeParents()\n }\n }, 40)\n },\n })\n\n onBeforeUnmount(() => {\n parent?.unregister()\n document.removeEventListener('focusin', onFocusIn)\n })\n onDeactivated(() => isActive.value = false)\n\n async function onFocusIn (e: FocusEvent) {\n const before = e.relatedTarget as HTMLElement | null\n const after = e.target as HTMLElement | null\n\n await nextTick()\n\n if (\n isActive.value &&\n before !== after &&\n overlay.value?.contentEl &&\n // We're the topmost menu\n overlay.value?.globalTop &&\n // It isn't the document or the menu body\n ![document, overlay.value.contentEl].includes(after!) &&\n // It isn't inside the menu body\n !overlay.value.contentEl.contains(after)\n ) {\n const focusable = focusableChildren(overlay.value.contentEl)\n focusable[0]?.focus()\n }\n }\n\n watch(isActive, val => {\n if (val) {\n parent?.register()\n if (IN_BROWSER) {\n document.addEventListener('focusin', onFocusIn, { once: true })\n }\n } else {\n parent?.unregister()\n if (IN_BROWSER) {\n document.removeEventListener('focusin', onFocusIn)\n }\n }\n }, { immediate: true })\n\n function onClickOutside (e: MouseEvent) {\n parent?.closeParents(e)\n }\n\n function onKeydown (e: KeyboardEvent) {\n if (props.disabled) return\n\n if (e.key === 'Tab' || (e.key === 'Enter' && !props.closeOnContentClick)) {\n if (\n e.key === 'Enter' &&\n ((e.target instanceof HTMLTextAreaElement) ||\n (e.target instanceof HTMLInputElement && !!e.target.closest('form')))\n ) return\n if (e.key === 'Enter') e.preventDefault()\n\n const nextElement = getNextElement(\n focusableChildren(overlay.value?.contentEl as Element, false),\n e.shiftKey ? 'prev' : 'next',\n (el: HTMLElement) => el.tabIndex >= 0\n )\n if (!nextElement) {\n isActive.value = false\n overlay.value?.activatorEl?.focus()\n }\n } else if (props.submenu && e.key === (isRtl.value ? 'ArrowRight' : 'ArrowLeft')) {\n isActive.value = false\n overlay.value?.activatorEl?.focus()\n }\n }\n\n function onActivatorKeydown (e: KeyboardEvent) {\n if (props.disabled) return\n\n const el = overlay.value?.contentEl\n if (el && isActive.value) {\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n e.stopImmediatePropagation()\n focusChild(el, 'next')\n } else if (e.key === 'ArrowUp') {\n e.preventDefault()\n e.stopImmediatePropagation()\n focusChild(el, 'prev')\n } else if (props.submenu) {\n if (e.key === (isRtl.value ? 'ArrowRight' : 'ArrowLeft')) {\n isActive.value = false\n } else if (e.key === (isRtl.value ? 'ArrowLeft' : 'ArrowRight')) {\n e.preventDefault()\n focusChild(el, 'first')\n }\n }\n } else if (\n props.submenu\n ? e.key === (isRtl.value ? 'ArrowLeft' : 'ArrowRight')\n : ['ArrowDown', 'ArrowUp'].includes(e.key)\n ) {\n isActive.value = true\n e.preventDefault()\n setTimeout(() => setTimeout(() => onActivatorKeydown(e)))\n }\n }\n\n const activatorProps = computed(() =>\n mergeProps({\n 'aria-haspopup': 'menu',\n 'aria-expanded': String(isActive.value),\n 'aria-controls': id.value,\n onKeydown: onActivatorKeydown,\n }, props.activatorProps)\n )\n\n useRender(() => {\n const overlayProps = VOverlay.filterProps(props)\n\n return (\n <VOverlay\n ref={ overlay }\n id={ id.value }\n class={[\n 'v-menu',\n props.class,\n ]}\n style={ props.style }\n { ...overlayProps }\n v-model={ isActive.value }\n absolute\n activatorProps={ activatorProps.value }\n location={ props.location ?? (props.submenu ? 'end' : 'bottom') }\n onClick:outside={ onClickOutside }\n onKeydown={ onKeydown }\n { ...scopeId }\n >\n {{\n activator: slots.activator,\n default: (...args) => (\n <VDefaultsProvider root=\"VMenu\">\n { slots.default?.(...args) }\n </VDefaultsProvider>\n ),\n }}\n </VOverlay>\n )\n })\n\n return forwardRefs({ id, ΨopenChildren: openChildren }, overlay)\n },\n})\n\nexport type VMenu = InstanceType<typeof VMenu>\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"VMenu.js","names":["VDialogTransition","VDefaultsProvider","VOverlay","makeVOverlayProps","forwardRefs","useRtl","useProxiedModel","useScopeId","computed","inject","mergeProps","nextTick","onBeforeUnmount","onDeactivated","provide","ref","shallowRef","toRef","useId","watch","VMenuSymbol","focusableChildren","focusChild","genericComponent","getNextElement","IN_BROWSER","isClickInsideElement","omit","propsFactory","useRender","makeVMenuProps","id","String","submenu","Boolean","disableInitialFocus","closeDelay","closeOnContentClick","locationStrategy","location","undefined","openDelay","scrim","scrollStrategy","transition","component","VMenu","name","props","emits","value","setup","_ref","slots","isActive","scopeId","isRtl","uid","overlay","parent","openChildren","Set","register","add","unregister","delete","closeParents","e","setTimeout","size","persistent","contentEl","document","removeEventListener","onFocusIn","before","relatedTarget","after","target","globalTop","includes","contains","focusable","focus","val","addEventListener","once","immediate","onClickOutside","onKeydown","disabled","key","HTMLTextAreaElement","HTMLInputElement","closest","preventDefault","nextElement","shiftKey","el","tabIndex","activatorEl","onActivatorKeydown","stopImmediatePropagation","activatorProps","overlayProps","filterProps","_createVNode","_mergeProps","class","style","$event","activator","default","_len","arguments","length","args","Array","_key","ΨopenChildren"],"sources":["../../../src/components/VMenu/VMenu.tsx"],"sourcesContent":["// Styles\nimport './VMenu.sass'\n\n// Components\nimport { VDialogTransition } from '@/components/transitions'\nimport { VDefaultsProvider } from '@/components/VDefaultsProvider'\nimport { VOverlay } from '@/components/VOverlay'\nimport { makeVOverlayProps } from '@/components/VOverlay/VOverlay'\n\n// Composables\nimport { forwardRefs } from '@/composables/forwardRefs'\nimport { useRtl } from '@/composables/locale'\nimport { useProxiedModel } from '@/composables/proxiedModel'\nimport { useScopeId } from '@/composables/scopeId'\n\n// Utilities\nimport {\n computed,\n inject,\n mergeProps,\n nextTick,\n onBeforeUnmount,\n onDeactivated,\n provide,\n ref,\n shallowRef, toRef,\n useId,\n watch,\n} from 'vue'\nimport { VMenuSymbol } from './shared'\nimport {\n focusableChildren,\n focusChild,\n genericComponent,\n getNextElement,\n IN_BROWSER,\n isClickInsideElement,\n omit,\n propsFactory,\n useRender,\n} from '@/util'\n\n// Types\nimport type { OverlaySlots } from '@/components/VOverlay/VOverlay'\n\nexport const makeVMenuProps = propsFactory({\n // TODO\n // disableKeys: Boolean,\n id: String,\n submenu: Boolean,\n disableInitialFocus: Boolean,\n\n ...omit(makeVOverlayProps({\n closeDelay: 250,\n closeOnContentClick: true,\n locationStrategy: 'connected' as const,\n location: undefined,\n openDelay: 300,\n scrim: false,\n scrollStrategy: 'reposition' as const,\n transition: { component: VDialogTransition },\n }), ['absolute']),\n}, 'VMenu')\n\nexport const VMenu = genericComponent<OverlaySlots>()({\n name: 'VMenu',\n\n props: makeVMenuProps(),\n\n emits: {\n 'update:modelValue': (value: boolean) => true,\n },\n\n setup (props, { slots }) {\n const isActive = useProxiedModel(props, 'modelValue')\n const { scopeId } = useScopeId()\n const { isRtl } = useRtl()\n\n const uid = useId()\n const id = toRef(() => props.id || `v-menu-${uid}`)\n\n const overlay = ref<VOverlay>()\n\n const parent = inject(VMenuSymbol, null)\n const openChildren = shallowRef(new Set<string>())\n provide(VMenuSymbol, {\n register () {\n openChildren.value.add(uid)\n },\n unregister () {\n openChildren.value.delete(uid)\n },\n closeParents (e) {\n setTimeout(() => {\n if (!openChildren.value.size &&\n !props.persistent &&\n (e == null || (overlay.value?.contentEl && !isClickInsideElement(e, overlay.value.contentEl)))\n ) {\n isActive.value = false\n parent?.closeParents()\n }\n }, 40)\n },\n })\n\n onBeforeUnmount(() => {\n parent?.unregister()\n document.removeEventListener('focusin', onFocusIn)\n })\n onDeactivated(() => isActive.value = false)\n\n async function onFocusIn (e: FocusEvent) {\n const before = e.relatedTarget as HTMLElement | null\n const after = e.target as HTMLElement | null\n\n await nextTick()\n\n if (\n isActive.value &&\n before !== after &&\n overlay.value?.contentEl &&\n // We're the topmost menu\n overlay.value?.globalTop &&\n // It isn't the document or the menu body\n ![document, overlay.value.contentEl].includes(after!) &&\n // It isn't inside the menu body\n !overlay.value.contentEl.contains(after)\n ) {\n const focusable = focusableChildren(overlay.value.contentEl)\n focusable[0]?.focus()\n }\n }\n\n watch(isActive, val => {\n if (val) {\n parent?.register()\n if (IN_BROWSER && !props.disableInitialFocus) {\n document.addEventListener('focusin', onFocusIn, { once: true })\n }\n } else {\n parent?.unregister()\n if (IN_BROWSER) {\n document.removeEventListener('focusin', onFocusIn)\n }\n }\n }, { immediate: true })\n\n function onClickOutside (e: MouseEvent) {\n parent?.closeParents(e)\n }\n\n function onKeydown (e: KeyboardEvent) {\n if (props.disabled) return\n\n if (e.key === 'Tab' || (e.key === 'Enter' && !props.closeOnContentClick)) {\n if (\n e.key === 'Enter' &&\n ((e.target instanceof HTMLTextAreaElement) ||\n (e.target instanceof HTMLInputElement && !!e.target.closest('form')))\n ) return\n if (e.key === 'Enter') e.preventDefault()\n\n const nextElement = getNextElement(\n focusableChildren(overlay.value?.contentEl as Element, false),\n e.shiftKey ? 'prev' : 'next',\n (el: HTMLElement) => el.tabIndex >= 0\n )\n if (!nextElement) {\n isActive.value = false\n overlay.value?.activatorEl?.focus()\n }\n } else if (props.submenu && e.key === (isRtl.value ? 'ArrowRight' : 'ArrowLeft')) {\n isActive.value = false\n overlay.value?.activatorEl?.focus()\n }\n }\n\n function onActivatorKeydown (e: KeyboardEvent) {\n if (props.disabled) return\n\n const el = overlay.value?.contentEl\n if (el && isActive.value) {\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n e.stopImmediatePropagation()\n focusChild(el, 'next')\n } else if (e.key === 'ArrowUp') {\n e.preventDefault()\n e.stopImmediatePropagation()\n focusChild(el, 'prev')\n } else if (props.submenu) {\n if (e.key === (isRtl.value ? 'ArrowRight' : 'ArrowLeft')) {\n isActive.value = false\n } else if (e.key === (isRtl.value ? 'ArrowLeft' : 'ArrowRight')) {\n e.preventDefault()\n focusChild(el, 'first')\n }\n }\n } else if (\n props.submenu\n ? e.key === (isRtl.value ? 'ArrowLeft' : 'ArrowRight')\n : ['ArrowDown', 'ArrowUp'].includes(e.key)\n ) {\n isActive.value = true\n e.preventDefault()\n setTimeout(() => setTimeout(() => onActivatorKeydown(e)))\n }\n }\n\n const activatorProps = computed(() =>\n mergeProps({\n 'aria-haspopup': 'menu',\n 'aria-expanded': String(isActive.value),\n 'aria-controls': id.value,\n onKeydown: onActivatorKeydown,\n }, props.activatorProps)\n )\n\n useRender(() => {\n const overlayProps = VOverlay.filterProps(props)\n\n return (\n <VOverlay\n ref={ overlay }\n id={ id.value }\n class={[\n 'v-menu',\n props.class,\n ]}\n style={ props.style }\n { ...overlayProps }\n v-model={ isActive.value }\n absolute\n activatorProps={ activatorProps.value }\n location={ props.location ?? (props.submenu ? 'end' : 'bottom') }\n onClick:outside={ onClickOutside }\n onKeydown={ onKeydown }\n { ...scopeId }\n >\n {{\n activator: slots.activator,\n default: (...args) => (\n <VDefaultsProvider root=\"VMenu\">\n { slots.default?.(...args) }\n </VDefaultsProvider>\n ),\n }}\n </VOverlay>\n )\n })\n\n return forwardRefs({ id, ΨopenChildren: openChildren }, overlay)\n },\n})\n\nexport type VMenu = InstanceType<typeof VMenu>\n"],"mappings":"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","ignoreList":[]}
@@ -58,6 +58,7 @@ export declare const VNumberInput: {
58
58
  theme?: string | undefined;
59
59
  placeholder?: string | undefined;
60
60
  counter?: string | number | boolean | undefined;
61
+ decimalSeparator?: string | undefined;
61
62
  'onUpdate:focused'?: ((args_0: boolean) => void) | undefined;
62
63
  validateOn?: ("eager" | "lazy" | ("input" | "blur" | "submit" | "invalid-input") | "input lazy" | "blur lazy" | "submit lazy" | "invalid-input lazy" | "input eager" | "blur eager" | "submit eager" | "invalid-input eager" | "lazy input" | "lazy blur" | "lazy submit" | "lazy invalid-input" | "eager input" | "eager blur" | "eager submit" | "eager invalid-input") | undefined;
63
64
  rounded?: string | number | boolean | undefined;
@@ -2198,6 +2199,7 @@ export declare const VNumberInput: {
2198
2199
  theme?: string | undefined;
2199
2200
  placeholder?: string | undefined;
2200
2201
  counter?: string | number | boolean | undefined;
2202
+ decimalSeparator?: string | undefined;
2201
2203
  'onUpdate:focused'?: ((args_0: boolean) => void) | undefined;
2202
2204
  validateOn?: ("eager" | "lazy" | ("input" | "blur" | "submit" | "invalid-input") | "input lazy" | "blur lazy" | "submit lazy" | "invalid-input lazy" | "input eager" | "blur eager" | "submit eager" | "invalid-input eager" | "lazy input" | "lazy blur" | "lazy submit" | "lazy invalid-input" | "eager input" | "eager blur" | "eager submit" | "eager invalid-input") | undefined;
2203
2205
  rounded?: string | number | boolean | undefined;
@@ -4314,6 +4316,7 @@ export declare const VNumberInput: {
4314
4316
  theme?: string | undefined;
4315
4317
  placeholder?: string | undefined;
4316
4318
  counter?: string | number | boolean | undefined;
4319
+ decimalSeparator?: string | undefined;
4317
4320
  'onUpdate:focused'?: ((args_0: boolean) => void) | undefined;
4318
4321
  validateOn?: ("eager" | "lazy" | ("input" | "blur" | "submit" | "invalid-input") | "input lazy" | "blur lazy" | "submit lazy" | "invalid-input lazy" | "input eager" | "blur eager" | "submit eager" | "invalid-input eager" | "lazy input" | "lazy blur" | "lazy submit" | "lazy invalid-input" | "eager input" | "eager blur" | "eager submit" | "eager invalid-input") | undefined;
4319
4322
  rounded?: string | number | boolean | undefined;
@@ -6533,6 +6536,10 @@ export declare const VNumberInput: {
6533
6536
  type: PropType<number | null>;
6534
6537
  default: null;
6535
6538
  };
6539
+ decimalSeparator: {
6540
+ type: StringConstructor;
6541
+ validator: (v: any) => boolean;
6542
+ };
6536
6543
  }, import("vue").ExtractPropTypes<{
6537
6544
  flat: BooleanConstructor;
6538
6545
  reverse: BooleanConstructor;
@@ -6672,6 +6679,10 @@ export declare const VNumberInput: {
6672
6679
  type: PropType<number | null>;
6673
6680
  default: null;
6674
6681
  };
6682
+ decimalSeparator: {
6683
+ type: StringConstructor;
6684
+ validator: (v: any) => boolean;
6685
+ };
6675
6686
  }>>;
6676
6687
  export type VNumberInput = InstanceType<typeof VNumberInput>;
6677
6688
 
@@ -10,9 +10,10 @@ import { makeVTextFieldProps, VTextField } from "../VTextField/VTextField.js"; /
10
10
  import { useHold } from "./hold.js";
11
11
  import { useForm } from "../../composables/form.js";
12
12
  import { forwardRefs } from "../../composables/forwardRefs.js";
13
+ import { useLocale } from "../../composables/locale.js";
13
14
  import { useProxiedModel } from "../../composables/proxiedModel.js"; // Utilities
14
15
  import { computed, nextTick, onMounted, ref, shallowRef, toRef, watch, watchEffect } from 'vue';
15
- import { clamp, extractNumber, genericComponent, omit, propsFactory, useRender } from "../../util/index.js"; // Types
16
+ import { clamp, escapeForRegex, extractNumber, genericComponent, omit, propsFactory, useRender } from "../../util/index.js"; // Types
16
17
  const makeVNumberInputProps = propsFactory({
17
18
  controlVariant: {
18
19
  type: String,
@@ -44,6 +45,10 @@ const makeVNumberInputProps = propsFactory({
44
45
  type: Number,
45
46
  default: null
46
47
  },
48
+ decimalSeparator: {
49
+ type: String,
50
+ validator: v => !v || v.length === 1
51
+ },
47
52
  ...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
48
53
  }, 'VNumberInput');
49
54
  export const VNumberInput = genericComponent()({
@@ -69,21 +74,24 @@ export const VNumberInput = genericComponent()({
69
74
  const form = useForm(props);
70
75
  const controlsDisabled = computed(() => form.isDisabled.value || form.isReadonly.value);
71
76
  const isFocused = shallowRef(props.focused);
77
+ const {
78
+ decimalSeparator: decimalSeparatorFromLocale
79
+ } = useLocale();
80
+ const decimalSeparator = computed(() => props.decimalSeparator?.[0] || decimalSeparatorFromLocale.value);
72
81
  function correctPrecision(val) {
73
82
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
74
- if (precision == null) {
75
- return String(val);
83
+ let trim = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
84
+ const fixed = precision == null ? String(val) : val.toFixed(precision);
85
+ if (isFocused.value && trim) {
86
+ return Number(fixed).toString() // trim zeros
87
+ .replace('.', decimalSeparator.value);
76
88
  }
77
- let fixed = val.toFixed(precision);
78
- if (isFocused.value) {
79
- return Number(fixed).toString(); // trim zeros
89
+ if (props.minFractionDigits === null || precision !== null && precision < props.minFractionDigits) {
90
+ return fixed.replace('.', decimalSeparator.value);
80
91
  }
81
- if ((props.minFractionDigits ?? precision) < precision) {
82
- const trimLimit = precision - props.minFractionDigits;
83
- const [baseDigits, fractionDigits] = fixed.split('.');
84
- fixed = [baseDigits, fractionDigits.replace(new RegExp(`0{1,${trimLimit}}$`), '')].filter(Boolean).join('.');
85
- }
86
- return fixed;
92
+ let [baseDigits, fractionDigits] = fixed.split('.');
93
+ fractionDigits = (fractionDigits ?? '').padEnd(props.minFractionDigits, '0').replace(new RegExp(`(?<=\\d{${props.minFractionDigits}})0`, 'g'), '');
94
+ return [baseDigits, fractionDigits].filter(Boolean).join(decimalSeparator.value);
87
95
  }
88
96
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
89
97
  const _inputText = shallowRef(null);
@@ -102,8 +110,11 @@ export const VNumberInput = genericComponent()({
102
110
  if (val === null || val === '') {
103
111
  model.value = null;
104
112
  _inputText.value = null;
105
- } else if (!isNaN(Number(val)) && Number(val) <= props.max && Number(val) >= props.min) {
106
- model.value = Number(val);
113
+ return;
114
+ }
115
+ const parsedValue = Number(val.replace(decimalSeparator.value, '.'));
116
+ if (!isNaN(parsedValue) && parsedValue <= props.max && parsedValue >= props.min) {
117
+ model.value = parsedValue;
107
118
  _inputText.value = val;
108
119
  }
109
120
  }
@@ -174,24 +185,24 @@ export const VNumberInput = genericComponent()({
174
185
  selectionEnd
175
186
  } = inputElement ?? {};
176
187
  const potentialNewInputVal = existingTxt ? existingTxt.slice(0, selectionStart) + e.data + existingTxt.slice(selectionEnd) : e.data;
177
- const potentialNewNumber = extractNumber(potentialNewInputVal, props.precision);
188
+ const potentialNewNumber = extractNumber(potentialNewInputVal, props.precision, decimalSeparator.value);
178
189
 
179
- // Only numbers, "-", "." are allowed
180
- // AND "-", "." are allowed only once
181
- // AND "-" is only allowed at the start
182
- if (!/^-?(\d+(\.\d*)?|(\.\d+)|\d*|\.)$/.test(potentialNewInputVal)) {
190
+ // Allow only numbers, "-" and {decimal separator}
191
+ // Allow "-" and {decimal separator} only once
192
+ // Allow "-" only at the start
193
+ if (!new RegExp(`^-?\\d*${escapeForRegex(decimalSeparator.value)}?\\d*$`).test(potentialNewInputVal)) {
183
194
  e.preventDefault();
184
195
  inputElement.value = potentialNewNumber;
185
196
  }
186
197
  if (props.precision == null) return;
187
198
 
188
199
  // Ignore decimal digits above precision limit
189
- if (potentialNewInputVal.split('.')[1]?.length > props.precision) {
200
+ if (potentialNewInputVal.split(decimalSeparator.value)[1]?.length > props.precision) {
190
201
  e.preventDefault();
191
202
  inputElement.value = potentialNewNumber;
192
203
  }
193
204
  // Ignore decimal separator when precision = 0
194
- if (props.precision === 0 && potentialNewInputVal.includes('.')) {
205
+ if (props.precision === 0 && potentialNewInputVal.includes(decimalSeparator.value)) {
195
206
  e.preventDefault();
196
207
  inputElement.value = potentialNewNumber;
197
208
  }
@@ -243,19 +254,16 @@ export const VNumberInput = genericComponent()({
243
254
  if (controlsDisabled.value) return;
244
255
  if (!vTextFieldRef.value) return;
245
256
  const actualText = vTextFieldRef.value.value;
246
- if (actualText && !isNaN(Number(actualText))) {
247
- inputText.value = correctPrecision(clamp(Number(actualText), props.min, props.max));
257
+ const parsedValue = Number(actualText.replace(decimalSeparator.value, '.'));
258
+ if (actualText && !isNaN(parsedValue)) {
259
+ inputText.value = correctPrecision(clamp(parsedValue, props.min, props.max));
248
260
  } else {
249
261
  inputText.value = null;
250
262
  }
251
263
  }
252
264
  function formatInputValue() {
253
265
  if (controlsDisabled.value) return;
254
- if (model.value === null || isNaN(model.value)) {
255
- inputText.value = null;
256
- return;
257
- }
258
- inputText.value = correctPrecision(model.value);
266
+ inputText.value = model.value !== null && !isNaN(model.value) ? correctPrecision(model.value, props.precision, false) : null;
259
267
  }
260
268
  function trimDecimalZeros() {
261
269
  if (controlsDisabled.value) return;
@@ -263,7 +271,7 @@ export const VNumberInput = genericComponent()({
263
271
  inputText.value = null;
264
272
  return;
265
273
  }
266
- inputText.value = model.value.toString();
274
+ inputText.value = model.value.toString().replace('.', decimalSeparator.value);
267
275
  }
268
276
  function onFocus() {
269
277
  trimDecimalZeros();
@@ -1 +1 @@
1
- {"version":3,"file":"VNumberInput.js","names":["VBtn","VDefaultsProvider","VDivider","makeVTextFieldProps","VTextField","useHold","useForm","forwardRefs","useProxiedModel","computed","nextTick","onMounted","ref","shallowRef","toRef","watch","watchEffect","clamp","extractNumber","genericComponent","omit","propsFactory","useRender","makeVNumberInputProps","controlVariant","type","String","default","inset","Boolean","hideInput","modelValue","Number","min","MIN_SAFE_INTEGER","max","MAX_SAFE_INTEGER","step","precision","minFractionDigits","VNumberInput","name","props","emits","val","setup","_ref","slots","vTextFieldRef","holdStart","holdStop","toggleUpDown","form","controlsDisabled","isDisabled","value","isReadonly","isFocused","focused","correctPrecision","arguments","length","undefined","fixed","toFixed","toString","trimLimit","baseDigits","fractionDigits","split","replace","RegExp","filter","join","model","_inputText","isNaN","inputText","get","set","canIncrease","canDecrease","incrementIcon","decrementIcon","controlNodeSize","controlNodeDefaultHeight","incrementSlotProps","onClick","onControlClick","onPointerup","onControlMouseup","onPointerdown","onUpControlMousedown","onPointercancel","onControlPointerCancel","decrementSlotProps","onDownControlMousedown","formatInputValue","clampModel","inferPrecision","str","idx","indexOf","increment","inferredPrecision","Math","onBeforeinput","e","data","inputElement","target","existingTxt","selectionStart","selectionEnd","potentialNewInputVal","slice","potentialNewNumber","test","preventDefault","includes","onKeydown","key","ctrlKey","stopPropagation","el","currentTarget","releasePointerCapture","pointerId","setPointerCapture","actualText","trimDecimalZeros","onFocus","onBlur","_","textFieldProps","filterProps","incrementControlNode","_createVNode","disabled","flat","height","size","icon","decrementControlNode","decrement","controlNode","_createElementVNode","dividerNode","appendInnerControl","reverse","_Fragment","hasAppendInner","prependInnerControl","hasPrependInner","_mergeProps","$event","class","style","_len","args","Array","_key","_len2","_key2"],"sources":["../../../src/components/VNumberInput/VNumberInput.tsx"],"sourcesContent":["// Styles\nimport './VNumberInput.sass'\n\n// Components\nimport { VBtn } from '@/components/VBtn'\nimport { VDefaultsProvider } from '@/components/VDefaultsProvider'\nimport { VDivider } from '@/components/VDivider'\nimport { makeVTextFieldProps, VTextField } from '@/components/VTextField/VTextField'\n\n// Composables\nimport { useHold } from './hold'\nimport { useForm } from '@/composables/form'\nimport { forwardRefs } from '@/composables/forwardRefs'\nimport { useProxiedModel } from '@/composables/proxiedModel'\n\n// Utilities\nimport { computed, nextTick, onMounted, ref, shallowRef, toRef, watch, watchEffect } from 'vue'\nimport { clamp, extractNumber, genericComponent, omit, propsFactory, useRender } from '@/util'\n\n// Types\nimport type { PropType } from 'vue'\nimport type { VTextFieldSlots } from '@/components/VTextField/VTextField'\n\ntype ControlSlot = {\n props: Record<string, unknown>\n}\n\ntype VNumberInputSlots = Omit<VTextFieldSlots, 'default'> & {\n increment: ControlSlot\n decrement: ControlSlot\n}\n\ntype ControlVariant = 'default' | 'stacked' | 'split' | 'hidden'\n\nconst makeVNumberInputProps = propsFactory({\n controlVariant: {\n type: String as PropType<ControlVariant>,\n default: 'default',\n },\n inset: Boolean,\n hideInput: Boolean,\n modelValue: {\n type: Number as PropType<number | null>,\n default: null,\n },\n min: {\n type: Number,\n default: Number.MIN_SAFE_INTEGER,\n },\n max: {\n type: Number,\n default: Number.MAX_SAFE_INTEGER,\n },\n step: {\n type: Number,\n default: 1,\n },\n precision: {\n type: Number as PropType<number | null>,\n default: 0,\n },\n minFractionDigits: {\n type: Number as PropType<number | null>,\n default: null,\n },\n\n ...omit(makeVTextFieldProps(), ['modelValue', 'validationValue']),\n}, 'VNumberInput')\n\nexport const VNumberInput = genericComponent<VNumberInputSlots>()({\n name: 'VNumberInput',\n\n props: {\n ...makeVNumberInputProps(),\n },\n\n emits: {\n 'update:focused': (val: boolean) => true,\n 'update:modelValue': (val: number) => true,\n },\n\n setup (props, { slots }) {\n const vTextFieldRef = ref<VTextField>()\n\n const { holdStart, holdStop } = useHold({ toggleUpDown })\n const form = useForm(props)\n const controlsDisabled = computed(() => (\n form.isDisabled.value || form.isReadonly.value\n ))\n\n const isFocused = shallowRef(props.focused)\n\n function correctPrecision (val: number, precision = props.precision) {\n if (precision == null) {\n return String(val)\n }\n\n let fixed = val.toFixed(precision)\n\n if (isFocused.value) {\n return Number(fixed).toString() // trim zeros\n }\n\n if ((props.minFractionDigits ?? precision) < precision) {\n const trimLimit = precision - props.minFractionDigits!\n const [baseDigits, fractionDigits] = fixed.split('.')\n fixed = [\n baseDigits,\n fractionDigits.replace(new RegExp(`0{1,${trimLimit}}$`), ''),\n ].filter(Boolean).join('.')\n }\n\n return fixed\n }\n\n const model = useProxiedModel(props, 'modelValue', null,\n val => val ?? null,\n val => val == null\n ? val ?? null\n : clamp(Number(val), props.min, props.max)\n )\n\n const _inputText = shallowRef<string | null>(null)\n watchEffect(() => {\n if (isFocused.value && !controlsDisabled.value) {\n // ignore external changes\n } else if (model.value == null) {\n _inputText.value = null\n } else if (!isNaN(model.value)) {\n _inputText.value = correctPrecision(model.value)\n }\n })\n const inputText = computed<string | null>({\n get: () => _inputText.value,\n set (val) {\n if (val === null || val === '') {\n model.value = null\n _inputText.value = null\n } else if (!isNaN(Number(val)) && Number(val) <= props.max && Number(val) >= props.min) {\n model.value = Number(val)\n _inputText.value = val\n }\n },\n })\n\n const canIncrease = computed(() => {\n if (controlsDisabled.value) return false\n return (model.value ?? 0) as number + props.step <= props.max\n })\n const canDecrease = computed(() => {\n if (controlsDisabled.value) return false\n return (model.value ?? 0) as number - props.step >= props.min\n })\n\n const controlVariant = computed(() => {\n return props.hideInput ? 'stacked' : props.controlVariant\n })\n\n const incrementIcon = toRef(() => controlVariant.value === 'split' ? '$plus' : '$collapse')\n const decrementIcon = toRef(() => controlVariant.value === 'split' ? '$minus' : '$expand')\n const controlNodeSize = toRef(() => controlVariant.value === 'split' ? 'default' : 'small')\n const controlNodeDefaultHeight = toRef(() => controlVariant.value === 'stacked' ? 'auto' : '100%')\n\n const incrementSlotProps = {\n props: {\n onClick: onControlClick,\n onPointerup: onControlMouseup,\n onPointerdown: onUpControlMousedown,\n onPointercancel: onControlPointerCancel,\n },\n }\n const decrementSlotProps = {\n props: {\n onClick: onControlClick,\n onPointerup: onControlMouseup,\n onPointerdown: onDownControlMousedown,\n onPointercancel: onControlPointerCancel,\n },\n }\n\n watch(() => props.precision, () => formatInputValue())\n watch(() => props.minFractionDigits, () => formatInputValue())\n\n onMounted(() => {\n clampModel()\n })\n\n function inferPrecision (value: number | null) {\n if (value == null) return 0\n const str = value.toString()\n const idx = str.indexOf('.')\n return ~idx ? str.length - idx : 0\n }\n\n function toggleUpDown (increment = true) {\n if (controlsDisabled.value) return\n if (model.value == null) {\n inputText.value = correctPrecision(clamp(0, props.min, props.max))\n return\n }\n\n let inferredPrecision = Math.max(inferPrecision(model.value), inferPrecision(props.step))\n if (props.precision != null) inferredPrecision = Math.max(inferredPrecision, props.precision)\n if (increment) {\n if (canIncrease.value) inputText.value = correctPrecision(model.value + props.step, inferredPrecision)\n } else {\n if (canDecrease.value) inputText.value = correctPrecision(model.value - props.step, inferredPrecision)\n }\n }\n\n function onBeforeinput (e: InputEvent) {\n if (!e.data) return\n const inputElement = e.target as HTMLInputElement\n const { value: existingTxt, selectionStart, selectionEnd } = inputElement ?? {}\n\n const potentialNewInputVal =\n existingTxt\n ? existingTxt.slice(0, selectionStart as number | undefined) + e.data + existingTxt.slice(selectionEnd as number | undefined)\n : e.data\n\n const potentialNewNumber = extractNumber(potentialNewInputVal, props.precision)\n\n // Only numbers, \"-\", \".\" are allowed\n // AND \"-\", \".\" are allowed only once\n // AND \"-\" is only allowed at the start\n if (!/^-?(\\d+(\\.\\d*)?|(\\.\\d+)|\\d*|\\.)$/.test(potentialNewInputVal)) {\n e.preventDefault()\n inputElement!.value = potentialNewNumber\n }\n\n if (props.precision == null) return\n\n // Ignore decimal digits above precision limit\n if (potentialNewInputVal.split('.')[1]?.length > props.precision) {\n e.preventDefault()\n inputElement!.value = potentialNewNumber\n }\n // Ignore decimal separator when precision = 0\n if (props.precision === 0 && potentialNewInputVal.includes('.')) {\n e.preventDefault()\n inputElement!.value = potentialNewNumber\n }\n }\n\n async function onKeydown (e: KeyboardEvent) {\n if (\n ['Enter', 'ArrowLeft', 'ArrowRight', 'Backspace', 'Delete', 'Tab'].includes(e.key) ||\n e.ctrlKey\n ) return\n\n if (['ArrowDown', 'ArrowUp'].includes(e.key)) {\n e.preventDefault()\n clampModel()\n // _model is controlled, so need to wait until props['modelValue'] is updated\n await nextTick()\n if (e.key === 'ArrowDown') {\n toggleUpDown(false)\n } else {\n toggleUpDown()\n }\n }\n }\n\n function onControlClick (e: MouseEvent) {\n e.stopPropagation()\n }\n\n function onControlMouseup (e: PointerEvent) {\n const el = e.currentTarget as HTMLElement\n el?.releasePointerCapture(e.pointerId)\n e.preventDefault()\n e.stopPropagation()\n holdStop()\n }\n\n function onUpControlMousedown (e: PointerEvent) {\n const el = e.currentTarget as HTMLElement\n el?.setPointerCapture(e.pointerId)\n e.preventDefault()\n e.stopPropagation()\n holdStart('up')\n }\n\n function onDownControlMousedown (e: PointerEvent) {\n const el = e.currentTarget as HTMLElement\n el?.setPointerCapture(e.pointerId)\n e.preventDefault()\n e.stopPropagation()\n holdStart('down')\n }\n\n function onControlPointerCancel (e: PointerEvent) {\n const el = e.currentTarget as HTMLElement\n el?.releasePointerCapture(e.pointerId)\n holdStop()\n }\n\n function clampModel () {\n if (controlsDisabled.value) return\n if (!vTextFieldRef.value) return\n const actualText = vTextFieldRef.value.value\n if (actualText && !isNaN(Number(actualText))) {\n inputText.value = correctPrecision(clamp(Number(actualText), props.min, props.max))\n } else {\n inputText.value = null\n }\n }\n\n function formatInputValue () {\n if (controlsDisabled.value) return\n if (model.value === null || isNaN(model.value)) {\n inputText.value = null\n return\n }\n inputText.value = correctPrecision(model.value)\n }\n\n function trimDecimalZeros () {\n if (controlsDisabled.value) return\n if (model.value === null || isNaN(model.value)) {\n inputText.value = null\n return\n }\n inputText.value = model.value.toString()\n }\n\n function onFocus () {\n trimDecimalZeros()\n }\n\n function onBlur () {\n clampModel()\n }\n\n useRender(() => {\n const { modelValue: _, ...textFieldProps } = VTextField.filterProps(props)\n\n function incrementControlNode () {\n return !slots.increment ? (\n <VBtn\n aria-hidden=\"true\"\n data-testid=\"increment\"\n disabled={ !canIncrease.value }\n flat\n height={ controlNodeDefaultHeight.value }\n icon={ incrementIcon.value }\n key=\"increment-btn\"\n onClick={ onControlClick }\n onPointerdown={ onUpControlMousedown }\n onPointerup={ onControlMouseup }\n onPointercancel={ onControlPointerCancel }\n size={ controlNodeSize.value }\n tabindex=\"-1\"\n />\n ) : (\n <VDefaultsProvider\n key=\"increment-defaults\"\n defaults={{\n VBtn: {\n disabled: !canIncrease.value,\n flat: true,\n height: controlNodeDefaultHeight.value,\n size: controlNodeSize.value,\n icon: incrementIcon.value,\n },\n }}\n >\n { slots.increment(incrementSlotProps) }\n </VDefaultsProvider>\n )\n }\n\n function decrementControlNode () {\n return !slots.decrement ? (\n <VBtn\n aria-hidden=\"true\"\n data-testid=\"decrement\"\n disabled={ !canDecrease.value }\n flat\n height={ controlNodeDefaultHeight.value }\n icon={ decrementIcon.value }\n key=\"decrement-btn\"\n onClick={ onControlClick }\n onPointerdown={ onDownControlMousedown }\n onPointerup={ onControlMouseup }\n onPointercancel={ onControlPointerCancel }\n size={ controlNodeSize.value }\n tabindex=\"-1\"\n />\n ) : (\n <VDefaultsProvider\n key=\"decrement-defaults\"\n defaults={{\n VBtn: {\n disabled: !canDecrease.value,\n flat: true,\n height: controlNodeDefaultHeight.value,\n size: controlNodeSize.value,\n icon: decrementIcon.value,\n },\n }}\n >\n { slots.decrement(decrementSlotProps) }\n </VDefaultsProvider>\n )\n }\n\n function controlNode () {\n return (\n <div class=\"v-number-input__control\">\n { decrementControlNode() }\n\n <VDivider\n vertical={ controlVariant.value !== 'stacked' }\n />\n\n { incrementControlNode() }\n </div>\n )\n }\n\n function dividerNode () {\n return !props.hideInput && !props.inset ? <VDivider vertical /> : undefined\n }\n\n const appendInnerControl =\n controlVariant.value === 'split'\n ? (\n <div class=\"v-number-input__control\">\n <VDivider vertical />\n\n { incrementControlNode() }\n </div>\n ) : (props.reverse || controlVariant.value === 'hidden'\n ? undefined\n : <>{ dividerNode() }{ controlNode() }</>)\n\n const hasAppendInner = slots['append-inner'] || appendInnerControl\n\n const prependInnerControl =\n controlVariant.value === 'split'\n ? (\n <div class=\"v-number-input__control\">\n { decrementControlNode() }\n\n <VDivider vertical />\n </div>\n ) : (props.reverse && controlVariant.value !== 'hidden'\n ? <>{ controlNode() }{ dividerNode() }</>\n : undefined)\n\n const hasPrependInner = slots['prepend-inner'] || prependInnerControl\n\n return (\n <VTextField\n ref={ vTextFieldRef }\n { ...textFieldProps }\n v-model={ inputText.value }\n v-model:focused={ isFocused.value }\n validationValue={ model.value }\n onBeforeinput={ onBeforeinput }\n onFocus={ onFocus }\n onBlur={ onBlur }\n onKeydown={ onKeydown }\n class={[\n 'v-number-input',\n {\n 'v-number-input--default': controlVariant.value === 'default',\n 'v-number-input--hide-input': props.hideInput,\n 'v-number-input--inset': props.inset,\n 'v-number-input--reverse': props.reverse,\n 'v-number-input--split': controlVariant.value === 'split',\n 'v-number-input--stacked': controlVariant.value === 'stacked',\n },\n props.class,\n ]}\n style={ props.style }\n inputmode=\"decimal\"\n >\n {{\n ...slots,\n 'append-inner': hasAppendInner ? (...args) => (\n <>\n { slots['append-inner']?.(...args) }\n { appendInnerControl }\n </>\n ) : undefined,\n 'prepend-inner': hasPrependInner ? (...args) => (\n <>\n { prependInnerControl }\n { slots['prepend-inner']?.(...args) }\n </>\n ) : undefined,\n }}\n </VTextField>\n )\n })\n\n return forwardRefs({}, vTextFieldRef)\n },\n})\n\nexport type VNumberInput = InstanceType<typeof VNumberInput>\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"VNumberInput.js","names":["VBtn","VDefaultsProvider","VDivider","makeVTextFieldProps","VTextField","useHold","useForm","forwardRefs","useLocale","useProxiedModel","computed","nextTick","onMounted","ref","shallowRef","toRef","watch","watchEffect","clamp","escapeForRegex","extractNumber","genericComponent","omit","propsFactory","useRender","makeVNumberInputProps","controlVariant","type","String","default","inset","Boolean","hideInput","modelValue","Number","min","MIN_SAFE_INTEGER","max","MAX_SAFE_INTEGER","step","precision","minFractionDigits","decimalSeparator","validator","v","length","VNumberInput","name","props","emits","val","setup","_ref","slots","vTextFieldRef","holdStart","holdStop","toggleUpDown","form","controlsDisabled","isDisabled","value","isReadonly","isFocused","focused","decimalSeparatorFromLocale","correctPrecision","arguments","undefined","trim","fixed","toFixed","toString","replace","baseDigits","fractionDigits","split","padEnd","RegExp","filter","join","model","_inputText","isNaN","inputText","get","set","parsedValue","canIncrease","canDecrease","incrementIcon","decrementIcon","controlNodeSize","controlNodeDefaultHeight","incrementSlotProps","onClick","onControlClick","onPointerup","onControlMouseup","onPointerdown","onUpControlMousedown","onPointercancel","onControlPointerCancel","decrementSlotProps","onDownControlMousedown","formatInputValue","clampModel","inferPrecision","str","idx","indexOf","increment","inferredPrecision","Math","onBeforeinput","e","data","inputElement","target","existingTxt","selectionStart","selectionEnd","potentialNewInputVal","slice","potentialNewNumber","test","preventDefault","includes","onKeydown","key","ctrlKey","stopPropagation","el","currentTarget","releasePointerCapture","pointerId","setPointerCapture","actualText","trimDecimalZeros","onFocus","onBlur","_","textFieldProps","filterProps","incrementControlNode","_createVNode","disabled","flat","height","size","icon","decrementControlNode","decrement","controlNode","_createElementVNode","dividerNode","appendInnerControl","reverse","_Fragment","hasAppendInner","prependInnerControl","hasPrependInner","_mergeProps","$event","class","style","_len","args","Array","_key","_len2","_key2"],"sources":["../../../src/components/VNumberInput/VNumberInput.tsx"],"sourcesContent":["// Styles\nimport './VNumberInput.sass'\n\n// Components\nimport { VBtn } from '@/components/VBtn'\nimport { VDefaultsProvider } from '@/components/VDefaultsProvider'\nimport { VDivider } from '@/components/VDivider'\nimport { makeVTextFieldProps, VTextField } from '@/components/VTextField/VTextField'\n\n// Composables\nimport { useHold } from './hold'\nimport { useForm } from '@/composables/form'\nimport { forwardRefs } from '@/composables/forwardRefs'\nimport { useLocale } from '@/composables/locale'\nimport { useProxiedModel } from '@/composables/proxiedModel'\n\n// Utilities\nimport { computed, nextTick, onMounted, ref, shallowRef, toRef, watch, watchEffect } from 'vue'\nimport { clamp, escapeForRegex, extractNumber, genericComponent, omit, propsFactory, useRender } from '@/util'\n\n// Types\nimport type { PropType } from 'vue'\nimport type { VTextFieldSlots } from '@/components/VTextField/VTextField'\n\ntype ControlSlot = {\n props: Record<string, unknown>\n}\n\ntype VNumberInputSlots = Omit<VTextFieldSlots, 'default'> & {\n increment: ControlSlot\n decrement: ControlSlot\n}\n\ntype ControlVariant = 'default' | 'stacked' | 'split' | 'hidden'\n\nconst makeVNumberInputProps = propsFactory({\n controlVariant: {\n type: String as PropType<ControlVariant>,\n default: 'default',\n },\n inset: Boolean,\n hideInput: Boolean,\n modelValue: {\n type: Number as PropType<number | null>,\n default: null,\n },\n min: {\n type: Number,\n default: Number.MIN_SAFE_INTEGER,\n },\n max: {\n type: Number,\n default: Number.MAX_SAFE_INTEGER,\n },\n step: {\n type: Number,\n default: 1,\n },\n precision: {\n type: Number as PropType<number | null>,\n default: 0,\n },\n minFractionDigits: {\n type: Number as PropType<number | null>,\n default: null,\n },\n decimalSeparator: {\n type: String,\n validator: (v: any) => !v || v.length === 1,\n },\n\n ...omit(makeVTextFieldProps(), ['modelValue', 'validationValue']),\n}, 'VNumberInput')\n\nexport const VNumberInput = genericComponent<VNumberInputSlots>()({\n name: 'VNumberInput',\n\n props: {\n ...makeVNumberInputProps(),\n },\n\n emits: {\n 'update:focused': (val: boolean) => true,\n 'update:modelValue': (val: number) => true,\n },\n\n setup (props, { slots }) {\n const vTextFieldRef = ref<VTextField>()\n\n const { holdStart, holdStop } = useHold({ toggleUpDown })\n const form = useForm(props)\n const controlsDisabled = computed(() => (\n form.isDisabled.value || form.isReadonly.value\n ))\n\n const isFocused = shallowRef(props.focused)\n\n const { decimalSeparator: decimalSeparatorFromLocale } = useLocale()\n const decimalSeparator = computed(() => props.decimalSeparator?.[0] || decimalSeparatorFromLocale.value)\n\n function correctPrecision (val: number, precision = props.precision, trim = true) {\n const fixed = precision == null\n ? String(val)\n : val.toFixed(precision)\n\n if (isFocused.value && trim) {\n return Number(fixed).toString() // trim zeros\n .replace('.', decimalSeparator.value)\n }\n\n if (props.minFractionDigits === null || (precision !== null && precision < props.minFractionDigits)) {\n return fixed.replace('.', decimalSeparator.value)\n }\n\n let [baseDigits, fractionDigits] = fixed.split('.')\n\n fractionDigits = (fractionDigits ?? '').padEnd(props.minFractionDigits, '0')\n .replace(new RegExp(`(?<=\\\\d{${props.minFractionDigits}})0`, 'g'), '')\n\n return [\n baseDigits,\n fractionDigits,\n ].filter(Boolean).join(decimalSeparator.value)\n }\n\n const model = useProxiedModel(props, 'modelValue', null,\n val => val ?? null,\n val => val == null\n ? val ?? null\n : clamp(Number(val), props.min, props.max)\n )\n\n const _inputText = shallowRef<string | null>(null)\n watchEffect(() => {\n if (isFocused.value && !controlsDisabled.value) {\n // ignore external changes\n } else if (model.value == null) {\n _inputText.value = null\n } else if (!isNaN(model.value)) {\n _inputText.value = correctPrecision(model.value)\n }\n })\n const inputText = computed<string | null>({\n get: () => _inputText.value,\n set (val) {\n if (val === null || val === '') {\n model.value = null\n _inputText.value = null\n return\n }\n const parsedValue = Number(val.replace(decimalSeparator.value, '.'))\n if (!isNaN(parsedValue) && parsedValue <= props.max && parsedValue >= props.min) {\n model.value = parsedValue\n _inputText.value = val\n }\n },\n })\n\n const canIncrease = computed(() => {\n if (controlsDisabled.value) return false\n return (model.value ?? 0) as number + props.step <= props.max\n })\n const canDecrease = computed(() => {\n if (controlsDisabled.value) return false\n return (model.value ?? 0) as number - props.step >= props.min\n })\n\n const controlVariant = computed(() => {\n return props.hideInput ? 'stacked' : props.controlVariant\n })\n\n const incrementIcon = toRef(() => controlVariant.value === 'split' ? '$plus' : '$collapse')\n const decrementIcon = toRef(() => controlVariant.value === 'split' ? '$minus' : '$expand')\n const controlNodeSize = toRef(() => controlVariant.value === 'split' ? 'default' : 'small')\n const controlNodeDefaultHeight = toRef(() => controlVariant.value === 'stacked' ? 'auto' : '100%')\n\n const incrementSlotProps = {\n props: {\n onClick: onControlClick,\n onPointerup: onControlMouseup,\n onPointerdown: onUpControlMousedown,\n onPointercancel: onControlPointerCancel,\n },\n }\n const decrementSlotProps = {\n props: {\n onClick: onControlClick,\n onPointerup: onControlMouseup,\n onPointerdown: onDownControlMousedown,\n onPointercancel: onControlPointerCancel,\n },\n }\n\n watch(() => props.precision, () => formatInputValue())\n watch(() => props.minFractionDigits, () => formatInputValue())\n\n onMounted(() => {\n clampModel()\n })\n\n function inferPrecision (value: number | null) {\n if (value == null) return 0\n const str = value.toString()\n const idx = str.indexOf('.')\n return ~idx ? str.length - idx : 0\n }\n\n function toggleUpDown (increment = true) {\n if (controlsDisabled.value) return\n if (model.value == null) {\n inputText.value = correctPrecision(clamp(0, props.min, props.max))\n return\n }\n\n let inferredPrecision = Math.max(inferPrecision(model.value), inferPrecision(props.step))\n if (props.precision != null) inferredPrecision = Math.max(inferredPrecision, props.precision)\n if (increment) {\n if (canIncrease.value) inputText.value = correctPrecision(model.value + props.step, inferredPrecision)\n } else {\n if (canDecrease.value) inputText.value = correctPrecision(model.value - props.step, inferredPrecision)\n }\n }\n\n function onBeforeinput (e: InputEvent) {\n if (!e.data) return\n const inputElement = e.target as HTMLInputElement\n const { value: existingTxt, selectionStart, selectionEnd } = inputElement ?? {}\n\n const potentialNewInputVal =\n existingTxt\n ? existingTxt.slice(0, selectionStart as number | undefined) + e.data + existingTxt.slice(selectionEnd as number | undefined)\n : e.data\n\n const potentialNewNumber = extractNumber(potentialNewInputVal, props.precision, decimalSeparator.value)\n\n // Allow only numbers, \"-\" and {decimal separator}\n // Allow \"-\" and {decimal separator} only once\n // Allow \"-\" only at the start\n if (!new RegExp(`^-?\\\\d*${escapeForRegex(decimalSeparator.value)}?\\\\d*$`).test(potentialNewInputVal)) {\n e.preventDefault()\n inputElement!.value = potentialNewNumber\n }\n\n if (props.precision == null) return\n\n // Ignore decimal digits above precision limit\n if (potentialNewInputVal.split(decimalSeparator.value)[1]?.length > props.precision) {\n e.preventDefault()\n inputElement!.value = potentialNewNumber\n }\n // Ignore decimal separator when precision = 0\n if (props.precision === 0 && potentialNewInputVal.includes(decimalSeparator.value)) {\n e.preventDefault()\n inputElement!.value = potentialNewNumber\n }\n }\n\n async function onKeydown (e: KeyboardEvent) {\n if (\n ['Enter', 'ArrowLeft', 'ArrowRight', 'Backspace', 'Delete', 'Tab'].includes(e.key) ||\n e.ctrlKey\n ) return\n\n if (['ArrowDown', 'ArrowUp'].includes(e.key)) {\n e.preventDefault()\n clampModel()\n // _model is controlled, so need to wait until props['modelValue'] is updated\n await nextTick()\n if (e.key === 'ArrowDown') {\n toggleUpDown(false)\n } else {\n toggleUpDown()\n }\n }\n }\n\n function onControlClick (e: MouseEvent) {\n e.stopPropagation()\n }\n\n function onControlMouseup (e: PointerEvent) {\n const el = e.currentTarget as HTMLElement\n el?.releasePointerCapture(e.pointerId)\n e.preventDefault()\n e.stopPropagation()\n holdStop()\n }\n\n function onUpControlMousedown (e: PointerEvent) {\n const el = e.currentTarget as HTMLElement\n el?.setPointerCapture(e.pointerId)\n e.preventDefault()\n e.stopPropagation()\n holdStart('up')\n }\n\n function onDownControlMousedown (e: PointerEvent) {\n const el = e.currentTarget as HTMLElement\n el?.setPointerCapture(e.pointerId)\n e.preventDefault()\n e.stopPropagation()\n holdStart('down')\n }\n\n function onControlPointerCancel (e: PointerEvent) {\n const el = e.currentTarget as HTMLElement\n el?.releasePointerCapture(e.pointerId)\n holdStop()\n }\n\n function clampModel () {\n if (controlsDisabled.value) return\n if (!vTextFieldRef.value) return\n const actualText = vTextFieldRef.value.value\n const parsedValue = Number(actualText.replace(decimalSeparator.value, '.'))\n if (actualText && !isNaN(parsedValue)) {\n inputText.value = correctPrecision(clamp(parsedValue, props.min, props.max))\n } else {\n inputText.value = null\n }\n }\n\n function formatInputValue () {\n if (controlsDisabled.value) return\n inputText.value = model.value !== null && !isNaN(model.value)\n ? correctPrecision(model.value, props.precision, false)\n : null\n }\n\n function trimDecimalZeros () {\n if (controlsDisabled.value) return\n if (model.value === null || isNaN(model.value)) {\n inputText.value = null\n return\n }\n inputText.value = model.value.toString()\n .replace('.', decimalSeparator.value)\n }\n\n function onFocus () {\n trimDecimalZeros()\n }\n\n function onBlur () {\n clampModel()\n }\n\n useRender(() => {\n const { modelValue: _, ...textFieldProps } = VTextField.filterProps(props)\n\n function incrementControlNode () {\n return !slots.increment ? (\n <VBtn\n aria-hidden=\"true\"\n data-testid=\"increment\"\n disabled={ !canIncrease.value }\n flat\n height={ controlNodeDefaultHeight.value }\n icon={ incrementIcon.value }\n key=\"increment-btn\"\n onClick={ onControlClick }\n onPointerdown={ onUpControlMousedown }\n onPointerup={ onControlMouseup }\n onPointercancel={ onControlPointerCancel }\n size={ controlNodeSize.value }\n tabindex=\"-1\"\n />\n ) : (\n <VDefaultsProvider\n key=\"increment-defaults\"\n defaults={{\n VBtn: {\n disabled: !canIncrease.value,\n flat: true,\n height: controlNodeDefaultHeight.value,\n size: controlNodeSize.value,\n icon: incrementIcon.value,\n },\n }}\n >\n { slots.increment(incrementSlotProps) }\n </VDefaultsProvider>\n )\n }\n\n function decrementControlNode () {\n return !slots.decrement ? (\n <VBtn\n aria-hidden=\"true\"\n data-testid=\"decrement\"\n disabled={ !canDecrease.value }\n flat\n height={ controlNodeDefaultHeight.value }\n icon={ decrementIcon.value }\n key=\"decrement-btn\"\n onClick={ onControlClick }\n onPointerdown={ onDownControlMousedown }\n onPointerup={ onControlMouseup }\n onPointercancel={ onControlPointerCancel }\n size={ controlNodeSize.value }\n tabindex=\"-1\"\n />\n ) : (\n <VDefaultsProvider\n key=\"decrement-defaults\"\n defaults={{\n VBtn: {\n disabled: !canDecrease.value,\n flat: true,\n height: controlNodeDefaultHeight.value,\n size: controlNodeSize.value,\n icon: decrementIcon.value,\n },\n }}\n >\n { slots.decrement(decrementSlotProps) }\n </VDefaultsProvider>\n )\n }\n\n function controlNode () {\n return (\n <div class=\"v-number-input__control\">\n { decrementControlNode() }\n\n <VDivider\n vertical={ controlVariant.value !== 'stacked' }\n />\n\n { incrementControlNode() }\n </div>\n )\n }\n\n function dividerNode () {\n return !props.hideInput && !props.inset ? <VDivider vertical /> : undefined\n }\n\n const appendInnerControl =\n controlVariant.value === 'split'\n ? (\n <div class=\"v-number-input__control\">\n <VDivider vertical />\n\n { incrementControlNode() }\n </div>\n ) : (props.reverse || controlVariant.value === 'hidden'\n ? undefined\n : <>{ dividerNode() }{ controlNode() }</>)\n\n const hasAppendInner = slots['append-inner'] || appendInnerControl\n\n const prependInnerControl =\n controlVariant.value === 'split'\n ? (\n <div class=\"v-number-input__control\">\n { decrementControlNode() }\n\n <VDivider vertical />\n </div>\n ) : (props.reverse && controlVariant.value !== 'hidden'\n ? <>{ controlNode() }{ dividerNode() }</>\n : undefined)\n\n const hasPrependInner = slots['prepend-inner'] || prependInnerControl\n\n return (\n <VTextField\n ref={ vTextFieldRef }\n { ...textFieldProps }\n v-model={ inputText.value }\n v-model:focused={ isFocused.value }\n validationValue={ model.value }\n onBeforeinput={ onBeforeinput }\n onFocus={ onFocus }\n onBlur={ onBlur }\n onKeydown={ onKeydown }\n class={[\n 'v-number-input',\n {\n 'v-number-input--default': controlVariant.value === 'default',\n 'v-number-input--hide-input': props.hideInput,\n 'v-number-input--inset': props.inset,\n 'v-number-input--reverse': props.reverse,\n 'v-number-input--split': controlVariant.value === 'split',\n 'v-number-input--stacked': controlVariant.value === 'stacked',\n },\n props.class,\n ]}\n style={ props.style }\n inputmode=\"decimal\"\n >\n {{\n ...slots,\n 'append-inner': hasAppendInner ? (...args) => (\n <>\n { slots['append-inner']?.(...args) }\n { appendInnerControl }\n </>\n ) : undefined,\n 'prepend-inner': hasPrependInner ? (...args) => (\n <>\n { prependInnerControl }\n { slots['prepend-inner']?.(...args) }\n </>\n ) : undefined,\n }}\n </VTextField>\n )\n })\n\n return forwardRefs({}, vTextFieldRef)\n },\n})\n\nexport type VNumberInput = InstanceType<typeof VNumberInput>\n"],"mappings":"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","ignoreList":[]}