includio-cms 0.15.5 → 0.16.0

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 (47) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/DOCS.md +1 -1
  3. package/ROADMAP.md +22 -8
  4. package/dist/paraglide/messages/_index.d.ts +36 -3
  5. package/dist/paraglide/messages/_index.js +71 -3
  6. package/dist/paraglide/messages/en.d.ts +5 -0
  7. package/dist/paraglide/messages/en.js +14 -0
  8. package/dist/paraglide/messages/pl.d.ts +5 -0
  9. package/dist/paraglide/messages/pl.js +14 -0
  10. package/dist/updates/0.16.0/index.d.ts +2 -0
  11. package/dist/updates/0.16.0/index.js +14 -0
  12. package/dist/updates/index.js +2 -1
  13. package/package.json +1 -1
  14. package/dist/demo/seed.d.ts +0 -1
  15. package/dist/demo/seed.js +0 -117
  16. package/dist/inline-edit-proto/ModeToggle.svelte +0 -36
  17. package/dist/inline-edit-proto/ModeToggle.svelte.d.ts +0 -18
  18. package/dist/inline-edit-proto/blocks/AddBlockButton.svelte +0 -47
  19. package/dist/inline-edit-proto/blocks/AddBlockButton.svelte.d.ts +0 -8
  20. package/dist/inline-edit-proto/blocks/BlockToolbar.svelte +0 -80
  21. package/dist/inline-edit-proto/blocks/BlockToolbar.svelte.d.ts +0 -13
  22. package/dist/inline-edit-proto/blocks/BlockWrapper.svelte +0 -83
  23. package/dist/inline-edit-proto/blocks/BlockWrapper.svelte.d.ts +0 -11
  24. package/dist/inline-edit-proto/context.svelte.d.ts +0 -65
  25. package/dist/inline-edit-proto/context.svelte.js +0 -194
  26. package/dist/inline-edit-proto/hybrid/EditableHybrid.svelte +0 -70
  27. package/dist/inline-edit-proto/hybrid/EditableHybrid.svelte.d.ts +0 -11
  28. package/dist/inline-edit-proto/hybrid/FieldRenderer.svelte +0 -94
  29. package/dist/inline-edit-proto/hybrid/FieldRenderer.svelte.d.ts +0 -11
  30. package/dist/inline-edit-proto/hybrid/HybridEditor.svelte +0 -107
  31. package/dist/inline-edit-proto/hybrid/HybridEditor.svelte.d.ts +0 -7
  32. package/dist/inline-edit-proto/hybrid/SyncPanel.svelte +0 -181
  33. package/dist/inline-edit-proto/hybrid/SyncPanel.svelte.d.ts +0 -3
  34. package/dist/inline-edit-proto/inline/EditableInline.svelte +0 -120
  35. package/dist/inline-edit-proto/inline/EditableInline.svelte.d.ts +0 -11
  36. package/dist/inline-edit-proto/inline/InlineToolbar.svelte +0 -71
  37. package/dist/inline-edit-proto/inline/InlineToolbar.svelte.d.ts +0 -6
  38. package/dist/inline-edit-proto/panel/EditSheet.svelte +0 -130
  39. package/dist/inline-edit-proto/panel/EditSheet.svelte.d.ts +0 -3
  40. package/dist/inline-edit-proto/panel/EditablePanel.svelte +0 -44
  41. package/dist/inline-edit-proto/panel/EditablePanel.svelte.d.ts +0 -9
  42. package/dist/paraglide/messages/hello_world.d.ts +0 -5
  43. package/dist/paraglide/messages/hello_world.js +0 -33
  44. package/dist/paraglide/messages/login_hello.d.ts +0 -16
  45. package/dist/paraglide/messages/login_hello.js +0 -34
  46. package/dist/paraglide/messages/login_please_login.d.ts +0 -16
  47. package/dist/paraglide/messages/login_please_login.js +0 -34
package/CHANGELOG.md CHANGED
@@ -3,6 +3,20 @@
3
3
  All notable changes to includio-cms are documented here.
4
4
  Generated from `src/lib/updates/` — do not edit manually.
5
5
 
