@batterai/strapi-plugin-canvas 0.1.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 (152) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/LICENSE +16 -0
  3. package/README.md +131 -0
  4. package/dist/admin/appearance.d.ts +12 -0
  5. package/dist/admin/appearance.d.ts.map +1 -0
  6. package/dist/admin/appearance.js +44 -0
  7. package/dist/admin/appearance.js.map +1 -0
  8. package/dist/admin/block-packages.d.ts +4 -0
  9. package/dist/admin/block-packages.d.ts.map +1 -0
  10. package/dist/admin/block-packages.js +14 -0
  11. package/dist/admin/block-packages.js.map +1 -0
  12. package/dist/admin/client/content-model.d.ts +3 -0
  13. package/dist/admin/client/content-model.d.ts.map +1 -0
  14. package/dist/admin/client/content-model.js +76 -0
  15. package/dist/admin/client/content-model.js.map +1 -0
  16. package/dist/admin/client/host-services.d.ts +4 -0
  17. package/dist/admin/client/host-services.d.ts.map +1 -0
  18. package/dist/admin/client/host-services.js +141 -0
  19. package/dist/admin/client/host-services.js.map +1 -0
  20. package/dist/admin/index.d.ts +37 -0
  21. package/dist/admin/index.d.ts.map +1 -0
  22. package/dist/admin/index.js +34 -0
  23. package/dist/admin/index.js.map +1 -0
  24. package/dist/admin/pages/App.d.ts +4 -0
  25. package/dist/admin/pages/App.d.ts.map +1 -0
  26. package/dist/admin/pages/App.js +50 -0
  27. package/dist/admin/pages/App.js.map +1 -0
  28. package/dist/admin/translations.d.ts +4 -0
  29. package/dist/admin/translations.d.ts.map +1 -0
  30. package/dist/admin/translations.js +16 -0
  31. package/dist/admin/translations.js.map +1 -0
  32. package/dist/constants.d.ts +14 -0
  33. package/dist/constants.d.ts.map +1 -0
  34. package/dist/constants.js +18 -0
  35. package/dist/constants.js.map +1 -0
  36. package/dist/index.d.ts +2 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +2 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/server/bootstrap.d.ts +4 -0
  41. package/dist/server/bootstrap.d.ts.map +1 -0
  42. package/dist/server/bootstrap.js +37 -0
  43. package/dist/server/bootstrap.js.map +1 -0
  44. package/dist/server/config/index.d.ts +24 -0
  45. package/dist/server/config/index.d.ts.map +1 -0
  46. package/dist/server/config/index.js +33 -0
  47. package/dist/server/config/index.js.map +1 -0
  48. package/dist/server/content-types/canvas-page/schema.d.ts +45 -0
  49. package/dist/server/content-types/canvas-page/schema.d.ts.map +1 -0
  50. package/dist/server/content-types/canvas-page/schema.js +21 -0
  51. package/dist/server/content-types/canvas-page/schema.js.map +1 -0
  52. package/dist/server/content-types/canvas-site/schema.d.ts +41 -0
  53. package/dist/server/content-types/canvas-site/schema.d.ts.map +1 -0
  54. package/dist/server/content-types/canvas-site/schema.js +20 -0
  55. package/dist/server/content-types/canvas-site/schema.js.map +1 -0
  56. package/dist/server/content-types/index.d.ts +90 -0
  57. package/dist/server/content-types/index.d.ts.map +1 -0
  58. package/dist/server/content-types/index.js +7 -0
  59. package/dist/server/content-types/index.js.map +1 -0
  60. package/dist/server/controllers/canvas.d.ts +48 -0
  61. package/dist/server/controllers/canvas.d.ts.map +1 -0
  62. package/dist/server/controllers/canvas.js +409 -0
  63. package/dist/server/controllers/canvas.js.map +1 -0
  64. package/dist/server/controllers/index.d.ts +448 -0
  65. package/dist/server/controllers/index.d.ts.map +1 -0
  66. package/dist/server/controllers/index.js +5 -0
  67. package/dist/server/controllers/index.js.map +1 -0
  68. package/dist/server/index.d.ts +645 -0
  69. package/dist/server/index.d.ts.map +1 -0
  70. package/dist/server/index.js +21 -0
  71. package/dist/server/index.js.map +1 -0
  72. package/dist/server/license.d.ts +13 -0
  73. package/dist/server/license.d.ts.map +1 -0
  74. package/dist/server/license.js +24 -0
  75. package/dist/server/license.js.map +1 -0
  76. package/dist/server/policies/is-admin-authenticated.d.ts +2 -0
  77. package/dist/server/policies/is-admin-authenticated.d.ts.map +1 -0
  78. package/dist/server/policies/is-admin-authenticated.js +4 -0
  79. package/dist/server/policies/is-admin-authenticated.js.map +1 -0
  80. package/dist/server/register.d.ts +2 -0
  81. package/dist/server/register.d.ts.map +1 -0
  82. package/dist/server/register.js +4 -0
  83. package/dist/server/register.js.map +1 -0
  84. package/dist/server/routes/admin.d.ts +18 -0
  85. package/dist/server/routes/admin.d.ts.map +1 -0
  86. package/dist/server/routes/admin.js +38 -0
  87. package/dist/server/routes/admin.js.map +1 -0
  88. package/dist/server/routes/index.d.ts +31 -0
  89. package/dist/server/routes/index.d.ts.map +1 -0
  90. package/dist/server/routes/index.js +7 -0
  91. package/dist/server/routes/index.js.map +1 -0
  92. package/dist/server/routes/public.d.ts +13 -0
  93. package/dist/server/routes/public.d.ts.map +1 -0
  94. package/dist/server/routes/public.js +7 -0
  95. package/dist/server/routes/public.js.map +1 -0
  96. package/dist/server/services/collaboration-service.d.ts +24 -0
  97. package/dist/server/services/collaboration-service.d.ts.map +1 -0
  98. package/dist/server/services/collaboration-service.js +164 -0
  99. package/dist/server/services/collaboration-service.js.map +1 -0
  100. package/dist/server/services/document-command-service.d.ts +34 -0
  101. package/dist/server/services/document-command-service.d.ts.map +1 -0
  102. package/dist/server/services/document-command-service.js +418 -0
  103. package/dist/server/services/document-command-service.js.map +1 -0
  104. package/dist/server/services/document-service.d.ts +14 -0
  105. package/dist/server/services/document-service.d.ts.map +1 -0
  106. package/dist/server/services/document-service.js +144 -0
  107. package/dist/server/services/document-service.js.map +1 -0
  108. package/dist/server/services/index.d.ts +68 -0
  109. package/dist/server/services/index.d.ts.map +1 -0
  110. package/dist/server/services/index.js +28 -0
  111. package/dist/server/services/index.js.map +1 -0
  112. package/dist/server/services/page-doc-store.d.ts +59 -0
  113. package/dist/server/services/page-doc-store.d.ts.map +1 -0
  114. package/dist/server/services/page-doc-store.js +285 -0
  115. package/dist/server/services/page-doc-store.js.map +1 -0
  116. package/dist/server/services/site-store.d.ts +43 -0
  117. package/dist/server/services/site-store.d.ts.map +1 -0
  118. package/dist/server/services/site-store.js +212 -0
  119. package/dist/server/services/site-store.js.map +1 -0
  120. package/dist/server-cjs/index.js +17381 -0
  121. package/dist/server-cjs/package.json +3 -0
  122. package/package.json +77 -0
  123. package/src/admin/appearance.ts +56 -0
  124. package/src/admin/block-packages.ts +16 -0
  125. package/src/admin/client/content-model.ts +88 -0
  126. package/src/admin/client/host-services.ts +172 -0
  127. package/src/admin/index.tsx +56 -0
  128. package/src/admin/pages/App.tsx +56 -0
  129. package/src/admin/strapi-admin.d.ts +1 -0
  130. package/src/admin/translations.ts +23 -0
  131. package/src/constants.ts +21 -0
  132. package/src/index.ts +11 -0
  133. package/src/server/bootstrap.ts +45 -0
  134. package/src/server/config/index.ts +46 -0
  135. package/src/server/content-types/canvas-page/schema.ts +20 -0
  136. package/src/server/content-types/canvas-site/schema.ts +19 -0
  137. package/src/server/content-types/index.ts +7 -0
  138. package/src/server/controllers/canvas.ts +468 -0
  139. package/src/server/controllers/index.ts +5 -0
  140. package/src/server/index.ts +21 -0
  141. package/src/server/license.ts +42 -0
  142. package/src/server/policies/is-admin-authenticated.ts +3 -0
  143. package/src/server/register.ts +3 -0
  144. package/src/server/routes/admin.ts +40 -0
  145. package/src/server/routes/index.ts +7 -0
  146. package/src/server/routes/public.ts +6 -0
  147. package/src/server/services/collaboration-service.ts +180 -0
  148. package/src/server/services/document-command-service.ts +495 -0
  149. package/src/server/services/document-service.ts +162 -0
  150. package/src/server/services/index.ts +41 -0
  151. package/src/server/services/page-doc-store.ts +348 -0
  152. package/src/server/services/site-store.ts +243 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ # @batterai/strapi-plugin-canvas
