@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
  */
@@ -207,10 +207,6 @@
207
207
  let max = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
208
208
  return Math.max(min, Math.min(max, value));
209
209
  }
210
- function getDecimals(value) {
211
- const trimmedStr = value.toString().trim();
212
- return trimmedStr.includes('.') ? trimmedStr.length - trimmedStr.indexOf('.') - 1 : 0;
213
- }
214
210
  function padEnd(str, length) {
215
211
  let char = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '0';
216
212
  return str + char.repeat(Math.max(0, length - str.length));
@@ -3257,6 +3253,98 @@
3257
3253
 
3258
3254
  // Utilities
3259
3255
 
3256
+ // Types
3257
+
3258
+ // Composables
3259
+ const makeScrollProps = propsFactory({
3260
+ scrollTarget: {
3261
+ type: String
3262
+ },
3263
+ scrollThreshold: {
3264
+ type: [String, Number]
3265
+ }
3266
+ }, 'scroll');
3267
+ function useScroll(props) {
3268
+ let args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
3269
+ const {
3270
+ thresholdMetCallback,
3271
+ scrollThreshold,
3272
+ canScroll
3273
+ } = args;
3274
+ let previousScroll = 0;
3275
+ const target = vue.ref(null);
3276
+ const currentScroll = vue.ref(0);
3277
+ const savedScroll = vue.ref(0);
3278
+ const currentThreshold = vue.ref(0);
3279
+ const isScrollActive = vue.ref(false);
3280
+ const isScrollingUp = vue.ref(false);
3281
+ const computedScrollThreshold = vue.computed(() => {
3282
+ return Number(props.scrollThreshold ?? scrollThreshold ?? 300);
3283
+ });
3284
+ const onScroll = () => {
3285
+ const targetEl = target.value;
3286
+ if (!targetEl || canScroll && !canScroll.value) return;
3287
+ previousScroll = currentScroll.value;
3288
+ currentScroll.value = 'window' in targetEl ? targetEl.pageYOffset : targetEl.scrollTop;
3289
+ isScrollingUp.value = currentScroll.value < previousScroll;
3290
+ currentThreshold.value = Math.abs(currentScroll.value - computedScrollThreshold.value);
3291
+ };
3292
+ vue.watch(isScrollingUp, () => {
3293
+ savedScroll.value = savedScroll.value || currentScroll.value;
3294
+ });
3295
+ vue.watch(isScrollActive, () => {
3296
+ savedScroll.value = 0;
3297
+ });
3298
+ vue.onMounted(() => {
3299
+ vue.watch(() => props.scrollTarget, scrollTarget => {
3300
+ const newTarget = scrollTarget ? document.querySelector(scrollTarget) : window;
3301
+ if (!newTarget) {
3302
+ consoleWarn(`Unable to locate element with identifier ${scrollTarget}`, vue.getCurrentInstance());
3303
+ return;
3304
+ }
3305
+ if (newTarget === target.value) return;
3306
+ target.value?.removeEventListener('scroll', onScroll);
3307
+ target.value = newTarget;
3308
+ target.value.addEventListener('scroll', onScroll, {
3309
+ passive: true
3310
+ });
3311
+ }, {
3312
+ immediate: true
3313
+ });
3314
+ });
3315
+ vue.onBeforeUnmount(() => {
3316
+ target.value?.removeEventListener('scroll', onScroll);
3317
+ });
3318
+ thresholdMetCallback && vue.watch(() => Math.abs(currentScroll.value - savedScroll.value) > computedScrollThreshold.value, thresholdMet => {
3319
+ thresholdMet && thresholdMetCallback({
3320
+ currentThreshold: currentThreshold.value,
3321
+ isScrollingUp: isScrollingUp.value,
3322
+ savedScroll
3323
+ });
3324
+ }, {
3325
+ immediate: true
3326
+ });
3327
+
3328
+ // Do we need this? If yes - seems that
3329
+ // there's no need to expose onScroll
3330
+ canScroll && vue.watch(canScroll, onScroll, {
3331
+ immediate: true
3332
+ });
3333
+ return {
3334
+ computedScrollThreshold,
3335
+ currentScroll,
3336
+ currentThreshold,
3337
+ isScrollActive,
3338
+ // required only for testing
3339
+ // probably can be removed
3340
+ // later (2 chars chlng)
3341
+ isScrollingUp,
3342
+ savedScroll
3343
+ };
3344
+ }
3345
+
3346
+ // Utilities
3347
+
3260
3348
  // Composables
3261
3349
  function useSsrBoot() {
3262
3350
  const isBooted = vue.ref(false);
@@ -3279,13 +3367,7 @@
3279
3367
  const VAppBar = genericComponent()({
3280
3368
  name: 'VAppBar',
3281
3369
  props: {
3282
- // TODO: Implement scrolling techniques
3283
- // hideOnScroll: Boolean
3284
- // invertedScroll: Boolean
3285
- // collapseOnScroll: Boolean
3286
- // elevateOnScroll: Boolean
3287
- // shrinkOnScroll: Boolean
3288
- // fadeImageOnScroll: Boolean
3370
+ scrollBehavior: String,
3289
3371
  modelValue: {
3290
3372
  type: Boolean,
3291
3373
  default: true
@@ -3297,6 +3379,7 @@
3297
3379
  },
3298
3380
  ...makeVToolbarProps(),
3299
3381
  ...makeLayoutItemProps(),
3382
+ ...makeScrollProps(),
3300
3383
  height: {
3301
3384
  type: [Number, String],
3302
3385
  default: 64
@@ -3311,11 +3394,63 @@
3311
3394
  } = _ref;
3312
3395
  const vToolbarRef = vue.ref();
3313
3396
  const isActive = useProxiedModel(props, 'modelValue');
3397
+ const scrollBehavior = vue.computed(() => {
3398
+ const behavior = new Set(props.scrollBehavior?.split(' ') ?? []);
3399
+ return {
3400
+ hide: behavior.has('hide'),
3401
+ // fullyHide: behavior.has('fully-hide'),
3402
+ inverted: behavior.has('inverted'),
3403
+ collapse: behavior.has('collapse'),
3404
+ elevate: behavior.has('elevate'),
3405
+ fadeImage: behavior.has('fade-image')
3406
+ // shrink: behavior.has('shrink'),
3407
+ };
3408
+ });
3409
+
3410
+ const canScroll = vue.computed(() => {
3411
+ const behavior = scrollBehavior.value;
3412
+ return behavior.hide ||
3413
+ // behavior.fullyHide ||
3414
+ behavior.inverted || behavior.collapse || behavior.elevate || behavior.fadeImage ||
3415
+ // behavior.shrink ||
3416
+ !isActive.value;
3417
+ });
3418
+ const {
3419
+ currentScroll,
3420
+ currentThreshold,
3421
+ computedScrollThreshold,
3422
+ isScrollingUp
3423
+ } = useScroll(props, {
3424
+ canScroll
3425
+ });
3426
+ const isCollapsed = vue.computed(() => props.collapse || scrollBehavior.value.collapse && (scrollBehavior.value.inverted ? currentScroll.value < 1 : currentScroll.value > 0));
3427
+ const isFlat = vue.computed(() => props.flat || scrollBehavior.value.elevate && currentScroll.value === (scrollBehavior.value.inverted ? 1 : 0));
3428
+ const scrollRatio = vue.computed(() => Math.min((currentThreshold.value - currentScroll.value) / currentThreshold.value || 1, 1));
3429
+ const opacity = vue.computed(() => scrollBehavior.value.fadeImage ? scrollBehavior.value.inverted ? 1 - scrollRatio.value : scrollRatio.value : undefined);
3314
3430
  const height = vue.computed(() => {
3431
+ if (scrollBehavior.value.hide && scrollBehavior.value.inverted) return 0;
3315
3432
  const height = vToolbarRef.value?.contentHeight ?? 0;
3316
3433
  const extensionHeight = vToolbarRef.value?.extensionHeight ?? 0;
3317
3434
  return height + extensionHeight;
3318
3435
  });
3436
+ function setActive() {
3437
+ const val = currentScroll.value;
3438
+ if (scrollBehavior.value.hide) {
3439
+ if (scrollBehavior.value.inverted) {
3440
+ isActive.value = val > computedScrollThreshold.value;
3441
+ } else {
3442
+ isActive.value = isScrollingUp.value || val < computedScrollThreshold.value;
3443
+ }
3444
+ } else if (scrollBehavior.value.inverted) {
3445
+ isActive.value = currentScroll.value === 0;
3446
+ } else {
3447
+ isActive.value = true;
3448
+ }
3449
+ }
3450
+ vue.watch(currentScroll, setActive, {
3451
+ immediate: true
3452
+ });
3453
+ vue.watch(scrollBehavior, setActive);
3319
3454
  const {
3320
3455
  ssrBootStyles
3321
3456
  } = useSsrBoot();
@@ -3326,7 +3461,7 @@
3326
3461
  order: vue.computed(() => parseInt(props.order, 10)),
3327
3462
  position: vue.toRef(props, 'location'),
3328
3463
  layoutSize: height,
3329
- elementSize: height,
3464
+ elementSize: vue.ref(undefined),
3330
3465
  active: isActive,
3331
3466
  absolute: vue.toRef(props, 'absolute')
3332
3467
  });
@@ -3339,10 +3474,14 @@
3339
3474
  }],
3340
3475
  "style": {
3341
3476
  ...layoutItemStyles.value,
3477
+ '--v-toolbar-image-opacity': opacity.value,
3342
3478
  height: undefined,
3343
3479
  ...ssrBootStyles.value
3344
3480
  }
3345
- }, toolbarProps), slots);
3481
+ }, toolbarProps, {
3482
+ "collapse": isCollapsed.value,
3483
+ "flat": isFlat.value
3484
+ }), slots);
3346
3485
  });
