@mnaoumov/obsidian-lib 10.5.1 → 10.6.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 (129) hide show
  1. package/codemirror/inline-token-widgets/package.json +6 -0
  2. package/codemirror/settings-facet/package.json +6 -0
  3. package/components/settings-facet-component/package.json +6 -0
  4. package/dist/lib/cjs/__merged.cjs +96 -1
  5. package/dist/lib/cjs/__merged.d.cts +17 -0
  6. package/dist/lib/cjs/anchored-suggest.cjs +232 -0
  7. package/dist/lib/cjs/anchored-suggest.d.cts +116 -0
  8. package/dist/lib/cjs/bug-report.cjs +4 -2
  9. package/dist/lib/cjs/bug-report.d.cts +1 -1
  10. package/dist/lib/cjs/code-block-render-handoff.cjs +272 -0
  11. package/dist/lib/cjs/code-block-render-handoff.d.cts +131 -0
  12. package/dist/lib/cjs/codemirror/index.cjs +7 -1
  13. package/dist/lib/cjs/codemirror/index.d.cts +2 -0
  14. package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +250 -0
  15. package/dist/lib/cjs/codemirror/inline-token-widgets.d.cts +109 -0
  16. package/dist/lib/cjs/codemirror/settings-facet.cjs +132 -0
  17. package/dist/lib/cjs/codemirror/settings-facet.d.cts +19 -0
  18. package/dist/lib/cjs/components/index.cjs +4 -1
  19. package/dist/lib/cjs/components/index.d.cts +1 -0
  20. package/dist/lib/cjs/components/settings-facet-component.cjs +136 -0
  21. package/dist/lib/cjs/components/settings-facet-component.d.cts +68 -0
  22. package/dist/lib/cjs/css-class.cjs +8 -1
  23. package/dist/lib/cjs/css-class.d.cts +28 -0
  24. package/dist/lib/cjs/desktop-request-url-stream.cjs +258 -0
  25. package/dist/lib/cjs/desktop-request-url-stream.d.cts +22 -0
  26. package/dist/lib/cjs/editor-suggest-registrar.cjs +8 -2
  27. package/dist/lib/cjs/editor-suggest-registrar.d.cts +14 -2
  28. package/dist/lib/cjs/editor-suggest.cjs +198 -0
  29. package/dist/lib/cjs/editor-suggest.d.cts +103 -0
  30. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  31. package/dist/lib/cjs/hotkey.cjs +185 -0
  32. package/dist/lib/cjs/hotkey.d.cts +59 -0
  33. package/dist/lib/cjs/i18n/locales/en.cjs +13 -1
  34. package/dist/lib/cjs/i18n/locales/en.d.cts +12 -0
  35. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +12 -0
  36. package/dist/lib/cjs/index.cjs +31 -1
  37. package/dist/lib/cjs/index.d.cts +10 -0
  38. package/dist/lib/cjs/inline-token-renderer.cjs +145 -0
  39. package/dist/lib/cjs/inline-token-renderer.d.cts +88 -0
  40. package/dist/lib/cjs/link-and-tag-input-suggest.cjs +325 -0
  41. package/dist/lib/cjs/link-and-tag-input-suggest.d.cts +229 -0
  42. package/dist/lib/cjs/markdown-code-block-processor.cjs +13 -1
  43. package/dist/lib/cjs/markdown-code-block-processor.d.cts +18 -0
  44. package/dist/lib/cjs/markdown.cjs +6 -1
  45. package/dist/lib/cjs/markdown.d.cts +10 -1
  46. package/dist/lib/cjs/rendered-markdown.cjs +306 -0
  47. package/dist/lib/cjs/rendered-markdown.d.cts +77 -0
  48. package/dist/lib/cjs/request-url.cjs +523 -0
  49. package/dist/lib/cjs/request-url.d.cts +233 -0
  50. package/dist/lib/cjs/setting-components/folder-list-component.cjs +216 -0
  51. package/dist/lib/cjs/setting-components/folder-list-component.d.cts +73 -0
  52. package/dist/lib/cjs/setting-components/hotkey-component.cjs +260 -0
  53. package/dist/lib/cjs/setting-components/hotkey-component.d.cts +85 -0
  54. package/dist/lib/cjs/setting-components/index.cjs +13 -1
  55. package/dist/lib/cjs/setting-components/index.d.cts +4 -0
  56. package/dist/lib/cjs/setting-components/list-component.cjs +291 -0
  57. package/dist/lib/cjs/setting-components/list-component.d.cts +106 -0
  58. package/dist/lib/cjs/setting-components/tag-list-component.cjs +220 -0
  59. package/dist/lib/cjs/setting-components/tag-list-component.d.cts +82 -0
  60. package/dist/lib/cjs/setting-ex.cjs +51 -1
  61. package/dist/lib/cjs/setting-ex.d.cts +35 -1
  62. package/dist/lib/cjs/settings-tabs.cjs +258 -0
  63. package/dist/lib/cjs/settings-tabs.d.cts +101 -0
  64. package/dist/lib/esm/__merged.d.mts +17 -0
  65. package/dist/lib/esm/__merged.mjs +99 -1
  66. package/dist/lib/esm/anchored-suggest.d.mts +116 -0
  67. package/dist/lib/esm/anchored-suggest.mjs +144 -0
  68. package/dist/lib/esm/bug-report.d.mts +1 -1
  69. package/dist/lib/esm/bug-report.mjs +4 -2
  70. package/dist/lib/esm/code-block-render-handoff.d.mts +131 -0
  71. package/dist/lib/esm/code-block-render-handoff.mjs +183 -0
  72. package/dist/lib/esm/codemirror/index.d.mts +2 -0
  73. package/dist/lib/esm/codemirror/index.mjs +5 -1
  74. package/dist/lib/esm/codemirror/inline-token-widgets.d.mts +109 -0
  75. package/dist/lib/esm/codemirror/inline-token-widgets.mjs +167 -0
  76. package/dist/lib/esm/codemirror/settings-facet.d.mts +19 -0
  77. package/dist/lib/esm/codemirror/settings-facet.mjs +44 -0
  78. package/dist/lib/esm/components/index.d.mts +1 -0
  79. package/dist/lib/esm/components/index.mjs +3 -1
  80. package/dist/lib/esm/components/settings-facet-component.d.mts +68 -0
  81. package/dist/lib/esm/components/settings-facet-component.mjs +48 -0
  82. package/dist/lib/esm/css-class.d.mts +28 -0
  83. package/dist/lib/esm/css-class.mjs +8 -1
  84. package/dist/lib/esm/desktop-request-url-stream.d.mts +22 -0
  85. package/dist/lib/esm/desktop-request-url-stream.mjs +170 -0
  86. package/dist/lib/esm/editor-suggest-registrar.d.mts +14 -2
  87. package/dist/lib/esm/editor-suggest-registrar.mjs +8 -2
  88. package/dist/lib/esm/editor-suggest.d.mts +103 -0
  89. package/dist/lib/esm/editor-suggest.mjs +109 -0
  90. package/dist/lib/esm/generated-during-build.mjs +2 -2
  91. package/dist/lib/esm/hotkey.d.mts +59 -0
  92. package/dist/lib/esm/hotkey.mjs +95 -0
  93. package/dist/lib/esm/i18n/locales/en.d.mts +12 -0
  94. package/dist/lib/esm/i18n/locales/en.mjs +13 -1
  95. package/dist/lib/esm/i18n/locales/translations-map.d.mts +12 -0
  96. package/dist/lib/esm/index.d.mts +10 -0
  97. package/dist/lib/esm/index.mjs +21 -1
  98. package/dist/lib/esm/inline-token-renderer.d.mts +88 -0
  99. package/dist/lib/esm/inline-token-renderer.mjs +59 -0
  100. package/dist/lib/esm/link-and-tag-input-suggest.d.mts +229 -0
  101. package/dist/lib/esm/link-and-tag-input-suggest.mjs +239 -0
  102. package/dist/lib/esm/markdown-code-block-processor.d.mts +18 -0
  103. package/dist/lib/esm/markdown-code-block-processor.mjs +16 -1
  104. package/dist/lib/esm/markdown.d.mts +10 -1
  105. package/dist/lib/esm/markdown.mjs +9 -1
  106. package/dist/lib/esm/rendered-markdown.d.mts +77 -0
  107. package/dist/lib/esm/rendered-markdown.mjs +219 -0
  108. package/dist/lib/esm/request-url.d.mts +233 -0
  109. package/dist/lib/esm/request-url.mjs +428 -0
  110. package/dist/lib/esm/setting-components/folder-list-component.d.mts +73 -0
  111. package/dist/lib/esm/setting-components/folder-list-component.mjs +131 -0
  112. package/dist/lib/esm/setting-components/hotkey-component.d.mts +85 -0
  113. package/dist/lib/esm/setting-components/hotkey-component.mjs +178 -0
  114. package/dist/lib/esm/setting-components/index.d.mts +4 -0
  115. package/dist/lib/esm/setting-components/index.mjs +9 -1
  116. package/dist/lib/esm/setting-components/list-component.d.mts +106 -0
  117. package/dist/lib/esm/setting-components/list-component.mjs +206 -0
  118. package/dist/lib/esm/setting-components/tag-list-component.d.mts +82 -0
  119. package/dist/lib/esm/setting-components/tag-list-component.mjs +131 -0
  120. package/dist/lib/esm/setting-ex.d.mts +35 -1
  121. package/dist/lib/esm/setting-ex.mjs +51 -1
  122. package/dist/lib/esm/settings-tabs.d.mts +101 -0
  123. package/dist/lib/esm/settings-tabs.mjs +170 -0
  124. package/dist/styles.css +83 -1
  125. package/package.json +1 -1
  126. package/setting-components/folder-list-component/package.json +6 -0
  127. package/setting-components/hotkey-component/package.json +6 -0
  128. package/setting-components/list-component/package.json +6 -0
  129. package/setting-components/tag-list-component/package.json +6 -0
