@lapis-notes/workspace 0.1.0 → 0.2.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 (77) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/LICENSE.md +3 -3
  3. package/dist/index.d.ts +3 -0
  4. package/dist/index.js +3 -0
  5. package/dist/plugin-management/CommunityPluginsSettingsPage.svelte +152 -73
  6. package/dist/plugin-management/PluginBrowser.svelte +558 -0
  7. package/dist/plugin-management/PluginBrowser.svelte.d.ts +17 -0
  8. package/dist/plugin-management/PluginBrowserCard.svelte +230 -0
  9. package/dist/plugin-management/PluginBrowserCard.svelte.d.ts +9 -0
  10. package/dist/plugin-management/PluginBrowserDetail.svelte +1168 -0
  11. package/dist/plugin-management/PluginBrowserDetail.svelte.d.ts +20 -0
  12. package/dist/plugin-management/PluginBrowserDirectory.svelte +1069 -0
  13. package/dist/plugin-management/PluginBrowserDirectory.svelte.d.ts +21 -0
  14. package/dist/plugin-management/PluginBrowserLanding.svelte +341 -0
  15. package/dist/plugin-management/PluginBrowserLanding.svelte.d.ts +12 -0
  16. package/dist/plugin-management/PluginRegistryBadge.svelte +41 -0
  17. package/dist/plugin-management/PluginRegistryBadge.svelte.d.ts +8 -0
  18. package/dist/plugin-management/PluginRegistryContentState.svelte +80 -0
  19. package/dist/plugin-management/PluginRegistryContentState.svelte.d.ts +14 -0
  20. package/dist/plugin-management/PluginRegistryImage.svelte +64 -0
  21. package/dist/plugin-management/PluginRegistryImage.svelte.d.ts +9 -0
  22. package/dist/plugin-management/PluginRegistryMedia.svelte +223 -0
  23. package/dist/plugin-management/PluginRegistryMedia.svelte.d.ts +8 -0
  24. package/dist/plugin-management/PluginRegistryMediaViewer.svelte +155 -0
  25. package/dist/plugin-management/PluginRegistryMediaViewer.svelte.d.ts +13 -0
  26. package/dist/plugin-management/PluginRegistryRow.svelte +120 -0
  27. package/dist/plugin-management/PluginRegistryRow.svelte.d.ts +25 -0
  28. package/dist/plugin-management/PluginRegistrySettingsPage.svelte +1009 -512
  29. package/dist/plugin-management/PluginRegistryStatus.svelte +33 -0
  30. package/dist/plugin-management/PluginRegistryStatus.svelte.d.ts +8 -0
  31. package/dist/plugin-management/PluginRegistryToolbar.svelte +159 -0
  32. package/dist/plugin-management/PluginRegistryToolbar.svelte.d.ts +21 -0
  33. package/dist/plugin-management/community-presentation/CommunityChip.svelte +229 -0
  34. package/dist/plugin-management/community-presentation/CommunityChip.svelte.d.ts +4 -0
  35. package/dist/plugin-management/community-presentation/CommunityMemberAvatar.svelte +42 -0
  36. package/dist/plugin-management/community-presentation/CommunityMemberAvatar.svelte.d.ts +13 -0
  37. package/dist/plugin-management/community-presentation/RegistryMediaGallery.svelte +282 -0
  38. package/dist/plugin-management/community-presentation/RegistryMediaGallery.svelte.d.ts +8 -0
  39. package/dist/plugin-management/community-presentation/RegistryMediaViewer.css +179 -0
  40. package/dist/plugin-management/community-presentation/RegistryMediaViewer.svelte +241 -0
  41. package/dist/plugin-management/community-presentation/RegistryMediaViewer.svelte.d.ts +14 -0
  42. package/dist/plugin-management/community-presentation/RegistryPluginChangelog.svelte +216 -0
  43. package/dist/plugin-management/community-presentation/RegistryPluginChangelog.svelte.d.ts +8 -0
  44. package/dist/plugin-management/community-presentation/RegistryVerifiedImage.svelte +179 -0
  45. package/dist/plugin-management/community-presentation/RegistryVerifiedImage.svelte.d.ts +15 -0
  46. package/dist/plugin-management/community-presentation/avatar-model.d.ts +14 -0
  47. package/dist/plugin-management/community-presentation/avatar-model.js +21 -0
  48. package/dist/plugin-management/community-presentation/community-member-avatar.css +137 -0
  49. package/dist/plugin-management/community-presentation/community-typography.css +30 -0
  50. package/dist/plugin-management/community-presentation/model-adapter.d.ts +54 -0
  51. package/dist/plugin-management/community-presentation/model-adapter.js +90 -0
  52. package/dist/plugin-management/community-presentation/model.d.ts +9 -0
  53. package/dist/plugin-management/community-presentation/model.js +40 -0
  54. package/dist/plugin-management/community-presentation/props.d.ts +21 -0
  55. package/dist/plugin-management/community-presentation/props.js +1 -0
  56. package/dist/plugin-management/community-presentation/registry-filter-icons.d.ts +3 -0
  57. package/dist/plugin-management/community-presentation/registry-filter-icons.js +70 -0
  58. package/dist/plugin-management/community-presentation/registry-markdown.d.ts +1 -0
  59. package/dist/plugin-management/community-presentation/registry-markdown.js +57 -0
  60. package/dist/plugin-management/community-presentation/registry-plugin-icons.d.ts +2 -0
  61. package/dist/plugin-management/community-presentation/registry-plugin-icons.js +31 -0
  62. package/dist/plugin-management/plugin-browser-model.d.ts +44 -0
  63. package/dist/plugin-management/plugin-browser-model.js +104 -0
  64. package/dist/plugin-management/plugin-browser-navigation.d.ts +3 -0
  65. package/dist/plugin-management/plugin-browser-navigation.js +38 -0
  66. package/dist/plugin-management/plugin-download-stats.d.ts +1 -0
  67. package/dist/plugin-management/plugin-download-stats.js +15 -0
  68. package/dist/plugin-management/plugin-management.css +1088 -117
  69. package/dist/plugin-management/plugin-registry-controller.svelte.d.ts +29 -0
  70. package/dist/plugin-management/plugin-registry-controller.svelte.js +154 -0
  71. package/dist/plugin-management/plugin-registry-detail-session.svelte.d.ts +18 -0
  72. package/dist/plugin-management/plugin-registry-detail-session.svelte.js +106 -0
  73. package/dist/plugin-management/plugin-registry-detail.d.ts +17 -0
  74. package/dist/plugin-management/plugin-registry-detail.js +1 -0
  75. package/dist/plugin-management/plugins-view.svelte.d.ts +41 -0
  76. package/dist/plugin-management/plugins-view.svelte.js +109 -0
  77. package/package.json +5 -5
