From 2dc40412286fc29a2855ff427064df5249feb661 Mon Sep 17 00:00:00 2001
From: Kamran Ahmed <kamranahmed.se@gmail.com>
Date: Fri, 4 Apr 2025 23:41:05 +0100
Subject: [PATCH] Add editor

---
 editor/.gitignore                          | 38 ++++++++++
 editor/package.json                        | 81 ++++++++++++++++++++++
 editor/postcss.config.mjs                  | 12 ++++
 editor/src/components/readonly-editor.tsx  | 22 ++++++
 editor/src/components/render-flow-json.ts  |  6 ++
 editor/src/components/renderer.tsx         | 20 ++++++
 editor/src/components/roadmap-generator.ts | 27 ++++++++
 editor/src/components/types.ts             |  3 +
 editor/src/global.css                      |  1 +
 editor/src/index.tsx                       |  7 ++
 editor/tsconfig.json                       | 29 ++++++++
 editor/tsup.config.ts                      | 22 ++++++
 scripts/generate-renderer-dummy.sh         | 15 ++++
 13 files changed, 283 insertions(+)
 create mode 100644 editor/.gitignore
 create mode 100644 editor/package.json
 create mode 100644 editor/postcss.config.mjs
 create mode 100644 editor/src/components/readonly-editor.tsx
 create mode 100644 editor/src/components/render-flow-json.ts
 create mode 100644 editor/src/components/renderer.tsx
 create mode 100644 editor/src/components/roadmap-generator.ts
 create mode 100644 editor/src/components/types.ts
 create mode 100644 editor/src/global.css
 create mode 100644 editor/src/index.tsx
 create mode 100644 editor/tsconfig.json
 create mode 100644 editor/tsup.config.ts
 create mode 100644 scripts/generate-renderer-dummy.sh