2
+
3
+ ## 0.1.0
4
+
5
+ - Initial Strapi 5 plugin package with admin shell mount and server CAS routes.
package/LICENSE ADDED
@@ -0,0 +1,16 @@
1
+ Business Source License 1.1
2
+
3
+ Licensed Work: @batterai/strapi-plugin-canvas, a package of the Battery Editor.
4
+ The Licensed Work is (c) 2026 Batterai.eu.
5
+
6
+ Additional Use Grant: You may use the Licensed Work in non-production
7
+ environments without a commercial license. Production authoring use requires a
8
+ commercial license from Batterai.eu.
9
+
10
+ Change Date: Two years from the date each version of the Licensed Work is first
11
+ publicly distributed under this License.
12
+
13
+ Change License: Apache License, Version 2.0
14
+
15
+ This short-form copy records the package-specific BUSL parameters; the complete
16
+ Business Source License 1.1 terms apply.
package/README.md ADDED
@@ -0,0 +1,131 @@
1
+ # @batterai/strapi-plugin-canvas
2
+
3
+ Installable Strapi 5 plugin for same-origin Canvas authoring.
4
+
5
+ The admin bundle mounts `@batterai/editor-shell` directly inside the Strapi
6
+ admin SPA. Browser calls go through Strapi admin routes and `useFetchClient`;
7
+ the package does not import the public render adapter or iframe a dev server.
8
+
9
+ ## Minimal Config
10
+
11
+ ```ts
12
+ export default () => ({
13
+ canvas: {
14
+ enabled: true,
15
+ config: {
16
+ licenseKey: process.env.BATTERAI_CANVAS_LICENSE_KEY,
17
+ },
18
+ },
19
+ });
20
+ ```
21
+
22
+ Unlicensed production authoring remains usable with a watermark. Localhost
23
+ authoring is exempt.
24
+
25
+ ## Editor appearance and CMS themes
26
+
27
+ Canvas inherits its editor chrome colors from Strapi's active Design System
28
+ theme. This means a project's `config.theme.light` and `config.theme.dark`
29
+ customizations also follow Strapi's user-selected light/dark mode inside Canvas.
30
+
31
+ For Canvas-specific colors, register an appearance from the Strapi admin
32
+ customization entrypoint. Use a resolver when light and dark need different
33
+ values; it receives the currently active Strapi theme and is reevaluated when
34
+ the CMS theme changes.
35
+
36
+ ```tsx
37
+ // src/admin/app.tsx
38
+ import { registerCanvasAppearance } from "@batterai/strapi-plugin-canvas/strapi-admin";
39
+
40
+ export default {
41
+ register() {
42
+ registerCanvasAppearance((theme) => ({
43
+ accent: theme.colors?.primary600 as string,
44
+ accentStrong: theme.colors?.primary700 as string,
45
+ selection: theme.colors?.primary600 as string,
46
+ }));
47
+ },
48
+ };
49
+ ```
50
+
51
+ Supported keys are `accent`, `accentStrong`, `accentSoft`, `background`,
52
+ `border`, `borderSubtle`, `ink`, `muted`, `mutedDisabled`, `panel`,
53
+ `panelStrong`, and `selection`. Values must be six-digit hex colors. Canvas
54
+ applies them as namespaced `--be-editor-*` custom properties; `selection`
55
+ defaults to the blue `accent`. These tokens style authoring chrome only and are
56
+ separate from persisted website content.
57
+
58
+ ## Register Your Web Component Packages
59
+
60
+ Canvas includes its built-in block packages. Register additional approved
61
+ `BlockPackage` modules from the host app's admin customization file, inside
62
+ `register()`:
63
+
64
+ ```tsx
65
+ // src/admin/app.tsx
66
+ import { registerCanvasBlockPackages } from "@batterai/strapi-plugin-canvas/strapi-admin";
67
+ import { acmeBlockPackages } from "./canvas/blocks";
68
+
69
+ export default {
70
+ register() {
71
+ registerCanvasBlockPackages(acmeBlockPackages);
72
+ },
73
+ };
74
+ ```
75
+
76
+ Every package supplies one versioned custom element, its server render path,
77
+ and block-owned stylesheet URLs. Register packages before the Canvas page
78
+ mounts (Strapi's `register()` phase); duplicate block types fail immediately.
79
+ Each source block belongs in its own folder with `block.ts` or `block.tsx` and
80
+ `block.css`.
81
+
82
+ ## Seed Library
83
+
84
+ `seedLibrary` provides the block palette (`categories`/`blocks`/`presets`)
85
+ written into the plugin's `canvas-site` document when that document is FIRST
86
+ created. It is first-creation-only seed data, not a live source: an existing
87
+ site document's library is never overwritten by config changes — after the
88
+ first boot the palette lives in Strapi and evolves through the editor (for
89
+ example saved presets).
90
+
91
+ ```js
92
+ // config/plugins.js
93
+ module.exports = ({ env }) => ({
94
+ canvas: {
95
+ enabled: true,
96
+ config: {
97
+ licenseKey: env("BATTERAI_CANVAS_LICENSE_KEY"),
98
+ seedLibrary: require("./canvas-library.json"),
99
+ },
100
+ },
101
+ });
102
+ ```
103
+
104
+ The value is an object with optional `categories`, `blocks`, and `presets`
105
+ arrays (any missing key seeds as empty). Block entries need at least `type`
106
+ and `label`; every seeded `type` must have an installed `BlockPackage`.
107
+
108
+ ## Public Delivery
109
+
110
+ The plugin exposes a read-only content API route for the visitor website:
111
+
112
+ ```text
113
+ GET /api/canvas/delivery
114
+ ```
115
+
116
+ Use it as the SSR host delivery source:
117
+
118
+ ```bash
119
+ PUBLIC_SITE_DELIVERY_URL=https://cms.example.com/api/canvas/delivery bun run public-site
120
+ ```
121
+
122
+ The delivery route returns published Canvas pages plus published bound
123
+ collections. Draft/editor data remains behind Strapi admin routes.
124
+
125
+ ## Proof
126
+
127
+ ```bash
128
+ bun run test:strapi-plugin-canvas
129
+ bun run strapi-plugin:fresh-install
130
+ bun run strapi-plugin:fresh-install:live
131
+ ```
@@ -0,0 +1,12 @@
1
+ import type { EditorShellAppearance } from "@batterai/editor-shell";
2
+ export type StrapiCanvasTheme = Readonly<{
3
+ colors?: Readonly<Record<string, unknown>>;
4
+ }>;
5
+ export type StrapiCanvasAppearance = EditorShellAppearance | ((theme: StrapiCanvasTheme) => EditorShellAppearance);
6
+ /**
7
+ * Register host-owned Canvas editor chrome colors from `src/admin/app.tsx`.
8
+ * A resolver is recommended: Strapi calls it again when its light/dark theme changes.
9
+ */
10
+ export declare function registerCanvasAppearance(appearance: StrapiCanvasAppearance): void;
11
+ export declare function canvasAppearance(theme: StrapiCanvasTheme): EditorShellAppearance;
12
+ //# sourceMappingURL=appearance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appearance.d.ts","sourceRoot":"","sources":["../../src/admin/appearance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAEpE,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACvC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC5C,CAAC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAC9B,qBAAqB,GACrB,CAAC,CAAC,KAAK,EAAE,iBAAiB,KAAK,qBAAqB,CAAC,CAAC;AAI1D;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,sBAAsB,GAAG,IAAI,CAEjF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,GAAG,qBAAqB,CAuBhF"}
@@ -0,0 +1,44 @@
1
+ let registeredAppearance;
2
+ /**
3
+ * Register host-owned Canvas editor chrome colors from `src/admin/app.tsx`.
4
+ * A resolver is recommended: Strapi calls it again when its light/dark theme changes.
5
+ */
6
+ export function registerCanvasAppearance(appearance) {
7
+ registeredAppearance = appearance;
8
+ }
9
+ export function canvasAppearance(theme) {
10
+ const colors = theme.colors ?? {};
11
+ const inherited = compact({
12
+ accent: color(colors, "buttonPrimary600", "primary600"),
13
+ accentStrong: color(colors, "buttonPrimary700", "primary700"),
14
+ accentSoft: color(colors, "primary100"),
15
+ background: color(colors, "neutral100"),
16
+ border: color(colors, "neutral200"),
17
+ borderSubtle: color(colors, "neutral150", "neutral200"),
18
+ ink: color(colors, "neutral800"),
19
+ muted: color(colors, "neutral600"),
20
+ mutedDisabled: color(colors, "neutral500"),
21
+ panel: color(colors, "neutral0"),
22
+ panelStrong: color(colors, "neutral100"),
23
+ });
24
+ const custom = typeof registeredAppearance === "function"
25
+ ? registeredAppearance(theme)
26
+ : registeredAppearance;
27
+ const merged = { ...inherited, ...custom };
28
+ return {
29
+ ...merged,
30
+ selection: merged.selection ?? merged.accent ?? "#5d71c7",
31
+ };
32
+ }
33
+ function color(colors, ...names) {
34
+ for (const name of names) {
35
+ const value = colors[name];
36
+ if (typeof value === "string" && /^#[0-9a-fA-F]{6}$/.test(value))
37
+ return value;
38
+ }
39
+ return undefined;
40
+ }
41
+ function compact(value) {
42
+ return Object.fromEntries(Object.entries(value).filter((entry) => Boolean(entry[1])));
43
+ }
44
+ //# sourceMappingURL=appearance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appearance.js","sourceRoot":"","sources":["../../src/admin/appearance.ts"],"names":[],"mappings":"AAUA,IAAI,oBAAwD,CAAC;AAE7D;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,UAAkC;IACzE,oBAAoB,GAAG,UAAU,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAwB;IACvD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;IAClC,MAAM,SAAS,GAA0B,OAAO,CAAC;QAC/C,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,kBAAkB,EAAE,YAAY,CAAC;QACvD,YAAY,EAAE,KAAK,CAAC,MAAM,EAAE,kBAAkB,EAAE,YAAY,CAAC;QAC7D,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC;QACvC,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC;QACvC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC;QACnC,YAAY,EAAE,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,YAAY,CAAC;QACvD,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC;QAChC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC;QAClC,aAAa,EAAE,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC;QAC1C,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC;QAChC,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC;KACzC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,OAAO,oBAAoB,KAAK,UAAU;QACvD,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC;QAC7B,CAAC,CAAC,oBAAoB,CAAC;IACzB,MAAM,MAAM,GAAG,EAAE,GAAG,SAAS,EAAE,GAAG,MAAM,EAAE,CAAC;IAC3C,OAAO;QACL,GAAG,MAAM;QACT,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,IAAI,SAAS;KAC1D,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CAAC,MAAyC,EAAE,GAAG,KAAe;IAC1E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;IACjF,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,OAAO,CAAC,KAAyC;IACxD,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAA6B,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { BlockPackage } from "@batterai/contract";
2
+ export declare function registerCanvasBlockPackages(next: readonly BlockPackage[]): void;
3
+ export declare function configuredCanvasBlockPackages(): readonly BlockPackage[];
4
+ //# sourceMappingURL=block-packages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-packages.d.ts","sourceRoot":"","sources":["../../src/admin/block-packages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,SAAS,YAAY,EAAE,GAAG,IAAI,CAO/E;AAED,wBAAgB,6BAA6B,IAAI,SAAS,YAAY,EAAE,CAEvE"}
@@ -0,0 +1,14 @@
1
+ const packages = [];
2
+ export function registerCanvasBlockPackages(next) {
3
+ const existing = new Set(packages.map((pkg) => pkg.manifest.type));
4
+ for (const pkg of next) {
5
+ if (existing.has(pkg.manifest.type))
6
+ throw new Error(`Duplicate Canvas block package: ${pkg.manifest.type}`);
7
+ existing.add(pkg.manifest.type);
8
+ packages.push(pkg);
9
+ }
10
+ }
11
+ export function configuredCanvasBlockPackages() {
12
+ return Object.freeze([...packages]);
13
+ }
14
+ //# sourceMappingURL=block-packages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-packages.js","sourceRoot":"","sources":["../../src/admin/block-packages.ts"],"names":[],"mappings":"AAEA,MAAM,QAAQ,GAAmB,EAAE,CAAC;AAEpC,MAAM,UAAU,2BAA2B,CAAC,IAA6B;IACvE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACnE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7G,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,6BAA6B;IAC3C,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { EditorContentModel, EditorReferenceOption, EditorShellCollectionField, EditorShellCollectionItem, EditorShellContent } from "@batterai/editor-shell";
2
+ export declare const strapiContentModel: EditorContentModel<EditorShellContent, EditorShellCollectionItem, EditorShellCollectionField, EditorReferenceOption<string>>;
3
+ //# sourceMappingURL=content-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-model.d.ts","sourceRoot":"","sources":["../../../src/admin/client/content-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,kBAAkB,EAClB,qBAAqB,EACrB,0BAA0B,EAC1B,yBAAyB,EACzB,kBAAkB,EACnB,MAAM,wBAAwB,CAAC;AAsBhC,eAAO,MAAM,kBAAkB,EAAE,kBAAkB,CACjD,kBAAkB,EAClB,yBAAyB,EACzB,0BAA0B,EAC1B,qBAAqB,CAAC,MAAM,CAAC,CAsD9B,CAAC"}
@@ -0,0 +1,76 @@
1
+ const RESERVED_CONTENT_KEYS = new Set([
2
+ "media",
3
+ "routes",
4
+ "sharedBlocks",
5
+ "siteMetadata",
6
+ "theme",
7
+ "translations",
8
+ ]);
9
+ function contentCollections(content) {
10
+ return Object.keys(content).filter((key) => {
11
+ if (RESERVED_CONTENT_KEYS.has(key))
12
+ return false;
13
+ return Array.isArray(content[key]);
14
+ });
15
+ }
16
+ function itemTitle(item) {
17
+ return item.title ?? item.slug ?? item.id;
18
+ }
19
+ export const strapiContentModel = {
20
+ editableCollections: [],
21
+ defaultSiteTitle: "Strapi site",
22
+ detailBlock: {
23
+ blockType: "collection.detail",
24
+ collectionProp: "collection",
25
+ defaultCollection: "pages",
26
+ },
27
+ listBlock: {
28
+ blockType: "collection.list",
29
+ collectionProp: "collection",
30
+ defaultCollection: "pages",
31
+ },
32
+ collectionLabel(collection) {
33
+ return collection;
34
+ },
35
+ collectionItems(content, collection) {
36
+ const rows = content[collection];
37
+ return Array.isArray(rows) ? rows : [];
38
+ },
39
+ collectionItemsForBlock(content, blockConfig) {
40
+ const collection = typeof blockConfig.collection === "string"
41
+ ? blockConfig.collection
42
+ : contentCollections(content)[0] ?? "";
43
+ return collection ? this.collectionItems(content, collection) : [];
44
+ },
45
+ collectionItemImage(content, item) {
46
+ if (typeof item.imageId !== "string")
47
+ return null;
48
+ const media = content.media.find((asset) => asset.id === item.imageId);
49
+ return media ? { url: media.url, alt: media.alt } : null;
50
+ },
51
+ collectionItemHref(_content, item) {
52
+ return typeof item.slug === "string" ? `/${item.slug}` : `/${item.id}`;
53
+ },
54
+ createCollectionItem(collection) {
55
+ const id = `${collection}-${Date.now().toString(36)}`;
56
+ return { id, title: "Untitled" };
57
+ },
58
+ collectionFieldDef(_content, _collection, fieldName) {
59
+ return { name: fieldName, label: { en: fieldName } };
60
+ },
61
+ resolveOptionItems(content, field) {
62
+ if (field.valueType !== "reference")
63
+ return [];
64
+ const rows = content[String(field.refType ?? "")];
65
+ if (!Array.isArray(rows))
66
+ return [];
67
+ return rows.map((item) => ({
68
+ value: item.id,
69
+ label: itemTitle(item),
70
+ }));
71
+ },
72
+ optionLabel(_content, _field, value) {
73
+ return value;
74
+ },
75
+ };
76
+ //# sourceMappingURL=content-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-model.js","sourceRoot":"","sources":["../../../src/admin/client/content-model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { EditorHostServices } from "@batterai/editor-shell";
2
+ import type { FetchClient } from "@strapi/strapi/admin";
3
+ export declare function createStrapiCanvasHostServices(fetchClient: FetchClient): EditorHostServices;
4
+ //# sourceMappingURL=host-services.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-services.d.ts","sourceRoot":"","sources":["../../../src/admin/client/host-services.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAenB,MAAM,wBAAwB,CAAC;AAUhC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAUxD,wBAAgB,8BAA8B,CAAC,WAAW,EAAE,WAAW,GAAG,kBAAkB,CA0H3F"}
@@ -0,0 +1,141 @@
1
+ import { canvasDocumentRef, } from "@batterai/contract";
2
+ function unwrap(result) {
3
+ return result.then((response) => response.data);
4
+ }
5
+ function stableSaveResult() {
6
+ return { saved: true };
7
+ }
8
+ export function createStrapiCanvasHostServices(fetchClient) {
9
+ const capabilities = {
10
+ canSave: true,
11
+ canPublish: true,
12
+ supportsPageStaging: true,
13
+ canUploadAssets: false,
14
+ canEditRoutes: true,
15
+ supportsPreview: true,
16
+ supportsAtomicMultiPageSave: true,
17
+ };
18
+ return {
19
+ documentRef: canvasDocumentRef("strapi:canvas"),
20
+ document: {
21
+ async saveDocument(_ref, request) {
22
+ try {
23
+ return await unwrap(fetchClient.put("/canvas/document", { changes: request.changes, expected: request.expected }));
24
+ }
25
+ catch (error) {
26
+ return { ok: false, error: normalizeHostError(error) };
27
+ }
28
+ },
29
+ async publishDocument(_ref, request) {
30
+ try {
31
+ return await unwrap(fetchClient.post("/canvas/document/publish", { expected: request.expected }));
32
+ }
33
+ catch (error) {
34
+ return { ok: false, error: normalizeHostError(error) };
35
+ }
36
+ },
37
+ async stagePage(_ref, request) {
38
+ try {
39
+ return await unwrap(fetchClient.post(`/canvas/pages/${encodeURIComponent(request.pageId)}/stage`, { expected: request.expected }));
40
+ }
41
+ catch (error) {
42
+ return { ok: false, error: normalizeHostError(error) };
43
+ }
44
+ },
45
+ async unstagePage(_ref, request) {
46
+ try {
47
+ return await unwrap(fetchClient.post(`/canvas/pages/${encodeURIComponent(request.pageId)}/unstage`, { expected: request.expected }));
48
+ }
49
+ catch (error) {
50
+ return { ok: false, error: normalizeHostError(error) };
51
+ }
52
+ },
53
+ async loadPageRevision(_ref, request) {
54
+ try {
55
+ return await unwrap(fetchClient.get(`/canvas/pages/${encodeURIComponent(request.pageId)}/revisions/${request.revision}`));
56
+ }
57
+ catch (error) {
58
+ return { ok: false, error: normalizeHostError(error) };
59
+ }
60
+ },
61
+ async getCapabilities() {
62
+ return { ok: true, value: capabilities };
63
+ },
64
+ },
65
+ readLaunchContext() {
66
+ return {};
67
+ },
68
+ createSessionHandshake() {
69
+ return undefined;
70
+ },
71
+ resolveLaunchPageId(pages, _context, fallbackPageId) {
72
+ return pages.some((page) => page.id === fallbackPageId) ? fallbackPageId : pages[0]?.id ?? fallbackPageId;
73
+ },
74
+ async loadBootstrap() {
75
+ return unwrap(fetchClient.get("/canvas/bootstrap"));
76
+ },
77
+ async listMediaAssets(request) {
78
+ const params = new URLSearchParams();
79
+ params.set("pageSize", String(request.pageSize));
80
+ if (request.cursor)
81
+ params.set("cursor", request.cursor);
82
+ for (const mime of request.allowedMimeTypes ?? [])
83
+ params.append("allowedMimeTypes", mime);
84
+ for (const id of request.selectedIds ?? [])
85
+ params.append("selectedIds", id);
86
+ return unwrap(fetchClient.get(`/canvas/media?${params}`));
87
+ },
88
+ async uploadMediaAsset(request) {
89
+ const formData = new FormData();
90
+ formData.set("files", request.file);
91
+ formData.set("alt", request.alt);
92
+ for (const mime of request.allowedMimeTypes ?? [])
93
+ formData.append("allowedMimeTypes", mime);
94
+ return unwrap(fetchClient.post("/canvas/media", formData));
95
+ },
96
+ async saveContentCollection(collection, items) {
97
+ await unwrap(fetchClient.put(`/canvas/content/${encodeURIComponent(collection)}`, { items }));
98
+ return stableSaveResult();
99
+ },
100
+ async saveMediaAssets(media) {
101
+ await unwrap(fetchClient.put("/canvas/media", { media }));
102
+ return stableSaveResult();
103
+ },
104
+ async saveRoutes(routes) {
105
+ await unwrap(fetchClient.put("/canvas/routes", { routes }));
106
+ return stableSaveResult();
107
+ },
108
+ async saveSharedBlocks(sharedBlocks) {
109
+ await unwrap(fetchClient.put("/canvas/shared-blocks", { sharedBlocks }));
110
+ return stableSaveResult();
111
+ },
112
+ async savePreset(preset) {
113
+ const response = await unwrap(fetchClient.post("/canvas/presets", { preset }));
114
+ return response;
115
+ },
116
+ async saveTranslations(translations) {
117
+ await unwrap(fetchClient.put("/canvas/translations", { translations }));
118
+ return stableSaveResult();
119
+ },
120
+ async saveSiteMetadata(siteMetadata) {
121
+ await unwrap(fetchClient.put("/canvas/site-metadata", { siteMetadata }));
122
+ return stableSaveResult();
123
+ },
124
+ };
125
+ }
126
+ function normalizeHostError(error) {
127
+ const responseError = error
128
+ ?.response?.data?.error;
129
+ if (responseError && typeof responseError === "object" && "kind" in responseError) {
130
+ return responseError;
131
+ }
132
+ const message = error instanceof Error ? error.message : String(error);
133
+ if (/409|conflict/i.test(message))
134
+ return { kind: "conflict" };
135
+ if (/401|403|forbidden/i.test(message))
136
+ return { kind: "forbidden", reason: message };
137
+ if (/404|not found/i.test(message))
138
+ return { kind: "not-found" };
139
+ return { kind: "unavailable", retryable: true };
140
+ }
141
+ //# sourceMappingURL=host-services.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-services.js","sourceRoot":"","sources":["../../../src/admin/client/host-services.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ export { configuredCanvasBlockPackages, registerCanvasBlockPackages } from "./block-packages";
2
+ export { canvasAppearance, registerCanvasAppearance, type StrapiCanvasAppearance, type StrapiCanvasTheme, } from "./appearance";
3
+ type StrapiAdminApp = {
4
+ addMenuLink: (link: {
5
+ to: string;
6
+ icon?: React.ComponentType;
7
+ intlLabel: {
8
+ id: string;
9
+ defaultMessage: string;
10
+ };
11
+ permissions?: Array<{
12
+ action: string;
13
+ subject?: string | null;
14
+ }>;
15
+ Component: () => Promise<{
16
+ default: React.ComponentType;
17
+ }>;
18
+ }) => void;
19
+ registerPlugin: (plugin: {
20
+ id: string;
21
+ name: string;
22
+ }) => void;
23
+ };
24
+ declare const _default: {
25
+ register(app: StrapiAdminApp): void;
26
+ bootstrap(): void;
27
+ registerTrads({ locales }: {
28
+ locales: string[];
29
+ }): Promise<{
30
+ locale: string;
31
+ data: {
32
+ [x: string]: string;
33
+ };
34
+ }[]>;
35
+ };
36
+ export default _default;
37
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/admin/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,6BAA6B,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAC9F,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,GACvB,MAAM,cAAc,CAAC;AAEtB,KAAK,cAAc,GAAG;IACpB,WAAW,EAAE,CAAC,IAAI,EAAE;QAClB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;QAC3B,SAAS,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,cAAc,EAAE,MAAM,CAAA;SAAE,CAAC;QAClD,WAAW,CAAC,EAAE,KAAK,CAAC;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;SAAE,CAAC,CAAC;QACjE,SAAS,EAAE,MAAM,OAAO,CAAC;YAAE,OAAO,EAAE,KAAK,CAAC,aAAa,CAAA;SAAE,CAAC,CAAC;KAC5D,KAAK,IAAI,CAAC;IACX,cAAc,EAAE,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAChE,CAAC;;kBAWc,cAAc;;+BAkBK;QAAE,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE;;;;;;;AAnBxD,wBAyBE"}
@@ -0,0 +1,34 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { PLUGIN_ID, PLUGIN_NAME } from "../constants.js";
3
+ import { translationForLocale } from "./translations.js";
4
+ export { configuredCanvasBlockPackages, registerCanvasBlockPackages } from "./block-packages.js";
5
+ export { canvasAppearance, registerCanvasAppearance, } from "./appearance.js";
6
+ function CanvasIcon() {
7
+ return (_jsx("span", { "aria-hidden": "true", style: { color: "currentColor", fontWeight: 800, fontSize: "18px", lineHeight: 1 }, children: "\u00C7" }));
8
+ }
9
+ export default {
10
+ register(app) {
11
+ app.addMenuLink({
12
+ to: `plugins/${PLUGIN_ID}`,
13
+ icon: CanvasIcon,
14
+ intlLabel: {
15
+ id: `${PLUGIN_ID}.menu.label`,
16
+ defaultMessage: PLUGIN_NAME,
17
+ },
18
+ permissions: [{ action: "plugin::canvas.editor.access", subject: null }],
19
+ Component: () => import("./pages/App.js"),
20
+ });
21
+ app.registerPlugin({
22
+ id: PLUGIN_ID,
23
+ name: PLUGIN_NAME,
24
+ });
25
+ },
26
+ bootstrap() { },
27
+ async registerTrads({ locales }) {
28
+ return locales.map((locale) => ({
29
+ locale,
30
+ data: translationForLocale(locale),
31
+ }));
32
+ },
33
+ };
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/admin/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEtD,OAAO,EAAE,6BAA6B,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAC9F,OAAO,EACL,gBAAgB,EAChB,wBAAwB,GAGzB,MAAM,cAAc,CAAC;AAatB,SAAS,UAAU;IACjB,OAAO,CACL,8BAAkB,MAAM,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,uBAEpG,CACR,CAAC;AACJ,CAAC;AAED,eAAe;IACb,QAAQ,CAAC,GAAmB;QAC1B,GAAG,CAAC,WAAW,CAAC;YACd,EAAE,EAAE,WAAW,SAAS,EAAE;YAC1B,IAAI,EAAE,UAAU;YAChB,SAAS,EAAE;gBACT,EAAE,EAAE,GAAG,SAAS,aAAa;gBAC7B,cAAc,EAAE,WAAW;aAC5B;YACD,WAAW,EAAE,CAAC,EAAE,MAAM,EAAE,8BAA8B,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACxE,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC;SACvC,CAAC,CAAC;QAEH,GAAG,CAAC,cAAc,CAAC;YACjB,EAAE,EAAE,SAAS;YACb,IAAI,EAAE,WAAW;SAClB,CAAC,CAAC;IACL,CAAC;IACD,SAAS,KAAI,CAAC;IACd,KAAK,CAAC,aAAa,CAAC,EAAE,OAAO,EAAyB;QACpD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC9B,MAAM;YACN,IAAI,EAAE,oBAAoB,CAAC,MAAM,CAAC;SACnC,CAAC,CAAC,CAAC;IACN,CAAC;CACF,CAAC"}
@@ -0,0 +1,4 @@
1
+ import "@batterai/editor-shell/styles.css";
2
+ export declare function ProtectedCanvasPage(): import("react").JSX.Element;
3
+ export default ProtectedCanvasPage;
4
+ //# sourceMappingURL=App.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/App.tsx"],"names":[],"mappings":"AAEA,OAAO,mCAAmC,CAAC;AAiD3C,wBAAgB,mBAAmB,gCAElC;AAED,eAAe,mBAAmB,CAAC"}
@@ -0,0 +1,50 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createEditorElement } from "@batterai/editor-shell";
3
+ import { canvasBlockPackages } from "@batterai/canvas-blocks";
4
+ import "@batterai/editor-shell/styles.css";
5
+ import { useFetchClient } from "@strapi/strapi/admin";
6
+ import { useMemo } from "react";
7
+ import { useTheme } from "styled-components";
8
+ import { strapiContentModel } from "../client/content-model.js";
9
+ import { createStrapiCanvasHostServices } from "../client/host-services.js";
10
+ import { configuredCanvasBlockPackages } from "../block-packages.js";
11
+ import { canvasAppearance } from "../appearance.js";
12
+ function CanvasPage() {
13
+ const fetchClient = useFetchClient();
14
+ const strapiTheme = useTheme();
15
+ const hostServices = useMemo(() => createStrapiCanvasHostServices(fetchClient), [fetchClient]);
16
+ const appearance = useMemo(() => canvasAppearance(strapiTheme), [strapiTheme]);
17
+ const collaboration = useMemo(() => {
18
+ const collabFetch = async (input, init) => {
19
+ const url = new URL(String(input), window.location.origin);
20
+ const requestBody = init?.body ? JSON.parse(String(init.body)) : {};
21
+ const response = await fetchClient.post(url.pathname, { ...requestBody, __canvasOrigin: window.location.origin });
22
+ return Response.json(response.data);
23
+ };
24
+ return {
25
+ baseUrl: "/canvas/collab",
26
+ fetch: collabFetch,
27
+ tokenProvider: async () => {
28
+ const response = await fetchClient.post("/canvas/collab-token", {});
29
+ return response.data.token;
30
+ },
31
+ auditProvider: async (pageId) => {
32
+ const response = await fetchClient.get(`/canvas/collab-audit/${encodeURIComponent(pageId)}`);
33
+ return response.data.events;
34
+ },
35
+ };
36
+ }, [fetchClient]);
37
+ return (_jsx("main", { style: { height: "100vh", overflow: "hidden", width: "100%" }, children: createEditorElement({
38
+ contentModel: strapiContentModel,
39
+ defaultPageId: "home",
40
+ hostServices,
41
+ appearance,
42
+ collaboration,
43
+ blockPackages: [...canvasBlockPackages, ...configuredCanvasBlockPackages()],
44
+ }) }));
45
+ }
46
+ export function ProtectedCanvasPage() {
47
+ return _jsx(CanvasPage, {});
48
+ }
49
+ export default ProtectedCanvasPage;
50
+ //# sourceMappingURL=App.js.map