@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.
- package/CHANGELOG.md +5 -0
- package/LICENSE +16 -0
- package/README.md +131 -0
- package/dist/admin/appearance.d.ts +12 -0
- package/dist/admin/appearance.d.ts.map +1 -0
- package/dist/admin/appearance.js +44 -0
- package/dist/admin/appearance.js.map +1 -0
- package/dist/admin/block-packages.d.ts +4 -0
- package/dist/admin/block-packages.d.ts.map +1 -0
- package/dist/admin/block-packages.js +14 -0
- package/dist/admin/block-packages.js.map +1 -0
- package/dist/admin/client/content-model.d.ts +3 -0
- package/dist/admin/client/content-model.d.ts.map +1 -0
- package/dist/admin/client/content-model.js +76 -0
- package/dist/admin/client/content-model.js.map +1 -0
- package/dist/admin/client/host-services.d.ts +4 -0
- package/dist/admin/client/host-services.d.ts.map +1 -0
- package/dist/admin/client/host-services.js +141 -0
- package/dist/admin/client/host-services.js.map +1 -0
- package/dist/admin/index.d.ts +37 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +34 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/pages/App.d.ts +4 -0
- package/dist/admin/pages/App.d.ts.map +1 -0
- package/dist/admin/pages/App.js +50 -0
- package/dist/admin/pages/App.js.map +1 -0
- package/dist/admin/translations.d.ts +4 -0
- package/dist/admin/translations.d.ts.map +1 -0
- package/dist/admin/translations.js +16 -0
- package/dist/admin/translations.js.map +1 -0
- package/dist/constants.d.ts +14 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +18 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/server/bootstrap.d.ts +4 -0
- package/dist/server/bootstrap.d.ts.map +1 -0
- package/dist/server/bootstrap.js +37 -0
- package/dist/server/bootstrap.js.map +1 -0
- package/dist/server/config/index.d.ts +24 -0
- package/dist/server/config/index.d.ts.map +1 -0
- package/dist/server/config/index.js +33 -0
- package/dist/server/config/index.js.map +1 -0
- package/dist/server/content-types/canvas-page/schema.d.ts +45 -0
- package/dist/server/content-types/canvas-page/schema.d.ts.map +1 -0
- package/dist/server/content-types/canvas-page/schema.js +21 -0
- package/dist/server/content-types/canvas-page/schema.js.map +1 -0
- package/dist/server/content-types/canvas-site/schema.d.ts +41 -0
- package/dist/server/content-types/canvas-site/schema.d.ts.map +1 -0
- package/dist/server/content-types/canvas-site/schema.js +20 -0
- package/dist/server/content-types/canvas-site/schema.js.map +1 -0
- package/dist/server/content-types/index.d.ts +90 -0
- package/dist/server/content-types/index.d.ts.map +1 -0
- package/dist/server/content-types/index.js +7 -0
- package/dist/server/content-types/index.js.map +1 -0
- package/dist/server/controllers/canvas.d.ts +48 -0
- package/dist/server/controllers/canvas.d.ts.map +1 -0
- package/dist/server/controllers/canvas.js +409 -0
- package/dist/server/controllers/canvas.js.map +1 -0
- package/dist/server/controllers/index.d.ts +448 -0
- package/dist/server/controllers/index.d.ts.map +1 -0
- package/dist/server/controllers/index.js +5 -0
- package/dist/server/controllers/index.js.map +1 -0
- package/dist/server/index.d.ts +645 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +21 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/license.d.ts +13 -0
- package/dist/server/license.d.ts.map +1 -0
- package/dist/server/license.js +24 -0
- package/dist/server/license.js.map +1 -0
- package/dist/server/policies/is-admin-authenticated.d.ts +2 -0
- package/dist/server/policies/is-admin-authenticated.d.ts.map +1 -0
- package/dist/server/policies/is-admin-authenticated.js +4 -0
- package/dist/server/policies/is-admin-authenticated.js.map +1 -0
- package/dist/server/register.d.ts +2 -0
- package/dist/server/register.d.ts.map +1 -0
- package/dist/server/register.js +4 -0
- package/dist/server/register.js.map +1 -0
- package/dist/server/routes/admin.d.ts +18 -0
- package/dist/server/routes/admin.d.ts.map +1 -0
- package/dist/server/routes/admin.js +38 -0
- package/dist/server/routes/admin.js.map +1 -0
- package/dist/server/routes/index.d.ts +31 -0
- package/dist/server/routes/index.d.ts.map +1 -0
- package/dist/server/routes/index.js +7 -0
- package/dist/server/routes/index.js.map +1 -0
- package/dist/server/routes/public.d.ts +13 -0
- package/dist/server/routes/public.d.ts.map +1 -0
- package/dist/server/routes/public.js +7 -0
- package/dist/server/routes/public.js.map +1 -0
- package/dist/server/services/collaboration-service.d.ts +24 -0
- package/dist/server/services/collaboration-service.d.ts.map +1 -0
- package/dist/server/services/collaboration-service.js +164 -0
- package/dist/server/services/collaboration-service.js.map +1 -0
- package/dist/server/services/document-command-service.d.ts +34 -0
- package/dist/server/services/document-command-service.d.ts.map +1 -0
- package/dist/server/services/document-command-service.js +418 -0
- package/dist/server/services/document-command-service.js.map +1 -0
- package/dist/server/services/document-service.d.ts +14 -0
- package/dist/server/services/document-service.d.ts.map +1 -0
- package/dist/server/services/document-service.js +144 -0
- package/dist/server/services/document-service.js.map +1 -0
- package/dist/server/services/index.d.ts +68 -0
- package/dist/server/services/index.d.ts.map +1 -0
- package/dist/server/services/index.js +28 -0
- package/dist/server/services/index.js.map +1 -0
- package/dist/server/services/page-doc-store.d.ts +59 -0
- package/dist/server/services/page-doc-store.d.ts.map +1 -0
- package/dist/server/services/page-doc-store.js +285 -0
- package/dist/server/services/page-doc-store.js.map +1 -0
- package/dist/server/services/site-store.d.ts +43 -0
- package/dist/server/services/site-store.d.ts.map +1 -0
- package/dist/server/services/site-store.js +212 -0
- package/dist/server/services/site-store.js.map +1 -0
- package/dist/server-cjs/index.js +17381 -0
- package/dist/server-cjs/package.json +3 -0
- package/package.json +77 -0
- package/src/admin/appearance.ts +56 -0
- package/src/admin/block-packages.ts +16 -0
- package/src/admin/client/content-model.ts +88 -0
- package/src/admin/client/host-services.ts +172 -0
- package/src/admin/index.tsx +56 -0
- package/src/admin/pages/App.tsx +56 -0
- package/src/admin/strapi-admin.d.ts +1 -0
- package/src/admin/translations.ts +23 -0
- package/src/constants.ts +21 -0
- package/src/index.ts +11 -0
- package/src/server/bootstrap.ts +45 -0
- package/src/server/config/index.ts +46 -0
- package/src/server/content-types/canvas-page/schema.ts +20 -0
- package/src/server/content-types/canvas-site/schema.ts +19 -0
- package/src/server/content-types/index.ts +7 -0
- package/src/server/controllers/canvas.ts +468 -0
- package/src/server/controllers/index.ts +5 -0
- package/src/server/index.ts +21 -0
- package/src/server/license.ts +42 -0
- package/src/server/policies/is-admin-authenticated.ts +3 -0
- package/src/server/register.ts +3 -0
- package/src/server/routes/admin.ts +40 -0
- package/src/server/routes/index.ts +7 -0
- package/src/server/routes/public.ts +6 -0
- package/src/server/services/collaboration-service.ts +180 -0
- package/src/server/services/document-command-service.ts +495 -0
- package/src/server/services/document-service.ts +162 -0
- package/src/server/services/index.ts +41 -0
- package/src/server/services/page-doc-store.ts +348 -0
- package/src/server/services/site-store.ts +243 -0
package/CHANGELOG.md
ADDED
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":"AAiBA,OAAO,EACL,iBAAiB,GAOlB,MAAM,oBAAoB,CAAC;AAG5B,SAAS,MAAM,CAAI,MAA4B;IAC7C,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,WAAwB;IAErE,MAAM,YAAY,GAAG;QACnB,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,IAAI;QAChB,mBAAmB,EAAE,IAAI;QACzB,eAAe,EAAE,KAAK;QACtB,aAAa,EAAE,IAAI;QACnB,eAAe,EAAE,IAAI;QACrB,2BAA2B,EAAE,IAAI;KACzB,CAAC;IAEX,OAAO;QACL,WAAW,EAAE,iBAAiB,CAAC,eAAe,CAAC;QAC/C,QAAQ,EAAE;YACR,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO;gBAC9B,IAAI,CAAC;oBACH,OAAO,MAAM,MAAM,CACjB,WAAW,CAAC,GAAG,CAAC,kBAAkB,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAC9F,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzD,CAAC;YACH,CAAC;YACD,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO;gBACjC,IAAI,CAAC;oBACH,OAAO,MAAM,MAAM,CACjB,WAAW,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAC7E,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzD,CAAC;YACH,CAAC;YACD,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO;gBAC3B,IAAI,CAAC;oBACH,OAAO,MAAM,MAAM,CACjB,WAAW,CAAC,IAAI,CAAC,iBAAiB,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAC9G,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzD,CAAC;YACH,CAAC;YACD,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO;gBAC7B,IAAI,CAAC;oBACH,OAAO,MAAM,MAAM,CACjB,WAAW,CAAC,IAAI,CAAC,iBAAiB,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAChH,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzD,CAAC;YACH,CAAC;YACD,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,OAAO;gBAClC,IAAI,CAAC;oBACH,OAAO,MAAM,MAAM,CACjB,WAAW,CAAC,GAAG,CAAC,iBAAiB,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,OAAO,CAAC,QAAQ,EAAE,CAAC,CACrG,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzD,CAAC;YACH,CAAC;YACD,KAAK,CAAC,eAAe;gBACnB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;YAC3C,CAAC;SACF;QACD,iBAAiB;YACf,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,sBAAsB;YACpB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,mBAAmB,CAAC,KAAK,EAAE,QAAQ,EAAE,cAAc;YACjD,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,cAAc,CAAC;QAC5G,CAAC;QACD,KAAK,CAAC,aAAa;YACjB,OAAO,MAAM,CAAuB,WAAW,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC5E,CAAC;QACD,KAAK,CAAC,eAAe,CAAC,OAA+B;YACnD,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;YACjD,IAAI,OAAO,CAAC,MAAM;gBAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YACzD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,gBAAgB,IAAI,EAAE;gBAAE,MAAM,CAAC,MAAM,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;YAC3F,KAAK,MAAM,EAAE,IAAI,OAAO,CAAC,WAAW,IAAI,EAAE;gBAAE,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;YAC7E,OAAO,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,iBAAiB,MAAM,EAAE,CAAC,CAAC,CAAC;QAC5D,CAAC;QACD,KAAK,CAAC,gBAAgB,CAAC,OAAiC;YACtD,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;YAChC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YACpC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,gBAAgB,IAAI,EAAE;gBAAE,QAAQ,CAAC,MAAM,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;YAC7F,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC7D,CAAC;QACD,KAAK,CAAC,qBAAqB,CAAC,UAAkB,EAAE,KAAgB;YAC9D,MAAM,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,mBAAmB,kBAAkB,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YAC9F,OAAO,gBAAgB,EAAE,CAAC;QAC5B,CAAC;QACD,KAAK,CAAC,eAAe,CAAC,KAA8B;YAClD,MAAM,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YAC1D,OAAO,gBAAgB,EAAE,CAAC;QAC5B,CAAC;QACD,KAAK,CAAC,UAAU,CAAC,MAA0B;YACzC,MAAM,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YAC5D,OAAO,gBAAgB,EAAE,CAAC;QAC5B,CAAC;QACD,KAAK,CAAC,gBAAgB,CAAC,YAAsC;YAC3D,MAAM,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,uBAAuB,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;YACzE,OAAO,gBAAgB,EAAE,CAAC;QAC5B,CAAC;QACD,KAAK,CAAC,UAAU,CAAC,MAAmB;YAClC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAC3B,WAAW,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,CAAC,CAChD,CAAC;YACF,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,KAAK,CAAC,gBAAgB,CAAC,YAAqC;YAC1D,MAAM,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,sBAAsB,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;YACxE,OAAO,gBAAgB,EAAE,CAAC;QAC5B,CAAC;QACD,KAAK,CAAC,gBAAgB,CAAC,YAAqC;YAC1D,MAAM,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,uBAAuB,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;YACzE,OAAO,gBAAgB,EAAE,CAAC;QAC5B,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,MAAM,aAAa,GAAI,KAAkF;QACvG,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC;IAC1B,IAAI,aAAa,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,MAAM,IAAI,aAAa,EAAE,CAAC;QAClF,OAAO,aAAgC,CAAC;IAC1C,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC/D,IAAI,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IACtF,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IACjE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAClD,CAAC"}
|
|
@@ -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 @@
|
|
|
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
|