vuetify 3.5.8 → 3.5.10

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 (189) hide show
  1. package/dist/_component-variables-labs.sass +1 -0
  2. package/dist/json/attributes.json +525 -13
  3. package/dist/json/importMap-labs.json +24 -8
  4. package/dist/json/importMap.json +130 -130
  5. package/dist/json/tags.json +148 -0
  6. package/dist/json/web-types.json +2021 -147
  7. package/dist/vuetify-labs.css +2819 -2760
  8. package/dist/vuetify-labs.d.ts +5860 -2816
  9. package/dist/vuetify-labs.esm.js +1286 -248
  10. package/dist/vuetify-labs.esm.js.map +1 -1
  11. package/dist/vuetify-labs.js +1286 -247
  12. package/dist/vuetify-labs.min.css +2 -2
  13. package/dist/vuetify.css +553 -547
  14. package/dist/vuetify.d.ts +2835 -2281
  15. package/dist/vuetify.esm.js +883 -408
  16. package/dist/vuetify.esm.js.map +1 -1
  17. package/dist/vuetify.js +882 -406
  18. package/dist/vuetify.js.map +1 -1
  19. package/dist/vuetify.min.css +2 -2
  20. package/dist/vuetify.min.js +1137 -1109
  21. package/dist/vuetify.min.js.map +1 -1
  22. package/lib/components/VAlert/index.d.mts +15 -15
  23. package/lib/components/VApp/index.d.mts +8 -8
  24. package/lib/components/VAppBar/index.d.mts +7 -7
  25. package/lib/components/VAutocomplete/VAutocomplete.mjs +9 -7
  26. package/lib/components/VAutocomplete/VAutocomplete.mjs.map +1 -1
  27. package/lib/components/VAutocomplete/index.d.mts +232 -100
  28. package/lib/components/VAvatar/index.d.mts +8 -8
  29. package/lib/components/VBadge/index.d.mts +7 -7
  30. package/lib/components/VBanner/index.d.mts +20 -20
  31. package/lib/components/VBreadcrumbs/VBreadcrumbs.mjs.map +1 -1
  32. package/lib/components/VBreadcrumbs/index.d.mts +27 -26
  33. package/lib/components/VBtnGroup/index.d.mts +8 -8
  34. package/lib/components/VCard/index.d.mts +32 -32
  35. package/lib/components/VCarousel/index.d.mts +6 -6
  36. package/lib/components/VCheckbox/index.d.mts +44 -44
  37. package/lib/components/VChip/index.d.mts +7 -7
  38. package/lib/components/VCode/index.d.mts +8 -8
  39. package/lib/components/VColorPicker/VColorPickerPreview.css +1 -0
  40. package/lib/components/VColorPicker/VColorPickerPreview.sass +1 -0
  41. package/lib/components/VColorPicker/_variables.scss +1 -0
  42. package/lib/components/VCombobox/VCombobox.mjs +10 -7
  43. package/lib/components/VCombobox/VCombobox.mjs.map +1 -1
  44. package/lib/components/VCombobox/index.d.mts +232 -100
  45. package/lib/components/VDataTable/index.d.mts +6 -6
  46. package/lib/components/VDatePicker/VDatePickerControls.mjs +1 -0
  47. package/lib/components/VDatePicker/VDatePickerControls.mjs.map +1 -1
  48. package/lib/components/VDatePicker/VDatePickerMonth.mjs +10 -4
  49. package/lib/components/VDatePicker/VDatePickerMonth.mjs.map +1 -1
  50. package/lib/components/VDatePicker/index.d.mts +10 -10
  51. package/lib/components/VDefaultsProvider/index.d.mts +8 -8
  52. package/lib/components/VDialog/index.d.mts +12 -6
  53. package/lib/components/VDivider/index.d.mts +8 -8
  54. package/lib/components/VExpansionPanel/index.d.mts +19 -19
  55. package/lib/components/VField/VField.css +2 -0
  56. package/lib/components/VField/VField.mjs +1 -1
  57. package/lib/components/VField/VField.mjs.map +1 -1
  58. package/lib/components/VField/VField.sass +2 -0
  59. package/lib/components/VField/index.d.mts +28 -28
  60. package/lib/components/VFileInput/index.d.mts +133 -133
  61. package/lib/components/VFooter/index.d.mts +8 -8
  62. package/lib/components/VGrid/index.d.mts +32 -32
  63. package/lib/components/VIcon/VIcon.css +4 -0
  64. package/lib/components/VIcon/VIcon.mjs +7 -3
  65. package/lib/components/VIcon/VIcon.mjs.map +1 -1
  66. package/lib/components/VIcon/VIcon.sass +4 -0
  67. package/lib/components/VIcon/_variables.scss +1 -0
  68. package/lib/components/VIcon/index.d.mts +25 -16
  69. package/lib/components/VImg/index.d.mts +4 -4
  70. package/lib/components/VInput/index.d.mts +21 -21
  71. package/lib/components/VKbd/index.d.mts +8 -8
  72. package/lib/components/VLabel/index.d.mts +8 -8
  73. package/lib/components/VLayout/index.d.mts +16 -16
  74. package/lib/components/VLazy/index.d.mts +8 -8
  75. package/lib/components/VList/VList.mjs +8 -2
  76. package/lib/components/VList/VList.mjs.map +1 -1
  77. package/lib/components/VList/VListGroup.mjs +3 -1
  78. package/lib/components/VList/VListGroup.mjs.map +1 -1
  79. package/lib/components/VList/VListItem.mjs +17 -4
  80. package/lib/components/VList/VListItem.mjs.map +1 -1
  81. package/lib/components/VList/index.d.mts +156 -54
  82. package/lib/components/VLocaleProvider/index.d.mts +12 -12
  83. package/lib/components/VMain/index.d.mts +8 -8
  84. package/lib/components/VMenu/VMenu.mjs +3 -0
  85. package/lib/components/VMenu/VMenu.mjs.map +1 -1
  86. package/lib/components/VMenu/index.d.mts +14 -8
  87. package/lib/components/VNavigationDrawer/VNavigationDrawer.css +1 -1
  88. package/lib/components/VNavigationDrawer/VNavigationDrawer.mjs +22 -8
  89. package/lib/components/VNavigationDrawer/VNavigationDrawer.mjs.map +1 -1
  90. package/lib/components/VNavigationDrawer/VNavigationDrawer.sass +2 -1
  91. package/lib/components/VNavigationDrawer/index.d.mts +11 -11
  92. package/lib/components/VOtpInput/VOtpInput.mjs +7 -2
  93. package/lib/components/VOtpInput/VOtpInput.mjs.map +1 -1
  94. package/lib/components/VOtpInput/index.d.mts +31 -31
  95. package/lib/components/VOverlay/VOverlay.mjs +8 -3
  96. package/lib/components/VOverlay/VOverlay.mjs.map +1 -1
  97. package/lib/components/VOverlay/index.d.mts +3 -0
  98. package/lib/components/VOverlay/scrollStrategies.mjs +2 -2
  99. package/lib/components/VOverlay/scrollStrategies.mjs.map +1 -1
  100. package/lib/components/VPagination/index.d.mts +7 -7
  101. package/lib/components/VProgressLinear/VProgressLinear.css +0 -1
  102. package/lib/components/VProgressLinear/VProgressLinear.sass +0 -1
  103. package/lib/components/VProgressLinear/index.d.mts +7 -7
  104. package/lib/components/VRadioGroup/index.d.mts +44 -44
  105. package/lib/components/VRangeSlider/index.d.mts +47 -47
  106. package/lib/components/VRating/index.d.mts +7 -7
  107. package/lib/components/VResponsive/index.d.mts +8 -8
  108. package/lib/components/VSelect/VSelect.mjs +5 -3
  109. package/lib/components/VSelect/VSelect.mjs.map +1 -1
  110. package/lib/components/VSelect/index.d.mts +232 -100
  111. package/lib/components/VSheet/index.d.mts +8 -8
  112. package/lib/components/VSkeletonLoader/index.d.mts +8 -8
  113. package/lib/components/VSlider/index.d.mts +47 -47
  114. package/lib/components/VSnackbar/index.d.mts +25 -19
  115. package/lib/components/VStepper/index.d.mts +41 -41
  116. package/lib/components/VSwitch/index.d.mts +39 -39
  117. package/lib/components/VSystemBar/index.d.mts +8 -8
  118. package/lib/components/VTabs/index.d.mts +15 -15
  119. package/lib/components/VTextField/index.d.mts +173 -173
  120. package/lib/components/VTextarea/index.d.mts +119 -119
  121. package/lib/components/VThemeProvider/index.d.mts +8 -8
  122. package/lib/components/VTimeline/index.d.mts +8 -8
  123. package/lib/components/VToolbar/index.d.mts +8 -8
  124. package/lib/components/VTooltip/index.d.mts +14 -8
  125. package/lib/components/VWindow/index.d.mts +10 -10
  126. package/lib/components/index.d.mts +2478 -1943
  127. package/lib/components/transitions/index.d.mts +128 -128
  128. package/lib/composables/date/adapters/vuetify.mjs +1 -1
  129. package/lib/composables/date/adapters/vuetify.mjs.map +1 -1
  130. package/lib/composables/nested/activeStrategies.mjs +121 -0
  131. package/lib/composables/nested/activeStrategies.mjs.map +1 -0
  132. package/lib/composables/nested/nested.mjs +50 -1
  133. package/lib/composables/nested/nested.mjs.map +1 -1
  134. package/lib/composables/nested/selectStrategies.mjs +4 -2
  135. package/lib/composables/nested/selectStrategies.mjs.map +1 -1
  136. package/lib/composables/theme.mjs +1 -1
  137. package/lib/composables/theme.mjs.map +1 -1
  138. package/lib/entry-bundler.mjs +3 -2
  139. package/lib/entry-bundler.mjs.map +1 -1
  140. package/lib/framework.mjs +1 -1
  141. package/lib/framework.mjs.map +1 -1
  142. package/lib/iconsets/fa.mjs +2 -0
  143. package/lib/iconsets/fa.mjs.map +1 -1
  144. package/lib/iconsets/fa4.mjs +2 -0
  145. package/lib/iconsets/fa4.mjs.map +1 -1
  146. package/lib/iconsets/md.mjs +2 -0
  147. package/lib/iconsets/md.mjs.map +1 -1
  148. package/lib/iconsets/mdi-svg.mjs +2 -0
  149. package/lib/iconsets/mdi-svg.mjs.map +1 -1
  150. package/lib/iconsets/mdi.mjs +2 -0
  151. package/lib/iconsets/mdi.mjs.map +1 -1
  152. package/lib/index.d.mts +48 -44
  153. package/lib/labs/VCalendar/index.d.mts +32 -32
  154. package/lib/labs/VFab/index.d.mts +15 -15
  155. package/lib/labs/VNumberInput/VNumberInput.css +38 -0
  156. package/lib/labs/VNumberInput/VNumberInput.mjs +209 -0
  157. package/lib/labs/VNumberInput/VNumberInput.mjs.map +1 -0
  158. package/lib/labs/VNumberInput/VNumberInput.sass +47 -0
  159. package/lib/labs/VNumberInput/_variables.scss +1 -0
  160. package/lib/labs/VNumberInput/index.d.mts +607 -0
  161. package/lib/labs/VNumberInput/index.mjs +2 -0
  162. package/lib/labs/VNumberInput/index.mjs.map +1 -0
  163. package/lib/labs/VPicker/index.d.mts +8 -8
  164. package/lib/labs/VSparkline/index.d.mts +7 -7
  165. package/lib/labs/VSpeedDial/VSpeedDial.mjs +9 -5
  166. package/lib/labs/VSpeedDial/VSpeedDial.mjs.map +1 -1
  167. package/lib/labs/VSpeedDial/index.d.mts +120 -24
  168. package/lib/labs/VTreeview/VTreeview.mjs +154 -0
  169. package/lib/labs/VTreeview/VTreeview.mjs.map +1 -0
  170. package/lib/labs/VTreeview/VTreeviewChildren.mjs +98 -0
  171. package/lib/labs/VTreeview/VTreeviewChildren.mjs.map +1 -0
  172. package/lib/labs/VTreeview/VTreeviewGroup.mjs +48 -0
  173. package/lib/labs/VTreeview/VTreeviewGroup.mjs.map +1 -0
  174. package/lib/labs/VTreeview/VTreeviewItem.css +17 -0
  175. package/lib/labs/VTreeview/VTreeviewItem.mjs +86 -0
  176. package/lib/labs/VTreeview/VTreeviewItem.mjs.map +1 -0
  177. package/lib/labs/VTreeview/VTreeviewItem.sass +19 -0
  178. package/lib/labs/VTreeview/index.d.mts +1975 -0
  179. package/lib/labs/VTreeview/index.mjs +4 -0
  180. package/lib/labs/VTreeview/index.mjs.map +1 -0
  181. package/lib/labs/VTreeview/shared.mjs +4 -0
  182. package/lib/labs/VTreeview/shared.mjs.map +1 -0
  183. package/lib/labs/VTreeview/variables.scss +8 -0
  184. package/lib/labs/components.d.mts +4553 -1925
  185. package/lib/labs/components.mjs +4 -2
  186. package/lib/labs/components.mjs.map +1 -1
  187. package/lib/locale/no.mjs +1 -1
  188. package/lib/locale/no.mjs.map +1 -1
  189. package/package.json +2 -2
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.5.8
2
+ * Vuetify v3.5.10
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -2392,7 +2392,7 @@
2392
2392
  const current = vue.computed(() => computedThemes.value[name.value]);
