antri_cli 1.57.0 → 1.57.2

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.
@@ -52,8 +52,347 @@ export class ArtifactManager {
52
52
  if (artifact.type === 'html') {
53
53
  fs.writeFileSync(filePath, artifact.content, 'utf-8');
54
54
  }
55
- else if (artifact.type === 'graph' || artifact.type === 'mindmap') {
56
- const isMindmap = artifact.type === 'mindmap';
55
+ else if (artifact.type === 'mindmap') {
56
+ const htmlMindmap = `<!DOCTYPE html>
57
+ <html lang="en">
58
+ <head>
59
+ <meta charset="UTF-8">
60
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
61
+ <title>${artifact.title}</title>
62
+ <script src="https://cdn.jsdelivr.net/npm/d3@7"></script>
63
+ <script src="https://cdn.jsdelivr.net/npm/markmap-view@0.17.2"></script>
64
+ <script src="https://cdn.jsdelivr.net/npm/markmap-lib@0.17.2"></script>
65
+ <style>
66
+ * { box-sizing: border-box; margin: 0; padding: 0; }
67
+ :root {
68
+ --bg-page: radial-gradient(circle at 15% 15%, rgba(99, 102, 241, 0.08) 0%, transparent 40%), radial-gradient(circle at 85% 85%, rgba(236, 72, 153, 0.08) 0%, transparent 40%), #f8fafc;
69
+ --bg-viewport: #ffffff;
70
+ --border-viewport: rgba(226, 232, 240, 0.9);
71
+ --text-main: #0f172a;
72
+ --text-muted: #64748b;
73
+ --btn-bg: #ffffff;
74
+ --btn-border: #e2e8f0;
75
+ --btn-text: #1e293b;
76
+ --btn-hover: #f1f5f9;
77
+ --shadow-viewport: 0 20px 45px -15px rgba(0, 0, 0, 0.06), 0 0 1px 1px rgba(0, 0, 0, 0.04);
78
+ --node-bg: #ffffff;
79
+ --node-border: #cbd5e1;
80
+ --node-text: #0f172a;
81
+ --root-bg: #4f46e5;
82
+ --root-border: #4338ca;
83
+ --root-text: #ffffff;
84
+ --link-stroke: #818cf8;
85
+ --badge-bg: rgba(168, 85, 247, 0.12);
86
+ --badge-color: #7e22ce;
87
+ --badge-border: rgba(168, 85, 247, 0.25);
88
+ }
89
+ body.theme-dark {
90
+ --bg-page: radial-gradient(circle at 10% 20%, rgba(99, 102, 241, 0.25) 0%, transparent 50%), radial-gradient(circle at 90% 80%, rgba(236, 72, 153, 0.22) 0%, transparent 50%), radial-gradient(circle at 50% 50%, rgba(6, 182, 212, 0.18) 0%, transparent 60%), #0d1322;
91
+ --bg-viewport: rgba(18, 24, 38, 0.9);
92
+ --border-viewport: rgba(255, 255, 255, 0.1);
93
+ --text-main: #f8fafc;
94
+ --text-muted: #94a3b8;
95
+ --btn-bg: rgba(30, 41, 59, 0.85);
96
+ --btn-border: rgba(255, 255, 255, 0.12);
97
+ --btn-text: #f8fafc;
98
+ --btn-hover: rgba(51, 65, 85, 0.95);
99
+ --shadow-viewport: 0 20px 45px -15px rgba(0, 0, 0, 0.5);
100
+ --node-bg: #1e293b;
101
+ --node-border: #334155;
102
+ --node-text: #f8fafc;
103
+ --root-bg: #6366f1;
104
+ --root-border: #818cf8;
105
+ --root-text: #ffffff;
106
+ --link-stroke: #6366f1;
107
+ --badge-bg: rgba(168, 85, 247, 0.2);
108
+ --badge-color: #c084fc;
109
+ --badge-border: rgba(168, 85, 247, 0.35);
110
+ }
111
+ body {
112
+ margin: 0; padding: 20px;
113
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
114
+ background: var(--bg-page);
115
+ color: var(--text-main);
116
+ display: flex; flex-direction: column; align-items: center; min-height: 100vh;
117
+ overflow-x: hidden;
118
+ transition: background 0.3s ease;
119
+ }
120
+ .header { text-align: center; margin-bottom: 14px; }
121
+ h1 { font-size: 19px; color: var(--text-main); margin: 0 0 6px 0; font-weight: 800; letter-spacing: -0.3px; }
122
+ .badge {
123
+ font-size: 11px;
124
+ background: var(--badge-bg);
125
+ color: var(--badge-color);
126
+ padding: 4px 12px; border-radius: 9999px;
127
+ border: 1px solid var(--badge-border);
128
+ text-transform: uppercase; font-weight: 700; letter-spacing: 0.5px;
129
+ display: inline-block; margin-bottom: 6px;
130
+ }
131
+ .controls {
132
+ display: flex; gap: 8px; margin-bottom: 14px; align-items: center; flex-wrap: wrap; justify-content: center;
133
+ }
134
+ .btn {
135
+ background: var(--btn-bg); border: 1px solid var(--btn-border);
136
+ color: var(--btn-text); padding: 7px 14px; border-radius: 9px; font-size: 12px;
137
+ font-weight: 700; cursor: pointer; transition: all 0.15s; display: flex; align-items: center; gap: 6px;
138
+ box-shadow: 0 2px 4px rgba(0,0,0,0.03);
139
+ }
140
+ .btn:hover { background: var(--btn-hover); transform: translateY(-1px); }
141
+ .btn:active { transform: translateY(0); }
142
+ .viewer-card {
143
+ width: 100%; max-width: 1200px; height: 75vh; min-height: 540px;
144
+ position: relative; overflow: hidden; border-radius: 18px;
145
+ background: var(--bg-viewport); backdrop-filter: blur(20px);
146
+ border: 1px solid var(--border-viewport);
147
+ box-shadow: var(--shadow-viewport);
148
+ touch-action: none;
149
+ }
150
+ #mindmapSvg {
151
+ width: 100%; height: 100%;
152
+ display: block;
153
+ cursor: grab;
154
+ }
155
+ #mindmapSvg:active { cursor: grabbing; }
156
+ .markmap-foreign {
157
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif !important;
158
+ font-size: 13.5px !important;
159
+ font-weight: 600 !important;
160
+ line-height: 1.4 !important;
161
+ color: var(--node-text) !important;
162
+ background: var(--node-bg) !important;
163
+ border: 1.5px solid var(--node-border) !important;
164
+ border-radius: 8px !important;
165
+ padding: 6px 14px !important;
166
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.04) !important;
167
+ display: inline-flex !important;
168
+ align-items: center !important;
169
+ white-space: nowrap !important;
170
+ transition: all 0.2s ease !important;
171
+ }
172
+ .markmap-node[data-depth="0"] .markmap-foreign {
173
+ background: var(--root-bg) !important;
174
+ color: var(--root-text) !important;
175
+ border-color: var(--root-border) !important;
176
+ font-size: 16px !important;
177
+ font-weight: 800 !important;
178
+ border-radius: 10px !important;
179
+ padding: 8px 18px !important;
180
+ box-shadow: 0 4px 14px rgba(79, 70, 229, 0.35) !important;
181
+ }
182
+ .markmap-node[data-depth="1"] .markmap-foreign {
183
+ font-weight: 700 !important;
184
+ border-width: 1.8px !important;
185
+ }
186
+ .markmap-link {
187
+ fill: none !important;
188
+ stroke: var(--link-stroke) !important;
189
+ stroke-width: 2px !important;
190
+ stroke-linecap: round !important;
191
+ }
192
+ .markmap-node > circle {
193
+ fill: var(--root-bg) !important;
194
+ stroke: var(--root-border) !important;
195
+ stroke-width: 2px !important;
196
+ r: 6 !important;
197
+ cursor: pointer !important;
198
+ }
199
+ .help-hint {
200
+ position: absolute; bottom: 12px; right: 14px;
201
+ font-size: 11px; color: var(--text-muted); pointer-events: none;
202
+ background: rgba(255, 255, 255, 0.75); padding: 3px 8px; border-radius: 6px;
203
+ border: 1px solid rgba(0,0,0,0.05);
204
+ }
205
+ body.theme-dark .help-hint {
206
+ background: rgba(18, 24, 38, 0.7);
207
+ border-color: rgba(255, 255, 255, 0.08);
208
+ }
209
+ </style>
210
+ </head>
211
+ <body>
212
+ <div class="header">
213
+ <span class="badge">🧠 ANTRI Interactive Mind Map</span>
214
+ <h1>${artifact.title}</h1>
215
+ </div>
216
+ <div class="controls">
217
+ <button class="btn" onclick="zoomIn()">🔍 Zoom +</button>
218
+ <button class="btn" onclick="zoomOut()">🔍 Zoom -</button>
219
+ <button class="btn" onclick="fitView()">⛶ Fit / Reset</button>
220
+ <button class="btn" onclick="toggleTheme()" id="themeToggleBtn">🌙 Poster Dark</button>
221
+ <button class="btn" onclick="copySource()">📋 Copy Code</button>
222
+ </div>
223
+ <div class="viewer-card" id="viewerCard">
224
+ <svg id="mindmapSvg"></svg>
225
+ <div class="help-hint">🖱️ Drag to pan · Scroll to zoom · Click nodes with circle handles to collapse/expand</div>
226
+ </div>
227
+ <script>
228
+ const rawContent = ${JSON.stringify(artifact.content.trim())};
229
+
230
+ function parseToMarkdown(content) {
231
+ if (content.startsWith('#') || content.startsWith('-') || content.includes('\\n#') || content.includes('\\n-')) {
232
+ return content;
233
+ }
234
+ const lines = content.split('\\n');
235
+ const mdLines = [];
236
+ let baseIndent = -1;
237
+ for (let line of lines) {
238
+ const trimmed = line.trim();
239
+ if (!trimmed || trimmed === 'mindmap') continue;
240
+ const indent = line.search(/\\S/);
241
+ if (baseIndent === -1) baseIndent = indent;
242
+ const rel = Math.max(0, indent - baseIndent);
243
+ const depth = Math.floor(rel / 2);
244
+
245
+ let clean = trimmed
246
+ .replace(/^root\\(\\((.*?)\\)\\)$/, '$1')
247
+ .replace(/^\\(\\((.*?)\\)\\)$/, '$1')
248
+ .replace(/^\\[(.*?)\\]$/, '$1')
249
+ .replace(/^\\((.*?)\\)$/, '$1')
250
+ .replace(/^\\)\\)(.*?)\\(\\($/, '$1')
251
+ .replace(/^\\)(.*?)\\($/, '$1')
252
+ .replace(/^\\{\\{(.*?)\\}\\}/, '$1');
253
+
254
+ if (depth === 0) {
255
+ mdLines.push('# ' + clean);
256
+ } else if (depth === 1) {
257
+ mdLines.push('## ' + clean);
258
+ } else {
259
+ mdLines.push(' '.repeat(depth - 1) + '- ' + clean);
260
+ }
261
+ }
262
+ return mdLines.join('\\n');
263
+ }
264
+
265
+ const markdownText = parseToMarkdown(rawContent);
266
+ let mmInstance = null;
267
+
268
+ function renderMarkmap() {
269
+ try {
270
+ if (window.markmap && window.markmap.Transformer) {
271
+ const { Transformer, Markmap } = window.markmap;
272
+ const transformer = new Transformer();
273
+ const { root } = transformer.transform(markdownText);
274
+ const svgEl = document.getElementById('mindmapSvg');
275
+ svgEl.innerHTML = '';
276
+ mmInstance = Markmap.create(svgEl, {
277
+ autoFit: true,
278
+ duration: 250,
279
+ nodeMinHeight: 28,
280
+ spacingVertical: 14,
281
+ spacingHorizontal: 85,
282
+ paddingX: 16
283
+ }, root);
284
+ return;
285
+ }
286
+ } catch (err) {
287
+ console.warn('Markmap load error:', err);
288
+ }
289
+ renderFallbackTree();
290
+ }
291
+
292
+ function renderFallbackTree() {
293
+ const svg = document.getElementById('mindmapSvg');
294
+ svg.innerHTML = '';
295
+ const lines = markdownText.split('\\n').filter(l => l.trim().length > 0);
296
+ const rootNode = { name: '${artifact.title}', children: [] };
297
+ const stack = [{ node: rootNode, depth: 0 }];
298
+
299
+ lines.forEach((line) => {
300
+ let depth = 1;
301
+ let text = line.trim();
302
+ if (text.startsWith('# ')) {
303
+ rootNode.name = text.replace('# ', '').trim();
304
+ return;
305
+ } else if (text.startsWith('## ')) {
306
+ depth = 1;
307
+ text = text.replace('## ', '').trim();
308
+ } else {
309
+ const leadSpaces = line.search(/\\S/);
310
+ depth = 2 + Math.floor(leadSpaces / 2);
311
+ text = text.replace(/^[-*]\\s*/, '').trim();
312
+ }
313
+ const newNode = { name: text, children: [] };
314
+ while (stack.length > depth) stack.pop();
315
+ stack[stack.length - 1].node.children.push(newNode);
316
+ stack.push({ node: newNode, depth: depth });
317
+ });
318
+
319
+ let curY = 40;
320
+ function layout(node, depth = 0) {
321
+ node.depth = depth;
322
+ node.x = 60 + depth * 220;
323
+ if (!node.children || node.children.length === 0) {
324
+ node.y = curY;
325
+ curY += 46;
326
+ } else {
327
+ node.children.forEach(c => layout(c, depth + 1));
328
+ const firstY = node.children[0].y;
329
+ const lastY = node.children[node.children.length - 1].y;
330
+ node.y = (firstY + lastY) / 2;
331
+ }
332
+ }
333
+ layout(rootNode);
334
+
335
+ const g = document.createElementNS('http://www.w3.org/2000/svg', 'g');
336
+ g.setAttribute('id', 'treeGroup');
337
+ svg.appendChild(g);
338
+
339
+ function draw(node) {
340
+ if (node.children) {
341
+ node.children.forEach(c => {
342
+ const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
343
+ const x1 = node.x + 130, y1 = node.y;
344
+ const x2 = c.x, y2 = c.y;
345
+ const dx = (x2 - x1) * 0.5;
346
+ path.setAttribute('d', 'M ' + x1 + ' ' + y1 + ' C ' + (x1 + dx) + ' ' + y1 + ', ' + (x2 - dx) + ' ' + y2 + ', ' + x2 + ' ' + y2);
347
+ path.setAttribute('class', 'markmap-link');
348
+ g.appendChild(path);
349
+ draw(c);
350
+ });
351
+ }
352
+ const foreign = document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject');
353
+ foreign.setAttribute('x', node.x - 10);
354
+ foreign.setAttribute('y', node.y - 18);
355
+ foreign.setAttribute('width', '200');
356
+ foreign.setAttribute('height', '40');
357
+ foreign.innerHTML = '<div class="markmap-node" data-depth="' + node.depth + '"><div class="markmap-foreign">' + node.name + '</div></div>';
358
+ g.appendChild(foreign);
359
+ }
360
+ draw(rootNode);
361
+ svg.setAttribute('viewBox', '0 0 ' + Math.max(800, curY * 1.8) + ' ' + Math.max(500, curY + 60));
362
+ }
363
+
364
+ function zoomIn() {
365
+ if (mmInstance) mmInstance.rescale(1.25);
366
+ }
367
+ function zoomOut() {
368
+ if (mmInstance) mmInstance.rescale(0.8);
369
+ }
370
+ function fitView() {
371
+ if (mmInstance) mmInstance.fit();
372
+ }
373
+ function toggleTheme() {
374
+ document.body.classList.toggle('theme-dark');
375
+ const isDark = document.body.classList.contains('theme-dark');
376
+ const btn = document.getElementById('themeToggleBtn');
377
+ if (btn) btn.textContent = isDark ? '☀️ Light Mode' : '🌙 Poster Dark';
378
+ }
379
+ function copySource() {
380
+ navigator.clipboard.writeText(rawContent).then(() => {
381
+ alert('Mind map source copied to clipboard!');
382
+ });
383
+ }
384
+
385
+ window.addEventListener('load', () => {
386
+ setTimeout(renderMarkmap, 60);
387
+ });
388
+ if (document.readyState === 'complete') renderMarkmap();
389
+ </script>
390
+ </body>
391
+ </html>`;
392
+ fs.writeFileSync(path.join(this.baseDir, `${artifact.id}.html`), htmlMindmap, 'utf-8');
393
+ }
394
+ else if (artifact.type === 'graph') {
395
+ const badgeLabel = '📊 Architecture Graph';
57
396
  const htmlGraph = `<!DOCTYPE html>
58
397
  <html lang="en">
59
398
  <head>
@@ -63,88 +402,256 @@ export class ArtifactManager {
63
402
  <script src="https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js"></script>
64
403
  <style>
65
404
  * { box-sizing: border-box; margin: 0; padding: 0; }
405
+ :root {
406
+ --bg-page: radial-gradient(circle at 15% 15%, rgba(99, 102, 241, 0.08) 0%, transparent 40%), radial-gradient(circle at 85% 85%, rgba(236, 72, 153, 0.08) 0%, transparent 40%), #f8fafc;
407
+ --bg-viewport: #ffffff;
408
+ --border-viewport: rgba(226, 232, 240, 0.9);
409
+ --text-main: #0f172a;
410
+ --text-muted: #64748b;
411
+ --btn-bg: #ffffff;
412
+ --btn-border: #e2e8f0;
413
+ --btn-text: #1e293b;
414
+ --btn-hover: #f1f5f9;
415
+ --shadow-viewport: 0 20px 45px -15px rgba(0, 0, 0, 0.06), 0 0 1px 1px rgba(0, 0, 0, 0.04);
416
+ --badge-bg: rgba(99, 102, 241, 0.1);
417
+ --badge-color: #4f46e5;
418
+ --badge-border: rgba(99, 102, 241, 0.25);
419
+ }
420
+ body.theme-dark {
421
+ --bg-page: radial-gradient(circle at 10% 20%, rgba(99, 102, 241, 0.25) 0%, transparent 50%), radial-gradient(circle at 90% 80%, rgba(236, 72, 153, 0.22) 0%, transparent 50%), radial-gradient(circle at 50% 50%, rgba(6, 182, 212, 0.18) 0%, transparent 60%), #0d1322;
422
+ --bg-viewport: rgba(18, 24, 38, 0.85);
423
+ --border-viewport: rgba(255, 255, 255, 0.1);
424
+ --text-main: #f8fafc;
425
+ --text-muted: #94a3b8;
426
+ --btn-bg: rgba(30, 41, 59, 0.85);
427
+ --btn-border: rgba(255, 255, 255, 0.12);
428
+ --btn-text: #f8fafc;
429
+ --btn-hover: rgba(51, 65, 85, 0.95);
430
+ --shadow-viewport: 0 20px 45px -15px rgba(0, 0, 0, 0.5);
431
+ --badge-bg: rgba(99, 102, 241, 0.2);
432
+ --badge-color: #818cf8;
433
+ --badge-border: rgba(99, 102, 241, 0.35);
434
+ }
66
435
  body {
67
- margin: 0; padding: 24px;
436
+ margin: 0; padding: 20px;
68
437
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
69
- background: radial-gradient(circle at 10% 20%, rgba(99, 102, 241, 0.15) 0%, transparent 40%), radial-gradient(circle at 90% 80%, rgba(168, 85, 247, 0.15) 0%, transparent 40%), #0a0e17;
70
- color: #f8fafc;
438
+ background: var(--bg-page);
439
+ color: var(--text-main);
71
440
  display: flex; flex-direction: column; align-items: center; min-height: 100vh;
441
+ overflow-x: hidden;
442
+ transition: background 0.3s ease;
72
443
  }
73
- .header { text-align: center; margin-bottom: 20px; }
74
- h1 { font-size: 20px; color: #ffffff; margin: 0 0 8px 0; font-weight: 800; }
444
+ .header { text-align: center; margin-bottom: 14px; }
445
+ h1 { font-size: 19px; color: var(--text-main); margin: 0 0 6px 0; font-weight: 800; }
75
446
  .badge {
76
447
  font-size: 11px;
77
- background: ${isMindmap ? 'rgba(168, 85, 247, 0.15)' : 'rgba(99, 102, 241, 0.15)'};
78
- color: ${isMindmap ? '#c084fc' : '#a5b4fc'};
448
+ background: var(--badge-bg);
449
+ color: var(--badge-color);
79
450
  padding: 4px 12px; border-radius: 9999px;
80
- border: 1px solid ${isMindmap ? 'rgba(168, 85, 247, 0.3)' : 'rgba(99, 102, 241, 0.3)'};
451
+ border: 1px solid var(--badge-border);
81
452
  text-transform: uppercase; font-weight: 700; letter-spacing: 0.5px;
453
+ display: inline-block; margin-bottom: 6px;
82
454
  }
83
455
  .controls {
84
- display: flex; gap: 8px; margin-bottom: 16px; align-items: center;
456
+ display: flex; gap: 8px; margin-bottom: 14px; align-items: center; flex-wrap: wrap; justify-content: center;
85
457
  }
86
458
  .btn {
87
- background: rgba(30, 41, 59, 0.8); border: 1px solid rgba(255, 255, 255, 0.1);
88
- color: #f8fafc; padding: 6px 12px; border-radius: 8px; font-size: 12px;
89
- font-weight: 600; cursor: pointer; transition: all 0.15s;
459
+ background: var(--btn-bg); border: 1px solid var(--btn-border);
460
+ color: var(--btn-text); padding: 7px 14px; border-radius: 9px; font-size: 12px;
461
+ font-weight: 700; cursor: pointer; transition: all 0.15s; display: flex; align-items: center; gap: 6px;
462
+ box-shadow: 0 2px 4px rgba(0,0,0,0.03);
90
463
  }
91
- .btn:hover { background: rgba(51, 65, 85, 0.9); border-color: rgba(255, 255, 255, 0.25); }
464
+ .btn:hover { background: var(--btn-hover); transform: translateY(-1px); }
465
+ .btn:active { transform: translateY(0); }
92
466
  .viewer-card {
93
- background: rgba(18, 24, 38, 0.75); backdrop-filter: blur(16px);
94
- padding: 24px; border-radius: 16px; border: 1px solid rgba(255, 255, 255, 0.08);
95
- box-shadow: 0 10px 30px -5px rgba(0, 0, 0, 0.5);
96
- width: 100%; max-width: 1100px; overflow: auto; display: flex; justify-content: center;
97
- min-height: 480px; position: relative;
467
+ width: 100%; max-width: 1150px; height: 72vh; min-height: 520px;
468
+ position: relative; overflow: hidden; border-radius: 18px;
469
+ background: var(--bg-viewport); backdrop-filter: blur(20px);
470
+ border: 1px solid var(--border-viewport);
471
+ box-shadow: var(--shadow-viewport);
472
+ cursor: grab; user-select: none; touch-action: none;
473
+ }
474
+ .viewer-card.grabbing { cursor: grabbing; }
475
+ .canvas-wrap {
476
+ width: 100%; height: 100%;
477
+ display: flex; align-items: center; justify-content: center;
478
+ transform-origin: center center;
479
+ will-change: transform;
480
+ }
481
+ .canvas-wrap.animating {
482
+ transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1);
483
+ }
484
+ .mermaid { width: 100%; text-align: center; }
485
+ .mermaid svg { max-width: 100%; height: auto; }
486
+ .help-hint {
487
+ position: absolute; bottom: 12px; right: 14px;
488
+ font-size: 11px; color: var(--text-muted); pointer-events: none;
489
+ background: rgba(255, 255, 255, 0.75); padding: 3px 8px; border-radius: 6px;
490
+ border: 1px solid rgba(0,0,0,0.05);
491
+ }
492
+ body.theme-dark .help-hint {
493
+ background: rgba(18, 24, 38, 0.7);
494
+ border-color: rgba(255, 255, 255, 0.08);
98
495
  }
99
- .mermaid { width: 100%; text-align: center; transform-origin: center center; transition: transform 0.1s ease-out; }
100
496
  </style>
101
497
  </head>
102
498
  <body>
103
499
  <div class="header">
104
- <span class="badge">${isMindmap ? '🧠 ANTRI Interactive Mind Map' : '📊 Architecture Graph'}</span>
500
+ <span class="badge">${badgeLabel}</span>
105
501
  <h1>${artifact.title}</h1>
106
502
  </div>
107
503
  <div class="controls">
108
504
  <button class="btn" onclick="zoomIn()">🔍 Zoom +</button>
109
505
  <button class="btn" onclick="zoomOut()">🔍 Zoom -</button>
110
506
  <button class="btn" onclick="resetZoom()">⛶ Reset</button>
507
+ <button class="btn" onclick="toggleTheme()" id="themeToggleBtn">🌙 Poster Dark</button>
111
508
  </div>
112
509
  <div class="viewer-card" id="viewerCard">
113
- <pre class="mermaid" id="mermaidDiagram">
510
+ <div class="canvas-wrap" id="canvasWrap">
511
+ <pre class="mermaid" id="mermaidDiagram">
114
512
  ${artifact.content.trim()}
115
- </pre>
513
+ </pre>
514
+ </div>
515
+ <div class="help-hint">🖱️ Drag to pan · Scroll to zoom</div>
116
516
  </div>
117
517
  <script>
118
- let currentZoom = 1.0;
518
+ let scale = 1.0;
519
+ let posX = 0;
520
+ let posY = 0;
521
+ let isDragging = false;
522
+ let startPointerX = 0;
523
+ let startPointerY = 0;
524
+ let startPosX = 0;
525
+ let startPosY = 0;
526
+
527
+ const activeTouches = new Map();
528
+ let initialPinchDist = 0;
529
+ let initialPinchScale = 1.0;
530
+
531
+ const viewerCard = document.getElementById('viewerCard');
532
+ const canvasWrap = document.getElementById('canvasWrap');
533
+
534
+ function updateTransform(animate = false) {
535
+ if (animate) {
536
+ canvasWrap.classList.add('animating');
537
+ setTimeout(() => canvasWrap.classList.remove('animating'), 320);
538
+ } else {
539
+ canvasWrap.classList.remove('animating');
540
+ }
541
+ canvasWrap.style.transform = 'translate3d(' + posX + 'px, ' + posY + 'px, 0) scale(' + scale + ')';
542
+ }
543
+
544
+ viewerCard.addEventListener('pointerdown', (e) => {
545
+ activeTouches.set(e.pointerId, { x: e.clientX, y: e.clientY });
546
+ try { viewerCard.setPointerCapture(e.pointerId); } catch {}
547
+
548
+ if (activeTouches.size === 1) {
549
+ isDragging = true;
550
+ viewerCard.classList.add('grabbing');
551
+ startPointerX = e.clientX;
552
+ startPointerY = e.clientY;
553
+ startPosX = posX;
554
+ startPosY = posY;
555
+ } else if (activeTouches.size === 2) {
556
+ isDragging = false;
557
+ viewerCard.classList.remove('grabbing');
558
+ const pts = Array.from(activeTouches.values());
559
+ initialPinchDist = Math.hypot(pts[0].x - pts[1].x, pts[0].y - pts[1].y);
560
+ initialPinchScale = scale;
561
+ }
562
+ });
563
+
564
+ viewerCard.addEventListener('pointermove', (e) => {
565
+ if (!activeTouches.has(e.pointerId)) return;
566
+ activeTouches.set(e.pointerId, { x: e.clientX, y: e.clientY });
567
+
568
+ if (activeTouches.size === 1 && isDragging) {
569
+ const dx = e.clientX - startPointerX;
570
+ const dy = e.clientY - startPointerY;
571
+ posX = startPosX + dx;
572
+ posY = startPosY + dy;
573
+ updateTransform(false);
574
+ } else if (activeTouches.size === 2) {
575
+ const pts = Array.from(activeTouches.values());
576
+ const currentDist = Math.hypot(pts[0].x - pts[1].x, pts[0].y - pts[1].y);
577
+ if (initialPinchDist > 0) {
578
+ scale = Math.min(Math.max(initialPinchScale * (currentDist / initialPinchDist), 0.2), 4.0);
579
+ updateTransform(false);
580
+ }
581
+ }
582
+ });
583
+
584
+ function endPointer(e) {
585
+ activeTouches.delete(e.pointerId);
586
+ try { viewerCard.releasePointerCapture(e.pointerId); } catch {}
587
+ if (activeTouches.size === 0) {
588
+ isDragging = false;
589
+ viewerCard.classList.remove('grabbing');
590
+ } else if (activeTouches.size === 1) {
591
+ isDragging = true;
592
+ viewerCard.classList.add('grabbing');
593
+ const remaining = Array.from(activeTouches.values())[0];
594
+ startPointerX = remaining.x;
595
+ startPointerY = remaining.y;
596
+ startPosX = posX;
597
+ startPosY = posY;
598
+ }
599
+ }
600
+
601
+ viewerCard.addEventListener('pointerup', endPointer);
602
+ viewerCard.addEventListener('pointercancel', endPointer);
603
+
604
+ viewerCard.addEventListener('wheel', (e) => {
605
+ e.preventDefault();
606
+ const delta = e.deltaY < 0 ? 1.15 : 0.87;
607
+ const newScale = Math.min(Math.max(scale * delta, 0.2), 4.0);
608
+
609
+ const rect = viewerCard.getBoundingClientRect();
610
+ const mouseX = e.clientX - rect.left - rect.width / 2;
611
+ const mouseY = e.clientY - rect.top - rect.height / 2;
612
+
613
+ posX = mouseX - (mouseX - posX) * (newScale / scale);
614
+ posY = mouseY - (mouseY - posY) * (newScale / scale);
615
+ scale = newScale;
616
+ updateTransform(false);
617
+ }, { passive: false });
618
+
119
619
  function zoomIn() {
120
- currentZoom = Math.min(currentZoom + 0.2, 3.0);
121
- applyZoom();
620
+ scale = Math.min(scale * 1.25, 4.0);
621
+ updateTransform(true);
122
622
  }
123
623
  function zoomOut() {
124
- currentZoom = Math.max(currentZoom - 0.2, 0.4);
125
- applyZoom();
624
+ scale = Math.max(scale * 0.8, 0.2);
625
+ updateTransform(true);
126
626
  }
127
627
  function resetZoom() {
128
- currentZoom = 1.0;
129
- applyZoom();
628
+ scale = 1.0;
629
+ posX = 0;
630
+ posY = 0;
631
+ updateTransform(true);
130
632
  }
131
- function applyZoom() {
132
- const el = document.getElementById('mermaidDiagram');
133
- if (el) el.style.transform = 'scale(' + currentZoom + ')';
633
+ function toggleTheme() {
634
+ document.body.classList.toggle('theme-dark');
635
+ const isDark = document.body.classList.contains('theme-dark');
636
+ const btn = document.getElementById('themeToggleBtn');
637
+ if (btn) btn.textContent = isDark ? '☀️ Light Mode' : '🌙 Poster Dark';
134
638
  }
639
+
135
640
  mermaid.initialize({
136
641
  startOnLoad: true,
137
- theme: 'dark',
642
+ theme: 'base',
138
643
  securityLevel: 'loose',
139
644
  themeVariables: {
140
- darkMode: true,
141
- background: '#0f172a',
645
+ darkMode: false,
646
+ background: '#ffffff',
142
647
  primaryColor: '#6366f1',
143
- primaryTextColor: '#ffffff',
144
- primaryBorderColor: '#4338ca',
145
- lineColor: '#c084fc',
648
+ primaryTextColor: '#0f172a',
649
+ primaryBorderColor: '#4f46e5',
650
+ lineColor: '#6366f1',
146
651
  secondaryColor: '#0ea5e9',
147
- tertiaryColor: '#10b981'
652
+ tertiaryColor: '#10b981',
653
+ fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif",
654
+ fontSize: '14px'
148
655
  }
149
656
  });
150
657
  </script>
@@ -1 +1 @@
1
- {"version":3,"file":"artifactManager.js","sourceRoot":"","sources":["../../src/core/artifactManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"artifactManager.js","sourceRoot":"","sources":["../../src/core/artifactManager.ts"],"names":[],"mappings":"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"}