@inpageedit/core 0.12.0 → 0.12.1

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 (63) hide show
  1. package/LICENSE +20 -20
  2. package/dist/IconQuickEdit-CMCQncyj.js.map +1 -1
  3. package/dist/InputBox-nQKtiWtZ.js +30 -0
  4. package/dist/InputBox-nQKtiWtZ.js.map +1 -0
  5. package/dist/PluginPrefSync-Ziogy_o-.js +339 -0
  6. package/dist/PluginPrefSync-Ziogy_o-.js.map +1 -0
  7. package/dist/PluginStoreApp-Bnvyl-Oc.js +452 -0
  8. package/dist/PluginStoreApp-Bnvyl-Oc.js.map +1 -0
  9. package/dist/Preferences-DS4-CFWe.js.map +1 -1
  10. package/dist/components/index.js +6 -7
  11. package/dist/components/index.js.map +1 -1
  12. package/dist/{index-CYc6LH26.js → index-B3FUDhxl.js} +2 -2
  13. package/dist/{index-CYc6LH26.js.map → index-B3FUDhxl.js.map} +1 -1
  14. package/dist/{index-DEav9Ptt.js → index-B3YJdjxo.js} +128 -132
  15. package/dist/index-B3YJdjxo.js.map +1 -0
  16. package/dist/{index-Bv7Dw5eO.js → index-BRjEc8b8.js} +2 -2
  17. package/dist/{index-Bv7Dw5eO.js.map → index-BRjEc8b8.js.map} +1 -1
  18. package/dist/{index-CZXxH2-9.js → index-Bd70aDMT.js} +6 -7
  19. package/dist/{index-CZXxH2-9.js.map → index-Bd70aDMT.js.map} +1 -1
  20. package/dist/{index-B5DtUqkK.js → index-BvuaLEFc.js} +3 -4
  21. package/dist/{index-B5DtUqkK.js.map → index-BvuaLEFc.js.map} +1 -1
  22. package/dist/index-CG38LlAh.js.map +1 -1
  23. package/dist/index-CM_6yF2v.js.map +1 -1
  24. package/dist/{index-D4uwfUZL.js → index-Ccr3YhkP.js} +2 -2
  25. package/dist/{index-D4uwfUZL.js.map → index-Ccr3YhkP.js.map} +1 -1
  26. package/dist/{index-CPoUaSMw.js → index-D5zX93bn.js} +39 -40
  27. package/dist/index-D5zX93bn.js.map +1 -0
  28. package/dist/index-DD5CVCfD.js.map +1 -1
  29. package/dist/{index-BXaiDKnr.js → index-DgQNTfPR.js} +15 -14
  30. package/dist/index-DgQNTfPR.js.map +1 -0
  31. package/dist/{index-CJFePavo.js → index-Dnmv-xDn.js} +2 -2
  32. package/dist/{index-CJFePavo.js.map → index-Dnmv-xDn.js.map} +1 -1
  33. package/dist/{index-hSl8LzNb.js → index-eARjMi7f.js} +5 -6
  34. package/dist/index-eARjMi7f.js.map +1 -0
  35. package/dist/{index-Ckozkp6W.js → index-zHTGCjfF.js} +2 -2
  36. package/dist/{index-Ckozkp6W.js.map → index-zHTGCjfF.js.map} +1 -1
  37. package/dist/index.js +1 -1
  38. package/dist/makeCallable-LDU0xZMJ.js.map +1 -1
  39. package/dist/models/WikiPage/index.d.ts +5 -1
  40. package/dist/noop-ClDc6zv4.js.map +1 -1
  41. package/dist/plugins/plugin-store/index.d.ts +9 -12
  42. package/dist/style.css +1 -1
  43. package/dist/{vueHooks-D0uVqbO-.js → vueHooks-l04s8cIl.js} +1112 -1080
  44. package/dist/{vueHooks-D0uVqbO-.js.map → vueHooks-l04s8cIl.js.map} +1 -1
  45. package/lib/index.umd.js +15 -11
  46. package/lib/index.umd.js.map +1 -1
  47. package/lib/style.css +1 -1
  48. package/package.json +1 -1
  49. package/dist/CheckBox-Bc79KBEB.js +0 -13
  50. package/dist/CheckBox-Bc79KBEB.js.map +0 -1
  51. package/dist/InputBox-DZAdyZ4B.js +0 -22
  52. package/dist/InputBox-DZAdyZ4B.js.map +0 -1
  53. package/dist/PluginPrefSync-BPQkNtX8.js +0 -292
  54. package/dist/PluginPrefSync-BPQkNtX8.js.map +0 -1
  55. package/dist/PluginStoreApp-Cxspe6t8.js +0 -158
  56. package/dist/PluginStoreApp-Cxspe6t8.js.map +0 -1
  57. package/dist/index-BXaiDKnr.js.map +0 -1
  58. package/dist/index-CB7TltEb.js +0 -297
  59. package/dist/index-CB7TltEb.js.map +0 -1
  60. package/dist/index-CPoUaSMw.js.map +0 -1
  61. package/dist/index-DEav9Ptt.js.map +0 -1
  62. package/dist/index-hSl8LzNb.js.map +0 -1
  63. package/dist/plugins/quick-delete/index.d.ts +0 -55
