@vuetify/nightly 3.7.15-dev.2025-03-06 → 3.7.15-dev.2025-03-07

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.
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.7.15-dev.2025-03-06
2
+ * Vuetify v3.7.15-dev.2025-03-07
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -12928,17 +12928,31 @@
12928
12928
  // Types
12929
12929
 
12930
12930
  /**
12931
- * - match without highlight
12932
- * - single match (index), length already known
12933
- * - single match (start, end)
12934
- * - multiple matches (start, end), probably shouldn't overlap
12931
+ * - boolean: match without highlight
12932
+ * - number: single match (index), length already known
12933
+ * - []: single match (start, end)
12934
+ * - [][]: multiple matches (start, end), shouldn't overlap
12935
12935
  */
12936
12936
 
12937
12937
  // Composables
12938
12938
  const defaultFilter = (value, query, item) => {
12939
12939
  if (value == null || query == null) return -1;
12940
- return value.toString().toLocaleLowerCase().indexOf(query.toString().toLocaleLowerCase());
12940
+ value = value.toString().toLocaleLowerCase();
12941
+ query = query.toString().toLocaleLowerCase();
12942
+ const result = [];
12943
+ let idx = value.indexOf(query);
12944
+ while (~idx) {
12945
+ result.push([idx, idx + query.length]);
12946
+ idx = value.indexOf(query, idx + query.length);
12947
+ }
12948
+ return result.length ? result : -1;
12941
12949
  };
12950
+ function normaliseMatch(match, query) {
12951
+ if (match == null || typeof match === 'boolean' || match === -1) return;
12952
+ if (typeof match === 'number') return [[match, query.length]];
12953
+ if (Array.isArray(match[0])) return match;
12954
+ return [match];
12955
+ }
12942
12956
  const makeFilterProps = propsFactory({
12943
12957
  customFilter: Function,
12944
12958
  customKeyFilter: Object,
@@ -12969,7 +12983,7 @@
12969
12983
  const keyFilter = options?.customKeyFilter?.[key];
12970
12984
  match = keyFilter ? keyFilter(value, query, item) : filter(value, query, item);
12971
12985
  if (match !== -1 && match !== false) {
12972
- if (keyFilter) customMatches[key] = match;else defaultMatches[key] = match;
12986
+ if (keyFilter) customMatches[key] = normaliseMatch(match, query);else defaultMatches[key] = normaliseMatch(match, query);
12973
12987
  } else if (options?.filterMode === 'every') {
12974
12988
  continue loop;
12975
12989
  }
@@ -12977,7 +12991,7 @@
12977
12991
  } else {
12978
12992
  match = filter(item, query, item);
12979
12993
  if (match !== -1 && match !== false) {
12980
- defaultMatches.title = match;
12994
+ defaultMatches.title = normaliseMatch(match, query);
12981
12995
  }
12982
12996
  }
12983
12997
  const defaultMatchesLength = Object.keys(defaultMatches).length;
@@ -13037,20 +13051,26 @@
13037
13051
  getMatches
13038
13052
  };
13039
13053
  }
13054
+ function highlightResult(name, text, matches) {
13055
+ if (matches == null || !matches.length) return text;
13056
+ return matches.map((match, i) => {
13057
+ const start = i === 0 ? 0 : matches[i - 1][1];
13058
+ const result = [vue.createVNode("span", {
13059
+ "class": `${name}__unmask`
13060
+ }, [text.slice(start, match[0])]), vue.createVNode("span", {
13061
+ "class": `${name}__mask`
13062
+ }, [text.slice(match[0], match[1])])];
13063
+ if (i === matches.length - 1) {
13064
+ result.push(vue.createVNode("span", {
13065
+ "class": `${name}__unmask`
13066
+ }, [text.slice(match[1])]));
13067
+ }
13068
+ return vue.createVNode(vue.Fragment, null, [result]);
13069
+ });
13070
+ }
13040
13071
 
13041
13072
  // Types
13042
13073
 
13043
- function highlightResult$1(text, matches, length) {
13044
- if (matches == null) return text;
13045
- if (Array.isArray(matches)) throw new Error('Multiple matches is not implemented');
13046
- return typeof matches === 'number' && ~matches ? vue.createVNode(vue.Fragment, null, [vue.createVNode("span", {
13047
- "class": "v-autocomplete__unmask"
13048
- }, [text.substr(0, matches)]), vue.createVNode("span", {
13049
- "class": "v-autocomplete__mask"
13050
- }, [text.substr(matches, length)]), vue.createVNode("span", {
13051
- "class": "v-autocomplete__unmask"
13052
- }, [text.substr(matches + length)])]) : text;
13053
- }
13054
13074
  const makeVAutocompleteProps = propsFactory({
13055
13075
  autoSelectFirst: {
13056
13076
  type: [Boolean, String]
@@ -13422,7 +13442,7 @@
13422
13442
  }, null)]);
13423
13443
  },
13424
13444
  title: () => {
13425
- return isPristine.value ? item.title : highlightResult$1(item.title, getMatches(item)?.title, search.value?.length ?? 0);
13445
+ return isPristine.value ? item.title : highlightResult('v-autocomplete', item.title, getMatches(item)?.title);
13426
13446
  }
13427
13447
  });
13428
13448
  }
@@ -16915,17 +16935,6 @@
16915
16935
 
16916
16936
  // Types
16917
16937
 
16918
- function highlightResult(text, matches, length) {
16919
- if (matches == null) return text;
16920
- if (Array.isArray(matches)) throw new Error('Multiple matches is not implemented');
16921
- return typeof matches === 'number' && ~matches ? vue.createVNode(vue.Fragment, null, [vue.createVNode("span", {
16922
- "class": "v-combobox__unmask"
16923
- }, [text.substr(0, matches)]), vue.createVNode("span", {
16924
- "class": "v-combobox__mask"
16925
- }, [text.substr(matches, length)]), vue.createVNode("span", {
16926
- "class": "v-combobox__unmask"
16927
- }, [text.substr(matches + length)])]) : text;
16928
- }
16929
16938
  const makeVComboboxProps = propsFactory({
16930
16939
  autoSelectFirst: {
16931
16940
  type: [Boolean, String]
@@ -17339,7 +17348,7 @@
17339
17348
  }, null)]);
17340
17349
  },
17341
17350
  title: () => {
17342
- return isPristine.value ? item.title : highlightResult(item.title, getMatches(item)?.title, search.value?.length ?? 0);
17351
+ return isPristine.value ? item.title : highlightResult('v-combobox', item.title, getMatches(item)?.title);
17343
17352
  }
17344
17353
  });
17345
17354
  }
@@ -31152,7 +31161,7 @@
31152
31161
  };
31153
31162
  });
31154
31163
  }
31155
- const version$1 = "3.7.15-dev.2025-03-06";
31164
+ const version$1 = "3.7.15-dev.2025-03-07";
31156
31165
  createVuetify$1.version = version$1;
31157
31166
 
31158
31167
  // Vue's inject() can only be used in setup
@@ -31405,7 +31414,7 @@
31405
31414
 
31406
31415
  /* eslint-disable local-rules/sort-imports */
31407
31416
 
31408
- const version = "3.7.15-dev.2025-03-06";
31417
+ const version = "3.7.15-dev.2025-03-07";
31409
31418
 
31410
31419
  /* eslint-disable local-rules/sort-imports */
31411
31420