obsidian-dev-utils 88.2.0 → 88.4.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 (97) hide show
  1. package/CHANGELOG.md +22 -4
  2. package/dist/lib/cjs/__merged.cjs +27 -1
  3. package/dist/lib/cjs/__merged.d.cts +8 -4
  4. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  5. package/dist/lib/cjs/html-element.cjs +7 -1
  6. package/dist/lib/cjs/html-element.d.cts +12 -0
  7. package/dist/lib/cjs/obsidian/attachment-path.cjs +10 -5
  8. package/dist/lib/cjs/obsidian/attachment-path.d.cts +11 -1
  9. package/dist/lib/cjs/obsidian/components/index.cjs +4 -1
  10. package/dist/lib/cjs/obsidian/components/index.d.cts +1 -0
  11. package/dist/lib/cjs/obsidian/components/pointer-position-component.cjs +159 -0
  12. package/dist/lib/cjs/obsidian/components/pointer-position-component.d.cts +29 -0
  13. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +35 -5
  14. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.d.cts +7 -0
  15. package/dist/lib/cjs/obsidian/css-class.cjs +2 -1
  16. package/dist/lib/cjs/obsidian/css-class.d.cts +4 -0
  17. package/dist/lib/cjs/obsidian/file-system.cjs +20 -1
  18. package/dist/lib/cjs/obsidian/file-system.d.cts +25 -0
  19. package/dist/lib/cjs/obsidian/i18n/locales/en.cjs +4 -1
  20. package/dist/lib/cjs/obsidian/i18n/locales/en.d.cts +3 -0
  21. package/dist/lib/cjs/obsidian/i18n/locales/translations-map.d.cts +3 -0
  22. package/dist/lib/cjs/obsidian/index.cjs +7 -1
  23. package/dist/lib/cjs/obsidian/index.d.cts +2 -0
  24. package/dist/lib/cjs/obsidian/link-update-progress.cjs +124 -0
  25. package/dist/lib/cjs/obsidian/link-update-progress.d.cts +32 -0
  26. package/dist/lib/cjs/obsidian/link.cjs +11 -2
  27. package/dist/lib/cjs/obsidian/link.d.cts +6 -0
  28. package/dist/lib/cjs/obsidian/path-settings.cjs +19 -5
  29. package/dist/lib/cjs/obsidian/path-settings.d.cts +13 -1
  30. package/dist/lib/cjs/obsidian/popovers/field-popover.cjs +175 -0
  31. package/dist/lib/cjs/obsidian/popovers/field-popover.d.cts +75 -0
  32. package/dist/lib/cjs/obsidian/popovers/index.cjs +152 -0
  33. package/dist/lib/cjs/obsidian/popovers/index.d.cts +4 -0
  34. package/dist/lib/cjs/obsidian/popovers/popover-anchor.cjs +178 -0
  35. package/dist/lib/cjs/obsidian/popovers/popover-anchor.d.cts +67 -0
  36. package/dist/lib/cjs/obsidian/popovers/popover.cjs +221 -0
  37. package/dist/lib/cjs/obsidian/popovers/popover.d.cts +78 -0
  38. package/dist/lib/cjs/obsidian/resource-lock.cjs +6 -1
  39. package/dist/lib/cjs/obsidian/resource-lock.d.cts +15 -0
  40. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.cjs +2 -1
  41. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.d.cts +2 -0
  42. package/dist/lib/cjs/script-utils/version.cjs +11 -2
  43. package/dist/lib/cjs/script-utils/version.d.cts +14 -0
  44. package/dist/lib/esm/__merged.d.mts +8 -4
  45. package/dist/lib/esm/__merged.mjs +28 -2
  46. package/dist/lib/esm/generated-during-build.mjs +2 -2
  47. package/dist/lib/esm/html-element.d.mts +12 -0
  48. package/dist/lib/esm/html-element.mjs +6 -1
  49. package/dist/lib/esm/obsidian/attachment-path.d.mts +11 -1
  50. package/dist/lib/esm/obsidian/attachment-path.mjs +11 -5
  51. package/dist/lib/esm/obsidian/components/index.d.mts +1 -0
  52. package/dist/lib/esm/obsidian/components/index.mjs +3 -1
  53. package/dist/lib/esm/obsidian/components/pointer-position-component.d.mts +29 -0
  54. package/dist/lib/esm/obsidian/components/pointer-position-component.mjs +51 -0
  55. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.d.mts +7 -0
  56. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +35 -5
  57. package/dist/lib/esm/obsidian/css-class.d.mts +4 -0
  58. package/dist/lib/esm/obsidian/css-class.mjs +2 -1
  59. package/dist/lib/esm/obsidian/file-system.d.mts +25 -0
  60. package/dist/lib/esm/obsidian/file-system.mjs +20 -1
  61. package/dist/lib/esm/obsidian/i18n/locales/en.d.mts +3 -0
  62. package/dist/lib/esm/obsidian/i18n/locales/en.mjs +4 -1
  63. package/dist/lib/esm/obsidian/i18n/locales/translations-map.d.mts +3 -0
  64. package/dist/lib/esm/obsidian/index.d.mts +2 -0
  65. package/dist/lib/esm/obsidian/index.mjs +5 -1
  66. package/dist/lib/esm/obsidian/link-update-progress.d.mts +32 -0
  67. package/dist/lib/esm/obsidian/link-update-progress.mjs +24 -0
  68. package/dist/lib/esm/obsidian/link.d.mts +6 -0
  69. package/dist/lib/esm/obsidian/link.mjs +11 -2
  70. package/dist/lib/esm/obsidian/path-settings.d.mts +13 -1
  71. package/dist/lib/esm/obsidian/path-settings.mjs +18 -4
  72. package/dist/lib/esm/obsidian/popovers/field-popover.d.mts +75 -0
  73. package/dist/lib/esm/obsidian/popovers/field-popover.mjs +70 -0
  74. package/dist/lib/esm/obsidian/popovers/index.d.mts +4 -0
  75. package/dist/lib/esm/obsidian/popovers/index.mjs +32 -0
  76. package/dist/lib/esm/obsidian/popovers/popover-anchor.d.mts +67 -0
  77. package/dist/lib/esm/obsidian/popovers/popover-anchor.mjs +67 -0
  78. package/dist/lib/esm/obsidian/popovers/popover.d.mts +78 -0
  79. package/dist/lib/esm/obsidian/popovers/popover.mjs +113 -0
  80. package/dist/lib/esm/obsidian/resource-lock.d.mts +15 -0
  81. package/dist/lib/esm/obsidian/resource-lock.mjs +5 -1
  82. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +2 -0
  83. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +2 -1
  84. package/dist/lib/esm/script-utils/version.d.mts +14 -0
  85. package/dist/lib/esm/script-utils/version.mjs +10 -2
  86. package/dist/styles.css +25 -1
  87. package/obsidian/components/pointer-position-component/package.json +6 -0
  88. package/obsidian/link-update-progress/package.json +6 -0
  89. package/obsidian/popovers/field-popover/package.json +6 -0
  90. package/obsidian/popovers/index/package.json +6 -0
  91. package/obsidian/popovers/package.json +6 -0
  92. package/obsidian/popovers/popover/package.json +6 -0
  93. package/obsidian/popovers/popover-anchor/package.json +6 -0
  94. package/package.json +43 -17
  95. package/patches/brace-expansion-callable/package.json +8 -0
  96. package/dist/dev/main.js +0 -37725
  97. package/dist/dev/manifest.json +0 -9
