@elixpo/lixsketch 5.5.10 → 5.5.11

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.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/core/MermaidStructuredRenderer.js"],
4
+ "sourcesContent": ["/* eslint-disable */\n/**\n * Native renderers for Mermaid ER and chart diagrams.\n *\n * Preview is SVG, while canvas placement deliberately creates ordinary\n * LixSketch shapes. That keeps entities, attributes, relationships, bars,\n * points, and legend items independently selectable and editable.\n */\n\nconst NS = 'http://www.w3.org/2000/svg';\nconst PALETTE = [\n { fill: '#dfeee4', stroke: '#5f836c' },\n { fill: '#f4e3d4', stroke: '#a97852' },\n { fill: '#e9e1ef', stroke: '#7e6b91' },\n { fill: '#f3edc9', stroke: '#9a8745' },\n { fill: '#dcebed', stroke: '#5d7f82' },\n { fill: '#f1dedc', stroke: '#9a6863' },\n];\n\nfunction escapeXml(value) {\n return String(value ?? '')\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n\nfunction isDark() {\n return typeof document !== 'undefined' && document.body?.classList.contains('theme-dark');\n}\n\nfunction theme() {\n return isDark()\n ? { bg: '#20232a', text: '#f0eee8', line: '#aaa89f', frame: '#77766f', panel: '#292d34' }\n : { bg: '#fbfaf6', text: '#343832', line: '#6e746c', frame: '#b9b7ac', panel: '#f5f2ea' };\n}\n\nfunction sourceLines(src) {\n return src.split('\\n').map(line => line.trim()).filter(line => line && !line.startsWith('%%'));\n}\n\nexport function detectStructuredMermaid(src) {\n const header = sourceLines(src)[0]?.toLowerCase() || '';\n if (header === 'erdiagram') return 'er';\n if (/^pie(?:\\s|$)/.test(header) || /^xychart(?:-beta)?(?:\\s|$)/.test(header)) return 'chart';\n return null;\n}\n\n// ---------------------------------------------------------------------\n// Entity relationship diagrams\n// ---------------------------------------------------------------------\n\nexport function parseERDiagram(src) {\n const lines = sourceLines(src);\n if (lines[0]?.toLowerCase() !== 'erdiagram') return null;\n\n const entityMap = new Map();\n const relationships = [];\n let current = null;\n\n const ensureEntity = (name) => {\n if (!entityMap.has(name)) entityMap.set(name, { name, attributes: [] });\n return entityMap.get(name);\n };\n\n for (let index = 1; index < lines.length; index++) {\n const line = lines[index];\n const entityStart = line.match(/^([\\w-]+)\\s*\\{$/);\n if (entityStart) {\n current = ensureEntity(entityStart[1]);\n continue;\n }\n if (line === '}') {\n current = null;\n continue;\n }\n if (current) {\n const attribute = line.match(/^(\\S+)\\s+(\\S+)(?:\\s+(.+))?$/);\n if (attribute) {\n current.attributes.push({\n type: attribute[1],\n name: attribute[2],\n key: attribute[3] || '',\n });\n }\n continue;\n }\n\n // CUSTOMER ||--o{ ORDER : places\n const relation = line.match(/^([\\w-]+)\\s+([|o}{.]+)(?:--|\\.\\.)([|o}{.]+)\\s+([\\w-]+)\\s*:\\s*(.+)$/);\n if (relation) {\n ensureEntity(relation[1]);\n ensureEntity(relation[4]);\n relationships.push({\n from: relation[1],\n fromCardinality: relation[2],\n toCardinality: relation[3],\n to: relation[4],\n label: relation[5],\n });\n }\n }\n\n if (entityMap.size === 0) return null;\n return { type: 'erDiagram', title: 'Entity relationship diagram', entities: [...entityMap.values()], relationships };\n}\n\nfunction layoutER(diagram) {\n const width = 230;\n const headerHeight = 44;\n const rowHeight = 30;\n const columns = Math.max(1, Math.ceil(Math.sqrt(diagram.entities.length)));\n return diagram.entities.map((entity, index) => ({\n ...entity,\n x: 60 + (index % columns) * 330,\n y: 55 + Math.floor(index / columns) * 270,\n width,\n headerHeight,\n rowHeight,\n height: headerHeight + Math.max(1, entity.attributes.length) * rowHeight,\n color: PALETTE[index % PALETTE.length],\n }));\n}\n\nexport function renderERPreviewSVG(diagram) {\n if (!diagram?.entities?.length) return '';\n const TK = theme();\n const entities = layoutER(diagram);\n const byName = new Map(entities.map(entity => [entity.name, entity]));\n const maxX = Math.max(...entities.map(entity => entity.x + entity.width)) + 60;\n const maxY = Math.max(...entities.map(entity => entity.y + entity.height)) + 55;\n let content = `<rect width=\"${maxX}\" height=\"${maxY}\" rx=\"10\" fill=\"${TK.bg}\"/>`;\n content += `<defs><marker id=\"er-arrow\" markerWidth=\"9\" markerHeight=\"7\" refX=\"8\" refY=\"3.5\" orient=\"auto\"><path d=\"M1 1 L8 3.5 L1 6\" fill=\"none\" stroke=\"${TK.line}\" stroke-width=\"1.4\"/></marker></defs>`;\n\n for (const relation of diagram.relationships) {\n const from = byName.get(relation.from);\n const to = byName.get(relation.to);\n if (!from || !to) continue;\n const x1 = from.x + from.width / 2;\n const y1 = from.y + from.height / 2;\n const x2 = to.x + to.width / 2;\n const y2 = to.y + to.height / 2;\n const mx = (x1 + x2) / 2;\n const my = (y1 + y2) / 2;\n content += `<line x1=\"${x1}\" y1=\"${y1}\" x2=\"${x2}\" y2=\"${y2}\" stroke=\"${TK.line}\" stroke-width=\"1.6\" marker-end=\"url(#er-arrow)\"/>`;\n content += `<text x=\"${mx}\" y=\"${my - 8}\" text-anchor=\"middle\" fill=\"${TK.text}\" font-size=\"12\" font-family=\"lixFont\">${escapeXml(`${relation.fromCardinality} ${relation.label} ${relation.toCardinality}`)}</text>`;\n }\n\n for (const entity of entities) {\n content += `<g><rect x=\"${entity.x}\" y=\"${entity.y}\" width=\"${entity.width}\" height=\"${entity.height}\" rx=\"8\" fill=\"${TK.panel}\" stroke=\"${entity.color.stroke}\" stroke-width=\"1.5\"/>`;\n content += `<rect x=\"${entity.x}\" y=\"${entity.y}\" width=\"${entity.width}\" height=\"${entity.headerHeight}\" rx=\"8\" fill=\"${entity.color.fill}\" stroke=\"${entity.color.stroke}\" stroke-width=\"1.5\"/>`;\n content += `<text x=\"${entity.x + entity.width / 2}\" y=\"${entity.y + 27}\" text-anchor=\"middle\" fill=\"#343832\" font-size=\"14\" font-weight=\"600\" font-family=\"lixFont\">${escapeXml(entity.name)}</text>`;\n const attributes = entity.attributes.length ? entity.attributes : [{ type: '', name: 'No attributes', key: '' }];\n attributes.forEach((attribute, row) => {\n const y = entity.y + entity.headerHeight + row * entity.rowHeight;\n content += `<line x1=\"${entity.x}\" y1=\"${y}\" x2=\"${entity.x + entity.width}\" y2=\"${y}\" stroke=\"${TK.frame}\" stroke-width=\"0.8\"/>`;\n content += `<text x=\"${entity.x + 10}\" y=\"${y + 20}\" fill=\"${TK.text}\" font-size=\"11\" font-family=\"lixCode\">${escapeXml([attribute.type, attribute.name, attribute.key].filter(Boolean).join(' '))}</text>`;\n });\n content += '</g>';\n }\n return `<svg xmlns=\"${NS}\" width=\"600\" height=\"450\" viewBox=\"0 0 ${maxX} ${maxY}\">${content}</svg>`;\n}\n\n// ---------------------------------------------------------------------\n// Pie and XY charts\n// ---------------------------------------------------------------------\n\nfunction numberList(value) {\n return value.replace(/^\\[|\\]$/g, '').split(',').map(item => Number(item.trim())).filter(Number.isFinite);\n}\n\nexport function parseChartDiagram(src) {\n const lines = sourceLines(src);\n const header = lines[0]?.toLowerCase() || '';\n if (/^pie(?:\\s|$)/.test(header)) {\n let title = lines[0].replace(/^pie(?:\\s+showData)?\\s*/i, '').replace(/^title\\s+/i, '').trim() || 'Pie chart';\n const values = [];\n for (let index = 1; index < lines.length; index++) {\n const titleMatch = lines[index].match(/^title\\s+(.+)$/i);\n if (titleMatch) { title = titleMatch[1]; continue; }\n const item = lines[index].match(/^\"?(.+?)\"?\\s*:\\s*(-?\\d+(?:\\.\\d+)?)$/);\n if (item) values.push({ label: item[1], value: Number(item[2]) });\n }\n return values.length ? { type: 'chart', kind: 'pie', title, categories: values.map(v => v.label), series: [{ name: title, values: values.map(v => v.value) }] } : null;\n }\n if (!/^xychart(?:-beta)?(?:\\s|$)/.test(header)) return null;\n let title = 'Chart';\n let categories = [];\n const series = [];\n for (let index = 1; index < lines.length; index++) {\n const titleMatch = lines[index].match(/^title\\s+\"?(.+?)\"?$/i);\n const axisMatch = lines[index].match(/^x-axis(?:\\s+\".*?\")?\\s+(\\[.+\\])/i);\n const seriesMatch = lines[index].match(/^(bar|line)(?:\\s+\"?([^\"\\[]+)\"?)?\\s+(\\[.+\\])$/i);\n if (titleMatch) title = titleMatch[1];\n else if (axisMatch) categories = axisMatch[1].replace(/^\\[|\\]$/g, '').split(',').map(v => v.trim().replace(/^\"|\"$/g, ''));\n else if (seriesMatch) series.push({ kind: seriesMatch[1].toLowerCase(), name: seriesMatch[2]?.trim() || seriesMatch[1], values: numberList(seriesMatch[3]) });\n }\n const maxItems = Math.max(0, ...series.map(item => item.values.length));\n if (!categories.length) categories = Array.from({ length: maxItems }, (_, index) => String(index + 1));\n return series.length ? { type: 'chart', kind: 'xy', title, categories, series } : null;\n}\n\nexport function renderChartPreviewSVG(chart) {\n if (!chart?.series?.length) return '';\n const TK = theme();\n const width = 720;\n const height = 450;\n const left = 70;\n const top = 60;\n const plotWidth = 580;\n const plotHeight = 300;\n const values = chart.series.flatMap(series => series.values);\n const maximum = Math.max(1, ...values.map(Math.abs));\n const categoryCount = Math.max(1, chart.categories.length);\n const slot = plotWidth / categoryCount;\n let content = `<rect width=\"${width}\" height=\"${height}\" rx=\"10\" fill=\"${TK.bg}\"/><text x=\"${width / 2}\" y=\"32\" text-anchor=\"middle\" fill=\"${TK.text}\" font-size=\"18\" font-family=\"lixFont\">${escapeXml(chart.title)}</text>`;\n content += `<line x1=\"${left}\" y1=\"${top}\" x2=\"${left}\" y2=\"${top + plotHeight}\" stroke=\"${TK.line}\"/><line x1=\"${left}\" y1=\"${top + plotHeight}\" x2=\"${left + plotWidth}\" y2=\"${top + plotHeight}\" stroke=\"${TK.line}\"/>`;\n\n chart.categories.forEach((category, index) => {\n content += `<text x=\"${left + slot * (index + .5)}\" y=\"${top + plotHeight + 24}\" text-anchor=\"middle\" fill=\"${TK.text}\" font-size=\"11\" font-family=\"lixFont\">${escapeXml(category)}</text>`;\n });\n\n chart.series.forEach((series, seriesIndex) => {\n const color = PALETTE[seriesIndex % PALETTE.length];\n if (series.kind === 'line') {\n const points = series.values.map((value, index) => `${left + slot * (index + .5)},${top + plotHeight - Math.abs(value) / maximum * plotHeight}`).join(' ');\n content += `<polyline points=\"${points}\" fill=\"none\" stroke=\"${color.stroke}\" stroke-width=\"3\"/>`;\n series.values.forEach((value, index) => content += `<circle cx=\"${left + slot * (index + .5)}\" cy=\"${top + plotHeight - Math.abs(value) / maximum * plotHeight}\" r=\"5\" fill=\"${color.fill}\" stroke=\"${color.stroke}\" stroke-width=\"2\"/>`);\n } else {\n const barWidth = Math.max(12, slot * .7 / chart.series.length);\n series.values.forEach((value, index) => {\n const barHeight = Math.abs(value) / maximum * plotHeight;\n const x = left + slot * index + slot * .15 + seriesIndex * barWidth;\n content += `<rect x=\"${x}\" y=\"${top + plotHeight - barHeight}\" width=\"${barWidth}\" height=\"${barHeight}\" rx=\"4\" fill=\"${color.fill}\" stroke=\"${color.stroke}\" stroke-width=\"1.5\"/><text x=\"${x + barWidth / 2}\" y=\"${top + plotHeight - barHeight - 7}\" text-anchor=\"middle\" fill=\"${TK.text}\" font-size=\"10\" font-family=\"lixFont\">${value}</text>`;\n });\n }\n });\n return `<svg xmlns=\"${NS}\" width=\"600\" height=\"450\" viewBox=\"0 0 ${width} ${height}\">${content}</svg>`;\n}\n\n// ---------------------------------------------------------------------\n// Native canvas placement helpers\n// ---------------------------------------------------------------------\n\nfunction push(shape, frame) {\n if (!shape) return null;\n window.shapes.push(shape);\n if (window.pushCreateAction) window.pushCreateAction(shape);\n if (frame?.addShapeToFrame) frame.addShapeToFrame(shape);\n return shape;\n}\n\nfunction canvasOrigin(width, height) {\n const vb = window.currentViewBox || { x: 0, y: 0, width: window.innerWidth, height: window.innerHeight };\n return { x: vb.x + vb.width / 2 - width / 2, y: vb.y + vb.height / 2 - height / 2 };\n}\n\nfunction createFrame(x, y, width, height, name, type) {\n const TK = theme();\n const frame = new window.Frame(x - 45, y - 45, width + 90, height + 90, {\n stroke: TK.frame, strokeWidth: 1, fill: 'transparent', opacity: .75, frameName: name,\n });\n frame._diagramType = type;\n push(frame);\n return frame;\n}\n\nexport function renderEROnCanvas(diagram) {\n if (!diagram?.entities?.length || !window.Rectangle || !window.Arrow || !window.Frame) return false;\n const TK = theme();\n const entities = layoutER(diagram);\n const width = Math.max(...entities.map(entity => entity.x + entity.width)) + 40;\n const height = Math.max(...entities.map(entity => entity.y + entity.height)) + 40;\n const origin = canvasOrigin(width, height);\n const frame = createFrame(origin.x, origin.y, width, height, diagram.title, 'mermaid-er');\n const entityShapes = new Map();\n let first = null;\n\n for (const entity of entities) {\n const x = origin.x + entity.x;\n const y = origin.y + entity.y;\n const header = push(new window.Rectangle(x, y, entity.width, entity.headerHeight, {\n stroke: entity.color.stroke, strokeWidth: 1.5, fill: entity.color.fill, fillStyle: 'solid', roughness: 1,\n label: entity.name, labelColor: '#343832', labelFontSize: 15,\n }), frame);\n if (!first) first = header;\n entityShapes.set(entity.name, { shape: header, x, y, width: entity.width, height: entity.headerHeight });\n const attributes = entity.attributes.length ? entity.attributes : [{ type: '', name: 'No attributes', key: '' }];\n attributes.forEach((attribute, row) => push(new window.Rectangle(\n x, y + entity.headerHeight + row * entity.rowHeight, entity.width, entity.rowHeight,\n { stroke: TK.frame, strokeWidth: 1, fill: TK.panel, fillStyle: 'solid', roughness: .4,\n label: [attribute.type, attribute.name, attribute.key].filter(Boolean).join(' '), labelColor: TK.text, labelFontSize: 11 }\n ), frame));\n }\n\n for (const relation of diagram.relationships) {\n const from = entityShapes.get(relation.from);\n const to = entityShapes.get(relation.to);\n if (!from || !to) continue;\n const start = { x: from.x + from.width / 2, y: from.y + from.height / 2 };\n const end = { x: to.x + to.width / 2, y: to.y + to.height / 2 };\n const arrow = push(new window.Arrow(start, end, {\n stroke: TK.line, strokeWidth: 1.5, roughness: 1,\n label: `${relation.fromCardinality} ${relation.label} ${relation.toCardinality}`, labelColor: TK.text,\n }), frame);\n if (arrow && window.__autoAttach) {\n window.__autoAttach(arrow, from.shape, true, start);\n window.__autoAttach(arrow, to.shape, false, end);\n }\n }\n if (first?.selectShape) { window.currentShape = first; first.selectShape(); }\n return true;\n}\n\nexport function renderChartOnCanvas(chart) {\n if (!chart?.series?.length || !window.Rectangle || !window.Circle || !window.Line || !window.Frame) return false;\n const TK = theme();\n const width = 720;\n const height = 450;\n const origin = canvasOrigin(width, height);\n const frame = createFrame(origin.x, origin.y, width, height, chart.title, 'mermaid-chart');\n const left = origin.x + 70;\n const top = origin.y + 65;\n const plotWidth = 580;\n const plotHeight = 300;\n const values = chart.series.flatMap(series => series.values);\n const maximum = Math.max(1, ...values.map(Math.abs));\n const slot = plotWidth / Math.max(1, chart.categories.length);\n let first = null;\n\n push(new window.Line({ x: left, y: top }, { x: left, y: top + plotHeight }, { stroke: TK.line, strokeWidth: 1.5, roughness: 0 }), frame);\n push(new window.Line({ x: left, y: top + plotHeight }, { x: left + plotWidth, y: top + plotHeight }, { stroke: TK.line, strokeWidth: 1.5, roughness: 0 }), frame);\n\n chart.series.forEach((series, seriesIndex) => {\n const color = PALETTE[seriesIndex % PALETTE.length];\n if (series.kind === 'line') {\n let previous = null;\n series.values.forEach((value, index) => {\n const point = { x: left + slot * (index + .5), y: top + plotHeight - Math.abs(value) / maximum * plotHeight };\n const dot = push(new window.Circle(point.x, point.y, 8, 8, {\n stroke: color.stroke, strokeWidth: 2, fill: color.fill, fillStyle: 'solid', roughness: .5,\n label: String(value), labelColor: TK.text, labelFontSize: 9,\n }), frame);\n if (!first) first = dot;\n if (previous) push(new window.Line(previous, point, { stroke: color.stroke, strokeWidth: 3, roughness: .5 }), frame);\n previous = point;\n });\n } else {\n const barWidth = Math.max(18, slot * .7 / chart.series.length);\n series.values.forEach((value, index) => {\n const barHeight = Math.max(8, Math.abs(value) / maximum * plotHeight);\n const x = left + slot * index + slot * .15 + seriesIndex * barWidth;\n const bar = push(new window.Rectangle(x, top + plotHeight - barHeight, barWidth, barHeight, {\n stroke: color.stroke, strokeWidth: 1.5, fill: color.fill, fillStyle: 'solid', roughness: .7,\n label: `${chart.categories[index] || index + 1}\\n${value}`, labelColor: '#343832', labelFontSize: 11,\n }), frame);\n if (!first) first = bar;\n });\n }\n });\n if (first?.selectShape) { window.currentShape = first; first.selectShape(); }\n return true;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["title"]
7
+ }
@@ -275,7 +275,7 @@ var SketchEngine = class {
275
275
  if (selection.multiSelection) window.multiSelection = selection.multiSelection;
276
276
  if (selection.clearAllSelections) window.clearAllSelections = selection.clearAllSelections;
277
277
  if (copyPaste.initCopyPaste) copyPaste.initCopyPaste();
278
- const aiRenderer = await import("./AIRenderer-46WIFF2B.js");
278
+ const aiRenderer = await import("./AIRenderer-PWWLWI6U.js");
279
279
  if (aiRenderer.initAIRenderer) aiRenderer.initAIRenderer();
280
280
  const graphEngine = await import("./GraphEngine-IHRVGUGG.js");
281
281
  if (graphEngine.initGraphEngine) graphEngine.initGraphEngine();
@@ -414,4 +414,4 @@ export {
414
414
  SketchEngine,
415
415
  SketchEngine_default as default
416
416
  };
417
- //# sourceMappingURL=SketchEngine-BCRJ62CV.js.map
417
+ //# sourceMappingURL=SketchEngine-NPF2XN6Z.js.map
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-DNAG7ML6.js";
10
10
 
11
11
  // src/react/LixSketchCanvas.jsx
12
- import { useCallback as useCallback17, useEffect as useEffect15, useRef as useRef12, useState as useState21 } from "react";
12
+ import { useCallback as useCallback16, useEffect as useEffect15, useRef as useRef11, useState as useState20 } from "react";
13
13
 
14
14
  // src/react/store/useSketchStore.js
15
15
  import { create } from "zustand";
@@ -331,7 +331,7 @@ var useUIStore = create2((set, get) => ({
331
331
  setCanvasLoading: (loading, message) => set({ canvasLoading: loading, canvasLoadingMessage: message || "Loading canvas..." }),
332
332
  // --- Theme ---
333
333
  // Issue #38 bug #1: light by default. Dark stays available via toggle.
334
- theme: "dark",
334
+ theme: "light",
335
335
  setTheme: (newTheme) => {
336
336
  const prev = get().theme;
337
337
  const resolve = (t) => t === "system" ? window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light" : t;
@@ -427,7 +427,7 @@ function useSketchEngine(svgRef, ready = true) {
427
427
  setZoom: (zoom) => useSketchStore_default.setState({ zoom }),
428
428
  getState: () => useSketchStore_default.getState()
429
429
  };
430
- const { SketchEngine } = await import("./SketchEngine-BCRJ62CV.js");
430
+ const { SketchEngine } = await import("./SketchEngine-NPF2XN6Z.js");
431
431
  if (cancelled) return;
432
432
  const engine = new SketchEngine(svgRef.current);
433
433
  await engine.init();
@@ -4500,73 +4500,33 @@ function HelpModal() {
4500
4500
  }
4501
4501
 
4502
4502
  // src/react/components/modals/LixScriptModal.jsx
4503
- import { useCallback as useCallback15, useEffect as useEffect13, useRef as useRef10, useState as useState19 } from "react";
4503
+ import { useEffect as useEffect13 } from "react";
4504
4504
  import { jsx as jsx24, jsxs as jsxs24 } from "react/jsx-runtime";
4505
- var SAMPLE = `# LixScript \u2014 paste shapes / arrows in a simple DSL.
4506
- # Hit Cmd/Ctrl+Enter to render onto the canvas.
4507
-
4508
- rect A "Idea" 100 100 220 90
4509
- rect B "Plan" 400 100 220 90
4510
- rect C "Ship" 700 100 220 90
4511
-
4512
- arrow A -> B
4513
- arrow B -> C
4514
- `;
4515
4505
  function LixScriptModal() {
4516
- const open = useUIStore_default((s) => s.aiModalOpen);
4517
- const toggle = useUIStore_default((s) => s.toggleAIModal);
4518
- const [source, setSource] = useState19(SAMPLE);
4519
- const [busy, setBusy] = useState19(false);
4520
- const [status, setStatus] = useState19(null);
4521
- const taRef = useRef10(null);
4506
+ const open = useUIStore_default((state) => state.aiModalOpen);
4507
+ const toggle = useUIStore_default((state) => state.toggleAIModal);
4522
4508
  useEffect13(() => {
4523
4509
  if (!open) return;
4524
- requestAnimationFrame(() => taRef.current?.focus());
4525
- const onKey = (e) => {
4526
- if (e.key === "Escape") toggle();
4510
+ const onKeyDown = (event) => {
4511
+ if (event.key === "Escape") toggle();
4527
4512
  };
4528
- document.addEventListener("keydown", onKey);
4529
- return () => document.removeEventListener("keydown", onKey);
4513
+ document.addEventListener("keydown", onKeyDown);
4514
+ return () => document.removeEventListener("keydown", onKeyDown);
4530
4515
  }, [open, toggle]);
4531
- const render = useCallback15(async () => {
4532
- if (busy) return;
4533
- setBusy(true);
4534
- setStatus(null);
4535
- try {
4536
- const mod = await import("./LixScriptParser-JYWJX375.js");
4537
- const parsed = mod.parseLixScript(source);
4538
- const resolved = mod.resolveShapeRefs ? mod.resolveShapeRefs(parsed) : parsed;
4539
- mod.renderLixScript(resolved);
4540
- setStatus({ tone: "success", message: `Rendered ${Array.isArray(resolved) ? resolved.length : "?"} elements.` });
4541
- setTimeout(() => {
4542
- toggle();
4543
- }, 700);
4544
- } catch (err) {
4545
- console.warn("[LixScriptModal] parse failed:", err);
4546
- setStatus({ tone: "error", message: err?.message || "Parse failed." });
4547
- } finally {
4548
- setBusy(false);
4549
- }
4550
- }, [source, busy, toggle]);
4551
- const handleKeyDown = useCallback15((e) => {
4552
- if ((e.ctrlKey || e.metaKey) && e.key === "Enter") {
4553
- e.preventDefault();
4554
- render();
4555
- }
4556
- }, [render]);
4557
4516
  if (!open) return null;
4558
4517
  return /* @__PURE__ */ jsx24(
4559
4518
  "div",
4560
4519
  {
4561
- className: "fixed inset-0 z-[1100] flex items-center justify-center bg-black/60 backdrop-blur-sm font-[lixFont]",
4520
+ className: "fixed inset-0 z-[1100] flex items-center justify-center bg-black/40 backdrop-blur-sm font-[lixFont]",
4562
4521
  onClick: toggle,
4563
4522
  role: "dialog",
4564
4523
  "aria-modal": "true",
4524
+ "aria-labelledby": "lixscript-coming-soon-title",
4565
4525
  children: /* @__PURE__ */ jsxs24(
4566
4526
  "div",
4567
4527
  {
4568
- onClick: (e) => e.stopPropagation(),
4569
- className: "relative w-[560px] max-w-[94vw] bg-surface border border-border-light rounded-2xl p-5 shadow-2xl flex flex-col gap-3",
4528
+ onClick: (event) => event.stopPropagation(),
4529
+ className: "relative w-[520px] max-w-[94vw] bg-surface border border-border-light rounded-2xl px-8 py-10 shadow-2xl text-center",
4570
4530
  children: [
4571
4531
  /* @__PURE__ */ jsx24(
4572
4532
  "button",
@@ -4577,36 +4537,10 @@ function LixScriptModal() {
4577
4537
  children: /* @__PURE__ */ jsx24("i", { className: "bx bx-x text-lg" })
4578
4538
  }
4579
4539
  ),
4580
- /* @__PURE__ */ jsxs24("div", { className: "flex items-center gap-2", children: [
4581
- /* @__PURE__ */ jsx24("div", { className: "w-8 h-8 rounded-lg bg-accent-blue/10 border border-accent-blue/30 flex items-center justify-center", children: /* @__PURE__ */ jsx24("i", { className: "bx bx-code-alt text-accent-blue" }) }),
4582
- /* @__PURE__ */ jsxs24("div", { className: "flex-1", children: [
4583
- /* @__PURE__ */ jsx24("h2", { className: "text-text-primary text-sm font-medium", children: "LixScript" }),
4584
- /* @__PURE__ */ jsx24("p", { className: "text-text-dim text-[11px]", children: "Type shapes + arrows, render directly. No AI involved." })
4585
- ] })
4586
- ] }),
4587
- /* @__PURE__ */ jsx24(
4588
- "textarea",
4589
- {
4590
- ref: taRef,
4591
- value: source,
4592
- onChange: (e) => setSource(e.target.value),
4593
- onKeyDown: handleKeyDown,
4594
- spellCheck: false,
4595
- className: "w-full h-[260px] resize-none bg-surface-card border border-border-light rounded-lg px-3 py-2 text-[12px] text-text-primary font-[lixCode] outline-none focus:border-accent-blue/50"
4596
- }
4597
- ),
4598
- /* @__PURE__ */ jsxs24("div", { className: "flex items-center justify-between", children: [
4599
- status ? /* @__PURE__ */ jsx24("span", { className: `text-[11px] ${status.tone === "error" ? "text-red-400" : "text-green-400"}`, children: status.message }) : /* @__PURE__ */ jsx24("span", { className: "text-text-dim text-[11px]", children: "Cmd/Ctrl+Enter to render \xB7 Esc to close" }),
4600
- /* @__PURE__ */ jsx24(
4601
- "button",
4602
- {
4603
- onClick: render,
4604
- disabled: busy,
4605
- className: "px-3 py-1.5 rounded-lg bg-accent-blue text-text-primary text-[12px] font-medium hover:bg-accent-blue-hover transition-colors disabled:opacity-50 disabled:pointer-events-none",
4606
- children: busy ? "Rendering\u2026" : "Render"
4607
- }
4608
- )
4609
- ] })
4540
+ /* @__PURE__ */ jsx24("div", { className: "mx-auto mb-5 w-12 h-12 rounded-xl bg-accent-blue/10 border border-accent-blue/25 flex items-center justify-center", children: /* @__PURE__ */ jsx24("i", { className: "bx bx-plug text-2xl text-accent-blue" }) }),
4541
+ /* @__PURE__ */ jsx24("span", { className: "inline-flex px-2.5 py-1 rounded-full bg-[#a97852]/15 text-[#8f6244] text-[10px] font-semibold uppercase tracking-wider", children: "Coming soon" }),
4542
+ /* @__PURE__ */ jsx24("h2", { id: "lixscript-coming-soon-title", className: "mt-4 text-text-primary text-xl font-medium", children: "LixScript MCP" }),
4543
+ /* @__PURE__ */ jsx24("p", { className: "mt-2 text-text-muted text-sm leading-relaxed", children: "LixScript is being prepared as the programmable MCP interface for LixSketch. This workspace panel will become available with the supported platform integration." })
4610
4544
  ]
4611
4545
  }
4612
4546
  )
@@ -4615,9 +4549,9 @@ function LixScriptModal() {
4615
4549
  }
4616
4550
 
4617
4551
  // src/react/components/modals/GraphModal.jsx
4618
- import { useCallback as useCallback16, useEffect as useEffect14, useRef as useRef11, useState as useState20 } from "react";
4552
+ import { useCallback as useCallback15, useEffect as useEffect14, useRef as useRef10, useState as useState19 } from "react";
4619
4553
  import { jsx as jsx25, jsxs as jsxs25 } from "react/jsx-runtime";
4620
- var SAMPLE2 = `# One equation per line. Comments start with #.
4554
+ var SAMPLE = `# One equation per line. Comments start with #.
4621
4555
  # Hit Cmd/Ctrl+Enter to render onto the canvas.
4622
4556
 
4623
4557
  y = x^2
@@ -4631,11 +4565,11 @@ function parseEquations(text) {
4631
4565
  function GraphModal() {
4632
4566
  const open = useUIStore_default((s) => s.graphModalOpen);
4633
4567
  const toggle = useUIStore_default((s) => s.toggleGraphModal);
4634
- const [source, setSource] = useState20(SAMPLE2);
4635
- const [settings, setSettings] = useState20(DEFAULT_SETTINGS);
4636
- const [busy, setBusy] = useState20(false);
4637
- const [status, setStatus] = useState20(null);
4638
- const taRef = useRef11(null);
4568
+ const [source, setSource] = useState19(SAMPLE);
4569
+ const [settings, setSettings] = useState19(DEFAULT_SETTINGS);
4570
+ const [busy, setBusy] = useState19(false);
4571
+ const [status, setStatus] = useState19(null);
4572
+ const taRef = useRef10(null);
4639
4573
  useEffect14(() => {
4640
4574
  if (!open) return;
4641
4575
  requestAnimationFrame(() => taRef.current?.focus());
@@ -4645,7 +4579,7 @@ function GraphModal() {
4645
4579
  document.addEventListener("keydown", onKey);
4646
4580
  return () => document.removeEventListener("keydown", onKey);
4647
4581
  }, [open, toggle]);
4648
- const render = useCallback16(async () => {
4582
+ const render = useCallback15(async () => {
4649
4583
  if (busy) return;
4650
4584
  setBusy(true);
4651
4585
  setStatus(null);
@@ -4677,7 +4611,7 @@ function GraphModal() {
4677
4611
  setBusy(false);
4678
4612
  }
4679
4613
  }, [source, settings, busy, toggle]);
4680
- const handleKeyDown = useCallback16((e) => {
4614
+ const handleKeyDown = useCallback15((e) => {
4681
4615
  if ((e.ctrlKey || e.metaKey) && e.key === "Enter") {
4682
4616
  e.preventDefault();
4683
4617
  render();
@@ -4816,10 +4750,10 @@ function LixSketchCanvas({
4816
4750
  className = "",
4817
4751
  style = null
4818
4752
  }) {
4819
- const wrapperRef = useRef12(null);
4820
- const lastSceneJsonRef = useRef12("");
4821
- const debounceRef = useRef12(null);
4822
- const [bootstrapped, setBootstrapped] = useState21(false);
4753
+ const wrapperRef = useRef11(null);
4754
+ const lastSceneJsonRef = useRef11("");
4755
+ const debounceRef = useRef11(null);
4756
+ const [bootstrapped, setBootstrapped] = useState20(false);
4823
4757
  useEffect15(() => {
4824
4758
  installImageUploadBridge(onUploadImage);
4825
4759
  }, [onUploadImage]);
@@ -4978,7 +4912,7 @@ function LixSketchCanvas({
4978
4912
  "button",
4979
4913
  {
4980
4914
  type: "button",
4981
- title: "LixScript \u2014 write shapes in DSL",
4915
+ title: "LixScript MCP \u2014 coming soon",
4982
4916
  onClick: () => useUIStore_default.getState().toggleAIModal?.(),
4983
4917
  className: "w-9 h-9 flex items-center justify-center rounded-lg bg-surface border border-border-light text-text-muted hover:text-text-primary hover:bg-surface-hover transition-colors",
4984
4918
  children: /* @__PURE__ */ jsx26("i", { className: "bx bx-code-alt text-base" })