obsidian-dev-utils 86.1.2 → 86.2.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.
Files changed (66) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/dev/main.js +37333 -0
  3. package/dist/dev/manifest.json +9 -0
  4. package/dist/lib/cjs/__merged.cjs +34 -3
  5. package/dist/lib/cjs/__merged.d.cts +5 -4
  6. package/dist/lib/cjs/async-events.cjs +32 -3
  7. package/dist/lib/cjs/async-events.d.cts +63 -0
  8. package/dist/lib/cjs/disposable.cjs +103 -115
  9. package/dist/lib/cjs/disposable.d.cts +81 -57
  10. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  11. package/dist/lib/cjs/obsidian/command-handlers/command-handler-component.cjs +48 -21
  12. package/dist/lib/cjs/obsidian/command-handlers/command-handler-component.d.cts +11 -8
  13. package/dist/lib/cjs/obsidian/command-handlers/open-demo-vault-command-handler.cjs +1 -1
  14. package/dist/lib/cjs/obsidian/community-plugins.cjs +109 -9
  15. package/dist/lib/cjs/obsidian/community-plugins.d.cts +175 -3
  16. package/dist/lib/cjs/obsidian/components/component-ex.cjs +18 -1
  17. package/dist/lib/cjs/obsidian/components/component-ex.d.cts +12 -0
  18. package/dist/lib/cjs/obsidian/components/menu-event-registrar-component.cjs +8 -4
  19. package/dist/lib/cjs/obsidian/components/menu-event-registrar-component.d.cts +7 -3
  20. package/dist/lib/cjs/obsidian/components/plugin-notice-component.cjs +5 -4
  21. package/dist/lib/cjs/obsidian/components/plugin-notice-component.d.cts +3 -2
  22. package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.cjs +2 -7
  23. package/dist/lib/cjs/obsidian/events.cjs +165 -0
  24. package/dist/lib/cjs/obsidian/events.d.cts +98 -0
  25. package/dist/lib/cjs/obsidian/index.cjs +4 -1
  26. package/dist/lib/cjs/obsidian/index.d.cts +1 -0
  27. package/dist/lib/cjs/obsidian/menu-event-registrar.cjs +1 -1
  28. package/dist/lib/cjs/obsidian/menu-event-registrar.d.cts +7 -3
  29. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/change-extension-plugin.cjs +31 -33
  30. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/change-extension-plugin.d.cts +11 -0
  31. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +39 -52
  32. package/dist/lib/cjs/script-utils/linters/eslint-no-restricted-syntax.cjs +1 -5
  33. package/dist/lib/cjs/type.cjs +31 -12
  34. package/dist/lib/cjs/type.d.cts +56 -36
  35. package/dist/lib/esm/__merged.d.mts +5 -4
  36. package/dist/lib/esm/__merged.mjs +39 -5
  37. package/dist/lib/esm/async-events.d.mts +63 -0
  38. package/dist/lib/esm/async-events.mjs +29 -2
  39. package/dist/lib/esm/disposable.d.mts +81 -57
  40. package/dist/lib/esm/disposable.mjs +101 -115
  41. package/dist/lib/esm/generated-during-build.mjs +1 -1
  42. package/dist/lib/esm/obsidian/command-handlers/command-handler-component.d.mts +11 -8
  43. package/dist/lib/esm/obsidian/command-handlers/command-handler-component.mjs +49 -22
  44. package/dist/lib/esm/obsidian/command-handlers/open-demo-vault-command-handler.mjs +1 -1
  45. package/dist/lib/esm/obsidian/community-plugins.d.mts +175 -3
  46. package/dist/lib/esm/obsidian/community-plugins.mjs +100 -8
  47. package/dist/lib/esm/obsidian/components/component-ex.d.mts +12 -0
  48. package/dist/lib/esm/obsidian/components/component-ex.mjs +18 -1
  49. package/dist/lib/esm/obsidian/components/menu-event-registrar-component.d.mts +7 -3
  50. package/dist/lib/esm/obsidian/components/menu-event-registrar-component.mjs +8 -4
  51. package/dist/lib/esm/obsidian/components/plugin-notice-component.d.mts +3 -2
  52. package/dist/lib/esm/obsidian/components/plugin-notice-component.mjs +5 -4
  53. package/dist/lib/esm/obsidian/desktop-demo-vault-opener.mjs +5 -7
  54. package/dist/lib/esm/obsidian/events.d.mts +98 -0
  55. package/dist/lib/esm/obsidian/events.mjs +55 -0
  56. package/dist/lib/esm/obsidian/index.d.mts +1 -0
  57. package/dist/lib/esm/obsidian/index.mjs +3 -1
  58. package/dist/lib/esm/obsidian/menu-event-registrar.d.mts +7 -3
  59. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/change-extension-plugin.d.mts +11 -0
  60. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/change-extension-plugin.mjs +29 -32
  61. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.mjs +40 -55
  62. package/dist/lib/esm/script-utils/linters/eslint-no-restricted-syntax.mjs +1 -5
  63. package/dist/lib/esm/type.d.mts +56 -36
  64. package/dist/lib/esm/type.mjs +30 -11
  65. package/obsidian/events/package.json +6 -0
  66. package/package.json +18 -15
@@ -64,7 +64,7 @@ export interface AsyncCallbackDisposableConstructorParams {
64
64
  /**
65
65
  * How the disposable behaves when disposed more than once.
66
66
  *
67
- * @default {@link MultipleDisposeBehavior.Invoke}
67
+ * @default {@link MultipleDisposeBehavior.Ignore}
68
68
  */
69
69
  readonly multipleDisposeBehavior?: MultipleDisposeBehavior;
70
70
  }
@@ -96,7 +96,7 @@ export interface CallbackDisposableConstructorParams {
96
96
  /**
97
97
  * How the disposable behaves when disposed more than once.
98
98
  *
99
- * @default {@link MultipleDisposeBehavior.Invoke}
99
+ * @default {@link MultipleDisposeBehavior.Ignore}
100
100
  */
101
101
  readonly multipleDisposeBehavior?: MultipleDisposeBehavior;
102
102
  }
@@ -123,7 +123,7 @@ export interface CombineAsyncDisposableConstructorParams {
123
123
  /**
124
124
  * How the combiner behaves when it is disposed more than once.
125
125
  *
126
- * @default {@link MultipleDisposeBehavior.Invoke}
126
+ * @default {@link MultipleDisposeBehavior.Ignore}
127
127
  */
128
128
  readonly multipleDisposeBehavior?: MultipleDisposeBehavior;
129
129
  }
@@ -150,7 +150,7 @@ export interface CombineDisposableConstructorParams {
150
150
  /**
151
151
  * How the combiner behaves when it is disposed more than once.
152
152
  *
153
- * @default {@link MultipleDisposeBehavior.Invoke}
153
+ * @default {@link MultipleDisposeBehavior.Ignore}
154
154
  */
155
155
  readonly multipleDisposeBehavior?: MultipleDisposeBehavior;
156
156
  }
