archyne 0.2.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 (92) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +249 -0
  3. package/THIRD-PARTY-NOTICES.md +302 -0
  4. package/bin/archyne.mjs +179 -0
  5. package/desktop/main.cjs +141 -0
  6. package/dist/assets/_commonjs-dynamic-modules-TDtrdbi3.js +1 -0
  7. package/dist/assets/abnfDiagram-VRR7QNED-DxJn5x30.js +1 -0
  8. package/dist/assets/ar-DHpnjuQB.js +1 -0
  9. package/dist/assets/arc-Bi9nYi75.js +1 -0
  10. package/dist/assets/architectureDiagram-ZJ3FMSHR-CVVsX69f.js +36 -0
  11. package/dist/assets/blockDiagram-677ZJIJ3-CvyOVrtD.js +132 -0
  12. package/dist/assets/c4Diagram-LMCZKHZV-CeTXI2L5.js +10 -0
  13. package/dist/assets/channel-CgQghNFn.js +1 -0
  14. package/dist/assets/chunk-2Q5K7J3B-QWLx0LNh.js +1 -0
  15. package/dist/assets/chunk-32BRIVSS-Cx7PNJc5.js +1 -0
  16. package/dist/assets/chunk-5VM5RSS4-B-JlXrm9.js +15 -0
  17. package/dist/assets/chunk-EX3LRPZG-BZir2lEZ.js +231 -0
  18. package/dist/assets/chunk-JWPE2WC7-Bs6js5ed.js +1 -0
  19. package/dist/assets/chunk-MOJQB5TN-M9vORODQ.js +88 -0
  20. package/dist/assets/chunk-RYQCIY6F-C23BZB1s.js +1 -0
  21. package/dist/assets/chunk-V7JOEXUC-DP9DCEHY.js +206 -0
  22. package/dist/assets/chunk-VR4S4FIN-CXMOwHEw.js +1 -0
  23. package/dist/assets/chunk-XXDRQBXY-C-XBHYFW.js +1 -0
  24. package/dist/assets/classDiagram-OUVF2IWQ-C9iVyfdZ.js +1 -0
  25. package/dist/assets/classDiagram-v2-EOCWNBFH-C9iVyfdZ.js +1 -0
  26. package/dist/assets/cose-bilkent-JH36ORCC-DcImuxgn.js +1 -0
  27. package/dist/assets/cynefin-VYW2F7L2-CKc9sK58.js +178 -0
  28. package/dist/assets/cynefinDiagram-TSTJHNR4-_O9mLQTK.js +62 -0
  29. package/dist/assets/cytoscape.esm-DTSO7Bv0.js +331 -0
  30. package/dist/assets/dagre-VKFMJZFB-CMh1gN_B.js +4 -0
  31. package/dist/assets/de-BbF3ozkg.js +1 -0
  32. package/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
  33. package/dist/assets/diagram-FQU43EPY-Cay_5WYD.js +3 -0
  34. package/dist/assets/diagram-G47NLZAW-DT1H2wTP.js +24 -0
  35. package/dist/assets/diagram-NH7WQ7WH-xuvv_D9N.js +24 -0
  36. package/dist/assets/diagram-OA4YK3LP-Bio-u38F.js +30 -0
  37. package/dist/assets/diagram-WEI45ONY-CD_QL4nf.js +41 -0
  38. package/dist/assets/ebnfDiagram-CCIWWBDH-CkGukNGk.js +1 -0
  39. package/dist/assets/elk-api-CF2Hej0P.js +1 -0
  40. package/dist/assets/elk-worker.min-BENGc9gn.js +22 -0
  41. package/dist/assets/elk-worker.min-D32ngsh5.js +1 -0
  42. package/dist/assets/elk.bundled-ajwJAWsK.js +24 -0
  43. package/dist/assets/erDiagram-Q63AITRT-CQGtCq5E.js +85 -0
  44. package/dist/assets/es-BB-VRPmB.js +1 -0
  45. package/dist/assets/flowDiagram-23GEKE2U-E3_Lcv6A.js +156 -0
  46. package/dist/assets/ganttDiagram-NO4QXBWP-AwojtMZ1.js +292 -0
  47. package/dist/assets/gitGraphDiagram-IHSO6WYX-D0klOOBk.js +106 -0
  48. package/dist/assets/graph-C9eacEi8.js +1 -0
  49. package/dist/assets/icon-names.generated-Ch4zjdI9.js +1 -0
  50. package/dist/assets/index--A4RGzRu.js +277 -0
  51. package/dist/assets/index-B29u660W.js +1 -0
  52. package/dist/assets/index-BDuFgzVF.js +1 -0
  53. package/dist/assets/index-C-tHkbn_.js +1 -0
  54. package/dist/assets/index-C1mNJrF6.js +1 -0
  55. package/dist/assets/index-CbxBfG1v.css +1 -0
  56. package/dist/assets/index-XppXLvIK.js +1 -0
  57. package/dist/assets/infoDiagram-FWYZ7A6U-2op9tD2c.js +2 -0
  58. package/dist/assets/init-Gi6I4Gst.js +1 -0
  59. package/dist/assets/ishikawaDiagram-FXEZZL3T-B1UsYLso.js +70 -0
  60. package/dist/assets/it-z1Rr2vYL.js +1 -0
  61. package/dist/assets/ja-DMZcFTAH.js +1 -0
  62. package/dist/assets/journeyDiagram-5HDEW3XC-CZ1oYiAr.js +139 -0
  63. package/dist/assets/kanban-definition-HUTT4EX6-B-XWcB9M.js +89 -0
  64. package/dist/assets/katex-C5jXJg4s.js +257 -0
  65. package/dist/assets/layout-DEXfKzaS.js +1 -0
  66. package/dist/assets/linear-GMYYDbJv.js +1 -0
  67. package/dist/assets/map-Czzmt4hB.js +1 -0
  68. package/dist/assets/mermaid.core-pPiwjbNO.js +314 -0
  69. package/dist/assets/mindmap-definition-LN4V7U3C-BB4SGbrE.js +96 -0
  70. package/dist/assets/ordinal-Cboi1Yqb.js +1 -0
  71. package/dist/assets/pegDiagram-2B236MQR-3keJbrGj.js +1 -0
  72. package/dist/assets/pieDiagram-ENE6RG2P-CVi3ig0y.js +39 -0
  73. package/dist/assets/quadrantDiagram-ABIIQ3AL-CPp6gXbB.js +7 -0
  74. package/dist/assets/railroadDiagram-RFXS5EU6-BCILT-8k.js +1 -0
  75. package/dist/assets/requirementDiagram-TGXJPOKE-DgmaKLiT.js +84 -0
  76. package/dist/assets/sankeyDiagram-HTMAVEWB-DHGaI0hQ.js +40 -0
  77. package/dist/assets/sequenceDiagram-DBY2YBRQ-3AycEqxZ.js +162 -0
  78. package/dist/assets/sizeCapture-X5ZJPWSS-uS50b7bJ.js +1 -0
  79. package/dist/assets/stateDiagram-2N3HPSRC-DaBzZNwx.js +1 -0
  80. package/dist/assets/stateDiagram-v2-6OUMAXLB-xJOnXuvC.js +1 -0
  81. package/dist/assets/swimlanes-5IMT3BWC-BR44KNOm.js +2 -0
  82. package/dist/assets/swimlanesDiagram-G3AALYLV-B3xqzED0.js +8 -0
  83. package/dist/assets/timeline-definition-FHXFAJF6-Msxd070e.js +120 -0
  84. package/dist/assets/vennDiagram-L72KCM5P-W9VDq1l8.js +34 -0
  85. package/dist/assets/wardleyDiagram-EHGQE667-DfDvmnIe.js +78 -0
  86. package/dist/assets/xychartDiagram-FW5EYKEG-HwKD44hb.js +7 -0
  87. package/dist/assets/zh-B2oIvhee.js +1 -0
  88. package/dist/embed-demo.html +114 -0
  89. package/dist/index.html +102 -0
  90. package/dist/logo.png +0 -0
  91. package/dist/logo.svg +55 -0
  92. package/package.json +123 -0
