@vuetify/nightly 3.9.0-beta.1-dev.2025-06-26 → 3.9.0-beta.1-dev.2025-07-02
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.
- package/CHANGELOG.md +105 -3
- package/dist/_component-variables-labs.sass +1 -0
- package/dist/json/attributes.json +2814 -2754
- package/dist/json/importMap-labs.json +16 -12
- package/dist/json/importMap.json +174 -174
- package/dist/json/tags.json +20 -0
- package/dist/json/web-types.json +5362 -5196
- package/dist/vuetify-labs.cjs +796 -64
- package/dist/vuetify-labs.css +3440 -3189
- package/dist/vuetify-labs.d.ts +452 -206
- package/dist/vuetify-labs.esm.js +796 -65
- package/dist/vuetify-labs.esm.js.map +1 -1
- package/dist/vuetify-labs.js +796 -64
- package/dist/vuetify-labs.min.css +2 -2
- package/dist/vuetify.cjs +378 -40
- package/dist/vuetify.cjs.map +1 -1
- package/dist/vuetify.css +3377 -3368
- package/dist/vuetify.d.ts +82 -62
- package/dist/vuetify.esm.js +378 -41
- package/dist/vuetify.esm.js.map +1 -1
- package/dist/vuetify.js +378 -40
- package/dist/vuetify.js.map +1 -1
- package/dist/vuetify.min.css +2 -2
- package/dist/vuetify.min.js +312 -274
- package/dist/vuetify.min.js.map +1 -1
- package/lib/components/VDataTable/VDataTableColumn.js +0 -1
- package/lib/components/VDataTable/VDataTableColumn.js.map +1 -1
- package/lib/components/VDataTable/VDataTableHeaders.js +5 -5
- package/lib/components/VDataTable/VDataTableHeaders.js.map +1 -1
- package/lib/components/VDataTable/composables/sort.js +2 -1
- package/lib/components/VDataTable/composables/sort.js.map +1 -1
- package/lib/components/VDatePicker/VDatePickerMonth.js +1 -2
- package/lib/components/VDatePicker/VDatePickerMonth.js.map +1 -1
- package/lib/components/VKbd/VKbd.css +14 -5
- package/lib/components/VKbd/VKbd.js.map +1 -1
- package/lib/components/VKbd/VKbd.scss +26 -0
- package/lib/components/VKbd/_variables.scss +12 -6
- package/lib/components/VKbd/index.js.map +1 -1
- package/lib/components/VOtpInput/VOtpInput.js +17 -14
- package/lib/components/VOtpInput/VOtpInput.js.map +1 -1
- package/lib/components/VOverlay/locationStrategies.js +1 -1
- package/lib/components/VOverlay/locationStrategies.js.map +1 -1
- package/lib/components/VTextField/VTextField.js +1 -1
- package/lib/components/VTextField/VTextField.js.map +1 -1
- package/lib/composables/calendar.d.ts +0 -1
- package/lib/composables/calendar.js +6 -10
- package/lib/composables/calendar.js.map +1 -1
- package/lib/composables/date/adapters/vuetify.js +1 -1
- package/lib/composables/date/adapters/vuetify.js.map +1 -1
- package/lib/composables/hotkey/hotkey-parsing.d.ts +15 -0
- package/lib/composables/hotkey/hotkey-parsing.js +154 -0
- package/lib/composables/hotkey/hotkey-parsing.js.map +1 -0
- package/lib/composables/hotkey/hotkey.d.ts +9 -0
- package/lib/composables/{hotkey.js → hotkey/hotkey.js} +31 -39
- package/lib/composables/hotkey/hotkey.js.map +1 -0
- package/lib/composables/hotkey/index.d.ts +1 -0
- package/lib/composables/hotkey/index.js +2 -0
- package/lib/composables/hotkey/index.js.map +1 -0
- package/lib/composables/hotkey/key-aliases.d.ts +14 -0
- package/lib/composables/hotkey/key-aliases.js +38 -0
- package/lib/composables/hotkey/key-aliases.js.map +1 -0
- package/lib/composables/icons.d.ts +11 -0
- package/lib/composables/icons.js.map +1 -1
- package/lib/composables/index.d.ts +1 -0
- package/lib/composables/index.js +1 -0
- package/lib/composables/index.js.map +1 -1
- package/lib/composables/virtual.js +1 -1
- package/lib/composables/virtual.js.map +1 -1
- package/lib/entry-bundler.js +1 -1
- package/lib/framework.d.ts +83 -62
- package/lib/framework.js +1 -1
- package/lib/iconsets/fa.js +12 -1
- package/lib/iconsets/fa.js.map +1 -1
- package/lib/iconsets/fa4.js +12 -1
- package/lib/iconsets/fa4.js.map +1 -1
- package/lib/iconsets/md.js +12 -1
- package/lib/iconsets/md.js.map +1 -1
- package/lib/iconsets/mdi-svg.js +12 -1
- package/lib/iconsets/mdi-svg.js.map +1 -1
- package/lib/iconsets/mdi.js +12 -1
- package/lib/iconsets/mdi.js.map +1 -1
- package/lib/labs/VCalendar/VCalendar.d.ts +33 -33
- package/lib/labs/VCalendar/VCalendar.js +9 -9
- package/lib/labs/VCalendar/VCalendar.js.map +1 -1
- package/lib/labs/VCalendar/VCalendarDay.d.ts +33 -33
- package/lib/labs/VCalendar/VCalendarDay.js +1 -1
- package/lib/labs/VCalendar/VCalendarDay.js.map +1 -1
- package/lib/labs/VCalendar/VCalendarInterval.d.ts +36 -36
- package/lib/labs/VCalendar/VCalendarInterval.js +9 -9
- package/lib/labs/VCalendar/VCalendarInterval.js.map +1 -1
- package/lib/labs/VCalendar/VCalendarIntervalEvent.d.ts +12 -12
- package/lib/labs/VCalendar/VCalendarIntervalEvent.js +1 -1
- package/lib/labs/VCalendar/VCalendarIntervalEvent.js.map +1 -1
- package/lib/labs/VCalendar/VCalendarMonthDay.d.ts +36 -36
- package/lib/labs/VCalendar/VCalendarMonthDay.js +4 -4
- package/lib/labs/VCalendar/VCalendarMonthDay.js.map +1 -1
- package/lib/labs/VHotkey/VHotkey.css +242 -0
- package/lib/labs/VHotkey/VHotkey.d.ts +387 -0
- package/lib/labs/VHotkey/VHotkey.js +432 -0
- package/lib/labs/VHotkey/VHotkey.js.map +1 -0
- package/lib/labs/VHotkey/VHotkey.scss +253 -0
- package/lib/labs/VHotkey/_variables.scss +43 -0
- package/lib/labs/VHotkey/index.d.ts +1 -0
- package/lib/labs/VHotkey/index.js +2 -0
- package/lib/labs/VHotkey/index.js.map +1 -0
- package/lib/labs/VIconBtn/VIconBtn.js +1 -0
- package/lib/labs/VIconBtn/VIconBtn.js.map +1 -1
- package/lib/labs/components.d.ts +1 -0
- package/lib/labs/components.js +1 -0
- package/lib/labs/components.js.map +1 -1
- package/lib/locale/af.d.ts +18 -0
- package/lib/locale/af.js +18 -0
- package/lib/locale/af.js.map +1 -1
- package/lib/locale/ar.d.ts +18 -0
- package/lib/locale/ar.js +18 -0
- package/lib/locale/ar.js.map +1 -1
- package/lib/locale/az.d.ts +18 -0
- package/lib/locale/az.js +18 -0
- package/lib/locale/az.js.map +1 -1
- package/lib/locale/bg.d.ts +18 -0
- package/lib/locale/bg.js +18 -0
- package/lib/locale/bg.js.map +1 -1
- package/lib/locale/ca.d.ts +18 -0
- package/lib/locale/ca.js +18 -0
- package/lib/locale/ca.js.map +1 -1
- package/lib/locale/ckb.d.ts +18 -0
- package/lib/locale/ckb.js +18 -0
- package/lib/locale/ckb.js.map +1 -1
- package/lib/locale/cs.d.ts +18 -0
- package/lib/locale/cs.js +18 -0
- package/lib/locale/cs.js.map +1 -1
- package/lib/locale/da.d.ts +18 -0
- package/lib/locale/da.js +18 -0
- package/lib/locale/da.js.map +1 -1
- package/lib/locale/de.d.ts +18 -0
- package/lib/locale/de.js +18 -0
- package/lib/locale/de.js.map +1 -1
- package/lib/locale/el.d.ts +18 -0
- package/lib/locale/el.js +18 -0
- package/lib/locale/el.js.map +1 -1
- package/lib/locale/en.d.ts +18 -0
- package/lib/locale/en.js +18 -0
- package/lib/locale/en.js.map +1 -1
- package/lib/locale/es.d.ts +18 -0
- package/lib/locale/es.js +18 -0
- package/lib/locale/es.js.map +1 -1
- package/lib/locale/et.d.ts +18 -0
- package/lib/locale/et.js +18 -0
- package/lib/locale/et.js.map +1 -1
- package/lib/locale/fa.d.ts +18 -0
- package/lib/locale/fa.js +18 -0
- package/lib/locale/fa.js.map +1 -1
- package/lib/locale/fi.d.ts +18 -0
- package/lib/locale/fi.js +18 -0
- package/lib/locale/fi.js.map +1 -1
- package/lib/locale/fr.d.ts +18 -0
- package/lib/locale/fr.js +18 -0
- package/lib/locale/fr.js.map +1 -1
- package/lib/locale/he.d.ts +18 -0
- package/lib/locale/he.js +18 -0
- package/lib/locale/he.js.map +1 -1
- package/lib/locale/hr.d.ts +18 -0
- package/lib/locale/hr.js +18 -0
- package/lib/locale/hr.js.map +1 -1
- package/lib/locale/hu.d.ts +18 -0
- package/lib/locale/hu.js +18 -0
- package/lib/locale/hu.js.map +1 -1
- package/lib/locale/id.d.ts +18 -0
- package/lib/locale/id.js +18 -0
- package/lib/locale/id.js.map +1 -1
- package/lib/locale/it.d.ts +18 -0
- package/lib/locale/it.js +18 -0
- package/lib/locale/it.js.map +1 -1
- package/lib/locale/ja.d.ts +18 -0
- package/lib/locale/ja.js +18 -0
- package/lib/locale/ja.js.map +1 -1
- package/lib/locale/km.d.ts +18 -0
- package/lib/locale/km.js +18 -0
- package/lib/locale/km.js.map +1 -1
- package/lib/locale/ko.d.ts +18 -0
- package/lib/locale/ko.js +18 -0
- package/lib/locale/ko.js.map +1 -1
- package/lib/locale/lt.d.ts +18 -0
- package/lib/locale/lt.js +18 -0
- package/lib/locale/lt.js.map +1 -1
- package/lib/locale/lv.d.ts +18 -0
- package/lib/locale/lv.js +18 -0
- package/lib/locale/lv.js.map +1 -1
- package/lib/locale/nl.d.ts +18 -0
- package/lib/locale/nl.js +18 -0
- package/lib/locale/nl.js.map +1 -1
- package/lib/locale/no.d.ts +18 -0
- package/lib/locale/no.js +18 -0
- package/lib/locale/no.js.map +1 -1
- package/lib/locale/pl.d.ts +18 -0
- package/lib/locale/pl.js +18 -0
- package/lib/locale/pl.js.map +1 -1
- package/lib/locale/pt.d.ts +18 -0
- package/lib/locale/pt.js +18 -0
- package/lib/locale/pt.js.map +1 -1
- package/lib/locale/ro.d.ts +18 -0
- package/lib/locale/ro.js +18 -0
- package/lib/locale/ro.js.map +1 -1
- package/lib/locale/ru.d.ts +18 -0
- package/lib/locale/ru.js +18 -0
- package/lib/locale/ru.js.map +1 -1
- package/lib/locale/sk.d.ts +18 -0
- package/lib/locale/sk.js +18 -0
- package/lib/locale/sk.js.map +1 -1
- package/lib/locale/sl.d.ts +18 -0
- package/lib/locale/sl.js +18 -0
- package/lib/locale/sl.js.map +1 -1
- package/lib/locale/sr-Cyrl.d.ts +18 -0
- package/lib/locale/sr-Cyrl.js +18 -0
- package/lib/locale/sr-Cyrl.js.map +1 -1
- package/lib/locale/sr-Latn.d.ts +18 -0
- package/lib/locale/sr-Latn.js +18 -0
- package/lib/locale/sr-Latn.js.map +1 -1
- package/lib/locale/sv.d.ts +18 -0
- package/lib/locale/sv.js +18 -0
- package/lib/locale/sv.js.map +1 -1
- package/lib/locale/th.d.ts +18 -0
- package/lib/locale/th.js +18 -0
- package/lib/locale/th.js.map +1 -1
- package/lib/locale/tr.d.ts +18 -0
- package/lib/locale/tr.js +18 -0
- package/lib/locale/tr.js.map +1 -1
- package/lib/locale/uk.d.ts +18 -0
- package/lib/locale/uk.js +18 -0
- package/lib/locale/uk.js.map +1 -1
- package/lib/locale/vi.d.ts +18 -0
- package/lib/locale/vi.js +18 -0
- package/lib/locale/vi.js.map +1 -1
- package/lib/locale/zh-Hans.d.ts +18 -0
- package/lib/locale/zh-Hans.js +18 -0
- package/lib/locale/zh-Hans.js.map +1 -1
- package/lib/locale/zh-Hant.d.ts +18 -0
- package/lib/locale/zh-Hant.js +18 -0
- package/lib/locale/zh-Hant.js.map +1 -1
- package/package.json +1 -1
- package/lib/components/VKbd/VKbd.sass +0 -15
- package/lib/composables/hotkey.d.ts +0 -9
- package/lib/composables/hotkey.js.map +0 -1
@@ -0,0 +1,432 @@
|
|
1
|
+
import { createVNode as _createVNode, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle, createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, Fragment as _Fragment } from "vue";
|
2
|
+
/**
|
3
|
+
* VHotkey Component
|
4
|
+
*
|
5
|
+
* Purpose: Renders keyboard shortcuts in a visually consistent and accessible way.
|
6
|
+
* This component handles the complex logic of displaying keyboard combinations
|
7
|
+
* across different platforms (Mac vs PC) and display modes (icons, symbols, text).
|
8
|
+
*
|
9
|
+
* Why it exists:
|
10
|
+
* - Provides consistent visual representation of keyboard shortcuts
|
11
|
+
* - Handles platform-specific key differences (Cmd vs Ctrl, Option vs Alt)
|
12
|
+
* - Supports multiple display modes for different design needs
|
13
|
+
* - Encapsulates complex key parsing and rendering logic
|
14
|
+
* - Used throughout the command palette for instruction display
|
15
|
+
*
|
16
|
+
* Key Mapping Structure:
|
17
|
+
* The keyMap uses a simple object structure where each key has:
|
18
|
+
* - `default`: Required configuration for all platforms
|
19
|
+
* - `mac`: Optional Mac-specific overrides
|
20
|
+
* Each config can specify `symbol`, `icon`, and `text` representations.
|
21
|
+
*
|
22
|
+
* Example:
|
23
|
+
* ```
|
24
|
+
* ctrl: {
|
25
|
+
* mac: { symbol: '⌃', icon: '$ctrl', text: 'Control' },
|
26
|
+
* default: { text: 'Ctrl', icon: '$ctrl' }
|
27
|
+
* }
|
28
|
+
* ```
|
29
|
+
*/
|
30
|
+
|
31
|
+
// Styles
|
32
|
+
import "./VHotkey.css";
|
33
|
+
|
34
|
+
// Components
|
35
|
+
import { VIcon } from "../../components/VIcon/index.js";
|
36
|
+
import { VKbd } from "../../components/VKbd/index.js"; // Composables
|
37
|
+
import { makeBorderProps, useBorder } from "../../composables/border.js";
|
38
|
+
import { makeComponentProps } from "../../composables/component.js";
|
39
|
+
import { makeElevationProps, useElevation } from "../../composables/elevation.js";
|
40
|
+
import { splitKeyCombination, splitKeySequence } from "../../composables/hotkey/hotkey-parsing.js";
|
41
|
+
import { useLocale, useRtl } from "../../composables/locale.js";
|
42
|
+
import { makeRoundedProps, useRounded } from "../../composables/rounded.js";
|
43
|
+
import { makeThemeProps, provideTheme } from "../../composables/theme.js";
|
44
|
+
import { useVariant } from "../../composables/variant.js"; // Utilities
|
45
|
+
import { computed } from 'vue';
|
46
|
+
import { genericComponent, mergeDeep, propsFactory, useRender } from "../../util/index.js"; // Types
|
47
|
+
// Display mode types for different visual representations
|
48
|
+
// Extended variant type that includes our custom 'contained' variant
|
49
|
+
// Key display tuple: [mode, content] where content is string or IconValue
|
50
|
+
// Key tuple: [mode, content] where content is string or IconValue
|
51
|
+
function processKey(config, requestedMode, isMac) {
|
52
|
+
const keyCfg = isMac && config.mac ? config.mac : config.default;
|
53
|
+
|
54
|
+
// 1. Resolve the safest display mode for the current platform
|
55
|
+
const mode = (() => {
|
56
|
+
// Non-Mac platforms rarely use icons – prefer text
|
57
|
+
if (requestedMode === 'icon' && !isMac) return 'text';
|
58
|
+
|
59
|
+
// If the requested mode lacks an asset, fall back to text
|
60
|
+
if (requestedMode === 'icon' && !keyCfg.icon) return 'text';
|
61
|
+
if (requestedMode === 'symbol' && !keyCfg.symbol) return 'text';
|
62
|
+
return requestedMode;
|
63
|
+
})();
|
64
|
+
|
65
|
+
// 2. Pick value for the chosen mode, defaulting to text representation
|
66
|
+
let value = keyCfg[mode] ?? keyCfg.text;
|
67
|
+
|
68
|
+
// 3. Guard against icon tokens leaking into text mode (e.g. "$ctrl")
|
69
|
+
if (mode === 'text' && typeof value === 'string' && value.startsWith('$') && !value.startsWith('$vuetify.')) {
|
70
|
+
value = value.slice(1).toUpperCase(); // "$ctrl" → "CTRL"
|
71
|
+
}
|
72
|
+
return mode === 'icon' ? ['icon', value] : [mode, value];
|
73
|
+
}
|
74
|
+
export const hotkeyMap = {
|
75
|
+
ctrl: {
|
76
|
+
mac: {
|
77
|
+
symbol: '⌃',
|
78
|
+
icon: '$ctrl',
|
79
|
+
text: '$vuetify.hotkey.ctrl'
|
80
|
+
},
|
81
|
+
default: {
|
82
|
+
text: 'Ctrl'
|
83
|
+
}
|
84
|
+
},
|
85
|
+
meta: {
|
86
|
+
mac: {
|
87
|
+
symbol: '⌘',
|
88
|
+
icon: '$command',
|
89
|
+
text: '$vuetify.hotkey.command'
|
90
|
+
},
|
91
|
+
default: {
|
92
|
+
text: 'Ctrl'
|
93
|
+
}
|
94
|
+
},
|
95
|
+
cmd: {
|
96
|
+
mac: {
|
97
|
+
symbol: '⌘',
|
98
|
+
icon: '$command',
|
99
|
+
text: '$vuetify.hotkey.command'
|
100
|
+
},
|
101
|
+
default: {
|
102
|
+
text: 'Ctrl'
|
103
|
+
}
|
104
|
+
},
|
105
|
+
shift: {
|
106
|
+
mac: {
|
107
|
+
symbol: '⇧',
|
108
|
+
icon: '$shift',
|
109
|
+
text: '$vuetify.hotkey.shift'
|
110
|
+
},
|
111
|
+
default: {
|
112
|
+
text: 'Shift'
|
113
|
+
}
|
114
|
+
},
|
115
|
+
alt: {
|
116
|
+
mac: {
|
117
|
+
symbol: '⌥',
|
118
|
+
icon: '$alt',
|
119
|
+
text: '$vuetify.hotkey.option'
|
120
|
+
},
|
121
|
+
default: {
|
122
|
+
text: 'Alt'
|
123
|
+
}
|
124
|
+
},
|
125
|
+
enter: {
|
126
|
+
default: {
|
127
|
+
symbol: '↵',
|
128
|
+
icon: '$enter',
|
129
|
+
text: '$vuetify.hotkey.enter'
|
130
|
+
}
|
131
|
+
},
|
132
|
+
arrowup: {
|
133
|
+
default: {
|
134
|
+
symbol: '↑',
|
135
|
+
icon: '$arrowup',
|
136
|
+
text: '$vuetify.hotkey.upArrow'
|
137
|
+
}
|
138
|
+
},
|
139
|
+
arrowdown: {
|
140
|
+
default: {
|
141
|
+
symbol: '↓',
|
142
|
+
icon: '$arrowdown',
|
143
|
+
text: '$vuetify.hotkey.downArrow'
|
144
|
+
}
|
145
|
+
},
|
146
|
+
arrowleft: {
|
147
|
+
default: {
|
148
|
+
symbol: '←',
|
149
|
+
icon: '$arrowleft',
|
150
|
+
text: '$vuetify.hotkey.leftArrow'
|
151
|
+
}
|
152
|
+
},
|
153
|
+
arrowright: {
|
154
|
+
default: {
|
155
|
+
symbol: '→',
|
156
|
+
icon: '$arrowright',
|
157
|
+
text: '$vuetify.hotkey.rightArrow'
|
158
|
+
}
|
159
|
+
},
|
160
|
+
backspace: {
|
161
|
+
default: {
|
162
|
+
symbol: '⌫',
|
163
|
+
icon: '$backspace',
|
164
|
+
text: '$vuetify.hotkey.backspace'
|
165
|
+
}
|
166
|
+
},
|
167
|
+
escape: {
|
168
|
+
default: {
|
169
|
+
text: '$vuetify.hotkey.escape'
|
170
|
+
}
|
171
|
+
},
|
172
|
+
' ': {
|
173
|
+
mac: {
|
174
|
+
symbol: '␣',
|
175
|
+
icon: '$space',
|
176
|
+
text: '$vuetify.hotkey.space'
|
177
|
+
},
|
178
|
+
default: {
|
179
|
+
text: '$vuetify.hotkey.space'
|
180
|
+
}
|
181
|
+
},
|
182
|
+
'-': {
|
183
|
+
default: {
|
184
|
+
text: '-'
|
185
|
+
}
|
186
|
+
}
|
187
|
+
};
|
188
|
+
|
189
|
+
// Create custom variant props that extend the base variant props with our 'contained' option
|
190
|
+
const makeVHotkeyVariantProps = propsFactory({
|
191
|
+
variant: {
|
192
|
+
type: String,
|
193
|
+
default: 'elevated',
|
194
|
+
validator: v => ['elevated', 'flat', 'tonal', 'outlined', 'text', 'plain', 'contained'].includes(v)
|
195
|
+
}
|
196
|
+
}, 'VHotkeyVariant');
|
197
|
+
export const makeVHotkeyProps = propsFactory({
|
198
|
+
// String representing keyboard shortcuts (e.g., "ctrl+k", "meta+shift+p")
|
199
|
+
keys: String,
|
200
|
+
// How to display keys: 'symbol' uses special characters (⌘, ⌃), 'icon' uses SVG icons, 'text' uses words
|
201
|
+
displayMode: {
|
202
|
+
type: String,
|
203
|
+
default: 'icon'
|
204
|
+
},
|
205
|
+
// Custom key mapping configuration. Users can import and modify the exported hotkeyMap as needed
|
206
|
+
keyMap: {
|
207
|
+
type: Object,
|
208
|
+
default: () => hotkeyMap
|
209
|
+
},
|
210
|
+
platform: {
|
211
|
+
type: String,
|
212
|
+
default: 'auto'
|
213
|
+
},
|
214
|
+
inline: Boolean,
|
215
|
+
disabled: Boolean,
|
216
|
+
prefix: String,
|
217
|
+
suffix: String,
|
218
|
+
...makeComponentProps(),
|
219
|
+
...makeThemeProps(),
|
220
|
+
...makeBorderProps(),
|
221
|
+
...makeRoundedProps(),
|
222
|
+
...makeElevationProps(),
|
223
|
+
...makeVHotkeyVariantProps(),
|
224
|
+
color: String
|
225
|
+
}, 'VHotkey');
|
226
|
+
class Delineator {
|
227
|
+
constructor(delineator) {
|
228
|
+
if (['and', 'then'].includes(delineator)) this.val = delineator;else {
|
229
|
+
throw new Error('Not a valid delineator');
|
230
|
+
}
|
231
|
+
}
|
232
|
+
isEqual(d) {
|
233
|
+
return this.val === d.val;
|
234
|
+
}
|
235
|
+
}
|
236
|
+
function isDelineator(value) {
|
237
|
+
return value instanceof Delineator;
|
238
|
+
}
|
239
|
+
function isString(value) {
|
240
|
+
return typeof value === 'string';
|
241
|
+
}
|
242
|
+
function getKeyText(keyMap, key, isMac) {
|
243
|
+
const lowerKey = key.toLowerCase();
|
244
|
+
if (lowerKey in keyMap) {
|
245
|
+
const result = processKey(keyMap[lowerKey], 'text', isMac);
|
246
|
+
return typeof result[1] === 'string' ? result[1] : String(result[1]);
|
247
|
+
}
|
248
|
+
return key.toUpperCase();
|
249
|
+
}
|
250
|
+
function applyDisplayModeToKey(keyMap, mode, key, isMac) {
|
251
|
+
const lowerKey = key.toLowerCase();
|
252
|
+
if (lowerKey in keyMap) {
|
253
|
+
const result = processKey(keyMap[lowerKey], mode, isMac);
|
254
|
+
if (result[0] === 'text' && typeof result[1] === 'string' && result[1].startsWith('$') && !result[1].startsWith('$vuetify.')) {
|
255
|
+
return ['text', result[1].replace('$', '').toUpperCase(), key];
|
256
|
+
}
|
257
|
+
return [...result, key];
|
258
|
+
}
|
259
|
+
return ['text', key.toUpperCase(), key];
|
260
|
+
}
|
261
|
+
export const VHotkey = genericComponent()({
|
262
|
+
name: 'VHotkey',
|
263
|
+
props: makeVHotkeyProps(),
|
264
|
+
setup(props) {
|
265
|
+
const {
|
266
|
+
t
|
267
|
+
} = useLocale();
|
268
|
+
const {
|
269
|
+
themeClasses
|
270
|
+
} = provideTheme(props);
|
271
|
+
const {
|
272
|
+
rtlClasses
|
273
|
+
} = useRtl();
|
274
|
+
const {
|
275
|
+
borderClasses
|
276
|
+
} = useBorder(props);
|
277
|
+
const {
|
278
|
+
roundedClasses
|
279
|
+
} = useRounded(props);
|
280
|
+
const {
|
281
|
+
elevationClasses
|
282
|
+
} = useElevation(props);
|
283
|
+
const isContainedVariant = computed(() => props.variant === 'contained');
|
284
|
+
const effectiveVariantProps = computed(() => ({
|
285
|
+
...props,
|
286
|
+
variant: isContainedVariant.value ? 'elevated' : props.variant
|
287
|
+
}));
|
288
|
+
const {
|
289
|
+
colorClasses,
|
290
|
+
colorStyles,
|
291
|
+
variantClasses
|
292
|
+
} = useVariant(effectiveVariantProps);
|
293
|
+
const isMac = computed(() => props.platform === 'auto' ? typeof navigator !== 'undefined' && /macintosh/i.test(navigator.userAgent) : props.platform === 'mac');
|
294
|
+
const effectiveDisplayMode = computed(() => props.displayMode);
|
295
|
+
const AND_DELINEATOR = new Delineator('and'); // For + separators
|
296
|
+
const THEN_DELINEATOR = new Delineator('then'); // For - separators
|
297
|
+
|
298
|
+
const effectiveKeyMap = computed(() => props.keyMap);
|
299
|
+
const keyCombinations = computed(() => {
|
300
|
+
if (!props.keys) return [];
|
301
|
+
|
302
|
+
// Split by spaces to handle multiple key combinations
|
303
|
+
// Example: "ctrl+k meta+p" -> ["ctrl+k", "meta+p"]
|
304
|
+
return props.keys.split(' ').map(combination => {
|
305
|
+
// Use the shared sequence splitting logic
|
306
|
+
const sequenceGroups = splitKeySequence(combination);
|
307
|
+
|
308
|
+
// Process each sequence group
|
309
|
+
return sequenceGroups.flatMap((group, groupIndex) => {
|
310
|
+
// Use the shared key combination splitting logic
|
311
|
+
const keyParts = splitKeyCombination(group);
|
312
|
+
const parts = keyParts.reduce((acc, part, index) => {
|
313
|
+
if (index !== 0) {
|
314
|
+
// Add AND delineator between keys
|
315
|
+
return [...acc, AND_DELINEATOR, part];
|
316
|
+
}
|
317
|
+
return [...acc, part];
|
318
|
+
}, []);
|
319
|
+
|
320
|
+
// Add THEN delineator between sequence groups
|
321
|
+
const result = parts.map(key => {
|
322
|
+
if (isString(key)) {
|
323
|
+
return applyDisplayModeToKey(effectiveKeyMap.value, effectiveDisplayMode.value, key, isMac.value);
|
324
|
+
}
|
325
|
+
return key;
|
326
|
+
});
|
327
|
+
|
328
|
+
// Add sequence separator if not the last group
|
329
|
+
if (groupIndex < sequenceGroups.length - 1) {
|
330
|
+
result.push(THEN_DELINEATOR);
|
331
|
+
}
|
332
|
+
return result;
|
333
|
+
});
|
334
|
+
});
|
335
|
+
});
|
336
|
+
const accessibleLabel = computed(() => {
|
337
|
+
if (!props.keys) return '';
|
338
|
+
|
339
|
+
// Convert the parsed key combinations into readable text
|
340
|
+
const readableShortcuts = keyCombinations.value.map(combination => {
|
341
|
+
const readableParts = [];
|
342
|
+
for (const key of combination) {
|
343
|
+
if (isDelineator(key)) {
|
344
|
+
if (AND_DELINEATOR.isEqual(key)) {
|
345
|
+
readableParts.push(t('$vuetify.hotkey.plus'));
|
346
|
+
} else if (THEN_DELINEATOR.isEqual(key)) {
|
347
|
+
readableParts.push(t('$vuetify.hotkey.then'));
|
348
|
+
}
|
349
|
+
} else {
|
350
|
+
// Always use text representation for screen readers
|
351
|
+
const textKey = key[0] === 'icon' || key[0] === 'symbol' ? applyDisplayModeToKey(mergeDeep(hotkeyMap, props.keyMap), 'text', String(key[1]), isMac.value)[1] : key[1];
|
352
|
+
readableParts.push(translateKey(textKey));
|
353
|
+
}
|
354
|
+
}
|
355
|
+
return readableParts.join(' ');
|
356
|
+
});
|
357
|
+
const shortcutText = readableShortcuts.join(', ');
|
358
|
+
return t('$vuetify.hotkey.shortcut', shortcutText);
|
359
|
+
});
|
360
|
+
function translateKey(key) {
|
361
|
+
return key.startsWith('$vuetify.') ? t(key) : key;
|
362
|
+
}
|
363
|
+
function getKeyTooltip(key) {
|
364
|
+
if (effectiveDisplayMode.value === 'text') return undefined;
|
365
|
+
const textKey = getKeyText(effectiveKeyMap.value, String(key[2]), isMac.value);
|
366
|
+
return translateKey(textKey);
|
367
|
+
}
|
368
|
+
function renderKey(key, keyIndex, isContained) {
|
369
|
+
const KeyComponent = isContained ? 'kbd' : VKbd;
|
370
|
+
const keyClasses = ['v-hotkey__key', `v-hotkey__key-${key[0]}`, ...(isContained ? ['v-hotkey__key--nested'] : [borderClasses.value, roundedClasses.value, elevationClasses.value, colorClasses.value])];
|
371
|
+
return _createVNode(KeyComponent, {
|
372
|
+
"key": keyIndex,
|
373
|
+
"class": _normalizeClass(keyClasses),
|
374
|
+
"style": _normalizeStyle(isContained ? undefined : colorStyles.value),
|
375
|
+
"aria-hidden": "true",
|
376
|
+
"title": getKeyTooltip(key)
|
377
|
+
}, {
|
378
|
+
default: () => [key[0] === 'icon' ? _createVNode(VIcon, {
|
379
|
+
"icon": key[1],
|
380
|
+
"aria-hidden": "true"
|
381
|
+
}, null) : translateKey(key[1])]
|
382
|
+
});
|
383
|
+
}
|
384
|
+
function renderDivider(key, keyIndex) {
|
385
|
+
return _createElementVNode("span", {
|
386
|
+
"key": keyIndex,
|
387
|
+
"class": "v-hotkey__divider",
|
388
|
+
"aria-hidden": "true"
|
389
|
+
}, [AND_DELINEATOR.isEqual(key) ? '+' : t('$vuetify.hotkey.then')]);
|
390
|
+
}
|
391
|
+
useRender(() => _createElementVNode("div", {
|
392
|
+
"class": _normalizeClass(['v-hotkey', {
|
393
|
+
'v-hotkey--disabled': props.disabled,
|
394
|
+
'v-hotkey--inline': props.inline,
|
395
|
+
'v-hotkey--contained': isContainedVariant.value
|
396
|
+
}, themeClasses.value, rtlClasses.value, variantClasses.value, props.class]),
|
397
|
+
"style": _normalizeStyle(props.style),
|
398
|
+
"role": "img",
|
399
|
+
"aria-label": accessibleLabel.value
|
400
|
+
}, [isContainedVariant.value ? _createVNode(VKbd, {
|
401
|
+
"key": "contained",
|
402
|
+
"class": _normalizeClass(['v-hotkey__contained-wrapper', borderClasses.value, roundedClasses.value, elevationClasses.value, colorClasses.value]),
|
403
|
+
"style": _normalizeStyle(colorStyles.value),
|
404
|
+
"aria-hidden": "true"
|
405
|
+
}, {
|
406
|
+
default: () => [props.prefix && _createElementVNode("span", {
|
407
|
+
"key": "contained-prefix",
|
408
|
+
"class": "v-hotkey__prefix"
|
409
|
+
}, [props.prefix]), keyCombinations.value.map((combination, comboIndex) => _createElementVNode("span", {
|
410
|
+
"class": "v-hotkey__combination",
|
411
|
+
"key": comboIndex
|
412
|
+
}, [combination.map((key, keyIndex) => isDelineator(key) ? renderDivider(key, keyIndex) : renderKey(key, keyIndex, true)), comboIndex < keyCombinations.value.length - 1 && _createElementVNode("span", {
|
413
|
+
"aria-hidden": "true"
|
414
|
+
}, [_createTextVNode("\xA0")])])), props.suffix && _createElementVNode("span", {
|
415
|
+
"key": "contained-suffix",
|
416
|
+
"class": "v-hotkey__suffix"
|
417
|
+
}, [props.suffix])]
|
418
|
+
}) : _createElementVNode(_Fragment, null, [props.prefix && _createElementVNode("span", {
|
419
|
+
"key": "prefix",
|
420
|
+
"class": "v-hotkey__prefix"
|
421
|
+
}, [props.prefix]), keyCombinations.value.map((combination, comboIndex) => _createElementVNode("span", {
|
422
|
+
"class": "v-hotkey__combination",
|
423
|
+
"key": comboIndex
|
424
|
+
}, [combination.map((key, keyIndex) => isDelineator(key) ? renderDivider(key, keyIndex) : renderKey(key, keyIndex, false)), comboIndex < keyCombinations.value.length - 1 && _createElementVNode("span", {
|
425
|
+
"aria-hidden": "true"
|
426
|
+
}, [_createTextVNode("\xA0")])])), props.suffix && _createElementVNode("span", {
|
427
|
+
"key": "suffix",
|
428
|
+
"class": "v-hotkey__suffix"
|
429
|
+
}, [props.suffix])])]));
|
430
|
+
}
|
431
|
+
});
|
432
|
+
//# sourceMappingURL=VHotkey.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"VHotkey.js","names":["VIcon","VKbd","makeBorderProps","useBorder","makeComponentProps","makeElevationProps","useElevation","splitKeyCombination","splitKeySequence","useLocale","useRtl","makeRoundedProps","useRounded","makeThemeProps","provideTheme","useVariant","computed","genericComponent","mergeDeep","propsFactory","useRender","processKey","config","requestedMode","isMac","keyCfg","mac","default","mode","icon","symbol","value","text","startsWith","slice","toUpperCase","hotkeyMap","ctrl","meta","cmd","shift","alt","enter","arrowup","arrowdown","arrowleft","arrowright","backspace","escape","makeVHotkeyVariantProps","variant","type","String","validator","v","includes","makeVHotkeyProps","keys","displayMode","keyMap","Object","platform","inline","Boolean","disabled","prefix","suffix","color","Delineator","constructor","delineator","val","Error","isEqual","d","isDelineator","isString","getKeyText","key","lowerKey","toLowerCase","result","applyDisplayModeToKey","replace","VHotkey","name","props","setup","t","themeClasses","rtlClasses","borderClasses","roundedClasses","elevationClasses","isContainedVariant","effectiveVariantProps","colorClasses","colorStyles","variantClasses","navigator","test","userAgent","effectiveDisplayMode","AND_DELINEATOR","THEN_DELINEATOR","effectiveKeyMap","keyCombinations","split","map","combination","sequenceGroups","flatMap","group","groupIndex","keyParts","parts","reduce","acc","part","index","length","push","accessibleLabel","readableShortcuts","readableParts","textKey","translateKey","join","shortcutText","getKeyTooltip","undefined","renderKey","keyIndex","isContained","KeyComponent","keyClasses","_createVNode","_normalizeClass","_normalizeStyle","renderDivider","_createElementVNode","class","style","comboIndex","_createTextVNode","_Fragment"],"sources":["../../../src/labs/VHotkey/VHotkey.tsx"],"sourcesContent":["/**\n * VHotkey Component\n *\n * Purpose: Renders keyboard shortcuts in a visually consistent and accessible way.\n * This component handles the complex logic of displaying keyboard combinations\n * across different platforms (Mac vs PC) and display modes (icons, symbols, text).\n *\n * Why it exists:\n * - Provides consistent visual representation of keyboard shortcuts\n * - Handles platform-specific key differences (Cmd vs Ctrl, Option vs Alt)\n * - Supports multiple display modes for different design needs\n * - Encapsulates complex key parsing and rendering logic\n * - Used throughout the command palette for instruction display\n *\n * Key Mapping Structure:\n * The keyMap uses a simple object structure where each key has:\n * - `default`: Required configuration for all platforms\n * - `mac`: Optional Mac-specific overrides\n * Each config can specify `symbol`, `icon`, and `text` representations.\n *\n * Example:\n * ```\n * ctrl: {\n * mac: { symbol: '⌃', icon: '$ctrl', text: 'Control' },\n * default: { text: 'Ctrl', icon: '$ctrl' }\n * }\n * ```\n */\n\n// Styles\nimport './VHotkey.scss'\n\n// Components\nimport { VIcon } from '@/components/VIcon'\nimport { VKbd } from '@/components/VKbd'\n\n// Composables\nimport { makeBorderProps, useBorder } from '@/composables/border'\nimport { makeComponentProps } from '@/composables/component'\nimport { makeElevationProps, useElevation } from '@/composables/elevation'\nimport { splitKeyCombination, splitKeySequence } from '@/composables/hotkey/hotkey-parsing'\nimport { useLocale, useRtl } from '@/composables/locale'\nimport { makeRoundedProps, useRounded } from '@/composables/rounded'\nimport { makeThemeProps, provideTheme } from '@/composables/theme'\nimport { useVariant } from '@/composables/variant'\n\n// Utilities\nimport { computed } from 'vue'\nimport { genericComponent, mergeDeep, propsFactory, useRender } from '@/util'\n\n// Types\nimport type { PropType } from 'vue'\nimport type { IconValue } from '@/composables/icons'\nimport type { Variant } from '@/composables/variant'\n\n// Display mode types for different visual representations\ntype DisplayMode = 'icon' | 'symbol' | 'text'\n\n// Extended variant type that includes our custom 'contained' variant\ntype HotkeyVariant = 'elevated' | 'flat' | 'tonal' | 'outlined' | 'text' | 'plain' | 'contained'\n\n// Key display tuple: [mode, content] where content is string or IconValue\ntype KeyDisplay = [Exclude<DisplayMode, 'icon'>, string] | [Extract<DisplayMode, 'icon'>, IconValue]\n\n// Key tuple: [mode, content] where content is string or IconValue\ntype Key = [Exclude<DisplayMode, 'icon'>, string, string] | [Extract<DisplayMode, 'icon'>, IconValue, string]\n\ntype KeyConfig = {\n symbol?: string\n icon?: string\n text: string\n}\n\ntype PlatformKeyConfig = {\n mac?: KeyConfig\n default: KeyConfig\n}\n\ntype KeyMapConfig = Record<string, PlatformKeyConfig>\n\nfunction processKey (config: PlatformKeyConfig, requestedMode: DisplayMode, isMac: boolean): KeyDisplay {\n const keyCfg = (isMac && config.mac) ? config.mac : config.default\n\n // 1. Resolve the safest display mode for the current platform\n const mode: DisplayMode = (() => {\n // Non-Mac platforms rarely use icons – prefer text\n if (requestedMode === 'icon' && !isMac) return 'text'\n\n // If the requested mode lacks an asset, fall back to text\n if (requestedMode === 'icon' && !keyCfg.icon) return 'text'\n if (requestedMode === 'symbol' && !keyCfg.symbol) return 'text'\n\n return requestedMode\n })()\n\n // 2. Pick value for the chosen mode, defaulting to text representation\n let value: string | IconValue = keyCfg[mode] ?? keyCfg.text\n\n // 3. Guard against icon tokens leaking into text mode (e.g. \"$ctrl\")\n if (mode === 'text' && typeof value === 'string' && value.startsWith('$') && !value.startsWith('$vuetify.')) {\n value = value.slice(1).toUpperCase() // \"$ctrl\" → \"CTRL\"\n }\n\n return mode === 'icon'\n ? ['icon', value as IconValue]\n : [mode as Exclude<DisplayMode, 'icon'>, value as string]\n}\n\nexport const hotkeyMap: KeyMapConfig = {\n ctrl: {\n mac: { symbol: '⌃', icon: '$ctrl', text: '$vuetify.hotkey.ctrl' },\n default: { text: 'Ctrl' },\n },\n meta: {\n mac: { symbol: '⌘', icon: '$command', text: '$vuetify.hotkey.command' },\n default: { text: 'Ctrl' },\n },\n cmd: {\n mac: { symbol: '⌘', icon: '$command', text: '$vuetify.hotkey.command' },\n default: { text: 'Ctrl' },\n },\n shift: {\n mac: { symbol: '⇧', icon: '$shift', text: '$vuetify.hotkey.shift' },\n default: { text: 'Shift' },\n },\n alt: {\n mac: { symbol: '⌥', icon: '$alt', text: '$vuetify.hotkey.option' },\n default: { text: 'Alt' },\n },\n enter: {\n default: { symbol: '↵', icon: '$enter', text: '$vuetify.hotkey.enter' },\n },\n arrowup: {\n default: { symbol: '↑', icon: '$arrowup', text: '$vuetify.hotkey.upArrow' },\n },\n arrowdown: {\n default: { symbol: '↓', icon: '$arrowdown', text: '$vuetify.hotkey.downArrow' },\n },\n arrowleft: {\n default: { symbol: '←', icon: '$arrowleft', text: '$vuetify.hotkey.leftArrow' },\n },\n arrowright: {\n default: { symbol: '→', icon: '$arrowright', text: '$vuetify.hotkey.rightArrow' },\n },\n backspace: {\n default: { symbol: '⌫', icon: '$backspace', text: '$vuetify.hotkey.backspace' },\n },\n escape: {\n default: { text: '$vuetify.hotkey.escape' },\n },\n ' ': {\n mac: { symbol: '␣', icon: '$space', text: '$vuetify.hotkey.space' },\n default: { text: '$vuetify.hotkey.space' },\n },\n '-': {\n default: { text: '-' },\n },\n}\n\n// Create custom variant props that extend the base variant props with our 'contained' option\nconst makeVHotkeyVariantProps = propsFactory({\n variant: {\n type: String as PropType<HotkeyVariant>,\n default: 'elevated' as const,\n validator: (v: any) => ['elevated', 'flat', 'tonal', 'outlined', 'text', 'plain', 'contained'].includes(v),\n },\n}, 'VHotkeyVariant')\n\nexport const makeVHotkeyProps = propsFactory({\n // String representing keyboard shortcuts (e.g., \"ctrl+k\", \"meta+shift+p\")\n keys: String,\n // How to display keys: 'symbol' uses special characters (⌘, ⌃), 'icon' uses SVG icons, 'text' uses words\n displayMode: {\n type: String as PropType<DisplayMode>,\n default: 'icon',\n },\n // Custom key mapping configuration. Users can import and modify the exported hotkeyMap as needed\n keyMap: {\n type: Object as PropType<KeyMapConfig>,\n default: () => hotkeyMap,\n },\n platform: {\n type: String as PropType<'auto' | 'pc' | 'mac'>,\n default: 'auto',\n },\n inline: Boolean,\n disabled: Boolean,\n prefix: String,\n suffix: String,\n\n ...makeComponentProps(),\n ...makeThemeProps(),\n ...makeBorderProps(),\n ...makeRoundedProps(),\n ...makeElevationProps(),\n ...makeVHotkeyVariantProps(),\n color: String,\n}, 'VHotkey')\n\nclass Delineator {\n val\n constructor (delineator: string) {\n if (['and', 'then'].includes(delineator)) this.val = delineator as 'then' | 'and'\n else { throw new Error('Not a valid delineator') }\n }\n\n public isEqual (d: Delineator) {\n return this.val === d.val\n }\n}\n\nfunction isDelineator (value: any): value is Delineator {\n return value instanceof Delineator\n}\nfunction isString (value: any): value is string {\n return typeof value === 'string'\n}\n\nfunction getKeyText (keyMap: KeyMapConfig, key: string, isMac: boolean): string {\n const lowerKey = key.toLowerCase()\n\n if (lowerKey in keyMap) {\n const result = processKey(keyMap[lowerKey], 'text', isMac)\n return typeof result[1] === 'string' ? result[1] : String(result[1])\n }\n\n return key.toUpperCase()\n}\n\nfunction applyDisplayModeToKey (keyMap: KeyMapConfig, mode: DisplayMode, key: string, isMac: boolean): Key {\n const lowerKey = key.toLowerCase()\n\n if (lowerKey in keyMap) {\n const result = processKey(keyMap[lowerKey], mode, isMac)\n\n if (result[0] === 'text' && typeof result[1] === 'string' && result[1].startsWith('$') && !result[1].startsWith('$vuetify.')) {\n return ['text', result[1].replace('$', '').toUpperCase(), key]\n }\n\n return [...result, key]\n }\n\n return ['text', key.toUpperCase(), key]\n}\n\nexport const VHotkey = genericComponent()({\n name: 'VHotkey',\n\n props: makeVHotkeyProps(),\n\n setup (props) {\n const { t } = useLocale()\n const { themeClasses } = provideTheme(props)\n const { rtlClasses } = useRtl()\n const { borderClasses } = useBorder(props)\n const { roundedClasses } = useRounded(props)\n const { elevationClasses } = useElevation(props)\n\n const isContainedVariant = computed(() => props.variant === 'contained')\n\n const effectiveVariantProps = computed(() => ({\n ...props,\n variant: isContainedVariant.value ? 'elevated' as Variant : props.variant as Variant,\n }))\n\n const { colorClasses, colorStyles, variantClasses } = useVariant(effectiveVariantProps)\n\n const isMac = computed(() =>\n props.platform === 'auto'\n ? (typeof navigator !== 'undefined' && /macintosh/i.test(navigator.userAgent))\n : props.platform === 'mac'\n )\n\n const effectiveDisplayMode = computed<DisplayMode>(() => props.displayMode)\n\n const AND_DELINEATOR = new Delineator('and') // For + separators\n const THEN_DELINEATOR = new Delineator('then') // For - separators\n\n const effectiveKeyMap = computed(() => props.keyMap)\n\n const keyCombinations = computed(() => {\n if (!props.keys) return []\n\n // Split by spaces to handle multiple key combinations\n // Example: \"ctrl+k meta+p\" -> [\"ctrl+k\", \"meta+p\"]\n return props.keys.split(' ').map(combination => {\n // Use the shared sequence splitting logic\n const sequenceGroups = splitKeySequence(combination)\n\n // Process each sequence group\n return sequenceGroups.flatMap((group, groupIndex) => {\n // Use the shared key combination splitting logic\n const keyParts = splitKeyCombination(group)\n\n const parts = keyParts.reduce<Array<string | Delineator>>((acc, part, index) => {\n if (index !== 0) {\n // Add AND delineator between keys\n return [...acc, AND_DELINEATOR, part]\n }\n return [...acc, part]\n }, [])\n\n // Add THEN delineator between sequence groups\n const result = parts.map(key => {\n if (isString(key)) {\n return applyDisplayModeToKey(effectiveKeyMap.value, effectiveDisplayMode.value, key, isMac.value)\n }\n return key\n })\n\n // Add sequence separator if not the last group\n if (groupIndex < sequenceGroups.length - 1) {\n result.push(THEN_DELINEATOR)\n }\n\n return result\n })\n })\n })\n\n const accessibleLabel = computed(() => {\n if (!props.keys) return ''\n\n // Convert the parsed key combinations into readable text\n const readableShortcuts = keyCombinations.value.map(combination => {\n const readableParts: string[] = []\n\n for (const key of combination) {\n if (isDelineator(key)) {\n if (AND_DELINEATOR.isEqual(key)) {\n readableParts.push(t('$vuetify.hotkey.plus'))\n } else if (THEN_DELINEATOR.isEqual(key)) {\n readableParts.push(t('$vuetify.hotkey.then'))\n }\n } else {\n // Always use text representation for screen readers\n const textKey = key[0] === 'icon' || key[0] === 'symbol'\n ? applyDisplayModeToKey(mergeDeep(hotkeyMap, props.keyMap), 'text', String(key[1]), isMac.value)[1]\n : key[1]\n readableParts.push(translateKey(textKey as string))\n }\n }\n\n return readableParts.join(' ')\n })\n\n const shortcutText = readableShortcuts.join(', ')\n return t('$vuetify.hotkey.shortcut', shortcutText)\n })\n\n function translateKey (key: string) {\n return key.startsWith('$vuetify.') ? t(key) : key\n }\n\n function getKeyTooltip (key: Key): string | undefined {\n if (effectiveDisplayMode.value === 'text') return undefined\n\n const textKey = getKeyText(effectiveKeyMap.value, String(key[2]), isMac.value)\n return translateKey(textKey)\n }\n\n function renderKey (key: Key, keyIndex: number, isContained: boolean) {\n const KeyComponent = isContained ? 'kbd' : VKbd\n const keyClasses = [\n 'v-hotkey__key',\n `v-hotkey__key-${key[0]}`,\n ...(isContained ? ['v-hotkey__key--nested'] : [\n borderClasses.value,\n roundedClasses.value,\n elevationClasses.value,\n colorClasses.value,\n ]),\n ]\n\n return (\n <KeyComponent\n key={ keyIndex }\n class={ keyClasses }\n style={ isContained ? undefined : colorStyles.value }\n aria-hidden=\"true\"\n title={ getKeyTooltip(key) }\n >\n {\n key[0] === 'icon' ? (\n <VIcon\n icon={ key[1] }\n aria-hidden=\"true\"\n />\n ) : translateKey(key[1])\n }\n </KeyComponent>\n )\n }\n\n function renderDivider (key: Delineator, keyIndex: number) {\n return (\n <span\n key={ keyIndex }\n class=\"v-hotkey__divider\"\n aria-hidden=\"true\"\n >\n {\n AND_DELINEATOR.isEqual(key) ? '+' : t('$vuetify.hotkey.then')\n }\n </span>\n )\n }\n\n useRender(() => (\n <div\n class={[\n 'v-hotkey',\n {\n 'v-hotkey--disabled': props.disabled,\n 'v-hotkey--inline': props.inline,\n 'v-hotkey--contained': isContainedVariant.value,\n },\n themeClasses.value,\n rtlClasses.value,\n variantClasses.value,\n props.class,\n ]}\n style={ props.style }\n role=\"img\"\n aria-label={ accessibleLabel.value }\n >\n { isContainedVariant.value ? (\n <VKbd\n key=\"contained\"\n class={[\n 'v-hotkey__contained-wrapper',\n borderClasses.value,\n roundedClasses.value,\n elevationClasses.value,\n colorClasses.value,\n ]}\n style={ colorStyles.value }\n aria-hidden=\"true\"\n >\n { props.prefix && (\n <span key=\"contained-prefix\" class=\"v-hotkey__prefix\">{ props.prefix }</span>\n )}\n { keyCombinations.value.map((combination, comboIndex) => (\n <span class=\"v-hotkey__combination\" key={ comboIndex }>\n { combination.map((key, keyIndex) =>\n isDelineator(key)\n ? renderDivider(key, keyIndex)\n : renderKey(key, keyIndex, true)\n )}\n { comboIndex < keyCombinations.value.length - 1 && <span aria-hidden=\"true\"> </span> }\n </span>\n ))}\n { props.suffix && (\n <span key=\"contained-suffix\" class=\"v-hotkey__suffix\">{ props.suffix }</span>\n )}\n </VKbd>\n ) : (\n <>\n { props.prefix && (\n <span key=\"prefix\" class=\"v-hotkey__prefix\">{ props.prefix }</span>\n )}\n { keyCombinations.value.map((combination, comboIndex) => (\n <span class=\"v-hotkey__combination\" key={ comboIndex }>\n { combination.map((key, keyIndex) =>\n isDelineator(key)\n ? renderDivider(key, keyIndex)\n : renderKey(key, keyIndex, false)\n )}\n { comboIndex < keyCombinations.value.length - 1 && <span aria-hidden=\"true\"> </span> }\n </span>\n ))}\n { props.suffix && (\n <span key=\"suffix\" class=\"v-hotkey__suffix\">{ props.suffix }</span>\n )}\n </>\n )}\n </div>\n ))\n },\n})\n\nexport type VHotkey = InstanceType<typeof VHotkey>\n\nexport type { KeyConfig, PlatformKeyConfig, KeyMapConfig, DisplayMode }\n"],"mappings":"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","ignoreList":[]}
|