@@ -168,14 +168,51 @@ export interface DisposableEx extends Disposable {
168
168
  * A callback invoked when a {@link CallbackDisposable} is disposed.
169
169
  */
170
170
  export type DisposeCallback = (this: void) => void;
171
+ /**
172
+ * Abstract base for an {@link AsyncDisposableEx}: it carries the re-dispose guard (via
173
+ * {@link MultipleDisposeBehavior}) and the {@link AsyncDisposableEx.asyncDispose} alias; a subclass only
174
+ * implements {@link AsyncDisposableBase.performDisposeAsync}.
175
+ */
176
+ export declare abstract class AsyncDisposableBase implements AsyncDisposableEx {
177
+ /**
178
+ * How the disposable behaves when disposed more than once.
179
+ *
180
+ * @default {@link MultipleDisposeBehavior.Ignore}
181
+ */
182
+ protected multipleDisposeBehavior: MultipleDisposeBehavior;
183
+ /**
184
+ * Whether this disposable has been disposed (its teardown has run at least once).
185
+ *
186
+ * @returns `true` once disposal has started.
187
+ */
188
+ protected get isDisposed(): boolean;
189
+ private _isDisposed;
190
+ /**
191
+ * Disposes the object. Convenience alias that delegates to `this[Symbol.asyncDispose]()`.
192
+ *
193
+ * @returns A {@link Promise} that resolves once teardown completes.
194
+ */
195
+ asyncDispose(): Promise<void>;
196
+ /**
197
+ * Disposes the object by running {@link AsyncDisposableBase.performDisposeAsync}, honoring the configured
198
+ * {@link MultipleDisposeBehavior} on a repeat dispose.
199
+ *
200
+ * @returns A {@link Promise} that resolves once teardown completes.
201
+ */
202
+ [Symbol.asyncDispose](): Promise<void>;
203
+ /**
204
+ * Performs the actual teardown. Called at most once unless {@link MultipleDisposeBehavior.Invoke} is set.
205
+ *
206
+ * @returns A {@link Promisable} that resolves once teardown completes.
207
+ */
208
+ protected abstract performDisposeAsync(): Promisable<void>;
209
+ }
171
210
  /**
172
211
  * An async disposable that executes a callback when disposed via `await using` (or a manual
173
212
  * `await disposable[Symbol.asyncDispose]()`).
174
213
  */
175
- export declare class AsyncCallbackDisposable implements AsyncDisposableEx {
214
+ export declare class AsyncCallbackDisposable extends AsyncDisposableBase {
176
215
  private readonly callback;
177
- private isDisposed;
178
- private readonly multipleDisposeBehavior;
179
216
  /**
180
217
  * Creates a new instance of {@link AsyncCallbackDisposable}.
181
218
  *
@@ -183,30 +220,49 @@ export declare class AsyncCallbackDisposable implements AsyncDisposableEx {
183
220
  */
184
221
  constructor(params: AsyncCallbackDisposableConstructorParams);
185
222
  /**
186
- * Disposes the object by executing the callback. Convenience alias that delegates to
187
- * `this[Symbol.asyncDispose]()`.
223
+ * Runs the dispose callback.
188
224
  *
189
225
  * @returns A {@link Promise} that resolves once the callback completes.
190
226
  */
191
- asyncDispose(): Promise<void>;
227
+ protected performDisposeAsync(): Promise<void>;
228
+ }
229
+ /**
230
+ * Abstract base for a {@link DisposableEx}: it carries the re-dispose guard (via {@link MultipleDisposeBehavior})
231
+ * and the {@link DisposableEx.dispose} alias; a subclass only implements {@link DisposableBase.performDispose}.
232
+ */
233
+ export declare abstract class DisposableBase implements DisposableEx {
192
234
  /**
193
- * Disposes the object by executing the callback.
235
+ * How the disposable behaves when disposed more than once.
194
236
  *
195
- * This method is called automatically when the object is used in an `await using` declaration. It
196
- * can also be called manually. The behavior on a second and later dispose is controlled by
197
- * {@link AsyncCallbackDisposableConstructorParams.multipleDisposeBehavior}.
237
+ * @default {@link MultipleDisposeBehavior.Ignore}
238
+ */
239
+ protected multipleDisposeBehavior: MultipleDisposeBehavior;
240
+ /**
241
+ * Whether this disposable has been disposed (its teardown has run at least once).
198
242
  *
199
- * @returns A {@link Promise} that resolves once the callback completes.
243
+ * @returns `true` once disposal has started.
200
244
  */
201
- [Symbol.asyncDispose](): Promise<void>;
245
+ protected get isDisposed(): boolean;
246
+ private _isDisposed;
247
+ /**
248
+ * Disposes the object. Convenience alias that delegates to `this[Symbol.dispose]()`.
249
+ */
250
+ dispose(): void;
251
+ /**
252
+ * Disposes the object by running {@link DisposableBase.performDispose}, honoring the configured
253
+ * {@link MultipleDisposeBehavior} on a repeat dispose.
254
+ */
255
+ [Symbol.dispose](): void;
256
+ /**
257
+ * Performs the actual teardown. Called at most once unless {@link MultipleDisposeBehavior.Invoke} is set.
258
+ */
259
+ protected abstract performDispose(): void;
202
260
  }
203
261
  /**
204
262
  * A disposable that executes a callback when disposed.
205
263
  */
206
- export declare class CallbackDisposable implements DisposableEx {
264
+ export declare class CallbackDisposable extends DisposableBase {
207
265
  private readonly callback;
208
- private isDisposed;
209
- private readonly multipleDisposeBehavior;
210
266
  /**
211
267
  * Creates a new instance of {@link CallbackDisposable}.
212
268
  *
@@ -214,84 +270,52 @@ export declare class CallbackDisposable implements DisposableEx {
214
270
  */
215
271
  constructor(params: CallbackDisposableConstructorParams);
216
272
  /**
217
- * Disposes the object by executing the callback. Convenience alias that delegates to
218
- * `this[Symbol.dispose]()`.
219
- */
220
- dispose(): void;
221
- /**
222
- * Disposes the object by executing the callback.
223
- *
224
- * This method is called automatically when the object is used in a `using` declaration. It can also
225
- * be called manually. The behavior on a second and later dispose is controlled by
226
- * {@link CallbackDisposableConstructorParams.multipleDisposeBehavior}.
273
+ * Runs the dispose callback.
227
274
  */
228
- [Symbol.dispose](): void;
275
+ protected performDispose(): void;
229
276
  }
230
277
  /**
231
278
  * An {@link AsyncDisposableEx} that combines multiple async disposables and disposes all of them when it
232
279
  * is disposed.
233
280
  */
234
- export declare class CombineAsyncDisposable implements AsyncDisposableEx {
281
+ export declare class CombineAsyncDisposable extends AsyncDisposableBase {
235
282
  private readonly children;
236
283
  private readonly disposeOrder;
237
284
  private readonly errorBehavior;
238
- private isDisposed;
239
- private readonly multipleDisposeBehavior;
240
285
  /**
241
286
  * Creates a new instance of {@link CombineAsyncDisposable}.
242
287
  *
243
288
  * @param params - The parameters.
244
289
  */
245
290
  constructor(params: CombineAsyncDisposableConstructorParams);
246
- /**
247
- * Disposes all combined children. Convenience alias that delegates to
248
- * `this[Symbol.asyncDispose]()`.
249
- *
250
- * @returns A {@link Promise} that resolves once all children have been disposed.
251
- */
252
- asyncDispose(): Promise<void>;
253
291
  /**
254
292
  * Disposes all combined children in the configured {@link DisposeOrder}, applying the configured
255
293
  * {@link DisposeErrorBehavior} when a child throws.
256
294
  *
257
- * This method is called automatically when the object is used in an `await using` declaration. It can
258
- * also be called manually. The behavior on a second and later dispose is controlled by
259
- * {@link CombineAsyncDisposableConstructorParams.multipleDisposeBehavior}.
260
- *
261
295
  * @returns A {@link Promise} that resolves once all children have been disposed.
262
296
  */
263
- [Symbol.asyncDispose](): Promise<void>;
297
+ protected performDisposeAsync(): Promise<void>;
264
298
  private getOrderedChildren;
265
299
  }
266
300
  /**
267
301
  * A {@link DisposableEx} that combines multiple disposables and disposes all of them when it is
268
302
  * disposed.
269
303
  */
270
- export declare class CombineDisposable implements DisposableEx {
304
+ export declare class CombineDisposable extends DisposableBase {
271
305
  private readonly children;
272
306
  private readonly disposeOrder;
273
307
  private readonly errorBehavior;
274
- private isDisposed;
275
- private readonly multipleDisposeBehavior;
276
308
  /**
277
309
  * Creates a new instance of {@link CombineDisposable}.
278
310
  *
279
311
  * @param params - The parameters.
280
312
  */
281
313
  constructor(params: CombineDisposableConstructorParams);
282
- /**
283
- * Disposes all combined children. Convenience alias that delegates to `this[Symbol.dispose]()`.
284
- */
285
- dispose(): void;
286
314
  /**
287
315
  * Disposes all combined children in the configured {@link DisposeOrder}, applying the configured
288
316
  * {@link DisposeErrorBehavior} when a child throws.
289
- *
290
- * This method is called automatically when the object is used in a `using` declaration. It can also
291
- * be called manually. The behavior on a second and later dispose is controlled by
292
- * {@link CombineDisposableConstructorParams.multipleDisposeBehavior}.
293
317
  */
294
- [Symbol.dispose](): void;
318
+ protected performDispose(): void;
295
319
  private getOrderedChildren;
296
320
  }
297
321
  /**
@@ -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 = "86.1.2";
132
+ const LIBRARY_VERSION = "86.2.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@keyframes obsidian-dev-utils-minimized-modal-bar-attention {\n 0% {\n box-shadow: 0 0 0 0 var(--interactive-accent);\n }\n 40% {\n box-shadow: 0 0 0 4px var(--interactive-accent);\n }\n 100% {\n box-shadow: var(--shadow-s);\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-attention {\n animation: obsidian-dev-utils-minimized-modal-bar-attention 0.35s ease-out;\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.obsidian-dev-utils.minimized-modal-bar .cancel-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.obsidian-dev-utils.minimized-modal-bar .cancel-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 {\n padding-right: var(--size-4-5);\n position: relative;\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.obsidian-dev-utils.plugin-notice-content .obsidian-dev-utils.plugin-notice-close-button {\n align-items: center;\n background-color: transparent;\n box-shadow: none;\n color: var(--text-muted);\n cursor: pointer;\n display: inline-flex;\n height: var(--size-4-5);\n justify-content: center;\n padding: 0;\n position: absolute;\n right: 0;\n top: 0;\n width: var(--size-4-5);\n}\n.obsidian-dev-utils.plugin-notice-content .obsidian-dev-utils.plugin-notice-close-button:hover {\n color: var(--text-normal);\n}\n.obsidian-dev-utils.plugin-notice-requires-confirmation.notice {\n padding: 0;\n}\n.obsidian-dev-utils.plugin-notice-requires-confirmation.notice .obsidian-dev-utils.plugin-notice-content {\n padding: var(--size-4-3) var(--size-4-4);\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;;;AAIJ;EACE;IACE;;EAGF;IACE;;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;;AAOF;EACE;;AAGF;EACE;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACE;EACA;;;ACxGJ;EACE;EACA;;;ACFF;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;;ACTN;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAQN;EACE;;AAEA;EACE;;;AC5CF;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@keyframes%20obsidian-dev-utils-minimized-modal-bar-attention%20%7B%5Cn%20%200%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%200%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%5Cn%20%2040%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%204px%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%5Cn%20%20100%25%20%7B%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%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//%20A%20one-shot,%20more%20pronounced%20flash%20played%20when%20the%20user%20attempts%20a%20blocked%20action%20(a%20keystroke,%5Cn%20%20%20%20//%20right-click,%20or%20opening%20another%20modal)%20while%20this%20modal%20is%20minimized,%20so%20the%20block%20is%20not%5Cn%20%20%20%20//%20silent.%20Its%20higher%20specificity%20overrides%20the%20gentle%20infinite%20idle%20pulse%20while%20it%20plays;%20the%5Cn%20%20%20%20//%20class%20is%20removed%20on%20%60animationend%60,%20restoring%20the%20idle%20pulse.%5Cn%20%20%20%20&.minimized-modal-bar-attention%20%7B%5Cn%20%20%20%20%20%20animation:%20obsidian-dev-utils-minimized-modal-bar-attention%200.35s%20ease-out;%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,%5Cn%20%20%20%20.cancel-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%20padding-right:%20var(--size-4-5);%5Cn%20%20%20%20position:%20relative;%5Cn%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%5Cn%20%20%20%20.obsidian-dev-utils.plugin-notice-close-button%20%7B%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20background-color:%20transparent;%5Cn%20%20%20%20%20%20box-shadow:%20none;%5Cn%20%20%20%20%20%20color:%20var(--text-muted);%5Cn%20%20%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20%20%20display:%20inline-flex;%5Cn%20%20%20%20%20%20height:%20var(--size-4-5);%5Cn%20%20%20%20%20%20justify-content:%20center;%5Cn%20%20%20%20%20%20padding:%200;%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20right:%200;%5Cn%20%20%20%20%20%20top:%200;%5Cn%20%20%20%20%20%20width:%20var(--size-4-5);%5Cn%5Cn%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20//%20Move%20the%20notice's%20own%20padding%20onto%20the%20content%20wrapper%20so%20the%20wrapper%20covers%20the%20whole%20clickable%5Cn%20%20//%20Area%20%E2%80%94%20otherwise%20a%20click%20landing%20on%20the%20notice's%20bare%20padding%20(outside%20the%20wrapper)%20would%20bypass%20the%5Cn%20%20//%20Stop-propagation%20guard%20and%20dismiss%20the%20hard-to-close%20notice.%5Cn%20%20&.plugin-notice-requires-confirmation.notice%20%7B%5Cn%20%20%20%20padding:%200;%5Cn%5Cn%20%20%20%20.obsidian-dev-utils.plugin-notice-content%20%7B%5Cn%20%20%20%20%20%20padding:%20var(--size-4-3)%20var(--size-4-4);%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 = {
@@ -131,6 +131,37 @@ module.exports = __toCommonJS(command_handler_component_exports);
131
131
  var import_async = require('../../async.cjs');
132
132
  var import_disposable = require('../../disposable.cjs');
133
133
  var import_component_ex = require('../components/component-ex.cjs');
134
+ class CommandMenuEventScope extends import_disposable.DisposableBase {
135
+ constructor(inner) {
136
+ super();
137
+ this.inner = inner;
138
+ }
139
+ inner;
140
+ disposables = [];
141
+ registerEditorMenuEventHandler(handler) {
142
+ return this.collect(this.inner.registerEditorMenuEventHandler(handler));
143
+ }
144
+ registerFileMenuEventHandler(handler) {
145
+ return this.collect(this.inner.registerFileMenuEventHandler(handler));
146
+ }
147
+ registerFilesMenuEventHandler(handler) {
148
+ return this.collect(this.inner.registerFilesMenuEventHandler(handler));
149
+ }
150
+ performDispose() {
151
+ for (const disposable of this.disposables) {
152
+ disposable.dispose();
153
+ }
154
+ this.disposables.length = 0;
155
+ }
156
+ collect(disposable) {
157
+ if (this.isDisposed) {
158
+ disposable.dispose();
159
+ } else {
160
+ this.disposables.push(disposable);
161
+ }
162
+ return disposable;
163
+ }
164
+ }
134
165
  class CommandHandlerComponent extends import_component_ex.ComponentEx {
135
166
  /**
136
167
  * Provider for accessing the currently active file.
@@ -161,45 +192,41 @@ class CommandHandlerComponent extends import_component_ex.ComponentEx {
161
192
  this.pluginName = params.pluginName;
162
193
  }
163
194
  /**
164
- * Registers the given command handlers with Obsidian and provides each its runtime registration
165
- * context. Each handler's command is added immediately; the returned {@link Disposable} removes the
166
- * commands registered by this call when disposed. Any command still registered when the component
167
- * unloads is removed automatically.
195
+ * Registers the given command handlers with Obsidian and provides each its own runtime registration
196
+ * context. Each handler's command is added immediately; the returned {@link DisposableEx} removes the
197
+ * commands registered by this call and any menu events those handlers registered via their context's
198
+ * {@link MenuEventRegistrar} when disposed. Any command still registered when the component unloads is
199
+ * removed automatically.
168
200
  *
169
201
  * @param commandHandlers - The command handlers to register.
170
- * @returns A {@link Disposable} that unregisters the handlers passed to this call.
202
+ * @returns A {@link DisposableEx} that unregisters the handlers (commands + menu events) passed to this call.
171
203
  */
172
204
  registerCommandHandlers(commandHandlers) {
173
- const context = {
174
- activeFileProvider: this.activeFileProvider,
175
- menuEventRegistrar: this.menuEventRegistrar,
176
- pluginName: this.pluginName
177
- };
178
205
  const disposables = [];
179
206
  for (const commandHandler of commandHandlers) {
180
207
  const command = commandHandler.buildCommand();
181
208
  const commandId = command.id;
182
209
  this.commandRegistrar.addCommand(command);
210
+ const menuEventScope = new CommandMenuEventScope(this.menuEventRegistrar);
211
+ const context = {
212
+ activeFileProvider: this.activeFileProvider,
213
+ menuEventRegistrar: menuEventScope,
214
+ pluginName: this.pluginName
215
+ };
183
216
  const disposable = new import_disposable.CallbackDisposable({
184
217
  callback: () => {
185
218
  this.commandRegistrar.removeCommand(commandId);
186
- },
187
- multipleDisposeBehavior: import_disposable.MultipleDisposeBehavior.Ignore
188
- });
189
- disposables.push(disposable);
190
- this.register(() => {
191
- disposable.dispose();
219
+ menuEventScope.dispose();
220
+ }
192
221
  });
222
+ disposables.push(this.registerDisposable(disposable));
193
223
  (0, import_async.invokeAsyncSafely)(() => commandHandler.onRegistered(context));
194
224
  }
195
- return new import_disposable.CombineDisposable({
196
- disposables,
197
- multipleDisposeBehavior: import_disposable.MultipleDisposeBehavior.Ignore
198
- });
225
+ return new import_disposable.CombineDisposable({ disposables });
199
226
  }
200
227
  }
201
228
  // Annotate the CommonJS export names for ESM import in node:
202
229
  0 && (module.exports = {
203
230
  CommandHandlerComponent
204
231
  });
205
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbW1hbmQtaGFuZGxlcnMvY29tbWFuZC1oYW5kbGVyLWNvbXBvbmVudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbXBvbmVudCB0aGF0IHJlZ2lzdGVycyB7QGxpbmsgQ29tbWFuZEhhbmRsZXJ9cyB3aXRoIE9ic2lkaWFuIGFuZCB0aWVzIHRoZWlyIHJlbW92YWwgdG8gaXRzIGxpZmVjeWNsZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFjdGl2ZUZpbGVQcm92aWRlciB9IGZyb20gJy4uL2FjdGl2ZS1maWxlLXByb3ZpZGVyLnRzJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZFJlZ2lzdHJhciB9IGZyb20gJy4uL2NvbW1hbmQtcmVnaXN0cmFyLnRzJztcbmltcG9ydCB0eXBlIHsgTWVudUV2ZW50UmVnaXN0cmFyIH0gZnJvbSAnLi4vbWVudS1ldmVudC1yZWdpc3RyYXIudHMnO1xuaW1wb3J0IHR5cGUge1xuICBDb21tYW5kSGFuZGxlcixcbiAgQ29tbWFuZEhhbmRsZXJSZWdpc3RyYXRpb25Db250ZXh0XG59IGZyb20gJy4vY29tbWFuZC1oYW5kbGVyLnRzJztcblxuaW1wb3J0IHsgaW52b2tlQXN5bmNTYWZlbHkgfSBmcm9tICcuLi8uLi9hc3luYy50cyc7XG5pbXBvcnQge1xuICBDYWxsYmFja0Rpc3Bvc2FibGUsXG4gIENvbWJpbmVEaXNwb3NhYmxlLFxuICBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvclxufSBmcm9tICcuLi8uLi9kaXNwb3NhYmxlLnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi4vY29tcG9uZW50cy9jb21wb25lbnQtZXgudHMnO1xuXG5pbnRlcmZhY2UgQ29tbWFuZEhhbmRsZXJDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFjdGl2ZUZpbGVQcm92aWRlcjogQWN0aXZlRmlsZVByb3ZpZGVyO1xuICByZWFkb25seSBjb21tYW5kUmVnaXN0cmFyOiBDb21tYW5kUmVnaXN0cmFyO1xuICByZWFkb25seSBtZW51RXZlbnRSZWdpc3RyYXI6IE1lbnVFdmVudFJlZ2lzdHJhcjtcbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyB7QGxpbmsgQ29tbWFuZEhhbmRsZXJ9cyB3aXRoIE9ic2lkaWFuIGFuZCBtYW5hZ2VzIHRoZWlyIGxpZmVjeWNsZS5cbiAqXG4gKiBDYWxsIHtAbGluayByZWdpc3RlckNvbW1hbmRIYW5kbGVyc30gdG8gcmVnaXN0ZXIgYSBiYXRjaCBvZiBoYW5kbGVycyBvbiBkZW1hbmQgKGFzIG1hbnkgdGltZXMgYXNcbiAqIG5lZWRlZCB3aGlsZSB0aGUgY29tcG9uZW50IGlzIGFsaXZlKTsgZGlzcG9zZSB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGV9IHRvIHVucmVnaXN0ZXIgZXhhY3RseVxuICogdGhvc2UgaGFuZGxlcnMsIG9yIGxldCB0aGUgY29tcG9uZW50IHVubG9hZCB0byByZW1vdmUgZXZlcnkgY29tbWFuZCBzdGlsbCByZWdpc3RlcmVkIHRocm91Z2ggaXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21tYW5kSGFuZGxlckNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgLyoqXG4gICAqIFByb3ZpZGVyIGZvciBhY2Nlc3NpbmcgdGhlIGN1cnJlbnRseSBhY3RpdmUgZmlsZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhY3RpdmVGaWxlUHJvdmlkZXI6IEFjdGl2ZUZpbGVQcm92aWRlcjtcblxuICAvKipcbiAgICogUmVnaXN0cmFyIHVzZWQgdG8gYWRkIGFuZCByZW1vdmUgY29tbWFuZHMgd2l0aCBPYnNpZGlhbi5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBjb21tYW5kUmVnaXN0cmFyOiBDb21tYW5kUmVnaXN0cmFyO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RyYXIgZm9yIG1lbnUgZXZlbnQgaGFuZGxlcnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWVudUV2ZW50UmVnaXN0cmFyOiBNZW51RXZlbnRSZWdpc3RyYXI7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBwbHVnaW4gdGhhdCBvd25zIHRoZSBjb21tYW5kcy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgY29tbWFuZCBoYW5kbGVyIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogQ29tbWFuZEhhbmRsZXJDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hY3RpdmVGaWxlUHJvdmlkZXIgPSBwYXJhbXMuYWN0aXZlRmlsZVByb3ZpZGVyO1xuICAgIHRoaXMubWVudUV2ZW50UmVnaXN0cmFyID0gcGFyYW1zLm1lbnVFdmVudFJlZ2lzdHJhcjtcbiAgICB0aGlzLmNvbW1hbmRSZWdpc3RyYXIgPSBwYXJhbXMuY29tbWFuZFJlZ2lzdHJhcjtcbiAgICB0aGlzLnBsdWdpbk5hbWUgPSBwYXJhbXMucGx1Z2luTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgdGhlIGdpdmVuIGNvbW1hbmQgaGFuZGxlcnMgd2l0aCBPYnNpZGlhbiBhbmQgcHJvdmlkZXMgZWFjaCBpdHMgcnVudGltZSByZWdpc3RyYXRpb25cbiAgICogY29udGV4dC4gRWFjaCBoYW5kbGVyJ3MgY29tbWFuZCBpcyBhZGRlZCBpbW1lZGlhdGVseTsgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSByZW1vdmVzIHRoZVxuICAgKiBjb21tYW5kcyByZWdpc3RlcmVkIGJ5IHRoaXMgY2FsbCB3aGVuIGRpc3Bvc2VkLiBBbnkgY29tbWFuZCBzdGlsbCByZWdpc3RlcmVkIHdoZW4gdGhlIGNvbXBvbmVudFxuICAgKiB1bmxvYWRzIGlzIHJlbW92ZWQgYXV0b21hdGljYWxseS5cbiAgICpcbiAgICogQHBhcmFtIGNvbW1hbmRIYW5kbGVycyAtIFRoZSBjb21tYW5kIGhhbmRsZXJzIHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBEaXNwb3NhYmxlfSB0aGF0IHVucmVnaXN0ZXJzIHRoZSBoYW5kbGVycyBwYXNzZWQgdG8gdGhpcyBjYWxsLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyQ29tbWFuZEhhbmRsZXJzKGNvbW1hbmRIYW5kbGVyczogQ29tbWFuZEhhbmRsZXJbXSk6IERpc3Bvc2FibGUge1xuICAgIGNvbnN0IGNvbnRleHQ6IENvbW1hbmRIYW5kbGVyUmVnaXN0cmF0aW9uQ29udGV4dCA9IHtcbiAgICAgIGFjdGl2ZUZpbGVQcm92aWRlcjogdGhpcy5hY3RpdmVGaWxlUHJvdmlkZXIsXG4gICAgICBtZW51RXZlbnRSZWdpc3RyYXI6IHRoaXMubWVudUV2ZW50UmVnaXN0cmFyLFxuICAgICAgcGx1Z2luTmFtZTogdGhpcy5wbHVnaW5OYW1lXG4gICAgfTtcblxuICAgIGNvbnN0IGRpc3Bvc2FibGVzOiBEaXNwb3NhYmxlW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbW1hbmRIYW5kbGVyIG9mIGNvbW1hbmRIYW5kbGVycykge1xuICAgICAgY29uc3QgY29tbWFuZCA9IGNvbW1hbmRIYW5kbGVyLmJ1aWxkQ29tbWFuZCgpO1xuICAgICAgLy8gQ2FwdHVyZSB0aGUgaWQgYmVmb3JlIHJlZ2lzdGVyaW5nLiBgUGx1Z2luLmFkZENvbW1hbmRgIG11dGF0ZXMgYGNvbW1hbmQuaWRgIChwcmVmaXhpbmcgaXQgd2l0aFxuICAgICAgLy8gYHRoaXMubWFuaWZlc3QuaWRgKSwgd2hpbGUgYFBsdWdpbi5yZW1vdmVDb21tYW5kYCByZS1wcmVmaXhlcyBcdTIwMTQgc28gcmVtb3ZhbCBuZWVkcyB0aGUgb3JpZ2luYWwgaWQuXG4gICAgICAvLyBSZWFkaW5nIGBjb21tYW5kLmlkYCBhZnRlciBgYWRkQ29tbWFuZGAgd291bGQgZG91YmxlLXByZWZpeCBpdCwgc28gdGhlIGNvbW1hbmQgaXMgbmV2ZXIgcmVtb3ZlZC5cbiAgICAgIGNvbnN0IGNvbW1hbmRJZCA9IGNvbW1hbmQuaWQ7XG4gICAgICB0aGlzLmNvbW1hbmRSZWdpc3RyYXIuYWRkQ29tbWFuZChjb21tYW5kKTtcbiAgICAgIGNvbnN0IGRpc3Bvc2FibGUgPSBuZXcgQ2FsbGJhY2tEaXNwb3NhYmxlKHtcbiAgICAgICAgY2FsbGJhY2s6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICB0aGlzLmNvbW1hbmRSZWdpc3RyYXIucmVtb3ZlQ29tbWFuZChjb21tYW5kSWQpO1xuICAgICAgICB9LFxuICAgICAgICBtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlXG4gICAgICB9KTtcbiAgICAgIGRpc3Bvc2FibGVzLnB1c2goZGlzcG9zYWJsZSk7XG4gICAgICAvLyBUaWUgcmVtb3ZhbCB0byB0aGUgY29tcG9uZW50J3MgdW5sb2FkLCBzbyBhIGNvbW1hbmQgbmV2ZXIgb3V0bGl2ZXMgdGhlIGNvbXBvbmVudC5cbiAgICAgIHRoaXMucmVnaXN0ZXIoKCkgPT4ge1xuICAgICAgICBkaXNwb3NhYmxlLmRpc3Bvc2UoKTtcbiAgICAgIH0pO1xuICAgICAgaW52b2tlQXN5bmNTYWZlbHkoKCkgPT4gY29tbWFuZEhhbmRsZXIub25SZWdpc3RlcmVkKGNvbnRleHQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IENvbWJpbmVEaXNwb3NhYmxlKHtcbiAgICAgIGRpc3Bvc2FibGVzLFxuICAgICAgbXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I6IE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLklnbm9yZVxuICAgIH0pO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFjQSxtQkFBa0M7QUFDbEMsd0JBSU87QUFDUCwwQkFBNEI7QUFnQnJCLE1BQU0sZ0NBQWdDLGdDQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJcEM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPWixZQUFZLFFBQWtEO0FBQ25FLFVBQU07QUFDTixTQUFLLHFCQUFxQixPQUFPO0FBQ2pDLFNBQUsscUJBQXFCLE9BQU87QUFDakMsU0FBSyxtQkFBbUIsT0FBTztBQUMvQixTQUFLLGFBQWEsT0FBTztBQUFBLEVBQzNCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFXTyx3QkFBd0IsaUJBQStDO0FBQzVFLFVBQU0sVUFBNkM7QUFBQSxNQUNqRCxvQkFBb0IsS0FBSztBQUFBLE1BQ3pCLG9CQUFvQixLQUFLO0FBQUEsTUFDekIsWUFBWSxLQUFLO0FBQUEsSUFDbkI7QUFFQSxVQUFNLGNBQTRCLENBQUM7QUFDbkMsZUFBVyxrQkFBa0IsaUJBQWlCO0FBQzVDLFlBQU0sVUFBVSxlQUFlLGFBQWE7QUFJNUMsWUFBTSxZQUFZLFFBQVE7QUFDMUIsV0FBSyxpQkFBaUIsV0FBVyxPQUFPO0FBQ3hDLFlBQU0sYUFBYSxJQUFJLHFDQUFtQjtBQUFBLFFBQ3hDLFVBQVUsTUFBWTtBQUNwQixlQUFLLGlCQUFpQixjQUFjLFNBQVM7QUFBQSxRQUMvQztBQUFBLFFBQ0EseUJBQXlCLDBDQUF3QjtBQUFBLE1BQ25ELENBQUM7QUFDRCxrQkFBWSxLQUFLLFVBQVU7QUFFM0IsV0FBSyxTQUFTLE1BQU07QUFDbEIsbUJBQVcsUUFBUTtBQUFBLE1BQ3JCLENBQUM7QUFDRCwwQ0FBa0IsTUFBTSxlQUFlLGFBQWEsT0FBTyxDQUFDO0FBQUEsSUFDOUQ7QUFFQSxXQUFPLElBQUksb0NBQWtCO0FBQUEsTUFDM0I7QUFBQSxNQUNBLHlCQUF5QiwwQ0FBd0I7QUFBQSxJQUNuRCxDQUFDO0FBQUEsRUFDSDtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
232
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbW1hbmQtaGFuZGxlcnMvY29tbWFuZC1oYW5kbGVyLWNvbXBvbmVudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbXBvbmVudCB0aGF0IHJlZ2lzdGVycyB7QGxpbmsgQ29tbWFuZEhhbmRsZXJ9cyB3aXRoIE9ic2lkaWFuIGFuZCB0aWVzIHRoZWlyIHJlbW92YWwgdG8gaXRzIGxpZmVjeWNsZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IERpc3Bvc2FibGVFeCB9IGZyb20gJy4uLy4uL2Rpc3Bvc2FibGUudHMnO1xuaW1wb3J0IHR5cGUgeyBBY3RpdmVGaWxlUHJvdmlkZXIgfSBmcm9tICcuLi9hY3RpdmUtZmlsZS1wcm92aWRlci50cyc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRSZWdpc3RyYXIgfSBmcm9tICcuLi9jb21tYW5kLXJlZ2lzdHJhci50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIEVkaXRvck1lbnVFdmVudEhhbmRsZXIsXG4gIEZpbGVNZW51RXZlbnRIYW5kbGVyLFxuICBGaWxlc01lbnVFdmVudEhhbmRsZXIsXG4gIE1lbnVFdmVudFJlZ2lzdHJhclxufSBmcm9tICcuLi9tZW51LWV2ZW50LXJlZ2lzdHJhci50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIENvbW1hbmRIYW5kbGVyLFxuICBDb21tYW5kSGFuZGxlclJlZ2lzdHJhdGlvbkNvbnRleHRcbn0gZnJvbSAnLi9jb21tYW5kLWhhbmRsZXIudHMnO1xuXG5pbXBvcnQgeyBpbnZva2VBc3luY1NhZmVseSB9IGZyb20gJy4uLy4uL2FzeW5jLnRzJztcbmltcG9ydCB7XG4gIENhbGxiYWNrRGlzcG9zYWJsZSxcbiAgQ29tYmluZURpc3Bvc2FibGUsXG4gIERpc3Bvc2FibGVCYXNlXG59IGZyb20gJy4uLy4uL2Rpc3Bvc2FibGUudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuLi9jb21wb25lbnRzL2NvbXBvbmVudC1leC50cyc7XG5cbmludGVyZmFjZSBDb21tYW5kSGFuZGxlckNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWN0aXZlRmlsZVByb3ZpZGVyOiBBY3RpdmVGaWxlUHJvdmlkZXI7XG4gIHJlYWRvbmx5IGNvbW1hbmRSZWdpc3RyYXI6IENvbW1hbmRSZWdpc3RyYXI7XG4gIHJlYWRvbmx5IG1lbnVFdmVudFJlZ2lzdHJhcjogTWVudUV2ZW50UmVnaXN0cmFyO1xuICByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBwZXItY29tbWFuZCB7QGxpbmsgTWVudUV2ZW50UmVnaXN0cmFyfSB0aGF0IGRlbGVnYXRlcyB0byBhIHNoYXJlZCByZWdpc3RyYXIgd2hpbGUgY29sbGVjdGluZyB0aGVcbiAqIHtAbGluayBEaXNwb3NhYmxlRXh9IGVhY2ggcmVnaXN0cmF0aW9uIHJldHVybnMsIHNvIGRpc3Bvc2luZyB0aGlzIHNjb3BlIHVucmVnaXN0ZXJzIGV4YWN0bHkgdGhhdCBjb21tYW5kJ3NcbiAqIG1lbnUgZXZlbnRzLiBCZWNhdXNlIHtAbGluayBDb21tYW5kSGFuZGxlci5vblJlZ2lzdGVyZWR9IHJ1bnMgZmlyZS1hbmQtZm9yZ2V0IChpdCBtYXkgcmVnaXN0ZXIgbWVudSBldmVudHNcbiAqIGFmdGVyIHRoaXMgc2NvcGUgaGFzIGFscmVhZHkgYmVlbiBkaXNwb3NlZCksIGEgcmVnaXN0cmF0aW9uIHRoYXQgYXJyaXZlcyBwb3N0LWRpc3Bvc2UgaXMgZGlzcG9zZWQgaW1tZWRpYXRlbHlcbiAqIGluc3RlYWQgb2YgbGVha2luZy5cbiAqL1xuY2xhc3MgQ29tbWFuZE1lbnVFdmVudFNjb3BlIGV4dGVuZHMgRGlzcG9zYWJsZUJhc2UgaW1wbGVtZW50cyBNZW51RXZlbnRSZWdpc3RyYXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGRpc3Bvc2FibGVzOiBEaXNwb3NhYmxlRXhbXSA9IFtdO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGlubmVyOiBNZW51RXZlbnRSZWdpc3RyYXIpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyRWRpdG9yTWVudUV2ZW50SGFuZGxlcihoYW5kbGVyOiBFZGl0b3JNZW51RXZlbnRIYW5kbGVyKTogRGlzcG9zYWJsZUV4IHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0KHRoaXMuaW5uZXIucmVnaXN0ZXJFZGl0b3JNZW51RXZlbnRIYW5kbGVyKGhhbmRsZXIpKTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlckZpbGVNZW51RXZlbnRIYW5kbGVyKGhhbmRsZXI6IEZpbGVNZW51RXZlbnRIYW5kbGVyKTogRGlzcG9zYWJsZUV4IHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0KHRoaXMuaW5uZXIucmVnaXN0ZXJGaWxlTWVudUV2ZW50SGFuZGxlcihoYW5kbGVyKSk7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJGaWxlc01lbnVFdmVudEhhbmRsZXIoaGFuZGxlcjogRmlsZXNNZW51RXZlbnRIYW5kbGVyKTogRGlzcG9zYWJsZUV4IHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0KHRoaXMuaW5uZXIucmVnaXN0ZXJGaWxlc01lbnVFdmVudEhhbmRsZXIoaGFuZGxlcikpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHBlcmZvcm1EaXNwb3NlKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZGlzcG9zYWJsZSBvZiB0aGlzLmRpc3Bvc2FibGVzKSB7XG4gICAgICBkaXNwb3NhYmxlLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgdGhpcy5kaXNwb3NhYmxlcy5sZW5ndGggPSAwO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2xsZWN0KGRpc3Bvc2FibGU6IERpc3Bvc2FibGVFeCk6IERpc3Bvc2FibGVFeCB7XG4gICAgaWYgKHRoaXMuaXNEaXNwb3NlZCkge1xuICAgICAgZGlzcG9zYWJsZS5kaXNwb3NlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzcG9zYWJsZXMucHVzaChkaXNwb3NhYmxlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGlzcG9zYWJsZTtcbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVycyB7QGxpbmsgQ29tbWFuZEhhbmRsZXJ9cyB3aXRoIE9ic2lkaWFuIGFuZCBtYW5hZ2VzIHRoZWlyIGxpZmVjeWNsZS5cbiAqXG4gKiBDYWxsIHtAbGluayByZWdpc3RlckNvbW1hbmRIYW5kbGVyc30gdG8gcmVnaXN0ZXIgYSBiYXRjaCBvZiBoYW5kbGVycyBvbiBkZW1hbmQgKGFzIG1hbnkgdGltZXMgYXNcbiAqIG5lZWRlZCB3aGlsZSB0aGUgY29tcG9uZW50IGlzIGFsaXZlKTsgZGlzcG9zZSB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGVFeH0gdG8gdW5yZWdpc3RlciBleGFjdGx5XG4gKiB0aG9zZSBoYW5kbGVycyBcdTIwMTQgaW5jbHVkaW5nIGFueSBtZW51IGV2ZW50cyB0aGV5IHJlZ2lzdGVyZWQgXHUyMDE0IG9yIGxldCB0aGUgY29tcG9uZW50IHVubG9hZCB0byByZW1vdmUgZXZlcnlcbiAqIGNvbW1hbmQgc3RpbGwgcmVnaXN0ZXJlZCB0aHJvdWdoIGl0LlxuICovXG5leHBvcnQgY2xhc3MgQ29tbWFuZEhhbmRsZXJDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIC8qKlxuICAgKiBQcm92aWRlciBmb3IgYWNjZXNzaW5nIHRoZSBjdXJyZW50bHkgYWN0aXZlIGZpbGUuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYWN0aXZlRmlsZVByb3ZpZGVyOiBBY3RpdmVGaWxlUHJvdmlkZXI7XG5cbiAgLyoqXG4gICAqIFJlZ2lzdHJhciB1c2VkIHRvIGFkZCBhbmQgcmVtb3ZlIGNvbW1hbmRzIHdpdGggT2JzaWRpYW4uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29tbWFuZFJlZ2lzdHJhcjogQ29tbWFuZFJlZ2lzdHJhcjtcblxuICAvKipcbiAgICogUmVnaXN0cmFyIGZvciBtZW51IGV2ZW50IGhhbmRsZXJzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG1lbnVFdmVudFJlZ2lzdHJhcjogTWVudUV2ZW50UmVnaXN0cmFyO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgcGx1Z2luIHRoYXQgb3ducyB0aGUgY29tbWFuZHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGNvbW1hbmQgaGFuZGxlciBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY29uc3RydWN0b3IgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IENvbW1hbmRIYW5kbGVyQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYWN0aXZlRmlsZVByb3ZpZGVyID0gcGFyYW1zLmFjdGl2ZUZpbGVQcm92aWRlcjtcbiAgICB0aGlzLm1lbnVFdmVudFJlZ2lzdHJhciA9IHBhcmFtcy5tZW51RXZlbnRSZWdpc3RyYXI7XG4gICAgdGhpcy5jb21tYW5kUmVnaXN0cmFyID0gcGFyYW1zLmNvbW1hbmRSZWdpc3RyYXI7XG4gICAgdGhpcy5wbHVnaW5OYW1lID0gcGFyYW1zLnBsdWdpbk5hbWU7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIHRoZSBnaXZlbiBjb21tYW5kIGhhbmRsZXJzIHdpdGggT2JzaWRpYW4gYW5kIHByb3ZpZGVzIGVhY2ggaXRzIG93biBydW50aW1lIHJlZ2lzdHJhdGlvblxuICAgKiBjb250ZXh0LiBFYWNoIGhhbmRsZXIncyBjb21tYW5kIGlzIGFkZGVkIGltbWVkaWF0ZWx5OyB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGVFeH0gcmVtb3ZlcyB0aGVcbiAgICogY29tbWFuZHMgcmVnaXN0ZXJlZCBieSB0aGlzIGNhbGwgXHUyMDE0IGFuZCBhbnkgbWVudSBldmVudHMgdGhvc2UgaGFuZGxlcnMgcmVnaXN0ZXJlZCB2aWEgdGhlaXIgY29udGV4dCdzXG4gICAqIHtAbGluayBNZW51RXZlbnRSZWdpc3RyYXJ9IFx1MjAxNCB3aGVuIGRpc3Bvc2VkLiBBbnkgY29tbWFuZCBzdGlsbCByZWdpc3RlcmVkIHdoZW4gdGhlIGNvbXBvbmVudCB1bmxvYWRzIGlzXG4gICAqIHJlbW92ZWQgYXV0b21hdGljYWxseS5cbiAgICpcbiAgICogQHBhcmFtIGNvbW1hbmRIYW5kbGVycyAtIFRoZSBjb21tYW5kIGhhbmRsZXJzIHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBEaXNwb3NhYmxlRXh9IHRoYXQgdW5yZWdpc3RlcnMgdGhlIGhhbmRsZXJzIChjb21tYW5kcyArIG1lbnUgZXZlbnRzKSBwYXNzZWQgdG8gdGhpcyBjYWxsLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyQ29tbWFuZEhhbmRsZXJzKGNvbW1hbmRIYW5kbGVyczogQ29tbWFuZEhhbmRsZXJbXSk6IERpc3Bvc2FibGVFeCB7XG4gICAgY29uc3QgZGlzcG9zYWJsZXM6IERpc3Bvc2FibGVbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY29tbWFuZEhhbmRsZXIgb2YgY29tbWFuZEhhbmRsZXJzKSB7XG4gICAgICBjb25zdCBjb21tYW5kID0gY29tbWFuZEhhbmRsZXIuYnVpbGRDb21tYW5kKCk7XG4gICAgICAvLyBDYXB0dXJlIHRoZSBpZCBiZWZvcmUgcmVnaXN0ZXJpbmcuIGBQbHVnaW4uYWRkQ29tbWFuZGAgbXV0YXRlcyBgY29tbWFuZC5pZGAgKHByZWZpeGluZyBpdCB3aXRoXG4gICAgICAvLyBgdGhpcy5tYW5pZmVzdC5pZGApLCB3aGlsZSBgUGx1Z2luLnJlbW92ZUNvbW1hbmRgIHJlLXByZWZpeGVzIFx1MjAxNCBzbyByZW1vdmFsIG5lZWRzIHRoZSBvcmlnaW5hbCBpZC5cbiAgICAgIC8vIFJlYWRpbmcgYGNvbW1hbmQuaWRgIGFmdGVyIGBhZGRDb21tYW5kYCB3b3VsZCBkb3VibGUtcHJlZml4IGl0LCBzbyB0aGUgY29tbWFuZCBpcyBuZXZlciByZW1vdmVkLlxuICAgICAgY29uc3QgY29tbWFuZElkID0gY29tbWFuZC5pZDtcbiAgICAgIHRoaXMuY29tbWFuZFJlZ2lzdHJhci5hZGRDb21tYW5kKGNvbW1hbmQpO1xuXG4gICAgICAvLyBFYWNoIGNvbW1hbmQgZ2V0cyBpdHMgb3duIHJlZ2lzdHJhdGlvbiBjb250ZXh0IHdpdGggYSBwZXItY29tbWFuZCBtZW51LWV2ZW50IHNjb3BlLCBzbyBkaXNwb3Npbmcgb25lXG4gICAgICAvLyBDb21tYW5kIHRlYXJzIGRvd24gaXRzIG93biBtZW51IGV2ZW50cyB3aXRob3V0IGFmZmVjdGluZyB0aGUgb3RoZXJzLlxuICAgICAgY29uc3QgbWVudUV2ZW50U2NvcGUgPSBuZXcgQ29tbWFuZE1lbnVFdmVudFNjb3BlKHRoaXMubWVudUV2ZW50UmVnaXN0cmFyKTtcbiAgICAgIGNvbnN0IGNvbnRleHQ6IENvbW1hbmRIYW5kbGVyUmVnaXN0cmF0aW9uQ29udGV4dCA9IHtcbiAgICAgICAgYWN0aXZlRmlsZVByb3ZpZGVyOiB0aGlzLmFjdGl2ZUZpbGVQcm92aWRlcixcbiAgICAgICAgbWVudUV2ZW50UmVnaXN0cmFyOiBtZW51RXZlbnRTY29wZSxcbiAgICAgICAgcGx1Z2luTmFtZTogdGhpcy5wbHVnaW5OYW1lXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBkaXNwb3NhYmxlID0gbmV3IENhbGxiYWNrRGlzcG9zYWJsZSh7XG4gICAgICAgIGNhbGxiYWNrOiAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgdGhpcy5jb21tYW5kUmVnaXN0cmFyLnJlbW92ZUNvbW1hbmQoY29tbWFuZElkKTtcbiAgICAgICAgICBtZW51RXZlbnRTY29wZS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gVGllIHJlbW92YWwgdG8gdGhlIGNvbXBvbmVudCdzIHVubG9hZCwgc28gYSBjb21tYW5kIG5ldmVyIG91dGxpdmVzIHRoZSBjb21wb25lbnQuXG4gICAgICBkaXNwb3NhYmxlcy5wdXNoKHRoaXMucmVnaXN0ZXJEaXNwb3NhYmxlKGRpc3Bvc2FibGUpKTtcbiAgICAgIGludm9rZUFzeW5jU2FmZWx5KCgpID0+IGNvbW1hbmRIYW5kbGVyLm9uUmVnaXN0ZXJlZChjb250ZXh0KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBDb21iaW5lRGlzcG9zYWJsZSh7IGRpc3Bvc2FibGVzIH0pO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFvQkEsbUJBQWtDO0FBQ2xDLHdCQUlPO0FBQ1AsMEJBQTRCO0FBZ0I1QixNQUFNLDhCQUE4QixpQ0FBNkM7QUFBQSxFQUd4RSxZQUE2QixPQUEyQjtBQUM3RCxVQUFNO0FBRDRCO0FBQUEsRUFFcEM7QUFBQSxFQUZvQztBQUFBLEVBRm5CLGNBQThCLENBQUM7QUFBQSxFQU16QywrQkFBK0IsU0FBK0M7QUFDbkYsV0FBTyxLQUFLLFFBQVEsS0FBSyxNQUFNLCtCQUErQixPQUFPLENBQUM7QUFBQSxFQUN4RTtBQUFBLEVBRU8sNkJBQTZCLFNBQTZDO0FBQy9FLFdBQU8sS0FBSyxRQUFRLEtBQUssTUFBTSw2QkFBNkIsT0FBTyxDQUFDO0FBQUEsRUFDdEU7QUFBQSxFQUVPLDhCQUE4QixTQUE4QztBQUNqRixXQUFPLEtBQUssUUFBUSxLQUFLLE1BQU0sOEJBQThCLE9BQU8sQ0FBQztBQUFBLEVBQ3ZFO0FBQUEsRUFFbUIsaUJBQXVCO0FBQ3hDLGVBQVcsY0FBYyxLQUFLLGFBQWE7QUFDekMsaUJBQVcsUUFBUTtBQUFBLElBQ3JCO0FBQ0EsU0FBSyxZQUFZLFNBQVM7QUFBQSxFQUM1QjtBQUFBLEVBRVEsUUFBUSxZQUF3QztBQUN0RCxRQUFJLEtBQUssWUFBWTtBQUNuQixpQkFBVyxRQUFRO0FBQUEsSUFDckIsT0FBTztBQUNMLFdBQUssWUFBWSxLQUFLLFVBQVU7QUFBQSxJQUNsQztBQUVBLFdBQU87QUFBQSxFQUNUO0FBQ0Y7QUFVTyxNQUFNLGdDQUFnQyxnQ0FBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSXBDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0E7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT1osWUFBWSxRQUFrRDtBQUNuRSxVQUFNO0FBQ04sU0FBSyxxQkFBcUIsT0FBTztBQUNqQyxTQUFLLHFCQUFxQixPQUFPO0FBQ2pDLFNBQUssbUJBQW1CLE9BQU87QUFDL0IsU0FBSyxhQUFhLE9BQU87QUFBQSxFQUMzQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFZTyx3QkFBd0IsaUJBQWlEO0FBQzlFLFVBQU0sY0FBNEIsQ0FBQztBQUNuQyxlQUFXLGtCQUFrQixpQkFBaUI7QUFDNUMsWUFBTSxVQUFVLGVBQWUsYUFBYTtBQUk1QyxZQUFNLFlBQVksUUFBUTtBQUMxQixXQUFLLGlCQUFpQixXQUFXLE9BQU87QUFJeEMsWUFBTSxpQkFBaUIsSUFBSSxzQkFBc0IsS0FBSyxrQkFBa0I7QUFDeEUsWUFBTSxVQUE2QztBQUFBLFFBQ2pELG9CQUFvQixLQUFLO0FBQUEsUUFDekIsb0JBQW9CO0FBQUEsUUFDcEIsWUFBWSxLQUFLO0FBQUEsTUFDbkI7QUFFQSxZQUFNLGFBQWEsSUFBSSxxQ0FBbUI7QUFBQSxRQUN4QyxVQUFVLE1BQVk7QUFDcEIsZUFBSyxpQkFBaUIsY0FBYyxTQUFTO0FBQzdDLHlCQUFlLFFBQVE7QUFBQSxRQUN6QjtBQUFBLE1BQ0YsQ0FBQztBQUVELGtCQUFZLEtBQUssS0FBSyxtQkFBbUIsVUFBVSxDQUFDO0FBQ3BELDBDQUFrQixNQUFNLGVBQWUsYUFBYSxPQUFPLENBQUM7QUFBQSxJQUM5RDtBQUVBLFdBQU8sSUFBSSxvQ0FBa0IsRUFBRSxZQUFZLENBQUM7QUFBQSxFQUM5QztBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -4,6 +4,7 @@
4
4
  *
5
5
  * Component that registers {@link CommandHandler}s with Obsidian and ties their removal to its lifecycle.
6
6
  */
7
+ import type { DisposableEx } from '../../disposable.cjs';
7
8
  import type { ActiveFileProvider } from '../active-file-provider.cjs';
8
9
  import type { CommandRegistrar } from '../command-registrar.cjs';
9
10
  import type { MenuEventRegistrar } from '../menu-event-registrar.cjs';
@@ -19,8 +20,9 @@ interface CommandHandlerComponentConstructorParams {
19
20
  * Registers {@link CommandHandler}s with Obsidian and manages their lifecycle.
20
21
  *
21
22
  * Call {@link registerCommandHandlers} to register a batch of handlers on demand (as many times as
22
- * needed while the component is alive); dispose the returned {@link Disposable} to unregister exactly
23
- * those handlers, or let the component unload to remove every command still registered through it.
23
+ * needed while the component is alive); dispose the returned {@link DisposableEx} to unregister exactly
24
+ * those handlers — including any menu events they registered — or let the component unload to remove every
25
+ * command still registered through it.
24
26
  */
25
27
  export declare class CommandHandlerComponent extends ComponentEx {
26
28
  /**
@@ -46,14 +48,15 @@ export declare class CommandHandlerComponent extends ComponentEx {
46
48
  */
47
49
  constructor(params: CommandHandlerComponentConstructorParams);
48
50
  /**
49
- * Registers the given command handlers with Obsidian and provides each its runtime registration
50
- * context. Each handler's command is added immediately; the returned {@link Disposable} removes the
51
- * commands registered by this call when disposed. Any command still registered when the component
52
- * unloads is removed automatically.
51
+ * Registers the given command handlers with Obsidian and provides each its own runtime registration
52
+ * context. Each handler's command is added immediately; the returned {@link DisposableEx} removes the
53
+ * commands registered by this call and any menu events those handlers registered via their context's
54
+ * {@link MenuEventRegistrar} when disposed. Any command still registered when the component unloads is
55
+ * removed automatically.
53
56
  *
54
57
  * @param commandHandlers - The command handlers to register.
55
- * @returns A {@link Disposable} that unregisters the handlers passed to this call.
58
+ * @returns A {@link DisposableEx} that unregisters the handlers (commands + menu events) passed to this call.
56
59
  */
57
- registerCommandHandlers(commandHandlers: CommandHandler[]): Disposable;
60
+ registerCommandHandlers(commandHandlers: CommandHandler[]): DisposableEx;
58
61
  }
59
62
  export {};
@@ -172,7 +172,7 @@ class OpenDemoVaultCommandHandler extends import_global_command_handler.GlobalCo
172
172
  * Executes the command, opening the plugin's demo vault.
173
173
  */
174
174
  async execute() {
175
- const { openDemoVault } = await import("../desktop-demo-vault-opener.ts");
175
+ const { openDemoVault } = await import("../desktop-demo-vault-opener.cjs");
176
176
  await openDemoVault({
177
177
  app: this.app,
178
178
  manifest: this.manifest,