@vuetify/nightly 4.0.0-dev-20230419.0 → 4.0.0-dev-20230421.0

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 (121) hide show
  1. package/CHANGELOG.md +7 -2
  2. package/dist/json/attributes.json +172 -108
  3. package/dist/json/importMap.json +34 -34
  4. package/dist/json/tags.json +16 -0
  5. package/dist/json/web-types.json +522 -220
  6. package/dist/vuetify-labs.css +293 -130
  7. package/dist/vuetify-labs.d.ts +620 -171
  8. package/dist/vuetify-labs.esm.js +867 -186
  9. package/dist/vuetify-labs.esm.js.map +1 -1
  10. package/dist/vuetify-labs.js +867 -185
  11. package/dist/vuetify-labs.min.css +2 -2
  12. package/dist/vuetify.css +166 -3
  13. package/dist/vuetify.d.ts +577 -160
  14. package/dist/vuetify.esm.js +809 -138
  15. package/dist/vuetify.esm.js.map +1 -1
  16. package/dist/vuetify.js +809 -137
  17. package/dist/vuetify.js.map +1 -1
  18. package/dist/vuetify.min.css +2 -2
  19. package/dist/vuetify.min.js +802 -736
  20. package/dist/vuetify.min.js.map +1 -1
  21. package/lib/adapters/date-adapter.mjs +2 -0
  22. package/lib/adapters/date-adapter.mjs.map +1 -0
  23. package/lib/adapters/vuetify.mjs +399 -0
  24. package/lib/adapters/vuetify.mjs.map +1 -0
  25. package/lib/blueprints/index.d.ts +34 -0
  26. package/lib/blueprints/md1.d.ts +34 -0
  27. package/lib/blueprints/md2.d.ts +34 -0
  28. package/lib/blueprints/md3.d.ts +34 -0
  29. package/lib/components/VAppBar/VAppBar.mjs +62 -10
  30. package/lib/components/VAppBar/VAppBar.mjs.map +1 -1
  31. package/lib/components/VAppBar/index.d.ts +26 -0
  32. package/lib/components/VAutocomplete/VAutocomplete.css +9 -0
  33. package/lib/components/VAutocomplete/VAutocomplete.mjs +50 -6
  34. package/lib/components/VAutocomplete/VAutocomplete.mjs.map +1 -1
  35. package/lib/components/VAutocomplete/VAutocomplete.sass +10 -0
  36. package/lib/components/VAutocomplete/index.d.ts +29 -17
  37. package/lib/components/VBtn/_mixins.scss +1 -1
  38. package/lib/components/VCard/VCard.mjs.map +1 -1
  39. package/lib/components/VCard/index.d.ts +21 -16
  40. package/lib/components/VCheckbox/VCheckbox.mjs +2 -2
  41. package/lib/components/VCheckbox/VCheckbox.mjs.map +1 -1
  42. package/lib/components/VCheckbox/index.d.ts +22 -1
  43. package/lib/components/VCombobox/VCombobox.css +1 -1
  44. package/lib/components/VCombobox/VCombobox.mjs +6 -4
  45. package/lib/components/VCombobox/VCombobox.mjs.map +1 -1
  46. package/lib/components/VCombobox/VCombobox.sass +1 -1
  47. package/lib/components/VCombobox/index.d.ts +29 -17
  48. package/lib/components/VField/index.d.ts +6 -0
  49. package/lib/components/VFileInput/VFileInput.mjs +13 -17
  50. package/lib/components/VFileInput/VFileInput.mjs.map +1 -1
  51. package/lib/components/VFileInput/index.d.ts +68 -23
  52. package/lib/components/VInput/VInput.mjs +14 -7
  53. package/lib/components/VInput/VInput.mjs.map +1 -1
  54. package/lib/components/VInput/index.d.ts +22 -1
  55. package/lib/components/VOverlay/locationStrategies.mjs +9 -4
  56. package/lib/components/VOverlay/locationStrategies.mjs.map +1 -1
  57. package/lib/components/VRadioGroup/VRadioGroup.mjs +2 -2
  58. package/lib/components/VRadioGroup/VRadioGroup.mjs.map +1 -1
  59. package/lib/components/VRadioGroup/index.d.ts +22 -1
  60. package/lib/components/VRangeSlider/VRangeSlider.mjs +33 -22
  61. package/lib/components/VRangeSlider/VRangeSlider.mjs.map +1 -1
  62. package/lib/components/VRangeSlider/index.d.ts +39 -6
  63. package/lib/components/VSelect/VSelect.mjs +6 -0
  64. package/lib/components/VSelect/VSelect.mjs.map +1 -1
  65. package/lib/components/VSelect/index.d.ts +32 -17
  66. package/lib/components/VSlider/VSlider.mjs +33 -15
  67. package/lib/components/VSlider/VSlider.mjs.map +1 -1
  68. package/lib/components/VSlider/index.d.ts +39 -6
  69. package/lib/components/VSlider/slider.mjs +47 -24
  70. package/lib/components/VSlider/slider.mjs.map +1 -1
  71. package/lib/components/VSwitch/VSwitch.mjs +5 -3
  72. package/lib/components/VSwitch/VSwitch.mjs.map +1 -1
  73. package/lib/components/VSwitch/index.d.ts +43 -1
  74. package/lib/components/VTextField/VTextField.mjs +4 -12
  75. package/lib/components/VTextField/VTextField.mjs.map +1 -1
  76. package/lib/components/VTextField/index.d.ts +70 -22
  77. package/lib/components/VTextarea/VTextarea.mjs +4 -12
  78. package/lib/components/VTextarea/VTextarea.mjs.map +1 -1
  79. package/lib/components/VTextarea/index.d.ts +61 -22
  80. package/lib/components/VToolbar/VToolbar.css +3 -1
  81. package/lib/components/VToolbar/VToolbar.sass +3 -1
  82. package/lib/components/VValidation/index.d.ts +10 -1
  83. package/lib/components/index.d.ts +525 -150
  84. package/lib/composables/date.mjs +39 -0
  85. package/lib/composables/date.mjs.map +1 -0
  86. package/lib/composables/focus.mjs +3 -2
  87. package/lib/composables/focus.mjs.map +1 -1
  88. package/lib/composables/index.mjs +1 -0
  89. package/lib/composables/index.mjs.map +1 -1
  90. package/lib/composables/items.mjs +7 -2
  91. package/lib/composables/items.mjs.map +1 -1
  92. package/lib/composables/scroll.mjs +3 -0
  93. package/lib/composables/scroll.mjs.map +1 -1
  94. package/lib/entry-bundler.mjs +1 -1
  95. package/lib/framework.mjs +8 -3
  96. package/lib/framework.mjs.map +1 -1
  97. package/lib/iconsets/mdi-svg.mjs +2 -2
  98. package/lib/iconsets/mdi-svg.mjs.map +1 -1
  99. package/lib/index.d.ts +52 -10
  100. package/lib/labs/VDataTable/VDataTable.mjs +2 -2
  101. package/lib/labs/VDataTable/VDataTable.mjs.map +1 -1
  102. package/lib/labs/VDataTable/VDataTableFooter.mjs.map +1 -1
  103. package/lib/labs/VDataTable/VDataTableHeaders.mjs.map +1 -1
  104. package/lib/labs/VDataTable/VDataTableRows.mjs +52 -44
  105. package/lib/labs/VDataTable/VDataTableRows.mjs.map +1 -1
  106. package/lib/labs/VDataTable/VDataTableServer.mjs +2 -1
  107. package/lib/labs/VDataTable/VDataTableServer.mjs.map +1 -1
  108. package/lib/labs/VDataTable/VDataTableVirtual.mjs +0 -1
  109. package/lib/labs/VDataTable/VDataTableVirtual.mjs.map +1 -1
  110. package/lib/labs/VDataTable/composables/options.mjs +2 -1
  111. package/lib/labs/VDataTable/composables/options.mjs.map +1 -1
  112. package/lib/labs/VDataTable/index.d.ts +44 -11
  113. package/lib/labs/VSkeletonLoader/VSkeletonLoader.mjs +1 -0
  114. package/lib/labs/VSkeletonLoader/VSkeletonLoader.mjs.map +1 -1
  115. package/lib/labs/VSkeletonLoader/index.d.ts +9 -9
  116. package/lib/labs/components.d.ts +53 -20
  117. package/lib/styles/main.css +152 -0
  118. package/lib/styles/settings/_utilities.scss +11 -1
  119. package/lib/util/helpers.mjs +4 -0
  120. package/lib/util/helpers.mjs.map +1 -1
  121. package/package.json +2 -2
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v4.0.0-dev-20230419.0
2
+ * Vuetify v4.0.0-dev-20230421.0
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -203,10 +203,6 @@ function clamp(value) {
203
203
  let max = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
204
204
  return Math.max(min, Math.min(max, value));
205
205
  }