3347
3486
  return {};
3348
3487
  }
@@ -5300,7 +5439,8 @@
5300
5439
 
5301
5440
  // Composables
5302
5441
  const makeFocusProps = propsFactory({
5303
- focused: Boolean
5442
+ focused: Boolean,
5443
+ 'onUpdate:focused': EventProp()
5304
5444
  }, 'focus');
5305
5445
  function useFocus(props) {
5306
5446
  let name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getCurrentInstanceName();
@@ -5895,6 +6035,8 @@
5895
6035
  appendIcon: IconValue,
5896
6036
  prependIcon: IconValue,
5897
6037
  hideDetails: [Boolean, String],
6038
+ hint: String,
6039
+ persistentHint: Boolean,
5898
6040
  messages: {
5899
6041
  type: [Array, String],
5900
6042
  default: () => []
@@ -5958,10 +6100,19 @@
5958
6100
  resetValidation,
5959
6101
  validate
5960
6102
  }));
6103
+ const messages = vue.computed(() => {
6104
+ if (errorMessages.value.length > 0) {
6105
+ return errorMessages.value;
6106
+ } else if (props.hint && (props.persistentHint || props.focused)) {
6107
+ return props.hint;
6108
+ } else {
6109
+ return props.messages;
6110
+ }
6111
+ });
5961
6112
  useRender(() => {
5962
6113
  const hasPrepend = !!(slots.prepend || props.prependIcon);
5963
6114
  const hasAppend = !!(slots.append || props.appendIcon);
5964
- const hasMessages = !!(props.messages?.length || errorMessages.value.length);
6115
+ const hasMessages = messages.value.length > 0;
5965
6116
  const hasDetails = !props.hideDetails || props.hideDetails === 'auto' && (hasMessages || !!slots.details);
5966
6117
  return vue.createVNode("div", {
5967
6118
  "class": ['v-input', `v-input--${props.direction}`, densityClasses.value, validationClasses.value]
@@ -5984,7 +6135,7 @@
5984
6135
  }, [vue.createVNode(VMessages, {
5985
6136
  "id": messagesId.value,
5986
6137
  "active": hasMessages,
5987
- "messages": errorMessages.value.length > 0 ? errorMessages.value : props.messages
6138
+ "messages": messages.value
5988
6139
  }, {
5989
6140
  message: slots.message
5990
6141
  }), slots.details?.(slotProps.value)])]);
@@ -5996,10 +6147,6 @@
5996
6147
  };
5997
6148
  }
5998
6149
  });
5999
- function filterInputProps(props) {
6000
- const keys = Object.keys(VInput.props).filter(k => !isOn(k));
6001
- return pick(props, keys);
6002
- }
6003
6150
 