6
+ ## 0.16.0 — 2026-04-29
7
+
8
+ Hard reset martwego kodu — start drogi do v1.0.0. Wycięte: prototyp inline-edit, demo seed, demo routes. Zostają: cmp/ (backend działa), mockups/ (designy), isomorphic-dompurify (Faza 5), tippy.js (slash-command).
9
+
10
+ ### Breaking
11
+ - `src/lib/inline-edit-proto/` — usunięty. Prototyp hybrid editor (`HybridEditor`, `EditableInline`, `EditablePanel`, `BlockWrapper`, `ModeToggle` itd.) skasowany w całości. Inline edit zostanie zaprojektowany od zera w v1.x z innym podejściem. Pełen kod zarchiwizowany lokalnie na branchu `archive/inline-edit-proto` (niepublikowany na origin). Projekty importujące cokolwiek z `$lib/inline-edit-proto/*` lub `includio-cms/inline-edit-proto` muszą wyciąć te wywołania — moduł nigdy nie był publikowany w `package.json` exports, więc realnie żadna external integracja się nie zerwie.
12
+ - `src/lib/demo/seed.ts` — usunięte. Funkcja `seedDemoData()` (wpisywanie demo użytkownika `demo@includio.dev`) skasowana. Demo content zostanie zaprojektowany od zera w v1.x.
13
+ - `src/routes/(site)/demo/` i `src/routes/admin/(afterLogin)/demo/` — usunięte. Demo pages (`/demo`, `/demo/inline-edit-test`, `/admin/demo/hybrid-editor`) skasowane razem z modułami. Live preview demo trzeba odbudować od zera.
14
+ - `ROADMAP-EDITOR.md` — usunięty. Plan unified editora (Faza 0.2.0–0.5.0) zarchiwizowany razem z prototypem na branchu `archive/inline-edit-proto`.
15
+
16
+ ### Notes
17
+
18
+ Brak SQL migration. Brak zmian publicznego API w `package.json` exports — `inline-edit-proto`, `demo`, ani `cmp` nigdy nie były tam wymienione, więc `pnpm i` w projekcie konsumującym przejdzie clean. `cmp/` ZOSTAJE: backend CMP (operations, `consent_logs` schema, public `createConsentLog`) i typy publiczne (`ResolvedCmpConfig`, `CmpStrings` w `CMSConfig.cmp`) działają bez zmian. Frontend banner dla CMP wróci jako feature w v1.x. Backlog `ideas/*.md` przeniesiony do `ideas/post-v1/` (lokalnie, katalog w `.gitignore`); `select-field-defaultvalue-bug.md` promowany do ROADMAP jako fix do v1.0. Bundle delta: `dist/` 8.8M → 8.5M (−0.3 MB) — mniej niż meta-plan szacował (−1.5 MB+), bo `inline-edit-proto/` był w `.gitignore` i nigdy nie trafiał do `dist/`. Realny zysk to czystsza struktura repo + zero martwego kodu w gałęzi roboczej.
19
+
6
20
  ## 0.15.5 — 2026-04-23
7
21
 
8
22
  Media field recovers from orphan references; delete dialog shows usage breakdown + replace hint. X-Frame-Options relaxed to SAMEORIGIN. Background maintenance no longer duplicates on Vite HMR. Runtime generator no longer triggers an infinite SSR reload loop in dev.
package/DOCS.md CHANGED
@@ -1,4 +1,4 @@
1
- # Includio CMS Documentation (v0.15.5)
1
+ # Includio CMS Documentation (v0.16.0)
2
2
 
3
3
  > This file is auto-generated from the docs site. For the latest version, update the package.
4
4
 
package/ROADMAP.md CHANGED
@@ -324,17 +324,31 @@
324
324
  - [x] `[fix]` `[P0]` `createFormSubmission` — split try/catch so SMTP failure no longer returns `false` (endpoint responded 500 even though submission was persisted); notification email is best-effort, logged via `console.error` <!-- files: src/lib/core/server/forms/submissions/operations/create.ts -->
325
325
  - [ ] `[feature]` `[P1]` Built-in `/api/health` + `/api/health/ready` with per-adapter checks (db/files/email/ai) + ręczny SMTP diagnostics panel in maintenance page <!-- files: ideas/health-check-module.md -->
326
326
 
327
- ## 0.16.0 — SEO module
327
+ ## 0.16.0 — Hard reset
328
328
 
329
- - [ ] `[feature]` `[P1]` SERP preview + character limits for title/description <!-- files: src/lib/admin/components/fields/seo-field.svelte -->
330
- - [ ] `[feature]` `[P1]` Global SEO settings
331
- - [ ] `[feature]` `[P1]` Dedicated frontend SEO components <!-- files: src/lib/sveltekit/components/seo.svelte -->
332
- - [ ] `[feature]` `[P2]` Sitemap generation
329
+ > Start drogi do v1.0.0. Decyzje: **[V1-DECISIONS.md](./V1-DECISIONS.md)** | Workflow: **[V1-WORKFLOW.md](./V1-WORKFLOW.md)**
333
330
 
