okno 1.0.0-beta.7 → 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":"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;AA4CD,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAgH7C"}
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,8 +1,8 @@
1
- import { existsSync as c, readFileSync as k, writeFileSync as p, mkdirSync as g } from "node:fs";
1
+ import { existsSync as c, readFileSync as d, writeFileSync as f, mkdirSync as g } from "node:fs";
2
2
  import { join as i, dirname as v } from "node:path";
3
- import { fileURLToPath as y } from "node:url";
4
- import { spawnSync as S } from "node:child_process";
5
- const f = {
3
+ import { fileURLToPath as j } from "node:url";
4
+ import { spawnSync as $ } from "node:child_process";
5
+ const k = {
6
6
  astro: ["astro.config.mjs", "astro.config.ts", "astro.config.js"],
7
7
  sveltekit: ["vite.config.ts", "vite.config.js"],
8
8
  nuxt: ["nuxt.config.ts", "nuxt.config.js"],
@@ -10,50 +10,50 @@ const f = {
10
10
  };
11
11
  function m(t, e) {
12
12
  for (const n of e) {
13
- const o = i(t, n);
14
- if (c(o)) return o;
13
+ const s = i(t, n);
14
+ if (c(s)) return s;
15
15
  }
16
16
  return null;
17
17
  }
18
- function x(t) {
18
+ function w(t) {
19
19
  const e = i(t, "package.json"), n = {};
20
20
  if (c(e))
21
21
  try {
22
- const r = JSON.parse(k(e, "utf-8"));
23
- Object.assign(n, r.dependencies, r.devDependencies);
22
+ const l = JSON.parse(d(e, "utf-8"));
23
+ Object.assign(n, l.dependencies, l.devDependencies);
24
24
  } catch {
25
25
  }
26
- const o = (r) => r in n;
27
- return o("astro") || m(t, f.astro) ? { framework: "astro", configPath: m(t, f.astro), pluginsAt: "vite" } : o("nuxt") ? { framework: "nuxt", configPath: m(t, f.nuxt), pluginsAt: "vite" } : o("@sveltejs/kit") ? { framework: "sveltekit", configPath: m(t, f.vite), pluginsAt: "top" } : o("vite") ? { framework: "vite", configPath: m(t, f.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" };
28
28
  }
29
- function A(t) {
30
- let e = k(t, "utf-8");
29
+ function y(t) {
30
+ let e = d(t, "utf-8");
31
31
  if (/from\s*["']okno\/vite["']/.test(e)) return !0;
32
32
  const n = e.match(/\bplugins\s*:\s*\[/);
33
33
  if (!n || n.index === void 0) return !1;
34
- const o = n.index + n[0].length, r = e.slice(o);
35
- let l;
36
- const a = r.match(/^[^\S\n]*\n(\s*)/);
37
- a ? l = `
38
- ${a[1]}okno(),` : r.trimStart().startsWith("]") ? l = "okno()" : l = "okno(), ", e = e.slice(0, o) + l + e.slice(o);
39
- const d = 'import { okno } from "okno/vite"', s = [...e.matchAll(/^import .*$/gm)];
40
- if (s.length) {
41
- const u = s[s.length - 1], h = u.index + u[0].length;
42
- e = e.slice(0, h) + `
43
- ` + d + e.slice(h);
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);
44
44
  } else
45
- e = d + `
45
+ e = h + `
46
46
  ` + e;
47
- return p(t, e), !0;
47
+ return f(t, e), !0;
48
48
  }
49
- function C(t, e = "starter") {
50
- const n = i(t, "okno"), o = i(n, "schema.ts");
51
- return c(o) ? !1 : (g(n, { recursive: !0 }), e === "empty" ? (p(o, j), !0) : (g(i(n, "pages"), { recursive: !0 }), g(i(n, "globals"), { recursive: !0 }), p(o, w), p(i(n, "pages", "home.ts"), E), p(i(n, "globals", "meta.ts"), P), p(i(n, "globals", "navbar.ts"), R), p(i(n, "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));
52
52
  }
53
- const j = `import type { Schema } from "okno"
53
+ const R = `import type { Schema } from "okno"
54
54
 
55
55
  export default {} satisfies Schema
56
- `, w = `import type { Schema } from "okno"
56
+ `, E = `import type { Schema } from "okno"
57
57
 
58
58
  export default {
59
59
  pages: {
@@ -103,19 +103,19 @@ export default {
103
103
  },
104
104
  },
105
105
  } satisfies Schema
106
- `, E = `export default {
106
+ `, I = `export default {
107
107
  headline: "Hello from okno",
108
108
  subhead: "Edit this on the page — press “e” or visit ?okno.",
109
109
  body: "<p>This is your home page. Everything here is content in your repo.</p>",
110
110
  image: null,
111
111
  }
112
- `, P = `export default {
112
+ `, T = `export default {
113
113
  title: "My okno site",
114
114
  description: "Built with okno — a Git-backed CMS with live editing.",
115
115
  shareImage: null,
116
116
  favicon: null,
117
117
  }
118
- `, R = `export default {
118
+ `, O = `export default {
119
119
  logo: "okno",
120
120
  links: [
121
121
  { link: { text: "Home", url: "/", external: false } },
@@ -123,57 +123,104 @@ export default {
123
123
  ],
124
124
  cta: { text: "Get started", url: "/", external: false },
125
125
  }
126
- `, T = `export default {
126
+ `, N = `export default {
127
127
  text: "© My okno site",
128
128
  links: [{ link: { text: "Home", url: "/", external: false } }],
129
129
  }
130
130
  `;
131
- function M(t) {
132
- const e = v(y(import.meta.url)), n = i(e, "..", "skills", "connect-okno", "SKILL.md");
131
+ function b(t) {
132
+ const e = v(j(import.meta.url)), n = i(e, "..", "skills", "connect-okno", "SKILL.md");
133
133
  if (!c(n)) return null;
134
- const o = i(".claude", "skills", "connect-okno", "SKILL.md"), r = i(t, o);
135
- return c(r) ? null : (g(v(r), { recursive: !0 }), p(r, k(n, "utf-8")), o);
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
136
  }
137
- function O(t, e) {
138
- const n = e === "claude" ? ".mcp.json" : i(".cursor", "mcp.json"), o = i(t, n);
139
- let r = { mcpServers: {} };
140
- if (c(o))
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))
141
141
  try {
142
- r = JSON.parse(k(o, "utf-8"));
142
+ l = JSON.parse(d(s, "utf-8"));
143
143
  } catch {
144
144
  }
145
- return r.mcpServers ??= {}, r.mcpServers.okno = { command: "npx", args: ["okno", "mcp"] }, g(i(o, ".."), { recursive: !0 }), p(o, JSON.stringify(r, null, 2) + `
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
146
  `), n;
147
147
  }
148
- function N(t) {
148
+ function x(t) {
149
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";
150
150
  }
151
- function $() {
151
+ function H() {
152
152
  try {
153
- const t = v(y(import.meta.url));
154
- return JSON.parse(k(i(t, "..", "package.json"), "utf-8")).version ?? "";
153
+ const t = v(j(import.meta.url));
154
+ return JSON.parse(d(i(t, "..", "package.json"), "utf-8")).version ?? "";
155
155
  } catch {
156
156
  return "";
157
157
  }
158
158
  }
159
- function I(t) {
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) {
160
171
  try {
161
- const e = JSON.parse(k(i(t, "package.json"), "utf-8"));
172
+ const e = JSON.parse(d(i(t, "package.json"), "utf-8"));
162
173
  return !!(e.dependencies?.okno || e.devDependencies?.okno);
163
174
  } catch {
164
175
  return !1;
165
176
  }
166
177
  }
167
- function H(t, e) {
168
- const n = $(), o = n ? `okno@${n}` : "okno", r = e === "npm" ? ["install", o] : ["add", o], l = `${e} ${r.join(" ")}`;
169
- return S(e, r, { cwd: t, stdio: "inherit", shell: process.platform === "win32" }).status === 0 ? l : null;
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;
170
181
  }
171
- async function V() {
182
+ async function L() {
172
183
  const t = process.cwd(), e = await import("@clack/prompts");
173
184
  e.intro("okno init");
174
- let n = x(t);
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
+ }
175
222
  if (n.framework === "unknown") {
176
- const s = await e.select({
223
+ const o = await e.select({
177
224
  message: "Which framework is this project?",
178
225
  options: [
179
226
  { value: "astro", label: "Astro" },
@@ -182,13 +229,13 @@ async function V() {
182
229
  { value: "nuxt", label: "Nuxt" }
183
230
  ]
184
231
  });
185
- if (e.isCancel(s)) return e.cancel("Cancelled.");
186
- const u = s, h = u === "astro" || u === "nuxt" ? "vite" : "top", b = f[u] ?? f.vite;
187
- n = { framework: u, configPath: m(t, b), pluginsAt: h };
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 };
188
235
  }
189
- let o = "starter";
236
+ let s = "starter";
190
237
  if (!c(i(t, "okno", "schema.ts"))) {
191
- const s = await e.select({
238
+ const o = await e.select({
192
239
  message: "Scaffold a Starter, or an empty schema?",
193
240
  options: [
194
241
  { value: "starter", label: "Starter", hint: "Home + Meta/Navbar/Footer globals, ready to edit" },
@@ -196,10 +243,10 @@ async function V() {
196
243
  ],
197
244
  initialValue: "starter"
198
245
  });
199
- if (e.isCancel(s)) return e.cancel("Cancelled.");
200
- o = s;
246
+ if (e.isCancel(o)) return e.cancel("Cancelled.");
247
+ s = o;
201
248
  }
202
- const l = await e.select({
249
+ const u = await e.select({
203
250
  message: "Set up the okno MCP server for your AI editor? (optional)",
204
251
  options: [
205
252
  { value: "skip", label: "Skip", hint: "default — add later with `okno mcp`" },
@@ -208,48 +255,48 @@ async function V() {
208
255
  ],
209
256
  initialValue: "skip"
210
257
  });
211
- if (e.isCancel(l)) return e.cancel("Cancelled.");
258
+ if (e.isCancel(u)) return e.cancel("Cancelled.");
212
259
  const a = [];
213
- if (I(t))
260
+ if (C(t))
214
261
  a.push("• okno already a dependency — skipped install");
215
262
  else {
216
- const s = N(t);
217
- e.log.step(`Installing okno with ${s}…`);
218
- const u = H(t, s);
263
+ const o = x(t);
264
+ e.log.step(`Installing okno with ${o}…`);
265
+ const r = A(t, o);
219
266
  a.push(
220
- u ? `✓ Installed okno (${u})` : `! Couldn't install okno automatically — run \`${s === "npm" ? "npm install" : `${s} add`} okno\` yourself`
267
+ r ? `✓ Installed okno (${r})` : `! Couldn't install okno automatically — run \`${o === "npm" ? "npm install" : `${o} add`} okno\` yourself`
221
268
  );
222
269
  }
223
- let d = !1;
224
- if (n.configPath && (d = A(n.configPath)), d)
270
+ let h = !1;
271
+ if (n.configPath && (h = y(n.configPath)), h)
225
272
  a.push(`✓ Added okno() to ${n.configPath.replace(t + "/", "")}`);
226
273
  else {
227
- const s = n.pluginsAt === "vite" ? `import { okno } from "okno/vite"
274
+ const o = n.pluginsAt === "vite" ? `import { okno } from "okno/vite"
228
275
  // inside defineConfig:
229
276
  // vite: { plugins: [okno()] }` : `import { okno } from "okno/vite"
230
277
  // inside defineConfig:
231
278
  // plugins: [okno()]`;
232
279
  a.push(`! Couldn't edit your config automatically — add okno() yourself:
233
- ${s}`);
280
+ ${o}`);
234
281
  }
235
- if (C(t, o) ? a.push(
236
- o === "starter" ? "✓ Scaffolded the okno Starter (Home + Meta/Navbar/Footer globals)" : "✓ Scaffolded an empty okno/ (schema only — nothing else)"
237
- ) : a.push("• okno/ already exists — left it alone"), l !== "skip") {
238
- const s = O(t, l);
239
- a.push(`✓ Registered the okno MCP server in ${s}`);
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}`);
240
287
  }
241
- if (l === "claude") {
242
- const s = M(t);
243
- s && a.push(`✓ Installed the connect-okno skill in ${s}`);
288
+ if (u === "claude") {
289
+ const o = b(t);
290
+ o && a.push(`✓ Installed the connect-okno skill in ${o}`);
244
291
  }
245
292
  e.note(a.join(`
246
293
  `), "Done"), e.outro("Run your dev server and press “e” (or visit ?okno) to open the editor.");
247
294
  }
248
295
  export {
249
- A as addPlugin,
250
- x as detect,
251
- V as runInit,
252
- C as scaffold,
253
- O as writeMcpConfig,
254
- M 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
255
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.7",
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": [