sellmate-design-system-react 4.1.0 → 4.2.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.
package/AGENTS.md CHANGED
@@ -150,7 +150,7 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
150
150
 
151
151
  ### 2-2. 간격 (spacing)
152
152
 
153
- - **간격 유틸리티는 `sd-` 접두를 붙인다** — `gap-sd-8`, `p-sd-20`, `mt-sd-12`. 숫자 = px 다.
153
+ - **간격 유틸리티는 `sd-` 접두를 붙인다** — `gap-sd-8`, `p-sd-16`, `mt-sd-12`. 숫자 = px 다.
154
154
  접두를 빼면 Tailwind 기본 스케일이 적용된다(`gap-8` = 32px). 접두는 속성 뒤, 숫자 앞에 온다.
155
155
  - 스케일: `2 4 6 8 10 12 16 19 20 22 24 28 32 36 40 44 48 56 60 62 80`
156
156
  - 형제 요소 간격은 margin 대신 부모의 `flex`/`grid` + `gap-sd-*`으로 잡는다.
@@ -158,7 +158,7 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
158
158
 
159
159
  | 상황 | 값 |
160
160
  | --- | --- |
161
- | **페이지 콘텐츠 패딩** | **`p-sd-20`** |
161
+ | **페이지 콘텐츠 패딩** | **16px — `SPage` 가 `--cmp-pageBody-padding` 으로 이미 넣는다.** 직접 주지 않는다 (덮어쓰면 토큰이 바뀌어도 안 따라간다). `SPage` 밖에서 같은 패딩이 필요하면 `p-sd-16` |
162
162
  | **섹션 ↔ 섹션** | **`gap-sd-12`** |
163
163
  | **페이지 내 블록 ↔ 블록** (헤더·필터·툴바·테이블 사이) | **`gap-sd-12`** |
164
164
  | 요소 ↔ 요소 | **기본 `gap-sd-8`** (`--sys-space-stack-gap-element-normal`) · 타이트 `gap-sd-4`(`-tight`) · 여유 `gap-sd-12`(`-relaxed`) / `gap-sd-16`(`-wide`) |
@@ -338,7 +338,7 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
338
338
  - 작은 창이 아니라 **화면 하나가 통째로** 들어간다 — 검색 필터·테이블·페이지네이션이 그대로 있는 목록(`엑셀 파일 관리`), 헤더 카드·탭이 있는 상세(`이동 오더 상세`).
339
339
  - 상세를 팝업으로 여는 이유는 **목록을 떠나지 않고 여러 건을 번갈아 보기** 위해서다. 단 상세가 **항상** 팝업인 것은 아니고, 데이터 양이 많을 때 팝업을 쓴다.
340
340
  - 구조는 헤더(제목 중앙) + 본문 + 푸터다. **확정할 작업이 있으면 푸터에 `저장`, 조회만이면 `useFooter={false}`** 로 푸터를 없앤다.
341
- - 본문에는 패딩이 없다 — 콘텐츠가 여백을 담당한다. 팝업 안도 일반 페이지와 같은 규칙(§4)을 따른다: 패딩 `p-sd-20`, 블록 간격 `gap-sd-12`, 표는 `SKeyValueTable` / `STable`.
341
+ - 본문에는 패딩이 없다 — 콘텐츠가 여백을 담당한다. 팝업 안도 일반 페이지와 같은 규칙(§4)을 따른다: 패딩 `p-sd-16`(`SPage` 가 아니라 직접 준다), 블록 간격 `gap-sd-12`, 표는 `SKeyValueTable` / `STable`.
342
342
 
343
343
  ```tsx
344
344
  // 1) 목록에서 별도 창을 연다 — 창 크기 = 콘텐츠 크기
@@ -354,7 +354,7 @@ function openDetailPopup(orderId: string) {
354
354
  export default function TransferOrderPopupPage() {
355
355
  return (
356
356
  <SPopup popupTitle="이동 오더 상세" useFooter={false}>
357
- <div className="flex flex-col gap-sd-12 p-sd-20">
357
+ <div className="flex flex-col gap-sd-12 p-sd-16">
358
358
  <SSectionHeaderCard>…</SSectionHeaderCard>
359
359
  <STabs value={tab} tabs={TABS} onValueChange={setTab} />
360
360
  <STable columns={columns} rows={rows} rowKey="id" />
@@ -610,12 +610,41 @@ export default function AppShell({ children }: { children: React.ReactNode }) {
610
610
  <SLayout type="box" header="fix">
611
611
  {/* type/header/folded 는 SLayout 에만 준다 — SGnb 는 context 에서 읽는다 */}
612
612
  <SGnb items={MENU} value={current} onValueChange={navigate} logo={<Logo />} />
613
- <SPage background="frame" className="p-sd-20">{children}</SPage>
613
+ {/* 콘텐츠 패딩(16px)은 SPage 토큰으로 넣는다 — p-sd-* 로 덮어쓰지 않는다 */}
614
+ <SPage background="frame">{children}</SPage>
614
615
  </SLayout>
615
616
  );
616
617
  }
617
618
  ```
