mcp-dndgrid 0.1.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 (45) hide show
  1. package/PROJECT_SUMMARY.md +482 -0
  2. package/QUICKSTART.md +223 -0
  3. package/README.md +365 -0
  4. package/STATUS.md +315 -0
  5. package/USAGE_GUIDE.md +547 -0
  6. package/dist/chunk-CMGEAPA5.js +157 -0
  7. package/dist/chunk-CMGEAPA5.js.map +1 -0
  8. package/dist/chunk-QZHBI6ZI.js +5281 -0
  9. package/dist/chunk-QZHBI6ZI.js.map +1 -0
  10. package/dist/chunk-SEGVTWSK.js +44 -0
  11. package/dist/chunk-SEGVTWSK.js.map +1 -0
  12. package/dist/index.d.ts +2 -0
  13. package/dist/index.js +248012 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/stdio-FWYJXSU7.js +101 -0
  16. package/dist/stdio-FWYJXSU7.js.map +1 -0
  17. package/dist/template-JDMAVVX7.js +9 -0
  18. package/dist/template-JDMAVVX7.js.map +1 -0
  19. package/examples/claude_desktop_config.example.json +12 -0
  20. package/examples/example-complex-editor.tsx +107 -0
  21. package/examples/example-dashboard.tsx +65 -0
  22. package/examples/example-ide-layout.tsx +53 -0
  23. package/examples/test-generator.ts +37 -0
  24. package/examples/test-parser.ts +121 -0
  25. package/examples/test-scenarios.md +496 -0
  26. package/package.json +42 -0
  27. package/src/index.ts +16 -0
  28. package/src/server.ts +314 -0
  29. package/src/tools/analyze-layout.ts +193 -0
  30. package/src/tools/apply-template.ts +125 -0
  31. package/src/tools/generate-layout.ts +235 -0
  32. package/src/tools/interactive-builder.ts +100 -0
  33. package/src/tools/validate-layout.ts +113 -0
  34. package/src/types/layout.ts +48 -0
  35. package/src/types/template.ts +181 -0
  36. package/src/utils/ast-parser.ts +264 -0
  37. package/src/utils/code-generator.ts +123 -0
  38. package/src/utils/layout-analyzer.ts +105 -0
  39. package/src/utils/layout-builder.ts +127 -0
  40. package/src/utils/validator.ts +263 -0
  41. package/stderr.log +1 -0
  42. package/stdout.log +0 -0
  43. package/test-mcp.js +27 -0
  44. package/tsconfig.json +29 -0
  45. package/tsup.config.ts +16 -0
