v1.0.0: 사이드바 네비게이션 라벨 설정과 최신 수정 반영

Made-with: Cursor
This commit is contained in:
2026-04-17 19:01:13 +09:00
parent b148269f53
commit bedd6cc603
6 changed files with 19 additions and 7 deletions

View File

@@ -19,7 +19,7 @@
- 데스크톱 `topbar__inner``var(--sidebar-left) minmax(0, var(--content-column)) var(--sidebar-right)` 3열 그리드이며, `1024px` 이상에서만 검색 셀(`.topbar__search`)에 `min-width: min(--topbar-search-min, 100%)`를 적용해 중앙 검색 최소 폭을 완만히 보장함. 검색 트리거는 라벨(`.search-trigger__label`) 말줄임·단축키 `flex-shrink: 0` 유지. 브랜드 텍스트는 말줄임, 로고 이미지는 `max-width: 100%`로 축소
- `1023px` 이하에서는 `topbar__inner``minmax(0, 1fr) auto` 2열로 바꾸고 검색 열을 숨긴 뒤, 브랜드·액션을 각각 1·2열에 배치함(헤더가 3열 정의만 남는 문제 방지)
- `home` Hero는 `@site.cover_image`가 있을 때 배경 이미지로 적용하며 오버레이와 텍스트 대비를 함께 조정함
- 좌측 사이드바 `menu-groups`: Primary는 `Home pages` 아코디언 안에 `{{navigation}}`, Secondary(관리자에 항목이 있을 때만)는 그 아래 `More links` 아코디언 안에 `{{navigation type="secondary"}}` 동일 마크업(`ul.nav`) 노출함
- 좌측 사이드바 `menu-groups`: Primary는 `@site.navigation` 항목이 있을 때만 아코디언 `{{navigation}}`를 렌더하고, Secondary`@site.secondary_navigation`이 있을 때만 아코디언 `{{navigation type="secondary"}}` 동일 마크업(`ul.nav`)으로 노출함. 각 라벨은 `@custom.primary_nav_label`, `@custom.secondary_nav_label`(미입력 시 `Primary`/`Secondary` fallback)로 어드민에서 변경 가능함
- 상단 사용자 메뉴는 멤버 로그인 시에만 드롭다운 상단에 이름/아바타 행을 노출하며, 서버 렌더링 값으로 초기 표시한 뒤 `/members/api/member/` 재조회로 실시간 동기화하고 아바타 미등록 시 fallback 문자(이름/이메일 첫 글자)를 사용함. 비로그인 시 해당 행은 렌더하지 않음
- Tailwind CSS 빌드 결과물(`assets/built/tailwind.css`)을 기존 `screen.css`와 함께 로드
- Tailwind 기본 초기화(`preflight`)를 활성화해 브라우저 기본 마진과 폼 스타일을 리셋

View File

@@ -6,6 +6,8 @@
- `scripts/sync-theme.sh`, `docker-compose.yml`: 로컬 Ghost 테마 동기화 경로를 `zenless-column-flow`로 변경.
- `scripts/build-sample-content.js`, `seed/README.md`, `README.md`: 샘플 콘텐츠 파일명/문서 표기를 `zcf-sample-content` 및 새 테마명으로 갱신.
- `docs/spec.md`, `docs/map.md`, `docs/deploy.md`, `docs/history.md`: 현재 버전과 테마명/버전 규칙을 `v1.0.0`, `ZCF-v1.x.x` 기준으로 동기화.
- `partials/site/sidebar-left.hbs`: Primary navigation 항목이 없으면 `Home pages` 그룹 자체가 렌더되지 않도록 `{{#if @site.navigation}}` 분기 추가.
- `package.json`, `partials/site/sidebar-left.hbs`: 사이드바 네비게이션 라벨을 `@custom.primary_nav_label`, `@custom.secondary_nav_label`로 어드민에서 입력 가능하도록 확장하고, 미입력 시 `Primary`/`Secondary` fallback을 사용.
## v0.2.11 - 2026-04-17
- `package.json` 버전을 `0.2.11`로 증가.

View File

@@ -71,6 +71,14 @@
"show_admin_link": {
"type": "boolean",
"default": false
},
"primary_nav_label": {
"type": "text",
"default": "Primary"
},
"secondary_nav_label": {
"type": "text",
"default": "Secondary"
}
}
},

View File

@@ -1,7 +1,7 @@
{{!< default}}
{{#post}}
<main class="px-4 sm:px-[max(2vmin,20px)]">
<main class="px-4 sm:px-[max(2vmin,20px)] mt-6 mb-8">
<article class="post-template page-template {{post_class}}">
{{#match @page.show_title_and_feature_image}}
<header class="post-header">

View File

@@ -1,10 +1,11 @@
<aside class="sidebar sidebar--left h-full flex flex-col">
<nav class="menu-groups border-b border-brd pl-4 pr-3 sm:pl-5 xl:pl-0 py-3" data-nav="menu" data-primary-nav x-data="{ homePagesOpen: true, secondaryNavOpen: false, membersOpen: false }">
<ul class="menu-groups__list flex flex-col gap-0.75 text-typ text-sm">
{{#if @site.navigation}}
<li class="menu-group menu-group--nav nav-toggle is-mainitem flex items-center flex-wrap w-full relative group" :class="{ 'is-open': homePagesOpen }" data-label="Home pages" data-slug="home-pages" data-length="10" 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="homePagesOpen = !homePagesOpen" :aria-expanded="homePagesOpen.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">Home pages</span>
<span class="menu-link__label">{{#if @custom.primary_nav_label}}{{@custom.primary_nav_label}}{{else}}Primary{{/if}}</span>
</a>
<button class="menu-group__toggle relative cursor-pointer p-2 rounded-r-theme" type="button" title="Menu toggle" aria-label="Toggle submenu" aria-controls="home-pages" :aria-expanded="homePagesOpen.toString()" @click="homePagesOpen = !homePagesOpen" aria-haspopup="true">
<img x-show="!homePagesOpen" x-cloak class="menu-group__chevron-icon menu-group__chevron-icon--down" src="{{asset "icons/keyboard_arrow_down.svg"}}" alt="">
@@ -16,12 +17,13 @@
</div>
</div>
</li>
{{/if}}
{{#if @site.secondary_navigation}}
<li class="menu-group menu-group--nav nav-toggle is-mainitem flex items-center flex-wrap w-full relative group menu-group--secondary-nav" :class="{ 'is-open': secondaryNavOpen }" data-label="More links" data-slug="secondary-nav" 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="secondaryNavOpen = !secondaryNavOpen" :aria-expanded="secondaryNavOpen.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">More links</span>
<span class="menu-link__label">{{#if @custom.secondary_nav_label}}{{@custom.secondary_nav_label}}{{else}}Secondary{{/if}}</span>
</a>
<button class="menu-group__toggle relative cursor-pointer p-2 rounded-r-theme" type="button" title="Menu toggle" aria-label="Toggle submenu" aria-controls="secondary-nav" :aria-expanded="secondaryNavOpen.toString()" @click="secondaryNavOpen = !secondaryNavOpen" aria-haspopup="true">
<img x-show="!secondaryNavOpen" x-cloak class="menu-group__chevron-icon menu-group__chevron-icon--down" src="{{asset "icons/keyboard_arrow_down.svg"}}" alt="">

View File

@@ -33,7 +33,7 @@
</div>
<div class="topbar-search topbar__search flex h-full min-w-0 items-center justify-center flex-1">
<button class="search-trigger flex w-full min-w-0 max-w-xs items-center gap-2.5 rounded-xl border border-brd bg-bgr px-3.5 py-2 text-sm text-typ-tone transition-colors hover:bg-bgr-tone hover:text-typ" type="button" data-search-open aria-label="Open search">
<i class="icon icon-search shrink-0 size-5 md:size-4 stroke-2 md:stroke-[2.25] fill-bgr-tone [&amp;&gt;svg]:fill-inherit" role="presentation">
<i class="icon-search flex justify-center items-center shrink-0 size-5 md:size-4 stroke-2 md:stroke-[2.25] fill-bgr-tone [&amp;&gt;svg]:fill-inherit" role="presentation">
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-search" width="16" height="16" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<circle cx="10" cy="10" r="7"></circle>
@@ -95,7 +95,7 @@
{{else}}
<a href="#/portal/signup" class="flex items-center gap-1.5 px-2.5 py-1.5 rounded-theme hover:bg-bgr-tone">
<i class="icon icon-signup size-5 stroke-2" role="presentation">
<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">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0"></path>
<path d="M15 9l-6 6"></path>
@@ -106,7 +106,7 @@
</a>
<a href="#/portal/signin" class="flex items-center gap-1.5 px-2.5 py-1.5 rounded-theme hover:bg-bgr-tone">
<i class="icon icon-login size-5 stroke-2" role="presentation">
<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">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M15 8v-2a2 2 0 0 0 -2 -2h-7a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h7a2 2 0 0 0 2 -2v-2"></path>
<path d="M21 12h-13l3 -3"></path>