@@ -0,0 +1,206 @@
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
+ (function () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return "/";
11
+ },
12
+ env: {},
13
+ platform: "android"
14
+ };
15
+ const existingProcess = globalThis.process;
16
+ if (!existingProcess) {
17
+ globalThis.process = browserProcess;
18
+ return;
19
+ }
20
+ if (existingProcess.versions?.node) {
21
+ return;
22
+ }
23
+ const existingProcessRecord = existingProcess;
24
+ for (const [key, value] of Object.entries(browserProcess)) {
25
+ existingProcessRecord[key] ??= value;
26
+ }
27
+ existingProcessRecord["browser"] = true;
28
+ }
29
+
30
+ ensureBrowserProcess();
31
+ })();
32
+
33
+ import { ensureNonNullable } from "@mnaoumov/typescript-lib/type-guards";
34
+ import {
35
+ ExtraButtonComponent,
36
+ ValueComponent
37
+ } from "obsidian";
38
+ import { CssClass } from "../css-class.mjs";
39
+ import { t } from "../i18n/i18n.mjs";
40
+ import { addPluginCssClasses } from "../plugin/plugin-context.mjs";
41
+ class ListComponent extends ValueComponent {
42
+ /**
43
+ * The element holding one row per item.
44
+ */
45
+ listEl;
46
+ /**
47
+ * The button that adds the typed item.
48
+ */
49
+ newItemButton;
50
+ /**
51
+ * The input the next item is typed into.
52
+ */
53
+ newItemInputEl;
54
+ changeCallback;
55
+ value = [];
56
+ /**
57
+ * Creates a new list component.
58
+ *
59
+ * @param containerEl - The container element.
60
+ * @param cssClass - An extra CSS class for the container, for a subclass.
61
+ */
62
+ constructor(containerEl, cssClass) {
63
+ super();
64
+ addPluginCssClasses(containerEl, cssClass ? [CssClass.ListComponent, cssClass] : CssClass.ListComponent);
65
+ this.listEl = containerEl.createDiv({ cls: "list-component-items" });
66
+ const newItemRowEl = containerEl.createDiv({ cls: "list-component-new-item" });
67
+ this.newItemInputEl = newItemRowEl.createEl("input", { type: "text" });
68
+ this.newItemInputEl.addEventListener("keydown", (event_) => {
69
+ if (event_.key !== "Enter" || event_.isComposing) {
70
+ return;
71
+ }
72
+ event_.preventDefault();
73
+ this.addTypedItem();
74
+ });
75
+ this.newItemButton = new ExtraButtonComponent(newItemRowEl).setIcon("plus").setTooltip(t(($) => $.obsidianLib.list.add)).onClick(() => {
76
+ this.addTypedItem();
77
+ });
78
+ this.render();
79
+ }
80
+ /**
81
+ * Adds the text typed into {@link ListComponent.newItemInputEl}, when it normalizes to an item not yet in the list, and
82
+ * clears the input.
83
+ *
84
+ * @returns Whether an item was added.
85
+ */
86
+ addTypedItem() {
87
+ if (this.disabled) {
88
+ return false;
89
+ }
90
+ const item = this.normalizeItem(this.newItemInputEl.value);
91
+ if (item === null || this.value.includes(item)) {
92
+ return false;
93
+ }
94
+ this.newItemInputEl.value = "";
95
+ this.setValueAndNotify([...this.value, item]);
96
+ return true;
97
+ }
98
+ /**
99
+ * Gets the items.
100
+ *
101
+ * @returns The items, in order.
102
+ */
103
+ getValue() {
104
+ return this.value;
105
+ }
106
+ /**
107
+ * Sets the callback to be called when the user adds, moves or removes an item.
108
+ *
109
+ * @param callback - The callback.
110
+ * @returns The component.
111
+ */
112
+ onChange(callback) {
113
+ this.changeCallback = callback;
114
+ return this;
115
+ }
116
+ /**
117
+ * Sets the disabled state of the component.
118
+ *
119
+ * @param isDisabled - The disabled state.
120
+ * @returns The component.
121
+ */
122
+ setDisabled(isDisabled) {
123
+ super.setDisabled(isDisabled);
124
+ this.newItemInputEl.disabled = isDisabled;
125
+ this.newItemButton.setDisabled(isDisabled);
126
+ this.render();
127
+ return this;
128
+ }
129
+ /**
130
+ * Sets the placeholder of {@link ListComponent.newItemInputEl}.
131
+ *
132
+ * @param placeholder - The placeholder.
133
+ * @returns The component.
134
+ */
135
+ setPlaceholder(placeholder) {
136
+ this.newItemInputEl.placeholder = placeholder;
137
+ return this;
138
+ }
139
+ /**
140
+ * Sets the items.
141
+ *
142
+ * @param value - The items, in order.
143
+ * @returns The component.
144
+ */
145
+ setValue(value) {
146
+ this.value = [...value];
147
+ this.render();
148
+ return this;
149
+ }
150
+ /**
151
+ * Formats an item for display.
152
+ *
153
+ * @param item - The item.
154
+ * @returns The text shown for it.
155
+ */
156
+ formatItem(item) {
157
+ return item;
158
+ }
159
+ /**
160
+ * Turns the typed text into an item. By default, trims it and refuses an empty one.
161
+ *
162
+ * @param text - The typed text.
163
+ * @returns The item, or `null` to add nothing.
164
+ */
165
+ normalizeItem(text) {
166
+ const item = text.trim();
167
+ return item || null;
168
+ }
169
+ moveItem(index, offset) {
170
+ const items = [...this.value];
171
+ const item = ensureNonNullable(items.splice(index, 1)[0]);
172
+ items.splice(index + offset, 0, item);
173
+ this.setValueAndNotify(items);
174
+ }
175
+ removeItem(index) {
176
+ this.setValueAndNotify(this.value.filter((_, itemIndex) => itemIndex !== index));
177
+ }
178
+ render() {
179
+ this.listEl.empty();
180
+ if (this.value.length === 0) {
181
+ this.listEl.createDiv({ cls: "list-component-empty", text: t(($) => $.obsidianLib.list.empty) });
182
+ return;
183
+ }
184
+ for (const [index, item] of this.value.entries()) {
185
+ const rowEl = this.listEl.createDiv({ cls: "list-component-item" });
186
+ rowEl.createSpan({ cls: "list-component-item-text", text: this.formatItem(item) });
187
+ new ExtraButtonComponent(rowEl).setIcon("arrow-up").setTooltip(t(($) => $.obsidianLib.list.moveUp)).setDisabled(this.disabled || index === 0).onClick(() => {
188
+ this.moveItem(index, -1);
189
+ });
190
+ new ExtraButtonComponent(rowEl).setIcon("arrow-down").setTooltip(t(($) => $.obsidianLib.list.moveDown)).setDisabled(this.disabled || index === this.value.length - 1).onClick(() => {
191
+ this.moveItem(index, 1);
192
+ });
193
+ new ExtraButtonComponent(rowEl).setIcon("x").setTooltip(t(($) => $.obsidianLib.list.remove)).setDisabled(this.disabled).onClick(() => {
194
+ this.removeItem(index);
195
+ });
196
+ }
197
+ }
198
+ setValueAndNotify(value) {
199
+ this.setValue(value);
200
+ this.changeCallback?.(this.value);
201
+ }
202
+ }
203
+ export {
204
+ ListComponent
205
+ };
206
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXR0aW5nLWNvbXBvbmVudHMvbGlzdC1jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIGEgY29tcG9uZW50IHRoYXQgZWRpdHMgYSByZW9yZGVyYWJsZSBsaXN0IG9mIHN0cmluZ3MuXG4gKi9cblxuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHtcbiAgRXh0cmFCdXR0b25Db21wb25lbnQsXG4gIFZhbHVlQ29tcG9uZW50XG59IGZyb20gJ29ic2lkaWFuJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAtLSBXZSBuZWVkIHRvIGltcG9ydCBgaW5pdFBsdWdpbkNvbnRleHRgIHRvIHVzZSBpdCBpbiB0aGUgdHNkb2NzLlxuaW1wb3J0IHR5cGUgeyBpbml0UGx1Z2luQ29udGV4dCB9IGZyb20gJy4uL3BsdWdpbi9wbHVnaW4tY29udGV4dC50cyc7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzIC0tIFdlIG5lZWQgdG8gaW1wb3J0IGBTZXR0aW5nRXhgIHRvIHVzZSBpdCBpbiB0aGUgdHNkb2NzLlxuaW1wb3J0IHR5cGUgeyBTZXR0aW5nRXggfSBmcm9tICcuLi9zZXR0aW5nLWV4LnRzJztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgLS0gV2UgbmVlZCB0byBpbXBvcnQgRm9sZGVyTGlzdENvbXBvbmVudCB0byB1c2UgaXQgaW4gdGhlIHRzZG9jcy5cbmltcG9ydCB0eXBlIHsgRm9sZGVyTGlzdENvbXBvbmVudCB9IGZyb20gJy4vZm9sZGVyLWxpc3QtY29tcG9uZW50LnRzJztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgLS0gV2UgbmVlZCB0byBpbXBvcnQgVGFnTGlzdENvbXBvbmVudCB0byB1c2UgaXQgaW4gdGhlIHRzZG9jcy5cbmltcG9ydCB0eXBlIHsgVGFnTGlzdENvbXBvbmVudCB9IGZyb20gJy4vdGFnLWxpc3QtY29tcG9uZW50LnRzJztcbmltcG9ydCB0eXBlIHsgVmFsdWVDb21wb25lbnRXaXRoQ2hhbmdlVHJhY2tpbmcgfSBmcm9tICcuL3ZhbHVlLWNvbXBvbmVudC13aXRoLWNoYW5nZS10cmFja2luZy50cyc7XG5cbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHsgYWRkUGx1Z2luQ3NzQ2xhc3NlcyB9IGZyb20gJy4uL3BsdWdpbi9wbHVnaW4tY29udGV4dC50cyc7XG5cbi8qKlxuICogQSBjb21wb25lbnQgdGhhdCBlZGl0cyBhIHJlb3JkZXJhYmxlIGxpc3Qgb2Ygc3RyaW5nczogZWFjaCBpdGVtIGhhcyBtb3ZlLXVwLCBtb3ZlLWRvd24gYW5kIHJlbW92ZSBidXR0b25zLCBhbmQgYSByb3dcbiAqIGJlbG93IHRoZSBsaXN0IGFkZHMgYW4gaXRlbSwgb24gaXRzIGJ1dHRvbiBvciBvbiBFbnRlci5cbiAqXG4gKiB7QGxpbmsgTGlzdENvbXBvbmVudC5uZXdJdGVtSW5wdXRFbH0gaXMgYSBwbGFpbiBgPGlucHV0PmAsIHNvIGEgc3VnZ2VzdCBjYW4gYmUgYXR0YWNoZWQgdG8gaXQ7IHtAbGluayBGb2xkZXJMaXN0Q29tcG9uZW50fVxuICogYW5kIHtAbGluayBUYWdMaXN0Q29tcG9uZW50fSBkbyBleGFjdGx5IHRoYXQuIEEgc3ViY2xhc3Mgc2hhcGVzIHdoYXQgaXMgYWRkZWQgYnkgb3ZlcnJpZGluZ1xuICoge0BsaW5rIExpc3RDb21wb25lbnQubm9ybWFsaXplSXRlbX0gYW5kIGhvdyBhbiBpdGVtIHJlYWRzIGJ5IG92ZXJyaWRpbmcge0BsaW5rIExpc3RDb21wb25lbnQuZm9ybWF0SXRlbX0uIEFuIGl0ZW1cbiAqIGFscmVhZHkgaW4gdGhlIGxpc3QgaXMgbm90IGFkZGVkIHR3aWNlLlxuICpcbiAqIFlvdSBjYW4gYWRkIHRoaXMgY29tcG9uZW50IHVzaW5nIHtAbGluayBTZXR0aW5nRXguYWRkTGlzdH0uXG4gKlxuICogSW4gb3JkZXIgdG8gYWRkIHRoZSBzdHlsZXMgZm9yIHRoZSBjb21wb25lbnQsIHVzZSB7QGxpbmsgaW5pdFBsdWdpbkNvbnRleHR9IGluIHlvdXIgcGx1Z2luJ3MgYG9ubG9hZCgpYCBmdW5jdGlvbi5cbiAqXG4gKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGNvcHkgc3R5bGVzIGZyb20ge0BsaW5rIGh0dHBzOi8vdW5wa2cuY29tL0BtbmFvdW1vdi9vYnNpZGlhbi1saWIvZGlzdC9zdHlsZXMuY3NzfS5cbiAqL1xuZXhwb3J0IGNsYXNzIExpc3RDb21wb25lbnQgZXh0ZW5kcyBWYWx1ZUNvbXBvbmVudDxyZWFkb25seSBzdHJpbmdbXT4gaW1wbGVtZW50cyBWYWx1ZUNvbXBvbmVudFdpdGhDaGFuZ2VUcmFja2luZzxyZWFkb25seSBzdHJpbmdbXT4ge1xuICAvKipcbiAgICogVGhlIGVsZW1lbnQgaG9sZGluZyBvbmUgcm93IHBlciBpdGVtLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxpc3RFbDogSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBidXR0b24gdGhhdCBhZGRzIHRoZSB0eXBlZCBpdGVtLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5ld0l0ZW1CdXR0b246IEV4dHJhQnV0dG9uQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgdGhlIG5leHQgaXRlbSBpcyB0eXBlZCBpbnRvLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5ld0l0ZW1JbnB1dEVsOiBIVE1MSW5wdXRFbGVtZW50O1xuXG4gIHByaXZhdGUgY2hhbmdlQ2FsbGJhY2s/OiAobmV3VmFsdWU6IHJlYWRvbmx5IHN0cmluZ1tdKSA9PiB2b2lkO1xuICBwcml2YXRlIHZhbHVlOiByZWFkb25seSBzdHJpbmdbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGxpc3QgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyRWwgLSBUaGUgY29udGFpbmVyIGVsZW1lbnQuXG4gICAqIEBwYXJhbSBjc3NDbGFzcyAtIEFuIGV4dHJhIENTUyBjbGFzcyBmb3IgdGhlIGNvbnRhaW5lciwgZm9yIGEgc3ViY2xhc3MuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50LCBjc3NDbGFzcz86IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gICAgYWRkUGx1Z2luQ3NzQ2xhc3Nlcyhjb250YWluZXJFbCwgY3NzQ2xhc3MgPyBbQ3NzQ2xhc3MuTGlzdENvbXBvbmVudCwgY3NzQ2xhc3NdIDogQ3NzQ2xhc3MuTGlzdENvbXBvbmVudCk7XG4gICAgdGhpcy5saXN0RWwgPSBjb250YWluZXJFbC5jcmVhdGVEaXYoeyBjbHM6ICdsaXN0LWNvbXBvbmVudC1pdGVtcycgfSk7XG4gICAgY29uc3QgbmV3SXRlbVJvd0VsID0gY29udGFpbmVyRWwuY3JlYXRlRGl2KHsgY2xzOiAnbGlzdC1jb21wb25lbnQtbmV3LWl0ZW0nIH0pO1xuICAgIHRoaXMubmV3SXRlbUlucHV0RWwgPSBuZXdJdGVtUm93RWwuY3JlYXRlRWwoJ2lucHV0JywgeyB0eXBlOiAndGV4dCcgfSk7XG4gICAgdGhpcy5uZXdJdGVtSW5wdXRFbC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50XykgPT4ge1xuICAgICAgaWYgKGV2ZW50Xy5rZXkgIT09ICdFbnRlcicgfHwgZXZlbnRfLmlzQ29tcG9zaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZXZlbnRfLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmFkZFR5cGVkSXRlbSgpO1xuICAgIH0pO1xuICAgIHRoaXMubmV3SXRlbUJ1dHRvbiA9IG5ldyBFeHRyYUJ1dHRvbkNvbXBvbmVudChuZXdJdGVtUm93RWwpXG4gICAgICAuc2V0SWNvbigncGx1cycpXG4gICAgICAuc2V0VG9vbHRpcCh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLmxpc3QuYWRkKSlcbiAgICAgIC5vbkNsaWNrKCgpID0+IHtcbiAgICAgICAgdGhpcy5hZGRUeXBlZEl0ZW0oKTtcbiAgICAgIH0pO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyB0aGUgdGV4dCB0eXBlZCBpbnRvIHtAbGluayBMaXN0Q29tcG9uZW50Lm5ld0l0ZW1JbnB1dEVsfSwgd2hlbiBpdCBub3JtYWxpemVzIHRvIGFuIGl0ZW0gbm90IHlldCBpbiB0aGUgbGlzdCwgYW5kXG4gICAqIGNsZWFycyB0aGUgaW5wdXQuXG4gICAqXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgYW4gaXRlbSB3YXMgYWRkZWQuXG4gICAqL1xuICBwdWJsaWMgYWRkVHlwZWRJdGVtKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLm5vcm1hbGl6ZUl0ZW0odGhpcy5uZXdJdGVtSW5wdXRFbC52YWx1ZSk7XG4gICAgaWYgKGl0ZW0gPT09IG51bGwgfHwgdGhpcy52YWx1ZS5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLm5ld0l0ZW1JbnB1dEVsLnZhbHVlID0gJyc7XG4gICAgdGhpcy5zZXRWYWx1ZUFuZE5vdGlmeShbLi4udGhpcy52YWx1ZSwgaXRlbV0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGl0ZW1zLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgaXRlbXMsIGluIG9yZGVyLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGdldFZhbHVlKCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiB0aGUgdXNlciBhZGRzLCBtb3ZlcyBvciByZW1vdmVzIGFuIGl0ZW0uXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjay5cbiAgICogQHJldHVybnMgVGhlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBvbkNoYW5nZShjYWxsYmFjazogKG5ld1ZhbHVlOiByZWFkb25seSBzdHJpbmdbXSkgPT4gdm9pZCk6IHRoaXMge1xuICAgIHRoaXMuY2hhbmdlQ2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBkaXNhYmxlZCBzdGF0ZSBvZiB0aGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gaXNEaXNhYmxlZCAtIFRoZSBkaXNhYmxlZCBzdGF0ZS5cbiAgICogQHJldHVybnMgVGhlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBzZXREaXNhYmxlZChpc0Rpc2FibGVkOiBib29sZWFuKTogdGhpcyB7XG4gICAgc3VwZXIuc2V0RGlzYWJsZWQoaXNEaXNhYmxlZCk7XG4gICAgdGhpcy5uZXdJdGVtSW5wdXRFbC5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgdGhpcy5uZXdJdGVtQnV0dG9uLnNldERpc2FibGVkKGlzRGlzYWJsZWQpO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgcGxhY2Vob2xkZXIgb2Yge0BsaW5rIExpc3RDb21wb25lbnQubmV3SXRlbUlucHV0RWx9LlxuICAgKlxuICAgKiBAcGFyYW0gcGxhY2Vob2xkZXIgLSBUaGUgcGxhY2Vob2xkZXIuXG4gICAqIEByZXR1cm5zIFRoZSBjb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgc2V0UGxhY2Vob2xkZXIocGxhY2Vob2xkZXI6IHN0cmluZyk6IHRoaXMge1xuICAgIHRoaXMubmV3SXRlbUlucHV0RWwucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBpdGVtcy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGl0ZW1zLCBpbiBvcmRlci5cbiAgICogQHJldHVybnMgVGhlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBzZXRWYWx1ZSh2YWx1ZTogcmVhZG9ubHkgc3RyaW5nW10pOiB0aGlzIHtcbiAgICB0aGlzLnZhbHVlID0gWy4uLnZhbHVlXTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgYW4gaXRlbSBmb3IgZGlzcGxheS5cbiAgICpcbiAgICogQHBhcmFtIGl0ZW0gLSBUaGUgaXRlbS5cbiAgICogQHJldHVybnMgVGhlIHRleHQgc2hvd24gZm9yIGl0LlxuICAgKi9cbiAgcHJvdGVjdGVkIGZvcm1hdEl0ZW0oaXRlbTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gaXRlbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUdXJucyB0aGUgdHlwZWQgdGV4dCBpbnRvIGFuIGl0ZW0uIEJ5IGRlZmF1bHQsIHRyaW1zIGl0IGFuZCByZWZ1c2VzIGFuIGVtcHR5IG9uZS5cbiAgICpcbiAgICogQHBhcmFtIHRleHQgLSBUaGUgdHlwZWQgdGV4dC5cbiAgICogQHJldHVybnMgVGhlIGl0ZW0sIG9yIGBudWxsYCB0byBhZGQgbm90aGluZy5cbiAgICovXG4gIHByb3RlY3RlZCBub3JtYWxpemVJdGVtKHRleHQ6IHN0cmluZyk6IG51bGwgfCBzdHJpbmcge1xuICAgIGNvbnN0IGl0ZW0gPSB0ZXh0LnRyaW0oKTtcbiAgICByZXR1cm4gaXRlbSB8fCBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBtb3ZlSXRlbShpbmRleDogbnVtYmVyLCBvZmZzZXQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGl0ZW1zID0gWy4uLnRoaXMudmFsdWVdO1xuICAgIC8vIFRoZSBidXR0b25zIHRoYXQgd291bGQgbW92ZSBhbiBpdGVtIG9mZiBlaXRoZXIgZW5kIGFyZSBkaXNhYmxlZC5cbiAgICBjb25zdCBpdGVtID0gZW5zdXJlTm9uTnVsbGFibGUoaXRlbXMuc3BsaWNlKGluZGV4LCAxKVswXSk7XG4gICAgaXRlbXMuc3BsaWNlKGluZGV4ICsgb2Zmc2V0LCAwLCBpdGVtKTtcbiAgICB0aGlzLnNldFZhbHVlQW5kTm90aWZ5KGl0ZW1zKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlSXRlbShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZXRWYWx1ZUFuZE5vdGlmeSh0aGlzLnZhbHVlLmZpbHRlcigoXywgaXRlbUluZGV4KSA9PiBpdGVtSW5kZXggIT09IGluZGV4KSk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlcigpOiB2b2lkIHtcbiAgICB0aGlzLmxpc3RFbC5lbXB0eSgpO1xuICAgIGlmICh0aGlzLnZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5saXN0RWwuY3JlYXRlRGl2KHsgY2xzOiAnbGlzdC1jb21wb25lbnQtZW1wdHknLCB0ZXh0OiB0KCgkKSA9PiAkLm9ic2lkaWFuTGliLmxpc3QuZW1wdHkpIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2luZGV4LCBpdGVtXSBvZiB0aGlzLnZhbHVlLmVudHJpZXMoKSkge1xuICAgICAgY29uc3Qgcm93RWwgPSB0aGlzLmxpc3RFbC5jcmVhdGVEaXYoeyBjbHM6ICdsaXN0LWNvbXBvbmVudC1pdGVtJyB9KTtcbiAgICAgIHJvd0VsLmNyZWF0ZVNwYW4oeyBjbHM6ICdsaXN0LWNvbXBvbmVudC1pdGVtLXRleHQnLCB0ZXh0OiB0aGlzLmZvcm1hdEl0ZW0oaXRlbSkgfSk7XG4gICAgICBuZXcgRXh0cmFCdXR0b25Db21wb25lbnQocm93RWwpXG4gICAgICAgIC5zZXRJY29uKCdhcnJvdy11cCcpXG4gICAgICAgIC5zZXRUb29sdGlwKHQoKCQpID0+ICQub2JzaWRpYW5MaWIubGlzdC5tb3ZlVXApKVxuICAgICAgICAuc2V0RGlzYWJsZWQodGhpcy5kaXNhYmxlZCB8fCBpbmRleCA9PT0gMClcbiAgICAgICAgLm9uQ2xpY2soKCkgPT4ge1xuICAgICAgICAgIHRoaXMubW92ZUl0ZW0oaW5kZXgsIC0xKTtcbiAgICAgICAgfSk7XG4gICAgICBuZXcgRXh0cmFCdXR0b25Db21wb25lbnQocm93RWwpXG4gICAgICAgIC5zZXRJY29uKCdhcnJvdy1kb3duJylcbiAgICAgICAgLnNldFRvb2x0aXAodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5saXN0Lm1vdmVEb3duKSlcbiAgICAgICAgLnNldERpc2FibGVkKHRoaXMuZGlzYWJsZWQgfHwgaW5kZXggPT09IHRoaXMudmFsdWUubGVuZ3RoIC0gMSlcbiAgICAgICAgLm9uQ2xpY2soKCkgPT4ge1xuICAgICAgICAgIHRoaXMubW92ZUl0ZW0oaW5kZXgsIDEpO1xuICAgICAgICB9KTtcbiAgICAgIG5ldyBFeHRyYUJ1dHRvbkNvbXBvbmVudChyb3dFbClcbiAgICAgICAgLnNldEljb24oJ3gnKVxuICAgICAgICAuc2V0VG9vbHRpcCh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLmxpc3QucmVtb3ZlKSlcbiAgICAgICAgLnNldERpc2FibGVkKHRoaXMuZGlzYWJsZWQpXG4gICAgICAgIC5vbkNsaWNrKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oaW5kZXgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFZhbHVlQW5kTm90aWZ5KHZhbHVlOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMuc2V0VmFsdWUodmFsdWUpO1xuICAgIHRoaXMuY2hhbmdlQ2FsbGJhY2s/Lih0aGlzLnZhbHVlKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU1BLFNBQVMseUJBQXlCO0FBQ2xDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBWVAsU0FBUyxnQkFBZ0I7QUFDekIsU0FBUyxTQUFTO0FBQ2xCLFNBQVMsMkJBQTJCO0FBaUI3QixNQUFNLHNCQUFzQixlQUFpRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWxIO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0E7QUFBQSxFQUVSO0FBQUEsRUFDQSxRQUEyQixDQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRN0IsWUFBWSxhQUEwQixVQUFtQjtBQUM5RCxVQUFNO0FBQ04sd0JBQW9CLGFBQWEsV0FBVyxDQUFDLFNBQVMsZUFBZSxRQUFRLElBQUksU0FBUyxhQUFhO0FBQ3ZHLFNBQUssU0FBUyxZQUFZLFVBQVUsRUFBRSxLQUFLLHVCQUF1QixDQUFDO0FBQ25FLFVBQU0sZUFBZSxZQUFZLFVBQVUsRUFBRSxLQUFLLDBCQUEwQixDQUFDO0FBQzdFLFNBQUssaUJBQWlCLGFBQWEsU0FBUyxTQUFTLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDckUsU0FBSyxlQUFlLGlCQUFpQixXQUFXLENBQUMsV0FBVztBQUMxRCxVQUFJLE9BQU8sUUFBUSxXQUFXLE9BQU8sYUFBYTtBQUNoRDtBQUFBLE1BQ0Y7QUFFQSxhQUFPLGVBQWU7QUFDdEIsV0FBSyxhQUFhO0FBQUEsSUFDcEIsQ0FBQztBQUNELFNBQUssZ0JBQWdCLElBQUkscUJBQXFCLFlBQVksRUFDdkQsUUFBUSxNQUFNLEVBQ2QsV0FBVyxFQUFFLENBQUMsTUFBTSxFQUFFLFlBQVksS0FBSyxHQUFHLENBQUMsRUFDM0MsUUFBUSxNQUFNO0FBQ2IsV0FB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
@@ -0,0 +1,82 @@
1
+ /// <reference path="../library-references.d.mts" />
2
+ /// <reference lib="dom" />
3
+ /**
4
+ * @file
5
+ *
6
+ * Contains a component that edits a reorderable list of tags, with a tag suggest.
7
+ */
8
+ import type { App } from 'obsidian';
9
+ import { AbstractInputSuggest } from 'obsidian';
10
+ import type { TagSuggestion } from '../link-and-tag-input-suggest.mjs';
11
+ import { ListComponent } from './list-component.mjs';
12
+ /**
13
+ * Suggests the vault's tags in an `<input>`, whether or not the typed text starts with `#`. A picked tag is put into the
14
+ * input without the `#`.
15
+ */
16
+ export declare class TagInputSuggest extends AbstractInputSuggest<TagSuggestion> {
17
+ /**
18
+ * The input the suggest completes.
19
+ */
20
+ protected readonly inputEl: HTMLInputElement;
21
+ /**
22
+ * Creates a new tag suggest.
23
+ *
24
+ * @param app - The Obsidian app.
25
+ * @param inputEl - The input.
26
+ */
27
+ constructor(app: App, inputEl: HTMLInputElement);
28
+ /**
29
+ * Renders a tag with its note count.
30
+ *
31
+ * @param suggestion - The tag.
32
+ * @param el - The element to render into.
33
+ */
34
+ renderSuggestion(suggestion: TagSuggestion, el: HTMLElement): void;
35
+ /**
36
+ * Puts the tag into the input, dispatches an `input` event, then calls the `onSelect` callback.
37
+ *
38
+ * @param suggestion - The tag.
39
+ * @param $event - The event that picked it.
40
+ */
41
+ selectSuggestion(suggestion: TagSuggestion, $event: KeyboardEvent | MouseEvent): void;
42
+ /**
43
+ * Gets the tags matching the typed text.
44
+ *
45
+ * @param query - The typed text.
46
+ * @returns The tags, best match first, then the most used.
47
+ */
48
+ protected getSuggestions(query: string): TagSuggestion[];
49
+ }
50
+ /**
51
+ * A {@link ListComponent} of tags, stored without the `#` and shown with it. The add row suggests the vault's tags, and
52
+ * a typed tag is refused unless it is a valid Obsidian tag: letters, digits, `_`, `-` and `/`, not digits only.
53
+ *
54
+ * You can add this component using {@link SettingEx.addTagList}.
55
+ */
56
+ export declare class TagListComponent extends ListComponent {
57
+ /**
58
+ * The tag suggest attached to {@link ListComponent.newItemInputEl}.
59
+ */
60
+ readonly suggest: TagInputSuggest;
61
+ /**
62
+ * Creates a new tag list component.
63
+ *
64
+ * @param containerEl - The container element.
65
+ * @param app - The Obsidian app.
66
+ */
67
+ constructor(containerEl: HTMLElement, app: App);
68
+ /**
69
+ * Shows a tag with its `#`.
70
+ *
71
+ * @param item - The tag.
72
+ * @returns The tag with its `#`.
73
+ */
74
+ protected formatItem(item: string): string;
75
+ /**
76
+ * Strips the `#` from a typed tag and validates it.
77
+ *
78
+ * @param text - The typed text.
79
+ * @returns The tag, or `null` when it is not a valid tag.
80
+ */
81
+ protected normalizeItem(text: string): null | string;
82
+ }
@@ -0,0 +1,131 @@
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
+ (function () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return "/";
11
+ },
12
+ env: {},
13
+ platform: "android"
14
+ };
15
+ const existingProcess = globalThis.process;
16
+ if (!existingProcess) {
17
+ globalThis.process = browserProcess;
18
+ return;
19
+ }
20
+ if (existingProcess.versions?.node) {
21
+ return;
22
+ }
23
+ const existingProcessRecord = existingProcess;
24
+ for (const [key, value] of Object.entries(browserProcess)) {
25
+ existingProcessRecord[key] ??= value;
26
+ }
27
+ existingProcessRecord["browser"] = true;
28
+ }
29
+
30
+ ensureBrowserProcess();
31
+ })();
32
+
33
+ import { AbstractInputSuggest } from "obsidian";
34
+ import { CssClass } from "../css-class.mjs";
35
+ import { getVaultTagSuggestions } from "../link-and-tag-input-suggest.mjs";
36
+ import { ListComponent } from "./list-component.mjs";
37
+ const TAG_PREFIX = "#";
38
+ const LEADING_TAG_PREFIXES_REG_EXP = /^#+/u;
39
+ const TAG_REG_EXP = /^[\p{L}\p{N}_/-]+$/u;
40
+ const DIGITS_ONLY_REG_EXP = /^\d+$/u;
41
+ class TagInputSuggest extends AbstractInputSuggest {
42
+ /**
43
+ * The input the suggest completes.
44
+ */
45
+ inputEl;
46
+ /**
47
+ * Creates a new tag suggest.
48
+ *
49
+ * @param app - The Obsidian app.
50
+ * @param inputEl - The input.
51
+ */
52
+ constructor(app, inputEl) {
53
+ super(app, inputEl);
54
+ this.inputEl = inputEl;
55
+ }
56
+ /**
57
+ * Renders a tag with its note count.
58
+ *
59
+ * @param suggestion - The tag.
60
+ * @param el - The element to render into.
61
+ */
62
+ renderSuggestion(suggestion, el) {
63
+ el.addClass("mod-complex");
64
+ el.createDiv({ cls: "suggestion-content", text: `${TAG_PREFIX}${suggestion.tag}` });
65
+ el.createDiv({ cls: "suggestion-aux", text: String(suggestion.count) });
66
+ }
67
+ /**
68
+ * Puts the tag into the input, dispatches an `input` event, then calls the `onSelect` callback.
69
+ *
70
+ * @param suggestion - The tag.
71
+ * @param $event - The event that picked it.
72
+ */
73
+ selectSuggestion(suggestion, $event) {
74
+ this.setValue(suggestion.tag);
75
+ this.inputEl.dispatchEvent(new Event("input", { bubbles: true }));
76
+ super.selectSuggestion(suggestion, $event);
77
+ this.close();
78
+ }
79
+ /**
80
+ * Gets the tags matching the typed text.
81
+ *
82
+ * @param query - The typed text.
83
+ * @returns The tags, best match first, then the most used.
84
+ */
85
+ getSuggestions(query) {
86
+ return getVaultTagSuggestions({ app: this.app, query: query.trim().replace(LEADING_TAG_PREFIXES_REG_EXP, "") });
87
+ }
88
+ }
89
+ class TagListComponent extends ListComponent {
90
+ /**
91
+ * The tag suggest attached to {@link ListComponent.newItemInputEl}.
92
+ */
93
+ suggest;
94
+ /**
95
+ * Creates a new tag list component.
96
+ *
97
+ * @param containerEl - The container element.
98
+ * @param app - The Obsidian app.
99
+ */
100
+ constructor(containerEl, app) {
101
+ super(containerEl, CssClass.TagListComponent);
102
+ this.suggest = new TagInputSuggest(app, this.newItemInputEl);
103
+ this.suggest.onSelect(() => {
104
+ this.addTypedItem();
105
+ });
106
+ }
107
+ /**
108
+ * Shows a tag with its `#`.
109
+ *
110
+ * @param item - The tag.
111
+ * @returns The tag with its `#`.
112
+ */
113
+ formatItem(item) {
114
+ return `${TAG_PREFIX}${item}`;
115
+ }
116
+ /**
117
+ * Strips the `#` from a typed tag and validates it.
118
+ *
119
+ * @param text - The typed text.
120
+ * @returns The tag, or `null` when it is not a valid tag.
121
+ */
122
+ normalizeItem(text) {
123
+ const tag = text.trim().replace(LEADING_TAG_PREFIXES_REG_EXP, "");
124
+ return TAG_REG_EXP.test(tag) && !DIGITS_ONLY_REG_EXP.test(tag) ? tag : null;
125
+ }
126
+ }
127
+ export {
128
+ TagInputSuggest,
129
+ TagListComponent
130
+ };
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXR0aW5nLWNvbXBvbmVudHMvdGFnLWxpc3QtY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb250YWlucyBhIGNvbXBvbmVudCB0aGF0IGVkaXRzIGEgcmVvcmRlcmFibGUgbGlzdCBvZiB0YWdzLCB3aXRoIGEgdGFnIHN1Z2dlc3QuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IEFic3RyYWN0SW5wdXRTdWdnZXN0IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFRhZ1N1Z2dlc3Rpb24gfSBmcm9tICcuLi9saW5rLWFuZC10YWctaW5wdXQtc3VnZ2VzdC50cyc7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzIC0tIFdlIG5lZWQgdG8gaW1wb3J0IGBTZXR0aW5nRXhgIHRvIHVzZSBpdCBpbiB0aGUgdHNkb2NzLlxuaW1wb3J0IHR5cGUgeyBTZXR0aW5nRXggfSBmcm9tICcuLi9zZXR0aW5nLWV4LnRzJztcblxuaW1wb3J0IHsgQ3NzQ2xhc3MgfSBmcm9tICcuLi9jc3MtY2xhc3MudHMnO1xuaW1wb3J0IHsgZ2V0VmF1bHRUYWdTdWdnZXN0aW9ucyB9IGZyb20gJy4uL2xpbmstYW5kLXRhZy1pbnB1dC1zdWdnZXN0LnRzJztcbmltcG9ydCB7IExpc3RDb21wb25lbnQgfSBmcm9tICcuL2xpc3QtY29tcG9uZW50LnRzJztcblxuY29uc3QgVEFHX1BSRUZJWCA9ICcjJztcbmNvbnN0IExFQURJTkdfVEFHX1BSRUZJWEVTX1JFR19FWFAgPSAvXiMrL3U7XG5jb25zdCBUQUdfUkVHX0VYUCA9IC9eW1xccHtMfVxccHtOfV8vLV0rJC91O1xuY29uc3QgRElHSVRTX09OTFlfUkVHX0VYUCA9IC9eXFxkKyQvdTtcblxuLyoqXG4gKiBTdWdnZXN0cyB0aGUgdmF1bHQncyB0YWdzIGluIGFuIGA8aW5wdXQ+YCwgd2hldGhlciBvciBub3QgdGhlIHR5cGVkIHRleHQgc3RhcnRzIHdpdGggYCNgLiBBIHBpY2tlZCB0YWcgaXMgcHV0IGludG8gdGhlXG4gKiBpbnB1dCB3aXRob3V0IHRoZSBgI2AuXG4gKi9cbmV4cG9ydCBjbGFzcyBUYWdJbnB1dFN1Z2dlc3QgZXh0ZW5kcyBBYnN0cmFjdElucHV0U3VnZ2VzdDxUYWdTdWdnZXN0aW9uPiB7XG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgdGhlIHN1Z2dlc3QgY29tcGxldGVzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGlucHV0RWw6IEhUTUxJbnB1dEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgdGFnIHN1Z2dlc3QuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwLlxuICAgKiBAcGFyYW0gaW5wdXRFbCAtIFRoZSBpbnB1dC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgaW5wdXRFbDogSFRNTElucHV0RWxlbWVudCkge1xuICAgIHN1cGVyKGFwcCwgaW5wdXRFbCk7XG4gICAgdGhpcy5pbnB1dEVsID0gaW5wdXRFbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGEgdGFnIHdpdGggaXRzIG5vdGUgY291bnQuXG4gICAqXG4gICAqIEBwYXJhbSBzdWdnZXN0aW9uIC0gVGhlIHRhZy5cbiAgICogQHBhcmFtIGVsIC0gVGhlIGVsZW1lbnQgdG8gcmVuZGVyIGludG8uXG4gICAqL1xuICBwdWJsaWMgcmVuZGVyU3VnZ2VzdGlvbihzdWdnZXN0aW9uOiBUYWdTdWdnZXN0aW9uLCBlbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBlbC5hZGRDbGFzcygnbW9kLWNvbXBsZXgnKTtcbiAgICBlbC5jcmVhdGVEaXYoeyBjbHM6ICdzdWdnZXN0aW9uLWNvbnRlbnQnLCB0ZXh0OiBgJHtUQUdfUFJFRklYfSR7c3VnZ2VzdGlvbi50YWd9YCB9KTtcbiAgICBlbC5jcmVhdGVEaXYoeyBjbHM6ICdzdWdnZXN0aW9uLWF1eCcsIHRleHQ6IFN0cmluZyhzdWdnZXN0aW9uLmNvdW50KSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdXRzIHRoZSB0YWcgaW50byB0aGUgaW5wdXQsIGRpc3BhdGNoZXMgYW4gYGlucHV0YCBldmVudCwgdGhlbiBjYWxscyB0aGUgYG9uU2VsZWN0YCBjYWxsYmFjay5cbiAgICpcbiAgICogQHBhcmFtIHN1Z2dlc3Rpb24gLSBUaGUgdGFnLlxuICAgKiBAcGFyYW0gJGV2ZW50IC0gVGhlIGV2ZW50IHRoYXQgcGlja2VkIGl0LlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIHNlbGVjdFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbjogVGFnU3VnZ2VzdGlvbiwgJGV2ZW50OiBLZXlib2FyZEV2ZW50IHwgTW91c2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuc2V0VmFsdWUoc3VnZ2VzdGlvbi50YWcpO1xuICAgIHRoaXMuaW5wdXRFbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnaW5wdXQnLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgIHN1cGVyLnNlbGVjdFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbiwgJGV2ZW50KTtcbiAgICB0aGlzLmNsb3NlKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdGFncyBtYXRjaGluZyB0aGUgdHlwZWQgdGV4dC5cbiAgICpcbiAgICogQHBhcmFtIHF1ZXJ5IC0gVGhlIHR5cGVkIHRleHQuXG4gICAqIEByZXR1cm5zIFRoZSB0YWdzLCBiZXN0IG1hdGNoIGZpcnN0LCB0aGVuIHRoZSBtb3N0IHVzZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0U3VnZ2VzdGlvbnMocXVlcnk6IHN0cmluZyk6IFRhZ1N1Z2dlc3Rpb25bXSB7XG4gICAgcmV0dXJuIGdldFZhdWx0VGFnU3VnZ2VzdGlvbnMoeyBhcHA6IHRoaXMuYXBwLCBxdWVyeTogcXVlcnkudHJpbSgpLnJlcGxhY2UoTEVBRElOR19UQUdfUFJFRklYRVNfUkVHX0VYUCwgJycpIH0pO1xuICB9XG59XG5cbi8qKlxuICogQSB7QGxpbmsgTGlzdENvbXBvbmVudH0gb2YgdGFncywgc3RvcmVkIHdpdGhvdXQgdGhlIGAjYCBhbmQgc2hvd24gd2l0aCBpdC4gVGhlIGFkZCByb3cgc3VnZ2VzdHMgdGhlIHZhdWx0J3MgdGFncywgYW5kXG4gKiBhIHR5cGVkIHRhZyBpcyByZWZ1c2VkIHVubGVzcyBpdCBpcyBhIHZhbGlkIE9ic2lkaWFuIHRhZzogbGV0dGVycywgZGlnaXRzLCBgX2AsIGAtYCBhbmQgYC9gLCBub3QgZGlnaXRzIG9ubHkuXG4gKlxuICogWW91IGNhbiBhZGQgdGhpcyBjb21wb25lbnQgdXNpbmcge0BsaW5rIFNldHRpbmdFeC5hZGRUYWdMaXN0fS5cbiAqL1xuZXhwb3J0IGNsYXNzIFRhZ0xpc3RDb21wb25lbnQgZXh0ZW5kcyBMaXN0Q29tcG9uZW50IHtcbiAgLyoqXG4gICAqIFRoZSB0YWcgc3VnZ2VzdCBhdHRhY2hlZCB0byB7QGxpbmsgTGlzdENvbXBvbmVudC5uZXdJdGVtSW5wdXRFbH0uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3VnZ2VzdDogVGFnSW5wdXRTdWdnZXN0O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHRhZyBsaXN0IGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIGNvbnRhaW5lciBlbGVtZW50LlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb250YWluZXJFbDogSFRNTEVsZW1lbnQsIGFwcDogQXBwKSB7XG4gICAgc3VwZXIoY29udGFpbmVyRWwsIENzc0NsYXNzLlRhZ0xpc3RDb21wb25lbnQpO1xuICAgIHRoaXMuc3VnZ2VzdCA9IG5ldyBUYWdJbnB1dFN1Z2dlc3QoYXBwLCB0aGlzLm5ld0l0ZW1JbnB1dEVsKTtcbiAgICB0aGlzLnN1Z2dlc3Qub25TZWxlY3QoKCkgPT4ge1xuICAgICAgdGhpcy5hZGRUeXBlZEl0ZW0oKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIHRhZyB3aXRoIGl0cyBgI2AuXG4gICAqXG4gICAqIEBwYXJhbSBpdGVtIC0gVGhlIHRhZy5cbiAgICogQHJldHVybnMgVGhlIHRhZyB3aXRoIGl0cyBgI2AuXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZm9ybWF0SXRlbShpdGVtOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtUQUdfUFJFRklYfSR7aXRlbX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cmlwcyB0aGUgYCNgIGZyb20gYSB0eXBlZCB0YWcgYW5kIHZhbGlkYXRlcyBpdC5cbiAgICpcbiAgICogQHBhcmFtIHRleHQgLSBUaGUgdHlwZWQgdGV4dC5cbiAgICogQHJldHVybnMgVGhlIHRhZywgb3IgYG51bGxgIHdoZW4gaXQgaXMgbm90IGEgdmFsaWQgdGFnLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIG5vcm1hbGl6ZUl0ZW0odGV4dDogc3RyaW5nKTogbnVsbCB8IHN0cmluZyB7XG4gICAgY29uc3QgdGFnID0gdGV4dC50cmltKCkucmVwbGFjZShMRUFESU5HX1RBR19QUkVGSVhFU19SRUdfRVhQLCAnJyk7XG4gICAgcmV0dXJuIFRBR19SRUdfRVhQLnRlc3QodGFnKSAmJiAhRElHSVRTX09OTFlfUkVHX0VYUC50ZXN0KHRhZykgPyB0YWcgOiBudWxsO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUUEsU0FBUyw0QkFBNEI7QUFNckMsU0FBUyxnQkFBZ0I7QUFDekIsU0FBUyw4QkFBOEI7QUFDdkMsU0FBUyxxQkFBcUI7QUFFOUIsTUFBTSxhQUFhO0FBQ25CLE1BQU0sK0JBQStCO0FBQ3JDLE1BQU0sY0FBYztBQUNwQixNQUFNLHNCQUFzQjtBQU1yQixNQUFNLHdCQUF3QixxQkFBb0M7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlwRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUVosWUFBWSxLQUFVLFNBQTJCO0FBQ3RELFVBQU0sS0FBSyxPQUFPO0FBQ2xCLFNBQUssVUFBVTtBQUFBLEVBQ2pCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRTyxpQkFBaUIsWUFBMkIsSUFBdUI7QUFDeEUsT0FBRyxTQUFTLGFBQWE7QUFDekIsT0FBRyxVQUFVLEVBQUUsS0FBSyxzQkFBc0IsTUFBTSxHQUFHLFVBQVUsR0FBRyxXQUFXLEdBQUcsR0FBRyxDQUFDO0FBQ2xGLE9BQUcsVUFBVSxFQUFFLEtBQUssa0JBQWtCLE1BQU0sT0FBTyxXQUFXLEtBQUssRUFBRSxDQUFDO0FBQUEsRUFDeEU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFnQixpQkFBaUIsWUFBMkIsUUFBMEM7QUFDcEcsU0FBSyxTQUFTLFdBQVcsR0FBRztBQUM1QixTQUFLLFFBQVEsY0FBYyxJQUFJLE1BQU0sU0FBUyxFQUFFLFNBQVMsS0FBSyxDQUFDLENBQUM7QUFDaEUsVUFBTSxpQkFBaUIsWUFBWSxNQUFNO0FBQ3pDLFNBQUssTUFBTTtBQUFBLEVBQ2I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFtQixlQUFlLE9BQWdDO0FBQ2hFLFdBQU8sdUJBQXVCLEVBQUUsS0FBSyxLQUFLLEtBQUssT0FBTyxNQUFNLEtBQUssRUFBRSxRQUFRLDhCQUE4QixFQUFFLEVBQUUsQ0FBQztBQUFBLEVBQ2hIO0FBQ0Y7QUFRTyxNQUFNLHlCQUF5QixjQUFjO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFULFlBQVksYUFBMEIsS0FBVTtBQUNyRCxVQUFNLGFBQWEsU0FBUyxnQkFBZ0I7QUFDNUMsU0FBSyxVQUFVLElBQUksZ0JBQWdCLEtBQUssS0FBSyxjQUFjO0FBQzNELFNBQUssUUFBUSxTQUFTLE1BQU07QUFDMUIsV0FBSyxhQUFhO0FBQUEsSUFDcEIsQ0FBQztBQUFBLEVBQ0g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFtQixXQUFXLE1BQXNCO0FBQ2xELFdBQU8sR0FBRyxVQUFVLEdBQUcsSUFBSTtBQUFBLEVBQzdCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRbUIsY0FBYyxNQUE2QjtBQUM1RCxVQUFNLE1BQU0sS0FBSyxLQUFLLEVBQUUsUUFBUSw4QkFBOEIsRUFBRTtBQUNoRSxXQUFPLFlBQVksS0FBSyxHQUFHLEtBQUssQ0FBQyxvQkFBb0IsS0FBSyxHQUFHLElBQUksTUFBTTtBQUFBLEVBQ3pFO0FBQ0Y7IiwibmFtZXMiOltdfQ==
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Extends the Setting class with additional methods for adding components.
7
7
  */