package/CHANGELOG.md CHANGED
@@ -1,5 +1,39 @@
1
1
  # @lapis-notes/workspace
2
2
 
3
+ ## 0.2.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#15](https://github.com/lapismd/lapis-notes/pull/15) [`57996c6`](https://github.com/lapismd/lapis-notes/commit/57996c6d26c1e7ed723df1291b415ee94d3a58e5) Thanks [@stevejuma](https://github.com/stevejuma)! - Retain selected plugin releases in navigation and persisted Plugins views so
8
+ application links can open a specific version. Fail closed for unavailable
9
+ versions and keep historical installation bound to the selected release.
10
+
11
+ ## 0.2.0
12
+
13
+ ### Minor Changes
14
+
15
+ - [#4](https://github.com/lapismd/lapis-notes/pull/4) [`08a9e4b`](https://github.com/lapismd/lapis-notes/commit/08a9e4bc671c87484e1fbb7c3271b2aad3f176e5) Thanks [@stevejuma](https://github.com/stevejuma)! - Add the Plugins workspace browser with a category homepage, update listings,
16
+ responsive filters, and verified install/update actions shared with Settings.
17
+ Settings Browse and Updates now open shared plugin details directly. Details
18
+ include a Back action, fixed navigation, themed media, image loading and failure
19
+ states, release notes, download counts, and linked authors.
20
+
21
+ ### Patch Changes
22
+
23
+ - [#4](https://github.com/lapismd/lapis-notes/pull/4) [`c1ad3c4`](https://github.com/lapismd/lapis-notes/commit/c1ad3c4acee2eac1ae87c22f66e946d2e0db3bf2) Thanks [@stevejuma](https://github.com/stevejuma)! - Require published Design Core 0.3.2 for native window-controls spacing, bold settings headings, selected-tab indicators and mobile shell teardown. Consume the npm release through portable semver ranges and lockfile integrity.
24
+
25
+ - Updated dependencies [[`39f886d`](https://github.com/lapismd/lapis-notes/commit/39f886d017a28d916b3f6cac7d08b7723a04f45b), [`c1ad3c4`](https://github.com/lapismd/lapis-notes/commit/c1ad3c4acee2eac1ae87c22f66e946d2e0db3bf2), [`1e949fc`](https://github.com/lapismd/lapis-notes/commit/1e949fc9d51b795a50760e1146a9599602746c6b)]:
26
+ - @lapis-notes/api@0.1.2
27
+
28
+ ## 0.1.1
29
+
30
+ ### Patch Changes
31
+
32
+ - Support verified static V2 catalogs alongside Nostr sources, retain installation
33
+ source provenance, and render themed registry images and structured release notes.
34
+ - Updated dependencies []:
35
+ - @lapis-notes/api@0.1.1
36
+
3
37
  ## 0.1.0
4
38
 
5
39
  ### Minor Changes
package/LICENSE.md CHANGED
@@ -1,4 +1,4 @@
1
- AGPL-3.0-or-later
1
+ Apache-2.0
2
2
 
3
- This package is licensed under the GNU Affero General Public License v3.0 or later.
4
- See <https://www.gnu.org/licenses/agpl-3.0.en.html>.
3
+ This package is licensed under the Apache License 2.0.
4
+ See <https://www.apache.org/licenses/LICENSE-2.0>.
package/dist/index.d.ts CHANGED
@@ -4,3 +4,6 @@ export { registerPluginManagementSettings } from "./plugin-management/register-p
4
4
  export { default as PluginRegistrySettingsPage } from "./plugin-management/PluginRegistrySettingsPage.svelte";
5
5
  export { default as CorePluginsSettingsPage } from "./plugin-management/CorePluginsSettingsPage.svelte";
6
6
  export { default as CommunityPluginsSettingsPage } from "./plugin-management/CommunityPluginsSettingsPage.svelte";
7
+ export { PluginsView } from "./plugin-management/plugins-view.svelte";
8
+ export { default as PluginBrowser } from "./plugin-management/PluginBrowser.svelte";
9
+ export { openPluginBrowser } from "./plugin-management/plugin-browser-navigation";
package/dist/index.js CHANGED
@@ -3,3 +3,6 @@ export { registerPluginManagementSettings } from "./plugin-management/register-p
3
3
  export { default as PluginRegistrySettingsPage } from "./plugin-management/PluginRegistrySettingsPage.svelte";
4
4
  export { default as CorePluginsSettingsPage } from "./plugin-management/CorePluginsSettingsPage.svelte";
5
5
  export { default as CommunityPluginsSettingsPage } from "./plugin-management/CommunityPluginsSettingsPage.svelte";
6
+ export { PluginsView } from "./plugin-management/plugins-view.svelte";
7
+ export { default as PluginBrowser } from "./plugin-management/PluginBrowser.svelte";
8
+ export { openPluginBrowser } from "./plugin-management/plugin-browser-navigation";
@@ -1,4 +1,10 @@
1
1
  <script lang="ts">
2
+ import Check from "@lucide/svelte/icons/check";
3
+ import Puzzle from "@lucide/svelte/icons/puzzle";
4
+ import RefreshCw from "@lucide/svelte/icons/refresh-cw";
5
+ import ShieldAlert from "@lucide/svelte/icons/shield-alert";
6
+ import ShieldCheck from "@lucide/svelte/icons/shield-check";
7
+ import Sparkles from "@lucide/svelte/icons/sparkles";
2
8
  import * as Button from "@lapismd/design-core/shadcn/button";
3
9
  import type { WorkspaceSettingsPageProps } from "@lapismd/design-core/workspace/settings";
4
10
  import { onMount, tick, untrack } from "svelte";
@@ -60,12 +66,14 @@
60
66
  const enabled = app.plugins.on("plugin-enabled", refresh);
61
67
  const disabled = app.plugins.on("plugin-disabled", refresh);
62
68
  const error = app.plugins.on("plugin-error", refresh);
69
+ const trustChanged = app.workspaceTrust.on("changed", refresh);
63
70
  void app.workspaceTrust.ready().then(refresh);
64
71
  return () => {
65
72
  app.plugins.offref(loaded);
66
73
  app.plugins.offref(enabled);
67
74
  app.plugins.offref(disabled);
68
75
  app.plugins.offref(error);
76
+ app.workspaceTrust.offref(trustChanged);
69
77
  };
70
78
  });
71
79
 
@@ -80,6 +88,11 @@
80
88
  trustBusy = false;
81
89
  }
82
90
  }
