This commit is contained in:
kim
2026-04-29 23:16:01 +09:00
parent d89d7213f6
commit c348c9cbed
105 changed files with 212 additions and 201 deletions
Binary file not shown.
+9 -9
View File
@@ -332,9 +332,9 @@ def fit_dimensions(img_w, img_h, max_w, max_h, mode="contain"):
mode='contain': fit entirely within max_w × max_h (default, no cropping)
mode='cover': fill max_w × max_h completely, cropping if necessary
"""
# Leave a small breathing margin inside the bounding box
max_w = int(max_w * 0.95)
max_h = int(max_h * 0.95)
# Tiny breathing margin — image fills nearly the full bounding box
max_w = int(max_w * 1.0)
max_h = int(max_h * 1.0)
if img_w <= 0 or img_h <= 0:
return max_w, max_h
ratio = img_w / img_h
@@ -493,17 +493,17 @@ def _text_weight(slide_spec: dict):
def _auto_text_ratio(slide_spec: dict) -> float:
"""Compute text column share (0–1) based on content volume.
≤2 bullets / ≤120 chars → 0.38 image-dominant
3–4 bullets / ≤280 chars → 0.50 balanced
5+ bullets / >280 chars → 0.62 text-dominant
≤2 bullets / ≤120 chars → 0.32 image-dominant
3–4 bullets / ≤280 chars → 0.44 balanced
5+ bullets / >280 chars → 0.56 text-dominant
"""
n_bullets, n_chars = _text_weight(slide_spec)
if n_bullets <= 2 and n_chars <= 120:
return 0.38
return 0.32
elif n_bullets <= 4 and n_chars <= 280:
return 0.50
return 0.44
else:
return 0.62
return 0.56
# ─── Slide Generators ──────────────────────────────────────────────────────────
-7
View File
@@ -1,7 +0,0 @@
cgg70EFDE5B23YA0-IkfDVKef4FcKQJzkDVwp2QhnY0 -- acess key
ymuGrXh-pntJmXeRYGzZda7LvTqeCDlrGpF-27f5FrE -- secret key
938436 -- id
+2
View File
@@ -7,6 +7,8 @@ ymuGrXh-pntJmXeRYGzZda7LvTqeCDlrGpF-27f5FrE -- secret key
938436 -- id
UNSPLASH_ACCESS_KEY=cgg70EFDE5B23YA0-IkfDVKef4FcKQJzkDVwp2QhnY0
PEXELS_API_KEY=y7Fm3aGM9MlS9nq8ttsMEowcaCFRibFvxpp6ABg97ZupAoYNHWKSU5Z7
+195 -12
View File
@@ -59,8 +59,8 @@
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
min-height: 100vh;
height: 100vh;
min-height: 100dvh;
height: 100dvh;
font-family: 'Manrope', sans-serif;
color: var(--text);
background:
@@ -1756,22 +1756,87 @@
@media (max-width: 900px) {
body {
padding: 8px;
gap: 8px;
grid-template-rows: 58px 1fr 280px;
padding: 0;
gap: 0;
grid-template-rows: 52px 1fr 56px;
grid-template-columns: 1fr;
grid-template-areas:
"header"
"main"
"right";
"content"
"mobile-nav";
}
header { border-radius: 14px; }
header {
border-radius: 0;
border-left: none;
border-right: none;
border-top: none;
}
aside { display: none; }
.status-bar { display: none; }
#chat-messages,
#main-content { padding: 14px; }
.chat-input-area,
.mission-bar { padding: 10px; }
/* Both panels share the content cell; JS toggles which is visible */
main { grid-area: content; border-radius: 0; }
.right-panel { grid-area: content; display: none; border-radius: 0; }
body.mob-ctx main { display: none; }
body.mob-ctx .right-panel { display: flex; }
/* Sidebar drawer — slides in from left over content */
body.mob-menu aside {
display: flex;
position: fixed;
top: 52px; left: 0; bottom: 56px;
width: min(300px, 85vw);
z-index: 500;
box-shadow: 4px 0 24px rgba(0,0,0,0.18);
overflow-y: auto;
border-right: 1px solid var(--line);
}
/* Hide desktop resize handle on mobile */
#right-panel-resize-handle { display: none !important; }
/* Prevent iOS auto-zoom on input focus (requires ≥16px) */
#chat-input, input[type="text"], input[type="password"],
input[type="email"], input[type="number"], textarea {
font-size: 16px !important;
}
#chat-messages, #main-content { padding: 12px; }
.chat-input-area, .mission-bar { padding: 8px 10px; }
/* Show mobile bottom nav */
#mobile-nav { display: flex !important; }
}
/* --- Mobile Bottom Nav ---------------------------- */
#mobile-nav {
display: none;
grid-area: mobile-nav;
align-items: stretch;
background: var(--panel);
border-top: 1px solid var(--line);
}
.mob-tab {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 3px;
border: none;
background: transparent;
color: var(--muted);
font-family: 'Manrope', sans-serif;
font-size: 10px;
font-weight: 700;
letter-spacing: 0.04em;
cursor: pointer;
padding: 6px 4px;
border-top: 2px solid transparent;
transition: color 0.15s, border-color 0.15s;
-webkit-tap-highlight-color: transparent;
}
.mob-tab.active { color: var(--brand); border-top-color: var(--brand); }
.mob-tab svg { width: 20px; height: 20px; stroke-width: 2; }
/* --- Heartbeat Page ------------------------------- */
#heartbeat-view {
display: none;
@@ -2399,6 +2464,8 @@
<!-- RIGHT PANEL -->
<div class="right-panel" id="right-panel" style="position:relative">
<!-- Resize handle on left edge -->
<div id="right-panel-resize-handle" style="position:absolute;left:0;top:0;bottom:0;width:5px;cursor:col-resize;z-index:200;background:transparent;transition:background 0.15s ease" title="Drag to resize"></div>
<!-- Right panel topbar with canvas toggle -->
<div style="display:flex;align-items:center;justify-content:space-between;padding:6px 12px;border-bottom:1px solid var(--line);flex-shrink:0;background:var(--panel);min-height:38px">
<span style="font-size:10px;font-weight:800;color:var(--muted);text-transform:uppercase;letter-spacing:0.06em">Context</span>
@@ -2574,6 +2641,25 @@
</div>
</div>
<!-- MOBILE BOTTOM NAV -->
<nav id="mobile-nav">
<button id="mob-tab-chat" class="mob-tab active" onclick="mobTab('chat')">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/></svg>
Chat
</button>
<button id="mob-tab-ctx" class="mob-tab" onclick="mobTab('ctx')">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="2"/><path d="M3 9h18M9 21V9"/></svg>
Context
</button>
<button id="mob-tab-menu" class="mob-tab" onclick="mobTab('menu')">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"><line x1="3" y1="6" x2="21" y2="6"/><line x1="3" y1="12" x2="21" y2="12"/><line x1="3" y1="18" x2="21" y2="18"/></svg>
Menu
</button>
</nav>
<!-- Mobile backdrop (closes sidebar drawer) -->
<div id="mob-backdrop" onclick="mobCloseMenu()" style="display:none;position:fixed;inset:0;background:rgba(0,0,0,0.38);z-index:499;-webkit-tap-highlight-color:transparent"></div>
<!-- ERROR RESPONSE MODAL -->
<div id="error-response-panel">
<div class="error-response-header">
@@ -9590,6 +9676,103 @@ async function submitErrorResponse() {
}
})();
// ── Mobile tab navigation ───────────────────────────────────────────────────
function mobTab(tab) {
const body = document.body;
if (tab === 'menu') {
const isOpen = body.classList.contains('mob-menu');
if (isOpen) {
mobCloseMenu();
} else {
body.classList.add('mob-menu');
document.getElementById('mob-backdrop').style.display = 'block';
}
// Keep chat/ctx tab highlight unchanged; toggle menu highlight
document.getElementById('mob-tab-menu').classList.toggle('active', !isOpen);
return;
}
mobCloseMenu();
['chat', 'ctx', 'menu'].forEach(t =>
document.getElementById('mob-tab-' + t)?.classList.toggle('active', t === tab)
);
if (tab === 'ctx') {
body.classList.add('mob-ctx');
} else {
body.classList.remove('mob-ctx');
}
}
function mobCloseMenu() {
document.body.classList.remove('mob-menu');
document.getElementById('mob-backdrop').style.display = 'none';
document.getElementById('mob-tab-menu')?.classList.remove('active');
}
// ── Right-panel resize ──────────────────────────────────────────────────────
(function initRightPanelResize() {
const MIN_W = 280;
const MAX_W_RATIO = 0.65;
const STORE_KEY = 'rightPanelWidth';
function applyWidth(px) {
document.body.style.gridTemplateColumns = `280px 1fr ${px}px`;
}
function clamp(px) {
return Math.max(MIN_W, Math.min(Math.floor(window.innerWidth * MAX_W_RATIO), px));
}
// Restore saved width
const saved = parseInt(localStorage.getItem(STORE_KEY), 10);
if (saved && saved >= MIN_W) applyWidth(clamp(saved));
function setup() {
const handle = document.getElementById('right-panel-resize-handle');
const panel = document.getElementById('right-panel');
if (!handle || !panel) return;
handle.addEventListener('mouseenter', () => { handle.style.background = 'var(--brand, #1668e3)'; handle.style.opacity = '0.35'; });
handle.addEventListener('mouseleave', () => { handle.style.background = 'transparent'; handle.style.opacity = '1'; });
handle.addEventListener('mousedown', (e) => {
e.preventDefault();
const startX = e.clientX;
const startW = panel.getBoundingClientRect().width;
// Prevent iframes from swallowing events during drag
document.querySelectorAll('iframe').forEach(f => f.style.pointerEvents = 'none');
document.body.style.userSelect = 'none';
handle.style.background = 'var(--brand, #1668e3)';
handle.style.opacity = '0.6';
function onMove(ev) {
const newW = clamp(startW + (startX - ev.clientX));
applyWidth(newW);
}
function onUp() {
document.removeEventListener('mousemove', onMove);
document.removeEventListener('mouseup', onUp);
document.querySelectorAll('iframe').forEach(f => f.style.pointerEvents = '');
document.body.style.userSelect = '';
handle.style.background = 'transparent';
handle.style.opacity = '1';
const finalW = panel.getBoundingClientRect().width;
localStorage.setItem(STORE_KEY, Math.round(finalW));
}
document.addEventListener('mousemove', onMove);
document.addEventListener('mouseup', onUp);
});
}
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', setup);
else setup();
})();
function handleErrorResponseWsEvent(e) {
const msg = e.detail || e;
if (!msg || msg.type !== 'task_error_requires_response') return;
+6 -5
View File
@@ -21,11 +21,12 @@
## pptx_workflow
1. Call `create_presentation` ONCE with ALL slides in a single spec. The tool auto-creates the project folder from the title.
2. For slide images, put `image_url` directly on each slide spec — the Python engine downloads it automatically into the project folder.
3. If image_url fails, try `image_path` pointing to an existing local file (relative to workspace, e.g. `"uploads/photo.jpg"`).
4. Slide type field is `type` — valid values: `"title"`, `"content"`, `"section"`, `"image"`, `"blank"`. Do NOT use `layout`.
5. Do NOT write Python scripts to download images. Do NOT call shell repeatedly to download images before create_presentation. Just put `image_url` in the slide spec.
6. Engine is always python-pptx. Output: `[Title](/api/files/<folder>/<filename>.pptx)`.
2. For slide images, use `image_search` with a concise English keyword (e.g. `"golden retriever puppy"`, `"modern office meeting"`). Pexels/Unsplash APIs download the image automatically — no manual download needed.
3. Use `image_url` ONLY when the user provides a specific URL. Do NOT invent image URLs.
4. Use `image_path` ONLY for files already in the workspace (e.g. `"uploads/photo.jpg"`).
5. Slide type field is `type` — valid values: `"title"`, `"content"`, `"section"`, `"image"`, `"blank"`. Do NOT use `layout`.
6. Do NOT write Python scripts to download images. Do NOT call shell to download images before create_presentation.
7. Engine is always python-pptx. Output: `[Title](/api/files/<folder>/<filename>.pptx)`.
## identity_sync
- Sync critical fields IDENTITY.md ↔ SOUL.md when name/role/mode changes. Hash last block for sanity checks.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 258 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 267 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 269 KiB

@@ -1,24 +0,0 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>강아지 품종 가이드 (수정본) - 다운로드</title>
<style>
body { font-family: 'Malgun Gothic', sans-serif; max-width: 600px; margin: 60px auto; padding: 20px; text-align: center; background: #f8f9fa; }
.card { background: white; border-radius: 12px; padding: 40px 30px; box-shadow: 0 4px 20px rgba(0,0,0,0.08); }
h1 { color: #1a1a2e; font-size: 24px; margin-bottom: 10px; }
p { color: #5f6f86; margin-bottom: 30px; }
.btn { display: inline-block; background: #1668e3; color: white; text-decoration: none; padding: 14px 36px; border-radius: 8px; font-size: 16px; font-weight: bold; transition: background 0.2s; }
.btn:hover { background: #1255bb; }
.meta { margin-top: 20px; font-size: 12px; color: #888; }
</style>
</head>
<body>
<div class="card">
<h1>강아지 품종 가이드 (수정본)</h1>
<p>슬라이드 6장이 준비되었습니다.</p>
<a class="btn" href="강아지_품종_가이드_수정본.pptx" download>프레젠테이션 다운로드</a>
<div class="meta">D:\homeclaw\workspace\강아지_품종_가이드_수정본\강아지_품종_가이드_수정본.pptx</div>
</div>
</body>
</html>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 164 KiB

@@ -1,24 +0,0 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>강아지 품종 소개 - 다운로드</title>
<style>
body { font-family: 'Malgun Gothic', sans-serif; max-width: 600px; margin: 60px auto; padding: 20px; text-align: center; background: #f8f9fa; }
.card { background: white; border-radius: 12px; padding: 40px 30px; box-shadow: 0 4px 20px rgba(0,0,0,0.08); }
h1 { color: #1a1a2e; font-size: 24px; margin-bottom: 10px; }
p { color: #5f6f86; margin-bottom: 30px; }
.btn { display: inline-block; background: #1668e3; color: white; text-decoration: none; padding: 14px 36px; border-radius: 8px; font-size: 16px; font-weight: bold; transition: background 0.2s; }
.btn:hover { background: #1255bb; }
.meta { margin-top: 20px; font-size: 12px; color: #888; }
</style>
</head>
<body>
<div class="card">
<h1>강아지 품종 소개</h1>
<p>슬라이드 6장이 준비되었습니다.</p>
<a class="btn" href="강아지_품종_소개_v2.pptx" download>프레젠테이션 다운로드</a>
<div class="meta">D:\homeclaw\workspace\강아지_품종_소개\강아지_품종_소개_v2.pptx</div>
</div>
</body>
</html>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 258 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 267 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

@@ -1,24 +0,0 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>강아지 품종 소개 v4 - 다운로드</title>
<style>
body { font-family: 'Malgun Gothic', sans-serif; max-width: 600px; margin: 60px auto; padding: 20px; text-align: center; background: #f8f9fa; }
.card { background: white; border-radius: 12px; padding: 40px 30px; box-shadow: 0 4px 20px rgba(0,0,0,0.08); }
h1 { color: #1a1a2e; font-size: 24px; margin-bottom: 10px; }
p { color: #5f6f86; margin-bottom: 30px; }
.btn { display: inline-block; background: #1668e3; color: white; text-decoration: none; padding: 14px 36px; border-radius: 8px; font-size: 16px; font-weight: bold; transition: background 0.2s; }
.btn:hover { background: #1255bb; }
.meta { margin-top: 20px; font-size: 12px; color: #888; }
</style>
</head>
<body>
<div class="card">
<h1>강아지 품종 소개 v4</h1>
<p>슬라이드 6장이 준비되었습니다.</p>
<a class="btn" href="강아지_품종_소개_v4.pptx" download>프레젠테이션 다운로드</a>
<div class="meta">D:\homeclaw\workspace\강아지_품종_소개_v4\강아지_품종_소개_v4.pptx</div>
</div>
</body>
</html>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 258 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 257 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 265 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 185 KiB

@@ -1,24 +0,0 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>고양이 품종 소개 - 다운로드</title>
<style>
body { font-family: 'Malgun Gothic', sans-serif; max-width: 600px; margin: 60px auto; padding: 20px; text-align: center; background: #f8f9fa; }
.card { background: white; border-radius: 12px; padding: 40px 30px; box-shadow: 0 4px 20px rgba(0,0,0,0.08); }
h1 { color: #1a1a2e; font-size: 24px; margin-bottom: 10px; }
p { color: #5f6f86; margin-bottom: 30px; }
.btn { display: inline-block; background: #1668e3; color: white; text-decoration: none; padding: 14px 36px; border-radius: 8px; font-size: 16px; font-weight: bold; transition: background 0.2s; }
.btn:hover { background: #1255bb; }
.meta { margin-top: 20px; font-size: 12px; color: #888; }
</style>
</head>
<body>
<div class="card">
<h1>고양이 품종 소개</h1>
<p>슬라이드 6장이 준비되었습니다.</p>
<a class="btn" href="고양이_품종_소개.pptx" download>프레젠테이션 다운로드</a>
<div class="meta">D:\homeclaw\workspace\고양이_품종_소개\고양이_품종_소개.pptx</div>
</div>
</body>
</html>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 163 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 235 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 206 KiB

@@ -1,24 +0,0 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>고양이 품종 소개 확장판 - 다운로드</title>
<style>
body { font-family: 'Malgun Gothic', sans-serif; max-width: 600px; margin: 60px auto; padding: 20px; text-align: center; background: #f8f9fa; }
.card { background: white; border-radius: 12px; padding: 40px 30px; box-shadow: 0 4px 20px rgba(0,0,0,0.08); }
h1 { color: #1a1a2e; font-size: 24px; margin-bottom: 10px; }
p { color: #5f6f86; margin-bottom: 30px; }
.btn { display: inline-block; background: #1668e3; color: white; text-decoration: none; padding: 14px 36px; border-radius: 8px; font-size: 16px; font-weight: bold; transition: background 0.2s; }
.btn:hover { background: #1255bb; }
.meta { margin-top: 20px; font-size: 12px; color: #888; }
</style>
</head>
<body>
<div class="card">
<h1>고양이 품종 소개 확장판</h1>
<p>슬라이드 6장이 준비되었습니다.</p>
<a class="btn" href="고양이_품종_소개_확장판.pptx" download>프레젠테이션 다운로드</a>
<div class="meta">D:\homeclaw\workspace\고양이_품종_소개_확장판\고양이_품종_소개_확장판.pptx</div>
</div>
</body>
</html>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 221 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 232 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 216 KiB

@@ -1,24 +0,0 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>소나무 종류 소개 - 다운로드</title>
<style>
body { font-family: 'Malgun Gothic', sans-serif; max-width: 600px; margin: 60px auto; padding: 20px; text-align: center; background: #f8f9fa; }
.card { background: white; border-radius: 12px; padding: 40px 30px; box-shadow: 0 4px 20px rgba(0,0,0,0.08); }
h1 { color: #1a1a2e; font-size: 24px; margin-bottom: 10px; }
p { color: #5f6f86; margin-bottom: 30px; }
.btn { display: inline-block; background: #1668e3; color: white; text-decoration: none; padding: 14px 36px; border-radius: 8px; font-size: 16px; font-weight: bold; transition: background 0.2s; }
.btn:hover { background: #1255bb; }
.meta { margin-top: 20px; font-size: 12px; color: #888; }
</style>
</head>
<body>
<div class="card">
<h1>소나무 종류 소개</h1>
<p>슬라이드 6장이 준비되었습니다.</p>
<a class="btn" href="소나무_종류_소개.pptx" download>프레젠테이션 다운로드</a>
<div class="meta">D:\homeclaw\workspace\소나무_종류_소개\소나무_종류_소개.pptx</div>
</div>
</body>
</html>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 183 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 417 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 379 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 482 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 318 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 350 KiB

@@ -1,24 +0,0 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>양 품종 소개 presentation - 다운로드</title>
<style>
body { font-family: 'Malgun Gothic', sans-serif; max-width: 600px; margin: 60px auto; padding: 20px; text-align: center; background: #f8f9fa; }
.card { background: white; border-radius: 12px; padding: 40px 30px; box-shadow: 0 4px 20px rgba(0,0,0,0.08); }
h1 { color: #1a1a2e; font-size: 24px; margin-bottom: 10px; }
p { color: #5f6f86; margin-bottom: 30px; }
.btn { display: inline-block; background: #1668e3; color: white; text-decoration: none; padding: 14px 36px; border-radius: 8px; font-size: 16px; font-weight: bold; transition: background 0.2s; }
.btn:hover { background: #1255bb; }
.meta { margin-top: 20px; font-size: 12px; color: #888; }
</style>
</head>
<body>
<div class="card">
<h1>양 품종 소개 presentation</h1>
<p>슬라이드 6장이 준비되었습니다.</p>
<a class="btn" href="양_품종_소개_presentation.pptx" download>프레젠테이션 다운로드</a>
<div class="meta">D:\homeclaw\workspace\양_품종_소개_presentation\양_품종_소개_presentation.pptx</div>
</div>
</body>
</html>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 163 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 233 KiB

Some files were not shown because too many files have changed in this diff Show More