334
- ## 0.17.0 WCAG/ATAG compliance
331
+ - [x] `[breaking]` `[P0]` Wycięty `src/lib/inline-edit-proto/` (kod na lokalnym branchu `archive/inline-edit-proto`) — inline edit od zera w v1.x
332
+ - [x] `[breaking]` `[P0]` Wycięty `src/lib/demo/seed.ts` + demo routes (`/demo/*`, `/admin/demo/*`) — demo content od zera w v1.x
333
+ - [x] `[breaking]` `[P0]` Skasowany `ROADMAP-EDITOR.md` (treść na archive branch)
334
+ - [x] `[chore]` `[P2]` `ideas/*.md` przeniesione do `ideas/post-v1/` (lokalnie, w `.gitignore`); `select-field-defaultvalue-bug` promowany do v1.0 fix
335
+ - [x] `[chore]` `[P2]` `V1-DECISIONS.md` jako referencja decyzji v1 dla każdej kolejnej sesji
335
336
 
336
- - [ ] `[chore]` `[P0]` Full WCAG/ATAG audit
337
- - [ ] `[feature]` `[P0]` Accessibility rework based on audit findings
337
+ ## v1.0.0 Stabilizacja (in progress)
338
+
339
+ > 13 faz w ~16 sesjach, droga 0.16 → 1.0.0. Lean scope: stabilizacja, security, testy, docs, audit + polish shopa. Bez nowych feature'ów.
340
+
341
+ - [ ] `[fix]` `[P1]` Select field — `defaultValue` propagacja do zod schema (full repro: `ideas/post-v1/select-field-defaultvalue-bug.md`); fix planowany w Fazie 12 (RC)
342
+
343
+ ## v1.x — Post-v1.0 deferred
344
+
345
+ - [ ] `[feature]` `[P1]` SEO module — SERP preview, char limits, global settings, frontend components, sitemap (full plan: `ideas/post-v1/seo-aeo-geo-module.md`)
346
+ - [ ] `[feature]` `[P0]` WCAG/ATAG compliance — full audit + accessibility rework
347
+ - [ ] `[feature]` `[P1]` CMP frontend banner — backend już działa (operations, `consent_logs`, `createConsentLog`); brakuje banner UI (`ideas/post-v1/cmp-module.md`)
348
+ - [ ] `[feature]` `[P1]` Health check module — `/api/health` + `/api/health/ready` (`ideas/post-v1/health-check-module.md`)
349
+ - [ ] `[feature]` `[P2]` Cache layer dla `getEntries` / `getEntry` / `countEntries` (`ideas/post-v1/cache-layer.md`)
350
+ - [ ] `[feature]` `[P2]` Configurable sidebar (`ideas/post-v1/configurable-sidebar.md`)
351
+ - [ ] `[feature]` `[P0]` Plugin hooks in CRUD ops + plugin registration API
338
352
 
339
353
  ## Security hardening
340
354
 
@@ -1,3 +1,36 @@
1
- export * from "./hello_world.js";
2
- export * from "./login_hello.js";
3
- export * from "./login_please_login.js";
1
+ export function hello_world(inputs: {
2
+ name: NonNullable<unknown>;
3
+ }, options?: {
4
+ locale?: "en" | "pl";
5
+ }): string;
6
+ /**
7
+ * This function has been compiled by [Paraglide JS](https://inlang.com/m/gerre34r).
8
+ *
9
+ * - Changing this function will be over-written by the next build.
10
+ *
11
+ * - If you want to change the translations, you can either edit the source files e.g. `en.json`, or
12
+ * use another inlang app like [Fink](https://inlang.com/m/tdozzpar) or the [VSCode extension Sherlock](https://inlang.com/m/r7kp499g).
13
+ *
14
+ * @param {{}} inputs
15
+ * @param {{ locale?: "en" | "pl" }} options
16
+ * @returns {string}
17
+ */
18
+ declare function login_hello(inputs?: {}, options?: {
19
+ locale?: "en" | "pl";
20
+ }): string;
21
+ /**
22
+ * This function has been compiled by [Paraglide JS](https://inlang.com/m/gerre34r).
23
+ *
24
+ * - Changing this function will be over-written by the next build.
25
+ *
26
+ * - If you want to change the translations, you can either edit the source files e.g. `en.json`, or
27
+ * use another inlang app like [Fink](https://inlang.com/m/tdozzpar) or the [VSCode extension Sherlock](https://inlang.com/m/r7kp499g).
28
+ *
29
+ * @param {{}} inputs
30
+ * @param {{ locale?: "en" | "pl" }} options
31
+ * @returns {string}
32
+ */
33
+ declare function login_please_login(inputs?: {}, options?: {
34
+ locale?: "en" | "pl";
35
+ }): string;
36
+ export { login_hello as login.hello, login_please_login as login.please_login };
@@ -1,4 +1,72 @@
1
1
  /* eslint-disable */