@@ -1,158 +0,0 @@
1
- import { a as R, k as $, r as h, f as y, l as L, g as I, e as a, h as n, q as r, C as U, D as A, y as _, z as i, F as B, x as D, v as u } from "./vueHooks-D0uVqbO-.js";
2
- import { _ as F } from "./_plugin-vue_export-helper-CHgC5LLL.js";
3
- const M = { id: "ipe-plugin-store-app" }, N = { class: "sotre-header" }, V = { class: "store-search-wrapper" }, q = ["disabled"], z = ["disabled"], E = { class: "refresh-text" }, H = {
4
- key: 0,
5
- class: "store-loading"
6
- }, T = {
7
- key: 1,
8
- class: "store-plugins"
9
- }, j = { class: "plugin-info" }, G = { class: "plugin-header" }, J = { class: "name" }, K = {
10
- key: 0,
11
- class: "status-badge"
12
- }, O = ["href"], Q = { class: "plugin-id" }, W = {
13
- key: 0,
14
- class: "plugin-desc"
15
- }, X = { class: "plugin-meta" }, Y = {
16
- key: 0,
17
- class: "version"
18
- }, Z = {
19
- key: 1,
20
- class: "author"
21
- }, ee = {
22
- key: 2,
23
- class: "license"
24
- }, se = ["onClick"], te = {
25
- key: 2,
26
- class: "plugin-empty"
27
- }, re = /* @__PURE__ */ R({
28
- __name: "PluginStoreApp",
29
- setup(ae) {
30
- const o = $(), c = h([]), v = h([]), f = h(""), l = h(!1);
31
- y(async () => {
32
- await m();
33
- });
34
- const m = async () => {
35
- const t = await o.store.ctx.preferences.get("pluginStore.registries") || [], s = await Promise.allSettled(
36
- t.map(async (e) => ({ ...await o.store.getRegistryInfo(e), registryUrl: e }))
37
- );
38
- c.value = s.filter((e) => e.status === "fulfilled").map((e) => e.value);
39
- }, d = (t, s) => v.value.includes(`${t}:${s}`), k = (t) => {
40
- try {
41
- return new URL(t).hostname;
42
- } catch {
43
- return t;
44
- }
45
- }, p = L(() => {
46
- const t = c.value.flatMap(
47
- (e) => (e.packages || []).map((g) => ({
48
- ...g,
49
- registry: e.registryUrl,
50
- // 使用完整的 registry URL (index.json 地址)
51
- registryHomepage: e.homepage
52
- }))
53
- );
54
- if (!f.value.trim()) return t;
55
- const s = f.value.toLowerCase();
56
- return t.filter((e) => e.name?.toLowerCase().includes(s) || e.id?.toLowerCase().includes(s) || e.description?.toLowerCase().includes(s) || e.author?.toLowerCase().includes(s));
57
- }), w = async (t, s) => {
58
- o.store.installAndSetPreference(t, s);
59
- }, C = async (t, s) => {
60
- o.store.uninstallAndRemovePreference(t, s);
61
- }, P = (t, s) => {
62
- d(t, s) ? C(t, s) : w(t, s);
63
- }, x = async () => {
64
- if (!l.value) {
65
- l.value = !0;
66
- try {
67
- const t = await o.store.ctx.preferences.get("pluginStore.registries") || [], s = await Promise.allSettled(
68
- t.map(async (e) => ({ ...await o.store.refreshRegistryCache(e), registryUrl: e }))
69
- );
70
- c.value = s.filter((e) => e.status === "fulfilled").map((e) => e.value), o.modal.notify("success", {
71
- content: `${t.length} registries refreshed successfully`
72
- });
73
- } catch {
74
- o.modal.notify("error", {
75
- content: "Failed to refresh registries"
76
- });
77
- } finally {
78
- setTimeout(() => {
79
- l.value = !1;
80
- }, 3e3);
81
- }
82
- }
83
- }, b = async () => {
84
- const t = await o.store.ctx.preferences.get("pluginStore.plugins") || [];
85
- v.value = t.map((s) => `${s.registry}:${s.id}`);
86
- };
87
- function S(t) {
88
- const s = t.changes["pluginStore.plugins"];
89
- s && Array.isArray(s) && (v.value = s.map((e) => `${e.registry}:${e.id}`));
90
- }
91
- return y(() => {
92
- b(), o.on("preferences/changed", S);
93
- }), y(() => {
94
- }), I(() => {
95
- }), (t, s) => (n(), a("div", M, [
96
- r("div", N, [
97
- r("div", V, [
98
- U(r("input", {
99
- class: "store-search-input",
100
- "onUpdate:modelValue": s[0] || (s[0] = (e) => f.value = e),
101
- type: "text",
102
- placeholder: "Search plugins...",
103
- disabled: c.value.length === 0
104
- }, null, 8, q), [
105
- [A, f.value]
106
- ]),
107
- s[1] || (s[1] = r("div", { class: "store-search-icon" }, "🔍", -1))
108
- ]),
109
- r("button", {
110
- class: _(["store-refresh-btn", { refreshing: l.value }]),
111
- onClick: x,
112
- disabled: l.value
113
- }, [
114
- r("span", E, i(l.value ? "Refreshing..." : "Refresh"), 1)
115
- ], 10, z)
116
- ]),
117
- c.value.length === 0 ? (n(), a("div", H, [...s[2] || (s[2] = [
118
- r("div", { class: "loading-spinner" }, null, -1),
119
- r("div", { class: "loading-text" }, "Loading...", -1)
120
- ])])) : p.value.length > 0 ? (n(), a("div", T, [
121
- (n(!0), a(B, null, D(p.value, (e) => (n(), a("div", {
122
- class: _(["plugin-item", { installed: d(e.registry, e.id) }]),
123
- key: `${e.registry}:${e.id}`
124
- }, [
125
- r("div", j, [
126
- r("div", G, [
127
- r("div", J, i(e.name), 1),
128
- d(e.registry, e.id) ? (n(), a("div", K, "✓")) : u("", !0)
129
- ]),
130
- r("a", {
131
- class: "registry-tag",
132
- href: e.registryHomepage,
133
- target: "_blank"
134
- }, i(k(e.registry)), 9, O),
135
- r("div", Q, i(e.id), 1),
136
- e.description ? (n(), a("div", W, i(e.description), 1)) : u("", !0),
137
- r("div", X, [
138
- e.version ? (n(), a("span", Y, "v" + i(e.version), 1)) : u("", !0),
139
- e.author ? (n(), a("span", Z, "👤 " + i(e.author), 1)) : u("", !0),
140
- e.license ? (n(), a("span", ee, "📜 " + i(e.license), 1)) : u("", !0)
141
- ])
142
- ]),
143
- r("button", {
144
- class: _({ active: d(e.registry, e.id) }),
145
- onClick: (g) => P(e.registry, e.id)
146
- }, i(d(e.registry, e.id) ? "Remove" : "Install"), 11, se)
147
- ], 2))), 128))
148
- ])) : (n(), a("div", te, [...s[3] || (s[3] = [
149
- r("div", { class: "plugin-empty-icon" }, "📦", -1),
150
- r("div", { class: "plugin-empty-text" }, "No matching plugins found", -1)
151
- ])]))
152
- ]));
153
- }
154
- }), ie = /* @__PURE__ */ F(re, [["__scopeId", "data-v-6fcc9e77"]]);
155
- export {
156
- ie as default
157
- };
158
- //# sourceMappingURL=PluginStoreApp-Cxspe6t8.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PluginStoreApp-Cxspe6t8.js","sources":["../src/plugins/plugin-store/components/PluginStoreApp.vue"],"sourcesContent":["<template lang=\"pug\">\n#ipe-plugin-store-app\n .sotre-header\n .store-search-wrapper\n input.store-search-input(\n v-model='searchInput',\n type='text',\n placeholder='Search plugins...',\n :disabled='registryInfos.length === 0'\n )\n .store-search-icon 🔍\n button.store-refresh-btn(\n @click='refreshRegistries',\n :disabled='isRefreshing',\n :class='{ refreshing: isRefreshing }'\n )\n span.refresh-text {{ isRefreshing ? 'Refreshing...' : 'Refresh' }}\n\n .store-loading(v-if='registryInfos.length === 0')\n .loading-spinner\n .loading-text Loading...\n\n .store-plugins(v-else-if='filteredPlugins.length > 0')\n .plugin-item(\n v-for='plugin in filteredPlugins',\n :key='`${plugin.registry}:${plugin.id}`',\n :class='{ installed: isInstalled(plugin.registry, plugin.id) }'\n )\n .plugin-info\n .plugin-header\n .name {{ plugin.name }}\n .status-badge(v-if='isInstalled(plugin.registry, plugin.id)') ✓\n a.registry-tag(:href='plugin.registryHomepage', target='_blank') {{ getRegistryLabel(plugin.registry) }}\n .plugin-id {{ plugin.id }}\n .plugin-desc(v-if='plugin.description') {{ plugin.description }}\n .plugin-meta\n span.version(v-if='plugin.version') v{{ plugin.version }}\n span.author(v-if='plugin.author') 👤 {{ plugin.author }}\n span.license(v-if='plugin.license') 📜 {{ plugin.license }}\n button(\n :class='{ active: isInstalled(plugin.registry, plugin.id) }',\n @click='togglePlugin(plugin.registry, plugin.id)'\n ) {{ isInstalled(plugin.registry, plugin.id) ? 'Remove' : 'Install' }}\n\n .plugin-empty(v-else)\n .plugin-empty-icon 📦\n .plugin-empty-text No matching plugins found\n</template>\n\n<script setup lang=\"ts\" vapor>\nimport { computed, onBeforeUnmount, onMounted, ref } from 'vue'\nimport type { PluginStoreRegistry } from '../schema.js'\n\ninterface RegistryWithUrl extends PluginStoreRegistry {\n registryUrl: string\n}\n\nconst ctx = useIPE()\nconst registryInfos = ref<RegistryWithUrl[]>([])\nconst installedPlugins = ref<string[]>([])\nconst searchInput = ref('')\nconst isRefreshing = ref(false)\n\nonMounted(async () => {\n await initRegistries()\n})\n\nconst initRegistries = async () => {\n const registryUrls = (await ctx.store.ctx.preferences.get('pluginStore.registries')) || []\n\n const results = await Promise.allSettled(\n registryUrls.map(async (url) => {\n const info = await ctx.store.getRegistryInfo(url)\n return { ...info, registryUrl: url }\n })\n )\n\n registryInfos.value = results\n .filter((r) => r.status === 'fulfilled')\n .map((r) => (r as PromiseFulfilledResult<RegistryWithUrl>).value)\n}\n\nconst isInstalled = (registry: string, id: string) => {\n return installedPlugins.value.includes(`${registry}:${id}`)\n}\n\n// 获取仓库标签显示名称\nconst getRegistryLabel = (registryUrl: string) => {\n try {\n const url = new URL(registryUrl)\n return url.hostname\n } catch {\n return registryUrl\n }\n}\n\n// 搜索过滤 - 合并所有仓库的插件\nconst filteredPlugins = computed(() => {\n // 合并所有仓库的packages,并添加registry信息(使用完整的registryUrl)\n const allPlugins = registryInfos.value.flatMap((registry) =>\n (registry.packages || []).map((pkg) => ({\n ...pkg,\n registry: registry.registryUrl, // 使用完整的 registry URL (index.json 地址)\n registryHomepage: registry.homepage,\n }))\n )\n\n if (!searchInput.value.trim()) return allPlugins\n\n const query = searchInput.value.toLowerCase()\n return allPlugins.filter((plugin) => {\n return (\n plugin.name?.toLowerCase().includes(query) ||\n plugin.id?.toLowerCase().includes(query) ||\n plugin.description?.toLowerCase().includes(query) ||\n plugin.author?.toLowerCase().includes(query)\n )\n })\n})\n\nconst enablePlugin = async (registry: string, id: string) => {\n ctx.store.installAndSetPreference(registry, id)\n}\nconst disablePlugin = async (registry: string, id: string) => {\n ctx.store.uninstallAndRemovePreference(registry, id)\n}\n\n// 切换插件状态\nconst togglePlugin = (registry: string, id: string) => {\n if (isInstalled(registry, id)) {\n disablePlugin(registry, id)\n } else {\n enablePlugin(registry, id)\n }\n}\n\n// 刷新所有 registry 缓存\nconst refreshRegistries = async () => {\n if (isRefreshing.value) return\n\n isRefreshing.value = true\n try {\n const registryUrls = (await ctx.store.ctx.preferences.get('pluginStore.registries')) || []\n\n const results = await Promise.allSettled(\n registryUrls.map(async (url) => {\n const info = await ctx.store.refreshRegistryCache(url)\n return { ...info, registryUrl: url }\n })\n )\n\n registryInfos.value = results\n .filter((r) => r.status === 'fulfilled')\n .map((r) => (r as PromiseFulfilledResult<RegistryWithUrl>).value)\n\n ctx.modal.notify('success', {\n content: `${registryUrls.length} registries refreshed successfully`,\n })\n } catch (error) {\n ctx.modal.notify('error', {\n content: 'Failed to refresh registries',\n })\n } finally {\n setTimeout(() => {\n isRefreshing.value = false\n }, 3000)\n }\n}\n\n// init plugin states\nconst initInstalStatus = async () => {\n const prefs = (await ctx.store.ctx.preferences.get('pluginStore.plugins')) || []\n installedPlugins.value = prefs.map((p) => `${p.registry}:${p.id}`)\n}\nfunction onPreferencesChanged(payload: { changes: Record<string, unknown> }) {\n const plugins = payload.changes['pluginStore.plugins'] as {\n registry: string\n id: string\n }[]\n if (plugins && Array.isArray(plugins)) {\n installedPlugins.value = plugins.map((p) => `${p.registry}:${p.id}`)\n }\n}\nonMounted(() => {\n initInstalStatus()\n ctx.on('preferences/changed', onPreferencesChanged)\n})\n\nonMounted(() => {\n console.info('mount plugin store app', ctx)\n})\nonBeforeUnmount(() => {\n console.info('unmount plugin store app', ctx)\n})\n</script>\n\n<style scoped lang=\"scss\">\n#ipe-plugin-store-app {\n padding: var(--ipe-modal-spacing);\n font-size: 0.875rem;\n color: var(--ipe-modal-text);\n}\n\n.sotre-header {\n margin-bottom: 1.25rem;\n display: flex;\n align-items: center;\n gap: var(--ipe-modal-spacing);\n\n h2 {\n margin: 0;\n font-size: 1.125rem;\n font-weight: 600;\n color: var(--ipe-modal-text);\n }\n\n .store-search-wrapper {\n flex: 1;\n position: relative;\n\n .store-search-input {\n width: 100%;\n height: 2.5rem;\n padding: 0 0.875rem 0 2.5rem;\n border: 1.5px solid var(--ipe-modal-border-color);\n border-radius: var(--ipe-modal-button-radius);\n font-size: 0.875rem;\n outline: none;\n background: var(--ipe-modal-bg);\n color: var(--ipe-modal-text);\n transition: all 0.2s ease;\n line-height: 1.5;\n\n &:focus {\n border-color: var(--ipe-modal-accent);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--ipe-modal-accent) 10%, transparent);\n }\n\n &::placeholder {\n color: var(--ipe-modal-muted);\n }\n }\n\n .store-search-icon {\n position: absolute;\n left: 0.75rem;\n top: 50%;\n transform: translateY(-50%);\n pointer-events: none;\n opacity: 0.5;\n }\n }\n\n .store-refresh-btn {\n height: 2.5rem;\n padding: 0 1rem;\n border: 1.5px solid var(--ipe-modal-border-color);\n border-radius: var(--ipe-modal-button-radius);\n background: var(--ipe-modal-bg);\n color: var(--ipe-modal-text);\n cursor: pointer;\n font-size: 0.875rem;\n font-weight: 500;\n white-space: nowrap;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 0.375rem;\n\n &:hover:not(:disabled) {\n background: var(--ipe-modal-secondary-bg);\n border-color: var(--ipe-modal-accent);\n transform: translateY(-1px);\n box-shadow: 0 2px 6px color-mix(in srgb, var(--ipe-modal-text) 10%, transparent);\n }\n\n &:active:not(:disabled) {\n transform: translateY(0);\n }\n\n &:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n }\n}\n\n.store-loading {\n padding: 10rem 1.25rem;\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.75rem;\n\n .loading-spinner {\n width: 2rem;\n height: 2rem;\n border: 3px solid var(--ipe-modal-border-color);\n border-top-color: var(--ipe-modal-accent);\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n }\n\n .loading-text {\n color: var(--ipe-modal-muted);\n font-size: 0.875rem;\n }\n}\n\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n.store-plugins {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n}\n\n.plugin-item {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 0.875rem;\n border: 1.5px solid var(--ipe-modal-border-color);\n border-radius: calc(var(--ipe-modal-button-radius) + 2px);\n background: var(--ipe-modal-secondary-bg);\n position: relative;\n transition: all 0.2s ease;\n\n &:hover {\n background: var(--ipe-modal-divider-color);\n border-color: color-mix(in srgb, var(--ipe-modal-accent) 30%, var(--ipe-modal-border-color));\n box-shadow: 0 2px 8px color-mix(in srgb, var(--ipe-modal-text) 5%, transparent);\n }\n\n &.installed {\n background: color-mix(in srgb, var(--ipe-modal-success) 5%, var(--ipe-modal-secondary-bg));\n border-color: color-mix(in srgb, var(--ipe-modal-success) 50%, var(--ipe-modal-border-color));\n\n &:hover {\n background: color-mix(in srgb, var(--ipe-modal-success) 8%, var(--ipe-modal-secondary-bg));\n border-color: var(--ipe-modal-success);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--ipe-modal-success) 15%, transparent);\n }\n }\n\n .plugin-info {\n flex: 1;\n min-width: 0;\n\n .plugin-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-bottom: 0.25rem;\n\n .name {\n font-weight: 600;\n font-size: 1rem;\n color: var(--ipe-modal-text);\n line-height: 1.2;\n }\n\n .status-badge {\n font-size: 0.6875rem;\n color: var(--ipe-modal-success);\n font-weight: 600;\n background: color-mix(in srgb, var(--ipe-modal-success) 15%, transparent);\n padding: 0.125rem 0.375rem;\n border-radius: calc(var(--ipe-modal-button-radius) - 2px);\n line-height: 1;\n }\n }\n\n .plugin-id {\n font-size: 0.75rem;\n color: var(--ipe-modal-muted);\n font-family: monospace;\n margin-bottom: 0.375rem;\n background: color-mix(in srgb, var(--ipe-modal-muted) 5%, transparent);\n padding: 0.125rem 0.375rem;\n border-radius: 3px;\n display: inline-block;\n margin-left: 0.375rem;\n }\n\n .registry-tag {\n font-size: 0.6875rem;\n color: var(--ipe-modal-accent);\n font-family: monospace;\n margin-bottom: 0.375rem;\n background: color-mix(in srgb, var(--ipe-modal-accent) 10%, transparent);\n padding: 0.125rem 0.375rem;\n border-radius: 3px;\n display: inline-block;\n border: 1px solid color-mix(in srgb, var(--ipe-modal-accent) 20%, transparent);\n }\n\n .plugin-desc {\n font-size: 0.8125rem;\n color: var(--ipe-modal-muted);\n margin-bottom: 0.375rem;\n line-height: 1.5;\n }\n\n .plugin-meta {\n font-size: 0.75rem;\n color: var(--ipe-modal-muted);\n display: flex;\n gap: 1rem;\n\n .version {\n font-family: monospace;\n font-weight: 500;\n }\n\n .author {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n }\n }\n }\n\n button {\n padding: 0.5rem 1.25rem;\n border: 1.5px solid var(--ipe-modal-accent);\n border-radius: var(--ipe-modal-button-radius);\n background: var(--ipe-modal-bg);\n color: var(--ipe-modal-accent);\n cursor: pointer;\n font-size: 0.8125rem;\n font-weight: 500;\n white-space: nowrap;\n transition: all 0.2s ease;\n\n &:hover {\n background: var(--ipe-modal-accent);\n color: var(--ipe-modal-bg);\n transform: translateY(-1px);\n box-shadow: 0 2px 6px color-mix(in srgb, var(--ipe-modal-accent) 25%, transparent);\n }\n\n &:active {\n transform: translateY(0);\n }\n\n &.active {\n border-color: var(--ipe-modal-danger);\n color: var(--ipe-modal-danger);\n\n &:hover {\n background: var(--ipe-modal-danger);\n color: var(--ipe-modal-bg);\n box-shadow: 0 2px 6px color-mix(in srgb, var(--ipe-modal-danger) 25%, transparent);\n }\n }\n }\n}\n\n.plugin-empty {\n padding: 3rem 1.25rem;\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.75rem;\n\n .plugin-empty-icon {\n font-size: 3rem;\n opacity: 0.3;\n }\n\n .plugin-empty-text {\n color: var(--ipe-modal-muted);\n font-size: 0.9375rem;\n }\n}\n</style>\n"],"names":["ctx","useIPE","registryInfos","ref","installedPlugins","searchInput","isRefreshing","onMounted","initRegistries","registryUrls","results","url","r","isInstalled","registry","id","getRegistryLabel","registryUrl","filteredPlugins","computed","allPlugins","pkg","query","plugin","enablePlugin","disablePlugin","togglePlugin","refreshRegistries","initInstalStatus","prefs","p","onPreferencesChanged","payload","plugins","onBeforeUnmount"],"mappings":"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"}