vuetify 3.5.8 → 3.5.9

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 (81) hide show
  1. package/dist/json/attributes.json +419 -7
  2. package/dist/json/importMap-labs.json +20 -8
  3. package/dist/json/importMap.json +150 -150
  4. package/dist/json/tags.json +118 -0
  5. package/dist/json/web-types.json +1315 -8
  6. package/dist/vuetify-labs.css +1437 -1420
  7. package/dist/vuetify-labs.d.ts +3021 -692
  8. package/dist/vuetify-labs.esm.js +790 -230
  9. package/dist/vuetify-labs.esm.js.map +1 -1
  10. package/dist/vuetify-labs.js +790 -230
  11. package/dist/vuetify-labs.min.css +2 -2
  12. package/dist/vuetify.css +592 -591
  13. package/dist/vuetify.d.ts +569 -68
  14. package/dist/vuetify.esm.js +220 -20
  15. package/dist/vuetify.esm.js.map +1 -1
  16. package/dist/vuetify.js +220 -20
  17. package/dist/vuetify.js.map +1 -1
  18. package/dist/vuetify.min.css +2 -2
  19. package/dist/vuetify.min.js +486 -466
  20. package/dist/vuetify.min.js.map +1 -1
  21. package/lib/components/VAutocomplete/VAutocomplete.mjs +5 -3
  22. package/lib/components/VAutocomplete/VAutocomplete.mjs.map +1 -1
  23. package/lib/components/VAutocomplete/index.d.mts +138 -6
  24. package/lib/components/VColorPicker/VColorPickerPreview.css +1 -0
  25. package/lib/components/VColorPicker/VColorPickerPreview.sass +1 -0
  26. package/lib/components/VColorPicker/_variables.scss +1 -0
  27. package/lib/components/VCombobox/VCombobox.mjs +5 -3
  28. package/lib/components/VCombobox/VCombobox.mjs.map +1 -1
  29. package/lib/components/VCombobox/index.d.mts +138 -6
  30. package/lib/components/VDatePicker/VDatePickerControls.mjs +1 -0
  31. package/lib/components/VDatePicker/VDatePickerControls.mjs.map +1 -1
  32. package/lib/components/VList/VList.mjs +8 -2
  33. package/lib/components/VList/VList.mjs.map +1 -1
  34. package/lib/components/VList/VListGroup.mjs +3 -1
  35. package/lib/components/VList/VListGroup.mjs.map +1 -1
  36. package/lib/components/VList/VListItem.mjs +17 -4
  37. package/lib/components/VList/VListItem.mjs.map +1 -1
  38. package/lib/components/VList/index.d.mts +108 -6
  39. package/lib/components/VSelect/VSelect.mjs +5 -3
  40. package/lib/components/VSelect/VSelect.mjs.map +1 -1
  41. package/lib/components/VSelect/index.d.mts +138 -6
  42. package/lib/components/index.d.mts +522 -24
  43. package/lib/composables/nested/activeStrategies.mjs +121 -0
  44. package/lib/composables/nested/activeStrategies.mjs.map +1 -0
  45. package/lib/composables/nested/nested.mjs +50 -1
  46. package/lib/composables/nested/nested.mjs.map +1 -1
  47. package/lib/composables/nested/selectStrategies.mjs +4 -2
  48. package/lib/composables/nested/selectStrategies.mjs.map +1 -1
  49. package/lib/entry-bundler.mjs +1 -1
  50. package/lib/framework.mjs +1 -1
  51. package/lib/iconsets/fa.mjs +2 -0
  52. package/lib/iconsets/fa.mjs.map +1 -1
  53. package/lib/iconsets/fa4.mjs +2 -0
  54. package/lib/iconsets/fa4.mjs.map +1 -1
  55. package/lib/iconsets/md.mjs +2 -0
  56. package/lib/iconsets/md.mjs.map +1 -1
  57. package/lib/iconsets/mdi-svg.mjs +2 -0
  58. package/lib/iconsets/mdi-svg.mjs.map +1 -1
  59. package/lib/iconsets/mdi.mjs +2 -0
  60. package/lib/iconsets/mdi.mjs.map +1 -1
  61. package/lib/index.d.mts +47 -44
  62. package/lib/labs/VTreeview/VTreeview.mjs +154 -0
  63. package/lib/labs/VTreeview/VTreeview.mjs.map +1 -0
  64. package/lib/labs/VTreeview/VTreeviewChildren.mjs +98 -0
  65. package/lib/labs/VTreeview/VTreeviewChildren.mjs.map +1 -0
  66. package/lib/labs/VTreeview/VTreeviewGroup.mjs +48 -0
  67. package/lib/labs/VTreeview/VTreeviewGroup.mjs.map +1 -0
  68. package/lib/labs/VTreeview/VTreeviewItem.css +17 -0
  69. package/lib/labs/VTreeview/VTreeviewItem.mjs +86 -0
  70. package/lib/labs/VTreeview/VTreeviewItem.mjs.map +1 -0
  71. package/lib/labs/VTreeview/VTreeviewItem.sass +19 -0
  72. package/lib/labs/VTreeview/index.d.mts +1975 -0
  73. package/lib/labs/VTreeview/index.mjs +4 -0
  74. package/lib/labs/VTreeview/index.mjs.map +1 -0
  75. package/lib/labs/VTreeview/shared.mjs +4 -0
  76. package/lib/labs/VTreeview/shared.mjs.map +1 -0
  77. package/lib/labs/VTreeview/variables.scss +8 -0
  78. package/lib/labs/components.d.mts +3708 -1773
  79. package/lib/labs/components.mjs +3 -2
  80. package/lib/labs/components.mjs.map +1 -1
  81. package/package.json +2 -2
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.5.8
2
+ * Vuetify v3.5.9
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -4376,6 +4376,8 @@
4376
4376
  plus: 'mdi-plus',
4377
4377
  minus: 'mdi-minus',
4378
4378
  calendar: 'mdi-calendar',
4379
+ treeviewCollapse: 'mdi-menu-down',
4380
+ treeviewExpand: 'mdi-menu-right',
4379
4381
  eyeDropper: 'mdi-eyedropper'
4380
4382
  };
4381
4383
  const mdi = {
@@ -7762,6 +7764,126 @@
7762
7764
  return vue.inject(ListKey, null);
7763
7765
  }
7764
7766
 