8
- import type { BaseComponent } from 'obsidian';
8
+ import type { App, BaseComponent } from 'obsidian';
9
9
  import { Setting } from 'obsidian';
10
10
  import { CheckboxComponent } from './setting-components/checkbox-component.mjs';
11
11
  import { CodeHighlighterComponent } from './setting-components/code-highlighter-component.mjs';
@@ -13,6 +13,9 @@ import { DateComponent } from './setting-components/date-component.mjs';
13
13
  import { DateTimeComponent } from './setting-components/date-time-component.mjs';
14
14
  import { EmailComponent } from './setting-components/email-component.mjs';
15
15
  import { FileComponent } from './setting-components/file-component.mjs';
16
+ import { FolderListComponent } from './setting-components/folder-list-component.mjs';
17
+ import { HotkeyComponent } from './setting-components/hotkey-component.mjs';
18
+ import { ListComponent } from './setting-components/list-component.mjs';
16
19
  import { MonthComponent } from './setting-components/month-component.mjs';
17
20
  import { MultipleDropdownComponent } from './setting-components/multiple-dropdown-component.mjs';
18
21
  import { MultipleEmailComponent } from './setting-components/multiple-email-component.mjs';
@@ -20,6 +23,7 @@ import { MultipleFileComponent } from './setting-components/multiple-file-compon
20
23
  import { MultipleTextComponent } from './setting-components/multiple-text-component.mjs';