618
619
 
620
+ **상단바 배치는 `header` 가 정한다.** 요소 순서가 달라지므로 슬롯을 채우기 전에 어느 쪽인지부터 정한다.
621
+
622
+ | `header` | 상단바 배치 | 로고 폭 | `topContent` |
623
+ | --- | --- | --- | --- |
624
+ | `"fix"` (기본) | `[런처 · 로고 … 폴드]` — 상단바가 GNB 컬럼 안에 있고 폴드가 컬럼 오른쪽 끝 | 내용 폭 | **렌더되지 않는다** (놓을 자리가 없다) |
625
+ | `"full"` | `[런처 · 폴드 · 로고 · topContent]` — 상단바가 화면 전폭 | **140px 고정** | 로고 오른쪽 남는 폭 전체 |
626
+
627
+ - `topContent` 는 상단바 로고 오른쪽 슬롯이다. 전역 검색·계정 메뉴·알림처럼 **모든 페이지에 공통인 것만** 넣는다. 페이지별 액션은 여기가 아니라 §4-2 의 `STableBar` 로 간다.
628
+ - 슬롯이 남는 폭을 통째로 받으므로 **정렬은 안에서 직접 잡는다** (좌측 정렬 + 우측은 `ml-auto`).
629
+ - `header="full"` 에서 로고 자리는 140px 로 고정된다 — 로고 내용이 바뀌어도 `topContent` 시작점이 흔들리지 않게 하기 위함이다. 로고가 그보다 넓으면 잘리므로 이 폭에 맞춰 준비한다.
630
+
631
+ ```tsx
632
+ <SLayout type="box" header="full">
633
+ <SGnb
634
+ items={MENU} value={current} onValueChange={navigate}
635
+ logo={<Logo />}
636
+ topContent={
637
+ /* 남는 폭 전체를 받는다 — 왼쪽은 그대로, 오른쪽 끝은 ml-auto */
638
+ <div className="flex w-full items-center gap-sd-8">
639
+ <SInput value={keyword} onValueChange={setKeyword} placeholder="통합 검색" />
640
+ <SButton size="sm" color="neutral" outline label="내 계정" className="ml-auto" onClick={openAccount} />
641
+ </div>
642
+ }
643
+ />
644
+ <SPage background="frame">{children}</SPage>
645
+ </SLayout>
646
+ ```
647
+
619
648
  ### 4-2. 목록 페이지 (필터 + 테이블)
620
649
 
621
650
  구조: **페이지 헤더(제목 + 가이드 링크) → 필터(`SKeyValueTable`) → `STableBar` → `STable`**
