pagiera 0.2.0-alpha.33
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/README.md +528 -0
- package/dist/adapters.d.ts +89 -0
- package/dist/adapters.d.ts.map +1 -0
- package/dist/adapters.js +2 -0
- package/dist/adapters.js.map +1 -0
- package/dist/client.d.ts +22 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +33 -0
- package/dist/client.js.map +1 -0
- package/dist/data.js +210 -0
- package/dist/data.js.map +7 -0
- package/dist/document.d.ts +63 -0
- package/dist/document.d.ts.map +1 -0
- package/dist/document.js +25 -0
- package/dist/document.js.map +1 -0
- package/dist/editor.d.ts +14 -0
- package/dist/editor.d.ts.map +1 -0
- package/dist/editor.js +59 -0
- package/dist/editor.js.map +1 -0
- package/dist/full-editor.d.ts +53 -0
- package/dist/full-editor.js +11117 -0
- package/dist/full-editor.js.map +7 -0
- package/dist/full.css +3498 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/app/api/ai-design/route.d.ts +3 -0
- package/dist/internal/app/api/ai-design/route.d.ts.map +1 -0
- package/dist/internal/app/api/ai-design/route.js +165 -0
- package/dist/internal/app/api/ai-design/route.js.map +1 -0
- package/dist/internal/app/p/editor/ai-panel.d.ts +27 -0
- package/dist/internal/app/p/editor/ai-panel.d.ts.map +1 -0
- package/dist/internal/app/p/editor/ai-panel.js +77 -0
- package/dist/internal/app/p/editor/ai-panel.js.map +1 -0
- package/dist/internal/app/p/editor/data-modal.d.ts +26 -0
- package/dist/internal/app/p/editor/data-modal.d.ts.map +1 -0
- package/dist/internal/app/p/editor/data-modal.js +94 -0
- package/dist/internal/app/p/editor/data-modal.js.map +1 -0
- package/dist/internal/app/p/editor/data-panel.d.ts +18 -0
- package/dist/internal/app/p/editor/data-panel.d.ts.map +1 -0
- package/dist/internal/app/p/editor/data-panel.js +45 -0
- package/dist/internal/app/p/editor/data-panel.js.map +1 -0
- package/dist/internal/app/p/editor/editor.d.ts +51 -0
- package/dist/internal/app/p/editor/editor.d.ts.map +1 -0
- package/dist/internal/app/p/editor/editor.js +1551 -0
- package/dist/internal/app/p/editor/editor.js.map +1 -0
- package/dist/internal/app/p/editor/fields.d.ts +111 -0
- package/dist/internal/app/p/editor/fields.d.ts.map +1 -0
- package/dist/internal/app/p/editor/fields.js +141 -0
- package/dist/internal/app/p/editor/fields.js.map +1 -0
- package/dist/internal/app/p/editor/inspector.d.ts +38 -0
- package/dist/internal/app/p/editor/inspector.d.ts.map +1 -0
- package/dist/internal/app/p/editor/inspector.js +336 -0
- package/dist/internal/app/p/editor/inspector.js.map +1 -0
- package/dist/internal/app/p/editor/library.d.ts +18 -0
- package/dist/internal/app/p/editor/library.d.ts.map +1 -0
- package/dist/internal/app/p/editor/library.js +61 -0
- package/dist/internal/app/p/editor/library.js.map +1 -0
- package/dist/internal/app/p/editor/parts.d.ts +75 -0
- package/dist/internal/app/p/editor/parts.d.ts.map +1 -0
- package/dist/internal/app/p/editor/parts.js +261 -0
- package/dist/internal/app/p/editor/parts.js.map +1 -0
- package/dist/internal/app/p/editor/templates-panel.d.ts +6 -0
- package/dist/internal/app/p/editor/templates-panel.d.ts.map +1 -0
- package/dist/internal/app/p/editor/templates-panel.js +12 -0
- package/dist/internal/app/p/editor/templates-panel.js.map +1 -0
- package/dist/internal/app/p/editor/use-canvas-view.d.ts +24 -0
- package/dist/internal/app/p/editor/use-canvas-view.d.ts.map +1 -0
- package/dist/internal/app/p/editor/use-canvas-view.js +242 -0
- package/dist/internal/app/p/editor/use-canvas-view.js.map +1 -0
- package/dist/internal/app/p/editor/use-editor.d.ts +48 -0
- package/dist/internal/app/p/editor/use-editor.d.ts.map +1 -0
- package/dist/internal/app/p/editor/use-editor.js +224 -0
- package/dist/internal/app/p/editor/use-editor.js.map +1 -0
- package/dist/internal/app/p/editor/variables-panel.d.ts +8 -0
- package/dist/internal/app/p/editor/variables-panel.d.ts.map +1 -0
- package/dist/internal/app/p/editor/variables-panel.js +52 -0
- package/dist/internal/app/p/editor/variables-panel.js.map +1 -0
- package/dist/internal/components/ui/select.d.ts +12 -0
- package/dist/internal/components/ui/select.d.ts.map +1 -0
- package/dist/internal/components/ui/select.js +32 -0
- package/dist/internal/components/ui/select.js.map +1 -0
- package/dist/internal/drizzle/index.d.ts +6 -0
- package/dist/internal/drizzle/index.d.ts.map +1 -0
- package/dist/internal/drizzle/index.js +20 -0
- package/dist/internal/drizzle/index.js.map +1 -0
- package/dist/internal/drizzle/schema.d.ts +405 -0
- package/dist/internal/drizzle/schema.d.ts.map +1 -0
- package/dist/internal/drizzle/schema.js +70 -0
- package/dist/internal/drizzle/schema.js.map +1 -0
- package/dist/internal/lib/data/context.d.ts +8 -0
- package/dist/internal/lib/data/context.d.ts.map +1 -0
- package/dist/internal/lib/data/context.js +17 -0
- package/dist/internal/lib/data/context.js.map +1 -0
- package/dist/internal/lib/data/source.d.ts +54 -0
- package/dist/internal/lib/data/source.d.ts.map +1 -0
- package/dist/internal/lib/data/source.js +229 -0
- package/dist/internal/lib/data/source.js.map +1 -0
- package/dist/internal/lib/editor/ai-types.d.ts +44 -0
- package/dist/internal/lib/editor/ai-types.d.ts.map +1 -0
- package/dist/internal/lib/editor/ai-types.js +2 -0
- package/dist/internal/lib/editor/ai-types.js.map +1 -0
- package/dist/internal/lib/editor/arrange.d.ts +12 -0
- package/dist/internal/lib/editor/arrange.d.ts.map +1 -0
- package/dist/internal/lib/editor/arrange.js +72 -0
- package/dist/internal/lib/editor/arrange.js.map +1 -0
- package/dist/internal/lib/editor/cascade.d.ts +39 -0
- package/dist/internal/lib/editor/cascade.d.ts.map +1 -0
- package/dist/internal/lib/editor/cascade.js +86 -0
- package/dist/internal/lib/editor/cascade.js.map +1 -0
- package/dist/internal/lib/editor/icon.d.ts +6 -0
- package/dist/internal/lib/editor/icon.d.ts.map +1 -0
- package/dist/internal/lib/editor/icon.js +13 -0
- package/dist/internal/lib/editor/icon.js.map +1 -0
- package/dist/internal/lib/editor/presets.d.ts +10 -0
- package/dist/internal/lib/editor/presets.d.ts.map +1 -0
- package/dist/internal/lib/editor/presets.js +83 -0
- package/dist/internal/lib/editor/presets.js.map +1 -0
- package/dist/internal/lib/editor/showcase.d.ts +14 -0
- package/dist/internal/lib/editor/showcase.d.ts.map +1 -0
- package/dist/internal/lib/editor/showcase.js +219 -0
- package/dist/internal/lib/editor/showcase.js.map +1 -0
- package/dist/internal/lib/editor/site-templates.d.ts +4 -0
- package/dist/internal/lib/editor/site-templates.d.ts.map +1 -0
- package/dist/internal/lib/editor/site-templates.js +156 -0
- package/dist/internal/lib/editor/site-templates.js.map +1 -0
- package/dist/internal/lib/editor/snap.d.ts +34 -0
- package/dist/internal/lib/editor/snap.d.ts.map +1 -0
- package/dist/internal/lib/editor/snap.js +70 -0
- package/dist/internal/lib/editor/snap.js.map +1 -0
- package/dist/internal/lib/editor/style.d.ts +53 -0
- package/dist/internal/lib/editor/style.d.ts.map +1 -0
- package/dist/internal/lib/editor/style.js +313 -0
- package/dist/internal/lib/editor/style.js.map +1 -0
- package/dist/internal/lib/editor/tree.d.ts +72 -0
- package/dist/internal/lib/editor/tree.d.ts.map +1 -0
- package/dist/internal/lib/editor/tree.js +301 -0
- package/dist/internal/lib/editor/tree.js.map +1 -0
- package/dist/internal/lib/editor/types.d.ts +273 -0
- package/dist/internal/lib/editor/types.d.ts.map +1 -0
- package/dist/internal/lib/editor/types.js +411 -0
- package/dist/internal/lib/editor/types.js.map +1 -0
- package/dist/internal/lib/editor/validate.d.ts +20 -0
- package/dist/internal/lib/editor/validate.d.ts.map +1 -0
- package/dist/internal/lib/editor/validate.js +467 -0
- package/dist/internal/lib/editor/validate.js.map +1 -0
- package/dist/internal/lib/pages.d.ts +83 -0
- package/dist/internal/lib/pages.d.ts.map +1 -0
- package/dist/internal/lib/pages.js +294 -0
- package/dist/internal/lib/pages.js.map +1 -0
- package/dist/internal/lib/render/bind.d.ts +18 -0
- package/dist/internal/lib/render/bind.d.ts.map +1 -0
- package/dist/internal/lib/render/bind.js +28 -0
- package/dist/internal/lib/render/bind.js.map +1 -0
- package/dist/internal/lib/render/css.d.ts +31 -0
- package/dist/internal/lib/render/css.d.ts.map +1 -0
- package/dist/internal/lib/render/css.js +239 -0
- package/dist/internal/lib/render/css.js.map +1 -0
- package/dist/internal/lib/render/load-data.d.ts +15 -0
- package/dist/internal/lib/render/load-data.d.ts.map +1 -0
- package/dist/internal/lib/render/load-data.js +39 -0
- package/dist/internal/lib/render/load-data.js.map +1 -0
- package/dist/internal/lib/render/page-render.d.ts +17 -0
- package/dist/internal/lib/render/page-render.d.ts.map +1 -0
- package/dist/internal/lib/render/page-render.js +117 -0
- package/dist/internal/lib/render/page-render.js.map +1 -0
- package/dist/internal/lib/utils.d.ts +3 -0
- package/dist/internal/lib/utils.d.ts.map +1 -0
- package/dist/internal/lib/utils.js +6 -0
- package/dist/internal/lib/utils.js.map +1 -0
- package/dist/manrope-data.d.ts +3 -0
- package/dist/manrope-data.d.ts.map +1 -0
- package/dist/manrope-data.js +3 -0
- package/dist/manrope-data.js.map +1 -0
- package/dist/page.d.ts +9 -0
- package/dist/page.d.ts.map +1 -0
- package/dist/page.js +148 -0
- package/dist/page.js.map +1 -0
- package/dist/provider.d.ts +14 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +45 -0
- package/dist/provider.js.map +1 -0
- package/dist/runtime.d.ts +8 -0
- package/dist/runtime.js +717 -0
- package/dist/runtime.js.map +7 -0
- package/dist/server.d.ts +31 -0
- package/dist/server.js +2267 -0
- package/dist/server.js.map +7 -0
- package/dist/styles.css +300 -0
- package/package.json +94 -0
- package/thumbnail.png +0 -0
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
import { and, asc, desc, eq, isNotNull, ne, notInArray, sql } from "drizzle-orm";
|
|
2
|
+
import { db } from "@/drizzle";
|
|
3
|
+
import { pageRevisions, pages, sites } from "@/drizzle/schema";
|
|
4
|
+
import { DEFAULT_ROOT_STYLE, } from "@/lib/editor/types";
|
|
5
|
+
export const DEFAULT_SITE_SLUG = "default";
|
|
6
|
+
export const DEFAULT_PAGE_SLUG = "home";
|
|
7
|
+
/** How many autosave snapshots to retain per page before pruning the oldest. */
|
|
8
|
+
const REVISION_LIMIT = 50;
|
|
9
|
+
async function getDefaultSiteId() {
|
|
10
|
+
const [existing] = await db
|
|
11
|
+
.select({ id: sites.id })
|
|
12
|
+
.from(sites)
|
|
13
|
+
.where(eq(sites.slug, DEFAULT_SITE_SLUG))
|
|
14
|
+
.limit(1);
|
|
15
|
+
if (existing)
|
|
16
|
+
return existing.id;
|
|
17
|
+
await db
|
|
18
|
+
.insert(sites)
|
|
19
|
+
.values({ name: "Default site", slug: DEFAULT_SITE_SLUG })
|
|
20
|
+
.onConflictDoNothing({ target: sites.slug });
|
|
21
|
+
const [created] = await db
|
|
22
|
+
.select({ id: sites.id })
|
|
23
|
+
.from(sites)
|
|
24
|
+
.where(eq(sites.slug, DEFAULT_SITE_SLUG))
|
|
25
|
+
.limit(1);
|
|
26
|
+
if (!created)
|
|
27
|
+
throw new Error("Failed to create the default site");
|
|
28
|
+
return created.id;
|
|
29
|
+
}
|
|
30
|
+
export async function listPages() {
|
|
31
|
+
const siteId = await getDefaultSiteId();
|
|
32
|
+
return db
|
|
33
|
+
.select({
|
|
34
|
+
id: pages.id,
|
|
35
|
+
name: pages.name,
|
|
36
|
+
slug: pages.slug,
|
|
37
|
+
publishedAt: pages.publishedAt,
|
|
38
|
+
updatedAt: pages.updatedAt,
|
|
39
|
+
})
|
|
40
|
+
.from(pages)
|
|
41
|
+
.where(eq(pages.siteId, siteId))
|
|
42
|
+
.orderBy(asc(pages.createdAt));
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Every page's element tree, for the cross-page component library. Kept
|
|
46
|
+
* separate from `listPages` because it pulls the whole document and only the
|
|
47
|
+
* library needs that.
|
|
48
|
+
*/
|
|
49
|
+
export async function listPageDocuments() {
|
|
50
|
+
const siteId = await getDefaultSiteId();
|
|
51
|
+
return db
|
|
52
|
+
.select({ id: pages.id, name: pages.name, elements: pages.elements })
|
|
53
|
+
.from(pages)
|
|
54
|
+
.where(eq(pages.siteId, siteId))
|
|
55
|
+
.orderBy(asc(pages.createdAt));
|
|
56
|
+
}
|
|
57
|
+
export async function getPage(pageId) {
|
|
58
|
+
const [page] = await db
|
|
59
|
+
.select()
|
|
60
|
+
.from(pages)
|
|
61
|
+
.where(eq(pages.id, pageId))
|
|
62
|
+
.limit(1);
|
|
63
|
+
return page;
|
|
64
|
+
}
|
|
65
|
+
/** The published snapshot for a public URL, or undefined when unpublished. */
|
|
66
|
+
export async function getPublishedPage(slug) {
|
|
67
|
+
const siteId = await getDefaultSiteId();
|
|
68
|
+
const [page] = await db
|
|
69
|
+
.select({
|
|
70
|
+
name: pages.name,
|
|
71
|
+
elements: pages.publishedElements,
|
|
72
|
+
rootStyle: pages.publishedRootStyle,
|
|
73
|
+
dataSources: pages.publishedDataSources,
|
|
74
|
+
publishedAt: pages.publishedAt,
|
|
75
|
+
})
|
|
76
|
+
.from(pages)
|
|
77
|
+
.where(and(eq(pages.siteId, siteId), eq(pages.slug, slug), isNotNull(pages.publishedAt)))
|
|
78
|
+
.limit(1);
|
|
79
|
+
if (!page?.elements)
|
|
80
|
+
return undefined;
|
|
81
|
+
return {
|
|
82
|
+
name: page.name,
|
|
83
|
+
elements: page.elements,
|
|
84
|
+
rootStyle: page.rootStyle ?? DEFAULT_ROOT_STYLE,
|
|
85
|
+
dataSources: page.dataSources ?? [],
|
|
86
|
+
publishedAt: page.publishedAt,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
export async function listPublishedSlugs() {
|
|
90
|
+
const siteId = await getDefaultSiteId();
|
|
91
|
+
return db
|
|
92
|
+
.select({ slug: pages.slug })
|
|
93
|
+
.from(pages)
|
|
94
|
+
.where(and(eq(pages.siteId, siteId), isNotNull(pages.publishedAt)));
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Returns the page the editor opens by default, creating it on first run so a
|
|
98
|
+
* fresh clone has something to edit.
|
|
99
|
+
*/
|
|
100
|
+
export async function getOrCreateDefaultPage() {
|
|
101
|
+
const siteId = await getDefaultSiteId();
|
|
102
|
+
const [existing] = await db
|
|
103
|
+
.select()
|
|
104
|
+
.from(pages)
|
|
105
|
+
.where(and(eq(pages.siteId, siteId), eq(pages.slug, DEFAULT_PAGE_SLUG)))
|
|
106
|
+
.limit(1);
|
|
107
|
+
if (existing)
|
|
108
|
+
return existing;
|
|
109
|
+
await db
|
|
110
|
+
.insert(pages)
|
|
111
|
+
.values({
|
|
112
|
+
siteId,
|
|
113
|
+
name: "Home",
|
|
114
|
+
slug: DEFAULT_PAGE_SLUG,
|
|
115
|
+
elements: [],
|
|
116
|
+
rootStyle: DEFAULT_ROOT_STYLE,
|
|
117
|
+
})
|
|
118
|
+
.onConflictDoNothing({ target: [pages.siteId, pages.slug] });
|
|
119
|
+
const [page] = await db
|
|
120
|
+
.select()
|
|
121
|
+
.from(pages)
|
|
122
|
+
.where(and(eq(pages.siteId, siteId), eq(pages.slug, DEFAULT_PAGE_SLUG)))
|
|
123
|
+
.limit(1);
|
|
124
|
+
if (!page)
|
|
125
|
+
throw new Error("Failed to create the default page");
|
|
126
|
+
return page;
|
|
127
|
+
}
|
|
128
|
+
export async function savePageDocument(pageId, elements, rootStyle, dataSources, expectedVersion) {
|
|
129
|
+
const [updated] = await db
|
|
130
|
+
.update(pages)
|
|
131
|
+
.set({
|
|
132
|
+
elements,
|
|
133
|
+
rootStyle,
|
|
134
|
+
dataSources,
|
|
135
|
+
version: sql `${pages.version} + 1`,
|
|
136
|
+
updatedAt: new Date(),
|
|
137
|
+
})
|
|
138
|
+
.where(and(eq(pages.id, pageId), eq(pages.version, expectedVersion)))
|
|
139
|
+
.returning({ version: pages.version });
|
|
140
|
+
if (!updated) {
|
|
141
|
+
const [current] = await db
|
|
142
|
+
.select({
|
|
143
|
+
version: pages.version,
|
|
144
|
+
elements: pages.elements,
|
|
145
|
+
rootStyle: pages.rootStyle,
|
|
146
|
+
dataSources: pages.dataSources,
|
|
147
|
+
})
|
|
148
|
+
.from(pages)
|
|
149
|
+
.where(eq(pages.id, pageId))
|
|
150
|
+
.limit(1);
|
|
151
|
+
if (!current)
|
|
152
|
+
throw new Error(`Page ${pageId} no longer exists`);
|
|
153
|
+
return {
|
|
154
|
+
status: "conflict",
|
|
155
|
+
version: current.version,
|
|
156
|
+
elements: current.elements,
|
|
157
|
+
rootStyle: current.rootStyle ?? DEFAULT_ROOT_STYLE,
|
|
158
|
+
dataSources: current.dataSources ?? [],
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
await db
|
|
162
|
+
.insert(pageRevisions)
|
|
163
|
+
.values({ pageId, version: updated.version, elements, rootStyle });
|
|
164
|
+
await pruneRevisions(pageId);
|
|
165
|
+
return { status: "saved", version: updated.version };
|
|
166
|
+
}
|
|
167
|
+
/** Copies the current draft into the published columns. */
|
|
168
|
+
export async function publishPage(pageId) {
|
|
169
|
+
const [updated] = await db
|
|
170
|
+
.update(pages)
|
|
171
|
+
.set({
|
|
172
|
+
publishedElements: sql `${pages.elements}`,
|
|
173
|
+
publishedRootStyle: sql `${pages.rootStyle}`,
|
|
174
|
+
publishedDataSources: sql `${pages.dataSources}`,
|
|
175
|
+
publishedAt: new Date(),
|
|
176
|
+
})
|
|
177
|
+
.where(eq(pages.id, pageId))
|
|
178
|
+
.returning({ slug: pages.slug, publishedAt: pages.publishedAt });
|
|
179
|
+
return updated;
|
|
180
|
+
}
|
|
181
|
+
export async function unpublishPage(pageId) {
|
|
182
|
+
await db
|
|
183
|
+
.update(pages)
|
|
184
|
+
.set({
|
|
185
|
+
publishedAt: null,
|
|
186
|
+
publishedElements: null,
|
|
187
|
+
publishedRootStyle: null,
|
|
188
|
+
publishedDataSources: null,
|
|
189
|
+
})
|
|
190
|
+
.where(eq(pages.id, pageId));
|
|
191
|
+
}
|
|
192
|
+
export async function createPage(name, slug) {
|
|
193
|
+
const siteId = await getDefaultSiteId();
|
|
194
|
+
const [created] = await db
|
|
195
|
+
.insert(pages)
|
|
196
|
+
.values({
|
|
197
|
+
siteId,
|
|
198
|
+
name,
|
|
199
|
+
slug,
|
|
200
|
+
elements: [],
|
|
201
|
+
rootStyle: DEFAULT_ROOT_STYLE,
|
|
202
|
+
})
|
|
203
|
+
.onConflictDoNothing({ target: [pages.siteId, pages.slug] })
|
|
204
|
+
.returning({ id: pages.id });
|
|
205
|
+
return created?.id;
|
|
206
|
+
}
|
|
207
|
+
/** Atomically replaces the current site's pages with a complete template. */
|
|
208
|
+
export async function installTemplatePages(templatePages) {
|
|
209
|
+
const siteId = await getDefaultSiteId();
|
|
210
|
+
if (templatePages.length === 0)
|
|
211
|
+
return undefined;
|
|
212
|
+
if (!templatePages.some((template) => template.slug === DEFAULT_PAGE_SLUG)) {
|
|
213
|
+
throw new Error("Every site template must include a home page.");
|
|
214
|
+
}
|
|
215
|
+
return db.transaction(async (tx) => {
|
|
216
|
+
// Revisions are removed by the FK cascade. If insertion fails, the
|
|
217
|
+
// transaction restores every previous page instead of leaving an
|
|
218
|
+
// empty project behind.
|
|
219
|
+
await tx.delete(pages).where(eq(pages.siteId, siteId));
|
|
220
|
+
const created = await tx.insert(pages).values(templatePages.map((template) => ({
|
|
221
|
+
siteId,
|
|
222
|
+
name: template.name,
|
|
223
|
+
slug: template.slug,
|
|
224
|
+
elements: template.elements,
|
|
225
|
+
rootStyle: template.rootStyle,
|
|
226
|
+
dataSources: template.dataSources ?? [],
|
|
227
|
+
}))).returning({ id: pages.id, slug: pages.slug });
|
|
228
|
+
return created.find((page) => page.slug === templatePages[0].slug)?.id;
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
export async function duplicatePage(pageId, name, slug) {
|
|
232
|
+
const source = await getPage(pageId);
|
|
233
|
+
if (!source)
|
|
234
|
+
return undefined;
|
|
235
|
+
const [created] = await db
|
|
236
|
+
.insert(pages)
|
|
237
|
+
.values({
|
|
238
|
+
siteId: source.siteId,
|
|
239
|
+
name,
|
|
240
|
+
slug,
|
|
241
|
+
elements: source.elements,
|
|
242
|
+
rootStyle: source.rootStyle ?? DEFAULT_ROOT_STYLE,
|
|
243
|
+
})
|
|
244
|
+
.onConflictDoNothing({ target: [pages.siteId, pages.slug] })
|
|
245
|
+
.returning({ id: pages.id });
|
|
246
|
+
return created?.id;
|
|
247
|
+
}
|
|
248
|
+
export async function renamePage(pageId, name, slug) {
|
|
249
|
+
const current = await getPage(pageId);
|
|
250
|
+
if (!current || (current.slug === DEFAULT_PAGE_SLUG && slug !== DEFAULT_PAGE_SLUG))
|
|
251
|
+
return undefined;
|
|
252
|
+
const [updated] = await db
|
|
253
|
+
.update(pages)
|
|
254
|
+
.set({ name, slug, updatedAt: new Date() })
|
|
255
|
+
.where(eq(pages.id, pageId))
|
|
256
|
+
.returning({ id: pages.id });
|
|
257
|
+
return updated?.id;
|
|
258
|
+
}
|
|
259
|
+
/** Refuses to delete the last page, so the editor always has something to open. */
|
|
260
|
+
export async function deletePage(pageId) {
|
|
261
|
+
const siteId = await getDefaultSiteId();
|
|
262
|
+
await getOrCreateDefaultPage();
|
|
263
|
+
const [target] = await db
|
|
264
|
+
.select({ slug: pages.slug })
|
|
265
|
+
.from(pages)
|
|
266
|
+
.where(and(eq(pages.siteId, siteId), eq(pages.id, pageId)))
|
|
267
|
+
.limit(1);
|
|
268
|
+
if (!target)
|
|
269
|
+
return { deleted: false, reason: "not-found" };
|
|
270
|
+
if (target.slug === DEFAULT_PAGE_SLUG) {
|
|
271
|
+
return { deleted: false, reason: "home-required" };
|
|
272
|
+
}
|
|
273
|
+
const remaining = await db
|
|
274
|
+
.select({ id: pages.id })
|
|
275
|
+
.from(pages)
|
|
276
|
+
.where(and(eq(pages.siteId, siteId), ne(pages.id, pageId)))
|
|
277
|
+
.limit(1);
|
|
278
|
+
if (remaining.length === 0)
|
|
279
|
+
return { deleted: false, reason: "last-page" };
|
|
280
|
+
await db.delete(pages).where(eq(pages.id, pageId));
|
|
281
|
+
return { deleted: true, fallbackId: remaining[0].id };
|
|
282
|
+
}
|
|
283
|
+
async function pruneRevisions(pageId) {
|
|
284
|
+
const keep = await db
|
|
285
|
+
.select({ id: pageRevisions.id })
|
|
286
|
+
.from(pageRevisions)
|
|
287
|
+
.where(eq(pageRevisions.pageId, pageId))
|
|
288
|
+
.orderBy(desc(pageRevisions.createdAt))
|
|
289
|
+
.limit(REVISION_LIMIT);
|
|
290
|
+
if (keep.length < REVISION_LIMIT)
|
|
291
|
+
return;
|
|
292
|
+
await db.delete(pageRevisions).where(and(eq(pageRevisions.pageId, pageId), notInArray(pageRevisions.id, keep.map((r) => r.id))));
|
|
293
|
+
}
|
|
294
|
+
//# sourceMappingURL=pages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pages.js","sourceRoot":"","sources":["../../../src/internal/lib/pages.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { CanvasElement } from "@/lib/editor/types";
|
|
2
|
+
/** One object of a data source, as seen inside Request or Repeat. */
|
|
3
|
+
export type Row = Record<string, unknown>;
|
|
4
|
+
/** Resolved data for every source on the page, keyed by source id. */
|
|
5
|
+
export type PageData = Record<string, Row[]>;
|
|
6
|
+
/**
|
|
7
|
+
* Applies a row to an element. A bound Image or Video takes its `src` from the
|
|
8
|
+
* field; anything else takes its text. Returns the element unchanged when
|
|
9
|
+
* there is nothing to bind, so callers can use the result directly.
|
|
10
|
+
*/
|
|
11
|
+
export declare function bindElement(element: CanvasElement, row: Row | undefined): CanvasElement;
|
|
12
|
+
/**
|
|
13
|
+
* The rows a Repeat should render. An unconfigured or failed source yields a
|
|
14
|
+
* single placeholder row so the template still shows up in the editor rather
|
|
15
|
+
* than collapsing to nothing.
|
|
16
|
+
*/
|
|
17
|
+
export declare function rowsFor(element: CanvasElement, data: PageData, placeholderWhenEmpty: boolean): Array<Row | undefined>;
|
|
18
|
+
//# sourceMappingURL=bind.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bind.d.ts","sourceRoot":"","sources":["../../../../src/internal/lib/render/bind.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,qEAAqE;AACrE,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1C,sEAAsE;AACtE,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;AAE7C;;;;GAIG;AACH,wBAAgB,WAAW,CACvB,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE,GAAG,GAAG,SAAS,GACrB,aAAa,CASf;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CACnB,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,QAAQ,EACd,oBAAoB,EAAE,OAAO,GAC9B,KAAK,CAAC,GAAG,GAAG,SAAS,CAAC,CAIxB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { readBinding } from "@/lib/data/source";
|
|
2
|
+
/**
|
|
3
|
+
* Applies a row to an element. A bound Image or Video takes its `src` from the
|
|
4
|
+
* field; anything else takes its text. Returns the element unchanged when
|
|
5
|
+
* there is nothing to bind, so callers can use the result directly.
|
|
6
|
+
*/
|
|
7
|
+
export function bindElement(element, row) {
|
|
8
|
+
if (!row || !element.binding)
|
|
9
|
+
return element;
|
|
10
|
+
const value = readBinding(row, element.binding);
|
|
11
|
+
if (element.type === "Image" || element.type === "Video") {
|
|
12
|
+
// An empty result would blank the element; keep the authored fallback.
|
|
13
|
+
return value ? { ...element, src: value } : element;
|
|
14
|
+
}
|
|
15
|
+
return { ...element, content: value };
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The rows a Repeat should render. An unconfigured or failed source yields a
|
|
19
|
+
* single placeholder row so the template still shows up in the editor rather
|
|
20
|
+
* than collapsing to nothing.
|
|
21
|
+
*/
|
|
22
|
+
export function rowsFor(element, data, placeholderWhenEmpty) {
|
|
23
|
+
const rows = element.sourceId ? data[element.sourceId] : undefined;
|
|
24
|
+
if (rows && rows.length > 0)
|
|
25
|
+
return rows;
|
|
26
|
+
return placeholderWhenEmpty ? [undefined] : [];
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=bind.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bind.js","sourceRoot":"","sources":["../../../../src/internal/lib/render/bind.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAShD;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACvB,OAAsB,EACtB,GAAoB;IAEpB,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC;IAE7C,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACvD,uEAAuE;QACvE,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IACxD,CAAC;IACD,OAAO,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC1C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CACnB,OAAsB,EACtB,IAAc,EACd,oBAA6B;IAE7B,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,OAAO,oBAAoB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { CSSProperties } from "react";
|
|
2
|
+
import { type Cascade } from "@/lib/editor/cascade";
|
|
3
|
+
import { type CanvasElement, type RootStyle } from "@/lib/editor/types";
|
|
4
|
+
export declare function declarationsToCss(css: CSSProperties): string;
|
|
5
|
+
/** A CSS-identifier-safe class for one element. */
|
|
6
|
+
export declare function classFor(id: string): string;
|
|
7
|
+
/**
|
|
8
|
+
* "inherit" means "the page default" — which on a published page is a neutral
|
|
9
|
+
* system stack, not whatever the surrounding app happens to set.
|
|
10
|
+
*/
|
|
11
|
+
export declare const DEFAULT_PAGE_FONT = "ui-sans-serif, system-ui, sans-serif";
|
|
12
|
+
export declare function resolveFont(fontFamily: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* The reveal script; static, with no interpolated content.
|
|
15
|
+
*
|
|
16
|
+
* Hiding content until a callback fires is a risky trade on a public page, so
|
|
17
|
+
* this fails open three ways: whatever is already on screen is revealed
|
|
18
|
+
* synchronously, anything still hidden is revealed after a timeout, and the
|
|
19
|
+
* whole hidden state is skipped when IntersectionObserver or motion
|
|
20
|
+
* preferences say so.
|
|
21
|
+
*/
|
|
22
|
+
export declare const ENTRANCE_SCRIPT: string;
|
|
23
|
+
export declare function hasEntrances(elements: CanvasElement[], cascade?: Cascade): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Builds the stylesheet for a published document: one base rule per element,
|
|
26
|
+
* plus a media block for each breakpoint that actually overrides something,
|
|
27
|
+
* plus hover rules.
|
|
28
|
+
*/
|
|
29
|
+
export declare function stylesheetFor(elements: CanvasElement[], rootStyle: RootStyle): string;
|
|
30
|
+
export declare function rootChildren(elements: CanvasElement[]): CanvasElement[];
|
|
31
|
+
//# sourceMappingURL=css.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css.d.ts","sourceRoot":"","sources":["../../../../src/internal/lib/render/css.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAQ3C,OAAO,EAEH,KAAK,OAAO,EAIf,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAEH,KAAK,aAAa,EAClB,KAAK,SAAS,EACjB,MAAM,oBAAoB,CAAC;AAmB5B,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAW5D;AAED,mDAAmD;AACnD,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,UAElC;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,yCAAyC,CAAC;AAExE,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,UAI7C;AAiED;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,QA8BpB,CAAC;AAET,wBAAgB,YAAY,CACxB,QAAQ,EAAE,aAAa,EAAE,EACzB,OAAO,GAAE,OAAyB,WAMrC;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CACzB,QAAQ,EAAE,aAAa,EAAE,EACzB,SAAS,EAAE,SAAS,GACrB,MAAM,CA6GR;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,aAAa,EAAE,mBAErD"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { isBand, resolveStyle, rootStyleToCss, splitBand, styleToCss, } from "@/lib/editor/style";
|
|
2
|
+
import { baseOf, cascadeOf, DEFAULT_CASCADE, mediaPlan, } from "@/lib/editor/cascade";
|
|
3
|
+
import { childrenOf } from "@/lib/editor/tree";
|
|
4
|
+
/** Properties that take a raw number rather than pixels. */
|
|
5
|
+
const UNITLESS = new Set([
|
|
6
|
+
"opacity",
|
|
7
|
+
"zIndex",
|
|
8
|
+
"flexGrow",
|
|
9
|
+
"flexShrink",
|
|
10
|
+
"flexBasis",
|
|
11
|
+
"lineHeight",
|
|
12
|
+
"order",
|
|
13
|
+
"fontWeight",
|
|
14
|
+
"columns",
|
|
15
|
+
]);
|
|
16
|
+
function kebab(property) {
|
|
17
|
+
return property.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);
|
|
18
|
+
}
|
|
19
|
+
export function declarationsToCss(css) {
|
|
20
|
+
return Object.entries(css)
|
|
21
|
+
.filter(([, value]) => value !== undefined && value !== null && value !== "")
|
|
22
|
+
.map(([property, value]) => {
|
|
23
|
+
const rendered = typeof value === "number" && !UNITLESS.has(property)
|
|
24
|
+
? `${value}px`
|
|
25
|
+
: String(value);
|
|
26
|
+
return `${kebab(property)}:${rendered}`;
|
|
27
|
+
})
|
|
28
|
+
.join(";");
|
|
29
|
+
}
|
|
30
|
+
/** A CSS-identifier-safe class for one element. */
|
|
31
|
+
export function classFor(id) {
|
|
32
|
+
return `pg-${id.replace(/[^a-zA-Z0-9_-]/g, "-")}`;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* "inherit" means "the page default" — which on a published page is a neutral
|
|
36
|
+
* system stack, not whatever the surrounding app happens to set.
|
|
37
|
+
*/
|
|
38
|
+
export const DEFAULT_PAGE_FONT = "ui-sans-serif, system-ui, sans-serif";
|
|
39
|
+
export function resolveFont(fontFamily) {
|
|
40
|
+
return fontFamily === "inherit" || fontFamily === ""
|
|
41
|
+
? DEFAULT_PAGE_FONT
|
|
42
|
+
: fontFamily;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Breakpoints are emitted as real media queries so a published page responds
|
|
46
|
+
* to the viewport rather than to whatever the editor was previewing.
|
|
47
|
+
*/
|
|
48
|
+
/**
|
|
49
|
+
* The rules for one element. A full-bleed band produces two: the shell that
|
|
50
|
+
* spans the viewport and the inner box that holds the content width.
|
|
51
|
+
*/
|
|
52
|
+
function rulesFor(element, byId, breakpoint, rootStyle, cascade) {
|
|
53
|
+
const parent = element.parentId ? byId.get(element.parentId) : undefined;
|
|
54
|
+
const parentStyle = parent ? resolveStyle(parent, breakpoint, cascade) : undefined;
|
|
55
|
+
const style = resolveStyle(element, breakpoint, cascade);
|
|
56
|
+
const css = styleToCss(style, {
|
|
57
|
+
parentLayout: parentStyle?.layout ?? "stack",
|
|
58
|
+
parentDirection: parentStyle?.direction ?? "column",
|
|
59
|
+
}, element);
|
|
60
|
+
css.zIndex = element.z;
|
|
61
|
+
if (style.hidden)
|
|
62
|
+
css.display = "none";
|
|
63
|
+
if (!isBand(element.type, style, rootStyle) || style.hidden) {
|
|
64
|
+
return [["", declarationsToCss(css)]];
|
|
65
|
+
}
|
|
66
|
+
const { shell, inner } = splitBand(css, rootStyle.maxWidth);
|
|
67
|
+
return [
|
|
68
|
+
["", declarationsToCss(shell)],
|
|
69
|
+
[">.pg-inner", declarationsToCss(inner)],
|
|
70
|
+
];
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Entrance keyframes animate `translate`/`scale` rather than `transform`, so
|
|
74
|
+
* they compose with an element's own rotation or scale instead of clobbering
|
|
75
|
+
* it. Emitted once, only when some element actually uses an entrance.
|
|
76
|
+
*/
|
|
77
|
+
const ENTRANCE_KEYFRAMES = `
|
|
78
|
+
@keyframes pg-fade{from{opacity:0}to{opacity:1}}
|
|
79
|
+
@keyframes pg-up{from{opacity:0;translate:0 28px}to{opacity:1;translate:none}}
|
|
80
|
+
@keyframes pg-down{from{opacity:0;translate:0 -28px}to{opacity:1;translate:none}}
|
|
81
|
+
@keyframes pg-left{from{opacity:0;translate:-32px 0}to{opacity:1;translate:none}}
|
|
82
|
+
@keyframes pg-right{from{opacity:0;translate:32px 0}to{opacity:1;translate:none}}
|
|
83
|
+
@keyframes pg-zoom{from{opacity:0;scale:.94}to{opacity:1;scale:none}}
|
|
84
|
+
/* The hidden start state is applied only once the script is running, so a
|
|
85
|
+
visitor without JavaScript still sees every element. */
|
|
86
|
+
.pg-ready .pg-anim{opacity:0}
|
|
87
|
+
/* Revealed elements are visible as a resting value, not only as the end of a
|
|
88
|
+
keyframe: if animations are disabled or never get to run, the content still
|
|
89
|
+
shows rather than staying at zero opacity. */
|
|
90
|
+
.pg-ready .pg-anim.pg-in{opacity:1}
|
|
91
|
+
@media (prefers-reduced-motion:reduce){.pg-ready .pg-anim{opacity:1;animation:none!important}}
|
|
92
|
+
`.trim();
|
|
93
|
+
/**
|
|
94
|
+
* The reveal script; static, with no interpolated content.
|
|
95
|
+
*
|
|
96
|
+
* Hiding content until a callback fires is a risky trade on a public page, so
|
|
97
|
+
* this fails open three ways: whatever is already on screen is revealed
|
|
98
|
+
* synchronously, anything still hidden is revealed after a timeout, and the
|
|
99
|
+
* whole hidden state is skipped when IntersectionObserver or motion
|
|
100
|
+
* preferences say so.
|
|
101
|
+
*/
|
|
102
|
+
export const ENTRANCE_SCRIPT = `
|
|
103
|
+
(function(){
|
|
104
|
+
var nodes=document.querySelectorAll('.pg-anim');
|
|
105
|
+
if(!nodes.length)return;
|
|
106
|
+
var reveal=function(n){n.classList.add('pg-in');};
|
|
107
|
+
var all=function(){for(var i=0;i<nodes.length;i++)reveal(nodes[i]);};
|
|
108
|
+
|
|
109
|
+
if(!('IntersectionObserver' in window)||!window.matchMedia||matchMedia('(prefers-reduced-motion:reduce)').matches){
|
|
110
|
+
all();return;
|
|
111
|
+
}
|
|
112
|
+
document.documentElement.classList.add('pg-ready');
|
|
113
|
+
|
|
114
|
+
// Anything already in view animates straight away rather than waiting for
|
|
115
|
+
// the observer's first delivery.
|
|
116
|
+
var pending=[];
|
|
117
|
+
for(var i=0;i<nodes.length;i++){
|
|
118
|
+
var r=nodes[i].getBoundingClientRect();
|
|
119
|
+
if(r.top<innerHeight&&r.bottom>0)reveal(nodes[i]);else pending.push(nodes[i]);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
var io=new IntersectionObserver(function(entries){
|
|
123
|
+
for(var j=0;j<entries.length;j++){
|
|
124
|
+
if(entries[j].isIntersecting){reveal(entries[j].target);io.unobserve(entries[j].target);}
|
|
125
|
+
}
|
|
126
|
+
},{threshold:0.15,rootMargin:'0px 0px -8% 0px'});
|
|
127
|
+
for(var k=0;k<pending.length;k++)io.observe(pending[k]);
|
|
128
|
+
|
|
129
|
+
// Last resort: never leave content invisible because a callback did not run.
|
|
130
|
+
setTimeout(all,3000);
|
|
131
|
+
})();
|
|
132
|
+
`.trim();
|
|
133
|
+
export function hasEntrances(elements, cascade = DEFAULT_CASCADE) {
|
|
134
|
+
const baseId = baseOf(cascade).id;
|
|
135
|
+
return elements.some((el) => resolveStyle(el, baseId, cascade).entrance !== "none");
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Builds the stylesheet for a published document: one base rule per element,
|
|
139
|
+
* plus a media block for each breakpoint that actually overrides something,
|
|
140
|
+
* plus hover rules.
|
|
141
|
+
*/
|
|
142
|
+
export function stylesheetFor(elements, rootStyle) {
|
|
143
|
+
const byId = new Map(elements.map((el) => [el.id, el]));
|
|
144
|
+
const cascade = cascadeOf(rootStyle.breakpoints, rootStyle.baseBreakpointId);
|
|
145
|
+
const baseId = baseOf(cascade).id;
|
|
146
|
+
const parts = [];
|
|
147
|
+
for (const font of rootStyle.customFonts ?? []) {
|
|
148
|
+
const family = font.name.replace(/["'{};]/g, "");
|
|
149
|
+
const rawUrl = font.url.replace(/["'()\\]/g, "");
|
|
150
|
+
const url = rawUrl === "/fonts/manrope-variable.woff2"
|
|
151
|
+
? "/api/pagiera/assets/manrope-variable.woff2"
|
|
152
|
+
: rawUrl;
|
|
153
|
+
parts.push(`@font-face{font-family:"${family}";src:url("${url}") format("woff2");font-weight:${font.weight};font-style:${font.style};font-display:swap}`);
|
|
154
|
+
}
|
|
155
|
+
// The published page lives inside the app's root layout, which paints its
|
|
156
|
+
// own theme background on <body>. Take that over, or the area beside a
|
|
157
|
+
// width-capped page shows the editor's chrome colour rather than the
|
|
158
|
+
// page's own background.
|
|
159
|
+
parts.push(`html,body{margin:0;padding:0;background:${rootStyle.bg}}`);
|
|
160
|
+
parts.push(`html{scroll-behavior:smooth}.pg-root{${declarationsToCss(rootStyleToCss(rootStyle))}}`);
|
|
161
|
+
parts.push(
|
|
162
|
+
// The font is pinned on `.pg-root` rather than on <body>: the app's
|
|
163
|
+
// layout puts a font class on <body>, which would out-specify an
|
|
164
|
+
// element selector and leak the editor's typeface into the site.
|
|
165
|
+
// The shell spans the viewport; the content width is applied by each
|
|
166
|
+
// band's inner box, so section backgrounds reach both edges.
|
|
167
|
+
`.pg-root{font-family:${resolveFont(rootStyle.fontFamily)}}` +
|
|
168
|
+
".pg-node{box-sizing:border-box}" +
|
|
169
|
+
".pg-node img{display:block;width:100%;height:100%}" +
|
|
170
|
+
".pg-link{text-decoration:none;color:inherit}");
|
|
171
|
+
for (const element of elements) {
|
|
172
|
+
const emitted = rulesFor(element, byId, baseId, rootStyle, cascade)
|
|
173
|
+
.map(([suffix, decl]) => `.${classFor(element.id)}${suffix}{${decl}}`)
|
|
174
|
+
.join("");
|
|
175
|
+
parts.push(emitted);
|
|
176
|
+
}
|
|
177
|
+
for (const plan of mediaPlan(cascade)) {
|
|
178
|
+
const breakpoint = plan.id;
|
|
179
|
+
// A parent switching layout at this breakpoint changes how its children
|
|
180
|
+
// position themselves, so re-emit descendants of any changed container.
|
|
181
|
+
const affected = elements.filter((el) => {
|
|
182
|
+
if (el.overrides?.[breakpoint])
|
|
183
|
+
return true;
|
|
184
|
+
const parent = el.parentId ? byId.get(el.parentId) : undefined;
|
|
185
|
+
return Boolean(parent?.overrides?.[breakpoint]);
|
|
186
|
+
});
|
|
187
|
+
if (affected.length === 0)
|
|
188
|
+
continue;
|
|
189
|
+
const rules = affected
|
|
190
|
+
.flatMap((el) => rulesFor(el, byId, breakpoint, rootStyle, cascade).map(([suffix, decl]) => `.${classFor(el.id)}${suffix}{${decl}}`))
|
|
191
|
+
.join("");
|
|
192
|
+
parts.push(`@media ${plan.query}{${rules}}`);
|
|
193
|
+
}
|
|
194
|
+
if (hasEntrances(elements, cascade)) {
|
|
195
|
+
parts.push(ENTRANCE_KEYFRAMES);
|
|
196
|
+
for (const element of elements) {
|
|
197
|
+
const style = resolveStyle(element, baseId, cascade);
|
|
198
|
+
if (style.entrance === "none")
|
|
199
|
+
continue;
|
|
200
|
+
parts.push(`.pg-ready .${classFor(element.id)}.pg-in{` +
|
|
201
|
+
`animation:pg-${style.entrance} ${style.entranceDuration}ms ` +
|
|
202
|
+
`${style.entranceCurve === "spring" ? `cubic-bezier(.16,${1 + Math.max(0, 45 - style.springDamping) / 100},${Math.max(0.12, Math.min(0.52, 120 / style.springStiffness))},1)` : `cubic-bezier(${style.entranceBezier})`} ${style.entranceDelay}ms both}`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
for (const element of elements) {
|
|
206
|
+
if (element.hover || element.press)
|
|
207
|
+
parts.push(`.${classFor(element.id)}{transition:transform .42s cubic-bezier(.16,1,.3,1),scale .42s cubic-bezier(.16,1,.3,1),rotate .42s cubic-bezier(.16,1,.3,1),translate .42s cubic-bezier(.16,1,.3,1),background-color .32s ease,color .32s ease,border-color .32s ease,box-shadow .42s cubic-bezier(.16,1,.3,1),opacity .32s ease,filter .42s ease;will-change:transform}`);
|
|
208
|
+
if (!element.hover || Object.keys(element.hover).length === 0)
|
|
209
|
+
continue;
|
|
210
|
+
const merged = { ...resolveStyle(element, baseId, cascade), ...element.hover };
|
|
211
|
+
const parent = element.parentId ? byId.get(element.parentId) : undefined;
|
|
212
|
+
const parentStyle = parent ? resolveStyle(parent, baseId, cascade) : undefined;
|
|
213
|
+
const css = styleToCss(merged, {
|
|
214
|
+
parentLayout: parentStyle?.layout ?? "stack",
|
|
215
|
+
parentDirection: parentStyle?.direction ?? "column",
|
|
216
|
+
}, element);
|
|
217
|
+
parts.push(`.${classFor(element.id)}:hover{${declarationsToCss(css)}}`);
|
|
218
|
+
}
|
|
219
|
+
for (const element of elements) {
|
|
220
|
+
if (element.press && Object.keys(element.press).length) {
|
|
221
|
+
const merged = { ...resolveStyle(element, baseId, cascade), ...element.press };
|
|
222
|
+
const parent = element.parentId ? byId.get(element.parentId) : undefined;
|
|
223
|
+
const parentStyle = parent ? resolveStyle(parent, baseId, cascade) : undefined;
|
|
224
|
+
const css = styleToCss(merged, { parentLayout: parentStyle?.layout ?? "stack", parentDirection: parentStyle?.direction ?? "column" }, element);
|
|
225
|
+
parts.push(`.${classFor(element.id)}:active{${declarationsToCss(css)}}`);
|
|
226
|
+
}
|
|
227
|
+
if (element.loop) {
|
|
228
|
+
const name = element.loop.type;
|
|
229
|
+
parts.push(`.${classFor(element.id)}{animation:pg-loop-${name} ${element.loop.duration}ms ease-in-out infinite}`);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
if (elements.some((element) => element.loop))
|
|
233
|
+
parts.push(`@keyframes pg-loop-pulse{0%,100%{scale:1}50%{scale:1.06}}@keyframes pg-loop-float{0%,100%{translate:0 0}50%{translate:0 -12px}}@keyframes pg-loop-spin{to{rotate:360deg}}@media(prefers-reduced-motion:reduce){.pg-node{animation:none!important}}`);
|
|
234
|
+
return parts.join("\n");
|
|
235
|
+
}
|
|
236
|
+
export function rootChildren(elements) {
|
|
237
|
+
return childrenOf(elements, undefined);
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css.js","sourceRoot":"","sources":["../../../../src/internal/lib/render/css.ts"],"names":[],"mappings":"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"}
|