Skip to content

Commit 651acc5

Browse files
committed
work on docs
1 parent 1732f33 commit 651acc5

21 files changed

Lines changed: 865 additions & 113 deletions

.DS_Store

0 Bytes
Binary file not shown.

CHANGELOG.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,20 @@
11
# Changelog
22

3+
## [Unreleased]
4+
5+
## [4.0.1] — 2026-04-03
6+
7+
### Changed
8+
9+
- **Source layout:** `src/pdf/`, `src/handlebars/`, `src/types/`, `src/validation/`, `src/create/index.ts` (`create` entrypoint); root keeps `index.ts` only. Published API unchanged.
10+
- **Example (`example/`):** `index.js` uses async/await, resolves output path with `path.join`; `template.html` age field corrected (`{{this.age}}`); `npm start` script.
11+
12+
### Documentation
13+
14+
- **README:** **AWS Lambda / serverless** — deployment limits, container vs zip, memory and timeout, note that custom `executablePath` is not exposed on options yet.
15+
- **README:** **Margins** (`border`), **custom fonts** (hosted + `base` + `@font-face`), **images** (remote, `base`, data URLs, WebP, header/footer), **page-break** hints for wide tables.
16+
- **GitHub Pages (`docs/`):** **Fonts & images** section and nav link; guide **footer** example aligned with v4 (single template); note on unsupported per-page footer keys; author section with social links.
17+
318
## [4.0.0] — 2026-04-03
419

520
### Breaking

docs/assets/css/style.css

Lines changed: 220 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -139,14 +139,17 @@ a:focus-visible {
139139
box-shadow: 0 1px 0 var(--shadow);
140140
}
141141