@@ -0,0 +1,75 @@
1
+ /// <reference path="../../library.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Utility for editing a handful of named text fields in a popover anchored at a point.
6
+ *
7
+ * This is to {@link showPopover} what `modals/prompt.ts` is to `modals/modal.ts`: the common case
8
+ * spelled declaratively, so a caller that only needs a few text fields never writes any DOM wiring.
9
+ * Anything richer — a dropdown, a toggle, rendered markdown — goes through {@link showPopover}
10
+ * directly.
11
+ */
12
+ import type { PopoverAnchor } from './popover-anchor.mjs';
13
+ /**
14
+ * Parameters for {@link editFieldsInPopover}.
15
+ *
16
+ * @typeParam Key - The union of the field keys, inferred from {@link EditFieldsInPopoverParams.fields}.
17
+ */
18
+ export interface EditFieldsInPopoverParams<Key extends string> {
19
+ /**
20
+ * Where to place the popover.
21
+ */
22
+ readonly anchor: PopoverAnchor;
23
+ /**
24
+ * A text for the "Cancel" button.
25
+ */
26
+ readonly cancelButtonText?: string;
27
+ /**
28
+ * Additional CSS classes to apply to the popover.
29
+ */
30
+ readonly cssClasses?: string[];
31
+ /**
32
+ * The fields to edit, rendered top to bottom in the given order.
33
+ */
34
+ readonly fields: readonly PopoverField<Key>[];
35
+ /**
36
+ * A text for the "OK" button.
37
+ */
38
+ readonly okButtonText?: string;
39
+ }
40
+ /**
41
+ * A single text field of a {@link editFieldsInPopover} popover.
42
+ *
43
+ * @typeParam Key - The key the field's value is returned under.
44
+ */
45
+ export interface PopoverField<Key extends string> {
46
+ /**
47
+ * A value to pre-fill the field with.
48
+ *
49
+ * @default `''`
50
+ */
51
+ readonly defaultValue?: string;
52
+ /**
53
+ * The key the field's value is returned under.
54
+ */
55
+ readonly key: Key;
56
+ /**
57
+ * The label shown next to the field.
58
+ */
59
+ readonly name: string;
60
+ /**
61
+ * A placeholder text for the field.
62
+ *
63
+ * @default `''`
64
+ */
65
+ readonly placeholder?: string;
66
+ }
67
+ /**
68
+ * Displays a popover with a text field per entry in `fields` and resolves with their values keyed by
69
+ * {@link PopoverField.key}, or `null` if it was dismissed without confirming.
70
+ *
71
+ * @typeParam Key - The union of the field keys, inferred from the `fields` array.
72
+ * @param params - The parameters for the popover.
73
+ * @returns A {@link Promise} that resolves with the edited values, or `null` if dismissed.
74
+ */
75
+ export declare function editFieldsInPopover<Key extends string>(params: EditFieldsInPopoverParams<Key>): Promise<null | Record<Key, string>>;
@@ -0,0 +1,70 @@
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 initEsm() {
7
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
8
+ if (globalThis.process) {
9
+ return;
10
+ }
11
+
12
+ const browserProcess = {
13
+ browser: true,
14
+ cwd() {
15
+ return '/';
16
+ },
17
+ env: {},
18
+ platform: 'android'
19
+ };
20
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
21
+ globalThis.process = browserProcess;
22
+ })();
23
+
24
+ import {
25
+ Setting,
26
+ TextComponent
27
+ } from "obsidian";
28
+ import { normalizeOptionalProperties } from "../../object-utils.mjs";
29
+ import { CssClass } from "../css-class.mjs";
30
+ import { showPopover } from "./popover.mjs";
31
+ async function editFieldsInPopover(params) {
32
+ const {
33
+ anchor,
34
+ cancelButtonText,
35
+ cssClasses,
36
+ fields,
37
+ okButtonText
38
+ } = params;
39
+ return await showPopover(normalizeOptionalProperties({
40
+ anchor,
41
+ build({ contentEl }) {
42
+ const editors = fields.map((field) => ({
43
+ key: field.key,
44
+ textComponent: addField(contentEl, field)
45
+ }));
46
+ return () => {
47
+ const values = {};
48
+ for (const editor of editors) {
49
+ values[editor.key] = editor.textComponent.getValue();
50
+ }
51
+ return values;
52
+ };
53
+ },
54
+ cancelButtonText,
55
+ cssClasses,
56
+ okButtonText
57
+ }));
58
+ }
59
+ function addField(containerEl, field) {
60
+ const setting = new Setting(containerEl).setName(field.name);
61
+ const textComponent = new TextComponent(setting.controlEl);
62
+ textComponent.setValue(field.defaultValue ?? "");
63
+ textComponent.setPlaceholder(field.placeholder ?? "");
64
+ textComponent.inputEl.addClass(CssClass.TextBox);
65
+ return textComponent;
66
+ }
67
+ export {
68
+ editFieldsInPopover
69
+ };
70
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BvcG92ZXJzL2ZpZWxkLXBvcG92ZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBVdGlsaXR5IGZvciBlZGl0aW5nIGEgaGFuZGZ1bCBvZiBuYW1lZCB0ZXh0IGZpZWxkcyBpbiBhIHBvcG92ZXIgYW5jaG9yZWQgYXQgYSBwb2ludC5cbiAqXG4gKiBUaGlzIGlzIHRvIHtAbGluayBzaG93UG9wb3Zlcn0gd2hhdCBgbW9kYWxzL3Byb21wdC50c2AgaXMgdG8gYG1vZGFscy9tb2RhbC50c2A6IHRoZSBjb21tb24gY2FzZVxuICogc3BlbGxlZCBkZWNsYXJhdGl2ZWx5LCBzbyBhIGNhbGxlciB0aGF0IG9ubHkgbmVlZHMgYSBmZXcgdGV4dCBmaWVsZHMgbmV2ZXIgd3JpdGVzIGFueSBET00gd2lyaW5nLlxuICogQW55dGhpbmcgcmljaGVyIFx1MjAxNCBhIGRyb3Bkb3duLCBhIHRvZ2dsZSwgcmVuZGVyZWQgbWFya2Rvd24gXHUyMDE0IGdvZXMgdGhyb3VnaCB7QGxpbmsgc2hvd1BvcG92ZXJ9XG4gKiBkaXJlY3RseS5cbiAqL1xuXG5pbXBvcnQge1xuICBTZXR0aW5nLFxuICBUZXh0Q29tcG9uZW50XG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBQb3BvdmVyQW5jaG9yIH0gZnJvbSAnLi9wb3BvdmVyLWFuY2hvci50cyc7XG5pbXBvcnQgdHlwZSB7IFNob3dQb3BvdmVyUGFyYW1zIH0gZnJvbSAnLi9wb3BvdmVyLnRzJztcblxuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vLi4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7IHNob3dQb3BvdmVyIH0gZnJvbSAnLi9wb3BvdmVyLnRzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZWRpdEZpZWxkc0luUG9wb3Zlcn0uXG4gKlxuICogQHR5cGVQYXJhbSBLZXkgLSBUaGUgdW5pb24gb2YgdGhlIGZpZWxkIGtleXMsIGluZmVycmVkIGZyb20ge0BsaW5rIEVkaXRGaWVsZHNJblBvcG92ZXJQYXJhbXMuZmllbGRzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFZGl0RmllbGRzSW5Qb3BvdmVyUGFyYW1zPEtleSBleHRlbmRzIHN0cmluZz4ge1xuICAvKipcbiAgICogV2hlcmUgdG8gcGxhY2UgdGhlIHBvcG92ZXIuXG4gICAqL1xuICByZWFkb25seSBhbmNob3I6IFBvcG92ZXJBbmNob3I7XG5cbiAgLyoqXG4gICAqIEEgdGV4dCBmb3IgdGhlIFwiQ2FuY2VsXCIgYnV0dG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FuY2VsQnV0dG9uVGV4dD86IHN0cmluZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBDU1MgY2xhc3NlcyB0byBhcHBseSB0byB0aGUgcG9wb3Zlci5cbiAgICovXG4gIHJlYWRvbmx5IGNzc0NsYXNzZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGZpZWxkcyB0byBlZGl0LCByZW5kZXJlZCB0b3AgdG8gYm90dG9tIGluIHRoZSBnaXZlbiBvcmRlci5cbiAgICovXG4gIHJlYWRvbmx5IGZpZWxkczogcmVhZG9ubHkgUG9wb3ZlckZpZWxkPEtleT5bXTtcblxuICAvKipcbiAgICogQSB0ZXh0IGZvciB0aGUgXCJPS1wiIGJ1dHRvbi5cbiAgICovXG4gIHJlYWRvbmx5IG9rQnV0dG9uVGV4dD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHNpbmdsZSB0ZXh0IGZpZWxkIG9mIGEge0BsaW5rIGVkaXRGaWVsZHNJblBvcG92ZXJ9IHBvcG92ZXIuXG4gKlxuICogQHR5cGVQYXJhbSBLZXkgLSBUaGUga2V5IHRoZSBmaWVsZCdzIHZhbHVlIGlzIHJldHVybmVkIHVuZGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBvcG92ZXJGaWVsZDxLZXkgZXh0ZW5kcyBzdHJpbmc+IHtcbiAgLyoqXG4gICAqIEEgdmFsdWUgdG8gcHJlLWZpbGwgdGhlIGZpZWxkIHdpdGguXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnJ2BcbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRWYWx1ZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGtleSB0aGUgZmllbGQncyB2YWx1ZSBpcyByZXR1cm5lZCB1bmRlci5cbiAgICovXG4gIHJlYWRvbmx5IGtleTogS2V5O1xuXG4gIC8qKlxuICAgKiBUaGUgbGFiZWwgc2hvd24gbmV4dCB0byB0aGUgZmllbGQuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgcGxhY2Vob2xkZXIgdGV4dCBmb3IgdGhlIGZpZWxkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJydgXG4gICAqL1xuICByZWFkb25seSBwbGFjZWhvbGRlcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBEaXNwbGF5cyBhIHBvcG92ZXIgd2l0aCBhIHRleHQgZmllbGQgcGVyIGVudHJ5IGluIGBmaWVsZHNgIGFuZCByZXNvbHZlcyB3aXRoIHRoZWlyIHZhbHVlcyBrZXllZCBieVxuICoge0BsaW5rIFBvcG92ZXJGaWVsZC5rZXl9LCBvciBgbnVsbGAgaWYgaXQgd2FzIGRpc21pc3NlZCB3aXRob3V0IGNvbmZpcm1pbmcuXG4gKlxuICogQHR5cGVQYXJhbSBLZXkgLSBUaGUgdW5pb24gb2YgdGhlIGZpZWxkIGtleXMsIGluZmVycmVkIGZyb20gdGhlIGBmaWVsZHNgIGFycmF5LlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgcG9wb3Zlci5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgZWRpdGVkIHZhbHVlcywgb3IgYG51bGxgIGlmIGRpc21pc3NlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRGaWVsZHNJblBvcG92ZXI8S2V5IGV4dGVuZHMgc3RyaW5nPihwYXJhbXM6IEVkaXRGaWVsZHNJblBvcG92ZXJQYXJhbXM8S2V5Pik6IFByb21pc2U8bnVsbCB8IFJlY29yZDxLZXksIHN0cmluZz4+IHtcbiAgY29uc3Qge1xuICAgIGFuY2hvcixcbiAgICBjYW5jZWxCdXR0b25UZXh0LFxuICAgIGNzc0NsYXNzZXMsXG4gICAgZmllbGRzLFxuICAgIG9rQnV0dG9uVGV4dFxuICB9ID0gcGFyYW1zO1xuXG4gIHJldHVybiBhd2FpdCBzaG93UG9wb3ZlcjxSZWNvcmQ8S2V5LCBzdHJpbmc+Pihub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8U2hvd1BvcG92ZXJQYXJhbXM8UmVjb3JkPEtleSwgc3RyaW5nPj4+KHtcbiAgICBhbmNob3IsXG4gICAgYnVpbGQoeyBjb250ZW50RWwgfSkge1xuICAgICAgY29uc3QgZWRpdG9ycyA9IGZpZWxkcy5tYXAoKGZpZWxkKSA9PiAoe1xuICAgICAgICBrZXk6IGZpZWxkLmtleSxcbiAgICAgICAgdGV4dENvbXBvbmVudDogYWRkRmllbGQoY29udGVudEVsLCBmaWVsZClcbiAgICAgIH0pKTtcblxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgLy8gVGhlIHJlY29yZCBpcyBhY2N1bXVsYXRlZCBrZXkgYnkga2V5LCBzbyBpdCBpcyBvbmx5IGNvbXBsZXRlIFx1MjAxNCBhbmQgb25seSB0eXBlZCBhcyBzdWNoIFx1MjAxNCBvbmNlIGV2ZXJ5IGZpZWxkIGhhcyBiZWVuIHJlYWQuXG4gICAgICAgIGNvbnN0IHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGVkaXRvciBvZiBlZGl0b3JzKSB7XG4gICAgICAgICAgdmFsdWVzW2VkaXRvci5rZXldID0gZWRpdG9yLnRleHRDb21wb25lbnQuZ2V0VmFsdWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgICB9O1xuICAgIH0sXG4gICAgY2FuY2VsQnV0dG9uVGV4dCxcbiAgICBjc3NDbGFzc2VzLFxuICAgIG9rQnV0dG9uVGV4dFxuICB9KSk7XG59XG5cbi8qKlxuICogQWRkcyBhIHNpbmdsZSBsYWJlbGxlZCB0ZXh0IGZpZWxkIHRvIHRoZSBwb3BvdmVyLlxuICpcbiAqIEB0eXBlUGFyYW0gS2V5IC0gVGhlIGtleSB0aGUgZmllbGQncyB2YWx1ZSBpcyByZXR1cm5lZCB1bmRlci5cbiAqIEBwYXJhbSBjb250YWluZXJFbCAtIFRoZSBlbGVtZW50IHRvIGFkZCB0aGUgZmllbGQgdG8uXG4gKiBAcGFyYW0gZmllbGQgLSBUaGUgZmllbGQgdG8gYWRkLlxuICogQHJldHVybnMgVGhlIGZpZWxkJ3MgdGV4dCBjb21wb25lbnQuXG4gKi9cbmZ1bmN0aW9uIGFkZEZpZWxkPEtleSBleHRlbmRzIHN0cmluZz4oY29udGFpbmVyRWw6IEhUTUxFbGVtZW50LCBmaWVsZDogUG9wb3ZlckZpZWxkPEtleT4pOiBUZXh0Q29tcG9uZW50IHtcbiAgY29uc3Qgc2V0dGluZyA9IG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKS5zZXROYW1lKGZpZWxkLm5hbWUpO1xuICBjb25zdCB0ZXh0Q29tcG9uZW50ID0gbmV3IFRleHRDb21wb25lbnQoc2V0dGluZy5jb250cm9sRWwpO1xuICB0ZXh0Q29tcG9uZW50LnNldFZhbHVlKGZpZWxkLmRlZmF1bHRWYWx1ZSA/PyAnJyk7XG4gIHRleHRDb21wb25lbnQuc2V0UGxhY2Vob2xkZXIoZmllbGQucGxhY2Vob2xkZXIgPz8gJycpO1xuICB0ZXh0Q29tcG9uZW50LmlucHV0RWwuYWRkQ2xhc3MoQ3NzQ2xhc3MuVGV4dEJveCk7XG4gIHJldHVybiB0ZXh0Q29tcG9uZW50O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFXQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUtQLFNBQVMsbUNBQW1DO0FBQzVDLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsbUJBQW1CO0FBeUU1QixlQUFzQixvQkFBd0MsUUFBNkU7QUFDekksUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixJQUFJO0FBRUosU0FBTyxNQUFNLFlBQWlDLDRCQUFvRTtBQUFBLElBQ2hIO0FBQUEsSUFDQSxNQUFNLEVBQUUsVUFBVSxHQUFHO0FBQ25CLFlBQU0sVUFBVSxPQUFPLElBQUksQ0FBQyxXQUFXO0FBQUEsUUFDckMsS0FBSyxNQUFNO0FBQUEsUUFDWCxlQUFlLFNBQVMsV0FBVyxLQUFLO0FBQUEsTUFDMUMsRUFBRTtBQUVGLGFBQU8sTUFBTTtBQUVYLGNBQU0sU0FBaUMsQ0FBQztBQUN4QyxtQkFBVyxVQUFVLFNBQVM7QUFDNUIsaUJBQU8sT0FBTyxHQUFHLElBQUksT0FBTyxjQUFjLFNBQVM7QUFBQSxRQUNyRDtBQUVBLGVBQU87QUFBQSxNQUNUO0FBQUEsSUFDRjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsQ0FBQyxDQUFDO0FBQ0o7QUFVQSxTQUFTLFNBQTZCLGFBQTBCLE9BQXlDO0FBQ3ZHLFFBQU0sVUFBVSxJQUFJLFFBQVEsV0FBVyxFQUFFLFFBQVEsTUFBTSxJQUFJO0FBQzNELFFBQU0sZ0JBQWdCLElBQUksY0FBYyxRQUFRLFNBQVM7QUFDekQsZ0JBQWMsU0FBUyxNQUFNLGdCQUFnQixFQUFFO0FBQy9DLGdCQUFjLGVBQWUsTUFBTSxlQUFlLEVBQUU7QUFDcEQsZ0JBQWMsUUFBUSxTQUFTLFNBQVMsT0FBTztBQUMvQyxTQUFPO0FBQ1Q7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,4 @@
1
+ /// <reference path="../../library.d.mts" />
2
+ export * as 'field-popover' from './field-popover.mjs';
3
+ export * as 'popover-anchor' from './popover-anchor.mjs';
4
+ export * as 'popover' from './popover.mjs';
@@ -0,0 +1,32 @@
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 initEsm() {
7
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
8
+ if (globalThis.process) {
9
+ return;
10
+ }
11
+
12
+ const browserProcess = {
13
+ browser: true,
14
+ cwd() {
15
+ return '/';
16
+ },
17
+ env: {},
18
+ platform: 'android'
19
+ };
20
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
21
+ globalThis.process = browserProcess;
22
+ })();
23
+
24
+ import * as field_popover from "./field-popover.mjs";
25
+ import * as popover_anchor from "./popover-anchor.mjs";
26
+ import * as popover from "./popover.mjs";
27
+ export {
28
+ field_popover as "field-popover",
29
+ popover,
30
+ popover_anchor as "popover-anchor"
31
+ };
32
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BvcG92ZXJzL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiBUSElTIElTIEEgR0VORVJBVEVEL0JVTkRMRUQgRklMRSBCWSBCVUlMRCBTQ1JJUFQgKi9cblxuZXhwb3J0ICogYXMgJ2ZpZWxkLXBvcG92ZXInIGZyb20gJy4vZmllbGQtcG9wb3Zlci50cyc7XG5leHBvcnQgKiBhcyAncG9wb3Zlci1hbmNob3InIGZyb20gJy4vcG9wb3Zlci1hbmNob3IudHMnO1xuZXhwb3J0ICogYXMgJ3BvcG92ZXInIGZyb20gJy4vcG9wb3Zlci50cyc7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLFlBQVlBLG1CQUFxQjtBQUNqQyxZQUFZQyxvQkFBc0I7QUFDbEMsWUFBWSxhQUFlOyIsCiAgIm5hbWVzIjogWyJmaWVsZC1wb3BvdmVyIiwgInBvcG92ZXItYW5jaG9yIl0KfQo=
@@ -0,0 +1,67 @@
1
+ /// <reference path="../../library.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * The resolved position a popover is placed at.
6
+ *
7
+ * A popover takes a resolved anchor rather than an element because callers know the position in
8
+ * different ways: a clicked element has a rect, a context menu has the pointer that opened it, and a
9
+ * keyboard-invoked command has the caret. Each way gets its own builder here, so the popover itself
10
+ * stays unaware of how the position was found.
11
+ *
12
+ * This lives apart from the popover shell so that anything producing an anchor — most notably
13
+ * `PointerPositionComponent` — depends only on the position, not on the panel that consumes it.
14
+ */
15
+ /**
16
+ * Where a popover is placed: viewport coordinates plus the document they belong to.
17
+ *
18
+ * Carrying the document explicitly is what makes an anchor inside a pop-out window work — the popover
19
+ * is appended to, and clamped against, that window rather than the main one.
20
+ */
21
+ export interface PopoverAnchor {
22
+ /**
23
+ * The viewport `y` coordinate the popover is placed below.
24
+ */
25
+ readonly bottom: number;
26
+ /**
27
+ * The document the coordinates belong to.
28
+ */
29
+ readonly doc: Document;
30
+ /**
31
+ * The viewport `x` coordinate the popover is aligned to.
32
+ */
33
+ readonly left: number;
34
+ }
35
+ /**
36
+ * Anchors a popover in the middle of the document, for the cases where nothing better is known.
37
+ *
38
+ * @param doc - The document to anchor in.
39
+ * @returns The anchor.
40
+ */
41
+ export declare function createAnchorFromDocumentCenter(doc: Document): PopoverAnchor;
42
+ /**
43
+ * Anchors a popover just below an element — used for a clicked element, whose rect is exactly where
44
+ * the user is looking.
45
+ *
46
+ * @param el - The element to anchor at.
47
+ * @returns The anchor.
48
+ */
49
+ export declare function createAnchorFromElement(el: HTMLElement): PopoverAnchor;
50
+ /**
51
+ * Anchors a popover at a pointer position — used for a context menu, which is raised by a right-click
52
+ * or a long-press whose coordinates are where the user is looking.
53
+ *
54
+ * @param x - The viewport `x` coordinate.
55
+ * @param y - The viewport `y` coordinate.
56
+ * @param doc - The document the coordinates belong to.
57
+ * @returns The anchor.
58
+ */
59
+ export declare function createAnchorFromPoint(x: number, y: number, doc: Document): PopoverAnchor;
60
+ /**
61
+ * Anchors a popover at the caret — used by a command invoked from the keyboard, with the cursor
62
+ * already at the place being edited.
63
+ *
64
+ * @param doc - The document holding the selection.
65
+ * @returns The anchor, or a centered one when there is no caret to read.
66
+ */
67
+ export declare function createAnchorFromSelection(doc: Document): PopoverAnchor;
@@ -0,0 +1,67 @@
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 initEsm() {
7
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
8
+ if (globalThis.process) {
9
+ return;
10
+ }
11
+
12
+ const browserProcess = {
13
+ browser: true,
14
+ cwd() {
15
+ return '/';
16
+ },
17
+ env: {},
18
+ platform: 'android'
19
+ };
20
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
21
+ globalThis.process = browserProcess;
22
+ })();
23
+
24
+ import { getDocumentWindow } from "../../html-element.mjs";
25
+ const CENTER_FRACTION = 0.5;
26
+ function createAnchorFromDocumentCenter(doc) {
27
+ const win = getDocumentWindow(doc);
28
+ return {
29
+ bottom: win.innerHeight * CENTER_FRACTION,
30
+ doc,
31
+ left: win.innerWidth * CENTER_FRACTION
32
+ };
33
+ }
34
+ function createAnchorFromElement(el) {
35
+ const rect = el.getBoundingClientRect();
36
+ return {
37
+ bottom: rect.bottom,
38
+ doc: el.ownerDocument,
39
+ left: rect.left
40
+ };
41
+ }
42
+ function createAnchorFromPoint(x, y, doc) {
43
+ return {
44
+ bottom: y,
45
+ doc,
46
+ left: x
47
+ };
48
+ }
49
+ function createAnchorFromSelection(doc) {
50
+ const selection = doc.getSelection();
51
+ const rect = selection?.rangeCount ? selection.getRangeAt(0).getBoundingClientRect() : null;
52
+ if (!rect || rect.bottom === 0 && rect.left === 0) {
53
+ return createAnchorFromDocumentCenter(doc);
54
+ }
55
+ return {
56
+ bottom: rect.bottom,
57
+ doc,
58
+ left: rect.left
59
+ };
60
+ }
61
+ export {
62
+ createAnchorFromDocumentCenter,
63
+ createAnchorFromElement,
64
+ createAnchorFromPoint,
65
+ createAnchorFromSelection
66
+ };
67
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BvcG92ZXJzL3BvcG92ZXItYW5jaG9yLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIHJlc29sdmVkIHBvc2l0aW9uIGEgcG9wb3ZlciBpcyBwbGFjZWQgYXQuXG4gKlxuICogQSBwb3BvdmVyIHRha2VzIGEgcmVzb2x2ZWQgYW5jaG9yIHJhdGhlciB0aGFuIGFuIGVsZW1lbnQgYmVjYXVzZSBjYWxsZXJzIGtub3cgdGhlIHBvc2l0aW9uIGluXG4gKiBkaWZmZXJlbnQgd2F5czogYSBjbGlja2VkIGVsZW1lbnQgaGFzIGEgcmVjdCwgYSBjb250ZXh0IG1lbnUgaGFzIHRoZSBwb2ludGVyIHRoYXQgb3BlbmVkIGl0LCBhbmQgYVxuICoga2V5Ym9hcmQtaW52b2tlZCBjb21tYW5kIGhhcyB0aGUgY2FyZXQuIEVhY2ggd2F5IGdldHMgaXRzIG93biBidWlsZGVyIGhlcmUsIHNvIHRoZSBwb3BvdmVyIGl0c2VsZlxuICogc3RheXMgdW5hd2FyZSBvZiBob3cgdGhlIHBvc2l0aW9uIHdhcyBmb3VuZC5cbiAqXG4gKiBUaGlzIGxpdmVzIGFwYXJ0IGZyb20gdGhlIHBvcG92ZXIgc2hlbGwgc28gdGhhdCBhbnl0aGluZyBwcm9kdWNpbmcgYW4gYW5jaG9yIFx1MjAxNCBtb3N0IG5vdGFibHlcbiAqIGBQb2ludGVyUG9zaXRpb25Db21wb25lbnRgIFx1MjAxNCBkZXBlbmRzIG9ubHkgb24gdGhlIHBvc2l0aW9uLCBub3Qgb24gdGhlIHBhbmVsIHRoYXQgY29uc3VtZXMgaXQuXG4gKi9cblxuaW1wb3J0IHsgZ2V0RG9jdW1lbnRXaW5kb3cgfSBmcm9tICcuLi8uLi9odG1sLWVsZW1lbnQudHMnO1xuXG4vKipcbiAqIFRoZSBmcmFjdGlvbiBvZiB0aGUgd2luZG93IHVzZWQgdG8gcGxhY2UgYSBjZW50ZXJlZCBhbmNob3IuXG4gKi9cbmNvbnN0IENFTlRFUl9GUkFDVElPTiA9IDAuNTtcblxuLyoqXG4gKiBXaGVyZSBhIHBvcG92ZXIgaXMgcGxhY2VkOiB2aWV3cG9ydCBjb29yZGluYXRlcyBwbHVzIHRoZSBkb2N1bWVudCB0aGV5IGJlbG9uZyB0by5cbiAqXG4gKiBDYXJyeWluZyB0aGUgZG9jdW1lbnQgZXhwbGljaXRseSBpcyB3aGF0IG1ha2VzIGFuIGFuY2hvciBpbnNpZGUgYSBwb3Atb3V0IHdpbmRvdyB3b3JrIFx1MjAxNCB0aGUgcG9wb3ZlclxuICogaXMgYXBwZW5kZWQgdG8sIGFuZCBjbGFtcGVkIGFnYWluc3QsIHRoYXQgd2luZG93IHJhdGhlciB0aGFuIHRoZSBtYWluIG9uZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb3BvdmVyQW5jaG9yIHtcbiAgLyoqXG4gICAqIFRoZSB2aWV3cG9ydCBgeWAgY29vcmRpbmF0ZSB0aGUgcG9wb3ZlciBpcyBwbGFjZWQgYmVsb3cuXG4gICAqL1xuICByZWFkb25seSBib3R0b206IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGRvY3VtZW50IHRoZSBjb29yZGluYXRlcyBiZWxvbmcgdG8uXG4gICAqL1xuICByZWFkb25seSBkb2M6IERvY3VtZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgdmlld3BvcnQgYHhgIGNvb3JkaW5hdGUgdGhlIHBvcG92ZXIgaXMgYWxpZ25lZCB0by5cbiAgICovXG4gIHJlYWRvbmx5IGxlZnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBbmNob3JzIGEgcG9wb3ZlciBpbiB0aGUgbWlkZGxlIG9mIHRoZSBkb2N1bWVudCwgZm9yIHRoZSBjYXNlcyB3aGVyZSBub3RoaW5nIGJldHRlciBpcyBrbm93bi5cbiAqXG4gKiBAcGFyYW0gZG9jIC0gVGhlIGRvY3VtZW50IHRvIGFuY2hvciBpbi5cbiAqIEByZXR1cm5zIFRoZSBhbmNob3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBbmNob3JGcm9tRG9jdW1lbnRDZW50ZXIoZG9jOiBEb2N1bWVudCk6IFBvcG92ZXJBbmNob3Ige1xuICBjb25zdCB3aW4gPSBnZXREb2N1bWVudFdpbmRvdyhkb2MpO1xuICByZXR1cm4ge1xuICAgIGJvdHRvbTogd2luLmlubmVySGVpZ2h0ICogQ0VOVEVSX0ZSQUNUSU9OLFxuICAgIGRvYyxcbiAgICBsZWZ0OiB3aW4uaW5uZXJXaWR0aCAqIENFTlRFUl9GUkFDVElPTlxuICB9O1xufVxuXG4vKipcbiAqIEFuY2hvcnMgYSBwb3BvdmVyIGp1c3QgYmVsb3cgYW4gZWxlbWVudCBcdTIwMTQgdXNlZCBmb3IgYSBjbGlja2VkIGVsZW1lbnQsIHdob3NlIHJlY3QgaXMgZXhhY3RseSB3aGVyZVxuICogdGhlIHVzZXIgaXMgbG9va2luZy5cbiAqXG4gKiBAcGFyYW0gZWwgLSBUaGUgZWxlbWVudCB0byBhbmNob3IgYXQuXG4gKiBAcmV0dXJucyBUaGUgYW5jaG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQW5jaG9yRnJvbUVsZW1lbnQoZWw6IEhUTUxFbGVtZW50KTogUG9wb3ZlckFuY2hvciB7XG4gIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgcmV0dXJuIHtcbiAgICBib3R0b206IHJlY3QuYm90dG9tLFxuICAgIGRvYzogZWwub3duZXJEb2N1bWVudCxcbiAgICBsZWZ0OiByZWN0LmxlZnRcbiAgfTtcbn1cblxuLyoqXG4gKiBBbmNob3JzIGEgcG9wb3ZlciBhdCBhIHBvaW50ZXIgcG9zaXRpb24gXHUyMDE0IHVzZWQgZm9yIGEgY29udGV4dCBtZW51LCB3aGljaCBpcyByYWlzZWQgYnkgYSByaWdodC1jbGlja1xuICogb3IgYSBsb25nLXByZXNzIHdob3NlIGNvb3JkaW5hdGVzIGFyZSB3aGVyZSB0aGUgdXNlciBpcyBsb29raW5nLlxuICpcbiAqIEBwYXJhbSB4IC0gVGhlIHZpZXdwb3J0IGB4YCBjb29yZGluYXRlLlxuICogQHBhcmFtIHkgLSBUaGUgdmlld3BvcnQgYHlgIGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0gZG9jIC0gVGhlIGRvY3VtZW50IHRoZSBjb29yZGluYXRlcyBiZWxvbmcgdG8uXG4gKiBAcmV0dXJucyBUaGUgYW5jaG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQW5jaG9yRnJvbVBvaW50KHg6IG51bWJlciwgeTogbnVtYmVyLCBkb2M6IERvY3VtZW50KTogUG9wb3ZlckFuY2hvciB7XG4gIHJldHVybiB7XG4gICAgYm90dG9tOiB5LFxuICAgIGRvYyxcbiAgICBsZWZ0OiB4XG4gIH07XG59XG5cbi8qKlxuICogQW5jaG9ycyBhIHBvcG92ZXIgYXQgdGhlIGNhcmV0IFx1MjAxNCB1c2VkIGJ5IGEgY29tbWFuZCBpbnZva2VkIGZyb20gdGhlIGtleWJvYXJkLCB3aXRoIHRoZSBjdXJzb3JcbiAqIGFscmVhZHkgYXQgdGhlIHBsYWNlIGJlaW5nIGVkaXRlZC5cbiAqXG4gKiBAcGFyYW0gZG9jIC0gVGhlIGRvY3VtZW50IGhvbGRpbmcgdGhlIHNlbGVjdGlvbi5cbiAqIEByZXR1cm5zIFRoZSBhbmNob3IsIG9yIGEgY2VudGVyZWQgb25lIHdoZW4gdGhlcmUgaXMgbm8gY2FyZXQgdG8gcmVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFuY2hvckZyb21TZWxlY3Rpb24oZG9jOiBEb2N1bWVudCk6IFBvcG92ZXJBbmNob3Ige1xuICBjb25zdCBzZWxlY3Rpb24gPSBkb2MuZ2V0U2VsZWN0aW9uKCk7XG4gIGNvbnN0IHJlY3QgPSBzZWxlY3Rpb24/LnJhbmdlQ291bnQgPyBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA6IG51bGw7XG4gIGlmICghcmVjdCB8fCAocmVjdC5ib3R0b20gPT09IDAgJiYgcmVjdC5sZWZ0ID09PSAwKSkge1xuICAgIHJldHVybiBjcmVhdGVBbmNob3JGcm9tRG9jdW1lbnRDZW50ZXIoZG9jKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYm90dG9tOiByZWN0LmJvdHRvbSxcbiAgICBkb2MsXG4gICAgbGVmdDogcmVjdC5sZWZ0XG4gIH07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWNBLFNBQVMseUJBQXlCO0FBS2xDLE1BQU0sa0JBQWtCO0FBK0JqQixTQUFTLCtCQUErQixLQUE4QjtBQUMzRSxRQUFNLE1BQU0sa0JBQWtCLEdBQUc7QUFDakMsU0FBTztBQUFBLElBQ0wsUUFBUSxJQUFJLGNBQWM7QUFBQSxJQUMxQjtBQUFBLElBQ0EsTUFBTSxJQUFJLGFBQWE7QUFBQSxFQUN6QjtBQUNGO0FBU08sU0FBUyx3QkFBd0IsSUFBZ0M7QUFDdEUsUUFBTSxPQUFPLEdBQUcsc0JBQXNCO0FBQ3RDLFNBQU87QUFBQSxJQUNMLFFBQVEsS0FBSztBQUFBLElBQ2IsS0FBSyxHQUFHO0FBQUEsSUFDUixNQUFNLEtBQUs7QUFBQSxFQUNiO0FBQ0Y7QUFXTyxTQUFTLHNCQUFzQixHQUFXLEdBQVcsS0FBOEI7QUFDeEYsU0FBTztBQUFBLElBQ0wsUUFBUTtBQUFBLElBQ1I7QUFBQSxJQUNBLE1BQU07QUFBQSxFQUNSO0FBQ0Y7QUFTTyxTQUFTLDBCQUEwQixLQUE4QjtBQUN0RSxRQUFNLFlBQVksSUFBSSxhQUFhO0FBQ25DLFFBQU0sT0FBTyxXQUFXLGFBQWEsVUFBVSxXQUFXLENBQUMsRUFBRSxzQkFBc0IsSUFBSTtBQUN2RixNQUFJLENBQUMsUUFBUyxLQUFLLFdBQVcsS0FBSyxLQUFLLFNBQVMsR0FBSTtBQUNuRCxXQUFPLCtCQUErQixHQUFHO0FBQUEsRUFDM0M7QUFFQSxTQUFPO0FBQUEsSUFDTCxRQUFRLEtBQUs7QUFBQSxJQUNiO0FBQUEsSUFDQSxNQUFNLEtBQUs7QUFBQSxFQUNiO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,78 @@
1
+ /// <reference path="../../library.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * A small floating panel anchored at a point, collecting a value and resolving a promise with it.
6
+ *
7
+ * This is the popover counterpart of `modals/modal.ts`: the same "ask the user for a value, resolve a
8
+ * promise" shape, for the cases a modal cannot serve. A modal dims the screen and is positioned by
9
+ * Obsidian, neither of which suits an editor that must appear *at* the thing it edits — a clicked
10
+ * link, the caret, or wherever a context menu was raised.
11
+ *
12
+ * The panel rides Obsidian's `.menu` class for its background, border and shadow, so only layout is
13
+ * styled by this library.
14
+ */
15
+ import type { PopoverAnchor } from './popover-anchor.mjs';
16
+ /**
17
+ * Reads the value the popover resolves with when it is confirmed.
18
+ *
19
+ * @typeParam Value - The type of the value resolved by the popover.
20
+ * @returns The current value.
21
+ */
22
+ export type PopoverValueGetter<Value> = (this: void) => Value;
23
+ /**
24
+ * The tools handed to {@link ShowPopoverParams.build} for populating a popover.
25
+ */
26
+ export interface ShowPopoverBuildParams {
27
+ /**
28
+ * Dismisses the popover, resolving it with `null`, as the Cancel button does.
29
+ */
30
+ cancel(this: void): void;
31
+ /**
32
+ * Confirms the popover, resolving it with the built value, as the OK button does.
33
+ */
34
+ confirm(this: void): void;
35
+ /**
36
+ * The element to add the popover's content to. The OK and Cancel buttons are appended after it.
37
+ */
38
+ readonly contentEl: HTMLElement;
39
+ }
40
+ /**
41
+ * Parameters for {@link showPopover}.
42
+ *
43
+ * @typeParam Value - The type of the value resolved by the popover.
44
+ */
45
+ export interface ShowPopoverParams<Value> {
46
+ /**
47
+ * Where to place the popover.
48
+ */
49
+ readonly anchor: PopoverAnchor;
50
+ /**
51
+ * Populates the popover's content.
52
+ *
53
+ * @param params - The tools for populating the popover.
54
+ * @returns A getter read when the popover is confirmed.
55
+ */
56
+ build(this: void, params: ShowPopoverBuildParams): PopoverValueGetter<Value>;
57
+ /**
58
+ * A text for the "Cancel" button.
59
+ */
60
+ readonly cancelButtonText?: string;
61
+ /**
62
+ * Additional CSS classes to apply to the popover.
63
+ */
64
+ readonly cssClasses?: string[];
65
+ /**
66
+ * A text for the "OK" button.
67
+ */
68
+ readonly okButtonText?: string;
69
+ }
70
+ /**
71
+ * Displays a popover at the given anchor and resolves with the built value, or `null` if it was
72
+ * dismissed without confirming.
73
+ *
74
+ * @typeParam Value - The type of the value resolved by the popover.
75
+ * @param params - The parameters for the popover.
76
+ * @returns A {@link Promise} that resolves with the built value, or `null` if dismissed.
77
+ */
78
+ export declare function showPopover<Value>(params: ShowPopoverParams<Value>): Promise<null | Value>;
@@ -0,0 +1,113 @@
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 initEsm() {
7
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
8
+ if (globalThis.process) {
9
+ return;
10
+ }
11
+
12
+ const browserProcess = {
13
+ browser: true,
14
+ cwd() {
15
+ return '/';
16
+ },
17
+ env: {},
18
+ platform: 'android'
19
+ };
20
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
21
+ globalThis.process = browserProcess;
22
+ })();
23
+
24
+ import { Setting } from "obsidian";
25
+ import { getDocumentWindow } from "../../html-element.mjs";
26
+ import { CssClass } from "../css-class.mjs";
27
+ import { t } from "../i18n/i18n.mjs";
28
+ import { addPluginCssClasses } from "../plugin/plugin-context.mjs";
29
+ const ANCHOR_GAP_IN_PIXELS = 4;
30
+ const VIEWPORT_MARGIN_IN_PIXELS = 8;
31
+ async function showPopover(params) {
32
+ const {
33
+ anchor,
34
+ build,
35
+ cancelButtonText,
36
+ cssClasses,
37
+ okButtonText
38
+ } = params;
39
+ const doc = anchor.doc;
40
+ const win = getDocumentWindow(doc);
41
+ const popoverEl = doc.body.createDiv({ cls: "menu" });
42
+ addPluginCssClasses(popoverEl, [CssClass.Popover, ...cssClasses ?? []]);
43
+ return await new Promise((resolve) => {
44
+ const state = { isClosed: false };
45
+ function close(result) {
46
+ if (state.isClosed) {
47
+ return;
48
+ }
49
+ state.isClosed = true;
50
+ doc.removeEventListener("pointerdown", handlePointerDown, true);
51
+ popoverEl.remove();
52
+ resolve(result);
53
+ }
54
+ function handleCancel() {
55
+ close(null);
56
+ }
57
+ function handleOk() {
58
+ close(getValue());
59
+ }
60
+ function handlePointerDown(evt) {
61
+ if (evt.composedPath().includes(popoverEl)) {
62
+ return;
63
+ }
64
+ close(null);
65
+ }
66
+ const getValue = build({
67
+ cancel: handleCancel,
68
+ confirm: handleOk,
69
+ contentEl: popoverEl
70
+ });
71
+ popoverEl.addEventListener("keydown", (evt) => {
72
+ if (evt.key === "Enter") {
73
+ evt.preventDefault();
74
+ handleOk();
75
+ return;
76
+ }
77
+ if (evt.key === "Escape") {
78
+ evt.preventDefault();
79
+ handleCancel();
80
+ }
81
+ });
82
+ const buttonsSetting = new Setting(popoverEl);
83
+ buttonsSetting.addButton((button) => {
84
+ button.setButtonText(okButtonText ?? t(($) => $.obsidianDevUtils.buttons.ok)).setCta().setClass(CssClass.OkButton).onClick(handleOk);
85
+ });
86
+ buttonsSetting.addButton((button) => {
87
+ button.setButtonText(cancelButtonText ?? t(($) => $.obsidianDevUtils.buttons.cancel)).setClass(CssClass.CancelButton).onClick(handleCancel);
88
+ });
89
+ doc.addEventListener("pointerdown", handlePointerDown, true);
90
+ positionAtAnchor(popoverEl, anchor, win);
91
+ focusFirstInput(popoverEl);
92
+ });
93
+ }
94
+ function focusFirstInput(popoverEl) {
95
+ const inputEl = popoverEl.querySelector("input");
96
+ if (!inputEl) {
97
+ return;
98
+ }
99
+ inputEl.focus();
100
+ inputEl.select();
101
+ }
102
+ function positionAtAnchor(popoverEl, anchor, win) {
103
+ const maxLeft = Math.max(VIEWPORT_MARGIN_IN_PIXELS, win.innerWidth - popoverEl.offsetWidth - VIEWPORT_MARGIN_IN_PIXELS);
104
+ const maxTop = Math.max(VIEWPORT_MARGIN_IN_PIXELS, win.innerHeight - popoverEl.offsetHeight - VIEWPORT_MARGIN_IN_PIXELS);
105
+ const left = Math.min(Math.max(anchor.left, VIEWPORT_MARGIN_IN_PIXELS), maxLeft);
106
+ const top = Math.min(Math.max(anchor.bottom + ANCHOR_GAP_IN_PIXELS, VIEWPORT_MARGIN_IN_PIXELS), maxTop);
107
+ popoverEl.style.left = `${String(Math.round(left + win.scrollX))}px`;
108
+ popoverEl.style.top = `${String(Math.round(top + win.scrollY))}px`;
109
+ }
110
+ export {
111
+ showPopover
112
+ };
113
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BvcG92ZXJzL3BvcG92ZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBBIHNtYWxsIGZsb2F0aW5nIHBhbmVsIGFuY2hvcmVkIGF0IGEgcG9pbnQsIGNvbGxlY3RpbmcgYSB2YWx1ZSBhbmQgcmVzb2x2aW5nIGEgcHJvbWlzZSB3aXRoIGl0LlxuICpcbiAqIFRoaXMgaXMgdGhlIHBvcG92ZXIgY291bnRlcnBhcnQgb2YgYG1vZGFscy9tb2RhbC50c2A6IHRoZSBzYW1lIFwiYXNrIHRoZSB1c2VyIGZvciBhIHZhbHVlLCByZXNvbHZlIGFcbiAqIHByb21pc2VcIiBzaGFwZSwgZm9yIHRoZSBjYXNlcyBhIG1vZGFsIGNhbm5vdCBzZXJ2ZS4gQSBtb2RhbCBkaW1zIHRoZSBzY3JlZW4gYW5kIGlzIHBvc2l0aW9uZWQgYnlcbiAqIE9ic2lkaWFuLCBuZWl0aGVyIG9mIHdoaWNoIHN1aXRzIGFuIGVkaXRvciB0aGF0IG11c3QgYXBwZWFyICphdCogdGhlIHRoaW5nIGl0IGVkaXRzIFx1MjAxNCBhIGNsaWNrZWRcbiAqIGxpbmssIHRoZSBjYXJldCwgb3Igd2hlcmV2ZXIgYSBjb250ZXh0IG1lbnUgd2FzIHJhaXNlZC5cbiAqXG4gKiBUaGUgcGFuZWwgcmlkZXMgT2JzaWRpYW4ncyBgLm1lbnVgIGNsYXNzIGZvciBpdHMgYmFja2dyb3VuZCwgYm9yZGVyIGFuZCBzaGFkb3csIHNvIG9ubHkgbGF5b3V0IGlzXG4gKiBzdHlsZWQgYnkgdGhpcyBsaWJyYXJ5LlxuICovXG5cbmltcG9ydCB7IFNldHRpbmcgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgUG9wb3ZlckFuY2hvciB9IGZyb20gJy4vcG9wb3Zlci1hbmNob3IudHMnO1xuXG5pbXBvcnQgeyBnZXREb2N1bWVudFdpbmRvdyB9IGZyb20gJy4uLy4uL2h0bWwtZWxlbWVudC50cyc7XG5pbXBvcnQgeyBDc3NDbGFzcyB9IGZyb20gJy4uL2Nzcy1jbGFzcy50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB7IGFkZFBsdWdpbkNzc0NsYXNzZXMgfSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWNvbnRleHQudHMnO1xuXG4vKipcbiAqIFRoZSBnYXAgaW4gcGl4ZWxzIGJldHdlZW4gdGhlIGFuY2hvciBhbmQgdGhlIHBvcG92ZXIuXG4gKi9cbmNvbnN0IEFOQ0hPUl9HQVBfSU5fUElYRUxTID0gNDtcblxuLyoqXG4gKiBUaGUgbWluaW11bSBnYXAgaW4gcGl4ZWxzIHRoZSBwb3BvdmVyIGtlZXBzIGZyb20gdGhlIGVkZ2VzIG9mIHRoZSB3aW5kb3cgd2hlbiBpdCBoYXMgdG8gYmUgY2xhbXBlZFxuICogYmFjayBpbnRvIHZpZXcuXG4gKi9cbmNvbnN0IFZJRVdQT1JUX01BUkdJTl9JTl9QSVhFTFMgPSA4O1xuXG4vKipcbiAqIFJlYWRzIHRoZSB2YWx1ZSB0aGUgcG9wb3ZlciByZXNvbHZlcyB3aXRoIHdoZW4gaXQgaXMgY29uZmlybWVkLlxuICpcbiAqIEB0eXBlUGFyYW0gVmFsdWUgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgcmVzb2x2ZWQgYnkgdGhlIHBvcG92ZXIuXG4gKiBAcmV0dXJucyBUaGUgY3VycmVudCB2YWx1ZS5cbiAqL1xuZXhwb3J0IHR5cGUgUG9wb3ZlclZhbHVlR2V0dGVyPFZhbHVlPiA9ICh0aGlzOiB2b2lkKSA9PiBWYWx1ZTtcblxuLyoqXG4gKiBUaGUgdG9vbHMgaGFuZGVkIHRvIHtAbGluayBTaG93UG9wb3ZlclBhcmFtcy5idWlsZH0gZm9yIHBvcHVsYXRpbmcgYSBwb3BvdmVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNob3dQb3BvdmVyQnVpbGRQYXJhbXMge1xuICAvKipcbiAgICogRGlzbWlzc2VzIHRoZSBwb3BvdmVyLCByZXNvbHZpbmcgaXQgd2l0aCBgbnVsbGAsIGFzIHRoZSBDYW5jZWwgYnV0dG9uIGRvZXMuXG4gICAqL1xuICBjYW5jZWwodGhpczogdm9pZCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENvbmZpcm1zIHRoZSBwb3BvdmVyLCByZXNvbHZpbmcgaXQgd2l0aCB0aGUgYnVpbHQgdmFsdWUsIGFzIHRoZSBPSyBidXR0b24gZG9lcy5cbiAgICovXG4gIGNvbmZpcm0odGhpczogdm9pZCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IHRvIGFkZCB0aGUgcG9wb3ZlcidzIGNvbnRlbnQgdG8uIFRoZSBPSyBhbmQgQ2FuY2VsIGJ1dHRvbnMgYXJlIGFwcGVuZGVkIGFmdGVyIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudEVsOiBIVE1MRWxlbWVudDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgc2hvd1BvcG92ZXJ9LlxuICpcbiAqIEB0eXBlUGFyYW0gVmFsdWUgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgcmVzb2x2ZWQgYnkgdGhlIHBvcG92ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2hvd1BvcG92ZXJQYXJhbXM8VmFsdWU+IHtcbiAgLyoqXG4gICAqIFdoZXJlIHRvIHBsYWNlIHRoZSBwb3BvdmVyLlxuICAgKi9cbiAgcmVhZG9ubHkgYW5jaG9yOiBQb3BvdmVyQW5jaG9yO1xuXG4gIC8qKlxuICAgKiBQb3B1bGF0ZXMgdGhlIHBvcG92ZXIncyBjb250ZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHRvb2xzIGZvciBwb3B1bGF0aW5nIHRoZSBwb3BvdmVyLlxuICAgKiBAcmV0dXJucyBBIGdldHRlciByZWFkIHdoZW4gdGhlIHBvcG92ZXIgaXMgY29uZmlybWVkLlxuICAgKi9cbiAgYnVpbGQodGhpczogdm9pZCwgcGFyYW1zOiBTaG93UG9wb3ZlckJ1aWxkUGFyYW1zKTogUG9wb3ZlclZhbHVlR2V0dGVyPFZhbHVlPjtcblxuICAvKipcbiAgICogQSB0ZXh0IGZvciB0aGUgXCJDYW5jZWxcIiBidXR0b24uXG4gICAqL1xuICByZWFkb25seSBjYW5jZWxCdXR0b25UZXh0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIENTUyBjbGFzc2VzIHRvIGFwcGx5IHRvIHRoZSBwb3BvdmVyLlxuICAgKi9cbiAgcmVhZG9ubHkgY3NzQ2xhc3Nlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBBIHRleHQgZm9yIHRoZSBcIk9LXCIgYnV0dG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgb2tCdXR0b25UZXh0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIERpc3BsYXlzIGEgcG9wb3ZlciBhdCB0aGUgZ2l2ZW4gYW5jaG9yIGFuZCByZXNvbHZlcyB3aXRoIHRoZSBidWlsdCB2YWx1ZSwgb3IgYG51bGxgIGlmIGl0IHdhc1xuICogZGlzbWlzc2VkIHdpdGhvdXQgY29uZmlybWluZy5cbiAqXG4gKiBAdHlwZVBhcmFtIFZhbHVlIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIHJlc29sdmVkIGJ5IHRoZSBwb3BvdmVyLlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgcG9wb3Zlci5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYnVpbHQgdmFsdWUsIG9yIGBudWxsYCBpZiBkaXNtaXNzZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaG93UG9wb3ZlcjxWYWx1ZT4ocGFyYW1zOiBTaG93UG9wb3ZlclBhcmFtczxWYWx1ZT4pOiBQcm9taXNlPG51bGwgfCBWYWx1ZT4ge1xuICBjb25zdCB7XG4gICAgYW5jaG9yLFxuICAgIGJ1aWxkLFxuICAgIGNhbmNlbEJ1dHRvblRleHQsXG4gICAgY3NzQ2xhc3NlcyxcbiAgICBva0J1dHRvblRleHRcbiAgfSA9IHBhcmFtcztcblxuICBjb25zdCBkb2MgPSBhbmNob3IuZG9jO1xuICBjb25zdCB3aW4gPSBnZXREb2N1bWVudFdpbmRvdyhkb2MpO1xuICBjb25zdCBwb3BvdmVyRWwgPSBkb2MuYm9keS5jcmVhdGVEaXYoeyBjbHM6ICdtZW51JyB9KTtcbiAgYWRkUGx1Z2luQ3NzQ2xhc3Nlcyhwb3BvdmVyRWwsIFtDc3NDbGFzcy5Qb3BvdmVyLCAuLi5jc3NDbGFzc2VzID8/IFtdXSk7XG5cbiAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPG51bGwgfCBWYWx1ZT4oKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IHsgaXNDbG9zZWQ6IGZhbHNlIH07XG5cbiAgICBmdW5jdGlvbiBjbG9zZShyZXN1bHQ6IG51bGwgfCBWYWx1ZSk6IHZvaWQge1xuICAgICAgaWYgKHN0YXRlLmlzQ2xvc2VkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHN0YXRlLmlzQ2xvc2VkID0gdHJ1ZTtcbiAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIGhhbmRsZVBvaW50ZXJEb3duLCB0cnVlKTtcbiAgICAgIHBvcG92ZXJFbC5yZW1vdmUoKTtcbiAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVDYW5jZWwoKTogdm9pZCB7XG4gICAgICBjbG9zZShudWxsKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVPaygpOiB2b2lkIHtcbiAgICAgIGNsb3NlKGdldFZhbHVlKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc21pc3NlcyB0aGUgcG9wb3ZlciB3aGVuIHRoZSBuZXh0IGdlc3R1cmUgc3RhcnRzIG91dHNpZGUgaXQuIExpc3RlbmluZyBmb3IgYHBvaW50ZXJkb3duYFxuICAgICAqIHJhdGhlciB0aGFuIGBjbGlja2AgbWF0dGVyczogYSBwb3BvdmVyIGlzIHR5cGljYWxseSBvcGVuZWQgZnJvbSBhIGBjbGlja2AgaGFuZGxlciwgYW5kIHRoZSB2ZXJ5XG4gICAgICogc2FtZSBjbGljayB3b3VsZCBvdGhlcndpc2UgcmVhY2ggdGhpcyBsaXN0ZW5lciBhbmQgY2xvc2UgdGhlIHBvcG92ZXIgdGhlIGluc3RhbnQgaXQgYXBwZWFycy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBldnQgLSBUaGUgcG9pbnRlciBldmVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYW5kbGVQb2ludGVyRG93bihldnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgICAgaWYgKGV2dC5jb21wb3NlZFBhdGgoKS5pbmNsdWRlcyhwb3BvdmVyRWwpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNsb3NlKG51bGwpO1xuICAgIH1cblxuICAgIGNvbnN0IGdldFZhbHVlID0gYnVpbGQoe1xuICAgICAgY2FuY2VsOiBoYW5kbGVDYW5jZWwsXG4gICAgICBjb25maXJtOiBoYW5kbGVPayxcbiAgICAgIGNvbnRlbnRFbDogcG9wb3ZlckVsXG4gICAgfSk7XG5cbiAgICBwb3BvdmVyRWwuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgIGlmIChldnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBoYW5kbGVPaygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChldnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaGFuZGxlQ2FuY2VsKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBidXR0b25zU2V0dGluZyA9IG5ldyBTZXR0aW5nKHBvcG92ZXJFbCk7XG4gICAgYnV0dG9uc1NldHRpbmcuYWRkQnV0dG9uKChidXR0b24pID0+IHtcbiAgICAgIGJ1dHRvblxuICAgICAgICAuc2V0QnV0dG9uVGV4dChva0J1dHRvblRleHQgPz8gdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLmJ1dHRvbnMub2spKVxuICAgICAgICAuc2V0Q3RhKClcbiAgICAgICAgLnNldENsYXNzKENzc0NsYXNzLk9rQnV0dG9uKVxuICAgICAgICAub25DbGljayhoYW5kbGVPayk7XG4gICAgfSk7XG4gICAgYnV0dG9uc1NldHRpbmcuYWRkQnV0dG9uKChidXR0b24pID0+IHtcbiAgICAgIGJ1dHRvblxuICAgICAgICAuc2V0QnV0dG9uVGV4dChjYW5jZWxCdXR0b25UZXh0ID8/IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5idXR0b25zLmNhbmNlbCkpXG4gICAgICAgIC5zZXRDbGFzcyhDc3NDbGFzcy5DYW5jZWxCdXR0b24pXG4gICAgICAgIC5vbkNsaWNrKGhhbmRsZUNhbmNlbCk7XG4gICAgfSk7XG5cbiAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCBoYW5kbGVQb2ludGVyRG93biwgdHJ1ZSk7XG4gICAgcG9zaXRpb25BdEFuY2hvcihwb3BvdmVyRWwsIGFuY2hvciwgd2luKTtcbiAgICBmb2N1c0ZpcnN0SW5wdXQocG9wb3ZlckVsKTtcbiAgfSk7XG59XG5cbi8qKlxuICogRm9jdXNlcyBhbmQgc2VsZWN0cyB0aGUgcG9wb3ZlcidzIGZpcnN0IHRleHQgaW5wdXQsIHNvIHRoZSB1c2VyIGNhbiB0eXBlIHN0cmFpZ2h0IGF3YXkuXG4gKlxuICogQHBhcmFtIHBvcG92ZXJFbCAtIFRoZSBwb3BvdmVyIHRvIGZvY3VzIHdpdGhpbi5cbiAqL1xuZnVuY3Rpb24gZm9jdXNGaXJzdElucHV0KHBvcG92ZXJFbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgY29uc3QgaW5wdXRFbCA9IHBvcG92ZXJFbC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xuICBpZiAoIWlucHV0RWwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpbnB1dEVsLmZvY3VzKCk7XG4gIGlucHV0RWwuc2VsZWN0KCk7XG59XG5cbi8qKlxuICogUGxhY2VzIHRoZSBwb3BvdmVyIGp1c3QgYmVsb3cgdGhlIGFuY2hvciwgcHVsbGluZyBpdCBiYWNrIGluc2lkZSB0aGUgd2luZG93IHdoZW4gaXQgd291bGQgb3RoZXJ3aXNlXG4gKiBvdmVyZmxvdyBcdTIwMTQgYW4gYW5jaG9yIG5lYXIgdGhlIHJpZ2h0IG9yIGJvdHRvbSBlZGdlIGlzIGV4YWN0bHkgd2hlcmUgYW4gdW5jbGFtcGVkIHBvcG92ZXIgd291bGRcbiAqIHJlbmRlciBvZmYtc2NyZWVuLlxuICpcbiAqIEBwYXJhbSBwb3BvdmVyRWwgLSBUaGUgcG9wb3ZlciB0byBwb3NpdGlvbi5cbiAqIEBwYXJhbSBhbmNob3IgLSBXaGVyZSB0aGUgcG9wb3ZlciBiZWxvbmdzLlxuICogQHBhcmFtIHdpbiAtIFRoZSB3aW5kb3cgdGhlIGFuY2hvciBsaXZlcyBpbiAoYSBwb3Atb3V0IHdpbmRvdyBoYXMgaXRzIG93bikuXG4gKi9cbmZ1bmN0aW9uIHBvc2l0aW9uQXRBbmNob3IocG9wb3ZlckVsOiBIVE1MRWxlbWVudCwgYW5jaG9yOiBQb3BvdmVyQW5jaG9yLCB3aW46IFdpbmRvdyk6IHZvaWQge1xuICBjb25zdCBtYXhMZWZ0ID0gTWF0aC5tYXgoVklFV1BPUlRfTUFSR0lOX0lOX1BJWEVMUywgd2luLmlubmVyV2lkdGggLSBwb3BvdmVyRWwub2Zmc2V0V2lkdGggLSBWSUVXUE9SVF9NQVJHSU5fSU5fUElYRUxTKTtcbiAgY29uc3QgbWF4VG9wID0gTWF0aC5tYXgoVklFV1BPUlRfTUFSR0lOX0lOX1BJWEVMUywgd2luLmlubmVySGVpZ2h0IC0gcG9wb3ZlckVsLm9mZnNldEhlaWdodCAtIFZJRVdQT1JUX01BUkdJTl9JTl9QSVhFTFMpO1xuXG4gIGNvbnN0IGxlZnQgPSBNYXRoLm1pbihNYXRoLm1heChhbmNob3IubGVmdCwgVklFV1BPUlRfTUFSR0lOX0lOX1BJWEVMUyksIG1heExlZnQpO1xuICBjb25zdCB0b3AgPSBNYXRoLm1pbihNYXRoLm1heChhbmNob3IuYm90dG9tICsgQU5DSE9SX0dBUF9JTl9QSVhFTFMsIFZJRVdQT1JUX01BUkdJTl9JTl9QSVhFTFMpLCBtYXhUb3ApO1xuXG4gIHBvcG92ZXJFbC5zdHlsZS5sZWZ0ID0gYCR7U3RyaW5nKE1hdGgucm91bmQobGVmdCArIHdpbi5zY3JvbGxYKSl9cHhgO1xuICBwb3BvdmVyRWwuc3R5bGUudG9wID0gYCR7U3RyaW5nKE1hdGgucm91bmQodG9wICsgd2luLnNjcm9sbFkpKX1weGA7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWNBLFNBQVMsZUFBZTtBQUl4QixTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLGdCQUFnQjtBQUN6QixTQUFTLFNBQVM7QUFDbEIsU0FBUywyQkFBMkI7QUFLcEMsTUFBTSx1QkFBdUI7QUFNN0IsTUFBTSw0QkFBNEI7QUF5RWxDLGVBQXNCLFlBQW1CLFFBQXlEO0FBQ2hHLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUVKLFFBQU0sTUFBTSxPQUFPO0FBQ25CLFFBQU0sTUFBTSxrQkFBa0IsR0FBRztBQUNqQyxRQUFNLFlBQVksSUFBSSxLQUFLLFVBQVUsRUFBRSxLQUFLLE9BQU8sQ0FBQztBQUNwRCxzQkFBb0IsV0FBVyxDQUFDLFNBQVMsU0FBUyxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUM7QUFFdEUsU0FBTyxNQUFNLElBQUksUUFBc0IsQ0FBQyxZQUFZO0FBQ2xELFVBQU0sUUFBUSxFQUFFLFVBQVUsTUFBTTtBQUVoQyxhQUFTLE1BQU0sUUFBNEI7QUFDekMsVUFBSSxNQUFNLFVBQVU7QUFDbEI7QUFBQSxNQUNGO0FBQ0EsWUFBTSxXQUFXO0FBQ2pCLFVBQUksb0JBQW9CLGVBQWUsbUJBQW1CLElBQUk7QUFDOUQsZ0JBQVUsT0FBTztBQUNqQixjQUFRLE1BQU07QUFBQSxJQUNoQjtBQUVBLGFBQVMsZUFBcUI7QUFDNUIsWUFBTSxJQUFJO0FBQUEsSUFDWjtBQUVBLGFBQVMsV0FBaUI7QUFDeEIsWUFBTSxTQUFTLENBQUM7QUFBQSxJQUNsQjtBQVNBLGFBQVMsa0JBQWtCLEtBQXlCO0FBQ2xELFVBQUksSUFBSSxhQUFhLEVBQUUsU0FBUyxTQUFTLEdBQUc7QUFDMUM7QUFBQSxNQUNGO0FBQ0EsWUFBTSxJQUFJO0FBQUEsSUFDWjtBQUVBLFVBQU0sV0FBVyxNQUFNO0FBQUEsTUFDckIsUUFBUTtBQUFBLE1BQ1IsU0FBUztBQUFBLE1BQ1QsV0FBVztBQUFBLElBQ2IsQ0FBQztBQUVELGNBQVUsaUJBQWlCLFdBQVcsQ0FBQyxRQUF1QjtBQUM1RCxVQUFJLElBQUksUUFBUSxTQUFTO0FBQ3ZCLFlBQUksZUFBZTtBQUNuQixpQkFBUztBQUNUO0FBQUEsTUFDRjtBQUVBLFVBQUksSUFBSSxRQUFRLFVBQVU7QUFDeEIsWUFBSSxlQUFlO0FBQ25CLHFCQUFhO0FBQUEsTUFDZjtBQUFBLElBQ0YsQ0FBQztBQUVELFVBQU0saUJBQWlCLElBQUksUUFBUSxTQUFTO0FBQzVDLG1CQUFlLFVBQVUsQ0FBQyxXQUFXO0FBQ25DLGFBQ0csY0FBYyxnQkFBZ0IsRUFBRSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsUUFBUSxFQUFFLENBQUMsRUFDckUsT0FBTyxFQUNQLFNBQVMsU0FBUyxRQUFRLEVBQzFCLFFBQVEsUUFBUTtBQUFBLElBQ3JCLENBQUM7QUFDRCxtQkFBZSxVQUFVLENBQUMsV0FBVztBQUNuQyxhQUNHLGNBQWMsb0JBQW9CLEVBQUUsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLFFBQVEsTUFBTSxDQUFDLEVBQzdFLFNBQVMsU0FBUyxZQUFZLEVBQzlCLFFBQVEsWUFBWTtBQUFBLElBQ3pCLENBQUM7QUFFRCxRQUFJLGlCQUFpQixlQUFlLG1CQUFtQixJQUFJO0FBQzNELHFCQUFpQixXQUFXLFFBQVEsR0FBRztBQUN2QyxvQkFBZ0IsU0FBUztBQUFBLEVBQzNCLENBQUM7QUFDSDtBQU9BLFNBQVMsZ0JBQWdCLFdBQThCO0FBQ3JELFFBQU0sVUFBVSxVQUFVLGNBQWMsT0FBTztBQUMvQyxNQUFJLENBQUMsU0FBUztBQUNaO0FBQUEsRUFDRjtBQUVBLFVBQVEsTUFBTTtBQUNkLFVBQVEsT0FBTztBQUNqQjtBQVdBLFNBQVMsaUJBQWlCLFdBQXdCLFFBQXVCLEtBQW1CO0FBQzFGLFFBQU0sVUFBVSxLQUFLLElBQUksMkJBQTJCLElBQUksYUFBYSxVQUFVLGNBQWMseUJBQXlCO0FBQ3RILFFBQU0sU0FBUyxLQUFLLElBQUksMkJBQTJCLElBQUksY0FBYyxVQUFVLGVBQWUseUJBQXlCO0FBRXZILFFBQU0sT0FBTyxLQUFLLElBQUksS0FBSyxJQUFJLE9BQU8sTUFBTSx5QkFBeUIsR0FBRyxPQUFPO0FBQy9FLFFBQU0sTUFBTSxLQUFLLElBQUksS0FBSyxJQUFJLE9BQU8sU0FBUyxzQkFBc0IseUJBQXlCLEdBQUcsTUFBTTtBQUV0RyxZQUFVLE1BQU0sT0FBTyxHQUFHLE9BQU8sS0FBSyxNQUFNLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQztBQUNoRSxZQUFVLE1BQU0sTUFBTSxHQUFHLE9BQU8sS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQztBQUNoRTsiLAogICJuYW1lcyI6IFtdCn0K
@@ -256,6 +256,21 @@ export declare class ResourceLockedError extends Error {
256
256
  * @returns `true` if the note has at least one active lock, `false` otherwise.
257
257
  */
258
258
  export declare function isResourceLockedForPath(app: App, pathOrFile: PathOrFile): boolean;
259
+ /**
260
+ * Checks whether the note at the given path is currently locked directly OR is covered by a
261
+ * `subtree`-locked ancestor folder.
262
+ *
263
+ * Unlike {@link isResourceLockedForPath}, which only reports an exact-path lock, this also reports a
264
+ * path that lies under a folder locked in `subtree` mode. Use it to detect that a rename/move is
265
+ * happening inside a foreign plugin's in-flight locked transaction (which locks the affected folder
266
+ * subtree), so that a bystander (e.g. the rename/delete handler) can stay out of the way and let the
267
+ * transaction's owner keep its own links consistent.
268
+ *
269
+ * @param app - The Obsidian app instance.
270
+ * @param pathOrFile - The path or file of the note to check.
271
+ * @returns `true` if the path is itself locked or lies under a `subtree`-locked ancestor folder.
272
+ */
273
+ export declare function isResourceLockedForPathByAncestor(app: App, pathOrFile: PathOrFile): boolean;
259
274
  /**
260
275
  * Locks the note at the given path, making it read-only in every current and future
261
276
  * {@link MarkdownView} until the lock is released, and showing a lock indicator in the tab header,