7767
+ /* eslint-disable sonarjs/no-identical-functions */
7768
+ // Utilities
7769
+ const independentActiveStrategy = mandatory => {
7770
+ const strategy = {
7771
+ activate: _ref => {
7772
+ let {
7773
+ id,
7774
+ value,
7775
+ activated
7776
+ } = _ref;
7777
+ id = vue.toRaw(id);
7778
+
7779
+ // When mandatory and we're trying to deselect when id
7780
+ // is the only currently selected item then do nothing
7781
+ if (mandatory && !value && activated.size === 1 && activated.has(id)) return activated;
7782
+ if (value) {
7783
+ activated.add(id);
7784
+ } else {
7785
+ activated.delete(id);
7786
+ }
7787
+ return activated;
7788
+ },
7789
+ in: (v, children, parents) => {
7790
+ let set = new Set();
7791
+ for (const id of v || []) {
7792
+ set = strategy.activate({
7793
+ id,
7794
+ value: true,
7795
+ activated: new Set(set),
7796
+ children,
7797
+ parents
7798
+ });
7799
+ }
7800
+ return set;
7801
+ },
7802
+ out: v => {
7803
+ return Array.from(v);
7804
+ }
7805
+ };
7806
+ return strategy;
7807
+ };
7808
+ const independentSingleActiveStrategy = mandatory => {
7809
+ const parentStrategy = independentActiveStrategy(mandatory);
7810
+ const strategy = {
7811
+ activate: _ref2 => {
7812
+ let {
7813
+ activated,
7814
+ id,
7815
+ ...rest
7816
+ } = _ref2;
7817
+ id = vue.toRaw(id);
7818
+ const singleSelected = activated.has(id) ? new Set([id]) : new Set();
7819
+ return parentStrategy.activate({
7820
+ ...rest,
7821
+ id,
7822
+ activated: singleSelected
7823
+ });
7824
+ },
7825
+ in: (v, children, parents) => {
7826
+ let set = new Set();
7827
+ if (v?.length) {
7828
+ set = parentStrategy.in(v.slice(0, 1), children, parents);
7829
+ }
7830
+ return set;
7831
+ },
7832
+ out: (v, children, parents) => {
7833
+ return parentStrategy.out(v, children, parents);
7834
+ }
7835
+ };
7836
+ return strategy;
7837
+ };
7838
+ const leafActiveStrategy = mandatory => {
7839
+ const parentStrategy = independentActiveStrategy(mandatory);
7840
+ const strategy = {
7841
+ activate: _ref3 => {
7842
+ let {
7843
+ id,
7844
+ activated,
7845
+ children,
7846
+ ...rest
7847
+ } = _ref3;
7848
+ id = vue.toRaw(id);
7849
+ if (children.has(id)) return activated;
7850
+ return parentStrategy.activate({
7851
+ id,
7852
+ activated,
7853
+ children,
7854
+ ...rest
7855
+ });
7856
+ },
7857
+ in: parentStrategy.in,
7858
+ out: parentStrategy.out
7859
+ };
7860
+ return strategy;
7861
+ };
7862
+ const leafSingleActiveStrategy = mandatory => {
7863
+ const parentStrategy = independentSingleActiveStrategy(mandatory);
7864
+ const strategy = {
7865
+ activate: _ref4 => {
7866
+ let {
7867
+ id,
7868
+ activated,
7869
+ children,
7870
+ ...rest
7871
+ } = _ref4;
7872
+ id = vue.toRaw(id);
7873
+ if (children.has(id)) return activated;
7874
+ return parentStrategy.activate({
7875
+ id,
7876
+ activated,
7877
+ children,
7878
+ ...rest
7879
+ });
7880
+ },
7881
+ in: parentStrategy.in,
7882
+ out: parentStrategy.out
7883
+ };
7884
+ return strategy;
7885
+ };
7886
+
7765
7887
  const singleOpenStrategy = {
7766
7888
  open: _ref => {
7767
7889
  let {
@@ -7846,7 +7968,8 @@
7846
7968
  if (mandatory && !value) {
7847
7969
  const on = Array.from(selected.entries()).reduce((arr, _ref2) => {
7848
7970
  let [key, value] = _ref2;
7849
- return value === 'on' ? [...arr, key] : arr;
7971
+ if (value === 'on') arr.push(key);
7972
+ return arr;
7850
7973
  }, []);
7851
7974
  if (on.length === 1 && on[0] === id) return selected;
7852
7975
  }
@@ -7988,7 +8111,8 @@
7988
8111
  if (mandatory && !value) {
7989
8112
  const on = Array.from(selected.entries()).reduce((arr, _ref7) => {
7990
8113
  let [key, value] = _ref7;
7991
- return value === 'on' ? [...arr, key] : arr;
8114
+ if (value === 'on') arr.push(key);
8115
+ return arr;
7992
8116
  }, []);
7993
8117
  if (on.length === 0) return original;
7994
8118
  }
@@ -8032,16 +8156,24 @@
8032
8156
  children: vue.ref(new Map()),
8033
8157
  open: () => null,
8034
8158
  openOnSelect: () => null,
8159
+ activate: () => null,
8035
8160
  select: () => null,
8161
+ activatable: vue.ref(false),
8162
+ selectable: vue.ref(false),
8036
8163
  opened: vue.ref(new Set()),
8164
+ activated: vue.ref(new Set()),
8037
8165
  selected: vue.ref(new Map()),
8038
8166
  selectedValues: vue.ref([])
8039
8167
  }
8040
8168
  };
8041
8169
  const makeNestedProps = propsFactory({
8170
+ activatable: Boolean,
8171
+ selectable: Boolean,
8172
+ activeStrategy: [String, Function],
8042
8173
  selectStrategy: [String, Function],
8043
8174
  openStrategy: [String, Object],
8044
8175
  opened: Array,
8176
+ activated: Array,
8045
8177
  selected: Array,
8046
8178
  mandatory: Boolean
8047
8179
  }, 'nested');
@@ -8050,6 +8182,20 @@
8050
8182
  const children = vue.ref(new Map());
8051
8183
  const parents = vue.ref(new Map());
8052
8184
  const opened = useProxiedModel(props, 'opened', props.opened, v => new Set(v), v => [...v.values()]);
8185
+ const activeStrategy = vue.computed(() => {
8186
+ if (typeof props.activeStrategy === 'object') return props.activeStrategy;
8187
+ switch (props.activeStrategy) {
8188
+ case 'leaf':
8189
+ return leafActiveStrategy(props.mandatory);
8190
+ case 'single-leaf':
8191
+ return leafSingleActiveStrategy(props.mandatory);
8192
+ case 'independent':
8193
+ return independentActiveStrategy(props.mandatory);
8194
+ case 'single-independent':
8195
+ default:
8196
+ return independentSingleActiveStrategy(props.mandatory);
8197
+ }
8198
+ });
8053
8199
  const selectStrategy = vue.computed(() => {
8054
8200
  if (typeof props.selectStrategy === 'object') return props.selectStrategy;
8055
8201
  switch (props.selectStrategy) {
@@ -8078,6 +8224,7 @@
8078
8224
  return multipleOpenStrategy;
8079
8225
  }
8080
8226
  });
8227
+ const activated = useProxiedModel(props, 'activated', props.activated, v => activeStrategy.value.in(v, children.value, parents.value), v => activeStrategy.value.out(v, children.value, parents.value));
8081
8228
  const selected = useProxiedModel(props, 'selected', props.selected, v => selectStrategy.value.in(v, children.value, parents.value), v => selectStrategy.value.out(v, children.value, parents.value));
8082
8229
  vue.onBeforeUnmount(() => {
8083
8230
  isUnmounted = true;
@@ -8096,6 +8243,9 @@
8096
8243
  id: vue.shallowRef(),
8097
8244
  root: {
8098
8245
  opened,
8246
+ activatable: vue.toRef(props, 'activatable'),
8247
+ selectable: vue.toRef(props, 'selectable'),
8248
+ activated,
8099
8249
  selected,
8100
8250
  selectedValues: vue.computed(() => {
8101
8251
  const arr = [];
@@ -8169,6 +8319,26 @@
8169
8319
  newSelected && (selected.value = newSelected);
8170
8320
  nested.root.openOnSelect(id, value, event);
8171
8321
  },
8322
+ activate: (id, value, event) => {
8323
+ if (!props.activatable) {
8324
+ return nested.root.select(id, true, event);
8325
+ }
8326
+ vm.emit('click:activate', {
8327
+ id,
8328
+ value,
8329
+ path: getPath(id),
8330
+ event
8331
+ });
8332
+ const newActivated = activeStrategy.value.activate({
8333
+ id,
8334
+ value,
8335
+ activated: new Set(activated.value),
8336
+ children: children.value,
8337
+ parents: parents.value,
8338
+ event
8339
+ });
8340
+ newActivated && (activated.value = newActivated);
8341
+ },
8172
8342
  children,
8173
8343
  parents
8174
8344
  }
@@ -8187,6 +8357,8 @@
8187
8357
  openOnSelect: (open, e) => parent.root.openOnSelect(computedId.value, open, e),
8188
8358
  isOpen: vue.computed(() => parent.root.opened.value.has(computedId.value)),
8189
8359
  parent: vue.computed(() => parent.root.parents.value.get(computedId.value)),
8360
+ activate: (activated, e) => parent.root.activate(computedId.value, activated, e),
8361
+ isActivated: vue.computed(() => parent.root.activated.value.has(vue.toRaw(computedId.value))),
8190
8362
  select: (selected, e) => parent.root.select(computedId.value, selected, e),
8191
8363
  isSelected: vue.computed(() => parent.root.selected.value.get(vue.toRaw(computedId.value)) === 'on'),
8192
8364
  isIndeterminate: vue.computed(() => parent.root.selected.value.get(computedId.value) === 'indeterminate'),
@@ -8309,7 +8481,9 @@
8309
8481
  }, [slots.default?.()]), [[vue.vShow, isOpen.value]])]
