@tanstack/hotkeys-devtools 0.9.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"HotkeyList.js","names":["For","Show","createEffect","createMemo","createSignal","on","clsx","matchSorter","formatForDisplay","useStyles","useHotkeysDevtoolsState","effectiveSequenceMatchedSteps","ConflictBehavior","HotkeyRegistration","SequenceRegistrationView","sequenceKey","sequence","Array","join","HotkeyListProps","selectedId","setSelectedId","id","getTargetLabel","target","HTMLElement","Document","Window","document","window","tagName","toLowerCase","getTargetTooltip","tag","parts","push","className","classes","split","filter","Boolean","dataAttrs","from","attributes","attr","name","startsWith","map","value","length","findTargetConflicts","registration","all","other","hotkey","options","eventType","findScopeConflicts","findSequenceTargetConflicts","findSequenceScopeConflicts","buildRowTooltip","meta","description","undefined","SequenceListRow","props","reg","getSequences","sequenceProgressNow","styles","sequenceRegistrations","targetConflicts","scopeConflicts","hasTargetConflict","hasScopeConflict","conflictBehavior","targetConflictBadge","behavior","c","style","const","label","tooltip","scopeConflictTooltip","enabled","liveSequenceReg","find","r","triggerCount","matchedSteps","prevCount","setPrevCount","pulsing","setPulsing","current","setTimeout","metaName","rowTooltip","_el$","_tmpl$4","_el$3","firstChild","_el$4","_el$8","nextSibling","_el$9","_el$0","_el$1","_el$10","_el$11","_el$13","_el$12","_el$14","_el$15","$$click","_$insert","_$createComponent","when","children","_el$2","_tmpl$","_$effect","_$className","rowTooltipText","each","step","i","_el$16","_tmpl$5","_el$17","sequenceStepMatched","_el$5","_tmpl$2","hotkeyLabelName","_el$6","_tmpl$3","_el$7","_c$","_$memo","_el$18","_tmpl$6","_el$19","_p$","_v$1","badge","_v$10","tooltipText","e","t","_c$2","_el$20","_tmpl$7","_el$21","_el$22","_v$11","badgeInfo","_v$12","_v$","hotkeyRow","hotkeyRowSelected","hotkeyRowTriggered","_v$2","hotkeyLabel","_v$3","hotkeyLabelKeys","_v$4","hotkeyBadges","_v$5","badgeEnabled","badgeDisabled","_v$6","_v$7","badgeKeydown","badgeKeyup","_v$8","_v$9","badgeTarget","_v$0","a","o","n","s","h","d","HotkeyList","state","searchQuery","setSearchQuery","registrations","filteredRegistrations","query","trim","keys","filteredSequenceRegistrations","_el$23","_tmpl$9","_el$24","$$input","currentTarget","_el$25","_tmpl$8","searchClear","_v$13","searchContainer","_v$14","searchInput","_el$26","_tmpl$0","_el$27","_el$29","_el$28","panelHeader","_el$30","_tmpl$1","_el$36","_el$38","_el$39","_el$43","_el$44","_el$45","_el$46","_el$47","_el$48","_el$50","_el$49","_el$51","_el$52","_el$37","_el$40","_el$41","_el$42","_c$3","_el$53","_el$54","_v$25","_v$26","_c$4","_el$55","_el$56","_el$57","_v$27","_v$28","_v$15","_v$16","_v$17","_v$18","_v$19","_v$20","_v$21","_v$22","_v$23","_v$24","hotkeyList","_el$31","_tmpl$10","_el$32","_el$34","_el$33","_el$35","_$delegateEvents"],"sources":["../../src/components/HotkeyList.tsx"],"sourcesContent":["import { For, Show, createEffect, createMemo, createSignal, on } from 'solid-js'\nimport clsx from 'clsx'\nimport { matchSorter } from 'match-sorter'\nimport { formatForDisplay } from '@tanstack/hotkeys'\nimport { useStyles } from '../styles/use-styles'\nimport { useHotkeysDevtoolsState } from '../HotkeysContextProvider'\nimport { effectiveSequenceMatchedSteps } from '../sequence-progress'\nimport type {\n ConflictBehavior,\n HotkeyRegistration,\n SequenceRegistrationView,\n} from '@tanstack/hotkeys'\n\nfunction sequenceKey(sequence: Array<string>): string {\n return sequence.join('|')\n}\n\ntype HotkeyListProps = {\n selectedId: () => string | null\n setSelectedId: (id: string | null) => void\n}\n\nfunction getTargetLabel(target: HTMLElement | Document | Window): string {\n if (typeof document !== 'undefined' && target === document) {\n return 'document'\n }\n if (typeof window !== 'undefined' && target === window) {\n return 'window'\n }\n if (target instanceof HTMLElement) {\n return target.tagName.toLowerCase()\n }\n return 'element'\n}\n\nfunction getTargetTooltip(target: HTMLElement | Document | Window): string {\n if (typeof document !== 'undefined' && target === document) {\n return 'Listening on document'\n }\n if (typeof window !== 'undefined' && target === window) {\n return 'Listening on window'\n }\n if (target instanceof HTMLElement) {\n const tag = target.tagName.toLowerCase()\n const parts: Array<string> = [tag]\n if (target.id) {\n parts.push(`id=\"${target.id}\"`)\n }\n if (target.className) {\n const classes = target.className.split(/\\s+/).filter(Boolean).join(', ')\n parts.push(`class=\"${classes}\"`)\n }\n // Collect data- attributes\n const dataAttrs = Array.from(target.attributes)\n .filter((attr) => attr.name.startsWith('data-'))\n .map((attr) => `${attr.name}=\"${attr.value}\"`)\n if (dataAttrs.length > 0) {\n parts.push(...dataAttrs)\n }\n return `Listening on ${parts.join(' ')}`\n }\n return 'Listening on element'\n}\n\nfunction findTargetConflicts(\n registration: HotkeyRegistration,\n all: Array<HotkeyRegistration>,\n): Array<HotkeyRegistration> {\n return all.filter(\n (other) =>\n other.id !== registration.id &&\n other.hotkey === registration.hotkey &&\n other.options.eventType === registration.options.eventType &&\n other.target === registration.target,\n )\n}\n\nfunction findScopeConflicts(\n registration: HotkeyRegistration,\n all: Array<HotkeyRegistration>,\n): Array<HotkeyRegistration> {\n return all.filter(\n (other) =>\n other.id !== registration.id &&\n other.hotkey === registration.hotkey &&\n other.options.eventType === registration.options.eventType &&\n other.target !== registration.target,\n )\n}\n\nfunction findSequenceTargetConflicts(\n registration: SequenceRegistrationView,\n all: Array<SequenceRegistrationView>,\n): Array<SequenceRegistrationView> {\n return all.filter(\n (other) =>\n other.id !== registration.id &&\n sequenceKey(other.sequence) === sequenceKey(registration.sequence) &&\n other.options.eventType === registration.options.eventType &&\n other.target === registration.target,\n )\n}\n\nfunction findSequenceScopeConflicts(\n registration: SequenceRegistrationView,\n all: Array<SequenceRegistrationView>,\n): Array<SequenceRegistrationView> {\n return all.filter(\n (other) =>\n other.id !== registration.id &&\n sequenceKey(other.sequence) === sequenceKey(registration.sequence) &&\n other.options.eventType === registration.options.eventType &&\n other.target !== registration.target,\n )\n}\n\nfunction buildRowTooltip(meta?: {\n name?: string\n description?: string\n}): string | undefined {\n if (!meta) return undefined\n const parts: Array<string> = []\n if (meta.name) parts.push(meta.name)\n if (meta.description) parts.push(meta.description)\n return parts.length > 0 ? parts.join(' — ') : undefined\n}\n\nfunction SequenceListRow(props: {\n reg: SequenceRegistrationView\n getSequences: () => Array<SequenceRegistrationView>\n sequenceProgressNow: () => number\n selectedId: () => string | null\n setSelectedId: (id: string | null) => void\n}) {\n const styles = useStyles()\n\n const sequenceRegistrations = () => props.getSequences()\n\n const targetConflicts = () =>\n findSequenceTargetConflicts(props.reg, sequenceRegistrations())\n const scopeConflicts = () =>\n findSequenceScopeConflicts(props.reg, sequenceRegistrations())\n\n const hasTargetConflict = () => targetConflicts().length > 0\n const hasScopeConflict = () => scopeConflicts().length > 0\n\n const conflictBehavior = (): ConflictBehavior =>\n props.reg.options.conflictBehavior ?? 'warn'\n\n const targetConflictBadge = () => {\n const behavior = conflictBehavior()\n const c = targetConflicts()\n if (behavior === 'allow') {\n return {\n style: 'badgeAllow' as const,\n label: '~',\n tooltip: `Allowed: ${c.length} other binding${c.length > 1 ? 's' : ''} on same sequence and target (conflictBehavior: allow)`,\n }\n }\n if (behavior === 'error') {\n return {\n style: 'badgeError' as const,\n label: '!',\n tooltip: `Error: ${c.length} conflicting binding${c.length > 1 ? 's' : ''} on same sequence and target (conflictBehavior: error)`,\n }\n }\n return {\n style: 'badgeConflict' as const,\n label: '!',\n tooltip: `Warning: ${c.length} other binding${c.length > 1 ? 's' : ''} on same sequence and target`,\n }\n }\n\n const scopeConflictTooltip = () => {\n const c = scopeConflicts()\n return `Info: ${c.length} binding${c.length > 1 ? 's' : ''} with same sequence on different target${c.length > 1 ? 's' : ''}`\n }\n\n const enabled = () => props.reg.options.enabled !== false\n\n const liveSequenceReg = createMemo(\n () =>\n sequenceRegistrations().find((r) => r.id === props.reg.id) ?? props.reg,\n )\n\n const triggerCount = () =>\n sequenceRegistrations().find((r) => r.id === props.reg.id)?.triggerCount ??\n props.reg.triggerCount\n\n const matchedSteps = createMemo(() =>\n effectiveSequenceMatchedSteps(\n liveSequenceReg(),\n props.sequenceProgressNow(),\n ),\n )\n\n const [prevCount, setPrevCount] = createSignal(props.reg.triggerCount)\n const [pulsing, setPulsing] = createSignal(false)\n\n createEffect(\n on(triggerCount, (current) => {\n if (current > prevCount()) {\n setPulsing(true)\n setTimeout(() => setPulsing(false), 600)\n }\n setPrevCount(current)\n }),\n )\n\n const metaName = () => props.reg.options.meta?.name\n const rowTooltip = () => buildRowTooltip(props.reg.options.meta)\n\n return (\n <div\n class={clsx(\n styles().hotkeyRow,\n props.selectedId() === props.reg.id && styles().hotkeyRowSelected,\n pulsing() && styles().hotkeyRowTriggered,\n rowTooltip() && styles().tooltip,\n )}\n onClick={() => props.setSelectedId(props.reg.id)}\n >\n <Show when={rowTooltip()}>\n <span class={styles().rowTooltipText} data-tooltip>\n {rowTooltip()}\n </span>\n </Show>\n <span class={styles().hotkeyLabel}>\n <span class={styles().hotkeyLabelKeys}>\n <For each={liveSequenceReg().sequence}>\n {(step, i) => (\n <span>\n <Show when={i() > 0}> </Show>\n <span\n class={\n i() < matchedSteps()\n ? styles().sequenceStepMatched\n : undefined\n }\n >\n {formatForDisplay(step)}\n </span>\n </span>\n )}\n </For>\n </span>\n <Show when={metaName()}>\n <span class={styles().hotkeyLabelName}>{metaName()}</span>\n </Show>\n </span>\n <Show when={triggerCount() > 0}>\n <span class={styles().triggerCount}>x{triggerCount()}</span>\n </Show>\n <div class={styles().hotkeyBadges}>\n {hasTargetConflict() && (\n <span\n class={clsx(\n styles().badge,\n styles()[targetConflictBadge().style],\n styles().tooltip,\n )}\n >\n {targetConflictBadge().label}\n <span class={styles().tooltipText} data-tooltip>\n {targetConflictBadge().tooltip}\n </span>\n </span>\n )}\n {hasScopeConflict() && (\n <span\n class={clsx(styles().badge, styles().badgeInfo, styles().tooltip)}\n >\n i\n <span class={styles().tooltipText} data-tooltip>\n {scopeConflictTooltip()}\n </span>\n </span>\n )}\n <span\n class={clsx(\n styles().badge,\n enabled() ? styles().badgeEnabled : styles().badgeDisabled,\n styles().tooltip,\n )}\n >\n {enabled() ? 'on' : 'off'}\n <span class={styles().tooltipText} data-tooltip>\n {enabled() ? 'Sequence is enabled' : 'Sequence is disabled'}\n </span>\n </span>\n <span\n class={clsx(\n styles().badge,\n (props.reg.options.eventType ?? 'keydown') === 'keydown'\n ? styles().badgeKeydown\n : styles().badgeKeyup,\n styles().tooltip,\n )}\n >\n {props.reg.options.eventType ?? 'keydown'}\n <span class={styles().tooltipText} data-tooltip>\n Fires on {props.reg.options.eventType ?? 'keydown'} event\n </span>\n </span>\n <span\n class={clsx(styles().badge, styles().badgeTarget, styles().tooltip)}\n >\n {getTargetLabel(props.reg.target)}\n <span class={styles().tooltipText} data-tooltip>\n {getTargetTooltip(props.reg.target)}\n </span>\n </span>\n </div>\n </div>\n )\n}\n\nexport function HotkeyList(props: HotkeyListProps) {\n const styles = useStyles()\n const state = useHotkeysDevtoolsState()\n\n const [searchQuery, setSearchQuery] = createSignal('')\n\n const registrations = createMemo(() => state.registrations())\n const sequenceRegistrations = createMemo(() => state.sequenceRegistrations())\n\n const filteredRegistrations = createMemo(() => {\n const query = searchQuery().trim()\n if (!query) return registrations()\n return matchSorter(registrations(), query, {\n keys: [\n (r) => formatForDisplay(r.hotkey),\n 'hotkey',\n 'options.meta.name',\n 'options.meta.description',\n ],\n })\n })\n\n const filteredSequenceRegistrations = createMemo(() => {\n const query = searchQuery().trim()\n if (!query) return sequenceRegistrations()\n return matchSorter(sequenceRegistrations(), query, {\n keys: [\n (r) => r.sequence.map((s) => formatForDisplay(s)).join(' '),\n (r) => r.sequence.join(' '),\n 'options.meta.name',\n 'options.meta.description',\n ],\n })\n })\n\n return (\n <>\n <div class={styles().searchContainer}>\n <input\n type=\"text\"\n class={styles().searchInput}\n placeholder=\"Search hotkeys...\"\n value={searchQuery()}\n onInput={(e) => setSearchQuery(e.currentTarget.value)}\n />\n <Show when={searchQuery()}>\n <button\n class={styles().searchClear}\n onClick={() => setSearchQuery('')}\n >\n &times;\n </button>\n </Show>\n </div>\n\n <div class={styles().panelHeader}>\n Hotkeys ({filteredRegistrations().length})\n </div>\n <div class={styles().hotkeyList}>\n <For each={filteredRegistrations()}>\n {(reg) => {\n const targetConflicts = () =>\n findTargetConflicts(reg, registrations())\n const scopeConflicts = () =>\n findScopeConflicts(reg, registrations())\n\n const hasTargetConflict = () => targetConflicts().length > 0\n const hasScopeConflict = () => scopeConflicts().length > 0\n\n const conflictBehavior = (): ConflictBehavior =>\n reg.options.conflictBehavior ?? 'warn'\n\n const targetConflictBadge = () => {\n const behavior = conflictBehavior()\n const c = targetConflicts()\n if (behavior === 'allow') {\n return {\n style: 'badgeAllow' as const,\n label: '~',\n tooltip: `Allowed: ${c.length} other binding${c.length > 1 ? 's' : ''} on same key and target (conflictBehavior: allow)`,\n }\n }\n if (behavior === 'error') {\n return {\n style: 'badgeError' as const,\n label: '!',\n tooltip: `Error: ${c.length} conflicting binding${c.length > 1 ? 's' : ''} on same key and target (conflictBehavior: error)`,\n }\n }\n // 'warn' (default) or 'replace' (replacement already happened, but show warn-style if somehow present)\n return {\n style: 'badgeConflict' as const,\n label: '!',\n tooltip: `Warning: ${c.length} other binding${c.length > 1 ? 's' : ''} on same key and target`,\n }\n }\n\n const scopeConflictTooltip = () => {\n const c = scopeConflicts()\n return `Info: ${c.length} binding${c.length > 1 ? 's' : ''} with same key on different target${c.length > 1 ? 's' : ''}`\n }\n\n const enabled = () => reg.options.enabled !== false\n\n // Look up trigger count reactively from the registrations list\n // (reg is a stable object ref; the list re-derives on store change)\n const triggerCount = () =>\n registrations().find((r) => r.id === reg.id)?.triggerCount ??\n reg.triggerCount\n\n // Track trigger count changes for pulse animation\n const [prevCount, setPrevCount] = createSignal(reg.triggerCount)\n const [pulsing, setPulsing] = createSignal(false)\n\n createEffect(\n on(triggerCount, (current) => {\n if (current > prevCount()) {\n setPulsing(true)\n setTimeout(() => setPulsing(false), 600)\n }\n setPrevCount(current)\n }),\n )\n\n const metaName = () => reg.options.meta?.name\n const rowTooltip = () => buildRowTooltip(reg.options.meta)\n\n return (\n <div\n class={clsx(\n styles().hotkeyRow,\n props.selectedId() === reg.id && styles().hotkeyRowSelected,\n pulsing() && styles().hotkeyRowTriggered,\n rowTooltip() && styles().tooltip,\n )}\n onClick={() => props.setSelectedId(reg.id)}\n >\n <Show when={rowTooltip()}>\n <span class={styles().rowTooltipText} data-tooltip>\n {rowTooltip()}\n </span>\n </Show>\n <span class={styles().hotkeyLabel}>\n <span class={styles().hotkeyLabelKeys}>\n {formatForDisplay(reg.hotkey)}\n </span>\n <Show when={metaName()}>\n <span class={styles().hotkeyLabelName}>{metaName()}</span>\n </Show>\n </span>\n <Show when={triggerCount() > 0}>\n <span class={styles().triggerCount}>x{triggerCount()}</span>\n </Show>\n <div class={styles().hotkeyBadges}>\n {hasTargetConflict() && (\n <span\n class={clsx(\n styles().badge,\n styles()[targetConflictBadge().style],\n styles().tooltip,\n )}\n >\n {targetConflictBadge().label}\n <span class={styles().tooltipText} data-tooltip>\n {targetConflictBadge().tooltip}\n </span>\n </span>\n )}\n {hasScopeConflict() && (\n <span\n class={clsx(\n styles().badge,\n styles().badgeInfo,\n styles().tooltip,\n )}\n >\n i\n <span class={styles().tooltipText} data-tooltip>\n {scopeConflictTooltip()}\n </span>\n </span>\n )}\n <span\n class={clsx(\n styles().badge,\n enabled()\n ? styles().badgeEnabled\n : styles().badgeDisabled,\n styles().tooltip,\n )}\n >\n {enabled() ? 'on' : 'off'}\n <span class={styles().tooltipText} data-tooltip>\n {enabled() ? 'Hotkey is enabled' : 'Hotkey is disabled'}\n </span>\n </span>\n <span\n class={clsx(\n styles().badge,\n (reg.options.eventType ?? 'keydown') === 'keydown'\n ? styles().badgeKeydown\n : styles().badgeKeyup,\n styles().tooltip,\n )}\n >\n {reg.options.eventType ?? 'keydown'}\n <span class={styles().tooltipText} data-tooltip>\n Fires on {reg.options.eventType ?? 'keydown'} event\n </span>\n </span>\n <span\n class={clsx(\n styles().badge,\n styles().badgeTarget,\n styles().tooltip,\n )}\n >\n {getTargetLabel(reg.target)}\n <span class={styles().tooltipText} data-tooltip>\n {getTargetTooltip(reg.target)}\n </span>\n </span>\n </div>\n </div>\n )\n }}\n </For>\n </div>\n\n <div class={styles().panelHeader}>\n Sequences ({filteredSequenceRegistrations().length})\n </div>\n <div class={styles().hotkeyList}>\n <For each={filteredSequenceRegistrations()}>\n {(reg) => (\n <SequenceListRow\n reg={reg}\n getSequences={sequenceRegistrations}\n sequenceProgressNow={state.sequenceProgressNow}\n selectedId={props.selectedId}\n setSelectedId={props.setSelectedId}\n />\n )}\n </For>\n </div>\n </>\n )\n}\n"],"mappings":";;;;;;;;;;;AAaA,SAASe,YAAYC,UAAiC;AACpD,QAAOA,SAASE,KAAK,IAAI;;AAQ3B,SAASK,eAAeC,QAAiD;AACvE,KAAI,OAAOI,aAAa,eAAeJ,WAAWI,SAChD,QAAO;AAET,KAAI,OAAOC,WAAW,eAAeL,WAAWK,OAC9C,QAAO;AAET,KAAIL,kBAAkBC,YACpB,QAAOD,OAAOM,QAAQC,aAAa;AAErC,QAAO;;AAGT,SAASC,iBAAiBR,QAAiD;AACzE,KAAI,OAAOI,aAAa,eAAeJ,WAAWI,SAChD,QAAO;AAET,KAAI,OAAOC,WAAW,eAAeL,WAAWK,OAC9C,QAAO;AAET,KAAIL,kBAAkBC,aAAa;EAEjC,MAAMS,QAAuB,CADjBV,OAAOM,QAAQC,aAAa,CACN;AAClC,MAAIP,OAAOF,GACTY,OAAMC,KAAK,OAAOX,OAAOF,GAAE,GAAI;AAEjC,MAAIE,OAAOY,WAAW;GACpB,MAAMC,UAAUb,OAAOY,UAAUE,MAAM,MAAM,CAACC,OAAOC,QAAQ,CAACtB,KAAK,KAAK;AACxEgB,SAAMC,KAAK,UAAUE,QAAO,GAAI;;EAGlC,MAAMI,YAAYxB,MAAMyB,KAAKlB,OAAOmB,WAAW,CAC5CJ,QAAQK,SAASA,KAAKC,KAAKC,WAAW,QAAQ,CAAC,CAC/CC,KAAKH,SAAS,GAAGA,KAAKC,KAAI,IAAKD,KAAKI,MAAK,GAAI;AAChD,MAAIP,UAAUQ,SAAS,EACrBf,OAAMC,KAAK,GAAGM,UAAU;AAE1B,SAAO,gBAAgBP,MAAMhB,KAAK,IAAI;;AAExC,QAAO;;AAGT,SAASgC,oBACPC,cACAC,KAC2B;AAC3B,QAAOA,IAAIb,QACRc,UACCA,MAAM/B,OAAO6B,aAAa7B,MAC1B+B,MAAMC,WAAWH,aAAaG,UAC9BD,MAAME,QAAQC,cAAcL,aAAaI,QAAQC,aACjDH,MAAM7B,WAAW2B,aAAa3B,OACjC;;AAGH,SAASiC,mBACPN,cACAC,KAC2B;AAC3B,QAAOA,IAAIb,QACRc,UACCA,MAAM/B,OAAO6B,aAAa7B,MAC1B+B,MAAMC,WAAWH,aAAaG,UAC9BD,MAAME,QAAQC,cAAcL,aAAaI,QAAQC,aACjDH,MAAM7B,WAAW2B,aAAa3B,OACjC;;AAGH,SAASkC,4BACPP,cACAC,KACiC;AACjC,QAAOA,IAAIb,QACRc,UACCA,MAAM/B,OAAO6B,aAAa7B,MAC1BP,YAAYsC,MAAMrC,SAAS,KAAKD,YAAYoC,aAAanC,SAAS,IAClEqC,MAAME,QAAQC,cAAcL,aAAaI,QAAQC,aACjDH,MAAM7B,WAAW2B,aAAa3B,OACjC;;AAGH,SAASmC,2BACPR,cACAC,KACiC;AACjC,QAAOA,IAAIb,QACRc,UACCA,MAAM/B,OAAO6B,aAAa7B,MAC1BP,YAAYsC,MAAMrC,SAAS,KAAKD,YAAYoC,aAAanC,SAAS,IAClEqC,MAAME,QAAQC,cAAcL,aAAaI,QAAQC,aACjDH,MAAM7B,WAAW2B,aAAa3B,OACjC;;AAGH,SAASoC,gBAAgBC,MAGF;AACrB,KAAI,CAACA,KAAM,QAAOE;CAClB,MAAM7B,QAAuB,EAAE;AAC/B,KAAI2B,KAAKhB,KAAMX,OAAMC,KAAK0B,KAAKhB,KAAK;AACpC,KAAIgB,KAAKC,YAAa5B,OAAMC,KAAK0B,KAAKC,YAAY;AAClD,QAAO5B,MAAMe,SAAS,IAAIf,MAAMhB,KAAK,MAAM,GAAG6C;;AAGhD,SAASC,gBAAgBC,OAMtB;CACD,MAAMI,SAAS5D,WAAW;CAE1B,MAAM6D,8BAA8BL,MAAME,cAAc;CAExD,MAAMI,wBACJb,4BAA4BO,MAAMC,KAAKI,uBAAuB,CAAC;CACjE,MAAME,uBACJb,2BAA2BM,MAAMC,KAAKI,uBAAuB,CAAC;CAEhE,MAAMG,0BAA0BF,iBAAiB,CAACtB,SAAS;CAC3D,MAAMyB,yBAAyBF,gBAAgB,CAACvB,SAAS;CAEzD,MAAM0B,yBACJV,MAAMC,IAAIX,QAAQoB,oBAAoB;CAExC,MAAMC,4BAA4B;EAChC,MAAMC,WAAWF,kBAAkB;EACnC,MAAMG,IAAIP,iBAAiB;AAC3B,MAAIM,aAAa,QACf,QAAO;GACLE,OAAO;GACPE,OAAO;GACPC,SAAS,YAAYJ,EAAE7B,OAAM,gBAAiB6B,EAAE7B,SAAS,IAAI,MAAM,GAAE;GACtE;AAEH,MAAI4B,aAAa,QACf,QAAO;GACLE,OAAO;GACPE,OAAO;GACPC,SAAS,UAAUJ,EAAE7B,OAAM,sBAAuB6B,EAAE7B,SAAS,IAAI,MAAM,GAAE;GAC1E;AAEH,SAAO;GACL8B,OAAO;GACPE,OAAO;GACPC,SAAS,YAAYJ,EAAE7B,OAAM,gBAAiB6B,EAAE7B,SAAS,IAAI,MAAM,GAAE;GACtE;;CAGH,MAAMkC,6BAA6B;EACjC,MAAML,IAAIN,gBAAgB;AAC1B,SAAO,SAASM,EAAE7B,OAAM,UAAW6B,EAAE7B,SAAS,IAAI,MAAM,GAAE,yCAA0C6B,EAAE7B,SAAS,IAAI,MAAM;;CAG3H,MAAMmC,gBAAgBnB,MAAMC,IAAIX,QAAQ6B,YAAY;CAEpD,MAAMC,kBAAkBlF,iBAEpBmE,uBAAuB,CAACgB,MAAMC,MAAMA,EAAEjE,OAAO2C,MAAMC,IAAI5C,GAAG,IAAI2C,MAAMC,IACvE;CAED,MAAMsB,qBACJlB,uBAAuB,CAACgB,MAAMC,MAAMA,EAAEjE,OAAO2C,MAAMC,IAAI5C,GAAG,EAAEkE,gBAC5DvB,MAAMC,IAAIsB;CAEZ,MAAMC,eAAetF,iBACnBQ,8BACE0E,iBAAiB,EACjBpB,MAAMG,qBACR,CACF,CAAC;CAED,MAAM,CAACsB,WAAWC,gBAAgBvF,aAAa6D,MAAMC,IAAIsB,aAAa;CACtE,MAAM,CAACI,SAASC,cAAczF,aAAa,MAAM;AAEjDF,cACEG,GAAGmF,eAAeM,YAAY;AAC5B,MAAIA,UAAUJ,WAAW,EAAE;AACzBG,cAAW,KAAK;AAChBE,oBAAiBF,WAAW,MAAM,EAAE,IAAI;;AAE1CF,eAAaG,QAAQ;GAEzB,CAAC;CAED,MAAME,iBAAiB/B,MAAMC,IAAIX,QAAQM,MAAMhB;CAC/C,MAAMoD,mBAAmBrC,gBAAgBK,MAAMC,IAAIX,QAAQM,KAAK;AAEhE,eAAA;EAAA,IAAAqC,OAAAC,SAAA,EAAAC,QAAAF,KAAAG,YAAAC,QAAAF,MAAAC,YAAAE,QAAAH,MAAAI,aAAAC,QAAAF,MAAAF,YAAAK,QAAAD,MAAAJ,YAAAM,QAAAF,MAAAD,aAAAI,SAAAD,MAAAN,YAAAS,SAAAF,OAAAP,WAAAG;AAAAM,SAAAN;EAAA,IAAAQ,SAAAL,MAAAH,aAAAS,SAAAD,OAAAX;AAAAH,OAAAgB,gBAQmBjD,MAAM5C,cAAc4C,MAAMC,IAAI5C,GAAG;AAAA6F,SAAAjB,MAAAkB,gBAE/CnH,MAAI;GAAA,IAACoH,OAAI;AAAA,WAAEpB,YAAY;;GAAA,IAAAqB,WAAA;IAAA,IAAAC,QAAAC,QAAA;AAAAL,WAAAI,OAEnBtB,WAAU;AAAAwB,iBAAAC,UAAAH,OADAlD,QAAQ,CAACsD,eAAc,CAAA;AAAA,WAAAJ;;GAAA,CAAA,EAAAnB,MAAA;AAAAe,SAAAb,OAAAc,gBAMjCpH,KAAG;GAAA,IAAC4H,OAAI;AAAA,WAAEvC,iBAAiB,CAACrE;;GAAQsG,WACjCO,MAAMC,aAAC;IAAA,IAAAC,SAAAC,SAAA,EAAAC,SAAAF,OAAA1B;AAAAc,WAAAY,QAAAX,gBAEJnH,MAAI;KAAA,IAACoH,OAAI;AAAA,aAAES,GAAG,GAAG;;KAACR,UAAA;KAAA,CAAA,EAAAW,OAAA;AAAAd,WAAAc,cAQhBzH,iBAAiBqH,KAAK,CAAA;AAAAJ,iBAAAC,UAAAO,QALrBH,GAAG,GAAGrC,cAAc,GAChBpB,QAAQ,CAAC6D,sBACTnE,OAAS,CAAA;AAAA,WAAAgE;OAAA;GAMpB,CAAA,CAAA;AAAAZ,SAAAf,OAAAgB,gBAGJnH,MAAI;GAAA,IAACoH,OAAI;AAAA,WAAErB,UAAU;;GAAA,IAAAsB,WAAA;IAAA,IAAAa,QAAAC,SAAA;AAAAjB,WAAAgB,OACoBnC,SAAQ;AAAAyB,iBAAAC,UAAAS,OAAnC9D,QAAQ,CAACgE,gBAAe,CAAA;AAAA,WAAAF;;GAAA,CAAA,EAAA,KAAA;AAAAhB,SAAAjB,MAAAkB,gBAGxCnH,MAAI;GAAA,IAACoH,OAAI;AAAA,WAAE7B,cAAc,GAAG;;GAAC,IAAA8B,WAAA;IAAA,IAAAgB,QAAAC,SAAA;AAAAD,UAAAjC;AAAAc,WAAAmB,OACU9C,cAAY,KAAA;AAAAiC,iBAAAC,UAAAY,OAArCjE,QAAQ,CAACmB,aAAY,CAAA;AAAA,WAAA8C;;GAAA,CAAA,EAAA/B,MAAA;AAAAY,SAAAZ,cAAA;GAAA,IAAAkC,MAAAC,WAAA,CAAA,CAGjCjE,mBAAmB,CAAA;AAAA,gBAAnBgE,KAAA,WAAA;IAAA,IAAAE,SAAAC,SAAA,EAAAC,SAAAF,OAAAtC;AAAAc,WAAAwB,cAQI/D,qBAAqB,CAACK,OAAK4D,OAAA;AAAA1B,WAAA0B,cAEzBjE,qBAAqB,CAACM,QAAO;AAAAuC,YAAAqB,QAAA;KAAA,IAAAC,OARzBzI,KACL+D,QAAQ,CAAC2E,OACT3E,QAAQ,CAACO,qBAAqB,CAACG,QAC/BV,QAAQ,CAACa,QACV,EAAA+D,QAGY5E,QAAQ,CAAC6E;AAAWH,cAAAD,IAAAK,KAAAzB,UAAAiB,QAAAG,IAAAK,IAAAJ,KAAA;AAAAE,eAAAH,IAAAM,KAAA1B,UAAAmB,QAAAC,IAAAM,IAAAH,MAAA;AAAA,YAAAH;OAAA;KAAAK,GAAApF;KAAAqF,GAAArF;KAAA,CAAA;AAAA,WAAA4E;OAIpC;MAAA,EAAAlC,MAAA;AAAAU,SAAAZ,cAAA;GAAA,IAAA8C,OAAAX,WAAA,CAAA,CACAhE,kBAAkB,CAAA;AAAA,gBAAlB2E,MAAA,WAAA;IAAA,IAAAC,SAAAC,SAAA,EAAAE,SAAAH,OAAAjD,WAAAG;AAAAW,WAAAsC,QAMMtE,qBAAoB;AAAAsC,YAAAqB,QAAA;KAAA,IAAAY,QAJhBpJ,KAAK+D,QAAQ,CAAC2E,OAAO3E,QAAQ,CAACsF,WAAWtF,QAAQ,CAACa,QAAQ,EAAA0E,QAGpDvF,QAAQ,CAAC6E;AAAWQ,eAAAZ,IAAAK,KAAAzB,UAAA4B,QAAAR,IAAAK,IAAAO,MAAA;AAAAE,eAAAd,IAAAM,KAAA1B,UAAA+B,QAAAX,IAAAM,IAAAQ,MAAA;AAAA,YAAAd;OAAA;KAAAK,GAAApF;KAAAqF,GAAArF;KAAA,CAAA;AAAA,WAAAuF;OAIpC;MAAA,EAAA7C,MAAA;AAAAU,SAAAV,aAQErB,SAAS,GAAG,OAAO,OAAKsB,MAAA;AAAAS,SAAAT,aAEtBtB,SAAS,GAAG,wBAAwB,uBAAsB;AAAA+B,SAAAR,aAY5D1C,MAAMC,IAAIX,QAAQC,aAAa,WAASoD,OAAA;AAAAO,SAAAP,cAE7B3C,MAAMC,IAAIX,QAAQC,aAAa,WAASsD,OAAA;AAAAK,SAAAH,cAMnDzF,eAAe0C,MAAMC,IAAI1C,OAAO,EAAAyF,OAAA;AAAAE,SAAAF,cAE9BjF,iBAAiBiC,MAAMC,IAAI1C,OAAO,CAAA;AAAAiG,UAAAqB,QAAA;GAAA,IAAAe,MA/FlCvJ,KACL+D,QAAQ,CAACyF,WACT7F,MAAM7C,YAAY,KAAK6C,MAAMC,IAAI5C,MAAM+C,QAAQ,CAAC0F,mBAChDnE,SAAS,IAAIvB,QAAQ,CAAC2F,oBACtB/D,YAAY,IAAI5B,QAAQ,CAACa,QAC1B,EAAA+E,OAQY5F,QAAQ,CAAC6F,aAAWC,OAClB9F,QAAQ,CAAC+F,iBAAeC,OAyB3BhG,QAAQ,CAACiG,cAAYC,OA0BtBjK,KACL+D,QAAQ,CAAC2E,OACT5D,SAAS,GAAGf,QAAQ,CAACmG,eAAenG,QAAQ,CAACoG,eAC7CpG,QAAQ,CAACa,QACV,EAAAwF,OAGYrG,QAAQ,CAAC6E,aAAWyB,OAK1BrK,KACL+D,QAAQ,CAAC2E,QACR/E,MAAMC,IAAIX,QAAQC,aAAa,eAAe,YAC3Ca,QAAQ,CAACuG,eACTvG,QAAQ,CAACwG,YACbxG,QAAQ,CAACa,QACV,EAAA4F,OAGYzG,QAAQ,CAAC6E,aAAW6B,OAK1BzK,KAAK+D,QAAQ,CAAC2E,OAAO3E,QAAQ,CAAC2G,aAAa3G,QAAQ,CAACa,QAAQ,EAAA+F,OAGtD5G,QAAQ,CAAC6E;AAAWW,WAAAf,IAAAK,KAAAzB,UAAAxB,MAAA4C,IAAAK,IAAAU,IAAA;AAAAI,YAAAnB,IAAAM,KAAA1B,UAAAtB,OAAA0C,IAAAM,IAAAa,KAAA;AAAAE,YAAArB,IAAAoC,KAAAxD,UAAApB,OAAAwC,IAAAoC,IAAAf,KAAA;AAAAE,YAAAvB,IAAAqC,KAAAzD,UAAAnB,OAAAuC,IAAAqC,IAAAd,KAAA;AAAAE,YAAAzB,IAAAhB,KAAAJ,UAAAjB,OAAAqC,IAAAhB,IAAAyC,KAAA;AAAAG,YAAA5B,IAAAsC,KAAA1D,UAAAhB,OAAAoC,IAAAsC,IAAAV,KAAA;AAAAC,YAAA7B,IAAAuC,KAAA3D,UAAAf,OAAAmC,IAAAuC,IAAAV,KAAA;AAAAG,YAAAhC,IAAAwC,KAAA5D,UAAAd,QAAAkC,IAAAwC,IAAAR,KAAA;AAAAC,YAAAjC,IAAAvD,KAAAmC,UAAAV,QAAA8B,IAAAvD,IAAAwF,KAAA;AAAAE,YAAAnC,IAAAyC,KAAA7D,UAAAT,QAAA6B,IAAAyC,IAAAN,KAAA;AAAA,UAAAnC;KAAA;GAAAK,GAAApF;GAAAqF,GAAArF;GAAAmH,GAAAnH;GAAAoH,GAAApH;GAAA+D,GAAA/D;GAAAqH,GAAArH;GAAAsH,GAAAtH;GAAAuH,GAAAvH;GAAAwB,GAAAxB;GAAAwH,GAAAxH;GAAA,CAAA;AAAA,SAAAmC;KAAA;;AAS3C,SAAgBsF,WAAWvH,OAAwB;CACjD,MAAMI,SAAS5D,WAAW;CAC1B,MAAMgL,QAAQ/K,yBAAyB;CAEvC,MAAM,CAACgL,aAAaC,kBAAkBvL,aAAa,GAAG;CAEtD,MAAMwL,gBAAgBzL,iBAAiBsL,MAAMG,eAAe,CAAC;CAC7D,MAAMtH,wBAAwBnE,iBAAiBsL,MAAMnH,uBAAuB,CAAC;CAE7E,MAAMuH,wBAAwB1L,iBAAiB;EAC7C,MAAM2L,QAAQJ,aAAa,CAACK,MAAM;AAClC,MAAI,CAACD,MAAO,QAAOF,eAAe;AAClC,SAAOrL,YAAYqL,eAAe,EAAEE,OAAO,EACzCE,MAAM;IACHzG,MAAM/E,iBAAiB+E,EAAEjC,OAAO;GACjC;GACA;GACA;GAA0B,EAE7B,CAAC;GACF;CAEF,MAAM2I,gCAAgC9L,iBAAiB;EACrD,MAAM2L,QAAQJ,aAAa,CAACK,MAAM;AAClC,MAAI,CAACD,MAAO,QAAOxH,uBAAuB;AAC1C,SAAO/D,YAAY+D,uBAAuB,EAAEwH,OAAO,EACjDE,MAAM;IACHzG,MAAMA,EAAEvE,SAAS+B,KAAKsI,MAAM7K,iBAAiB6K,EAAE,CAAC,CAACnK,KAAK,IAAI;IAC1DqE,MAAMA,EAAEvE,SAASE,KAAK,IAAI;GAC3B;GACA;GAA0B,EAE7B,CAAC;GACF;AAEF,QAAA;SAAA;GAAA,IAAAgL,SAAAC,SAAA,EAAAC,SAAAF,OAAA7F;AAAA+F,UAAAC,WAQkBlD,MAAMwC,eAAexC,EAAEmD,cAActJ,MAAM;AAAAmE,UAAA+E,QAAA9E,gBAEtDnH,MAAI;IAAA,IAACoH,OAAI;AAAA,YAAEqE,aAAa;;IAAA,IAAApE,WAAA;KAAA,IAAAiF,SAAAC,SAAA;AAAAD,YAAArF,gBAGNyE,eAAe,GAAG;AAAAlE,kBAAAC,UAAA6E,QAD1BlI,QAAQ,CAACoI,YAAW,CAAA;AAAA,YAAAF;;IAAA,CAAA,EAAA,KAAA;AAAA9E,WAAAqB,QAAA;IAAA,IAAA4D,QAVrBrI,QAAQ,CAACsI,iBAAeC,QAGzBvI,QAAQ,CAACwI;AAAWH,cAAA5D,IAAAK,KAAAzB,UAAAwE,QAAApD,IAAAK,IAAAuD,MAAA;AAAAE,cAAA9D,IAAAM,KAAA1B,UAAA0E,QAAAtD,IAAAM,IAAAwD,MAAA;AAAA,WAAA9D;MAAA;IAAAK,GAAApF;IAAAqF,GAAArF;IAAA,CAAA;AAAA0D,gBAAA2E,OAAApJ,QAEpB0I,aAAa,CAAA;AAAA,UAAAQ;MAAA;SAAA;GAAA,IAAAY,SAAAC,SAAA,EAAAE,SAAAH,OAAAzG,WAAAG;AAAAyG,UAAAzG;AAAAW,UAAA2F,cAcZjB,uBAAuB,CAAC5I,QAAMgK,OAAA;AAAAxF,gBAAAC,UAAAoF,QAD9BzI,QAAQ,CAAC8I,YAAW,CAAA;AAAA,UAAAL;MAAA;SAAA;GAAA,IAAAM,SAAAC,SAAA;AAAAlG,UAAAiG,QAAAhG,gBAI7BpH,KAAG;IAAA,IAAC4H,OAAI;AAAA,YAAEiE,uBAAuB;;IAAAvE,WAC9BpD,QAAQ;KACR,MAAMK,wBACJrB,oBAAoBgB,KAAK0H,eAAe,CAAC;KAC3C,MAAMpH,uBACJf,mBAAmBS,KAAK0H,eAAe,CAAC;KAE1C,MAAMnH,0BAA0BF,iBAAiB,CAACtB,SAAS;KAC3D,MAAMyB,yBAAyBF,gBAAgB,CAACvB,SAAS;KAEzD,MAAM0B,yBACJT,IAAIX,QAAQoB,oBAAoB;KAElC,MAAMC,4BAA4B;MAChC,MAAMC,WAAWF,kBAAkB;MACnC,MAAMG,IAAIP,iBAAiB;AAC3B,UAAIM,aAAa,QACf,QAAO;OACLE,OAAO;OACPE,OAAO;OACPC,SAAS,YAAYJ,EAAE7B,OAAM,gBAAiB6B,EAAE7B,SAAS,IAAI,MAAM,GAAE;OACtE;AAEH,UAAI4B,aAAa,QACf,QAAO;OACLE,OAAO;OACPE,OAAO;OACPC,SAAS,UAAUJ,EAAE7B,OAAM,sBAAuB6B,EAAE7B,SAAS,IAAI,MAAM,GAAE;OAC1E;AAGH,aAAO;OACL8B,OAAO;OACPE,OAAO;OACPC,SAAS,YAAYJ,EAAE7B,OAAM,gBAAiB6B,EAAE7B,SAAS,IAAI,MAAM,GAAE;OACtE;;KAGH,MAAMkC,6BAA6B;MACjC,MAAML,IAAIN,gBAAgB;AAC1B,aAAO,SAASM,EAAE7B,OAAM,UAAW6B,EAAE7B,SAAS,IAAI,MAAM,GAAE,oCAAqC6B,EAAE7B,SAAS,IAAI,MAAM;;KAGtH,MAAMmC,gBAAgBlB,IAAIX,QAAQ6B,YAAY;KAI9C,MAAMI,qBACJoG,eAAe,CAACtG,MAAMC,MAAMA,EAAEjE,OAAO4C,IAAI5C,GAAG,EAAEkE,gBAC9CtB,IAAIsB;KAGN,MAAM,CAACE,WAAWC,gBAAgBvF,aAAa8D,IAAIsB,aAAa;KAChE,MAAM,CAACI,SAASC,cAAczF,aAAa,MAAM;AAEjDF,kBACEG,GAAGmF,eAAeM,YAAY;AAC5B,UAAIA,UAAUJ,WAAW,EAAE;AACzBG,kBAAW,KAAK;AAChBE,wBAAiBF,WAAW,MAAM,EAAE,IAAI;;AAE1CF,mBAAaG,QAAQ;OAEzB,CAAC;KAED,MAAME,iBAAiB9B,IAAIX,QAAQM,MAAMhB;KACzC,MAAMoD,mBAAmBrC,gBAAgBM,IAAIX,QAAQM,KAAK;AAE1D,mBAAA;MAAA,IAAAyJ,SAAAnH,SAAA,EAAAoH,SAAAD,OAAAjH,YAAAmH,SAAAD,OAAAlH,YAAAoH,SAAAF,OAAA/G,aAAAkH,SAAAD,OAAApH,YAAAsH,SAAAD,OAAArH,YAAAuH,SAAAF,OAAAlH,aAAAqH,SAAAD,OAAAvH,YAAA0H,SAAAF,OAAAxH,WAAAG;AAAAuH,aAAAvH;MAAA,IAAAyH,SAAAL,OAAApH,aAAA0H,SAAAD,OAAA5H;AAAAiH,aAAApG,gBAQmBjD,MAAM5C,cAAc6C,IAAI5C,GAAG;AAAA6F,aAAAmG,QAAAlG,gBAEzCnH,MAAI;OAAA,IAACoH,OAAI;AAAA,eAAEpB,YAAY;;OAAA,IAAAqB,WAAA;QAAA,IAAA6G,SAAA3G,QAAA;AAAAL,eAAAgH,QAEnBlI,WAAU;AAAAwB,qBAAAC,UAAAyG,QADA9J,QAAQ,CAACsD,eAAc,CAAA;AAAA,eAAAwG;;OAAA,CAAA,EAAAZ,OAAA;AAAApG,aAAAqG,cAMjChN,iBAAiB0D,IAAIZ,OAAO,CAAA;AAAA6D,aAAAoG,QAAAnG,gBAE9BnH,MAAI;OAAA,IAACoH,OAAI;AAAA,eAAErB,UAAU;;OAAA,IAAAsB,WAAA;QAAA,IAAA8G,SAAAhG,SAAA;AAAAjB,eAAAiH,QACoBpI,SAAQ;AAAAyB,qBAAAC,UAAA0G,QAAnC/J,QAAQ,CAACgE,gBAAe,CAAA;AAAA,eAAA+F;;OAAA,CAAA,EAAA,KAAA;AAAAjH,aAAAmG,QAAAlG,gBAGxCnH,MAAI;OAAA,IAACoH,OAAI;AAAA,eAAE7B,cAAc,GAAG;;OAAC,IAAA8B,WAAA;QAAA,IAAA+G,SAAA9F,SAAA;AAAA8F,eAAAhI;AAAAc,eAAAkH,QACU7I,cAAY,KAAA;AAAAiC,qBAAAC,UAAA2G,QAArChK,QAAQ,CAACmB,aAAY,CAAA;AAAA,eAAA6I;;OAAA,CAAA,EAAAZ,OAAA;AAAAtG,aAAAsG,eAAA;OAAA,IAAAc,OAAA7F,WAAA,CAAA,CAGjCjE,mBAAmB,CAAA;AAAA,oBAAnB8J,MAAA,WAAA;QAAA,IAAAC,SAAA5F,SAAA,EAAA6F,SAAAD,OAAAnI;AAAAc,eAAAqH,cAQI5J,qBAAqB,CAACK,OAAKwJ,OAAA;AAAAtH,eAAAsH,cAEzB7J,qBAAqB,CAACM,QAAO;AAAAuC,gBAAAqB,QAAA;SAAA,IAAA4F,QARzBpO,KACL+D,QAAQ,CAAC2E,OACT3E,QAAQ,CAACO,qBAAqB,CAACG,QAC/BV,QAAQ,CAACa,QACV,EAAAyJ,QAGYtK,QAAQ,CAAC6E;AAAWwF,mBAAA5F,IAAAK,KAAAzB,UAAA8G,QAAA1F,IAAAK,IAAAuF,MAAA;AAAAC,mBAAA7F,IAAAM,KAAA1B,UAAA+G,QAAA3F,IAAAM,IAAAuF,MAAA;AAAA,gBAAA7F;WAAA;SAAAK,GAAApF;SAAAqF,GAAArF;SAAA,CAAA;AAAA,eAAAyK;WAIpC;UAAA,EAAAd,OAAA;AAAAvG,aAAAsG,eAAA;OAAA,IAAAmB,OAAAlG,WAAA,CAAA,CACAhE,kBAAkB,CAAA;AAAA,oBAAlBkK,MAAA,WAAA;QAAA,IAAAC,SAAAtF,SAAA,EAAAwF,SAAAF,OAAAxI,WAAAG;AAAAW,eAAA4H,QAUM5J,qBAAoB;AAAAsC,gBAAAqB,QAAA;SAAA,IAAAkG,QARhB1O,KACL+D,QAAQ,CAAC2E,OACT3E,QAAQ,CAACsF,WACTtF,QAAQ,CAACa,QACV,EAAA+J,QAGY5K,QAAQ,CAAC6E;AAAW8F,mBAAAlG,IAAAK,KAAAzB,UAAAmH,QAAA/F,IAAAK,IAAA6F,MAAA;AAAAC,mBAAAnG,IAAAM,KAAA1B,UAAAqH,QAAAjG,IAAAM,IAAA6F,MAAA;AAAA,gBAAAnG;WAAA;SAAAK,GAAApF;SAAAqF,GAAArF;SAAA,CAAA;AAAA,eAAA8K;WAIpC;UAAA,EAAAnB,OAAA;AAAAvG,aAAAuG,cAUEtI,SAAS,GAAG,OAAO,OAAKuI,OAAA;AAAAxG,aAAAwG,cAEtBvI,SAAS,GAAG,sBAAsB,qBAAoB;AAAA+B,aAAAyG,cAYxD1J,IAAIX,QAAQC,aAAa,WAASqK,OAAA;AAAA1G,aAAA0G,cAEvB3J,IAAIX,QAAQC,aAAa,WAASuK,OAAA;AAAA5G,aAAA8G,cAU7C1M,eAAe2C,IAAI1C,OAAO,EAAA0M,OAAA;AAAA/G,aAAA+G,cAExBlM,iBAAiBkC,IAAI1C,OAAO,CAAA;AAAAiG,cAAAqB,QAAA;OAAA,IAAAoG,QA1F5B5O,KACL+D,QAAQ,CAACyF,WACT7F,MAAM7C,YAAY,KAAK8C,IAAI5C,MAAM+C,QAAQ,CAAC0F,mBAC1CnE,SAAS,IAAIvB,QAAQ,CAAC2F,oBACtB/D,YAAY,IAAI5B,QAAQ,CAACa,QAC1B,EAAAiK,QAQY9K,QAAQ,CAAC6F,aAAWkF,QAClB/K,QAAQ,CAAC+F,iBAAeiF,QAU3BhL,QAAQ,CAACiG,cAAYgF,QA8BtBhP,KACL+D,QAAQ,CAAC2E,OACT5D,SAAS,GACLf,QAAQ,CAACmG,eACTnG,QAAQ,CAACoG,eACbpG,QAAQ,CAACa,QACV,EAAAqK,QAGYlL,QAAQ,CAAC6E,aAAWsG,QAK1BlP,KACL+D,QAAQ,CAAC2E,QACR9E,IAAIX,QAAQC,aAAa,eAAe,YACrCa,QAAQ,CAACuG,eACTvG,QAAQ,CAACwG,YACbxG,QAAQ,CAACa,QACV,EAAAuK,QAGYpL,QAAQ,CAAC6E,aAAWwG,QAK1BpP,KACL+D,QAAQ,CAAC2E,OACT3E,QAAQ,CAAC2G,aACT3G,QAAQ,CAACa,QACV,EAAAyK,QAGYtL,QAAQ,CAAC6E;AAAWgG,iBAAApG,IAAAK,KAAAzB,UAAA4F,QAAAxE,IAAAK,IAAA+F,MAAA;AAAAC,iBAAArG,IAAAM,KAAA1B,UAAA6F,QAAAzE,IAAAM,IAAA+F,MAAA;AAAAC,iBAAAtG,IAAAoC,KAAAxD,UAAA8F,QAAA1E,IAAAoC,IAAAkE,MAAA;AAAAC,iBAAAvG,IAAAqC,KAAAzD,UAAA+F,QAAA3E,IAAAqC,IAAAkE,MAAA;AAAAC,iBAAAxG,IAAAhB,KAAAJ,UAAAgG,QAAA5E,IAAAhB,IAAAwH,MAAA;AAAAC,iBAAAzG,IAAAsC,KAAA1D,UAAAiG,QAAA7E,IAAAsC,IAAAmE,MAAA;AAAAC,iBAAA1G,IAAAuC,KAAA3D,UAAAkG,QAAA9E,IAAAuC,IAAAmE,MAAA;AAAAC,iBAAA3G,IAAAwC,KAAA5D,UAAAmG,QAAA/E,IAAAwC,IAAAmE,MAAA;AAAAC,iBAAA5G,IAAAvD,KAAAmC,UAAAuG,QAAAnF,IAAAvD,IAAAmK,MAAA;AAAAC,iBAAA7G,IAAAyC,KAAA7D,UAAAwG,QAAApF,IAAAyC,IAAAoE,MAAA;AAAA,cAAA7G;SAAA;OAAAK,GAAApF;OAAAqF,GAAArF;OAAAmH,GAAAnH;OAAAoH,GAAApH;OAAA+D,GAAA/D;OAAAqH,GAAArH;OAAAsH,GAAAtH;OAAAuH,GAAAvH;OAAAwB,GAAAxB;OAAAwH,GAAAxH;OAAA,CAAA;AAAA,aAAAuJ;SAAA;;IAO1C,CAAA,CAAA;AAAA7F,gBAAAC,UAAA0F,QAvKO/I,QAAQ,CAACuL,WAAU,CAAA;AAAA,UAAAxC;MAAA;SAAA;GAAA,IAAAyC,SAAAC,UAAA,EAAAE,SAAAH,OAAAxJ,WAAAG;AAAAwJ,UAAAxJ;AAAAW,UAAA0I,cA4KjB5D,+BAA+B,CAAChJ,QAAM+M,OAAA;AAAAvI,gBAAAC,UAAAmI,QADxCxL,QAAQ,CAAC8I,YAAW,CAAA;AAAA,UAAA0C;MAAA;SAAA;GAAA,IAAAK,SAAA7C,SAAA;AAAAlG,UAAA+I,QAAA9I,gBAI7BpH,KAAG;IAAA,IAAC4H,OAAI;AAAA,YAAEqE,+BAA+B;;IAAA3E,WACtCpD,QAAGkD,gBACFpD,iBAAe;KACTE;KACLC,cAAcG;KAAqB,IACnCF,sBAAmB;AAAA,aAAEqH,MAAMrH;;KAAmB,IAC9ChD,aAAU;AAAA,aAAE6C,MAAM7C;;KAAU,IAC5BC,gBAAa;AAAA,aAAE4C,MAAM5C;;KAAa,CAAA;IAErC,CAAA,CAAA;AAAAoG,gBAAAC,UAAAwI,QAVO7L,QAAQ,CAACuL,WAAU,CAAA;AAAA,UAAAM;MAAA;EAAA;;AAepCC,eAAA,CAAA,SAAA,QAAA,CAAA"}
1
+ {"version":3,"file":"HotkeyList.js","names":["For","Show","createEffect","createMemo","createSignal","on","clsx","matchSorter","formatForDisplay","useStyles","useHotkeysDevtoolsState","effectiveSequenceMatchedSteps","formatRegistration","getBindingKind","useRegistrationConflicts","SequenceRegistrationView","HotkeyListProps","selectedId","setSelectedId","id","getTargetLabel","target","HTMLElement","Document","Window","document","window","tagName","toLowerCase","getTargetTooltip","tag","parts","Array","push","className","classes","split","filter","Boolean","join","dataAttrs","from","attributes","attr","name","startsWith","map","value","length","buildRowTooltip","meta","description","group","undefined","SequenceListRow","props","reg","getSequences","sequenceProgressNow","styles","sequenceRegistrations","conflicts","targetConflicts","overlapping","scopeConflicts","separate","hasTargetConflict","hasScopeConflict","targetConflictBadge","style","const","label","tooltip","scopeConflictTooltip","enabled","options","liveSequenceReg","find","r","triggerCount","matchedSteps","prevCount","setPrevCount","pulsing","setPulsing","current","setTimeout","metaName","rowTooltip","_el$","_tmpl$4","_el$3","firstChild","_el$4","_el$8","nextSibling","_el$9","_el$0","_el$1","_el$10","_el$11","_el$12","_el$14","_el$13","_el$15","_el$16","$$click","_$insert","_$createComponent","when","children","_el$2","_tmpl$","_$effect","_$className","rowTooltipText","each","sequence","step","i","_el$17","_tmpl$5","_el$18","platform","sequenceStepMatched","_el$5","_tmpl$2","hotkeyLabelName","_el$6","_tmpl$3","_el$7","_c$","_$memo","_el$19","_tmpl$6","_el$20","_p$","_v$10","badge","_v$11","tooltipText","e","t","_c$2","_el$21","_tmpl$7","_el$22","_el$23","_v$12","badgeInfo","_v$13","eventType","_v$","hotkeyRow","hotkeyRowSelected","hotkeyRowTriggered","_v$2","hotkeyLabel","_v$3","hotkeyLabelKeys","_v$4","hotkeyBadges","_v$5","badgeTarget","_v$6","badgeEnabled","badgeDisabled","_v$7","_v$8","badgeKeydown","badgeKeyup","_v$9","_v$0","_v$1","a","o","n","s","h","d","l","HotkeyList","state","searchQuery","setSearchQuery","registrations","filteredRegistrations","query","trim","keys","filteredSequenceRegistrations","_el$24","_tmpl$9","_el$25","$$input","currentTarget","_el$26","_tmpl$8","searchClear","_v$14","searchContainer","_v$15","searchInput","_el$27","_tmpl$0","_el$28","_el$30","_el$29","panelHeader","_el$31","_tmpl$1","_el$37","_el$39","_el$40","_el$44","_el$45","_el$46","_el$47","_el$48","_el$49","_el$50","_el$52","_el$51","_el$53","_el$54","_el$38","_el$41","_el$42","_el$43","_c$3","_el$55","_el$56","_v$27","_v$28","_c$4","_el$57","_el$58","_el$59","_v$29","_v$30","_v$16","_v$17","_v$18","_v$19","_v$20","_v$21","_v$22","_v$23","_v$24","_v$25","_v$26","hotkeyList","_el$32","_tmpl$10","_el$33","_el$35","_el$34","_el$36","_$delegateEvents"],"sources":["../../src/components/HotkeyList.tsx"],"sourcesContent":["import { For, Show, createEffect, createMemo, createSignal, on } from 'solid-js'\nimport clsx from 'clsx'\nimport { matchSorter } from 'match-sorter'\nimport { formatForDisplay } from '@tanstack/hotkeys'\nimport { useStyles } from '../styles/use-styles'\nimport { useHotkeysDevtoolsState } from '../HotkeysContextProvider'\nimport { effectiveSequenceMatchedSteps } from '../sequence-progress'\nimport {\n formatRegistration,\n getBindingKind,\n useRegistrationConflicts,\n} from '../_registrations'\nimport type { SequenceRegistrationView } from '@tanstack/hotkeys'\n\ntype HotkeyListProps = {\n selectedId: () => string | null\n setSelectedId: (id: string | null) => void\n}\n\nfunction getTargetLabel(target: HTMLElement | Document | Window): string {\n if (typeof document !== 'undefined' && target === document) {\n return 'document'\n }\n if (typeof window !== 'undefined' && target === window) {\n return 'window'\n }\n if (target instanceof HTMLElement) {\n return target.tagName.toLowerCase()\n }\n return 'element'\n}\n\nfunction getTargetTooltip(target: HTMLElement | Document | Window): string {\n if (typeof document !== 'undefined' && target === document) {\n return 'Listening on document'\n }\n if (typeof window !== 'undefined' && target === window) {\n return 'Listening on window'\n }\n if (target instanceof HTMLElement) {\n const tag = target.tagName.toLowerCase()\n const parts: Array<string> = [tag]\n if (target.id) {\n parts.push(`id=\"${target.id}\"`)\n }\n if (target.className) {\n const classes = target.className.split(/\\s+/).filter(Boolean).join(', ')\n parts.push(`class=\"${classes}\"`)\n }\n // Collect data- attributes\n const dataAttrs = Array.from(target.attributes)\n .filter((attr) => attr.name.startsWith('data-'))\n .map((attr) => `${attr.name}=\"${attr.value}\"`)\n if (dataAttrs.length > 0) {\n parts.push(...dataAttrs)\n }\n return `Listening on ${parts.join(' ')}`\n }\n return 'Listening on element'\n}\n\nfunction buildRowTooltip(meta?: {\n name?: string\n description?: string\n group?: string\n}): string | undefined {\n if (!meta) return undefined\n const parts: Array<string> = []\n if (meta.group) parts.push(meta.group)\n if (meta.name) parts.push(meta.name)\n if (meta.description) parts.push(meta.description)\n return parts.length > 0 ? parts.join(' — ') : undefined\n}\n\nfunction SequenceListRow(props: {\n reg: SequenceRegistrationView\n getSequences: () => Array<SequenceRegistrationView>\n sequenceProgressNow: () => number\n selectedId: () => string | null\n setSelectedId: (id: string | null) => void\n}) {\n const styles = useStyles()\n\n const sequenceRegistrations = () => props.getSequences()\n\n const conflicts = useRegistrationConflicts(() => props.reg)\n const targetConflicts = () => conflicts().overlapping\n const scopeConflicts = () => conflicts().separate\n const hasTargetConflict = () => targetConflicts().length > 0\n const hasScopeConflict = () => scopeConflicts().length > 0\n const targetConflictBadge = () => ({\n style: 'badgeConflict' as const,\n label: '!',\n tooltip: `Potential overlap: ${targetConflicts().length} other bindings on overlapping targets`,\n })\n const scopeConflictTooltip = () =>\n `Info: ${scopeConflicts().length} related bindings on separate targets`\n\n const enabled = () => props.reg.options.enabled !== false\n\n const liveSequenceReg = createMemo(\n () =>\n sequenceRegistrations().find((r) => r.id === props.reg.id) ?? props.reg,\n )\n\n const triggerCount = () =>\n sequenceRegistrations().find((r) => r.id === props.reg.id)?.triggerCount ??\n props.reg.triggerCount\n\n const matchedSteps = createMemo(() =>\n effectiveSequenceMatchedSteps(\n liveSequenceReg(),\n props.sequenceProgressNow(),\n ),\n )\n\n const [prevCount, setPrevCount] = createSignal(props.reg.triggerCount)\n const [pulsing, setPulsing] = createSignal(false)\n\n createEffect(\n on(triggerCount, (current) => {\n if (current > prevCount()) {\n setPulsing(true)\n setTimeout(() => setPulsing(false), 600)\n }\n setPrevCount(current)\n }),\n )\n\n const metaName = () => props.reg.options.meta?.name\n const rowTooltip = () => buildRowTooltip(props.reg.options.meta)\n\n return (\n <div\n class={clsx(\n styles().hotkeyRow,\n props.selectedId() === props.reg.id && styles().hotkeyRowSelected,\n pulsing() && styles().hotkeyRowTriggered,\n rowTooltip() && styles().tooltip,\n )}\n onClick={() => props.setSelectedId(props.reg.id)}\n >\n <Show when={rowTooltip()}>\n <span class={styles().rowTooltipText} data-tooltip>\n {rowTooltip()}\n </span>\n </Show>\n <span class={styles().hotkeyLabel}>\n <span class={styles().hotkeyLabelKeys}>\n <For each={liveSequenceReg().sequence}>\n {(step, i) => (\n <span>\n <Show when={i() > 0}> </Show>\n <span\n class={\n i() < matchedSteps()\n ? styles().sequenceStepMatched\n : undefined\n }\n >\n {formatForDisplay(step, {\n platform: props.reg.options.platform,\n })}\n </span>\n </span>\n )}\n </For>\n </span>\n <Show when={metaName()}>\n <span class={styles().hotkeyLabelName}>{metaName()}</span>\n </Show>\n </span>\n <Show when={triggerCount() > 0}>\n <span class={styles().triggerCount}>x{triggerCount()}</span>\n </Show>\n <div class={styles().hotkeyBadges}>\n <span\n class={clsx(styles().badge, styles().badgeTarget)}\n data-binding-kind\n >\n {getBindingKind(props.reg)}\n </span>\n {hasTargetConflict() && (\n <span\n class={clsx(\n styles().badge,\n styles()[targetConflictBadge().style],\n styles().tooltip,\n )}\n >\n {targetConflictBadge().label}\n <span class={styles().tooltipText} data-tooltip>\n {targetConflictBadge().tooltip}\n </span>\n </span>\n )}\n {hasScopeConflict() && (\n <span\n class={clsx(styles().badge, styles().badgeInfo, styles().tooltip)}\n >\n i\n <span class={styles().tooltipText} data-tooltip>\n {scopeConflictTooltip()}\n </span>\n </span>\n )}\n <span\n class={clsx(\n styles().badge,\n enabled() ? styles().badgeEnabled : styles().badgeDisabled,\n styles().tooltip,\n )}\n >\n {enabled() ? 'on' : 'off'}\n <span class={styles().tooltipText} data-tooltip>\n {enabled() ? 'Sequence is enabled' : 'Sequence is disabled'}\n </span>\n </span>\n <span\n class={clsx(\n styles().badge,\n (props.reg.options.eventType ?? 'keydown') === 'keydown'\n ? styles().badgeKeydown\n : styles().badgeKeyup,\n styles().tooltip,\n )}\n >\n {props.reg.options.eventType ?? 'keydown'}\n <span class={styles().tooltipText} data-tooltip>\n Fires on {props.reg.options.eventType ?? 'keydown'} event\n </span>\n </span>\n <span\n class={clsx(styles().badge, styles().badgeTarget, styles().tooltip)}\n >\n {getTargetLabel(props.reg.target)}\n <span class={styles().tooltipText} data-tooltip>\n {getTargetTooltip(props.reg.target)}\n </span>\n </span>\n </div>\n </div>\n )\n}\n\nexport function HotkeyList(props: HotkeyListProps) {\n const styles = useStyles()\n const state = useHotkeysDevtoolsState()\n\n const [searchQuery, setSearchQuery] = createSignal('')\n\n const registrations = createMemo(() => state.registrations())\n const sequenceRegistrations = createMemo(() => state.sequenceRegistrations())\n\n const filteredRegistrations = createMemo(() => {\n const query = searchQuery().trim()\n if (!query) return registrations()\n return matchSorter(registrations(), query, {\n keys: [\n (r) => formatRegistration(r),\n 'hotkey',\n 'options.meta.name',\n 'options.meta.description',\n 'options.meta.group',\n ],\n })\n })\n\n const filteredSequenceRegistrations = createMemo(() => {\n const query = searchQuery().trim()\n if (!query) return sequenceRegistrations()\n return matchSorter(sequenceRegistrations(), query, {\n keys: [\n (r) => formatRegistration(r),\n (r) => r.sequence.join(' '),\n 'options.meta.name',\n 'options.meta.description',\n 'options.meta.group',\n ],\n })\n })\n\n return (\n <>\n <div class={styles().searchContainer}>\n <input\n type=\"text\"\n class={styles().searchInput}\n placeholder=\"Search hotkeys...\"\n value={searchQuery()}\n onInput={(e) => setSearchQuery(e.currentTarget.value)}\n />\n <Show when={searchQuery()}>\n <button\n class={styles().searchClear}\n onClick={() => setSearchQuery('')}\n >\n &times;\n </button>\n </Show>\n </div>\n\n <div class={styles().panelHeader}>\n Hotkeys ({filteredRegistrations().length})\n </div>\n <div class={styles().hotkeyList}>\n <For each={filteredRegistrations()}>\n {(reg) => {\n const conflicts = useRegistrationConflicts(() => reg)\n const targetConflicts = () => conflicts().overlapping\n const scopeConflicts = () => conflicts().separate\n const hasTargetConflict = () => targetConflicts().length > 0\n const hasScopeConflict = () => scopeConflicts().length > 0\n const targetConflictBadge = () => ({\n style: 'badgeConflict' as const,\n label: '!',\n tooltip: `Potential overlap: ${targetConflicts().length} other bindings on overlapping targets`,\n })\n const scopeConflictTooltip = () =>\n `Info: ${scopeConflicts().length} related bindings on separate targets`\n\n const enabled = () => reg.options.enabled !== false\n\n // Look up trigger count reactively from the registrations list\n // (reg is a stable object ref; the list re-derives on store change)\n const triggerCount = () =>\n registrations().find((r) => r.id === reg.id)?.triggerCount ??\n reg.triggerCount\n\n // Track trigger count changes for pulse animation\n const [prevCount, setPrevCount] = createSignal(reg.triggerCount)\n const [pulsing, setPulsing] = createSignal(false)\n\n createEffect(\n on(triggerCount, (current) => {\n if (current > prevCount()) {\n setPulsing(true)\n setTimeout(() => setPulsing(false), 600)\n }\n setPrevCount(current)\n }),\n )\n\n const metaName = () => reg.options.meta?.name\n const rowTooltip = () => buildRowTooltip(reg.options.meta)\n\n return (\n <div\n class={clsx(\n styles().hotkeyRow,\n props.selectedId() === reg.id && styles().hotkeyRowSelected,\n pulsing() && styles().hotkeyRowTriggered,\n rowTooltip() && styles().tooltip,\n )}\n onClick={() => props.setSelectedId(reg.id)}\n >\n <Show when={rowTooltip()}>\n <span class={styles().rowTooltipText} data-tooltip>\n {rowTooltip()}\n </span>\n </Show>\n <span class={styles().hotkeyLabel}>\n <span class={styles().hotkeyLabelKeys}>\n {formatRegistration(reg)}\n </span>\n <Show when={metaName()}>\n <span class={styles().hotkeyLabelName}>{metaName()}</span>\n </Show>\n </span>\n <Show when={triggerCount() > 0}>\n <span class={styles().triggerCount}>x{triggerCount()}</span>\n </Show>\n <div class={styles().hotkeyBadges}>\n <span\n class={clsx(styles().badge, styles().badgeTarget)}\n data-binding-kind\n >\n {getBindingKind(reg)}\n </span>\n {hasTargetConflict() && (\n <span\n class={clsx(\n styles().badge,\n styles()[targetConflictBadge().style],\n styles().tooltip,\n )}\n >\n {targetConflictBadge().label}\n <span class={styles().tooltipText} data-tooltip>\n {targetConflictBadge().tooltip}\n </span>\n </span>\n )}\n {hasScopeConflict() && (\n <span\n class={clsx(\n styles().badge,\n styles().badgeInfo,\n styles().tooltip,\n )}\n >\n i\n <span class={styles().tooltipText} data-tooltip>\n {scopeConflictTooltip()}\n </span>\n </span>\n )}\n <span\n class={clsx(\n styles().badge,\n enabled()\n ? styles().badgeEnabled\n : styles().badgeDisabled,\n styles().tooltip,\n )}\n >\n {enabled() ? 'on' : 'off'}\n <span class={styles().tooltipText} data-tooltip>\n {enabled() ? 'Hotkey is enabled' : 'Hotkey is disabled'}\n </span>\n </span>\n <span\n class={clsx(\n styles().badge,\n (reg.options.eventType ?? 'keydown') === 'keydown'\n ? styles().badgeKeydown\n : styles().badgeKeyup,\n styles().tooltip,\n )}\n >\n {reg.options.eventType ?? 'keydown'}\n <span class={styles().tooltipText} data-tooltip>\n Fires on {reg.options.eventType ?? 'keydown'} event\n </span>\n </span>\n <span\n class={clsx(\n styles().badge,\n styles().badgeTarget,\n styles().tooltip,\n )}\n >\n {getTargetLabel(reg.target)}\n <span class={styles().tooltipText} data-tooltip>\n {getTargetTooltip(reg.target)}\n </span>\n </span>\n </div>\n </div>\n )\n }}\n </For>\n </div>\n\n <div class={styles().panelHeader}>\n Sequences ({filteredSequenceRegistrations().length})\n </div>\n <div class={styles().hotkeyList}>\n <For each={filteredSequenceRegistrations()}>\n {(reg) => (\n <SequenceListRow\n reg={reg}\n getSequences={sequenceRegistrations}\n sequenceProgressNow={state.sequenceProgressNow}\n selectedId={props.selectedId}\n setSelectedId={props.setSelectedId}\n />\n )}\n </For>\n </div>\n </>\n )\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/hotkeys-devtools",
3
- "version": "0.9.0",
3
+ "version": "1.0.0",
4
4
  "description": "Devtools for TanStack Hotkeys",
5
5
  "author": "Tanner Linsley",
6
6
  "license": "MIT",
@@ -37,7 +37,7 @@
37
37
  "src"
38
38
  ],
39
39
  "peerDependencies": {
40
- "@tanstack/hotkeys": "0.8.0"
40
+ "@tanstack/hotkeys": "0.9.0"
41
41
  },
42
42
  "dependencies": {
43
43
  "@tanstack/devtools-ui": "^0.5.1",
@@ -0,0 +1,59 @@
1
+ import { createMemo } from 'solid-js'
2
+ import {
3
+ findHotkeyConflicts,
4
+ formatForDisplay,
5
+ parseHotkey,
6
+ } from '@tanstack/hotkeys'
7
+ import { useHotkeysDevtoolsState } from './HotkeysContextProvider'
8
+ import type { HotkeyConflict } from '@tanstack/hotkeys'
9
+
10
+ /** Refresh shared conflict reporting when either registry changes. */
11
+ export function useRegistrationConflicts(
12
+ registration: () => HotkeyConflict['registration'],
13
+ ) {
14
+ const state = useHotkeysDevtoolsState()
15
+ return createMemo(() => {
16
+ state.registrations()
17
+ state.sequenceRegistrations()
18
+ const reg = registration()
19
+ if (reg.options.enabled === false) return { overlapping: [], separate: [] }
20
+ const binding = 'sequence' in reg ? reg.sequence : reg.hotkey
21
+ const options = {
22
+ target: reg.target,
23
+ platform: reg.options.platform,
24
+ eventType: reg.options.eventType,
25
+ excludeIds: [reg.id],
26
+ }
27
+ const overlapping = findHotkeyConflicts(binding, options).map(
28
+ (c) => c.registration,
29
+ )
30
+ const ids = new Set(overlapping.map((r) => r.id))
31
+ const separate = findHotkeyConflicts(binding, { ...options, scope: 'all' })
32
+ .map((c) => c.registration)
33
+ .filter((r) => !ids.has(r.id))
34
+ // Without source events, key/code overlap depends on the layout and cannot be inferred.
35
+ return { overlapping, separate }
36
+ })
37
+ }
38
+
39
+ /** Format either kind of registration, respecting its platform and physical labels. */
40
+ export function formatRegistration(
41
+ reg: HotkeyConflict['registration'],
42
+ ): string {
43
+ const steps = 'sequence' in reg ? reg.sequence : [reg.hotkey]
44
+ return steps
45
+ .map((step) => formatForDisplay(step, { platform: reg.options.platform }))
46
+ .join(' → ')
47
+ }
48
+
49
+ /** Sequences may mix logical keys and physical codes, so report both when needed. */
50
+ export function getBindingKind(
51
+ reg: HotkeyConflict['registration'],
52
+ ): 'Key' | 'Code' | 'Mixed' {
53
+ const parsed =
54
+ 'sequence' in reg
55
+ ? reg.sequence.map((step) => parseHotkey(step, reg.options.platform))
56
+ : [reg.parsedHotkey]
57
+ const codes = parsed.filter((step) => step.code !== undefined).length
58
+ return codes === 0 ? 'Key' : codes === parsed.length ? 'Code' : 'Mixed'
59
+ }