@devslab/site-kit 0.3.0 → 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/README.ko.md +48 -3
- package/README.md +38 -3
- package/dist/chrome.d.ts +10 -7
- package/dist/chrome.d.ts.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/locale-menu.d.ts +18 -0
- package/dist/locale-menu.d.ts.map +1 -0
- package/dist/solid.js +414 -125
- package/dist/solid.js.map +1 -1
- package/dist/solid.server.js +337 -19
- package/dist/solid.server.js.map +1 -1
- package/flags/LICENSE-flag-icons.txt +21 -0
- package/flags/br.svg +45 -0
- package/flags/de.svg +5 -0
- package/flags/es.svg +544 -0
- package/flags/fr.svg +5 -0
- package/flags/hk.svg +8 -0
- package/flags/id.svg +4 -0
- package/flags/in.svg +25 -0
- package/flags/jp.svg +11 -0
- package/flags/kr.svg +24 -0
- package/flags/sa.svg +25 -0
- package/flags/th.svg +7 -0
- package/flags/tw.svg +34 -0
- package/flags/us.svg +9 -0
- package/flags/vn.svg +11 -0
- package/package.json +19 -3
- package/src/core/catalog.d.mts +7 -3
- package/src/core/catalog.mjs +17 -4
- package/src/core/flags.d.mts +8 -0
- package/src/core/flags.mjs +77 -0
- package/src/core/index.mjs +1 -1
- package/src/core/locales.d.mts +34 -0
- package/src/core/locales.mjs +86 -26
- package/src/core/seo.d.mts +10 -10
- package/src/core/seo.mjs +23 -17
- package/styles.css +14 -0
package/README.ko.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @devslab/site-kit
|
|
2
2
|
|
|
3
|
-
DevsLab 제품의 공개 웹사이트를 위한 공개 인프라 패키지다. 엄격한
|
|
3
|
+
DevsLab 제품의 공개 웹사이트를 위한 공개 인프라 패키지다. 가족 로케일에 대한 엄격한 카탈로그(제품별 확장 가능), 로케일 협상, SEO/GEO 문서 생성기, 접근 가능한 SolidJS 2 사이트 셸을 제공한다. 제품명·주장·내비게이션·번역 문구는 항상 소비 앱이 소유한다.
|
|
4
4
|
|
|
5
5
|
## 진입점
|
|
6
6
|
|
|
@@ -9,10 +9,55 @@ DevsLab 제품의 공개 웹사이트를 위한 공개 인프라 패키지다.
|
|
|
9
9
|
- `@devslab/site-kit/tanstack-start` — 중립 메타데이터를 TanStack Start head descriptor로 변환
|
|
10
10
|
- `@devslab/site-kit/styles.css` — 논리 속성과 RTL을 지원하는 공통 사이트 스타일
|
|
11
11
|
|
|
12
|
-
카탈로그 생성은 의도적으로 엄격하다.
|
|
12
|
+
카탈로그 생성은 의도적으로 엄격하다. 레지스트리의 모든 로케일이 동일한 키와 이름 기반 placeholder를 가져야 하며 런타임 문구 폴백은 없다.
|
|
13
13
|
|
|
14
|
-
사이트맵은
|
|
14
|
+
사이트맵은 레지스트리 로케일마다 alternate 하나와 `x-default`를 출력한다.
|
|
15
15
|
`buildVerifiedJsonLd`는 검토된 schema type과 claim allowlist만 허용하고 모든
|
|
16
16
|
claim leaf가 검증된 사실 레지스트리를 참조하도록 강제한다. `buildRobots`의
|
|
17
17
|
기존 environment-only 출력은 유지되며, 선택적 `policies`로 검색 인덱싱,
|
|
18
18
|
인용 crawler, 모델 학습 crawler를 각각 제어할 수 있다.
|
|
19
|
+
|
|
20
|
+
## 제품 로케일
|
|
21
|
+
|
|
22
|
+
`LOCALES`는 **가족 목록**이다 — devslab.kr이 마케팅하는 14개 언어이자 모든
|
|
23
|
+
제품이 기본으로 받는 바닥. 모든 제품의 목록은 아니다. 가족이 갖지 않은
|
|
24
|
+
언어로 파는 제품은 레지스트리를 만든다:
|
|
25
|
+
|
|
26
|
+
```js
|
|
27
|
+
import { defineLocaleRegistry } from "@devslab/site-kit";
|
|
28
|
+
|
|
29
|
+
export const locales = defineLocaleRegistry({
|
|
30
|
+
extra: [
|
|
31
|
+
{ code: "ta", language: "Tamil", nativeName: "தமிழ்", dir: "ltr", flagCountry: "in" },
|
|
32
|
+
],
|
|
33
|
+
});
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
로케일을 다루는 헬퍼는 전부 이것을 받는다: `validateCatalogs(catalogs, "en", { registry })`,
|
|
37
|
+
`buildMetadata({ …, registry })`, `buildSitemap({ …, registry })`,
|
|
38
|
+
`localizedPath(path, locale, defaultLocale, registry)`,
|
|
39
|
+
`<SiteHeader localeRegistry={…}>`. 안 넘기면 가족 레지스트리이므로
|
|
40
|
+
`defineLocaleRegistry`를 부른 적 없는 소비자는 영향이 없다.
|
|
41
|
+
|
|
42
|
+
`flagCountry`는 이 패키지가 **이미 벤더링한** 나라를 지목해야 한다
|
|
43
|
+
(`FLAG_COUNTRY` 참조). 제품은 국기 아트워크를 싣지 않는다 — 라이선스가 있고,
|
|
44
|
+
생성되며, 여기서 스캔된다. 그리고 국기는 나라를 가리키지 언어를 가리키지
|
|
45
|
+
않으므로 인도 로케일 7개가 정당하게 `in`을 공유한다.
|
|
46
|
+
|
|
47
|
+
레지스트리는 전부 넘기거나 전혀 안 넘기거나다. 레지스트리로 그린 페이지의
|
|
48
|
+
메타데이터를 레지스트리 없이 만들면, 페이지는 타밀어로 렌더되면서 검색
|
|
49
|
+
엔진에는 타밀어가 없다고 말한다.
|
|
50
|
+
|
|
51
|
+
## 로케일 메뉴 variant
|
|
52
|
+
|
|
53
|
+
`LocaleMenu`는 기본으로 네이티브 `<select>`를 렌더링한다. `variant="flag"`는
|
|
54
|
+
트리거가 현재 로케일의 국기이고 행마다 국기 + 자국어 이름 링크인 `<details>`
|
|
55
|
+
디스클로저를 렌더링한다 — JavaScript 없이도 동작하며, Solid는 Escape로 닫기와
|
|
56
|
+
`onLocaleChange(locale, href)` 콜백을 더한다. `SiteHeader`는 `localeVariant`를
|
|
57
|
+
그대로 전달한다. 국기 데이터(`FLAG_COUNTRY`, `LOCALE_FLAGS`, `flagFor`)는
|
|
58
|
+
런타임 중립 `.` entry가 아니라 전용 서브패스 `@devslab/site-kit/flags`에서
|
|
59
|
+
export된다 — 벤더링한 아트워크가 SVG ~110 KB라 대부분의 소비자는 국기 메뉴를
|
|
60
|
+
렌더링하지 않기 때문이다. 아트워크는 flag-icons에서 벤더링했다(MIT,
|
|
61
|
+
`flags/LICENSE-flag-icons.txt`). 국기는 `dds-icons` 항목이 아니라 site-kit
|
|
62
|
+
데이터다 — 아이콘 세트의 계약이 단색 `currentColor` 스트로크를 요구하기
|
|
63
|
+
때문이다.
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @devslab/site-kit
|
|
2
2
|
|
|
3
|
-
Public product-site infrastructure for DevsLab products. It provides strict
|
|
3
|
+
Public product-site infrastructure for DevsLab products. It provides strict catalogs over the family locales (extensible per product), locale negotiation, SEO/GEO document builders, and accessible SolidJS 2 site shells. Product names, claims, navigation, and translated copy always remain in the consuming application.
|
|
4
4
|
|
|
5
5
|
## Entry points
|
|
6
6
|
|
|
@@ -9,10 +9,45 @@ Public product-site infrastructure for DevsLab products. It provides strict 14-l
|
|
|
9
9
|
- `@devslab/site-kit/tanstack-start` — conversion of neutral metadata to TanStack Start head descriptors.
|
|
10
10
|
- `@devslab/site-kit/styles.css` — logical-property, RTL-aware shared site styles.
|
|
11
11
|
|
|
12
|
-
Catalog construction is intentionally strict:
|
|
12
|
+
Catalog construction is intentionally strict: every locale in the registry must have exactly the same keys and named placeholders. There is no runtime copy fallback.
|
|
13
13
|
|
|
14
|
-
Sitemaps emit
|
|
14
|
+
Sitemaps emit one alternate per registry locale plus `x-default`. `buildVerifiedJsonLd`
|
|
15
15
|
accepts only the reviewed schema-type and claim allowlists, and every claim leaf
|
|
16
16
|
still references the verified-fact registry. `buildRobots` keeps its legacy
|
|
17
17
|
environment-only output, while an optional `policies` object can independently
|
|
18
18
|
control search indexing, citation crawlers, and model-training crawlers.
|
|
19
|
+
|
|
20
|
+
## Product locales
|
|
21
|
+
|
|
22
|
+
`LOCALES` is the family list — the fourteen languages devslab.kr markets in,
|
|
23
|
+
and the floor every product gets. It is not every product's list. A product
|
|
24
|
+
that sells in languages the family does not carry builds a registry:
|
|
25
|
+
|
|
26
|
+
```js
|
|
27
|
+
import { defineLocaleRegistry } from "@devslab/site-kit";
|
|
28
|
+
|
|
29
|
+
export const locales = defineLocaleRegistry({
|
|
30
|
+
extra: [
|
|
31
|
+
{ code: "ta", language: "Tamil", nativeName: "தமிழ்", dir: "ltr", flagCountry: "in" },
|
|
32
|
+
],
|
|
33
|
+
});
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Every locale-aware helper takes one: `validateCatalogs(catalogs, "en", { registry })`,
|
|
37
|
+
`buildMetadata({ …, registry })`, `buildSitemap({ …, registry })`,
|
|
38
|
+
`localizedPath(path, locale, defaultLocale, registry)`, and
|
|
39
|
+
`<SiteHeader localeRegistry={…}>`. Omit it and you get the family registry, so
|
|
40
|
+
a consumer that never calls `defineLocaleRegistry` is unaffected.
|
|
41
|
+
|
|
42
|
+
`flagCountry` must name a country this package already vendors — see
|
|
43
|
+
`FLAG_COUNTRY` for the list. Products do not ship flag artwork: it is
|
|
44
|
+
licensed, generated and scanned here, and a flag names a country, not a
|
|
45
|
+
language, so seven Indian locales legitimately share `in`.
|
|
46
|
+
|
|
47
|
+
Pass the registry everywhere or nowhere. A page built with the registry but
|
|
48
|
+
metadata built without it renders in Tamil while telling search engines Tamil
|
|
49
|
+
does not exist.
|
|
50
|
+
|
|
51
|
+
## Locale menu variants
|
|
52
|
+
|
|
53
|
+
`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 `@devslab/site-kit/flags`, a dedicated subpath — not the runtime-neutral `.` entry — because the vendored artwork is ~110 KB of SVG and most consumers never render a flag menu. 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.
|
package/dist/chrome.d.ts
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
import { type JSX } from "solid-js";
|
|
2
|
-
import { type
|
|
2
|
+
import { type LocaleMenuProps, type LocaleMenuVariant } from "./locale-menu";
|
|
3
|
+
import type { LocaleRegistry } from "../core/locales.mjs";
|
|
3
4
|
import type { LocaleState, SiteBrand, SiteLink, SiteMessages, ThemePreference } from "./types";
|
|
4
|
-
export
|
|
5
|
-
state: LocaleState;
|
|
6
|
-
messages: SiteMessages;
|
|
7
|
-
onLocaleChange?: (locale: SiteLocale, href: string) => void;
|
|
8
|
-
}
|
|
9
|
-
export declare function LocaleMenu(props: LocaleMenuProps): JSX.Element;
|
|
5
|
+
export type { LocaleMenuProps };
|
|
10
6
|
export interface ThemeToggleProps {
|
|
11
7
|
messages: SiteMessages;
|
|
12
8
|
value?: ThemePreference;
|
|
@@ -22,6 +18,13 @@ export interface SiteHeaderProps {
|
|
|
22
18
|
messages: SiteMessages;
|
|
23
19
|
theme?: Omit<ThemeToggleProps, "messages">;
|
|
24
20
|
onLocaleChange?: LocaleMenuProps["onLocaleChange"];
|
|
21
|
+
localeVariant?: LocaleMenuVariant;
|
|
22
|
+
/**
|
|
23
|
+
* The languages the picker offers. Defaults to the family's fourteen;
|
|
24
|
+
* pass the registry from `defineLocaleRegistry` if this product sells in
|
|
25
|
+
* languages the family does not carry.
|
|
26
|
+
*/
|
|
27
|
+
localeRegistry?: LocaleRegistry<string>;
|
|
25
28
|
actions?: JSX.Element;
|
|
26
29
|
}
|
|
27
30
|
export declare function SiteHeader(props: SiteHeaderProps): JSX.Element;
|
package/dist/chrome.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chrome.d.ts","sourceRoot":"","sources":["../src/solid/chrome.tsx"],"names":[],"mappings":"AACA,OAAO,EAA8B,KAAK,GAAG,EAAE,MAAM,UAAU,CAAC;AAEhE,OAAO,
|
|
1
|
+
{"version":3,"file":"chrome.d.ts","sourceRoot":"","sources":["../src/solid/chrome.tsx"],"names":[],"mappings":"AACA,OAAO,EAA8B,KAAK,GAAG,EAAE,MAAM,UAAU,CAAC;AAEhE,OAAO,EAAc,KAAK,eAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACzF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/F,YAAY,EAAE,eAAe,EAAE,CAAC;AAEhC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,YAAY,CAAC,EAAE,eAAe,CAAC;IAC/B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,eA0ClD;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,SAAS,CAAC;IACjB,UAAU,EAAE,QAAQ,EAAE,CAAC;IACvB,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;IAC3C,cAAc,CAAC,EAAE,eAAe,CAAC,gBAAgB,CAAC,CAAC;IACnD,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC;;;;OAIG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC;CACvB;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,eA2BhD;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,YAAY,CAAC;CACxB;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,eAUhD"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export { LocaleMenu,
|
|
1
|
+
export { LocaleMenu, type LocaleMenuProps, type LocaleMenuVariant } from "./locale-menu";
|
|
2
|
+
export { SiteFooter, SiteHeader, ThemeToggle, type SiteFooterProps, type SiteHeaderProps, type ThemeToggleProps } from "./chrome";
|
|
2
3
|
export { ErrorLayout, LegalLayout, MarketingShell, NotFoundLayout, StatusBanner, type ErrorLayoutProps, type LegalLayoutProps, type MarketingShellProps, type NotFoundLayoutProps, type StatusBannerProps } from "./layouts";
|
|
3
4
|
export { RequestAccessForm, type RequestAccessFormProps, type RequestAccessMessages } from "./request-access";
|
|
4
5
|
export { OssProductMark, type OssProductMarkProps } from "./oss-product-mark";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/solid/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/solid/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACzF,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAClI,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,KAAK,mBAAmB,EAAE,KAAK,mBAAmB,EAAE,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC7N,OAAO,EAAE,iBAAiB,EAAE,KAAK,sBAAsB,EAAE,KAAK,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC9G,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type JSX } from "solid-js";
|
|
2
|
+
import { type LocaleRegistry, type SiteLocale } from "../core/locales.mjs";
|
|
3
|
+
import type { LocaleState, SiteMessages } from "./types";
|
|
4
|
+
export type LocaleMenuVariant = "select" | "flag";
|
|
5
|
+
export interface LocaleMenuProps {
|
|
6
|
+
state: LocaleState;
|
|
7
|
+
messages: SiteMessages;
|
|
8
|
+
variant?: LocaleMenuVariant;
|
|
9
|
+
onLocaleChange?: (locale: SiteLocale, href: string) => void;
|
|
10
|
+
/**
|
|
11
|
+
* The languages to offer. Defaults to the family's fourteen; a product
|
|
12
|
+
* that added its own passes the registry it built with
|
|
13
|
+
* `defineLocaleRegistry`.
|
|
14
|
+
*/
|
|
15
|
+
registry?: LocaleRegistry<string>;
|
|
16
|
+
}
|
|
17
|
+
export declare function LocaleMenu(props: LocaleMenuProps): JSX.Element;
|
|
18
|
+
//# sourceMappingURL=locale-menu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locale-menu.d.ts","sourceRoot":"","sources":["../src/solid/locale-menu.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,GAAG,EAAE,MAAM,UAAU,CAAC;AAEzD,OAAO,EAAkB,KAAK,cAAc,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE3F,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEzD,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,MAAM,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5D;;;;OAIG;IACH,QAAQ,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;CACnC;AAoHD,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,eAEhD"}
|