From 3382296c48d23352b842332aa281950aab7eeafd Mon Sep 17 00:00:00 2001 From: Sin-Kang Date: Thu, 24 Sep 2026 05:51:23 +0900 Subject: [PATCH] feat(site-kit): single-language header and a footer with business details (D-029) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nine options FM덴탈서비스's landing needed and the kit could not draw: - SiteHeader locale is optional (no picker); SiteBrand.label names the brand link; a wordmark logo with name "" prints once. - The narrow menu closes on Escape (focus back on the button) and when a link inside it is followed. Buttons, new-tab links, an Escape a control inside the header already handled, and an Escape from an aria-modal element leave it open. - On touch the brand, navigation, footer and footer-language links are 44px; at 720px and below the open menu is 44px rows and the closed header's first row is 64px. - SiteFooter details (a block under the brand line) and linksLabel (a named nav); SiteLink.emphasis. - Sections and the hero stop below the sticky header (--site-header-block-size); eyebrow tracking and weight hooks. - Header and footer read brand (and details) once. A five-lens review before the PR confirmed 15 findings; all are fixed or documented here: the brand link's touch size, new-tab and modal Escape cases, footer baseline alignment on touch, details margins, the 16px mark size scoped to icon marks, and the defaults every consumer gets (narrow header 89 to 65px on content-box consumers) plus the type change on SiteHeaderProps["locale"]. Tests: 16 component cases, a development-build hydration test for directly mounted chrome with getter props, source contracts, and browser geometry at fine and coarse pointers. Each fails on the code or CSS it guards. --- .../site-kit-single-language-landing.md | 20 ++ docs/backlog.md | 13 ++ docs/decisions.md | 42 +++++ package.json | 2 +- packages/site-kit/README.ko.md | 41 ++++ packages/site-kit/README.md | 41 ++++ packages/site-kit/site-sections.css | 8 +- .../src/solid/__tests__/footer.test.tsx | 2 +- .../solid/__tests__/landing-chrome.test.tsx | 177 ++++++++++++++++++ packages/site-kit/src/solid/chrome.tsx | 139 ++++++++++---- packages/site-kit/src/solid/types.ts | 26 ++- packages/site-kit/styles.css | 34 +++- packages/site-kit/vitest.config.ts | 1 + tests/browser/site-kit.spec.ts | 146 +++++++++++++++ tests/site-kit-contracts.test.mjs | 32 ++++ ...site-kit-landing-chrome-hydration.test.mjs | 150 +++++++++++++++ 16 files changed, 829 insertions(+), 45 deletions(-) create mode 100644 .changeset/site-kit-single-language-landing.md create mode 100644 packages/site-kit/src/solid/__tests__/landing-chrome.test.tsx create mode 100644 tests/site-kit-landing-chrome-hydration.test.mjs diff --git a/.changeset/site-kit-single-language-landing.md b/.changeset/site-kit-single-language-landing.md new file mode 100644 index 0000000..fcfddd8 --- /dev/null +++ b/.changeset/site-kit-single-language-landing.md @@ -0,0 +1,20 @@ +--- +"@devslab/site-kit": minor +--- + +Header and footer options for a single-language landing and a footer that prints business details (D-029). The new props are optional: + +- `SiteHeader` `locale` is optional; without it no language picker renders. +- `SiteBrand.label` names the header brand link; a wordmark `logo` with `name: ""` prints once and leaves no empty `` in the footer. +- `SiteFooter` `details` (a block under the brand line) and `linksLabel` (wraps the links in `