obsidian-dev-utils 84.4.0 → 84.5.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.
@@ -129,7 +129,7 @@ __export(generated_during_build_exports, {
129
129
  LIBRARY_VERSION: () => LIBRARY_VERSION
130
130
  });
131
131
  module.exports = __toCommonJS(generated_during_build_exports);
132
- const LIBRARY_VERSION = "84.4.0";
132
+ const LIBRARY_VERSION = "84.5.0";
133
133
  const LIBRARY_STYLES = ".obsidian-dev-utils.code-highlighter-component textarea, .obsidian-dev-utils.code-highlighter-component pre, .obsidian-dev-utils.code-highlighter-component code {\n font-family: var(--font-monospace);\n line-height: var(--line-height-normal);\n margin: 0;\n}\n.obsidian-dev-utils.code-highlighter-component textarea, .obsidian-dev-utils.code-highlighter-component code {\n font-size: var(--code-size);\n}\n.obsidian-dev-utils.code-highlighter-component textarea {\n background: transparent;\n color: transparent;\n z-index: 2;\n width: 20em;\n height: 10em;\n}\n.obsidian-dev-utils.code-highlighter-component pre {\n position: absolute;\n pointer-events: none;\n border: var(--input-border-width) solid transparent;\n overflow: auto;\n inset: 0;\n padding: var(--size-4-1) var(--size-4-2);\n z-index: 1;\n}\n.obsidian-dev-utils.code-highlighter-component pre::after {\n content: \"\";\n display: block;\n height: var(--bottom-gap, 0);\n}\n.obsidian-dev-utils.code-highlighter-component pre.is-placeholder {\n opacity: 0.6;\n}\n.obsidian-dev-utils.code-highlighter-component code {\n display: block;\n padding: 0;\n}\n\n.obsidian-dev-utils-lock-indicator {\n display: inline-flex;\n align-items: center;\n color: var(--text-muted);\n}\n.obsidian-dev-utils-lock-indicator .svg-icon {\n width: var(--icon-s);\n height: var(--icon-s);\n}\n\n@keyframes obsidian-dev-utils-lock-indicator-flash {\n 40% {\n color: var(--text-error);\n transform: scale(1.4);\n }\n}\n.obsidian-dev-utils-lock-indicator-flash {\n animation: obsidian-dev-utils-lock-indicator-flash 0.35s ease-in-out;\n}\n\n.obsidian-dev-utils input[type=url] {\n height: var(--input-height);\n}\n.obsidian-dev-utils input[type=month],\n.obsidian-dev-utils input[type=tel],\n.obsidian-dev-utils input[type=time],\n.obsidian-dev-utils input[type=url],\n.obsidian-dev-utils input[type=week] {\n -webkit-app-region: no-drag;\n background: var(--background-modifier-form-field);\n border: var(--input-border-width) solid var(--background-modifier-border);\n color: var(--text-normal);\n font-family: inherit;\n padding: var(--size-4-1) var(--size-4-2);\n font-size: var(--font-ui-small);\n border-radius: var(--input-radius);\n outline: none;\n}\n@media (hover: hover) {\n .obsidian-dev-utils input[type=month]:hover,\n .obsidian-dev-utils input[type=tel]:hover,\n .obsidian-dev-utils input[type=time]:hover,\n .obsidian-dev-utils input[type=url]:hover,\n .obsidian-dev-utils input[type=week]:hover {\n border-color: var(--background-modifier-border-hover);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n }\n}\n.obsidian-dev-utils input[type=month]:active, .obsidian-dev-utils input[type=month]:focus,\n.obsidian-dev-utils input[type=tel]:active,\n.obsidian-dev-utils input[type=tel]:focus,\n.obsidian-dev-utils input[type=time]:active,\n.obsidian-dev-utils input[type=time]:focus,\n.obsidian-dev-utils input[type=url]:active,\n.obsidian-dev-utils input[type=url]:focus,\n.obsidian-dev-utils input[type=week]:active,\n.obsidian-dev-utils input[type=week]:focus {\n border-color: var(--background-modifier-border-focus);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n}\n.obsidian-dev-utils input[type=month]:active, .obsidian-dev-utils input[type=month]:focus, .obsidian-dev-utils input[type=month]:focus-visible,\n.obsidian-dev-utils input[type=tel]:active,\n.obsidian-dev-utils input[type=tel]:focus,\n.obsidian-dev-utils input[type=tel]:focus-visible,\n.obsidian-dev-utils input[type=time]:active,\n.obsidian-dev-utils input[type=time]:focus,\n.obsidian-dev-utils input[type=time]:focus-visible,\n.obsidian-dev-utils input[type=url]:active,\n.obsidian-dev-utils input[type=url]:focus,\n.obsidian-dev-utils input[type=url]:focus-visible,\n.obsidian-dev-utils input[type=week]:active,\n.obsidian-dev-utils input[type=week]:focus,\n.obsidian-dev-utils input[type=week]:focus-visible {\n box-shadow: 0 0 0 2px var(--background-modifier-border-focus);\n}\n.obsidian-dev-utils input[type=month]::placeholder,\n.obsidian-dev-utils input[type=tel]::placeholder,\n.obsidian-dev-utils input[type=time]::placeholder,\n.obsidian-dev-utils input[type=url]::placeholder,\n.obsidian-dev-utils input[type=week]::placeholder {\n color: var(--text-faint);\n}\n.mod-rtl input[type=month],\n.mod-rtl input[type=time],\n.mod-rtl input[type=week],\n.is-rtl input[type=month],\n.is-rtl input[type=time],\n.is-rtl input[type=week],\n.rtl input[type=month],\n.rtl input[type=time],\n.rtl input[type=week] {\n direction: rtl;\n}\n.mod-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.rtl input[type=month]::-webkit-calendar-picker-indicator,\n.rtl input[type=time]::-webkit-calendar-picker-indicator,\n.rtl input[type=week]::-webkit-calendar-picker-indicator {\n right: var(--size-4-1);\n left: auto;\n}\n\n.obsidian-dev-utils input[type=month],\n.obsidian-dev-utils input[type=time],\n.obsidian-dev-utils input[type=week] {\n font-variant-numeric: tabular-nums;\n position: relative;\n}\n.obsidian-dev-utils input[type=month]::-webkit-datetime-edit-text,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-text,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-text {\n color: var(--text-faint);\n padding-inline-end: 0;\n}\n.obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator,\n.obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator {\n position: absolute;\n left: var(--size-4-1);\n right: auto;\n opacity: 0.5;\n}\n.obsidian-dev-utils input[type=month]::-webkit-datetime-edit-month-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-month-field:focus, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-day-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-day-field:focus, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-year-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-year-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-month-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-month-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-day-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-day-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-year-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-year-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-month-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-month-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-day-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-day-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-year-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-year-field:focus {\n background-color: var(--text-selection);\n color: var(--text-normal);\n cursor: text;\n}\n.mod-rtl .obsidian-dev-utils input[type=month], .is-rtl .obsidian-dev-utils input[type=month], .rtl .obsidian-dev-utils input[type=month],\n.mod-rtl .obsidian-dev-utils input[type=time],\n.is-rtl .obsidian-dev-utils input[type=time],\n.rtl .obsidian-dev-utils input[type=time],\n.mod-rtl .obsidian-dev-utils input[type=week],\n.is-rtl .obsidian-dev-utils input[type=week],\n.rtl .obsidian-dev-utils input[type=week] {\n direction: rtl;\n}\n.mod-rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator, .is-rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator, .rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator {\n left: auto;\n right: var(--size-4-1);\n}\n\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=month],\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=time],\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=week] {\n padding-inline-start: var(--size-4-6);\n}\n\n.obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator {\n margin-inline-start: 0;\n}\n\n.obsidian-dev-utilsprogress.loop {\n min-width: 200px;\n}\n\n@keyframes obsidian-dev-utils-minimized-modal-bar-pulse {\n 0%, 100% {\n box-shadow: var(--shadow-s);\n }\n 50% {\n box-shadow: 0 0 0 2px var(--interactive-accent);\n }\n}\n.obsidian-dev-utils.minimizable-modal .minimize-button {\n position: absolute;\n top: var(--size-4-2);\n right: calc(var(--size-4-2) + var(--size-4-9));\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--size-2-2);\n border: none;\n border-radius: var(--radius-s);\n background: transparent;\n color: var(--icon-color);\n cursor: pointer;\n box-shadow: none;\n}\n.obsidian-dev-utils.minimizable-modal .minimize-button:hover {\n background: var(--background-modifier-hover);\n color: var(--icon-color-hover);\n}\n.obsidian-dev-utils.minimized-modal-bar {\n position: fixed;\n right: var(--size-4-4);\n bottom: calc(var(--size-4-4) + var(--size-4-8));\n z-index: var(--layer-modal);\n display: flex;\n align-items: center;\n gap: var(--size-4-2);\n padding: var(--size-4-2) var(--size-4-3);\n border: 1px solid var(--background-modifier-border);\n border-radius: var(--radius-m);\n background: var(--background-secondary);\n box-shadow: var(--shadow-s);\n cursor: pointer;\n animation: obsidian-dev-utils-minimized-modal-bar-pulse 2s ease-in-out infinite;\n}\n.obsidian-dev-utils.minimized-modal-bar:hover {\n background-image: linear-gradient(var(--background-modifier-hover), var(--background-modifier-hover));\n}\n.obsidian-dev-utils.minimized-modal-bar .minimized-modal-bar-title {\n font-weight: var(--font-medium);\n}\n.obsidian-dev-utils.minimized-modal-bar .restore-button {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--size-2-2);\n border: none;\n border-radius: var(--radius-s);\n background: transparent;\n color: var(--icon-color);\n cursor: pointer;\n box-shadow: none;\n}\n.obsidian-dev-utils.minimized-modal-bar .restore-button:hover {\n background: var(--background-modifier-hover);\n color: var(--icon-color-hover);\n}\n\n.obsidian-dev-utils.modal-container .ok-button {\n margin-right: 10px;\n margin-top: 20px;\n}\n\n.obsidian-dev-utils .multiple-dropdown-component select,\n.obsidian-dev-utils .multiple-dropdown-component select:focus,\n.obsidian-dev-utils .multiple-dropdown-component .dropdown {\n height: auto;\n padding-top: 3px;\n}\n.obsidian-dev-utils .multiple-dropdown-component select option:checked,\n.obsidian-dev-utils .multiple-dropdown-component select:focus option:checked,\n.obsidian-dev-utils .multiple-dropdown-component .dropdown option:checked {\n background-color: #1967d2;\n color: #fff;\n}\n\n.obsidian-dev-utils.plugin-notice-name {\n color: var(--text-accent);\n display: inline-block;\n font-weight: var(--font-bold);\n margin-bottom: var(--size-4-2);\n}\n.obsidian-dev-utils.plugin-notice-content .obsidian-dev-utils.cancel-button {\n display: block;\n margin-top: var(--size-4-2);\n width: fit-content;\n}\n\n.obsidian-dev-utils.plugin-settings-tab a:focus {\n outline: 2px solid var(--link-color);\n}\n\n.obsidian-dev-utils.prompt-modal .text-box {\n width: 100%;\n}\n\nbody button:not(.clickable-icon) {\n color: var(--text-color);\n}\n\n.obsidian-dev-utils.tri-state-checkbox-component input[type=checkbox]:indeterminate {\n appearance: checkbox;\n}\n\n.obsidian-dev-utils :invalid {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-dev-utils input.metadata-input-text:active:invalid, .obsidian-dev-utils input.metadata-input-text:focus-visible:invalid, .obsidian-dev-utils input.metadata-input-text:focus:invalid,\n.obsidian-dev-utils input[type=date]:active:invalid,\n.obsidian-dev-utils input[type=date]:focus-visible:invalid,\n.obsidian-dev-utils input[type=date]:focus:invalid,\n.obsidian-dev-utils input[type=datetime-local]:active:invalid,\n.obsidian-dev-utils input[type=datetime-local]:focus-visible:invalid,\n.obsidian-dev-utils input[type=datetime-local]:focus:invalid,\n.obsidian-dev-utils input[type=email]:active:invalid,\n.obsidian-dev-utils input[type=email]:focus-visible:invalid,\n.obsidian-dev-utils input[type=email]:focus:invalid,\n.obsidian-dev-utils input[type=number]:active:invalid,\n.obsidian-dev-utils input[type=number]:focus-visible:invalid,\n.obsidian-dev-utils input[type=number]:focus:invalid,\n.obsidian-dev-utils input[type=password]:active:invalid,\n.obsidian-dev-utils input[type=password]:focus-visible:invalid,\n.obsidian-dev-utils input[type=password]:focus:invalid,\n.obsidian-dev-utils input[type=search]:active:invalid,\n.obsidian-dev-utils input[type=search]:focus-visible:invalid,\n.obsidian-dev-utils input[type=search]:focus:invalid,\n.obsidian-dev-utils input[type=text]:active:invalid,\n.obsidian-dev-utils input[type=text]:focus-visible:invalid,\n.obsidian-dev-utils input[type=text]:focus:invalid,\n.obsidian-dev-utils textarea:active:invalid,\n.obsidian-dev-utils textarea:focus-visible:invalid,\n.obsidian-dev-utils textarea:focus:invalid {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-dev-utils.setting-component-wrapper {\n position: relative;\n display: inline-flex;\n}\n.obsidian-dev-utils.overlay-validator {\n caret-color: transparent;\n cursor: default;\n position: absolute;\n background-color: transparent;\n border: none;\n outline: none;\n pointer-events: none;\n z-index: 9999;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n}\n.obsidian-dev-utils.tooltip.tooltip-validator {\n position: absolute;\n top: calc(100% + 8px);\n width: max-content;\n}\n\n/*# sourceMappingURL=data:application/json;charset=utf-8,%7B%22version%22:3,%22sourceRoot%22:%22%22,%22sources%22:%5B%22../src/styles/code-highlighter-component.scss%22,%22../src/styles/editor-lock.scss%22,%22../src/styles/input.scss%22,%22../src/styles/input-time.scss%22,%22../src/styles/loop.scss%22,%22../src/styles/minimizable-modal.scss%22,%22../src/styles/modal-container.scss%22,%22../src/styles/multiple-dropdown-component.scss%22,%22../src/styles/plugin-notice.scss%22,%22../src/styles/plugin-settings-tab.scss%22,%22../src/styles/prompt-modal.scss%22,%22../src/styles/tldraw-button-color-workaround.scss%22,%22../src/styles/tri-state-checkbox-component.scss%22,%22../src/styles/validation.scss%22%5D,%22names%22:%5B%5D,%22mappings%22:%22AAEI;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;;ACvCN;EACE;EACA;EACA;;AAEA;EACE;EACA;;;AAMJ;EACE;IACE;IACA;;;AAIJ;EACE;;;ACvBA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGE;EACE;AAAA;AAAA;AAAA;AAAA;IACE;IACA,YACE;;;AAMR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA,YACE;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAGF;AAAA;AAAA;AAAA;AAAA;EACE;;AASE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AC7DV;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;AAGF;AAAA;AAAA;EACE;EACA;EACA;EACA;;AAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA;EACA;;AAIK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGP;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AAKF;AAAA;AAAA;EACE;;;AAMJ;EACE;;;ACjDJ;EACE;;;ACFJ;EACE;IAEE;;EAGF;IACE;;;AAOA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AASN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAOA;EACE;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;;ACjFJ;EACE;EACA;;;ACFF;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;;ACTN;EACE;EACA;EACA;EACA;;AAIA;EACE;EACA;EACA;;;ACVF;EACE;;;ACDF;EACE;;;ACON;EACE;;;ACTE;EACE;;;ACEJ;EAJA;;AAoBI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EApBJ;;AA0BA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA%22,%22file%22:%22styles.css%22,%22sourcesContent%22:%5B%22.obsidian-dev-utils%20%7B%5Cn%20%20&.code-highlighter-component%20%7B%5Cn%20%20%20%20textarea,%20pre,%20code%20%7B%5Cn%20%20%20%20%20%20font-family:%20var(--font-monospace);%5Cn%20%20%20%20%20%20line-height:%20var(--line-height-normal);%5Cn%20%20%20%20%20%20margin:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea,%20code%20%7B%5Cn%20%20%20%20%20%20font-size:%20var(--code-size);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea%20%7B%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20transparent;%5Cn%20%20%20%20%20%20z-index:%202;%5Cn%20%20%20%20%20%20width:%2020em;%5Cn%20%20%20%20%20%20height:%2010em;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20%20%20border:%20var(--input-border-width)%20solid%20transparent;%5Cn%20%20%20%20%20%20overflow:%20auto;%5Cn%20%20%20%20%20%20inset:%200;%5Cn%20%20%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20%20%20z-index:%201;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre::after%20%7B%5Cn%20%20%20%20%20%20content:%20%5C%22%5C%22;%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20height:%20var(--bottom-gap,%200);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre.is-placeholder%20%7B%5Cn%20%20%20%20%20%20opacity:%200.6;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20code%20%7B%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20padding:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20Lock%20indicators%20shown%20in%20the%20tab%20header%20and%20the%20status%20bar%20while%20a%20note%20is%20locked.%20These%20live%20in%5Cn//%20global%20Obsidian%20DOM%20(tab%20header%20/%20status%20bar),%20so%20they%20are%20styled%20with%20a%20global%20class%20rather%20than%5Cn//%20scoped%20under%20%60.obsidian-dev-utils%60.%5Cn.obsidian-dev-utils-lock-indicator%20%7B%5Cn%20%20display:%20inline-flex;%5Cn%20%20align-items:%20center;%5Cn%20%20color:%20var(--text-muted);%5Cn%5Cn%20%20.svg-icon%20%7B%5Cn%20%20%20%20width:%20var(--icon-s);%5Cn%20%20%20%20height:%20var(--icon-s);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn//%20Flashed%20on%20every%20lock%20indicator%20(tab%20header,%20view%20action,%20status%20bar)%20when%20the%20user%20attempts%20to%5Cn//%20type%20in%20a%20locked%20note,%20to%20make%20clear%20the%20note%20is%20read-only.%20Re-added%20per%20rejected%20keystroke.%5Cn@keyframes%20obsidian-dev-utils-lock-indicator-flash%20%7B%5Cn%20%2040%25%20%7B%5Cn%20%20%20%20color:%20var(--text-error);%5Cn%20%20%20%20transform:%20scale(1.4);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn.obsidian-dev-utils-lock-indicator-flash%20%7B%5Cn%20%20animation:%20obsidian-dev-utils-lock-indicator-flash%200.35s%20ease-in-out;%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20input%5Btype='url'%5D%20%7B%5Cn%20%20%20%20height:%20var(--input-height)%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='tel'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='url'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20-webkit-app-region:%20no-drag;%5Cn%20%20%20%20background:%20var(--background-modifier-form-field);%5Cn%20%20%20%20border:%20var(--input-border-width)%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20font-family:%20inherit;%5Cn%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20font-size:%20var(--font-ui-small);%5Cn%20%20%20%20border-radius:%20var(--input-radius);%5Cn%20%20%20%20outline:%20none;%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20@media%20(hover:%20hover)%20%7B%5Cn%20%20%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20border-color:%20var(--background-modifier-border-hover);%5Cn%20%20%20%20%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20border-color:%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus,%5Cn%20%20%20%20&:focus-visible%20%7B%5Cn%20%20%20%20%20%20box-shadow:%200%200%200%202px%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::placeholder%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20@at-root%20%7B%5Cn%20%20%20%20.mod-rtl,%5Cn%20%20%20%20.is-rtl,%5Cn%20%20%20%20.rtl%20%7B%5Cn%20%20%20%20%20%20&%20%7B%5Cn%20%20%20%20%20%20%20%20input%5Btype='month'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='time'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20font-variant-numeric:%20tabular-nums;%5Cn%20%20%20%20position:%20relative;%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-text%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%20%20padding-inline-end:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20left:%20var(--size-4-1);%5Cn%20%20%20%20%20%20right:%20auto;%5Cn%20%20%20%20%20%20opacity:%200.5;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-month-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-day-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-year-field%20%7B%5Cn%20%20%20%20%20%20&:active,%5Cn%20%20%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20var(--text-selection);%5Cn%20%20%20%20%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20%20%20%20%20cursor:%20text;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20.mod-rtl%20&,%5Cn%20%20%20%20%20%20.is-rtl%20&,%5Cn%20%20%20%20%20%20.rtl%20&%20%7B%5Cn%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20body:not(.is-ios):not(.is-android)%20&%20%7B%5Cn%20%20%20%20%20%20%20%20padding-inline-start:%20var(--size-4-6);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='time'%5D%20%7B%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20margin-inline-start:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&progress.loop%20%7B%5Cn%20%20%20%20min-width:%20200px;%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22@keyframes%20obsidian-dev-utils-minimized-modal-bar-pulse%20%7B%5Cn%20%200%25,%5Cn%20%20100%25%20%7B%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%7D%5Cn%5Cn%20%2050%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%202px%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn.obsidian-dev-utils%20%7B%5Cn%20%20//%20The%20minimize%20button%20lives%20inside%20the%20modal%20container,%20left%20of%20Obsidian's%20close%20button.%5Cn%20%20&.minimizable-modal%20%7B%5Cn%20%20%20%20.minimize-button%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20top:%20var(--size-4-2);%5Cn%20%20%20%20%20%20right:%20calc(var(--size-4-2)%20+%20var(--size-4-9));%5Cn%20%20%20%20%20%20display:%20flex;%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20justify-content:%20center;%5Cn%20%20%20%20%20%20padding:%20var(--size-2-2);%5Cn%20%20%20%20%20%20border:%20none;%5Cn%20%20%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20var(--icon-color);%5Cn%20%20%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20%20%20box-shadow:%20none;%5Cn%5Cn%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20background:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20%20%20color:%20var(--icon-color-hover);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20//%20The%20minimized%20bar%20is%20appended%20to%20document.body.%20It%20floats%20at%20the%20bottom-right%20while%20minimized,%5Cn%20%20//%20and%20gently%20pulses%20an%20accent%20ring%20so%20the%20user%20does%20not%20forget%20about%20the%20minimized%20operation.%5Cn%20%20//%20It%20floats%20a%20status-bar's%20height%20above%20the%20bottom%20edge%20so%20it%20never%20covers%20the%20bottom-right%5Cn%20%20//%20status-bar%20items%20(e.g.%20the%20editor-lock%20unlock%20indicator,%20which%20lives%20in%20the%20same%20corner).%5Cn%20%20&.minimized-modal-bar%20%7B%5Cn%20%20%20%20position:%20fixed;%5Cn%20%20%20%20right:%20var(--size-4-4);%5Cn%20%20%20%20bottom:%20calc(var(--size-4-4)%20+%20var(--size-4-8));%5Cn%20%20%20%20z-index:%20var(--layer-modal);%5Cn%20%20%20%20display:%20flex;%5Cn%20%20%20%20align-items:%20center;%5Cn%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20padding:%20var(--size-4-2)%20var(--size-4-3);%5Cn%20%20%20%20border:%201px%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20border-radius:%20var(--radius-m);%5Cn%20%20%20%20background:%20var(--background-secondary);%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20animation:%20obsidian-dev-utils-minimized-modal-bar-pulse%202s%20ease-in-out%20infinite;%5Cn%5Cn%20%20%20%20//%20Layer%20the%20translucent%20hover%20tint%20over%20the%20opaque%20%60background%60%20(%60--background-secondary%60)%20via%5Cn%20%20%20%20//%20%60background-image%60%20instead%20of%20replacing%20the%20background-color.%20%60--background-modifier-hover%60%20is%5Cn%20%20%20%20//%20translucent,%20so%20setting%20it%20as%20%60background%60%20would%20let%20the%20editor%20content%20behind%20the%20floating%20bar%5Cn%20%20%20%20//%20bleed%20through%20and%20make%20the%20title%20unreadable.%20A%20gradient%20of%20the%20tint%20composited%20over%20the%20opaque%5Cn%20%20%20%20//%20base%20keeps%20the%20bar%20opaque%20while%20preserving%20the%20subtle%20hover%20highlight.%5Cn%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20background-image:%20linear-gradient(var(--background-modifier-hover),%20var(--background-modifier-hover));%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.minimized-modal-bar-title%20%7B%5Cn%20%20%20%20%20%20font-weight:%20var(--font-medium);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.restore-button%20%7B%5Cn%20%20%20%20%20%20display:%20flex;%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20justify-content:%20center;%5Cn%20%20%20%20%20%20padding:%20var(--size-2-2);%5Cn%20%20%20%20%20%20border:%20none;%5Cn%20%20%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20var(--icon-color);%5Cn%20%20%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20%20%20box-shadow:%20none;%5Cn%5Cn%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20background:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20%20%20color:%20var(--icon-color-hover);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.modal-container%20%7B%5Cn%20%20%20%20.ok-button%20%7B%5Cn%20%20%20%20%20%20margin-right:%2010px;%5Cn%20%20%20%20%20%20margin-top:%2020px;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20.multiple-dropdown-component%20%7B%5Cn%20%20%20%20select,%5Cn%20%20%20%20select:focus,%5Cn%20%20%20%20.dropdown%20%7B%5Cn%20%20%20%20%20%20height:%20auto;%5Cn%20%20%20%20%20%20padding-top:%203px;%5Cn%5Cn%20%20%20%20%20%20option:checked%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20%231967d2;%5Cn%20%20%20%20%20%20%20%20color:%20%23fff;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.plugin-notice-name%20%7B%5Cn%20%20%20%20color:%20var(--text-accent);%5Cn%20%20%20%20display:%20inline-block;%5Cn%20%20%20%20font-weight:%20var(--font-bold);%5Cn%20%20%20%20margin-bottom:%20var(--size-4-2);%5Cn%20%20%7D%5Cn%5Cn%20%20&.plugin-notice-content%20%7B%5Cn%20%20%20%20.obsidian-dev-utils.cancel-button%20%7B%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20margin-top:%20var(--size-4-2);%5Cn%20%20%20%20%20%20width:%20fit-content;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.plugin-settings-tab%20%7B%5Cn%20%20%20%20a:focus%20%7B%5Cn%20%20%20%20%20%20outline:%202px%20solid%20var(--link-color);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.prompt-modal%20%7B%5Cn%20%20%20%20.text-box%20%7B%5Cn%20%20%20%20%20%20width:%20100%25;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20The%20tldraw%20Obsidian%20plugin%20(tldraw/obsidian-plugin)%20ships%20an%20unscoped%20global%20rule%5Cn//%20%60button:not(.clickable-icon)%20%7B%20color:%20currentColor%20%7D%60%20that%20overrides%20Obsidian's%20own%5Cn//%20%60button:not(.clickable-icon)%20%7B%20color:%20var(--text-color)%20%7D%60%20app-wide.%20Obsidian%20sets%5Cn//%20%60--text-color%60%20contextually%20per%20button%20variant%20(%60--text-normal%60%20by%20default,%5Cn//%20%60--text-on-accent%60%20for%20%60.mod-cta%60,%20%60--text-error%60%20for%20%60.mod-warning%60),%20so%20tldraw's%5Cn//%20%60currentColor%60%20discards%20that%20and%20breaks%20button%20contrast%20outside%20tldraw%20%E2%80%94%20e.g.%5Cn//%20White-on-white%20action%20buttons%20inside%20a%20Notice.%20Re-assert%20Obsidian's%20own%20value%20with%20a%5Cn//%20%60body%60-prefixed%20selector%20(specificity%200,1,2)%20so%20it%20wins%20over%20tldraw's%20(0,1,1)%20while%5Cn//%20Staying%20correct%20for%20every%20button%20variant%20(it%20reuses%20the%20same%20contextual%20%60--text-color%60).%5Cn//%20Defensive%20workaround%20%E2%80%94%20remove%20once%20the%20upstream%20fix%20ships%20(tldraw/obsidian-plugin%23210).%5Cnbody%20button:not(.clickable-icon)%20%7B%5Cn%20%20color:%20var(--text-color);%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cr%5Cn%20%20&.tri-state-checkbox-component%20%7B%5Cr%5Cn%20%20%20%20input%5Btype='checkbox'%5D:indeterminate%20%7B%5Cr%5Cn%20%20%20%20%20%20appearance:%20checkbox;%5Cr%5Cn%20%20%20%20%7D%5Cr%5Cn%20%20%7D%5Cr%5Cn%7D%5Cr%5Cn%22,%22@mixin%20invalid%20%7B%5Cn%20%20box-shadow:%200%200%200%202px%20var(--text-error);%5Cn%7D%5Cn%5Cn.obsidian-dev-utils%20%7B%5Cn%20%20:invalid%20%7B%5Cn%20%20%20%20@include%20invalid;%5Cn%20%20%7D%5Cn%5Cn%20%20input.metadata-input-text,%5Cn%20%20input%5Btype='date'%5D,%5Cn%20%20input%5Btype='datetime-local'%5D,%5Cn%20%20input%5Btype='email'%5D,%5Cn%20%20input%5Btype='number'%5D,%5Cn%20%20input%5Btype='password'%5D,%5Cn%20%20input%5Btype='search'%5D,%5Cn%20%20input%5Btype='text'%5D,%5Cn%20%20textarea%20%7B%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus-visible,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20&:invalid%20%7B%5Cn%20%20%20%20%20%20%20%20@include%20invalid;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20&.setting-component-wrapper%20%7B%5Cn%20%20%20%20position:%20relative;%5Cn%20%20%20%20display:%20inline-flex;%5Cn%20%20%7D%5Cn%5Cn%20%20&.overlay-validator%20%7B%5Cn%20%20%20%20caret-color:%20transparent;%5Cn%20%20%20%20cursor:%20default;%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20background-color:%20transparent;%5Cn%20%20%20%20border:%20none;%5Cn%20%20%20%20outline:%20none;%5Cn%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20z-index:%209999;%5Cn%20%20%20%20left:%200;%5Cn%20%20%20%20top:%200;%5Cn%20%20%20%20width:%20100%25;%5Cn%20%20%20%20height:%20100%25;%5Cn%20%20%7D%5Cn%5Cn%20%20&.tooltip.tooltip-validator%20%7B%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20top:%20calc(100%25%20+%208px);%5Cn%20%20%20%20width:%20max-content;%5Cn%20%20%7D%5Cn%7D%5Cn%22%5D%7D */\n";