2393
2393
  const styles = vue.computed(() => {
2394
2394
  const lines = [];
2395
- if (current.value.dark) {
2395
+ if (current.value?.dark) {
2396
2396
  createCssClass(lines, ':root', ['color-scheme: dark']);
2397
2397
  }
2398
2398
  createCssClass(lines, ':root', genCssVariables(current.value));
@@ -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 = {
@@ -4570,6 +4572,7 @@
4570
4572
 
4571
4573
  const makeVIconProps = propsFactory({
4572
4574
  color: String,
4575
+ disabled: Boolean,
4573
4576
  start: Boolean,
4574
4577
  end: Boolean,
4575
4578
  icon: IconValue,
@@ -4607,11 +4610,13 @@
4607
4610
  if (slotValue) {
4608
4611
  slotIcon.value = flattenFragments(slotValue).filter(node => node.type === vue.Text && node.children && typeof node.children === 'string')[0]?.children;
4609
4612
  }
4613
+ const hasClick = !!(attrs.onClick || attrs.onClickOnce);
4610
4614
  return vue.createVNode(iconData.value.component, {
4611
4615
  "tag": props.tag,
4612
4616
  "icon": iconData.value.icon,
4613
4617
  "class": ['v-icon', 'notranslate', themeClasses.value, sizeClasses.value, textColorClasses.value, {
4614
- 'v-icon--clickable': !!attrs.onClick,
4618
+ 'v-icon--clickable': hasClick,
4619
+ 'v-icon--disabled': props.disabled,
4615
4620
  'v-icon--start': props.start,
4616
4621
  'v-icon--end': props.end
4617
4622
  }, props.class],
@@ -4620,8 +4625,9 @@
4620
4625
  height: convertToUnit(props.size),
4621
4626
  width: convertToUnit(props.size)
4622
4627
  } : undefined, textColorStyles.value, props.style],
4623
- "role": attrs.onClick ? 'button' : undefined,
4624
- "aria-hidden": !attrs.onClick
4628
+ "role": hasClick ? 'button' : undefined,
4629
+ "aria-hidden": !hasClick,
4630
+ "tabindex": hasClick ? props.disabled ? -1 : 0 : undefined
4625
4631
  }, {
4626
4632
  default: () => [slotValue]
4627
4633
  });
@@ -7762,6 +7768,126 @@
7762
7768
  return vue.inject(ListKey, null);
7763
7769
  }
7764
7770
 
7771
+ /* eslint-disable sonarjs/no-identical-functions */
7772
+ // Utilities
7773
+ const independentActiveStrategy = mandatory => {
7774
+ const strategy = {
7775
+ activate: _ref => {
7776
+ let {
7777
+ id,
7778
+ value,
7779
+ activated
7780
+ } = _ref;
7781
+ id = vue.toRaw(id);
7782
+
7783
+ // When mandatory and we're trying to deselect when id
7784
+ // is the only currently selected item then do nothing
7785
+ if (mandatory && !value && activated.size === 1 && activated.has(id)) return activated;
7786
+ if (value) {
7787
+ activated.add(id);
7788
+ } else {
7789
+ activated.delete(id);
7790
+ }
7791
+ return activated;
7792
+ },
7793
+ in: (v, children, parents) => {
7794
+ let set = new Set();
7795
+ for (const id of v || []) {
7796
+ set = strategy.activate({
7797
+ id,
7798
+ value: true,
7799
+ activated: new Set(set),
7800
+ children,
7801
+ parents
7802
+ });
7803
+ }
7804
+ return set;
7805
+ },
7806
+ out: v => {
7807
+ return Array.from(v);
7808
+ }
7809
+ };
7810
+ return strategy;
7811
+ };
7812
+ const independentSingleActiveStrategy = mandatory => {
7813
+ const parentStrategy = independentActiveStrategy(mandatory);
7814
+ const strategy = {
7815
+ activate: _ref2 => {
7816
+ let {
7817
+ activated,
7818
+ id,
7819
+ ...rest
7820
+ } = _ref2;
7821
+ id = vue.toRaw(id);
7822
+ const singleSelected = activated.has(id) ? new Set([id]) : new Set();
7823
+ return parentStrategy.activate({
7824
+ ...rest,
7825
+ id,
7826
+ activated: singleSelected
7827
+ });
7828
+ },
7829
+ in: (v, children, parents) => {
7830
+ let set = new Set();
7831
+ if (v?.length) {
7832
+ set = parentStrategy.in(v.slice(0, 1), children, parents);
7833
+ }
7834
+ return set;
7835
+ },
7836
+ out: (v, children, parents) => {
7837
+ return parentStrategy.out(v, children, parents);
7838
+ }
7839
+ };
7840
+ return strategy;
7841
+ };
7842
+ const leafActiveStrategy = mandatory => {
7843
+ const parentStrategy = independentActiveStrategy(mandatory);
7844
+ const strategy = {
7845
+ activate: _ref3 => {
7846
+ let {
7847
+ id,
7848
+ activated,
7849
+ children,
7850
+ ...rest
7851
+ } = _ref3;
7852
+ id = vue.toRaw(id);
7853
+ if (children.has(id)) return activated;
7854
+ return parentStrategy.activate({
7855
+ id,
7856
+ activated,
7857
+ children,
7858
+ ...rest
7859
+ });
7860
+ },
7861
+ in: parentStrategy.in,
7862
+ out: parentStrategy.out
7863
+ };
7864
+ return strategy;
7865
+ };
7866
+ const leafSingleActiveStrategy = mandatory => {
7867
+ const parentStrategy = independentSingleActiveStrategy(mandatory);
7868
+ const strategy = {
7869
+ activate: _ref4 => {
7870
+ let {
7871
+ id,
7872
+ activated,
7873
+ children,
7874
+ ...rest
7875
+ } = _ref4;
7876
+ id = vue.toRaw(id);
7877
+ if (children.has(id)) return activated;
7878
+ return parentStrategy.activate({
7879
+ id,
7880
+ activated,
7881
+ children,
7882
+ ...rest
7883
+ });
7884
+ },
7885
+ in: parentStrategy.in,
7886
+ out: parentStrategy.out
7887
+ };
7888
+ return strategy;
7889
+ };
7890
+
7765
7891
  const singleOpenStrategy = {
7766
7892
  open: _ref => {
7767
7893
  let {
@@ -7846,7 +7972,8 @@
7846
7972
  if (mandatory && !value) {
7847
7973
  const on = Array.from(selected.entries()).reduce((arr, _ref2) => {
7848
7974
  let [key, value] = _ref2;
7849
- return value === 'on' ? [...arr, key] : arr;
7975
+ if (value === 'on') arr.push(key);
7976
+ return arr;
7850
7977
  }, []);
7851
7978
  if (on.length === 1 && on[0] === id) return selected;
7852
7979
  }
@@ -7988,7 +8115,8 @@
7988
8115
  if (mandatory && !value) {
7989
8116
  const on = Array.from(selected.entries()).reduce((arr, _ref7) => {
7990
8117
  let [key, value] = _ref7;
7991
- return value === 'on' ? [...arr, key] : arr;
8118
+ if (value === 'on') arr.push(key);
8119
+ return arr;
7992
8120
  }, []);
7993
8121
  if (on.length === 0) return original;
7994
8122
  }
@@ -8032,16 +8160,24 @@
8032
8160
  children: vue.ref(new Map()),
8033
8161
  open: () => null,
8034
8162
  openOnSelect: () => null,
8163
+ activate: () => null,
8035
8164
  select: () => null,
8165
+ activatable: vue.ref(false),
8166
+ selectable: vue.ref(false),
8036
8167
  opened: vue.ref(new Set()),
8168
+ activated: vue.ref(new Set()),
8037
8169
  selected: vue.ref(new Map()),
8038
8170
  selectedValues: vue.ref([])
8039
8171
  }
8040
8172
  };
8041
8173
  const makeNestedProps = propsFactory({
8174
+ activatable: Boolean,
8175
+ selectable: Boolean,
8176
+ activeStrategy: [String, Function],
8042
8177
  selectStrategy: [String, Function],
8043
8178
  openStrategy: [String, Object],
8044
8179
  opened: Array,
8180
+ activated: Array,
8045
8181
  selected: Array,
8046
8182
  mandatory: Boolean
8047
8183
  }, 'nested');
@@ -8050,6 +8186,20 @@
8050
8186
  const children = vue.ref(new Map());
8051
8187
  const parents = vue.ref(new Map());
8052
8188
  const opened = useProxiedModel(props, 'opened', props.opened, v => new Set(v), v => [...v.values()]);
8189
+ const activeStrategy = vue.computed(() => {
8190
+ if (typeof props.activeStrategy === 'object') return props.activeStrategy;
8191
+ switch (props.activeStrategy) {
8192
+ case 'leaf':
8193
+ return leafActiveStrategy(props.mandatory);
8194
+ case 'single-leaf':
8195
+ return leafSingleActiveStrategy(props.mandatory);
8196
+ case 'independent':
8197
+ return independentActiveStrategy(props.mandatory);
8198
+ case 'single-independent':
8199
+ default:
8200
+ return independentSingleActiveStrategy(props.mandatory);
8201
+ }
8202
+ });
8053
8203
  const selectStrategy = vue.computed(() => {
8054
8204
  if (typeof props.selectStrategy === 'object') return props.selectStrategy;
8055
8205
  switch (props.selectStrategy) {
@@ -8078,6 +8228,7 @@
8078
8228
  return multipleOpenStrategy;
8079
8229
  }
8080
8230
  });
8231
+ 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
8232
  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
8233
  vue.onBeforeUnmount(() => {
8083
8234
  isUnmounted = true;
@@ -8096,6 +8247,9 @@
8096
8247
  id: vue.shallowRef(),
8097
8248
  root: {
8098
8249
  opened,
8250
+ activatable: vue.toRef(props, 'activatable'),
8251
+ selectable: vue.toRef(props, 'selectable'),
8252
+ activated,
8099
8253
  selected,
8100
8254
  selectedValues: vue.computed(() => {
8101
8255
  const arr = [];
@@ -8169,6 +8323,26 @@
8169
8323
  newSelected && (selected.value = newSelected);
8170
8324
  nested.root.openOnSelect(id, value, event);
8171
8325
  },
8326
+ activate: (id, value, event) => {
8327
+ if (!props.activatable) {
8328
+ return nested.root.select(id, true, event);
8329
+ }
8330
+ vm.emit('click:activate', {
8331
+ id,
8332
+ value,
8333
+ path: getPath(id),
8334
+ event
8335
+ });
8336
+ const newActivated = activeStrategy.value.activate({
8337
+ id,
8338
+ value,
8339
+ activated: new Set(activated.value),
8340
+ children: children.value,
8341
+ parents: parents.value,
8342
+ event
8343
+ });
8344
+ newActivated && (activated.value = newActivated);
8345
+ },
8172
8346
  children,
8173
8347
  parents
8174
8348
  }
@@ -8187,6 +8361,8 @@
8187
8361
  openOnSelect: (open, e) => parent.root.openOnSelect(computedId.value, open, e),
8188
8362
  isOpen: vue.computed(() => parent.root.opened.value.has(computedId.value)),
8189
8363
  parent: vue.computed(() => parent.root.parents.value.get(computedId.value)),
8364
+ activate: (activated, e) => parent.root.activate(computedId.value, activated, e),
8365
+ isActivated: vue.computed(() => parent.root.activated.value.has(vue.toRaw(computedId.value))),
8190
8366
  select: (selected, e) => parent.root.select(computedId.value, selected, e),
8191
8367
  isSelected: vue.computed(() => parent.root.selected.value.get(vue.toRaw(computedId.value)) === 'on'),
8192
8368
  isIndeterminate: vue.computed(() => parent.root.selected.value.get(computedId.value) === 'indeterminate'),
@@ -8309,7 +8485,9 @@
8309
8485
  }, [slots.default?.()]), [[vue.vShow, isOpen.value]])]
8310
8486
  })]