8310
8482
  })]
8311
8483
  }));
8312
- return {};
8484
+ return {
8485
+ isOpen
8486
+ };
8313
8487
  }
8314
8488
  });
8315
8489
 
@@ -8382,6 +8556,8 @@
8382
8556
  const link = useLink(props, attrs);
8383
8557
  const id = vue.computed(() => props.value === undefined ? link.href.value : props.value);
8384
8558
  const {
8559
+ activate,
8560
+ isActivated,
8385
8561
  select,
8386
8562
  isSelected,
8387
8563
  isIndeterminate,
@@ -8391,9 +8567,9 @@
8391
8567
  openOnSelect
8392
8568
  } = useNestedItem(id, false);
8393
8569
  const list = useList();
8394
- const isActive = vue.computed(() => props.active !== false && (props.active || link.isActive?.value || isSelected.value));
8570
+ const isActive = vue.computed(() => props.active !== false && (props.active || link.isActive?.value || (root.activatable.value ? isActivated.value : isSelected.value)));
8395
8571
  const isLink = vue.computed(() => props.link !== false && link.isLink.value);
8396
- const isClickable = vue.computed(() => !props.disabled && props.link !== false && (props.link || link.isClickable.value || props.value != null && !!list));
8572
+ const isClickable = vue.computed(() => !props.disabled && props.link !== false && (props.link || link.isClickable.value || !!list && (root.selectable.value || root.activatable.value || props.value != null)));
8397
8573
  const roundedProps = vue.computed(() => props.rounded || props.nav);
8398
8574
  const color = vue.computed(() => props.color ?? props.activeColor);
8399
8575
  const variantProps = vue.computed(() => ({
@@ -8444,7 +8620,13 @@
8444
8620
  emit('click', e);
8445
8621
  if (isGroupActivator || !isClickable.value) return;
8446
8622
  link.navigate?.(e);
8447
- props.value != null && select(!isSelected.value, e);
8623
+ if (root.activatable) {
8624
+ activate(!isActivated.value, e);
8625
+ } else if (root.selectable) {
8626
+ select(!isSelected.value, e);
8627
+ } else if (props.value != null) {
8628
+ select(!isSelected.value, e);
8629
+ }
8448
8630
  }
8449
8631
  function onKeyDown(e) {
8450
8632
  if (e.key === 'Enter' || e.key === ' ') {
@@ -8560,7 +8742,12 @@
8560
8742
  }, null)])]
8561
8743
  }), [[vue.resolveDirective("ripple"), isClickable.value && props.ripple]]);
8562
8744
  });
8563
- return {};
8745
+ return {
8746
+ isGroupActivator,
8747
+ isSelected,
8748
+ list,
8749
+ select
8750
+ };
8564
8751
  }
8565
8752
  });
8566
8753
 
@@ -8902,8 +9089,10 @@
8902
9089
  props: makeVListProps(),
8903
9090
  emits: {
8904
9091
  'update:selected': value => true,
9092
+ 'update:activated': value => true,
8905
9093
  'update:opened': value => true,
8906
9094
  'click:open': value => true,
9095
+ 'click:activate': value => true,
8907
9096
  'click:select': value => true
8908
9097
  },
8909
9098
  setup(props, _ref) {
@@ -8936,7 +9125,9 @@
8936
9125
  roundedClasses
8937
9126
  } = useRounded(props);
8938
9127
  const {
9128
+ children,
8939
9129
  open,
9130
+ parents,
8940
9131
  select
8941
9132
  } = useNested(props);
8942
9133
  const lineClasses = vue.computed(() => props.lines ? `v-list--${props.lines}-line` : undefined);
@@ -9026,7 +9217,9 @@
9026
9217
  return {
9027
9218
  open,
9028
9219
  select,
9029
- focus
9220
+ focus,
9221
+ children,
9222
+ parents
9030
9223
  };
9031
9224
  }
9032
9225
  });
@@ -11906,9 +12099,11 @@
11906
12099
  });
11907
12100
  }
11908
12101
  });
11909
- vue.watch(() => props.items, val => {
11910
- if (!isFocused.value || !val.length || menu.value) return;
11911
- menu.value = true;
12102
+ vue.watch(() => props.items, (newVal, oldVal) => {
12103
+ if (menu.value) return;
12104
+ if (isFocused.value && !oldVal.length && newVal.length) {
12105
+ menu.value = true;
12106
+ }
11912
12107
  });
11913
12108
  useRender(() => {
11914
12109
  const hasChips = !!(props.chips || slots.chip);
@@ -12468,9 +12663,11 @@
12468
12663
  });
12469
12664
  }
12470
12665
  });
