All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 1m5s
Combines shared, blog, market, cart, events, federation, and account into a single repository. Eliminates submodule sync, sibling model copying at build time, and per-app CI orchestration. Changes: - Remove per-app .git, .gitmodules, .gitea, submodule shared/ dirs - Remove stale sibling model copies from each app - Update all 6 Dockerfiles for monorepo build context (root = .) - Add build directives to docker-compose.yml - Add single .gitea/workflows/ci.yml with change detection - Add .dockerignore for monorepo build context - Create __init__.py for federation and account (cross-app imports)
50 lines
1.6 KiB
JavaScript
50 lines
1.6 KiB
JavaScript
import React from "react";
|
|
import { createRoot } from "react-dom/client";
|
|
import Editor from "./Editor";
|
|
|
|
/**
|
|
* Mount the Koenig editor into the given DOM element.
|
|
*
|
|
* @param {string} elementId - ID of the container element
|
|
* @param {object} opts
|
|
* @param {string} [opts.initialJson] - Serialised Lexical JSON (from Ghost)
|
|
* @param {string} [opts.csrfToken] - CSRF token for API calls
|
|
* @param {object} [opts.uploadUrls] - { image, media, file } upload endpoint URLs
|
|
* @param {string} [opts.oembedUrl] - oEmbed proxy endpoint URL
|
|
* @param {string} [opts.unsplashApiKey] - Unsplash API key for image search
|
|
*/
|
|
window.mountEditor = function mountEditor(elementId, opts = {}) {
|
|
const container = document.getElementById(elementId);
|
|
if (!container) {
|
|
console.error(`[editor] Element #${elementId} not found`);
|
|
return;
|
|
}
|
|
|
|
let currentJson = opts.initialJson || null;
|
|
|
|
function handleChange(json) {
|
|
currentJson = json;
|
|
// Stash the latest JSON in a hidden input for form submission
|
|
const hidden = document.getElementById("lexical-json-input");
|
|
if (hidden) hidden.value = json;
|
|
}
|
|
|
|
const root = createRoot(container);
|
|
root.render(
|
|
<Editor
|
|
initialState={opts.initialJson || null}
|
|
onChange={handleChange}
|
|
csrfToken={opts.csrfToken || ""}
|
|
uploadUrls={opts.uploadUrls || ""}
|
|
oembedUrl={opts.oembedUrl || "/editor-api/oembed/"}
|
|
unsplashApiKey={opts.unsplashApiKey || ""}
|
|
snippetsUrl={opts.snippetsUrl || ""}
|
|
/>
|
|
);
|
|
|
|
// Return handle for programmatic access
|
|
return {
|
|
getJson: () => currentJson,
|
|
};
|
|
};
|