8311
8487
  }));
8312
- return {};
8488
+ return {
8489
+ isOpen
8490
+ };
8313
8491
  }
8314
8492
  });
8315
8493
 
@@ -8382,6 +8560,8 @@
8382
8560
  const link = useLink(props, attrs);
8383
8561
  const id = vue.computed(() => props.value === undefined ? link.href.value : props.value);
8384
8562
  const {
8563
+ activate,
8564
+ isActivated,
8385
8565
  select,
8386
8566
  isSelected,
8387
8567
  isIndeterminate,
@@ -8391,9 +8571,9 @@
8391
8571
  openOnSelect
8392
8572
  } = useNestedItem(id, false);
8393
8573
  const list = useList();
8394
- const isActive = vue.computed(() => props.active !== false && (props.active || link.isActive?.value || isSelected.value));
8574
+ const isActive = vue.computed(() => props.active !== false && (props.active || link.isActive?.value || (root.activatable.value ? isActivated.value : isSelected.value)));
8395
8575
  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));
8576
+ 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
8577
  const roundedProps = vue.computed(() => props.rounded || props.nav);
8398
8578
  const color = vue.computed(() => props.color ?? props.activeColor);
8399
8579
  const variantProps = vue.computed(() => ({
@@ -8444,7 +8624,13 @@
8444
8624
  emit('click', e);
8445
8625
  if (isGroupActivator || !isClickable.value) return;
8446
8626
  link.navigate?.(e);
8447
- props.value != null && select(!isSelected.value, e);
8627
+ if (root.activatable.value) {
8628
+ activate(!isActivated.value, e);
8629
+ } else if (root.selectable.value) {
8630
+ select(!isSelected.value, e);
8631
+ } else if (props.value != null) {
8632
+ select(!isSelected.value, e);
8633
+ }
8448
8634
  }
8449
8635
  function onKeyDown(e) {
8450
8636
  if (e.key === 'Enter' || e.key === ' ') {
@@ -8560,7 +8746,12 @@
8560
8746
  }, null)])]
8561
8747
  }), [[vue.resolveDirective("ripple"), isClickable.value && props.ripple]]);
8562
8748
  });
8563
- return {};
8749
+ return {
8750
+ isGroupActivator,
8751
+ isSelected,
8752
+ list,
8753
+ select
8754
+ };
8564
8755
  }
8565
8756
  });
8566
8757
 
@@ -8902,8 +9093,10 @@
8902
9093
  props: makeVListProps(),
8903
9094
  emits: {
8904
9095
  'update:selected': value => true,
9096
+ 'update:activated': value => true,
8905
9097
  'update:opened': value => true,
8906
9098
  'click:open': value => true,
9099
+ 'click:activate': value => true,
8907
9100
  'click:select': value => true
8908
9101
  },
8909
9102
  setup(props, _ref) {
@@ -8936,7 +9129,9 @@
8936
9129
  roundedClasses
8937
9130
  } = useRounded(props);
8938
9131
  const {
9132
+ children,
8939
9133
  open,
9134
+ parents,
8940
9135
  select
8941
9136
  } = useNested(props);
8942
9137
  const lineClasses = vue.computed(() => props.lines ? `v-list--${props.lines}-line` : undefined);
@@ -9026,7 +9221,9 @@
9026
9221
  return {
9027
9222
  open,
9028
9223
  select,
9029
- focus
9224
+ focus,
9225
+ children,
9226
+ parents
9030
9227
  };
9031
9228
  }
9032
9229
  });
@@ -9568,7 +9765,7 @@
9568
9765
  scope?.stop();
9569
9766
  if (!(data.isActive.value && props.scrollStrategy)) return;
9570
9767
  scope = vue.effectScope();
9571
- await vue.nextTick();
9768
+ await new Promise(resolve => setTimeout(resolve));
9572
9769
  scope.active && scope.run(() => {
9573
9770
  if (typeof props.scrollStrategy === 'function') {
9574
9771
  props.scrollStrategy(data, props, scope);
@@ -10317,6 +10514,7 @@
10317
10514
  if (v) isActive.value = false;
10318
10515
  });
10319
10516
  const root = vue.ref();
10517
+ const scrimEl = vue.ref();
10320
10518
  const contentEl = vue.ref();
10321
10519
  const {
10322
10520
  contentStyles,
@@ -10338,8 +10536,10 @@
10338
10536
  emit('click:outside', e);
10339
10537
  if (!props.persistent) isActive.value = false;else animateClick();
10340
10538
  }
10341
- function closeConditional() {
10342
- return isActive.value && globalTop.value;
10539
+ function closeConditional(e) {
10540
+ return isActive.value && globalTop.value && (
10541
+ // If using scrim, only close if clicking on it rather than anything opened on top
10542
+ !props.scrim || e.target === scrimEl.value);
10343
10543
  }
10344
10544
  IN_BROWSER && vue.watch(isActive, val => {
10345
10545
  if (val) {
@@ -10426,7 +10626,8 @@
10426
10626
  "ref": root
10427
10627
  }, scopeId, attrs), [vue.createVNode(Scrim, vue.mergeProps({
10428
10628
  "color": scrimColor,
10429
- "modelValue": isActive.value && !!props.scrim
10629
+ "modelValue": isActive.value && !!props.scrim,
10630
+ "ref": scrimEl
10430
10631
  }, scrimEvents.value), null), vue.createVNode(MaybeTransition, {
10431
10632
  "appear": true,
10432
10633
  "persisted": true,
@@ -10449,6 +10650,7 @@
10449
10650
  })]));
10450
10651
  return {
10451
10652
  activatorEl,
10653
+ scrimEl,
10452
10654
  target,
10453
10655
  animateClick,
10454
10656
  contentEl,
@@ -10644,6 +10846,9 @@
10644
10846
  isActive.value = false;
10645
10847
  overlay.value?.activatorEl?.focus();
10646
10848
  }
10849
+ } else if (['Enter', ' '].includes(e.key) && props.closeOnContentClick) {
10850
+ isActive.value = false;
10851
+ parent?.closeParents();
10647
10852
  }
10648
10853
  }
10649
10854
  function onActivatorKeydown(e) {
@@ -10921,7 +11126,7 @@
10921
11126
  }
10922
11127
  useRender(() => {
10923
11128
  const isOutlined = props.variant === 'outlined';
10924
- const hasPrepend = slots['prepend-inner'] || props.prependInnerIcon;
11129
+ const hasPrepend = !!(slots['prepend-inner'] || props.prependInnerIcon);
10925
11130
  const hasClear = !!(props.clearable || slots.clear);
10926
11131
  const hasAppend = !!(slots['append-inner'] || props.appendInnerIcon || hasClear);
10927
11132
  const label = () => slots.label ? slots.label({
@@ -11906,9 +12111,11 @@
11906
12111
  });
11907
12112
  }
11908
12113
  });
