@vuetify/nightly 3.8.5-master.2025-05-20 → 3.8.6-dev.2025-05-21

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 (90) hide show
  1. package/CHANGELOG.md +21 -14
  2. package/dist/json/attributes.json +1331 -1311
  3. package/dist/json/importMap-labs.json +24 -24
  4. package/dist/json/importMap.json +192 -192
  5. package/dist/json/tags.json +5 -0
  6. package/dist/json/web-types.json +2610 -2471
  7. package/dist/vuetify-labs.cjs +288 -117
  8. package/dist/vuetify-labs.css +3866 -3838
  9. package/dist/vuetify-labs.d.ts +1490 -1352
  10. package/dist/vuetify-labs.esm.js +289 -118
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +288 -117
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +282 -106
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +3130 -3102
  17. package/dist/vuetify.d.ts +659 -519
  18. package/dist/vuetify.esm.js +283 -107
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +282 -106
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +1188 -1178
  24. package/dist/vuetify.min.js.map +1 -1
  25. package/lib/components/VAlert/VAlert.css +6 -1
  26. package/lib/components/VAlert/VAlert.d.ts +35 -0
  27. package/lib/components/VAlert/VAlert.js +14 -9
  28. package/lib/components/VAlert/VAlert.js.map +1 -1
  29. package/lib/components/VAlert/VAlert.sass +7 -1
  30. package/lib/components/VAutocomplete/VAutocomplete.d.ts +120 -96
  31. package/lib/components/VAutocomplete/VAutocomplete.js +18 -1
  32. package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
  33. package/lib/components/VBtnGroup/VBtnGroup.css +30 -7
  34. package/lib/components/VBtnGroup/VBtnGroup.d.ts +58 -32
  35. package/lib/components/VBtnGroup/VBtnGroup.js +7 -3
  36. package/lib/components/VBtnGroup/VBtnGroup.js.map +1 -1
  37. package/lib/components/VBtnGroup/VBtnGroup.sass +44 -17
  38. package/lib/components/VBtnToggle/VBtnToggle.d.ts +25 -0
  39. package/lib/components/VCheckbox/VCheckbox.d.ts +3 -3
  40. package/lib/components/VCombobox/VCombobox.d.ts +120 -96
  41. package/lib/components/VCombobox/VCombobox.js +19 -1
  42. package/lib/components/VCombobox/VCombobox.js.map +1 -1
  43. package/lib/components/VField/VField.d.ts +3 -3
  44. package/lib/components/VFileInput/VFileInput.d.ts +15 -15
  45. package/lib/components/VInput/VInput.d.ts +4 -4
  46. package/lib/components/VList/VListChildren.js.map +1 -1
  47. package/lib/components/VNumberInput/VNumberInput.d.ts +103 -89
  48. package/lib/components/VNumberInput/VNumberInput.js +19 -4
  49. package/lib/components/VNumberInput/VNumberInput.js.map +1 -1
  50. package/lib/components/VOverlay/VOverlay.css +1 -1
  51. package/lib/components/VOverlay/_variables.scss +1 -1
  52. package/lib/components/VRadioGroup/VRadioGroup.d.ts +3 -3
  53. package/lib/components/VRangeSlider/VRangeSlider.d.ts +3 -3
  54. package/lib/components/VSelect/VSelect.d.ts +120 -96
  55. package/lib/components/VSelect/VSelect.js +18 -1
  56. package/lib/components/VSelect/VSelect.js.map +1 -1
  57. package/lib/components/VSlider/VSlider.d.ts +3 -3
  58. package/lib/components/VSwitch/VSwitch.d.ts +3 -3
  59. package/lib/components/VTextField/VTextField.d.ts +27 -27
  60. package/lib/components/VTextarea/VTextarea.d.ts +15 -15
  61. package/lib/composables/calendar.d.ts +1 -0
  62. package/lib/composables/calendar.js.map +1 -1
  63. package/lib/composables/date/index.d.ts +1 -0
  64. package/lib/composables/date/index.js +1 -0
  65. package/lib/composables/date/index.js.map +1 -1
  66. package/lib/composables/filter.js +3 -0
  67. package/lib/composables/filter.js.map +1 -1
  68. package/lib/composables/iconSizes.d.ts +28 -0
  69. package/lib/composables/iconSizes.js +23 -0
  70. package/lib/composables/iconSizes.js.map +1 -0
  71. package/lib/composables/theme.d.ts +6 -1
  72. package/lib/composables/theme.js +94 -26
  73. package/lib/composables/theme.js.map +1 -1
  74. package/lib/composables/virtual.js +6 -1
  75. package/lib/composables/virtual.js.map +1 -1
  76. package/lib/entry-bundler.js +1 -1
  77. package/lib/entry-bundler.js.map +1 -1
  78. package/lib/framework.d.ts +74 -69
  79. package/lib/framework.js +1 -1
  80. package/lib/framework.js.map +1 -1
  81. package/lib/labs/VColorInput/VColorInput.d.ts +3 -3
  82. package/lib/labs/VDateInput/VDateInput.d.ts +87 -87
  83. package/lib/labs/VFileUpload/VFileUpload.d.ts +3 -3
  84. package/lib/labs/VIconBtn/VIconBtn.d.ts +29 -29
  85. package/lib/labs/VIconBtn/VIconBtn.js +7 -11
  86. package/lib/labs/VIconBtn/VIconBtn.js.map +1 -1
  87. package/lib/util/globals.d.ts +1 -0
  88. package/lib/util/globals.js +1 -0
  89. package/lib/util/globals.js.map +1 -1
  90. package/package.json +3 -1