diff --git a/editor/.gitignore b/editor/.gitignore
new file mode 100644
index 000000000..e3e8f7008
--- /dev/null
+++ b/editor/.gitignore
@@ -0,0 +1,38 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+node_modules
+.pnp
+.pnp.js
+
+# testing
+coverage
+
+# next.js
+.next/
+out/
+dist
+build
+.vercel
+
+# misc
+.DS_Store
+*.pem
+
+# debug
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# local env files
+.env
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+
+# turbo
+.turbo
+
+# vercel
+.vercel
diff --git a/editor/package.json b/editor/package.json
new file mode 100644
index 000000000..c4d3db0d7
--- /dev/null
+++ b/editor/package.json
@@ -0,0 +1,81 @@
+{
+  "name": "@roadmapsh/dummy-editor",
+  "version": "0.0.5",
+  "description": "Dummy editor for the Roadmap Editor",
+  "private": false,
+  "type": "module",
+  "main": "./dist/index.js",
+  "module": "./dist/index.mjs",
+  "types": "./dist/index.d.ts",
+  "files": [
+    "dist/**"
+  ],
+  "exports": {
+    "./package.json": "./package.json",
+    ".": {
+      "node": {
+        "import": {
+          "types": "./dist/index.d.ts",
+          "default": "./dist/index.mjs"
+        },
+        "require": {
+          "types": "./dist/index.d.cts",
+          "default": "./dist/index.js"
+        }
+      },
+      "browser": {
+        "import": {
+          "types": "./dist/index.d.ts",
+          "default": "./dist/index.mjs"
+        },
+        "require": {
+          "types": "./dist/index.d.cts",
+          "default": "./dist/index.js"
+        }
+      },
+      "default": {
+        "import": {
+          "types": "./dist/index.d.ts",
+          "default": "./dist/index.mjs"
+        },
+        "require": {
+          "types": "./dist/index.d.cts",
+          "default": "./dist/index.js"
+        }
+      }
+    },
+    "./style.css": "./dist/index.css"
+  },
+  "typesVersions": {
+    "*": {
+      "*": [
+        "dist/index.d.ts"
+      ]
+    }
+  },
+  "scripts": {
+    "dev": "tsup --watch",
+    "clean": "rm -rf dist && rm -rf node_modules",
+    "build": "tsup"
+  },
+  "keywords": [],
+  "author": "Arik Chakma <arikchangma@gmail.com>",
+  "license": "ISC",
+  "dependencies": {
+    "clsx": "^2.1.1",
+    "react": "^19.0.0",
+    "tailwind-merge": "^3.0.1"
+  },
+  "devDependencies": {
+    "@tailwindcss/postcss": "^4.0.3",
+    "@types/react": "^19.0.8",
+    "postcss": "^8.5.1",
+    "postcss-replace": "^2.0.1",
+    "tailwindcss": "^4.0.3",
+    "tsup": "^8.3.6",
+    "typescript": "^5.7.3"
+  },
+  "publishConfig": {
+    "access": "public"
+  }
+}
diff --git a/editor/postcss.config.mjs b/editor/postcss.config.mjs
new file mode 100644
index 000000000..2de525e09
--- /dev/null
+++ b/editor/postcss.config.mjs
@@ -0,0 +1,12 @@
+export default {
+  plugins: {
+    '@tailwindcss/postcss': {},
+    'postcss-replace': {
+      pattern: /(--tw|\*, ::before, ::after)/g,
+      data: {
+        '--tw': '--rdm-tw',
+        '*, ::before, ::after': ':root',
+      },
+    },
+  },
+};
diff --git a/editor/src/components/readonly-editor.tsx b/editor/src/components/readonly-editor.tsx
new file mode 100644
index 000000000..9b577f113
--- /dev/null
+++ b/editor/src/components/readonly-editor.tsx
@@ -0,0 +1,22 @@
+import { forwardRef, memo } from 'react';
+
+export const ReadonlyEditor = memo(
+  forwardRef<HTMLDivElement, any>((props, ref) => {
+    return (
+      <div className="rdm:fixed rdm:bottom-0 rdm:left-0 rdm:right-0 rdm:top-0 rdm:z-[9999] rdm:border rdm:border-gray-200 rdm:bg-white rdm:p-5 rdm:text-black">
+        <h2 className="rdm:mb-2 rdm:text-xl rdm:font-semibold">
+          Private Component
+        </h2>
+        <p className="rdm:mb-4">
+          Renderer is a private component. If you are a collaborator and have
+          access to it. Run the following command:
+        </p>
+        <code className="rdm:mt-5 rdm:rounded-md rdm:bg-gray-800 rdm:p-2 rdm:text-white">
+          npm run generate-renderer
+        </code>
+      </div>
+    );
+  })
+);
+
+ReadonlyEditor.displayName = 'ReadonlyEditor';
diff --git a/editor/src/components/render-flow-json.ts b/editor/src/components/render-flow-json.ts
new file mode 100644
index 000000000..a802f0ecc
--- /dev/null
+++ b/editor/src/components/render-flow-json.ts
@@ -0,0 +1,6 @@
+export function renderFlowJSON(data: any, options?: any): Promise<any> {
+  console.warn('renderFlowJSON is not implemented');
+  console.warn('run the following command to generate the renderer:');
+  console.warn('> npm run generate-renderer');
+  return Promise.resolve(null);
+}
diff --git a/editor/src/components/renderer.tsx b/editor/src/components/renderer.tsx
new file mode 100644
index 000000000..4559fa526
--- /dev/null
+++ b/editor/src/components/renderer.tsx
@@ -0,0 +1,20 @@
+import { forwardRef } from 'react';
+
+export const Renderer = forwardRef<HTMLDivElement, any>((props, ref) => {
+  return (
+    <div className="rdm:fixed rdm:bottom-0 rdm:left-0 rdm:right-0 rdm:top-0 rdm:z-[9999] rdm:border rdm:border-gray-200 rdm:bg-white rdm:p-5 rdm:text-black">
+      <h2 className="rdm:mb-2 rdm:text-xl rdm:font-semibold">
+        Private Component
+      </h2>
+      <p className="rdm:mb-4">
+        Renderer is a private component. If you are a collaborator and have
+        access to it. Run the following command:
+      </p>
+      <code className="rdm:mt-5 rdm:rounded-md rdm:bg-gray-800 rdm:p-2 rdm:text-white">
+        npm run generate-renderer
+      </code>
+    </div>
+  );
+});
+
+Renderer.displayName = 'Renderer';
diff --git a/editor/src/components/roadmap-generator.ts b/editor/src/components/roadmap-generator.ts
new file mode 100644
index 000000000..b9c9b47f8
--- /dev/null
+++ b/editor/src/components/roadmap-generator.ts
@@ -0,0 +1,27 @@
+import type { Edge, Node } from './types';
+
+export function generateRoadmapFromText(markdown: string | any[]): {
+  nodes: Node[];
+  edges: Edge[];
+} {
+  console.warn('generateRoadmapFromText is not implemented');
+  console.warn('run the following command to generate the renderer:');
+  console.warn('> npm run generate-renderer');
+  return {
+    nodes: [],
+    edges: [],
+  };
+}
+
+export function generateAIRoadmapFromText(markdown: string | any[]): {
+  nodes: Node[];
+  edges: Edge[];
+} {
+  console.warn('generateAIRoadmapFromText is not implemented');
+  console.warn('run the following command to generate the renderer:');
+  console.warn('> npm run generate-renderer');
+  return {
+    nodes: [],
+    edges: [],
+  };
+}
diff --git a/editor/src/components/types.ts b/editor/src/components/types.ts
new file mode 100644
index 000000000..5f1433c01
--- /dev/null
+++ b/editor/src/components/types.ts
@@ -0,0 +1,3 @@
+export type Edge = any;
+export type Node = any;
+export type XYPosition = any;
diff --git a/editor/src/global.css b/editor/src/global.css
new file mode 100644
index 000000000..cfc321dfe
--- /dev/null
+++ b/editor/src/global.css
@@ -0,0 +1 @@
+@import 'tailwindcss' prefix(rdm);
diff --git a/editor/src/index.tsx b/editor/src/index.tsx
new file mode 100644
index 000000000..1151990ee
--- /dev/null
+++ b/editor/src/index.tsx
@@ -0,0 +1,7 @@
+import './global.css';
+
+export * from './components/readonly-editor';
+export * from './components/renderer';
+export * from './components/render-flow-json';
+export * from './components/roadmap-generator';
+export * from './components/types';
diff --git a/editor/tsconfig.json b/editor/tsconfig.json
new file mode 100644
index 000000000..da875d1cd
--- /dev/null
+++ b/editor/tsconfig.json
@@ -0,0 +1,29 @@
+{
+  "compilerOptions": {
+    "composite": false,
+    "declaration": true,
+    "declarationMap": true,
+    "esModuleInterop": true,
+    "forceConsistentCasingInFileNames": true,
+    "inlineSources": false,
+    "isolatedModules": true,
+    "moduleResolution": "node",
+    "noUnusedLocals": false,
+    "noUnusedParameters": false,
+    "preserveWatchOutput": true,
+    "skipLibCheck": true,
+    "strict": true,
+    "strictNullChecks": true,
+    "noEmit": true,
+    "jsx": "react-jsx",
+    "lib": ["DOM", "DOM.Iterable", "ESNext"],
+    "module": "ESNext",
+    "target": "es6",
+    "baseUrl": ".",
+    "paths": {
+      "~/*": ["src/*"]
+    }
+  },
+  "include": [".", "src/types"],
+  "exclude": ["dist", "build", "node_modules"]
+}
diff --git a/editor/tsup.config.ts b/editor/tsup.config.ts
new file mode 100644
index 000000000..e86205dae
--- /dev/null
+++ b/editor/tsup.config.ts
@@ -0,0 +1,22 @@
+import { defineConfig, Options } from 'tsup';
+
+const packageOptions: Options = {
+  clean: true,
+  dts: true,
+  format: ['cjs', 'esm'],
+  platform: 'neutral',
+  sourcemap: true,
+};
+
+export default defineConfig([
+  {
+    ...packageOptions,
+    entry: {
+      index: 'src/index.tsx',
+    },
+    external: ['react'],
+    outExtension(ctx) {
+      return ctx.format === 'esm' ? { js: '.mjs' } : { js: '.js' };
+    },
+  },
+]);
diff --git a/scripts/generate-renderer-dummy.sh b/scripts/generate-renderer-dummy.sh
new file mode 100644
index 000000000..776152e36
--- /dev/null
+++ b/scripts/generate-renderer-dummy.sh
@@ -0,0 +1,15 @@
+rm -rf .temp
+rm -rf editor
+
+git clone ssh://git@github.com/roadmapsh/web-draw.git .temp/web-draw --depth 1
+
+cd .temp/web-draw
+pnpm install
+npm run build -- --filter=@roadmapsh/dummy-editor
+
+
+# Copy new editor
+cp -rf packages/dummy-editor ../../editor
+
+# Remove temp directory
+rm -rf .temp
\ No newline at end of file