From 2fe19062833eb0eadfbd193619e29269a6bc77a2 Mon Sep 17 00:00:00 2001 From: Sin-Kang Date: Sun, 30 Aug 2026 19:54:21 +0900 Subject: [PATCH 1/2] feat: apply DevsLab OSS identity to numkey --- README.ko.md | 6 ++++ README.md | 6 ++++ docs/assets/brand/checksums.txt | 21 ++++++++++++++ docs/assets/brand/project-lockup.svg | 1 + docs/assets/brand/project-mark.svg | 1 + docs/assets/brand/readme-header.png | Bin 0 -> 9649 bytes package.json | 1 + scripts/check-brand-assets.mjs | 41 ++++++++++++++++++++++++++ site/apple-touch-icon.png | Bin 0 -> 1575 bytes site/favicon.ico | Bin 0 -> 15086 bytes site/favicon.svg | 1 + site/index.html | 42 ++++++++++++++++++++++----- site/og.png | Bin 0 -> 14195 bytes site/project-lockup.svg | 1 + 14 files changed, 114 insertions(+), 7 deletions(-) create mode 100644 docs/assets/brand/checksums.txt create mode 100644 docs/assets/brand/project-lockup.svg create mode 100644 docs/assets/brand/project-mark.svg create mode 100644 docs/assets/brand/readme-header.png create mode 100644 scripts/check-brand-assets.mjs create mode 100644 site/apple-touch-icon.png create mode 100644 site/favicon.ico create mode 100644 site/favicon.svg create mode 100644 site/og.png create mode 100644 site/project-lockup.svg diff --git a/README.ko.md b/README.ko.md index 4c1e24f..681a241 100644 --- a/README.ko.md +++ b/README.ko.md @@ -1,5 +1,11 @@ # numkey +

+ numkey - 묶인 숫자 단위를 가로지르는 안정된 캐럿 +