12471
- vue.watch(() => props.items, val => {
12472
- if (!isFocused.value || !val.length || menu.value) return;
12473
- menu.value = true;
12666
+ vue.watch(() => props.items, (newVal, oldVal) => {
12667
+ if (menu.value) return;
12668
+ if (isFocused.value && !oldVal.length && newVal.length) {
12669
+ menu.value = true;
12670
+ }
12474
12671
  });
12475
12672
  useRender(() => {
12476
12673
  const hasList = !!(!props.hideNoData || displayItems.value.length || slots['prepend-item'] || slots['append-item'] || slots['no-data']);
@@ -16273,9 +16470,11 @@
16273
16470
  });
16274
16471
  }
16275
16472
  });
16276
- vue.watch(() => props.items, val => {
16277
- if (!isFocused.value || !val.length || menu.value) return;
16278
- menu.value = true;
16473
+ vue.watch(() => props.items, (newVal, oldVal) => {
16474
+ if (menu.value) return;
16475
+ if (isFocused.value && !oldVal.length && newVal.length) {
16476
+ menu.value = true;
16477
+ }
16279
16478
  });
16280
16479
  useRender(() => {
16281
16480
  const hasList = !!(!props.hideNoData || displayItems.value.length || slots['prepend-item'] || slots['append-item'] || slots['no-data']);
@@ -20296,6 +20495,7 @@
20296
20495
  emit('click:month');
20297
20496
  }
20298
20497
  useRender(() => {
20498
+ // TODO: add slot support and scope defaults
20299
20499
  return vue.createVNode("div", {
20300
20500
  "class": ['v-date-picker-controls']
20301
20501
  }, [vue.createVNode(VBtn, {
@@ -25402,78 +25602,6 @@
25402
25602
  }
25403
25603
  });
25404
25604
 
25405
- // Types
25406
-
25407
- const makeVConfirmEditProps = propsFactory({
25408
- modelValue: null,
25409
- color: String,
25410
- cancelText: {
25411
- type: String,
25412
- default: '$vuetify.confirmEdit.cancel'
25413
- },
25414
- okText: {
25415
- type: String,
25416
- default: '$vuetify.confirmEdit.ok'
25417
- }
25418
- }, 'VConfirmEdit');
25419
- const VConfirmEdit = genericComponent()({
25420
- name: 'VConfirmEdit',
25421
- props: makeVConfirmEditProps(),
25422
- emits: {
25423
- cancel: () => true,
25424
- save: value => true,
25425
- 'update:modelValue': value => true
25426
- },
25427
- setup(props, _ref) {
25428
- let {
25429
- emit,
25430
- slots
25431
- } = _ref;
25432
- const model = useProxiedModel(props, 'modelValue');
25433
- const internalModel = vue.ref();
25434
- vue.watchEffect(() => {
25435
- internalModel.value = structuredClone(vue.toRaw(model.value));
25436
- });
25437
- const {
25438
- t
25439
- } = useLocale();
25440
- const isPristine = vue.computed(() => {
25441
- return deepEqual(model.value, internalModel.value);
25442
- });
25443
- function save() {
25444
- model.value = internalModel.value;
25445
- emit('save', internalModel.value);
25446
- }
25447
- function cancel() {
25448
- internalModel.value = structuredClone(vue.toRaw(model.value));
25449
- emit('cancel');
25450
- }
25451
- let actionsUsed = false;
25452
- useRender(() => {
25453
- const actions = vue.createVNode(vue.Fragment, null, [vue.createVNode(VBtn, {
25454
- "disabled": isPristine.value,
25455
- "variant": "text",
25456
- "color": props.color,
25457
- "onClick": cancel,
25458
- "text": t(props.cancelText)
25459
- }, null), vue.createVNode(VBtn, {
25460
- "disabled": isPristine.value,
25461
- "variant": "text",
25462
- "color": props.color,
25463
- "onClick": save,
25464
- "text": t(props.okText)
25465
- }, null)]);
25466
- return vue.createVNode(vue.Fragment, null, [slots.default?.({
25467
- model: internalModel,
25468
- get actions() {
25469
- actionsUsed = true;
25470
- return actions;
25471
- }
25472
- }), !actionsUsed && actions]);
25473
- });
25474
- }
25475
- });
25476
-
25477
25605
  const makeVCalendarIntervalEventProps = propsFactory({
25478
25606
  allDay: Boolean,
25479
25607
  interval: Object,
@@ -25945,45 +26073,248 @@
25945
26073
  }
25946
26074
  });
25947
26075
 
25948
- const makeVFabProps = propsFactory({
25949
- app: Boolean,
25950
- appear: Boolean,
25951
- extended: Boolean,
25952
- location: {
26076
+ // Types
26077
+
26078
+ const makeVConfirmEditProps = propsFactory({
26079
+ modelValue: null,
26080
+ color: String,
26081
+ cancelText: {
25953
26082
  type: String,
25954
- default: 'bottom end'
25955
- },
25956
- offset: Boolean,
25957
- modelValue: {
25958
- type: Boolean,
25959
- default: true
26083
+ default: '$vuetify.confirmEdit.cancel'
25960
26084
  },
25961
- ...omit(makeVBtnProps({
25962
- active: true
25963
- }), ['location']),
25964
- ...makeLayoutItemProps(),
25965
- ...makeTransitionProps({
25966
- transition: 'fab-transition'
25967
- })
25968
- }, 'VFab');
25969
- const VFab = genericComponent()({
25970
- name: 'VFab',
25971
- props: makeVFabProps(),
26085
+ okText: {
26086
+ type: String,
26087
+ default: '$vuetify.confirmEdit.ok'
26088
+ }
26089
+ }, 'VConfirmEdit');
26090
+ const VConfirmEdit = genericComponent()({
26091
+ name: 'VConfirmEdit',
26092
+ props: makeVConfirmEditProps(),
25972
26093
  emits: {
26094
+ cancel: () => true,
26095
+ save: value => true,
25973
26096
  'update:modelValue': value => true
25974
26097
  },
25975
26098
  setup(props, _ref) {
25976
26099
  let {
26100
+ emit,
25977
26101
  slots
25978
26102
  } = _ref;
25979
26103
  const model = useProxiedModel(props, 'modelValue');
25980
- const height = vue.shallowRef(56);
25981
- const layoutItemStyles = vue.ref();
26104
+ const internalModel = vue.ref();
26105
+ vue.watchEffect(() => {
26106
+ internalModel.value = structuredClone(vue.toRaw(model.value));
26107
+ });
25982
26108
  const {
25983
- resizeRef
25984
- } = useResizeObserver(entries => {
25985
- if (!entries.length) return;
25986
- height.value = entries[0].target.clientHeight;
26109
+ t
26110
+ } = useLocale();
26111
+ const isPristine = vue.computed(() => {
26112
+ return deepEqual(model.value, internalModel.value);
26113
+ });
26114
+ function save() {
26115
+ model.value = internalModel.value;
26116
+ emit('save', internalModel.value);
26117
+ }
26118
+ function cancel() {
26119
+ internalModel.value = structuredClone(vue.toRaw(model.value));
26120
+ emit('cancel');
26121
+ }
26122
+ let actionsUsed = false;
26123
+ useRender(() => {
26124
+ const actions = vue.createVNode(vue.Fragment, null, [vue.createVNode(VBtn, {
26125
+ "disabled": isPristine.value,
26126
+ "variant": "text",
26127
+ "color": props.color,
26128
+ "onClick": cancel,
26129
+ "text": t(props.cancelText)
26130
+ }, null), vue.createVNode(VBtn, {
26131
+ "disabled": isPristine.value,
26132
+ "variant": "text",
26133
+ "color": props.color,
26134
+ "onClick": save,
26135
+ "text": t(props.okText)
26136
+ }, null)]);
26137
+ return vue.createVNode(vue.Fragment, null, [slots.default?.({
26138
+ model: internalModel,
26139
+ get actions() {
26140
+ actionsUsed = true;
26141
+ return actions;
26142
+ }
26143
+ }), !actionsUsed && actions]);
26144
+ });
26145
+ }
26146
+ });
26147
+
26148
+ // Types
26149
+
26150
+ // Types
26151
+
26152
+ const makeVEmptyStateProps = propsFactory({
26153
+ actionText: String,
26154
+ bgColor: String,
26155
+ color: String,
26156
+ icon: IconValue,
26157
+ image: String,
26158
+ justify: {
26159
+ type: String,
26160
+ default: 'center'
26161
+ },
26162
+ headline: String,
26163
+ title: String,
26164
+ text: String,
26165
+ textWidth: {
26166
+ type: [Number, String],
26167
+ default: 500
26168
+ },
26169
+ href: String,
26170
+ to: String,
26171
+ ...makeComponentProps(),
26172
+ ...makeDimensionProps(),
26173
+ ...makeSizeProps({
26174
+ size: undefined
26175
+ }),
26176
+ ...makeThemeProps()
26177
+ }, 'VEmptyState');
26178
+ const VEmptyState = genericComponent()({
26179
+ name: 'VEmptyState',
26180
+ props: makeVEmptyStateProps(),
26181
+ emits: {
26182
+ 'click:action': e => true
26183
+ },
26184
+ setup(props, _ref) {
26185
+ let {
26186
+ emit,
26187
+ slots
26188
+ } = _ref;
26189
+ const {
26190
+ themeClasses
26191
+ } = provideTheme(props);
26192
+ const {
26193
+ backgroundColorClasses,
26194
+ backgroundColorStyles
26195
+ } = useBackgroundColor(vue.toRef(props, 'bgColor'));
26196
+ const {
26197
+ dimensionStyles
26198
+ } = useDimension(props);
26199
+ function onClickAction(e) {
26200
+ emit('click:action', e);
26201
+ }
26202
+ useRender(() => {
26203
+ const hasActions = !!(slots.actions || props.actionText);
26204
+ const hasHeadline = !!(slots.headline || props.headline);
26205
+ const hasTitle = !!(slots.title || props.title);
26206
+ const hasText = !!(slots.text || props.text);
26207
+ const hasMedia = !!(slots.media || props.image || props.icon);
26208
+ const size = props.size || (props.image ? 200 : 96);
26209
+ return vue.createVNode("div", {
26210
+ "class": ['v-empty-state', {
26211
+ [`v-empty-state--${props.justify}`]: true
26212
+ }, themeClasses.value, backgroundColorClasses.value, props.class],
26213
+ "style": [backgroundColorStyles.value, dimensionStyles.value, props.style]
26214
+ }, [hasMedia && vue.createVNode("div", {
26215
+ "key": "media",
26216
+ "class": "v-empty-state__media"
26217
+ }, [!slots.media ? vue.createVNode(vue.Fragment, null, [props.image ? vue.createVNode(VImg, {
26218
+ "key": "image",
26219
+ "src": props.image,
26220
+ "height": size
26221
+ }, null) : props.icon ? vue.createVNode(VIcon, {
26222
+ "key": "icon",
26223
+ "size": size,
26224
+ "icon": props.icon
26225
+ }, null) : undefined]) : vue.createVNode(VDefaultsProvider, {
26226
+ "key": "media-defaults",
26227
+ "defaults": {
26228
+ VImg: {
26229
+ src: props.image,
26230
+ height: size
26231
+ },
26232
+ VIcon: {
26233
+ size,
26234
+ icon: props.icon
26235
+ }
26236
+ }
26237
+ }, {
26238
+ default: () => [slots.media()]
26239
+ })]), hasHeadline && vue.createVNode("div", {
26240
+ "key": "headline",
26241
+ "class": "v-empty-state__headline"
26242
+ }, [slots.headline?.() ?? props.headline]), hasTitle && vue.createVNode("div", {
26243
+ "key": "title",
26244
+ "class": "v-empty-state__title"
26245
+ }, [slots.title?.() ?? props.title]), hasText && vue.createVNode("div", {
26246
+ "key": "text",
26247
+ "class": "v-empty-state__text",
26248
+ "style": {
26249
+ maxWidth: convertToUnit(props.textWidth)
26250
+ }
26251
+ }, [slots.text?.() ?? props.text]), slots.default && vue.createVNode("div", {
26252
+ "key": "content",
26253
+ "class": "v-empty-state__content"
26254
+ }, [slots.default()]), hasActions && vue.createVNode("div", {
26255
+ "key": "actions",
26256
+ "class": "v-empty-state__actions"
26257
+ }, [vue.createVNode(VDefaultsProvider, {
26258
+ "defaults": {
26259
+ VBtn: {
26260
+ class: 'v-empty-state__action-btn',
26261
+ color: props.color,
26262
+ text: props.actionText
26263
+ }
26264
+ }
26265
+ }, {
26266
+ default: () => [slots.actions?.({
26267
+ props: {
26268
+ onClick: onClickAction
26269
+ }
26270
+ }) ?? vue.createVNode(VBtn, {
26271
+ "onClick": onClickAction
26272
+ }, null)]
26273
+ })])]);
26274
+ });
26275
+ return {};
26276
+ }
26277
+ });
26278
+
26279
+ const makeVFabProps = propsFactory({
26280
+ app: Boolean,
26281
+ appear: Boolean,
26282
+ extended: Boolean,
26283
+ location: {
26284
+ type: String,
26285
+ default: 'bottom end'
26286
+ },
26287
+ offset: Boolean,
26288
+ modelValue: {
26289
+ type: Boolean,
26290
+ default: true
26291
+ },
26292
+ ...omit(makeVBtnProps({
26293
+ active: true
26294
+ }), ['location']),
26295
+ ...makeLayoutItemProps(),
26296
+ ...makeTransitionProps({
26297
+ transition: 'fab-transition'
26298
+ })
26299
+ }, 'VFab');
26300
+ const VFab = genericComponent()({
26301
+ name: 'VFab',
26302
+ props: makeVFabProps(),
26303
+ emits: {
26304
+ 'update:modelValue': value => true
26305
+ },
26306
+ setup(props, _ref) {
26307
+ let {
26308
+ slots
26309
+ } = _ref;
26310
+ const model = useProxiedModel(props, 'modelValue');
26311
+ const height = vue.shallowRef(56);
26312
+ const layoutItemStyles = vue.ref();
26313
+ const {
26314
+ resizeRef
26315
+ } = useResizeObserver(entries => {
26316
+ if (!entries.length) return;
26317
+ height.value = entries[0].target.clientHeight;
25987
26318
  });
25988
26319
  const hasPosition = vue.computed(() => props.app || props.absolute);
25989
26320
  const position = vue.computed(() => {
@@ -26540,132 +26871,358 @@
26540
26871
 
26541
26872
  // Types
26542
26873
 
26874
+ const makeVTreeviewGroupProps = propsFactory({
26875
+ ...omit(makeVListGroupProps({
26876
+ collapseIcon: '$treeviewCollapse',
26877
+ expandIcon: '$treeviewExpand'
26878
+ }), ['subgroup'])
26879
+ }, 'VTreeviewGroup');
26880
+ const VTreeviewGroup = genericComponent()({
26881
+ name: 'VTreeviewGroup',
26882
+ props: makeVTreeviewGroupProps(),
26883
+ setup(props, _ref) {
26884
+ let {
26885
+ slots
26886
+ } = _ref;
26887
+ const vListGroupRef = vue.ref();
26888
+ const toggleIcon = vue.computed(() => vListGroupRef.value?.isOpen ? props.collapseIcon : props.expandIcon);
26889
+ const activatorDefaults = vue.computed(() => ({
26890
+ VTreeviewItem: {
26891
+ prependIcon: undefined,
26892
+ appendIcon: undefined,
26893
+ active: vListGroupRef.value?.isOpen,
26894
+ toggleIcon: toggleIcon.value
26895
+ }
26896
+ }));
26897
+ useRender(() => {
26898
+ const listGroupProps = VListGroup.filterProps(props);
26899
+ return vue.createVNode(VListGroup, vue.mergeProps(listGroupProps, {
26900
+ "ref": vListGroupRef,
26901
+ "class": ['v-treeview-group', props.class],
26902
+ "subgroup": true
26903
+ }), {
26904
+ ...slots,
26905
+ activator: slots.activator ? slotProps => vue.createVNode(vue.Fragment, null, [vue.createVNode(VDefaultsProvider, {
26906
+ "defaults": activatorDefaults.value
26907
+ }, {
26908
+ default: () => [slots.activator?.(slotProps)]
26909
+ })]) : undefined
26910
+ });
26911
+ });
26912
+ return {};
26913
+ }
26914
+ });
26915
+
26543
26916
  // Types
26544
26917
 
26545
- const makeVEmptyStateProps = propsFactory({
26546
- actionText: String,
26547
- bgColor: String,
26548
- color: String,
26549
- icon: IconValue,
26550
- image: String,
26551
- justify: {
26918
+ const VTreeviewSymbol = Symbol.for('vuetify:v-treeview');
26919
+
26920
+ const makeVTreeviewItemProps = propsFactory({
26921
+ loading: Boolean,
26922
+ toggleIcon: IconValue,
26923
+ ...makeVListItemProps({
26924
+ slim: true
26925
+ })
26926
+ }, 'VTreeviewItem');
26927
+ const VTreeviewItem = genericComponent()({
26928
+ name: 'VTreeviewItem',
26929
+ props: makeVTreeviewItemProps(),
26930
+ setup(props, _ref) {
26931
+ let {
26932
+ attrs,
26933
+ slots,
26934
+ emit
26935
+ } = _ref;
26936
+ const link = useLink(props, attrs);
26937
+ const id = vue.computed(() => props.value === undefined ? link.href.value : props.value);
26938
+ const vListItemRef = vue.ref();
26939
+ const isClickable = vue.computed(() => !props.disabled && props.link !== false && (props.link || link.isClickable.value || props.value != null && !!vListItemRef.value?.list));
26940
+ function onClick(e) {
26941
+ if (!vListItemRef.value?.isGroupActivator || !isClickable.value) return;
26942
+ props.value != null && vListItemRef.value?.select(!vListItemRef.value?.isSelected, e);
26943
+ }
26944
+ function onKeyDown(e) {
26945
+ if (e.key === 'Enter' || e.key === ' ') {
26946
+ e.preventDefault();
26947
+ onClick(e);
26948
+ }
26949
+ }
26950
+ const visibleIds = vue.inject(VTreeviewSymbol, {
26951
+ visibleIds: vue.ref()
26952
+ }).visibleIds;
26953
+ useRender(() => {
26954
+ const listItemProps = VListItem.filterProps(props);
26955
+ const hasPrepend = slots.prepend || props.toggleIcon;
26956
+ return vue.createVNode(VListItem, vue.mergeProps({
26957
+ "ref": vListItemRef
26958
+ }, listItemProps, {
26959
+ "class": ['v-treeview-item', {
26960
+ 'v-treeview-item--filtered': visibleIds.value && !visibleIds.value.has(id.value)
26961
+ }, props.class],
26962
+ "onClick": onClick,
26963
+ "onKeydown": isClickable.value && onKeyDown
26964
+ }), {
26965
+ ...slots,
26966
+ prepend: hasPrepend ? slotProps => {
26967
+ return vue.createVNode(vue.Fragment, null, [props.toggleIcon && vue.createVNode(VListItemAction, {
26968
+ "start": false
26969
+ }, {
26970
+ default: () => [vue.createVNode(VBtn, {
26971
+ "density": "compact",
26972
+ "icon": props.toggleIcon,
26973
+ "loading": props.loading,
26974
+ "variant": "text"
26975
+ }, {
26976
+ loader() {
26977
+ return vue.createVNode(VProgressCircular, {
26978
+ "indeterminate": "disable-shrink",
26979
+ "size": "20",
26980
+ "width": "2"
26981
+ }, null);
26982
+ }
26983
+ })]
26984
+ }), slots.prepend?.(slotProps)]);
26985
+ } : undefined
26986
+ });
26987
+ });
26988
+ return {};
26989
+ }
26990
+ });
26991
+
26992
+ // Types
26993
+
26994
+ const makeVTreeviewChildrenProps = propsFactory({
26995
+ loadChildren: Function,
26996
+ loadingIcon: {
26552
26997
  type: String,
26553
- default: 'center'
26998
+ default: '$loading'
26554
26999
  },
26555
- headline: String,
26556
- title: String,
26557
- text: String,
26558
- textWidth: {
26559
- type: [Number, String],
26560
- default: 500
26561
- },
26562
- href: String,
26563
- to: String,
26564
- ...makeComponentProps(),
26565
- ...makeDimensionProps(),
26566
- ...makeSizeProps({
26567
- size: undefined
27000
+ items: Array,
27001
+ selectable: Boolean
27002
+ }, 'VTreeviewChildren');
27003
+ const VTreeviewChildren = genericComponent()({
27004
+ name: 'VTreeviewChildren',
27005
+ props: makeVTreeviewChildrenProps(),
27006
+ setup(props, _ref) {
27007
+ let {
27008
+ emit,
27009
+ slots
27010
+ } = _ref;
27011
+ const isLoading = vue.shallowRef(false);
27012
+ const hasLoaded = vue.shallowRef(false);
27013
+ function checkChildren(item) {
27014
+ return new Promise(resolve => {
27015
+ if (!props.items?.length || !props.loadChildren || hasLoaded.value) return resolve();
27016
+ isLoading.value = true;
27017
+ props.loadChildren(item).then(resolve);
27018
+ }).then(() => {
27019
+ hasLoaded.value = true;
27020
+ }).finally(() => {
27021
+ isLoading.value = false;
27022
+ });
27023
+ }
27024
+ function onClick(e, item) {
27025
+ e.stopPropagation();
27026
+ checkChildren(item);
27027
+ }
27028
+ return () => slots.default?.() ?? props.items?.map(_ref2 => {
27029
+ let {
27030
+ children,
27031
+ props: itemProps,
27032
+ raw: item
27033
+ } = _ref2;
27034
+ const slotsWithItem = {
27035
+ prepend: slots.prepend ? slotProps => slots.prepend?.({
27036
+ ...slotProps,
27037
+ item
27038
+ }) : props.selectable ? _ref3 => {
27039
+ let {
27040
+ isSelected,
27041
+ isIndeterminate
27042
+ } = _ref3;
27043
+ return vue.createVNode(VCheckboxBtn, {
27044
+ "key": item.value,
27045
+ "tabindex": "-1",
27046
+ "modelValue": isSelected,
27047
+ "loading": isLoading.value,
27048
+ "indeterminate": isIndeterminate,
27049
+ "onClick": e => onClick(e, item)
27050
+ }, null);
27051
+ } : undefined,
27052
+ append: slots.append ? slotProps => slots.append?.({
27053
+ ...slotProps,
27054
+ item
27055
+ }) : undefined,
27056
+ title: slots.title ? slotProps => slots.title?.({
27057
+ ...slotProps,
27058
+ item
27059
+ }) : undefined
27060
+ };
27061
+ const treeviewGroupProps = VTreeviewGroup.filterProps(itemProps);
27062
+ const treeviewChildrenProps = VTreeviewChildren.filterProps(props);
27063
+ return children ? vue.createVNode(VTreeviewGroup, vue.mergeProps({
27064
+ "value": itemProps?.value
27065
+ }, treeviewGroupProps), {
27066
+ activator: _ref4 => {
27067
+ let {
27068
+ props: activatorProps
27069
+ } = _ref4;
27070
+ return vue.createVNode(VTreeviewItem, vue.mergeProps(itemProps, activatorProps, {
27071
+ "loading": isLoading.value,
27072
+ "onClick": e => onClick(e, item)
27073
+ }), slotsWithItem);
27074
+ },
27075
+ default: () => vue.createVNode(VTreeviewChildren, vue.mergeProps(treeviewChildrenProps, {
27076
+ "items": children
27077
+ }), slots)
27078
+ }) : slots.item?.({
27079
+ props: itemProps
27080
+ }) ?? vue.createVNode(VTreeviewItem, itemProps, slotsWithItem);
27081
+ });
27082
+ }
27083
+ });
27084
+
27085
+ function flatten(items) {
27086
+ let flat = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
27087
+ for (const item of items) {
27088
+ flat.push(item);
27089
+ if (item.children) flatten(item.children, flat);
27090
+ }
27091
+ return flat;
27092
+ }
27093
+ const makeVTreeviewProps = propsFactory({
27094
+ openAll: Boolean,
27095
+ search: String,
27096
+ ...makeFilterProps({
27097
+ filterKeys: ['title']
26568
27098
  }),
26569
- ...makeThemeProps()
26570
- }, 'VEmptyState');
26571
- const VEmptyState = genericComponent()({
26572
- name: 'VEmptyState',
26573
- props: makeVEmptyStateProps(),
27099
+ ...makeVTreeviewChildrenProps(),
27100
+ ...omit(makeVListProps({
27101
+ collapseIcon: '$treeviewCollapse',
27102
+ expandIcon: '$treeviewExpand',
27103
+ selectStrategy: 'independent',
27104
+ openStrategy: 'multiple',
27105
+ slim: true
27106
+ }), ['nav'])
27107
+ }, 'VTreeview');
27108
+ const VTreeview = genericComponent()({
27109
+ name: 'VTreeview',
27110
+ props: makeVTreeviewProps(),
26574
27111
  emits: {
26575
- 'click:action': e => true
27112
+ 'update:opened': val => true,
27113
+ 'update:activated': val => true,
27114
+ 'update:selected': val => true,
27115
+ 'click:open': value => true,
27116
+ 'click:select': value => true
26576
27117
  },
26577
27118
  setup(props, _ref) {
26578
27119
  let {
26579
- emit,
26580
27120
  slots
26581
27121
  } = _ref;
26582
27122
  const {
26583
- themeClasses
26584
- } = provideTheme(props);
26585
- const {
26586
- backgroundColorClasses,
26587
- backgroundColorStyles
26588
- } = useBackgroundColor(vue.toRef(props, 'bgColor'));
27123
+ items
27124
+ } = useListItems(props);
27125
+ const activeColor = vue.toRef(props, 'activeColor');
27126
+ const baseColor = vue.toRef(props, 'baseColor');
27127
+ const color = vue.toRef(props, 'color');
27128
+ const opened = useProxiedModel(props, 'opened');
27129
+ const activated = useProxiedModel(props, 'activated');
27130
+ const selected = useProxiedModel(props, 'selected');
27131
+ const vListRef = vue.ref();
27132
+ const flatItems = vue.computed(() => flatten(items.value));
27133
+ const search = vue.toRef(props, 'search');
26589
27134
  const {
26590
- dimensionStyles
26591
- } = useDimension(props);
26592
- function onClickAction(e) {
26593
- emit('click:action', e);
27135
+ filteredItems
27136
+ } = useFilter(props, flatItems, search);
27137
+ const visibleIds = vue.computed(() => {
27138
+ if (!search.value) {
27139
+ return null;
27140
+ }
27141
+ return new Set(filteredItems.value.flatMap(item => {
27142
+ return [...getPath(item.props.value), ...getChildren(item.props.value)];
27143
+ }));
27144
+ });
27145
+ function getPath(id) {
27146
+ const path = [];
27147
+ let parent = id;
27148
+ while (parent != null) {
27149
+ path.unshift(parent);
27150
+ parent = vListRef.value?.parents.get(parent);
27151
+ }
27152
+ return path;
26594
27153
  }
26595
- useRender(() => {
26596
- const hasActions = !!(slots.actions || props.actionText);
26597
- const hasHeadline = !!(slots.headline || props.headline);
26598
- const hasTitle = !!(slots.title || props.title);
26599
- const hasText = !!(slots.text || props.text);
26600
- const hasMedia = !!(slots.media || props.image || props.icon);
26601
- const size = props.size || (props.image ? 200 : 96);
26602
- return vue.createVNode("div", {
26603
- "class": ['v-empty-state', {
26604
- [`v-empty-state--${props.justify}`]: true
26605
- }, themeClasses.value, backgroundColorClasses.value, props.class],
26606
- "style": [backgroundColorStyles.value, dimensionStyles.value, props.style]
26607
- }, [hasMedia && vue.createVNode("div", {
26608
- "key": "media",
26609
- "class": "v-empty-state__media"
26610
- }, [!slots.media ? vue.createVNode(vue.Fragment, null, [props.image ? vue.createVNode(VImg, {
26611
- "key": "image",
26612
- "src": props.image,
26613
- "height": size
26614
- }, null) : props.icon ? vue.createVNode(VIcon, {
26615
- "key": "icon",
26616
- "size": size,
26617
- "icon": props.icon
26618
- }, null) : undefined]) : vue.createVNode(VDefaultsProvider, {
26619
- "key": "media-defaults",
26620
- "defaults": {
26621
- VImg: {
26622
- src: props.image,
26623
- height: size
26624
- },
26625
- VIcon: {
26626
- size,
26627
- icon: props.icon
26628
- }
26629
- }
26630
- }, {
26631
- default: () => [slots.media()]
26632
- })]), hasHeadline && vue.createVNode("div", {
26633
- "key": "headline",
26634
- "class": "v-empty-state__headline"
26635
- }, [slots.headline?.() ?? props.headline]), hasTitle && vue.createVNode("div", {
26636
- "key": "title",
26637
- "class": "v-empty-state__title"
26638
- }, [slots.title?.() ?? props.title]), hasText && vue.createVNode("div", {
26639
- "key": "text",
26640
- "class": "v-empty-state__text",
26641
- "style": {
26642
- maxWidth: convertToUnit(props.textWidth)
26643
- }
26644
- }, [slots.text?.() ?? props.text]), slots.default && vue.createVNode("div", {
26645
- "key": "content",
26646
- "class": "v-empty-state__content"
26647
- }, [slots.default()]), hasActions && vue.createVNode("div", {
26648
- "key": "actions",
26649
- "class": "v-empty-state__actions"
26650
- }, [vue.createVNode(VDefaultsProvider, {
26651
- "defaults": {
26652
- VBtn: {
26653
- class: 'v-empty-state__action-btn',
26654
- color: props.color,
26655
- text: props.actionText
26656
- }
27154
+ function getChildren(id) {
27155
+ const arr = [];
27156
+ const queue = (vListRef.value?.children.get(id) ?? []).slice();
27157
+ while (queue.length) {
27158
+ const child = queue.shift();
27159
+ if (!child) continue;
27160
+ arr.push(child);
27161
+ queue.push(...(vListRef.value?.children.get(child) ?? []).slice());
27162
+ }
27163
+ return arr;
27164
+ }
27165
+ vue.watch(() => props.openAll, val => {
27166
+ opened.value = val ? openAll(items.value) : [];
27167
+ }, {
27168
+ immediate: true
27169
+ });
27170
+ function openAll(item) {
27171
+ let ids = [];
27172
+ for (const i of item) {
27173
+ if (!i.children) continue;
27174
+ ids.push(i.value);
27175
+ if (i.children) {
27176
+ ids = ids.concat(openAll(i.children));
26657
27177
  }
26658
- }, {
26659
- default: () => [slots.actions?.({
26660
- props: {
26661
- onClick: onClickAction
26662
- }
26663
- }) ?? vue.createVNode(VBtn, {
26664
- "onClick": onClickAction
26665
- }, null)]
26666
- })])]);
27178
+ }
27179
+ return ids;
27180
+ }
27181
+ vue.provide(VTreeviewSymbol, {
27182
+ visibleIds
26667
27183
  });
26668
- return {};
27184
+ provideDefaults({
27185
+ VTreeviewGroup: {
27186
+ activeColor,
27187
+ baseColor,
27188
+ color,
27189
+ collapseIcon: vue.toRef(props, 'collapseIcon'),
27190
+ expandIcon: vue.toRef(props, 'expandIcon')
27191
+ },
27192
+ VTreeviewItem: {
27193
+ activeClass: vue.toRef(props, 'activeClass'),
27194
+ activeColor,
27195
+ baseColor,
27196
+ color,
27197
+ density: vue.toRef(props, 'density'),
27198
+ disabled: vue.toRef(props, 'disabled'),
27199
+ lines: vue.toRef(props, 'lines'),
27200
+ variant: vue.toRef(props, 'variant')
27201
+ }
27202
+ });
27203
+ useRender(() => {
27204
+ const listProps = VList.filterProps(props);
27205
+ const treeviewChildrenProps = VTreeviewChildren.filterProps(props);
27206
+ return vue.createVNode(VList, vue.mergeProps({
27207
+ "ref": vListRef
27208
+ }, listProps, {
27209
+ "class": ['v-treeview', props.class],
27210
+ "style": props.style,
27211
+ "opened": opened.value,
27212
+ "onUpdate:opened": $event => opened.value = $event,
27213
+ "activated": activated.value,
27214
+ "onUpdate:activated": $event => activated.value = $event,
27215
+ "selected": selected.value,
27216
+ "onUpdate:selected": $event => selected.value = $event
27217
+ }), {
27218
+ default: () => [vue.createVNode(VTreeviewChildren, vue.mergeProps(treeviewChildrenProps, {
27219
+ "items": items.value
27220
+ }), slots)]
27221
+ });
27222
+ });
27223
+ return {
27224
+ open
27225
+ };
26669
27226
  }
26670
27227
  });
26671
27228
 
@@ -26837,6 +27394,9 @@
26837
27394
  VToolbarItems: VToolbarItems,
26838
27395
  VToolbarTitle: VToolbarTitle,
26839
27396
  VTooltip: VTooltip,
27397
+ VTreeview: VTreeview,
27398
+ VTreeviewGroup: VTreeviewGroup,
27399
+ VTreeviewItem: VTreeviewItem,
26840
27400
  VValidation: VValidation,
26841
27401
  VVirtualScroll: VVirtualScroll,
26842
27402
  VWindow: VWindow,
@@ -27063,7 +27623,7 @@
27063
27623
  goTo
27064
27624
  };
27065
27625
  }
27066
- const version$1 = "3.5.8";
27626
+ const version$1 = "3.5.9";
27067
27627
  createVuetify$1.version = version$1;
27068
27628
 
27069
27629
  // Vue's inject() can only be used in setup
@@ -27077,7 +27637,7 @@
27077
27637
 
27078
27638
  /* eslint-disable local-rules/sort-imports */
27079
27639
 
27080
- const version = "3.5.8";
27640
+ const version = "3.5.9";
27081
27641
 
27082
27642
  /* eslint-disable local-rules/sort-imports */
27083
27643