vuetify 3.6.0 → 3.6.2

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 (131) hide show
  1. package/dist/_component-variables-labs.sass +0 -2
  2. package/dist/_component-variables.sass +2 -0
  3. package/dist/json/attributes.json +1 -1
  4. package/dist/json/importMap-labs.json +16 -36
  5. package/dist/json/importMap.json +142 -122
  6. package/dist/json/web-types.json +16 -15
  7. package/dist/vuetify-labs.css +2508 -2508
  8. package/dist/vuetify-labs.d.ts +5127 -5085
  9. package/dist/vuetify-labs.esm.js +10054 -10050
  10. package/dist/vuetify-labs.esm.js.map +1 -1
  11. package/dist/vuetify-labs.js +10054 -10050
  12. package/dist/vuetify-labs.min.css +2 -2
  13. package/dist/vuetify.css +1021 -844
  14. package/dist/vuetify.d.ts +3125 -785
  15. package/dist/vuetify.esm.js +1722 -892
  16. package/dist/vuetify.esm.js.map +1 -1
  17. package/dist/vuetify.js +1722 -892
  18. package/dist/vuetify.js.map +1 -1
  19. package/dist/vuetify.min.css +2 -2
  20. package/dist/vuetify.min.js +614 -560
  21. package/dist/vuetify.min.js.map +1 -1
  22. package/lib/components/VAutocomplete/index.d.mts +18 -18
  23. package/lib/components/VBottomSheet/index.d.mts +15 -9
  24. package/lib/components/VCombobox/index.d.mts +18 -18
  25. package/lib/{labs → components}/VConfirmEdit/VConfirmEdit.mjs +1 -1
  26. package/lib/components/VConfirmEdit/VConfirmEdit.mjs.map +1 -0
  27. package/lib/components/VConfirmEdit/__test__/VConfirmEdit.spec.cy.mjs.map +1 -0
  28. package/lib/components/VConfirmEdit/index.mjs.map +1 -0
  29. package/lib/components/VDataTable/VDataTableHeaders.mjs +2 -0
  30. package/lib/components/VDataTable/VDataTableHeaders.mjs.map +1 -1
  31. package/lib/components/VDatePicker/VDatePicker.mjs +2 -2
  32. package/lib/components/VDatePicker/VDatePicker.mjs.map +1 -1
  33. package/lib/components/VDialog/index.d.mts +33 -27
  34. package/lib/{labs → components}/VEmptyState/VEmptyState.mjs +4 -4
  35. package/lib/components/VEmptyState/VEmptyState.mjs.map +1 -0
  36. package/lib/components/VEmptyState/index.mjs.map +1 -0
  37. package/lib/{labs → components}/VFab/VFab.mjs +1 -1
  38. package/lib/components/VFab/VFab.mjs.map +1 -0
  39. package/lib/components/VFab/index.mjs.map +1 -0
  40. package/lib/components/VFileInput/VFileInput.mjs.map +1 -1
  41. package/lib/components/VFileInput/index.d.mts +6 -6
  42. package/lib/components/VHover/VHover.mjs +1 -1
  43. package/lib/components/VHover/VHover.mjs.map +1 -1
  44. package/lib/components/VHover/index.d.mts +24 -24
  45. package/lib/components/VMenu/index.d.mts +33 -27
  46. package/lib/components/VOverlay/VOverlay.mjs +5 -2
  47. package/lib/components/VOverlay/VOverlay.mjs.map +1 -1
  48. package/lib/components/VOverlay/index.d.mts +15 -9
  49. package/lib/components/VSelect/index.d.mts +18 -18
  50. package/lib/components/VSnackbar/VSnackbar.mjs.map +1 -1
  51. package/lib/components/VSnackbar/index.d.mts +47 -41
  52. package/lib/components/VSparkline/VBarline.mjs.map +1 -0
  53. package/lib/components/VSparkline/VSparkline.mjs +44 -320
  54. package/lib/components/VSparkline/VSparkline.mjs.map +1 -1
  55. package/lib/components/VSparkline/VTrendline.mjs.map +1 -0
  56. package/lib/components/VSparkline/index.mjs +1 -3
  57. package/lib/components/VSparkline/index.mjs.map +1 -1
  58. package/lib/components/VSparkline/util/line.mjs.map +1 -0
  59. package/lib/components/VSparkline/util/path.mjs.map +1 -0
  60. package/lib/components/VSpeedDial/VSpeedDial.mjs +68 -85
  61. package/lib/components/VSpeedDial/VSpeedDial.mjs.map +1 -1
  62. package/lib/components/VSpeedDial/VSpeedDial.sass +20 -72
  63. package/lib/{labs → components}/VSpeedDial/index.d.mts +15 -9
  64. package/lib/components/VSpeedDial/index.mjs +1 -3
  65. package/lib/components/VSpeedDial/index.mjs.map +1 -1
  66. package/lib/components/VTooltip/index.d.mts +33 -27
  67. package/lib/components/index.d.mts +3088 -753
  68. package/lib/components/index.mjs +6 -2
  69. package/lib/components/index.mjs.map +1 -1
  70. package/lib/composables/date/adapters/vuetify.mjs +1 -0
  71. package/lib/composables/date/adapters/vuetify.mjs.map +1 -1
  72. package/lib/composables/directiveComponent.mjs +1 -3
  73. package/lib/composables/directiveComponent.mjs.map +1 -1
  74. package/lib/entry-bundler.mjs +1 -1
  75. package/lib/framework.mjs +1 -1
  76. package/lib/index.d.mts +49 -49
  77. package/lib/labs/VDateInput/VDateInput.mjs +2 -2
  78. package/lib/labs/VDateInput/VDateInput.mjs.map +1 -1
  79. package/lib/labs/VDateInput/index.d.mts +14 -14
  80. package/lib/labs/VSnackbarQueue/index.d.mts +47 -41
  81. package/lib/labs/components.d.mts +1672 -3983
  82. package/lib/labs/components.mjs +0 -5
  83. package/lib/labs/components.mjs.map +1 -1
  84. package/package.json +2 -2
  85. package/lib/components/VSparkline/helpers/core.mjs +0 -49
  86. package/lib/components/VSparkline/helpers/core.mjs.map +0 -1
  87. package/lib/components/VSparkline/helpers/math.mjs +0 -34
  88. package/lib/components/VSparkline/helpers/math.mjs.map +0 -1
  89. package/lib/components/VSparkline/helpers/path.mjs +0 -27
  90. package/lib/components/VSparkline/helpers/path.mjs.map +0 -1
  91. package/lib/components/VSpeedDial/_variables.scss +0 -5
  92. package/lib/labs/VConfirmEdit/VConfirmEdit.mjs.map +0 -1
  93. package/lib/labs/VConfirmEdit/__test__/VConfirmEdit.spec.cy.mjs.map +0 -1
  94. package/lib/labs/VConfirmEdit/index.mjs.map +0 -1
  95. package/lib/labs/VEmptyState/VEmptyState.mjs.map +0 -1
  96. package/lib/labs/VEmptyState/index.mjs.map +0 -1
  97. package/lib/labs/VFab/VFab.mjs.map +0 -1
  98. package/lib/labs/VFab/index.mjs.map +0 -1
  99. package/lib/labs/VSparkline/VBarline.mjs.map +0 -1
  100. package/lib/labs/VSparkline/VSparkline.mjs +0 -49
  101. package/lib/labs/VSparkline/VSparkline.mjs.map +0 -1
  102. package/lib/labs/VSparkline/VTrendline.mjs.map +0 -1
  103. package/lib/labs/VSparkline/index.mjs +0 -2
  104. package/lib/labs/VSparkline/index.mjs.map +0 -1
  105. package/lib/labs/VSparkline/util/line.mjs.map +0 -1
  106. package/lib/labs/VSparkline/util/path.mjs.map +0 -1
  107. package/lib/labs/VSpeedDial/VSpeedDial.mjs +0 -76
  108. package/lib/labs/VSpeedDial/VSpeedDial.mjs.map +0 -1
  109. package/lib/labs/VSpeedDial/VSpeedDial.sass +0 -27
  110. package/lib/labs/VSpeedDial/index.mjs +0 -2
  111. package/lib/labs/VSpeedDial/index.mjs.map +0 -1
  112. /package/lib/{labs → components}/VConfirmEdit/__test__/VConfirmEdit.spec.cy.mjs +0 -0
  113. /package/lib/{labs → components}/VConfirmEdit/index.d.mts +0 -0
  114. /package/lib/{labs → components}/VConfirmEdit/index.mjs +0 -0
  115. /package/lib/{labs → components}/VEmptyState/VEmptyState.css +0 -0
  116. /package/lib/{labs → components}/VEmptyState/VEmptyState.sass +0 -0
  117. /package/lib/{labs → components}/VEmptyState/_variables.scss +0 -0
  118. /package/lib/{labs → components}/VEmptyState/index.d.mts +0 -0
  119. /package/lib/{labs → components}/VEmptyState/index.mjs +0 -0
  120. /package/lib/{labs → components}/VFab/VFab.css +0 -0
  121. /package/lib/{labs → components}/VFab/VFab.sass +0 -0
  122. /package/lib/{labs → components}/VFab/_mixins.scss +0 -0
  123. /package/lib/{labs → components}/VFab/_variables.scss +0 -0
  124. /package/lib/{labs → components}/VFab/index.d.mts +0 -0
  125. /package/lib/{labs → components}/VFab/index.mjs +0 -0
  126. /package/lib/{labs → components}/VSparkline/VBarline.mjs +0 -0
  127. /package/lib/{labs → components}/VSparkline/VTrendline.mjs +0 -0
  128. /package/lib/{labs → components}/VSparkline/index.d.mts +0 -0
  129. /package/lib/{labs → components}/VSparkline/util/line.mjs +0 -0
  130. /package/lib/{labs → components}/VSparkline/util/path.mjs +0 -0
  131. /package/lib/{labs → components}/VSpeedDial/VSpeedDial.css +0 -0
package/dist/vuetify.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.6.0
2
+ * Vuetify v3.6.2
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -10918,7 +10918,10 @@
10918
10918
  disabled: Boolean,
10919
10919
  opacity: [Number, String],
10920
10920
  noClickAnimation: Boolean,
10921
- modelValue: Boolean,
10921
+ modelValue: {
10922
+ type: Boolean,
10923
+ default: null
10924
+ },
10922
10925
  persistent: Boolean,
10923
10926
  scrim: {
10924
10927
  type: [Boolean, String],
@@ -10961,7 +10964,7 @@
10961
10964
  } = _ref;
10962
10965
  const model = useProxiedModel(props, 'modelValue');
10963
10966
  const isActive = vue.computed({
10964
- get: () => model.value,
10967
+ get: () => Boolean(model.value),
10965
10968
  set: v => {
10966
10969
  if (!(v && props.disabled)) model.value = v;
10967
10970
  }
@@ -17276,764 +17279,255 @@
17276
17279
  }
17277
17280
  });
17278
17281
 
17279
- // Composables
17282
+ // Utilities
17280
17283
 
17281
17284
  // Types
17282
17285
 