134
134
  // Annotate the CommonJS export names for ESM import in node:
135
135
  0 && (module.exports = {
@@ -140,7 +140,8 @@ __export(modals_exports, {
140
140
  "minimizable-modal": () => minimizable_modal,
141
141
  modal: () => modal,
142
142
  prompt: () => prompt,
143
- "select-item": () => select_item
143
+ "select-item": () => select_item,
144
+ "suggest-modal-command-builder": () => suggest_modal_command_builder
144
145
  });
145
146
  module.exports = __toCommonJS(modals_exports);
146
147
  var alert = __toESM(__extractDefault(require('./alert.cjs')), 1);
@@ -149,6 +150,7 @@ var minimizable_modal = __toESM(__extractDefault(require('./minimizable-modal.cj
149
150
  var modal = __toESM(__extractDefault(require('./modal.cjs')), 1);
150
151
  var prompt = __toESM(__extractDefault(require('./prompt.cjs')), 1);
151
152
  var select_item = __toESM(__extractDefault(require('./select-item.cjs')), 1);
153
+ var suggest_modal_command_builder = __toESM(__extractDefault(require('./suggest-modal-command-builder.cjs')), 1);
152
154
  // Annotate the CommonJS export names for ESM import in node:
153
155
  0 && (module.exports = {
154
156
  alert,
@@ -156,6 +158,7 @@ var select_item = __toESM(__extractDefault(require('./select-item.cjs')), 1);
156
158
  "minimizable-modal": null,
157
159
  modal,
158
160
  prompt,
159
- "select-item": null
161
+ "select-item": null,
162
+ "suggest-modal-command-builder": null
160
163
  });
161
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL21vZGFscy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGFzICdhbGVydCcgZnJvbSAnLi9hbGVydC50cyc7XG5leHBvcnQgKiBhcyAnY29uZmlybScgZnJvbSAnLi9jb25maXJtLnRzJztcbmV4cG9ydCAqIGFzICdtaW5pbWl6YWJsZS1tb2RhbCcgZnJvbSAnLi9taW5pbWl6YWJsZS1tb2RhbC50cyc7XG5leHBvcnQgKiBhcyAnbW9kYWwnIGZyb20gJy4vbW9kYWwudHMnO1xuZXhwb3J0ICogYXMgJ3Byb21wdCcgZnJvbSAnLi9wcm9tcHQudHMnO1xuZXhwb3J0ICogYXMgJ3NlbGVjdC1pdGVtJyBmcm9tICcuL3NlbGVjdC1pdGVtLnRzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsNkJBQUFBO0FBQUEsRUFBQTtBQUFBO0FBQUEsdUJBQUFDO0FBQUE7QUFBQTtBQUVBLFlBQXlCO0FBQ3pCLGNBQTJCO0FBQzNCLElBQUFELG9CQUFxQztBQUNyQyxZQUF5QjtBQUN6QixhQUEwQjtBQUMxQixJQUFBQyxjQUErQjsiLAogICJuYW1lcyI6IFsibWluaW1pemFibGUtbW9kYWwiLCAic2VsZWN0LWl0ZW0iXQp9Cg==
164
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL21vZGFscy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGFzICdhbGVydCcgZnJvbSAnLi9hbGVydC50cyc7XG5leHBvcnQgKiBhcyAnY29uZmlybScgZnJvbSAnLi9jb25maXJtLnRzJztcbmV4cG9ydCAqIGFzICdtaW5pbWl6YWJsZS1tb2RhbCcgZnJvbSAnLi9taW5pbWl6YWJsZS1tb2RhbC50cyc7XG5leHBvcnQgKiBhcyAnbW9kYWwnIGZyb20gJy4vbW9kYWwudHMnO1xuZXhwb3J0ICogYXMgJ3Byb21wdCcgZnJvbSAnLi9wcm9tcHQudHMnO1xuZXhwb3J0ICogYXMgJ3NlbGVjdC1pdGVtJyBmcm9tICcuL3NlbGVjdC1pdGVtLnRzJztcbmV4cG9ydCAqIGFzICdzdWdnZXN0LW1vZGFsLWNvbW1hbmQtYnVpbGRlcicgZnJvbSAnLi9zdWdnZXN0LW1vZGFsLWNvbW1hbmQtYnVpbGRlci50cyc7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLDZCQUFBQTtBQUFBLEVBQUE7QUFBQTtBQUFBLHVCQUFBQztBQUFBLEVBQUEsdUNBQUFDO0FBQUE7QUFBQTtBQUVBLFlBQXlCO0FBQ3pCLGNBQTJCO0FBQzNCLElBQUFGLG9CQUFxQztBQUNyQyxZQUF5QjtBQUN6QixhQUEwQjtBQUMxQixJQUFBQyxjQUErQjtBQUMvQixJQUFBQyxnQ0FBaUQ7IiwKICAibmFtZXMiOiBbIm1pbmltaXphYmxlLW1vZGFsIiwgInNlbGVjdC1pdGVtIiwgInN1Z2dlc3QtbW9kYWwtY29tbWFuZC1idWlsZGVyIl0KfQo=
@@ -5,3 +5,4 @@ export * as 'minimizable-modal' from './minimizable-modal.cjs';
5
5
  export * as 'modal' from './modal.cjs';
6
6
  export * as 'prompt' from './prompt.cjs';
7
7
  export * as 'select-item' from './select-item.cjs';
8
+ export * as 'suggest-modal-command-builder' from './suggest-modal-command-builder.cjs';
@@ -0,0 +1,269 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ (function initCjs() {
7
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
8
+ const globalThisRecord = globalThis;
9
+ globalThisRecord['__name'] ??= name;
10
+ const originalRequire = require;
11
+ if (originalRequire && !originalRequire.__isPatched) {
12
+ // eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function.
13
+ require = Object.assign(
14
+ (id) => requirePatched(id),
15
+ originalRequire,
16
+ {
17
+ __isPatched: true
18
+ }
19
+ );
20
+ }
21
+
22
+ const newFuncs = {
23
+ __extractDefault() {
24
+ return extractDefault;
25
+ },
26
+ process() {
27
+ const browserProcess = {
28
+ browser: true,
29
+ cwd() {
30
+ return '/';
31
+ },
32
+ env: {},
33
+ platform: 'android'
34
+ };
35
+ return browserProcess;
36
+ }
37
+ };
38
+
39
+ for (const key of Object.keys(newFuncs)) {
40
+ globalThisRecord[key] ??= newFuncs[key]?.();
41
+ }
42
+
43
+ function name(obj) {
44
+ return obj;
45
+ }
46
+
47
+ function extractDefault(module) {
48
+ return module && module.__esModule && 'default' in module ? module.default : module;
49
+ }
50
+
51
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = [
52
+ 'obsidian',
53
+ '@codemirror/autocomplete',
54
+ '@codemirror/collab',
55
+ '@codemirror/commands',
56
+ '@codemirror/language',
57
+ '@codemirror/lint',
58
+ '@codemirror/search',
59
+ '@codemirror/state',
60
+ '@codemirror/text',
61
+ '@codemirror/view',
62
+ '@lezer/common',
63
+ '@lezer/lr',
64
+ '@lezer/highlight'];
65
+
66
+
67
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = [
68
+ '@codemirror/closebrackets',
69
+ '@codemirror/comment',
70
+ '@codemirror/fold',
71
+ '@codemirror/gutter',
72
+ '@codemirror/highlight',
73
+ '@codemirror/history',
74
+ '@codemirror/matchbrackets',
75
+ '@codemirror/panel',
76
+ '@codemirror/rangeset',
77
+ '@codemirror/rectangular-selection',
78
+ '@codemirror/stream-parser',
79
+ '@codemirror/tooltip'];
80
+
81
+
82
+ function requirePatched(id) {
83
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id)) {
84
+ return originalRequire?.(id);
85
+ }
86
+
87
+ // eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
88
+ if (globalThis.app.isMobile) {
89
+ if (id === 'process' || id === 'node:process') {
90
+ // eslint-disable-next-line no-console -- Valid usage.
91
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
92
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
93
+ return globalThis.process;
94
+ }
95
+ } else {
96
+ const module = originalRequire?.(id);
97
+ if (module) {
98
+ return extractDefault(module);
99
+ }
100
+ }
101
+
102
+ // eslint-disable-next-line no-console -- Valid usage.
103
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
104
+ return {};
105
+ }
106
+ })();
107
+
108
+ "use strict";
109
+ var __defProp = Object.defineProperty;
110
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
111
+ var __getOwnPropNames = Object.getOwnPropertyNames;
112
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
113
+ var __export = (target, all) => {
114
+ for (var name in all)
115
+ __defProp(target, name, { get: all[name], enumerable: true });
116
+ };
117
+ var __copyProps = (to, from, except, desc) => {
118
+ if (from && typeof from === "object" || typeof from === "function") {
119
+ for (let key of __getOwnPropNames(from))
120
+ if (!__hasOwnProp.call(to, key) && key !== except)
121
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
122
+ }
123
+ return to;
124
+ };
125
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
126
+ var suggest_modal_command_builder_exports = {};
127
+ __export(suggest_modal_command_builder_exports, {
128
+ SuggestModalCommandBuilder: () => SuggestModalCommandBuilder
129
+ });
130
+ module.exports = __toCommonJS(suggest_modal_command_builder_exports);
131
+ var import_obsidian = require('obsidian');
132
+ const KEYS_MAP = /* @__PURE__ */ new Map([
133
+ ["Enter", "\u21B5"],
134
+ ["UpDown", "\u2191\u2193"]
135
+ ]);
136
+ class SuggestModalCommandBuilder {
137
+ instructions = [];
138
+ /**
139
+ * Adds an interactive checkbox to the instruction bar, bound to a modifier+key shortcut that toggles
140
+ * it.
141
+ *
142
+ * @param command - The checkbox command to add.
143
+ * @returns The builder instance for chaining.
144
+ */
145
+ addCheckbox(command) {
146
+ this.instructions.push({
147
+ command: this.buildCommand(command),
148
+ init: (purposeEl, scope) => {
149
+ const checkboxEl = purposeEl.createEl("input", { type: "checkbox" });
150
+ command.onInit(checkboxEl);
151
+ checkboxEl.addEventListener("change", () => {
152
+ command.onChange(checkboxEl.checked);
153
+ });
154
+ scope.register(command.modifiers ?? [], command.key, () => {
155
+ if (checkboxEl.disabled) {
156
+ return;
157
+ }
158
+ checkboxEl.checked = !checkboxEl.checked;
159
+ checkboxEl.trigger("change");
160
+ });
161
+ },
162
+ purpose: command.purpose
163
+ });
164
+ return this;
165
+ }
166
+ /**
167
+ * Adds a dropdown to the instruction bar, bound to a modifier+key shortcut that cycles through its
168
+ * options.
169
+ *
170
+ * @param command - The dropdown command to add.
171
+ * @returns The builder instance for chaining.
172
+ */
173
+ addDropDown(command) {
174
+ this.instructions.push({
175
+ command: this.buildCommand(command),
176
+ init: (purposeEl, scope) => {
177
+ purposeEl.appendText(" ");
178
+ const dropdownComponent = new import_obsidian.DropdownComponent(purposeEl);
179
+ command.onInit(dropdownComponent);
180
+ dropdownComponent.onChange((value) => {
181
+ command.onChange(value);
182
+ });
183
+ scope.register(command.modifiers ?? [], command.key, () => {
184
+ if (dropdownComponent.disabled) {
185
+ return;
186
+ }
187
+ const selectEl = dropdownComponent.selectEl;
188
+ selectEl.selectedIndex = (selectEl.selectedIndex + 1) % selectEl.options.length;
189
+ selectEl.trigger("change");
190
+ });
191
+ },
192
+ purpose: command.purpose
193
+ });
194
+ return this;
195
+ }
196
+ /**
197
+ * Adds a keyboard command to the instruction bar. When {@link KeyboardCommand.onKey} is provided, its
198
+ * handler is registered with the modal scope; otherwise the command is a hint only.
199
+ *
200
+ * @param command - The keyboard command to add.
201
+ * @returns The builder instance for chaining.
202
+ */
203
+ addKeyboardCommand(command) {
204
+ this.instructions.push({
205
+ command: this.buildCommand(command),
206
+ purpose: command.purpose,
207
+ registerScope: (scope) => {
208
+ if (command.onKey) {
209
+ scope.register(command.modifiers ?? [], command.key, command.onKey.bind(command));
210
+ }
211
+ }
212
+ });
213
+ return this;
214
+ }
215
+ /**
216
+ * Applies the accumulated commands to a modal. Always registers the essential navigation/action key
217
+ * handlers; only renders the instruction UI and registers the option-toggle shortcuts when
218
+ * {@link SuggestModalCommandBuilderBuildOptions.shouldShowInstructions} is `true`.
219
+ *
220
+ * @param modal - The modal to apply the commands to.
221
+ * @param options - The build options.
222
+ */
223
+ build(modal, options = {}) {
224
+ const { shouldShowInstructions = true } = options;
225
+ for (const instruction of this.instructions) {
226
+ instruction.registerScope?.(modal.scope);
227
+ }
228
+ if (!shouldShowInstructions) {
229
+ return;
230
+ }
231
+ modal.setInstructions(this.instructions);
232
+ const purposeEls = Array.from(modal.instructionsEl.findAll(".prompt-instruction > span:nth-child(2)"));
233
+ for (let i = 0; i < purposeEls.length; i++) {
234
+ const purposeEl = purposeEls[i];
235
+ if (!purposeEl) {
236
+ continue;
237
+ }
238
+ this.instructions[i]?.init?.(purposeEl, modal.scope);
239
+ }
240
+ }
241
+ buildCommand(entry) {
242
+ let command = KEYS_MAP.get(entry.key) ?? entry.key;
243
+ for (const modifier of entry.modifiers ?? []) {
244
+ command = `${this.getModifierString(modifier)} ${command}`;
245
+ }
246
+ return command;
247
+ }
248
+ getModifierString(modifier) {
249
+ switch (modifier) {
250
+ case "Alt":
251
+ return "alt";
252
+ case "Ctrl":
253
+ return "ctrl";
254
+ case "Meta":
255
+ return import_obsidian.Platform.isMacOS ? "cmd" : "win";
256
+ case "Mod":
257
+ return import_obsidian.Platform.isMacOS ? "cmd" : "ctrl";
258
+ case "Shift":
259
+ return "shift";
260
+ default:
261
+ return modifier;
262
+ }
263
+ }
264
+ }
265
+ // Annotate the CommonJS export names for ESM import in node:
266
+ 0 && (module.exports = {
267
+ SuggestModalCommandBuilder
268
+ });
269
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL21vZGFscy9zdWdnZXN0LW1vZGFsLWNvbW1hbmQtYnVpbGRlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEEgYnVpbGRlciBmb3IgYSB7QGxpbmsgU3VnZ2VzdE1vZGFsfSdzIGluc3RydWN0aW9uIGJhci5cbiAqXG4gKiB7QGxpbmsgU3VnZ2VzdE1vZGFsQ29tbWFuZEJ1aWxkZXJ9IGFzc2VtYmxlcyB0aGUgaW5zdHJ1Y3Rpb24gYmFyIHNob3duIGF0IHRoZSBib3R0b20gb2YgYVxuICoge0BsaW5rIFN1Z2dlc3RNb2RhbH06IGtleWJvYXJkLWNvbW1hbmQgaGludHMgKHtAbGluayBTdWdnZXN0TW9kYWxDb21tYW5kQnVpbGRlci5hZGRLZXlib2FyZENvbW1hbmR9KSxcbiAqIGludGVyYWN0aXZlIGNoZWNrYm94ZXMgYm91bmQgdG8gYSBtb2RpZmllcitrZXkgc2hvcnRjdXRcbiAqICh7QGxpbmsgU3VnZ2VzdE1vZGFsQ29tbWFuZEJ1aWxkZXIuYWRkQ2hlY2tib3h9KSwgYW5kIGRyb3Bkb3ducyBib3VuZCB0byBhIG1vZGlmaWVyK2tleSBzaG9ydGN1dFxuICogKHtAbGluayBTdWdnZXN0TW9kYWxDb21tYW5kQnVpbGRlci5hZGREcm9wRG93bn0pLiBDaGFpbiB0aGUgYGFkZCpgIGNhbGxzLCB0aGVuIGFwcGx5IGV2ZXJ5dGhpbmcgdG8gYVxuICogbW9kYWwgd2l0aCB7QGxpbmsgU3VnZ2VzdE1vZGFsQ29tbWFuZEJ1aWxkZXIuYnVpbGR9OlxuICpcbiAqIGBgYHRzXG4gKiBuZXcgU3VnZ2VzdE1vZGFsQ29tbWFuZEJ1aWxkZXIoKVxuICogICAuYWRkS2V5Ym9hcmRDb21tYW5kKHsga2V5OiAnRW50ZXInLCBtb2RpZmllcnM6IFsnTW9kJ10sIG9uS2V5LCBwdXJwb3NlOiAndG8gY3JlYXRlJyB9KVxuICogICAuYWRkQ2hlY2tib3goeyBrZXk6ICcxJywgbW9kaWZpZXJzOiBbJ0FsdCddLCBvbkNoYW5nZSwgb25Jbml0LCBwdXJwb3NlOiAnRml4IGZvb3Rub3RlcycgfSlcbiAqICAgLmJ1aWxkKG1vZGFsKTtcbiAqIGBgYFxuICpcbiAqIHtAbGluayBTdWdnZXN0TW9kYWxDb21tYW5kQnVpbGRlci5idWlsZH0gYWx3YXlzIHJlZ2lzdGVycyB0aGUgZXNzZW50aWFsIG5hdmlnYXRpb24vYWN0aW9uIGtleVxuICogaGFuZGxlcnMsIGJ1dCBvbmx5IHJlbmRlcnMgdGhlIGluc3RydWN0aW9uIFVJIGFuZCByZWdpc3RlcnMgdGhlIG9wdGlvbi10b2dnbGUgc2hvcnRjdXRzIHdoZW5cbiAqIHtAbGluayBTdWdnZXN0TW9kYWxDb21tYW5kQnVpbGRlckJ1aWxkT3B0aW9ucy5zaG91bGRTaG93SW5zdHJ1Y3Rpb25zfSBpcyBgdHJ1ZWAgKHRoZSBkZWZhdWx0KS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEluc3RydWN0aW9uLFxuICBLZXltYXBDb250ZXh0LFxuICBNb2RpZmllcixcbiAgU2NvcGUsXG4gIFN1Z2dlc3RNb2RhbFxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7XG4gIERyb3Bkb3duQ29tcG9uZW50LFxuICBQbGF0Zm9ybVxufSBmcm9tICdvYnNpZGlhbic7XG5cbmNvbnN0IEtFWVNfTUFQID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oW1xuICBbJ0VudGVyJywgJ1x1MjFCNSddLFxuICBbJ1VwRG93bicsICdcdTIxOTFcdTIxOTMnXVxuXSk7XG5cbi8qKlxuICogQSBjaGVja2JveCBjb21tYW5kIHNob3duIGluIGEge0BsaW5rIFN1Z2dlc3RNb2RhbH0ncyBpbnN0cnVjdGlvbiBiYXIgYW5kIGJvdW5kIHRvIGEgbW9kaWZpZXIra2V5XG4gKiBzaG9ydGN1dCB0aGF0IHRvZ2dsZXMgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hlY2tib3hDb21tYW5kIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdGhhdCB0b2dnbGVzIHRoZSBjaGVja2JveC5cbiAgICovXG4gIGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kaWZpZXJzIGNvbWJpbmVkIHdpdGgge0BsaW5rIENoZWNrYm94Q29tbWFuZC5rZXl9IHRvIHRvZ2dsZSB0aGUgY2hlY2tib3guIFdoZW4gb21pdHRlZCwgbm9cbiAgICogbW9kaWZpZXJzIGFyZSByZXF1aXJlZC5cbiAgICovXG4gIG1vZGlmaWVycz86IE1vZGlmaWVyW107XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBjaGVja2JveCB2YWx1ZSBjaGFuZ2VzLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgbmV3IGNoZWNrZWQgc3RhdGUuXG4gICAqL1xuICBvbkNoYW5nZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENhbGxlZCBvbmNlIHdpdGggdGhlIGNyZWF0ZWQgY2hlY2tib3ggZWxlbWVudCwgdG8gaW5pdGlhbGl6ZSBpdHMgc3RhdGUuXG4gICAqXG4gICAqIEBwYXJhbSBjaGVja2JveEVsIC0gVGhlIGNyZWF0ZWQgY2hlY2tib3ggZWxlbWVudC5cbiAgICovXG4gIG9uSW5pdChjaGVja2JveEVsOiBIVE1MSW5wdXRFbGVtZW50KTogdm9pZDtcblxuICAvKipcbiAgICogVGhlIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIHNob3duIG5leHQgdG8gdGhlIGNoZWNrYm94IGluIHRoZSBpbnN0cnVjdGlvbiBiYXIuXG4gICAqL1xuICBwdXJwb3NlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBkcm9wZG93biBjb21tYW5kIHNob3duIGluIGEge0BsaW5rIFN1Z2dlc3RNb2RhbH0ncyBpbnN0cnVjdGlvbiBiYXIgYW5kIGJvdW5kIHRvIGEgbW9kaWZpZXIra2V5XG4gKiBzaG9ydGN1dCB0aGF0IGN5Y2xlcyB0aHJvdWdoIGl0cyBvcHRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERyb3BEb3duQ29tbWFuZCB7XG4gIC8qKlxuICAgKiBUaGUga2V5IHRoYXQgY3ljbGVzIHRoZSBkcm9wZG93biB0byBpdHMgbmV4dCBvcHRpb24uXG4gICAqL1xuICBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1vZGlmaWVycyBjb21iaW5lZCB3aXRoIHtAbGluayBEcm9wRG93bkNvbW1hbmQua2V5fSB0byBjeWNsZSB0aGUgZHJvcGRvd24uIFdoZW4gb21pdHRlZCwgbm9cbiAgICogbW9kaWZpZXJzIGFyZSByZXF1aXJlZC5cbiAgICovXG4gIG1vZGlmaWVycz86IE1vZGlmaWVyW107XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBkcm9wZG93biB2YWx1ZSBjaGFuZ2VzLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgbmV3bHkgc2VsZWN0ZWQgdmFsdWUuXG4gICAqL1xuICBvbkNoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIG9uY2Ugd2l0aCB0aGUgY3JlYXRlZCBkcm9wZG93biBjb21wb25lbnQsIHRvIGluaXRpYWxpemUgaXRzIG9wdGlvbnMgYW5kIHN0YXRlLlxuICAgKlxuICAgKiBAcGFyYW0gZHJvcGRvd25Db21wb25lbnQgLSBUaGUgY3JlYXRlZCBkcm9wZG93biBjb21wb25lbnQuXG4gICAqL1xuICBvbkluaXQoZHJvcGRvd25Db21wb25lbnQ6IERyb3Bkb3duQ29tcG9uZW50KTogdm9pZDtcblxuICAvKipcbiAgICogVGhlIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIHNob3duIG5leHQgdG8gdGhlIGRyb3Bkb3duIGluIHRoZSBpbnN0cnVjdGlvbiBiYXIuXG4gICAqL1xuICBwdXJwb3NlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBrZXlib2FyZCBjb21tYW5kIHNob3duIGluIGEge0BsaW5rIFN1Z2dlc3RNb2RhbH0ncyBpbnN0cnVjdGlvbiBiYXIgYW5kIG9wdGlvbmFsbHkgYm91bmQgdG8gYVxuICogbW9kaWZpZXIra2V5IGhhbmRsZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS2V5Ym9hcmRDb21tYW5kIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgc2hvd24gaW4gdGhlIGluc3RydWN0aW9uIGJhciAoYW5kIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbW9kYWwgc2NvcGUgd2hlblxuICAgKiB7QGxpbmsgS2V5Ym9hcmRDb21tYW5kLm9uS2V5fSBpcyBwcm92aWRlZCkuXG4gICAqL1xuICBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1vZGlmaWVycyBjb21iaW5lZCB3aXRoIHtAbGluayBLZXlib2FyZENvbW1hbmQua2V5fS4gV2hlbiBvbWl0dGVkLCBubyBtb2RpZmllcnMgYXJlIHJlcXVpcmVkLlxuICAgKi9cbiAgbW9kaWZpZXJzPzogTW9kaWZpZXJbXTtcblxuICAvKipcbiAgICogVGhlIGhhbmRsZXIgaW52b2tlZCB3aGVuIHRoZSBzaG9ydGN1dCBpcyBwcmVzc2VkLiBXaGVuIG9taXR0ZWQsIHRoZSBjb21tYW5kIGlzIGEgaGludCBvbmx5IGFuZCBub1xuICAgKiBzY29wZSBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQuXG4gICAqXG4gICAqIEBwYXJhbSBldnQgLSBUaGUga2V5Ym9hcmQgZXZlbnQuXG4gICAqIEBwYXJhbSBjdHggLSBUaGUga2V5bWFwIGNvbnRleHQuXG4gICAqIEByZXR1cm5zIGBmYWxzZWAgdG8gcHJldmVudCBPYnNpZGlhbidzIGRlZmF1bHQgaGFuZGxpbmcsIG9yIGB2b2lkYC9gdHJ1ZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgb25LZXk/KGV2dDogS2V5Ym9hcmRFdmVudCwgY3R4OiBLZXltYXBDb250ZXh0KTogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIHNob3duIG5leHQgdG8gdGhlIGtleSBpbiB0aGUgaW5zdHJ1Y3Rpb24gYmFyLlxuICAgKi9cbiAgcHVycG9zZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBTdWdnZXN0TW9kYWxDb21tYW5kQnVpbGRlci5idWlsZH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3VnZ2VzdE1vZGFsQ29tbWFuZEJ1aWxkZXJCdWlsZE9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byByZW5kZXIgdGhlIGluc3RydWN0aW9uIGJhciAoY2hlY2tib3hlcywgZHJvcGRvd25zLCBrZXlib2FyZCBoaW50cykgYW5kIHJlZ2lzdGVyIHRoZVxuICAgKiBvcHRpb24tdG9nZ2xlIGtleWJvYXJkIHNob3J0Y3V0cy4gV2hlbiBgZmFsc2VgLCBubyBpbnN0cnVjdGlvbiBVSSBpcyBzaG93biBhbmQgdGhlIG9wdGlvbi10b2dnbGVcbiAgICogc2hvcnRjdXRzIGFyZSBub3QgcmVnaXN0ZXJlZDsgb25seSB0aGUgZXNzZW50aWFsIG5hdmlnYXRpb24ga2V5IGhhbmRsZXJzIHJlbWFpbiBhY3RpdmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2hvd0luc3RydWN0aW9ucz86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBJbnN0cnVjdGlvbkV4IGV4dGVuZHMgSW5zdHJ1Y3Rpb24ge1xuICBpbml0PyhwdXJwb3NlRWw6IEhUTUxTcGFuRWxlbWVudCwgc2NvcGU6IFNjb3BlKTogdm9pZDtcbiAgcmVnaXN0ZXJTY29wZT8oc2NvcGU6IFNjb3BlKTogdm9pZDtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSB7QGxpbmsgU3VnZ2VzdE1vZGFsfSdzIGluc3RydWN0aW9uIGJhciBmcm9tIGtleWJvYXJkIGNvbW1hbmRzLCBpbnRlcmFjdGl2ZSBjaGVja2JveGVzLCBhbmRcbiAqIGRyb3Bkb3ducywgdGhlbiBhcHBsaWVzIHRoZW0gdG8gYSBtb2RhbCB2aWEge0BsaW5rIFN1Z2dlc3RNb2RhbENvbW1hbmRCdWlsZGVyLmJ1aWxkfS5cbiAqL1xuZXhwb3J0IGNsYXNzIFN1Z2dlc3RNb2RhbENvbW1hbmRCdWlsZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnN0cnVjdGlvbnM6IEluc3RydWN0aW9uRXhbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGludGVyYWN0aXZlIGNoZWNrYm94IHRvIHRoZSBpbnN0cnVjdGlvbiBiYXIsIGJvdW5kIHRvIGEgbW9kaWZpZXIra2V5IHNob3J0Y3V0IHRoYXQgdG9nZ2xlc1xuICAgKiBpdC5cbiAgICpcbiAgICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY2hlY2tib3ggY29tbWFuZCB0byBhZGQuXG4gICAqIEByZXR1cm5zIFRoZSBidWlsZGVyIGluc3RhbmNlIGZvciBjaGFpbmluZy5cbiAgICovXG4gIHB1YmxpYyBhZGRDaGVja2JveChjb21tYW5kOiBDaGVja2JveENvbW1hbmQpOiB0aGlzIHtcbiAgICB0aGlzLmluc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgIGNvbW1hbmQ6IHRoaXMuYnVpbGRDb21tYW5kKGNvbW1hbmQpLFxuICAgICAgaW5pdDogKHB1cnBvc2VFbCwgc2NvcGUpID0+IHtcbiAgICAgICAgY29uc3QgY2hlY2tib3hFbCA9IHB1cnBvc2VFbC5jcmVhdGVFbCgnaW5wdXQnLCB7IHR5cGU6ICdjaGVja2JveCcgfSk7XG4gICAgICAgIGNvbW1hbmQub25Jbml0KGNoZWNrYm94RWwpO1xuICAgICAgICBjaGVja2JveEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICBjb21tYW5kLm9uQ2hhbmdlKGNoZWNrYm94RWwuY2hlY2tlZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNjb3BlLnJlZ2lzdGVyKGNvbW1hbmQubW9kaWZpZXJzID8/IFtdLCBjb21tYW5kLmtleSwgKCkgPT4ge1xuICAgICAgICAgIGlmIChjaGVja2JveEVsLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNoZWNrYm94RWwuY2hlY2tlZCA9ICFjaGVja2JveEVsLmNoZWNrZWQ7XG4gICAgICAgICAgY2hlY2tib3hFbC50cmlnZ2VyKCdjaGFuZ2UnKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgcHVycG9zZTogY29tbWFuZC5wdXJwb3NlXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGRyb3Bkb3duIHRvIHRoZSBpbnN0cnVjdGlvbiBiYXIsIGJvdW5kIHRvIGEgbW9kaWZpZXIra2V5IHNob3J0Y3V0IHRoYXQgY3ljbGVzIHRocm91Z2ggaXRzXG4gICAqIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGRyb3Bkb3duIGNvbW1hbmQgdG8gYWRkLlxuICAgKiBAcmV0dXJucyBUaGUgYnVpbGRlciBpbnN0YW5jZSBmb3IgY2hhaW5pbmcuXG4gICAqL1xuICBwdWJsaWMgYWRkRHJvcERvd24oY29tbWFuZDogRHJvcERvd25Db21tYW5kKTogdGhpcyB7XG4gICAgdGhpcy5pbnN0cnVjdGlvbnMucHVzaCh7XG4gICAgICBjb21tYW5kOiB0aGlzLmJ1aWxkQ29tbWFuZChjb21tYW5kKSxcbiAgICAgIGluaXQ6IChwdXJwb3NlRWwsIHNjb3BlKSA9PiB7XG4gICAgICAgIHB1cnBvc2VFbC5hcHBlbmRUZXh0KCcgJyk7XG4gICAgICAgIGNvbnN0IGRyb3Bkb3duQ29tcG9uZW50ID0gbmV3IERyb3Bkb3duQ29tcG9uZW50KHB1cnBvc2VFbCk7XG4gICAgICAgIGNvbW1hbmQub25Jbml0KGRyb3Bkb3duQ29tcG9uZW50KTtcbiAgICAgICAgZHJvcGRvd25Db21wb25lbnQub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgY29tbWFuZC5vbkNoYW5nZSh2YWx1ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBkZWZlbnNpdmUgPz8gb24gb3B0aW9uYWwgbW9kaWZpZXJzLiAqL1xuICAgICAgICBzY29wZS5yZWdpc3Rlcihjb21tYW5kLm1vZGlmaWVycyA/PyBbXSwgY29tbWFuZC5rZXksICgpID0+IHtcbiAgICAgICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICAgIGlmIChkcm9wZG93bkNvbXBvbmVudC5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBzZWxlY3RFbCA9IGRyb3Bkb3duQ29tcG9uZW50LnNlbGVjdEVsO1xuICAgICAgICAgIHNlbGVjdEVsLnNlbGVjdGVkSW5kZXggPSAoc2VsZWN0RWwuc2VsZWN0ZWRJbmRleCArIDEpICUgc2VsZWN0RWwub3B0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgc2VsZWN0RWwudHJpZ2dlcignY2hhbmdlJyk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIHB1cnBvc2U6IGNvbW1hbmQucHVycG9zZVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBrZXlib2FyZCBjb21tYW5kIHRvIHRoZSBpbnN0cnVjdGlvbiBiYXIuIFdoZW4ge0BsaW5rIEtleWJvYXJkQ29tbWFuZC5vbktleX0gaXMgcHJvdmlkZWQsIGl0c1xuICAgKiBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbW9kYWwgc2NvcGU7IG90aGVyd2lzZSB0aGUgY29tbWFuZCBpcyBhIGhpbnQgb25seS5cbiAgICpcbiAgICogQHBhcmFtIGNvbW1hbmQgLSBUaGUga2V5Ym9hcmQgY29tbWFuZCB0byBhZGQuXG4gICAqIEByZXR1cm5zIFRoZSBidWlsZGVyIGluc3RhbmNlIGZvciBjaGFpbmluZy5cbiAgICovXG4gIHB1YmxpYyBhZGRLZXlib2FyZENvbW1hbmQoY29tbWFuZDogS2V5Ym9hcmRDb21tYW5kKTogdGhpcyB7XG4gICAgdGhpcy5pbnN0cnVjdGlvbnMucHVzaCh7XG4gICAgICBjb21tYW5kOiB0aGlzLmJ1aWxkQ29tbWFuZChjb21tYW5kKSxcbiAgICAgIHB1cnBvc2U6IGNvbW1hbmQucHVycG9zZSxcbiAgICAgIHJlZ2lzdGVyU2NvcGU6IChzY29wZSkgPT4ge1xuICAgICAgICBpZiAoY29tbWFuZC5vbktleSkge1xuICAgICAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBkZWZlbnNpdmUgPz8gb24gb3B0aW9uYWwgbW9kaWZpZXJzLiAqL1xuICAgICAgICAgIHNjb3BlLnJlZ2lzdGVyKGNvbW1hbmQubW9kaWZpZXJzID8/IFtdLCBjb21tYW5kLmtleSwgY29tbWFuZC5vbktleS5iaW5kKGNvbW1hbmQpKTtcbiAgICAgICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyB0aGUgYWNjdW11bGF0ZWQgY29tbWFuZHMgdG8gYSBtb2RhbC4gQWx3YXlzIHJlZ2lzdGVycyB0aGUgZXNzZW50aWFsIG5hdmlnYXRpb24vYWN0aW9uIGtleVxuICAgKiBoYW5kbGVyczsgb25seSByZW5kZXJzIHRoZSBpbnN0cnVjdGlvbiBVSSBhbmQgcmVnaXN0ZXJzIHRoZSBvcHRpb24tdG9nZ2xlIHNob3J0Y3V0cyB3aGVuXG4gICAqIHtAbGluayBTdWdnZXN0TW9kYWxDb21tYW5kQnVpbGRlckJ1aWxkT3B0aW9ucy5zaG91bGRTaG93SW5zdHJ1Y3Rpb25zfSBpcyBgdHJ1ZWAuXG4gICAqXG4gICAqIEBwYXJhbSBtb2RhbCAtIFRoZSBtb2RhbCB0byBhcHBseSB0aGUgY29tbWFuZHMgdG8uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIGJ1aWxkIG9wdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgYnVpbGQobW9kYWw6IFN1Z2dlc3RNb2RhbDx1bmtub3duPiwgb3B0aW9uczogU3VnZ2VzdE1vZGFsQ29tbWFuZEJ1aWxkZXJCdWlsZE9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICAgIGNvbnN0IHsgc2hvdWxkU2hvd0luc3RydWN0aW9ucyA9IHRydWUgfSA9IG9wdGlvbnM7XG5cbiAgICAvLyBFc3NlbnRpYWwgbmF2aWdhdGlvbi9hY3Rpb24ga2V5IGhhbmRsZXJzIG11c3Qgc3RheSBhY3RpdmUgZXZlbiB3aGVuIHRoZSBpbnN0cnVjdGlvbiBiYXIgaXMgaGlkZGVuLlxuICAgIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgdGhpcy5pbnN0cnVjdGlvbnMpIHtcbiAgICAgIGluc3RydWN0aW9uLnJlZ2lzdGVyU2NvcGU/Lihtb2RhbC5zY29wZSk7XG4gICAgfVxuXG4gICAgaWYgKCFzaG91bGRTaG93SW5zdHJ1Y3Rpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbW9kYWwuc2V0SW5zdHJ1Y3Rpb25zKHRoaXMuaW5zdHJ1Y3Rpb25zKTtcbiAgICBjb25zdCBwdXJwb3NlRWxzID0gQXJyYXkuZnJvbShtb2RhbC5pbnN0cnVjdGlvbnNFbC5maW5kQWxsKCcucHJvbXB0LWluc3RydWN0aW9uID4gc3BhbjpudGgtY2hpbGQoMiknKSkgYXMgSFRNTFNwYW5FbGVtZW50W107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwdXJwb3NlRWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwdXJwb3NlRWwgPSBwdXJwb3NlRWxzW2ldO1xuICAgICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIHB1cnBvc2VFbHNbaV0gaXMgYWx3YXlzIGRlZmluZWQgd2l0aGluIGxvb3AgYm91bmRzLiAqL1xuICAgICAgaWYgKCFwdXJwb3NlRWwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuXG4gICAgICB0aGlzLmluc3RydWN0aW9uc1tpXT8uaW5pdD8uKHB1cnBvc2VFbCwgbW9kYWwuc2NvcGUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRDb21tYW5kKGVudHJ5OiBLZXlib2FyZENvbW1hbmQpOiBzdHJpbmcge1xuICAgIGxldCBjb21tYW5kID0gS0VZU19NQVAuZ2V0KGVudHJ5LmtleSkgPz8gZW50cnkua2V5O1xuXG4gICAgZm9yIChjb25zdCBtb2RpZmllciBvZiBlbnRyeS5tb2RpZmllcnMgPz8gW10pIHtcbiAgICAgIGNvbW1hbmQgPSBgJHt0aGlzLmdldE1vZGlmaWVyU3RyaW5nKG1vZGlmaWVyKX0gJHtjb21tYW5kfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbW1hbmQ7XG4gIH1cblxuICBwcml2YXRlIGdldE1vZGlmaWVyU3RyaW5nKG1vZGlmaWVyOiBNb2RpZmllcik6IHN0cmluZyB7XG4gICAgc3dpdGNoIChtb2RpZmllcikge1xuICAgICAgY2FzZSAnQWx0JzpcbiAgICAgICAgcmV0dXJuICdhbHQnO1xuICAgICAgY2FzZSAnQ3RybCc6XG4gICAgICAgIHJldHVybiAnY3RybCc7XG4gICAgICBjYXNlICdNZXRhJzpcbiAgICAgICAgcmV0dXJuIFBsYXRmb3JtLmlzTWFjT1MgPyAnY21kJyA6ICd3aW4nO1xuICAgICAgY2FzZSAnTW9kJzpcbiAgICAgICAgcmV0dXJuIFBsYXRmb3JtLmlzTWFjT1MgPyAnY21kJyA6ICdjdHJsJztcbiAgICAgIGNhc2UgJ1NoaWZ0JzpcbiAgICAgICAgcmV0dXJuICdzaGlmdCc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbW9kaWZpZXI7XG4gICAgfVxuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFnQ0Esc0JBR087QUFFUCxNQUFNLFdBQVcsb0JBQUksSUFBb0I7QUFBQSxFQUN2QyxDQUFDLFNBQVMsUUFBRztBQUFBLEVBQ2IsQ0FBQyxVQUFVLGNBQUk7QUFDakIsQ0FBQztBQWlJTSxNQUFNLDJCQUEyQjtBQUFBLEVBQ3JCLGVBQWdDLENBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUzNDLFlBQVksU0FBZ0M7QUFDakQsU0FB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
@@ -0,0 +1,171 @@
1
+ /// <reference path="../../library.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * A builder for a {@link SuggestModal}'s instruction bar.
6
+ *
7
+ * {@link SuggestModalCommandBuilder} assembles the instruction bar shown at the bottom of a
8
+ * {@link SuggestModal}: keyboard-command hints ({@link SuggestModalCommandBuilder.addKeyboardCommand}),
9
+ * interactive checkboxes bound to a modifier+key shortcut
10
+ * ({@link SuggestModalCommandBuilder.addCheckbox}), and dropdowns bound to a modifier+key shortcut
11
+ * ({@link SuggestModalCommandBuilder.addDropDown}). Chain the `add*` calls, then apply everything to a
12
+ * modal with {@link SuggestModalCommandBuilder.build}:
13
+ *
14
+ * ```ts
15
+ * new SuggestModalCommandBuilder()
16
+ * .addKeyboardCommand({ key: 'Enter', modifiers: ['Mod'], onKey, purpose: 'to create' })
17
+ * .addCheckbox({ key: '1', modifiers: ['Alt'], onChange, onInit, purpose: 'Fix footnotes' })
18
+ * .build(modal);
19
+ * ```
20
+ *
21
+ * {@link SuggestModalCommandBuilder.build} always registers the essential navigation/action key
22
+ * handlers, but only renders the instruction UI and registers the option-toggle shortcuts when
23
+ * {@link SuggestModalCommandBuilderBuildOptions.shouldShowInstructions} is `true` (the default).
24
+ */
25
+ import type { KeymapContext, Modifier, SuggestModal } from 'obsidian' with { 'resolution-mode': 'import' };
26
+ import { DropdownComponent } from 'obsidian';
27
+ /**
28
+ * A checkbox command shown in a {@link SuggestModal}'s instruction bar and bound to a modifier+key
29
+ * shortcut that toggles it.
30
+ */
31
+ export interface CheckboxCommand {
32
+ /**
33
+ * The key that toggles the checkbox.
34
+ */
35
+ key: string;
36
+ /**
37
+ * The modifiers combined with {@link CheckboxCommand.key} to toggle the checkbox. When omitted, no
38
+ * modifiers are required.
39
+ */
40
+ modifiers?: Modifier[];
41
+ /**
42
+ * Called when the checkbox value changes.
43
+ *
44
+ * @param value - The new checked state.
45
+ */
46
+ onChange(value: boolean): void;
47
+ /**
48
+ * Called once with the created checkbox element, to initialize its state.
49
+ *
50
+ * @param checkboxEl - The created checkbox element.
51
+ */
52
+ onInit(checkboxEl: HTMLInputElement): void;
53
+ /**
54
+ * The human-readable description shown next to the checkbox in the instruction bar.
55
+ */
56
+ purpose: string;
57
+ }
58
+ /**
59
+ * A dropdown command shown in a {@link SuggestModal}'s instruction bar and bound to a modifier+key
60
+ * shortcut that cycles through its options.
61
+ */
62
+ export interface DropDownCommand {
63
+ /**
64
+ * The key that cycles the dropdown to its next option.
65
+ */
66
+ key: string;
67
+ /**
68
+ * The modifiers combined with {@link DropDownCommand.key} to cycle the dropdown. When omitted, no
69
+ * modifiers are required.
70
+ */
71
+ modifiers?: Modifier[];
72
+ /**
73
+ * Called when the dropdown value changes.
74
+ *
75
+ * @param value - The newly selected value.
76
+ */
77
+ onChange(value: string): void;
78
+ /**
79
+ * Called once with the created dropdown component, to initialize its options and state.
80
+ *
81
+ * @param dropdownComponent - The created dropdown component.
82
+ */
83
+ onInit(dropdownComponent: DropdownComponent): void;
84
+ /**
85
+ * The human-readable description shown next to the dropdown in the instruction bar.
86
+ */
87
+ purpose: string;
88
+ }
89
+ /**
90
+ * A keyboard command shown in a {@link SuggestModal}'s instruction bar and optionally bound to a
91
+ * modifier+key handler.
92
+ */
93
+ export interface KeyboardCommand {
94
+ /**
95
+ * The key shown in the instruction bar (and registered with the modal scope when
96
+ * {@link KeyboardCommand.onKey} is provided).
97
+ */
98
+ key: string;
99
+ /**
100
+ * The modifiers combined with {@link KeyboardCommand.key}. When omitted, no modifiers are required.
101
+ */
102
+ modifiers?: Modifier[];
103
+ /**
104
+ * The handler invoked when the shortcut is pressed. When omitted, the command is a hint only and no
105
+ * scope handler is registered.
106
+ *
107
+ * @param evt - The keyboard event.
108
+ * @param ctx - The keymap context.
109
+ * @returns `false` to prevent Obsidian's default handling, or `void`/`true` otherwise.
110
+ */
111
+ onKey?(evt: KeyboardEvent, ctx: KeymapContext): boolean;
112
+ /**
113
+ * The human-readable description shown next to the key in the instruction bar.
114
+ */
115
+ purpose: string;
116
+ }
117
+ /**
118
+ * Options for {@link SuggestModalCommandBuilder.build}.
119
+ */
120
+ export interface SuggestModalCommandBuilderBuildOptions {
121
+ /**
122
+ * Whether to render the instruction bar (checkboxes, dropdowns, keyboard hints) and register the
123
+ * option-toggle keyboard shortcuts. When `false`, no instruction UI is shown and the option-toggle
124
+ * shortcuts are not registered; only the essential navigation key handlers remain active.
125
+ *
126
+ * @default `true`
127
+ */
128
+ readonly shouldShowInstructions?: boolean;
129
+ }
130
+ /**
131
+ * Builds a {@link SuggestModal}'s instruction bar from keyboard commands, interactive checkboxes, and
132
+ * dropdowns, then applies them to a modal via {@link SuggestModalCommandBuilder.build}.
133
+ */
134
+ export declare class SuggestModalCommandBuilder {
135
+ private readonly instructions;
136
+ /**
137
+ * Adds an interactive checkbox to the instruction bar, bound to a modifier+key shortcut that toggles
138
+ * it.
139
+ *
140
+ * @param command - The checkbox command to add.
141
+ * @returns The builder instance for chaining.
142
+ */
143
+ addCheckbox(command: CheckboxCommand): this;
144
+ /**
145
+ * Adds a dropdown to the instruction bar, bound to a modifier+key shortcut that cycles through its
146
+ * options.
147
+ *
148
+ * @param command - The dropdown command to add.
149
+ * @returns The builder instance for chaining.
150
+ */
151
+ addDropDown(command: DropDownCommand): this;
152
+ /**
153
+ * Adds a keyboard command to the instruction bar. When {@link KeyboardCommand.onKey} is provided, its
154
+ * handler is registered with the modal scope; otherwise the command is a hint only.
155
+ *
156
+ * @param command - The keyboard command to add.
157
+ * @returns The builder instance for chaining.
158
+ */
159
+ addKeyboardCommand(command: KeyboardCommand): this;
160
+ /**
161
+ * Applies the accumulated commands to a modal. Always registers the essential navigation/action key
162
+ * handlers; only renders the instruction UI and registers the option-toggle shortcuts when
163
+ * {@link SuggestModalCommandBuilderBuildOptions.shouldShowInstructions} is `true`.
164
+ *
165
+ * @param modal - The modal to apply the commands to.
166
+ * @param options - The build options.
167
+ */
168
+ build(modal: SuggestModal<unknown>, options?: SuggestModalCommandBuilderBuildOptions): void;
169
+ private buildCommand;
170
+ private getModifierString;
171
+ }