2
- export * from './hello_world.js'
3
- export * from './login_hello.js'
4
- export * from './login_please_login.js'
2
+ import { getLocale, trackMessageCall, experimentalMiddlewareLocaleSplitting, isServer } from "../runtime.js"
3
+ import * as en from "./en.js"
4
+ import * as pl from "./pl.js"
5
+ /**
6
+ * This function has been compiled by [Paraglide JS](https://inlang.com/m/gerre34r).
7
+ *
8
+ * - Changing this function will be over-written by the next build.
9
+ *
10
+ * - If you want to change the translations, you can either edit the source files e.g. `en.json`, or
11
+ * use another inlang app like [Fink](https://inlang.com/m/tdozzpar) or the [VSCode extension Sherlock](https://inlang.com/m/r7kp499g).
12
+ *
13
+ * @param {{ name: NonNullable<unknown> }} inputs
14
+ * @param {{ locale?: "en" | "pl" }} options
15
+ * @returns {string}
16
+ */
17
+ /* @__NO_SIDE_EFFECTS__ */
18
+ export const hello_world = (inputs, options = {}) => {
19
+ if (experimentalMiddlewareLocaleSplitting && isServer === false) {
20
+ return /** @type {any} */ (globalThis).__paraglide_ssr.hello_world(inputs)
21
+ }
22
+ const locale = options.locale ?? getLocale()
23
+ trackMessageCall("hello_world", locale)
24
+ if (locale === "en") return en.hello_world(inputs)
25
+ return pl.hello_world(inputs)
26
+ };
27
+ /**
28
+ * This function has been compiled by [Paraglide JS](https://inlang.com/m/gerre34r).
29
+ *
30
+ * - Changing this function will be over-written by the next build.
31
+ *
32
+ * - If you want to change the translations, you can either edit the source files e.g. `en.json`, or
33
+ * use another inlang app like [Fink](https://inlang.com/m/tdozzpar) or the [VSCode extension Sherlock](https://inlang.com/m/r7kp499g).
34
+ *
35
+ * @param {{}} inputs
36
+ * @param {{ locale?: "en" | "pl" }} options
37
+ * @returns {string}
38
+ */
39
+ /* @__NO_SIDE_EFFECTS__ */
40
+ const login_hello = (inputs = {}, options = {}) => {
41
+ if (experimentalMiddlewareLocaleSplitting && isServer === false) {
42
+ return /** @type {any} */ (globalThis).__paraglide_ssr.login_hello(inputs)
43
+ }
44
+ const locale = options.locale ?? getLocale()
45
+ trackMessageCall("login_hello", locale)
46
+ if (locale === "en") return en.login_hello(inputs)
47
+ return pl.login_hello(inputs)
48
+ };
49
+ export { login_hello as "login.hello" }
50
+ /**
51
+ * This function has been compiled by [Paraglide JS](https://inlang.com/m/gerre34r).
52
+ *
53
+ * - Changing this function will be over-written by the next build.
54
+ *
55
+ * - If you want to change the translations, you can either edit the source files e.g. `en.json`, or
56
+ * use another inlang app like [Fink](https://inlang.com/m/tdozzpar) or the [VSCode extension Sherlock](https://inlang.com/m/r7kp499g).
57
+ *
58
+ * @param {{}} inputs
59
+ * @param {{ locale?: "en" | "pl" }} options
60
+ * @returns {string}
61
+ */
62
+ /* @__NO_SIDE_EFFECTS__ */
63
+ const login_please_login = (inputs = {}, options = {}) => {
64
+ if (experimentalMiddlewareLocaleSplitting && isServer === false) {
65
+ return /** @type {any} */ (globalThis).__paraglide_ssr.login_please_login(inputs)
66
+ }
67
+ const locale = options.locale ?? getLocale()
68
+ trackMessageCall("login_please_login", locale)
69
+ if (locale === "en") return en.login_please_login(inputs)
70
+ return pl.login_please_login(inputs)
71
+ };
72
+ export { login_please_login as "login.please_login" }
@@ -0,0 +1,5 @@
1
+ export const hello_world: (inputs: {
2
+ name: NonNullable<unknown>;
3
+ }) => string;
4
+ export const login_hello: (inputs: {}) => string;
5
+ export const login_please_login: (inputs: {}) => string;
@@ -0,0 +1,14 @@
1
+ /* eslint-disable */
2
+
3
+
4
+ export const hello_world = /** @type {(inputs: { name: NonNullable<unknown> }) => string} */ (i) => {
5
+ return `Hello, ${i.name} from en!`
6
+ };
7
+
8
+ export const login_hello = /** @type {(inputs: {}) => string} */ () => {
9
+ return `Welcome back`
10
+ };
11
+
12
+ export const login_please_login = /** @type {(inputs: {}) => string} */ () => {
13
+ return `Login to your account`
14
+ };
@@ -0,0 +1,5 @@
1
+ export const hello_world: (inputs: {
2
+ name: NonNullable<unknown>;
3
+ }) => string;
4
+ export const login_hello: (inputs: {}) => string;
5
+ export const login_please_login: (inputs: {}) => string;
@@ -0,0 +1,14 @@
1
+ /* eslint-disable */
2
+
3
+
4
+ export const hello_world = /** @type {(inputs: { name: NonNullable<unknown> }) => string} */ (i) => {
5
+ return `Hello, ${i.name} from pl!`
6
+ };
7
+
8
+ export const login_hello = /** @type {(inputs: {}) => string} */ () => {
9
+ return `Witaj ponownie`
10
+ };
11
+
12
+ export const login_please_login = /** @type {(inputs: {}) => string} */ () => {
13
+ return `Zaloguj się na swoje konto`
14
+ };
@@ -0,0 +1,2 @@
1
+ import type { CmsUpdate } from '../index.js';
2
+ export declare const update: CmsUpdate;
@@ -0,0 +1,14 @@
1
+ export const update = {
2
+ version: '0.16.0',
3
+ date: '2026-04-29',
4
+ description: 'Hard reset martwego kodu — start drogi do v1.0.0. Wycięte: prototyp inline-edit, demo seed, demo routes. Zostają: cmp/ (backend działa), mockups/ (designy), isomorphic-dompurify (Faza 5), tippy.js (slash-command).',
5
+ features: [],
6
+ fixes: [],
7
+ breakingChanges: [
8
+ '`src/lib/inline-edit-proto/` — usunięty. Prototyp hybrid editor (`HybridEditor`, `EditableInline`, `EditablePanel`, `BlockWrapper`, `ModeToggle` itd.) skasowany w całości. Inline edit zostanie zaprojektowany od zera w v1.x z innym podejściem. Pełen kod zarchiwizowany lokalnie na branchu `archive/inline-edit-proto` (niepublikowany na origin). Projekty importujące cokolwiek z `$lib/inline-edit-proto/*` lub `includio-cms/inline-edit-proto` muszą wyciąć te wywołania — moduł nigdy nie był publikowany w `package.json` exports, więc realnie żadna external integracja się nie zerwie.',
9
+ '`src/lib/demo/seed.ts` — usunięte. Funkcja `seedDemoData()` (wpisywanie demo użytkownika `demo@includio.dev`) skasowana. Demo content zostanie zaprojektowany od zera w v1.x.',
10
+ '`src/routes/(site)/demo/` i `src/routes/admin/(afterLogin)/demo/` — usunięte. Demo pages (`/demo`, `/demo/inline-edit-test`, `/admin/demo/hybrid-editor`) skasowane razem z modułami. Live preview demo trzeba odbudować od zera.',
11
+ '`ROADMAP-EDITOR.md` — usunięty. Plan unified editora (Faza 0.2.0–0.5.0) zarchiwizowany razem z prototypem na branchu `archive/inline-edit-proto`.'
12
+ ],
13
+ notes: 'Brak SQL migration. Brak zmian publicznego API w `package.json` exports — `inline-edit-proto`, `demo`, ani `cmp` nigdy nie były tam wymienione, więc `pnpm i` w projekcie konsumującym przejdzie clean. `cmp/` ZOSTAJE: backend CMP (operations, `consent_logs` schema, public `createConsentLog`) i typy publiczne (`ResolvedCmpConfig`, `CmpStrings` w `CMSConfig.cmp`) działają bez zmian. Frontend banner dla CMP wróci jako feature w v1.x. Backlog `ideas/*.md` przeniesiony do `ideas/post-v1/` (lokalnie, katalog w `.gitignore`); `select-field-defaultvalue-bug.md` promowany do ROADMAP jako fix do v1.0. Bundle delta: `dist/` 8.8M → 8.5M (−0.3 MB) — mniej niż meta-plan szacował (−1.5 MB+), bo `inline-edit-proto/` był w `.gitignore` i nigdy nie trafiał do `dist/`. Realny zysk to czystsza struktura repo + zero martwego kodu w gałęzi roboczej.'
14
+ };
@@ -50,7 +50,8 @@ import { update as update0152 } from './0.15.2/index.js';
50
50
  import { update as update0153 } from './0.15.3/index.js';