206
- function getDecimals(value) {
207
- const trimmedStr = value.toString().trim();
208
- return trimmedStr.includes('.') ? trimmedStr.length - trimmedStr.indexOf('.') - 1 : 0;
209
- }
210
206
  function padEnd(str, length) {
211
207
  let char = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '0';
212
208
  return str + char.repeat(Math.max(0, length - str.length));
@@ -3249,6 +3245,98 @@ const VToolbar = genericComponent()({
3249
3245
 
3250
3246
  // Utilities
3251
3247
 
3248
+ // Types
3249
+
3250
+ // Composables
3251
+ const makeScrollProps = propsFactory({
3252
+ scrollTarget: {
3253
+ type: String
3254
+ },
3255
+ scrollThreshold: {
3256
+ type: [String, Number]
3257
+ }
3258
+ }, 'scroll');
3259
+ function useScroll(props) {
3260
+ let args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
3261
+ const {
3262
+ thresholdMetCallback,
3263
+ scrollThreshold,
3264
+ canScroll
3265
+ } = args;
3266
+ let previousScroll = 0;
3267
+ const target = ref(null);
3268
+ const currentScroll = ref(0);
3269
+ const savedScroll = ref(0);
3270
+ const currentThreshold = ref(0);
3271
+ const isScrollActive = ref(false);
3272
+ const isScrollingUp = ref(false);
3273
+ const computedScrollThreshold = computed(() => {
3274
+ return Number(props.scrollThreshold ?? scrollThreshold ?? 300);
3275
+ });
3276
+ const onScroll = () => {
3277
+ const targetEl = target.value;
3278
+ if (!targetEl || canScroll && !canScroll.value) return;
3279
+ previousScroll = currentScroll.value;
3280
+ currentScroll.value = 'window' in targetEl ? targetEl.pageYOffset : targetEl.scrollTop;
3281
+ isScrollingUp.value = currentScroll.value < previousScroll;
3282
+ currentThreshold.value = Math.abs(currentScroll.value - computedScrollThreshold.value);
3283
+ };
3284
+ watch(isScrollingUp, () => {
3285
+ savedScroll.value = savedScroll.value || currentScroll.value;
3286
+ });
3287
+ watch(isScrollActive, () => {
3288
+ savedScroll.value = 0;
3289
+ });
3290
+ onMounted(() => {
3291
+ watch(() => props.scrollTarget, scrollTarget => {
3292
+ const newTarget = scrollTarget ? document.querySelector(scrollTarget) : window;
3293
+ if (!newTarget) {
3294
+ consoleWarn(`Unable to locate element with identifier ${scrollTarget}`, getCurrentInstance$1());
3295
+ return;
3296
+ }
3297
+ if (newTarget === target.value) return;
3298
+ target.value?.removeEventListener('scroll', onScroll);
3299
+ target.value = newTarget;
3300
+ target.value.addEventListener('scroll', onScroll, {
3301
+ passive: true
3302
+ });
3303
+ }, {
3304
+ immediate: true
3305
+ });
3306
+ });
3307
+ onBeforeUnmount(() => {
3308
+ target.value?.removeEventListener('scroll', onScroll);
3309
+ });
3310
+ thresholdMetCallback && watch(() => Math.abs(currentScroll.value - savedScroll.value) > computedScrollThreshold.value, thresholdMet => {
3311
+ thresholdMet && thresholdMetCallback({
3312
+ currentThreshold: currentThreshold.value,
3313
+ isScrollingUp: isScrollingUp.value,
3314
+ savedScroll
3315
+ });
3316
+ }, {
3317
+ immediate: true
3318
+ });
3319
+
3320
+ // Do we need this? If yes - seems that
3321
+ // there's no need to expose onScroll
3322
+ canScroll && watch(canScroll, onScroll, {
3323
+ immediate: true
3324
+ });
3325
+ return {
3326
+ computedScrollThreshold,
3327
+ currentScroll,
3328
+ currentThreshold,
3329
+ isScrollActive,
3330
+ // required only for testing
3331
+ // probably can be removed
3332
+ // later (2 chars chlng)
3333
+ isScrollingUp,
3334
+ savedScroll
3335
+ };
3336
+ }
3337
+
3338
+ // Utilities
3339
+
3252
3340
  // Composables
3253
3341
  function useSsrBoot() {
3254
3342
  const isBooted = ref(false);
@@ -3271,13 +3359,7 @@ function useSsrBoot() {
3271
3359
  const VAppBar = genericComponent()({
3272
3360
  name: 'VAppBar',
3273
3361
  props: {
3274
- // TODO: Implement scrolling techniques
3275
- // hideOnScroll: Boolean
3276
- // invertedScroll: Boolean
3277
- // collapseOnScroll: Boolean
3278
- // elevateOnScroll: Boolean
3279
- // shrinkOnScroll: Boolean
3280
- // fadeImageOnScroll: Boolean
3362
+ scrollBehavior: String,
3281
3363
  modelValue: {
3282
3364
  type: Boolean,
3283
3365
  default: true
@@ -3289,6 +3371,7 @@ const VAppBar = genericComponent()({
3289
3371
  },
3290
3372
  ...makeVToolbarProps(),
3291
3373
  ...makeLayoutItemProps(),
3374
+ ...makeScrollProps(),
3292
3375
  height: {
3293
3376
  type: [Number, String],
3294
3377
  default: 64
@@ -3303,11 +3386,63 @@ const VAppBar = genericComponent()({
3303
3386
  } = _ref;
3304
3387
  const vToolbarRef = ref();
3305
3388
  const isActive = useProxiedModel(props, 'modelValue');
3389
+ const scrollBehavior = computed(() => {
3390
+ const behavior = new Set(props.scrollBehavior?.split(' ') ?? []);
3391
+ return {
3392
+ hide: behavior.has('hide'),
3393
+ // fullyHide: behavior.has('fully-hide'),
3394
+ inverted: behavior.has('inverted'),
3395
+ collapse: behavior.has('collapse'),
3396
+ elevate: behavior.has('elevate'),
3397
+ fadeImage: behavior.has('fade-image')
3398
+ // shrink: behavior.has('shrink'),
3399
+ };
3400
+ });
3401
+
3402
+ const canScroll = computed(() => {
3403
+ const behavior = scrollBehavior.value;
3404
+ return behavior.hide ||
3405
+ // behavior.fullyHide ||
3406
+ behavior.inverted || behavior.collapse || behavior.elevate || behavior.fadeImage ||
3407
+ // behavior.shrink ||
3408
+ !isActive.value;
3409
+ });
3410
+ const {
3411
+ currentScroll,
3412
+ currentThreshold,
3413
+ computedScrollThreshold,
3414
+ isScrollingUp
3415
+ } = useScroll(props, {
3416
+ canScroll
3417
+ });
3418
+ const isCollapsed = computed(() => props.collapse || scrollBehavior.value.collapse && (scrollBehavior.value.inverted ? currentScroll.value < 1 : currentScroll.value > 0));
3419
+ const isFlat = computed(() => props.flat || scrollBehavior.value.elevate && currentScroll.value === (scrollBehavior.value.inverted ? 1 : 0));
3420
+ const scrollRatio = computed(() => Math.min((currentThreshold.value - currentScroll.value) / currentThreshold.value || 1, 1));
3421
+ const opacity = computed(() => scrollBehavior.value.fadeImage ? scrollBehavior.value.inverted ? 1 - scrollRatio.value : scrollRatio.value : undefined);
3306
3422
  const height = computed(() => {
3423
+ if (scrollBehavior.value.hide && scrollBehavior.value.inverted) return 0;
3307
3424
  const height = vToolbarRef.value?.contentHeight ?? 0;
3308
3425
  const extensionHeight = vToolbarRef.value?.extensionHeight ?? 0;
3309
3426
  return height + extensionHeight;
3310
3427
  });
3428
+ function setActive() {
3429
+ const val = currentScroll.value;
3430
+ if (scrollBehavior.value.hide) {
3431
+ if (scrollBehavior.value.inverted) {
3432
+ isActive.value = val > computedScrollThreshold.value;
3433
+ } else {
3434
+ isActive.value = isScrollingUp.value || val < computedScrollThreshold.value;
3435
+ }
3436
+ } else if (scrollBehavior.value.inverted) {
3437
+ isActive.value = currentScroll.value === 0;
3438
+ } else {
3439
+ isActive.value = true;
3440
+ }
3441
+ }
3442
+ watch(currentScroll, setActive, {
3443
+ immediate: true
3444
+ });
3445
+ watch(scrollBehavior, setActive);
3311
3446
  const {
3312
3447
  ssrBootStyles
3313
3448
  } = useSsrBoot();
@@ -3318,7 +3453,7 @@ const VAppBar = genericComponent()({
3318
3453
  order: computed(() => parseInt(props.order, 10)),
3319
3454
  position: toRef(props, 'location'),
3320
3455
  layoutSize: height,
3321
- elementSize: height,
3456
+ elementSize: ref(undefined),
3322
3457
  active: isActive,
3323
3458
  absolute: toRef(props, 'absolute')
3324
3459
  });
@@ -3331,10 +3466,14 @@ const VAppBar = genericComponent()({
3331
3466
  }],
3332
3467
  "style": {
3333
3468
  ...layoutItemStyles.value,
3469
+ '--v-toolbar-image-opacity': opacity.value,
3334
3470
  height: undefined,
3335
3471
  ...ssrBootStyles.value
3336
3472
  }
3337
- }, toolbarProps), slots);
3473
+ }, toolbarProps, {
3474
+ "collapse": isCollapsed.value,
3475
+ "flat": isFlat.value
3476
+ }), slots);
3338
3477
  });
3339
3478
  return {};
3340
3479
  }
@@ -5292,7 +5431,8 @@ const VFieldLabel = genericComponent()({
5292
5431
 
5293
5432
  // Composables
5294
5433
  const makeFocusProps = propsFactory({
5295
- focused: Boolean
5434
+ focused: Boolean,
5435
+ 'onUpdate:focused': EventProp()
5296
5436
  }, 'focus');
5297
5437
  function useFocus(props) {
5298
5438
  let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName();
@@ -5887,6 +6027,8 @@ const makeVInputProps = propsFactory({
5887
6027
  appendIcon: IconValue,
5888
6028
  prependIcon: IconValue,
5889
6029
  hideDetails: [Boolean, String],
6030
+ hint: String,
6031
+ persistentHint: Boolean,
5890
6032
  messages: {
5891
6033
  type: [Array, String],
5892
6034
  default: () => []
@@ -5950,10 +6092,19 @@ const VInput = genericComponent()({
5950
6092
  resetValidation,
5951
6093
  validate
5952
6094
  }));
6095
+ const messages = computed(() => {
6096
+ if (errorMessages.value.length > 0) {
6097
+ return errorMessages.value;
6098
+ } else if (props.hint && (props.persistentHint || props.focused)) {
6099
+ return props.hint;
6100
+ } else {
6101
+ return props.messages;
6102
+ }
6103
+ });
5953
6104
  useRender(() => {
5954
6105
  const hasPrepend = !!(slots.prepend || props.prependIcon);
5955
6106
  const hasAppend = !!(slots.append || props.appendIcon);
5956
- const hasMessages = !!(props.messages?.length || errorMessages.value.length);
6107
+ const hasMessages = messages.value.length > 0;
5957
6108
  const hasDetails = !props.hideDetails || props.hideDetails === 'auto' && (hasMessages || !!slots.details);
5958
6109
  return createVNode("div", {
5959
6110
  "class": ['v-input', `v-input--${props.direction}`, densityClasses.value, validationClasses.value]
@@ -5976,7 +6127,7 @@ const VInput = genericComponent()({
5976
6127
  }, [createVNode(VMessages, {
5977
6128
  "id": messagesId.value,
5978
6129
  "active": hasMessages,
5979
- "messages": errorMessages.value.length > 0 ? errorMessages.value : props.messages
6130
+ "messages": messages.value
5980
6131
  }, {
5981
6132
  message: slots.message
5982
6133
  }), slots.details?.(slotProps.value)])]);
@@ -5988,10 +6139,6 @@ const VInput = genericComponent()({
5988
6139
  };
5989
6140
  }
5990
6141
  });
5991
- function filterInputProps(props) {
5992
- const keys = Object.keys(VInput.props).filter(k => !isOn(k));
5993
- return pick(props, keys);
5994
- }
5995
6142
 
5996
6143
  const VCounter = genericComponent()({
5997
6144
  name: 'VCounter',
@@ -6117,8 +6264,6 @@ const makeVTextFieldProps = propsFactory({
6117
6264
  autofocus: Boolean,
6118
6265
  counter: [Boolean, Number, String],
6119
6266
  counterValue: Function,
6120
- hint: String,
6121
- persistentHint: Boolean,
6122
6267
  prefix: String,
6123
6268
  placeholder: String,
6124
6269
  persistentPlaceholder: Boolean,
@@ -6173,9 +6318,6 @@ const VTextField = genericComponent()({
6173
6318
  const vFieldRef = ref();
6174
6319
  const inputRef = ref();
6175
6320
  const isActive = computed(() => activeTypes.includes(props.type) || props.persistentPlaceholder || isFocused.value);
6176
- const messages = computed(() => {
6177
- return props.messages.length ? props.messages : isFocused.value || props.persistentHint ? props.hint : '';
6178
- });
6179
6321
  function onFocus() {
6180
6322
  if (inputRef.value !== document.activeElement) {
6181
6323
  inputRef.value?.focus();
@@ -6218,7 +6360,7 @@ const VTextField = genericComponent()({
6218
6360
  const [{
6219
6361
  modelValue: _,
6220
6362
  ...inputProps
6221
- }] = filterInputProps(props);
6363
+ }] = VInput.filterProps(props);
6222
6364
  const [fieldProps] = filterFieldProps(props);
6223
6365
  return createVNode(VInput, mergeProps({
6224
6366
  "ref": vInputRef,
@@ -6228,12 +6370,9 @@ const VTextField = genericComponent()({
6228
6370
  'v-text-field--prefixed': props.prefix,
6229
6371
  'v-text-field--suffixed': props.suffix,
6230
6372
  'v-text-field--flush-details': ['plain', 'underlined'].includes(props.variant)
6231
- }],
6232
- "onClick:prepend": props['onClick:prepend'],
6233
- "onClick:append": props['onClick:append']
6373
+ }]
6234
6374
  }, rootAttrs, inputProps, {
6235
- "focused": isFocused.value,
6236
- "messages": messages.value
6375
+ "focused": isFocused.value
6237
6376
  }), {
6238
6377
  ...slots,
6239
6378
  default: _ref2 => {
@@ -6642,7 +6781,7 @@ const VCheckbox = genericComponent()({
6642
6781
  const id = computed(() => props.id || `checkbox-${uid}`);
6643
6782
  useRender(() => {
6644
6783
  const [inputAttrs, controlAttrs] = filterInputAttrs(attrs);
6645
- const [inputProps, _1] = filterInputProps(props);
6784
+ const [inputProps, _1] = VInput.filterProps(props);
6646
6785
  const [checkboxProps, _2] = VCheckboxBtn.filterProps(props);
6647
6786
  return createVNode(VInput, mergeProps({
6648
6787
  "class": "v-checkbox"
@@ -8054,7 +8193,12 @@ function transformItems$1(props, items) {
8054
8193
  function useItems(props) {
8055
8194
  const items = computed(() => transformItems$1(props, props.items));
8056
8195
  function transformIn(value) {
8057
- return value.map(item => transformItem$1(props, item));
8196
+ return value.map(v => {
8197
+ const existingItem = items.value.find(item => deepEqual(v, item.value));
8198
+ // Nullish existingItem means value is a custom input value from combobox
8199
+ // In this case, use transformItem to create an InternalItem based on value
8200
+ return existingItem ?? transformItem$1(props, v);
8201
+ });
8058
8202
  }
8059
8203
  function transformOut(value) {
8060
8204
  return value.map(_ref => {
@@ -8732,7 +8876,7 @@ function staticLocationStrategy() {
8732
8876
  }
8733
8877
 
8734
8878
  /** Get size of element ignoring max-width/max-height */
8735
- function getIntrinsicSize(el) {
8879
+ function getIntrinsicSize(el, isRtl) {
8736
8880
  // const scrollables = new Map<Element, [number, number]>()
8737
8881
  // el.querySelectorAll('*').forEach(el => {
8738
8882
  // const x = el.scrollLeft
@@ -8749,7 +8893,11 @@ function getIntrinsicSize(el) {
8749
8893
 
8750
8894
  /* eslint-disable-next-line sonarjs/prefer-immediate-return */
8751
8895
  const contentBox = nullifyTransforms(el);
8752
- contentBox.x -= parseFloat(el.style.left || 0);
8896
+ if (isRtl) {
8897
+ contentBox.x += parseFloat(el.style.right || 0);
8898
+ } else {
8899
+ contentBox.x -= parseFloat(el.style.left || 0);
8900
+ }
8753
8901
  contentBox.y -= parseFloat(el.style.top || 0);
8754
8902
 
8755
8903
  // el.style.maxWidth = initialMaxWidth
@@ -8830,7 +8978,7 @@ function connectedLocationStrategy(data, props, contentStyles) {
8830
8978
  });
8831
8979
  if (!data.activatorEl.value || !data.contentEl.value) return;
8832
8980
  const targetBox = data.activatorEl.value.getBoundingClientRect();
8833
- const contentBox = getIntrinsicSize(data.contentEl.value);
8981
+ const contentBox = getIntrinsicSize(data.contentEl.value, data.isRtl.value);
8834
8982
  const scrollParents = getScrollParents(data.contentEl.value);
8835
8983
  const viewportMargin = 12;
8836
8984
  if (!scrollParents.length) {
@@ -9006,7 +9154,8 @@ function connectedLocationStrategy(data, props, contentStyles) {
9006
9154
  transformOrigin: `${placement.origin.side} ${placement.origin.align}`,
9007
9155
  // transform: `translate(${pixelRound(x)}px, ${pixelRound(y)}px)`,
9008
9156
  top: convertToUnit(pixelRound(y)),
9009
- left: convertToUnit(pixelRound(x)),
9157
+ left: data.isRtl.value ? undefined : convertToUnit(pixelRound(x)),
9158
+ right: data.isRtl.value ? convertToUnit(pixelRound(-x)) : undefined,
9010
9159
  minWidth: convertToUnit(axis === 'y' ? Math.min(minWidth.value, targetBox.width) : minWidth.value),
9011
9160
  maxWidth: convertToUnit(pixelCeil(clamp(available.x, minWidth.value === Infinity ? 0 : minWidth.value, maxWidth.value))),
9012
9161
  maxHeight: convertToUnit(pixelCeil(clamp(available.y, minHeight.value === Infinity ? 0 : minHeight.value, maxHeight.value)))
@@ -9901,6 +10050,7 @@ const VSelect = genericComponent()({
9901
10050
  })
9902
10051
  },
9903
10052
  emits: {
10053
+ 'update:focused': focused => true,
9904
10054
  'update:modelValue': val => true,
9905
10055
  'update:menu': val => true
9906
10056
  },
@@ -10017,6 +10167,9 @@ const VSelect = genericComponent()({
10017
10167
  menu.value = false;
10018
10168
  }
10019
10169
  }
10170
+ function onFocusin(e) {
10171
+ isFocused.value = true;
10172
+ }
10020
10173
  function onFocusout(e) {
10021
10174
  if (e.relatedTarget == null) {
10022
10175
  vTextFieldRef.value?.focus();
@@ -10071,6 +10224,7 @@ const VSelect = genericComponent()({
10071
10224
  "selected": selected.value,
10072
10225
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
10073
10226
  "onMousedown": e => e.preventDefault(),
10227
+ "onFocusin": onFocusin,
10074
10228
  "onFocusout": onFocusout
10075
10229
  }, {
10076
10230
  default: () => [!displayItems.value.length && !props.hideNoData && (slots['no-data']?.() ?? createVNode(VListItem, {
@@ -10149,6 +10303,7 @@ const VSelect = genericComponent()({
10149
10303
  });
10150
10304
  });
10151
10305
  return forwardRefs({
10306
+ isFocused,
10152
10307
  menu,
10153
10308
  select
10154
10309
  }, vTextFieldRef);
@@ -10287,6 +10442,7 @@ const VAutocomplete = genericComponent()({
10287
10442
  })
10288
10443
  },
10289
10444
  emits: {
10445
+ 'update:focused': focused => true,
10290
10446
  'update:search': val => true,
10291
10447
  'update:modelValue': val => true,
10292
10448
  'update:menu': val => true
@@ -10310,11 +10466,17 @@ const VAutocomplete = genericComponent()({
10310
10466
  _menu.value = v;
10311
10467
  }
10312
10468
  });
10469
+ const selectionIndex = ref(-1);
10470
+ const color = computed(() => vTextFieldRef.value?.color);
10313
10471
  const {
10314
10472
  items,
10315
10473
  transformIn,
10316
10474
  transformOut
10317
10475
  } = useItems(props);
10476
+ const {
10477
+ textColorClasses,
10478
+ textColorStyles
10479
+ } = useTextColor(color);
10318
10480
  const search = useProxiedModel(props, 'search', '');
10319
10481
  const model = useProxiedModel(props, 'modelValue', [], v => transformIn(wrapInArray(v)), v => {
10320
10482
  const transformed = transformOut(v);
@@ -10337,6 +10499,7 @@ const VAutocomplete = genericComponent()({
10337
10499
  return filteredItems.value;
10338
10500
  });
10339
10501
  const selected = computed(() => selections.value.map(selection => selection.props.value));
10502
+ const selection = computed(() => selections.value[selectionIndex.value]);
10340
10503
  const listRef = ref();
10341
10504
  function onClear(e) {
10342
10505
  if (props.openOnClear) {
@@ -10350,7 +10513,9 @@ const VAutocomplete = genericComponent()({
10350
10513
  }
10351
10514
  function onKeydown(e) {
10352
10515
  if (props.readonly || form?.isReadonly.value) return;
10353
- if (['Enter', 'ArrowDown', 'ArrowUp'].includes(e.key)) {
10516
+ const selectionStart = vTextFieldRef.value.selectionStart;
10517
+ const length = selected.value.length;
10518
+ if (selectionIndex.value > -1 || ['Enter', 'ArrowDown', 'ArrowUp'].includes(e.key)) {
10354
10519
  e.preventDefault();
10355
10520
  }
10356
10521
  if (['Enter', 'ArrowDown'].includes(e.key)) {
@@ -10367,6 +10532,38 @@ const VAutocomplete = genericComponent()({
10367
10532
  } else if (e.key === 'ArrowUp') {
10368
10533
  listRef.value?.focus('prev');
10369
10534
  }
10535
+ if (!props.multiple) return;
10536
+ if (['Backspace', 'Delete'].includes(e.key)) {
10537
+ if (selectionIndex.value < 0) {
10538
+ if (e.key === 'Backspace' && !search.value) {
10539
+ selectionIndex.value = length - 1;
10540
+ }
10541
+ return;
10542
+ }
10543
+ const originalSelectionIndex = selectionIndex.value;
10544
+ if (selection.value) select(selection.value);
10545
+ selectionIndex.value = originalSelectionIndex >= length - 1 ? length - 2 : originalSelectionIndex;
10546
+ }
10547
+ if (e.key === 'ArrowLeft') {
10548
+ if (selectionIndex.value < 0 && selectionStart > 0) return;
10549
+ const prev = selectionIndex.value > -1 ? selectionIndex.value - 1 : length - 1;
10550
+ if (selections.value[prev]) {
10551
+ selectionIndex.value = prev;
10552
+ } else {
10553
+ selectionIndex.value = -1;
10554
+ vTextFieldRef.value.setSelectionRange(search.value?.length, search.value?.length);
10555
+ }
10556
+ }
10557
+ if (e.key === 'ArrowRight') {
10558
+ if (selectionIndex.value < 0) return;
10559
+ const next = selectionIndex.value + 1;
10560
+ if (selections.value[next]) {
10561
+ selectionIndex.value = next;
10562
+ } else {
10563
+ selectionIndex.value = -1;
10564
+ vTextFieldRef.value.setSelectionRange(0, 0);
10565
+ }
10566
+ }
10370
10567
  }
10371
10568
  function onInput(e) {
10372
10569
  search.value = e.target.value;
@@ -10388,7 +10585,6 @@ const VAutocomplete = genericComponent()({
10388
10585
  const index = selected.value.findIndex(selection => props.valueComparator(selection, item.value));
10389
10586
  if (index === -1) {
10390
10587
  model.value = [...model.value, item];
10391
- search.value = '';
10392
10588
  } else {
10393
10589
  const value = [...model.value];
10394
10590
  value.splice(index, 1);
@@ -10433,12 +10629,15 @@ const VAutocomplete = genericComponent()({
10433
10629
  "onUpdate:modelValue": v => {
10434
10630
  if (v == null) model.value = [];
10435
10631
  },
10632
+ "focused": isFocused.value,
10633
+ "onUpdate:focused": $event => isFocused.value = $event,
10436
10634
  "validationValue": model.externalValue,
10437
10635
  "dirty": isDirty,
10438
10636
  "onInput": onInput,
10439
10637
  "class": ['v-autocomplete', {
10440
10638
  'v-autocomplete--active-menu': menu.value,
10441
10639
  'v-autocomplete--chips': !!props.chips,
10640
+ 'v-autocomplete--selecting-index': selectionIndex.value > -1,
10442
10641
  [`v-autocomplete--${props.multiple ? 'multiple' : 'single'}`]: true,
10443
10642
  'v-autocomplete--selection-slot': !!slots.selection
10444
10643
  }],
@@ -10447,8 +10646,6 @@ const VAutocomplete = genericComponent()({
10447
10646
  "placeholder": isDirty ? undefined : props.placeholder,
10448
10647
  "onClick:clear": onClear,
10449
10648
  "onMousedown:control": onMousedownControl,
10450
- "onFocus": () => isFocused.value = true,
10451
- "onBlur": () => isFocused.value = false,
10452
10649
  "onKeydown": onKeydown
10453
10650
  }), {
10454
10651
  ...slots,
@@ -10513,7 +10710,8 @@ const VAutocomplete = genericComponent()({
10513
10710
  };
10514
10711
  return createVNode("div", {
10515
10712
  "key": item.value,
10516
- "class": "v-autocomplete__selection"
10713
+ "class": ['v-autocomplete__selection', index === selectionIndex.value && ['v-autocomplete__selection--selected', textColorClasses.value]],
10714
+ "style": index === selectionIndex.value ? textColorStyles.value : {}
10517
10715
  }, [hasChips ? !slots.chip ? createVNode(VChip, mergeProps({
10518
10716
  "key": "chip",
10519
10717
  "closable": props.closableChips,
@@ -12408,11 +12606,36 @@ const makeSliderProps = propsFactory({
12408
12606
  elevation: 2
12409
12607
  })
12410
12608
  }, 'slider');
12609
+ const useSteps = props => {
12610
+ const min = computed(() => parseFloat(props.min));
12611
+ const max = computed(() => parseFloat(props.max));
12612
+ const step = computed(() => +props.step > 0 ? parseFloat(props.step) : 0);
12613
+ const decimals = computed(() => {
12614
+ const trimmedStep = step.value.toString().trim();
12615
+ return trimmedStep.includes('.') ? trimmedStep.length - trimmedStep.indexOf('.') - 1 : 0;
12616
+ });
12617
+ function roundValue(value) {
12618
+ if (step.value <= 0) return value;
12619
+ const clamped = clamp(value, min.value, max.value);
12620
+ const offset = min.value % step.value;
12621
+ const newValue = Math.round((clamped - offset) / step.value) * step.value + offset;
12622
+ return parseFloat(Math.min(newValue, max.value).toFixed(decimals.value));
12623
+ }
12624
+ return {
12625
+ min,
12626
+ max,
12627
+ step,
12628
+ decimals,
12629
+ roundValue
12630
+ };
12631
+ };
12411
12632
  const useSlider = _ref => {
12412
12633
  let {
12413
12634
  props,
12414
- handleSliderMouseUp,
12415
- handleMouseMove,
12635
+ steps,
12636
+ onSliderStart,
12637
+ onSliderMove,
12638
+ onSliderEnd,
12416
12639
  getActiveThumb
12417
12640
  } = _ref;
12418
12641
  const {
@@ -12426,10 +12649,13 @@ const useSlider = _ref => {
12426
12649
  }
12427
12650
  return hd;
12428
12651
  });
12429
- const min = computed(() => parseFloat(props.min));
12430
- const max = computed(() => parseFloat(props.max));
12431
- const step = computed(() => +props.step > 0 ? parseFloat(props.step) : 0);
12432
- const decimals = computed(() => Math.max(getDecimals(step.value), getDecimals(min.value)));
12652
+ const {
12653
+ min,
12654
+ max,
12655
+ step,
12656
+ decimals,
12657
+ roundValue
12658
+ } = steps;
12433
12659
  const thumbSize = computed(() => parseInt(props.thumbSize, 10));
12434
12660
  const tickSize = computed(() => parseInt(props.tickSize, 10));
12435
12661
  const trackSize = computed(() => parseInt(props.trackSize, 10));
@@ -12443,13 +12669,6 @@ const useSlider = _ref => {
12443
12669
  const startOffset = ref(0);
12444
12670
  const trackContainerRef = ref();
12445
12671
  const activeThumbRef = ref();
12446
- function roundValue(value) {
12447
- if (step.value <= 0) return value;
12448
- const clamped = clamp(value, min.value, max.value);
12449
- const offset = min.value % step.value;
12450
- const newValue = Math.round((clamped - offset) / step.value) * step.value + offset;
12451
- return parseFloat(Math.min(newValue, max.value).toFixed(decimals.value));
12452
- }
12453
12672
  function parseMouseMove(e) {
12454
12673
  const vertical = props.direction === 'vertical';
12455
12674
  const start = vertical ? 'top' : 'left';
@@ -12466,14 +12685,11 @@ const useSlider = _ref => {
12466
12685
  if (vertical || horizontalDirection.value === 'rtl') clickPos = 1 - clickPos;
12467
12686
  return roundValue(min.value + clickPos * (max.value - min.value));
12468
12687
  }
12469
- let thumbMoved = false;
12470
12688
  const handleStop = e => {
12471
- if (!thumbMoved) {
12472
- startOffset.value = 0;
12473
- handleSliderMouseUp(parseMouseMove(e));
12474
- }
12689
+ onSliderEnd({
12690
+ value: parseMouseMove(e)
12691
+ });
12475
12692
  mousePressed.value = false;
12476
- thumbMoved = false;
12477
12693
  startOffset.value = 0;
12478
12694
  };
12479
12695
  const handleStart = e => {
@@ -12482,20 +12698,25 @@ const useSlider = _ref => {
12482
12698
  activeThumbRef.value.focus();
12483
12699
  mousePressed.value = true;
12484
12700
  if (activeThumbRef.value.contains(e.target)) {
12485
- thumbMoved = true;
12486
12701
  startOffset.value = getOffset(e, activeThumbRef.value, props.direction);
12487
12702
  } else {
12488
12703
  startOffset.value = 0;
12489
- handleMouseMove(parseMouseMove(e));
12704
+ onSliderMove({
12705
+ value: parseMouseMove(e)
12706
+ });
12490
12707
  }
12708
+ onSliderStart({
12709
+ value: parseMouseMove(e)
12710
+ });
12491
12711
  };
12492
12712
  const moveListenerOptions = {
12493
12713
  passive: true,
12494
12714
  capture: true
12495
12715
  };
12496
12716
  function onMouseMove(e) {
12497
- thumbMoved = true;
12498
- handleMouseMove(parseMouseMove(e));
12717
+ onSliderMove({
12718
+ value: parseMouseMove(e)
12719
+ });
12499
12720
  }
12500
12721
  function onSliderMouseUp(e) {
12501
12722
  e.stopPropagation();
@@ -12871,13 +13092,21 @@ const VSlider = genericComponent()({
12871
13092
  },
12872
13093
  emits: {
12873
13094
  'update:focused': value => true,
12874
- 'update:modelValue': v => true
13095
+ 'update:modelValue': v => true,
13096
+ start: value => true,
13097
+ end: value => true
12875
13098
  },
12876
13099
  setup(props, _ref) {
12877
13100
  let {
12878
- slots
13101
+ slots,
13102
+ emit
12879
13103
  } = _ref;
12880
13104
  const thumbContainerRef = ref();
13105
+ const steps = useSteps(props);
13106
+ const model = useProxiedModel(props, 'modelValue', undefined, v => {
13107
+ const value = typeof v === 'string' ? parseFloat(v) : v == null ? steps.min.value : v;
13108
+ return steps.roundValue(value);
13109
+ });
12881
13110
  const {
12882
13111
  min,
12883
13112
  max,
@@ -12891,16 +13120,26 @@ const VSlider = genericComponent()({
12891
13120
  readonly
12892
13121
  } = useSlider({
12893
13122
  props,
12894
- // eslint-disable-next-line @typescript-eslint/no-use-before-define
12895
- handleSliderMouseUp: newValue => model.value = roundValue(newValue),
12896
- // eslint-disable-next-line @typescript-eslint/no-use-before-define
12897
- handleMouseMove: newValue => model.value = roundValue(newValue),
13123
+ steps,
13124
+ onSliderStart: () => {
13125
+ emit('start', model.value);
13126
+ },
13127
+ onSliderEnd: _ref2 => {
13128
+ let {
13129
+ value
13130
+ } = _ref2;
13131
+ const roundedValue = roundValue(value);
13132
+ model.value = roundedValue;
13133
+ emit('end', roundedValue);
13134
+ },
13135
+ onSliderMove: _ref3 => {
13136
+ let {
13137
+ value
13138
+ } = _ref3;
13139
+ return model.value = roundValue(value);
13140
+ },
12898
13141
  getActiveThumb: () => thumbContainerRef.value?.$el
12899
13142
  });
12900
- const model = useProxiedModel(props, 'modelValue', undefined, v => {
12901
- const value = typeof v === 'string' ? parseFloat(v) : v == null ? min.value : v;
12902
- return roundValue(value);
12903
- });
12904
13143
  const {
12905
13144
  isFocused,
12906
13145
  focus,
@@ -12908,7 +13147,7 @@ const VSlider = genericComponent()({
12908
13147
  } = useFocus(props);
12909
13148
  const trackStop = computed(() => position(model.value));
12910
13149
  useRender(() => {
12911
- const [inputProps, _] = filterInputProps(props);
13150
+ const [inputProps, _] = VInput.filterProps(props);
12912
13151
  const hasPrepend = !!(props.label || slots.label || slots.prepend);
12913
13152
  return createVNode(VInput, mergeProps({
12914
13153
  "class": ['v-slider', {
@@ -12926,11 +13165,11 @@ const VSlider = genericComponent()({
12926
13165
  "class": "v-slider__label",
12927
13166
  "text": props.label
12928
13167
  }, null) : undefined, slots.prepend?.(slotProps)]) : undefined,
12929
- default: _ref2 => {
13168
+ default: _ref4 => {
12930
13169
  let {
12931
13170
  id,
12932
13171
  messagesId
12933
- } = _ref2;
13172
+ } = _ref4;
12934
13173
  return createVNode("div", {
12935
13174
  "class": "v-slider__container",
12936
13175
  "onMousedown": !readonly.value ? onSliderMousedown : undefined,
@@ -13572,6 +13811,7 @@ const VCombobox = genericComponent()({
13572
13811
  })
13573
13812
  },
13574
13813
  emits: {
13814
+ 'update:focused': focused => true,
13575
13815
  'update:modelValue': val => true,
13576
13816
  'update:search': val => true,
13577
13817
  'update:menu': val => true
@@ -13709,8 +13949,9 @@ const VCombobox = genericComponent()({
13709
13949
  }
13710
13950
  return;
13711
13951
  }
13712
- select(selection.value);
13713
- nextTick(() => !selection.value && (selectionIndex.value = length - 2));
13952
+ const originalSelectionIndex = selectionIndex.value;
13953
+ if (selection.value) select(selection.value);
13954
+ selectionIndex.value = originalSelectionIndex >= length - 1 ? length - 2 : originalSelectionIndex;
13714
13955
  }
13715
13956
  if (e.key === 'ArrowLeft') {
13716
13957
  if (selectionIndex.value < 0 && selectionStart > 0) return;
@@ -13795,6 +14036,8 @@ const VCombobox = genericComponent()({
13795
14036
  "onUpdate:modelValue": [$event => search.value = $event, v => {
13796
14037
  if (v == null) model.value = [];
13797
14038
  }],
14039
+ "focused": isFocused.value,
14040
+ "onUpdate:focused": $event => isFocused.value = $event,
13798
14041
  "validationValue": model.externalValue,
13799
14042
  "dirty": isDirty,
13800
14043
  "class": ['v-combobox', {
@@ -13808,8 +14051,6 @@ const VCombobox = genericComponent()({
13808
14051
  "placeholder": isDirty ? undefined : props.placeholder,
13809
14052
  "onClick:clear": onClear,
13810
14053
  "onMousedown:control": onMousedownControl,
13811
- "onFocus": () => isFocused.value = true,
13812
- "onBlur": () => isFocused.value = false,
13813
14054
  "onKeydown": onKeydown
13814
14055
  }), {
13815
14056
  ...slots,
@@ -14261,8 +14502,6 @@ const VFileInput = genericComponent()({
14261
14502
  default: '$vuetify.fileInput.counter'
14262
14503
  },
14263
14504
  multiple: Boolean,
14264
- hint: String,
14265
- persistentHint: Boolean,
14266
14505
  showSize: {
14267
14506
  type: [Boolean, Number],
14268
14507
  default: false,
@@ -14287,6 +14526,7 @@ const VFileInput = genericComponent()({
14287
14526
  emits: {
14288
14527
  'click:control': e => true,
14289
14528
  'mousedown:control': e => true,
14529
+ 'update:focused': focused => true,
14290
14530
  'update:modelValue': files => true
14291
14531
  },
14292
14532
  setup(props, _ref) {
@@ -14299,6 +14539,11 @@ const VFileInput = genericComponent()({
14299
14539
  t
14300
14540
  } = useLocale();
14301
14541
  const model = useProxiedModel(props, 'modelValue');
14542
+ const {
14543
+ isFocused,
14544
+ focus,
14545
+ blur
14546
+ } = useFocus(props);
14302
14547
  const base = computed(() => typeof props.showSize !== 'boolean' ? props.showSize : undefined);
14303
14548
  const totalBytes = computed(() => (model.value ?? []).reduce((bytes, _ref2) => {
14304
14549
  let {
@@ -14320,21 +14565,14 @@ const VFileInput = genericComponent()({
14320
14565
  });
14321
14566
  const vInputRef = ref();
14322
14567
  const vFieldRef = ref();
14323
- const isFocused = ref(false);
14324
14568
  const inputRef = ref();
14325
- const messages = computed(() => {
14326
- return props.messages.length ? props.messages : props.persistentHint ? props.hint : '';
14327
- });
14328
14569
  function onFocus() {
14329
14570
  if (inputRef.value !== document.activeElement) {
14330
14571
  inputRef.value?.focus();
14331
14572
  }
14332
- if (!isFocused.value) {
14333
- isFocused.value = true;
14334
- }
14573
+ if (!isFocused.value) focus();
14335
14574
  }
14336
14575
  function onClickPrepend(e) {
14337
- callEvent(props['onClick:prepend'], e);
14338
14576
  onControlClick(e);
14339
14577
  }
14340
14578
  function onControlMousedown(e) {
@@ -14365,18 +14603,16 @@ const VFileInput = genericComponent()({
14365
14603
  const [{
14366
14604
  modelValue: _,
14367
14605
  ...inputProps
14368
- }] = filterInputProps(props);
14606
+ }] = VInput.filterProps(props);
14369
14607
  const [fieldProps] = filterFieldProps(props);
14370
14608
  return createVNode(VInput, mergeProps({
14371
14609
  "ref": vInputRef,
14372
14610
  "modelValue": model.value,
14373
14611
  "onUpdate:modelValue": $event => model.value = $event,
14374
14612
  "class": "v-file-input",
14375
- "onClick:prepend": onClickPrepend,
14376
- "onClick:append": props['onClick:append']
14613
+ "onClick:prepend": onClickPrepend
14377
14614
  }, rootAttrs, inputProps, {
14378
- "focused": isFocused.value,
14379
- "messages": messages.value
14615
+ "focused": isFocused.value
14380
14616
  }), {
14381
14617
  ...slots,
14382
14618
  default: _ref3 => {
@@ -14428,7 +14664,7 @@ const VFileInput = genericComponent()({
14428
14664
  model.value = [...(target.files ?? [])];
14429
14665
  },
14430
14666
  "onFocus": onFocus,
14431
- "onBlur": () => isFocused.value = false
14667
+ "onBlur": blur
14432
14668
  }, slotProps, inputAttrs), null), createVNode("div", {
14433
14669
  "class": fieldClass
14434
14670
  }, [!!model.value?.length && (slots.selection ? slots.selection({
@@ -15119,6 +15355,432 @@ const VMain = genericComponent()({
15119
15355
  }
15120
15356
  });
15121
15357
 
15358
+ // Utilities
15359
+
15360
+ // Types
15361
+
15362
+ function getWeekArray(date) {
15363
+ let currentWeek = [];
15364
+ const weeks = [];
15365
+ const firstDayOfMonth = startOfMonth(date);
15366
+ const lastDayOfMonth = endOfMonth(date);
15367
+ for (let i = 0; i < firstDayOfMonth.getDay(); i++) {
15368
+ currentWeek.push(null);
15369
+ }
15370
+ for (let i = 1; i <= lastDayOfMonth.getDate(); i++) {
15371
+ const day = new Date(date.getFullYear(), date.getMonth(), i);
15372
+
15373
+ // Add the day to the current week
15374
+ currentWeek.push(day);
15375
+
15376
+ // If the current week has 7 days, add it to the weeks array and start a new week
15377
+ if (currentWeek.length === 7) {
15378
+ weeks.push(currentWeek);
15379
+ currentWeek = [];
15380
+ }
15381
+ }
15382
+ for (let i = currentWeek.length; i < 7; i++) {
15383
+ currentWeek.push(null);
15384
+ }
15385
+ weeks.push(currentWeek);
15386
+ return weeks;
15387
+ }
15388
+ function startOfMonth(date) {
15389
+ return new Date(date.getFullYear(), date.getMonth(), 1);
15390
+ }
15391
+ function endOfMonth(date) {
15392
+ return new Date(date.getFullYear(), date.getMonth() + 1, 0);
15393
+ }
15394
+ function date(value) {
15395
+ if (value == null) return null;
15396
+ if (value instanceof Date) return value;
15397
+ if (typeof value === 'string') {
15398
+ const parsed = Date.parse(value);
15399
+ if (!isNaN(parsed)) return new Date(parsed);
15400
+ }
15401
+ return null;
15402
+ }
15403
+ const firstDay = {
15404
+ '001': 1,
15405
+ AD: 1,
15406
+ AE: 6,
15407
+ AF: 6,
15408
+ AG: 0,
15409
+ AI: 1,
15410
+ AL: 1,
15411
+ AM: 1,
15412
+ AN: 1,
15413
+ AR: 1,
15414
+ AS: 0,
15415
+ AT: 1,
15416
+ AU: 0,
15417
+ AX: 1,
15418
+ AZ: 1,
15419
+ BA: 1,
15420
+ BD: 0,
15421
+ BE: 1,
15422
+ BG: 1,
15423
+ BH: 6,
15424
+ BM: 1,
15425
+ BN: 1,
15426
+ BR: 0,
15427
+ BS: 0,
15428
+ BT: 0,
15429
+ BW: 0,
15430
+ BY: 1,
15431
+ BZ: 0,
15432
+ CA: 0,
15433
+ CH: 1,
15434
+ CL: 1,
15435
+ CM: 1,
15436
+ CN: 0,
15437
+ CO: 0,
15438
+ CR: 1,
15439
+ CY: 1,
15440
+ CZ: 1,
15441
+ DE: 1,
15442
+ DJ: 6,
15443
+ DK: 1,
15444
+ DM: 0,
15445
+ DO: 0,
15446
+ DZ: 6,
15447
+ EC: 1,
15448
+ EE: 1,
15449
+ EG: 6,
15450
+ ES: 1,
15451
+ ET: 0,
15452
+ FI: 1,
15453
+ FJ: 1,
15454
+ FO: 1,
15455
+ FR: 1,
15456
+ GB: 1,
15457
+ 'GB-alt-variant': 0,
15458
+ GE: 1,
15459
+ GF: 1,
15460
+ GP: 1,
15461
+ GR: 1,
15462
+ GT: 0,
15463
+ GU: 0,
15464
+ HK: 0,
15465
+ HN: 0,
15466
+ HR: 1,
15467
+ HU: 1,
15468
+ ID: 0,
15469
+ IE: 1,
15470
+ IL: 0,
15471
+ IN: 0,
15472
+ IQ: 6,
15473
+ IR: 6,
15474
+ IS: 1,
15475
+ IT: 1,
15476
+ JM: 0,
15477
+ JO: 6,
15478
+ JP: 0,
15479
+ KE: 0,
15480
+ KG: 1,
15481
+ KH: 0,
15482
+ KR: 0,
15483
+ KW: 6,
15484
+ KZ: 1,
15485
+ LA: 0,
15486
+ LB: 1,
15487
+ LI: 1,
15488
+ LK: 1,
15489
+ LT: 1,
15490
+ LU: 1,
15491
+ LV: 1,
15492
+ LY: 6,
15493
+ MC: 1,
15494
+ MD: 1,
15495
+ ME: 1,
15496
+ MH: 0,
15497
+ MK: 1,
15498
+ MM: 0,
15499
+ MN: 1,
15500
+ MO: 0,
15501
+ MQ: 1,
15502
+ MT: 0,
15503
+ MV: 5,
15504
+ MX: 0,
15505
+ MY: 1,
15506
+ MZ: 0,
15507
+ NI: 0,
15508
+ NL: 1,
15509
+ NO: 1,
15510
+ NP: 0,
15511
+ NZ: 1,
15512
+ OM: 6,
15513
+ PA: 0,
15514
+ PE: 0,
15515
+ PH: 0,
15516
+ PK: 0,
15517
+ PL: 1,
15518
+ PR: 0,
15519
+ PT: 0,
15520
+ PY: 0,
15521
+ QA: 6,
15522
+ RE: 1,
15523
+ RO: 1,
15524
+ RS: 1,
15525
+ RU: 1,
15526
+ SA: 0,
15527
+ SD: 6,
15528
+ SE: 1,
15529
+ SG: 0,
15530
+ SI: 1,
15531
+ SK: 1,
15532
+ SM: 1,
15533
+ SV: 0,
15534
+ SY: 6,
15535
+ TH: 0,
15536
+ TJ: 1,
15537
+ TM: 1,
15538
+ TR: 1,
15539
+ TT: 0,
15540
+ TW: 0,
15541
+ UA: 1,
15542
+ UM: 0,
15543
+ US: 0,
15544
+ UY: 1,
15545
+ UZ: 1,
15546
+ VA: 1,
15547
+ VE: 0,
15548
+ VI: 0,
15549
+ VN: 1,
15550
+ WS: 0,
15551
+ XK: 1,
15552
+ YE: 0,
15553
+ ZA: 0,
15554
+ ZW: 0
15555
+ };
15556
+ const sundayJanuarySecond2000 = new Date(2000, 0, 2);
15557
+ function getWeekdays(locale) {
15558
+ const daysFromSunday = firstDay[locale.slice(-2).toUpperCase()];
15559
+ return createRange(7).map(i => {
15560
+ const weekday = new Date(sundayJanuarySecond2000);
15561
+ weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
15562
+ return new Intl.DateTimeFormat(locale, {
15563
+ weekday: 'long'
15564
+ }).format(weekday);
15565
+ });
15566
+ }
15567
+ function format(value, formatString, locale) {
15568
+ const date = new Date(value);
15569
+ let options = {};
15570
+ switch (formatString) {
15571
+ case 'fullDateWithWeekday':
15572
+ options = {
15573
+ weekday: 'long',
15574
+ day: 'numeric',
15575
+ month: 'long',
15576
+ year: 'numeric'
15577
+ };
15578
+ break;
15579
+ case 'normalDateWithWeekday':
15580
+ options = {
15581
+ weekday: 'short',
15582
+ day: 'numeric',
15583
+ month: 'short',
15584
+ year: 'numeric'
15585
+ };
15586
+ break;
15587
+ case 'keyboardDate':
15588
+ options = {};
15589
+ break;
15590
+ case 'monthAndDate':
15591
+ options = {
15592
+ month: 'long',
15593
+ day: 'numeric'
15594
+ };
15595
+ break;
15596
+ case 'monthAndYear':
15597
+ options = {
15598
+ month: 'long',
15599
+ year: 'numeric'
15600
+ };
15601
+ break;
15602
+ default:
15603
+ options = {
15604
+ timeZone: 'UTC',
15605
+ timeZoneName: 'short'
15606
+ };
15607
+ }
15608
+ return new Intl.DateTimeFormat(locale, options).format(date);
15609
+ }
15610
+ function addDays(date, amount) {
15611
+ const d = new Date(date);
15612
+ d.setDate(d.getDate() + amount);
15613
+ return d;
15614
+ }
15615
+ function addMonths(date, amount) {
15616
+ const d = new Date(date);
15617
+ d.setMonth(d.getMonth() + amount);
15618
+ return d;
15619
+ }
15620
+ function getYear(date) {
15621
+ return date.getFullYear();
15622
+ }
15623
+ function getMonth(date) {
15624
+ return date.getMonth();
15625
+ }
15626
+ function startOfYear(date) {
15627
+ return new Date(date.getFullYear(), 0, 1);
15628
+ }
15629
+ function endOfYear(date) {
15630
+ return new Date(date.getFullYear(), 11, 31);
15631
+ }
15632
+ function getMondayOfFirstWeekOfYear(year) {
15633
+ return new Date(year, 0, 1);
15634
+ }
15635
+
15636
+ // https://stackoverflow.com/questions/274861/how-do-i-calculate-the-week-number-given-a-date/275024#275024
15637
+ function getWeek(date) {
15638
+ let year = date.getFullYear();
15639
+ let d1w1 = getMondayOfFirstWeekOfYear(year);
15640
+ if (date < d1w1) {
15641
+ year = year - 1;
15642
+ d1w1 = getMondayOfFirstWeekOfYear(year);
15643
+ } else {
15644
+ const tv = getMondayOfFirstWeekOfYear(year + 1);
15645
+ if (date >= tv) {
15646
+ year = year + 1;
15647
+ d1w1 = tv;
15648
+ }
15649
+ }
15650
+ const diffTime = Math.abs(date.getTime() - d1w1.getTime());
15651
+ const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
15652
+ return Math.floor(diffDays / 7) + 1;
15653
+ }
15654
+ function isWithinRange(date, range) {
15655
+ return isAfter(date, range[0]) && isBefore(date, range[1]);
15656
+ }
15657
+ function isValid(date) {
15658
+ const d = new Date(date);
15659
+ return d instanceof Date && !isNaN(d.getTime());
15660
+ }
15661
+ function isAfter(date, comparing) {
15662
+ return date.getTime() > comparing.getTime();
15663
+ }
15664
+ function isBefore(date, comparing) {
15665
+ return date.getTime() < comparing.getTime();
15666
+ }
15667
+ function isEqual(date, comparing) {
15668
+ return date.getTime() === comparing.getTime();
15669
+ }
15670
+ function isSameDay(date, comparing) {
15671
+ return date.getDate() === comparing.getDate() && date.getMonth() === comparing.getMonth() && date.getFullYear() === comparing.getFullYear();
15672
+ }
15673
+ function isSameMonth(date, comparing) {
15674
+ return date.getMonth() === comparing.getMonth() && date.getFullYear() === comparing.getFullYear();
15675
+ }
15676
+ function getDiff(date, comparing, unit) {
15677
+ const d = new Date(date);
15678
+ const c = new Date(comparing);
15679
+ if (unit === 'month') {
15680
+ return d.getMonth() - c.getMonth() + (d.getFullYear() - c.getFullYear()) * 12;
15681
+ }
15682
+ return Math.floor((d.getTime() - c.getTime()) / (1000 * 60 * 60 * 24));
15683
+ }
15684
+ function setYear(date, year) {
15685
+ const d = new Date(date);
15686
+ d.setFullYear(year);
15687
+ return d;
15688
+ }
15689
+ class VuetifyDateAdapter {
15690
+ constructor() {
15691
+ let locale = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'en';
15692
+ this.locale = locale;
15693
+ }
15694
+ date(value) {
15695
+ return date(value);
15696
+ }
15697
+ addDays(date, amount) {
15698
+ return addDays(date, amount);
15699
+ }
15700
+ addMonths(date, amount) {
15701
+ return addMonths(date, amount);
15702
+ }
15703
+ getWeekArray(date) {
15704
+ return getWeekArray(date);
15705
+ }
15706
+ startOfMonth(date) {
15707
+ return startOfMonth(date);
15708
+ }
15709
+ endOfMonth(date) {
15710
+ return endOfMonth(date);
15711
+ }
15712
+ format(date, formatString) {
15713
+ return format(date, formatString, this.locale);
15714
+ }
15715
+ isEqual(date, comparing) {
15716
+ return isEqual(date, comparing);
15717
+ }
15718
+ isValid(date) {
15719
+ return isValid(date);
15720
+ }
15721
+ isWithinRange(date, range) {
15722
+ return isWithinRange(date, range);
15723
+ }
15724
+ isAfter(date, comparing) {
15725
+ return isAfter(date, comparing);
15726
+ }
15727
+ isSameDay(date, comparing) {
15728
+ return isSameDay(date, comparing);
15729
+ }
15730
+ isSameMonth(date, comparing) {
15731
+ return isSameMonth(date, comparing);
15732
+ }
15733
+ setYear(date, year) {
15734
+ return setYear(date, year);
15735
+ }
15736
+ getDiff(date, comparing, unit) {
15737
+ return getDiff(date, comparing, unit);
15738
+ }
15739
+ getWeek(date) {
15740
+ return getWeek(date);
15741
+ }
15742
+ getWeekdays() {
15743
+ return getWeekdays(this.locale);
15744
+ }
15745
+ getYear(date) {
15746
+ return getYear(date);
15747
+ }
15748
+ getMonth(date) {
15749
+ return getMonth(date);
15750
+ }
15751
+ startOfYear(date) {
15752
+ return startOfYear(date);
15753
+ }
15754
+ endOfYear(date) {
15755
+ return endOfYear(date);
15756
+ }
15757
+ }
15758
+
15759
+ // Composables
15760
+
15761
+ // Types
15762
+
15763
+ const DateAdapterSymbol = Symbol.for('vuetify:date-adapter');
15764
+ function createDate(options) {
15765
+ return options ?? {
15766
+ adapter: VuetifyDateAdapter
15767
+ };
15768
+ }
15769
+ function useDate(props) {
15770
+ const date = inject$1(DateAdapterSymbol);
15771
+ const locale = useLocale();
15772
+ if (!date) throw new Error('[Vuetify] Could not find injected date');
15773
+
15774
+ // eslint-disable-next-line new-cap
15775
+ const instance = new date.adapter(locale.current.value);
15776
+ watch(locale.current, val => {
15777
+ instance.locale = val;
15778
+ }, {
15779
+ immediate: true
15780
+ });
15781
+ return instance;
15782
+ }
15783
+
15122
15784
  function useSticky(_ref) {
15123
15785
  let {
15124
15786
  rootEl,
@@ -16123,7 +16785,7 @@ const VRadioGroup = genericComponent()({
16123
16785
  const model = useProxiedModel(props, 'modelValue');
16124
16786
  useRender(() => {
16125
16787
  const [inputAttrs, controlAttrs] = filterInputAttrs(attrs);
16126
- const [inputProps, _1] = filterInputProps(props);
16788
+ const [inputProps, _1] = VInput.filterProps(props);
16127
16789
  const [controlProps, _2] = VSelectionControl.filterProps(props);
16128
16790
  const label = slots.label ? slots.label({
16129
16791
  label: props.label,
@@ -16188,11 +16850,14 @@ const VRangeSlider = genericComponent()({
16188
16850
  },
16189
16851
  emits: {
16190
16852
  'update:focused': value => true,
16191
- 'update:modelValue': value => true
16853
+ 'update:modelValue': value => true,
16854
+ end: value => true,
16855
+ start: value => true
16192
16856
  },
16193
16857
  setup(props, _ref) {
16194
16858
  let {
16195
- slots
16859
+ slots,
16860
+ emit
16196
16861
  } = _ref;
16197
16862
  const startThumbRef = ref();
16198
16863
  const stopThumbRef = ref();
@@ -16205,6 +16870,11 @@ const VRangeSlider = genericComponent()({
16205
16870
  const b = Math.abs(stopOffset);
16206
16871
  return a < b || a === b && startOffset < 0 ? startThumbRef.value.$el : stopThumbRef.value.$el;
16207
16872
  }
16873
+ const steps = useSteps(props);
16874
+ const model = useProxiedModel(props, 'modelValue', undefined, arr => {
16875
+ if (!arr?.length) return [0, 0];
16876
+ return arr.map(value => steps.roundValue(value));
16877
+ });
16208
16878
  const {
16209
16879
  activeThumbRef,
16210
16880
  hasLabels,
@@ -16214,34 +16884,37 @@ const VRangeSlider = genericComponent()({
16214
16884
  onSliderMousedown,
16215
16885
  onSliderTouchstart,
16216
16886
  position,
16217
- roundValue,
16218
16887
  trackContainerRef
16219
16888
  } = useSlider({
16220
- /* eslint-disable @typescript-eslint/no-use-before-define */
16221
16889
  props,
16222
- handleSliderMouseUp: newValue => {
16223
- model.value = activeThumbRef.value === startThumbRef.value?.$el ? [newValue, model.value[1]] : [model.value[0], newValue];
16890
+ steps,
16891
+ onSliderStart: () => {
16892
+ emit('start', model.value);
16224
16893
  },
16225
- handleMouseMove: newValue => {
16894
+ onSliderEnd: _ref2 => {
16895
+ let {
16896
+ value
16897
+ } = _ref2;
16898
+ const newValue = activeThumbRef.value === startThumbRef.value?.$el ? [value, model.value[1]] : [model.value[0], value];
16899
+ model.value = newValue;
16900
+ emit('end', newValue);
16901
+ },
16902
+ onSliderMove: _ref3 => {
16903
+ let {
16904
+ value
16905
+ } = _ref3;
16226
16906
  const [start, stop] = model.value;
16227
16907
  if (!props.strict && start === stop && start !== min.value) {
16228
- activeThumbRef.value = newValue > start ? stopThumbRef.value?.$el : startThumbRef.value?.$el;
16908
+ activeThumbRef.value = value > start ? stopThumbRef.value?.$el : startThumbRef.value?.$el;
16229
16909
  activeThumbRef.value?.focus();
16230
16910
  }
16231
16911
  if (activeThumbRef.value === startThumbRef.value?.$el) {
16232
- model.value = [Math.min(newValue, stop), stop];
16912
+ model.value = [Math.min(value, stop), stop];
16233
16913
  } else {
16234
- model.value = [start, Math.max(start, newValue)];
16914
+ model.value = [start, Math.max(start, value)];
16235
16915
  }
16236
16916
  },
16237
16917
  getActiveThumb
16238
- /* eslint-enable @typescript-eslint/no-use-before-define */
16239
- });
16240
-
16241
- const model = useProxiedModel(props, 'modelValue', undefined, arr => {
16242
- // eslint-disable-next-line @typescript-eslint/prefer-optional-chain
16243
- if (!arr || !arr.length) return [0, 0];
16244
- return arr.map(value => roundValue(value));
16245
16918
  });
16246
16919
  const {
16247
16920
  isFocused,
@@ -16251,7 +16924,7 @@ const VRangeSlider = genericComponent()({
16251
16924
  const trackStart = computed(() => position(model.value[0]));
16252
16925
  const trackStop = computed(() => position(model.value[1]));
16253
16926
  useRender(() => {
16254
- const [inputProps, _] = filterInputProps(props);
16927
+ const [inputProps, _] = VInput.filterProps(props);
16255
16928
  const hasPrepend = !!(props.label || slots.label || slots.prepend);
16256
16929
  return createVNode(VInput, mergeProps({
16257
16930
  "class": ['v-slider', 'v-range-slider', {
@@ -16269,11 +16942,11 @@ const VRangeSlider = genericComponent()({
16269
16942
  "class": "v-slider__label",
16270
16943
  "text": props.label
16271
16944
  }, null) : undefined, slots.prepend?.(slotProps)]) : undefined,
16272
- default: _ref2 => {
16945
+ default: _ref4 => {
16273
16946
  let {
16274
16947
  id,
16275
16948
  messagesId
16276
- } = _ref2;
16949
+ } = _ref4;
16277
16950
  return createVNode("div", {
16278
16951
  "class": "v-slider__container",
16279
16952
  "onMousedown": onSliderMousedown,
@@ -17096,10 +17769,12 @@ const VSwitch = genericComponent()({
17096
17769
  }
17097
17770
  useRender(() => {
17098
17771
  const [inputAttrs, controlAttrs] = filterInputAttrs(attrs);
17099
- const [inputProps, _1] = filterInputProps(props);
17772
+ const [inputProps, _1] = VInput.filterProps(props);
17100
17773
  const [controlProps, _2] = VSelectionControl.filterProps(props);
17101
17774
  const control = ref();
17102
- function onClick() {
17775
+ function onClick(e) {
17776
+ e.stopPropagation();
17777
+ e.preventDefault();
17103
17778
  control.value?.input?.click();
17104
17779
  }
17105
17780
  return createVNode(VInput, mergeProps({
@@ -17460,8 +18135,6 @@ const VTextarea = genericComponent()({
17460
18135
  autofocus: Boolean,
17461
18136
  counter: [Boolean, Number, String],
17462
18137
  counterValue: Function,
17463
- hint: String,
17464
- persistentHint: Boolean,
17465
18138
  prefix: String,
17466
18139
  placeholder: String,
17467
18140
  persistentPlaceholder: Boolean,
@@ -17516,9 +18189,6 @@ const VTextarea = genericComponent()({
17516
18189
  const controlHeight = ref('');
17517
18190
  const textareaRef = ref();
17518
18191
  const isActive = computed(() => isFocused.value || props.persistentPlaceholder);
17519
- const messages = computed(() => {
17520
- return props.messages.length ? props.messages : isFocused.value || props.persistentHint ? props.hint : '';
17521
- });
17522
18192
  function onFocus() {
17523
18193
  if (textareaRef.value !== document.activeElement) {
17524
18194
  textareaRef.value?.focus();
@@ -17590,7 +18260,7 @@ const VTextarea = genericComponent()({
17590
18260
  const [{
17591
18261
  modelValue: _,
17592
18262
  ...inputProps
17593
- }] = filterInputProps(props);
18263
+ }] = VInput.filterProps(props);
17594
18264
  const [fieldProps] = filterFieldProps(props);
17595
18265
  return createVNode(VInput, mergeProps({
17596
18266
  "ref": vInputRef,
@@ -17604,12 +18274,9 @@ const VTextarea = genericComponent()({
17604
18274
  'v-textarea--auto-grow': props.autoGrow,
17605
18275
  'v-textarea--no-resize': props.noResize || props.autoGrow,
17606
18276
  'v-text-field--flush-details': ['plain', 'underlined'].includes(props.variant)
17607
- }],
17608
- "onClick:prepend": props['onClick:prepend'],
17609
- "onClick:append": props['onClick:append']
18277
+ }]
17610
18278
  }, rootAttrs, inputProps, {
17611
- "focused": isFocused.value,
17612
- "messages": messages.value
18279
+ "focused": isFocused.value
17613
18280
  }), {
17614
18281
  ...slots,
17615
18282
  default: _ref2 => {
@@ -18491,6 +19158,7 @@ function createVuetify$1() {
18491
19158
  const theme = createTheme(options.theme);
18492
19159
  const icons = createIcons(options.icons);
18493
19160
  const locale = createLocale(options.locale);
19161
+ const date = createDate(options.date);
18494
19162
  const install = app => {
18495
19163
  for (const key in directives) {
18496
19164
  app.directive(key, directives[key]);
@@ -18511,6 +19179,7 @@ function createVuetify$1() {
18511
19179
  app.provide(ThemeSymbol, theme);
18512
19180
  app.provide(IconSymbol, icons);
18513
19181
  app.provide(LocaleSymbol, locale);
19182
+ app.provide(DateAdapterSymbol, date);
18514
19183
  if (IN_BROWSER && options.ssr) {
18515
19184
  if (app.$nuxt) {
18516
19185
  app.$nuxt.hook('app:suspense:resolve', () => {
@@ -18538,7 +19207,8 @@ function createVuetify$1() {
18538
19207
  display: inject.call(this, DisplaySymbol),
18539
19208
  theme: inject.call(this, ThemeSymbol),
18540
19209
  icons: inject.call(this, IconSymbol),
18541
- locale: inject.call(this, LocaleSymbol)
19210
+ locale: inject.call(this, LocaleSymbol),
19211
+ date: inject.call(this, DateAdapterSymbol)
18542
19212
  });
18543
19213
  }
18544
19214
  }
@@ -18551,10 +19221,11 @@ function createVuetify$1() {
18551
19221
  display,
18552
19222
  theme,
18553
19223
  icons,
18554
- locale
19224
+ locale,
19225
+ date
18555
19226
  };
18556
19227
  }
18557
- const version$1 = "4.0.0-dev-20230419.0";
19228
+ const version$1 = "4.0.0-dev-20230421.0";
18558
19229
  createVuetify$1.version = version$1;
18559
19230
 
18560
19231
  // Vue's inject() can only be used in setup
@@ -18574,8 +19245,8 @@ const createVuetify = function () {
18574
19245
  ...options
18575
19246
  });
18576
19247
  };
18577
- const version = "4.0.0-dev-20230419.0";
19248
+ const version = "4.0.0-dev-20230421.0";
18578
19249
  createVuetify.version = version;
18579
19250
 
18580
- export { components, createVuetify, directives, useDisplay, useLayout, useLocale, useRtl, useTheme, version };
19251
+ export { components, createVuetify, directives, useDate, useDisplay, useLayout, useLocale, useRtl, useTheme, version };
18581
19252
  //# sourceMappingURL=vuetify.esm.js.map