6004
6151
  const VCounter = genericComponent()({
6005
6152
  name: 'VCounter',
@@ -6125,8 +6272,6 @@
6125
6272
  autofocus: Boolean,
6126
6273
  counter: [Boolean, Number, String],
6127
6274
  counterValue: Function,
6128
- hint: String,
6129
- persistentHint: Boolean,
6130
6275
  prefix: String,
6131
6276
  placeholder: String,
6132
6277
  persistentPlaceholder: Boolean,
@@ -6181,9 +6326,6 @@
6181
6326
  const vFieldRef = vue.ref();
6182
6327
  const inputRef = vue.ref();
6183
6328
  const isActive = vue.computed(() => activeTypes.includes(props.type) || props.persistentPlaceholder || isFocused.value);
6184
- const messages = vue.computed(() => {
6185
- return props.messages.length ? props.messages : isFocused.value || props.persistentHint ? props.hint : '';
6186
- });
6187
6329
  function onFocus() {
6188
6330
  if (inputRef.value !== document.activeElement) {
6189
6331
  inputRef.value?.focus();
@@ -6226,7 +6368,7 @@
6226
6368
  const [{
6227
6369
  modelValue: _,
6228
6370
  ...inputProps
6229
- }] = filterInputProps(props);
6371
+ }] = VInput.filterProps(props);
6230
6372
  const [fieldProps] = filterFieldProps(props);
6231
6373
  return vue.createVNode(VInput, vue.mergeProps({
6232
6374
  "ref": vInputRef,
@@ -6236,12 +6378,9 @@
6236
6378
  'v-text-field--prefixed': props.prefix,
6237
6379
  'v-text-field--suffixed': props.suffix,
6238
6380
  'v-text-field--flush-details': ['plain', 'underlined'].includes(props.variant)
6239
- }],
6240
- "onClick:prepend": props['onClick:prepend'],
6241
- "onClick:append": props['onClick:append']
6381
+ }]
6242
6382
  }, rootAttrs, inputProps, {
6243
- "focused": isFocused.value,
6244
- "messages": messages.value
6383
+ "focused": isFocused.value
6245
6384
  }), {
6246
6385
  ...slots,
6247
6386
  default: _ref2 => {
@@ -6650,7 +6789,7 @@
6650
6789
  const id = vue.computed(() => props.id || `checkbox-${uid}`);
6651
6790
  useRender(() => {
6652
6791
  const [inputAttrs, controlAttrs] = filterInputAttrs(attrs);
6653
- const [inputProps, _1] = filterInputProps(props);
6792
+ const [inputProps, _1] = VInput.filterProps(props);
6654
6793
  const [checkboxProps, _2] = VCheckboxBtn.filterProps(props);
6655
6794
  return vue.createVNode(VInput, vue.mergeProps({
6656
6795
  "class": "v-checkbox"
@@ -8062,7 +8201,12 @@
8062
8201
  function useItems(props) {
8063
8202
  const items = vue.computed(() => transformItems$1(props, props.items));
8064
8203
  function transformIn(value) {
8065
- return value.map(item => transformItem$1(props, item));
8204
+ return value.map(v => {
8205
+ const existingItem = items.value.find(item => deepEqual(v, item.value));
8206
+ // Nullish existingItem means value is a custom input value from combobox
8207
+ // In this case, use transformItem to create an InternalItem based on value
8208
+ return existingItem ?? transformItem$1(props, v);
8209
+ });
8066
8210
  }
8067
8211
  function transformOut(value) {
8068
8212
  return value.map(_ref => {
@@ -8740,7 +8884,7 @@
8740
8884
  }
8741
8885
 
8742
8886
  /** Get size of element ignoring max-width/max-height */
8743
- function getIntrinsicSize(el) {
8887
+ function getIntrinsicSize(el, isRtl) {
8744
8888
  // const scrollables = new Map<Element, [number, number]>()
8745
8889
  // el.querySelectorAll('*').forEach(el => {
8746
8890
  // const x = el.scrollLeft
@@ -8757,7 +8901,11 @@
8757
8901
 
8758
8902
  /* eslint-disable-next-line sonarjs/prefer-immediate-return */
8759
8903
  const contentBox = nullifyTransforms(el);
8760
- contentBox.x -= parseFloat(el.style.left || 0);
8904
+ if (isRtl) {
8905
+ contentBox.x += parseFloat(el.style.right || 0);
8906
+ } else {
8907
+ contentBox.x -= parseFloat(el.style.left || 0);
8908
+ }
8761
8909
  contentBox.y -= parseFloat(el.style.top || 0);
8762
8910
 
8763
8911
  // el.style.maxWidth = initialMaxWidth
@@ -8838,7 +8986,7 @@
8838
8986
  });
8839
8987
  if (!data.activatorEl.value || !data.contentEl.value) return;
8840
8988
  const targetBox = data.activatorEl.value.getBoundingClientRect();
8841
- const contentBox = getIntrinsicSize(data.contentEl.value);
8989
+ const contentBox = getIntrinsicSize(data.contentEl.value, data.isRtl.value);
8842
8990
  const scrollParents = getScrollParents(data.contentEl.value);
8843
8991
  const viewportMargin = 12;
8844
8992
  if (!scrollParents.length) {
@@ -9014,7 +9162,8 @@
9014
9162
  transformOrigin: `${placement.origin.side} ${placement.origin.align}`,
9015
9163
  // transform: `translate(${pixelRound(x)}px, ${pixelRound(y)}px)`,
9016
9164
  top: convertToUnit(pixelRound(y)),
9017
- left: convertToUnit(pixelRound(x)),
9165
+ left: data.isRtl.value ? undefined : convertToUnit(pixelRound(x)),
9166
+ right: data.isRtl.value ? convertToUnit(pixelRound(-x)) : undefined,
9018
9167
  minWidth: convertToUnit(axis === 'y' ? Math.min(minWidth.value, targetBox.width) : minWidth.value),
9019
9168
  maxWidth: convertToUnit(pixelCeil(clamp(available.x, minWidth.value === Infinity ? 0 : minWidth.value, maxWidth.value))),
9020
9169
  maxHeight: convertToUnit(pixelCeil(clamp(available.y, minHeight.value === Infinity ? 0 : minHeight.value, maxHeight.value)))
@@ -9909,6 +10058,7 @@
9909
10058
  })
9910
10059
  },
9911
10060
  emits: {
10061
+ 'update:focused': focused => true,
9912
10062
  'update:modelValue': val => true,
9913
10063
  'update:menu': val => true
9914
10064
  },
@@ -10025,6 +10175,9 @@
10025
10175
  menu.value = false;
10026
10176
  }
10027
10177
  }
10178
+ function onFocusin(e) {
10179
+ isFocused.value = true;
10180
+ }
10028
10181
  function onFocusout(e) {
10029
10182
  if (e.relatedTarget == null) {
10030
10183
  vTextFieldRef.value?.focus();
@@ -10079,6 +10232,7 @@
10079
10232
  "selected": selected.value,
10080
10233
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
10081
10234
  "onMousedown": e => e.preventDefault(),
10235
+ "onFocusin": onFocusin,
10082
10236
  "onFocusout": onFocusout
10083
10237
  }, {
10084
10238
  default: () => [!displayItems.value.length && !props.hideNoData && (slots['no-data']?.() ?? vue.createVNode(VListItem, {
@@ -10157,6 +10311,7 @@
10157
10311
  });
10158
10312
  });
10159
10313
  return forwardRefs({
10314
+ isFocused,
10160
10315
  menu,
10161
10316
  select
10162
10317
  }, vTextFieldRef);
@@ -10295,6 +10450,7 @@
10295
10450
  })
10296
10451
  },
10297
10452
  emits: {
10453
+ 'update:focused': focused => true,
10298
10454
  'update:search': val => true,
10299
10455
  'update:modelValue': val => true,
10300
10456
  'update:menu': val => true
@@ -10318,11 +10474,17 @@
10318
10474
  _menu.value = v;
10319
10475
  }
10320
10476
  });
10477
+ const selectionIndex = vue.ref(-1);
10478
+ const color = vue.computed(() => vTextFieldRef.value?.color);
10321
10479
  const {
10322
10480
  items,
10323
10481
  transformIn,
10324
10482
  transformOut
10325
10483
  } = useItems(props);
10484
+ const {
10485
+ textColorClasses,
10486
+ textColorStyles
10487
+ } = useTextColor(color);
10326
10488
  const search = useProxiedModel(props, 'search', '');
10327
10489
  const model = useProxiedModel(props, 'modelValue', [], v => transformIn(wrapInArray(v)), v => {
10328
10490
  const transformed = transformOut(v);
@@ -10345,6 +10507,7 @@
10345
10507
  return filteredItems.value;
10346
10508
  });
10347
10509
  const selected = vue.computed(() => selections.value.map(selection => selection.props.value));
10510
+ const selection = vue.computed(() => selections.value[selectionIndex.value]);
10348
10511
  const listRef = vue.ref();
10349
10512
  function onClear(e) {
10350
10513
  if (props.openOnClear) {
@@ -10358,7 +10521,9 @@
10358
10521
  }
10359
10522
  function onKeydown(e) {
10360
10523
  if (props.readonly || form?.isReadonly.value) return;
10361
- if (['Enter', 'ArrowDown', 'ArrowUp'].includes(e.key)) {
10524
+ const selectionStart = vTextFieldRef.value.selectionStart;
10525
+ const length = selected.value.length;
10526
+ if (selectionIndex.value > -1 || ['Enter', 'ArrowDown', 'ArrowUp'].includes(e.key)) {
10362
10527
  e.preventDefault();
10363
10528
  }
10364
10529
  if (['Enter', 'ArrowDown'].includes(e.key)) {
@@ -10375,6 +10540,38 @@
10375
10540
  } else if (e.key === 'ArrowUp') {
10376
10541
  listRef.value?.focus('prev');
10377
10542
  }
10543
+ if (!props.multiple) return;
10544
+ if (['Backspace', 'Delete'].includes(e.key)) {
10545
+ if (selectionIndex.value < 0) {
10546
+ if (e.key === 'Backspace' && !search.value) {
10547
+ selectionIndex.value = length - 1;
10548
+ }
10549
+ return;
10550
+ }
10551
+ const originalSelectionIndex = selectionIndex.value;
10552
+ if (selection.value) select(selection.value);
10553
+ selectionIndex.value = originalSelectionIndex >= length - 1 ? length - 2 : originalSelectionIndex;
10554
+ }
10555
+ if (e.key === 'ArrowLeft') {
10556
+ if (selectionIndex.value < 0 && selectionStart > 0) return;
10557
+ const prev = selectionIndex.value > -1 ? selectionIndex.value - 1 : length - 1;
10558
+ if (selections.value[prev]) {
10559
+ selectionIndex.value = prev;
10560
+ } else {
10561
+ selectionIndex.value = -1;
10562
+ vTextFieldRef.value.setSelectionRange(search.value?.length, search.value?.length);
10563
+ }
10564
+ }
10565
+ if (e.key === 'ArrowRight') {
10566
+ if (selectionIndex.value < 0) return;
10567
+ const next = selectionIndex.value + 1;
10568
+ if (selections.value[next]) {
10569
+ selectionIndex.value = next;
10570
+ } else {
10571
+ selectionIndex.value = -1;
10572
+ vTextFieldRef.value.setSelectionRange(0, 0);
10573
+ }
10574
+ }
10378
10575
  }
10379
10576
  function onInput(e) {
10380
10577
  search.value = e.target.value;
@@ -10396,7 +10593,6 @@
10396
10593
  const index = selected.value.findIndex(selection => props.valueComparator(selection, item.value));
10397
10594
  if (index === -1) {
10398
10595
  model.value = [...model.value, item];
10399
- search.value = '';
10400
10596
  } else {
10401
10597
  const value = [...model.value];
10402
10598
  value.splice(index, 1);
@@ -10441,12 +10637,15 @@
10441
10637
  "onUpdate:modelValue": v => {
10442
10638
  if (v == null) model.value = [];
10443
10639
  },
10640
+ "focused": isFocused.value,
10641
+ "onUpdate:focused": $event => isFocused.value = $event,
10444
10642
  "validationValue": model.externalValue,
10445
10643
  "dirty": isDirty,
10446
10644
  "onInput": onInput,
10447
10645
  "class": ['v-autocomplete', {
10448
10646
  'v-autocomplete--active-menu': menu.value,
10449
10647
  'v-autocomplete--chips': !!props.chips,
10648
+ 'v-autocomplete--selecting-index': selectionIndex.value > -1,
10450
10649
  [`v-autocomplete--${props.multiple ? 'multiple' : 'single'}`]: true,
10451
10650
  'v-autocomplete--selection-slot': !!slots.selection
10452
10651
  }],
@@ -10455,8 +10654,6 @@
10455
10654
  "placeholder": isDirty ? undefined : props.placeholder,
10456
10655
  "onClick:clear": onClear,
10457
10656
  "onMousedown:control": onMousedownControl,
10458
- "onFocus": () => isFocused.value = true,
10459
- "onBlur": () => isFocused.value = false,
10460
10657
  "onKeydown": onKeydown
10461
10658
  }), {
10462
10659
  ...slots,
@@ -10521,7 +10718,8 @@
10521
10718
  };
10522
10719
  return vue.createVNode("div", {
10523
10720
  "key": item.value,
10524
- "class": "v-autocomplete__selection"
10721
+ "class": ['v-autocomplete__selection', index === selectionIndex.value && ['v-autocomplete__selection--selected', textColorClasses.value]],
10722
+ "style": index === selectionIndex.value ? textColorStyles.value : {}
10525
10723
  }, [hasChips ? !slots.chip ? vue.createVNode(VChip, vue.mergeProps({
10526
10724
  "key": "chip",
10527
10725
  "closable": props.closableChips,
@@ -12416,11 +12614,36 @@
12416
12614
  elevation: 2
12417
12615
  })
12418
12616
  }, 'slider');
12617
+ const useSteps = props => {
12618
+ const min = vue.computed(() => parseFloat(props.min));
12619
+ const max = vue.computed(() => parseFloat(props.max));
12620
+ const step = vue.computed(() => +props.step > 0 ? parseFloat(props.step) : 0);
12621
+ const decimals = vue.computed(() => {
12622
+ const trimmedStep = step.value.toString().trim();
12623
+ return trimmedStep.includes('.') ? trimmedStep.length - trimmedStep.indexOf('.') - 1 : 0;
12624
+ });
12625
+ function roundValue(value) {
12626
+ if (step.value <= 0) return value;
12627
+ const clamped = clamp(value, min.value, max.value);
12628
+ const offset = min.value % step.value;
12629
+ const newValue = Math.round((clamped - offset) / step.value) * step.value + offset;
12630
+ return parseFloat(Math.min(newValue, max.value).toFixed(decimals.value));
12631
+ }
12632
+ return {
12633
+ min,
12634
+ max,
12635
+ step,
12636
+ decimals,
12637
+ roundValue
12638
+ };
12639
+ };
12419
12640
  const useSlider = _ref => {
12420
12641
  let {
12421
12642
  props,
12422
- handleSliderMouseUp,
12423
- handleMouseMove,
12643
+ steps,
12644
+ onSliderStart,
12645
+ onSliderMove,
12646
+ onSliderEnd,
12424
12647
  getActiveThumb
12425
12648
  } = _ref;
12426
12649
  const {
@@ -12434,10 +12657,13 @@
12434
12657
  }
12435
12658
  return hd;
12436
12659
  });
12437
- const min = vue.computed(() => parseFloat(props.min));
12438
- const max = vue.computed(() => parseFloat(props.max));
12439
- const step = vue.computed(() => +props.step > 0 ? parseFloat(props.step) : 0);
12440
- const decimals = vue.computed(() => Math.max(getDecimals(step.value), getDecimals(min.value)));
12660
+ const {
12661
+ min,
12662
+ max,
12663
+ step,
12664
+ decimals,
12665
+ roundValue
12666
+ } = steps;
12441
12667
  const thumbSize = vue.computed(() => parseInt(props.thumbSize, 10));
12442
12668
  const tickSize = vue.computed(() => parseInt(props.tickSize, 10));
12443
12669
  const trackSize = vue.computed(() => parseInt(props.trackSize, 10));
@@ -12451,13 +12677,6 @@
12451
12677
  const startOffset = vue.ref(0);
12452
12678
  const trackContainerRef = vue.ref();
12453
12679
  const activeThumbRef = vue.ref();
12454
- function roundValue(value) {
12455
- if (step.value <= 0) return value;
12456
- const clamped = clamp(value, min.value, max.value);
12457
- const offset = min.value % step.value;
12458
- const newValue = Math.round((clamped - offset) / step.value) * step.value + offset;
12459
- return parseFloat(Math.min(newValue, max.value).toFixed(decimals.value));
12460
- }
12461
12680
  function parseMouseMove(e) {
12462
12681
  const vertical = props.direction === 'vertical';
12463
12682
  const start = vertical ? 'top' : 'left';
@@ -12474,14 +12693,11 @@
12474
12693
  if (vertical || horizontalDirection.value === 'rtl') clickPos = 1 - clickPos;
12475
12694
  return roundValue(min.value + clickPos * (max.value - min.value));
12476
12695
  }
12477
- let thumbMoved = false;
12478
12696
  const handleStop = e => {
12479
- if (!thumbMoved) {
12480
- startOffset.value = 0;
12481
- handleSliderMouseUp(parseMouseMove(e));
12482
- }
12697
+ onSliderEnd({
12698
+ value: parseMouseMove(e)
12699
+ });
12483
12700
  mousePressed.value = false;
12484
- thumbMoved = false;
12485
12701
  startOffset.value = 0;
12486
12702
  };
12487
12703
  const handleStart = e => {
@@ -12490,20 +12706,25 @@
12490
12706
  activeThumbRef.value.focus();
12491
12707
  mousePressed.value = true;
12492
12708
  if (activeThumbRef.value.contains(e.target)) {
12493
- thumbMoved = true;
12494
12709
  startOffset.value = getOffset(e, activeThumbRef.value, props.direction);
12495
12710
  } else {
12496
12711
  startOffset.value = 0;
12497
- handleMouseMove(parseMouseMove(e));
12712
+ onSliderMove({
12713
+ value: parseMouseMove(e)
12714
+ });
12498
12715
  }
12716
+ onSliderStart({
12717
+ value: parseMouseMove(e)
12718
+ });
12499
12719
  };
12500
12720
  const moveListenerOptions = {
12501
12721
  passive: true,
12502
12722
  capture: true
12503
12723
  };
12504
12724
  function onMouseMove(e) {
12505
- thumbMoved = true;
12506
- handleMouseMove(parseMouseMove(e));
12725
+ onSliderMove({
12726
+ value: parseMouseMove(e)
12727
+ });
12507
12728
  }
12508
12729
  function onSliderMouseUp(e) {
12509
12730
  e.stopPropagation();
@@ -12879,13 +13100,21 @@
12879
13100
  },
12880
13101
  emits: {
12881
13102
  'update:focused': value => true,
12882
- 'update:modelValue': v => true
13103
+ 'update:modelValue': v => true,
13104
+ start: value => true,
13105
+ end: value => true
12883
13106
  },
12884
13107
  setup(props, _ref) {
12885
13108
  let {
12886
- slots
13109
+ slots,
13110
+ emit
12887
13111
  } = _ref;
12888
13112
  const thumbContainerRef = vue.ref();
13113
+ const steps = useSteps(props);
13114
+ const model = useProxiedModel(props, 'modelValue', undefined, v => {
13115
+ const value = typeof v === 'string' ? parseFloat(v) : v == null ? steps.min.value : v;
13116
+ return steps.roundValue(value);
13117
+ });
12889
13118
  const {
12890
13119
  min,
12891
13120
  max,
@@ -12899,16 +13128,26 @@
12899
13128
  readonly
12900
13129
  } = useSlider({
12901
13130
  props,
12902
- // eslint-disable-next-line @typescript-eslint/no-use-before-define
12903
- handleSliderMouseUp: newValue => model.value = roundValue(newValue),
12904
- // eslint-disable-next-line @typescript-eslint/no-use-before-define
12905
- handleMouseMove: newValue => model.value = roundValue(newValue),
13131
+ steps,
13132
+ onSliderStart: () => {
13133
+ emit('start', model.value);
13134
+ },
13135
+ onSliderEnd: _ref2 => {
13136
+ let {
13137
+ value
13138
+ } = _ref2;
13139
+ const roundedValue = roundValue(value);
13140
+ model.value = roundedValue;
13141
+ emit('end', roundedValue);
13142
+ },
13143
+ onSliderMove: _ref3 => {
13144
+ let {
13145
+ value
13146
+ } = _ref3;
13147
+ return model.value = roundValue(value);
13148
+ },
12906
13149
  getActiveThumb: () => thumbContainerRef.value?.$el
12907
13150
  });
12908
- const model = useProxiedModel(props, 'modelValue', undefined, v => {
12909
- const value = typeof v === 'string' ? parseFloat(v) : v == null ? min.value : v;
12910
- return roundValue(value);
12911
- });
12912
13151
  const {
12913
13152
  isFocused,
12914
13153
  focus,
@@ -12916,7 +13155,7 @@
12916
13155
  } = useFocus(props);
12917
13156
  const trackStop = vue.computed(() => position(model.value));
12918
13157
  useRender(() => {
12919
- const [inputProps, _] = filterInputProps(props);
13158
+ const [inputProps, _] = VInput.filterProps(props);
12920
13159
  const hasPrepend = !!(props.label || slots.label || slots.prepend);
12921
13160
  return vue.createVNode(VInput, vue.mergeProps({
12922
13161
  "class": ['v-slider', {
@@ -12934,11 +13173,11 @@
12934
13173
  "class": "v-slider__label",
12935
13174
  "text": props.label
12936
13175
  }, null) : undefined, slots.prepend?.(slotProps)]) : undefined,
12937
- default: _ref2 => {
13176
+ default: _ref4 => {
12938
13177
  let {
12939
13178
  id,
12940
13179
  messagesId
12941
- } = _ref2;
13180
+ } = _ref4;
12942
13181
  return vue.createVNode("div", {
12943
13182
  "class": "v-slider__container",
12944
13183
  "onMousedown": !readonly.value ? onSliderMousedown : undefined,
@@ -13580,6 +13819,7 @@
13580
13819
  })
13581
13820
  },
13582
13821
  emits: {
13822
+ 'update:focused': focused => true,
13583
13823
  'update:modelValue': val => true,
13584
13824
  'update:search': val => true,
13585
13825
  'update:menu': val => true
@@ -13717,8 +13957,9 @@
13717
13957
  }
13718
13958
  return;
13719
13959
  }
13720
- select(selection.value);
13721
- vue.nextTick(() => !selection.value && (selectionIndex.value = length - 2));
13960
+ const originalSelectionIndex = selectionIndex.value;
13961
+ if (selection.value) select(selection.value);
13962
+ selectionIndex.value = originalSelectionIndex >= length - 1 ? length - 2 : originalSelectionIndex;
13722
13963
  }
13723
13964
  if (e.key === 'ArrowLeft') {
13724
13965
  if (selectionIndex.value < 0 && selectionStart > 0) return;
@@ -13803,6 +14044,8 @@
13803
14044
  "onUpdate:modelValue": [$event => search.value = $event, v => {
13804
14045
  if (v == null) model.value = [];
13805
14046
  }],
14047
+ "focused": isFocused.value,
14048
+ "onUpdate:focused": $event => isFocused.value = $event,
13806
14049
  "validationValue": model.externalValue,
13807
14050
  "dirty": isDirty,
13808
14051
  "class": ['v-combobox', {
@@ -13816,8 +14059,6 @@
13816
14059
  "placeholder": isDirty ? undefined : props.placeholder,
13817
14060
  "onClick:clear": onClear,
13818
14061
  "onMousedown:control": onMousedownControl,
13819
- "onFocus": () => isFocused.value = true,
13820
- "onBlur": () => isFocused.value = false,
13821
14062
  "onKeydown": onKeydown
13822
14063
  }), {
13823
14064
  ...slots,
@@ -14269,8 +14510,6 @@
14269
14510
  default: '$vuetify.fileInput.counter'
14270
14511
  },
14271
14512
  multiple: Boolean,
14272
- hint: String,
14273
- persistentHint: Boolean,
14274
14513
  showSize: {
14275
14514
  type: [Boolean, Number],
14276
14515
  default: false,
@@ -14295,6 +14534,7 @@
14295
14534
  emits: {
14296
14535
  'click:control': e => true,
14297
14536
  'mousedown:control': e => true,
14537
+ 'update:focused': focused => true,
14298
14538
  'update:modelValue': files => true
14299
14539
  },
14300
14540
  setup(props, _ref) {
@@ -14307,6 +14547,11 @@
14307
14547
  t
14308
14548
  } = useLocale();
14309
14549
  const model = useProxiedModel(props, 'modelValue');
14550
+ const {
14551
+ isFocused,
14552
+ focus,
14553
+ blur
14554
+ } = useFocus(props);
14310
14555
  const base = vue.computed(() => typeof props.showSize !== 'boolean' ? props.showSize : undefined);
14311
14556
  const totalBytes = vue.computed(() => (model.value ?? []).reduce((bytes, _ref2) => {
14312
14557
  let {
@@ -14328,21 +14573,14 @@
14328
14573
  });
14329
14574
  const vInputRef = vue.ref();
14330
14575
  const vFieldRef = vue.ref();
14331
- const isFocused = vue.ref(false);
14332
14576
  const inputRef = vue.ref();
14333
- const messages = vue.computed(() => {
14334
- return props.messages.length ? props.messages : props.persistentHint ? props.hint : '';
14335
- });
14336
14577
  function onFocus() {
14337
14578
  if (inputRef.value !== document.activeElement) {
14338
14579
  inputRef.value?.focus();
14339
14580
  }
14340
- if (!isFocused.value) {
14341
- isFocused.value = true;
14342
- }
14581
+ if (!isFocused.value) focus();
14343
14582
  }
14344
14583
  function onClickPrepend(e) {
14345
- callEvent(props['onClick:prepend'], e);
14346
14584
  onControlClick(e);
14347
14585
  }
14348
14586
  function onControlMousedown(e) {
@@ -14373,18 +14611,16 @@
14373
14611
  const [{
14374
14612
  modelValue: _,
14375
14613
  ...inputProps
14376
- }] = filterInputProps(props);
14614
+ }] = VInput.filterProps(props);
14377
14615
  const [fieldProps] = filterFieldProps(props);
14378
14616
  return vue.createVNode(VInput, vue.mergeProps({
14379
14617
  "ref": vInputRef,
14380
14618
  "modelValue": model.value,
14381
14619
  "onUpdate:modelValue": $event => model.value = $event,
14382
14620
  "class": "v-file-input",
14383
- "onClick:prepend": onClickPrepend,
14384
- "onClick:append": props['onClick:append']
14621
+ "onClick:prepend": onClickPrepend
14385
14622
  }, rootAttrs, inputProps, {
14386
- "focused": isFocused.value,
14387
- "messages": messages.value
14623
+ "focused": isFocused.value
14388
14624
  }), {
14389
14625
  ...slots,
14390
14626
  default: _ref3 => {
@@ -14436,7 +14672,7 @@
14436
14672
  model.value = [...(target.files ?? [])];
14437
14673
  },
14438
14674
  "onFocus": onFocus,
14439
- "onBlur": () => isFocused.value = false
14675
+ "onBlur": blur
14440
14676
  }, slotProps, inputAttrs), null), vue.createVNode("div", {
14441
14677
  "class": fieldClass
14442
14678
  }, [!!model.value?.length && (slots.selection ? slots.selection({
@@ -15127,6 +15363,432 @@
15127
15363
  }
15128
15364
  });
15129
15365
 
15366
+ // Utilities
15367
+
15368
+ // Types
15369
+
15370
+ function getWeekArray(date) {
15371
+ let currentWeek = [];
15372
+ const weeks = [];
15373
+ const firstDayOfMonth = startOfMonth(date);
15374
+ const lastDayOfMonth = endOfMonth(date);
15375
+ for (let i = 0; i < firstDayOfMonth.getDay(); i++) {
15376
+ currentWeek.push(null);
15377
+ }
15378
+ for (let i = 1; i <= lastDayOfMonth.getDate(); i++) {
15379
+ const day = new Date(date.getFullYear(), date.getMonth(), i);
15380
+
15381
+ // Add the day to the current week
15382
+ currentWeek.push(day);
15383
+
15384
+ // If the current week has 7 days, add it to the weeks array and start a new week
15385
+ if (currentWeek.length === 7) {
15386
+ weeks.push(currentWeek);
15387
+ currentWeek = [];
15388
+ }
15389
+ }
15390
+ for (let i = currentWeek.length; i < 7; i++) {
15391
+ currentWeek.push(null);
15392
+ }
15393
+ weeks.push(currentWeek);
15394
+ return weeks;
15395
+ }
15396
+ function startOfMonth(date) {
15397
+ return new Date(date.getFullYear(), date.getMonth(), 1);
15398
+ }
15399
+ function endOfMonth(date) {
15400
+ return new Date(date.getFullYear(), date.getMonth() + 1, 0);
15401
+ }
15402
+ function date(value) {
15403
+ if (value == null) return null;
15404
+ if (value instanceof Date) return value;
15405
+ if (typeof value === 'string') {
15406
+ const parsed = Date.parse(value);
15407
+ if (!isNaN(parsed)) return new Date(parsed);
15408
+ }
15409
+ return null;
15410
+ }
15411
+ const firstDay = {
15412
+ '001': 1,
15413
+ AD: 1,
15414
+ AE: 6,
15415
+ AF: 6,
15416
+ AG: 0,
15417
+ AI: 1,
15418
+ AL: 1,
15419
+ AM: 1,
15420
+ AN: 1,
15421
+ AR: 1,
15422
+ AS: 0,
15423
+ AT: 1,
15424
+ AU: 0,
15425
+ AX: 1,
15426
+ AZ: 1,
15427
+ BA: 1,
15428
+ BD: 0,
15429
+ BE: 1,
15430
+ BG: 1,
15431
+ BH: 6,
15432
+ BM: 1,
15433
+ BN: 1,
15434
+ BR: 0,
15435
+ BS: 0,
15436
+ BT: 0,
15437
+ BW: 0,
15438
+ BY: 1,
15439
+ BZ: 0,
15440
+ CA: 0,
15441
+ CH: 1,
15442
+ CL: 1,
15443
+ CM: 1,
15444
+ CN: 0,
15445
+ CO: 0,
15446
+ CR: 1,
15447
+ CY: 1,
15448
+ CZ: 1,
15449
+ DE: 1,
15450
+ DJ: 6,
15451
+ DK: 1,
15452
+ DM: 0,
15453
+ DO: 0,
15454
+ DZ: 6,
15455
+ EC: 1,
15456
+ EE: 1,
15457
+ EG: 6,
15458
+ ES: 1,
15459
+ ET: 0,
15460
+ FI: 1,
15461
+ FJ: 1,
15462
+ FO: 1,
15463
+ FR: 1,
15464
+ GB: 1,
15465
+ 'GB-alt-variant': 0,
15466
+ GE: 1,
15467
+ GF: 1,
15468
+ GP: 1,
15469
+ GR: 1,
15470
+ GT: 0,
15471
+ GU: 0,
15472
+ HK: 0,
15473
+ HN: 0,
15474
+ HR: 1,
15475
+ HU: 1,
15476
+ ID: 0,
15477
+ IE: 1,
15478
+ IL: 0,
15479
+ IN: 0,
15480
+ IQ: 6,
15481
+ IR: 6,
15482
+ IS: 1,
15483
+ IT: 1,
15484
+ JM: 0,
15485
+ JO: 6,
15486
+ JP: 0,
15487
+ KE: 0,
15488
+ KG: 1,
15489
+ KH: 0,
15490
+ KR: 0,
15491
+ KW: 6,
15492
+ KZ: 1,
15493
+ LA: 0,
15494
+ LB: 1,
15495
+ LI: 1,
15496
+ LK: 1,
15497
+ LT: 1,
15498
+ LU: 1,
15499
+ LV: 1,
15500
+ LY: 6,
15501
+ MC: 1,
15502
+ MD: 1,
15503
+ ME: 1,
15504
+ MH: 0,
15505
+ MK: 1,
15506
+ MM: 0,
15507
+ MN: 1,
15508
+ MO: 0,
15509
+ MQ: 1,
15510
+ MT: 0,
15511
+ MV: 5,
15512
+ MX: 0,
15513
+ MY: 1,
15514
+ MZ: 0,
15515
+ NI: 0,
15516
+ NL: 1,
15517
+ NO: 1,
15518
+ NP: 0,
15519
+ NZ: 1,
15520
+ OM: 6,
15521
+ PA: 0,
15522
+ PE: 0,
15523
+ PH: 0,
15524
+ PK: 0,
15525
+ PL: 1,
15526
+ PR: 0,
15527
+ PT: 0,
15528
+ PY: 0,
15529
+ QA: 6,
15530
+ RE: 1,
15531
+ RO: 1,
15532
+ RS: 1,
15533
+ RU: 1,
15534
+ SA: 0,
15535
+ SD: 6,
15536
+ SE: 1,
15537
+ SG: 0,
15538
+ SI: 1,
15539
+ SK: 1,
15540
+ SM: 1,
15541
+ SV: 0,
15542
+ SY: 6,
15543
+ TH: 0,
15544
+ TJ: 1,
15545
+ TM: 1,
15546
+ TR: 1,
15547
+ TT: 0,
15548
+ TW: 0,
15549
+ UA: 1,
15550
+ UM: 0,
15551
+ US: 0,
15552
+ UY: 1,
15553
+ UZ: 1,
15554
+ VA: 1,
15555
+ VE: 0,
15556
+ VI: 0,
15557
+ VN: 1,
15558
+ WS: 0,
15559
+ XK: 1,
15560
+ YE: 0,
15561
+ ZA: 0,
15562
+ ZW: 0
15563
+ };
15564
+ const sundayJanuarySecond2000 = new Date(2000, 0, 2);
15565
+ function getWeekdays(locale) {
15566
+ const daysFromSunday = firstDay[locale.slice(-2).toUpperCase()];
15567
+ return createRange(7).map(i => {
15568
+ const weekday = new Date(sundayJanuarySecond2000);
15569
+ weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
15570
+ return new Intl.DateTimeFormat(locale, {
15571
+ weekday: 'long'
15572
+ }).format(weekday);
15573
+ });
15574
+ }
15575
+ function format(value, formatString, locale) {
15576
+ const date = new Date(value);
15577
+ let options = {};
15578
+ switch (formatString) {
15579
+ case 'fullDateWithWeekday':
15580
+ options = {
15581
+ weekday: 'long',
15582
+ day: 'numeric',
15583
+ month: 'long',
15584
+ year: 'numeric'
15585
+ };
15586
+ break;
15587
+ case 'normalDateWithWeekday':
15588
+ options = {
15589
+ weekday: 'short',
15590
+ day: 'numeric',
15591
+ month: 'short',
15592
+ year: 'numeric'
15593
+ };
15594
+ break;
15595
+ case 'keyboardDate':
15596
+ options = {};
15597
+ break;
15598
+ case 'monthAndDate':
15599
+ options = {
15600
+ month: 'long',
15601
+ day: 'numeric'
15602
+ };
15603
+ break;
15604
+ case 'monthAndYear':
15605
+ options = {
15606
+ month: 'long',
15607
+ year: 'numeric'
15608
+ };
15609
+ break;
15610
+ default:
15611
+ options = {
15612
+ timeZone: 'UTC',
15613
+ timeZoneName: 'short'
15614
+ };
15615
+ }
15616
+ return new Intl.DateTimeFormat(locale, options).format(date);
15617
+ }
15618
+ function addDays(date, amount) {
15619
+ const d = new Date(date);
15620
+ d.setDate(d.getDate() + amount);
15621
+ return d;
15622
+ }
15623
+ function addMonths(date, amount) {
15624
+ const d = new Date(date);
15625
+ d.setMonth(d.getMonth() + amount);
15626
+ return d;
15627
+ }
15628
+ function getYear(date) {
15629
+ return date.getFullYear();
15630
+ }
15631
+ function getMonth(date) {
15632
+ return date.getMonth();
15633
+ }
15634
+ function startOfYear(date) {
15635
+ return new Date(date.getFullYear(), 0, 1);
15636
+ }
15637
+ function endOfYear(date) {
15638
+ return new Date(date.getFullYear(), 11, 31);
15639
+ }
15640
+ function getMondayOfFirstWeekOfYear(year) {
15641
+ return new Date(year, 0, 1);
15642
+ }
15643
+
15644
+ // https://stackoverflow.com/questions/274861/how-do-i-calculate-the-week-number-given-a-date/275024#275024
15645
+ function getWeek(date) {
15646
+ let year = date.getFullYear();
15647
+ let d1w1 = getMondayOfFirstWeekOfYear(year);
15648
+ if (date < d1w1) {
15649
+ year = year - 1;
15650
+ d1w1 = getMondayOfFirstWeekOfYear(year);
15651
+ } else {
15652
+ const tv = getMondayOfFirstWeekOfYear(year + 1);
15653
+ if (date >= tv) {
15654
+ year = year + 1;
15655
+ d1w1 = tv;
15656
+ }
15657
+ }
15658
+ const diffTime = Math.abs(date.getTime() - d1w1.getTime());
15659
+ const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
15660
+ return Math.floor(diffDays / 7) + 1;
15661
+ }
15662
+ function isWithinRange(date, range) {
15663
+ return isAfter(date, range[0]) && isBefore(date, range[1]);
15664
+ }
15665
+ function isValid(date) {
15666
+ const d = new Date(date);
15667
+ return d instanceof Date && !isNaN(d.getTime());
15668
+ }
15669
+ function isAfter(date, comparing) {
15670
+ return date.getTime() > comparing.getTime();
15671
+ }
15672
+ function isBefore(date, comparing) {
15673
+ return date.getTime() < comparing.getTime();
15674
+ }
15675
+ function isEqual(date, comparing) {
15676
+ return date.getTime() === comparing.getTime();
15677
+ }
15678
+ function isSameDay(date, comparing) {
15679
+ return date.getDate() === comparing.getDate() && date.getMonth() === comparing.getMonth() && date.getFullYear() === comparing.getFullYear();
15680
+ }
15681
+ function isSameMonth(date, comparing) {
15682
+ return date.getMonth() === comparing.getMonth() && date.getFullYear() === comparing.getFullYear();
15683
+ }
15684
+ function getDiff(date, comparing, unit) {
15685
+ const d = new Date(date);
15686
+ const c = new Date(comparing);
15687
+ if (unit === 'month') {
15688
+ return d.getMonth() - c.getMonth() + (d.getFullYear() - c.getFullYear()) * 12;
15689
+ }
15690
+ return Math.floor((d.getTime() - c.getTime()) / (1000 * 60 * 60 * 24));
15691
+ }
15692
+ function setYear(date, year) {
15693
+ const d = new Date(date);
15694
+ d.setFullYear(year);
15695
+ return d;
15696
+ }
15697
+ class VuetifyDateAdapter {
15698
+ constructor() {
15699
+ let locale = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'en';
15700
+ this.locale = locale;
15701
+ }
15702
+ date(value) {
15703
+ return date(value);
15704
+ }
15705
+ addDays(date, amount) {
15706
+ return addDays(date, amount);
15707
+ }
15708
+ addMonths(date, amount) {
15709
+ return addMonths(date, amount);
15710
+ }
15711
+ getWeekArray(date) {
15712
+ return getWeekArray(date);
15713
+ }
15714
+ startOfMonth(date) {
15715
+ return startOfMonth(date);
15716
+ }
15717
+ endOfMonth(date) {
15718
+ return endOfMonth(date);
15719
+ }
15720
+ format(date, formatString) {
15721
+ return format(date, formatString, this.locale);
15722
+ }
15723
+ isEqual(date, comparing) {
15724
+ return isEqual(date, comparing);
15725
+ }
15726
+ isValid(date) {
15727
+ return isValid(date);
15728
+ }
15729
+ isWithinRange(date, range) {
15730
+ return isWithinRange(date, range);
15731
+ }
15732
+ isAfter(date, comparing) {
15733
+ return isAfter(date, comparing);
15734
+ }
15735
+ isSameDay(date, comparing) {
15736
+ return isSameDay(date, comparing);
15737
+ }
15738
+ isSameMonth(date, comparing) {
15739
+ return isSameMonth(date, comparing);
15740
+ }
15741
+ setYear(date, year) {
15742
+ return setYear(date, year);
15743
+ }
15744
+ getDiff(date, comparing, unit) {
15745
+ return getDiff(date, comparing, unit);
15746
+ }
15747
+ getWeek(date) {
15748
+ return getWeek(date);
15749
+ }
15750
+ getWeekdays() {
15751
+ return getWeekdays(this.locale);
15752
+ }
15753
+ getYear(date) {
15754
+ return getYear(date);
15755
+ }
15756
+ getMonth(date) {
15757
+ return getMonth(date);
15758
+ }
15759
+ startOfYear(date) {
15760
+ return startOfYear(date);
15761
+ }
15762
+ endOfYear(date) {
15763
+ return endOfYear(date);
15764
+ }
15765
+ }
15766
+
15767
+ // Composables
15768
+
15769
+ // Types
15770
+
15771
+ const DateAdapterSymbol = Symbol.for('vuetify:date-adapter');
15772
+ function createDate(options) {
15773
+ return options ?? {
15774
+ adapter: VuetifyDateAdapter
15775
+ };
15776
+ }
15777
+ function useDate(props) {
15778
+ const date = vue.inject(DateAdapterSymbol);
15779
+ const locale = useLocale();
15780
+ if (!date) throw new Error('[Vuetify] Could not find injected date');
15781
+
15782
+ // eslint-disable-next-line new-cap
15783
+ const instance = new date.adapter(locale.current.value);
15784
+ vue.watch(locale.current, val => {
15785
+ instance.locale = val;
15786
+ }, {
15787
+ immediate: true
15788
+ });
15789
+ return instance;
15790
+ }
15791
+
15130
15792
  function useSticky(_ref) {
15131
15793
  let {
15132
15794
  rootEl,
@@ -16131,7 +16793,7 @@
16131
16793
  const model = useProxiedModel(props, 'modelValue');
16132
16794
  useRender(() => {
16133
16795
  const [inputAttrs, controlAttrs] = filterInputAttrs(attrs);
16134
- const [inputProps, _1] = filterInputProps(props);
16796
+ const [inputProps, _1] = VInput.filterProps(props);
16135
16797
  const [controlProps, _2] = VSelectionControl.filterProps(props);
16136
16798
  const label = slots.label ? slots.label({
16137
16799
  label: props.label,
@@ -16196,11 +16858,14 @@
16196
16858
  },
16197
16859
  emits: {
16198
16860
  'update:focused': value => true,
16199
- 'update:modelValue': value => true
16861
+ 'update:modelValue': value => true,
16862
+ end: value => true,
16863
+ start: value => true
16200
16864
  },
16201
16865
  setup(props, _ref) {
16202
16866
  let {
16203
- slots
16867
+ slots,
16868
+ emit
16204
16869
  } = _ref;
16205
16870
  const startThumbRef = vue.ref();
16206
16871
  const stopThumbRef = vue.ref();
@@ -16213,6 +16878,11 @@
16213
16878
  const b = Math.abs(stopOffset);
16214
16879
  return a < b || a === b && startOffset < 0 ? startThumbRef.value.$el : stopThumbRef.value.$el;
16215
16880
  }
16881
+ const steps = useSteps(props);
16882
+ const model = useProxiedModel(props, 'modelValue', undefined, arr => {
16883
+ if (!arr?.length) return [0, 0];
16884
+ return arr.map(value => steps.roundValue(value));
16885
+ });
16216
16886
  const {
16217
16887
  activeThumbRef,
16218
16888
  hasLabels,
@@ -16222,34 +16892,37 @@
16222
16892
  onSliderMousedown,
16223
16893
  onSliderTouchstart,
16224
16894
  position,
16225
- roundValue,
16226
16895
  trackContainerRef
16227
16896
  } = useSlider({
16228
- /* eslint-disable @typescript-eslint/no-use-before-define */
16229
16897
  props,
16230
- handleSliderMouseUp: newValue => {
16231
- model.value = activeThumbRef.value === startThumbRef.value?.$el ? [newValue, model.value[1]] : [model.value[0], newValue];
16898
+ steps,
16899
+ onSliderStart: () => {
16900
+ emit('start', model.value);
16901
+ },
16902
+ onSliderEnd: _ref2 => {
16903
+ let {
16904
+ value
16905
+ } = _ref2;
16906
+ const newValue = activeThumbRef.value === startThumbRef.value?.$el ? [value, model.value[1]] : [model.value[0], value];
16907
+ model.value = newValue;
16908
+ emit('end', newValue);
16232
16909
  },
16233
- handleMouseMove: newValue => {
16910
+ onSliderMove: _ref3 => {
16911
+ let {
16912
+ value
16913
+ } = _ref3;
16234
16914
  const [start, stop] = model.value;
16235
16915
  if (!props.strict && start === stop && start !== min.value) {
16236
- activeThumbRef.value = newValue > start ? stopThumbRef.value?.$el : startThumbRef.value?.$el;
16916
+ activeThumbRef.value = value > start ? stopThumbRef.value?.$el : startThumbRef.value?.$el;
16237
16917
  activeThumbRef.value?.focus();
16238
16918
  }
16239
16919
  if (activeThumbRef.value === startThumbRef.value?.$el) {
16240
- model.value = [Math.min(newValue, stop), stop];
16920
+ model.value = [Math.min(value, stop), stop];
16241
16921
  } else {
16242
- model.value = [start, Math.max(start, newValue)];
16922
+ model.value = [start, Math.max(start, value)];
16243
16923
  }
16244
16924
  },
16245
16925
  getActiveThumb
16246
- /* eslint-enable @typescript-eslint/no-use-before-define */
16247
- });
16248
-
16249
- const model = useProxiedModel(props, 'modelValue', undefined, arr => {
16250
- // eslint-disable-next-line @typescript-eslint/prefer-optional-chain
16251
- if (!arr || !arr.length) return [0, 0];
16252
- return arr.map(value => roundValue(value));
16253
16926
  });
16254
16927
  const {
16255
16928
  isFocused,
@@ -16259,7 +16932,7 @@
16259
16932
  const trackStart = vue.computed(() => position(model.value[0]));
16260
16933
  const trackStop = vue.computed(() => position(model.value[1]));
16261
16934
  useRender(() => {
16262
- const [inputProps, _] = filterInputProps(props);
16935
+ const [inputProps, _] = VInput.filterProps(props);
16263
16936
  const hasPrepend = !!(props.label || slots.label || slots.prepend);
16264
16937
  return vue.createVNode(VInput, vue.mergeProps({
16265
16938
  "class": ['v-slider', 'v-range-slider', {
@@ -16277,11 +16950,11 @@
16277
16950
  "class": "v-slider__label",
16278
16951
  "text": props.label
16279
16952
  }, null) : undefined, slots.prepend?.(slotProps)]) : undefined,
16280
- default: _ref2 => {
16953
+ default: _ref4 => {
16281
16954
  let {
16282
16955
  id,
16283
16956
  messagesId
16284
- } = _ref2;
16957
+ } = _ref4;
16285
16958
  return vue.createVNode("div", {
16286
16959
  "class": "v-slider__container",
16287
16960
  "onMousedown": onSliderMousedown,
@@ -17104,10 +17777,12 @@
17104
17777
  }
17105
17778
  useRender(() => {
17106
17779
  const [inputAttrs, controlAttrs] = filterInputAttrs(attrs);
17107
- const [inputProps, _1] = filterInputProps(props);
17780
+ const [inputProps, _1] = VInput.filterProps(props);
17108
17781
  const [controlProps, _2] = VSelectionControl.filterProps(props);
17109
17782
  const control = vue.ref();
17110
- function onClick() {
17783
+ function onClick(e) {
17784
+ e.stopPropagation();
17785
+ e.preventDefault();
17111
17786
  control.value?.input?.click();
17112
17787
  }
17113
17788
  return vue.createVNode(VInput, vue.mergeProps({
@@ -17468,8 +18143,6 @@
17468
18143
  autofocus: Boolean,
17469
18144
  counter: [Boolean, Number, String],
17470
18145
  counterValue: Function,
17471
- hint: String,
17472
- persistentHint: Boolean,
17473
18146
  prefix: String,
17474
18147
  placeholder: String,
17475
18148
  persistentPlaceholder: Boolean,
@@ -17524,9 +18197,6 @@
17524
18197
  const controlHeight = vue.ref('');
17525
18198
  const textareaRef = vue.ref();
17526
18199
  const isActive = vue.computed(() => isFocused.value || props.persistentPlaceholder);
17527
- const messages = vue.computed(() => {
17528
- return props.messages.length ? props.messages : isFocused.value || props.persistentHint ? props.hint : '';
17529
- });
17530
18200
  function onFocus() {
17531
18201
  if (textareaRef.value !== document.activeElement) {
17532
18202
  textareaRef.value?.focus();
@@ -17598,7 +18268,7 @@
17598
18268
  const [{
17599
18269
  modelValue: _,
17600
18270
  ...inputProps
17601
- }] = filterInputProps(props);
18271
+ }] = VInput.filterProps(props);
17602
18272
  const [fieldProps] = filterFieldProps(props);
17603
18273
  return vue.createVNode(VInput, vue.mergeProps({
17604
18274
  "ref": vInputRef,
@@ -17612,12 +18282,9 @@
17612
18282
  'v-textarea--auto-grow': props.autoGrow,
17613
18283
  'v-textarea--no-resize': props.noResize || props.autoGrow,
17614
18284
  'v-text-field--flush-details': ['plain', 'underlined'].includes(props.variant)
17615
- }],
17616
- "onClick:prepend": props['onClick:prepend'],
17617
- "onClick:append": props['onClick:append']
18285
+ }]
17618
18286
  }, rootAttrs, inputProps, {
17619
- "focused": isFocused.value,
17620
- "messages": messages.value
18287
+ "focused": isFocused.value
17621
18288
  }), {
17622
18289
  ...slots,
17623
18290
  default: _ref2 => {
@@ -19099,56 +19766,64 @@
19099
19766
  const {
19100
19767
  t
19101
19768
  } = useLocale();
19102
- useRender(() => vue.createVNode(vue.Fragment, null, [props.loading ? slots.loading?.() ?? vue.createVNode(VDataTableRow, {
19103
- "class": "v-data-table-rows-no-data",
19104
- "key": "loading"
19105
- }, {
19106
- default: () => [t(props.loadingText)]
19107
- }) : undefined, !props.loading && !props.items.length && !props.hideNoData && (slots['no-data']?.() ?? vue.createVNode(VDataTableRow, {
19108
- "class": "v-data-table-rows-no-data",
19109
- "key": "no-data"
19110
- }, {
19111
- default: () => [t(props.noDataText)]
19112
- })), props.items.map((item, index) => {
19113
- if (item.type === 'group-header') {
19114
- return slots['group-header'] ? slots['group-header']({
19769
+ useRender(() => {
19770
+ if (props.loading && slots.loading) {
19771
+ return vue.createVNode("tr", {
19772
+ "class": "v-data-table-rows-no-data",
19773
+ "key": "loading"
19774
+ }, [vue.createVNode("td", {
19775
+ "colspan": columns.value.length
19776
+ }, [slots.loading()])]);
19777
+ }
19778
+ if (!props.loading && !props.items.length && !props.hideNoData && slots['no-data']) {
19779
+ return vue.createVNode("tr", {
19780
+ "class": "v-data-table-rows-no-data",
19781
+ "key": "no-data"
19782
+ }, [vue.createVNode("td", {
19783
+ "colspan": columns.value.length
19784
+ }, [slots['no-data']?.() ?? t(props.noDataText)])]);
19785
+ }
19786
+ return vue.createVNode(vue.Fragment, null, [props.items.map((item, index) => {
19787
+ if (item.type === 'group-header') {
19788
+ return slots['group-header'] ? slots['group-header']({
19789
+ index,
19790
+ item,
19791
+ columns: columns.value,
19792
+ isExpanded,
19793
+ toggleExpand,
19794
+ isSelected,
19795
+ toggleSelect,
19796
+ toggleGroup,
19797
+ isGroupOpen
19798
+ }) : vue.createVNode(VDataTableGroupHeaderRow, {
19799
+ "key": `group-header_${item.id}`,
19800
+ "item": item
19801
+ }, slots);
19802
+ }
19803
+ const slotProps = {
19115
19804
  index,
19116
19805
  item,
19117
19806
  columns: columns.value,
19118
19807
  isExpanded,
19119
19808
  toggleExpand,
19120
19809
  isSelected,
19121
- toggleSelect,
19122
- toggleGroup,
19123
- isGroupOpen
19124
- }) : vue.createVNode(VDataTableGroupHeaderRow, {
19125
- "key": `group-header_${item.id}`,
19810
+ toggleSelect
19811
+ };
19812
+ return vue.createVNode(vue.Fragment, null, [slots.item ? slots.item(slotProps) : vue.createVNode(VDataTableRow, {
19813
+ "key": `item_${item.value}`,
19814
+ "onClick": expandOnClick.value || props['onClick:row'] ? event => {
19815
+ if (expandOnClick.value) {
19816
+ toggleExpand(item);
19817
+ }
19818
+ props['onClick:row']?.(event, {
19819
+ item
19820
+ });
19821
+ } : undefined,
19822
+ "index": index,
19126
19823
  "item": item
19127
- }, slots);
19128
- }
19129
- const slotProps = {
19130
- index,
19131
- item,
19132
- columns: columns.value,
19133
- isExpanded,
19134
- toggleExpand,
19135
- isSelected,
19136
- toggleSelect
19137
- };
19138
- return vue.createVNode(vue.Fragment, null, [slots.item ? slots.item(slotProps) : vue.createVNode(VDataTableRow, {
19139
- "key": `item_${item.value}`,
19140
- "onClick": expandOnClick.value || props['onClick:row'] ? event => {
19141
- if (expandOnClick.value) {
19142
- toggleExpand(item);
19143
- }
19144
- props['onClick:row']?.(event, {
19145
- item
19146
- });
19147
- } : undefined,
19148
- "index": index,
19149
- "item": item
19150
- }, slots), isExpanded(item) && slots['expanded-row']?.(slotProps)]);
19151
- })]));
19824
+ }, slots), isExpanded(item) && slots['expanded-row']?.(slotProps)]);
19825
+ })]);
19826
+ });
19152
19827
  return {};
19153
19828
  }
19154
19829
  });
@@ -19423,7 +20098,8 @@
19423
20098
  page: page.value,
19424
20099
  itemsPerPage: itemsPerPage.value,
19425
20100
  sortBy: sortBy.value,
19426
- groupBy: groupBy.value
20101
+ groupBy: groupBy.value,
20102
+ search: search.value
19427
20103
  }));
19428
20104
 
19429
20105
  // Reset page when searching
@@ -19456,12 +20132,12 @@
19456
20132
  width: [String, Number],
19457
20133
  fixedHeader: Boolean,
19458
20134
  fixedFooter: Boolean,
19459
- 'onClick:row': Function
20135
+ 'onClick:row': Function,
20136
+ search: String
19460
20137
  }, 'v-data-table');
19461
20138
  const VDataTable = genericComponent()({
19462
20139
  name: 'VDataTable',
19463
20140
  props: {
19464
- search: String,
19465
20141
  ...makeVDataTableProps(),
19466
20142
  ...makeDataTableExpandProps(),
19467
20143
  ...makeDataTableGroupProps(),
@@ -19676,7 +20352,6 @@
19676
20352
  const VDataTableVirtual = genericComponent()({
19677
20353
  name: 'VDataTableVirtual',
19678
20354
  props: {
19679
- search: String,
19680
20355
  ...makeVDataTableProps(),
19681
20356
  ...makeVDataTableProps(),
19682
20357
  ...makeDataTableGroupProps(),
@@ -19915,7 +20590,8 @@
19915
20590
  page,
19916
20591
  itemsPerPage,
19917
20592
  sortBy,
19918
- groupBy
20593
+ groupBy,
20594
+ search: vue.toRef(props, 'search')
19919
20595
  });
19920
20596
  vue.provide('v-data-table', {
19921
20597
  toggleSort,
@@ -19975,6 +20651,7 @@
19975
20651
  'date-picker': 'list-item, heading, divider, date-picker-options, date-picker-days, actions',
19976
20652
  'date-picker-options': 'text, avatar@2',
19977
20653
  'date-picker-days': 'avatar@28',
20654
+ divider: 'divider',
19978
20655
  heading: 'heading',
19979
20656
  image: 'image',
19980
20657
  'list-item': 'text',
@@ -20382,6 +21059,7 @@
20382
21059
  const theme = createTheme(options.theme);
20383
21060
  const icons = createIcons(options.icons);
20384
21061
  const locale = createLocale(options.locale);
21062
+ const date = createDate(options.date);
20385
21063
  const install = app => {
20386
21064
  for (const key in directives) {
20387
21065
  app.directive(key, directives[key]);
@@ -20402,6 +21080,7 @@
20402
21080
  app.provide(ThemeSymbol, theme);
20403
21081
  app.provide(IconSymbol, icons);
20404
21082
  app.provide(LocaleSymbol, locale);
21083
+ app.provide(DateAdapterSymbol, date);
20405
21084
  if (IN_BROWSER && options.ssr) {
20406
21085
  if (app.$nuxt) {
20407
21086
  app.$nuxt.hook('app:suspense:resolve', () => {
@@ -20429,7 +21108,8 @@
20429
21108
  display: inject.call(this, DisplaySymbol),
20430
21109
  theme: inject.call(this, ThemeSymbol),
20431
21110
  icons: inject.call(this, IconSymbol),
20432
- locale: inject.call(this, LocaleSymbol)
21111
+ locale: inject.call(this, LocaleSymbol),
21112
+ date: inject.call(this, DateAdapterSymbol)
20433
21113
  });
20434
21114
  }
20435
21115
  }
@@ -20442,10 +21122,11 @@
20442
21122
  display,
20443
21123
  theme,
20444
21124
  icons,
20445
- locale
21125
+ locale,
21126
+ date
20446
21127
  };
20447
21128
  }
20448
- const version$1 = "4.0.0-dev-20230419.0";
21129
+ const version$1 = "4.0.0-dev-20230421.0";
20449
21130
  createVuetify$1.version = version$1;
20450
21131
 
20451
21132
  // Vue's inject() can only be used in setup
@@ -20457,7 +21138,7 @@
20457
21138
  }
20458
21139
  }
20459
21140
 
20460
- const version = "4.0.0-dev-20230419.0";
21141
+ const version = "4.0.0-dev-20230421.0";
20461
21142
 
20462
21143
  const createVuetify = function () {
20463
21144
  let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
@@ -20471,6 +21152,7 @@
20471
21152
  exports.components = components;
20472
21153
  exports.createVuetify = createVuetify;
20473
21154
  exports.directives = directives;
21155
+ exports.useDate = useDate;
20474
21156
  exports.useDisplay = useDisplay;
20475
21157
  exports.useLayout = useLayout;
20476
21158
  exports.useLocale = useLocale;