Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/flag-locale-menu.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@devslab/site-kit": minor
---

`LocaleMenu` gains `variant="flag"` (flag trigger, flag + native-name rows, works without JavaScript) and the runtime-neutral entry exports `FLAG_COUNTRY`, `LOCALE_FLAGS`, `flagFor`. `SiteHeader` forwards `localeVariant`.
3 changes: 3 additions & 0 deletions docs/backlog.md
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,9 @@ devslab.kr과 동일한 `localStorage 'theme'` 키 + `data-theme` 속성 패턴
Geist/Geist Mono 셀프호스팅 여부, Pretendard 서브셋, RN 번들 전략.
결정을 `docs/decisions.md`에 기록.

### 12. site-kit 국기 로케일 피커 — `완료` (2026-09-02)
D-017. `LocaleMenu variant="flag"` + 국기 데이터 14개. 첫 소비자 TraceLinq 랜딩.

---

## P3 — 모바일 이후
Expand Down
14 changes: 14 additions & 0 deletions docs/decisions.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,20 @@

---

## D-017 — 국기는 site-kit 데이터, 아이콘 세트 밖 (2026-09-02)

**결정.** 로케일 피커의 국기 14개는 `@devslab/site-kit`가 `src/core/flags.mjs`로
소유한다(flag-icons 7.5.0에서 벤더링, MIT). `dds-icons`에는 넣지 않는다.
`LocaleMenu`는 `variant="flag"`를 얻고 기본값 `select`는 무변경이다.

**근거.** D-013의 아이콘 계약(`check-icons.mjs`)은 색 리터럴 금지·`currentColor`
스트로크 필수를 기계적으로 강제한다. 다색 채움인 국기는 그 계약을 만족할 수 없고,
계약을 느슨하게 하면 아이콘 세트가 아이콘 세트이기를 그만둔다. 로케일 목록을
소유한 패키지가 그 목록의 국기도 소유하는 것이 데이터의 자리다.

**첫 소비자.** TraceLinq 랜딩(gettracelinq.app). 허브·devslab.kr·AskLinq
마케팅의 같은 14로케일 피커는 이후 갈아탈 수 있다.

## D-016 — 외부 디자인 시스템 참조 표기 제거 (2026-09-01)

**결정.** 공개 문서(README·스펙·백로그)에서 특정 외부 디자인 시스템을 참조
Expand Down
12 changes: 12 additions & 0 deletions packages/site-kit/README.ko.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,15 @@ DevsLab 제품의 공개 웹사이트를 위한 공개 인프라 패키지다.
claim leaf가 검증된 사실 레지스트리를 참조하도록 강제한다. `buildRobots`의
기존 environment-only 출력은 유지되며, 선택적 `policies`로 검색 인덱싱,
인용 crawler, 모델 학습 crawler를 각각 제어할 수 있다.

## 로케일 메뉴 variant

`LocaleMenu`는 기본으로 네이티브 `<select>`를 렌더링한다. `variant="flag"`는
트리거가 현재 로케일의 국기이고 행마다 국기 + 자국어 이름 링크인 `<details>`
디스클로저를 렌더링한다 — JavaScript 없이도 동작하며, Solid는 Escape로 닫기와
`onLocaleChange(locale, href)` 콜백을 더한다. `SiteHeader`는 `localeVariant`를
그대로 전달한다. 국기 데이터(`FLAG_COUNTRY`, `LOCALE_FLAGS`, `flagFor`)는
런타임 중립 entry에서 export되며, 아트워크는 flag-icons에서 벤더링했다(MIT,
`flags/LICENSE-flag-icons.txt`). 국기는 `dds-icons` 항목이 아니라 site-kit
데이터다 — 아이콘 세트의 계약이 단색 `currentColor` 스트로크를 요구하기
때문이다.
4 changes: 4 additions & 0 deletions packages/site-kit/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,7 @@ accepts only the reviewed schema-type and claim allowlists, and every claim leaf
still references the verified-fact registry. `buildRobots` keeps its legacy
environment-only output, while an optional `policies` object can independently
control search indexing, citation crawlers, and model-training crawlers.

## Locale menu variants

`LocaleMenu` renders a native `<select>` by default. `variant="flag"` renders a `<details>` disclosure whose trigger is the current locale's flag and whose rows are flag + native-name links — it works without JavaScript; Solid adds Escape-to-close and the `onLocaleChange(locale, href)` callback. `SiteHeader` forwards `localeVariant`. Flag data (`FLAG_COUNTRY`, `LOCALE_FLAGS`, `flagFor`) is exported from the runtime-neutral entry; the artwork is vendored from flag-icons (MIT, `flags/LICENSE-flag-icons.txt`). Flags are site-kit data, not `dds-icons` entries, because the icon set's contract requires single-colour `currentColor` strokes.
21 changes: 21 additions & 0 deletions packages/site-kit/flags/LICENSE-flag-icons.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
The MIT License (MIT)

Copyright (c) 2013 Panayiotis Lipiridis

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
45 changes: 45 additions & 0 deletions packages/site-kit/flags/br.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions packages/site-kit/flags/de.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading