for-humanity 0.4.4 → 0.5.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/CHANGELOG.md +16 -0
- package/README.md +5 -5
- package/dist/browser.js +39 -0
- package/dist/cli.css +350 -262
- package/dist/cli.js +1123 -363
- package/package.json +8 -11
- package/src/component/widget/{shell → cursor-face}/_constant/cursor-face.ts +5 -0
- package/src/component/widget/cursor-face/wg-cursor-face.css +15 -0
- package/src/component/widget/cursor-face/wg-cursor-face.tsx +153 -0
- package/src/component/widget/navigation/_constant/navigation-data-schema.ts +35 -0
- package/src/component/widget/navigation/_constant/navigation.ts +9 -0
- package/src/component/widget/navigation/_function/restore-navigation-scroll.ts +59 -0
- package/src/{content → component/widget/navigation/_function}/to-doc-groups/_to-doc-branches.ts +2 -2
- package/src/{content → component/widget/navigation/_function}/to-doc-groups/_to-doc-group-branches.ts +3 -3
- package/src/{content → component/widget/navigation/_function}/to-doc-groups/to-doc-groups.ts +1 -1
- package/src/component/widget/navigation/_function/to-navigation-branch-id.ts +6 -0
- package/src/component/widget/navigation/_function/to-navigation-data/_to-navigation-document.ts +14 -0
- package/src/component/widget/navigation/_function/to-navigation-data/_to-navigation-group.ts +14 -0
- package/src/component/widget/navigation/_function/to-navigation-data/to-navigation-data.ts +25 -0
- package/src/component/widget/navigation/_function/to-navigation-json.ts +8 -0
- package/src/component/widget/{shell → navigation}/_function/to-toc-groups.ts +2 -2
- package/src/{type → component/widget/navigation/_type}/doc-group.ts +1 -1
- package/src/component/widget/navigation/_type/navigation-data.ts +83 -0
- package/src/component/widget/navigation/_type/navigation-focus-snapshot.ts +21 -0
- package/src/component/widget/navigation/_wg-navigation-branch-toggle.css +28 -0
- package/src/component/widget/navigation/_wg-navigation-branch-toggle.tsx +48 -0
- package/src/component/widget/{shell/_wg-shell-nav-list.css → navigation/_wg-navigation-nav-list.css} +24 -16
- package/src/component/widget/navigation/_wg-navigation-nav-list.tsx +106 -0
- package/src/component/widget/{shell/_wg-shell-nav.css → navigation/_wg-navigation-nav.css} +9 -3
- package/src/component/widget/navigation/_wg-navigation-nav.tsx +43 -0
- package/src/component/widget/navigation/_wg-navigation-scroll.tsx +117 -0
- package/src/component/widget/{shell/_wg-shell-toc.css → navigation/_wg-navigation-toc.css} +39 -24
- package/src/component/widget/navigation/_wg-navigation-toc.tsx +155 -0
- package/src/component/widget/navigation/wg-navigation.css +282 -0
- package/src/component/widget/navigation/wg-navigation.tsx +479 -0
- package/src/component/widget/prose/_function/rehype-sections/rehype-sections.ts +1 -1
- package/src/component/widget/shell/wg-shell.css +13 -269
- package/src/component/widget/shell/wg-shell.tsx +16 -97
- package/src/component/widget/shell-controls/wg-shell-controls.css +4 -0
- package/src/component/widget/shell-controls/wg-shell-controls.tsx +170 -0
- package/src/constant/asset.ts +0 -5
- package/src/entry/browser/browser.tsx +22 -0
- package/src/{app.tsx → entry/cli/_function/create-app.tsx} +6 -6
- package/src/{content → entry/cli/_function/create-processor}/create-processor.ts +3 -3
- package/src/{content → entry/cli/_function}/read-docs.ts +1 -1
- package/src/{content → entry/cli/_function}/read-home.ts +1 -1
- package/src/{content/read-docs.test.ts → entry/cli/cli.test.ts} +105 -30
- package/src/{cli.ts → entry/cli/cli.ts} +10 -11
- package/src/store/navigation/_constant/tree.ts +6 -0
- package/src/store/navigation/create-navigation-stores.test.ts +92 -0
- package/src/store/navigation/create-navigation-stores.ts +73 -0
- package/src/store/navigation/navigation-state.ts +46 -0
- package/src/store/navigation/navigation-storage.ts +14 -0
- package/src/store/navigation/to-navigation-scroll-state.ts +42 -0
- package/src/store/navigation/to-navigation-tree-state.ts +19 -0
- package/src/store/navigation/use-navigation-tree-store.ts +12 -0
- package/src/style/token.css +3 -2
- package/src/type/doc-content.ts +1 -1
- package/src/type/doc-file-data.ts +1 -1
- package/src/{component/widget/shell/_type → type}/doc-outline.ts +1 -1
- package/src/type/site-assets.ts +2 -2
- package/dist/client.js +0 -7
- package/src/client.ts +0 -335
- package/src/component/widget/shell/_constant/navigation.ts +0 -9
- package/src/component/widget/shell/_function/bind-mobile-navigation.ts +0 -147
- package/src/component/widget/shell/_function/bind-navigation-overflow.ts +0 -47
- package/src/component/widget/shell/_function/bind-navigation-scroll.ts +0 -84
- package/src/component/widget/shell/_function/restore-navigation-scroll.ts +0 -47
- package/src/component/widget/shell/_wg-shell-nav-list.tsx +0 -87
- package/src/component/widget/shell/_wg-shell-nav.tsx +0 -49
- package/src/component/widget/shell/_wg-shell-toc.tsx +0 -57
- /package/src/{constant → component/widget/navigation/_constant}/locale.ts +0 -0
- /package/src/component/widget/{shell → navigation}/_constant/reading-line.ts +0 -0
- /package/src/{type → component/widget/navigation/_type}/doc-branch.ts +0 -0
- /package/src/component/widget/{shell → navigation}/_type/toc-group.ts +0 -0
- /package/src/{constant → entry/cli/_constant}/cli.ts +0 -0
- /package/src/{dev.ts → entry/cli/_function/create-dev-app.ts} +0 -0
- /package/src/{content/rehype-assets.ts → entry/cli/_function/create-processor/_rehype-assets.ts} +0 -0
- /package/src/{content/rehype-heading-ids.ts → entry/cli/_function/create-processor/_rehype-heading-ids.ts} +0 -0
- /package/src/{content/remark-report.ts → entry/cli/_function/create-processor/_remark-report.ts} +0 -0
- /package/src/{component/widget/prose/_type → type}/doc-section.ts +0 -0
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import {navigation_mobile_query, navigation_scroll_storage_key} from "@/component/widget/shell/_constant/navigation";
|
|
2
|
-
import {restoreNavigationScroll} from "@/component/widget/shell/_function/restore-navigation-scroll";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* 문서 목록과 페이지 목차의 위치를 따로 저장 · TOC 길이가 목록 위치를 바꾸지 않음
|
|
6
|
-
* 첫 데스크톱 복원은 HTML에서 완료 · 늦은 module 실행에서 다시 이동하지 않음
|
|
7
|
-
*/
|
|
8
|
-
export const bindNavigationScroll = () => {
|
|
9
|
-
const navigation = document.querySelector<HTMLElement>("[data-navigation]");
|
|
10
|
-
const documents = document.querySelector<HTMLElement>('[data-navigation-scroll="documents"]');
|
|
11
|
-
const outline = document.querySelector<HTMLElement>('[data-navigation-scroll="outline"]');
|
|
12
|
-
const dialog = document.querySelector<HTMLDialogElement>("[data-navigation-drawer]");
|
|
13
|
-
const openButton = document.querySelector<HTMLButtonElement>("[data-navigation-open]");
|
|
14
|
-
|
|
15
|
-
if (!navigation || !documents || !outline || !dialog || !openButton) {
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const mobile = matchMedia(navigation_mobile_query);
|
|
20
|
-
const layout = {mobile: mobile.matches};
|
|
21
|
-
const ports = [documents, outline];
|
|
22
|
-
const positions = new Map<string, Map<HTMLElement, number>>();
|
|
23
|
-
const signature = [...navigation.querySelectorAll<HTMLAnchorElement>(".wg_shellNav__root a[href]")].map((link) => `${link.pathname}:${link.textContent}`).join("\n");
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* 숨김·닫기보다 먼저 마지막 위치 보존 · 저장소 차단 시에도 드로어 재열기 유지
|
|
27
|
-
*/
|
|
28
|
-
const saveScroll = () => {
|
|
29
|
-
if (layout.mobile !== mobile.matches || (mobile.matches && !dialog.open)) {
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const key = `${navigation_scroll_storage_key}:${mobile.matches ? "drawer" : "desktop"}`;
|
|
34
|
-
positions.set(key, new Map(ports.map((port) => [port, port.scrollTop])));
|
|
35
|
-
|
|
36
|
-
try {
|
|
37
|
-
sessionStorage.setItem(key, JSON.stringify({navigation: signature, pathname: location.pathname, documents: documents.scrollTop, outline: outline.scrollTop}));
|
|
38
|
-
} catch {
|
|
39
|
-
// 현재 페이지 안의 위치는 메모리에 유지 · 저장 실패가 링크 이동을 막지 않음
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* 열기·반응형 DOM 이동 완료 후 화면별 위치 복원
|
|
45
|
-
*/
|
|
46
|
-
const restoreScroll = () => {
|
|
47
|
-
layout.mobile = mobile.matches;
|
|
48
|
-
|
|
49
|
-
if (mobile.matches && !dialog.open) {
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
const key = `${navigation_scroll_storage_key}:${mobile.matches ? "drawer" : "desktop"}`;
|
|
54
|
-
const saved = positions.get(key);
|
|
55
|
-
|
|
56
|
-
if (saved === undefined) {
|
|
57
|
-
restoreNavigationScroll(key);
|
|
58
|
-
} else {
|
|
59
|
-
for (const port of ports) {
|
|
60
|
-
const top = saved.get(port);
|
|
61
|
-
|
|
62
|
-
if (top !== undefined) {
|
|
63
|
-
port.scrollTop = top;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
saveScroll();
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
for (const port of ports) {
|
|
72
|
-
port.addEventListener("scroll", saveScroll, {passive: true});
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
// 캡처 단계에서 모바일의 기본 닫기보다 먼저 저장
|
|
76
|
-
navigation.addEventListener("click", saveScroll, {capture: true});
|
|
77
|
-
dialog.addEventListener("cancel", saveScroll);
|
|
78
|
-
dialog.querySelector("[data-navigation-close]")?.addEventListener("click", saveScroll, {capture: true});
|
|
79
|
-
dialog.addEventListener("click", saveScroll, {capture: true});
|
|
80
|
-
openButton.addEventListener("click", restoreScroll);
|
|
81
|
-
mobile.addEventListener("change", restoreScroll);
|
|
82
|
-
addEventListener("pagehide", saveScroll);
|
|
83
|
-
saveScroll();
|
|
84
|
-
};
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 탐색 HTML 직후와 드로어 열기에서 저장 위치 복원 · 첫 paint 전 실행
|
|
3
|
-
* HTML에 함수 본문을 직렬화하므로 import나 바깥 변수 없이 브라우저 DOM만 사용
|
|
4
|
-
* @param storageKey 탭·화면 모드별 저장 키
|
|
5
|
-
*/
|
|
6
|
-
export const restoreNavigationScroll = (storageKey: string) => {
|
|
7
|
-
const navigation = document.querySelector<HTMLElement>("[data-navigation]");
|
|
8
|
-
const documents = document.querySelector<HTMLElement>('[data-navigation-scroll="documents"]');
|
|
9
|
-
const outline = document.querySelector<HTMLElement>('[data-navigation-scroll="outline"]');
|
|
10
|
-
|
|
11
|
-
if (!navigation || !documents || !outline) {
|
|
12
|
-
return;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
try {
|
|
16
|
-
const value = sessionStorage.getItem(storageKey);
|
|
17
|
-
|
|
18
|
-
if (value === null) {
|
|
19
|
-
return;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const stored: unknown = JSON.parse(value);
|
|
23
|
-
const signature = [...navigation.querySelectorAll<HTMLAnchorElement>(".wg_shellNav__root a[href]")].map((link) => `${link.pathname}:${link.textContent}`).join("\n");
|
|
24
|
-
|
|
25
|
-
if (typeof stored !== "object" || stored === null || !("navigation" in stored) || stored.navigation !== signature) {
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
if ("documents" in stored && typeof stored.documents === "number" && Number.isFinite(stored.documents) && stored.documents >= 0) {
|
|
30
|
-
documents.scrollTop = stored.documents;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// 문서 목록은 공통 위치 · 목차는 같은 페이지에 다시 들어왔을 때만 복원
|
|
34
|
-
if (
|
|
35
|
-
"pathname" in stored &&
|
|
36
|
-
stored.pathname === location.pathname &&
|
|
37
|
-
"outline" in stored &&
|
|
38
|
-
typeof stored.outline === "number" &&
|
|
39
|
-
Number.isFinite(stored.outline) &&
|
|
40
|
-
stored.outline >= 0
|
|
41
|
-
) {
|
|
42
|
-
outline.scrollTop = stored.outline;
|
|
43
|
-
}
|
|
44
|
-
} catch {
|
|
45
|
-
// 차단·손상된 저장소는 복원만 생략 · 기본 링크와 스크롤 유지
|
|
46
|
-
}
|
|
47
|
-
};
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import clsx from "clsx";
|
|
2
|
-
import {Fragment} from "react";
|
|
3
|
-
import type {Doc} from "@/type/doc";
|
|
4
|
-
import type {DocGroup} from "@/type/doc-group";
|
|
5
|
-
import "./_wg-shell-nav-list.css";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* 한 단계의 문서 목록과 하위 묶음 · 재귀에서도 같은 탐색 표현 유지
|
|
9
|
-
*/
|
|
10
|
-
export interface WgShellNavListProps {
|
|
11
|
-
/**
|
|
12
|
-
* 현재 단계의 문서와 하위 묶음
|
|
13
|
-
*/
|
|
14
|
-
group: DocGroup;
|
|
15
|
-
/**
|
|
16
|
-
* 현재 문서 · 조상 묶음의 경로까지 표시
|
|
17
|
-
*/
|
|
18
|
-
currentDoc?: Doc;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export const WgShellNavList = (props: WgShellNavListProps) => {
|
|
22
|
-
const currentAncestors = new Set(props.currentDoc?.ancestors);
|
|
23
|
-
const entries = [
|
|
24
|
-
...props.group.docs.map((doc) => {
|
|
25
|
-
const active = doc.id === props.currentDoc?.id;
|
|
26
|
-
return {kind: "document" as const, key: `doc:${doc.id}`, doc, active, current: active || currentAncestors.has(doc.id)};
|
|
27
|
-
}),
|
|
28
|
-
...props.group.groups.map((group) => ({
|
|
29
|
-
kind: "group" as const,
|
|
30
|
-
key: `group:${JSON.stringify(group.path)}`,
|
|
31
|
-
group,
|
|
32
|
-
current: group.path.every((name, index) => name === props.currentDoc?.data.group[index]),
|
|
33
|
-
})),
|
|
34
|
-
];
|
|
35
|
-
const currentIndex = entries.findIndex((entry) => entry.current);
|
|
36
|
-
|
|
37
|
-
return (
|
|
38
|
-
<ul className={clsx("wg_shellNavList__root")} aria-label={props.group.name}>
|
|
39
|
-
{/**
|
|
40
|
-
* 현재 경로 앞의 줄기와 도착 가지 · 문서 링크는 원래 파일 URL 사용
|
|
41
|
-
*/}
|
|
42
|
-
{entries.map((entry, index) => (
|
|
43
|
-
<li
|
|
44
|
-
className={clsx("wg_shellNavList__item", {
|
|
45
|
-
"wg_shellNavList__item--trail": index < currentIndex,
|
|
46
|
-
"wg_shellNavList__item--current": entry.current,
|
|
47
|
-
})}
|
|
48
|
-
key={entry.key}
|
|
49
|
-
>
|
|
50
|
-
{/**
|
|
51
|
-
* 문서 링크 · 부모도 독립 페이지, 현재 한 문서에만 페이지 상태 부여
|
|
52
|
-
*/}
|
|
53
|
-
{entry.kind === "document" && (
|
|
54
|
-
<Fragment>
|
|
55
|
-
<a
|
|
56
|
-
className={clsx("wg_shellNavList__link", {"wg_shellNavList__link--active": entry.active})}
|
|
57
|
-
href={`/${entry.doc.id}/`}
|
|
58
|
-
title={entry.doc.data.label}
|
|
59
|
-
aria-current={entry.active ? "page" : undefined}
|
|
60
|
-
>
|
|
61
|
-
{entry.doc.data.name}
|
|
62
|
-
</a>
|
|
63
|
-
{/**
|
|
64
|
-
* 하위 문서 · 부모 아래에서도 기존 목록의 들여쓰기와 키보드 이동 유지
|
|
65
|
-
*/}
|
|
66
|
-
{entry.doc.children !== undefined && (
|
|
67
|
-
<WgShellNavList
|
|
68
|
-
group={{name: entry.doc.data.name, path: entry.doc.data.group, docs: entry.doc.children, groups: []}}
|
|
69
|
-
currentDoc={props.currentDoc}
|
|
70
|
-
/>
|
|
71
|
-
)}
|
|
72
|
-
</Fragment>
|
|
73
|
-
)}
|
|
74
|
-
{/**
|
|
75
|
-
* 하위 묶음 · 같은 목록을 재귀로 이어 깊이에 따라 들여쓰기
|
|
76
|
-
*/}
|
|
77
|
-
{entry.kind === "group" && (
|
|
78
|
-
<Fragment>
|
|
79
|
-
<span className={clsx("wg_shellNavList__branch")}>{entry.group.name}</span>
|
|
80
|
-
<WgShellNavList group={entry.group} currentDoc={props.currentDoc} />
|
|
81
|
-
</Fragment>
|
|
82
|
-
)}
|
|
83
|
-
</li>
|
|
84
|
-
))}
|
|
85
|
-
</ul>
|
|
86
|
-
);
|
|
87
|
-
};
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import clsx from "clsx";
|
|
2
|
-
import {WgShellNavList} from "@/component/widget/shell/_wg-shell-nav-list";
|
|
3
|
-
import {copy_nav_aria_label} from "@/constant/copy";
|
|
4
|
-
import {toDocGroups} from "@/content/to-doc-groups/to-doc-groups";
|
|
5
|
-
import type {Doc} from "@/type/doc";
|
|
6
|
-
import type {SiteConfig} from "@/type/site-config";
|
|
7
|
-
import "./_wg-shell-nav.css";
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* 서버 사이드바 입력 · 읽는 순서의 문서 묶음
|
|
11
|
-
*/
|
|
12
|
-
export interface WgShellNavProps {
|
|
13
|
-
/**
|
|
14
|
-
* 문서 묶음 순서
|
|
15
|
-
*/
|
|
16
|
-
site: SiteConfig;
|
|
17
|
-
/**
|
|
18
|
-
* 전체 문서 목록
|
|
19
|
-
*/
|
|
20
|
-
docs: Doc[];
|
|
21
|
-
/**
|
|
22
|
-
* 현재 문서 id · 첫 화면 생략
|
|
23
|
-
*/
|
|
24
|
-
current?: string;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export const WgShellNav = (props: WgShellNavProps) => {
|
|
28
|
-
const docGroups = toDocGroups({docs: props.docs, navigation: props.site.navigation});
|
|
29
|
-
const currentDoc = props.docs.find((doc) => doc.id === props.current);
|
|
30
|
-
|
|
31
|
-
return (
|
|
32
|
-
<nav className={clsx("wg_shellNav__root")} aria-label={copy_nav_aria_label}>
|
|
33
|
-
{/**
|
|
34
|
-
* 문서 이동 · 독자 목적별 묶음
|
|
35
|
-
*/}
|
|
36
|
-
<div className={clsx("wg_shellNav__docs")}>
|
|
37
|
-
{/**
|
|
38
|
-
* 묶음 이름과 독립 문서 · 제목이 링크의 접근 가능한 이름
|
|
39
|
-
*/}
|
|
40
|
-
{docGroups.map((group) => (
|
|
41
|
-
<section className={clsx("wg_shellNav__docGroup")} key={group.name} aria-label={group.name}>
|
|
42
|
-
<div className={clsx("wg_shellNav__group")}>{group.name}</div>
|
|
43
|
-
<WgShellNavList group={group} currentDoc={currentDoc} />
|
|
44
|
-
</section>
|
|
45
|
-
))}
|
|
46
|
-
</div>
|
|
47
|
-
</nav>
|
|
48
|
-
);
|
|
49
|
-
};
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import clsx from "clsx";
|
|
2
|
-
import {Fragment} from "react";
|
|
3
|
-
import type {TocGroup} from "@/component/widget/shell/_type/toc-group";
|
|
4
|
-
import {copy_nav_toc_label} from "@/constant/copy";
|
|
5
|
-
import "./_wg-shell-toc.css";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* 문서 탐색 아래의 현재 문서 목차 · client.ts에서 읽는 위치 표시
|
|
9
|
-
*/
|
|
10
|
-
export interface WgShellTocProps {
|
|
11
|
-
/**
|
|
12
|
-
* 본문 순서의 가름·절·소제목 · 전체 펼침
|
|
13
|
-
*/
|
|
14
|
-
groups: TocGroup[];
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export const WgShellToc = (props: WgShellTocProps) => {
|
|
18
|
-
return (
|
|
19
|
-
<nav className={clsx("wg_shellToc__root")} aria-label={copy_nav_toc_label}>
|
|
20
|
-
<div className={clsx("wg_shellToc__label")}>{copy_nav_toc_label}</div>
|
|
21
|
-
{/**
|
|
22
|
-
* 가름별 제목 이동 · 작성한 제목을 본문과 동일하게 표시
|
|
23
|
-
*/}
|
|
24
|
-
{props.groups.map((group) => (
|
|
25
|
-
<Fragment key={group.sections[0].heading.slug}>
|
|
26
|
-
{group.part !== undefined && <div className={clsx("wg_shellToc__group")}>{group.part}</div>}
|
|
27
|
-
{/**
|
|
28
|
-
* 현재 위치와 무관하게 모든 소제목 표시
|
|
29
|
-
*/}
|
|
30
|
-
<ul className={clsx("wg_shellToc__list")}>
|
|
31
|
-
{group.sections.map((section) => (
|
|
32
|
-
<li className={clsx("wg_shellToc__item")} key={section.heading.slug}>
|
|
33
|
-
<a className={clsx("wg_shellToc__link")} href={`#${section.heading.slug}`} data-toc-link="">
|
|
34
|
-
{section.heading.text}
|
|
35
|
-
</a>
|
|
36
|
-
{/**
|
|
37
|
-
* 소제목의 들여쓰기 · JavaScript 없이도 제목 이동 가능
|
|
38
|
-
*/}
|
|
39
|
-
{section.subs.length > 0 && (
|
|
40
|
-
<ul className={clsx("wg_shellToc__sub")}>
|
|
41
|
-
{section.subs.map((sub) => (
|
|
42
|
-
<li className={clsx("wg_shellToc__subItem")} key={sub.heading.slug}>
|
|
43
|
-
<a className={clsx("wg_shellToc__subLink")} href={`#${sub.heading.slug}`} data-toc-sub-link="">
|
|
44
|
-
{sub.heading.text}
|
|
45
|
-
</a>
|
|
46
|
-
</li>
|
|
47
|
-
))}
|
|
48
|
-
</ul>
|
|
49
|
-
)}
|
|
50
|
-
</li>
|
|
51
|
-
))}
|
|
52
|
-
</ul>
|
|
53
|
-
</Fragment>
|
|
54
|
-
))}
|
|
55
|
-
</nav>
|
|
56
|
-
);
|
|
57
|
-
};
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/src/{content/rehype-assets.ts → entry/cli/_function/create-processor/_rehype-assets.ts}
RENAMED
|
File without changes
|
|
File without changes
|
/package/src/{content/remark-report.ts → entry/cli/_function/create-processor/_remark-report.ts}
RENAMED
|
File without changes
|
|
File without changes
|