okno 1.0.0-beta.6 → 1.0.0-beta.8

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.
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAiBA,KAAK,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;AAEpE,UAAU,QAAQ;IACjB,SAAS,EAAE,SAAS,CAAA;IACpB,yEAAyE;IACzE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,oFAAoF;IACpF,SAAS,EAAE,KAAK,GAAG,MAAM,CAAA;CACzB;AAiBD,kEAAkE;AAClE,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CA0B5C;AAED;;;mEAGmE;AACnE,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CA8BrD;AAED,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,CAAA;AAE9C;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,YAAwB,GAAG,OAAO,CAmB7E;AA2FD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWrD;AAED,qDAAqD;AACrD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAgB/E;AAED,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CA8F7C"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAkBA,KAAK,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;AAEpE,UAAU,QAAQ;IACjB,SAAS,EAAE,SAAS,CAAA;IACpB,yEAAyE;IACzE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,oFAAoF;IACpF,SAAS,EAAE,KAAK,GAAG,MAAM,CAAA;CACzB;AAiBD,kEAAkE;AAClE,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CA0B5C;AAED;;;mEAGmE;AACnE,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CA8BrD;AAED,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,CAAA;AAE9C;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,YAAwB,GAAG,OAAO,CAmB7E;AA2FD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWrD;AAED,qDAAqD;AACrD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAgB/E;AA2DD,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAuK7C"}
package/dist/init.js CHANGED
@@ -1,58 +1,59 @@
1
- import { existsSync as f, readFileSync as h, writeFileSync as l, mkdirSync as k } from "node:fs";
2
- import { join as s, dirname as v } from "node:path";
3
- import { fileURLToPath as S } from "node:url";
4
- const u = {
1
+ import { existsSync as c, readFileSync as d, writeFileSync as f, mkdirSync as g } from "node:fs";
2
+ import { join as i, dirname as v } from "node:path";
3
+ import { fileURLToPath as j } from "node:url";
4
+ import { spawnSync as $ } from "node:child_process";
5
+ const k = {
5
6
  astro: ["astro.config.mjs", "astro.config.ts", "astro.config.js"],
6
7
  sveltekit: ["vite.config.ts", "vite.config.js"],
7
8
  nuxt: ["nuxt.config.ts", "nuxt.config.js"],
8
9
  vite: ["vite.config.ts", "vite.config.js", "vite.config.mjs"]
9
10
  };
10
- function p(n, e) {
11
- for (const t of e) {
12
- const o = s(n, t);
13
- if (f(o)) return o;
11
+ function m(t, e) {
12
+ for (const n of e) {
13
+ const s = i(t, n);
14
+ if (c(s)) return s;
14
15
  }
15
16
  return null;
16
17
  }
17
- function b(n) {
18
- const e = s(n, "package.json"), t = {};
19
- if (f(e))
18
+ function w(t) {
19
+ const e = i(t, "package.json"), n = {};
20
+ if (c(e))
20
21
  try {
21
- const i = JSON.parse(h(e, "utf-8"));
22
- Object.assign(t, i.dependencies, i.devDependencies);
22
+ const l = JSON.parse(d(e, "utf-8"));
23
+ Object.assign(n, l.dependencies, l.devDependencies);
23
24
  } catch {
24
25
  }
25
- const o = (i) => i in t;
26
- return o("astro") || p(n, u.astro) ? { framework: "astro", configPath: p(n, u.astro), pluginsAt: "vite" } : o("nuxt") ? { framework: "nuxt", configPath: p(n, u.nuxt), pluginsAt: "vite" } : o("@sveltejs/kit") ? { framework: "sveltekit", configPath: p(n, u.vite), pluginsAt: "top" } : o("vite") ? { framework: "vite", configPath: p(n, u.vite), pluginsAt: "top" } : { framework: "unknown", configPath: null, pluginsAt: "top" };
26
+ const s = (l) => l in n;
27
+ return s("astro") || m(t, k.astro) ? { framework: "astro", configPath: m(t, k.astro), pluginsAt: "vite" } : s("nuxt") ? { framework: "nuxt", configPath: m(t, k.nuxt), pluginsAt: "vite" } : s("@sveltejs/kit") ? { framework: "sveltekit", configPath: m(t, k.vite), pluginsAt: "top" } : s("vite") ? { framework: "vite", configPath: m(t, k.vite), pluginsAt: "top" } : { framework: "unknown", configPath: null, pluginsAt: "top" };
27
28
  }
28
- function x(n) {
29
- let e = h(n, "utf-8");
29
+ function y(t) {
30
+ let e = d(t, "utf-8");
30
31
  if (/from\s*["']okno\/vite["']/.test(e)) return !0;
31
- const t = e.match(/\bplugins\s*:\s*\[/);
32
- if (!t || t.index === void 0) return !1;
33
- const o = t.index + t[0].length, i = e.slice(o);
34
- let m;
35
- const a = i.match(/^[^\S\n]*\n(\s*)/);
36
- a ? m = `
37
- ${a[1]}okno(),` : i.trimStart().startsWith("]") ? m = "okno()" : m = "okno(), ", e = e.slice(0, o) + m + e.slice(o);
38
- const d = 'import { okno } from "okno/vite"', r = [...e.matchAll(/^import .*$/gm)];
39
- if (r.length) {
40
- const c = r[r.length - 1], g = c.index + c[0].length;
41
- e = e.slice(0, g) + `
42
- ` + d + e.slice(g);
32
+ const n = e.match(/\bplugins\s*:\s*\[/);
33
+ if (!n || n.index === void 0) return !1;
34
+ const s = n.index + n[0].length, l = e.slice(s);
35
+ let u;
36
+ const a = l.match(/^[^\S\n]*\n(\s*)/);
37
+ a ? u = `
38
+ ${a[1]}okno(),` : l.trimStart().startsWith("]") ? u = "okno()" : u = "okno(), ", e = e.slice(0, s) + u + e.slice(s);
39
+ const h = 'import { okno } from "okno/vite"', o = [...e.matchAll(/^import .*$/gm)];
40
+ if (o.length) {
41
+ const r = o[o.length - 1], p = r.index + r[0].length;
42
+ e = e.slice(0, p) + `
43
+ ` + h + e.slice(p);
43
44
  } else
44
- e = d + `
45
+ e = h + `
45
46
  ` + e;
46
- return l(n, e), !0;
47
+ return f(t, e), !0;
47
48
  }
48
- function A(n, e = "starter") {
49
- const t = s(n, "okno"), o = s(t, "schema.ts");
50
- return f(o) ? !1 : (k(t, { recursive: !0 }), e === "empty" ? (l(o, C), !0) : (k(s(t, "pages"), { recursive: !0 }), k(s(t, "globals"), { recursive: !0 }), l(o, j), l(s(t, "pages", "home.ts"), w), l(s(t, "globals", "meta.ts"), E), l(s(t, "globals", "navbar.ts"), R), l(s(t, "globals", "footer.ts"), T), !0));
49
+ function M(t, e = "starter") {
50
+ const n = i(t, "okno"), s = i(n, "schema.ts");
51
+ return c(s) ? !1 : (g(n, { recursive: !0 }), e === "empty" ? (f(s, R), !0) : (g(i(n, "pages"), { recursive: !0 }), g(i(n, "globals"), { recursive: !0 }), f(s, E), f(i(n, "pages", "home.ts"), I), f(i(n, "globals", "meta.ts"), T), f(i(n, "globals", "navbar.ts"), O), f(i(n, "globals", "footer.ts"), N), !0));
51
52
  }
52
- const C = `import type { Schema } from "okno"
53
+ const R = `import type { Schema } from "okno"
53
54
 
54
55
  export default {} satisfies Schema
55
- `, j = `import type { Schema } from "okno"
56
+ `, E = `import type { Schema } from "okno"
56
57
 
57
58
  export default {
58
59
  pages: {
@@ -102,19 +103,19 @@ export default {
102
103
  },
103
104
  },
104
105
  } satisfies Schema
105
- `, w = `export default {
106
+ `, I = `export default {
106
107
  headline: "Hello from okno",
107
108
  subhead: "Edit this on the page — press “e” or visit ?okno.",
108
109
  body: "<p>This is your home page. Everything here is content in your repo.</p>",
109
110
  image: null,
110
111
  }
111
- `, E = `export default {
112
+ `, T = `export default {
112
113
  title: "My okno site",
113
114
  description: "Built with okno — a Git-backed CMS with live editing.",
114
115
  shareImage: null,
115
116
  favicon: null,
116
117
  }
117
- `, R = `export default {
118
+ `, O = `export default {
118
119
  logo: "okno",
119
120
  links: [
120
121
  { link: { text: "Home", url: "/", external: false } },
@@ -122,34 +123,104 @@ export default {
122
123
  ],
123
124
  cta: { text: "Get started", url: "/", external: false },
124
125
  }
125
- `, T = `export default {
126
+ `, N = `export default {
126
127
  text: "© My okno site",
127
128
  links: [{ link: { text: "Home", url: "/", external: false } }],
128
129
  }
129
130
  `;
130
- function P(n) {
131
- const e = v(S(import.meta.url)), t = s(e, "..", "skills", "connect-okno", "SKILL.md");
132
- if (!f(t)) return null;
133
- const o = s(".claude", "skills", "connect-okno", "SKILL.md"), i = s(n, o);
134
- return f(i) ? null : (k(v(i), { recursive: !0 }), l(i, h(t, "utf-8")), o);
135
- }
136
- function M(n, e) {
137
- const t = e === "claude" ? ".mcp.json" : s(".cursor", "mcp.json"), o = s(n, t);
138
- let i = { mcpServers: {} };
139
- if (f(o))
131
+ function b(t) {
132
+ const e = v(j(import.meta.url)), n = i(e, "..", "skills", "connect-okno", "SKILL.md");
133
+ if (!c(n)) return null;
134
+ const s = i(".claude", "skills", "connect-okno", "SKILL.md"), l = i(t, s);
135
+ return c(l) ? null : (g(v(l), { recursive: !0 }), f(l, d(n, "utf-8")), s);
136
+ }
137
+ function S(t, e) {
138
+ const n = e === "claude" ? ".mcp.json" : i(".cursor", "mcp.json"), s = i(t, n);
139
+ let l = { mcpServers: {} };
140
+ if (c(s))
140
141
  try {
141
- i = JSON.parse(h(o, "utf-8"));
142
+ l = JSON.parse(d(s, "utf-8"));
142
143
  } catch {
143
144
  }
144
- return i.mcpServers ??= {}, i.mcpServers.okno = { command: "npx", args: ["okno", "mcp"] }, k(s(o, ".."), { recursive: !0 }), l(o, JSON.stringify(i, null, 2) + `
145
- `), t;
145
+ return l.mcpServers ??= {}, l.mcpServers.okno = { command: "npx", args: ["okno", "mcp"] }, g(i(s, ".."), { recursive: !0 }), f(s, JSON.stringify(l, null, 2) + `
146
+ `), n;
147
+ }
148
+ function x(t) {
149
+ return c(i(t, "bun.lock")) || c(i(t, "bun.lockb")) ? "bun" : c(i(t, "pnpm-lock.yaml")) ? "pnpm" : c(i(t, "yarn.lock")) ? "yarn" : "npm";
146
150
  }
147
- async function H() {
148
- const n = process.cwd(), e = await import("@clack/prompts");
151
+ function H() {
152
+ try {
153
+ const t = v(j(import.meta.url));
154
+ return JSON.parse(d(i(t, "..", "package.json"), "utf-8")).version ?? "";
155
+ } catch {
156
+ return "";
157
+ }
158
+ }
159
+ function F(t) {
160
+ for (const e of [".mcp.json", i(".cursor", "mcp.json")]) {
161
+ const n = i(t, e);
162
+ if (c(n))
163
+ try {
164
+ if (JSON.parse(d(n, "utf-8"))?.mcpServers?.okno) return !0;
165
+ } catch {
166
+ }
167
+ }
168
+ return !1;
169
+ }
170
+ function C(t) {
171
+ try {
172
+ const e = JSON.parse(d(i(t, "package.json"), "utf-8"));
173
+ return !!(e.dependencies?.okno || e.devDependencies?.okno);
174
+ } catch {
175
+ return !1;
176
+ }
177
+ }
178
+ function A(t, e) {
179
+ const n = H(), s = n ? `okno@${n}` : "okno", l = e === "npm" ? ["install", s] : ["add", s], u = `${e} ${l.join(" ")}`;
180
+ return $(e, l, { cwd: t, stdio: "inherit", shell: process.platform === "win32" }).status === 0 ? u : null;
181
+ }
182
+ async function L() {
183
+ const t = process.cwd(), e = await import("@clack/prompts");
149
184
  e.intro("okno init");
150
- let t = b(n);
151
- if (t.framework === "unknown") {
152
- const r = await e.select({
185
+ let n = w(t);
186
+ if (c(i(t, "okno", "schema.ts"))) {
187
+ const o = [];
188
+ if (C(t))
189
+ o.push("• okno already installed");
190
+ else {
191
+ const r = x(t);
192
+ e.log.step(`Installing okno with ${r}…`);
193
+ const p = A(t, r);
194
+ o.push(
195
+ p ? `✓ Installed okno (${p})` : `! Couldn't install okno — run \`${r === "npm" ? "npm install" : `${r} add`} okno\` yourself`
196
+ );
197
+ }
198
+ if (n.configPath) {
199
+ const r = n.configPath.replace(t + "/", "");
200
+ /from\s*["']okno\/vite["']/.test(d(n.configPath, "utf-8")) ? o.push(`• Plugin already in ${r}`) : y(n.configPath) ? o.push(`✓ Added okno() to ${r}`) : o.push("! Add okno() to your config's plugins array yourself");
201
+ }
202
+ if (o.push("• okno/ already scaffolded — left it alone"), F(t))
203
+ o.push("• MCP already configured");
204
+ else {
205
+ const r = await e.select({
206
+ message: "Add the okno MCP server for your AI editor? (optional)",
207
+ options: [
208
+ { value: "skip", label: "Skip", hint: "default — add later with `okno mcp`" },
209
+ { value: "claude", label: "Claude Code", hint: ".mcp.json + connect-okno skill" },
210
+ { value: "cursor", label: "Cursor", hint: ".cursor/mcp.json" }
211
+ ],
212
+ initialValue: "skip"
213
+ });
214
+ if (!e.isCancel(r) && r !== "skip" && (o.push(`✓ Registered the okno MCP server in ${S(t, r)}`), r === "claude")) {
215
+ const p = b(t);
216
+ p && o.push(`✓ Installed the connect-okno skill in ${p}`);
217
+ }
218
+ }
219
+ return e.note(o.join(`
220
+ `), "okno is already set up"), e.outro("Run your dev server and press “e” (or visit ?okno) to open the editor.");
221
+ }
222
+ if (n.framework === "unknown") {
223
+ const o = await e.select({
153
224
  message: "Which framework is this project?",
154
225
  options: [
155
226
  { value: "astro", label: "Astro" },
@@ -158,23 +229,13 @@ async function H() {
158
229
  { value: "nuxt", label: "Nuxt" }
159
230
  ]
160
231
  });
161
- if (e.isCancel(r)) return e.cancel("Cancelled.");
162
- const c = r, g = c === "astro" || c === "nuxt" ? "vite" : "top", y = u[c] ?? u.vite;
163
- t = { framework: c, configPath: p(n, y), pluginsAt: g };
232
+ if (e.isCancel(o)) return e.cancel("Cancelled.");
233
+ const r = o, p = r === "astro" || r === "nuxt" ? "vite" : "top", P = k[r] ?? k.vite;
234
+ n = { framework: r, configPath: m(t, P), pluginsAt: p };
164
235
  }
165
- const o = await e.select({
166
- message: "Set up the okno MCP server for your AI editor?",
167
- options: [
168
- { value: "claude", label: "Claude Code", hint: ".mcp.json + connect-okno skill" },
169
- { value: "cursor", label: "Cursor", hint: ".cursor/mcp.json" },
170
- { value: "skip", label: "Skip", hint: "no AI editor" }
171
- ],
172
- initialValue: "claude"
173
- });
174
- if (e.isCancel(o)) return e.cancel("Cancelled.");
175
- let i = "starter";
176
- if (!f(s(n, "okno", "schema.ts"))) {
177
- const r = await e.select({
236
+ let s = "starter";
237
+ if (!c(i(t, "okno", "schema.ts"))) {
238
+ const o = await e.select({
178
239
  message: "Scaffold a Starter, or an empty schema?",
179
240
  options: [
180
241
  { value: "starter", label: "Starter", hint: "Home + Meta/Navbar/Footer globals, ready to edit" },
@@ -182,40 +243,60 @@ async function H() {
182
243
  ],
183
244
  initialValue: "starter"
184
245
  });
185
- if (e.isCancel(r)) return e.cancel("Cancelled.");
186
- i = r;
246
+ if (e.isCancel(o)) return e.cancel("Cancelled.");
247
+ s = o;
187
248
  }
249
+ const u = await e.select({
250
+ message: "Set up the okno MCP server for your AI editor? (optional)",
251
+ options: [
252
+ { value: "skip", label: "Skip", hint: "default — add later with `okno mcp`" },
253
+ { value: "claude", label: "Claude Code", hint: ".mcp.json + connect-okno skill" },
254
+ { value: "cursor", label: "Cursor", hint: ".cursor/mcp.json" }
255
+ ],
256
+ initialValue: "skip"
257
+ });
258
+ if (e.isCancel(u)) return e.cancel("Cancelled.");
188
259
  const a = [];
189
- let d = !1;
190
- if (t.configPath && (d = x(t.configPath)), d)
191
- a.push(`✓ Added okno() to ${t.configPath.replace(n + "/", "")}`);
260
+ if (C(t))
261
+ a.push("• okno already a dependency — skipped install");
262
+ else {
263
+ const o = x(t);
264
+ e.log.step(`Installing okno with ${o}…`);
265
+ const r = A(t, o);
266
+ a.push(
267
+ r ? `✓ Installed okno (${r})` : `! Couldn't install okno automatically — run \`${o === "npm" ? "npm install" : `${o} add`} okno\` yourself`
268
+ );
269
+ }
270
+ let h = !1;
271
+ if (n.configPath && (h = y(n.configPath)), h)
272
+ a.push(`✓ Added okno() to ${n.configPath.replace(t + "/", "")}`);
192
273
  else {
193
- const r = t.pluginsAt === "vite" ? `import { okno } from "okno/vite"
274
+ const o = n.pluginsAt === "vite" ? `import { okno } from "okno/vite"
194
275
  // inside defineConfig:
195
276
  // vite: { plugins: [okno()] }` : `import { okno } from "okno/vite"
196
277
  // inside defineConfig:
197
278
  // plugins: [okno()]`;
198
279
  a.push(`! Couldn't edit your config automatically — add okno() yourself:
199
- ${r}`);
280
+ ${o}`);
200
281
  }
201
- if (A(n, i) ? a.push(
202
- i === "starter" ? "✓ Scaffolded the okno Starter (Home + Meta/Navbar/Footer globals)" : "✓ Scaffolded an empty okno/ (schema only — nothing else)"
203
- ) : a.push("• okno/ already exists — left it alone"), o !== "skip") {
204
- const r = M(n, o);
205
- a.push(`✓ Registered the okno MCP server in ${r}`);
282
+ if (M(t, s) ? a.push(
283
+ s === "starter" ? "✓ Scaffolded the okno Starter (Home + Meta/Navbar/Footer globals)" : "✓ Scaffolded an empty okno/ (schema only — nothing else)"
284
+ ) : a.push("• okno/ already exists — left it alone"), u !== "skip") {
285
+ const o = S(t, u);
286
+ a.push(`✓ Registered the okno MCP server in ${o}`);
206
287
  }
207
- if (o === "claude") {
208
- const r = P(n);
209
- r && a.push(`✓ Installed the connect-okno skill in ${r}`);
288
+ if (u === "claude") {
289
+ const o = b(t);
290
+ o && a.push(`✓ Installed the connect-okno skill in ${o}`);
210
291
  }
211
292
  e.note(a.join(`
212
293
  `), "Done"), e.outro("Run your dev server and press “e” (or visit ?okno) to open the editor.");
213
294
  }
214
295
  export {
215
- x as addPlugin,
216
- b as detect,
217
- H as runInit,
218
- A as scaffold,
219
- M as writeMcpConfig,
220
- P as writeSkill
296
+ y as addPlugin,
297
+ w as detect,
298
+ L as runInit,
299
+ M as scaffold,
300
+ S as writeMcpConfig,
301
+ b as writeSkill
221
302
  };
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "okno",
3
3
  "description": "Git-backed CMS with live editing for any Vite framework",
4
4
  "author": "Gabriel Uhlíř",
5
- "version": "1.0.0-beta.6",
5
+ "version": "1.0.0-beta.8",
6
6
  "homepage": "https://okno.build",
7
7
  "type": "module",
8
8
  "types": "./dist/index.d.ts",
@@ -46,20 +46,9 @@
46
46
  "dependencies": {
47
47
  "@clack/prompts": "^0.7.0",
48
48
  "@modelcontextprotocol/sdk": "^1.12.0",
49
- "zod": "^3.23.8",
50
- "@internationalized/date": "^3.12.2",
51
- "@tiptap/core": "^3.27.1",
52
- "@tiptap/extension-image": "3.27.1",
53
- "@tiptap/extension-table": "3.27.1",
54
- "@tiptap/extension-text-align": "^3",
55
- "@tiptap/pm": "^3.27.1",
56
- "@tiptap/starter-kit": "^3.27.1",
57
- "acorn": "^8.11.3",
58
- "bits-ui": "^2.18.0",
59
- "runed": "^0.23.0",
60
49
  "simple-git": "^3.32.0",
61
- "svelte": "^5.55.0",
62
- "svelte-dnd-action": "^0.9.69"
50
+ "svelte": "5.56.3",
51
+ "zod": "^3.23.8"
63
52
  },
64
53
  "devDependencies": {
65
54
  "@hugeicons-pro/core-bulk-rounded": "*",
@@ -67,16 +56,27 @@
67
56
  "@hugeicons-pro/core-stroke-rounded": "*",
68
57
  "@hugeicons-pro/core-stroke-standard": "*",
69
58
  "@hugeicons/svelte": "*",
59
+ "@internationalized/date": "^3.12.2",
70
60
  "@sveltejs/vite-plugin-svelte": "^5.0.0",
71
61
  "@tailwindcss/vite": "^4.0.0",
62
+ "@tiptap/core": "^3.27.1",
63
+ "@tiptap/extension-image": "3.27.1",
64
+ "@tiptap/extension-table": "3.27.1",
65
+ "@tiptap/extension-text-align": "^3",
66
+ "@tiptap/pm": "^3.27.1",
67
+ "@tiptap/starter-kit": "^3.27.1",
72
68
  "@types/node": "^20.19.13",
69
+ "acorn": "^8.11.3",
70
+ "bits-ui": "^2.18.0",
71
+ "runed": "^0.23.0",
72
+ "svelte-dnd-action": "^0.9.69",
73
73
  "tailwindcss": "^4.0.0",
74
74
  "tailwindcss-animate": "^1.0.7",
75
75
  "typescript": "^5.9.2",
76
76
  "vite": "^6.4.3"
77
77
  },
78
78
  "peerDependencies": {
79
- "svelte": "^5.0.0",
79
+ "svelte": "5.56.3",
80
80
  "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0"
81
81
  },
82
82
  "keywords": [