17283
- const makeDataTableExpandProps = propsFactory({
17284
- expandOnClick: Boolean,
17285
- showExpand: Boolean,
17286
- expanded: {
17287
- type: Array,
17288
- default: () => []
17286
+ const firstDay = {
17287
+ '001': 1,
17288
+ AD: 1,
17289
+ AE: 6,
17290
+ AF: 6,
17291
+ AG: 0,
17292
+ AI: 1,
17293
+ AL: 1,
17294
+ AM: 1,
17295
+ AN: 1,
17296
+ AR: 1,
17297
+ AS: 0,
17298
+ AT: 1,
17299
+ AU: 1,
17300
+ AX: 1,
17301
+ AZ: 1,
17302
+ BA: 1,
17303
+ BD: 0,
17304
+ BE: 1,
17305
+ BG: 1,
17306
+ BH: 6,
17307
+ BM: 1,
17308
+ BN: 1,
17309
+ BR: 0,
17310
+ BS: 0,
17311
+ BT: 0,
17312
+ BW: 0,
17313
+ BY: 1,
17314
+ BZ: 0,
17315
+ CA: 0,
17316
+ CH: 1,
17317
+ CL: 1,
17318
+ CM: 1,
17319
+ CN: 1,
17320
+ CO: 0,
17321
+ CR: 1,
17322
+ CY: 1,
17323
+ CZ: 1,
17324
+ DE: 1,
17325
+ DJ: 6,
17326
+ DK: 1,
17327
+ DM: 0,
17328
+ DO: 0,
17329
+ DZ: 6,
17330
+ EC: 1,
17331
+ EE: 1,
17332
+ EG: 6,
17333
+ ES: 1,
17334
+ ET: 0,
17335
+ FI: 1,
17336
+ FJ: 1,
17337
+ FO: 1,
17338
+ FR: 1,
17339
+ GB: 1,
17340
+ 'GB-alt-variant': 0,
17341
+ GE: 1,
17342
+ GF: 1,
17343
+ GP: 1,
17344
+ GR: 1,
17345
+ GT: 0,
17346
+ GU: 0,
17347
+ HK: 0,
17348
+ HN: 0,
17349
+ HR: 1,
17350
+ HU: 1,
17351
+ ID: 0,
17352
+ IE: 1,
17353
+ IL: 0,
17354
+ IN: 0,
17355
+ IQ: 6,
17356
+ IR: 6,
17357
+ IS: 1,
17358
+ IT: 1,
17359
+ JM: 0,
17360
+ JO: 6,
17361
+ JP: 0,
17362
+ KE: 0,
17363
+ KG: 1,
17364
+ KH: 0,
17365
+ KR: 0,
17366
+ KW: 6,
17367
+ KZ: 1,
17368
+ LA: 0,
17369
+ LB: 1,
17370
+ LI: 1,
17371
+ LK: 1,
17372
+ LT: 1,
17373
+ LU: 1,
17374
+ LV: 1,
17375
+ LY: 6,
17376
+ MC: 1,
17377
+ MD: 1,
17378
+ ME: 1,
17379
+ MH: 0,
17380
+ MK: 1,
17381
+ MM: 0,
17382
+ MN: 1,
17383
+ MO: 0,
17384
+ MQ: 1,
17385
+ MT: 0,
17386
+ MV: 5,
17387
+ MX: 0,
17388
+ MY: 1,
17389
+ MZ: 0,
17390
+ NI: 0,
17391
+ NL: 1,
17392
+ NO: 1,
17393
+ NP: 0,
17394
+ NZ: 1,
17395
+ OM: 6,
17396
+ PA: 0,
17397
+ PE: 0,
17398
+ PH: 0,
17399
+ PK: 0,
17400
+ PL: 1,
17401
+ PR: 0,
17402
+ PT: 0,
17403
+ PY: 0,
17404
+ QA: 6,
17405
+ RE: 1,
17406
+ RO: 1,
17407
+ RS: 1,
17408
+ RU: 1,
17409
+ SA: 0,
17410
+ SD: 6,
17411
+ SE: 1,
17412
+ SG: 0,
17413
+ SI: 1,
17414
+ SK: 1,
17415
+ SM: 1,
17416
+ SV: 0,
17417
+ SY: 6,
17418
+ TH: 0,
17419
+ TJ: 1,
17420
+ TM: 1,
17421
+ TR: 1,
17422
+ TT: 0,
17423
+ TW: 0,
17424
+ UA: 1,
17425
+ UM: 0,
17426
+ US: 0,
17427
+ UY: 1,
17428
+ UZ: 1,
17429
+ VA: 1,
17430
+ VE: 0,
17431
+ VI: 0,
17432
+ VN: 1,
17433
+ WS: 0,
17434
+ XK: 1,
17435
+ YE: 0,
17436
+ ZA: 0,
17437
+ ZW: 0
17438
+ };
17439
+ function getWeekArray(date, locale) {
17440
+ const weeks = [];
17441
+ let currentWeek = [];
17442
+ const firstDayOfMonth = startOfMonth(date);
17443
+ const lastDayOfMonth = endOfMonth(date);
17444
+ const firstDayWeekIndex = (firstDayOfMonth.getDay() - firstDay[locale.slice(-2).toUpperCase()] + 7) % 7;
17445
+ const lastDayWeekIndex = (lastDayOfMonth.getDay() - firstDay[locale.slice(-2).toUpperCase()] + 7) % 7;
17446
+ for (let i = 0; i < firstDayWeekIndex; i++) {
17447
+ const adjacentDay = new Date(firstDayOfMonth);
17448
+ adjacentDay.setDate(adjacentDay.getDate() - (firstDayWeekIndex - i));
17449
+ currentWeek.push(adjacentDay);
17289
17450
  }
17290
- }, 'DataTable-expand');
17291
- const VDataTableExpandedKey = Symbol.for('vuetify:datatable:expanded');
17292
- function provideExpanded(props) {
17293
- const expandOnClick = vue.toRef(props, 'expandOnClick');
17294
- const expanded = useProxiedModel(props, 'expanded', props.expanded, v => {
17295
- return new Set(v);
17296
- }, v => {
17297
- return [...v.values()];
17298
- });
17299
- function expand(item, value) {
17300
- const newExpanded = new Set(expanded.value);
17301
- if (!value) {
17302
- newExpanded.delete(item.value);
17303
- } else {
17304
- newExpanded.add(item.value);
17451
+ for (let i = 1; i <= lastDayOfMonth.getDate(); i++) {
17452
+ const day = new Date(date.getFullYear(), date.getMonth(), i);
17453
+
17454
+ // Add the day to the current week
17455
+ currentWeek.push(day);
17456
+
17457
+ // If the current week has 7 days, add it to the weeks array and start a new week
17458
+ if (currentWeek.length === 7) {
17459
+ weeks.push(currentWeek);
17460
+ currentWeek = [];
17305
17461
  }
17306
- expanded.value = newExpanded;
17307
17462
  }
17308
- function isExpanded(item) {
17309
- return expanded.value.has(item.value);
17463
+ for (let i = 1; i < 7 - lastDayWeekIndex; i++) {
17464
+ const adjacentDay = new Date(lastDayOfMonth);
17465
+ adjacentDay.setDate(adjacentDay.getDate() + i);
17466
+ currentWeek.push(adjacentDay);
17310
17467
  }
17311
- function toggleExpand(item) {
17312
- expand(item, !isExpanded(item));
17468
+ if (currentWeek.length > 0) {
17469
+ weeks.push(currentWeek);
17313
17470
  }
17314
- const data = {
17315
- expand,
17316
- expanded,
17317
- expandOnClick,
17318
- isExpanded,
17319
- toggleExpand
17320
- };
17321
- vue.provide(VDataTableExpandedKey, data);
17322
- return data;
17471
+ return weeks;
17323
17472
  }
17324
- function useExpanded() {
17325
- const data = vue.inject(VDataTableExpandedKey);
17326
- if (!data) throw new Error('foo');
17327
- return data;
17473
+ function startOfWeek(date, locale) {
17474
+ const d = new Date(date);
17475
+ while (d.getDay() !== (firstDay[locale.slice(-2).toUpperCase()] ?? 0)) {
17476
+ d.setDate(d.getDate() - 1);
17477
+ }
17478
+ return d;
17328
17479
  }
17329
-
17330
- // Composables
17331
-
17332
- // Types
17333
-
17334
- const makeDataTableGroupProps = propsFactory({
17335
- groupBy: {
17336
- type: Array,
17337
- default: () => []
17480
+ function endOfWeek(date, locale) {
17481
+ const d = new Date(date);
17482
+ const lastDay = ((firstDay[locale.slice(-2).toUpperCase()] ?? 0) + 6) % 7;
17483
+ while (d.getDay() !== lastDay) {
17484
+ d.setDate(d.getDate() + 1);
17338
17485
  }
17339
- }, 'DataTable-group');
17340
- const VDataTableGroupSymbol = Symbol.for('vuetify:data-table-group');
17341
- function createGroupBy(props) {
17342
- const groupBy = useProxiedModel(props, 'groupBy');
17343
- return {
17344
- groupBy
17345
- };
17486
+ return d;
17346
17487
  }
17347
- function provideGroupBy(options) {
17348
- const {
17349
- groupBy,
17350
- sortBy
17351
- } = options;
17352
- const opened = vue.ref(new Set());
17353
- const sortByWithGroups = vue.computed(() => {
17354
- return groupBy.value.map(val => ({
17355
- ...val,
17356
- order: val.order ?? false
17357
- })).concat(sortBy.value);
17358
- });
17359
- function isGroupOpen(group) {
17360
- return opened.value.has(group.id);
17361
- }
17362
- function toggleGroup(group) {
17363
- const newOpened = new Set(opened.value);
17364
- if (!isGroupOpen(group)) newOpened.add(group.id);else newOpened.delete(group.id);
17365
- opened.value = newOpened;
17366
- }
17367
- function extractRows(items) {
17368
- function dive(group) {
17369
- const arr = [];
17370
- for (const item of group.items) {
17371
- if ('type' in item && item.type === 'group') {
17372
- arr.push(...dive(item));
17373
- } else {
17374
- arr.push(item);
17375
- }
17376
- }
17377
- return arr;
17378
- }
17379
- return dive({
17380
- type: 'group',
17381
- items,
17382
- id: 'dummy',
17383
- key: 'dummy',
17384
- value: 'dummy',
17385
- depth: 0
17386
- });
17387
- }
17388
-
17389
- // onBeforeMount(() => {
17390
- // for (const key of groupedItems.value.keys()) {
17391
- // opened.value.add(key)
17392
- // }
17393
- // })
17394
-
17395
- const data = {
17396
- sortByWithGroups,
17397
- toggleGroup,
17398
- opened,
17399
- groupBy,
17400
- extractRows,
17401
- isGroupOpen
17402
- };
17403
- vue.provide(VDataTableGroupSymbol, data);
17404
- return data;
17405
- }
17406
- function useGroupBy() {
17407
- const data = vue.inject(VDataTableGroupSymbol);
17408
- if (!data) throw new Error('Missing group!');
17409
- return data;
17488
+ function startOfMonth(date) {
17489
+ return new Date(date.getFullYear(), date.getMonth(), 1);
17410
17490
  }
17411
- function groupItemsByProperty(items, groupBy) {
17412
- if (!items.length) return [];
17413
- const groups = new Map();
17414
- for (const item of items) {
17415
- const value = getObjectValueByPath(item.raw, groupBy);
17416
- if (!groups.has(value)) {
17417
- groups.set(value, []);
17418
- }
17419
- groups.get(value).push(item);
17420
- }
17421
- return groups;
17491
+ function endOfMonth(date) {
17492
+ return new Date(date.getFullYear(), date.getMonth() + 1, 0);
17422
17493
  }
17423
- function groupItems(items, groupBy) {
17424
- let depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
17425
- let prefix = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'root';
17426
- if (!groupBy.length) return [];
17427
- const groupedItems = groupItemsByProperty(items, groupBy[0]);
17428
- const groups = [];
17429
- const rest = groupBy.slice(1);
17430
- groupedItems.forEach((items, value) => {
17431
- const key = groupBy[0];
17432
- const id = `${prefix}_${key}_${value}`;
17433
- groups.push({
17434
- depth,
17435
- id,
17436
- key,
17437
- value,
17438
- items: rest.length ? groupItems(items, rest, depth + 1, id) : items,
17439
- type: 'group'
17440
- });
17441
- });
17442
- return groups;
17494
+ function parseLocalDate(value) {
17495
+ const parts = value.split('-').map(Number);
17496
+
17497
+ // new Date() uses local time zone when passing individual date component values
17498
+ return new Date(parts[0], parts[1] - 1, parts[2]);
17443
17499
  }
17444
- function flattenItems(items, opened) {
17445
- const flatItems = [];
17446
- for (const item of items) {
17447
- // TODO: make this better
17448
- if ('type' in item && item.type === 'group') {
17449
- if (item.value != null) {
17450
- flatItems.push(item);
17451
- }
17452
- if (opened.has(item.id) || item.value == null) {
17453
- flatItems.push(...flattenItems(item.items, opened));
17454
- }
17500
+ const _YYYMMDD = /^([12]\d{3}-([1-9]|0[1-9]|1[0-2])-([1-9]|0[1-9]|[12]\d|3[01]))$/;
17501
+ function date(value) {
17502
+ if (value == null) return new Date();
17503
+ if (value instanceof Date) return value;
17504
+ if (typeof value === 'string') {
17505
+ let parsed;
17506
+ if (_YYYMMDD.test(value)) {
17507
+ return parseLocalDate(value);
17455
17508
  } else {
17456
- flatItems.push(item);
17509
+ parsed = Date.parse(value);
17457
17510
  }
17511
+ if (!isNaN(parsed)) return new Date(parsed);
17458
17512
  }
17459
- return flatItems;
17460
- }
17461
- function useGroupedItems(items, groupBy, opened) {
17462
- const flatItems = vue.computed(() => {
17463
- if (!groupBy.value.length) return items.value;
17464
- const groupedItems = groupItems(items.value, groupBy.value.map(item => item.key));
17465
- return flattenItems(groupedItems, opened.value);
17466
- });
17467
- return {
17468
- flatItems
17469
- };
17513
+ return null;
17470
17514
  }
17471
-
17472
- // Utilities
17473
-
17474
- // Types
17475
-
17476
- function useOptions(_ref) {
17477
- let {
17478
- page,
17479
- itemsPerPage,
17480
- sortBy,
17481
- groupBy,
17482
- search
17483
- } = _ref;
17484
- const vm = getCurrentInstance('VDataTable');
17485
- const options = vue.computed(() => ({
17486
- page: page.value,
17487
- itemsPerPage: itemsPerPage.value,
17488
- sortBy: sortBy.value,
17489
- groupBy: groupBy.value,
17490
- search: search.value
17491
- }));
17492
- let oldOptions = null;
17493
- vue.watch(options, () => {
17494
- if (deepEqual(oldOptions, options.value)) return;
17495
-
17496
- // Reset page when searching
17497
- if (oldOptions && oldOptions.search !== options.value.search) {
17498
- page.value = 1;
17499
- }
17500
- vm.emit('update:options', options.value);
17501
- oldOptions = options.value;
17502
- }, {
17503
- deep: true,
17504
- immediate: true
17515
+ const sundayJanuarySecond2000 = new Date(2000, 0, 2);
17516
+ function getWeekdays(locale) {
17517
+ const daysFromSunday = firstDay[locale.slice(-2).toUpperCase()];
17518
+ return createRange(7).map(i => {
17519
+ const weekday = new Date(sundayJanuarySecond2000);
17520
+ weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
17521
+ return new Intl.DateTimeFormat(locale, {
17522
+ weekday: 'narrow'
17523
+ }).format(weekday);
17505
17524
  });
17506
17525
  }
17507
-
17508
- // Composables
17509
-
17510
- // Types
17511
-
17512
- const makeDataTablePaginateProps = propsFactory({
17513
- page: {
17514
- type: [Number, String],
17515
- default: 1
17516
- },
17517
- itemsPerPage: {
17518
- type: [Number, String],
17519
- default: 10
17520
- }
17521
- }, 'DataTable-paginate');
17522
- const VDataTablePaginationSymbol = Symbol.for('vuetify:data-table-pagination');
17523
- function createPagination(props) {
17524
- const page = useProxiedModel(props, 'page', undefined, value => +(value ?? 1));
17525
- const itemsPerPage = useProxiedModel(props, 'itemsPerPage', undefined, value => +(value ?? 10));
17526
- return {
17527
- page,
17528
- itemsPerPage
17529
- };
17530
- }
17531
- function providePagination(options) {
17532
- const {
17533
- page,
17534
- itemsPerPage,
17535
- itemsLength
17536
- } = options;
17537
- const startIndex = vue.computed(() => {
17538
- if (itemsPerPage.value === -1) return 0;
17539
- return itemsPerPage.value * (page.value - 1);
17540
- });
17541
- const stopIndex = vue.computed(() => {
17542
- if (itemsPerPage.value === -1) return itemsLength.value;
17543
- return Math.min(itemsLength.value, startIndex.value + itemsPerPage.value);
17544
- });
17545
- const pageCount = vue.computed(() => {
17546
- if (itemsPerPage.value === -1 || itemsLength.value === 0) return 1;
17547
- return Math.ceil(itemsLength.value / itemsPerPage.value);
17548
- });
17549
- vue.watchEffect(() => {
17550
- if (page.value > pageCount.value) {
17551
- page.value = pageCount.value;
17552
- }
17553
- });
17554
- function setItemsPerPage(value) {
17555
- itemsPerPage.value = value;
17556
- page.value = 1;
17557
- }
17558
- function nextPage() {
17559
- page.value = clamp(page.value + 1, 1, pageCount.value);
17560
- }
17561
- function prevPage() {
17562
- page.value = clamp(page.value - 1, 1, pageCount.value);
17563
- }
17564
- function setPage(value) {
17565
- page.value = clamp(value, 1, pageCount.value);
17566
- }
17567
- const data = {
17568
- page,
17569
- itemsPerPage,
17570
- startIndex,
17571
- stopIndex,
17572
- pageCount,
17573
- itemsLength,
17574
- nextPage,
17575
- prevPage,
17576
- setPage,
17577
- setItemsPerPage
17578
- };
17579
- vue.provide(VDataTablePaginationSymbol, data);
17580
- return data;
17581
- }
17582
- function usePagination() {
17583
- const data = vue.inject(VDataTablePaginationSymbol);
17584
- if (!data) throw new Error('Missing pagination!');
17585
- return data;
17586
- }
17587
- function usePaginatedItems(options) {
17588
- const vm = getCurrentInstance('usePaginatedItems');
17589
- const {
17590
- items,
17591
- startIndex,
17592
- stopIndex,
17593
- itemsPerPage
17594
- } = options;
17595
- const paginatedItems = vue.computed(() => {
17596
- if (itemsPerPage.value <= 0) return items.value;
17597
- return items.value.slice(startIndex.value, stopIndex.value);
17598
- });
17599
- vue.watch(paginatedItems, val => {
17600
- vm.emit('update:currentItems', val);
17601
- });
17602
- return {
17603
- paginatedItems
17604
- };
17605
- }
17606
-
17607
- // Composables
17608
-
17609
- // Types
17610
-
17611
- const singleSelectStrategy = {
17612
- showSelectAll: false,
17613
- allSelected: () => [],
17614
- select: _ref => {
17615
- let {
17616
- items,
17617
- value
17618
- } = _ref;
17619
- return new Set(value ? [vue.toRaw(items[0]?.value)] : []);
17620
- },
17621
- selectAll: _ref2 => {
17622
- let {
17623
- selected
17624
- } = _ref2;
17625
- return selected;
17626
- }
17627
- };
17628
- const pageSelectStrategy = {
17629
- showSelectAll: true,
17630
- allSelected: _ref3 => {
17631
- let {
17632
- currentPage
17633
- } = _ref3;
17634
- return currentPage;
17635
- },
17636
- select: _ref4 => {
17637
- let {
17638
- items,
17639
- value,
17640
- selected
17641
- } = _ref4;
17642
- for (const item of items) {
17643
- if (value) selected.add(vue.toRaw(item.value));else selected.delete(vue.toRaw(item.value));
17644
- }
17645
- return selected;
17646
- },
17647
- selectAll: _ref5 => {
17648
- let {
17649
- value,
17650
- currentPage,
17651
- selected
17652
- } = _ref5;
17653
- return pageSelectStrategy.select({
17654
- items: currentPage,
17655
- value,
17656
- selected
17657
- });
17658
- }
17659
- };
17660
- const allSelectStrategy = {
17661
- showSelectAll: true,
17662
- allSelected: _ref6 => {
17663
- let {
17664
- allItems
17665
- } = _ref6;
17666
- return allItems;
17667
- },
17668
- select: _ref7 => {
17669
- let {
17670
- items,
17671
- value,
17672
- selected
17673
- } = _ref7;
17674
- for (const item of items) {
17675
- if (value) selected.add(vue.toRaw(item.value));else selected.delete(vue.toRaw(item.value));
17676
- }
17677
- return selected;
17678
- },
17679
- selectAll: _ref8 => {
17680
- let {
17681
- value,
17682
- allItems,
17683
- selected
17684
- } = _ref8;
17685
- return allSelectStrategy.select({
17686
- items: allItems,
17687
- value,
17688
- selected
17689
- });
17690
- }
17691
- };
17692
- const makeDataTableSelectProps = propsFactory({
17693
- showSelect: Boolean,
17694
- selectStrategy: {
17695
- type: [String, Object],
17696
- default: 'page'
17697
- },
17698
- modelValue: {
17699
- type: Array,
17700
- default: () => []
17701
- },
17702
- valueComparator: {
17703
- type: Function,
17704
- default: deepEqual
17705
- }
17706
- }, 'DataTable-select');
17707
- const VDataTableSelectionSymbol = Symbol.for('vuetify:data-table-selection');
17708
- function provideSelection(props, _ref9) {
17709
- let {
17710
- allItems,
17711
- currentPage
17712
- } = _ref9;
17713
- const selected = useProxiedModel(props, 'modelValue', props.modelValue, v => {
17714
- return new Set(wrapInArray(v).map(v => {
17715
- return allItems.value.find(item => props.valueComparator(v, item.value))?.value ?? v;
17716
- }));
17717
- }, v => {
17718
- return [...v.values()];
17719
- });
17720
- const allSelectable = vue.computed(() => allItems.value.filter(item => item.selectable));
17721
- const currentPageSelectable = vue.computed(() => currentPage.value.filter(item => item.selectable));
17722
- const selectStrategy = vue.computed(() => {
17723
- if (typeof props.selectStrategy === 'object') return props.selectStrategy;
17724
- switch (props.selectStrategy) {
17725
- case 'single':
17726
- return singleSelectStrategy;
17727
- case 'all':
17728
- return allSelectStrategy;
17729
- case 'page':
17730
- default:
17731
- return pageSelectStrategy;
17732
- }
17733
- });
17734
- function isSelected(items) {
17735
- return wrapInArray(items).every(item => selected.value.has(vue.toRaw(item.value)));
17736
- }
17737
- function isSomeSelected(items) {
17738
- return wrapInArray(items).some(item => selected.value.has(vue.toRaw(item.value)));
17739
- }
17740
- function select(items, value) {
17741
- const newSelected = selectStrategy.value.select({
17742
- items,
17743
- value,
17744
- selected: new Set(selected.value)
17745
- });
17746
- selected.value = newSelected;
17747
- }
17748
- function toggleSelect(item) {
17749
- const newItem = vue.toRef(item);
17750
- select([newItem.value], !isSelected([newItem.value]));
17751
- }
17752
- function selectAll(value) {
17753
- const newSelected = selectStrategy.value.selectAll({
17754
- value,
17755
- allItems: allSelectable.value,
17756
- currentPage: currentPageSelectable.value,
17757
- selected: new Set(selected.value)
17758
- });
17759
- selected.value = newSelected;
17760
- }
17761
- const someSelected = vue.computed(() => selected.value.size > 0);
17762
- const allSelected = vue.computed(() => {
17763
- const items = selectStrategy.value.allSelected({
17764
- allItems: allSelectable.value,
17765
- currentPage: currentPageSelectable.value
17766
- });
17767
- return !!items.length && isSelected(items);
17768
- });
17769
- const data = {
17770
- toggleSelect,
17771
- select,
17772
- selectAll,
17773
- isSelected,
17774
- isSomeSelected,
17775
- someSelected,
17776
- allSelected,
17777
- showSelectAll: selectStrategy.value.showSelectAll
17778
- };
17779
- vue.provide(VDataTableSelectionSymbol, data);
17780
- return data;
17781
- }
17782
- function useSelection() {
17783
- const data = vue.inject(VDataTableSelectionSymbol);
17784
- if (!data) throw new Error('Missing selection!');
17785
- return data;
17786
- }
17787
-
17788
- // Utilities
17789
-
17790
- // Types
17791
-
17792
- const firstDay = {
17793
- '001': 1,
17794
- AD: 1,
17795
- AE: 6,
17796
- AF: 6,
17797
- AG: 0,
17798
- AI: 1,
17799
- AL: 1,
17800
- AM: 1,
17801
- AN: 1,
17802
- AR: 1,
17803
- AS: 0,
17804
- AT: 1,
17805
- AU: 1,
17806
- AX: 1,
17807
- AZ: 1,
17808
- BA: 1,
17809
- BD: 0,
17810
- BE: 1,
17811
- BG: 1,
17812
- BH: 6,
17813
- BM: 1,
17814
- BN: 1,
17815
- BR: 0,
17816
- BS: 0,
17817
- BT: 0,
17818
- BW: 0,
17819
- BY: 1,
17820
- BZ: 0,
17821
- CA: 0,
17822
- CH: 1,
17823
- CL: 1,
17824
- CM: 1,
17825
- CN: 1,
17826
- CO: 0,
17827
- CR: 1,
17828
- CY: 1,
17829
- CZ: 1,
17830
- DE: 1,
17831
- DJ: 6,
17832
- DK: 1,
17833
- DM: 0,
17834
- DO: 0,
17835
- DZ: 6,
17836
- EC: 1,
17837
- EE: 1,
17838
- EG: 6,
17839
- ES: 1,
17840
- ET: 0,
17841
- FI: 1,
17842
- FJ: 1,
17843
- FO: 1,
17844
- FR: 1,
17845
- GB: 1,
17846
- 'GB-alt-variant': 0,
17847
- GE: 1,
17848
- GF: 1,
17849
- GP: 1,
17850
- GR: 1,
17851
- GT: 0,
17852
- GU: 0,
17853
- HK: 0,
17854
- HN: 0,
17855
- HR: 1,
17856
- HU: 1,
17857
- ID: 0,
17858
- IE: 1,
17859
- IL: 0,
17860
- IN: 0,
17861
- IQ: 6,
17862
- IR: 6,
17863
- IS: 1,
17864
- IT: 1,
17865
- JM: 0,
17866
- JO: 6,
17867
- JP: 0,
17868
- KE: 0,
17869
- KG: 1,
17870
- KH: 0,
17871
- KR: 0,
17872
- KW: 6,
17873
- KZ: 1,
17874
- LA: 0,
17875
- LB: 1,
17876
- LI: 1,
17877
- LK: 1,
17878
- LT: 1,
17879
- LU: 1,
17880
- LV: 1,
17881
- LY: 6,
17882
- MC: 1,
17883
- MD: 1,
17884
- ME: 1,
17885
- MH: 0,
17886
- MK: 1,
17887
- MM: 0,
17888
- MN: 1,
17889
- MO: 0,
17890
- MQ: 1,
17891
- MT: 0,
17892
- MV: 5,
17893
- MX: 0,
17894
- MY: 1,
17895
- MZ: 0,
17896
- NI: 0,
17897
- NL: 1,
17898
- NO: 1,
17899
- NP: 0,
17900
- NZ: 1,
17901
- OM: 6,
17902
- PA: 0,
17903
- PE: 0,
17904
- PH: 0,
17905
- PK: 0,
17906
- PL: 1,
17907
- PR: 0,
17908
- PT: 0,
17909
- PY: 0,
17910
- QA: 6,
17911
- RE: 1,
17912
- RO: 1,
17913
- RS: 1,
17914
- RU: 1,
17915
- SA: 0,
17916
- SD: 6,
17917
- SE: 1,
17918
- SG: 0,
17919
- SI: 1,
17920
- SK: 1,
17921
- SM: 1,
17922
- SV: 0,
17923
- SY: 6,
17924
- TH: 0,
17925
- TJ: 1,
17926
- TM: 1,
17927
- TR: 1,
17928
- TT: 0,
17929
- TW: 0,
17930
- UA: 1,
17931
- UM: 0,
17932
- US: 0,
17933
- UY: 1,
17934
- UZ: 1,
17935
- VA: 1,
17936
- VE: 0,
17937
- VI: 0,
17938
- VN: 1,
17939
- WS: 0,
17940
- XK: 1,
17941
- YE: 0,
17942
- ZA: 0,
17943
- ZW: 0
17944
- };
17945
- function getWeekArray(date, locale) {
17946
- const weeks = [];
17947
- let currentWeek = [];
17948
- const firstDayOfMonth = startOfMonth(date);
17949
- const lastDayOfMonth = endOfMonth(date);
17950
- const firstDayWeekIndex = (firstDayOfMonth.getDay() - firstDay[locale.slice(-2).toUpperCase()] + 7) % 7;
17951
- const lastDayWeekIndex = (lastDayOfMonth.getDay() - firstDay[locale.slice(-2).toUpperCase()] + 7) % 7;
17952
- for (let i = 0; i < firstDayWeekIndex; i++) {
17953
- const adjacentDay = new Date(firstDayOfMonth);
17954
- adjacentDay.setDate(adjacentDay.getDate() - (firstDayWeekIndex - i));
17955
- currentWeek.push(adjacentDay);
17956
- }
17957
- for (let i = 1; i <= lastDayOfMonth.getDate(); i++) {
17958
- const day = new Date(date.getFullYear(), date.getMonth(), i);
17959
-
17960
- // Add the day to the current week
17961
- currentWeek.push(day);
17962
-
17963
- // If the current week has 7 days, add it to the weeks array and start a new week
17964
- if (currentWeek.length === 7) {
17965
- weeks.push(currentWeek);
17966
- currentWeek = [];
17967
- }
17968
- }
17969
- for (let i = 1; i < 7 - lastDayWeekIndex; i++) {
17970
- const adjacentDay = new Date(lastDayOfMonth);
17971
- adjacentDay.setDate(adjacentDay.getDate() + i);
17972
- currentWeek.push(adjacentDay);
17973
- }
17974
- if (currentWeek.length > 0) {
17975
- weeks.push(currentWeek);
17976
- }
17977
- return weeks;
17978
- }
17979
- function startOfWeek(date, locale) {
17980
- const d = new Date(date);
17981
- while (d.getDay() !== (firstDay[locale.slice(-2).toUpperCase()] ?? 0)) {
17982
- d.setDate(d.getDate() - 1);
17983
- }
17984
- return d;
17985
- }
17986
- function endOfWeek(date, locale) {
17987
- const d = new Date(date);
17988
- const lastDay = ((firstDay[locale.slice(-2).toUpperCase()] ?? 0) + 6) % 7;
17989
- while (d.getDay() !== lastDay) {
17990
- d.setDate(d.getDate() + 1);
17991
- }
17992
- return d;
17993
- }
17994
- function startOfMonth(date) {
17995
- return new Date(date.getFullYear(), date.getMonth(), 1);
17996
- }
17997
- function endOfMonth(date) {
17998
- return new Date(date.getFullYear(), date.getMonth() + 1, 0);
17999
- }
18000
- function parseLocalDate(value) {
18001
- const parts = value.split('-').map(Number);
18002
-
18003
- // new Date() uses local time zone when passing individual date component values
18004
- return new Date(parts[0], parts[1] - 1, parts[2]);
18005
- }
18006
- const _YYYMMDD = /^([12]\d{3}-([1-9]|0[1-9]|1[0-2])-([1-9]|0[1-9]|[12]\d|3[01]))$/;
18007
- function date(value) {
18008
- if (value == null) return new Date();
18009
- if (value instanceof Date) return value;
18010
- if (typeof value === 'string') {
18011
- let parsed;
18012
- if (_YYYMMDD.test(value)) {
18013
- return parseLocalDate(value);
18014
- } else {
18015
- parsed = Date.parse(value);
18016
- }
18017
- if (!isNaN(parsed)) return new Date(parsed);
18018
- }
18019
- return null;
18020
- }
18021
- const sundayJanuarySecond2000 = new Date(2000, 0, 2);
18022
- function getWeekdays(locale) {
18023
- const daysFromSunday = firstDay[locale.slice(-2).toUpperCase()];
18024
- return createRange(7).map(i => {
18025
- const weekday = new Date(sundayJanuarySecond2000);
18026
- weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
18027
- return new Intl.DateTimeFormat(locale, {
18028
- weekday: 'narrow'
18029
- }).format(weekday);
18030
- });
18031
- }
18032
- function format(value, formatString, locale, formats) {
18033
- const newDate = date(value) ?? new Date();
18034
- const customFormat = formats?.[formatString];
18035
- if (typeof customFormat === 'function') {
18036
- return customFormat(newDate, formatString, locale);
17526
+ function format(value, formatString, locale, formats) {
17527
+ const newDate = date(value) ?? new Date();
17528
+ const customFormat = formats?.[formatString];
17529
+ if (typeof customFormat === 'function') {
17530
+ return customFormat(newDate, formatString, locale);
18037
17531
  }
18038
17532
  let options = {};
18039
17533
  switch (formatString) {
@@ -18270,6 +17764,7 @@
18270
17764
  }
18271
17765
  function addMonths(date, amount) {
18272
17766
  const d = new Date(date);
17767
+ d.setDate(1);
18273
17768
  d.setMonth(d.getMonth() + amount);
18274
17769
  return d;
18275
17770
  }
@@ -18438,178 +17933,759 @@
18438
17933
  isEqual(date, comparing) {
18439
17934
  return isEqual(date, comparing);
18440
17935
  }
18441
- isValid(date) {
18442
- return isValid(date);
17936
+ isValid(date) {
17937
+ return isValid(date);
17938
+ }
17939
+ isWithinRange(date, range) {
17940
+ return isWithinRange(date, range);
17941
+ }
17942
+ isAfter(date, comparing) {
17943
+ return isAfter(date, comparing);
17944
+ }
17945
+ isAfterDay(date, comparing) {
17946
+ return isAfterDay(date, comparing);
17947
+ }
17948
+ isBefore(date, comparing) {
17949
+ return !isAfter(date, comparing) && !isEqual(date, comparing);
17950
+ }
17951
+ isSameDay(date, comparing) {
17952
+ return isSameDay(date, comparing);
17953
+ }
17954
+ isSameMonth(date, comparing) {
17955
+ return isSameMonth(date, comparing);
17956
+ }
17957
+ isSameYear(date, comparing) {
17958
+ return isSameYear(date, comparing);
17959
+ }
17960
+ setMinutes(date, count) {
17961
+ return setMinutes(date, count);
17962
+ }
17963
+ setHours(date, count) {
17964
+ return setHours(date, count);
17965
+ }
17966
+ setMonth(date, count) {
17967
+ return setMonth(date, count);
17968
+ }
17969
+ setDate(date, day) {
17970
+ return setDate(date, day);
17971
+ }
17972
+ setYear(date, year) {
17973
+ return setYear(date, year);
17974
+ }
17975
+ getDiff(date, comparing, unit) {
17976
+ return getDiff(date, comparing, unit);
17977
+ }
17978
+ getWeekdays() {
17979
+ return getWeekdays(this.locale);
17980
+ }
17981
+ getYear(date) {
17982
+ return getYear(date);
17983
+ }
17984
+ getMonth(date) {
17985
+ return getMonth(date);
17986
+ }
17987
+ getDate(date) {
17988
+ return getDate(date);
17989
+ }
17990
+ getNextMonth(date) {
17991
+ return getNextMonth(date);
17992
+ }
17993
+ getPreviousMonth(date) {
17994
+ return getPreviousMonth(date);
17995
+ }
17996
+ getHours(date) {
17997
+ return getHours(date);
17998
+ }
17999
+ getMinutes(date) {
18000
+ return getMinutes(date);
18001
+ }
18002
+ startOfDay(date) {
18003
+ return startOfDay(date);
18004
+ }
18005
+ endOfDay(date) {
18006
+ return endOfDay(date);
18007
+ }
18008
+ startOfYear(date) {
18009
+ return startOfYear(date);
18010
+ }
18011
+ endOfYear(date) {
18012
+ return endOfYear(date);
18013
+ }
18014
+ }
18015
+
18016
+ // Composables
18017
+ const DateOptionsSymbol = Symbol.for('vuetify:date-options');
18018
+ const DateAdapterSymbol = Symbol.for('vuetify:date-adapter');
18019
+ function createDate(options, locale) {
18020
+ const _options = mergeDeep({
18021
+ adapter: VuetifyDateAdapter,
18022
+ locale: {
18023
+ af: 'af-ZA',
18024
+ // ar: '', # not the same value for all variants
18025
+ bg: 'bg-BG',
18026
+ ca: 'ca-ES',
18027
+ ckb: '',
18028
+ cs: 'cs-CZ',
18029
+ de: 'de-DE',
18030
+ el: 'el-GR',
18031
+ en: 'en-US',
18032
+ // es: '', # not the same value for all variants
18033
+ et: 'et-EE',
18034
+ fa: 'fa-IR',
18035
+ fi: 'fi-FI',
18036
+ // fr: '', #not the same value for all variants
18037
+ hr: 'hr-HR',
18038
+ hu: 'hu-HU',
18039
+ he: 'he-IL',
18040
+ id: 'id-ID',
18041
+ it: 'it-IT',
18042
+ ja: 'ja-JP',
18043
+ ko: 'ko-KR',
18044
+ lv: 'lv-LV',
18045
+ lt: 'lt-LT',
18046
+ nl: 'nl-NL',
18047
+ no: 'no-NO',
18048
+ pl: 'pl-PL',
18049
+ pt: 'pt-PT',
18050
+ ro: 'ro-RO',
18051
+ ru: 'ru-RU',
18052
+ sk: 'sk-SK',
18053
+ sl: 'sl-SI',
18054
+ srCyrl: 'sr-SP',
18055
+ srLatn: 'sr-SP',
18056
+ sv: 'sv-SE',
18057
+ th: 'th-TH',
18058
+ tr: 'tr-TR',
18059
+ az: 'az-AZ',
18060
+ uk: 'uk-UA',
18061
+ vi: 'vi-VN',
18062
+ zhHans: 'zh-CN',
18063
+ zhHant: 'zh-TW'
18064
+ }
18065
+ }, options);
18066
+ return {
18067
+ options: _options,
18068
+ instance: createInstance(_options, locale)
18069
+ };
18070
+ }
18071
+ function createInstance(options, locale) {
18072
+ const instance = vue.reactive(typeof options.adapter === 'function'
18073
+ // eslint-disable-next-line new-cap
18074
+ ? new options.adapter({
18075
+ locale: options.locale[locale.current.value] ?? locale.current.value,
18076
+ formats: options.formats
18077
+ }) : options.adapter);
18078
+ vue.watch(locale.current, value => {
18079
+ instance.locale = options.locale[value] ?? value ?? instance.locale;
18080
+ });
18081
+ return instance;
18082
+ }
18083
+ function useDate() {
18084
+ const options = vue.inject(DateOptionsSymbol);
18085
+ if (!options) throw new Error('[Vuetify] Could not find injected date options');
18086
+ const locale = useLocale();
18087
+ return createInstance(options, locale);
18088
+ }
18089
+
18090
+ // https://stackoverflow.com/questions/274861/how-do-i-calculate-the-week-number-given-a-date/275024#275024
18091
+ function getWeek(adapter, value) {
18092
+ const date = adapter.toJsDate(value);
18093
+ let year = date.getFullYear();
18094
+ let d1w1 = new Date(year, 0, 1);
18095
+ if (date < d1w1) {
18096
+ year = year - 1;
18097
+ d1w1 = new Date(year, 0, 1);
18098
+ } else {
18099
+ const tv = new Date(year + 1, 0, 1);
18100
+ if (date >= tv) {
18101
+ year = year + 1;
18102
+ d1w1 = tv;
18103
+ }
18104
+ }
18105
+ const diffTime = Math.abs(date.getTime() - d1w1.getTime());
18106
+ const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
18107
+ return Math.floor(diffDays / 7) + 1;
18108
+ }
18109
+
18110
+ // Types
18111
+
18112
+ const makeVConfirmEditProps = propsFactory({
18113
+ modelValue: null,
18114
+ color: String,
18115
+ cancelText: {
18116
+ type: String,
18117
+ default: '$vuetify.confirmEdit.cancel'
18118
+ },
18119
+ okText: {
18120
+ type: String,
18121
+ default: '$vuetify.confirmEdit.ok'
18443
18122
  }
18444
- isWithinRange(date, range) {
18445
- return isWithinRange(date, range);
18123
+ }, 'VConfirmEdit');
18124
+ const VConfirmEdit = genericComponent()({
18125
+ name: 'VConfirmEdit',
18126
+ props: makeVConfirmEditProps(),
18127
+ emits: {
18128
+ cancel: () => true,
18129
+ save: value => true,
18130
+ 'update:modelValue': value => true
18131
+ },
18132
+ setup(props, _ref) {
18133
+ let {
18134
+ emit,
18135
+ slots
18136
+ } = _ref;
18137
+ const model = useProxiedModel(props, 'modelValue');
18138
+ const internalModel = vue.ref();
18139
+ vue.watchEffect(() => {
18140
+ internalModel.value = structuredClone(vue.toRaw(model.value));
18141
+ });
18142
+ const {
18143
+ t
18144
+ } = useLocale();
18145
+ const isPristine = vue.computed(() => {
18146
+ return deepEqual(model.value, internalModel.value);
18147
+ });
18148
+ function save() {
18149
+ model.value = internalModel.value;
18150
+ emit('save', internalModel.value);
18151
+ }
18152
+ function cancel() {
18153
+ internalModel.value = structuredClone(vue.toRaw(model.value));
18154
+ emit('cancel');
18155
+ }
18156
+ let actionsUsed = false;
18157
+ useRender(() => {
18158
+ const actions = vue.createVNode(vue.Fragment, null, [vue.createVNode(VBtn, {
18159
+ "disabled": isPristine.value,
18160
+ "variant": "text",
18161
+ "color": props.color,
18162
+ "onClick": cancel,
18163
+ "text": t(props.cancelText)
18164
+ }, null), vue.createVNode(VBtn, {
18165
+ "disabled": isPristine.value,
18166
+ "variant": "text",
18167
+ "color": props.color,
18168
+ "onClick": save,
18169
+ "text": t(props.okText)
18170
+ }, null)]);
18171
+ return vue.createVNode(vue.Fragment, null, [slots.default?.({
18172
+ model: internalModel,
18173
+ get actions() {
18174
+ actionsUsed = true;
18175
+ return actions;
18176
+ }
18177
+ }), !actionsUsed && actions]);
18178
+ });
18446
18179
  }
18447
- isAfter(date, comparing) {
18448
- return isAfter(date, comparing);
18180
+ });
18181
+
18182
+ // Composables
18183
+
18184
+ // Types
18185
+
18186
+ const makeDataTableExpandProps = propsFactory({
18187
+ expandOnClick: Boolean,
18188
+ showExpand: Boolean,
18189
+ expanded: {
18190
+ type: Array,
18191
+ default: () => []
18449
18192
  }
18450
- isAfterDay(date, comparing) {
18451
- return isAfterDay(date, comparing);
18193
+ }, 'DataTable-expand');
18194
+ const VDataTableExpandedKey = Symbol.for('vuetify:datatable:expanded');
18195
+ function provideExpanded(props) {
18196
+ const expandOnClick = vue.toRef(props, 'expandOnClick');
18197
+ const expanded = useProxiedModel(props, 'expanded', props.expanded, v => {
18198
+ return new Set(v);
18199
+ }, v => {
18200
+ return [...v.values()];
18201
+ });
18202
+ function expand(item, value) {
18203
+ const newExpanded = new Set(expanded.value);
18204
+ if (!value) {
18205
+ newExpanded.delete(item.value);
18206
+ } else {
18207
+ newExpanded.add(item.value);
18208
+ }
18209
+ expanded.value = newExpanded;
18452
18210
  }
18453
- isBefore(date, comparing) {
18454
- return !isAfter(date, comparing) && !isEqual(date, comparing);
18211
+ function isExpanded(item) {
18212
+ return expanded.value.has(item.value);
18455
18213
  }
18456
- isSameDay(date, comparing) {
18457
- return isSameDay(date, comparing);
18214
+ function toggleExpand(item) {
18215
+ expand(item, !isExpanded(item));
18458
18216
  }
18459
- isSameMonth(date, comparing) {
18460
- return isSameMonth(date, comparing);
18217
+ const data = {
18218
+ expand,
18219
+ expanded,
18220
+ expandOnClick,
18221
+ isExpanded,
18222
+ toggleExpand
18223
+ };
18224
+ vue.provide(VDataTableExpandedKey, data);
18225
+ return data;
18226
+ }
18227
+ function useExpanded() {
18228
+ const data = vue.inject(VDataTableExpandedKey);
18229
+ if (!data) throw new Error('foo');
18230
+ return data;
18231
+ }
18232
+
18233
+ // Composables
18234
+
18235
+ // Types
18236
+
18237
+ const makeDataTableGroupProps = propsFactory({
18238
+ groupBy: {
18239
+ type: Array,
18240
+ default: () => []
18461
18241
  }
18462
- isSameYear(date, comparing) {
18463
- return isSameYear(date, comparing);
18242
+ }, 'DataTable-group');
18243
+ const VDataTableGroupSymbol = Symbol.for('vuetify:data-table-group');
18244
+ function createGroupBy(props) {
18245
+ const groupBy = useProxiedModel(props, 'groupBy');
18246
+ return {
18247
+ groupBy
18248
+ };
18249
+ }
18250
+ function provideGroupBy(options) {
18251
+ const {
18252
+ groupBy,
18253
+ sortBy
18254
+ } = options;
18255
+ const opened = vue.ref(new Set());
18256
+ const sortByWithGroups = vue.computed(() => {
18257
+ return groupBy.value.map(val => ({
18258
+ ...val,
18259
+ order: val.order ?? false
18260
+ })).concat(sortBy.value);
18261
+ });
18262
+ function isGroupOpen(group) {
18263
+ return opened.value.has(group.id);
18464
18264
  }
18465
- setMinutes(date, count) {
18466
- return setMinutes(date, count);
18265
+ function toggleGroup(group) {
18266
+ const newOpened = new Set(opened.value);
18267
+ if (!isGroupOpen(group)) newOpened.add(group.id);else newOpened.delete(group.id);
18268
+ opened.value = newOpened;
18467
18269
  }
18468
- setHours(date, count) {
18469
- return setHours(date, count);
18270
+ function extractRows(items) {
18271
+ function dive(group) {
18272
+ const arr = [];
18273
+ for (const item of group.items) {
18274
+ if ('type' in item && item.type === 'group') {
18275
+ arr.push(...dive(item));
18276
+ } else {
18277
+ arr.push(item);
18278
+ }
18279
+ }
18280
+ return arr;
18281
+ }
18282
+ return dive({
18283
+ type: 'group',
18284
+ items,
18285
+ id: 'dummy',
18286
+ key: 'dummy',
18287
+ value: 'dummy',
18288
+ depth: 0
18289
+ });
18470
18290
  }
18471
- setMonth(date, count) {
18472
- return setMonth(date, count);
18291
+
18292
+ // onBeforeMount(() => {
18293
+ // for (const key of groupedItems.value.keys()) {
18294
+ // opened.value.add(key)
18295
+ // }
18296
+ // })
18297
+
18298
+ const data = {
18299
+ sortByWithGroups,
18300
+ toggleGroup,
18301
+ opened,
18302
+ groupBy,
18303
+ extractRows,
18304
+ isGroupOpen
18305
+ };
18306
+ vue.provide(VDataTableGroupSymbol, data);
18307
+ return data;
18308
+ }
18309
+ function useGroupBy() {
18310
+ const data = vue.inject(VDataTableGroupSymbol);
18311
+ if (!data) throw new Error('Missing group!');
18312
+ return data;
18313
+ }
18314
+ function groupItemsByProperty(items, groupBy) {
18315
+ if (!items.length) return [];
18316
+ const groups = new Map();
18317
+ for (const item of items) {
18318
+ const value = getObjectValueByPath(item.raw, groupBy);
18319
+ if (!groups.has(value)) {
18320
+ groups.set(value, []);
18321
+ }
18322
+ groups.get(value).push(item);
18473
18323
  }
18474
- setDate(date, day) {
18475
- return setDate(date, day);
18324
+ return groups;
18325
+ }
18326
+ function groupItems(items, groupBy) {
18327
+ let depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
18328
+ let prefix = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'root';
18329
+ if (!groupBy.length) return [];
18330
+ const groupedItems = groupItemsByProperty(items, groupBy[0]);
18331
+ const groups = [];
18332
+ const rest = groupBy.slice(1);
18333
+ groupedItems.forEach((items, value) => {
18334
+ const key = groupBy[0];
18335
+ const id = `${prefix}_${key}_${value}`;
18336
+ groups.push({
18337
+ depth,
18338
+ id,
18339
+ key,
18340
+ value,
18341
+ items: rest.length ? groupItems(items, rest, depth + 1, id) : items,
18342
+ type: 'group'
18343
+ });
18344
+ });
18345
+ return groups;
18346
+ }
18347
+ function flattenItems(items, opened) {
18348
+ const flatItems = [];
18349
+ for (const item of items) {
18350
+ // TODO: make this better
18351
+ if ('type' in item && item.type === 'group') {
18352
+ if (item.value != null) {
18353
+ flatItems.push(item);
18354
+ }
18355
+ if (opened.has(item.id) || item.value == null) {
18356
+ flatItems.push(...flattenItems(item.items, opened));
18357
+ }
18358
+ } else {
18359
+ flatItems.push(item);
18360
+ }
18476
18361
  }
18477
- setYear(date, year) {
18478
- return setYear(date, year);
18362
+ return flatItems;
18363
+ }
18364
+ function useGroupedItems(items, groupBy, opened) {
18365
+ const flatItems = vue.computed(() => {
18366
+ if (!groupBy.value.length) return items.value;
18367
+ const groupedItems = groupItems(items.value, groupBy.value.map(item => item.key));
18368
+ return flattenItems(groupedItems, opened.value);
18369
+ });
18370
+ return {
18371
+ flatItems
18372
+ };
18373
+ }
18374
+
18375
+ // Utilities
18376
+
18377
+ // Types
18378
+
18379
+ function useOptions(_ref) {
18380
+ let {
18381
+ page,
18382
+ itemsPerPage,
18383
+ sortBy,
18384
+ groupBy,
18385
+ search
18386
+ } = _ref;
18387
+ const vm = getCurrentInstance('VDataTable');
18388
+ const options = vue.computed(() => ({
18389
+ page: page.value,
18390
+ itemsPerPage: itemsPerPage.value,
18391
+ sortBy: sortBy.value,
18392
+ groupBy: groupBy.value,
18393
+ search: search.value
18394
+ }));
18395
+ let oldOptions = null;
18396
+ vue.watch(options, () => {
18397
+ if (deepEqual(oldOptions, options.value)) return;
18398
+
18399
+ // Reset page when searching
18400
+ if (oldOptions && oldOptions.search !== options.value.search) {
18401
+ page.value = 1;
18402
+ }
18403
+ vm.emit('update:options', options.value);
18404
+ oldOptions = options.value;
18405
+ }, {
18406
+ deep: true,
18407
+ immediate: true
18408
+ });
18409
+ }
18410
+
18411
+ // Composables
18412
+
18413
+ // Types
18414
+
18415
+ const makeDataTablePaginateProps = propsFactory({
18416
+ page: {
18417
+ type: [Number, String],
18418
+ default: 1
18419
+ },
18420
+ itemsPerPage: {
18421
+ type: [Number, String],
18422
+ default: 10
18479
18423
  }
18480
- getDiff(date, comparing, unit) {
18481
- return getDiff(date, comparing, unit);
18424
+ }, 'DataTable-paginate');
18425
+ const VDataTablePaginationSymbol = Symbol.for('vuetify:data-table-pagination');
18426
+ function createPagination(props) {
18427
+ const page = useProxiedModel(props, 'page', undefined, value => +(value ?? 1));
18428
+ const itemsPerPage = useProxiedModel(props, 'itemsPerPage', undefined, value => +(value ?? 10));
18429
+ return {
18430
+ page,
18431
+ itemsPerPage
18432
+ };
18433
+ }
18434
+ function providePagination(options) {
18435
+ const {
18436
+ page,
18437
+ itemsPerPage,
18438
+ itemsLength
18439
+ } = options;
18440
+ const startIndex = vue.computed(() => {
18441
+ if (itemsPerPage.value === -1) return 0;
18442
+ return itemsPerPage.value * (page.value - 1);
18443
+ });
18444
+ const stopIndex = vue.computed(() => {
18445
+ if (itemsPerPage.value === -1) return itemsLength.value;
18446
+ return Math.min(itemsLength.value, startIndex.value + itemsPerPage.value);
18447
+ });
18448
+ const pageCount = vue.computed(() => {
18449
+ if (itemsPerPage.value === -1 || itemsLength.value === 0) return 1;
18450
+ return Math.ceil(itemsLength.value / itemsPerPage.value);
18451
+ });
18452
+ vue.watchEffect(() => {
18453
+ if (page.value > pageCount.value) {
18454
+ page.value = pageCount.value;
18455
+ }
18456
+ });
18457
+ function setItemsPerPage(value) {
18458
+ itemsPerPage.value = value;
18459
+ page.value = 1;
18482
18460
  }
18483
- getWeekdays() {
18484
- return getWeekdays(this.locale);
18461
+ function nextPage() {
18462
+ page.value = clamp(page.value + 1, 1, pageCount.value);
18485
18463
  }
18486
- getYear(date) {
18487
- return getYear(date);
18464
+ function prevPage() {
18465
+ page.value = clamp(page.value - 1, 1, pageCount.value);
18488
18466
  }
18489
- getMonth(date) {
18490
- return getMonth(date);
18467
+ function setPage(value) {
18468
+ page.value = clamp(value, 1, pageCount.value);
18491
18469
  }
18492
- getDate(date) {
18493
- return getDate(date);
18470
+ const data = {
18471
+ page,
18472
+ itemsPerPage,
18473
+ startIndex,
18474
+ stopIndex,
18475
+ pageCount,
18476
+ itemsLength,
18477
+ nextPage,
18478
+ prevPage,
18479
+ setPage,
18480
+ setItemsPerPage
18481
+ };
18482
+ vue.provide(VDataTablePaginationSymbol, data);
18483
+ return data;
18484
+ }
18485
+ function usePagination() {
18486
+ const data = vue.inject(VDataTablePaginationSymbol);
18487
+ if (!data) throw new Error('Missing pagination!');
18488
+ return data;
18489
+ }
18490
+ function usePaginatedItems(options) {
18491
+ const vm = getCurrentInstance('usePaginatedItems');
18492
+ const {
18493
+ items,
18494
+ startIndex,
18495
+ stopIndex,
18496
+ itemsPerPage
18497
+ } = options;
18498
+ const paginatedItems = vue.computed(() => {
18499
+ if (itemsPerPage.value <= 0) return items.value;
18500
+ return items.value.slice(startIndex.value, stopIndex.value);
18501
+ });
18502
+ vue.watch(paginatedItems, val => {
18503
+ vm.emit('update:currentItems', val);
18504
+ });
18505
+ return {
18506
+ paginatedItems
18507
+ };
18508
+ }
18509
+
18510
+ // Composables
18511
+
18512
+ // Types
18513
+
18514
+ const singleSelectStrategy = {
18515
+ showSelectAll: false,
18516
+ allSelected: () => [],
18517
+ select: _ref => {
18518
+ let {
18519
+ items,
18520
+ value
18521
+ } = _ref;
18522
+ return new Set(value ? [vue.toRaw(items[0]?.value)] : []);
18523
+ },
18524
+ selectAll: _ref2 => {
18525
+ let {
18526
+ selected
18527
+ } = _ref2;
18528
+ return selected;
18494
18529
  }
18495
- getNextMonth(date) {
18496
- return getNextMonth(date);
18530
+ };
18531
+ const pageSelectStrategy = {
18532
+ showSelectAll: true,
18533
+ allSelected: _ref3 => {
18534
+ let {
18535
+ currentPage
18536
+ } = _ref3;
18537
+ return currentPage;
18538
+ },
18539
+ select: _ref4 => {
18540
+ let {
18541
+ items,
18542
+ value,
18543
+ selected
18544
+ } = _ref4;
18545
+ for (const item of items) {
18546
+ if (value) selected.add(vue.toRaw(item.value));else selected.delete(vue.toRaw(item.value));
18547
+ }
18548
+ return selected;
18549
+ },
18550
+ selectAll: _ref5 => {
18551
+ let {
18552
+ value,
18553
+ currentPage,
18554
+ selected
18555
+ } = _ref5;
18556
+ return pageSelectStrategy.select({
18557
+ items: currentPage,
18558
+ value,
18559
+ selected
18560
+ });
18497
18561
  }
18498
- getPreviousMonth(date) {
18499
- return getPreviousMonth(date);
18562
+ };
18563
+ const allSelectStrategy = {
18564
+ showSelectAll: true,
18565
+ allSelected: _ref6 => {
18566
+ let {
18567
+ allItems
18568
+ } = _ref6;
18569
+ return allItems;
18570
+ },
18571
+ select: _ref7 => {
18572
+ let {
18573
+ items,
18574
+ value,
18575
+ selected
18576
+ } = _ref7;
18577
+ for (const item of items) {
18578
+ if (value) selected.add(vue.toRaw(item.value));else selected.delete(vue.toRaw(item.value));
18579
+ }
18580
+ return selected;
18581
+ },
18582
+ selectAll: _ref8 => {
18583
+ let {
18584
+ value,
18585
+ allItems,
18586
+ selected
18587
+ } = _ref8;
18588
+ return allSelectStrategy.select({
18589
+ items: allItems,
18590
+ value,
18591
+ selected
18592
+ });
18500
18593
  }
18501
- getHours(date) {
18502
- return getHours(date);
18594
+ };
18595
+ const makeDataTableSelectProps = propsFactory({
18596
+ showSelect: Boolean,
18597
+ selectStrategy: {
18598
+ type: [String, Object],
18599
+ default: 'page'
18600
+ },
18601
+ modelValue: {
18602
+ type: Array,
18603
+ default: () => []
18604
+ },
18605
+ valueComparator: {
18606
+ type: Function,
18607
+ default: deepEqual
18503
18608
  }
18504
- getMinutes(date) {
18505
- return getMinutes(date);
18609
+ }, 'DataTable-select');
18610
+ const VDataTableSelectionSymbol = Symbol.for('vuetify:data-table-selection');
18611
+ function provideSelection(props, _ref9) {
18612
+ let {
18613
+ allItems,
18614
+ currentPage
18615
+ } = _ref9;
18616
+ const selected = useProxiedModel(props, 'modelValue', props.modelValue, v => {
18617
+ return new Set(wrapInArray(v).map(v => {
18618
+ return allItems.value.find(item => props.valueComparator(v, item.value))?.value ?? v;
18619
+ }));
18620
+ }, v => {
18621
+ return [...v.values()];
18622
+ });
18623
+ const allSelectable = vue.computed(() => allItems.value.filter(item => item.selectable));
18624
+ const currentPageSelectable = vue.computed(() => currentPage.value.filter(item => item.selectable));
18625
+ const selectStrategy = vue.computed(() => {
18626
+ if (typeof props.selectStrategy === 'object') return props.selectStrategy;
18627
+ switch (props.selectStrategy) {
18628
+ case 'single':
18629
+ return singleSelectStrategy;
18630
+ case 'all':
18631
+ return allSelectStrategy;
18632
+ case 'page':
18633
+ default:
18634
+ return pageSelectStrategy;
18635
+ }
18636
+ });
18637
+ function isSelected(items) {
18638
+ return wrapInArray(items).every(item => selected.value.has(vue.toRaw(item.value)));
18506
18639
  }
18507
- startOfDay(date) {
18508
- return startOfDay(date);
18640
+ function isSomeSelected(items) {
18641
+ return wrapInArray(items).some(item => selected.value.has(vue.toRaw(item.value)));
18509
18642
  }
18510
- endOfDay(date) {
18511
- return endOfDay(date);
18643
+ function select(items, value) {
18644
+ const newSelected = selectStrategy.value.select({
18645
+ items,
18646
+ value,
18647
+ selected: new Set(selected.value)
18648
+ });
18649
+ selected.value = newSelected;
18512
18650
  }
18513
- startOfYear(date) {
18514
- return startOfYear(date);
18651
+ function toggleSelect(item) {
18652
+ const newItem = vue.toRef(item);
18653
+ select([newItem.value], !isSelected([newItem.value]));
18515
18654
  }
18516
- endOfYear(date) {
18517
- return endOfYear(date);
18655
+ function selectAll(value) {
18656
+ const newSelected = selectStrategy.value.selectAll({
18657
+ value,
18658
+ allItems: allSelectable.value,
18659
+ currentPage: currentPageSelectable.value,
18660
+ selected: new Set(selected.value)
18661
+ });
18662
+ selected.value = newSelected;
18518
18663
  }
18519
- }
18520
-
18521
- // Composables
18522
- const DateOptionsSymbol = Symbol.for('vuetify:date-options');
18523
- const DateAdapterSymbol = Symbol.for('vuetify:date-adapter');
18524
- function createDate(options, locale) {
18525
- const _options = mergeDeep({
18526
- adapter: VuetifyDateAdapter,
18527
- locale: {
18528
- af: 'af-ZA',
18529
- // ar: '', # not the same value for all variants
18530
- bg: 'bg-BG',
18531
- ca: 'ca-ES',
18532
- ckb: '',
18533
- cs: 'cs-CZ',
18534
- de: 'de-DE',
18535
- el: 'el-GR',
18536
- en: 'en-US',
18537
- // es: '', # not the same value for all variants
18538
- et: 'et-EE',
18539
- fa: 'fa-IR',
18540
- fi: 'fi-FI',
18541
- // fr: '', #not the same value for all variants
18542
- hr: 'hr-HR',
18543
- hu: 'hu-HU',
18544
- he: 'he-IL',
18545
- id: 'id-ID',
18546
- it: 'it-IT',
18547
- ja: 'ja-JP',
18548
- ko: 'ko-KR',
18549
- lv: 'lv-LV',
18550
- lt: 'lt-LT',
18551
- nl: 'nl-NL',
18552
- no: 'no-NO',
18553
- pl: 'pl-PL',
18554
- pt: 'pt-PT',
18555
- ro: 'ro-RO',
18556
- ru: 'ru-RU',
18557
- sk: 'sk-SK',
18558
- sl: 'sl-SI',
18559
- srCyrl: 'sr-SP',
18560
- srLatn: 'sr-SP',
18561
- sv: 'sv-SE',
18562
- th: 'th-TH',
18563
- tr: 'tr-TR',
18564
- az: 'az-AZ',
18565
- uk: 'uk-UA',
18566
- vi: 'vi-VN',
18567
- zhHans: 'zh-CN',
18568
- zhHant: 'zh-TW'
18569
- }
18570
- }, options);
18571
- return {
18572
- options: _options,
18573
- instance: createInstance(_options, locale)
18574
- };
18575
- }
18576
- function createInstance(options, locale) {
18577
- const instance = vue.reactive(typeof options.adapter === 'function'
18578
- // eslint-disable-next-line new-cap
18579
- ? new options.adapter({
18580
- locale: options.locale[locale.current.value] ?? locale.current.value,
18581
- formats: options.formats
18582
- }) : options.adapter);
18583
- vue.watch(locale.current, value => {
18584
- instance.locale = options.locale[value] ?? value ?? instance.locale;
18664
+ const someSelected = vue.computed(() => selected.value.size > 0);
18665
+ const allSelected = vue.computed(() => {
18666
+ const items = selectStrategy.value.allSelected({
18667
+ allItems: allSelectable.value,
18668
+ currentPage: currentPageSelectable.value
18669
+ });
18670
+ return !!items.length && isSelected(items);
18585
18671
  });
18586
- return instance;
18587
- }
18588
- function useDate() {
18589
- const options = vue.inject(DateOptionsSymbol);
18590
- if (!options) throw new Error('[Vuetify] Could not find injected date options');
18591
- const locale = useLocale();
18592
- return createInstance(options, locale);
18672
+ const data = {
18673
+ toggleSelect,
18674
+ select,
18675
+ selectAll,
18676
+ isSelected,
18677
+ isSomeSelected,
18678
+ someSelected,
18679
+ allSelected,
18680
+ showSelectAll: selectStrategy.value.showSelectAll
18681
+ };
18682
+ vue.provide(VDataTableSelectionSymbol, data);
18683
+ return data;
18593
18684
  }
18594
-
18595
- // https://stackoverflow.com/questions/274861/how-do-i-calculate-the-week-number-given-a-date/275024#275024
18596
- function getWeek(adapter, value) {
18597
- const date = adapter.toJsDate(value);
18598
- let year = date.getFullYear();
18599
- let d1w1 = new Date(year, 0, 1);
18600
- if (date < d1w1) {
18601
- year = year - 1;
18602
- d1w1 = new Date(year, 0, 1);
18603
- } else {
18604
- const tv = new Date(year + 1, 0, 1);
18605
- if (date >= tv) {
18606
- year = year + 1;
18607
- d1w1 = tv;
18608
- }
18609
- }
18610
- const diffTime = Math.abs(date.getTime() - d1w1.getTime());
18611
- const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
18612
- return Math.floor(diffDays / 7) + 1;
18685
+ function useSelection() {
18686
+ const data = vue.inject(VDataTableSelectionSymbol);
18687
+ if (!data) throw new Error('Missing selection!');
18688
+ return data;
18613
18689
  }
18614
18690
 
18615
18691
  // Composables
@@ -19898,6 +19974,8 @@
19898
19974
  return columns.value.filter(column => column?.sortable);
19899
19975
  });
19900
19976
  const appendIcon = vue.computed(() => {
19977
+ const showSelectColumn = columns.value.find(column => column.key === 'data-table-select');
19978
+ if (showSelectColumn == null) return;
19901
19979
  return allSelected.value ? '$checkboxOn' : someSelected.value ? '$checkboxIndeterminate' : '$checkboxOff';
19902
19980
  });
19903
19981
  return vue.createVNode(VDataTableColumn, vue.mergeProps({
@@ -22023,9 +22101,9 @@
22023
22101
  });
22024
22102
  const text = vue.computed(() => {
22025
22103
  let date = adapter.date();
22026
- date = adapter.setYear(date, year.value);
22027
- date = adapter.setMonth(date, month.value);
22028
22104
  date = adapter.setDate(date, 1);
22105
+ date = adapter.setMonth(date, month.value);
22106
+ date = adapter.setYear(date, year.value);
22029
22107
  return adapter.format(date, 'monthAndYear');
22030
22108
  });
22031
22109
  // const headerIcon = computed(() => props.inputMode === 'calendar' ? props.keyboardIcon : props.calendarIcon)
@@ -22195,6 +22273,141 @@
22195
22273
  }
22196
22274
  });
22197
22275
 
22276
+ // Types
22277
+
22278
+ // Types
22279
+
22280
+ const makeVEmptyStateProps = propsFactory({
22281
+ actionText: String,
22282
+ bgColor: String,
22283
+ color: String,
22284
+ icon: IconValue,
22285
+ image: String,
22286
+ justify: {
22287
+ type: String,
22288
+ default: 'center'
22289
+ },
22290
+ headline: String,
22291
+ title: String,
22292
+ text: String,
22293
+ textWidth: {
22294
+ type: [Number, String],
22295
+ default: 500
22296
+ },
22297
+ href: String,
22298
+ to: String,
22299
+ ...makeComponentProps(),
22300
+ ...makeDimensionProps(),
22301
+ ...makeSizeProps({
22302
+ size: undefined
22303
+ }),
22304
+ ...makeThemeProps()
22305
+ }, 'VEmptyState');
22306
+ const VEmptyState = genericComponent()({
22307
+ name: 'VEmptyState',
22308
+ props: makeVEmptyStateProps(),
22309
+ emits: {
22310
+ 'click:action': e => true
22311
+ },
22312
+ setup(props, _ref) {
22313
+ let {
22314
+ emit,
22315
+ slots
22316
+ } = _ref;
22317
+ const {
22318
+ themeClasses
22319
+ } = provideTheme(props);
22320
+ const {
22321
+ backgroundColorClasses,
22322
+ backgroundColorStyles
22323
+ } = useBackgroundColor(vue.toRef(props, 'bgColor'));
22324
+ const {
22325
+ dimensionStyles
22326
+ } = useDimension(props);
22327
+ const {
22328
+ displayClasses
22329
+ } = useDisplay();
22330
+ function onClickAction(e) {
22331
+ emit('click:action', e);
22332
+ }
22333
+ useRender(() => {
22334
+ const hasActions = !!(slots.actions || props.actionText);
22335
+ const hasHeadline = !!(slots.headline || props.headline);
22336
+ const hasTitle = !!(slots.title || props.title);
22337
+ const hasText = !!(slots.text || props.text);
22338
+ const hasMedia = !!(slots.media || props.image || props.icon);
22339
+ const size = props.size || (props.image ? 200 : 96);
22340
+ return vue.createVNode("div", {
22341
+ "class": ['v-empty-state', {
22342
+ [`v-empty-state--${props.justify}`]: true
22343
+ }, themeClasses.value, backgroundColorClasses.value, displayClasses.value, props.class],
22344
+ "style": [backgroundColorStyles.value, dimensionStyles.value, props.style]
22345
+ }, [hasMedia && vue.createVNode("div", {
22346
+ "key": "media",
22347
+ "class": "v-empty-state__media"
22348
+ }, [!slots.media ? vue.createVNode(vue.Fragment, null, [props.image ? vue.createVNode(VImg, {
22349
+ "key": "image",
22350
+ "src": props.image,
22351
+ "height": size
22352
+ }, null) : props.icon ? vue.createVNode(VIcon, {
22353
+ "key": "icon",
22354
+ "color": props.color,
22355
+ "size": size,
22356
+ "icon": props.icon
22357
+ }, null) : undefined]) : vue.createVNode(VDefaultsProvider, {
22358
+ "key": "media-defaults",
22359
+ "defaults": {
22360
+ VImg: {
22361
+ src: props.image,
22362
+ height: size
22363
+ },
22364
+ VIcon: {
22365
+ size,
22366
+ icon: props.icon
22367
+ }
22368
+ }
22369
+ }, {
22370
+ default: () => [slots.media()]
22371
+ })]), hasHeadline && vue.createVNode("div", {
22372
+ "key": "headline",
22373
+ "class": "v-empty-state__headline"
22374
+ }, [slots.headline?.() ?? props.headline]), hasTitle && vue.createVNode("div", {
22375
+ "key": "title",
22376
+ "class": "v-empty-state__title"
22377
+ }, [slots.title?.() ?? props.title]), hasText && vue.createVNode("div", {
22378
+ "key": "text",
22379
+ "class": "v-empty-state__text",
22380
+ "style": {
22381
+ maxWidth: convertToUnit(props.textWidth)
22382
+ }
22383
+ }, [slots.text?.() ?? props.text]), slots.default && vue.createVNode("div", {
22384
+ "key": "content",
22385
+ "class": "v-empty-state__content"
22386
+ }, [slots.default()]), hasActions && vue.createVNode("div", {
22387
+ "key": "actions",
22388
+ "class": "v-empty-state__actions"
22389
+ }, [vue.createVNode(VDefaultsProvider, {
22390
+ "defaults": {
22391
+ VBtn: {
22392
+ class: 'v-empty-state__action-btn',
22393
+ color: props.color,
22394
+ text: props.actionText
22395
+ }
22396
+ }
22397
+ }, {
22398
+ default: () => [slots.actions?.({
22399
+ props: {
22400
+ onClick: onClickAction
22401
+ }
22402
+ }) ?? vue.createVNode(VBtn, {
22403
+ "onClick": onClickAction
22404
+ }, null)]
22405
+ })])]);
22406
+ });
22407
+ return {};
22408
+ }
22409
+ });
22410
+
22198
22411
  const makeVExpansionPanelTextProps = propsFactory({
22199
22412
  ...makeComponentProps(),
22200
22413
  ...makeLazyProps()
@@ -22428,6 +22641,107 @@
22428
22641
  }
22429
22642
  });
22430
22643
 
22644
+ const makeVFabProps = propsFactory({
22645
+ app: Boolean,
22646
+ appear: Boolean,
22647
+ extended: Boolean,
22648
+ layout: Boolean,
22649
+ location: {
22650
+ type: String,
22651
+ default: 'bottom end'
22652
+ },
22653
+ offset: Boolean,
22654
+ modelValue: {
22655
+ type: Boolean,
22656
+ default: true
22657
+ },
22658
+ ...omit(makeVBtnProps({
22659
+ active: true
22660
+ }), ['location']),
22661
+ ...makeLayoutItemProps(),
22662
+ ...makeTransitionProps({
22663
+ transition: 'fab-transition'
22664
+ })
22665
+ }, 'VFab');
22666
+ const VFab = genericComponent()({
22667
+ name: 'VFab',
22668
+ props: makeVFabProps(),
22669
+ emits: {
22670
+ 'update:modelValue': value => true
22671
+ },
22672
+ setup(props, _ref) {
22673
+ let {
22674
+ slots
22675
+ } = _ref;
22676
+ const model = useProxiedModel(props, 'modelValue');
22677
+ const height = vue.shallowRef(56);
22678
+ const layoutItemStyles = vue.ref();
22679
+ const {
22680
+ resizeRef
22681
+ } = useResizeObserver(entries => {
22682
+ if (!entries.length) return;
22683
+ height.value = entries[0].target.clientHeight;
22684
+ });
22685
+ const hasPosition = vue.computed(() => props.app || props.absolute);
22686
+ const position = vue.computed(() => {
22687
+ if (!hasPosition.value) return false;
22688
+ return props.location.split(' ').shift();
22689
+ });
22690
+ const orientation = vue.computed(() => {
22691
+ if (!hasPosition.value) return false;
22692
+ return props.location.split(' ')[1] ?? 'end';
22693
+ });
22694
+ useToggleScope(() => props.app, () => {
22695
+ const layout = useLayoutItem({
22696
+ id: props.name,
22697
+ order: vue.computed(() => parseInt(props.order, 10)),
22698
+ position,
22699
+ layoutSize: vue.computed(() => props.layout ? height.value + 24 : 0),
22700
+ elementSize: vue.computed(() => height.value + 24),
22701
+ active: vue.computed(() => props.app && model.value),
22702
+ absolute: vue.toRef(props, 'absolute')
22703
+ });
22704
+ vue.watchEffect(() => {
22705
+ layoutItemStyles.value = layout.layoutItemStyles.value;
22706
+ });
22707
+ });
22708
+ const vFabRef = vue.ref();
22709
+ useRender(() => {
22710
+ const btnProps = VBtn.filterProps(props);
22711
+ return vue.createVNode("div", {
22712
+ "ref": vFabRef,
22713
+ "class": ['v-fab', {
22714
+ 'v-fab--absolute': props.absolute,
22715
+ 'v-fab--app': !!props.app,
22716
+ 'v-fab--extended': props.extended,
22717
+ 'v-fab--offset': props.offset,
22718
+ [`v-fab--${position.value}`]: hasPosition.value,
22719
+ [`v-fab--${orientation.value}`]: hasPosition.value
22720
+ }, props.class],
22721
+ "style": [props.app ? {
22722
+ ...layoutItemStyles.value
22723
+ } : {
22724
+ height: 'inherit',
22725
+ width: undefined
22726
+ }, props.style]
22727
+ }, [vue.createVNode("div", {
22728
+ "class": "v-fab__container"
22729
+ }, [vue.createVNode(MaybeTransition, {
22730
+ "appear": props.appear,
22731
+ "transition": props.transition
22732
+ }, {
22733
+ default: () => [vue.withDirectives(vue.createVNode(VBtn, vue.mergeProps({
22734
+ "ref": resizeRef
22735
+ }, btnProps, {
22736
+ "active": undefined,
22737
+ "location": undefined
22738
+ }), slots), [[vue.vShow, props.active]])]
22739
+ })])]);
22740
+ });
22741
+ return {};
22742
+ }
22743
+ });
22744
+
22431
22745
  // Types
22432
22746
 
22433
22747
  const makeVFileInputProps = propsFactory({
@@ -22775,7 +23089,7 @@
22775
23089
  disabled: Boolean,
22776
23090
  modelValue: {
22777
23091
  type: Boolean,
22778
- default: undefined
23092
+ default: null
22779
23093
  },
22780
23094
  ...makeDelayProps()
22781
23095
  }, 'VHover');
@@ -25088,6 +25402,519 @@
25088
25402
  }
25089
25403
  });
25090
25404
 
25405
+ // Utilities
25406
+
25407
+ // Types
25408
+
25409
+ const makeLineProps = propsFactory({
25410
+ autoDraw: Boolean,
25411
+ autoDrawDuration: [Number, String],
25412
+ autoDrawEasing: {
25413
+ type: String,
25414
+ default: 'ease'
25415
+ },
25416
+ color: String,
25417
+ gradient: {
25418
+ type: Array,
25419
+ default: () => []
25420
+ },
25421
+ gradientDirection: {
25422
+ type: String,
25423
+ validator: val => ['top', 'bottom', 'left', 'right'].includes(val),
25424
+ default: 'top'
25425
+ },
25426
+ height: {
25427
+ type: [String, Number],
25428
+ default: 75
25429
+ },
25430
+ labels: {
25431
+ type: Array,
25432
+ default: () => []
25433
+ },
25434
+ labelSize: {
25435
+ type: [Number, String],
25436
+ default: 7
25437
+ },
25438
+ lineWidth: {
25439
+ type: [String, Number],
25440
+ default: 4
25441
+ },
25442
+ id: String,
25443
+ itemValue: {
25444
+ type: String,
25445
+ default: 'value'
25446
+ },
25447
+ modelValue: {
25448
+ type: Array,
25449
+ default: () => []
25450
+ },
25451
+ min: [String, Number],
25452
+ max: [String, Number],
25453
+ padding: {
25454
+ type: [String, Number],
25455
+ default: 8
25456
+ },
25457
+ showLabels: Boolean,
25458
+ smooth: Boolean,
25459
+ width: {
25460
+ type: [Number, String],
25461
+ default: 300
25462
+ }
25463
+ }, 'Line');
25464
+
25465
+ // Types
25466
+
25467
+ const makeVBarlineProps = propsFactory({
25468
+ autoLineWidth: Boolean,
25469
+ ...makeLineProps()
25470
+ }, 'VBarline');
25471
+ const VBarline = genericComponent()({
25472
+ name: 'VBarline',
25473
+ props: makeVBarlineProps(),
25474
+ setup(props, _ref) {
25475
+ let {
25476
+ slots
25477
+ } = _ref;
25478
+ const uid = getUid();
25479
+ const id = vue.computed(() => props.id || `barline-${uid}`);
25480
+ const autoDrawDuration = vue.computed(() => Number(props.autoDrawDuration) || 500);
25481
+ const hasLabels = vue.computed(() => {
25482
+ return Boolean(props.showLabels || props.labels.length > 0 || !!slots?.label);
25483
+ });
25484
+ const lineWidth = vue.computed(() => parseFloat(props.lineWidth) || 4);
25485
+ const totalWidth = vue.computed(() => Math.max(props.modelValue.length * lineWidth.value, Number(props.width)));
25486
+ const boundary = vue.computed(() => {
25487
+ return {
25488
+ minX: 0,
25489
+ maxX: totalWidth.value,
25490
+ minY: 0,
25491
+ maxY: parseInt(props.height, 10)
25492
+ };
25493
+ });
25494
+ const items = vue.computed(() => props.modelValue.map(item => getPropertyFromItem(item, props.itemValue, item)));
25495
+ function genBars(values, boundary) {
25496
+ const {
25497
+ minX,
25498
+ maxX,
25499
+ minY,
25500
+ maxY
25501
+ } = boundary;
25502
+ const totalValues = values.length;
25503
+ let maxValue = props.max != null ? Number(props.max) : Math.max(...values);
25504
+ let minValue = props.min != null ? Number(props.min) : Math.min(...values);
25505
+ if (minValue > 0 && props.min == null) minValue = 0;
25506
+ if (maxValue < 0 && props.max == null) maxValue = 0;
25507
+ const gridX = maxX / totalValues;
25508
+ const gridY = (maxY - minY) / (maxValue - minValue || 1);
25509
+ const horizonY = maxY - Math.abs(minValue * gridY);
25510
+ return values.map((value, index) => {
25511
+ const height = Math.abs(gridY * value);
25512
+ return {
25513
+ x: minX + index * gridX,
25514
+ y: horizonY - height + +(value < 0) * height,
25515
+ height,
25516
+ value
25517
+ };
25518
+ });
25519
+ }
25520
+ const parsedLabels = vue.computed(() => {
25521
+ const labels = [];
25522
+ const points = genBars(items.value, boundary.value);
25523
+ const len = points.length;
25524
+ for (let i = 0; labels.length < len; i++) {
25525
+ const item = points[i];
25526
+ let value = props.labels[i];
25527
+ if (!value) {
25528
+ value = typeof item === 'object' ? item.value : item;
25529
+ }
25530
+ labels.push({
25531
+ x: item.x,
25532
+ value: String(value)
25533
+ });
25534
+ }
25535
+ return labels;
25536
+ });
25537
+ const bars = vue.computed(() => genBars(items.value, boundary.value));
25538
+ const offsetX = vue.computed(() => (Math.abs(bars.value[0].x - bars.value[1].x) - lineWidth.value) / 2);
25539
+ useRender(() => {
25540
+ const gradientData = !props.gradient.slice().length ? [''] : props.gradient.slice().reverse();
25541
+ return vue.createVNode("svg", {
25542
+ "display": "block"
25543
+ }, [vue.createVNode("defs", null, [vue.createVNode("linearGradient", {
25544
+ "id": id.value,
25545
+ "gradientUnits": "userSpaceOnUse",
25546
+ "x1": props.gradientDirection === 'left' ? '100%' : '0',
25547
+ "y1": props.gradientDirection === 'top' ? '100%' : '0',
25548
+ "x2": props.gradientDirection === 'right' ? '100%' : '0',
25549
+ "y2": props.gradientDirection === 'bottom' ? '100%' : '0'
25550
+ }, [gradientData.map((color, index) => vue.createVNode("stop", {
25551
+ "offset": index / Math.max(gradientData.length - 1, 1),
25552
+ "stop-color": color || 'currentColor'
25553
+ }, null))])]), vue.createVNode("clipPath", {
25554
+ "id": `${id.value}-clip`
25555
+ }, [bars.value.map(item => vue.createVNode("rect", {
25556
+ "x": item.x + offsetX.value,
25557
+ "y": item.y,
25558
+ "width": lineWidth.value,
25559
+ "height": item.height,
25560
+ "rx": typeof props.smooth === 'number' ? props.smooth : props.smooth ? 2 : 0,
25561
+ "ry": typeof props.smooth === 'number' ? props.smooth : props.smooth ? 2 : 0
25562
+ }, [props.autoDraw && vue.createVNode(vue.Fragment, null, [vue.createVNode("animate", {
25563
+ "attributeName": "y",
25564
+ "from": item.y + item.height,
25565
+ "to": item.y,
25566
+ "dur": `${autoDrawDuration.value}ms`,
25567
+ "fill": "freeze"
25568
+ }, null), vue.createVNode("animate", {
25569
+ "attributeName": "height",
25570
+ "from": "0",
25571
+ "to": item.height,
25572
+ "dur": `${autoDrawDuration.value}ms`,
25573
+ "fill": "freeze"
25574
+ }, null)])]))]), hasLabels.value && vue.createVNode("g", {
25575
+ "key": "labels",
25576
+ "style": {
25577
+ textAnchor: 'middle',
25578
+ dominantBaseline: 'mathematical',
25579
+ fill: 'currentColor'
25580
+ }
25581
+ }, [parsedLabels.value.map((item, i) => vue.createVNode("text", {
25582
+ "x": item.x + offsetX.value + lineWidth.value / 2,
25583
+ "y": parseInt(props.height, 10) - 2 + (parseInt(props.labelSize, 10) || 7 * 0.75),
25584
+ "font-size": Number(props.labelSize) || 7
25585
+ }, [slots.label?.({
25586
+ index: i,
25587
+ value: item.value
25588
+ }) ?? item.value]))]), vue.createVNode("g", {
25589
+ "clip-path": `url(#${id.value}-clip)`,
25590
+ "fill": `url(#${id.value})`
25591
+ }, [vue.createVNode("rect", {
25592
+ "x": 0,
25593
+ "y": 0,
25594
+ "width": Math.max(props.modelValue.length * lineWidth.value, Number(props.width)),
25595
+ "height": props.height
25596
+ }, null)])]);
25597
+ });
25598
+ }
25599
+ });
25600
+
25601
+ // @ts-nocheck
25602
+ /* eslint-disable */
25603
+
25604
+ // import { checkCollinear, getDistance, moveTo } from './math'
25605
+
25606
+ /**
25607
+ * From https://github.com/unsplash/react-trend/blob/master/src/helpers/DOM.helpers.js#L18
25608
+ */
25609
+ function genPath(points, radius) {
25610
+ let fill = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
25611
+ let height = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 75;
25612
+ if (points.length === 0) return '';
25613
+ const start = points.shift();
25614
+ const end = points[points.length - 1];
25615
+ return (fill ? `M${start.x} ${height - start.x + 2} L${start.x} ${start.y}` : `M${start.x} ${start.y}`) + points.map((point, index) => {
25616
+ const next = points[index + 1];
25617
+ const prev = points[index - 1] || start;
25618
+ const isCollinear = next && checkCollinear(next, point, prev);
25619
+ if (!next || isCollinear) {
25620
+ return `L${point.x} ${point.y}`;
25621
+ }
25622
+ const threshold = Math.min(getDistance(prev, point), getDistance(next, point));
25623
+ const isTooCloseForRadius = threshold / 2 < radius;
25624
+ const radiusForPoint = isTooCloseForRadius ? threshold / 2 : radius;
25625
+ const before = moveTo(prev, point, radiusForPoint);
25626
+ const after = moveTo(next, point, radiusForPoint);
25627
+ return `L${before.x} ${before.y}S${point.x} ${point.y} ${after.x} ${after.y}`;
25628
+ }).join('') + (fill ? `L${end.x} ${height - start.x + 2} Z` : '');
25629
+ }
25630
+ function int(value) {
25631
+ return parseInt(value, 10);
25632
+ }
25633
+
25634
+ /**
25635
+ * https://en.wikipedia.org/wiki/Collinearity
25636
+ * x=(x1+x2)/2
25637
+ * y=(y1+y2)/2
25638
+ */
25639
+ function checkCollinear(p0, p1, p2) {
25640
+ return int(p0.x + p2.x) === int(2 * p1.x) && int(p0.y + p2.y) === int(2 * p1.y);
25641
+ }
25642
+ function getDistance(p1, p2) {
25643
+ return Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));
25644
+ }
25645
+ function moveTo(to, from, radius) {
25646
+ const vector = {
25647
+ x: to.x - from.x,
25648
+ y: to.y - from.y
25649
+ };
25650
+ const length = Math.sqrt(vector.x * vector.x + vector.y * vector.y);
25651
+ const unitVector = {
25652
+ x: vector.x / length,
25653
+ y: vector.y / length
25654
+ };
25655
+ return {
25656
+ x: from.x + unitVector.x * radius,
25657
+ y: from.y + unitVector.y * radius
25658
+ };
25659
+ }
25660
+
25661
+ // Types
25662
+
25663
+ const makeVTrendlineProps = propsFactory({
25664
+ fill: Boolean,
25665
+ ...makeLineProps()
25666
+ }, 'VTrendline');
25667
+ const VTrendline = genericComponent()({
25668
+ name: 'VTrendline',
25669
+ props: makeVTrendlineProps(),
25670
+ setup(props, _ref) {
25671
+ let {
25672
+ slots
25673
+ } = _ref;
25674
+ const uid = getUid();
25675
+ const id = vue.computed(() => props.id || `trendline-${uid}`);
25676
+ const autoDrawDuration = vue.computed(() => Number(props.autoDrawDuration) || (props.fill ? 500 : 2000));
25677
+ const lastLength = vue.ref(0);
25678
+ const path = vue.ref(null);
25679
+ function genPoints(values, boundary) {
25680
+ const {
25681
+ minX,
25682
+ maxX,
25683
+ minY,
25684
+ maxY
25685
+ } = boundary;
25686
+ const totalValues = values.length;
25687
+ const maxValue = props.max != null ? Number(props.max) : Math.max(...values);
25688
+ const minValue = props.min != null ? Number(props.min) : Math.min(...values);
25689
+ const gridX = (maxX - minX) / (totalValues - 1);
25690
+ const gridY = (maxY - minY) / (maxValue - minValue || 1);
25691
+ return values.map((value, index) => {
25692
+ return {
25693
+ x: minX + index * gridX,
25694
+ y: maxY - (value - minValue) * gridY,
25695
+ value
25696
+ };
25697
+ });
25698
+ }
25699
+ const hasLabels = vue.computed(() => {
25700
+ return Boolean(props.showLabels || props.labels.length > 0 || !!slots?.label);
25701
+ });
25702
+ const lineWidth = vue.computed(() => {
25703
+ return parseFloat(props.lineWidth) || 4;
25704
+ });
25705
+ const totalWidth = vue.computed(() => Number(props.width));
25706
+ const boundary = vue.computed(() => {
25707
+ const padding = Number(props.padding);
25708
+ return {
25709
+ minX: padding,
25710
+ maxX: totalWidth.value - padding,
25711
+ minY: padding,
25712
+ maxY: parseInt(props.height, 10) - padding
25713
+ };
25714
+ });
25715
+ const items = vue.computed(() => props.modelValue.map(item => getPropertyFromItem(item, props.itemValue, item)));
25716
+ const parsedLabels = vue.computed(() => {
25717
+ const labels = [];
25718
+ const points = genPoints(items.value, boundary.value);
25719
+ const len = points.length;
25720
+ for (let i = 0; labels.length < len; i++) {
25721
+ const item = points[i];
25722
+ let value = props.labels[i];
25723
+ if (!value) {
25724
+ value = typeof item === 'object' ? item.value : item;
25725
+ }
25726
+ labels.push({
25727
+ x: item.x,
25728
+ value: String(value)
25729
+ });
25730
+ }
25731
+ return labels;
25732
+ });
25733
+ vue.watch(() => props.modelValue, async () => {
25734
+ await vue.nextTick();
25735
+ if (!props.autoDraw || !path.value) return;
25736
+ const pathRef = path.value;
25737
+ const length = pathRef.getTotalLength();
25738
+ if (!props.fill) {
25739
+ // Initial setup to "hide" the line by using the stroke dash array
25740
+ pathRef.style.strokeDasharray = `${length}`;
25741
+ pathRef.style.strokeDashoffset = `${length}`;
25742
+
25743
+ // Force reflow to ensure the transition starts from this state
25744
+ pathRef.getBoundingClientRect();
25745
+
25746
+ // Animate the stroke dash offset to "draw" the line
25747
+ pathRef.style.transition = `stroke-dashoffset ${autoDrawDuration.value}ms ${props.autoDrawEasing}`;
25748
+ pathRef.style.strokeDashoffset = '0';
25749
+ } else {
25750
+ // Your existing logic for filled paths remains the same
25751
+ pathRef.style.transformOrigin = 'bottom center';
25752
+ pathRef.style.transition = 'none';
25753
+ pathRef.style.transform = `scaleY(0)`;
25754
+ pathRef.getBoundingClientRect();
25755
+ pathRef.style.transition = `transform ${autoDrawDuration.value}ms ${props.autoDrawEasing}`;
25756
+ pathRef.style.transform = `scaleY(1)`;
25757
+ }
25758
+ lastLength.value = length;
25759
+ }, {
25760
+ immediate: true
25761
+ });
25762
+ function genPath$1(fill) {
25763
+ return genPath(genPoints(items.value, boundary.value), props.smooth ? 8 : Number(props.smooth), fill, parseInt(props.height, 10));
25764
+ }
25765
+ useRender(() => {
25766
+ const gradientData = !props.gradient.slice().length ? [''] : props.gradient.slice().reverse();
25767
+ return vue.createVNode("svg", {
25768
+ "display": "block",
25769
+ "stroke-width": parseFloat(props.lineWidth) ?? 4
25770
+ }, [vue.createVNode("defs", null, [vue.createVNode("linearGradient", {
25771
+ "id": id.value,
25772
+ "gradientUnits": "userSpaceOnUse",
25773
+ "x1": props.gradientDirection === 'left' ? '100%' : '0',
25774
+ "y1": props.gradientDirection === 'top' ? '100%' : '0',
25775
+ "x2": props.gradientDirection === 'right' ? '100%' : '0',
25776
+ "y2": props.gradientDirection === 'bottom' ? '100%' : '0'
25777
+ }, [gradientData.map((color, index) => vue.createVNode("stop", {
25778
+ "offset": index / Math.max(gradientData.length - 1, 1),
25779
+ "stop-color": color || 'currentColor'
25780
+ }, null))])]), hasLabels.value && vue.createVNode("g", {
25781
+ "key": "labels",
25782
+ "style": {
25783
+ textAnchor: 'middle',
25784
+ dominantBaseline: 'mathematical',
25785
+ fill: 'currentColor'
25786
+ }
25787
+ }, [parsedLabels.value.map((item, i) => vue.createVNode("text", {
25788
+ "x": item.x + lineWidth.value / 2 + lineWidth.value / 2,
25789
+ "y": parseInt(props.height, 10) - 4 + (parseInt(props.labelSize, 10) || 7 * 0.75),
25790
+ "font-size": Number(props.labelSize) || 7
25791
+ }, [slots.label?.({
25792
+ index: i,
25793
+ value: item.value
25794
+ }) ?? item.value]))]), vue.createVNode("path", {
25795
+ "ref": path,
25796
+ "d": genPath$1(props.fill),
25797
+ "fill": props.fill ? `url(#${id.value})` : 'none',
25798
+ "stroke": props.fill ? 'none' : `url(#${id.value})`
25799
+ }, null), props.fill && vue.createVNode("path", {
25800
+ "d": genPath$1(false),
25801
+ "fill": "none",
25802
+ "stroke": props.color ?? props.gradient?.[0]
25803
+ }, null)]);
25804
+ });
25805
+ }
25806
+ });
25807
+
25808
+ // Types
25809
+
25810
+ // Types
25811
+
25812
+ const makeVSparklineProps = propsFactory({
25813
+ type: {
25814
+ type: String,
25815
+ default: 'trend'
25816
+ },
25817
+ ...makeVBarlineProps(),
25818
+ ...makeVTrendlineProps()
25819
+ }, 'VSparkline');
25820
+ const VSparkline = genericComponent()({
25821
+ name: 'VSparkline',
25822
+ props: makeVSparklineProps(),
25823
+ setup(props, _ref) {
25824
+ let {
25825
+ slots
25826
+ } = _ref;
25827
+ const {
25828
+ textColorClasses,
25829
+ textColorStyles
25830
+ } = useTextColor(vue.toRef(props, 'color'));
25831
+ const hasLabels = vue.computed(() => {
25832
+ return Boolean(props.showLabels || props.labels.length > 0 || !!slots?.label);
25833
+ });
25834
+ const totalHeight = vue.computed(() => {
25835
+ let height = parseInt(props.height, 10);
25836
+ if (hasLabels.value) height += parseInt(props.labelSize, 10) * 1.5;
25837
+ return height;
25838
+ });
25839
+ useRender(() => {
25840
+ const Tag = props.type === 'trend' ? VTrendline : VBarline;
25841
+ const lineProps = props.type === 'trend' ? VTrendline.filterProps(props) : VBarline.filterProps(props);
25842
+ return vue.createVNode(Tag, vue.mergeProps({
25843
+ "key": props.type,
25844
+ "class": textColorClasses.value,
25845
+ "style": textColorStyles.value,
25846
+ "viewBox": `0 0 ${props.width} ${parseInt(totalHeight.value, 10)}`
25847
+ }, lineProps), slots);
25848
+ });
25849
+ }
25850
+ });
25851
+
25852
+ // Types
25853
+
25854
+ const makeVSpeedDialProps = propsFactory({
25855
+ ...makeComponentProps(),
25856
+ ...makeVMenuProps({
25857
+ offset: 8,
25858
+ minWidth: 0,
25859
+ openDelay: 0,
25860
+ closeDelay: 100,
25861
+ location: 'top center',
25862
+ transition: 'scale-transition'
25863
+ })
25864
+ }, 'VSpeedDial');
25865
+ const VSpeedDial = genericComponent()({
25866
+ name: 'VSpeedDial',
25867
+ props: makeVSpeedDialProps(),
25868
+ emits: {
25869
+ 'update:modelValue': value => true
25870
+ },
25871
+ setup(props, _ref) {
25872
+ let {
25873
+ slots
25874
+ } = _ref;
25875
+ const model = useProxiedModel(props, 'modelValue');
25876
+ const menuRef = vue.ref();
25877
+ const location = vue.computed(() => {
25878
+ const [y, x = 'center'] = props.location.split(' ');
25879
+ return `${y} ${x}`;
25880
+ });
25881
+ const locationClasses = vue.computed(() => ({
25882
+ [`v-speed-dial__content--${location.value.replace(' ', '-')}`]: true
25883
+ }));
25884
+ useRender(() => {
25885
+ const menuProps = VMenu.filterProps(props);
25886
+ return vue.createVNode(VMenu, vue.mergeProps(menuProps, {
25887
+ "modelValue": model.value,
25888
+ "onUpdate:modelValue": $event => model.value = $event,
25889
+ "class": props.class,
25890
+ "style": props.style,
25891
+ "contentClass": ['v-speed-dial__content', locationClasses.value],
25892
+ "location": location.value,
25893
+ "ref": menuRef,
25894
+ "transition": "fade-transition"
25895
+ }), {
25896
+ ...slots,
25897
+ default: slotProps => vue.createVNode(VDefaultsProvider, {
25898
+ "defaults": {
25899
+ VBtn: {
25900
+ size: 'small'
25901
+ }
25902
+ }
25903
+ }, {
25904
+ default: () => [vue.createVNode(MaybeTransition, {
25905
+ "appear": true,
25906
+ "group": true,
25907
+ "transition": props.transition
25908
+ }, {
25909
+ default: () => [slots.default?.(slotProps)]
25910
+ })]
25911
+ })
25912
+ });
25913
+ });
25914
+ return {};
25915
+ }
25916
+ });
25917
+
25091
25918
  // Types
25092
25919
 
25093
25920
  const makeVStepperActionsProps = propsFactory({
@@ -26666,6 +27493,7 @@
26666
27493
  VColorPicker: VColorPicker,
26667
27494
  VCombobox: VCombobox,
26668
27495
  VComponentIcon: VComponentIcon,
27496
+ VConfirmEdit: VConfirmEdit,
26669
27497
  VContainer: VContainer,
26670
27498
  VCounter: VCounter,
26671
27499
  VDataIterator: VDataIterator,
@@ -26688,12 +27516,14 @@
26688
27516
  VDialogTopTransition: VDialogTopTransition,
26689
27517
  VDialogTransition: VDialogTransition,
26690
27518
  VDivider: VDivider,
27519
+ VEmptyState: VEmptyState,
26691
27520
  VExpandTransition: VExpandTransition,
26692
27521
  VExpandXTransition: VExpandXTransition,
26693
27522
  VExpansionPanel: VExpansionPanel,
26694
27523
  VExpansionPanelText: VExpansionPanelText,
26695
27524
  VExpansionPanelTitle: VExpansionPanelTitle,
26696
27525
  VExpansionPanels: VExpansionPanels,
27526
+ VFab: VFab,
26697
27527
  VFabTransition: VFabTransition,
26698
27528
  VFadeTransition: VFadeTransition,
26699
27529
  VField: VField,
@@ -26760,6 +27590,8 @@
26760
27590
  VSlider: VSlider,
26761
27591
  VSnackbar: VSnackbar,
26762
27592
  VSpacer: VSpacer,
27593
+ VSparkline: VSparkline,
27594
+ VSpeedDial: VSpeedDial,
26763
27595
  VStepper: VStepper,
26764
27596
  VStepperActions: VStepperActions,
26765
27597
  VStepperHeader: VStepperHeader,
@@ -26936,9 +27768,7 @@
26936
27768
  // If vnode.ctx is the same as the instance, then we're bound to a plain element
26937
27769
  // and need to find the nearest parent component instance to inherit provides from
26938
27770
  const provides = (vnode.ctx === binding.instance.$ ? findComponentParent(vnode, binding.instance.$)?.provides : vnode.ctx?.provides) ?? binding.instance.$.provides;
26939
- const node = vue.h(component, vue.mergeProps(_props, value), {
26940
- default: () => children
26941
- });
27771
+ const node = vue.h(component, vue.mergeProps(_props, value), children);
26942
27772
  node.appContext = Object.assign(Object.create(null), binding.instance.$.appContext, {
26943
27773
  provides
26944
27774
  });
@@ -27097,7 +27927,7 @@
27097
27927
  goTo
27098
27928
  };
27099
27929
  }
27100
- const version$1 = "3.6.0";
27930
+ const version$1 = "3.6.2";
27101
27931
  createVuetify$1.version = version$1;
27102
27932
 
27103
27933
  // Vue's inject() can only be used in setup
@@ -27122,7 +27952,7 @@
27122
27952
  ...options
27123
27953
  });
27124
27954
  };
27125
- const version = "3.6.0";
27955
+ const version = "3.6.2";
27126
27956
  createVuetify.version = version;
27127
27957
 
27128
27958
  exports.blueprints = index;