142-
.site-header__inner {
142+
.site-header__shell {
143143
max-width: 900px;
144144
margin: 0 auto;
145-
padding: 0.65rem 1.25rem;
145+
padding: 0.65rem 1.25rem 0.75rem;
146+
}
147+
148+
.site-header__top {
146149
display: flex;
147150
align-items: center;
151+
justify-content: space-between;
148152
gap: 1rem;
149-
flex-wrap: wrap;
150153
min-height: var(--header-h);
151154
}
152155

@@ -165,32 +168,129 @@ a:focus-visible {
165168
}
166169

167170
.site-nav {
171+
margin-top: 0.45rem;
172+
padding-top: 0.55rem;
173+
border-top: 1px solid var(--border);
174+
}
175+
176+
.site-nav__menu {
177+
list-style: none;
178+
margin: 0;
179+
padding: 0;
168180
display: flex;
169181
flex-wrap: wrap;
170-
gap: 0.35rem 1rem;
171-
align-items: center;
172-
flex: 1;
173-
justify-content: center;
182+
align-items: flex-start;
183+
gap: 0.15rem 0.35rem;
174184
}
175185

176-
@media (min-width: 720px) {
177-
.site-nav {
178-
justify-content: flex-end;
179-
}
186+
.site-nav__item {
187+
position: relative;
188+
list-style: none;
180189
}
181190

182-
.site-nav a {
183-
font-size: 0.9rem;
184-
font-weight: 500;
191+
.site-nav__trigger {
192+
display: inline-flex;
193+
align-items: center;
194+
gap: 0.35rem;
195+
margin: 0;
196+
font-family: var(--font);
197+
font-size: 0.75rem;
198+
font-weight: 700;
199+
letter-spacing: 0.05em;
200+
text-transform: uppercase;
185201
color: var(--muted);
186-
padding: 0.35rem 0.5rem;
202+
padding: 0.4rem 0.55rem;
203+
border: 1px solid transparent;
187204
border-radius: var(--radius-sm);
205+
background: transparent;
206+
cursor: pointer;
207+
line-height: 1.2;
208+
}
209+
210+
.site-nav__trigger:hover {
211+
color: var(--text);
212+
background: var(--surface);
213+
}
214+
215+
.site-nav__item:is(:hover, :focus-within) .site-nav__trigger {
216+
color: var(--text);
188217
}
189218

190-
.site-nav a:hover {
219+
.site-nav__item.is-open .site-nav__trigger {
191220
color: var(--text);
192221
background: var(--surface);
222+
border-color: var(--border);
223+
}
224+
225+
.site-nav__trigger:focus-visible {
226+
outline: 2px solid var(--focus-ring);
227+
outline-offset: 2px;
228+
}
229+
230+
.site-nav__caret {
231+
display: block;
232+
width: 0;
233+
height: 0;
234+
border-left: 4px solid transparent;
235+
border-right: 4px solid transparent;
236+
border-top: 5px solid currentColor;
237+
opacity: 0.75;
238+
flex-shrink: 0;
239+
transition: transform 0.15s ease;
240+
}
241+
242+
.site-nav__item.is-open .site-nav__caret {
243+
transform: rotate(180deg);
244+
}
245+
246+
.site-nav__submenu {
247+
position: absolute;
248+
top: calc(100% + 3px);
249+
left: 0;
250+
min-width: 11.5rem;
251+
margin: 0;
252+
padding: 0.4rem;
253+
list-style: none;
254+
background: var(--surface);
255+
border: 1px solid var(--border);
256+
border-radius: var(--radius-sm);
257+
box-shadow: 0 10px 28px var(--shadow);
258+
z-index: 100;
259+
opacity: 0;
260+
visibility: hidden;
261+
transform: translateY(-6px);
262+
pointer-events: none;
263+
transition: opacity 0.16s ease, transform 0.16s ease, visibility 0.16s;
264+
}
265+
266+
.site-nav__submenu li {
267+
list-style: none;
268+
margin: 0;
269+
}
270+
271+
.site-nav__item:hover .site-nav__submenu,
272+
.site-nav__item:focus-within .site-nav__submenu,
273+
.site-nav__item.is-open .site-nav__submenu {
274+
opacity: 1;
275+
visibility: visible;
276+
transform: translateY(0);
277+
pointer-events: auto;
278+
}
279+
280+
.site-nav__submenu a {
281+
display: block;
282+
padding: 0.45rem 0.6rem;
283+
font-size: 0.875rem;
284+
font-weight: 500;
285+
color: var(--text);
193286
text-decoration: none;
287+
border-radius: var(--radius-sm);
288+
white-space: nowrap;
289+
}
290+
291+
.site-nav__submenu a:hover {
292+
background: var(--code-bg);
293+
color: var(--accent);
194294
}
195295

196296
.site-header__actions {
@@ -495,6 +595,28 @@ pre code {
495595
max-width: 52ch;
496596
}
497597

598+
.subsection-title {
599+
margin: 1.5rem 0 0.6rem;
600+
font-size: 1.05rem;
601+
font-weight: 650;
602+
letter-spacing: -0.01em;
603+
color: var(--text);
604+
}
605+
606+
.feature-list {
607+
margin: 0.35rem 0 1rem;
608+
padding-left: 1.25rem;
609+
color: var(--text);
610+
}
611+
612+
.feature-list li {
613+
margin-bottom: 0.45rem;
614+
}
615+
616+
.feature-list li:last-child {
617+
margin-bottom: 0;
618+
}
619+
498620
.author-section .author-card {
499621
max-width: 40rem;
500622
padding: 1.35rem 1.5rem;
@@ -518,6 +640,22 @@ pre code {
518640
font-size: 0.98rem;
519641
}
520642

643+
.author-card__bio {
644+
margin: 0 0 1rem;
645+
color: var(--text);
646+
font-size: 0.95rem;
647+
line-height: 1.55;
648+
}
649+
650+
.author-social-label {
651+
margin: 0 0 0.5rem;
652+
font-size: 0.75rem;
653+
font-weight: 700;
654+
letter-spacing: 0.06em;
655+
text-transform: uppercase;
656+
color: var(--muted);
657+
}
658+
521659
.author-card__contact {
522660
margin: 0 0 1rem;
523661
font-size: 1rem;
@@ -578,6 +716,20 @@ html[data-theme="light"] .author-social__link:hover {
578716
font-size: 0.85em;
579717
}
580718

719+
.fonts-images-list {
720+
margin: 0 0 1rem;
721+
padding-left: 1.35rem;
722+
color: var(--text);
723+
}
724+
725+
.fonts-images-list li {
726+
margin-bottom: 0.75rem;
727+
}
728+
729+
.fonts-images-list li:last-child {
730+
margin-bottom: 0;
731+
}
732+
581733
.steps {
582734
list-style: none;
583735
margin: 0;
@@ -712,19 +864,61 @@ html[data-theme="light"] .note {
712864
outline-offset: 2px;
713865
}
714866

715-
@media (max-width: 520px) {
716-
.site-nav {
867+
@media (max-width: 640px) {
868+
.site-nav__menu {
869+
flex-direction: column;
870+
align-items: stretch;
871+
gap: 0;
872+
}
873+
874+
.site-nav__item {
875+
border-bottom: 1px solid var(--border);
876+
}
877+
878+
.site-nav__item:last-child {
879+
border-bottom: none;
880+
}
881+
882+
.site-nav__trigger {
717883
width: 100%;
718-
justify-content: flex-start;
719-
order: 3;
720-
padding-top: 0.25rem;
721-
border-top: 1px solid var(--border);
722-
margin-top: 0.25rem;
723-
padding-top: 0.65rem;
884+
justify-content: space-between;
885+
padding: 0.55rem 0.35rem 0.55rem 0.15rem;
886+
font-size: 0.78rem;
887+
}
888+
889+
/* Touch / narrow: only .is-open reveals submenu (hover disabled by display) */
890+
.site-nav__submenu {
891+
position: static;
892+
box-shadow: none;
893+
border: none;
894+
border-radius: 0;
895+
padding: 0 0 0.65rem 0.5rem;
896+
background: transparent;
897+
transform: none;
898+
transition: none;
899+
}
900+
901+
.site-nav__item:not(.is-open) .site-nav__submenu {
902+
display: none;
903+
}
904+
905+
.site-nav__item.is-open .site-nav__submenu {
906+
display: block;
907+
opacity: 1;
908+
visibility: visible;
909+
pointer-events: auto;
724910
}
725911

726-
.site-header__inner {
727-
flex-wrap: wrap;
912+
.site-nav__submenu a {
913+
white-space: normal;
914+
padding: 0.4rem 0.5rem;
915+
}
916+
}
917+
918+
@media (max-width: 520px) {
919+
.site-header__shell {
920+
padding-left: 1rem;
921+
padding-right: 1rem;
728922
}
729923

730924
.hero {

docs/assets/js/main.js

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,15 +116,67 @@
116116
});
117117
}
118118

119+
/** Menu / submenu: click toggles (required on narrow viewports); Escape / outside click closes. */
120+
function initNavSubmenus() {
121+
var nav = document.querySelector(".site-nav");
122+
if (!nav) return;
123+
124+
function setOpen(li, open) {
125+
var btn = li.querySelector(".site-nav__trigger");
126+
if (open) {
127+
li.classList.add("is-open");
128+
if (btn) btn.setAttribute("aria-expanded", "true");
129+
} else {
130+
li.classList.remove("is-open");
131+
if (btn) btn.setAttribute("aria-expanded", "false");
132+
}
133+
}
134+
135+
function closeAll() {
136+
nav.querySelectorAll(".site-nav__item.is-open").forEach(function (li) {
137+
setOpen(li, false);
138+
});
139+
}
140+
141+
nav.querySelectorAll(".site-nav__trigger").forEach(function (btn) {
142+
btn.addEventListener("click", function (e) {
143+
e.preventDefault();
144+
e.stopPropagation();
145+
var li = btn.closest(".site-nav__item");
146+
if (!li) return;
147+
var wasOpen = li.classList.contains("is-open");
148+
closeAll();
149+
if (!wasOpen) setOpen(li, true);
150+
});
151+
});
152+
153+
nav.querySelectorAll(".site-nav__submenu a").forEach(function (a) {
154+
a.addEventListener("click", function () {
155+
closeAll();
156+
});
157+
});
158+
159+
document.addEventListener("click", closeAll);
160+
nav.addEventListener("click", function (e) {
161+
e.stopPropagation();
162+
});
163+
164+
document.addEventListener("keydown", function (e) {
165+
if (e.key === "Escape") closeAll();
166+
});
167+
}
168+
119169
if (document.readyState === "loading") {
120170
document.addEventListener("DOMContentLoaded", function () {
121171
initTheme();
122172
initCopyButtons();
123173
initBackToTop();
174+
initNavSubmenus();
124175
});
125176
} else {
126177
initTheme();
127178
initCopyButtons();
128179
initBackToTop();
180+
initNavSubmenus();
129181
}
130182
})();

0 commit comments

Comments
 (0)