@@ -874,7 +903,7 @@ export default function ProductDetailPage() {
874
903
  - [ ] 간격이 전부 `sd-` 접두 스케일 값인가 (`gap-13`·`gap-sd-13` ❌ → `gap-sd-12` ✅)
875
904
  - [ ] 본문이 12px(`typo-body-sm-default`)인가 (14px 본문 ❌)
876
905
  - [ ] 텍스트 회색 위계를 순차 적용했는가 (기본 → `text-fg-secondary` → `text-fg-tertiary`, 단계 건너뛰기 ❌)
877
- - [ ] 페이지 패딩이 `p-sd-20`, 블록·섹션 간격이 `gap-sd-12` 인가 (`gap-sd-16`/`gap-sd-24` ❌)
906
+ - [ ] `SPage` 기본 패딩(16px)을 `p-sd-*` 로 덮어쓰지 않았는가, 블록·섹션 간격이 `gap-sd-12` 인가 (`gap-sd-16`/`gap-sd-24` ❌)
878
907
  - [ ] 같은 컴포넌트를 나열할 때 §2-2 그룹 간격을 썼는가 (체크박스 가로 `gap-sd-24` 등)
879
908
  - [ ] 페이지가 §4의 표준 골격에서 시작했는가
880
909
  - [ ] 필터·폼·상세 정보를 `SKeyValueTable` 로 만들었는가 (컨트롤을 `div` 로 나열하지 않았는가)
@@ -15,7 +15,8 @@
15
15
  | `useRail?` | `boolean` | — | 좌측 레일 사용 여부. 켜면 items 의 첫 depth 가 아이콘+라벨 버튼의 세로 레일로 서고, 선택된 레일 아이템의 children 이 오른쪽 메뉴 패널에 깔린다. 미지정 시 SLayout 의 useRail 을 따른다. children 없는 레일 아이템이 활성이면 메뉴 패널은 렌더되지 않고 레일만 남는다. |
16
16
  | `value?` | `string` | `''` | 현재 선택된 아이템 value |
17
17
  | `folded?` | `boolean` | — | 접힘(레일) 상태. 미지정 시 SLayout 의 folded 를 따른다. |
18
- | `logo?` | `ReactNode` | — | 상단바 로고 영역 (slot) |
18
+ | `logo?` | `ReactNode` | — | 상단바 로고 영역 (slot). header="full" 이면 폭이 140px 로 고정된다. |
19
+ | `topContent?` | `ReactNode` | — | 상단바 로고 오른쪽 슬롯 (검색·액션 등). 로고와 16px 띄고 남는 폭을 모두 차지하므로 안에서 자유롭게 정렬한다. 상단바가 전폭인 header="full" 에서만 렌더된다 (fix 는 상단바가 좁은 GNB 컬럼 안이라 놓을 자리가 없다). |
19
20
  | `railFooter?` | `ReactNode` | — | 레일 하단 고정 슬롯. 레일 아이템이 많아 넘치면 아이템 목록(ul)만 스크롤되고 이 슬롯은 레일 하단에 붙어 고정된다. useRail 일 때만 렌더된다. |
20
21
  | `menuFooter?` | `ReactNode` | — | 메뉴 하단 고정 슬롯. 메뉴 아이템이 많아 넘치면 메뉴 목록(ul)만 스크롤되고 이 슬롯은 메뉴 하단에 붙어 고정된다. 메뉴가 렌더될 때만(showMenu) 나타난다. |
21
22
  | `foldedFooter?` | `ReactNode` | — | 접힘(fix 레일) 하단 고정 슬롯. 접으면 본문이 빠져나가며 rail/menu footer 도 사라지므로, 48px 폴드 레일 바닥에 붙는 별도 슬롯이다. header="fix" 로 접혔을 때만 나타난다. |
@@ -30,8 +30,14 @@ export interface SGnbProps extends Omit<HTMLAttributes<HTMLDivElement>, 'color'>
30
30
  onFoldChange?: (folded: boolean) => void;
31
31
  /** 앱런처(그리드) 버튼 클릭. 미지정 시 런처 버튼을 렌더하지 않는다. 접힘 레일(fix)에는 폴드 버튼만 남으므로 표시되지 않는다. */
32
32
  onLauncherClick?: () => void;
33
- /** 상단바 로고 영역 (slot) */
33
+ /** 상단바 로고 영역 (slot). header="full" 이면 폭이 140px 로 고정된다. */
34
34
  logo?: ReactNode;
35
+ /**
36
+ * 상단바 로고 오른쪽 슬롯 (검색·액션 등). 로고와 16px 띄고 남는 폭을 모두 차지하므로
37
+ * 안에서 자유롭게 정렬한다. 상단바가 전폭인 header="full" 에서만 렌더된다
38
+ * (fix 는 상단바가 좁은 GNB 컬럼 안이라 놓을 자리가 없다).
39
+ */
40
+ topContent?: ReactNode;
35
41
  /**
36
42
  * 레일 하단 고정 슬롯. 레일 아이템이 많아 넘치면 아이템 목록(ul)만 스크롤되고
37
43
  * 이 슬롯은 레일 하단에 붙어 고정된다. useRail 일 때만 렌더된다.
@@ -115,6 +115,18 @@ export declare const GNB_EXPAND_MS = 200;
115
115
  * header="full" 에서 SLayout 이 "메뉴 오른쪽 = 페이지" 영역을 잡을 때도 이 값을 쓴다.
116
116
  */
117
117
  export declare const GNB_MENU_WIDTH = 240;
118
+ /**
119
+ * header="full" 상단바의 로고 슬롯 고정 폭(토큰 없음 → 상수).
120
+ * 전폭 상단바에서는 로고 오른쪽에 topContent 슬롯이 이어지므로, 로고 내용이 바뀌어도
121
+ * 그 시작점이 흔들리지 않도록 자리를 못 박는다. fix 는 상단바가 GNB 컬럼 안이라 내용 폭을 따른다.
122
+ */
123
+ export declare const GNB_FULL_LOGO_WIDTH = 140;
124
+ /**
125
+ * 상단바에서 아이콘 버튼끼리 붙는 간격(px, 디자인 스펙 — 전용 토큰 없음).
126
+ * header="full" 의 런처↔폴드가 여기 해당한다. 슬롯(로고·topContent)과의 간격은
127
+ * 이보다 넓은 --cmp-gnb-top-gap 을 쓴다.
128
+ */
129
+ export declare const GNB_TOP_ICON_GAP = 8;
118
130
  /**
119
131
  * useRail 에서 value 를 품은 첫 depth(레일) 아이템의 value.
120
132
  * value 자체가 레일 아이템이면 그 값을, 어디에도 없으면 undefined 를 반환한다.
@@ -1,2 +1,2 @@
1
1
  export { SGnb, type SGnbProps } from './SGnb';
2
- export { GNB_HEADER, GNB_MENU, GNB_COLORS, GNB_COMMON, GNB_FOLD_MS, GNB_MENU_WIDTH, GNB_RAIL, GNB_RAIL_WIDTH, findGnbAncestors, findGnbRailValue, type SGnbType, type SGnbHeader, type SGnbColor, type SGnbMenuItem, } from './gnb.config';
2
+ export { GNB_HEADER, GNB_MENU, GNB_COLORS, GNB_COMMON, GNB_FOLD_MS, GNB_FULL_LOGO_WIDTH, GNB_MENU_WIDTH, GNB_RAIL, GNB_RAIL_WIDTH, findGnbAncestors, findGnbRailValue, type SGnbType, type SGnbHeader, type SGnbColor, type SGnbMenuItem, } from './gnb.config';
package/dist/index.cjs CHANGED
@@ -6961,6 +6961,8 @@ var GNB_RAIL_WIDTH = 68;
6961
6961
  var GNB_FOLD_MS = 200;
6962
6962
  var GNB_EXPAND_MS = 200;
6963
6963
  var GNB_MENU_WIDTH = 240;
6964
+ var GNB_FULL_LOGO_WIDTH = 140;
6965
+ var GNB_TOP_ICON_GAP = 8;
6964
6966
  function findGnbRailValue(items, value) {
6965
6967
  if (items.some((item) => item.value === value)) return value;
6966
6968
  return findGnbAncestors(items, value)[0];
@@ -7065,6 +7067,7 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
7065
7067
  onFoldChange,
7066
7068
  onLauncherClick,
7067
7069
  logo,
7070
+ topContent,
7068
7071
  railFooter,
7069
7072
  menuFooter,
7070
7073
  foldedFooter,
@@ -7296,13 +7299,67 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
7296
7299
  ...style
7297
7300
  };
7298
7301
  const hideAfterSlide = (hidden) => `visibility 0s linear ${hidden ? `${GNB_FOLD_MS}ms` : "0s"}`;
7299
- const foldInline = !!logo;
7300
7302
  const sideFoldStyle = {
7301
7303
  opacity: railFolded ? 0 : 1,
7302
7304
  position: railFolded ? "absolute" : "static",
7303
7305
  visibility: railFolded ? "hidden" : "visible",
7304
7306
  transition: `opacity ${GNB_FOLD_MS}ms ease-out, ${hideAfterSlide(railFolded)}`
7305
7307
  };
7308
+ const launcherButton = onLauncherClick ? /* @__PURE__ */ jsxRuntime.jsx(
7309
+ SGhostButton,
7310
+ {
7311
+ icon: "launcher",
7312
+ size: "xs",
7313
+ intent: color === "dark" ? "inverse" : "default",
7314
+ ariaLabel: "app launcher",
7315
+ onClick: onLauncherClick,
7316
+ className: "shrink-0",
7317
+ style: { ...sideFoldStyle, marginRight: header === "fix" ? H.topGap : GNB_TOP_ICON_GAP }
7318
+ },
7319
+ "launcher"
7320
+ ) : null;
7321
+ const foldButton = /* @__PURE__ */ jsxRuntime.jsx(
7322
+ SGhostButton,
7323
+ {
7324
+ icon: "sidebar",
7325
+ size: "xs",
7326
+ intent: color === "dark" ? "inverse" : "default",
7327
+ ariaLabel: "toggle navigation",
7328
+ ariaPressed: folded,
7329
+ onClick: handleFoldToggle,
7330
+ className: cn("shrink-0", header === "fix" && "ml-auto")
7331
+ },
7332
+ "fold"
7333
+ );
7334
+ const logoBox = logo ? /* @__PURE__ */ jsxRuntime.jsx(
7335
+ "div",
7336
+ {
7337
+ className: "flex shrink-0 items-center",
7338
+ style: {
7339
+ height: H.logoHeight,
7340
+ ...header === "full" ? (
7341
+ // full 은 전폭이라 로고 자리가 고정이다 — 폭 140px(디자인 스펙, 전용 토큰 없음)로 못 박아
7342
+ // 로고 내용이 바뀌어도 오른쪽 topContent 시작점이 흔들리지 않게 한다.
7343
+ { width: GNB_FULL_LOGO_WIDTH, marginLeft: H.topGap }
7344
+ ) : (
7345
+ // fix 는 폴드가 ml-auto 로 밀려나므로(margin-left 를 못 쓴다) 로고 오른쪽에 최소 간격을 둔다
7346
+ { marginRight: H.topGap }
7347
+ ),
7348
+ ...sideFoldStyle
7349
+ },
7350
+ children: logo
7351
+ },
7352
+ "logo"
7353
+ ) : null;
7354
+ const topContentBox = header === "full" && topContent ? /* @__PURE__ */ jsxRuntime.jsx(
7355
+ "div",
7356
+ {
7357
+ className: "flex min-w-0 flex-1 items-center",
7358
+ style: { marginLeft: H.topGap },
7359
+ children: topContent
7360
+ },
7361
+ "topContent"
7362
+ ) : null;
7306
7363
  return /* @__PURE__ */ jsxRuntime.jsxs(
7307
7364
  "div",
7308
7365
  {
@@ -7320,8 +7377,9 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
7320
7377
  className: "relative box-border flex shrink-0 items-center overflow-hidden",
7321
7378
  style: {
7322
7379
  height: H.topHeight,
7323
- // 인라인 간격은 컨테이너 gap 대신 각 요소 margin 으로 준다 — 런처↔폴드(8px)와
7324
- // 폴드↔로고(top-gap)를 다르게 두기 위함. 접히면 런처·로고가 흐름에서 빠져 margin 도 무의미해진다.
7380
+ // 간격은 컨테이너 gap 대신 각 요소 margin 으로 준다 — 순서가 header 마다 달라
7381
+ // 이웃 쌍마다 값이 다르기 때문(위 launcherButton/logoBox 주석).
7382
+ // 접히면 런처·로고가 흐름에서 빠져 margin 도 무의미해진다.
7325
7383
  padding: `0 ${railFolded ? GNB_RAIL.padding : H.topPaddingX}`,
7326
7384
  borderBottom: `1px solid ${C.topBorder}`,
7327
7385
  backgroundColor: C.panelBg,
@@ -7330,90 +7388,16 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
7330
7388
  // 아이콘 버튼은 자체 ghostButton 토큰을 쓰므로, 이 색은 logo 슬롯 상속용
7331
7389
  color: C.itemColorDefault
7332
7390
  },
7333
- children: foldInline ? (
7334
- // 런처(있을 때)·폴드·로고를 흐름에 나란히 둔다 → 폴드 버튼이 (런처와) 로고 사이에 선다.
7335
- // 접히면 런처·로고가 페이드하며 흐름에서 빠지고(sideFoldStyle), 폴드 버튼만 남아 레일 가운데에 선다.
7336
- /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
7337
- onLauncherClick && /* @__PURE__ */ jsxRuntime.jsx(
7338
- SGhostButton,
7339
- {
7340
- icon: "launcher",
7341
- size: "xs",
7342
- intent: color === "dark" ? "inverse" : "default",
7343
- ariaLabel: "app launcher",
7344
- onClick: onLauncherClick,
7345
- className: "shrink-0",
7346
- style: { ...sideFoldStyle, marginRight: "8px" }
7347
- }
7348
- ),
7349
- /* @__PURE__ */ jsxRuntime.jsx(
7350
- SGhostButton,
7351
- {
7352
- icon: "sidebar",
7353
- size: "xs",
7354
- intent: color === "dark" ? "inverse" : "default",
7355
- ariaLabel: "toggle navigation",
7356
- ariaPressed: folded,
7357
- onClick: handleFoldToggle,
7358
- className: "shrink-0"
7359
- }
7360
- ),
7361
- /* @__PURE__ */ jsxRuntime.jsx(
7362
- "div",
7363
- {
7364
- className: "flex shrink-0 items-center",
7365
- style: { height: H.logoHeight, marginLeft: H.topGap, ...sideFoldStyle },
7366
- children: logo
7367
- }
7368
- )
7369
- ] })
7370
- ) : (
7371
- // 런처·로고는 좌측 그룹(흐름에서 빼 폭 축소 중 폴드 버튼을 밀어내지 않는다),
7372
- // 폴드 버튼은 우측 끝(ml-auto)이라 폭·패딩이 줄면 저절로 레일 가운데에 선다.
7373
- /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
7374
- (onLauncherClick || logo) && /* @__PURE__ */ jsxRuntime.jsxs(
7375
- "div",
7376
- {
7377
- className: "absolute inset-y-0 flex items-center",
7378
- style: {
7379
- left: H.topPaddingX,
7380
- gap: H.topGap,
7381
- opacity: railFolded ? 0 : 1,
7382
- transition: `opacity ${GNB_FOLD_MS}ms ease-out, ${hideAfterSlide(railFolded)}, transform ${GNB_FOLD_MS}ms ease-out`,
7383
- // 메뉴와 같은 방향으로 빠지되, 좁은 레일 안에서 꼬리가 비치지 않게 페이드가 거리를 대신한다
7384
- transform: railFolded ? `translateX(-${H.topPaddingX})` : "none",
7385
- visibility: railFolded ? "hidden" : "visible"
7386
- },
7387
- children: [
7388
- onLauncherClick && /* @__PURE__ */ jsxRuntime.jsx(
7389
- SGhostButton,
7390
- {
7391
- icon: "launcher",
7392
- size: "xs",
7393
- intent: color === "dark" ? "inverse" : "default",
7394
- ariaLabel: "app launcher",
7395
- onClick: onLauncherClick,
7396
- className: "shrink-0"
7397
- }
7398
- ),
7399
- logo && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center", style: { height: H.logoHeight }, children: logo })
7400
- ]
7401
- }
7402
- ),
7403
- /* @__PURE__ */ jsxRuntime.jsx(
7404
- SGhostButton,
7405
- {
7406
- icon: "sidebar",
7407
- size: "xs",
7408
- intent: color === "dark" ? "inverse" : "default",
7409
- ariaLabel: "toggle navigation",
7410
- ariaPressed: folded,
7411
- onClick: handleFoldToggle,
7412
- className: "ml-auto shrink-0"
7413
- }
7414
- )
7415
- ] })
7416
- )
7391
+ children: header === "fix" ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
7392
+ launcherButton,
7393
+ logoBox,
7394
+ foldButton
7395
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
7396
+ launcherButton,
7397
+ foldButton,
7398
+ logoBox,
7399
+ topContentBox
7400
+ ] })
7417
7401
  }
7418
7402
  ),
7419
7403
  /* @__PURE__ */ jsxRuntime.jsxs(
@@ -13470,6 +13454,7 @@ exports.COLOR_KEYS = COLOR_KEYS;
13470
13454
  exports.GNB_COLORS = GNB_COLORS;
13471
13455
  exports.GNB_COMMON = GNB_COMMON;
13472
13456
  exports.GNB_FOLD_MS = GNB_FOLD_MS;
13457
+ exports.GNB_FULL_LOGO_WIDTH = GNB_FULL_LOGO_WIDTH;
13473
13458
  exports.GNB_HEADER = GNB_HEADER;
13474
13459
  exports.GNB_MENU = GNB_MENU;
13475
13460
  exports.GNB_MENU_WIDTH = GNB_MENU_WIDTH;