@paroicms/site-generator-plugin 0.10.0 → 0.12.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/gen-backend/dist/generator/fake-content-generator/content-report.js +81 -0
- package/gen-backend/dist/generator/fake-content-generator/create-database-with-fake-content.js +80 -0
- package/gen-backend/dist/generator/fake-content-generator/fill-nodels.js +115 -0
- package/gen-backend/dist/generator/fake-content-generator/fill-site-fields.js +63 -0
- package/gen-backend/dist/generator/fake-content-generator/fill-taxonomy-fields.js +57 -0
- package/gen-backend/dist/generator/site-generator/site-generator.js +1 -1
- package/gen-backend/dist/generator/site-schema-generator/create-site-schema.js +5 -0
- package/gen-backend/dist/lib/create-raw-context.js +2 -2
- package/gen-backend/prompts/initial-1-analysis.md +3 -1
- package/gen-front/dist/gen-front.css +1 -1
- package/gen-front/dist/gen-front.mjs +45 -56
- package/package.json +10 -8
- package/gen-backend/dist/generator/fake-content-generator.ts/content-report.js +0 -15
- package/gen-backend/dist/generator/fake-content-generator.ts/create-database-with-fake-content.js +0 -238
- /package/gen-backend/dist/generator/{fake-content-generator.ts → fake-content-generator}/content-helpers.js +0 -0
- /package/gen-backend/dist/generator/{fake-content-generator.ts → fake-content-generator}/create-node-contents.js +0 -0
- /package/gen-backend/dist/generator/{fake-content-generator.ts → fake-content-generator}/fake-content-types.js +0 -0
- /package/gen-backend/dist/generator/{fake-content-generator.ts → fake-content-generator}/generate-fake-content.js +0 -0
- /package/gen-backend/dist/generator/{fake-content-generator.ts → fake-content-generator}/invoke-generate-fake-content.js +0 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
export function createGeneratedContentReport() {
|
|
2
|
+
let totalEntryCount = 0;
|
|
3
|
+
const llmReports = [];
|
|
4
|
+
const internalIds = {};
|
|
5
|
+
const childNodeIds = new Map();
|
|
6
|
+
return {
|
|
7
|
+
getResults() {
|
|
8
|
+
return {
|
|
9
|
+
entryCount: totalEntryCount,
|
|
10
|
+
llmReports,
|
|
11
|
+
idPicker: createIdPicker(internalIds, childNodeIds),
|
|
12
|
+
};
|
|
13
|
+
},
|
|
14
|
+
add(entryCount, llmReport) {
|
|
15
|
+
totalEntryCount += entryCount;
|
|
16
|
+
if (llmReport) {
|
|
17
|
+
llmReports.push(llmReport);
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
addId({ typeName, id: idOrIds, parentNodeId }) {
|
|
21
|
+
for (const { language, nodeId } of Array.isArray(idOrIds) ? idOrIds : [idOrIds]) {
|
|
22
|
+
let languageDict = internalIds[language];
|
|
23
|
+
if (!languageDict) {
|
|
24
|
+
languageDict = {};
|
|
25
|
+
internalIds[language] = languageDict;
|
|
26
|
+
}
|
|
27
|
+
let nodeIds = languageDict[typeName];
|
|
28
|
+
if (!nodeIds) {
|
|
29
|
+
nodeIds = new Set();
|
|
30
|
+
languageDict[typeName] = nodeIds;
|
|
31
|
+
}
|
|
32
|
+
nodeIds.add(nodeId);
|
|
33
|
+
if (parentNodeId !== undefined) {
|
|
34
|
+
let childIds = childNodeIds.get(parentNodeId);
|
|
35
|
+
if (!childIds) {
|
|
36
|
+
childIds = new Set();
|
|
37
|
+
childNodeIds.set(parentNodeId, childIds);
|
|
38
|
+
}
|
|
39
|
+
childIds.add(nodeId);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function createIdPicker(ids, childNodeIds) {
|
|
46
|
+
const getNodeIdsByLanguageAndType = (language, typeName) => {
|
|
47
|
+
const languageDict = ids[language];
|
|
48
|
+
if (!languageDict)
|
|
49
|
+
return [];
|
|
50
|
+
const nodeIds = languageDict[typeName];
|
|
51
|
+
if (!nodeIds)
|
|
52
|
+
return [];
|
|
53
|
+
return Array.from(nodeIds);
|
|
54
|
+
};
|
|
55
|
+
const getNodeIdsByType = (typeName) => {
|
|
56
|
+
const nodeIds = new Set();
|
|
57
|
+
for (const language of Object.keys(ids)) {
|
|
58
|
+
const found = getNodeIdsByLanguageAndType(language, typeName);
|
|
59
|
+
found.forEach((id) => nodeIds.add(id));
|
|
60
|
+
}
|
|
61
|
+
return Array.from(nodeIds);
|
|
62
|
+
};
|
|
63
|
+
const getNodeIdsByParent = (parentNodeId) => {
|
|
64
|
+
const nodeIds = childNodeIds.get(parentNodeId);
|
|
65
|
+
if (!nodeIds)
|
|
66
|
+
return [];
|
|
67
|
+
return Array.from(nodeIds);
|
|
68
|
+
};
|
|
69
|
+
const picker = {
|
|
70
|
+
pickNodeIds(selector, count) {
|
|
71
|
+
const nodeIds = "typeName" in selector
|
|
72
|
+
? getNodeIdsByType(selector.typeName)
|
|
73
|
+
: getNodeIdsByParent(selector.parentNodeId);
|
|
74
|
+
if (count === undefined || nodeIds.length <= count)
|
|
75
|
+
return nodeIds;
|
|
76
|
+
const shuffled = [...nodeIds].sort(() => Math.random() - 0.5);
|
|
77
|
+
return shuffled.slice(0, count);
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
return picker;
|
|
81
|
+
}
|
package/gen-backend/dist/generator/fake-content-generator/create-database-with-fake-content.js
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { getPartTypeByName, getRegularDocumentTypeByName, getRoutingDocumentTypeByName, } from "@paroicms/internal-anywhere-lib";
|
|
2
|
+
import { createSimpleTranslator, } from "@paroicms/public-server-lib";
|
|
3
|
+
import { updateGeneratedSiteStepSetAsCompleted, } from "../../db/db-write.queries.js";
|
|
4
|
+
import { createTaskCollector } from "../lib/tasks.js";
|
|
5
|
+
import { createGeneratedContentReport } from "./content-report.js";
|
|
6
|
+
import { addParts, addRegularDocuments, updateRoutingDocument } from "./fill-nodels.js";
|
|
7
|
+
import { updateSiteFields } from "./fill-site-fields.js";
|
|
8
|
+
import { updateNodelsWithTaxonomies } from "./fill-taxonomy-fields.js";
|
|
9
|
+
export async function fillSiteWithFakeContent(ctx, stepHandle, { regSite, localizedValues }) {
|
|
10
|
+
const { service } = ctx;
|
|
11
|
+
const { fqdn } = regSite;
|
|
12
|
+
const report = createGeneratedContentReport();
|
|
13
|
+
const { siteSchema, siteIds } = await service.connector.loadSiteSchemaAndIds(fqdn);
|
|
14
|
+
const schemaI18n = createSimpleTranslator({
|
|
15
|
+
labels: siteSchema.l10n,
|
|
16
|
+
logger: ctx.logger,
|
|
17
|
+
});
|
|
18
|
+
await updateSiteFields(ctx, report, { fqdn, siteSchema, siteTitle: localizedValues.siteTitle });
|
|
19
|
+
const tasks = createTaskCollector(ctx);
|
|
20
|
+
fillRoutingDocumentAndAddChildren(ctx, tasks, report, {
|
|
21
|
+
fqdn,
|
|
22
|
+
siteSchema,
|
|
23
|
+
schemaI18n,
|
|
24
|
+
}, {
|
|
25
|
+
routingIds: siteIds.homeIds,
|
|
26
|
+
nodeType: siteSchema.nodeTypes.home,
|
|
27
|
+
});
|
|
28
|
+
const { promise } = tasks.runAll({ maxParallel: 10, rateLimitPerSecond: 3 });
|
|
29
|
+
const { doneCount, errorMessages } = await promise;
|
|
30
|
+
const results = report.getResults();
|
|
31
|
+
await updateNodelsWithTaxonomies(ctx, {
|
|
32
|
+
siteSchema,
|
|
33
|
+
idPicker: results.idPicker,
|
|
34
|
+
fqdn,
|
|
35
|
+
});
|
|
36
|
+
if (errorMessages.length > 0) {
|
|
37
|
+
ctx.logger.warn(`Failed to generate documents:\n - ${errorMessages.join("\n - ")}`);
|
|
38
|
+
}
|
|
39
|
+
ctx.logger.debug(`… Executed ${doneCount} generating tasks`);
|
|
40
|
+
await updateGeneratedSiteStepSetAsCompleted(ctx, stepHandle, {
|
|
41
|
+
status: "completed",
|
|
42
|
+
contentEntryCount: results.entryCount,
|
|
43
|
+
contentInputTokenCount: results.llmReports.reduce((acc, r) => acc + r.inputTokenCount, 0),
|
|
44
|
+
contentOutputTokenCount: results.llmReports.reduce((acc, r) => acc + (r.outputTokenCount ?? 0), 0),
|
|
45
|
+
contentErrors: errorMessages.length > 0 ? errorMessages.join("\n - ") : null,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
function fillRoutingDocumentAndAddChildren(ctx, tasks, report, siteOptions, nodeOptions) {
|
|
49
|
+
const { routingIds, nodeType } = nodeOptions;
|
|
50
|
+
const { siteSchema } = siteOptions;
|
|
51
|
+
tasks.add(() => updateRoutingDocument(ctx, report, siteOptions, nodeOptions));
|
|
52
|
+
for (const listType of nodeType.lists ?? []) {
|
|
53
|
+
for (const typeName of listType.parts) {
|
|
54
|
+
const partType = getPartTypeByName(siteSchema, typeName);
|
|
55
|
+
tasks.add(() => addParts(ctx, report, siteOptions, {
|
|
56
|
+
parentNodeId: routingIds.nodeId,
|
|
57
|
+
nodeType: partType,
|
|
58
|
+
documentType: nodeType,
|
|
59
|
+
}));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
for (const typeName of nodeType.routingChildren ?? []) {
|
|
63
|
+
const childType = getRoutingDocumentTypeByName(siteSchema, typeName);
|
|
64
|
+
const childIds = routingIds.children?.[typeName];
|
|
65
|
+
if (!childIds)
|
|
66
|
+
throw new Error(`Missing childIds for ${typeName}`);
|
|
67
|
+
fillRoutingDocumentAndAddChildren(ctx, tasks, report, siteOptions, {
|
|
68
|
+
routingIds: childIds,
|
|
69
|
+
nodeType: childType,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
for (const typeName of nodeType.regularChildren ?? []) {
|
|
73
|
+
const childType = getRegularDocumentTypeByName(siteSchema, typeName);
|
|
74
|
+
tasks.add(() => addRegularDocuments(ctx, report, siteOptions, {
|
|
75
|
+
parentNodeId: routingIds.nodeId,
|
|
76
|
+
nodeType: childType,
|
|
77
|
+
documentType: childType,
|
|
78
|
+
}));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { dedupMessages } from "./content-helpers.js";
|
|
2
|
+
import { generateFieldSetContent, generateMultipleFieldSetContents, } from "./generate-fake-content.js";
|
|
3
|
+
export async function updateRoutingDocument(ctx, report, siteOptions, nodeOptions) {
|
|
4
|
+
ctx.logger.debug(`[TASK] Updating routing document "${nodeOptions.nodeType.typeName}"…`);
|
|
5
|
+
const { routingIds, nodeType } = nodeOptions;
|
|
6
|
+
const { fqdn, siteSchema, schemaI18n } = siteOptions;
|
|
7
|
+
const content = await generateFieldSetContent(ctx, {
|
|
8
|
+
nodeType,
|
|
9
|
+
documentType: nodeType,
|
|
10
|
+
siteSchema,
|
|
11
|
+
schemaI18n,
|
|
12
|
+
withTitle: false,
|
|
13
|
+
llmTaskName: nodeType.kebabName,
|
|
14
|
+
}, report);
|
|
15
|
+
await ctx.service.connector.updateNodeContent(fqdn, {
|
|
16
|
+
nodeId: routingIds.nodeId,
|
|
17
|
+
content: toRiDocumentContent(content, nodeType),
|
|
18
|
+
});
|
|
19
|
+
for (const language of siteSchema.languages) {
|
|
20
|
+
report.addId({
|
|
21
|
+
typeName: nodeType.typeName,
|
|
22
|
+
id: {
|
|
23
|
+
nodeId: routingIds.nodeId,
|
|
24
|
+
language,
|
|
25
|
+
},
|
|
26
|
+
parentNodeId: undefined,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export async function addRegularDocuments(ctx, report, siteOptions, nodeOptions) {
|
|
31
|
+
ctx.logger.debug(`[TASK] Adding regular documents "${nodeOptions.nodeType.typeName}"…`);
|
|
32
|
+
const { parentNodeId, nodeType, documentType } = nodeOptions;
|
|
33
|
+
const { fqdn, siteSchema, schemaI18n } = siteOptions;
|
|
34
|
+
const tolerateErrors = {
|
|
35
|
+
errorMessages: [],
|
|
36
|
+
};
|
|
37
|
+
const list = await generateMultipleFieldSetContents(ctx, {
|
|
38
|
+
siteSchema,
|
|
39
|
+
nodeType,
|
|
40
|
+
documentType,
|
|
41
|
+
schemaI18n,
|
|
42
|
+
count: getDefaultNodeContentCount(nodeType),
|
|
43
|
+
withTitle: true,
|
|
44
|
+
tolerateErrors,
|
|
45
|
+
llmTaskName: nodeType.kebabName,
|
|
46
|
+
}, report);
|
|
47
|
+
const errorMessages = dedupMessages(tolerateErrors.errorMessages);
|
|
48
|
+
if (errorMessages.length > 0) {
|
|
49
|
+
ctx.logger.warn(`Error generating content for ${nodeType.typeName}:\n - ${errorMessages.join("\n - ")}`);
|
|
50
|
+
}
|
|
51
|
+
const insertedIds = await ctx.service.connector.addMultipleDocumentContents(fqdn, {
|
|
52
|
+
parentNodeId,
|
|
53
|
+
contents: list.map((content) => toRiDocumentContent(content, nodeType)),
|
|
54
|
+
});
|
|
55
|
+
report.addId({ typeName: nodeType.typeName, id: insertedIds, parentNodeId });
|
|
56
|
+
}
|
|
57
|
+
export async function addParts(ctx, report, siteOptions, nodeOptions) {
|
|
58
|
+
ctx.logger.debug(`[TASK] Adding parts "${nodeOptions.nodeType.typeName}"…`);
|
|
59
|
+
const { parentNodeId, nodeType, documentType } = nodeOptions;
|
|
60
|
+
const { fqdn, siteSchema, schemaI18n } = siteOptions;
|
|
61
|
+
const tolerateErrors = {
|
|
62
|
+
errorMessages: [],
|
|
63
|
+
};
|
|
64
|
+
const list = await generateMultipleFieldSetContents(ctx, {
|
|
65
|
+
siteSchema,
|
|
66
|
+
nodeType,
|
|
67
|
+
documentType,
|
|
68
|
+
schemaI18n,
|
|
69
|
+
count: getDefaultNodeContentCount(nodeType),
|
|
70
|
+
withTitle: true,
|
|
71
|
+
tolerateErrors,
|
|
72
|
+
llmTaskName: nodeType.kebabName,
|
|
73
|
+
}, report);
|
|
74
|
+
const errorMessages = dedupMessages(tolerateErrors.errorMessages);
|
|
75
|
+
if (errorMessages.length > 0) {
|
|
76
|
+
ctx.logger.warn(`Error generating content for ${nodeType.typeName}:\n - ${errorMessages.join("\n - ")}`);
|
|
77
|
+
}
|
|
78
|
+
const insertedIds = await ctx.service.connector.addMultiplePartContents(fqdn, {
|
|
79
|
+
parentNodeId,
|
|
80
|
+
contents: list.map((content) => toRiPartContent(content, nodeType)),
|
|
81
|
+
});
|
|
82
|
+
report.addId({ typeName: nodeType.typeName, id: insertedIds, parentNodeId });
|
|
83
|
+
}
|
|
84
|
+
function toRiDocumentContent(content, nodeType) {
|
|
85
|
+
const { title, fields, featuredImage } = content;
|
|
86
|
+
return {
|
|
87
|
+
kind: "document",
|
|
88
|
+
typeName: nodeType.typeName,
|
|
89
|
+
title,
|
|
90
|
+
featuredImage,
|
|
91
|
+
fields,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function toRiPartContent(content, nodeType) {
|
|
95
|
+
const { fields } = content;
|
|
96
|
+
return {
|
|
97
|
+
kind: "part",
|
|
98
|
+
typeName: nodeType.typeName,
|
|
99
|
+
fields,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function getDefaultNodeContentCount(nodeType) {
|
|
103
|
+
if (nodeType.kind === "site")
|
|
104
|
+
throw new Error("Cannot generate content for site node type");
|
|
105
|
+
if (nodeType.kind === "document") {
|
|
106
|
+
if (nodeType.documentKind === "routing")
|
|
107
|
+
return 1;
|
|
108
|
+
if (nodeType.route === ":yyyy/:mm/:dd/:relativeId-:slug")
|
|
109
|
+
return 14; // 4
|
|
110
|
+
return 8; // 2
|
|
111
|
+
}
|
|
112
|
+
if (nodeType.kind === "part")
|
|
113
|
+
return 8; // 2
|
|
114
|
+
throw new Error(`Unknown node type kind: ${nodeType.kind}`);
|
|
115
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { getRandomImagePath } from "../lib/images-lib.js";
|
|
2
|
+
import { generateLocalizedFooterMention } from "./create-node-contents.js";
|
|
3
|
+
export async function updateSiteFields(ctx, _report, options) {
|
|
4
|
+
const { service, logger } = ctx;
|
|
5
|
+
logger.debug("Updating site fields…");
|
|
6
|
+
const { fqdn, siteSchema, siteTitle } = options;
|
|
7
|
+
const siteType = siteSchema.nodeTypes._site;
|
|
8
|
+
const logoImageFile = getRandomImagePath();
|
|
9
|
+
const fields = [
|
|
10
|
+
[
|
|
11
|
+
"title",
|
|
12
|
+
{
|
|
13
|
+
dataType: "string",
|
|
14
|
+
localized: true,
|
|
15
|
+
value: siteTitle,
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
[
|
|
19
|
+
"favicon",
|
|
20
|
+
{
|
|
21
|
+
dataType: "media",
|
|
22
|
+
localized: false,
|
|
23
|
+
value: {
|
|
24
|
+
file: logoImageFile,
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
[
|
|
29
|
+
"ogImage",
|
|
30
|
+
{
|
|
31
|
+
dataType: "media",
|
|
32
|
+
localized: false,
|
|
33
|
+
value: {
|
|
34
|
+
file: logoImageFile,
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
];
|
|
39
|
+
if (siteType.fields.some((f) => f.name === "logo")) {
|
|
40
|
+
fields.push([
|
|
41
|
+
"logo",
|
|
42
|
+
{
|
|
43
|
+
dataType: "media",
|
|
44
|
+
localized: false,
|
|
45
|
+
value: {
|
|
46
|
+
file: logoImageFile,
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
]);
|
|
50
|
+
}
|
|
51
|
+
if (siteType.fields.some((f) => f.name === "footerMention")) {
|
|
52
|
+
fields.push([
|
|
53
|
+
"footerMention",
|
|
54
|
+
{
|
|
55
|
+
dataType: "json",
|
|
56
|
+
localized: true,
|
|
57
|
+
value: generateLocalizedFooterMention(siteSchema),
|
|
58
|
+
},
|
|
59
|
+
]);
|
|
60
|
+
}
|
|
61
|
+
await service.connector.updateSiteFields(fqdn, Object.fromEntries(fields));
|
|
62
|
+
logger.debug("… Site fields updated");
|
|
63
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export async function updateNodelsWithTaxonomies(ctx, options) {
|
|
2
|
+
const { service } = ctx;
|
|
3
|
+
const { siteSchema, idPicker, fqdn } = options;
|
|
4
|
+
const { nodeTypes } = siteSchema;
|
|
5
|
+
for (const nodeType of Object.values(nodeTypes)) {
|
|
6
|
+
const labelingFields = nodeType.fields?.filter((f) => f.dataType === "labeling");
|
|
7
|
+
if (!labelingFields || labelingFields.length === 0)
|
|
8
|
+
continue;
|
|
9
|
+
await updateLabelingFields(ctx, {
|
|
10
|
+
idPicker,
|
|
11
|
+
fqdn,
|
|
12
|
+
nodeType,
|
|
13
|
+
labelingFields,
|
|
14
|
+
}, service);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
async function updateLabelingFields(ctx, options, service) {
|
|
18
|
+
const { fqdn, nodeType, labelingFields, idPicker } = options;
|
|
19
|
+
if (nodeType.kind !== "document" && nodeType.kind !== "part")
|
|
20
|
+
return;
|
|
21
|
+
const nodeIds = idPicker.pickNodeIds({ typeName: nodeType.typeName });
|
|
22
|
+
for (const nodeId of nodeIds) {
|
|
23
|
+
const fieldValues = [];
|
|
24
|
+
for (const field of labelingFields) {
|
|
25
|
+
const taxonomyIds = idPicker.pickNodeIds({ typeName: field.taxonomy });
|
|
26
|
+
if (taxonomyIds.length !== 1) {
|
|
27
|
+
if (taxonomyIds.length > 1) {
|
|
28
|
+
ctx.logger.warn(`Expected one taxonomy ID for "${field.taxonomy}", got ${taxonomyIds.length}`);
|
|
29
|
+
}
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
const taxonomyNodeId = taxonomyIds[0];
|
|
33
|
+
const max = field.multiple ? Math.floor(Math.random() * 2) + 1 : 1;
|
|
34
|
+
const termNodeIds = idPicker.pickNodeIds({ parentNodeId: taxonomyNodeId }, max);
|
|
35
|
+
if (termNodeIds.length === 0)
|
|
36
|
+
continue;
|
|
37
|
+
fieldValues.push([
|
|
38
|
+
field.name,
|
|
39
|
+
{
|
|
40
|
+
dataType: "labeling",
|
|
41
|
+
localized: false,
|
|
42
|
+
value: { t: termNodeIds },
|
|
43
|
+
},
|
|
44
|
+
]);
|
|
45
|
+
}
|
|
46
|
+
if (fieldValues.length === 0)
|
|
47
|
+
continue;
|
|
48
|
+
await service.connector.updateNodeContent(fqdn, {
|
|
49
|
+
nodeId,
|
|
50
|
+
content: {
|
|
51
|
+
kind: nodeType.kind,
|
|
52
|
+
typeName: nodeType.typeName,
|
|
53
|
+
fields: Object.fromEntries(fieldValues),
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -4,7 +4,7 @@ import { mkdir, writeFile } from "node:fs/promises";
|
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import { loadStep, readStepSchema } from "../../db/db-read.queries.js";
|
|
6
6
|
import { insertStep, saveGeneratedSiteStep, } from "../../db/db-write.queries.js";
|
|
7
|
-
import { fillSiteWithFakeContent } from "../fake-content-generator
|
|
7
|
+
import { fillSiteWithFakeContent } from "../fake-content-generator/create-database-with-fake-content.js";
|
|
8
8
|
import { safeCallStep } from "../lib/session-utils.js";
|
|
9
9
|
import { createTheme } from "./theme-creator.js";
|
|
10
10
|
export async function generateSite(ctx, input) {
|
|
@@ -227,6 +227,11 @@ function toRoutingDocumentNodeType(typeName, saType) {
|
|
|
227
227
|
ogType: saType.ogType,
|
|
228
228
|
route: generateSlug(saType.label),
|
|
229
229
|
withFeaturedImage: typeName !== "home" && !!saType.entryPage,
|
|
230
|
+
backOffice: saType.taxonomy
|
|
231
|
+
? {
|
|
232
|
+
menuPlacement: "popup",
|
|
233
|
+
}
|
|
234
|
+
: undefined,
|
|
230
235
|
};
|
|
231
236
|
}
|
|
232
237
|
function toRegularDocumentNodeType(typeName, saType) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import Anthropic from "@anthropic-ai/sdk";
|
|
2
2
|
import { Mistral } from "@mistralai/mistralai";
|
|
3
|
-
import {
|
|
3
|
+
import { readOrCreateJwtSecretSync } from "@paroicms/internal-server-lib";
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
export function createRawContext(service, options) {
|
|
6
6
|
const { cn, logNextQuery, pluginConf, debugDir } = options;
|
|
@@ -12,7 +12,7 @@ export function createRawContext(service, options) {
|
|
|
12
12
|
return {
|
|
13
13
|
cn,
|
|
14
14
|
logNextQuery,
|
|
15
|
-
jwtSecret:
|
|
15
|
+
jwtSecret: readOrCreateJwtSecretSync(join(service.registeredSite.dataDir, "site-generator-secret.txt")),
|
|
16
16
|
pluginConf,
|
|
17
17
|
debugDir,
|
|
18
18
|
sitesDir,
|
|
@@ -126,6 +126,7 @@ Guidelines for creating the dictionnary YAML:
|
|
|
126
126
|
- confidence: Your confidence level for the accuracy of this node type (0.0-1.0).
|
|
127
127
|
- kind: Can be `routingDocument`, `regularDocument`, `part`.
|
|
128
128
|
- entryPage: A Boolean indicating whether this is one of the very few first pages the visitor lands on (optional, routing document only).
|
|
129
|
+
- taxonomy: A boolean to indicate if this is a taxonomy (optional, routing document only).
|
|
129
130
|
- temporal: A boolean to indicate if there is a temporal nature for this type of node (optional, regular document only).
|
|
130
131
|
- ogType: (optional, and document only) If you think of a particular Open-Graph type for this document, give it here.
|
|
131
132
|
- label: A label of the node type, in the _website language_.
|
|
@@ -199,12 +200,13 @@ post:
|
|
|
199
200
|
tags:
|
|
200
201
|
confidence: 0.9
|
|
201
202
|
kind: routingDocument
|
|
203
|
+
taxonomy: true
|
|
202
204
|
label: Tags
|
|
203
205
|
description: Tags taxonomy for post documents.
|
|
204
206
|
tag:
|
|
205
207
|
confidence: 0.9
|
|
206
208
|
kind: regularDocument
|
|
207
|
-
temporal:
|
|
209
|
+
temporal: false
|
|
208
210
|
label: Tag
|
|
209
211
|
description: A tag is a term in the tags taxonomy.
|
|
210
212
|
</correct_example>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
*,*:before,*:after{box-sizing:border-box}.Text{margin-bottom:.75rem;text-align:justify}.Text p{margin:0 0 .5rem}.Text p:last-child{margin-bottom:0}.Text h1,.Text h2,.Text h3,.Text h4,.Text h5,.Text h6{font-weight:600;line-height:1.2;margin:1.2em 0 .7em}.Text h1{font-size:1.2rem;margin-top:0}.Text h2{font-size:1.1rem}.Text h3{font-size:1rem}.Text ul,.Text ol{margin:.5rem 0 .75rem;padding-left:1.5rem}.Text li{margin-bottom:.3rem}.Text blockquote{margin:.75rem 0;padding:.5rem 1rem;border-left:3px solid #ddd;background-color:#f7f7f7;font-style:italic;color:#555}.Text pre{background-color:#f5f5f5;padding:.75rem;border-radius:4px;overflow-x:auto;margin:.75rem 0}.Text hr{border:0;height:1px;background-color:#ddd;margin:1rem 0}.Text table{border-collapse:collapse;width:100%;margin:.75rem 0}.Text th,.Text td{border:1px solid #ddd;padding:.5rem;text-align:left}.Text th{background-color:#f5f5f5;font-weight:600}.Text,.InlineText{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;line-height:1.4;color:#222}.Text code,.InlineText code{font-family:Courier New,monospace;font-size:.85em;background-color:#eee;padding:.1em .3em;border-radius:3px}.Text a,.Text a:visited,.InlineText a,.InlineText a:visited{color:#3b82f6;text-decoration:none}.Text a:hover,.Text a:visited:hover,.InlineText a:hover,.InlineText a:visited:hover{text-decoration:underline}.Text b,.Text strong,.InlineText b,.InlineText strong{font-weight:600}.Text i,.Text em,.InlineText i,.InlineText em{font-style:italic}.Text small,.InlineText small{font-size:.85em}.Text mark,.InlineText mark{background-color:#ff0;color:#000}.App-content{align-items:center;display:flex;flex-direction:column;justify-content:center;min-height:calc(100vh - 60px);padding-bottom:40px}.App-footer{background-color:#f8f9fa;border-top:1px solid #e9ecef;bottom:0;color:#495057;left:0;padding:1rem;position:fixed;text-align:center;width:100%;z-index:1000}.LanguageSelector{display:flex;justify-content:center;margin-top:.5rem}.LanguageSelector-select{background-color:#fff;border:1px solid #ced4da;border-radius:4px;color:#495057;cursor:pointer;font-size:.85rem;padding:.25rem .5rem;transition:all .2s ease}.LanguageSelector-select:hover,.LanguageSelector-select:focus{border-color:#adb5bd;outline:none}.Panel{background-color:#fff;border:1px solid #dee2e6;border-radius:6px;margin-bottom:1rem;overflow:hidden}.Panel-header{align-items:center;background-color:#f8f9fa;border-bottom:1px solid #dee2e6;cursor:pointer;display:flex;font-weight:600;justify-content:space-between;padding:1rem 1.5rem;-webkit-user-select:none;user-select:none}.Panel-content{padding:1.5rem}.Panel-icon{font-size:1.2rem;transition:transform .2s}.Panel-icon.collapsed{transform:rotate(-90deg)}.Panel.collapsed .Panel-content{display:none}.Layout-row{display:flex;flex-direction:row;flex-wrap:wrap;margin-left:-.5rem;margin-right:-.5rem}.Layout-column{display:flex;flex-direction:column}.Layout-center{align-items:center;display:flex;justify-content:center;min-height:100%}.Layout-container{max-width:1200px;margin:0 auto;padding:0 1rem}.Layout-gap{gap:1rem}.Layout-gap-sm{gap:.5rem}.Layout-gap-lg{gap:1.5rem}.Layout-flex{display:flex}.Layout-grow{flex-grow:1}.Layout-justify-center{justify-content:center}.Layout-justify-between{justify-content:space-between}.Layout-justify-end{justify-content:flex-end}.Layout-align-center{align-items:center}.Layout-align-start{align-items:flex-start}.Layout-align-end{align-items:flex-end}.Layout-wrap{flex-wrap:wrap}.mt-3{margin-top:1rem}.mt-4{margin-top:1.5rem}.mb-3{margin-bottom:1rem}.mb-4{margin-bottom:1.5rem}.my-3{margin-top:1rem;margin-bottom:1rem}.my-4{margin-top:1.5rem;margin-bottom:1.5rem}.p-3{padding:1rem}.p-4{padding:1.5rem}@media (min-width: 768px){.md\:Layout-row{display:flex;flex-direction:row}.md\:Layout-column{display:flex;flex-direction:column}}.Dialog{background-color:#0006;display:flex;height:100%;left:0;opacity:0;pointer-events:none;position:fixed;top:0;transition:opacity .3s;width:100%;z-index:1000}.Dialog.active{opacity:1;pointer-events:auto}.Dialog-container{background-color:#fff;border-radius:6px;box-shadow:0 10px 25px #0003;margin:auto;max-height:90vh;max-width:90vw;overflow:auto;position:relative;transform:translateY(20px);transition:transform .3s;width:500px}.Dialog.active .Dialog-container{transform:translateY(0)}.Dialog-header{align-items:center;border-bottom:1px solid #dee2e6;display:flex;justify-content:space-between;padding:1rem 1.5rem}.Dialog-title{font-size:1.25rem;font-weight:600;margin:0}.Dialog-close{background:none;border:none;cursor:pointer;font-size:1.5rem;height:2rem;line-height:2rem;padding:0;text-align:center;width:2rem}.Dialog-content{padding:1.5rem}.Dialog-footer{border-top:1px solid #dee2e6;display:flex;justify-content:flex-end;padding:1rem 1.5rem;gap:.5rem}.markdown-content{color:#374151;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;font-size:1rem;line-height:1.5}.markdown-content h1,.markdown-content h2,.markdown-content h3,.markdown-content h4,.markdown-content h5,.markdown-content h6{font-weight:600;line-height:1.2;margin:1.25em 0 .75em}.markdown-content h1{font-size:1.5rem;margin-top:0}.markdown-content h2{font-size:1.3rem}.markdown-content h3{font-size:1.1rem}.markdown-content p{margin:0 0 1em}.markdown-content a{color:#3b82f6;text-decoration:none}.markdown-content a:hover{text-decoration:underline}.markdown-content ul,.markdown-content ol{margin:0 0 1em;padding-left:1.5em}.markdown-content li{margin-bottom:.5em}.markdown-content code{background-color:#f3f4f6;border-radius:3px;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:.85em;padding:.2em .4em}.markdown-content pre{background-color:#f3f4f6;border-radius:5px;margin:1em 0;overflow-x:auto;padding:1em}.markdown-content pre code{background-color:transparent;display:block;padding:0}.markdown-content blockquote{border-left:4px solid #e5e7eb;color:#6b7280;font-style:italic;margin:1em 0;padding:0 1em}.markdown-content table{border-collapse:collapse;margin:1em 0;width:100%}.markdown-content th,.markdown-content td{border:1px solid #e5e7eb;padding:.5em;text-align:left}.markdown-content th{background-color:#f9fafb;font-weight:600}.markdown-content img{max-width:100%}.markdown-content hr{border:0;border-top:1px solid #e5e7eb;margin:1.5em 0}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.p-10{padding:2.5rem}.p-12{padding:3rem}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-12{padding-left:3rem;padding-right:3rem}.py-0{padding-top:0;padding-bottom:0}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.pt-0{padding-top:0}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-6{padding-top:1.5rem}.pt-8{padding-top:2rem}.pt-10{padding-top:2.5rem}.pt-12{padding-top:3rem}.pr-0{padding-right:0}.pr-1{padding-right:.25rem}.pr-2{padding-right:.5rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pr-5{padding-right:1.25rem}.pr-6{padding-right:1.5rem}.pr-8{padding-right:2rem}.pr-10{padding-right:2.5rem}.pr-12{padding-right:3rem}.pb-0{padding-bottom:0}.pb-1{padding-bottom:.25rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-5{padding-bottom:1.25rem}.pb-6{padding-bottom:1.5rem}.pb-8{padding-bottom:2rem}.pb-10{padding-bottom:2.5rem}.pb-12{padding-bottom:3rem}.pl-0{padding-left:0}.pl-1{padding-left:.25rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-5{padding-left:1.25rem}.pl-6{padding-left:1.5rem}.pl-8{padding-left:2rem}.pl-10{padding-left:2.5rem}.pl-12{padding-left:3rem}.m-0{margin:0}.m-1{margin:.25rem}.m-2{margin:.5rem}.m-3{margin:.75rem}.m-4{margin:1rem}.m-5{margin:1.25rem}.m-6{margin:1.5rem}.m-8{margin:2rem}.m-10{margin:2.5rem}.m-12{margin:3rem}.mx-0{margin-left:0;margin-right:0}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-5{margin-left:1.25rem;margin-right:1.25rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.mx-8{margin-left:2rem;margin-right:2rem}.mx-10{margin-left:2.5rem;margin-right:2.5rem}.mx-12{margin-left:3rem;margin-right:3rem}.my-0{margin-top:0;margin-bottom:0}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-4{margin-top:1rem;margin-bottom:1rem}.my-5{margin-top:1.25rem;margin-bottom:1.25rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.my-8{margin-top:2rem;margin-bottom:2rem}.my-10{margin-top:2.5rem;margin-bottom:2.5rem}.my-12{margin-top:3rem;margin-bottom:3rem}.mt-0{margin-top:0}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-10{margin-top:2.5rem}.mt-12{margin-top:3rem}.mr-0{margin-right:0}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mr-4{margin-right:1rem}.mr-5{margin-right:1.25rem}.mr-6{margin-right:1.5rem}.mr-8{margin-right:2rem}.mr-10{margin-right:2.5rem}.mr-12{margin-right:3rem}.mb-0{margin-bottom:0}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.mb-10{margin-bottom:2.5rem}.mb-12{margin-bottom:3rem}.ml-0{margin-left:0}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.ml-5{margin-left:1.25rem}.ml-6{margin-left:1.5rem}.ml-8{margin-left:2rem}.ml-10{margin-left:2.5rem}.ml-12{margin-left:3rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-justify{text-align:justify}.w-full{width:100%}.w-auto{width:auto}.w-half{width:50%}.w-third{width:33.333333%}.w-two-thirds{width:66.666667%}.w-quarter{width:25%}.w-three-quarters{width:75%}.max-w-xs{max-width:20rem}.max-w-sm{max-width:24rem}.max-w-md{max-width:28rem}.max-w-lg{max-width:32rem}.max-w-xl{max-width:36rem}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-full{max-width:100%}.flex{display:flex}.inline-flex{display:inline-flex}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.flex-wrap-reverse{flex-wrap:wrap-reverse}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.justify-evenly{justify-content:space-evenly}.flex-1{flex:1 1 0%}.flex-auto{flex:1 1 auto}.flex-initial{flex:0 1 auto}.flex-none{flex:none}.flex-grow{flex-grow:1}.flex-shrink{flex-shrink:1}.flex-grow-0{flex-grow:0}.flex-shrink-0{flex-shrink:0}.gap-0{gap:0}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-10{gap:2.5rem}.gap-12{gap:3rem}.hidden{display:none}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.relative{position:relative}.absolute{position:absolute}.fixed{position:fixed}.sticky{position:sticky}.static{position:static}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-scroll{overflow:scroll}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-hidden{overflow-y:hidden}.AppTitle{line-height:1.2}.PromptPanel{margin:0 auto;max-width:800px;padding:0 50px 50px}.SiteSchemaViewer{padding:0 30px}.Alert{border-radius:4px;margin:1rem 0;padding:.75rem 1rem}.Alert.error{background-color:#fee2e2;border:1px solid #FECACA;color:#b91c1c}.Alert.success{background-color:#dcfce7;border:1px solid #BBF7D0;color:#15803d}.Alert.info{background-color:#dbeafe;border:1px solid #BFDBFE;color:#1d4ed8}.Alert.warning{background-color:#fef3c7;border:1px solid #FDE68A;color:#b45309}.RecaptchaBox{background-color:#f5f5f5;border:1px solid #e0e0e0;border-radius:4px;min-height:78px;padding:.75rem;text-align:center}.InfoText{color:#777;font-size:.9rem;font-style:italic}._GzYRV{line-height:1.2;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}._3eOF8{margin-right:5px;font-weight:700}._3eOF8+._3eOF8{margin-left:-5px}._1MFti{cursor:pointer}._f10Tu{font-size:1.2em;margin-right:5px;-webkit-user-select:none;-moz-user-select:none;user-select:none}._1UmXx:after{content:"▸"}._1LId0:after{content:"▾"}._1pNG9{margin-right:5px}._1pNG9:after{content:"...";font-size:.8em}._2IvMF{background:#eee}._2bkNM{margin:0;padding:0 10px}._1BXBN{margin:0;padding:0}._1MGIk{font-weight:600;margin-right:5px;color:#000}._3uHL6{color:#000}._2T6PJ,._1Gho6{color:#df113a}._vGjyY{color:#2a3f3c}._1bQdo{color:#0b75f5}._3zQKs{color:#469038}._1xvuR{color:#43413d}._oLqym,._2AXVT,._2KJWg{color:#000}._11RoI{background:#002b36}._17H2C,._3QHg2,._3fDAz{color:#fdf6e3}._2bSDX{font-weight:bolder;margin-right:5px;color:#fdf6e3}._gsbQL{color:#fdf6e3}._LaAZe,._GTKgm{color:#81b5ac}._Chy1W{color:#cb4b16}._2bveF{color:#d33682}._2vRm-{color:#ae81ff}._1prJR{color:#268bd2}.RouteLayout{display:flex;flex-direction:row;height:100%;width:100%}.RouteLayout-main{flex-grow:1;padding:2rem;overflow-y:auto}.RouteLayout-sidebar{height:100%}@media (max-width: 768px){.RouteLayout{flex-direction:column}.RouteLayout-sidebar{order:-1;width:100%}}.PromptContainer{display:flex;flex-direction:column;margin:2rem auto;max-width:700px;width:100%}.PromptTextarea{background-color:#fff;border:1px solid #ddd;border-radius:8px;box-shadow:0 2px 4px #0000000d;font-family:inherit;font-size:1rem;line-height:1.5;min-height:120px;padding:1rem;resize:vertical;transition:border-color .2s,box-shadow .2s;width:100%}.PromptTextarea:focus{border-color:#3b82f6;box-shadow:0 0 0 2px #3b82f633;outline:none}.PromptTextarea:disabled{background-color:#f5f5f5;cursor:not-allowed;opacity:.8}.PromptButton{align-self:center;font-weight:500;margin-top:1rem;min-width:150px}.Sidebar{background-color:#f8f9fa;border-left:1px solid #e9ecef;display:flex;flex-direction:column;gap:.5rem;min-width:200px;padding:1rem;width:250px}.Sidebar-button{text-align:left;width:100%}.Sidebar-button.active{background-color:#1d4ed8;color:#fff}.Sidebar-button.has-spinner{padding-right:32px}.Sidebar-steps{display:flex;flex-direction:column;gap:.5rem;margin-top:1rem}.Sidebar-step{display:flex;align-items:center;position:relative}.Sidebar-spinner{position:absolute;right:8px;top:50%;transform:translateY(-50%);display:flex;align-items:center;justify-content:center;z-index:2;pointer-events:none}.Button{align-items:center;background-color:#3b82f6;border:none;border-radius:4px;color:#fff;cursor:pointer;display:inline-flex;font-size:.875rem;font-weight:500;justify-content:center;min-height:2.5rem;outline:none;padding:.5rem 1rem;transition:background-color .2s ease-in-out,box-shadow .2s ease-in-out;-webkit-user-select:none;user-select:none;white-space:nowrap}.Button:hover{background-color:#2563eb}.Button:focus{box-shadow:0 0 0 2px #3b82f680}.Button:active{background-color:#1d4ed8}.Button:disabled{background-color:#cbd5e1;color:#64748b;cursor:not-allowed}.Button.secondary{background-color:#f8fafc;border:1px solid #cbd5e1;color:#334155}.Button.secondary:hover{background-color:#f1f5f9}.Button.secondary:focus{box-shadow:0 0 0 2px #cbd5e180}.Button.secondary:active{background-color:#e2e8f0}.Button.secondary:disabled{background-color:#f8fafc;border-color:#e2e8f0;color:#94a3b8}.Button.loading{cursor:wait;position:relative;color:transparent}.Button.loading:after{animation:spinner-rotation .75s linear infinite;border:2px solid rgba(255,255,255,.4);border-radius:50%;border-top-color:#fff;content:"";height:1rem;left:50%;margin-left:-.5rem;margin-top:-.5rem;position:absolute;top:50%;width:1rem}.Button.loading.secondary:after{border:2px solid rgba(51,65,85,.2);border-top-color:#334155}.Spinner{animation:spinner-rotation 1.4s linear infinite;border-radius:50%;box-sizing:border-box;display:inline-block;position:relative}.Spinner:after{border-radius:50%;box-sizing:border-box;content:" ";display:block;position:absolute}.Spinner-small{border:2px solid rgba(59,130,246,.2);border-left:2px solid #3B82F6;height:16px;width:16px}.Spinner-small:after{border:2px solid transparent;border-left:2px solid #3B82F6;height:16px;left:-2px;top:-2px;width:16px}.Spinner-medium{border:3px solid rgba(59,130,246,.2);border-left:3px solid #3B82F6;height:24px;width:24px}.Spinner-medium:after{border:3px solid transparent;border-left:3px solid #3B82F6;height:24px;left:-3px;top:-3px;width:24px}.Spinner-large{border:4px solid rgba(59,130,246,.2);border-left:4px solid #3B82F6;height:40px;width:40px}.Spinner-large:after{border:4px solid transparent;border-left:4px solid #3B82F6;height:40px;left:-4px;top:-4px;width:40px}@keyframes spinner-rotation{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.PromptForm{display:flex;flex-direction:column;margin:1rem auto;max-width:700px;width:100%}.PromptForm-textarea{background-color:#fff;border:1px solid #ddd;border-radius:8px;box-shadow:0 2px 4px #0000000d;font-family:inherit;font-size:1rem;line-height:1.5;min-height:120px;padding:1rem;resize:vertical;transition:border-color .2s,box-shadow .2s;width:100%}.PromptForm-textarea:focus{border-color:#3b82f6;box-shadow:0 0 0 2px #3b82f633;outline:none}.PromptForm-textarea:disabled{background-color:#f5f5f5;cursor:not-allowed;opacity:.8}.PromptForm-button{align-self:center;font-weight:500;margin-top:1rem;min-width:150px}.Card{background-color:#fff;border-radius:8px;box-shadow:0 1px 3px #0000001a,0 1px 2px #0000000f;display:flex;flex-direction:column;overflow:hidden;width:100%}.Card-header{border-bottom:1px solid #e2e8f0;padding:1rem 1.5rem}.Card-body{flex:1 1 auto;padding:1.5rem}.Card-footer{background-color:#f8fafc;border-top:1px solid #e2e8f0;padding:1rem 1.5rem}.ConfirmDialog{align-items:center;display:flex;height:100%;justify-content:center;left:0;position:fixed;top:0;width:100%;z-index:1000}.ConfirmDialog-backdrop{background-color:#0006;height:100%;left:0;position:absolute;top:0;width:100%}.ConfirmDialog-container{background-color:#fff;border-radius:8px;box-shadow:0 10px 25px #0003;max-width:500px;position:relative;width:90%;z-index:1001}.ConfirmDialog-header{border-bottom:1px solid #eee;padding:1.25rem 1.5rem}.ConfirmDialog-title{font-size:1.25rem;font-weight:600;margin:0}.ConfirmDialog-body{padding:1.5rem}.ConfirmDialog-body p{margin:0}.ConfirmDialog-footer{border-top:1px solid #eee;display:flex;flex-direction:row;gap:1rem;justify-content:flex-end;padding:1rem 1.5rem}.ConfirmDialog-button{min-width:100px}.CompletedStep{display:flex;flex-direction:column;gap:1.5rem}.CompletedStep-explanation{background-color:#f8fafc;border:1px solid #e2e8f0;border-radius:.5rem;padding:1rem}.CompletedStep-explanation h3{color:#334155;font-size:1.125rem;font-weight:600;margin-top:0;margin-bottom:.75rem}.CompletedStep-explanation p{color:#64748b;font-size:1rem;line-height:1.5;margin:0}.CompletedStep-actions{display:flex;flex-wrap:wrap;gap:1rem;justify-content:center;margin-top:1rem}.CompletedStep-button{min-width:160px}.CompletedStep-updateForm{background-color:#f8fafc;border:1px solid #e2e8f0;border-radius:.5rem;margin-top:1rem;padding:1.5rem}.CompletedStep-updateForm h3{color:#334155;font-size:1.125rem;font-weight:600;margin-top:0;margin-bottom:1rem;text-align:center}.SchemaViewer{display:flex;flex-direction:column;gap:1rem}.SchemaViewer-main{background-color:#fff;border:1px solid #e2e8f0;border-radius:.5rem;min-height:300px;padding:1.5rem}.SchemaViewer-tabs{display:flex;flex-wrap:wrap;gap:.5rem;justify-content:center}.SchemaViewer-tab{font-size:.875rem;min-width:100px;padding:.5rem 1rem}.SchemaViewer-tab.active{background-color:#1e40af;box-shadow:0 0 0 2px #1e40af40}.SchemaViewer-tree ul{list-style-type:none;padding-left:0}.SchemaViewer-tree ul ul{padding-left:1.5rem}.SchemaViewer-tree li{margin-bottom:.5rem}.SchemaViewer-tree code{background-color:#f3f4f6;border-radius:3px;font-family:monospace;font-size:.85em;padding:.1em .3em}.SchemaViewer-locales,.SchemaViewer-schema{max-height:600px;overflow:auto}.FailedStep{display:flex;flex-direction:column;gap:1rem}.FailedStep-message{background-color:#fee2e2;border:1px solid #fecaca;border-radius:.5rem;color:#b91c1c;font-weight:500;margin:0;padding:1rem;text-align:center}.FailedStep-explanation{background-color:#fee2e2;border:1px solid #fecaca;border-radius:.5rem;color:#7f1d1d;padding:1rem}.FailedStep-explanation p{font-size:1rem;line-height:1.5;margin:0}.GeneratedSite-pending{display:flex;align-items:center;gap:1rem;margin-bottom:1.5rem;padding:1rem;background-color:#f0f8ff;border-radius:4px}.GeneratedSite-pending p{margin:0;font-style:italic}.GeneratedSite-explanation{margin-bottom:2rem}.GeneratedSite-explanation h3{margin-bottom:.75rem;font-size:1.2rem}.GeneratedSite-header{margin-bottom:1.5rem}.GeneratedSite-title{font-size:1.5rem;margin-bottom:.5rem}.GeneratedSite-information{display:flex;flex-direction:column;gap:1rem;margin-bottom:1.5rem}.GeneratedSite-field{display:flex;flex-direction:column;gap:.25rem}.GeneratedSite-label{font-weight:500;font-size:.9rem;color:#555}.GeneratedSite-value{display:flex;align-items:center;gap:.5rem}.GeneratedSite-input{flex:1;padding:.5rem;border:1px solid #ccc;border-radius:4px;font-family:monospace;font-size:.9rem;color:#333;background-color:#f9f9f9;cursor:default}.GeneratedSite-link-button{min-width:2rem;min-height:2rem;padding:0;font-size:1.2rem;display:flex;align-items:center;justify-content:center}.GeneratedSite-actions{display:flex;justify-content:flex-end}.GeneratedSite-copy-button{padding:.5rem 1rem}@media (min-width: 768px){.GeneratedSite-field{flex-direction:row;align-items:center}.GeneratedSite-label{width:100px;flex-shrink:0}.GeneratedSite-value{flex:1}}.markdown-content{line-height:1.6}.markdown-content p{margin-bottom:1rem}.markdown-content ul,.markdown-content ol{margin-bottom:1rem;padding-left:1.5rem}.markdown-content li{margin-bottom:.5rem}.markdown-content code{font-family:monospace;background-color:#f0f0f0;padding:.1rem .3rem;border-radius:3px;font-size:.9em}.markdown-content pre{background-color:#f5f5f5;padding:1rem;border-radius:4px;overflow-x:auto;margin-bottom:1rem}.markdown-content pre code{background-color:transparent;padding:0}.NoEffectStep{display:flex;flex-direction:column;gap:1rem}.NoEffectStep-message{background-color:#fef3c7;border:1px solid #fde68a;border-radius:.5rem;color:#92400e;font-weight:500;margin:0;padding:1rem;text-align:center}.NoEffectStep-explanation{background-color:#f8fafc;border:1px solid #e2e8f0;border-radius:.5rem;padding:1rem}.NoEffectStep-explanation p{color:#64748b;font-size:1rem;line-height:1.5;margin:0}.PendingStep{display:flex;flex-direction:column;gap:1.5rem}.PendingStep-spinner{align-items:center;display:flex;justify-content:center;margin:1.5rem 0}.PendingStep-activity,.PendingStep-explanation{background-color:#f8fafc;border:1px solid #e2e8f0;border-radius:.5rem;padding:1rem}.PendingStep-activity h3,.PendingStep-explanation h3{color:#334155;font-size:1.125rem;font-weight:600;margin-bottom:.75rem}.PendingStep-activity p,.PendingStep-explanation p{color:#64748b;font-size:1rem;line-height:1.5;margin:0}.PendingStep-activity{background-color:#dbeafe;border-color:#bfdbfe}.PendingStep-activity h3,.PendingStep-activity p{color:#1e40af}
|
|
1
|
+
*,*:before,*:after{box-sizing:border-box}.Text{margin-bottom:.75rem;text-align:justify}.Text p{margin:0 0 .5rem}.Text p:last-child{margin-bottom:0}.Text h1,.Text h2,.Text h3,.Text h4,.Text h5,.Text h6{font-weight:600;line-height:1.2;margin:1.2em 0 .7em}.Text h1{font-size:1.2rem;margin-top:0}.Text h2{font-size:1.1rem}.Text h3{font-size:1rem}.Text ul,.Text ol{margin:.5rem 0 .75rem;padding-left:1.5rem}.Text li{margin-bottom:.3rem}.Text blockquote{margin:.75rem 0;padding:.5rem 1rem;border-left:3px solid #ddd;background-color:#f7f7f7;font-style:italic;color:#555}.Text pre{background-color:#f5f5f5;padding:.75rem;border-radius:4px;overflow-x:auto;margin:.75rem 0}.Text hr{border:0;height:1px;background-color:#ddd;margin:1rem 0}.Text table{border-collapse:collapse;width:100%;margin:.75rem 0}.Text th,.Text td{border:1px solid #ddd;padding:.5rem;text-align:left}.Text th{background-color:#f5f5f5;font-weight:600}.Text,.InlineText{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;line-height:1.4;color:#222}.Text code,.InlineText code{font-family:Courier New,monospace;font-size:.85em;background-color:#eee;padding:.1em .3em;border-radius:3px}.Text a,.Text a:visited,.InlineText a,.InlineText a:visited{color:#3b82f6;text-decoration:none}.Text a:hover,.Text a:visited:hover,.InlineText a:hover,.InlineText a:visited:hover{text-decoration:underline}.Text b,.Text strong,.InlineText b,.InlineText strong{font-weight:600}.Text i,.Text em,.InlineText i,.InlineText em{font-style:italic}.Text small,.InlineText small{font-size:.85em}.Text mark,.InlineText mark{background-color:#ff0;color:#000}.App-content{align-items:center;display:flex;flex-direction:column;justify-content:center;min-height:calc(100vh - 60px);padding-bottom:40px}.App-footer{background-color:#f8f9fa;border-top:1px solid #e9ecef;bottom:0;color:#495057;left:0;padding:1rem;position:fixed;text-align:center;width:100%;z-index:1000}.LanguageSelector{display:inline-flex;justify-content:center;margin-left:1rem}.LanguageSelector-select{background-color:#fff;border:1px solid #ced4da;border-radius:4px;color:#495057;cursor:pointer;font-size:.85rem;padding:.25rem .5rem;transition:all .2s ease}.LanguageSelector-select:hover,.LanguageSelector-select:focus{border-color:#adb5bd;outline:none}.Panel{background-color:#fff;border:1px solid #dee2e6;border-radius:6px;margin-bottom:1rem;overflow:hidden}.Panel-header{align-items:center;background-color:#f8f9fa;border-bottom:1px solid #dee2e6;cursor:pointer;display:flex;font-weight:600;justify-content:space-between;padding:1rem 1.5rem;-webkit-user-select:none;user-select:none}.Panel-content{padding:1.5rem}.Panel-icon{font-size:1.2rem;transition:transform .2s}.Panel-icon.collapsed{transform:rotate(-90deg)}.Panel.collapsed .Panel-content{display:none}.Layout-row{display:flex;flex-direction:row;flex-wrap:wrap;margin-left:-.5rem;margin-right:-.5rem}.Layout-column{display:flex;flex-direction:column}.Layout-center{align-items:center;display:flex;justify-content:center;min-height:100%}.Layout-container{max-width:1200px;margin:0 auto;padding:0 1rem}.Layout-gap{gap:1rem}.Layout-gap-sm{gap:.5rem}.Layout-gap-lg{gap:1.5rem}.Layout-flex{display:flex}.Layout-grow{flex-grow:1}.Layout-justify-center{justify-content:center}.Layout-justify-between{justify-content:space-between}.Layout-justify-end{justify-content:flex-end}.Layout-align-center{align-items:center}.Layout-align-start{align-items:flex-start}.Layout-align-end{align-items:flex-end}.Layout-wrap{flex-wrap:wrap}.mt-3{margin-top:1rem}.mt-4{margin-top:1.5rem}.mb-3{margin-bottom:1rem}.mb-4{margin-bottom:1.5rem}.my-3{margin-top:1rem;margin-bottom:1rem}.my-4{margin-top:1.5rem;margin-bottom:1.5rem}.p-3{padding:1rem}.p-4{padding:1.5rem}@media (min-width: 768px){.md\:Layout-row{display:flex;flex-direction:row}.md\:Layout-column{display:flex;flex-direction:column}}.Dialog{background-color:#0006;display:flex;height:100%;left:0;opacity:0;pointer-events:none;position:fixed;top:0;transition:opacity .3s;width:100%;z-index:1000}.Dialog.active{opacity:1;pointer-events:auto}.Dialog-container{background-color:#fff;border-radius:6px;box-shadow:0 10px 25px #0003;margin:auto;max-height:90vh;max-width:90vw;overflow:auto;position:relative;transform:translateY(20px);transition:transform .3s;width:500px}.Dialog.active .Dialog-container{transform:translateY(0)}.Dialog-header{align-items:center;border-bottom:1px solid #dee2e6;display:flex;justify-content:space-between;padding:1rem 1.5rem}.Dialog-title{font-size:1.25rem;font-weight:600;margin:0}.Dialog-close{background:none;border:none;cursor:pointer;font-size:1.5rem;height:2rem;line-height:2rem;padding:0;text-align:center;width:2rem}.Dialog-content{padding:1.5rem}.Dialog-footer{border-top:1px solid #dee2e6;display:flex;justify-content:flex-end;padding:1rem 1.5rem;gap:.5rem}.markdown-content{color:#374151;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;font-size:1rem;line-height:1.5}.markdown-content h1,.markdown-content h2,.markdown-content h3,.markdown-content h4,.markdown-content h5,.markdown-content h6{font-weight:600;line-height:1.2;margin:1.25em 0 .75em}.markdown-content h1{font-size:1.5rem;margin-top:0}.markdown-content h2{font-size:1.3rem}.markdown-content h3{font-size:1.1rem}.markdown-content p{margin:0 0 1em}.markdown-content a{color:#3b82f6;text-decoration:none}.markdown-content a:hover{text-decoration:underline}.markdown-content ul,.markdown-content ol{margin:0 0 1em;padding-left:1.5em}.markdown-content li{margin-bottom:.5em}.markdown-content code{background-color:#f3f4f6;border-radius:3px;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:.85em;padding:.2em .4em}.markdown-content pre{background-color:#f3f4f6;border-radius:5px;margin:1em 0;overflow-x:auto;padding:1em}.markdown-content pre code{background-color:transparent;display:block;padding:0}.markdown-content blockquote{border-left:4px solid #e5e7eb;color:#6b7280;font-style:italic;margin:1em 0;padding:0 1em}.markdown-content table{border-collapse:collapse;margin:1em 0;width:100%}.markdown-content th,.markdown-content td{border:1px solid #e5e7eb;padding:.5em;text-align:left}.markdown-content th{background-color:#f9fafb;font-weight:600}.markdown-content img{max-width:100%}.markdown-content hr{border:0;border-top:1px solid #e5e7eb;margin:1.5em 0}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.p-10{padding:2.5rem}.p-12{padding:3rem}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-12{padding-left:3rem;padding-right:3rem}.py-0{padding-top:0;padding-bottom:0}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.pt-0{padding-top:0}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-6{padding-top:1.5rem}.pt-8{padding-top:2rem}.pt-10{padding-top:2.5rem}.pt-12{padding-top:3rem}.pr-0{padding-right:0}.pr-1{padding-right:.25rem}.pr-2{padding-right:.5rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pr-5{padding-right:1.25rem}.pr-6{padding-right:1.5rem}.pr-8{padding-right:2rem}.pr-10{padding-right:2.5rem}.pr-12{padding-right:3rem}.pb-0{padding-bottom:0}.pb-1{padding-bottom:.25rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-5{padding-bottom:1.25rem}.pb-6{padding-bottom:1.5rem}.pb-8{padding-bottom:2rem}.pb-10{padding-bottom:2.5rem}.pb-12{padding-bottom:3rem}.pl-0{padding-left:0}.pl-1{padding-left:.25rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-5{padding-left:1.25rem}.pl-6{padding-left:1.5rem}.pl-8{padding-left:2rem}.pl-10{padding-left:2.5rem}.pl-12{padding-left:3rem}.m-0{margin:0}.m-1{margin:.25rem}.m-2{margin:.5rem}.m-3{margin:.75rem}.m-4{margin:1rem}.m-5{margin:1.25rem}.m-6{margin:1.5rem}.m-8{margin:2rem}.m-10{margin:2.5rem}.m-12{margin:3rem}.mx-0{margin-left:0;margin-right:0}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-5{margin-left:1.25rem;margin-right:1.25rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.mx-8{margin-left:2rem;margin-right:2rem}.mx-10{margin-left:2.5rem;margin-right:2.5rem}.mx-12{margin-left:3rem;margin-right:3rem}.my-0{margin-top:0;margin-bottom:0}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-4{margin-top:1rem;margin-bottom:1rem}.my-5{margin-top:1.25rem;margin-bottom:1.25rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.my-8{margin-top:2rem;margin-bottom:2rem}.my-10{margin-top:2.5rem;margin-bottom:2.5rem}.my-12{margin-top:3rem;margin-bottom:3rem}.mt-0{margin-top:0}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-10{margin-top:2.5rem}.mt-12{margin-top:3rem}.mr-0{margin-right:0}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mr-4{margin-right:1rem}.mr-5{margin-right:1.25rem}.mr-6{margin-right:1.5rem}.mr-8{margin-right:2rem}.mr-10{margin-right:2.5rem}.mr-12{margin-right:3rem}.mb-0{margin-bottom:0}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.mb-10{margin-bottom:2.5rem}.mb-12{margin-bottom:3rem}.ml-0{margin-left:0}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.ml-5{margin-left:1.25rem}.ml-6{margin-left:1.5rem}.ml-8{margin-left:2rem}.ml-10{margin-left:2.5rem}.ml-12{margin-left:3rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-justify{text-align:justify}.w-full{width:100%}.w-auto{width:auto}.w-half{width:50%}.w-third{width:33.333333%}.w-two-thirds{width:66.666667%}.w-quarter{width:25%}.w-three-quarters{width:75%}.max-w-xs{max-width:20rem}.max-w-sm{max-width:24rem}.max-w-md{max-width:28rem}.max-w-lg{max-width:32rem}.max-w-xl{max-width:36rem}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-full{max-width:100%}.flex{display:flex}.inline-flex{display:inline-flex}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.flex-wrap-reverse{flex-wrap:wrap-reverse}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.justify-evenly{justify-content:space-evenly}.flex-1{flex:1 1 0%}.flex-auto{flex:1 1 auto}.flex-initial{flex:0 1 auto}.flex-none{flex:none}.flex-grow{flex-grow:1}.flex-shrink{flex-shrink:1}.flex-grow-0{flex-grow:0}.flex-shrink-0{flex-shrink:0}.gap-0{gap:0}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-10{gap:2.5rem}.gap-12{gap:3rem}.hidden{display:none}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.relative{position:relative}.absolute{position:absolute}.fixed{position:fixed}.sticky{position:sticky}.static{position:static}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-scroll{overflow:scroll}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-hidden{overflow-y:hidden}.AppTitle{line-height:1.2}.PromptPanel{margin:0 auto;max-width:800px;padding:0 50px 50px}.SiteSchemaViewer{padding:0 30px}.Alert{border-radius:4px;margin:1rem 0;padding:.75rem 1rem}.Alert.error{background-color:#fee2e2;border:1px solid #FECACA;color:#b91c1c}.Alert.success{background-color:#dcfce7;border:1px solid #BBF7D0;color:#15803d}.Alert.info{background-color:#dbeafe;border:1px solid #BFDBFE;color:#1d4ed8}.Alert.warning{background-color:#fef3c7;border:1px solid #FDE68A;color:#b45309}.RecaptchaBox{background-color:#f5f5f5;border:1px solid #e0e0e0;border-radius:4px;min-height:78px;padding:.75rem;text-align:center}.InfoText{color:#777;font-size:.9rem;font-style:italic}._GzYRV{line-height:1.2;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}._3eOF8{margin-right:5px;font-weight:700}._3eOF8+._3eOF8{margin-left:-5px}._1MFti{cursor:pointer}._f10Tu{font-size:1.2em;margin-right:5px;-webkit-user-select:none;-moz-user-select:none;user-select:none}._1UmXx:after{content:"▸"}._1LId0:after{content:"▾"}._1pNG9{margin-right:5px}._1pNG9:after{content:"...";font-size:.8em}._2IvMF{background:#eee}._2bkNM{margin:0;padding:0 10px}._1BXBN{margin:0;padding:0}._1MGIk{font-weight:600;margin-right:5px;color:#000}._3uHL6{color:#000}._2T6PJ,._1Gho6{color:#df113a}._vGjyY{color:#2a3f3c}._1bQdo{color:#0b75f5}._3zQKs{color:#469038}._1xvuR{color:#43413d}._oLqym,._2AXVT,._2KJWg{color:#000}._11RoI{background:#002b36}._17H2C,._3QHg2,._3fDAz{color:#fdf6e3}._2bSDX{font-weight:bolder;margin-right:5px;color:#fdf6e3}._gsbQL{color:#fdf6e3}._LaAZe,._GTKgm{color:#81b5ac}._Chy1W{color:#cb4b16}._2bveF{color:#d33682}._2vRm-{color:#ae81ff}._1prJR{color:#268bd2}.RouteLayout{display:flex;flex-direction:row;height:100%;width:100%}.RouteLayout-main{flex-grow:1;padding:2rem;overflow-y:auto}.RouteLayout-sidebar{height:100%}@media (max-width: 768px){.RouteLayout{flex-direction:column}.RouteLayout-sidebar{order:-1;width:100%}}.PromptContainer{display:flex;flex-direction:column;margin:2rem auto;max-width:700px;width:100%}.PromptTextarea{background-color:#fff;border:1px solid #ddd;border-radius:8px;box-shadow:0 2px 4px #0000000d;font-family:inherit;font-size:1rem;line-height:1.5;min-height:120px;padding:1rem;resize:vertical;transition:border-color .2s,box-shadow .2s;width:100%}.PromptTextarea:focus{border-color:#3b82f6;box-shadow:0 0 0 2px #3b82f633;outline:none}.PromptTextarea:disabled{background-color:#f5f5f5;cursor:not-allowed;opacity:.8}.PromptButton{align-self:center;font-weight:500;margin-top:1rem;min-width:150px}.Sidebar{background-color:#f8f9fa;border-left:1px solid #e9ecef;display:flex;flex-direction:column;gap:.5rem;min-width:200px;padding:1rem;width:250px}.Sidebar-button{text-align:left;width:100%}.Sidebar-button.active{background-color:#1d4ed8;color:#fff}.Sidebar-button.has-spinner{padding-right:32px}.Sidebar-steps{display:flex;flex-direction:column;gap:.5rem;margin-top:1rem}.Sidebar-step{display:flex;align-items:center;position:relative}.Sidebar-spinner{position:absolute;right:8px;top:50%;transform:translateY(-50%);display:flex;align-items:center;justify-content:center;z-index:2;pointer-events:none}.Button{align-items:center;background-color:#3b82f6;border:none;border-radius:4px;color:#fff;cursor:pointer;display:inline-flex;font-size:.875rem;font-weight:500;justify-content:center;min-height:2.5rem;outline:none;padding:.5rem 1rem;transition:background-color .2s ease-in-out,box-shadow .2s ease-in-out;-webkit-user-select:none;user-select:none;white-space:nowrap}.Button:hover{background-color:#2563eb}.Button:focus{box-shadow:0 0 0 2px #3b82f680}.Button:active{background-color:#1d4ed8}.Button:disabled{background-color:#cbd5e1;color:#64748b;cursor:not-allowed}.Button.secondary{background-color:#f8fafc;border:1px solid #cbd5e1;color:#334155}.Button.secondary:hover{background-color:#f1f5f9}.Button.secondary:focus{box-shadow:0 0 0 2px #cbd5e180}.Button.secondary:active{background-color:#e2e8f0}.Button.secondary:disabled{background-color:#f8fafc;border-color:#e2e8f0;color:#94a3b8}.Button.loading{cursor:wait;position:relative;color:transparent}.Button.loading:after{animation:spinner-rotation .75s linear infinite;border:2px solid rgba(255,255,255,.4);border-radius:50%;border-top-color:#fff;content:"";height:1rem;left:50%;margin-left:-.5rem;margin-top:-.5rem;position:absolute;top:50%;width:1rem}.Button.loading.secondary:after{border:2px solid rgba(51,65,85,.2);border-top-color:#334155}.Spinner{animation:spinner-rotation 1.4s linear infinite;border-radius:50%;box-sizing:border-box;display:inline-block;position:relative}.Spinner:after{border-radius:50%;box-sizing:border-box;content:" ";display:block;position:absolute}.Spinner-small{border:2px solid rgba(59,130,246,.2);border-left:2px solid #3B82F6;height:16px;width:16px}.Spinner-small:after{border:2px solid transparent;border-left:2px solid #3B82F6;height:16px;left:-2px;top:-2px;width:16px}.Spinner-medium{border:3px solid rgba(59,130,246,.2);border-left:3px solid #3B82F6;height:24px;width:24px}.Spinner-medium:after{border:3px solid transparent;border-left:3px solid #3B82F6;height:24px;left:-3px;top:-3px;width:24px}.Spinner-large{border:4px solid rgba(59,130,246,.2);border-left:4px solid #3B82F6;height:40px;width:40px}.Spinner-large:after{border:4px solid transparent;border-left:4px solid #3B82F6;height:40px;left:-4px;top:-4px;width:40px}@keyframes spinner-rotation{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.PromptForm{display:flex;flex-direction:column;margin:1rem auto;max-width:700px;width:100%}.PromptForm-textarea{background-color:#fff;border:1px solid #ddd;border-radius:8px;box-shadow:0 2px 4px #0000000d;font-family:inherit;font-size:1rem;line-height:1.5;min-height:120px;padding:1rem;resize:vertical;transition:border-color .2s,box-shadow .2s;width:100%}.PromptForm-textarea:focus{border-color:#3b82f6;box-shadow:0 0 0 2px #3b82f633;outline:none}.PromptForm-textarea:disabled{background-color:#f5f5f5;cursor:not-allowed;opacity:.8}.PromptForm-button{align-self:center;font-weight:500;margin-top:1rem;min-width:150px}.Card{background-color:#fff;border-radius:8px;box-shadow:0 1px 3px #0000001a,0 1px 2px #0000000f;display:flex;flex-direction:column;overflow:hidden;padding:1.5rem;width:100%}.Card-header{border-bottom:1px solid #e2e8f0;margin-bottom:1.5rem;padding-bottom:1rem}.Card-body{flex:1 1 auto}.Card-footer{background-color:#f8fafc;border-top:1px solid #e2e8f0;margin-top:1.5rem;padding-top:1rem}.Explanation{background-color:#f8fafc;border:1px solid #e2e8f0;border-radius:.5rem;margin-bottom:1rem;max-height:400px;overflow-y:auto;padding:1rem}.Explanation-title{color:#334155;font-size:1.125rem;font-weight:600;margin-bottom:.75rem;margin-top:0}.Explanation-content{color:#475569;line-height:1.5}.Explanation-content p{margin-bottom:.75rem;margin-top:0}.Explanation-content:last-child p:last-child{margin-bottom:0}.Explanation-error{background-color:#fee2e2;border-color:#fecaca}.Explanation-error .Explanation-title{color:#b91c1c}.Explanation-error .Explanation-content{color:#7f1d1d}.Explanation-warning{background-color:#fef3c7;border-color:#fde68a}.Explanation-warning .Explanation-title{color:#92400e}.Explanation-warning .Explanation-content{color:#78350f}.Explanation-info{background-color:#dbeafe;border-color:#bfdbfe}.Explanation-info .Explanation-title{color:#1e40af}.Explanation-info .Explanation-content{color:#1e3a8a}.markdown-content{line-height:1.6}.markdown-content p{margin-bottom:1rem}.markdown-content ul,.markdown-content ol{margin-bottom:1rem;padding-left:1.5rem}.markdown-content li{margin-bottom:.5rem}.markdown-content code{background-color:#f0f0f0;border-radius:3px;font-family:monospace;font-size:.9em;padding:.1rem .3rem}.markdown-content pre{background-color:#f5f5f5;border-radius:4px;margin-bottom:1rem;overflow-x:auto;padding:1rem}.markdown-content pre code{background-color:transparent;padding:0}.ConfirmDialog{align-items:center;display:flex;height:100%;justify-content:center;left:0;position:fixed;top:0;width:100%;z-index:1000}.ConfirmDialog-backdrop{background-color:#0006;height:100%;left:0;position:absolute;top:0;width:100%}.ConfirmDialog-container{background-color:#fff;border-radius:8px;box-shadow:0 10px 25px #0003;max-width:500px;position:relative;width:90%;z-index:1001}.ConfirmDialog-header{border-bottom:1px solid #eee;padding:1.25rem 1.5rem}.ConfirmDialog-title{font-size:1.25rem;font-weight:600;margin:0}.ConfirmDialog-body{padding:1.5rem}.ConfirmDialog-body p{margin:0}.ConfirmDialog-footer{border-top:1px solid #eee;display:flex;flex-direction:row;gap:1rem;justify-content:flex-end;padding:1rem 1.5rem}.ConfirmDialog-button{min-width:100px}.CompletedStep{display:flex;flex-direction:column;gap:1.5rem}.CompletedStep-actions{display:flex;flex-wrap:wrap;gap:1rem;justify-content:center}.CompletedStep-button{min-width:160px}.CompletedStep-updateForm{background-color:#f8fafc;border:1px solid #e2e8f0;border-radius:.5rem;margin-top:1rem;padding:1rem}.CompletedStep-updateForm h3{color:#334155;font-size:1.125rem;font-weight:600;margin-top:0;margin-bottom:1rem;text-align:center}.SchemaViewer{display:flex;flex-direction:column;gap:1rem}.SchemaViewer-main{background-color:#fff;border:1px solid #e2e8f0;border-radius:.5rem;height:500px;overflow-y:auto;padding:1.5rem}.SchemaViewer-tabs{display:flex;flex-wrap:wrap;gap:.5rem;justify-content:center;margin-bottom:.5rem}.SchemaViewer-tab{font-size:.875rem;min-width:100px;padding:.5rem 1rem}.SchemaViewer-tab.active{background-color:#1e40af;box-shadow:0 0 0 2px #1e40af40}.SchemaViewer-tree ul{list-style-type:none;padding-left:0}.SchemaViewer-tree ul ul{padding-left:1.5rem}.SchemaViewer-tree li{margin-bottom:.5rem}.SchemaViewer-tree code{background-color:#f3f4f6;border-radius:3px;font-family:monospace;font-size:.85em;padding:.1em .3em}.SchemaViewer-content{height:100%;width:100%}.ErrorStep{display:flex;flex-direction:column;gap:1rem}.ErrorStep-message{background-color:#fee2e2;border:1px solid #fecaca;border-radius:.5rem;color:#b91c1c;font-weight:500;margin:0;padding:1rem;text-align:center}.ErrorStep-message-warning{background-color:#fef3c7;border-color:#fde68a;color:#92400e}.GeneratedSite-pending{align-items:center;background-color:#f0f8ff;border-radius:4px;display:flex;gap:1rem;margin-bottom:1.5rem;padding:.75rem}.GeneratedSite-pending p{font-style:italic;margin:0}.GeneratedSite-header{margin-bottom:1.5rem}.GeneratedSite-title{font-size:1.5rem;margin-bottom:.5rem;margin-top:0}.GeneratedSite-information{display:flex;flex-direction:column;gap:1rem;margin-bottom:1.5rem}.GeneratedSite-field{display:flex;flex-direction:column;gap:.25rem}.GeneratedSite-label{color:#555;font-size:.9rem;font-weight:500}.GeneratedSite-value{align-items:center;display:flex;gap:.5rem}.GeneratedSite-input{background-color:#f9f9f9;border:1px solid #ccc;border-radius:4px;color:#333;cursor:default;flex:1;font-family:monospace;font-size:.9rem;padding:.5rem}.GeneratedSite-link-button{align-items:center;display:flex;font-size:1.2rem;justify-content:center;min-height:2rem;min-width:2rem;padding:0}.GeneratedSite-actions{display:flex;justify-content:flex-end}.GeneratedSite-copy-button{padding:.5rem 1rem}@media (min-width: 768px){.GeneratedSite-field{align-items:center;flex-direction:row}.GeneratedSite-label{flex-shrink:0;width:100px}.GeneratedSite-value{flex:1}}.PendingStep{display:flex;flex-direction:column;gap:1.5rem}.PendingStep-header h2{font-size:1.5rem;margin-bottom:.5rem;margin-top:0}.PendingStep-spinner{align-items:center;display:flex;justify-content:center;margin:1.5rem 0}.PendingStep-activity{background-color:#dbeafe;border:1px solid #bfdbfe;border-radius:.5rem;padding:1rem}.PendingStep-activity h3{color:#1e40af;font-size:1.125rem;font-weight:600;margin-bottom:.75rem;margin-top:0}.PendingStep-activity p{color:#1e40af;font-size:1rem;line-height:1.5;margin:0}
|