51
51
  import { update as update0154 } from './0.15.4/index.js';
52
52
  import { update as update0155 } from './0.15.5/index.js';
53
- export const updates = [update0065, update0066, update0067, update0068, update0069, update010, update011, update012, update013, update014, update015, update020, update022, update050, update051, update052, update053, update054, update055, update056, update057, update058, update060, update061, update062, update070, update071, update072, update073, update080, update090, update0100, update0110, update0120, update0130, update0131, update0132, update0133, update0134, update0140, update0141, update0142, update0143, update0144, update0145, update0146, update0150, update0151, update0152, update0153, update0154, update0155];
53
+ import { update as update0160 } from './0.16.0/index.js';
54
+ export const updates = [update0065, update0066, update0067, update0068, update0069, update010, update011, update012, update013, update014, update015, update020, update022, update050, update051, update052, update053, update054, update055, update056, update057, update058, update060, update061, update062, update070, update071, update072, update073, update080, update090, update0100, update0110, update0120, update0130, update0131, update0132, update0133, update0134, update0140, update0141, update0142, update0143, update0144, update0145, update0146, update0150, update0151, update0152, update0153, update0154, update0155, update0160];
54
55
  export const getUpdatesFrom = (fromVersion) => {
55
56
  const fromParts = fromVersion.split('.').map(Number);
56
57
  return updates.filter((update) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "includio-cms",
3
- "version": "0.15.5",
3
+ "version": "0.16.0",
4
4
  "scripts": {
5
5
  "dev": "vite dev",
6
6
  "build": "vite build && npm run prepack",
@@ -1 +0,0 @@
1
- export declare function seedDemoData(): Promise<void>;
package/dist/demo/seed.js DELETED
@@ -1,117 +0,0 @@
1
- import { getCMS } from '../core/cms.js';
2
- const blogPosts = [
3
- {
4
- title: 'Getting Started with Includio CMS',
5
- slug: 'getting-started',
6
- category: 'tutorial',
7
- content: '<p>Includio CMS is a modern, headless content management system built with SvelteKit. It provides a flexible and developer-friendly way to manage content for your web applications.</p><p>In this tutorial, we will walk through the basic setup and configuration of Includio CMS.</p>',
8
- publishedAt: '2024-12-01'
9
- },
10
- {
11
- title: 'Building Modern Web Applications',
12
- slug: 'modern-web-apps',
13
- category: 'technology',
14
- content: '<p>The landscape of web development is constantly evolving. With frameworks like SvelteKit, developers can build fast, modern applications with great developer experience.</p><p>This post explores the key principles behind modern web application architecture.</p>',
15
- publishedAt: '2024-12-15'
16
- },
17
- {
18
- title: 'Design Systems for Content Management',
19
- slug: 'design-systems-cms',
20
- category: 'design',
21
- content: '<p>A well-designed content management interface can make all the difference in editorial productivity. Learn how design systems help create consistent, usable admin panels.</p>',
22
- publishedAt: '2025-01-05'
23
- },
24
- {
25
- title: 'Scaling Your Content Strategy',
26
- slug: 'scaling-content-strategy',
27
- category: 'business',
28
- content: '<p>As your business grows, so does your content needs. This post discusses strategies for scaling content operations while maintaining quality and consistency.</p>',
29
- publishedAt: '2025-01-20'
30
- }
31
- ];
32
- const projects = [
33
- {
34
- title: 'E-commerce Platform',
35
- description: 'A full-featured online store built with SvelteKit and Includio CMS.',
36
- url: 'https://example.com/ecommerce',
37
- techStack: [{ name: 'SvelteKit' }, { name: 'PostgreSQL' }, { name: 'Stripe' }]
38
- },
39
- {
40
- title: 'Corporate Website',
41
- description: 'Multi-language corporate site with dynamic content management.',
42
- url: 'https://example.com/corporate',
43
- techStack: [{ name: 'SvelteKit' }, { name: 'Includio CMS' }, { name: 'Tailwind CSS' }]
44
- },
45
- {
46
- title: 'Blog Platform',
47
- description: 'A performant blogging platform with SEO optimization.',
48
- url: 'https://example.com/blog',
49
- techStack: [{ name: 'SvelteKit' }, { name: 'MDsveX' }, { name: 'Vercel' }]
50
- }
51
- ];
52
- const settingsData = {
53
- siteName: 'Includio Demo',
54
- description: 'A demo instance of Includio CMS showcasing its features.',
55
- socialLinks: [
56
- { platform: 'GitHub', url: 'https://github.com/includio' },
57
- { platform: 'Twitter', url: 'https://twitter.com/includio' }
58
- ]
59
- };
60
- export async function seedDemoData() {
61
- const cms = getCMS();
62
- const db = cms.databaseAdapter;
63
- // Seed blog posts
64
- for (const post of blogPosts) {
65
- const entry = await db.createEntry({
66
- slug: 'blog-post',
67
- type: 'collection'
68
- });
69
- await db.createEntryVersion({
70
- entryId: entry.id,
71
- versionNumber: 1,
72
- data: {
73
- en: {
74
- title: post.title,
75
- slug: post.slug,
76
- category: post.category,
77
- content: post.content,
78
- publishedAt: post.publishedAt
79
- }
80
- },
81
- publishedAt: new Date(post.publishedAt)
82
- });
83
- }
84
- // Seed projects
85
- for (const project of projects) {
86
- const entry = await db.createEntry({
87
- slug: 'project',
88
- type: 'collection'
89
- });
90
- await db.createEntryVersion({
91
- entryId: entry.id,
92
- versionNumber: 1,
93
- data: {
94
- en: {
95
- title: project.title,
96
- description: project.description,
97
- url: project.url,
98
- techStack: project.techStack
99
- }
100
- },
101
- publishedAt: new Date()
102
- });
103
- }
104
- // Seed settings single
105
- const settingsEntry = await db.createEntry({
106
- slug: 'settings',
107
- type: 'singleton'
108
- });
109
- await db.createEntryVersion({
110
- entryId: settingsEntry.id,
111
- versionNumber: 1,
112
- data: {
113
- en: settingsData
114
- },
115
- publishedAt: new Date()
116
- });
117
- }
@@ -1,36 +0,0 @@
1
- <script lang="ts">
2
- import { getEditContext, type EditMode } from './context.svelte.js';
3
-
4
- const ctx = getEditContext();
5
-
6
- const modes: { value: EditMode; label: string; desc: string }[] = [
7
- { value: 'panel', label: 'A', desc: 'Panel' },
8
- { value: 'inline', label: 'B', desc: 'Inline' },
9
- { value: 'blocks', label: 'C', desc: 'Blocks' },
10
- { value: 'hybrid', label: 'D', desc: 'Hybrid' }
11
- ];
12
- </script>
13
-
14
- <div class="fixed bottom-6 left-1/2 z-50 -translate-x-1/2">
15
- <div class="flex items-center gap-1 rounded-full bg-slate-900 p-1.5 shadow-xl">
16
- {#each modes as m}
17
- <button
18
- onclick={() => (ctx.mode = m.value)}
19
- class="flex items-center gap-2 rounded-full px-4 py-2 text-sm font-medium transition-all {ctx.mode ===
20
- m.value
21
- ? 'bg-white text-slate-900'
22
- : 'text-slate-400 hover:text-white'}"
23
- >
24
- <span
25
- class="flex h-5 w-5 items-center justify-center rounded-full text-xs font-bold {ctx.mode ===
26
- m.value
27
- ? 'bg-slate-900 text-white'
28
- : 'bg-slate-700 text-slate-400'}"
29
- >
30
- {m.label}
31
- </span>
32
- <span class="hidden sm:inline">{m.desc}</span>
33
- </button>
34
- {/each}
35
- </div>
36
- </div>
@@ -1,18 +0,0 @@
1
- interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
- new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
- $$bindings?: Bindings;
4
- } & Exports;
5
- (internal: unknown, props: {
6
- $$events?: Events;
7
- $$slots?: Slots;
8
- }): Exports & {
9
- $set?: any;
10
- $on?: any;
11
- };
12
- z_$$bindings?: Bindings;
13
- }
14
- declare const ModeToggle: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
15
- [evt: string]: CustomEvent<any>;
16
- }, {}, {}, string>;
17
- type ModeToggle = InstanceType<typeof ModeToggle>;
18
- export default ModeToggle;
@@ -1,47 +0,0 @@
1
- <script lang="ts">
2
- import Plus from '@tabler/icons-svelte/icons/plus';
3
- import { getEditContext } from '../context.svelte.js';
4
-
5
- type Props = {
6
- arrayPath: string;
7
- index: number;
8
- itemTemplate: () => Record<string, unknown>;
9
- };
10
-
11
- let { arrayPath, index, itemTemplate }: Props = $props();
12
-
13
- const ctx = getEditContext();
14
-
15
- let isHovered = $state(false);
16
-
17
- function addBlock() {
18
- const arr = ctx.getData(arrayPath) as unknown[];
19
- if (Array.isArray(arr)) {
20
- const newItem = { ...itemTemplate(), _id: crypto.randomUUID() };
21
- arr.splice(index, 0, newItem);
22
- }
23
- }
24
- </script>
25
-
26
- {#if ctx.mode === 'blocks'}
27
- <!-- svelte-ignore a11y_no_static_element_interactions -->
28
- <div
29
- class="add-block-zone relative my-2 flex h-8 items-center justify-center"
30
- onmouseenter={() => (isHovered = true)}
31
- onmouseleave={() => (isHovered = false)}
32
- >
33
- {#if isHovered}
34
- <div class="absolute inset-x-0 top-1/2 h-px bg-[#1e3a5f]/30"></div>
35
- <button
36
- type="button"
37
- onclick={addBlock}
38
- class="relative z-10 flex h-8 w-8 items-center justify-center rounded-full bg-[#1e3a5f] text-white shadow-lg transition-transform hover:scale-110"
39
- title="Add block"
40
- >
41
- <Plus class="h-4 w-4" />
42
- </button>
43
- {:else}
44
- <div class="h-1 w-full cursor-pointer rounded bg-transparent transition-colors hover:bg-[#1e3a5f]/10"></div>
45
- {/if}
46
- </div>
47
- {/if}
@@ -1,8 +0,0 @@
1
- type Props = {
2
- arrayPath: string;
3
- index: number;
4
- itemTemplate: () => Record<string, unknown>;
5
- };
6
- declare const AddBlockButton: import("svelte").Component<Props, {}, "">;
7
- type AddBlockButton = ReturnType<typeof AddBlockButton>;
8
- export default AddBlockButton;
@@ -1,80 +0,0 @@
1
- <script lang="ts">
2
- import ArrowUp from '@tabler/icons-svelte/icons/arrow-up';
3
- import ArrowDown from '@tabler/icons-svelte/icons/arrow-down';
4
- import Trash from '@tabler/icons-svelte/icons/trash';
5
- import Settings from '@tabler/icons-svelte/icons/settings';
6
- import GripVertical from '@tabler/icons-svelte/icons/grip-vertical';
7
-
8
- type Props = {
9
- label: string;
10
- canMoveUp: boolean;
11
- canMoveDown: boolean;
12
- canDelete: boolean;
13
- onMoveUp: () => void;
14
- onMoveDown: () => void;
15
- onDelete: () => void;
16
- onSettings: () => void;
17
- };
18
-
19
- let { label, canMoveUp, canMoveDown, canDelete, onMoveUp, onMoveDown, onDelete, onSettings }: Props = $props();
20
- </script>
21
-
22
- <div class="absolute -left-12 top-1/2 z-20 flex -translate-y-1/2 flex-col items-center gap-1">
23
- <div class="flex flex-col rounded-lg bg-slate-900 p-1 shadow-xl">
24
- <button
25
- type="button"
26
- class="cursor-grab rounded p-1.5 text-slate-400 transition-colors hover:bg-slate-700 hover:text-white"
27
- title="Drag to reorder"
28
- >
29
- <GripVertical class="h-4 w-4" />
30
- </button>
31
-
32
- <div class="my-1 h-px bg-slate-700"></div>
33
-
34
- <button
35
- type="button"
36
- onclick={onMoveUp}
37
- disabled={!canMoveUp}
38
- class="rounded p-1.5 text-slate-400 transition-colors hover:bg-slate-700 hover:text-white disabled:cursor-not-allowed disabled:opacity-30"
39
- title="Move up"
40
- >
41
- <ArrowUp class="h-4 w-4" />
42
- </button>
43
-
44
- <button
45
- type="button"
46
- onclick={onMoveDown}
47
- disabled={!canMoveDown}
48
- class="rounded p-1.5 text-slate-400 transition-colors hover:bg-slate-700 hover:text-white disabled:cursor-not-allowed disabled:opacity-30"
49
- title="Move down"
50
- >
51
- <ArrowDown class="h-4 w-4" />
52
- </button>
53
-
54
- <div class="my-1 h-px bg-slate-700"></div>
55
-
56
- <button
57
- type="button"
58
- onclick={onSettings}
59
- class="rounded p-1.5 text-slate-400 transition-colors hover:bg-slate-700 hover:text-white"
60
- title="Edit settings"
61
- >
62
- <Settings class="h-4 w-4" />
63
- </button>
64
-
65
- {#if canDelete}
66
- <button
67
- type="button"
68
- onclick={onDelete}
69
- class="rounded p-1.5 text-red-400 transition-colors hover:bg-red-900/50 hover:text-red-300"
70
- title="Delete"
71
- >
72
- <Trash class="h-4 w-4" />
73
- </button>
74
- {/if}
75
- </div>
76
- </div>
77
-
78
- <div class="absolute -top-3 left-4 z-20 rounded bg-slate-900 px-2 py-0.5 text-xs font-medium text-slate-300 shadow">
79
- {label}
80
- </div>
@@ -1,13 +0,0 @@
1
- type Props = {
2
- label: string;
3
- canMoveUp: boolean;
4
- canMoveDown: boolean;
5
- canDelete: boolean;
6
- onMoveUp: () => void;
7
- onMoveDown: () => void;
8
- onDelete: () => void;
9
- onSettings: () => void;
10
- };
11
- declare const BlockToolbar: import("svelte").Component<Props, {}, "">;
12
- type BlockToolbar = ReturnType<typeof BlockToolbar>;
13
- export default BlockToolbar;