@@ -0,0 +1,179 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * `npx archyne` — serve the built editor from this package and open it.
4
+ *
5
+ * Archyne is static files, so "running" it is just serving a directory. This
6
+ * exists so that trying it costs one command instead of a clone, an install
7
+ * and a build; that difference is most of whether an evaluation happens.
8
+ *
9
+ * No dependencies on purpose: a tool whose pitch is "nothing leaves your
10
+ * machine" should not pull a server framework to show you a local page.
11
+ *
12
+ * Binds to 127.0.0.1 deliberately. `--host` opts into a LAN-visible server,
13
+ * which is occasionally what you want for a tablet and never what you want by
14
+ * accident — the editor has no authentication because it has no accounts.
15
+ *
16
+ * npx archyne
17
+ * npx archyne diagram.mmd
18
+ * npx archyne --port 8080 --host --no-open
19
+ */
20
+ import { createServer } from "node:http";
21
+ import { readFile, stat } from "node:fs/promises";
22
+ import { join, normalize, extname, resolve, sep } from "node:path";
23
+ import { fileURLToPath } from "node:url";
24
+ import { spawn } from "node:child_process";
25
+
26
+ const ROOT = resolve(fileURLToPath(import.meta.url), "..", "..", "dist");
27
+
28
+ const TYPES = {
29
+ ".html": "text/html; charset=utf-8",
30
+ ".js": "text/javascript; charset=utf-8",
31
+ ".mjs": "text/javascript; charset=utf-8",
32
+ ".css": "text/css; charset=utf-8",
33
+ ".json": "application/json; charset=utf-8",
34
+ ".svg": "image/svg+xml",
35
+ ".png": "image/png",
36
+ ".jpg": "image/jpeg",
37
+ ".webp": "image/webp",
38
+ ".ico": "image/x-icon",
39
+ ".woff": "font/woff",
40
+ ".woff2": "font/woff2",
41
+ ".ttf": "font/ttf",
42
+ ".map": "application/json; charset=utf-8",
43
+ ".wasm": "application/wasm",
44
+ };
45
+
46
+ function parseArgs(argv) {
47
+ const opts = { port: 4173, open: true, host: false, file: null };
48
+ for (let i = 0; i < argv.length; i++) {
49
+ const arg = argv[i];
50
+ if (arg === "--port" || arg === "-p") opts.port = Number(argv[++i]);
51
+ else if (arg.startsWith("--port=")) opts.port = Number(arg.slice(7));
52
+ else if (arg === "--no-open") opts.open = false;
53
+ else if (arg === "--host") opts.host = true;
54
+ else if (arg === "--help" || arg === "-h") opts.help = true;
55
+ else if (arg === "--version" || arg === "-v") opts.version = true;
56
+ else if (!arg.startsWith("-")) opts.file = arg;
57
+ }
58
+ return opts;
59
+ }
60
+
61
+ const opts = parseArgs(process.argv.slice(2));
62
+
63
+ if (opts.help) {
64
+ console.log(`archyne — a visual editor for Mermaid diagrams
65
+
66
+ npx archyne [file.mmd] [options]
67
+
68
+ -p, --port <n> port to listen on (default 4173)
69
+ --host also listen on the LAN, not just 127.0.0.1
70
+ --no-open do not open a browser
71
+ -h, --help this message
72
+ -v, --version print the version
73
+
74
+ Everything runs locally: the editor is static files and makes no network
75
+ requests of its own. Diagrams stay in your browser and your filesystem.`);
76
+ process.exit(0);
77
+ }
78
+
79
+ if (opts.version) {
80
+ const pkg = JSON.parse(
81
+ await readFile(resolve(fileURLToPath(import.meta.url), "..", "..", "package.json"), "utf8"),
82
+ );
83
+ console.log(pkg.version);
84
+ process.exit(0);
85
+ }
86
+
87
+ if (!Number.isInteger(opts.port) || opts.port < 1 || opts.port > 65535) {
88
+ console.error(`Not a usable port: ${opts.port}`);
89
+ process.exit(1);
90
+ }
91
+
92
+ try {
93
+ await stat(join(ROOT, "index.html"));
94
+ } catch {
95
+ console.error(
96
+ `No build found at ${ROOT}.\n` +
97
+ `If you are running from a git checkout, run \`npm run build\` first.`,
98
+ );
99
+ process.exit(1);
100
+ }
101
+
102
+ /**
103
+ * A diagram given on the command line is handed over through `?code=`, which
104
+ * is the same share-link path the app already supports. URLs are not a
105
+ * reliable transport for arbitrarily large files, so oversize ones are left
106
+ * for the editor's own Open command rather than silently truncated.
107
+ */
108
+ const MAX_INLINE_BYTES = 32 * 1024;
109
+ let query = "";
110
+ if (opts.file) {
111
+ try {
112
+ const code = await readFile(opts.file, "utf8");
113
+ if (Buffer.byteLength(code) > MAX_INLINE_BYTES) {
114
+ console.warn(
115
+ `${opts.file} is larger than ${MAX_INLINE_BYTES / 1024} KB — open it from inside the editor instead.`,
116
+ );
117
+ } else {
118
+ query = `?code=${encodeURIComponent(code)}`;
119
+ }
120
+ } catch (err) {
121
+ console.error(`Could not read ${opts.file}: ${err.message}`);
122
+ process.exit(1);
123
+ }
124
+ }
125
+
126
+ const server = createServer(async (req, res) => {
127
+ try {
128
+ const url = new URL(req.url, "http://localhost");
129
+ const requested = decodeURIComponent(url.pathname);
130
+ // Resolve inside ROOT and verify it stayed there: `..` segments and
131
+ // encoded separators must not reach the rest of the filesystem.
132
+ const candidate = normalize(join(ROOT, requested === "/" ? "/index.html" : requested));
133
+ if (candidate !== ROOT && !candidate.startsWith(ROOT + sep)) {
134
+ res.writeHead(403).end("Forbidden");
135
+ return;
136
+ }
137
+
138
+ const body = await readFile(candidate);
139
+ res.writeHead(200, {
140
+ "content-type": TYPES[extname(candidate).toLowerCase()] ?? "application/octet-stream",
141
+ // The build is content-hashed except for index.html, which must not be
142
+ // cached or a stale shell survives an upgrade.
143
+ "cache-control": candidate.endsWith("index.html")
144
+ ? "no-cache"
145
+ : "public, max-age=31536000, immutable",
146
+ });
147
+ res.end(body);
148
+ } catch {
149
+ res.writeHead(404, { "content-type": "text/plain; charset=utf-8" }).end("Not found");
150
+ }
151
+ });
152
+
153
+ server.on("error", (err) => {
154
+ if (err.code === "EADDRINUSE") {
155
+ console.error(`Port ${opts.port} is already in use — try \`--port ${opts.port + 1}\`.`);
156
+ process.exit(1);
157
+ }
158
+ throw err;
159
+ });
160
+
161
+ server.listen(opts.port, opts.host ? "0.0.0.0" : "127.0.0.1", () => {
162
+ const url = `http://localhost:${opts.port}/${query}`;
163
+ console.log(`Archyne is running at http://localhost:${opts.port}/`);
164
+ if (opts.host)
165
+ console.log("Also reachable on your local network (--host). There is no login.");
166
+ console.log("Press Ctrl+C to stop.");
167
+ if (opts.open) {
168
+ const [cmd, args] =
169
+ process.platform === "win32"
170
+ ? ["cmd", ["/c", "start", "", url]]
171
+ : process.platform === "darwin"
172
+ ? ["open", [url]]
173
+ : ["xdg-open", [url]];
174
+ // Best effort: a headless box has no browser, and that is not an error.
175
+ spawn(cmd, args, { stdio: "ignore", detached: true })
176
+ .on("error", () => {})
177
+ .unref();
178
+ }
179
+ });
@@ -0,0 +1,141 @@
1
+ /**
2
+ * Archyne desktop shell: a thin Electron window around the static build.
3
+ * Everything still runs locally in the renderer — no backend, no network.
4
+ */
5
+ const { app, BrowserWindow, dialog, ipcMain, shell } = require("electron");
6
+ const path = require("node:path");
7
+ const fs = require("node:fs");
8
+ const fsp = require("node:fs/promises");
9
+
10
+ /**
11
+ * .mmd file passed on the command line (double-click / "open with").
12
+ * @param {string[]} argv
13
+ * @returns {string | undefined}
14
+ */
15
+ function fileArg(argv) {
16
+ return argv.find((a) => a.toLowerCase().endsWith(".mmd") && fs.existsSync(a));
17
+ }
18
+
19
+ /**
20
+ * File the app was launched with, handed to the renderer over IPC once it
21
+ * asks. Passing it through the URL — as this used to — broke on large
22
+ * diagrams and lost the path, so saving could never write back to it.
23
+ * @type {string | undefined}
24
+ */
25
+ let pendingFile;
26
+
27
+ const FILTERS = [
28
+ { name: "Mermaid diagram", extensions: ["mmd", "mermaid"] },
29
+ { name: "All files", extensions: ["*"] },
30
+ ];
31
+
32
+ /** @param {string} [openFile] */
33
+ function createWindow(openFile) {
34
+ if (openFile) pendingFile = openFile;
35
+
36
+ const win = new BrowserWindow({
37
+ width: 1440,
38
+ height: 920,
39
+ // The layout now collapses the palette and side panel into drawers below
40
+ // 900px, so the window no longer has to stay that wide to be usable.
41
+ minWidth: 680,
42
+ minHeight: 520,
43
+ backgroundColor: "#12141a",
44
+ autoHideMenuBar: true,
45
+ icon: path.join(__dirname, "..", "build", "icon.png"),
46
+ webPreferences: {
47
+ contextIsolation: true,
48
+ nodeIntegration: false,
49
+ sandbox: true,
50
+ preload: path.join(__dirname, "preload.cjs"),
51
+ },
52
+ });
53
+
54
+ // External links open in the default browser, not in the app.
55
+ win.webContents.setWindowOpenHandler(({ url }) => {
56
+ void shell.openExternal(url);
57
+ return { action: "deny" };
58
+ });
59
+
60
+ void win.loadFile(path.join(__dirname, "..", "dist", "index.html"));
61
+ return win;
62
+ }
63
+
64
+ /**
65
+ * Read a file for the renderer; a failure surfaces as a rejected invoke.
66
+ * @param {string} filePath
67
+ */
68
+ async function readFile(filePath) {
69
+ return { path: filePath, content: await fsp.readFile(filePath, "utf8") };
70
+ }
71
+
72
+ function registerIpc() {
73
+ ipcMain.handle("archyne:opened-file", async () => {
74
+ if (!pendingFile) return null;
75
+ const filePath = pendingFile;
76
+ pendingFile = undefined; // hand it over exactly once
77
+ return readFile(filePath);
78
+ });
79
+
80
+ ipcMain.handle("archyne:show-open", async (event) => {
81
+ // The sender's window can already be gone if the user closed it mid-call;
82
+ // fall back to an app-modal dialog rather than crashing.
83
+ const win = BrowserWindow.fromWebContents(event.sender);
84
+ /** @type {import("electron").OpenDialogOptions} */
85
+ const options = { properties: ["openFile"], filters: FILTERS };
86
+ const { canceled, filePaths } = win
87
+ ? await dialog.showOpenDialog(win, options)
88
+ : await dialog.showOpenDialog(options);
89
+ if (canceled || filePaths.length === 0) return null;
90
+ return readFile(filePaths[0]);
91
+ });
92
+
93
+ ipcMain.handle("archyne:show-save", async (event, { defaultPath, content }) => {
94
+ const win = BrowserWindow.fromWebContents(event.sender);
95
+ const options = { defaultPath, filters: FILTERS };
96
+ const { canceled, filePath } = win
97
+ ? await dialog.showSaveDialog(win, options)
98
+ : await dialog.showSaveDialog(options);
99
+ if (canceled || !filePath) return null;
100
+ await fsp.writeFile(filePath, content, "utf8");
101
+ return filePath;
102
+ });
103
+
104
+ ipcMain.handle("archyne:write-file", async (_event, { path: filePath, content }) => {
105
+ await fsp.writeFile(filePath, content, "utf8");
106
+ });
107
+ }
108
+
109
+ const gotLock = app.requestSingleInstanceLock();
110
+ if (!gotLock) {
111
+ app.quit();
112
+ } else {
113
+ app.on("second-instance", (_e, argv) => {
114
+ const file = fileArg(argv.slice(1));
115
+ const [existing] = BrowserWindow.getAllWindows();
116
+ if (existing) {
117
+ // Reuse the running window rather than stacking another one up.
118
+ if (existing.isMinimized()) existing.restore();
119
+ existing.focus();
120
+ if (file) {
121
+ void readFile(file).then((payload) =>
122
+ existing.webContents.send("archyne:open-file", payload),
123
+ );
124
+ }
125
+ return;
126
+ }
127
+ createWindow(file);
128
+ });
129
+
130
+ void app.whenReady().then(() => {
131
+ registerIpc();
132
+ createWindow(fileArg(process.argv.slice(1)));
133
+ app.on("activate", () => {
134
+ if (BrowserWindow.getAllWindows().length === 0) createWindow();
135
+ });
136
+ });
137
+
138
+ app.on("window-all-closed", () => {
139
+ if (process.platform !== "darwin") app.quit();
140
+ });
141
+ }
@@ -0,0 +1 @@
1
+ function r(o){throw new Error('Could not dynamically require "'+o+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}export{r as c};
@@ -0,0 +1 @@
1
+ import{g as p,r as u,d as a}from"./chunk-MOJQB5TN-M9vORODQ.js";import{p as f}from"./chunk-JWPE2WC7-Bs6js5ed.js";import{_ as n,l as o}from"./mermaid.core-pPiwjbNO.js";import"./index--A4RGzRu.js";import{M as c,b as d}from"./cynefin-VYW2F7L2-CKc9sK58.js";var v=d().RailroadAbnf.parser.LangiumParser,i=n(e=>{const r=e.alternatives.map(g);return r.length===1?r[0]:{type:"choice",alternatives:r}},"transformAlternation"),g=n(e=>{const r=e.elements.map(y);return r.length===1?r[0]:{type:"sequence",elements:r}},"transformConcatenation"),b=n(e=>{if(e.includes("*")){const[t,s]=e.split("*"),l=t?parseInt(t,10):0,m=s?parseInt(s,10):1/0;return{min:l,max:m}}const r=parseInt(e,10);return{min:r,max:r}},"parseRepeat"),y=n(e=>{const r=A(e.primary);if(!e.repeat)return r;const{min:t,max:s}=b(e.repeat);return t===0&&s===1?{type:"optional",element:r}:{type:"repetition",element:r,min:t,max:s}},"transformElement"),A=n(e=>{switch(e.$type){case"AbnfStringLiteral":return{type:"terminal",value:e.value};case"AbnfNumVal":return{type:"terminal",value:e.value};case"AbnfRuleName":return{type:"nonterminal",name:e.name};case"AbnfGroup":return i(e.element);case"AbnfOptionalGroup":return{type:"optional",element:i(e.element)};default:throw new Error(`Unsupported ABNF primary node: ${e.$type}`)}},"transformPrimary"),P=n(e=>({name:e.name,definition:i(e.definition)}),"transformRule"),h=n(e=>{f(e,a),e.title&&a.setTitle(e.title),e.rules.map(r=>a.addRule(P(r)))},"populateDb"),R={parse:n(e=>{a.clear(),o.debug("[ABNF Parser] Starting Langium parse");const r=v.parse(e);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new c(r);const t=r.value;o.debug("[ABNF Parser] Parsed rules:",t.rules.length),h(t),o.debug("[ABNF Parser] Parse complete")},"parse"),parser:{yy:a}},B={parser:R,db:a,renderer:u,styles:p};export{B as diagram};
@@ -0,0 +1 @@
1
+ const e={"app.name":"Archyne","app.tagline":"محرر الرسوم البيانية المرئي","app.loading":"جارٍ تحميل محرك الرسوم…","kind.flowchart":"مخطط انسيابي","kind.state":"مخطط الحالات","kind.er":"مخطط الكيانات والعلاقات","kind.class":"مخطط الفئات","kind.sequence":"مخطط التتابع","kind.architecture":"البنية","kind.c4":"نموذج C4","toolbar.about":"حول Archyne والتراخيص","toolbar.aboutTitle":"حول والتراخيص","toolbar.shapesDrawer":"الأشكال","toolbar.codeDrawer":"الشيفرة","toolbar.direction":"الاتجاه","toolbar.dirTB":"من أعلى إلى أسفل","toolbar.dirLR":"من اليسار إلى اليمين","toolbar.dirBT":"من أسفل إلى أعلى","toolbar.dirRL":"من اليمين إلى اليسار","toolbar.undo":"تراجع","toolbar.undoHint":"تراجع (Ctrl+Z)","toolbar.redo":"إعادة","toolbar.redoHint":"إعادة (Ctrl+Y)","toolbar.autoLayout":"تخطيط تلقائي","toolbar.new":"جديد…","toolbar.newDiagram":"مخطط جديد","toolbar.open":"فتح","toolbar.save":"حفظ ‎.mmd","toolbar.export":"تصدير…","toolbar.copyCode":"نسخ الشيفرة","toolbar.copied":"تم النسخ!","toolbar.theme":"المظهر","toolbar.themeDark":"داكن","toolbar.themeLight":"فاتح","toolbar.themeSystem":"النظام","toolbar.language":"اللغة","panel.sourceAndInspector":"الشيفرة والمفتش","panel.mermaidSource":"شيفرة mermaid","panel.sourceView":"عرض الشيفرة","panel.tabCode":"Mermaid","panel.tabPreview":"معاينة","panel.cannotRender":"تعذّر العرض: {message}","palette.shapes":"لوحة الأشكال","palette.architecture":"لوحة البنية","palette.hint":"اسحب إلى اللوحة، أو انقر للإضافة","palette.close":"إغلاق اللوحة","palette.search":"البحث عن الأيقونات","palette.noIcons":"لم يُعثر على أيقونات","palette.favorites":"المفضلة","palette.addFavorite":"إضافة إلى المفضلة","palette.removeFavorite":"إزالة من المفضلة","palette.add":"إضافة {name}","shape.square":"عملية","shape.round":"مستدير","shape.stadium":"نهاية","shape.subroutine":"روتين فرعي","shape.cylinder":"قاعدة بيانات","shape.circle":"دائرة","shape.doublecircle":"دائرة مزدوجة","shape.diamond":"قرار","shape.hexagon":"سداسي","shape.odd":"علَم","shape.trapezoid":"شبه منحرف","shape.inv_trapezoid":"شبه منحرف معكوس","shape.lean_right":"إدخال/إخراج","shape.lean_left":"إخراج/إدخال","shape.group":"مجموعة","item.state":"حالة","item.start":"بداية","item.end":"نهاية","item.choice":"اختيار","item.forkJoin":"تفرّع / دمج","item.entity":"كيان","item.class":"فئة","item.note":"ملاحظة","item.person":"شخص","item.system":"نظام","item.systemExt":"نظام (خارجي)","item.systemDb":"قاعدة بيانات النظام","item.container":"حاوية","item.component":"مكوّن","item.participant":"مشارك","item.actor":"فاعل","item.loop":"حلقة","item.altElse":"Alt / Else","item.opt":"Opt","item.subgraph":"مخطط فرعي","canvas.label":"لوحة المخطط","canvas.keyboardHelp":"اضغط Tab للتنقل بين العقد. اضغط C على عقدة لبدء اتصال، ثم Enter على عقدة أخرى لإتمامه، أو Escape للإلغاء. اضغط Delete لحذف العقدة المحددة.","canvas.connectStart":"جارٍ الاتصال من {name}. انتقل إلى عقدة أخرى واضغط Enter.","canvas.connectDone":"تم الاتصال من {from} إلى {to}.","canvas.connectCancelled":"أُلغي الاتصال.","canvas.connectSameNode":"اختر عقدة مختلفة للاتصال بها.","menu.actions":"إجراءات المخطط","menu.rename":"إعادة تسمية","menu.ungroup":"فك التجميع","menu.deleteGroup":"حذف المجموعة","menu.duplicate":"تكرار","menu.copy":"نسخ","menu.removeFromGroup":"إزالة من المجموعة","menu.delete":"حذف","menu.groupNodes":"تجميع {count} عقدة","menu.deleteSelection":"حذف التحديد","menu.editLabel":"تحرير التسمية","menu.addNodeHere":"إضافة عقدة هنا","menu.paste":"لصق","menu.autoLayout":"تخطيط تلقائي","export.title":"تصدير المخطط","export.source":"المصدر","export.sourceCanvas":"اللوحة (كما هي مرتبة هنا)","export.sourceMermaid":"محرك mermaid (المظهر القياسي)","export.format":"الصيغة","export.formatPng":"PNG","export.formatSvg":"SVG (متجهي)","export.background":"الخلفية","export.bgDark":"داكنة","export.bgLight":"بيضاء","export.bgTransparent":"شفافة","export.mermaidTheme":"مظهر mermaid","export.quality":"الجودة","export.quality1":"‎1×‎ (شاشة)","export.quality2":"‎2×‎ (شرائح)","export.quality3":"‎3×‎ (طباعة)","export.margin":"الهامش ({padding} بكسل)","export.generating":"جارٍ إنشاء المعاينة…","export.previewAlt":"معاينة المخطط المصدَّر","export.cancel":"إلغاء","export.confirm":"تصدير {format}","about.title":"حول Archyne","about.trademark":"‏Archyne مشروع مستقل. وهو غير تابع لـ Mermaid أو Mermaid Chart ولا معتمد أو مموّل منهما. «Mermaid» علامة تجارية لمالكها، وتُستخدم هنا فقط لوصف صيغة الملفات التي يقرؤها Archyne ويكتبها.","about.close":"إغلاق","about.version":"الإصدار {version}","inspector.diagram":"المخطط","inspector.accTitle":"عنوان الوصول (accTitle)","inspector.accDescr":"وصف الوصول (accDescr)","inspector.empty":"حدّد عقدة أو حافة لتحريرها. انقر نقرًا مزدوجًا على مساحة فارغة لإضافة عقدة، واسحب بين المقابض للربط.","palette.sectionShapes":"الأشكال","palette.sectionBase":"أساسية","palette.sectionPinned":"الأخيرة والمفضلة","palette.sectionVendor":"أيقونات المزوّدين","palette.searchIcons":"ابحث في أكثر من 13000 أيقونة…","item.compositeState":"حالة مركّبة","item.boundary":"حدّ","item.namespace":"مساحة الأسماء","item.junction":"وصلة","insp.label":"التسمية","insp.shape":"الشكل","insp.fill":"التعبئة","insp.border":"الحدود","insp.text":"النص","insp.reset":"إعادة تعيين","insp.name":"الاسم","insp.attributes":"السمات — واحدة في كل سطر:","insp.junction":"وصلة — نقطة عبور للموصّل.","insp.pseudoState":"حالة زائفة {type}","insp.elementType":"نوع العنصر","insp.description":"الوصف","insp.kind":"النوع","insp.participantBox":"مشارك (صندوق)","insp.actorPerson":"فاعل (شخص)","insp.annotations":"التعليقات التوضيحية — مثل","insp.annotationsHint":"(مفصولة بمسافات)","insp.arrow":"سهم","insp.line":"الخط","insp.lineSolid":"متصل","insp.lineDotted":"منقّط","insp.lineThick":"سميك","insp.arrowPoint":"سهم","insp.arrowNone":"بلا","insp.arrowCircle":"دائرة","insp.arrowCross":"صليب","insp.bothEnds":"رؤوس أسهم في الطرفين","insp.identifying":"معرِّفة (خط متصل)","insp.technology":"التقنية","insp.techPlaceholder":"مثل HTTPS/JSON","insp.bidirectional":"ثنائي الاتجاه","insp.dottedLine":"خط منقّط","insp.cardOnePlaceholder":"مثل 1","insp.cardManyPlaceholder":"مثل كثير","insp.diagramTitle":"المخطط","insp.title":"العنوان","error.crashTitle":"حدث خطأ أثناء العرض","error.crashIntro":"مخططك بأمان — هذه شيفرته الحالية. انسخها في مكان ما إن ساورك الشك، ثم حاول الاستعادة:","error.reset":"إعادة التعيين إلى المخطط النموذجي وإعادة التحميل","insp.groupTitle":"مجموعة {id}","insp.nodeTitle":"عقدة {id}","insp.edgeTitle":"حافة {source} ← {target}","seq.notePlaceholder":"نص الملاحظة","seq.dragReorder":"اسحب عموديًا لإعادة الترتيب","seq.delete":"حذف","seq.done":"تم","seq.over":"فوق","seq.leftOf":"يسار","seq.rightOf":"يمين","unsupported.title":"للقراءة فقط: مخططات {type}","unsupported.body":"لا يملك Archyne بعد محررًا مرئيًا لهذه العائلة من المخططات، لذا فاللوحة للقراءة فقط. شيفرة mermaid قابلة للتحرير بالكامل، والحفظ يُبقي ملفك كما هو تمامًا.","unsupported.badge":"{type} (للقراءة فقط)","unsupported.paletteHint":"هذه العائلة من المخططات للقراءة فقط. حرّرها بصيغة شيفرة mermaid في اللوحة الجانبية.","toolbar.saveAs":"حفظ باسم…","file.unsaved":"تغييرات غير محفوظة","file.untitled":"مخطط بلا عنوان","file.confirmDiscard":"يحتوي هذا المخطط على تغييرات غير محفوظة. هل تريد المغادرة على أي حال؟","toast.dismiss":"إغلاق","toast.saved":"تم الحفظ","toast.copied":"تم نسخ شيفرة mermaid","toast.saveFailed":"تعذّر الحفظ","toast.openFailed":"تعذّر فتح الملف","shortcuts.title":"اختصارات لوحة المفاتيح","shortcuts.file":"ملف","shortcuts.edit":"تحرير","shortcuts.canvas":"اللوحة","shortcuts.view":"عرض","shortcuts.selectAll":"تحديد الكل","shortcuts.nextNode":"التنقل بين العقد","shortcuts.connect":"بدء اتصال من العقدة المحددة","shortcuts.completeConnect":"إتمام الاتصال","shortcuts.cancel":"إلغاء","shortcuts.nudge":"تحريك التحديد","shortcuts.nudgeFar":"تحريك أبعد","shortcuts.commandPalette":"لوحة الأوامر","panel.tabOutline":"المخطط التفصيلي","outline.filter":"تصفية العقد","outline.empty":"لا توجد عقد مطابقة","outline.noNodes":"لا يحتوي هذا المخطط على عقد بعد.","outline.connections":"{count} صادرة","outline.select":"تحديد {name}","outline.summary":"{nodes} عقدة، {edges} اتصالاً","palette.commandTitle":"لوحة الأوامر","palette.commandFilter":"اكتب أمرًا أو اسم عقدة","palette.commandEmpty":"لا توجد نتائج","palette.groupCommands":"الأوامر","palette.groupNodes":"الانتقال إلى عقدة","palette.groupNew":"مخطط جديد","cmd.run":"تشغيل","tpl.title":"ابدأ من قالب","tpl.blank":"مخطط فارغ","tpl.blankDesc":"{kind} فارغ لتبنيه بنفسك.","tpl.open":"القوالب","tpl.approval":"سير عمل الموافقات","tpl.approvalDesc":"قرارات متفرعة بنتيجتين.","tpl.auth":"تدفق تسجيل الدخول","tpl.authDesc":"رسائل بين المستخدم والتطبيق والخدمة، مع كتلة alt.","tpl.orders":"مخطط الطلبات","tpl.ordersDesc":"العملاء والطلبات والمنتجات بعلاقات قدم الغراب.","tpl.webapp":"تطبيق ويب","tpl.webappDesc":"نشر سحابي بمجموعات متداخلة وأيقونات المزوّدين.","tpl.orderState":"دورة حياة الطلب","tpl.orderStateDesc":"الحالات والانتقالات من مسودة إلى مُسلَّم.","tpl.domain":"نموذج المجال","tpl.domainDesc":"فئات بحقول وطرق وعلاقات.","tpl.context":"سياق النظام","tpl.contextDesc":"الأشخاص والأنظمة حول منتج واحد، بأسلوب C4.","toolbar.more":"المزيد","error.title":"حدث خطأ ما","error.reload":"إعادة التحميل"};export{e as messages};
@@ -0,0 +1 @@
1
+ import{S as ln,T as an,V as z,W as S,X,Y as un,$ as y,a0 as tn,a1 as F,a2 as _,a3 as rn,a4 as o,a5 as on,a6 as sn,a7 as fn}from"./mermaid.core-pPiwjbNO.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,E,q,v,A,Y,a){var I=E-l,i=q-h,n=Y-v,d=a-A,u=d*I-n*i;if(!(u*u<y))return u=(n*(h-A)-d*(l-v))/u,[l+u*I,h+u*i]}function M(l,h,E,q,v,A,Y){var a=l-E,I=h-q,i=(Y?A:-A)/F(a*a+I*I),n=i*I,d=-i*a,u=l+n,s=h+d,f=E+n,c=q+d,$=(u+f)/2,t=(s+c)/2,m=f-u,g=c-s,R=m*m+g*g,T=v-A,P=u*c-f*s,O=(g<0?-1:1)*F(on(0,T*T*R-P*P)),V=(P*g-m*O)/R,W=(-P*m-g*O)/R,w=(P*g+m*O)/R,p=(-P*m+g*O)/R,x=V-$,e=W-t,r=w-$,j=p-t;return x*x+e*e>r*r+j*j&&(V=w,W=p),{cx:V,cy:W,x01:-n,y01:-d,x11:V*(v/T-1),y11:W*(v/T-1)}}function hn(){var l=cn,h=yn,E=X(0),q=null,v=gn,A=dn,Y=mn,a=null,I=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-un,c=A.apply(this,arguments)-un,$=rn(c-f),t=c>f;if(a||(a=n=I()),s<u&&(d=s,s=u,u=d),!(s>y))a.moveTo(0,0);else if($>tn-y)a.moveTo(s*z(f),s*S(f)),a.arc(0,0,s,f,c,!t),u>y&&(a.moveTo(u*z(c),u*S(c)),a.arc(0,0,u,c,f,t));else{var m=f,g=c,R=f,T=c,P=$,O=$,V=Y.apply(this,arguments)/2,W=V>y&&(q?+q.apply(this,arguments):F(u*u+s*s)),w=_(rn(s-u)/2,+E.apply(this,arguments)),p=w,x=w,e,r;if(W>y){var j=sn(W/u*S(V)),G=sn(W/s*S(V));(P-=j*2)>y?(j*=t?1:-1,R+=j,T-=j):(P=0,R=T=(f+c)/2),(O-=G*2)>y?(G*=t?1:-1,m+=G,g-=G):(O=0,m=g=(f+c)/2)}var B=s*z(m),C=s*S(m),H=u*z(T),J=u*S(T);if(w>y){var K=s*z(g),L=s*S(g),N=u*z(R),Q=u*S(R),D;if($<an)if(D=pn(B,C,N,Q,K,L,H,J)){var U=B-D[0],Z=C-D[1],k=K-D[0],b=L-D[1],nn=1/S(fn((U*k+Z*b)/(F(U*U+Z*Z)*F(k*k+b*b)))/2),en=F(D[0]*D[0]+D[1]*D[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}O>y?x>y?(e=M(N,Q,B,C,s,x,t),r=M(K,L,H,J,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(B,C),a.arc(0,0,s,m,g,!t)):a.moveTo(B,C),!(u>y)||!(P>y)?a.lineTo(H,J):p>y?(e=M(H,J,K,L,u,-p,t),r=M(B,C,N,Q,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,R,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +A.apply(this,arguments))/2-an/2;return[z(d)*n,S(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:X(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:X(+n),i):h},i.cornerRadius=function(n){return arguments.length?(E=typeof n=="function"?n:X(+n),i):E},i.padRadius=function(n){return arguments.length?(q=n==null?null:typeof n=="function"?n:X(+n),i):q},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:X(+n),i):v},i.endAngle=function(n){return arguments.length?(A=typeof n=="function"?n:X(+n),i):A},i.padAngle=function(n){return arguments.length?(Y=typeof n=="function"?n:X(+n),i):Y},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};