diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml new file mode 100644 index 0000000..7278246 --- /dev/null +++ b/.github/workflows/pages.yml @@ -0,0 +1,50 @@ +name: Deploy site + +on: + push: + branches: [main] + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: true + +jobs: + deploy: + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - uses: actions/checkout@v5 + + - uses: actions/setup-node@v5 + with: + node-version: 22 + cache: npm + + - run: npm ci + - run: npm run build + + - name: Assemble site + run: | + mkdir -p _site + cp -r site/. _site/ + cp dist/numkey.global.js _site/ + cp dist/numkey.global.js.map _site/ + + - uses: actions/configure-pages@v5 + with: + enablement: true + + - uses: actions/upload-pages-artifact@v3 + with: + path: _site + + - id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore index 7e3789d..81187c4 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,6 @@ dist/ coverage/ *.log .DS_Store +# local demo copies — the Pages workflow assembles fresh ones from dist/ +site/numkey.global.js +site/numkey.global.js.map diff --git a/CHANGELOG.md b/CHANGELOG.md index f7ec2d3..595d149 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ Initial release. / 최초 릴리스. +- Opt-in locale formatting: `locale: 'auto' | 'de-DE' | …` / + `data-numkey-locale` derives separators via `Intl.NumberFormat`; without it + the display stays deterministic regardless of the visitor's browser. / + 옵트인 로케일 포맷팅 — 지정하지 않으면 브라우저와 무관하게 표시 고정. +- `setValue(el, canonical)` — programmatic canonical writes (the counterpart + of `getValue`). / 정식 값 프로그래매틱 기록. +- GitHub Pages demo site (`site/`, deployed on main push). / 데모 사이트. - Core: `parse` / `format` / `finalize` — string-first canonical value model (money-safe, no IEEE 754), thousands grouping, leading-zero cleanup, full-width digit normalization, custom group size / separator / diff --git a/README.ko.md b/README.ko.md index 0331b38..120250d 100644 --- a/README.ko.md +++ b/README.ko.md @@ -1,8 +1,10 @@ # numkey -[](https://www.npmjs.com/package/@devslab/numkey) +[English](README.md) | **한국어** · [라이브 데모](https://devslab-kr.github.io/numkey/) + +[](https://www.npmjs.com/package/@devslab/numkey) [](https://github.com/devslab-kr/numkey/actions/workflows/ci.yml) -[](./LICENSE) +[](./LICENSE) **"문자열인데 숫자야."** 업무 시스템엔 이런 필드가 꼭 있습니다 — 금액, 수량, 단가. 그리고 매번 같은 걸 손으로 다시 만들죠: 실시간 천 단위 콤마(`10,000`), @@ -58,6 +60,7 @@ numkey는 그 인풋을 한 번에 끝냅니다: | `data-numkey-group="4"` | 그룹 크기 (기본 3, 만 단위는 4) | | `data-numkey-separator=" "` | 그룹 구분자 (기본 `,`) | | `data-numkey-point=","` | 필드에 표시되는 소수점 (기본 `.`) | +| `data-numkey-locale="auto"` | 로케일에서 구분자 유도 — `"auto"`(브라우저 언어) 또는 `"de-DE"` 같은 BCP 47 태그 | > `type="text"` 인풋을 쓰세요. numkey가 `inputmode`를 설정해 모바일에서 숫자 > 키패드가 뜹니다. `type="number"`는 커서 API가 없어 포맷팅과 충돌합니다. @@ -121,6 +124,7 @@ const [amount, setAmount] = useState('') | `group` | `3` | 그룹당 자릿수 (만 단위 그룹핑은 4) | | `separator` | `","` | 표시용 그룹 구분자 | | `decimalPoint` | `"."` | 표시용 소수점 (정식 값은 항상 `.`) | +| `locale` | — | **옵트인**: `Intl`로 `separator`/`decimalPoint` 유도 — `"auto"`(브라우저 언어) 또는 BCP 47 태그. 지정하지 않으면 방문자 브라우저와 무관하게 표시가 고정됩니다 (업무 폼의 기본 요구). 명시한 `separator`/`decimalPoint`가 우선. | ### Core (순수 함수) @@ -137,6 +141,7 @@ const [amount, setAmount] = useState('') | `bind(el, opts?)` | 실시간 포맷팅 연결; 해제 함수 반환 | | `observe(root?)` | 현재/미래의 모든 `[data-numkey]` 바인딩 | | `getValue(el, opts?)` | 바인딩된 인풋의 정식 값 | +| `setValue(el, canonical, opts?)` | 정식 값을 포맷된 표시 값으로 기록 | | `applyToInput(el, opts?)` | 커서 보존 1회 재포맷 (빌딩 블록) | | `createRefBinder(opts?)` | 어떤 프레임워크에서든 쓰는 ref 콜백 팩토리 | diff --git a/README.md b/README.md index 9d05111..1168e7d 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,10 @@ # numkey -[](https://www.npmjs.com/package/@devslab/numkey) +**English** | [한국어](README.ko.md) · [Live demo](https://devslab-kr.github.io/numkey/) + +[](https://www.npmjs.com/package/@devslab/numkey) [](https://github.com/devslab-kr/numkey/actions/workflows/ci.yml) -[](./LICENSE) +[](./LICENSE) **"It's a string, but it's a number."** Every business app has these fields — amounts, quantities, prices — and every team rebuilds the same input by hand: @@ -60,6 +62,7 @@ value.) | `data-numkey-group="4"` | group size (default 3) | | `data-numkey-separator=" "` | group separator (default `,`) | | `data-numkey-point=","` | decimal mark shown in the field (default `.`) | +| `data-numkey-locale="auto"` | derive separators from a locale — `"auto"` (browser language) or a BCP 47 tag like `"de-DE"` | > Use `type="text"` inputs. numkey sets `inputmode` so mobile keyboards show > the numeric keypad; `type="number"` has no caret API and fights formatting. @@ -123,6 +126,7 @@ const [amount, setAmount] = useState('') | `group` | `3` | digits per group (4 for 만-style grouping) | | `separator` | `","` | group separator in the display | | `decimalPoint` | `"."` | decimal mark in the display (canonical always uses `.`) | +| `locale` | — | **opt-in**: derive `separator`/`decimalPoint` via `Intl` — `"auto"` (browser language) or a BCP 47 tag. Without it the display is deterministic no matter the visitor's browser, which is what business forms usually need. Explicit `separator`/`decimalPoint` win. | ### Core (pure functions) @@ -139,6 +143,7 @@ const [amount, setAmount] = useState('') | `bind(el, opts?)` | attach live formatting; returns an unbind function | | `observe(root?)` | bind all `[data-numkey]` now and as they appear | | `getValue(el, opts?)` | canonical value of a bound input | +| `setValue(el, canonical, opts?)` | write a canonical value as the formatted display | | `applyToInput(el, opts?)` | one caret-preserving reformat (building block) | | `createRefBinder(opts?)` | ref-callback factory for any framework | diff --git a/package.json b/package.json index 10e65fa..4b48287 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,7 @@ "type": "git", "url": "git+https://github.com/devslab-kr/numkey.git" }, - "homepage": "https://github.com/devslab-kr/numkey#readme", + "homepage": "https://devslab-kr.github.io/numkey/", "bugs": { "url": "https://github.com/devslab-kr/numkey/issues" }, diff --git a/site/index.html b/site/index.html index 2fc333e..2568189 100644 --- a/site/index.html +++ b/site/index.html @@ -3,37 +3,153 @@
-One script tag. Markup attributes. No build step.
- - +It's a string, but it's a number. — Numeric input formatting, done once.
+문자열인데 숫자인 필드 — 콤마·커서·정렬·앞자리 0, 한 번에 끝.
Canonical value of the first field: ?
+ By default the display is deterministic (1,234,567.89) no matter the visitor's
+ browser. Add data-numkey-locale only when you want locale separators.
+
<script src="https://cdn.jsdelivr.net/npm/@devslab/numkey"></script> + +<input data-numkey> <!-- 1,234,567 --> +<input data-numkey="2"> <!-- 1,234.56 --> +<input data-numkey data-numkey-negative> <!-- minus ok -->+
Vue 3 / React adapters and the full API: + README. + Wrong-keyboard-layout text in the same form? See numkey's sibling + kokey.
+