@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
@@ -0,0 +1,29 @@
1
+ import { type App, type InstalledPluginRecord, type PluginCatalogEntry, type PluginDownloadStatsSummary, type PluginRegistrySourceState, type PluginUpdateInfo } from "@lapis-notes/api";
2
+ import type { PluginRegistryActionFeedback } from "./plugin-registry-detail";
3
+ export declare const registryErrorMessage: (error: unknown) => string;
4
+ export declare function getPluginRegistryController(app: App): PluginRegistryController;
5
+ /** One shared read model and action flow for the browser and Settings. */
6
+ export declare class PluginRegistryController {
7
+ readonly app: App;
8
+ catalogEntries: PluginCatalogEntry[];
9
+ installed: InstalledPluginRecord[];
10
+ updates: PluginUpdateInfo[];
11
+ downloadStats: PluginDownloadStatsSummary | null;
12
+ registrySources: readonly PluginRegistrySourceState[];
13
+ lastError: Error | null;
14
+ initialLoading: boolean;
15
+ refreshing: boolean;
16
+ runningAction: string | null;
17
+ actionFeedback: PluginRegistryActionFeedback | null;
18
+ pluginLifecycleRevision: number;
19
+ private references;
20
+ private disposers;
21
+ private generation;
22
+ private refreshTask;
23
+ constructor(app: App);
24
+ retain(): () => void;
25
+ refresh(force: boolean): Promise<void>;
26
+ runPluginAction(actionId: string, pluginId: string, title: string, action: (signal: AbortSignal) => Promise<unknown>): Promise<void>;
27
+ install(entry: PluginCatalogEntry, version?: string): Promise<void>;
28
+ update(update: PluginUpdateInfo): Promise<void>;
29
+ }
@@ -0,0 +1,154 @@
1
+ import { isAbortError, Notice, PluginDistributionError, withPluginInstallProgress, } from "@lapis-notes/api";
2
+ export const registryErrorMessage = (error) => error instanceof PluginDistributionError
3
+ ? `${error.code}: ${error.message}`
4
+ : error instanceof Error
5
+ ? error.message
6
+ : String(error);
7
+ const controllers = new WeakMap();
8
+ export function getPluginRegistryController(app) {
9
+ let controller = controllers.get(app);
10
+ if (!controller) {
11
+ controller = new PluginRegistryController(app);
12
+ controllers.set(app, controller);
13
+ }
14
+ return controller;
15
+ }
16
+ /** One shared read model and action flow for the browser and Settings. */
17
+ export class PluginRegistryController {
18
+ app;
19
+ catalogEntries = $state([]);
20
+ installed = $state([]);
21
+ updates = $state([]);
22
+ downloadStats = $state(null);
23
+ registrySources = $state([]);
24
+ lastError = $state(null);
25
+ initialLoading = $state(true);
26
+ refreshing = $state(false);
27
+ runningAction = $state(null);
28
+ actionFeedback = $state(null);
29
+ pluginLifecycleRevision = $state(0);
30
+ references = 0;
31
+ disposers = [];
32
+ generation = 0;
33
+ refreshTask = null;
34
+ constructor(app) {
35
+ this.app = app;
36
+ this.registrySources = app.pluginDistribution.listSources();
37
+ }
38
+ retain() {
39
+ if (this.references++ === 0) {
40
+ for (const name of ["plugin-enabled", "plugin-disabled"]) {
41
+ const ref = this.app.plugins.on(name, () => {
42
+ this.pluginLifecycleRevision += 1;
43
+ });
44
+ this.disposers.push(() => this.app.plugins.offref(ref));
45
+ }
46
+ }
47
+ let released = false;
48
+ return () => {
49
+ if (released)
50
+ return;
51
+ released = true;
52
+ if (--this.references === 0) {
53
+ this.disposers.splice(0).forEach((dispose) => dispose());
54
+ this.generation += 1;
55
+ this.refreshTask = null;
56
+ this.refreshing = false;
57
+ }
58
+ };
59
+ }
60
+ async refresh(force) {
61
+ if (this.refreshTask) {
62
+ await this.refreshTask;
63
+ if (!force)
64
+ return;
65
+ }
66
+ const generation = this.generation;
67
+ this.refreshing = true;
68
+ const task = (async () => {
69
+ try {
70
+ this.lastError = null;
71
+ if (force || !this.catalogEntries.length)
72
+ await this.app.pluginDistribution.refreshCatalog({ force });
73
+ const catalogEntries = this.app.pluginDistribution.search({
74
+ channel: "all",
75
+ });
76
+ const [installed, updates, downloadStats] = await Promise.all([
77
+ this.app.pluginDistribution.listInstalled(),
78
+ this.app.pluginDistribution.listUpdates(),
79
+ this.app.pluginDistribution
80
+ .getDownloadStats?.({ force })
81
+ .catch(() => null) ?? null,
82
+ ]);
83
+ if (generation !== this.generation)
84
+ return;
85
+ this.catalogEntries = catalogEntries;
86
+ this.installed = installed;
87
+ this.updates = updates;
88
+ this.downloadStats = downloadStats;
89
+ }
90
+ catch (error) {
91
+ if (generation === this.generation)
92
+ this.lastError =
93
+ error instanceof Error ? error : new Error(String(error));
94
+ }
95
+ finally {
96
+ if (generation === this.generation) {
97
+ this.registrySources = this.app.pluginDistribution.listSources();
98
+ this.initialLoading = false;
99
+ this.refreshing = false;
100
+ }
101
+ }
102
+ })();
103
+ this.refreshTask = task;
104
+ await task;
105
+ if (this.refreshTask === task)
106
+ this.refreshTask = null;
107
+ }
108
+ async runPluginAction(actionId, pluginId, title, action) {
109
+ if (this.runningAction)
110
+ return;
111
+ this.runningAction = actionId;
112
+ this.actionFeedback = { pluginId, state: "running", message: title };
113
+ try {
114
+ await withPluginInstallProgress(this.app, { pluginId, title }, action);
115
+ await this.refresh(false);
116
+ this.actionFeedback = {
117
+ pluginId,
118
+ state: "success",
119
+ message: actionId.startsWith("update:")
120
+ ? "Update installed"
121
+ : "Installed",
122
+ };
123
+ }
124
+ catch (error) {
125
+ if (isAbortError(error)) {
126
+ this.actionFeedback = null;
127
+ await this.refresh(false);
128
+ return;
129
+ }
130
+ this.actionFeedback = {
131
+ pluginId,
132
+ state: "error",
133
+ message: registryErrorMessage(error),
134
+ };
135
+ new Notice(`Plugin registry action failed: ${registryErrorMessage(error)}`, undefined, this.app);
136
+ }
137
+ finally {
138
+ this.runningAction = null;
139
+ }
140
+ }
141
+ install(entry, version) {
142
+ return this.runPluginAction(`install:${entry.id}`, entry.id, `Installing ${entry.name}`, (signal) => this.app.pluginDistribution.install(entry.id, {
143
+ version,
144
+ enable: true,
145
+ requireOfficial: entry.channel === "official",
146
+ signal,
147
+ }));
148
+ }
149
+ update(update) {
150
+ return this.runPluginAction(`update:${update.id}`, update.id, `Updating ${update.name}`, (signal) => this.app.pluginDistribution.update(update.id, update.targetVersion, {
151
+ signal,
152
+ }));
153
+ }
154
+ }
@@ -0,0 +1,18 @@
1
+ import { type App, type PluginCatalogDetail, type PluginCatalogEntry } from "@lapis-notes/api";
2
+ import type { PluginMarkdownState } from "./plugin-registry-detail";
3
+ /** Surface-owned detail requests; a late response cannot replace a newer route. */
4
+ export declare class PluginRegistryDetailSession {
5
+ readonly app: App;
6
+ entryId: string | null;
7
+ detail: PluginCatalogDetail | null;
8
+ loading: boolean;
9
+ overview: PluginMarkdownState;
10
+ changelog: PluginMarkdownState;
11
+ private generation;
12
+ private entry;
13
+ constructor(app: App);
14
+ dispose(): void;
15
+ select(entry: PluginCatalogEntry): Promise<void>;
16
+ retry(kind: "overview" | "changelog"): Promise<void>;
17
+ private load;
18
+ }
@@ -0,0 +1,106 @@
1
+ import { fetchVerifiedPluginMarkdown, } from "@lapis-notes/api";
2
+ import { registryErrorMessage } from "./plugin-registry-controller.svelte";
3
+ import { fetchPluginReadmeMarkdown, resolveReadmeRelativeUrls, } from "./plugin-readme";
4
+ /** Surface-owned detail requests; a late response cannot replace a newer route. */
5
+ export class PluginRegistryDetailSession {
6
+ app;
7
+ entryId = $state(null);
8
+ detail = $state(null);
9
+ loading = $state(false);
10
+ overview = $state({ status: "idle" });
11
+ changelog = $state({ status: "idle" });
12
+ generation = 0;
13
+ entry = null;
14
+ constructor(app) {
15
+ this.app = app;
16
+ }
17
+ dispose() {
18
+ this.generation += 1;
19
+ this.loading = false;
20
+ }
21
+ async select(entry) {
22
+ const generation = ++this.generation;
23
+ this.entry = entry;
24
+ this.entryId = entry.id;
25
+ this.detail = null;
26
+ this.loading = true;
27
+ this.overview = { status: "loading" };
28
+ this.changelog = { status: "loading" };
29
+ try {
30
+ const detail = await this.app.pluginDistribution.getPluginDetail(entry.id);
31
+ if (generation !== this.generation)
32
+ return;
33
+ this.detail = detail;
34
+ if (detail?.schemaVersion === 2) {
35
+ this.overview = { status: "missing" };
36
+ this.changelog = { status: "missing" };
37
+ return;
38
+ }
39
+ await Promise.all([
40
+ this.load("overview", entry, detail, generation),
41
+ this.load("changelog", entry, detail, generation),
42
+ ]);
43
+ }
44
+ catch (error) {
45
+ if (generation !== this.generation)
46
+ return;
47
+ this.overview = { status: "error", message: registryErrorMessage(error) };
48
+ this.changelog = { status: "missing" };
49
+ }
50
+ finally {
51
+ if (generation === this.generation)
52
+ this.loading = false;
53
+ }
54
+ }
55
+ async retry(kind) {
56
+ if (!this.entry)
57
+ return;
58
+ this[kind] = { status: "loading" };
59
+ await this.load(kind, this.entry, this.detail, this.generation);
60
+ }
61
+ async load(kind, entry, detail, generation) {
62
+ const reference = detail?.content?.[kind];
63
+ const set = (state) => {
64
+ if (generation === this.generation)
65
+ this[kind] = state;
66
+ };
67
+ if (reference) {
68
+ try {
69
+ const markdown = await fetchVerifiedPluginMarkdown(reference);
70
+ set({
71
+ status: "loaded",
72
+ url: reference.url,
73
+ sourceUrl: reference.sourceUrl,
74
+ markdown: resolveReadmeRelativeUrls(markdown, reference.url),
75
+ });
76
+ }
77
+ catch (error) {
78
+ set({
79
+ status: "error",
80
+ message: registryErrorMessage(error),
81
+ sourceUrl: reference.sourceUrl,
82
+ });
83
+ }
84
+ return;
85
+ }
86
+ const readmeUrl = detail?.readmeUrl ?? entry.readmeUrl;
87
+ if (kind === "changelog" || !readmeUrl) {
88
+ set({ status: "missing" });
89
+ return;
90
+ }
91
+ try {
92
+ const markdown = await fetchPluginReadmeMarkdown(readmeUrl, {
93
+ pluginId: entry.id,
94
+ detailUrl: entry.detail,
95
+ });
96
+ set({ status: "loaded", url: readmeUrl, sourceUrl: readmeUrl, markdown });
97
+ }
98
+ catch (error) {
99
+ set({
100
+ status: "error",
101
+ message: registryErrorMessage(error),
102
+ sourceUrl: readmeUrl,
103
+ });
104
+ }
105
+ }
106
+ }
@@ -0,0 +1,17 @@
1
+ export type PluginMarkdownState = {
2
+ status: "idle" | "loading" | "missing";
3
+ } | {
4
+ status: "loaded";
5
+ url: string;
6
+ sourceUrl: string;
7
+ markdown: string;
8
+ } | {
9
+ status: "error";
10
+ message: string;
11
+ sourceUrl?: string;
12
+ };
13
+ export type PluginRegistryActionFeedback = {
14
+ pluginId: string;
15
+ state: "running" | "success" | "error";
16
+ message: string;
17
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,41 @@
1
+ import { ItemView, type WorkspaceLeaf } from "@lapis-notes/api";
2
+ import { type PluginBrowserNavigation } from "./PluginBrowser.svelte";
3
+ /** App-owned browser view; registration lives in the private default profile. */
4
+ export declare class PluginsView extends ItemView {
5
+ private disposeHeader;
6
+ private component;
7
+ readonly navigation: PluginBrowserNavigation;
8
+ constructor(leaf: WorkspaceLeaf);
9
+ getViewType(): string;
10
+ getDisplayText(): string;
11
+ getBreadcrumbs(): ReturnType<ItemView["getBreadcrumbs"]>;
12
+ getState(): {
13
+ route: {
14
+ page: "landing" | "directory";
15
+ } | {
16
+ page: "plugin";
17
+ pluginId: string;
18
+ version?: string;
19
+ };
20
+ directory: {
21
+ query: string;
22
+ categories: string[];
23
+ platforms: string[];
24
+ statuses: string[];
25
+ officialOnly: boolean;
26
+ updatesOnly: boolean;
27
+ installation: "all" | "installed" | "available";
28
+ sort: string;
29
+ view: "grid" | "list";
30
+ };
31
+ returnPage: "directory" | "landing";
32
+ scrollTop: number;
33
+ };
34
+ setState(state: Record<string, unknown>): Promise<void>;
35
+ showPlugin(pluginId: string, version?: string): void;
36
+ home(): void;
37
+ load(): void;
38
+ unload(): void;
39
+ protected onOpen(): Promise<void>;
40
+ protected onClose(): Promise<void>;
41
+ }
@@ -0,0 +1,109 @@
1
+ import { ItemView } from "@lapis-notes/api";
2
+ import { getPluginRegistryController } from "./plugin-registry-controller.svelte";
3
+ import { mount, unmount } from "svelte";
4
+ import PluginBrowser, {} from "./PluginBrowser.svelte";
5
+ import { defaultDirectoryState, restoreBrowserState, } from "./plugin-browser-model";
6
+ /** App-owned browser view; registration lives in the private default profile. */
7
+ export class PluginsView extends ItemView {
8
+ disposeHeader = null;
9
+ component = null;
10
+ navigation = $state({
11
+ route: { page: "landing" },
12
+ directory: defaultDirectoryState(),
13
+ returnPage: "landing",
14
+ scrollTop: 0,
15
+ });
16
+ constructor(leaf) {
17
+ super(leaf);
18
+ this.icon = "package";
19
+ }
20
+ getViewType() {
21
+ return "plugins";
22
+ }
23
+ getDisplayText() {
24
+ if (this.navigation.route.page === "plugin") {
25
+ const pluginId = this.navigation.route.pluginId;
26
+ return (getPluginRegistryController(this.app).catalogEntries.find((entry) => entry.id === pluginId)?.name ?? "Plugins");
27
+ }
28
+ return "Plugins";
29
+ }
30
+ getBreadcrumbs() {
31
+ if (this.navigation.route.page === "landing")
32
+ return [];
33
+ const crumbs = [
34
+ { id: "registry", label: "Registry", onSelect: () => this.home() },
35
+ ];
36
+ if (this.navigation.route.page === "plugin")
37
+ crumbs.push({
38
+ id: "plugins",
39
+ label: "Plugins",
40
+ onSelect: () => {
41
+ this.navigation.route = { page: this.navigation.returnPage };
42
+ this.app.workspace.requestSaveLayout();
43
+ },
44
+ });
45
+ return crumbs;
46
+ }
47
+ getState() {
48
+ return {
49
+ route: { ...this.navigation.route },
50
+ directory: structuredClone($state.snapshot(this.navigation.directory)),
51
+ returnPage: this.navigation.returnPage,
52
+ scrollTop: this.navigation.scrollTop,
53
+ };
54
+ }
55
+ async setState(state) {
56
+ Object.assign(this.navigation, restoreBrowserState(state));
57
+ this.navigation.returnPage =
58
+ state.returnPage === "directory" ? "directory" : "landing";
59
+ this.navigation.scrollTop =
60
+ typeof state.scrollTop === "number" && Number.isFinite(state.scrollTop)
61
+ ? Math.max(0, state.scrollTop)
62
+ : 0;
63
+ }
64
+ showPlugin(pluginId, version) {
65
+ if (this.navigation.route.page !== "plugin")
66
+ this.navigation.returnPage = this.navigation.route.page;
67
+ this.navigation.route = {
68
+ page: "plugin",
69
+ pluginId,
70
+ ...(version !== undefined ? { version } : {}),
71
+ };
72
+ this.app.workspace.requestSaveLayout();
73
+ }
74
+ home() {
75
+ this.navigation.route = { page: "landing" };
76
+ this.navigation.scrollTop = 0;
77
+ this.app.workspace.requestSaveLayout();
78
+ }
79
+ load() {
80
+ this.unload();
81
+ this.containerEl.replaceChildren();
82
+ const registry = getPluginRegistryController(this.app);
83
+ this.actions = [];
84
+ this.addAction("refresh-cw", "Refresh plugins", () => void registry.refresh(true));
85
+ this.disposeHeader = $effect.root(() => {
86
+ $effect(() => {
87
+ this.actions[0].disabled = registry.refreshing;
88
+ });
89
+ });
90
+ this.component = mount(PluginBrowser, {
91
+ target: this.containerEl,
92
+ props: {
93
+ app: this.app,
94
+ navigation: this.navigation,
95
+ onstatechange: () => this.app.workspace.requestSaveLayout(),
96
+ },
97
+ });
98
+ }
99
+ unload() {
100
+ this.disposeHeader?.();
101
+ this.disposeHeader = null;
102
+ this.actions = [];
103
+ if (this.component)
104
+ void unmount(this.component);
105
+ this.component = null;
106
+ }
107
+ async onOpen() { }
108
+ async onClose() { }
109
+ }
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@lapis-notes/workspace",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "description": "Lapis Notes workspace shell backed by design-core",
5
- "license": "AGPL-3.0-or-later",
5
+ "license": "Apache-2.0",
6
6
  "repository": {
7
7
  "type": "git",
8
8
  "url": "git+https://github.com/lapismd/lapis-notes.git",
@@ -38,8 +38,8 @@
38
38
  }
39
39
  },
40
40
  "dependencies": {
41
- "@lapis-notes/api": "^0.1.0",
42
- "@lapismd/design-core": "^0.1.0",
41
+ "@lapis-notes/api": "^0.1.2",
42
+ "@lapismd/design-core": "^0.3.2",
43
43
  "@lucide/svelte": "^0.523.0"
44
44
  },
45
45
  "peerDependencies": {
@@ -52,7 +52,7 @@
52
52
  "fake-indexeddb": "^6.2.5",
53
53
  "jsdom": "^26.1.0",
54
54
  "publint": "^0.3.12",
55
- "svelte": "^5.38.2",
55
+ "svelte": "5.56.10",
56
56
  "svelte-check": "^4.3.1",
57
57
  "tslib": "^2.8.1",
58
58
  "typescript": "~5.8.3",