@@ -1 +1 @@
1
- {"version":3,"file":"calendar.js","names":["useDate","useProxiedModel","computed","propsFactory","wrapInArray","makeCalendarProps","allowedDates","Array","Function","disabled","type","Boolean","default","displayValue","modelValue","month","Number","String","max","min","showAdjacentMonths","year","weekdays","weeksInMonth","firstDayOfWeek","undefined","weekdayFormat","useCalendar","props","adapter","model","v","map","i","date","value","length","isArray","getYear","startOfYear","setYear","getMonth","startOfMonth","setMonth","weekDays","toJsDate","startOfWeek","getDay","day","weeks","getWeekArray","days","flat","daysInMonth","lastDay","week","push","addDays","genDays","today","filter","includes","index","isoDate","toISO","isAdjacent","isSameMonth","isStart","isSameDay","isEnd","endOfMonth","isSame","formatted","format","isDisabled","isHidden","isSelected","some","isToday","isWeekEnd","isWeekStart","localized","daysInWeek","weekNumbers","getWeek","isAfter","d"],"sources":["../../src/composables/calendar.ts"],"sourcesContent":["// Composables\nimport { useDate } from '@/composables/date/date'\nimport { useProxiedModel } from '@/composables/proxiedModel'\n\n// Utilities\nimport { computed } from 'vue'\nimport { propsFactory, wrapInArray } from '@/util'\n\n// Types\nimport type { PropType } from 'vue'\n\n// Types\nexport interface CalendarProps {\n allowedDates: unknown[] | ((date: unknown) => boolean) | undefined\n disabled: boolean\n displayValue?: unknown\n modelValue: unknown[] | undefined\n max: unknown\n min: unknown\n showAdjacentMonths: boolean\n month: number | string | undefined\n weekdays: number[]\n year: number | string | undefined\n weeksInMonth: 'dynamic' | 'static'\n firstDayOfWeek: number | string | undefined\n\n 'onUpdate:modelValue': ((value: unknown[]) => void) | undefined\n 'onUpdate:month': ((value: number) => void) | undefined\n 'onUpdate:year': ((value: number) => void) | undefined\n}\n\nexport type CalendarDay = {\n date: Date\n formatted: string\n isAdjacent: boolean\n isDisabled: boolean\n isEnd: boolean\n isHidden: boolean\n isSame: boolean\n isSelected: boolean\n isStart: boolean\n isToday: boolean\n isWeekEnd: boolean\n isWeekStart: boolean\n isoDate: string\n localized: string\n month: number\n year: number\n}\n\nexport type CalendarWeekdays = 0 | 1 | 2 | 3 | 4 | 5 | 6\n\n// Composables\nexport const makeCalendarProps = propsFactory({\n allowedDates: [Array, Function] as PropType<unknown[] | ((date: unknown) => boolean)>,\n disabled: {\n type: Boolean,\n default: null,\n },\n displayValue: null as any as PropType<unknown>,\n modelValue: Array as PropType<unknown[]>,\n month: [Number, String],\n max: null as any as PropType<unknown>,\n min: null as any as PropType<unknown>,\n showAdjacentMonths: Boolean,\n year: [Number, String],\n weekdays: {\n type: Array as PropType<CalendarWeekdays[]>,\n default: () => [0, 1, 2, 3, 4, 5, 6],\n },\n weeksInMonth: {\n type: String as PropType<'dynamic' | 'static'>,\n default: 'dynamic',\n },\n firstDayOfWeek: {\n type: [Number, String],\n default: undefined,\n },\n weekdayFormat: String as PropType<'long' | 'short' | 'narrow' | undefined>,\n}, 'calendar')\n\nexport function useCalendar (props: CalendarProps) {\n const adapter = useDate()\n const model = useProxiedModel(\n props,\n 'modelValue',\n [],\n v => wrapInArray(v).map(i => adapter.date(i)),\n )\n const displayValue = computed(() => {\n if (props.displayValue) return adapter.date(props.displayValue)\n if (model.value.length > 0) return adapter.date(model.value[0])\n if (props.min) return adapter.date(props.min)\n if (Array.isArray(props.allowedDates)) return adapter.date(props.allowedDates[0])\n\n return adapter.date()\n })\n\n const year = useProxiedModel(\n props,\n 'year',\n undefined,\n v => {\n const value = v != null ? Number(v) : adapter.getYear(displayValue.value)\n\n return adapter.startOfYear(adapter.setYear(adapter.date(), value))\n },\n v => adapter.getYear(v)\n )\n\n const month = useProxiedModel(\n props,\n 'month',\n undefined,\n v => {\n const value = v != null ? Number(v) : adapter.getMonth(displayValue.value)\n const date = adapter.setYear(adapter.startOfMonth(adapter.date()), adapter.getYear(year.value))\n\n return adapter.setMonth(date, value)\n },\n v => adapter.getMonth(v)\n )\n\n const weekDays = computed(() => {\n const firstDayOfWeek = adapter.toJsDate(adapter.startOfWeek(adapter.date(), props.firstDayOfWeek)).getDay()\n // Always generate all days, regardless of props.weekdays\n return [0, 1, 2, 3, 4, 5, 6].map(day => (day + firstDayOfWeek) % 7)\n })\n\n const weeksInMonth = computed(() => {\n const weeks = adapter.getWeekArray(month.value, props.firstDayOfWeek)\n\n const days = weeks.flat()\n\n // Make sure there's always 6 weeks in month (6 * 7 days)\n // if weeksInMonth is 'static'\n const daysInMonth = 6 * 7\n if (props.weeksInMonth === 'static' && days.length < daysInMonth) {\n const lastDay = days[days.length - 1]\n\n let week = []\n for (let day = 1; day <= daysInMonth - days.length; day++) {\n week.push(adapter.addDays(lastDay, day))\n\n if (day % 7 === 0) {\n weeks.push(week)\n week = []\n }\n }\n }\n\n return weeks\n })\n\n function genDays (days: Date[], today: Date): CalendarDay[] {\n return days.filter(date => {\n return weekDays.value.includes(adapter.toJsDate(date).getDay())\n }).map((date, index) => {\n const isoDate = adapter.toISO(date)\n const isAdjacent = !adapter.isSameMonth(date, month.value)\n const isStart = adapter.isSameDay(date, adapter.startOfMonth(month.value))\n const isEnd = adapter.isSameDay(date, adapter.endOfMonth(month.value))\n const isSame = adapter.isSameDay(date, month.value)\n\n return {\n date,\n formatted: adapter.format(date, 'keyboardDate'),\n isAdjacent,\n isDisabled: isDisabled(date),\n isEnd,\n isHidden: isAdjacent && !props.showAdjacentMonths,\n isSame,\n isSelected: model.value.some(value => adapter.isSameDay(date, value)),\n isStart,\n isToday: adapter.isSameDay(date, today),\n isWeekEnd: index % 7 === 6,\n isWeekStart: index % 7 === 0,\n isoDate,\n localized: adapter.format(date, 'dayOfMonth'),\n month: adapter.getMonth(date),\n year: adapter.getYear(date),\n }\n })\n }\n\n const daysInWeek = computed(() => {\n const lastDay = adapter.startOfWeek(displayValue.value, props.firstDayOfWeek)\n const week: Date[] = []\n for (let day = 0; day <= 6; day++) {\n week.push(adapter.addDays(lastDay, day) as Date)\n }\n\n const today = adapter.date() as Date\n\n return genDays(week as Date[], today as Date)\n })\n\n const daysInMonth = computed(() => {\n const days = weeksInMonth.value.flat() as Date[]\n const today = adapter.date() as Date\n\n return genDays(days as Date[], today)\n })\n\n const weekNumbers = computed(() => {\n return weeksInMonth.value.map(week => {\n return week.length ? adapter.getWeek(week[0], props.firstDayOfWeek) : null\n })\n })\n\n function isDisabled (value: unknown) {\n if (props.disabled) return true\n\n const date = adapter.date(value)\n\n if (props.min && adapter.isAfter(adapter.date(props.min), date)) return true\n if (props.max && adapter.isAfter(date, adapter.date(props.max))) return true\n\n if (Array.isArray(props.allowedDates) && props.allowedDates.length > 0) {\n return !props.allowedDates.some(d => adapter.isSameDay(adapter.date(d), date))\n }\n\n if (typeof props.allowedDates === 'function') {\n return !props.allowedDates(date)\n }\n\n return !props.weekdays.includes(adapter.toJsDate(date).getDay())\n }\n\n return {\n displayValue,\n daysInMonth,\n daysInWeek,\n genDays,\n model,\n weeksInMonth,\n weekDays,\n weekNumbers,\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"calendar.js","names":["useDate","useProxiedModel","computed","propsFactory","wrapInArray","makeCalendarProps","allowedDates","Array","Function","disabled","type","Boolean","default","displayValue","modelValue","month","Number","String","max","min","showAdjacentMonths","year","weekdays","weeksInMonth","firstDayOfWeek","undefined","weekdayFormat","useCalendar","props","adapter","model","v","map","i","date","value","length","isArray","getYear","startOfYear","setYear","getMonth","startOfMonth","setMonth","weekDays","toJsDate","startOfWeek","getDay","day","weeks","getWeekArray","days","flat","daysInMonth","lastDay","week","push","addDays","genDays","today","filter","includes","index","isoDate","toISO","isAdjacent","isSameMonth","isStart","isSameDay","isEnd","endOfMonth","isSame","formatted","format","isDisabled","isHidden","isSelected","some","isToday","isWeekEnd","isWeekStart","localized","daysInWeek","weekNumbers","getWeek","isAfter","d"],"sources":["../../src/composables/calendar.ts"],"sourcesContent":["// Composables\nimport { useDate } from '@/composables/date/date'\nimport { useProxiedModel } from '@/composables/proxiedModel'\n\n// Utilities\nimport { computed } from 'vue'\nimport { propsFactory, wrapInArray } from '@/util'\n\n// Types\nimport type { PropType } from 'vue'\n\n// Types\nexport interface CalendarProps {\n allowedDates: unknown[] | ((date: unknown) => boolean) | undefined\n disabled: boolean\n displayValue?: unknown\n modelValue: unknown[] | undefined\n max: unknown\n min: unknown\n showAdjacentMonths: boolean\n month: number | string | undefined\n weekdays: number[]\n year: number | string | undefined\n weeksInMonth: 'dynamic' | 'static'\n\n /** @deprecated */\n firstDayOfWeek: number | string | undefined\n\n 'onUpdate:modelValue': ((value: unknown[]) => void) | undefined\n 'onUpdate:month': ((value: number) => void) | undefined\n 'onUpdate:year': ((value: number) => void) | undefined\n}\n\nexport type CalendarDay = {\n date: Date\n formatted: string\n isAdjacent: boolean\n isDisabled: boolean\n isEnd: boolean\n isHidden: boolean\n isSame: boolean\n isSelected: boolean\n isStart: boolean\n isToday: boolean\n isWeekEnd: boolean\n isWeekStart: boolean\n isoDate: string\n localized: string\n month: number\n year: number\n}\n\nexport type CalendarWeekdays = 0 | 1 | 2 | 3 | 4 | 5 | 6\n\n// Composables\nexport const makeCalendarProps = propsFactory({\n allowedDates: [Array, Function] as PropType<unknown[] | ((date: unknown) => boolean)>,\n disabled: {\n type: Boolean,\n default: null,\n },\n displayValue: null as any as PropType<unknown>,\n modelValue: Array as PropType<unknown[]>,\n month: [Number, String],\n max: null as any as PropType<unknown>,\n min: null as any as PropType<unknown>,\n showAdjacentMonths: Boolean,\n year: [Number, String],\n weekdays: {\n type: Array as PropType<CalendarWeekdays[]>,\n default: () => [0, 1, 2, 3, 4, 5, 6],\n },\n weeksInMonth: {\n type: String as PropType<'dynamic' | 'static'>,\n default: 'dynamic',\n },\n firstDayOfWeek: {\n type: [Number, String],\n default: undefined,\n },\n weekdayFormat: String as PropType<'long' | 'short' | 'narrow' | undefined>,\n}, 'calendar')\n\nexport function useCalendar (props: CalendarProps) {\n const adapter = useDate()\n const model = useProxiedModel(\n props,\n 'modelValue',\n [],\n v => wrapInArray(v).map(i => adapter.date(i)),\n )\n const displayValue = computed(() => {\n if (props.displayValue) return adapter.date(props.displayValue)\n if (model.value.length > 0) return adapter.date(model.value[0])\n if (props.min) return adapter.date(props.min)\n if (Array.isArray(props.allowedDates)) return adapter.date(props.allowedDates[0])\n\n return adapter.date()\n })\n\n const year = useProxiedModel(\n props,\n 'year',\n undefined,\n v => {\n const value = v != null ? Number(v) : adapter.getYear(displayValue.value)\n\n return adapter.startOfYear(adapter.setYear(adapter.date(), value))\n },\n v => adapter.getYear(v)\n )\n\n const month = useProxiedModel(\n props,\n 'month',\n undefined,\n v => {\n const value = v != null ? Number(v) : adapter.getMonth(displayValue.value)\n const date = adapter.setYear(adapter.startOfMonth(adapter.date()), adapter.getYear(year.value))\n\n return adapter.setMonth(date, value)\n },\n v => adapter.getMonth(v)\n )\n\n const weekDays = computed(() => {\n const firstDayOfWeek = adapter.toJsDate(adapter.startOfWeek(adapter.date(), props.firstDayOfWeek)).getDay()\n // Always generate all days, regardless of props.weekdays\n return [0, 1, 2, 3, 4, 5, 6].map(day => (day + firstDayOfWeek) % 7)\n })\n\n const weeksInMonth = computed(() => {\n const weeks = adapter.getWeekArray(month.value, props.firstDayOfWeek)\n\n const days = weeks.flat()\n\n // Make sure there's always 6 weeks in month (6 * 7 days)\n // if weeksInMonth is 'static'\n const daysInMonth = 6 * 7\n if (props.weeksInMonth === 'static' && days.length < daysInMonth) {\n const lastDay = days[days.length - 1]\n\n let week = []\n for (let day = 1; day <= daysInMonth - days.length; day++) {\n week.push(adapter.addDays(lastDay, day))\n\n if (day % 7 === 0) {\n weeks.push(week)\n week = []\n }\n }\n }\n\n return weeks\n })\n\n function genDays (days: Date[], today: Date): CalendarDay[] {\n return days.filter(date => {\n return weekDays.value.includes(adapter.toJsDate(date).getDay())\n }).map((date, index) => {\n const isoDate = adapter.toISO(date)\n const isAdjacent = !adapter.isSameMonth(date, month.value)\n const isStart = adapter.isSameDay(date, adapter.startOfMonth(month.value))\n const isEnd = adapter.isSameDay(date, adapter.endOfMonth(month.value))\n const isSame = adapter.isSameDay(date, month.value)\n\n return {\n date,\n formatted: adapter.format(date, 'keyboardDate'),\n isAdjacent,\n isDisabled: isDisabled(date),\n isEnd,\n isHidden: isAdjacent && !props.showAdjacentMonths,\n isSame,\n isSelected: model.value.some(value => adapter.isSameDay(date, value)),\n isStart,\n isToday: adapter.isSameDay(date, today),\n isWeekEnd: index % 7 === 6,\n isWeekStart: index % 7 === 0,\n isoDate,\n localized: adapter.format(date, 'dayOfMonth'),\n month: adapter.getMonth(date),\n year: adapter.getYear(date),\n }\n })\n }\n\n const daysInWeek = computed(() => {\n const lastDay = adapter.startOfWeek(displayValue.value, props.firstDayOfWeek)\n const week: Date[] = []\n for (let day = 0; day <= 6; day++) {\n week.push(adapter.addDays(lastDay, day) as Date)\n }\n\n const today = adapter.date() as Date\n\n return genDays(week as Date[], today as Date)\n })\n\n const daysInMonth = computed(() => {\n const days = weeksInMonth.value.flat() as Date[]\n const today = adapter.date() as Date\n\n return genDays(days as Date[], today)\n })\n\n const weekNumbers = computed(() => {\n return weeksInMonth.value.map(week => {\n return week.length ? adapter.getWeek(week[0], props.firstDayOfWeek) : null\n })\n })\n\n function isDisabled (value: unknown) {\n if (props.disabled) return true\n\n const date = adapter.date(value)\n\n if (props.min && adapter.isAfter(adapter.date(props.min), date)) return true\n if (props.max && adapter.isAfter(date, adapter.date(props.max))) return true\n\n if (Array.isArray(props.allowedDates) && props.allowedDates.length > 0) {\n return !props.allowedDates.some(d => adapter.isSameDay(adapter.date(d), date))\n }\n\n if (typeof props.allowedDates === 'function') {\n return !props.allowedDates(date)\n }\n\n return !props.weekdays.includes(adapter.toJsDate(date).getDay())\n }\n\n return {\n displayValue,\n daysInMonth,\n daysInWeek,\n genDays,\n model,\n weeksInMonth,\n weekDays,\n weekNumbers,\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,3 +1,4 @@
1
1
  export { createDate, useDate, DateAdapterSymbol } from './date.js';
2
2
  export type { DateAdapter } from './DateAdapter.js';
3
3
  export type { DateOptions, DateInstance, DateModule } from './date.js';
4
+ export { VuetifyDateAdapter } from './adapters/vuetify.js';
@@ -1,2 +1,3 @@
1
1
  export { createDate, useDate, DateAdapterSymbol } from "./date.js";
2
+ export { VuetifyDateAdapter } from "./adapters/vuetify.js";
2
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["createDate","useDate","DateAdapterSymbol"],"sources":["../../../src/composables/date/index.ts"],"sourcesContent":["export { createDate, useDate, DateAdapterSymbol } from './date'\nexport type { DateAdapter } from './DateAdapter'\nexport type { DateOptions, DateInstance, DateModule } from './date'\n"],"mappings":"SAASA,UAAU,EAAEC,OAAO,EAAEC,iBAAiB","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["createDate","useDate","DateAdapterSymbol","VuetifyDateAdapter"],"sources":["../../../src/composables/date/index.ts"],"sourcesContent":["export { createDate, useDate, DateAdapterSymbol } from './date'\nexport type { DateAdapter } from './DateAdapter'\nexport type { DateOptions, DateInstance, DateModule } from './date'\nexport { VuetifyDateAdapter } from './adapters/vuetify'\n"],"mappings":"SAASA,UAAU,EAAEC,OAAO,EAAEC,iBAAiB;AAAA,SAGtCC,kBAAkB","ignoreList":[]}
@@ -54,6 +54,9 @@ export function filterItems(items, query, options) {
54
54
  let match = -1;
55
55
  if ((query || customFiltersLength > 0) && !options?.noFilter) {
56
56
  if (typeof item === 'object') {
57
+ if (['divider', 'subheader'].includes(item.raw?.type)) {
58
+ continue;
59
+ }
57
60
  const filterKeys = keys || Object.keys(transformed);
58
61
  for (const key of filterKeys) {
59
62
  const value = getPropertyFromItem(transformed, key);
@@ -1 +1 @@
1
- {"version":3,"file":"filter.js","names":["computed","shallowRef","unref","watchEffect","createVNode","_createVNode","Fragment","_Fragment","getPropertyFromItem","propsFactory","wrapInArray","defaultFilter","value","query","item","length","toString","toLocaleLowerCase","result","idx","indexOf","push","normaliseMatch","match","Array","isArray","makeFilterProps","customFilter","Function","customKeyFilter","Object","filterKeys","String","filterMode","type","default","noFilter","Boolean","filterItems","items","options","array","filter","keys","customFiltersLength","loop","i","transformed","customMatches","defaultMatches","key","keyFilter","title","defaultMatchesLength","customMatchesLength","index","matches","useFilter","props","filteredItems","filteredMatches","Map","transformedItems","transform","map","_query","strQuery","results","originalItems","_filteredItems","_filteredMatches","forEach","_ref","set","getMatches","get","highlightResult","name","text","start","slice"],"sources":["../../src/composables/filter.tsx"],"sourcesContent":["/* eslint-disable max-statements */\n/* eslint-disable no-labels */\n\n// Utilities\nimport { computed, shallowRef, unref, watchEffect } from 'vue'\nimport { getPropertyFromItem, propsFactory, wrapInArray } from '@/util'\n\n// Types\nimport type { PropType, Ref } from 'vue'\nimport type { MaybeRef } from '@/util'\n\n/**\n * - boolean: match without highlight\n * - number: single match (index), length already known\n * - []: single match (start, end)\n * - [][]: multiple matches (start, end), shouldn't overlap\n */\nexport type FilterMatchArraySingle = readonly [number, number]\nexport type FilterMatchArrayMultiple = readonly FilterMatchArraySingle[]\nexport type FilterMatchArray = FilterMatchArraySingle | FilterMatchArrayMultiple\nexport type FilterMatch = boolean | number | FilterMatchArray\nexport type FilterFunction = (value: string, query: string, item?: InternalItem) => FilterMatch\nexport type FilterKeyFunctions = Record<string, FilterFunction>\nexport type FilterKeys = string | string[]\nexport type FilterMode = 'some' | 'every' | 'union' | 'intersection'\n\nexport interface FilterProps {\n customFilter?: FilterFunction\n customKeyFilter?: FilterKeyFunctions\n filterKeys?: FilterKeys\n filterMode?: FilterMode\n noFilter?: boolean\n}\n\nexport interface InternalItem<T = any> {\n value: any\n raw: T\n}\n\n// Composables\nexport const defaultFilter: FilterFunction = (value, query, item) => {\n if (value == null || query == null) return -1\n if (!query.length) return 0\n\n value = value.toString().toLocaleLowerCase()\n query = query.toString().toLocaleLowerCase()\n\n const result = []\n let idx = value.indexOf(query)\n while (~idx) {\n result.push([idx, idx + query.length] as const)\n\n idx = value.indexOf(query, idx + query.length)\n }\n\n return result.length ? result : -1\n}\n\nfunction normaliseMatch (match: FilterMatch, query: string): FilterMatchArrayMultiple | undefined {\n if (match == null || typeof match === 'boolean' || match === -1) return\n if (typeof match === 'number') return [[match, match + query.length]]\n if (Array.isArray(match[0])) return match as FilterMatchArrayMultiple\n return [match] as FilterMatchArrayMultiple\n}\n\nexport const makeFilterProps = propsFactory({\n customFilter: Function as PropType<FilterFunction>,\n customKeyFilter: Object as PropType<FilterKeyFunctions>,\n filterKeys: [Array, String] as PropType<FilterKeys>,\n filterMode: {\n type: String as PropType<FilterMode>,\n default: 'intersection',\n },\n noFilter: Boolean,\n}, 'filter')\n\nexport function filterItems (\n items: readonly (readonly [item: InternalItem, transformed: {}])[] | readonly InternalItem[],\n query: string,\n options?: {\n customKeyFilter?: FilterKeyFunctions\n default?: FilterFunction\n filterKeys?: FilterKeys\n filterMode?: FilterMode\n noFilter?: boolean\n },\n) {\n const array: { index: number, matches: Record<string, FilterMatchArrayMultiple | undefined> }[] = []\n // always ensure we fall back to a functioning filter\n const filter = options?.default ?? defaultFilter\n const keys = options?.filterKeys ? wrapInArray(options.filterKeys) : false\n const customFiltersLength = Object.keys(options?.customKeyFilter ?? {}).length\n\n if (!items?.length) return array\n\n loop:\n for (let i = 0; i < items.length; i++) {\n const [item, transformed = item] = wrapInArray(items[i]) as readonly [InternalItem, {}]\n const customMatches: Record<string, FilterMatchArrayMultiple | undefined> = {}\n const defaultMatches: Record<string, FilterMatchArrayMultiple | undefined> = {}\n let match: FilterMatch = -1\n\n if ((query || customFiltersLength > 0) && !options?.noFilter) {\n if (typeof item === 'object') {\n const filterKeys = keys || Object.keys(transformed)\n\n for (const key of filterKeys) {\n const value = getPropertyFromItem(transformed, key)\n const keyFilter = options?.customKeyFilter?.[key]\n\n match = keyFilter\n ? keyFilter(value, query, item)\n : filter(value, query, item)\n\n if (match !== -1 && match !== false) {\n if (keyFilter) customMatches[key] = normaliseMatch(match, query)\n else defaultMatches[key] = normaliseMatch(match, query)\n } else if (options?.filterMode === 'every') {\n continue loop\n }\n }\n } else {\n match = filter(item, query, item)\n if (match !== -1 && match !== false) {\n defaultMatches.title = normaliseMatch(match, query)\n }\n }\n\n const defaultMatchesLength = Object.keys(defaultMatches).length\n const customMatchesLength = Object.keys(customMatches).length\n\n if (!defaultMatchesLength && !customMatchesLength) continue\n\n if (\n options?.filterMode === 'union' &&\n customMatchesLength !== customFiltersLength &&\n !defaultMatchesLength\n ) continue\n\n if (\n options?.filterMode === 'intersection' &&\n (\n customMatchesLength !== customFiltersLength ||\n !defaultMatchesLength\n )\n ) continue\n }\n\n array.push({ index: i, matches: { ...defaultMatches, ...customMatches } })\n }\n\n return array\n}\n\nexport function useFilter <T extends InternalItem> (\n props: FilterProps,\n items: MaybeRef<T[]>,\n query: Ref<string | undefined> | (() => string | undefined),\n options?: {\n transform?: (item: T) => {}\n customKeyFilter?: MaybeRef<FilterKeyFunctions | undefined>\n }\n) {\n const filteredItems = shallowRef<T[]>([])\n const filteredMatches = shallowRef(new Map<unknown, Record<string, FilterMatchArrayMultiple | undefined>>())\n const transformedItems = computed(() => (\n options?.transform\n ? unref(items).map(item => ([item, options.transform!(item)] as const))\n : unref(items)\n ))\n\n watchEffect(() => {\n const _query = typeof query === 'function' ? query() : unref(query)\n const strQuery = (\n typeof _query !== 'string' &&\n typeof _query !== 'number'\n ) ? '' : String(_query)\n\n const results = filterItems(\n transformedItems.value,\n strQuery,\n {\n customKeyFilter: {\n ...props.customKeyFilter,\n ...unref(options?.customKeyFilter),\n },\n default: props.customFilter,\n filterKeys: props.filterKeys,\n filterMode: props.filterMode,\n noFilter: props.noFilter,\n },\n )\n\n const originalItems = unref(items)\n\n const _filteredItems: typeof filteredItems['value'] = []\n const _filteredMatches: typeof filteredMatches['value'] = new Map()\n results.forEach(({ index, matches }) => {\n const item = originalItems[index]\n _filteredItems.push(item)\n _filteredMatches.set(item.value, matches)\n })\n filteredItems.value = _filteredItems\n filteredMatches.value = _filteredMatches\n })\n\n function getMatches (item: T) {\n return filteredMatches.value.get(item.value)\n }\n\n return { filteredItems, filteredMatches, getMatches }\n}\n\nexport function highlightResult (name: string, text: string, matches: FilterMatchArrayMultiple | undefined) {\n if (matches == null || !matches.length) return text\n\n return matches.map((match, i) => {\n const start = i === 0 ? 0 : matches[i - 1][1]\n const result = [\n <span class={ `${name}__unmask` }>{ text.slice(start, match[0]) }</span>,\n <span class={ `${name}__mask` }>{ text.slice(match[0], match[1]) }</span>,\n ]\n if (i === matches.length - 1) {\n result.push(<span class={ `${name}__unmask` }>{ text.slice(match[1]) }</span>)\n }\n return <>{ result }</>\n })\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"filter.js","names":["computed","shallowRef","unref","watchEffect","createVNode","_createVNode","Fragment","_Fragment","getPropertyFromItem","propsFactory","wrapInArray","defaultFilter","value","query","item","length","toString","toLocaleLowerCase","result","idx","indexOf","push","normaliseMatch","match","Array","isArray","makeFilterProps","customFilter","Function","customKeyFilter","Object","filterKeys","String","filterMode","type","default","noFilter","Boolean","filterItems","items","options","array","filter","keys","customFiltersLength","loop","i","transformed","customMatches","defaultMatches","includes","raw","key","keyFilter","title","defaultMatchesLength","customMatchesLength","index","matches","useFilter","props","filteredItems","filteredMatches","Map","transformedItems","transform","map","_query","strQuery","results","originalItems","_filteredItems","_filteredMatches","forEach","_ref","set","getMatches","get","highlightResult","name","text","start","slice"],"sources":["../../src/composables/filter.tsx"],"sourcesContent":["/* eslint-disable max-statements */\n/* eslint-disable no-labels */\n\n// Utilities\nimport { computed, shallowRef, unref, watchEffect } from 'vue'\nimport { getPropertyFromItem, propsFactory, wrapInArray } from '@/util'\n\n// Types\nimport type { PropType, Ref } from 'vue'\nimport type { MaybeRef } from '@/util'\n\n/**\n * - boolean: match without highlight\n * - number: single match (index), length already known\n * - []: single match (start, end)\n * - [][]: multiple matches (start, end), shouldn't overlap\n */\nexport type FilterMatchArraySingle = readonly [number, number]\nexport type FilterMatchArrayMultiple = readonly FilterMatchArraySingle[]\nexport type FilterMatchArray = FilterMatchArraySingle | FilterMatchArrayMultiple\nexport type FilterMatch = boolean | number | FilterMatchArray\nexport type FilterFunction = (value: string, query: string, item?: InternalItem) => FilterMatch\nexport type FilterKeyFunctions = Record<string, FilterFunction>\nexport type FilterKeys = string | string[]\nexport type FilterMode = 'some' | 'every' | 'union' | 'intersection'\n\nexport interface FilterProps {\n customFilter?: FilterFunction\n customKeyFilter?: FilterKeyFunctions\n filterKeys?: FilterKeys\n filterMode?: FilterMode\n noFilter?: boolean\n}\n\nexport interface InternalItem<T = any> {\n value: any\n raw: T\n}\n\n// Composables\nexport const defaultFilter: FilterFunction = (value, query, item) => {\n if (value == null || query == null) return -1\n if (!query.length) return 0\n\n value = value.toString().toLocaleLowerCase()\n query = query.toString().toLocaleLowerCase()\n\n const result = []\n let idx = value.indexOf(query)\n while (~idx) {\n result.push([idx, idx + query.length] as const)\n\n idx = value.indexOf(query, idx + query.length)\n }\n\n return result.length ? result : -1\n}\n\nfunction normaliseMatch (match: FilterMatch, query: string): FilterMatchArrayMultiple | undefined {\n if (match == null || typeof match === 'boolean' || match === -1) return\n if (typeof match === 'number') return [[match, match + query.length]]\n if (Array.isArray(match[0])) return match as FilterMatchArrayMultiple\n return [match] as FilterMatchArrayMultiple\n}\n\nexport const makeFilterProps = propsFactory({\n customFilter: Function as PropType<FilterFunction>,\n customKeyFilter: Object as PropType<FilterKeyFunctions>,\n filterKeys: [Array, String] as PropType<FilterKeys>,\n filterMode: {\n type: String as PropType<FilterMode>,\n default: 'intersection',\n },\n noFilter: Boolean,\n}, 'filter')\n\nexport function filterItems (\n items: readonly (readonly [item: InternalItem, transformed: {}])[] | readonly InternalItem[],\n query: string,\n options?: {\n customKeyFilter?: FilterKeyFunctions\n default?: FilterFunction\n filterKeys?: FilterKeys\n filterMode?: FilterMode\n noFilter?: boolean\n },\n) {\n const array: { index: number, matches: Record<string, FilterMatchArrayMultiple | undefined> }[] = []\n // always ensure we fall back to a functioning filter\n const filter = options?.default ?? defaultFilter\n const keys = options?.filterKeys ? wrapInArray(options.filterKeys) : false\n const customFiltersLength = Object.keys(options?.customKeyFilter ?? {}).length\n\n if (!items?.length) return array\n\n loop:\n for (let i = 0; i < items.length; i++) {\n const [item, transformed = item] = wrapInArray(items[i]) as readonly [InternalItem, {}]\n const customMatches: Record<string, FilterMatchArrayMultiple | undefined> = {}\n const defaultMatches: Record<string, FilterMatchArrayMultiple | undefined> = {}\n let match: FilterMatch = -1\n\n if ((query || customFiltersLength > 0) && !options?.noFilter) {\n if (typeof item === 'object') {\n if (['divider', 'subheader'].includes(item.raw?.type)) {\n continue\n }\n\n const filterKeys = keys || Object.keys(transformed)\n\n for (const key of filterKeys) {\n const value = getPropertyFromItem(transformed, key)\n const keyFilter = options?.customKeyFilter?.[key]\n\n match = keyFilter\n ? keyFilter(value, query, item)\n : filter(value, query, item)\n\n if (match !== -1 && match !== false) {\n if (keyFilter) customMatches[key] = normaliseMatch(match, query)\n else defaultMatches[key] = normaliseMatch(match, query)\n } else if (options?.filterMode === 'every') {\n continue loop\n }\n }\n } else {\n match = filter(item, query, item)\n if (match !== -1 && match !== false) {\n defaultMatches.title = normaliseMatch(match, query)\n }\n }\n\n const defaultMatchesLength = Object.keys(defaultMatches).length\n const customMatchesLength = Object.keys(customMatches).length\n\n if (!defaultMatchesLength && !customMatchesLength) continue\n\n if (\n options?.filterMode === 'union' &&\n customMatchesLength !== customFiltersLength &&\n !defaultMatchesLength\n ) continue\n\n if (\n options?.filterMode === 'intersection' &&\n (\n customMatchesLength !== customFiltersLength ||\n !defaultMatchesLength\n )\n ) continue\n }\n\n array.push({ index: i, matches: { ...defaultMatches, ...customMatches } })\n }\n\n return array\n}\n\nexport function useFilter <T extends InternalItem> (\n props: FilterProps,\n items: MaybeRef<T[]>,\n query: Ref<string | undefined> | (() => string | undefined),\n options?: {\n transform?: (item: T) => {}\n customKeyFilter?: MaybeRef<FilterKeyFunctions | undefined>\n }\n) {\n const filteredItems = shallowRef<T[]>([])\n const filteredMatches = shallowRef(new Map<unknown, Record<string, FilterMatchArrayMultiple | undefined>>())\n const transformedItems = computed(() => (\n options?.transform\n ? unref(items).map(item => ([item, options.transform!(item)] as const))\n : unref(items)\n ))\n\n watchEffect(() => {\n const _query = typeof query === 'function' ? query() : unref(query)\n const strQuery = (\n typeof _query !== 'string' &&\n typeof _query !== 'number'\n ) ? '' : String(_query)\n\n const results = filterItems(\n transformedItems.value,\n strQuery,\n {\n customKeyFilter: {\n ...props.customKeyFilter,\n ...unref(options?.customKeyFilter),\n },\n default: props.customFilter,\n filterKeys: props.filterKeys,\n filterMode: props.filterMode,\n noFilter: props.noFilter,\n },\n )\n\n const originalItems = unref(items)\n\n const _filteredItems: typeof filteredItems['value'] = []\n const _filteredMatches: typeof filteredMatches['value'] = new Map()\n results.forEach(({ index, matches }) => {\n const item = originalItems[index]\n _filteredItems.push(item)\n _filteredMatches.set(item.value, matches)\n })\n filteredItems.value = _filteredItems\n filteredMatches.value = _filteredMatches\n })\n\n function getMatches (item: T) {\n return filteredMatches.value.get(item.value)\n }\n\n return { filteredItems, filteredMatches, getMatches }\n}\n\nexport function highlightResult (name: string, text: string, matches: FilterMatchArrayMultiple | undefined) {\n if (matches == null || !matches.length) return text\n\n return matches.map((match, i) => {\n const start = i === 0 ? 0 : matches[i - 1][1]\n const result = [\n <span class={ `${name}__unmask` }>{ text.slice(start, match[0]) }</span>,\n <span class={ `${name}__mask` }>{ text.slice(match[0], match[1]) }</span>,\n ]\n if (i === matches.length - 1) {\n result.push(<span class={ `${name}__unmask` }>{ text.slice(match[1]) }</span>)\n }\n return <>{ result }</>\n })\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,28 @@
1
+ import type { ComputedGetter, PropType } from 'vue';
2
+ import type { VIconBtnSizes } from "../labs/VIconBtn/VIconBtn.js";
3
+ export interface IconSizeProps {
4
+ iconSize?: VIconBtnSizes | number | string;
5
+ iconSizes: [VIconBtnSizes, number][];
6
+ }
7
+ export declare const makeIconSizeProps: <Defaults extends {
8
+ iconSize?: unknown;
9
+ iconSizes?: unknown;
10
+ } = {}>(defaults?: Defaults | undefined) => {
11
+ iconSize: unknown extends Defaults["iconSize"] ? PropType<string | number> : {
12
+ type: PropType<unknown extends Defaults["iconSize"] ? string | number : string | number | Defaults["iconSize"]>;
13
+ default: unknown extends Defaults["iconSize"] ? string | number : NonNullable<string | number> | Defaults["iconSize"];
14
+ };
15
+ iconSizes: unknown extends Defaults["iconSizes"] ? {
16
+ type: PropType<[VIconBtnSizes, number][]>;
17
+ default: () => (string | number)[][];
18
+ } : Omit<{
19
+ type: PropType<[VIconBtnSizes, number][]>;
20
+ default: () => (string | number)[][];
21
+ }, "type" | "default"> & {
22
+ type: PropType<unknown extends Defaults["iconSizes"] ? [VIconBtnSizes, number][] : [VIconBtnSizes, number][] | Defaults["iconSizes"]>;
23
+ default: unknown extends Defaults["iconSizes"] ? [VIconBtnSizes, number][] : [VIconBtnSizes, number][] | Defaults["iconSizes"];
24
+ };
25
+ };
26
+ export declare function useIconSizes(props: IconSizeProps, fallback: ComputedGetter<VIconBtnSizes | number | string | undefined>): {
27
+ iconSize: import("vue").ComputedRef<number | VIconBtnSizes | undefined>;
28
+ };
@@ -0,0 +1,23 @@
1
+ // Utilities
2
+ import { computed } from 'vue';
3
+ import { propsFactory } from "../util/index.js"; // Types
4
+ // Types
5
+ // Composables
6
+ export const makeIconSizeProps = propsFactory({
7
+ iconSize: [Number, String],
8
+ iconSizes: {
9
+ type: Array,
10
+ default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
11
+ }
12
+ }, 'iconSize');
13
+ export function useIconSizes(props, fallback) {
14
+ const iconSize = computed(() => {
15
+ const iconSizeMap = new Map(props.iconSizes);
16
+ const _iconSize = props.iconSize ?? fallback() ?? 'default';
17
+ return iconSizeMap.has(_iconSize) ? iconSizeMap.get(_iconSize) : _iconSize;
18
+ });
19
+ return {
20
+ iconSize
21
+ };
22
+ }
23
+ //# sourceMappingURL=iconSizes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iconSizes.js","names":["computed","propsFactory","makeIconSizeProps","iconSize","Number","String","iconSizes","type","Array","default","useIconSizes","props","fallback","iconSizeMap","Map","_iconSize","has","get"],"sources":["../../src/composables/iconSizes.ts"],"sourcesContent":["// Utilities\nimport { computed } from 'vue'\nimport { propsFactory } from '@/util'\n\n// Types\nimport type { ComputedGetter, PropType } from 'vue'\nimport type { VIconBtnSizes } from '@/labs/VIconBtn/VIconBtn'\n\n// Types\nexport interface IconSizeProps {\n iconSize?: VIconBtnSizes | number | string\n iconSizes: [VIconBtnSizes, number][]\n}\n\n// Composables\nexport const makeIconSizeProps = propsFactory({\n iconSize: [Number, String] as PropType<VIconBtnSizes | number | string>,\n iconSizes: {\n type: Array as PropType<[VIconBtnSizes, number][]>,\n default: () => ([\n ['x-small', 10],\n ['small', 16],\n ['default', 24],\n ['large', 28],\n ['x-large', 32],\n ]),\n },\n}, 'iconSize')\n\nexport function useIconSizes (props: IconSizeProps, fallback: ComputedGetter<VIconBtnSizes | number | string | undefined>) {\n const iconSize = computed(() => {\n const iconSizeMap = new Map(props.iconSizes)\n const _iconSize = props.iconSize as VIconBtnSizes ?? fallback() ?? 'default'\n return iconSizeMap.has(_iconSize)\n ? iconSizeMap.get(_iconSize)\n : _iconSize\n })\n\n return { iconSize }\n}\n"],"mappings":"AAAA;AACA,SAASA,QAAQ,QAAQ,KAAK;AAAA,SACrBC,YAAY,4BAErB;AAIA;AAMA;AACA,OAAO,MAAMC,iBAAiB,GAAGD,YAAY,CAAC;EAC5CE,QAAQ,EAAE,CAACC,MAAM,EAAEC,MAAM,CAA8C;EACvEC,SAAS,EAAE;IACTC,IAAI,EAAEC,KAA4C;IAClDC,OAAO,EAAEA,CAAA,KAAO,CACd,CAAC,SAAS,EAAE,EAAE,CAAC,EACf,CAAC,OAAO,EAAE,EAAE,CAAC,EACb,CAAC,SAAS,EAAE,EAAE,CAAC,EACf,CAAC,OAAO,EAAE,EAAE,CAAC,EACb,CAAC,SAAS,EAAE,EAAE,CAAC;EAEnB;AACF,CAAC,EAAE,UAAU,CAAC;AAEd,OAAO,SAASC,YAAYA,CAAEC,KAAoB,EAAEC,QAAqE,EAAE;EACzH,MAAMT,QAAQ,GAAGH,QAAQ,CAAC,MAAM;IAC9B,MAAMa,WAAW,GAAG,IAAIC,GAAG,CAACH,KAAK,CAACL,SAAS,CAAC;IAC5C,MAAMS,SAAS,GAAGJ,KAAK,CAACR,QAAQ,IAAqBS,QAAQ,CAAC,CAAC,IAAI,SAAS;IAC5E,OAAOC,WAAW,CAACG,GAAG,CAACD,SAAS,CAAC,GAC7BF,WAAW,CAACI,GAAG,CAACF,SAAS,CAAC,GAC1BA,SAAS;EACf,CAAC,CAAC;EAEF,OAAO;IAAEZ;EAAS,CAAC;AACrB","ignoreList":[]}
@@ -4,11 +4,12 @@ type DeepPartial<T> = T extends object ? {
4
4
  } : T;
5
5
  export type ThemeOptions = false | {
6
6
  cspNonce?: string;
7
- defaultTheme?: string;
7
+ defaultTheme?: 'light' | 'dark' | 'system' | string;
8
8
  variations?: false | VariationsOptions;
9
9
  themes?: Record<string, ThemeDefinition>;
10
10
  stylesheetId?: string;
11
11
  scope?: string;
12
+ unimportant?: boolean;
12
13
  };
13
14
  export type ThemeDefinition = DeepPartial<InternalThemeDefinition>;
14
15
  interface VariationsOptions {
@@ -45,11 +46,15 @@ interface OnColors {
45
46
  'on-info': string;
46
47
  }
47
48
  export interface ThemeInstance {
49
+ change: (themeName: string) => void;
50
+ cycle: (themeArray?: string[]) => void;
51
+ toggle: (themeArray?: [string, string]) => void;
48
52
  readonly isDisabled: boolean;
49
53
  readonly themes: Ref<Record<string, InternalThemeDefinition>>;
50
54
  readonly name: Readonly<Ref<string>>;
51
55
  readonly current: DeepReadonly<Ref<InternalThemeDefinition>>;
52
56
  readonly computedThemes: DeepReadonly<Ref<Record<string, InternalThemeDefinition>>>;
57
+ readonly prefix: string;
53
58
  readonly themeClasses: Readonly<Ref<string | undefined>>;
54
59
  readonly styles: Readonly<Ref<string>>;
55
60
  readonly global: {
@@ -1,6 +1,6 @@
1
1
  // Utilities
2
- import { computed, inject, provide, ref, shallowRef, toRef, watch, watchEffect } from 'vue';
3
- import { createRange, darken, getCurrentInstance, getForeground, getLuma, IN_BROWSER, lighten, mergeDeep, parseColor, propsFactory, RGBtoHex } from "../util/index.js"; // Types
2
+ import { computed, getCurrentScope, inject, onScopeDispose, provide, ref, shallowRef, toRef, watch, watchEffect } from 'vue';
3
+ import { consoleWarn, createRange, darken, deprecate, getCurrentInstance, getForeground, getLuma, IN_BROWSER, lighten, mergeDeep, parseColor, propsFactory, RGBtoHex, SUPPORTS_MATCH_MEDIA } from "../util/index.js"; // Types
4
4
  export const ThemeSymbol = Symbol.for('vuetify:theme');
5
5
  export const makeThemeProps = propsFactory({
6
6
  theme: String
@@ -8,6 +8,7 @@ export const makeThemeProps = propsFactory({
8
8
  function genDefaults() {
9
9
  return {
10
10
  defaultTheme: 'light',
11
+ prefix: 'v-',
11
12
  variations: {
12
13
  colors: [],
13
14
  lighten: 0,
@@ -89,7 +90,10 @@ function genDefaults() {
89
90
  }
90
91
  }
91
92
  },
92
- stylesheetId: 'vuetify-theme-stylesheet'
93
+ stylesheetId: 'vuetify-theme-stylesheet',
94
+ scoped: false,
95
+ unimportant: false,
96
+ utilities: true
93
97
  };
94
98
  }
95
99
  function parseThemeOptions() {
@@ -112,21 +116,21 @@ function parseThemeOptions() {
112
116
  function createCssClass(lines, selector, content, scope) {
113
117
  lines.push(`${getScopedSelector(selector, scope)} {\n`, ...content.map(line => ` ${line};\n`), '}\n');
114
118
  }
115
- function genCssVariables(theme) {
119
+ function genCssVariables(theme, prefix) {
116
120
  const lightOverlay = theme.dark ? 2 : 1;
117
121
  const darkOverlay = theme.dark ? 1 : 2;
118
122
  const variables = [];
119
123
  for (const [key, value] of Object.entries(theme.colors)) {
120
124
  const rgb = parseColor(value);
121
- variables.push(`--v-theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
125
+ variables.push(`--${prefix}theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
122
126
  if (!key.startsWith('on-')) {
123
- variables.push(`--v-theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
127
+ variables.push(`--${prefix}theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
124
128
  }
125
129
  }
126
130
  for (const [key, value] of Object.entries(theme.variables)) {
127
131
  const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined;
128
132
  const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined;
129
- variables.push(`--v-${key}: ${rgb ?? value}`);
133
+ variables.push(`--${prefix}${key}: ${rgb ?? value}`);
130
134
  }
131
135
  return variables;
132
136
  }
@@ -170,7 +174,8 @@ function getScopedSelector(selector, scope) {
170
174
  const scopeSelector = `:where(${scope})`;
171
175
  return selector === ':root' ? scopeSelector : `${scopeSelector} ${selector}`;
172
176
  }
173
- function upsertStyles(styleEl, styles) {
177
+ function upsertStyles(id, cspNonce, styles) {
178
+ const styleEl = getOrCreateStyleElement(id, cspNonce);
174
179
  if (!styleEl) return;
175
180
  styleEl.innerHTML = styles;
176
181
  }
@@ -190,8 +195,17 @@ function getOrCreateStyleElement(id, cspNonce) {
190
195
  // Composables
191
196
  export function createTheme(options) {
192
197
  const parsedOptions = parseThemeOptions(options);
193
- const name = shallowRef(parsedOptions.defaultTheme);
198
+ const _name = shallowRef(parsedOptions.defaultTheme);
194
199
  const themes = ref(parsedOptions.themes);
200
+ const systemName = shallowRef('light');
201
+ const name = computed({
202
+ get() {
203
+ return _name.value === 'system' ? systemName.value : _name.value;
204
+ },
205
+ set(val) {
206
+ _name.value = val;
207
+ }
208
+ });
195
209
  const computedThemes = computed(() => {
196
210
  const acc = {};
197
211
  for (const [name, original] of Object.entries(themes.value)) {
@@ -212,28 +226,49 @@ export function createTheme(options) {
212
226
  const current = toRef(() => computedThemes.value[name.value]);
213
227
  const styles = computed(() => {
214
228
  const lines = [];
229
+ const important = parsedOptions.unimportant ? '' : ' !important';
230
+ const scoped = parsedOptions.scoped ? parsedOptions.prefix : '';
215
231
  if (current.value?.dark) {
216
232
  createCssClass(lines, ':root', ['color-scheme: dark'], parsedOptions.scope);
217
233
  }
218
- createCssClass(lines, ':root', genCssVariables(current.value), parsedOptions.scope);
234
+ createCssClass(lines, ':root', genCssVariables(current.value, parsedOptions.prefix), parsedOptions.scope);
219
235
  for (const [themeName, theme] of Object.entries(computedThemes.value)) {
220
- createCssClass(lines, `.v-theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme)], parsedOptions.scope);
236
+ createCssClass(lines, `.${parsedOptions.prefix}theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme, parsedOptions.prefix)], parsedOptions.scope);
221
237
  }
222
- const bgLines = [];
223
- const fgLines = [];
224
- const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
225
- for (const key of colors) {
226
- if (key.startsWith('on-')) {
227
- createCssClass(fgLines, `.${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
228
- } else {
229
- createCssClass(bgLines, `.bg-${key}`, [`--v-theme-overlay-multiplier: var(--v-theme-${key}-overlay-multiplier)`, `background-color: rgb(var(--v-theme-${key})) !important`, `color: rgb(var(--v-theme-on-${key})) !important`], parsedOptions.scope);
230
- createCssClass(fgLines, `.text-${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
231
- createCssClass(fgLines, `.border-${key}`, [`--v-border-color: var(--v-theme-${key})`], parsedOptions.scope);
238
+ if (parsedOptions.utilities) {
239
+ const bgLines = [];
240
+ const fgLines = [];
241
+ const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
242
+ for (const key of colors) {
243
+ if (key.startsWith('on-')) {
244
+ createCssClass(fgLines, `.${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
245
+ } else {
246
+ createCssClass(bgLines, `.${scoped}bg-${key}`, [`--${parsedOptions.prefix}theme-overlay-multiplier: var(--${parsedOptions.prefix}theme-${key}-overlay-multiplier)`, `background-color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`, `color: rgb(var(--${parsedOptions.prefix}theme-on-${key}))${important}`], parsedOptions.scope);
247
+ createCssClass(fgLines, `.${scoped}text-${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
248
+ createCssClass(fgLines, `.${scoped}border-${key}`, [`--${parsedOptions.prefix}border-color: var(--${parsedOptions.prefix}theme-${key})`], parsedOptions.scope);
249
+ }
232
250
  }
251
+ lines.push(...bgLines, ...fgLines);
233
252
  }
234
- lines.push(...bgLines, ...fgLines);
235
253
  return lines.map((str, i) => i === 0 ? str : ` ${str}`).join('');
236
254
  });
255
+ const themeClasses = toRef(() => parsedOptions.isDisabled ? undefined : `${parsedOptions.prefix}theme--${name.value}`);
256
+ const themeNames = toRef(() => Object.keys(computedThemes.value));
257
+ if (SUPPORTS_MATCH_MEDIA) {
258
+ const media = window.matchMedia('(prefers-color-scheme: dark)');
259
+ function updateSystemName() {
260
+ systemName.value = media.matches ? 'dark' : 'light';
261
+ }
262
+ updateSystemName();
263
+ media.addEventListener('change', updateSystemName, {
264
+ passive: true
265
+ });
266
+ if (getCurrentScope()) {
267
+ onScopeDispose(() => {
268
+ media.removeEventListener('change', updateSystemName);
269
+ });
270
+ }
271
+ }
237
272
  function install(app) {
238
273
  if (parsedOptions.isDisabled) return;
239
274
  const head = app._context.provides.usehead;
@@ -271,22 +306,55 @@ export function createTheme(options) {
271
306
  updateStyles();
272
307
  }
273
308
  function updateStyles() {
274
- upsertStyles(getOrCreateStyleElement(parsedOptions.stylesheetId, parsedOptions.cspNonce), styles.value);
309
+ upsertStyles(parsedOptions.stylesheetId, parsedOptions.cspNonce, styles.value);
275
310
  }
276
311
  }
277
312
  }
278
- const themeClasses = toRef(() => parsedOptions.isDisabled ? undefined : `v-theme--${name.value}`);
313
+ function change(themeName) {
314
+ if (!themeNames.value.includes(themeName)) {
315
+ consoleWarn(`Theme "${themeName}" not found on the Vuetify theme instance`);
316
+ return;
317
+ }
318
+ name.value = themeName;
319
+ }
320
+ function cycle() {
321
+ let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : themeNames.value;
322
+ const currentIndex = themeArray.indexOf(name.value);
323
+ const nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % themeArray.length;
324
+ change(themeArray[nextIndex]);
325
+ }
326
+ function toggle() {
327
+ let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['light', 'dark'];
328
+ cycle(themeArray);
329
+ }
330
+ const globalName = new Proxy(name, {
331
+ get(target, prop) {
332
+ return target[prop];
333
+ },
334
+ set(target, prop, val) {
335
+ if (prop === 'value') {
336
+ deprecate(`theme.global.name.value = ${val}`, `theme.change('${val}')`);
337
+ }
338
+ // @ts-expect-error
339
+ target[prop] = val;
340
+ return true;
341
+ }
342
+ });
279
343
  return {
280
344
  install,
345
+ change,
346
+ cycle,
347
+ toggle,
281
348
  isDisabled: parsedOptions.isDisabled,
282
349
  name,
283
350
  themes,
284
351
  current,
285
352
  computedThemes,
353
+ prefix: parsedOptions.prefix,
286
354
  themeClasses,
287
355
  styles,
288
356
  global: {
289
- name,
357
+ name: globalName,
290
358
  current
291
359
  }
292
360
  };
@@ -297,7 +365,7 @@ export function provideTheme(props) {
297
365
  if (!theme) throw new Error('Could not find Vuetify theme injection');
298
366
  const name = toRef(() => props.theme ?? theme.name.value);
299
367
  const current = toRef(() => theme.themes.value[name.value]);
300
- const themeClasses = toRef(() => theme.isDisabled ? undefined : `v-theme--${name.value}`);
368
+ const themeClasses = toRef(() => theme.isDisabled ? undefined : `${theme.prefix}theme--${name.value}`);
301
369
  const newTheme = {
302
370
  ...theme,
303
371
  name,