theme: 작성자 디렉터리 제거 및 로컬 메일 주소 출력

Made-with: Cursor
This commit is contained in:
2026-04-16 18:46:13 +09:00
parent c6f73c66ee
commit f35f0b155e
12 changed files with 30 additions and 99 deletions

File diff suppressed because one or more lines are too long

View File

@@ -1,36 +0,0 @@
{{!< default}}
<main class="content-area">
<section class="stack-section">
<header class="section-header text-center">
<h1 class="section-title">Authors</h1>
<p class="section-description">Browse by author</p>
</header>
{{#get "authors" limit="100" include="count.posts"}}
<div class="author-directory grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4">
{{#foreach authors}}
<a class="author-directory__card group flex min-h-[128px] flex-col rounded-[14px] border border-[var(--border)] bg-[var(--surface)] p-4 text-left transition-colors hover:bg-[var(--surface-muted)]" href="{{url}}">
<span class="flex items-start gap-3">
{{#if profile_image}}
<img class="h-11 w-11 rounded-full object-cover" src="{{img_url profile_image size="xs"}}" alt="{{name}}">
{{else}}
<span class="flex h-11 w-11 items-center justify-center rounded-full bg-[var(--surface-muted)] text-sm font-semibold">A</span>
{{/if}}
<span class="min-w-0 flex-1">
<strong class="block text-[15px] font-semibold tracking-[-0.02em]">{{name}}</strong>
{{#if bio}}
<span class="mt-1 line-clamp-3 block text-[13px] leading-5 text-[var(--text-soft)]">{{bio}}</span>
{{else}}
<span class="mt-1 block text-[13px] leading-5 text-[var(--text-soft)]">Posts by {{name}}.</span>
{{/if}}
</span>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-share-3"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M13 4v4c-6.575 1.028 -9.02 6.788 -10 12c-.037 .206 5.384 -5.962 10 -6v4l8 -7l-8 -7"></path></svg>
</span>
<span class="mt-auto pt-3 text-[13px] font-medium text-[var(--text-soft)]">{{plural count.posts empty="0 posts" singular="% post" plural="% posts"}}</span>
</a>
{{/foreach}}
</div>
{{/get}}
</section>
</main>

View File

@@ -8,6 +8,8 @@ services:
environment:
url: http://localhost:2368
NODE_ENV: development
database__client: sqlite3
database__connection__filename: /var/lib/ghost/content/data/ghost-local.db
mail__transport: SMTP
mail__from: "Ghost Local <noreply@localhost>"
mail__options__host: mailpit

View File

@@ -1,7 +1,7 @@
# 배포 가이드
## 현재 버전
- `v0.1.43`
- `v0.2.1`
## Git 기본 설정
- 저장소 작성자 정보는 아래 값으로 통일한다.
@@ -73,9 +73,9 @@ npm run zip:version
- 현재 `package.json` 버전을 기준으로 `thred-inspired-theme-v0.x.x.zip` 파일을 생성한다.
## `/tags/`, `/authors/` 연결 방법
- 가장 쉬운 방법은 Ghost Admin에서 페이지를 만들고 슬러그를 각각 `tags`, `authors`로 지정한 뒤 템플릿을 연결하는 방식이다.
- 페이지 방식 대신 커스텀 라우트를 쓰려면 [routes.yaml.example](/Users/bicute/Desktop/UGREEN/GHOST%20THEME/routes.yaml.example)를 기준으로 Ghost의 `routes.yaml``/tags/`, `/authors/`를 연결한다.
## `/tags/` 연결 방법
- 가장 쉬운 방법은 Ghost Admin에서 페이지를 만들고 슬러그를 `tags`로 지정한 뒤 템플릿을 연결하는 방식이다.
- 페이지 방식 대신 커스텀 라우트를 쓰려면 [routes.yaml.example](/Users/bicute/Desktop/UGREEN/GHOST%20THEME/routes.yaml.example)를 기준으로 Ghost의 `routes.yaml``/tags/`를 연결한다.
## 로컬 빌드 검증
```bash

View File

@@ -1,5 +1,8 @@
# 의사결정 이력
## 2026-04-16 v0.2.1
개인용 블로그 운영에서는 작성자 디렉터리(`/authors/`)와 작성자 목록 페이지가 탐색/운영 측면에서 가치가 낮고, 좌측 사이드바에도 불필요한 메뉴가 늘어나는 문제가 있었다. 그래서 `/authors/` 커스텀 라우트와 작성자 디렉터리 템플릿을 제거하고, 필요 시에는 기본 제공되는 `author` 아카이브(개별 작성자 페이지)만 유지하는 방향으로 단순화했다.
## 2026-04-16 v0.1.43
포스트 상세의 `Read next`가 최신 글만 노출되면 홈 목록과 중복되어 탐색 가치가 낮아진다는 요구에 맞춰, 우선순위를 `primary_tag` 관련 글로 전환했다. 태그 기반 결과가 없을 때만 현재 글 제외 최신 글을 fallback으로 노출하도록 구성해, 관련성 우선과 빈 상태 회피를 함께 만족시키는 방식으로 정리했다.

View File

@@ -1,15 +1,13 @@
# 파일-화면 매핑 가이드
## 현재 버전
- `v0.1.43`
- `v0.2.1`
## 공통 레이아웃
- [default.hbs](/Users/bicute/Desktop/UGREEN/GHOST%20THEME/default.hbs): 전체 3열 셸, 1296px 공통 폭 계산, 공통 자산 로드
- [partials/site/sidebar-left.hbs](/Users/bicute/Desktop/UGREEN/GHOST%20THEME/partials/site/sidebar-left.hbs): 좌측 탐색/직접 링크형 Tags·Authors 메뉴/카테고리 아코디언/푸터
- [page-tags.hbs](/Users/bicute/Desktop/UGREEN/GHOST%20THEME/page-tags.hbs): `slug=tags` 페이지용 태그 디렉터리
- [page-authors.hbs](/Users/bicute/Desktop/UGREEN/GHOST%20THEME/page-authors.hbs): `slug=authors` 페이지용 작성자 디렉터리
- [tags-index.hbs](/Users/bicute/Desktop/UGREEN/GHOST%20THEME/tags-index.hbs): `/tags/` 커스텀 라우트용 태그 디렉터리
- [authors-index.hbs](/Users/bicute/Desktop/UGREEN/GHOST%20THEME/authors-index.hbs): `/authors/` 커스텀 라우트용 작성자 디렉터리
- [partials/site/topbar.hbs](/Users/bicute/Desktop/UGREEN/GHOST%20THEME/partials/site/topbar.hbs): 상단 3열 헤더, 중앙 검색, 좌측 사이드바 토글
- [partials/site/sidebar-right.hbs](/Users/bicute/Desktop/UGREEN/GHOST%20THEME/partials/site/sidebar-right.hbs): 우측 287px 사이드바, Ghost Recommendations 기반 추천 링크/구독/푸터 구성

View File

@@ -1,7 +1,7 @@
# 기술 명세
## 현재 버전
- `v0.1.43`
- `v0.2.1`
## 테마 개요
- Ghost `v5` 대응 커스텀 테마
@@ -24,9 +24,9 @@
- 좌측 네비게이션 마커와 카테고리 마커는 동일한 세로 바 → 원형 hover 패턴 사용
- 전역 `ol`, `ul`, `menu` 기본 패딩과 리스트 스타일 리셋 적용
- `author.hbs`는 페이지 컨텍스트의 작성자 데이터를 직접 사용
- `page-tags.hbs`, `page-authors.hbs`는 각각 `slug=tags`, `slug=authors` 페이지에 연결 가능
- `page-tags.hbs``slug=tags` 페이지에 연결 가능
- 태그/작성자 디렉터리 목록은 현재 `limit="100"` 기준
- `tags-index.hbs`, `authors-index.hbs`는 Ghost `routes.yaml` 커스텀 라우트로 `/tags/`, `/authors/`에 연결됨
- `tags-index.hbs`는 Ghost `routes.yaml` 커스텀 라우트로 `/tags/`에 연결됨
- 로컬 개발 환경의 실제 라우트 설정은 `.docker/ghost/content/settings/routes.yaml`을 기준으로 사용함
- 홈 메인 피드는 히어로, Featured 수평 슬라이드, Latest 리스트 구성을 사용함
- 우측 사이드바 `Recommended` 섹션은 Ghost `recommendations` 데이터를 우선 사용하며, 항목별 외부 링크와 favicon 표시를 지원함

View File

@@ -1,5 +1,13 @@
# 업데이트 로그
## v0.2.1 - 2026-04-16
- `package.json` 버전을 `0.2.1`로 증가.
- `routes.yaml.example`에서 `/authors/` 커스텀 라우트를 제거.
- 작성자 디렉터리 템플릿(`authors-index.hbs`, `page-authors.hbs`)을 제거해 개인용 블로그 구성에 맞게 정리.
- `npm run dev`, `npm run dev:ghost:start` 실행 시 로컬 메일 확인용 Mailpit 주소(`http://localhost:8025`, `localhost:1025`)를 함께 출력하도록 개선.
- `docs/spec.md`, `docs/map.md`, `docs/deploy.md` 현재 버전을 `v0.2.1`로 동기화하고 작성자 디렉터리 관련 내용을 제거.
- `docs/history.md`에 작성자 디렉터리 제거 의사결정 이력 추가.
## v0.1.43 - 2026-04-16
- `package.json` 버전을 `0.1.43`으로 증가.
- `docs/spec.md`, `docs/map.md`, `docs/deploy.md` 현재 버전을 `v0.1.43`으로 동기화.

View File

@@ -1,6 +1,6 @@
{
"name": "ghost-theme-thred-clone",
"version": "0.1.43",
"version": "0.2.1",
"private": true,
"description": "A Ghost theme inspired by the Thred reference layout.",
"keywords": [
@@ -83,8 +83,8 @@
"dev:sync": "sh ./scripts/sync-theme.sh",
"dev:seed": "node ./scripts/build-sample-content.js",
"dev:seed:zip": "npm run dev:seed && cd seed && zip -q -r thred-inspired-sample-content.ghost.zip thred-inspired-sample-content.ghost.json",
"dev:ghost:start": "npm run dev:prepare && docker compose up -d && printf '\\nGhost local: http://localhost:2368\\nGhost admin: http://localhost:2368/ghost\\n\\n'",
"dev:ghost:restart": "npm run dev:prepare && docker compose restart ghost && printf '\\nGhost local: http://localhost:2368\\nGhost admin: http://localhost:2368/ghost\\n\\n'",
"dev:ghost:start": "npm run dev:prepare && docker compose up -d && printf '\\nGhost local: http://localhost:2368\\nGhost admin: http://localhost:2368/ghost\\nMailpit UI: http://localhost:8025\\nMailpit SMTP: localhost:1025\\n\\n'",
"dev:ghost:restart": "npm run dev:prepare && docker compose restart ghost && printf '\\nGhost local: http://localhost:2368\\nGhost admin: http://localhost:2368/ghost\\nMailpit UI: http://localhost:8025\\nMailpit SMTP: localhost:1025\\n\\n'",
"dev:ghost:stop": "docker compose down",
"zip": "zip -r theme.zip . -x '*.git*' -x 'node_modules/*' -x 'theme.zip'",
"zip:version": "rm -f thred-inspired-theme-v$npm_package_version.zip && git ls-files | zip -q thred-inspired-theme-v$npm_package_version.zip -@"

View File

@@ -1,42 +0,0 @@
{{!< default}}
{{#post}}
<main class="content-area">
<section class="stack-section">
<header class="section-header text-center">
<h1 class="section-title">{{title}}</h1>
{{#if custom_excerpt}}
<p class="section-description">{{custom_excerpt}}</p>
{{else}}
<p class="section-description">Browse by author</p>
{{/if}}
</header>
{{#get "authors" limit="100" include="count.posts"}}
<div class="author-directory grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4">
{{#foreach authors}}
<a class="author-directory__card group flex min-h-[128px] flex-col rounded-[14px] border border-[var(--border)] bg-[var(--surface)] p-4 text-left transition-colors hover:bg-[var(--surface-muted)]" href="{{url}}">
<span class="flex items-start gap-3">
{{#if profile_image}}
<img class="h-11 w-11 rounded-full object-cover" src="{{img_url profile_image size="xs"}}" alt="{{name}}">
{{else}}
<span class="flex h-11 w-11 items-center justify-center rounded-full bg-[var(--surface-muted)] text-sm font-semibold">A</span>
{{/if}}
<span class="min-w-0 flex-1">
<strong class="block text-[15px] font-semibold tracking-[-0.02em]">{{name}}</strong>
{{#if bio}}
<span class="mt-1 line-clamp-3 block text-[13px] leading-5 text-[var(--text-soft)]">{{bio}}</span>
{{else}}
<span class="mt-1 block text-[13px] leading-5 text-[var(--text-soft)]">Posts by {{name}}.</span>
{{/if}}
</span>
<img class="h-4 w-4 shrink-0 opacity-70 transition-opacity group-hover:opacity-100" src="{{asset "icons/arrow_outward.svg"}}" alt="">
</span>
<span class="mt-auto pt-3 text-[13px] font-medium text-[var(--text-soft)]">{{plural count.posts empty="0 posts" singular="% post" plural="% posts"}}</span>
</a>
{{/foreach}}
</div>
{{/get}}
</section>
</main>
{{/post}}

View File

@@ -24,14 +24,14 @@
</a>
</li>
<li class="menu-group menu-group--nav menu-group--link flex items-center flex-wrap w-full relative group" data-label="Authors" data-slug="authors" data-length="7">
{{!-- <li class="menu-group menu-group--nav menu-group--link flex items-center flex-wrap w-full relative group" data-label="Authors" data-slug="authors" data-length="7">
<a class="menu-group__link flex gap-2 items-center flex-1 py-1.5 rounded-theme transition-[padding]" href="/authors/">
<span class="menu-link__marker w-1 h-4 rounded-sm rounded-l-none transition-all"></span>
<span class="menu-link__label">Authors</span>
</a>
</li>
</a>
</li> --}}
<li class="menu-group menu-group--nav nav-toggle is-mainitem flex items-center flex-wrap w-full relative group" :class="{ 'is-open': membersOpen }" data-label="Members" data-slug="members" data-length="7" aria-haspopup="true">
{{!-- <li class="menu-group menu-group--nav nav-toggle is-mainitem flex items-center flex-wrap w-full relative group" :class="{ 'is-open': membersOpen }" data-label="Members" data-slug="members" data-length="7" aria-haspopup="true">
<a class="menu-group__link menu-group__link--toggle flex gap-2 items-center flex-1 py-1.5 rounded-theme transition-[padding]" href="#" role="button" @click.prevent="membersOpen = !membersOpen" :aria-expanded="membersOpen.toString()" aria-haspopup="true">
<span class="menu-link__marker w-1 h-4 rounded-sm rounded-l-none transition-all"></span>
<span class="menu-link__label">Members</span>
@@ -49,7 +49,7 @@
</ul>
</div>
</div>
</li>
</li> --}}
</ul>
</nav>

View File

@@ -1,8 +1,6 @@
routes:
/tags/:
template: tags-index
/authors/:
template: authors-index
collections:
/: