v1.0.0: 사이드바 네비게이션 라벨 설정과 최신 수정 반영
Made-with: Cursor
This commit is contained in:
@@ -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%`로 축소
|
- 데스크톱 `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열 정의만 남는 문제 방지)
|
- `1023px` 이하에서는 `topbar__inner`를 `minmax(0, 1fr) auto` 2열로 바꾸고 검색 열을 숨긴 뒤, 브랜드·액션을 각각 1·2열에 배치함(헤더가 3열 정의만 남는 문제 방지)
|
||||||
- `home` Hero는 `@site.cover_image`가 있을 때 배경 이미지로 적용하며 오버레이와 텍스트 대비를 함께 조정함
|
- `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 문자(이름/이메일 첫 글자)를 사용함. 비로그인 시 해당 행은 렌더하지 않음
|
- 상단 사용자 메뉴는 멤버 로그인 시에만 드롭다운 상단에 이름/아바타 행을 노출하며, 서버 렌더링 값으로 초기 표시한 뒤 `/members/api/member/` 재조회로 실시간 동기화하고 아바타 미등록 시 fallback 문자(이름/이메일 첫 글자)를 사용함. 비로그인 시 해당 행은 렌더하지 않음
|
||||||
- Tailwind CSS 빌드 결과물(`assets/built/tailwind.css`)을 기존 `screen.css`와 함께 로드
|
- Tailwind CSS 빌드 결과물(`assets/built/tailwind.css`)을 기존 `screen.css`와 함께 로드
|
||||||
- Tailwind 기본 초기화(`preflight`)를 활성화해 브라우저 기본 마진과 폼 스타일을 리셋
|
- Tailwind 기본 초기화(`preflight`)를 활성화해 브라우저 기본 마진과 폼 스타일을 리셋
|
||||||
|
|||||||
@@ -6,6 +6,8 @@
|
|||||||
- `scripts/sync-theme.sh`, `docker-compose.yml`: 로컬 Ghost 테마 동기화 경로를 `zenless-column-flow`로 변경.
|
- `scripts/sync-theme.sh`, `docker-compose.yml`: 로컬 Ghost 테마 동기화 경로를 `zenless-column-flow`로 변경.
|
||||||
- `scripts/build-sample-content.js`, `seed/README.md`, `README.md`: 샘플 콘텐츠 파일명/문서 표기를 `zcf-sample-content` 및 새 테마명으로 갱신.
|
- `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` 기준으로 동기화.
|
- `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
|
## v0.2.11 - 2026-04-17
|
||||||
- `package.json` 버전을 `0.2.11`로 증가.
|
- `package.json` 버전을 `0.2.11`로 증가.
|
||||||
|
|||||||
@@ -71,6 +71,14 @@
|
|||||||
"show_admin_link": {
|
"show_admin_link": {
|
||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"default": false
|
"default": false
|
||||||
|
},
|
||||||
|
"primary_nav_label": {
|
||||||
|
"type": "text",
|
||||||
|
"default": "Primary"
|
||||||
|
},
|
||||||
|
"secondary_nav_label": {
|
||||||
|
"type": "text",
|
||||||
|
"default": "Secondary"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
2
page.hbs
2
page.hbs
@@ -1,7 +1,7 @@
|
|||||||
{{!< default}}
|
{{!< default}}
|
||||||
|
|
||||||
{{#post}}
|
{{#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}}">
|
<article class="post-template page-template {{post_class}}">
|
||||||
{{#match @page.show_title_and_feature_image}}
|
{{#match @page.show_title_and_feature_image}}
|
||||||
<header class="post-header">
|
<header class="post-header">
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
<aside class="sidebar sidebar--left h-full flex flex-col">
|
<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 }">
|
<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">
|
<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">
|
<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">
|
<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__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>
|
</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">
|
<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="">
|
<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>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
{{#if @site.secondary_navigation}}
|
{{#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">
|
<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">
|
<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__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>
|
</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">
|
<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="">
|
<img x-show="!secondaryNavOpen" x-cloak class="menu-group__chevron-icon menu-group__chevron-icon--down" src="{{asset "icons/keyboard_arrow_down.svg"}}" alt="">
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="topbar-search topbar__search flex h-full min-w-0 items-center justify-center flex-1">
|
<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">
|
<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 [&>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 [&>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">
|
<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>
|
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||||
<circle cx="10" cy="10" r="7"></circle>
|
<circle cx="10" cy="10" r="7"></circle>
|
||||||
@@ -95,7 +95,7 @@
|
|||||||
{{else}}
|
{{else}}
|
||||||
<a href="#/portal/signup" class="flex items-center gap-1.5 px-2.5 py-1.5 rounded-theme hover:bg-bgr-tone">
|
<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">
|
<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 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="M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0"></path>
|
||||||
<path d="M15 9l-6 6"></path>
|
<path d="M15 9l-6 6"></path>
|
||||||
@@ -106,7 +106,7 @@
|
|||||||
</a>
|
</a>
|
||||||
<a href="#/portal/signin" class="flex items-center gap-1.5 px-2.5 py-1.5 rounded-theme hover:bg-bgr-tone">
|
<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">
|
<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 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="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>
|
<path d="M21 12h-13l3 -3"></path>
|
||||||
|
|||||||
Reference in New Issue
Block a user