@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.
Files changed (19) hide show
  1. package/gen-backend/dist/generator/fake-content-generator/content-report.js +81 -0
  2. package/gen-backend/dist/generator/fake-content-generator/create-database-with-fake-content.js +80 -0
  3. package/gen-backend/dist/generator/fake-content-generator/fill-nodels.js +115 -0
  4. package/gen-backend/dist/generator/fake-content-generator/fill-site-fields.js +63 -0
  5. package/gen-backend/dist/generator/fake-content-generator/fill-taxonomy-fields.js +57 -0
  6. package/gen-backend/dist/generator/site-generator/site-generator.js +1 -1
  7. package/gen-backend/dist/generator/site-schema-generator/create-site-schema.js +5 -0
  8. package/gen-backend/dist/lib/create-raw-context.js +2 -2
  9. package/gen-backend/prompts/initial-1-analysis.md +3 -1
  10. package/gen-front/dist/gen-front.css +1 -1
  11. package/gen-front/dist/gen-front.mjs +45 -56
  12. package/package.json +10 -8
  13. package/gen-backend/dist/generator/fake-content-generator.ts/content-report.js +0 -15
  14. package/gen-backend/dist/generator/fake-content-generator.ts/create-database-with-fake-content.js +0 -238
  15. /package/gen-backend/dist/generator/{fake-content-generator.ts → fake-content-generator}/content-helpers.js +0 -0
  16. /package/gen-backend/dist/generator/{fake-content-generator.ts → fake-content-generator}/create-node-contents.js +0 -0
  17. /package/gen-backend/dist/generator/{fake-content-generator.ts → fake-content-generator}/fake-content-types.js +0 -0
  18. /package/gen-backend/dist/generator/{fake-content-generator.ts → fake-content-generator}/generate-fake-content.js +0 -0
  19. /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
+ }
@@ -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.ts/create-database-with-fake-content.js";
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 { getJwtSecretSync } from "@paroicms/internal-server-lib";
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: getJwtSecretSync(join(service.registeredSite.dataDir, "site-generator-secret.txt")),
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: true
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}