package/USAGE_GUIDE.md ADDED
@@ -0,0 +1,547 @@
1
+ # DndGrid MCP Server - 사용 가이드
2
+
3
+ 이 가이드는 Claude Desktop에서 DndGrid MCP 서버를 사용하는 실전 예제를 제공합니다.
4
+
5
+ ## 목차
6
+
7
+ 1. [설정](#설정)
8
+ 2. [Tool 사용 예제](#tool-사용-예제)
9
+ 3. [Resource 접근 예제](#resource-접근-예제)
10
+ 4. [일반적인 워크플로우](#일반적인-워크플로우)
11
+ 5. [고급 패턴](#고급-패턴)
12
+
13
+ ## 설정
14
+
15
+ ### 1. MCP Server 빌드
16
+
17
+ ```bash
18
+ cd mcp
19
+ npm install
20
+ npm run build
21
+ ```
22
+
23
+ ### 2. Claude Desktop 설정
24
+
25
+ Claude Desktop 설정 파일 편집:
26
+
27
+ **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
28
+
29
+ ```json
30
+ {
31
+ "mcpServers": {
32
+ "dndgrid": {
33
+ "command": "node",
34
+ "args": ["/Users/your-username/path/to/zerojin-core/mcp/dist/index.js"]
35
+ }
36
+ }
37
+ }
38
+ ```
39
+
40
+ ### 3. Claude Desktop 재시작
41
+
42
+ MCP 서버를 로드하기 위해 Claude Desktop을 재시작하세요.
43
+
44
+ ### 4. 설치 확인
45
+
46
+ Claude에게 물어보세요:
47
+ ```
48
+ 사용 가능한 DndGrid MCP tools 목록 보여줄 수 있어?
49
+ ```
50
+
51
+ ## Tool 사용 예제
52
+
53
+ ### 1. interactive-builder: 템플릿 탐색
54
+
55
+ **사용 사례**: 사용 가능한 레이아웃 템플릿을 확인하고 싶습니다.
56
+
57
+ **대화**:
58
+ ```
59
+ 사용자: 사용 가능한 DndGrid 템플릿 보여줘
60
+
61
+ Claude: [action="list-templates"로 interactive-builder 사용]
62
+ ```
63
+
64
+ **결과**: Claude가 ASCII 아트 미리보기 및 필요한 컴포넌트 슬롯과 함께 4개 템플릿을 모두 보여줍니다.
65
+
66
+ ---
67
+
68
+ ### 2. apply-template: 템플릿으로 빠른 레이아웃 생성
69
+
70
+ **사용 사례**: 표준 2x2 대시보드 레이아웃이 필요합니다.
71
+
72
+ **대화**:
73
+ ```
74
+ 사용자: UserStats, RevenueChart, ActivityLog, QuickActions 컴포넌트로 대시보드 레이아웃 만들어줘
75
+
76
+ Claude: [apply-template 사용]
77
+ {
78
+ templateName: "dashboard-2x2",
79
+ components: {
80
+ widget1: "UserStats",
81
+ widget2: "RevenueChart",
82
+ widget3: "ActivityLog",
83
+ widget4: "QuickActions"
84
+ },
85
+ width: 1400,
86
+ height: 900
87
+ }
88
+ ```
89
+
90
+ **생성된 코드**:
91
+ ```typescript
92
+ "use client";
93
+
94
+ import { DndGridContainer, DndGridSplit, DndGridItem } from 'zerojin/components';
95
+
96
+ export default function Dashboard() {
97
+ return (
98
+ <DndGridContainer width={1400} height={900}>
99
+ <DndGridSplit direction="horizontal" ratio={0.5}>
100
+ <DndGridSplit direction="vertical" ratio={0.5}>
101
+ <DndGridItem>
102
+ <UserStats />
103
+ </DndGridItem>
104
+ <DndGridItem>
105
+ <RevenueChart />
106
+ </DndGridItem>
107
+ </DndGridSplit>
108
+ <DndGridSplit direction="vertical" ratio={0.5}>
109
+ <DndGridItem>
110
+ <ActivityLog />
111
+ </DndGridItem>
112
+ <DndGridItem>
113
+ <QuickActions />
114
+ </DndGridItem>
115
+ </DndGridSplit>
116
+ </DndGridSplit>
117
+ </DndGridContainer>
118
+ );
119
+ }
120
+ ```
121
+
122
+ ---
123
+
124
+ ### 3. generate-layout: 자연어 생성
125
+
126
+ **사용 사례**: 특정 레이아웃을 생각하고 있지만 어떤 템플릿과도 일치하지 않습니다.
127
+
128
+ **대화**:
129
+ ```
130
+ 사용자: FileTree는 왼쪽에 25%, CodeEditor는 중앙에 50%, PropertyPanel은 오른쪽에 25%로 레이아웃 만들어줘
131
+
132
+ Claude: [generate-layout 사용]
133
+ {
134
+ description: "three column layout with file tree, code editor, and property panel",
135
+ components: ["FileTree", "CodeEditor", "PropertyPanel"],
136
+ containerWidth: 1600,
137
+ containerHeight: 1000
138
+ }
139
+ ```
140
+
141
+ **결과**: Claude가 설명과 일치하는 커스텀 3-컬럼 레이아웃을 생성합니다.
142
+
143
+ ---
144
+
145
+ ### 4. validate-layout: 기존 코드 검증
146
+
147
+ **사용 사례**: 기존 DndGrid 코드가 있고 문제를 확인하고 싶습니다.
148
+
149
+ **대화**:
150
+ ```
151
+ 사용자: 이 DndGrid 코드 검증해줘:
152
+
153
+ import { DndGridContainer, DndGridSplit, DndGridItem } from 'zerojin/components';
154
+
155
+ export default function MyLayout() {
156
+ return (
157
+ <DndGridContainer width={800} height={600}>
158
+ <DndGridSplit direction="vertical" ratio={0.1}>
159
+ <DndGridItem>
160
+ <Sidebar />
161
+ </DndGridItem>
162
+ <DndGridItem>
163
+ <MainContent />
164
+ </DndGridItem>
165
+ </DndGridSplit>
166
+ </DndGridContainer>
167
+ );
168
+ }
169
+
170
+ Claude: [strict=true로 validate-layout 사용]
171
+ ```
172
+
173
+ **결과**:
174
+ ```
175
+ 검증 결과:
176
+
177
+ 경고:
178
+ 1. Split ratio 0.1이 너무 작습니다 (< 0.2). 더 나은 UX를 위해 0.2-0.8 범위 사용을 고려하세요
179
+ 2. "use client" 지시어 누락 (Next.js App Router에 필요)
180
+
181
+ 제안사항:
182
+ - 더 나은 사용성을 위해 왼쪽 패널 비율을 최소 0.2로 증가시키세요
183
+ - Next.js App Router를 사용 중이라면 파일 상단에 "use client"; 추가하세요
184
+ ```
185
+
186
+ ---
187
+
188
+ ### 5. analyze-layout: 성능 분석
189
+
190
+ **사용 사례**: 레이아웃의 성능 특성을 이해하고 싶습니다.
191
+
192
+ **대화**:
193
+ ```
194
+ 사용자: 내 DndGrid 레이아웃 성능 분석해줘:
195
+
196
+ "use client";
197
+
198
+ import { DndGridContainer, DndGridSplit, DndGridItem } from 'zerojin/components';
199
+
200
+ export default function ComplexLayout() {
201
+ return (
202
+ <DndGridContainer width={1920} height={1080}>
203
+ <DndGridSplit direction="vertical" ratio={0.2}>
204
+ <DndGridItem><Nav /></DndGridItem>
205
+ <DndGridSplit direction="horizontal" ratio={0.3}>
206
+ <DndGridSplit direction="vertical" ratio={0.5}>
207
+ <DndGridItem><Panel1 /></DndGridItem>
208
+ <DndGridItem><Panel2 /></DndGridItem>
209
+ </DndGridSplit>
210
+ <DndGridSplit direction="vertical" ratio={0.6}>
211
+ <DndGridItem><Editor /></DndGridItem>
212
+ <DndGridSplit direction="vertical" ratio={0.5}>
213
+ <DndGridItem><Console /></DndGridItem>
214
+ <DndGridItem><Terminal /></DndGridItem>
215
+ </DndGridSplit>
216
+ </DndGridSplit>
217
+ </DndGridSplit>
218
+ </DndGridSplit>
219
+ </DndGridContainer>
220
+ );
221
+ }
222
+
223
+ Claude: [analyze-layout 사용]
224
+ ```
225
+
226
+ **결과**:
227
+ ```
228
+ 레이아웃 분석:
229
+
230
+ 성능 메트릭:
231
+ - Items: 6
232
+ - Splits: 5
233
+ - Max Depth: 3
234
+ - 예상 성능: Good
235
+
236
+ 모범 사례:
237
+ ✅ "use client" 지시어 존재
238
+ ✅ Imports 올바름
239
+ ✅ Container 크기 지정됨
240
+ ✅ 아이템 개수가 권장 제한 내에 있음 (< 20)
241
+ ✅ 깊이가 권장 제한 내에 있음 (< 4)
242
+
243
+ 리팩토링 기회:
244
+ - 더 나은 유지보수성을 위해 중첩된 오른쪽 패널을 별도 컴포넌트로 추출하는 것을 고려하세요
245
+ ```
246
+
247
+ ## Resource 접근 예제
248
+
249
+ ### 1. 아키텍처 문서 읽기
250
+
251
+ **대화**:
252
+ ```
253
+ 사용자: DndGrid 아키텍처 문서 보여줘
254
+
255
+ Claude: [dndgrid://docs/architecture resource 읽기]
256
+ ```
257
+
258
+ **결과**: Claude가 다음을 포함한 완전한 아키텍처 문서를 표시합니다:
259
+ - 핵심 컴포넌트 개요
260
+ - Flat rendering 패턴 설명
261
+ - Binary tree 구조
262
+ - Next.js 호환성 노트
263
+ - 성능 가이드라인
264
+
265
+ ---
266
+
267
+ ### 2. 사용 가능한 템플릿 목록
268
+
269
+ **대화**:
270
+ ```
271
+ 사용자: DndGrid에서 사용 가능한 템플릿은 뭐야?
272
+
273
+ Claude: [dndgrid://templates/list resource 읽기]
274
+ ```
275
+
276
+ **결과**: Claude가 모든 템플릿의 메타데이터, 슬롯, tree 구조가 포함된 JSON 카탈로그를 보여줍니다.
277
+
278
+ ---
279
+
280
+ ### 3. 모범 사례 접근
281
+
282
+ **대화**:
283
+ ```
284
+ 사용자: DndGrid 성능 모범 사례가 뭐야?
285
+
286
+ Claude: [dndgrid://docs/best-practices resource 읽기]
287
+ ```
288
+
289
+ **결과**: Claude가 성능 가이드라인, 일반적인 패턴, 문제 해결 팁을 제공합니다.
290
+
291
+ ## 일반적인 워크플로우
292
+
293
+ ### 워크플로우 1: 처음부터 새 레이아웃 만들기
294
+
295
+ **1단계**: 템플릿 탐색
296
+ ```
297
+ 사용자: 사용 가능한 DndGrid 템플릿 보여줘
298
+ ```
299
+
300
+ **2단계**: 템플릿 선택
301
+ ```
302
+ 사용자: IDE 레이아웃 템플릿에 대해 더 알려줘
303
+ ```
304
+
305
+ **3단계**: 컴포넌트와 함께 적용
306
+ ```
307
+ 사용자: MyFileExplorer, MyCodeEditor, MyTerminal로 IDE 레이아웃 적용해줘
308
+ ```
309
+
310
+ **4단계**: 생성된 코드 검증
311
+ ```
312
+ 사용자: strict 모드로 생성된 코드 검증해줘
313
+ ```
314
+
315
+ ---
316
+
317
+ ### 워크플로우 2: 기존 레이아웃 개선
318
+
319
+ **1단계**: 현재 코드 분석
320
+ ```
321
+ 사용자: 내 DndGrid 레이아웃 분석해줘: [코드 붙여넣기]
322
+ ```
323
+
324
+ **2단계**: 제안사항 검토
325
+ ```
326
+ Claude가 성능 메트릭과 제안사항 제공
327
+ ```
328
+
329
+ **3단계**: 개선 요청
330
+ ```
331
+ 사용자: 제안된 개선사항을 적용해서 레이아웃 다시 생성해줘
332
+ ```
333
+
334
+ **4단계**: 새 코드 검증
335
+ ```
336
+ 사용자: 새 코드 검증해줘
337
+ ```
338
+
339
+ ---
340
+
341
+ ### 워크플로우 3: 커스텀 레이아웃 디자인
342
+
343
+ **1단계**: 레이아웃 설명
344
+ ```
345
+ 사용자: 상단 툴바(10%), 왼쪽 사이드바(20%), 메인 에디터(50%), 오른쪽 패널(20%), 하단 콘솔(나머지 공간)로 레이아웃 필요해
346
+ ```
347
+
348
+ **2단계**: 설명으로부터 생성
349
+ ```
350
+ Claude: [패턴 인식과 함께 generate-layout 사용]
351
+ ```
352
+
353
+ **3단계**: 필요시 조정
354
+ ```
355
+ 사용자: 툴바가 너무 작아, 15%로 만들어줘
356
+ ```
357
+
358
+ **4단계**: 완료 및 검증
359
+ ```
360
+ 사용자: strict 모드로 이 레이아웃 검증해줘
361
+ ```
362
+
363
+ ## 고급 패턴
364
+
365
+ ### 패턴 1: 중첩 IDE 레이아웃
366
+
367
+ **목표**: 여러 중첩 패널이 있는 복잡한 IDE 생성
368
+
369
+ **접근 방식**:
370
+ ```typescript
371
+ // 상세한 설명과 함께 generate-layout 사용
372
+ {
373
+ description: "IDE layout with file tree (15%), split editor area (70%: main 60%, preview 40%), and split bottom panel (15%: console 50%, terminal 50%)",
374
+ components: ["FileTree", "MainEditor", "Preview", "Console", "Terminal"],
375
+ containerWidth: 1920,
376
+ containerHeight: 1080
377
+ }
378
+ ```
379
+
380
+ ---
381
+
382
+ ### 패턴 2: 반응형 대시보드
383
+
384
+ **목표**: 다양한 크기에서 잘 작동하는 대시보드 생성
385
+
386
+ **접근 방식**:
387
+ ```typescript
388
+ // dashboard-2x2 템플릿으로 시작
389
+ // 일관된 레이아웃을 위해 권장 비율(0.5) 사용
390
+ // 위젯을 단순하게 유지하고 깊은 중첩 피하기
391
+ {
392
+ templateName: "dashboard-2x2",
393
+ components: {
394
+ widget1: "MetricsCard",
395
+ widget2: "ChartWidget",
396
+ widget3: "TableWidget",
397
+ widget4: "ActivityWidget"
398
+ },
399
+ width: 1200, // 데스크톱 우선 디자인
400
+ height: 800
401
+ }
402
+ ```
403
+
404
+ ---
405
+
406
+ ### 패턴 3: E2E 테스트 설정
407
+
408
+ **목표**: CI/CD 파이프라인에서 레이아웃 검증
409
+
410
+ **스크립트**:
411
+ ```typescript
412
+ // test-layout.ts
413
+ import { ASTParser } from './utils/ast-parser';
414
+ import { Validator } from './utils/validator';
415
+ import fs from 'fs';
416
+
417
+ const code = fs.readFileSync('./src/app/layout.tsx', 'utf-8');
418
+ const parser = new ASTParser();
419
+ const validator = new Validator();
420
+
421
+ const layout = parser.parse(code);
422
+ if (!layout) {
423
+ console.error('Failed to parse layout');
424
+ process.exit(1);
425
+ }
426
+
427
+ const result = validator.validate(layout, true); // strict mode
428
+ if (result.errors.length > 0) {
429
+ console.error('Validation errors:', result.errors);
430
+ process.exit(1);
431
+ }
432
+
433
+ console.log('Layout validation passed!');
434
+ ```
435
+
436
+ ---
437
+
438
+ ### 패턴 4: 템플릿 커스터마이징
439
+
440
+ **목표**: 프로젝트용 커스텀 템플릿 생성
441
+
442
+ **접근 방식**:
443
+ 1. `generate-layout`을 사용하여 기본 구조 생성
444
+ 2. 생성된 코드 분석
445
+ 3. 패턴과 비율 추출
446
+ 4. 재사용을 위해 프로젝트 템플릿으로 저장
447
+
448
+ **예제**:
449
+ ```
450
+ 사용자: 우리 표준 관리자 페이지용 레이아웃 생성해줘: header (8%), sidebar (18%), content (64%), inspector (10%)
451
+
452
+ Claude: [레이아웃 생성]
453
+
454
+ 사용자: 이것을 "admin-layout" 템플릿으로 저장해줘
455
+
456
+ Claude: [생성된 tree 구조를 BUILTIN_TEMPLATES에 복사할 수 있습니다]
457
+ ```
458
+
459
+ ## 팁과 트릭
460
+
461
+ ### 1. 개발 중 엄격한 검증 사용
462
+
463
+ 성능 이슈를 조기에 발견하기 위해 개발 중에는 항상 `strict: true`로 레이아웃을 검증하세요:
464
+
465
+ ```
466
+ 사용자: strict 모드 활성화해서 내 레이아웃 검증해줘
467
+ ```
468
+
469
+ ### 2. 템플릿으로 시작
470
+
471
+ 일반적인 패턴의 경우, 처음부터 생성하는 것보다 항상 내장 템플릿으로 시작하세요:
472
+
473
+ ```
474
+ 사용자: 3-컬럼 레이아웃 필요해
475
+ Claude: three-column 템플릿이 완벽해요! 적용해드릴게요...
476
+ ```
477
+
478
+ ### 3. 생성된 레이아웃 반복 개선
479
+
480
+ 첫 번째 생성에서 완벽을 기대하지 마세요. 반복하세요:
481
+
482
+ ```
483
+ 사용자: 레이아웃 생성해줘...
484
+ Claude: [생성]
485
+ 사용자: 왼쪽 패널 더 넓게 만들어줘
486
+ Claude: [조정하여 재생성]
487
+ 사용자: 완벽해! 이제 검증해줘
488
+ ```
489
+
490
+ ### 4. 분석을 통한 학습
491
+
492
+ 모범 사례를 배우기 위해 `analyze-layout`을 사용하세요:
493
+
494
+ ```
495
+ 사용자: 내가 찾은 이 잘 작동하는 레이아웃 분석해줘
496
+ Claude: [왜 잘 작동하는지에 대한 인사이트 제공]
497
+ ```
498
+
499
+ ### 5. Tool 조합 사용
500
+
501
+ 최상의 결과를 위해 tool들을 조합해서 사용하세요:
502
+
503
+ ```
504
+ 1. interactive-builder → 옵션 탐색
505
+ 2. apply-template 또는 generate-layout → 코드 생성
506
+ 3. validate-layout → 이슈 확인
507
+ 4. analyze-layout → 성능 이해
508
+ ```
509
+
510
+ ## 문제 해결
511
+
512
+ ### 이슈: 생성된 코드가 컴파일되지 않음
513
+
514
+ **해결책**: Next.js App Router를 사용 중인지 확인하고 "use client" 지시어가 있는지 확인하세요:
515
+ ```
516
+ 사용자: 이 코드 검증하고 Next.js 호환성 확인해줘
517
+ ```
518
+
519
+ ---
520
+
521
+ ### 이슈: 레이아웃 성능이 나쁨
522
+
523
+ **해결책**: strict 모드로 분석하고 검증하세요:
524
+ ```
525
+ 사용자: 내 레이아웃에서 성능 이슈 찾아줘
526
+ Claude: [너무 많은 아이템이나 너무 깊은 중첩 식별]
527
+ 사용자: 중첩 레벨을 줄여서 다시 생성해줘
528
+ ```
529
+
530
+ ---
531
+
532
+ ### 이슈: 어떤 템플릿을 사용할지 모르겠음
533
+
534
+ **해결책**: interactive-builder 사용:
535
+ ```
536
+ 사용자: 사이드바와 메인 콘텐츠가 있는 레이아웃 필요해
537
+ Claude: [관련 템플릿을 보여주기 위해 interactive-builder 사용]
538
+ ```
539
+
540
+ ## 다음 단계
541
+
542
+ - 완전한 tool 레퍼런스는 [README](./README.md) 참조
543
+ - 더 많은 코드 샘플은 [examples/](./examples/) 확인
544
+ - resource를 통해 내장된 아키텍처 문서 읽기
545
+ - Claude Desktop에서 다양한 패턴 실험
546
+
547
+ DndGrid로 즐거운 개발 되세요!
@@ -0,0 +1,157 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/types/template.ts
4
+ var BUILTIN_TEMPLATES = {
5
+ "ide-layout": {
6
+ name: "IDE Layout",
7
+ description: "3-panel layout: sidebar (20%), editor (56%), terminal (24%)",
8
+ preview: `\u250C\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510
9
+ \u2502 \u2502 \u2502
10
+ \u2502 S \u2502 Editor \u2502
11
+ \u2502 I \u2502 \u2502
12
+ \u2502 D \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524
13
+ \u2502 E \u2502 Terminal \u2502
14
+ \u2514\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518`,
15
+ slots: ["sidebar", "editor", "terminal"],
16
+ defaultRatios: {
17
+ "vertical-main": 0.2,
18
+ "horizontal-content": 0.7
19
+ },
20
+ tree: {
21
+ type: "split",
22
+ direction: "vertical",
23
+ ratio: 0.2,
24
+ primary: {
25
+ type: "item",
26
+ slot: "sidebar"
27
+ },
28
+ secondary: {
29
+ type: "split",
30
+ direction: "horizontal",
31
+ ratio: 0.7,
32
+ primary: {
33
+ type: "item",
34
+ slot: "editor"
35
+ },
36
+ secondary: {
37
+ type: "item",
38
+ slot: "terminal"
39
+ }
40
+ }
41
+ }
42
+ },
43
+ "dashboard-2x2": {
44
+ name: "Dashboard 2x2",
45
+ description: "2x2 grid layout for dashboard widgets",
46
+ preview: `\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2510
47
+ \u2502 W1 \u2502 W2 \u2502
48
+ \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u253C\u2500\u2500\u2500\u2500\u2500\u2500\u2524
49
+ \u2502 W3 \u2502 W4 \u2502
50
+ \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2518`,
51
+ slots: ["widget1", "widget2", "widget3", "widget4"],
52
+ defaultRatios: {
53
+ "horizontal-top": 0.5,
54
+ "horizontal-bottom": 0.5,
55
+ "vertical-left": 0.5,
56
+ "vertical-right": 0.5
57
+ },
58
+ tree: {
59
+ type: "split",
60
+ direction: "horizontal",
61
+ ratio: 0.5,
62
+ primary: {
63
+ type: "split",
64
+ direction: "vertical",
65
+ ratio: 0.5,
66
+ primary: {
67
+ type: "item",
68
+ slot: "widget1"
69
+ },
70
+ secondary: {
71
+ type: "item",
72
+ slot: "widget2"
73
+ }
74
+ },
75
+ secondary: {
76
+ type: "split",
77
+ direction: "vertical",
78
+ ratio: 0.5,
79
+ primary: {
80
+ type: "item",
81
+ slot: "widget3"
82
+ },
83
+ secondary: {
84
+ type: "item",
85
+ slot: "widget4"
86
+ }
87
+ }
88
+ }
89
+ },
90
+ "three-column": {
91
+ name: "Three Column",
92
+ description: "3-column layout (20% / 60% / 20%)",
93
+ preview: `\u250C\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2510
94
+ \u2502 \u2502 \u2502 \u2502
95
+ \u2502 L \u2502 Center \u2502 R \u2502
96
+ \u2502 \u2502 \u2502 \u2502
97
+ \u2514\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518`,
98
+ slots: ["left", "center", "right"],
99
+ defaultRatios: {
100
+ "vertical-left": 0.2,
101
+ "vertical-right": 0.75
102
+ },
103
+ tree: {
104
+ type: "split",
105
+ direction: "vertical",
106
+ ratio: 0.2,
107
+ primary: {
108
+ type: "item",
109
+ slot: "left"
110
+ },
111
+ secondary: {
112
+ type: "split",
113
+ direction: "vertical",
114
+ ratio: 0.75,
115
+ primary: {
116
+ type: "item",
117
+ slot: "center"
118
+ },
119
+ secondary: {
120
+ type: "item",
121
+ slot: "right"
122
+ }
123
+ }
124
+ }
125
+ },
126
+ "split-view": {
127
+ name: "Split View",
128
+ description: "Simple 50/50 split (horizontal or vertical)",
129
+ preview: `\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510
130
+ \u2502 \u2502 \u2502
131
+ \u2502 Left \u2502 Right \u2502
132
+ \u2502 \u2502 \u2502
133
+ \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518`,
134
+ slots: ["left", "right"],
135
+ defaultRatios: {
136
+ "vertical-main": 0.5
137
+ },
138
+ tree: {
139
+ type: "split",
140
+ direction: "vertical",
141
+ ratio: 0.5,
142
+ primary: {
143
+ type: "item",
144
+ slot: "left"
145
+ },
146
+ secondary: {
147
+ type: "item",
148
+ slot: "right"
149
+ }
150
+ }
151
+ }
152
+ };
153
+
154
+ export {
155
+ BUILTIN_TEMPLATES
156
+ };
157
+ //# sourceMappingURL=chunk-CMGEAPA5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/template.ts"],"sourcesContent":["import type { LayoutNode } from './layout.js';\n\n/**\n * Template node with slots for components\n */\nexport interface TemplateNode {\n type: 'split' | 'item';\n direction?: 'horizontal' | 'vertical';\n ratio?: number;\n slot?: string; // For item nodes\n primary?: TemplateNode;\n secondary?: TemplateNode;\n}\n\n/**\n * Layout template definition\n */\nexport interface LayoutTemplate {\n name: string;\n description: string;\n preview: string; // ASCII art preview\n slots: string[]; // Required component slots\n defaultRatios: Record<string, number>;\n tree: TemplateNode;\n}\n\n/**\n * Built-in templates\n */\nexport const BUILTIN_TEMPLATES: Record<string, LayoutTemplate> = {\n 'ide-layout': {\n name: 'IDE Layout',\n description: '3-panel layout: sidebar (20%), editor (56%), terminal (24%)',\n preview: `┌────┬────────────┐\n│ │ │\n│ S │ Editor │\n│ I │ │\n│ D ├────────────┤\n│ E │ Terminal │\n└────┴────────────┘`,\n slots: ['sidebar', 'editor', 'terminal'],\n defaultRatios: {\n 'vertical-main': 0.2,\n 'horizontal-content': 0.7,\n },\n tree: {\n type: 'split',\n direction: 'vertical',\n ratio: 0.2,\n primary: {\n type: 'item',\n slot: 'sidebar',\n },\n secondary: {\n type: 'split',\n direction: 'horizontal',\n ratio: 0.7,\n primary: {\n type: 'item',\n slot: 'editor',\n },\n secondary: {\n type: 'item',\n slot: 'terminal',\n },\n },\n },\n },\n\n 'dashboard-2x2': {\n name: 'Dashboard 2x2',\n description: '2x2 grid layout for dashboard widgets',\n preview: `┌──────┬──────┐\n│ W1 │ W2 │\n├──────┼──────┤\n│ W3 │ W4 │\n└──────┴──────┘`,\n slots: ['widget1', 'widget2', 'widget3', 'widget4'],\n defaultRatios: {\n 'horizontal-top': 0.5,\n 'horizontal-bottom': 0.5,\n 'vertical-left': 0.5,\n 'vertical-right': 0.5,\n },\n tree: {\n type: 'split',\n direction: 'horizontal',\n ratio: 0.5,\n primary: {\n type: 'split',\n direction: 'vertical',\n ratio: 0.5,\n primary: {\n type: 'item',\n slot: 'widget1',\n },\n secondary: {\n type: 'item',\n slot: 'widget2',\n },\n },\n secondary: {\n type: 'split',\n direction: 'vertical',\n ratio: 0.5,\n primary: {\n type: 'item',\n slot: 'widget3',\n },\n secondary: {\n type: 'item',\n slot: 'widget4',\n },\n },\n },\n },\n\n 'three-column': {\n name: 'Three Column',\n description: '3-column layout (20% / 60% / 20%)',\n preview: `┌───┬────────┬───┐\n│ │ │ │\n│ L │ Center │ R │\n│ │ │ │\n└───┴────────┴───┘`,\n slots: ['left', 'center', 'right'],\n defaultRatios: {\n 'vertical-left': 0.2,\n 'vertical-right': 0.75,\n },\n tree: {\n type: 'split',\n direction: 'vertical',\n ratio: 0.2,\n primary: {\n type: 'item',\n slot: 'left',\n },\n secondary: {\n type: 'split',\n direction: 'vertical',\n ratio: 0.75,\n primary: {\n type: 'item',\n slot: 'center',\n },\n secondary: {\n type: 'item',\n slot: 'right',\n },\n },\n },\n },\n\n 'split-view': {\n name: 'Split View',\n description: 'Simple 50/50 split (horizontal or vertical)',\n preview: `┌──────────┬──────────┐\n│ │ │\n│ Left │ Right │\n│ │ │\n└──────────┴──────────┘`,\n slots: ['left', 'right'],\n defaultRatios: {\n 'vertical-main': 0.5,\n },\n tree: {\n type: 'split',\n direction: 'vertical',\n ratio: 0.5,\n primary: {\n type: 'item',\n slot: 'left',\n },\n secondary: {\n type: 'item',\n slot: 'right',\n },\n },\n },\n};\n"],"mappings":"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","names":[]}