11909
- vue.watch(() => props.items, val => {
11910
- if (!isFocused.value || !val.length || menu.value) return;
11911
- menu.value = true;
12114
+ vue.watch(() => props.items, (newVal, oldVal) => {
12115
+ if (menu.value) return;
12116
+ if (isFocused.value && !oldVal.length && newVal.length) {
12117
+ menu.value = true;
12118
+ }
11912
12119
  });
11913
12120
  useRender(() => {
11914
12121
  const hasChips = !!(props.chips || slots.chip);
@@ -12343,8 +12550,8 @@
12343
12550
  if (e.key === 'ArrowDown' && highlightFirst.value) {
12344
12551
  listRef.value?.focus('next');
12345
12552
  }
12346
- if (!props.multiple) return;
12347
12553
  if (['Backspace', 'Delete'].includes(e.key)) {
12554
+ if (!props.multiple && hasSelectionSlot.value && model.value.length > 0) return select(model.value[0], false);
12348
12555
  if (selectionIndex.value < 0) {
12349
12556
  if (e.key === 'Backspace' && !search.value) {
12350
12557
  selectionIndex.value = length - 1;
@@ -12352,10 +12559,10 @@
12352
12559
  return;
12353
12560
  }
12354
12561
  const originalSelectionIndex = selectionIndex.value;
12355
- const selectedItem = model.value[selectionIndex.value];
12356
- if (selectedItem && !selectedItem.props.disabled) select(selectedItem, false);
12562
+ select(model.value[selectionIndex.value], false);
12357
12563
  selectionIndex.value = originalSelectionIndex >= length - 1 ? length - 2 : originalSelectionIndex;
12358
12564
  }
12565
+ if (!props.multiple) return;
12359
12566
  if (e.key === 'ArrowLeft') {
12360
12567
  if (selectionIndex.value < 0 && selectionStart > 0) return;
12361
12568
  const prev = selectionIndex.value > -1 ? selectionIndex.value - 1 : length - 1;
@@ -12408,7 +12615,7 @@
12408
12615
  /** @param set - null means toggle */
12409
12616
  function select(item) {
12410
12617
  let set = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
12411
- if (item.props.disabled) return;
12618
+ if (!item || item.props.disabled) return;
12412
12619
  if (props.multiple) {
12413
12620
  const index = model.value.findIndex(selection => props.valueComparator(selection.value, item.value));
12414
12621
  const add = set == null ? !~index : set;
@@ -12468,9 +12675,11 @@
12468
12675
  });
12469
12676
  }
12470
12677
  });
12471
- vue.watch(() => props.items, val => {
12472
- if (!isFocused.value || !val.length || menu.value) return;
12473
- menu.value = true;
12678
+ vue.watch(() => props.items, (newVal, oldVal) => {
12679
+ if (menu.value) return;
12680
+ if (isFocused.value && !oldVal.length && newVal.length) {
12681
+ menu.value = true;
12682
+ }
12474
12683
  });
12475
12684
  useRender(() => {
12476
12685
  const hasList = !!(!props.hideNoData || displayItems.value.length || slots['prepend-item'] || slots['append-item'] || slots['no-data']);
@@ -16127,6 +16336,7 @@
16127
16336
  }
16128
16337
  menu.value = !menu.value;
16129
16338
  }
16339
+ // eslint-disable-next-line complexity
16130
16340
  function onKeydown(e) {
16131
16341
  if (isComposingIgnoreKey(e) || props.readonly || form?.isReadonly.value) return;
16132
16342
  const selectionStart = vTextFieldRef.value.selectionStart;
@@ -16153,8 +16363,8 @@
16153
16363
  select(transformItem$3(props, search.value));
16154
16364
  if (hasSelectionSlot.value) _search.value = '';
16155
16365
  }
16156
- if (!props.multiple) return;
16157
16366
  if (['Backspace', 'Delete'].includes(e.key)) {
16367
+ if (!props.multiple && hasSelectionSlot.value && model.value.length > 0) return select(model.value[0], false);
16158
16368
  if (selectionIndex.value < 0) {
16159
16369
  if (e.key === 'Backspace' && !search.value) {
16160
16370
  selectionIndex.value = length - 1;
@@ -16162,10 +16372,10 @@
16162
16372
  return;
16163
16373
  }
16164
16374
  const originalSelectionIndex = selectionIndex.value;
16165
- const selectedItem = model.value[selectionIndex.value];
16166
- if (selectedItem && !selectedItem.props.disabled) select(selectedItem, false);
16375
+ select(model.value[selectionIndex.value], false);
16167
16376
  selectionIndex.value = originalSelectionIndex >= length - 1 ? length - 2 : originalSelectionIndex;
16168
16377
  }
16378
+ if (!props.multiple) return;
16169
16379
  if (e.key === 'ArrowLeft') {
16170
16380
  if (selectionIndex.value < 0 && selectionStart > 0) return;
16171
16381
  const prev = selectionIndex.value > -1 ? selectionIndex.value - 1 : length - 1;
@@ -16196,7 +16406,7 @@
16196
16406
  /** @param set - null means toggle */
16197
16407
  function select(item) {
16198
16408
  let set = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
16199
- if (item.props.disabled) return;
16409
+ if (!item || item.props.disabled) return;
16200
16410
  if (props.multiple) {
16201
16411
  const index = model.value.findIndex(selection => props.valueComparator(selection.value, item.value));
16202
16412
  const add = set == null ? !~index : set;
@@ -16273,9 +16483,11 @@
16273
16483
  });
16274
16484
  }
16275
16485
  });
16276
- vue.watch(() => props.items, val => {
16277
- if (!isFocused.value || !val.length || menu.value) return;
16278
- menu.value = true;
16486
+ vue.watch(() => props.items, (newVal, oldVal) => {
16487
+ if (menu.value) return;
16488
+ if (isFocused.value && !oldVal.length && newVal.length) {
16489
+ menu.value = true;
16490
+ }
16279
16491
  });
16280
16492
  useRender(() => {
16281
16493
  const hasList = !!(!props.hideNoData || displayItems.value.length || slots['prepend-item'] || slots['append-item'] || slots['no-data']);
@@ -17422,7 +17634,7 @@
17422
17634
  return d;
17423
17635
  }
17424
17636
  function startOfDay(date) {
17425
- return new Date(date.getFullYear(), date.getMonth(), date.getDate());
17637
+ return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0, 0);
17426
17638
  }
17427
17639
  function endOfDay(date) {
17428
17640
  return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59, 999);
@@ -20296,6 +20508,7 @@
20296
20508
  emit('click:month');
20297
20509
  }
20298
20510
  useRender(() => {
20511
+ // TODO: add slot support and scope defaults
20299
20512
  return vue.createVNode("div", {
20300
20513
  "class": ['v-date-picker-controls']
20301
20514
  }, [vue.createVNode(VBtn, {
@@ -20574,6 +20787,12 @@
20574
20787
  const adapter = useDate();
20575
20788
  const rangeStart = vue.shallowRef();
20576
20789
  const rangeStop = vue.shallowRef();
20790
+ if (props.multiple === 'range' && model.value.length > 0) {
20791
+ rangeStart.value = model.value[0];
20792
+ if (model.value.length > 1) {
20793
+ rangeStop.value = model.value[model.value.length - 1];
20794
+ }
20795
+ }
20577
20796
  const atMax = vue.computed(() => {
20578
20797
  const max = ['number', 'string'].includes(typeof props.multiple) ? Number(props.multiple) : Infinity;
20579
20798
  return model.value.length >= max;
@@ -20584,15 +20803,15 @@
20584
20803
  rangeStart.value = _value;
20585
20804
  model.value = [rangeStart.value];
20586
20805
  } else if (!rangeStop.value) {
20587
- if (adapter.isSameDay(value, rangeStart.value)) {
20806
+ if (adapter.isSameDay(_value, rangeStart.value)) {
20588
20807
  rangeStart.value = undefined;
20589
20808
  model.value = [];
20590
20809
  return;
20591
- } else if (adapter.isBefore(value, rangeStart.value)) {
20592
- rangeStop.value = rangeStart.value;
20810
+ } else if (adapter.isBefore(_value, rangeStart.value)) {
20811
+ rangeStop.value = adapter.endOfDay(rangeStart.value);
20593
20812
  rangeStart.value = _value;
20594
20813
  } else {
20595
- rangeStop.value = _value;
20814
+ rangeStop.value = adapter.endOfDay(_value);
20596
20815
  }
20597
20816
  const diff = adapter.getDiff(rangeStop.value, rangeStart.value, 'days');
20598
20817
  const datesInRange = [rangeStart.value];
@@ -22759,12 +22978,24 @@
22759
22978
  default: () => [hasImage && vue.createVNode("div", {
22760
22979
  "key": "image",
22761
22980
  "class": "v-navigation-drawer__img"
22762
- }, [slots.image ? slots.image?.({
22763
- image: props.image
22764
- }) : vue.createVNode("img", {
22765
- "src": props.image,
22766
- "alt": ""
22767
- }, null)]), slots.prepend && vue.createVNode("div", {
22981
+ }, [!slots.image ? vue.createVNode(VImg, {
22982
+ "key": "image-img",
22983
+ "alt": "",
22984
+ "cover": true,
22985
+ "height": "inherit",
22986
+ "src": props.image
22987
+ }, null) : vue.createVNode(VDefaultsProvider, {
22988
+ "key": "image-defaults",
22989
+ "disabled": !props.image,
22990
+ "defaults": {
22991
+ VImg: {
22992
+ alt: '',
22993
+ cover: true,
22994
+ height: 'inherit',
22995
+ src: props.image
22996
+ }
22997
+ }
22998
+ }, slots.image)]), slots.prepend && vue.createVNode("div", {
22768
22999
  "class": "v-navigation-drawer__prepend"
22769
23000
  }, [slots.prepend?.()]), vue.createVNode("div", {
22770
23001
  "class": "v-navigation-drawer__content"
@@ -22865,7 +23096,7 @@
22865
23096
  function onInput() {
22866
23097
  // The maxlength attribute doesn't work for the number type input, so the text type is used.
22867
23098
  // The following logic simulates the behavior of a number input.
22868
- if (props.type === 'number' && /[^0-9]/g.test(current.value.value)) {
23099
+ if (isValidNumber(current.value.value)) {
22869
23100
  current.value.value = '';
22870
23101
  return;
22871
23102
  }
@@ -22911,7 +23142,9 @@
22911
23142
  function onPaste(index, e) {
22912
23143
  e.preventDefault();
22913
23144
  e.stopPropagation();
22914
- model.value = (e?.clipboardData?.getData('Text') ?? '').split('');
23145
+ const clipboardText = e?.clipboardData?.getData('Text') ?? '';
23146
+ if (!isValidNumber(clipboardText)) return;
23147
+ model.value = clipboardText.split('');
22915
23148
  inputRef.value?.[index].blur();
22916
23149
  }
22917
23150
  function reset() {
@@ -22925,6 +23158,9 @@
22925
23158
  blur();
22926
23159
  focusIndex.value = -1;
22927
23160
  }
23161
+ function isValidNumber(value) {
23162
+ return props.type === 'number' && !isNaN(Number(value));
23163
+ }
22928
23164
  provideDefaults({
22929
23165
  VField: {
22930
23166
  color: vue.computed(() => props.color),
@@ -25402,78 +25638,6 @@
25402
25638
  }
25403
25639
  });
25404
25640
 
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
25641
  const makeVCalendarIntervalEventProps = propsFactory({
25478
25642
  allDay: Boolean,
25479
25643
  interval: Object,
@@ -25945,20 +26109,223 @@
25945
26109
  }
25946
26110
  });
25947
26111
 
25948
- const makeVFabProps = propsFactory({
25949
- app: Boolean,
25950
- appear: Boolean,
25951
- extended: Boolean,
25952
- location: {
26112
+ // Types
26113
+
26114
+ const makeVConfirmEditProps = propsFactory({
26115
+ modelValue: null,
26116
+ color: String,
26117
+ cancelText: {
25953
26118
  type: String,
25954
- default: 'bottom end'
26119
+ default: '$vuetify.confirmEdit.cancel'
25955
26120
  },
25956
- offset: Boolean,
25957
- modelValue: {
25958
- type: Boolean,
25959
- default: true
26121
+ okText: {
26122
+ type: String,
26123
+ default: '$vuetify.confirmEdit.ok'
26124
+ }
26125
+ }, 'VConfirmEdit');
26126
+ const VConfirmEdit = genericComponent()({
26127
+ name: 'VConfirmEdit',
26128
+ props: makeVConfirmEditProps(),
26129
+ emits: {
26130
+ cancel: () => true,
26131
+ save: value => true,
26132
+ 'update:modelValue': value => true
25960
26133
  },
25961
- ...omit(makeVBtnProps({
26134
+ setup(props, _ref) {
26135
+ let {
26136
+ emit,
26137
+ slots
26138
+ } = _ref;
26139
+ const model = useProxiedModel(props, 'modelValue');
26140
+ const internalModel = vue.ref();
26141
+ vue.watchEffect(() => {
26142
+ internalModel.value = structuredClone(vue.toRaw(model.value));
26143
+ });
26144
+ const {
26145
+ t
26146
+ } = useLocale();
26147
+ const isPristine = vue.computed(() => {
26148
+ return deepEqual(model.value, internalModel.value);
26149
+ });
26150
+ function save() {
26151
+ model.value = internalModel.value;
26152
+ emit('save', internalModel.value);
26153
+ }
26154
+ function cancel() {
26155
+ internalModel.value = structuredClone(vue.toRaw(model.value));
26156
+ emit('cancel');
26157
+ }
26158
+ let actionsUsed = false;
26159
+ useRender(() => {
26160
+ const actions = vue.createVNode(vue.Fragment, null, [vue.createVNode(VBtn, {
26161
+ "disabled": isPristine.value,
26162
+ "variant": "text",
26163
+ "color": props.color,
26164
+ "onClick": cancel,
26165
+ "text": t(props.cancelText)
26166
+ }, null), vue.createVNode(VBtn, {
26167
+ "disabled": isPristine.value,
26168
+ "variant": "text",
26169
+ "color": props.color,
26170
+ "onClick": save,
26171
+ "text": t(props.okText)
26172
+ }, null)]);
26173
+ return vue.createVNode(vue.Fragment, null, [slots.default?.({
26174
+ model: internalModel,
26175
+ get actions() {
26176
+ actionsUsed = true;
26177
+ return actions;
26178
+ }
26179
+ }), !actionsUsed && actions]);
26180
+ });
26181
+ }
26182
+ });
26183
+
26184
+ // Types
26185
+
26186
+ // Types
26187
+
26188
+ const makeVEmptyStateProps = propsFactory({
26189
+ actionText: String,
26190
+ bgColor: String,
26191
+ color: String,
26192
+ icon: IconValue,
26193
+ image: String,
26194
+ justify: {
26195
+ type: String,
26196
+ default: 'center'
26197
+ },
26198
+ headline: String,
26199
+ title: String,
26200
+ text: String,
26201
+ textWidth: {
26202
+ type: [Number, String],
26203
+ default: 500
26204
+ },
26205
+ href: String,
26206
+ to: String,
26207
+ ...makeComponentProps(),
26208
+ ...makeDimensionProps(),
26209
+ ...makeSizeProps({
26210
+ size: undefined
26211
+ }),
26212
+ ...makeThemeProps()
26213
+ }, 'VEmptyState');
26214
+ const VEmptyState = genericComponent()({
26215
+ name: 'VEmptyState',
26216
+ props: makeVEmptyStateProps(),
26217
+ emits: {
26218
+ 'click:action': e => true
26219
+ },
26220
+ setup(props, _ref) {
26221
+ let {
26222
+ emit,
26223
+ slots
26224
+ } = _ref;
26225
+ const {
26226
+ themeClasses
26227
+ } = provideTheme(props);
26228
+ const {
26229
+ backgroundColorClasses,
26230
+ backgroundColorStyles
26231
+ } = useBackgroundColor(vue.toRef(props, 'bgColor'));
26232
+ const {
26233
+ dimensionStyles
26234
+ } = useDimension(props);
26235
+ function onClickAction(e) {
26236
+ emit('click:action', e);
26237
+ }
26238
+ useRender(() => {
26239
+ const hasActions = !!(slots.actions || props.actionText);
26240
+ const hasHeadline = !!(slots.headline || props.headline);
26241
+ const hasTitle = !!(slots.title || props.title);
26242
+ const hasText = !!(slots.text || props.text);
26243
+ const hasMedia = !!(slots.media || props.image || props.icon);
26244
+ const size = props.size || (props.image ? 200 : 96);
26245
+ return vue.createVNode("div", {
26246
+ "class": ['v-empty-state', {
26247
+ [`v-empty-state--${props.justify}`]: true
26248
+ }, themeClasses.value, backgroundColorClasses.value, props.class],
26249
+ "style": [backgroundColorStyles.value, dimensionStyles.value, props.style]
26250
+ }, [hasMedia && vue.createVNode("div", {
26251
+ "key": "media",
26252
+ "class": "v-empty-state__media"
26253
+ }, [!slots.media ? vue.createVNode(vue.Fragment, null, [props.image ? vue.createVNode(VImg, {
26254
+ "key": "image",
26255
+ "src": props.image,
26256
+ "height": size
26257
+ }, null) : props.icon ? vue.createVNode(VIcon, {
26258
+ "key": "icon",
26259
+ "size": size,
26260
+ "icon": props.icon
26261
+ }, null) : undefined]) : vue.createVNode(VDefaultsProvider, {
26262
+ "key": "media-defaults",
26263
+ "defaults": {
26264
+ VImg: {
26265
+ src: props.image,
26266
+ height: size
26267
+ },
26268
+ VIcon: {
26269
+ size,
26270
+ icon: props.icon
26271
+ }
26272
+ }
26273
+ }, {
26274
+ default: () => [slots.media()]
26275
+ })]), hasHeadline && vue.createVNode("div", {
26276
+ "key": "headline",
26277
+ "class": "v-empty-state__headline"
26278
+ }, [slots.headline?.() ?? props.headline]), hasTitle && vue.createVNode("div", {
26279
+ "key": "title",
26280
+ "class": "v-empty-state__title"
26281
+ }, [slots.title?.() ?? props.title]), hasText && vue.createVNode("div", {
26282
+ "key": "text",
26283
+ "class": "v-empty-state__text",
26284
+ "style": {
26285
+ maxWidth: convertToUnit(props.textWidth)
26286
+ }
26287
+ }, [slots.text?.() ?? props.text]), slots.default && vue.createVNode("div", {
26288
+ "key": "content",
26289
+ "class": "v-empty-state__content"
26290
+ }, [slots.default()]), hasActions && vue.createVNode("div", {
26291
+ "key": "actions",
26292
+ "class": "v-empty-state__actions"
26293
+ }, [vue.createVNode(VDefaultsProvider, {
26294
+ "defaults": {
26295
+ VBtn: {
26296
+ class: 'v-empty-state__action-btn',
26297
+ color: props.color,
26298
+ text: props.actionText
26299
+ }
26300
+ }
26301
+ }, {
26302
+ default: () => [slots.actions?.({
26303
+ props: {
26304
+ onClick: onClickAction
26305
+ }
26306
+ }) ?? vue.createVNode(VBtn, {
26307
+ "onClick": onClickAction
26308
+ }, null)]
26309
+ })])]);
26310
+ });
26311
+ return {};
26312
+ }
26313
+ });
26314
+
26315
+ const makeVFabProps = propsFactory({
26316
+ app: Boolean,
26317
+ appear: Boolean,
26318
+ extended: Boolean,
26319
+ location: {
26320
+ type: String,
26321
+ default: 'bottom end'
26322
+ },
26323
+ offset: Boolean,
26324
+ modelValue: {
26325
+ type: Boolean,
26326
+ default: true
26327
+ },
26328
+ ...omit(makeVBtnProps({
25962
26329
  active: true
25963
26330
  }), ['location']),
25964
26331
  ...makeLayoutItemProps(),
@@ -26045,6 +26412,203 @@
26045
26412
  }
26046
26413
  });
26047
26414
 
26415
+ // Types
26416
+
26417
+ const makeVNumberInputProps = propsFactory({
26418
+ controlVariant: {
26419
+ type: String,
26420
+ default: 'default'
26421
+ },
26422
+ inset: Boolean,
26423
+ hideInput: Boolean,
26424
+ min: Number,
26425
+ max: Number,
26426
+ step: Number,
26427
+ ...only(makeVInputProps(), ['density', 'disabled', 'focused', 'hideDetails', 'hint', 'label', 'persistentHint', 'readonly']),
26428
+ ...only(makeVFieldProps(), ['baseColor', 'bgColor', 'class', 'color', 'disabled', 'error', 'loading', 'reverse', 'rounded', 'style', 'theme', 'variant']),
26429
+ ...makeFocusProps()
26430
+ }, 'VNumberInput');
26431
+ const VNumberInput = genericComponent()({
26432
+ name: 'VNumberInput',
26433
+ inheritAttrs: false,
26434
+ props: {
26435
+ ...makeVNumberInputProps(),
26436
+ modelValue: {
26437
+ type: [Number, String],
26438
+ default: 0
26439
+ }
26440
+ },
26441
+ emits: {
26442
+ 'update:modelValue': val => true
26443
+ },
26444
+ setup(props, _ref) {
26445
+ let {
26446
+ attrs,
26447
+ emit,
26448
+ slots
26449
+ } = _ref;
26450
+ const model = useProxiedModel(props, 'modelValue');
26451
+ const {
26452
+ isFocused,
26453
+ focus,
26454
+ blur
26455
+ } = useFocus(props);
26456
+ const inputRef = vue.ref();
26457
+ function onFocus() {
26458
+ if (!isFocused.value) focus();
26459
+ }
26460
+ const controlVariant = vue.computed(() => {
26461
+ return props.hideInput ? 'stacked' : props.controlVariant;
26462
+ });
26463
+ function toggleUpDown() {
26464
+ let increment = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
26465
+ if (increment) {
26466
+ inputRef.value?.stepUp();
26467
+ } else {
26468
+ inputRef.value?.stepDown();
26469
+ }
26470
+ if (inputRef.value) model.value = parseInt(inputRef.value.value, 10);
26471
+ }
26472
+ function onClickUp() {
26473
+ toggleUpDown();
26474
+ }
26475
+ function onClickDown() {
26476
+ toggleUpDown(false);
26477
+ }
26478
+ const incrementSlotProps = vue.computed(() => ({
26479
+ click: onClickUp
26480
+ }));
26481
+ const decrementSlotProps = vue.computed(() => ({
26482
+ click: onClickDown
26483
+ }));
26484
+ useRender(() => {
26485
+ const fieldProps = filterFieldProps(props);
26486
+ const [rootAttrs, inputAttrs] = filterInputAttrs(attrs);
26487
+ const {
26488
+ modelValue: _,
26489
+ ...inputProps
26490
+ } = VInput.filterProps(props);
26491
+ function controlNode() {
26492
+ const defaultHeight = controlVariant.value === 'stacked' ? 'auto' : '100%';
26493
+ return vue.createVNode("div", {
26494
+ "class": "v-number-input__control"
26495
+ }, [!slots.decrement ? vue.createVNode(VBtn, {
26496
+ "flat": true,
26497
+ "key": "decrement-btn",
26498
+ "height": defaultHeight,
26499
+ "icon": "mdi-chevron-down",
26500
+ "rounded": "0",
26501
+ "size": "small",
26502
+ "onClick": onClickDown
26503
+ }, null) : vue.createVNode(VDefaultsProvider, {
26504
+ "key": "decrement-defaults",
26505
+ "defaults": {
26506
+ VBtn: {
26507
+ flat: true,
26508
+ rounded: '0',
26509
+ height: defaultHeight,
26510
+ size: 'small',
26511
+ icon: 'mdi-chevron-down'
26512
+ }
26513
+ }
26514
+ }, {
26515
+ default: () => [slots.decrement(decrementSlotProps.value)]
26516
+ }), vue.createVNode(VDivider, {
26517
+ "vertical": controlVariant.value !== 'stacked'
26518
+ }, null), !slots.increment ? vue.createVNode(VBtn, {
26519
+ "flat": true,
26520
+ "key": "increment-btn",
26521
+ "height": defaultHeight,
26522
+ "icon": "mdi-chevron-up",
26523
+ "onClick": onClickUp,
26524
+ "rounded": "0",
26525
+ "size": "small"
26526
+ }, null) : vue.createVNode(VDefaultsProvider, {
26527
+ "key": "increment-defaults",
26528
+ "defaults": {
26529
+ VBtn: {
26530
+ flat: true,
26531
+ height: defaultHeight,
26532
+ rounded: '0',
26533
+ size: 'small',
26534
+ icon: 'mdi-chevron-up'
26535
+ }
26536
+ }
26537
+ }, {
26538
+ default: () => [slots.increment(incrementSlotProps.value)]
26539
+ })]);
26540
+ }
26541
+ function dividerNode() {
26542
+ return !props.hideInput && !props.inset ? vue.createVNode(VDivider, {
26543
+ "vertical": true
26544
+ }, null) : undefined;
26545
+ }
26546
+ return vue.createVNode(VInput, vue.mergeProps({
26547
+ "class": ['v-number-input', {
26548
+ 'v-number-input--default': controlVariant.value === 'default',
26549
+ 'v-number-input--hide-input': props.hideInput,
26550
+ 'v-number-input--inset': props.inset,
26551
+ 'v-number-input--reverse': props.reverse,
26552
+ 'v-number-input--split': controlVariant.value === 'split',
26553
+ 'v-number-input--stacked': controlVariant.value === 'stacked'
26554
+ }, props.class]
26555
+ }, rootAttrs, inputProps, {
26556
+ "focused": isFocused.value,
26557
+ "style": props.style
26558
+ }), {
26559
+ ...slots,
26560
+ default: () => vue.createVNode(VField, vue.mergeProps(fieldProps, {
26561
+ "active": true,
26562
+ "focused": isFocused.value
26563
+ }), {
26564
+ ...slots,
26565
+ default: _ref2 => {
26566
+ let {
26567
+ props: {
26568
+ class: fieldClass,
26569
+ ...slotProps
26570
+ }
26571
+ } = _ref2;
26572
+ return vue.createVNode("input", vue.mergeProps({
26573
+ "ref": inputRef,
26574
+ "type": "number",
26575
+ "value": model.value,
26576
+ "class": fieldClass,
26577
+ "max": props.max,
26578
+ "min": props.min,
26579
+ "step": props.step,
26580
+ "onFocus": onFocus,
26581
+ "onBlur": blur
26582
+ }, inputAttrs), null);
26583
+ },
26584
+ 'append-inner': controlVariant.value === 'split' ? () => vue.createVNode("div", {
26585
+ "class": "v-number-input__control"
26586
+ }, [vue.createVNode(VDivider, {
26587
+ "vertical": true
26588
+ }, null), vue.createVNode(VBtn, {
26589
+ "flat": true,
26590
+ "height": "100%",
26591
+ "icon": "mdi-plus",
26592
+ "tile": true,
26593
+ "onClick": onClickUp
26594
+ }, null)]) : !props.reverse ? () => vue.createVNode(vue.Fragment, null, [dividerNode(), controlNode()]) : undefined,
26595
+ 'prepend-inner': controlVariant.value === 'split' ? () => vue.createVNode("div", {
26596
+ "class": "v-number-input__control"
26597
+ }, [vue.createVNode(VBtn, {
26598
+ "flat": true,
26599
+ "height": "100%",
26600
+ "icon": "mdi-minus",
26601
+ "tile": true,
26602
+ "onClick": onClickDown
26603
+ }, null), vue.createVNode(VDivider, {
26604
+ "vertical": true
26605
+ }, null)]) : props.reverse ? () => vue.createVNode(vue.Fragment, null, [controlNode(), dividerNode()]) : undefined
26606
+ })
26607
+ });
26608
+ });
26609
+ }
26610
+ });
26611
+
26048
26612
  // Utilities
26049
26613
 
26050
26614
  // Types
@@ -26492,6 +27056,8 @@
26492
27056
  }
26493
27057
  });
26494
27058
 
27059
+ // Types
27060
+
26495
27061
  const makeVSpeedDialProps = propsFactory({
26496
27062
  ...makeComponentProps(),
26497
27063
  ...makeVMenuProps({
@@ -26510,14 +27076,17 @@
26510
27076
  let {
26511
27077
  slots
26512
27078
  } = _ref;
27079
+ const menuRef = vue.ref();
26513
27080
  useRender(() => {
26514
27081
  const menuProps = VMenu.filterProps(props);
26515
27082
  return vue.createVNode(VMenu, vue.mergeProps(menuProps, {
26516
27083
  "class": props.class,
26517
27084
  "style": props.style,
26518
- "contentClass": "v-speed-dial__content"
27085
+ "contentClass": "v-speed-dial__content",
27086
+ "ref": menuRef
26519
27087
  }), {
26520
- default: () => [vue.createVNode(VDefaultsProvider, {
27088
+ ...slots,
27089
+ default: slotProps => vue.createVNode(VDefaultsProvider, {
26521
27090
  "defaults": {
26522
27091
  VBtn: {
26523
27092
  size: 'small'
@@ -26529,9 +27098,9 @@
26529
27098
  "group": true,
26530
27099
  "transition": props.transition
26531
27100
  }, {
26532
- default: () => [slots.default?.()]
27101
+ default: () => [slots.default?.(slotProps)]
26533
27102
  })]
26534
- })]
27103
+ })
26535
27104
  });
26536
27105
  });
26537
27106
  return {};
@@ -26540,132 +27109,358 @@
26540
27109
 
26541
27110
  // Types
26542
27111
 
27112
+ const makeVTreeviewGroupProps = propsFactory({
27113
+ ...omit(makeVListGroupProps({
27114
+ collapseIcon: '$treeviewCollapse',
27115
+ expandIcon: '$treeviewExpand'
27116
+ }), ['subgroup'])
27117
+ }, 'VTreeviewGroup');
27118
+ const VTreeviewGroup = genericComponent()({
27119
+ name: 'VTreeviewGroup',
27120
+ props: makeVTreeviewGroupProps(),
27121
+ setup(props, _ref) {
27122
+ let {
27123
+ slots
27124
+ } = _ref;
27125
+ const vListGroupRef = vue.ref();
27126
+ const toggleIcon = vue.computed(() => vListGroupRef.value?.isOpen ? props.collapseIcon : props.expandIcon);
27127
+ const activatorDefaults = vue.computed(() => ({
27128
+ VTreeviewItem: {
27129
+ prependIcon: undefined,
27130
+ appendIcon: undefined,
27131
+ active: vListGroupRef.value?.isOpen,
27132
+ toggleIcon: toggleIcon.value
27133
+ }
27134
+ }));
27135
+ useRender(() => {
27136
+ const listGroupProps = VListGroup.filterProps(props);
27137
+ return vue.createVNode(VListGroup, vue.mergeProps(listGroupProps, {
27138
+ "ref": vListGroupRef,
27139
+ "class": ['v-treeview-group', props.class],
27140
+ "subgroup": true
27141
+ }), {
27142
+ ...slots,
27143
+ activator: slots.activator ? slotProps => vue.createVNode(vue.Fragment, null, [vue.createVNode(VDefaultsProvider, {
27144
+ "defaults": activatorDefaults.value
27145
+ }, {
27146
+ default: () => [slots.activator?.(slotProps)]
27147
+ })]) : undefined
27148
+ });
27149
+ });
27150
+ return {};
27151
+ }
27152
+ });
27153
+
26543
27154
  // Types
26544
27155
 
26545
- const makeVEmptyStateProps = propsFactory({
26546
- actionText: String,
26547
- bgColor: String,
26548
- color: String,
26549
- icon: IconValue,
26550
- image: String,
26551
- justify: {
27156
+ const VTreeviewSymbol = Symbol.for('vuetify:v-treeview');
27157
+
27158
+ const makeVTreeviewItemProps = propsFactory({
27159
+ loading: Boolean,
27160
+ toggleIcon: IconValue,
27161
+ ...makeVListItemProps({
27162
+ slim: true
27163
+ })
27164
+ }, 'VTreeviewItem');
27165
+ const VTreeviewItem = genericComponent()({
27166
+ name: 'VTreeviewItem',
27167
+ props: makeVTreeviewItemProps(),
27168
+ setup(props, _ref) {
27169
+ let {
27170
+ attrs,
27171
+ slots,
27172
+ emit
27173
+ } = _ref;
27174
+ const link = useLink(props, attrs);
27175
+ const id = vue.computed(() => props.value === undefined ? link.href.value : props.value);
27176
+ const vListItemRef = vue.ref();
27177
+ const isClickable = vue.computed(() => !props.disabled && props.link !== false && (props.link || link.isClickable.value || props.value != null && !!vListItemRef.value?.list));
27178
+ function onClick(e) {
27179
+ if (!vListItemRef.value?.isGroupActivator || !isClickable.value) return;
27180
+ props.value != null && vListItemRef.value?.select(!vListItemRef.value?.isSelected, e);
27181
+ }
27182
+ function onKeyDown(e) {
27183
+ if (e.key === 'Enter' || e.key === ' ') {
27184
+ e.preventDefault();
27185
+ onClick(e);
27186
+ }
27187
+ }
27188
+ const visibleIds = vue.inject(VTreeviewSymbol, {
27189
+ visibleIds: vue.ref()
27190
+ }).visibleIds;
27191
+ useRender(() => {
27192
+ const listItemProps = VListItem.filterProps(props);
27193
+ const hasPrepend = slots.prepend || props.toggleIcon;
27194
+ return vue.createVNode(VListItem, vue.mergeProps({
27195
+ "ref": vListItemRef
27196
+ }, listItemProps, {
27197
+ "class": ['v-treeview-item', {
27198
+ 'v-treeview-item--filtered': visibleIds.value && !visibleIds.value.has(id.value)
27199
+ }, props.class],
27200
+ "onClick": onClick,
27201
+ "onKeydown": isClickable.value && onKeyDown
27202
+ }), {
27203
+ ...slots,
27204
+ prepend: hasPrepend ? slotProps => {
27205
+ return vue.createVNode(vue.Fragment, null, [props.toggleIcon && vue.createVNode(VListItemAction, {
27206
+ "start": false
27207
+ }, {
27208
+ default: () => [vue.createVNode(VBtn, {
27209
+ "density": "compact",
27210
+ "icon": props.toggleIcon,
27211
+ "loading": props.loading,
27212
+ "variant": "text"
27213
+ }, {
27214
+ loader() {
27215
+ return vue.createVNode(VProgressCircular, {
27216
+ "indeterminate": "disable-shrink",
27217
+ "size": "20",
27218
+ "width": "2"
27219
+ }, null);
27220
+ }
27221
+ })]
27222
+ }), slots.prepend?.(slotProps)]);
27223
+ } : undefined
27224
+ });
27225
+ });
27226
+ return {};
27227
+ }
27228
+ });
27229
+
27230
+ // Types
27231
+
27232
+ const makeVTreeviewChildrenProps = propsFactory({
27233
+ loadChildren: Function,
27234
+ loadingIcon: {
26552
27235
  type: String,
26553
- default: 'center'
26554
- },
26555
- headline: String,
26556
- title: String,
26557
- text: String,
26558
- textWidth: {
26559
- type: [Number, String],
26560
- default: 500
27236
+ default: '$loading'
26561
27237
  },
26562
- href: String,
26563
- to: String,
26564
- ...makeComponentProps(),
26565
- ...makeDimensionProps(),
26566
- ...makeSizeProps({
26567
- size: undefined
27238
+ items: Array,
27239
+ selectable: Boolean
27240
+ }, 'VTreeviewChildren');
27241
+ const VTreeviewChildren = genericComponent()({
27242
+ name: 'VTreeviewChildren',
27243
+ props: makeVTreeviewChildrenProps(),
27244
+ setup(props, _ref) {
27245
+ let {
27246
+ emit,
27247
+ slots
27248
+ } = _ref;
27249
+ const isLoading = vue.shallowRef(false);
27250
+ const hasLoaded = vue.shallowRef(false);
27251
+ function checkChildren(item) {
27252
+ return new Promise(resolve => {
27253
+ if (!props.items?.length || !props.loadChildren || hasLoaded.value) return resolve();
27254
+ isLoading.value = true;
27255
+ props.loadChildren(item).then(resolve);
27256
+ }).then(() => {
27257
+ hasLoaded.value = true;
27258
+ }).finally(() => {
27259
+ isLoading.value = false;
27260
+ });
27261
+ }
27262
+ function onClick(e, item) {
27263
+ e.stopPropagation();
27264
+ checkChildren(item);
27265
+ }
27266
+ return () => slots.default?.() ?? props.items?.map(_ref2 => {
27267
+ let {
27268
+ children,
27269
+ props: itemProps,
27270
+ raw: item
27271
+ } = _ref2;
27272
+ const slotsWithItem = {
27273
+ prepend: slots.prepend ? slotProps => slots.prepend?.({
27274
+ ...slotProps,
27275
+ item
27276
+ }) : props.selectable ? _ref3 => {
27277
+ let {
27278
+ isSelected,
27279
+ isIndeterminate
27280
+ } = _ref3;
27281
+ return vue.createVNode(VCheckboxBtn, {
27282
+ "key": item.value,
27283
+ "tabindex": "-1",
27284
+ "modelValue": isSelected,
27285
+ "loading": isLoading.value,
27286
+ "indeterminate": isIndeterminate,
27287
+ "onClick": e => onClick(e, item)
27288
+ }, null);
27289
+ } : undefined,
27290
+ append: slots.append ? slotProps => slots.append?.({
27291
+ ...slotProps,
27292
+ item
27293
+ }) : undefined,
27294
+ title: slots.title ? slotProps => slots.title?.({
27295
+ ...slotProps,
27296
+ item
27297
+ }) : undefined
27298
+ };
27299
+ const treeviewGroupProps = VTreeviewGroup.filterProps(itemProps);
27300
+ const treeviewChildrenProps = VTreeviewChildren.filterProps(props);
27301
+ return children ? vue.createVNode(VTreeviewGroup, vue.mergeProps({
27302
+ "value": itemProps?.value
27303
+ }, treeviewGroupProps), {
27304
+ activator: _ref4 => {
27305
+ let {
27306
+ props: activatorProps
27307
+ } = _ref4;
27308
+ return vue.createVNode(VTreeviewItem, vue.mergeProps(itemProps, activatorProps, {
27309
+ "loading": isLoading.value,
27310
+ "onClick": e => onClick(e, item)
27311
+ }), slotsWithItem);
27312
+ },
27313
+ default: () => vue.createVNode(VTreeviewChildren, vue.mergeProps(treeviewChildrenProps, {
27314
+ "items": children
27315
+ }), slots)
27316
+ }) : slots.item?.({
27317
+ props: itemProps
27318
+ }) ?? vue.createVNode(VTreeviewItem, itemProps, slotsWithItem);
27319
+ });
27320
+ }
27321
+ });
27322
+
27323
+ function flatten(items) {
27324
+ let flat = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
27325
+ for (const item of items) {
27326
+ flat.push(item);
27327
+ if (item.children) flatten(item.children, flat);
27328
+ }
27329
+ return flat;
27330
+ }
27331
+ const makeVTreeviewProps = propsFactory({
27332
+ openAll: Boolean,
27333
+ search: String,
27334
+ ...makeFilterProps({
27335
+ filterKeys: ['title']
26568
27336
  }),
26569
- ...makeThemeProps()
26570
- }, 'VEmptyState');
26571
- const VEmptyState = genericComponent()({
26572
- name: 'VEmptyState',
26573
- props: makeVEmptyStateProps(),
27337
+ ...makeVTreeviewChildrenProps(),
27338
+ ...omit(makeVListProps({
27339
+ collapseIcon: '$treeviewCollapse',
27340
+ expandIcon: '$treeviewExpand',
27341
+ selectStrategy: 'independent',
27342
+ openStrategy: 'multiple',
27343
+ slim: true
27344
+ }), ['nav'])
27345
+ }, 'VTreeview');
27346
+ const VTreeview = genericComponent()({
27347
+ name: 'VTreeview',
27348
+ props: makeVTreeviewProps(),
26574
27349
  emits: {
26575
- 'click:action': e => true
27350
+ 'update:opened': val => true,
27351
+ 'update:activated': val => true,
27352
+ 'update:selected': val => true,
27353
+ 'click:open': value => true,
27354
+ 'click:select': value => true
26576
27355
  },
26577
27356
  setup(props, _ref) {
26578
27357
  let {
26579
- emit,
26580
27358
  slots
26581
27359
  } = _ref;
26582
27360
  const {
26583
- themeClasses
26584
- } = provideTheme(props);
26585
- const {
26586
- backgroundColorClasses,
26587
- backgroundColorStyles
26588
- } = useBackgroundColor(vue.toRef(props, 'bgColor'));
27361
+ items
27362
+ } = useListItems(props);
27363
+ const activeColor = vue.toRef(props, 'activeColor');
27364
+ const baseColor = vue.toRef(props, 'baseColor');
27365
+ const color = vue.toRef(props, 'color');
27366
+ const opened = useProxiedModel(props, 'opened');
27367
+ const activated = useProxiedModel(props, 'activated');
27368
+ const selected = useProxiedModel(props, 'selected');
27369
+ const vListRef = vue.ref();
27370
+ const flatItems = vue.computed(() => flatten(items.value));
27371
+ const search = vue.toRef(props, 'search');
26589
27372
  const {
26590
- dimensionStyles
26591
- } = useDimension(props);
26592
- function onClickAction(e) {
26593
- emit('click:action', e);
27373
+ filteredItems
27374
+ } = useFilter(props, flatItems, search);
27375
+ const visibleIds = vue.computed(() => {
27376
+ if (!search.value) {
27377
+ return null;
27378
+ }
27379
+ return new Set(filteredItems.value.flatMap(item => {
27380
+ return [...getPath(item.props.value), ...getChildren(item.props.value)];
27381
+ }));
27382
+ });
27383
+ function getPath(id) {
27384
+ const path = [];
27385
+ let parent = id;
27386
+ while (parent != null) {
27387
+ path.unshift(parent);
27388
+ parent = vListRef.value?.parents.get(parent);
27389
+ }
27390
+ return path;
26594
27391
  }
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
- }
27392
+ function getChildren(id) {
27393
+ const arr = [];
27394
+ const queue = (vListRef.value?.children.get(id) ?? []).slice();
27395
+ while (queue.length) {
27396
+ const child = queue.shift();
27397
+ if (!child) continue;
27398
+ arr.push(child);
27399
+ queue.push(...(vListRef.value?.children.get(child) ?? []).slice());
27400
+ }
27401
+ return arr;
27402
+ }
27403
+ vue.watch(() => props.openAll, val => {
27404
+ opened.value = val ? openAll(items.value) : [];
27405
+ }, {
27406
+ immediate: true
27407
+ });
27408
+ function openAll(item) {
27409
+ let ids = [];
27410
+ for (const i of item) {
27411
+ if (!i.children) continue;
27412
+ ids.push(i.value);
27413
+ if (i.children) {
27414
+ ids = ids.concat(openAll(i.children));
26657
27415
  }
26658
- }, {
26659
- default: () => [slots.actions?.({
26660
- props: {
26661
- onClick: onClickAction
26662
- }
26663
- }) ?? vue.createVNode(VBtn, {
26664
- "onClick": onClickAction
26665
- }, null)]
26666
- })])]);
27416
+ }
27417
+ return ids;
27418
+ }
27419
+ vue.provide(VTreeviewSymbol, {
27420
+ visibleIds
26667
27421
  });
26668
- return {};
27422
+ provideDefaults({
27423
+ VTreeviewGroup: {
27424
+ activeColor,
27425
+ baseColor,
27426
+ color,
27427
+ collapseIcon: vue.toRef(props, 'collapseIcon'),
27428
+ expandIcon: vue.toRef(props, 'expandIcon')
27429
+ },
27430
+ VTreeviewItem: {
27431
+ activeClass: vue.toRef(props, 'activeClass'),
27432
+ activeColor,
27433
+ baseColor,
27434
+ color,
27435
+ density: vue.toRef(props, 'density'),
27436
+ disabled: vue.toRef(props, 'disabled'),
27437
+ lines: vue.toRef(props, 'lines'),
27438
+ variant: vue.toRef(props, 'variant')
27439
+ }
27440
+ });
27441
+ useRender(() => {
27442
+ const listProps = VList.filterProps(props);
27443
+ const treeviewChildrenProps = VTreeviewChildren.filterProps(props);
27444
+ return vue.createVNode(VList, vue.mergeProps({
27445
+ "ref": vListRef
27446
+ }, listProps, {
27447
+ "class": ['v-treeview', props.class],
27448
+ "style": props.style,
27449
+ "opened": opened.value,
27450
+ "onUpdate:opened": $event => opened.value = $event,
27451
+ "activated": activated.value,
27452
+ "onUpdate:activated": $event => activated.value = $event,
27453
+ "selected": selected.value,
27454
+ "onUpdate:selected": $event => selected.value = $event
27455
+ }), {
27456
+ default: () => [vue.createVNode(VTreeviewChildren, vue.mergeProps(treeviewChildrenProps, {
27457
+ "items": items.value
27458
+ }), slots)]
27459
+ });
27460
+ });
27461
+ return {
27462
+ open
27463
+ };
26669
27464
  }
26670
27465
  });
26671
27466
 
@@ -26781,6 +27576,7 @@
26781
27576
  VMessages: VMessages,
26782
27577
  VNavigationDrawer: VNavigationDrawer,
26783
27578
  VNoSsr: VNoSsr,
27579
+ VNumberInput: VNumberInput,
26784
27580
  VOtpInput: VOtpInput,
26785
27581
  VOverlay: VOverlay,
26786
27582
  VPagination: VPagination,
@@ -26837,6 +27633,9 @@
26837
27633
  VToolbarItems: VToolbarItems,
26838
27634
  VToolbarTitle: VToolbarTitle,
26839
27635
  VTooltip: VTooltip,
27636
+ VTreeview: VTreeview,
27637
+ VTreeviewGroup: VTreeviewGroup,
27638
+ VTreeviewItem: VTreeviewItem,
26840
27639
  VValidation: VValidation,
26841
27640
  VVirtualScroll: VVirtualScroll,
26842
27641
  VWindow: VWindow,
@@ -27063,7 +27862,7 @@
27063
27862
  goTo
27064
27863
  };
27065
27864
  }
27066
- const version$1 = "3.5.8";
27865
+ const version$1 = "3.5.10";
27067
27866
  createVuetify$1.version = version$1;
27068
27867
 
27069
27868
  // Vue's inject() can only be used in setup
@@ -27075,9 +27874,248 @@
27075
27874
  }
27076
27875
  }
27077
27876
 
27877
+ // Icons
27878
+
27879
+ // Types
27880
+
27881
+ const md1 = {
27882
+ defaults: {
27883
+ global: {
27884
+ rounded: 'sm'
27885
+ },
27886
+ VAvatar: {
27887
+ rounded: 'circle'
27888
+ },
27889
+ VAutocomplete: {
27890
+ variant: 'underlined'
27891
+ },
27892
+ VBanner: {
27893
+ color: 'primary'
27894
+ },
27895
+ VBtn: {
27896
+ color: 'primary',
27897
+ rounded: 0
27898
+ },
27899
+ VCheckbox: {
27900
+ color: 'secondary'
27901
+ },
27902
+ VCombobox: {
27903
+ variant: 'underlined'
27904
+ },
27905
+ VSelect: {
27906
+ variant: 'underlined'
27907
+ },
27908
+ VSlider: {
27909
+ color: 'primary'
27910
+ },
27911
+ VTabs: {
27912
+ color: 'primary'
27913
+ },
27914
+ VTextarea: {
27915
+ variant: 'underlined'
27916
+ },
27917
+ VTextField: {
27918
+ variant: 'underlined'
27919
+ },
27920
+ VToolbar: {
27921
+ VBtn: {
27922
+ color: null
27923
+ }
27924
+ }
27925
+ },
27926
+ icons: {
27927
+ defaultSet: 'mdi',
27928
+ sets: {
27929
+ mdi
27930
+ }
27931
+ },
27932
+ theme: {
27933
+ themes: {
27934
+ light: {
27935
+ colors: {
27936
+ primary: '#3F51B5',
27937
+ 'primary-darken-1': '#303F9F',
27938
+ 'primary-lighten-1': '#C5CAE9',
27939
+ secondary: '#FF4081',
27940
+ 'secondary-darken-1': '#F50057',
27941
+ 'secondary-lighten-1': '#FF80AB',
27942
+ accent: '#009688'
27943
+ }
27944
+ }
27945
+ }
27946
+ }
27947
+ };
27948
+
27949
+ // Icons
27950
+
27951
+ // Types
27952
+
27953
+ const md2 = {
27954
+ defaults: {
27955
+ global: {
27956
+ rounded: 'md'
27957
+ },
27958
+ VAvatar: {
27959
+ rounded: 'circle'
27960
+ },
27961
+ VAutocomplete: {
27962
+ variant: 'filled'
27963
+ },
27964
+ VBanner: {
27965
+ color: 'primary'
27966
+ },
27967
+ VBtn: {
27968
+ color: 'primary'
27969
+ },
27970
+ VCheckbox: {
27971
+ color: 'secondary'
27972
+ },
27973
+ VCombobox: {
27974
+ variant: 'filled'
27975
+ },
27976
+ VSelect: {
27977
+ variant: 'filled'
27978
+ },
27979
+ VSlider: {
27980
+ color: 'primary'
27981
+ },
27982
+ VTabs: {
27983
+ color: 'primary'
27984
+ },
27985
+ VTextarea: {
27986
+ variant: 'filled'
27987
+ },
27988
+ VTextField: {
27989
+ variant: 'filled'
27990
+ },
27991
+ VToolbar: {
27992
+ VBtn: {
27993
+ color: null
27994
+ }
27995
+ }
27996
+ },
27997
+ icons: {
27998
+ defaultSet: 'mdi',
27999
+ sets: {
28000
+ mdi
28001
+ }
28002
+ },
28003
+ theme: {
28004
+ themes: {
28005
+ light: {
28006
+ colors: {
28007
+ primary: '#6200EE',
28008
+ 'primary-darken-1': '#3700B3',
28009
+ secondary: '#03DAC6',
28010
+ 'secondary-darken-1': '#018786',
28011
+ error: '#B00020'
28012
+ }
28013
+ }
28014
+ }
28015
+ }
28016
+ };
28017
+
28018
+ // Icons
28019
+
28020
+ // Types
28021
+
28022
+ const md3 = {
28023
+ defaults: {
28024
+ VAppBar: {
28025
+ flat: true
28026
+ },
28027
+ VAutocomplete: {
28028
+ variant: 'filled'
28029
+ },
28030
+ VBanner: {
28031
+ color: 'primary'
28032
+ },
28033
+ VBottomSheet: {
28034
+ contentClass: 'rounded-t-xl overflow-hidden'
28035
+ },
28036
+ VBtn: {
28037
+ color: 'primary',
28038
+ rounded: 'xl'
28039
+ },
28040
+ VBtnGroup: {
28041
+ rounded: 'xl',
28042
+ VBtn: {
28043
+ rounded: null
28044
+ }
28045
+ },
28046
+ VCard: {
28047
+ rounded: 'lg'
28048
+ },
28049
+ VCheckbox: {
28050
+ color: 'secondary',
28051
+ inset: true
28052
+ },
28053
+ VChip: {
28054
+ rounded: 'sm'
28055
+ },
28056
+ VCombobox: {
28057
+ variant: 'filled'
28058
+ },
28059
+ VNavigationDrawer: {
28060
+ // VList: {
28061
+ // nav: true,
28062
+ // VListItem: {
28063
+ // rounded: 'xl',
28064
+ // },
28065
+ // },
28066
+ },
28067
+ VSelect: {
28068
+ variant: 'filled'
28069
+ },
28070
+ VSlider: {
28071
+ color: 'primary'
28072
+ },
28073
+ VTabs: {
28074
+ color: 'primary'
28075
+ },
28076
+ VTextarea: {
28077
+ variant: 'filled'
28078
+ },
28079
+ VTextField: {
28080
+ variant: 'filled'
28081
+ },
28082
+ VToolbar: {
28083
+ VBtn: {
28084
+ color: null
28085
+ }
28086
+ }
28087
+ },
28088
+ icons: {
28089
+ defaultSet: 'mdi',
28090
+ sets: {
28091
+ mdi
28092
+ }
28093
+ },
28094
+ theme: {
28095
+ themes: {
28096
+ light: {
28097
+ colors: {
28098
+ primary: '#6750a4',
28099
+ secondary: '#b4b0bb',
28100
+ tertiary: '#7d5260',
28101
+ error: '#b3261e',
28102
+ surface: '#fffbfe'
28103
+ }
28104
+ }
28105
+ }
28106
+ }
28107
+ };
28108
+
28109
+ var index = /*#__PURE__*/Object.freeze({
28110
+ __proto__: null,
28111
+ md1: md1,
28112
+ md2: md2,
28113
+ md3: md3
28114
+ });
28115
+
27078
28116
  /* eslint-disable local-rules/sort-imports */
27079
28117
 
27080
- const version = "3.5.8";
28118
+ const version = "3.5.10";
27081
28119
 
27082
28120
  /* eslint-disable local-rules/sort-imports */
27083
28121
 
@@ -27090,6 +28128,7 @@
27090
28128
  });
27091
28129
  };
27092
28130
 
28131
+ exports.blueprints = index;
27093
28132
  exports.components = components;
27094
28133
  exports.createVuetify = createVuetify;
27095
28134
  exports.directives = directives;