91
+
92
+ function browsePlugins(): void {
93
+ context.reveal.request("plugin-registry", "registry:");
94
+ controller.selectSection("plugin-registry");
95
+ }
83
96
  </script>
84
97
 
85
98
  <section
@@ -87,27 +100,69 @@
87
100
  data-ui-component="lapis-plugin-management"
88
101
  data-ui-part="community-plugins"
89
102
  >
90
- <div class="lapis-plugin-management__trust">
91
- <div>
92
- <h1>Workspace Trust</h1>
103
+ <section
104
+ class="lapis-plugin-management__trust"
105
+ data-ui-component="workspace-trust-status"
106
+ data-ui-part="status-card"
107
+ data-trust-state={trustState.trusted ? "trusted" : "untrusted"}
108
+ aria-labelledby="lapis-workspace-trust-title"
109
+ >
110
+ <div
111
+ class="lapis-plugin-management__trust-icon"
112
+ data-ui-part="status-icon"
113
+ data-trust-icon={trustState.trusted ? "shield-check" : "shield-alert"}
114
+ aria-hidden="true"
115
+ >
116
+ {#if trustState.trusted}
117
+ <ShieldCheck />
118
+ {:else}
119
+ <ShieldAlert />
120
+ {/if}
121
+ </div>
122
+
123
+ <div class="lapis-plugin-management__trust-content">
124
+ <div class="lapis-plugin-management__trust-title-line">
125
+ <h1 id="lapis-workspace-trust-title">
126
+ {trustState.trusted
127
+ ? "Workspace trusted"
128
+ : "Workspace not trusted"}
129
+ </h1>
130
+ <span
131
+ class="lapis-plugin-management__trust-badge"
132
+ data-ui-part="status-badge"
133
+ >
134
+ {#if trustState.trusted}
135
+ <Check aria-hidden="true" />
136
+ Trusted
137
+ {:else}
138
+ <span aria-hidden="true"></span>
139
+ Not trusted
140
+ {/if}
141
+ </span>
142
+ </div>
93
143
  <p>
94
144
  {trustState.trusted
95
- ? "This vault is trusted. Trusted desktop plugins and brokered capabilities may run for this workspace identity."
96
- : "This vault is untrusted. Trusted desktop plugins, brokered capabilities, and community plugin settings surfaces stay blocked until you trust this workspace."}
145
+ ? "Community plugins and desktop capabilities can run in this vault."
146
+ : "Community plugins and desktop capabilities are disabled until this vault is trusted."}
97
147
  </p>
148
+ {#if !trustState.trusted}
149
+ <Button.Root
150
+ class="lapis-plugin-management__trust-action"
151
+ disabled={trustBusy}
152
+ onclick={() => void updateTrust(true)}
153
+ >Trust workspace</Button.Root>
154
+ {/if}
98
155
  </div>
99
- <div class="lapis-plugin-management__actions">
100
- <Button.Root
101
- disabled={trustState.trusted || trustBusy}
102
- onclick={() => void updateTrust(true)}
103
- >Trust workspace</Button.Root>
156
+
157
+ {#if trustState.trusted}
104
158
  <Button.Root
105
- variant="destructive"
106
- disabled={!trustState.trusted || trustBusy}
159
+ class="lapis-plugin-management__trust-action lapis-plugin-management__trust-action--revoke"
160
+ variant="outline"
161
+ disabled={trustBusy}
107
162
  onclick={() => void updateTrust(false)}
108
- >Revoke trust</Button.Root>
109
- </div>
110
- </div>
163
+ >Revoke</Button.Root>
164
+ {/if}
165
+ </section>
111
166
 
112
167
  <header class="lapis-plugin-management__header">
113
168
  <div>
@@ -115,68 +170,92 @@
115
170
  <p>Manage installed community and registry plugins for this vault.</p>
116
171
  </div>
117
172
  <Button.Root
173
+ class="lapis-plugin-management__reload"
118
174
  variant="outline"
119
175
  onclick={() => globalThis.location?.reload()}
120
- >Reload plugins</Button.Root>
176
+ >
177
+ <RefreshCw
178
+ class="lapis-plugin-management__icon"
179
+ data-reload-icon="refresh-cw"
180
+ aria-hidden="true"
181
+ />
182
+ Reload plugins
183
+ </Button.Root>
121
184
  </header>
122
185
 
123
- <div class="lapis-plugin-management__rows">
124
- {#if plugins.length === 0 && indexedDiagnostics.length === 0}
125
- <p class="lapis-plugin-management__empty">
126
- No community plugins found in .obsidian/plugins.
186
+ {#if plugins.length === 0 && indexedDiagnostics.length === 0}
187
+ <div
188
+ class="lapis-plugin-management__empty-state"
189
+ data-ui-part="community-empty-state"
190
+ >
191
+ <div
192
+ class="lapis-plugin-management__empty-state-icon"
193
+ data-empty-icon="puzzle"
194
+ aria-hidden="true"
195
+ >
196
+ <Puzzle />
197
+ <Sparkles />
198
+ </div>
199
+ <h2>No community plugins found</h2>
200
+ <p>
201
+ Looks like you haven’t installed any community plugins yet.<br />
202
+ Browse the community plugins list to get started.
127
203
  </p>
128
- {/if}
129
-
130
- {#each plugins as plugin (plugin.manifest.id)}
131
- <PluginSettingsRow
132
- pluginId={plugin.manifest.id}
133
- name={plugin.manifest.name}
134
- description={plugin.manifest.description}
135
- version={plugin.manifest.version}
136
- provenance={plugin.provenance}
137
- status={plugin.state === "failed"
138
- ? "Failed"
139
- : plugin.enabled
140
- ? "Enabled"
141
- : "Disabled"}
142
- error={plugin.lastFailureMessage ?? plugin.errorMessage ?? undefined}
143
- enabled={plugin.enabled}
144
- expanded={expandedPluginIds.has(plugin.manifest.id)}
145
- hasOptions={Boolean(
146
- pluginSettingsSectionId(controller, plugin.manifest.id),
147
- )}
148
- diagnostics={pluginDiagnosticRows(app, plugin.manifest.id)}
149
- onOptions={() => openPluginSettings(controller, plugin.manifest.id)}
150
- onRestart={async () => {
151
- await app.plugins.restartPlugin(plugin.manifest.id);
152
- }}
153
- onToggle={async (enabled) => {
154
- if (enabled) await app.plugins.enablePlugin(plugin.manifest.id);
155
- else await app.plugins.disablePlugin(plugin.manifest.id);
156
- }}
157
- />
158
- {/each}
204
+ <Button.Root onclick={browsePlugins}>Browse plugins</Button.Root>
205
+ </div>
206
+ {:else}
207
+ <div class="lapis-plugin-management__rows">
208
+ {#each plugins as plugin (plugin.manifest.id)}
209
+ <PluginSettingsRow
210
+ pluginId={plugin.manifest.id}
211
+ name={plugin.manifest.name}
212
+ description={plugin.manifest.description}
213
+ version={plugin.manifest.version}
214
+ provenance={plugin.provenance}
215
+ status={plugin.state === "failed"
216
+ ? "Failed"
217
+ : plugin.enabled
218
+ ? "Enabled"
219
+ : "Disabled"}
220
+ error={plugin.lastFailureMessage ?? plugin.errorMessage ?? undefined}
221
+ enabled={plugin.enabled}
222
+ expanded={expandedPluginIds.has(plugin.manifest.id)}
223
+ hasOptions={Boolean(
224
+ pluginSettingsSectionId(controller, plugin.manifest.id),
225
+ )}
226
+ diagnostics={pluginDiagnosticRows(app, plugin.manifest.id)}
227
+ onOptions={() => openPluginSettings(controller, plugin.manifest.id)}
228
+ onRestart={async () => {
229
+ await app.plugins.restartPlugin(plugin.manifest.id);
230
+ }}
231
+ onToggle={async (enabled) => {
232
+ if (enabled) await app.plugins.enablePlugin(plugin.manifest.id);
233
+ else await app.plugins.disablePlugin(plugin.manifest.id);
234
+ }}
235
+ />
236
+ {/each}
159
237
 
160
- {#each indexedDiagnostics as diagnostics (diagnostics.pluginId)}
161
- <PluginSettingsRow
162
- pluginId={diagnostics.pluginId}
163
- name={diagnostics.name ?? diagnostics.pluginId}
164
- description={diagnostics.description ?? undefined}
165
- version={diagnostics.version ?? undefined}
166
- provenance={diagnostics.provenance}
167
- status={diagnostics.state}
168
- error={diagnostics.lastFailureMessage ?? undefined}
169
- enabled={false}
170
- expanded={expandedPluginIds.has(diagnostics.pluginId)}
171
- hasOptions={Boolean(
172
- pluginSettingsSectionId(controller, diagnostics.pluginId),
173
- )}
174
- diagnostics={pluginDiagnosticRows(app, diagnostics.pluginId)}
175
- onOptions={() => openPluginSettings(controller, diagnostics.pluginId)}
176
- onRestart={async () => {
177
- await app.plugins.restartPlugin(diagnostics.pluginId);
178
- }}
179
- />
180
- {/each}
181
- </div>
238
+ {#each indexedDiagnostics as diagnostics (diagnostics.pluginId)}
239
+ <PluginSettingsRow
240
+ pluginId={diagnostics.pluginId}
241
+ name={diagnostics.name ?? diagnostics.pluginId}
242
+ description={diagnostics.description ?? undefined}
243
+ version={diagnostics.version ?? undefined}
244
+ provenance={diagnostics.provenance}
245
+ status={diagnostics.state}
246
+ error={diagnostics.lastFailureMessage ?? undefined}
247
+ enabled={false}
248
+ expanded={expandedPluginIds.has(diagnostics.pluginId)}
249
+ hasOptions={Boolean(
250
+ pluginSettingsSectionId(controller, diagnostics.pluginId),
251
+ )}
252
+ diagnostics={pluginDiagnosticRows(app, diagnostics.pluginId)}
253
+ onOptions={() => openPluginSettings(controller, diagnostics.pluginId)}
254
+ onRestart={async () => {
255
+ await app.plugins.restartPlugin(diagnostics.pluginId);
256
+ }}
257
+ />
258
+ {/each}
259
+ </div>
260
+ {/if}
182
261
  </section>