+ +Open source by [DevsLab](https://devslab.kr/brand/open-source/) + [![npm](https://img.shields.io/npm/v/%40devslab%2Fnumkey)](https://www.npmjs.com/package/@devslab/numkey) [![CI](https://github.com/devslab-kr/numkey/actions/workflows/ci.yml/badge.svg)](https://github.com/devslab-kr/numkey/actions/workflows/ci.yml) ![TypeScript](https://img.shields.io/badge/TypeScript-Ready-3178C6?logo=typescript&logoColor=white) diff --git a/README.md b/README.md index 4b3a7b5..bc0ef37 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,11 @@ # numkey +

+ numkey - a stable caret across grouped numeric units +

+ +Open source by [DevsLab](https://devslab.kr/brand/open-source/) + [![npm](https://img.shields.io/npm/v/%40devslab%2Fnumkey)](https://www.npmjs.com/package/@devslab/numkey) [![CI](https://github.com/devslab-kr/numkey/actions/workflows/ci.yml/badge.svg)](https://github.com/devslab-kr/numkey/actions/workflows/ci.yml) ![TypeScript](https://img.shields.io/badge/TypeScript-Ready-3178C6?logo=typescript&logoColor=white) diff --git a/docs/assets/brand/checksums.txt b/docs/assets/brand/checksums.txt new file mode 100644 index 0000000..80fb0a7 --- /dev/null +++ b/docs/assets/brand/checksums.txt @@ -0,0 +1,21 @@ +298658c5507dd8acacfa0b2c26b0cd00b612f0932698e4223f0a8a97957fafed apple-touch-icon.png +4205e96a25955ce59c730fd380e45db18b153e152424661df1822ed296ccaf1c favicon.ico +4ec733f9542323f6d2840ba743c4a11df4d416a7efa1d214567d62b58653619b favicon.svg +4ec733f9542323f6d2840ba743c4a11df4d416a7efa1d214567d62b58653619b glyph-color.svg +03f6342931d1660554b44bb5704aeb4639fa5fb6d12dbf6286418ecfaeddc654 glyph-monochrome.svg +dc08a6ba51a2a8e9cb82d56f900ef2de9330ac72fbb3c727e0436a4ab2f3944f glyph-reversed.svg +f5cba92cab71ae542c297205daca2f50bf7a64279da964a0239f85b062b7e36d icons/icon-16.png +298658c5507dd8acacfa0b2c26b0cd00b612f0932698e4223f0a8a97957fafed icons/icon-180.png +8e9148efe85095d304c182fe0fe3fa2a2b44bcfe2a4e26077c21947baf92be96 icons/icon-192.png +3c696ba85751c9a9e805141adf07242f495d8ffc115b2477074862a3843a19fa icons/icon-32.png +bfa28751bd6e26e47dfb8458a23d309082bb7db6e293957438ac02fdd4af0fa8 icons/icon-48.png +3004387fcbc066076f70f383e74e11e9a94f6cd771e032ca8ff993daede614dc icons/icon-512.png +905cf0a05ab5d3787bc02ff7d4591bfa020d72aefdd0e0d0c53271da6d3f383c lockup-endorsed.svg +ee4822f0054f88b5a386dc53d5034af1577309b0425e78ed2af85167e8467aa2 lockup.svg +90062f969fca1da22b05ec5d3f92bbc0f46e736b473351078e54317df19c41be maskable-192.png +18b8c7957b532b78ef631fca894a245bc4bd1eb7a36255e6ec1a7da857b698c0 maskable-512.png +affd93edb1d511780bad26de47cc673a5e93014967916029dd8db68ef9ec394e og.png +8e9148efe85095d304c182fe0fe3fa2a2b44bcfe2a4e26077c21947baf92be96 pwa-192.png +3004387fcbc066076f70f383e74e11e9a94f6cd771e032ca8ff993daede614dc pwa-512.png +481391d02b1f50ed6dba1790c0899bcc7d16948421bba66778756a89921b5dbb readme-header.png +27a520d8daf6752076ac90d52b611034af0d2e29a8167e3e1ef7d4f0246b52e9 wordmark.svg diff --git a/docs/assets/brand/project-lockup.svg b/docs/assets/brand/project-lockup.svg new file mode 100644 index 0000000..906db47 --- /dev/null +++ b/docs/assets/brand/project-lockup.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/assets/brand/project-mark.svg b/docs/assets/brand/project-mark.svg new file mode 100644 index 0000000..e7b2f73 --- /dev/null +++ b/docs/assets/brand/project-mark.svg @@ -0,0 +1 @@ +numkey \ No newline at end of file diff --git a/docs/assets/brand/readme-header.png b/docs/assets/brand/readme-header.png new file mode 100644 index 0000000000000000000000000000000000000000..bf795f963ef9eb3f521ea9413f15207e0587cb06 GIT binary patch literal 9649 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 at0+n5p(^X9K^?&co-wmB%|GdS=l=i{;~01V literal 0 HcmV?d00001 diff --git a/package.json b/package.json index 4d21668..bbcb204 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "sideEffects": false, "scripts": { "build": "tsup", + "check:brand": "node scripts/check-brand-assets.mjs", "typecheck": "tsc --noEmit", "test": "vitest run", "test:watch": "vitest", diff --git a/scripts/check-brand-assets.mjs b/scripts/check-brand-assets.mjs new file mode 100644 index 0000000..9a3d1b9 --- /dev/null +++ b/scripts/check-brand-assets.mjs @@ -0,0 +1,41 @@ +import { createHash } from 'node:crypto' +import { readFile } from 'node:fs/promises' +import { resolve } from 'node:path' +import assert from 'node:assert/strict' + +const root = resolve(import.meta.dirname, '..') +const read = (file) => readFile(resolve(root, file), 'utf8') +const hash = async (file) => createHash('sha256').update(await readFile(resolve(root, file))).digest('hex') + +const assets = { + 'docs/assets/brand/project-mark.svg': '4ec733f9542323f6d2840ba743c4a11df4d416a7efa1d214567d62b58653619b', + 'docs/assets/brand/project-lockup.svg': '905cf0a05ab5d3787bc02ff7d4591bfa020d72aefdd0e0d0c53271da6d3f383c', + 'docs/assets/brand/readme-header.png': '481391d02b1f50ed6dba1790c0899bcc7d16948421bba66778756a89921b5dbb', + 'site/favicon.svg': '4ec733f9542323f6d2840ba743c4a11df4d416a7efa1d214567d62b58653619b', + 'site/favicon.ico': '4205e96a25955ce59c730fd380e45db18b153e152424661df1822ed296ccaf1c', + 'site/apple-touch-icon.png': '298658c5507dd8acacfa0b2c26b0cd00b612f0932698e4223f0a8a97957fafed', + 'site/og.png': 'affd93edb1d511780bad26de47cc673a5e93014967916029dd8db68ef9ec394e', + 'site/project-lockup.svg': '905cf0a05ab5d3787bc02ff7d4591bfa020d72aefdd0e0d0c53271da6d3f383c', +} + +for (const [file, expected] of Object.entries(assets)) { + assert.equal(await hash(file), expected, `${file} must be the approved O04 asset`) +} + +const preview = 'https://raw.githubusercontent.com/devslab-kr/numkey/main/docs/preview.png' +for (const file of ['README.md', 'README.ko.md']) { + const content = await read(file) + assert.match(content, /Open source by \[DevsLab\]\(https:\/\/devslab\.kr\/brand\/open-source\/\)/, `${file} needs the DevsLab endorsement`) + assert.match(content, /docs\/assets\/brand\/readme-header\.png/, `${file} needs the O04 README header`) + assert.match(content, new RegExp(preview.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')), `${file} must retain the preview reference`) +} + +const site = await read('site/index.html') +assert.match(site, /src="project-lockup\.svg"/, 'site must use the O04 lockup') +assert.match(await read('site/project-lockup.svg'), /data-oss-lockup="O04"/, 'site lockup must identify O04') +assert.match(site, /rel="canonical" href="https:\/\/devslab-kr\.github\.io\/numkey\/"/, 'site needs a canonical URL') +assert.match(site, /property="og:title" content="numkey/, 'site needs an Open Graph title') +assert.match(site, /property="og:image" content="https:\/\/devslab-kr\.github\.io\/numkey\/og\.png"/, 'site needs the O04 Open Graph image') +assert.match(site, /name="twitter:card" content="summary_large_image"/, 'site needs a Twitter card') + +console.log(`Verified ${Object.keys(assets).length} approved O04 assets and numkey brand surfaces.`) diff --git a/site/apple-touch-icon.png b/site/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..46d81b04dcc238d1a4098451421dc78b0c001f0f GIT binary patch literal 1575 zcmbtUc`zGj6i;WnA(S3ky_{`{YMo&;Y5o+s*P!zSXyR-l7bpP3J=J&lf-}l~ce)Ha&7iVW{AtiA}0ssI= zp)AcEM7C-l;y}?2?*{6M3Y+67=M z^=wAI!E+^_^9MCBVyU&bqvD#kYQzHuJo!c`rpW2n(LV|&43*zp25JO39zSUR^P^o5 z=!4N%jYL<>FTll|ibDZ8b3MWdK@Q3I_LVEiC%1USW+ERp$E3R-7OD95@rYkb=wBK& z4GJzPD0y?NIeF3%(vc8#$?);7MZ~BDzMJ(XCp0M@Ag4fe)e0S_CFDz;y_ED!d>-~G z>9I^j2EaOii0Y#NS%w`p_D!exfN%qhQ**LgfD}Db1sgwlrzw&l^b8QNYM;YsR%b@9 zuQtxMYJ!h!criHViPgsK`o0!~qIt5tJN1E~)q@M|-f)XbKWO|aiNR43+9PNpMXGu% zkOt&W>>01EnMG=k4VcI6g~$-9)QR@YQk_BqS%NXH85mUlO0bg9-O+ZI}<#86!zH|K)&v9`5Vidwc! zN65K5u={MVY#4$u4R0k`Z_8{UwvfSoJOqEH9^W$S(o(bJKadu7js;GKPFOeOuWk24 zE#Ps8b}lsBB*(SDoq<2LH`2(VD>84)zs2yYzv8#_MLpE=EOhWk&1=53nQzD|(Fh#5 zqZ;V$5DP*)8$R-d)+2i6=4p05^S!n0H7EMY&c$;74p>BpKZm-Vkv-&8Tw}jXoqT%x>3ynww^9 z2!^nP=WJH?u%Bptu|u53-eT`kL*EU%a?L zC+};I#|^JyazPt4nC?Zs=W=S+RnhB$58S<|joLIAMbL}sJFg!N+uRO(=ew?;2y|J7 xttnVC$vR{5Z8N>VN2PzS#&0iD0N`QC%E_jmRKR7$qhkAUsB5<7B?ynle*kBN;Y|Pl literal 0 HcmV?d00001 diff --git a/site/favicon.ico b/site/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..6ca6a49026c376af213830410f62f725055588aa GIT binary patch literal 15086 zcmeHOziSjh6rLC%pzd9oh+VD`>`Z0s5>jaCKcHY~8}}NUoIyw<{O1RKF72ZsM%iOh&`_ZL2^83iXl<%{MG31^%FI{}|r>E#0z+D#B&)PD#eeWLbD_PH5KlNc_%dh=LOe=;q-bUVh z{H_E!SkD`eYX60JsYteY^G&?|;k!w^qfEv!*Key$o)?>qD_>;)Z8c1?e)`M~_dn~l zoUXh}Z7w!0`C2V?jy`W6hVe*e&c)YeGmItPv+K4lHoA{K9@M@gV}-h3+sU&A8BfoN zv5O6CO=zth*Nz-(aH-A3##A?RskP@^gRIR(x7BIl`Tl^Or@xSKH~m@{W14#pospik z>}K6dMSXu6`%e30v+1p)=1?aN;}A3MrK0X1y znED#ZP`~Xy*;GHT!Di2MWjbv2k6UBb{a>_w)^%jP{uFJWxqf_qlmzqCZ}W{^pT#=I zu{Z618Q&Ju#=H1R8>zd*)a|SK<6YDH6Q7Mn(njhgTjr#V)OoJzKX+kt==~YZj5KK@ z^^rwflQvRkt0Ma^bDfqR??n2j=D}VuE;0I5C`jX!RUX> J*wVd^e*lBUnhgK| literal 0 HcmV?d00001 diff --git a/site/favicon.svg b/site/favicon.svg new file mode 100644 index 0000000..e7b2f73 --- /dev/null +++ b/site/favicon.svg @@ -0,0 +1 @@ +numkey \ No newline at end of file diff --git a/site/index.html b/site/index.html index d46ec52..01b766f 100644 --- a/site/index.html +++ b/site/index.html @@ -3,17 +3,31 @@ -numkey — numeric input formatting. One script tag. - +numkey: numeric input formatting for real forms + + + + + + + + + + + + + + + -

numkey

-

It's a string, but it's a number. — Numeric input formatting, done once.
-문자열인데 숫자인 필드 — 콤마·커서·정렬·앞자리 0, 한 번에 끝.

+
+ +
+ numkey, Open source by DevsLab +

numkey

+

It's a string, but it's a number. Numeric input formatting, done once.
+ 문자열인데 숫자인 필드. 콤마·커서·정렬·앞자리 0, 한 번에 끝.

+
+