21
24
  import { NumberComponent } from './setting-components/number-component.mjs';
22
25
  import { PasswordComponent } from './setting-components/password-component.mjs';
26
+ import { TagListComponent } from './setting-components/tag-list-component.mjs';
23
27
  import { TelephoneComponent } from './setting-components/telephone-component.mjs';
24
28
  import { TimeComponent } from './setting-components/time-component.mjs';
25
29
  import { TriStateCheckboxComponent } from './setting-components/tri-state-checkbox-component.mjs';
@@ -82,6 +86,28 @@ export declare class SettingEx extends Setting {
82
86
  * @returns The setting instance.
83
87
  */
84
88
  addFile(callback: (file: FileComponent) => void): this;
89
+ /**
90
+ * Adds a {@link FolderListComponent} to the setting.
91
+ *
92
+ * @param app - The Obsidian app, for the folder suggest.
93
+ * @param callback - The callback to call with the component.
94
+ * @returns The setting instance.
95
+ */
96
+ addFolderList(app: App, callback: (folderList: FolderListComponent) => void): this;
97
+ /**
98
+ * Adds a {@link HotkeyComponent} to the setting.
99
+ *
100
+ * @param callback - The callback to call with the component.
101
+ * @returns The setting instance.
102
+ */
103
+ addHotkey(callback: (hotkey: HotkeyComponent) => void): this;
104
+ /**
105
+ * Adds a {@link ListComponent} to the setting.
106
+ *
107
+ * @param callback - The callback to call with the component.
108
+ * @returns The setting instance.
109
+ */
110
+ addList(callback: (list: ListComponent) => void): this;
85
111
  /**
86
112
  * Adds a {@link MonthComponent} to the setting.
87
113
  *
@@ -131,6 +157,14 @@ export declare class SettingEx extends Setting {
131
157
  * @returns The setting instance.
132
158
  */
133
159
  addPassword(callback: (password: PasswordComponent) => void): this;
160
+ /**
161
+ * Adds a {@link TagListComponent} to the setting.
162
+ *
163
+ * @param app - The Obsidian app, for the tag suggest.
164
+ * @param callback - The callback to call with the component.
165
+ * @returns The setting instance.
166
+ */
167
+ addTagList(app: App, callback: (tagList: TagListComponent) => void): this;
134
168
  /**
135
169
  * Adds a {@link TelephoneComponent} to the setting.
136
170
  *