raqam 0.2.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.
Files changed (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +344 -0
  3. package/dist/chunk-IG7CVIA2.js +14 -0
  4. package/dist/chunk-IG7CVIA2.js.map +1 -0
  5. package/dist/chunk-NBAZIJ5W.js +25 -0
  6. package/dist/chunk-NBAZIJ5W.js.map +1 -0
  7. package/dist/chunk-NSFX2EAT.js +14 -0
  8. package/dist/chunk-NSFX2EAT.js.map +1 -0
  9. package/dist/chunk-NTROGAES.js +14 -0
  10. package/dist/chunk-NTROGAES.js.map +1 -0
  11. package/dist/chunk-VOBTYII2.js +14 -0
  12. package/dist/chunk-VOBTYII2.js.map +1 -0
  13. package/dist/chunk-WTS5RY7S.js +16 -0
  14. package/dist/chunk-WTS5RY7S.js.map +1 -0
  15. package/dist/core.cjs +2 -0
  16. package/dist/core.cjs.map +1 -0
  17. package/dist/core.d.cts +351 -0
  18. package/dist/core.d.ts +351 -0
  19. package/dist/core.js +2 -0
  20. package/dist/core.js.map +1 -0
  21. package/dist/index-B8X3-9h1.d.cts +343 -0
  22. package/dist/index-B8X3-9h1.d.ts +343 -0
  23. package/dist/index.cjs +3 -0
  24. package/dist/index.cjs.map +1 -0
  25. package/dist/index.d.cts +193 -0
  26. package/dist/index.d.ts +193 -0
  27. package/dist/index.js +3 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/locales/ar.cjs +36 -0
  30. package/dist/locales/ar.cjs.map +1 -0
  31. package/dist/locales/ar.d.cts +4 -0
  32. package/dist/locales/ar.d.ts +4 -0
  33. package/dist/locales/ar.js +4 -0
  34. package/dist/locales/ar.js.map +1 -0
  35. package/dist/locales/bn.cjs +36 -0
  36. package/dist/locales/bn.cjs.map +1 -0
  37. package/dist/locales/bn.d.cts +4 -0
  38. package/dist/locales/bn.d.ts +4 -0
  39. package/dist/locales/bn.js +4 -0
  40. package/dist/locales/bn.js.map +1 -0
  41. package/dist/locales/fa.cjs +38 -0
  42. package/dist/locales/fa.cjs.map +1 -0
  43. package/dist/locales/fa.d.cts +4 -0
  44. package/dist/locales/fa.d.ts +4 -0
  45. package/dist/locales/fa.js +4 -0
  46. package/dist/locales/fa.js.map +1 -0
  47. package/dist/locales/hi.cjs +36 -0
  48. package/dist/locales/hi.cjs.map +1 -0
  49. package/dist/locales/hi.d.cts +4 -0
  50. package/dist/locales/hi.d.ts +4 -0
  51. package/dist/locales/hi.js +4 -0
  52. package/dist/locales/hi.js.map +1 -0
  53. package/dist/locales/index.cjs +78 -0
  54. package/dist/locales/index.cjs.map +1 -0
  55. package/dist/locales/index.d.cts +5 -0
  56. package/dist/locales/index.d.ts +5 -0
  57. package/dist/locales/index.js +8 -0
  58. package/dist/locales/index.js.map +1 -0
  59. package/dist/locales/th.cjs +36 -0
  60. package/dist/locales/th.cjs.map +1 -0
  61. package/dist/locales/th.d.cts +4 -0
  62. package/dist/locales/th.d.ts +4 -0
  63. package/dist/locales/th.js +4 -0
  64. package/dist/locales/th.js.map +1 -0
  65. package/dist/react.cjs +3 -0
  66. package/dist/react.cjs.map +1 -0
  67. package/dist/react.d.cts +3 -0
  68. package/dist/react.d.ts +3 -0
  69. package/dist/react.js +3 -0
  70. package/dist/react.js.map +1 -0
  71. package/package.json +170 -0
@@ -0,0 +1,36 @@
1
+ 'use strict';
2
+
3
+ // src/core/normalizer.ts
4
+ var BUILTIN_DIGIT_BLOCKS = [
5
+ [1632, 1641],
6
+ // Arabic-Indic (arab)
7
+ [1776, 1785],
8
+ // Extended Arabic-Indic / Persian (arabext)
9
+ [2406, 2415],
10
+ // Devanagari / Hindi (deva)
11
+ [2534, 2543],
12
+ // Bengali (beng)
13
+ [3664, 3673]
14
+ // Thai (thai)
15
+ ];
16
+ var registeredBlocks = [...BUILTIN_DIGIT_BLOCKS];
17
+ function registerLocale(config) {
18
+ if (!config.digitBlocks) return;
19
+ for (const block of config.digitBlocks) {
20
+ const already = registeredBlocks.some(([s]) => s === block[0]);
21
+ if (!already) registeredBlocks.push(block);
22
+ }
23
+ }
24
+
25
+ // src/locales/ar.ts
26
+ registerLocale({
27
+ digitBlocks: [
28
+ [1632, 1641]
29
+ // Arabic-Indic ٠–٩
30
+ ]
31
+ });
32
+ var LOCALE_CODES = ["ar", "ar-EG", "ar-SA", "ar-MA", "ar-DZ", "ar-TN"];
33
+
34
+ exports.LOCALE_CODES = LOCALE_CODES;
35
+ //# sourceMappingURL=ar.cjs.map
36
+ //# sourceMappingURL=ar.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/normalizer.ts","../../src/locales/ar.ts"],"names":[],"mappings":";;;AAMA,IAAM,oBAAA,GAAqC;AAAA,EACzC,CAAC,MAAQ,IAAM,CAAA;AAAA;AAAA,EACf,CAAC,MAAQ,IAAM,CAAA;AAAA;AAAA,EACf,CAAC,MAAQ,IAAM,CAAA;AAAA;AAAA,EACf,CAAC,MAAQ,IAAM,CAAA;AAAA;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA;AACjB,CAAA;AAGA,IAAM,gBAAA,GAAiC,CAAC,GAAG,oBAAoB,CAAA;AAaxD,SAAS,eAAe,MAAA,EAA4B;AACzD,EAAA,IAAI,CAAC,OAAO,WAAA,EAAa;AACzB,EAAA,KAAA,MAAW,KAAA,IAAS,OAAO,WAAA,EAAa;AACtC,IAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA,KAAM,CAAA,KAAM,KAAA,CAAM,CAAC,CAAC,CAAA;AAC7D,IAAA,IAAI,CAAC,OAAA,EAAS,gBAAA,CAAiB,IAAA,CAAK,KAAK,CAAA;AAAA,EAC3C;AACF;;;ACxBA,cAAA,CAAe;AAAA,EACb,WAAA,EAAa;AAAA,IACX,CAAC,MAAQ,IAAM;AAAA;AAAA;AAEnB,CAAC,CAAA;AAGM,IAAM,eAAe,CAAC,IAAA,EAAM,SAAS,OAAA,EAAS,OAAA,EAAS,SAAS,OAAO","file":"ar.cjs","sourcesContent":["import type { DigitBlock } from \"./types.js\";\n\n// ── Built-in digit blocks ────────────────────────────────────────────────────\n// These cover the digit systems required by the spec.\n// Additional blocks can be registered via registerLocale().\n\nconst BUILTIN_DIGIT_BLOCKS: DigitBlock[] = [\n [0x0660, 0x0669], // Arabic-Indic (arab)\n [0x06f0, 0x06f9], // Extended Arabic-Indic / Persian (arabext)\n [0x0966, 0x096f], // Devanagari / Hindi (deva)\n [0x09e6, 0x09ef], // Bengali (beng)\n [0x0e50, 0x0e59], // Thai (thai)\n];\n\n// Mutable registry — locale plugins can add blocks here\nconst registeredBlocks: DigitBlock[] = [...BUILTIN_DIGIT_BLOCKS];\n\n// ── Public API ────────────────────────────────────────────────────────────────\n\nexport interface LocaleConfig {\n /** Extra digit block ranges to register */\n digitBlocks?: DigitBlock[];\n}\n\n/**\n * Register additional digit blocks (called by locale plugins as a side effect).\n * Duplicate ranges are silently ignored.\n */\nexport function registerLocale(config: LocaleConfig): void {\n if (!config.digitBlocks) return;\n for (const block of config.digitBlocks) {\n const already = registeredBlocks.some(([s]) => s === block[0]);\n if (!already) registeredBlocks.push(block);\n }\n}\n\n/**\n * Normalise any Unicode decimal digit in `input` to its ASCII equivalent (0–9).\n * Non-digit characters pass through unchanged.\n */\nexport function normalizeDigits(input: string): string {\n // Fast path: if there are no non-ASCII chars, return as-is\n if (!/[^\\u0020-\\u007e]/.test(input)) return input;\n\n return input.replace(/\\p{Nd}/gu, (ch) => {\n const code = ch.codePointAt(0)!;\n for (const [start, end] of registeredBlocks) {\n if (code >= start && code <= end) {\n return String(code - start);\n }\n }\n // Fallback: let JS try to parse it as a decimal digit\n const digit = Number.parseInt(ch, 10);\n return Number.isNaN(digit) ? ch : String(digit);\n });\n}\n\n/**\n * Returns true if the character is a non-Latin Unicode decimal digit\n * (i.e. would need normalization).\n */\nexport function isNonLatinDigit(ch: string): boolean {\n const code = ch.codePointAt(0);\n if (code === undefined) return false;\n if (code >= 0x30 && code <= 0x39) return false; // ASCII 0-9\n for (const [start, end] of registeredBlocks) {\n if (code >= start && code <= end) return true;\n }\n return false;\n}\n","/**\n * Arabic (ar) locale plugin.\n *\n * Registers Arabic-Indic digit block (U+0660–U+0669).\n *\n * Usage:\n * import 'raqam/locales/ar'\n */\nimport { registerLocale } from \"../core/normalizer.js\";\n\nregisterLocale({\n digitBlocks: [\n [0x0660, 0x0669], // Arabic-Indic ٠–٩\n ],\n});\n\n/** BCP 47 locale tags that this plugin covers. */\nexport const LOCALE_CODES = [\"ar\", \"ar-EG\", \"ar-SA\", \"ar-MA\", \"ar-DZ\", \"ar-TN\"] as const;\n"]}
@@ -0,0 +1,4 @@
1
+ /** BCP 47 locale tags that this plugin covers. */
2
+ declare const LOCALE_CODES: readonly ["ar", "ar-EG", "ar-SA", "ar-MA", "ar-DZ", "ar-TN"];
3
+
4
+ export { LOCALE_CODES };
@@ -0,0 +1,4 @@
1
+ /** BCP 47 locale tags that this plugin covers. */
2
+ declare const LOCALE_CODES: readonly ["ar", "ar-EG", "ar-SA", "ar-MA", "ar-DZ", "ar-TN"];
3
+
4
+ export { LOCALE_CODES };
@@ -0,0 +1,4 @@
1
+ export { LOCALE_CODES } from '../chunk-IG7CVIA2.js';
2
+ import '../chunk-NBAZIJ5W.js';
3
+ //# sourceMappingURL=ar.js.map
4
+ //# sourceMappingURL=ar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"ar.js"}
@@ -0,0 +1,36 @@
1
+ 'use strict';
2
+
3
+ // src/core/normalizer.ts
4
+ var BUILTIN_DIGIT_BLOCKS = [
5
+ [1632, 1641],
6
+ // Arabic-Indic (arab)
7
+ [1776, 1785],
8
+ // Extended Arabic-Indic / Persian (arabext)
9
+ [2406, 2415],
10
+ // Devanagari / Hindi (deva)
11
+ [2534, 2543],
12
+ // Bengali (beng)
13
+ [3664, 3673]
14
+ // Thai (thai)
15
+ ];
16
+ var registeredBlocks = [...BUILTIN_DIGIT_BLOCKS];
17
+ function registerLocale(config) {
18
+ if (!config.digitBlocks) return;
19
+ for (const block of config.digitBlocks) {
20
+ const already = registeredBlocks.some(([s]) => s === block[0]);
21
+ if (!already) registeredBlocks.push(block);
22
+ }
23
+ }
24
+
25
+ // src/locales/bn.ts
26
+ registerLocale({
27
+ digitBlocks: [
28
+ [2534, 2543]
29
+ // Bengali ০–৯
30
+ ]
31
+ });
32
+ var LOCALE_CODES = ["bn", "bn-BD", "bn-IN"];
33
+
34
+ exports.LOCALE_CODES = LOCALE_CODES;
35
+ //# sourceMappingURL=bn.cjs.map
36
+ //# sourceMappingURL=bn.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/normalizer.ts","../../src/locales/bn.ts"],"names":[],"mappings":";;;AAMA,IAAM,oBAAA,GAAqC;AAAA,EACzC,CAAC,MAAQ,IAAM,CAAA;AAAA;AAAA,EACf,CAAC,MAAQ,IAAM,CAAA;AAAA;AAAA,EACf,CAAC,MAAQ,IAAM,CAAA;AAAA;AAAA,EACf,CAAC,MAAQ,IAAM,CAAA;AAAA;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA;AACjB,CAAA;AAGA,IAAM,gBAAA,GAAiC,CAAC,GAAG,oBAAoB,CAAA;AAaxD,SAAS,eAAe,MAAA,EAA4B;AACzD,EAAA,IAAI,CAAC,OAAO,WAAA,EAAa;AACzB,EAAA,KAAA,MAAW,KAAA,IAAS,OAAO,WAAA,EAAa;AACtC,IAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA,KAAM,CAAA,KAAM,KAAA,CAAM,CAAC,CAAC,CAAA;AAC7D,IAAA,IAAI,CAAC,OAAA,EAAS,gBAAA,CAAiB,IAAA,CAAK,KAAK,CAAA;AAAA,EAC3C;AACF;;;ACxBA,cAAA,CAAe;AAAA,EACb,WAAA,EAAa;AAAA,IACX,CAAC,MAAQ,IAAM;AAAA;AAAA;AAEnB,CAAC,CAAA;AAGM,IAAM,YAAA,GAAe,CAAC,IAAA,EAAM,OAAA,EAAS,OAAO","file":"bn.cjs","sourcesContent":["import type { DigitBlock } from \"./types.js\";\n\n// ── Built-in digit blocks ────────────────────────────────────────────────────\n// These cover the digit systems required by the spec.\n// Additional blocks can be registered via registerLocale().\n\nconst BUILTIN_DIGIT_BLOCKS: DigitBlock[] = [\n [0x0660, 0x0669], // Arabic-Indic (arab)\n [0x06f0, 0x06f9], // Extended Arabic-Indic / Persian (arabext)\n [0x0966, 0x096f], // Devanagari / Hindi (deva)\n [0x09e6, 0x09ef], // Bengali (beng)\n [0x0e50, 0x0e59], // Thai (thai)\n];\n\n// Mutable registry — locale plugins can add blocks here\nconst registeredBlocks: DigitBlock[] = [...BUILTIN_DIGIT_BLOCKS];\n\n// ── Public API ────────────────────────────────────────────────────────────────\n\nexport interface LocaleConfig {\n /** Extra digit block ranges to register */\n digitBlocks?: DigitBlock[];\n}\n\n/**\n * Register additional digit blocks (called by locale plugins as a side effect).\n * Duplicate ranges are silently ignored.\n */\nexport function registerLocale(config: LocaleConfig): void {\n if (!config.digitBlocks) return;\n for (const block of config.digitBlocks) {\n const already = registeredBlocks.some(([s]) => s === block[0]);\n if (!already) registeredBlocks.push(block);\n }\n}\n\n/**\n * Normalise any Unicode decimal digit in `input` to its ASCII equivalent (0–9).\n * Non-digit characters pass through unchanged.\n */\nexport function normalizeDigits(input: string): string {\n // Fast path: if there are no non-ASCII chars, return as-is\n if (!/[^\\u0020-\\u007e]/.test(input)) return input;\n\n return input.replace(/\\p{Nd}/gu, (ch) => {\n const code = ch.codePointAt(0)!;\n for (const [start, end] of registeredBlocks) {\n if (code >= start && code <= end) {\n return String(code - start);\n }\n }\n // Fallback: let JS try to parse it as a decimal digit\n const digit = Number.parseInt(ch, 10);\n return Number.isNaN(digit) ? ch : String(digit);\n });\n}\n\n/**\n * Returns true if the character is a non-Latin Unicode decimal digit\n * (i.e. would need normalization).\n */\nexport function isNonLatinDigit(ch: string): boolean {\n const code = ch.codePointAt(0);\n if (code === undefined) return false;\n if (code >= 0x30 && code <= 0x39) return false; // ASCII 0-9\n for (const [start, end] of registeredBlocks) {\n if (code >= start && code <= end) return true;\n }\n return false;\n}\n","/**\n * Bengali (bn-BD / bn-IN) locale plugin.\n *\n * Registers Bengali digit block (U+09E6–U+09EF).\n *\n * Usage:\n * import 'raqam/locales/bn'\n */\nimport { registerLocale } from \"../core/normalizer.js\";\n\nregisterLocale({\n digitBlocks: [\n [0x09e6, 0x09ef], // Bengali ০–৯\n ],\n});\n\n/** BCP 47 locale tags that this plugin covers. */\nexport const LOCALE_CODES = [\"bn\", \"bn-BD\", \"bn-IN\"] as const;\n"]}
@@ -0,0 +1,4 @@
1
+ /** BCP 47 locale tags that this plugin covers. */
2
+ declare const LOCALE_CODES: readonly ["bn", "bn-BD", "bn-IN"];
3
+
4
+ export { LOCALE_CODES };
@@ -0,0 +1,4 @@
1
+ /** BCP 47 locale tags that this plugin covers. */
2
+ declare const LOCALE_CODES: readonly ["bn", "bn-BD", "bn-IN"];
3
+
4
+ export { LOCALE_CODES };
@@ -0,0 +1,4 @@
1
+ export { LOCALE_CODES } from '../chunk-NTROGAES.js';
2
+ import '../chunk-NBAZIJ5W.js';
3
+ //# sourceMappingURL=bn.js.map
4
+ //# sourceMappingURL=bn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"bn.js"}
@@ -0,0 +1,38 @@
1
+ 'use strict';
2
+
3
+ // src/core/normalizer.ts
4
+ var BUILTIN_DIGIT_BLOCKS = [
5
+ [1632, 1641],
6
+ // Arabic-Indic (arab)
7
+ [1776, 1785],
8
+ // Extended Arabic-Indic / Persian (arabext)
9
+ [2406, 2415],
10
+ // Devanagari / Hindi (deva)
11
+ [2534, 2543],
12
+ // Bengali (beng)
13
+ [3664, 3673]
14
+ // Thai (thai)
15
+ ];
16
+ var registeredBlocks = [...BUILTIN_DIGIT_BLOCKS];
17
+ function registerLocale(config) {
18
+ if (!config.digitBlocks) return;
19
+ for (const block of config.digitBlocks) {
20
+ const already = registeredBlocks.some(([s]) => s === block[0]);
21
+ if (!already) registeredBlocks.push(block);
22
+ }
23
+ }
24
+
25
+ // src/locales/fa.ts
26
+ registerLocale({
27
+ digitBlocks: [
28
+ [1776, 1785],
29
+ // Extended Arabic-Indic (Persian) ۰–۹
30
+ [1632, 1641]
31
+ // Arabic-Indic ٠–٩
32
+ ]
33
+ });
34
+ var LOCALE_CODES = ["fa", "fa-IR", "fa-AF"];
35
+
36
+ exports.LOCALE_CODES = LOCALE_CODES;
37
+ //# sourceMappingURL=fa.cjs.map
38
+ //# sourceMappingURL=fa.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/normalizer.ts","../../src/locales/fa.ts"],"names":[],"mappings":";;;AAMA,IAAM,oBAAA,GAAqC;AAAA,EACzC,CAAC,MAAQ,IAAM,CAAA;AAAA;AAAA,EACf,CAAC,MAAQ,IAAM,CAAA;AAAA;AAAA,EACf,CAAC,MAAQ,IAAM,CAAA;AAAA;AAAA,EACf,CAAC,MAAQ,IAAM,CAAA;AAAA;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA;AACjB,CAAA;AAGA,IAAM,gBAAA,GAAiC,CAAC,GAAG,oBAAoB,CAAA;AAaxD,SAAS,eAAe,MAAA,EAA4B;AACzD,EAAA,IAAI,CAAC,OAAO,WAAA,EAAa;AACzB,EAAA,KAAA,MAAW,KAAA,IAAS,OAAO,WAAA,EAAa;AACtC,IAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA,KAAM,CAAA,KAAM,KAAA,CAAM,CAAC,CAAC,CAAA;AAC7D,IAAA,IAAI,CAAC,OAAA,EAAS,gBAAA,CAAiB,IAAA,CAAK,KAAK,CAAA;AAAA,EAC3C;AACF;;;ACnBA,cAAA,CAAe;AAAA,EACb,WAAA,EAAa;AAAA,IACX,CAAC,MAAQ,IAAM,CAAA;AAAA;AAAA,IACf,CAAC,MAAQ,IAAM;AAAA;AAAA;AAEnB,CAAC,CAAA;AAGM,IAAM,YAAA,GAAe,CAAC,IAAA,EAAM,OAAA,EAAS,OAAO","file":"fa.cjs","sourcesContent":["import type { DigitBlock } from \"./types.js\";\n\n// ── Built-in digit blocks ────────────────────────────────────────────────────\n// These cover the digit systems required by the spec.\n// Additional blocks can be registered via registerLocale().\n\nconst BUILTIN_DIGIT_BLOCKS: DigitBlock[] = [\n [0x0660, 0x0669], // Arabic-Indic (arab)\n [0x06f0, 0x06f9], // Extended Arabic-Indic / Persian (arabext)\n [0x0966, 0x096f], // Devanagari / Hindi (deva)\n [0x09e6, 0x09ef], // Bengali (beng)\n [0x0e50, 0x0e59], // Thai (thai)\n];\n\n// Mutable registry — locale plugins can add blocks here\nconst registeredBlocks: DigitBlock[] = [...BUILTIN_DIGIT_BLOCKS];\n\n// ── Public API ────────────────────────────────────────────────────────────────\n\nexport interface LocaleConfig {\n /** Extra digit block ranges to register */\n digitBlocks?: DigitBlock[];\n}\n\n/**\n * Register additional digit blocks (called by locale plugins as a side effect).\n * Duplicate ranges are silently ignored.\n */\nexport function registerLocale(config: LocaleConfig): void {\n if (!config.digitBlocks) return;\n for (const block of config.digitBlocks) {\n const already = registeredBlocks.some(([s]) => s === block[0]);\n if (!already) registeredBlocks.push(block);\n }\n}\n\n/**\n * Normalise any Unicode decimal digit in `input` to its ASCII equivalent (0–9).\n * Non-digit characters pass through unchanged.\n */\nexport function normalizeDigits(input: string): string {\n // Fast path: if there are no non-ASCII chars, return as-is\n if (!/[^\\u0020-\\u007e]/.test(input)) return input;\n\n return input.replace(/\\p{Nd}/gu, (ch) => {\n const code = ch.codePointAt(0)!;\n for (const [start, end] of registeredBlocks) {\n if (code >= start && code <= end) {\n return String(code - start);\n }\n }\n // Fallback: let JS try to parse it as a decimal digit\n const digit = Number.parseInt(ch, 10);\n return Number.isNaN(digit) ? ch : String(digit);\n });\n}\n\n/**\n * Returns true if the character is a non-Latin Unicode decimal digit\n * (i.e. would need normalization).\n */\nexport function isNonLatinDigit(ch: string): boolean {\n const code = ch.codePointAt(0);\n if (code === undefined) return false;\n if (code >= 0x30 && code <= 0x39) return false; // ASCII 0-9\n for (const [start, end] of registeredBlocks) {\n if (code >= start && code <= end) return true;\n }\n return false;\n}\n","/**\n * Persian (fa-IR) locale plugin.\n *\n * Registers Extended Arabic-Indic digit block (U+06F0–U+06F9).\n * The ISIRI 9147 keyboard produces these codepoints when number keys are\n * pressed on a Persian layout. This side-effect import enables their\n * normalization to ASCII 0–9 before parsing.\n *\n * Also registers the Arabic-Indic block for mixed-input scenarios.\n *\n * Usage:\n * import 'raqam/locales/fa'\n */\nimport { registerLocale } from \"../core/normalizer.js\";\n\nregisterLocale({\n digitBlocks: [\n [0x06f0, 0x06f9], // Extended Arabic-Indic (Persian) ۰–۹\n [0x0660, 0x0669], // Arabic-Indic ٠–٩\n ],\n});\n\n/** BCP 47 locale tags that this plugin covers. */\nexport const LOCALE_CODES = [\"fa\", \"fa-IR\", \"fa-AF\"] as const;\n"]}
@@ -0,0 +1,4 @@
1
+ /** BCP 47 locale tags that this plugin covers. */
2
+ declare const LOCALE_CODES: readonly ["fa", "fa-IR", "fa-AF"];
3
+
4
+ export { LOCALE_CODES };
@@ -0,0 +1,4 @@
1
+ /** BCP 47 locale tags that this plugin covers. */
2
+ declare const LOCALE_CODES: readonly ["fa", "fa-IR", "fa-AF"];
3
+
4
+ export { LOCALE_CODES };
@@ -0,0 +1,4 @@
1
+ export { LOCALE_CODES } from '../chunk-WTS5RY7S.js';
2
+ import '../chunk-NBAZIJ5W.js';
3
+ //# sourceMappingURL=fa.js.map
4
+ //# sourceMappingURL=fa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"fa.js"}
@@ -0,0 +1,36 @@
1
+ 'use strict';
2
+
3
+ // src/core/normalizer.ts
4
+ var BUILTIN_DIGIT_BLOCKS = [
5
+ [1632, 1641],
6
+ // Arabic-Indic (arab)
7
+ [1776, 1785],
8
+ // Extended Arabic-Indic / Persian (arabext)
9
+ [2406, 2415],
10
+ // Devanagari / Hindi (deva)
11
+ [2534, 2543],
12
+ // Bengali (beng)
13
+ [3664, 3673]
14
+ // Thai (thai)
15
+ ];
16
+ var registeredBlocks = [...BUILTIN_DIGIT_BLOCKS];
17
+ function registerLocale(config) {
18
+ if (!config.digitBlocks) return;
19
+ for (const block of config.digitBlocks) {
20
+ const already = registeredBlocks.some(([s]) => s === block[0]);
21
+ if (!already) registeredBlocks.push(block);
22
+ }
23
+ }
24
+
25
+ // src/locales/hi.ts
26
+ registerLocale({
27
+ digitBlocks: [
28
+ [2406, 2415]
29
+ // Devanagari ०–९
30
+ ]
31
+ });
32
+ var LOCALE_CODES = ["hi", "hi-IN", "mr", "mr-IN", "ne", "ne-NP"];
33
+
34
+ exports.LOCALE_CODES = LOCALE_CODES;
35
+ //# sourceMappingURL=hi.cjs.map
36
+ //# sourceMappingURL=hi.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/normalizer.ts","../../src/locales/hi.ts"],"names":[],"mappings":";;;AAMA,IAAM,oBAAA,GAAqC;AAAA,EACzC,CAAC,MAAQ,IAAM,CAAA;AAAA;AAAA,EACf,CAAC,MAAQ,IAAM,CAAA;AAAA;AAAA,EACf,CAAC,MAAQ,IAAM,CAAA;AAAA;AAAA,EACf,CAAC,MAAQ,IAAM,CAAA;AAAA;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA;AACjB,CAAA;AAGA,IAAM,gBAAA,GAAiC,CAAC,GAAG,oBAAoB,CAAA;AAaxD,SAAS,eAAe,MAAA,EAA4B;AACzD,EAAA,IAAI,CAAC,OAAO,WAAA,EAAa;AACzB,EAAA,KAAA,MAAW,KAAA,IAAS,OAAO,WAAA,EAAa;AACtC,IAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA,KAAM,CAAA,KAAM,KAAA,CAAM,CAAC,CAAC,CAAA;AAC7D,IAAA,IAAI,CAAC,OAAA,EAAS,gBAAA,CAAiB,IAAA,CAAK,KAAK,CAAA;AAAA,EAC3C;AACF;;;ACxBA,cAAA,CAAe;AAAA,EACb,WAAA,EAAa;AAAA,IACX,CAAC,MAAQ,IAAM;AAAA;AAAA;AAEnB,CAAC,CAAA;AAGM,IAAM,eAAe,CAAC,IAAA,EAAM,SAAS,IAAA,EAAM,OAAA,EAAS,MAAM,OAAO","file":"hi.cjs","sourcesContent":["import type { DigitBlock } from \"./types.js\";\n\n// ── Built-in digit blocks ────────────────────────────────────────────────────\n// These cover the digit systems required by the spec.\n// Additional blocks can be registered via registerLocale().\n\nconst BUILTIN_DIGIT_BLOCKS: DigitBlock[] = [\n [0x0660, 0x0669], // Arabic-Indic (arab)\n [0x06f0, 0x06f9], // Extended Arabic-Indic / Persian (arabext)\n [0x0966, 0x096f], // Devanagari / Hindi (deva)\n [0x09e6, 0x09ef], // Bengali (beng)\n [0x0e50, 0x0e59], // Thai (thai)\n];\n\n// Mutable registry — locale plugins can add blocks here\nconst registeredBlocks: DigitBlock[] = [...BUILTIN_DIGIT_BLOCKS];\n\n// ── Public API ────────────────────────────────────────────────────────────────\n\nexport interface LocaleConfig {\n /** Extra digit block ranges to register */\n digitBlocks?: DigitBlock[];\n}\n\n/**\n * Register additional digit blocks (called by locale plugins as a side effect).\n * Duplicate ranges are silently ignored.\n */\nexport function registerLocale(config: LocaleConfig): void {\n if (!config.digitBlocks) return;\n for (const block of config.digitBlocks) {\n const already = registeredBlocks.some(([s]) => s === block[0]);\n if (!already) registeredBlocks.push(block);\n }\n}\n\n/**\n * Normalise any Unicode decimal digit in `input` to its ASCII equivalent (0–9).\n * Non-digit characters pass through unchanged.\n */\nexport function normalizeDigits(input: string): string {\n // Fast path: if there are no non-ASCII chars, return as-is\n if (!/[^\\u0020-\\u007e]/.test(input)) return input;\n\n return input.replace(/\\p{Nd}/gu, (ch) => {\n const code = ch.codePointAt(0)!;\n for (const [start, end] of registeredBlocks) {\n if (code >= start && code <= end) {\n return String(code - start);\n }\n }\n // Fallback: let JS try to parse it as a decimal digit\n const digit = Number.parseInt(ch, 10);\n return Number.isNaN(digit) ? ch : String(digit);\n });\n}\n\n/**\n * Returns true if the character is a non-Latin Unicode decimal digit\n * (i.e. would need normalization).\n */\nexport function isNonLatinDigit(ch: string): boolean {\n const code = ch.codePointAt(0);\n if (code === undefined) return false;\n if (code >= 0x30 && code <= 0x39) return false; // ASCII 0-9\n for (const [start, end] of registeredBlocks) {\n if (code >= start && code <= end) return true;\n }\n return false;\n}\n","/**\n * Hindi / Devanagari (hi-IN) locale plugin.\n *\n * Registers Devanagari digit block (U+0966–U+096F).\n *\n * Usage:\n * import 'raqam/locales/hi'\n */\nimport { registerLocale } from \"../core/normalizer.js\";\n\nregisterLocale({\n digitBlocks: [\n [0x0966, 0x096f], // Devanagari ०–९\n ],\n});\n\n/** BCP 47 locale tags that this plugin covers. */\nexport const LOCALE_CODES = [\"hi\", \"hi-IN\", \"mr\", \"mr-IN\", \"ne\", \"ne-NP\"] as const;\n"]}
@@ -0,0 +1,4 @@
1
+ /** BCP 47 locale tags that this plugin covers. */
2
+ declare const LOCALE_CODES: readonly ["hi", "hi-IN", "mr", "mr-IN", "ne", "ne-NP"];
3
+
4
+ export { LOCALE_CODES };
@@ -0,0 +1,4 @@
1
+ /** BCP 47 locale tags that this plugin covers. */
2
+ declare const LOCALE_CODES: readonly ["hi", "hi-IN", "mr", "mr-IN", "ne", "ne-NP"];
3
+
4
+ export { LOCALE_CODES };
@@ -0,0 +1,4 @@
1
+ export { LOCALE_CODES } from '../chunk-NSFX2EAT.js';
2
+ import '../chunk-NBAZIJ5W.js';
3
+ //# sourceMappingURL=hi.js.map
4
+ //# sourceMappingURL=hi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"hi.js"}
@@ -0,0 +1,78 @@
1
+ 'use strict';
2
+
3
+ // src/core/normalizer.ts
4
+ var BUILTIN_DIGIT_BLOCKS = [
5
+ [1632, 1641],
6
+ // Arabic-Indic (arab)
7
+ [1776, 1785],
8
+ // Extended Arabic-Indic / Persian (arabext)
9
+ [2406, 2415],
10
+ // Devanagari / Hindi (deva)
11
+ [2534, 2543],
12
+ // Bengali (beng)
13
+ [3664, 3673]
14
+ // Thai (thai)
15
+ ];
16
+ var registeredBlocks = [...BUILTIN_DIGIT_BLOCKS];
17
+ function registerLocale(config) {
18
+ if (!config.digitBlocks) return;
19
+ for (const block of config.digitBlocks) {
20
+ const already = registeredBlocks.some(([s]) => s === block[0]);
21
+ if (!already) registeredBlocks.push(block);
22
+ }
23
+ }
24
+
25
+ // src/locales/fa.ts
26
+ registerLocale({
27
+ digitBlocks: [
28
+ [1776, 1785],
29
+ // Extended Arabic-Indic (Persian) ۰–۹
30
+ [1632, 1641]
31
+ // Arabic-Indic ٠–٩
32
+ ]
33
+ });
34
+ var LOCALE_CODES = ["fa", "fa-IR", "fa-AF"];
35
+
36
+ // src/locales/ar.ts
37
+ registerLocale({
38
+ digitBlocks: [
39
+ [1632, 1641]
40
+ // Arabic-Indic ٠–٩
41
+ ]
42
+ });
43
+ var LOCALE_CODES2 = ["ar", "ar-EG", "ar-SA", "ar-MA", "ar-DZ", "ar-TN"];
44
+
45
+ // src/locales/bn.ts
46
+ registerLocale({
47
+ digitBlocks: [
48
+ [2534, 2543]
49
+ // Bengali ০–৯
50
+ ]
51
+ });
52
+ var LOCALE_CODES3 = ["bn", "bn-BD", "bn-IN"];
53
+
54
+ // src/locales/hi.ts
55
+ registerLocale({
56
+ digitBlocks: [
57
+ [2406, 2415]
58
+ // Devanagari ०–९
59
+ ]
60
+ });
61
+ var LOCALE_CODES4 = ["hi", "hi-IN", "mr", "mr-IN", "ne", "ne-NP"];
62
+
63
+ // src/locales/th.ts
64
+ registerLocale({
65
+ digitBlocks: [
66
+ [3664, 3673]
67
+ // Thai ๐–๙
68
+ ]
69
+ });
70
+ var LOCALE_CODES5 = ["th", "th-TH"];
71
+
72
+ exports.AR_LOCALE_CODES = LOCALE_CODES2;
73
+ exports.BN_LOCALE_CODES = LOCALE_CODES3;
74
+ exports.FA_LOCALE_CODES = LOCALE_CODES;
75
+ exports.HI_LOCALE_CODES = LOCALE_CODES4;
76
+ exports.TH_LOCALE_CODES = LOCALE_CODES5;
77
+ //# sourceMappingURL=index.cjs.map
78
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/normalizer.ts","../../src/locales/fa.ts","../../src/locales/ar.ts","../../src/locales/bn.ts","../../src/locales/hi.ts","../../src/locales/th.ts"],"names":["LOCALE_CODES"],"mappings":";;;AAMA,IAAM,oBAAA,GAAqC;AAAA,EACzC,CAAC,MAAQ,IAAM,CAAA;AAAA;AAAA,EACf,CAAC,MAAQ,IAAM,CAAA;AAAA;AAAA,EACf,CAAC,MAAQ,IAAM,CAAA;AAAA;AAAA,EACf,CAAC,MAAQ,IAAM,CAAA;AAAA;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA;AACjB,CAAA;AAGA,IAAM,gBAAA,GAAiC,CAAC,GAAG,oBAAoB,CAAA;AAaxD,SAAS,eAAe,MAAA,EAA4B;AACzD,EAAA,IAAI,CAAC,OAAO,WAAA,EAAa;AACzB,EAAA,KAAA,MAAW,KAAA,IAAS,OAAO,WAAA,EAAa;AACtC,IAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA,KAAM,CAAA,KAAM,KAAA,CAAM,CAAC,CAAC,CAAA;AAC7D,IAAA,IAAI,CAAC,OAAA,EAAS,gBAAA,CAAiB,IAAA,CAAK,KAAK,CAAA;AAAA,EAC3C;AACF;;;ACnBA,cAAA,CAAe;AAAA,EACb,WAAA,EAAa;AAAA,IACX,CAAC,MAAQ,IAAM,CAAA;AAAA;AAAA,IACf,CAAC,MAAQ,IAAM;AAAA;AAAA;AAEnB,CAAC,CAAA;AAGM,IAAM,YAAA,GAAe,CAAC,IAAA,EAAM,OAAA,EAAS,OAAO;;;ACbnD,cAAA,CAAe;AAAA,EACb,WAAA,EAAa;AAAA,IACX,CAAC,MAAQ,IAAM;AAAA;AAAA;AAEnB,CAAC,CAAA;AAGM,IAAMA,gBAAe,CAAC,IAAA,EAAM,SAAS,OAAA,EAAS,OAAA,EAAS,SAAS,OAAO;;;ACP9E,cAAA,CAAe;AAAA,EACb,WAAA,EAAa;AAAA,IACX,CAAC,MAAQ,IAAM;AAAA;AAAA;AAEnB,CAAC,CAAA;AAGM,IAAMA,aAAAA,GAAe,CAAC,IAAA,EAAM,OAAA,EAAS,OAAO;;;ACPnD,cAAA,CAAe;AAAA,EACb,WAAA,EAAa;AAAA,IACX,CAAC,MAAQ,IAAM;AAAA;AAAA;AAEnB,CAAC,CAAA;AAGM,IAAMA,gBAAe,CAAC,IAAA,EAAM,SAAS,IAAA,EAAM,OAAA,EAAS,MAAM,OAAO;;;ACPxE,cAAA,CAAe;AAAA,EACb,WAAA,EAAa;AAAA,IACX,CAAC,MAAQ,IAAM;AAAA;AAAA;AAEnB,CAAC,CAAA;AAGM,IAAMA,aAAAA,GAAe,CAAC,IAAA,EAAM,OAAO","file":"index.cjs","sourcesContent":["import type { DigitBlock } from \"./types.js\";\n\n// ── Built-in digit blocks ────────────────────────────────────────────────────\n// These cover the digit systems required by the spec.\n// Additional blocks can be registered via registerLocale().\n\nconst BUILTIN_DIGIT_BLOCKS: DigitBlock[] = [\n [0x0660, 0x0669], // Arabic-Indic (arab)\n [0x06f0, 0x06f9], // Extended Arabic-Indic / Persian (arabext)\n [0x0966, 0x096f], // Devanagari / Hindi (deva)\n [0x09e6, 0x09ef], // Bengali (beng)\n [0x0e50, 0x0e59], // Thai (thai)\n];\n\n// Mutable registry — locale plugins can add blocks here\nconst registeredBlocks: DigitBlock[] = [...BUILTIN_DIGIT_BLOCKS];\n\n// ── Public API ────────────────────────────────────────────────────────────────\n\nexport interface LocaleConfig {\n /** Extra digit block ranges to register */\n digitBlocks?: DigitBlock[];\n}\n\n/**\n * Register additional digit blocks (called by locale plugins as a side effect).\n * Duplicate ranges are silently ignored.\n */\nexport function registerLocale(config: LocaleConfig): void {\n if (!config.digitBlocks) return;\n for (const block of config.digitBlocks) {\n const already = registeredBlocks.some(([s]) => s === block[0]);\n if (!already) registeredBlocks.push(block);\n }\n}\n\n/**\n * Normalise any Unicode decimal digit in `input` to its ASCII equivalent (0–9).\n * Non-digit characters pass through unchanged.\n */\nexport function normalizeDigits(input: string): string {\n // Fast path: if there are no non-ASCII chars, return as-is\n if (!/[^\\u0020-\\u007e]/.test(input)) return input;\n\n return input.replace(/\\p{Nd}/gu, (ch) => {\n const code = ch.codePointAt(0)!;\n for (const [start, end] of registeredBlocks) {\n if (code >= start && code <= end) {\n return String(code - start);\n }\n }\n // Fallback: let JS try to parse it as a decimal digit\n const digit = Number.parseInt(ch, 10);\n return Number.isNaN(digit) ? ch : String(digit);\n });\n}\n\n/**\n * Returns true if the character is a non-Latin Unicode decimal digit\n * (i.e. would need normalization).\n */\nexport function isNonLatinDigit(ch: string): boolean {\n const code = ch.codePointAt(0);\n if (code === undefined) return false;\n if (code >= 0x30 && code <= 0x39) return false; // ASCII 0-9\n for (const [start, end] of registeredBlocks) {\n if (code >= start && code <= end) return true;\n }\n return false;\n}\n","/**\n * Persian (fa-IR) locale plugin.\n *\n * Registers Extended Arabic-Indic digit block (U+06F0–U+06F9).\n * The ISIRI 9147 keyboard produces these codepoints when number keys are\n * pressed on a Persian layout. This side-effect import enables their\n * normalization to ASCII 0–9 before parsing.\n *\n * Also registers the Arabic-Indic block for mixed-input scenarios.\n *\n * Usage:\n * import 'raqam/locales/fa'\n */\nimport { registerLocale } from \"../core/normalizer.js\";\n\nregisterLocale({\n digitBlocks: [\n [0x06f0, 0x06f9], // Extended Arabic-Indic (Persian) ۰–۹\n [0x0660, 0x0669], // Arabic-Indic ٠–٩\n ],\n});\n\n/** BCP 47 locale tags that this plugin covers. */\nexport const LOCALE_CODES = [\"fa\", \"fa-IR\", \"fa-AF\"] as const;\n","/**\n * Arabic (ar) locale plugin.\n *\n * Registers Arabic-Indic digit block (U+0660–U+0669).\n *\n * Usage:\n * import 'raqam/locales/ar'\n */\nimport { registerLocale } from \"../core/normalizer.js\";\n\nregisterLocale({\n digitBlocks: [\n [0x0660, 0x0669], // Arabic-Indic ٠–٩\n ],\n});\n\n/** BCP 47 locale tags that this plugin covers. */\nexport const LOCALE_CODES = [\"ar\", \"ar-EG\", \"ar-SA\", \"ar-MA\", \"ar-DZ\", \"ar-TN\"] as const;\n","/**\n * Bengali (bn-BD / bn-IN) locale plugin.\n *\n * Registers Bengali digit block (U+09E6–U+09EF).\n *\n * Usage:\n * import 'raqam/locales/bn'\n */\nimport { registerLocale } from \"../core/normalizer.js\";\n\nregisterLocale({\n digitBlocks: [\n [0x09e6, 0x09ef], // Bengali ০–৯\n ],\n});\n\n/** BCP 47 locale tags that this plugin covers. */\nexport const LOCALE_CODES = [\"bn\", \"bn-BD\", \"bn-IN\"] as const;\n","/**\n * Hindi / Devanagari (hi-IN) locale plugin.\n *\n * Registers Devanagari digit block (U+0966–U+096F).\n *\n * Usage:\n * import 'raqam/locales/hi'\n */\nimport { registerLocale } from \"../core/normalizer.js\";\n\nregisterLocale({\n digitBlocks: [\n [0x0966, 0x096f], // Devanagari ०–९\n ],\n});\n\n/** BCP 47 locale tags that this plugin covers. */\nexport const LOCALE_CODES = [\"hi\", \"hi-IN\", \"mr\", \"mr-IN\", \"ne\", \"ne-NP\"] as const;\n","/**\n * Thai (th-TH) locale plugin.\n *\n * Registers Thai digit block (U+0E50–U+0E59).\n *\n * Usage:\n * import 'raqam/locales/th'\n */\nimport { registerLocale } from \"../core/normalizer.js\";\n\nregisterLocale({\n digitBlocks: [\n [0x0e50, 0x0e59], // Thai ๐–๙\n ],\n});\n\n/** BCP 47 locale tags that this plugin covers. */\nexport const LOCALE_CODES = [\"th\", \"th-TH\"] as const;\n"]}
@@ -0,0 +1,5 @@
1
+ export { LOCALE_CODES as FA_LOCALE_CODES } from './fa.cjs';
2
+ export { LOCALE_CODES as AR_LOCALE_CODES } from './ar.cjs';
3
+ export { LOCALE_CODES as BN_LOCALE_CODES } from './bn.cjs';
4
+ export { LOCALE_CODES as HI_LOCALE_CODES } from './hi.cjs';
5
+ export { LOCALE_CODES as TH_LOCALE_CODES } from './th.cjs';
@@ -0,0 +1,5 @@
1
+ export { LOCALE_CODES as FA_LOCALE_CODES } from './fa.js';
2
+ export { LOCALE_CODES as AR_LOCALE_CODES } from './ar.js';
3
+ export { LOCALE_CODES as BN_LOCALE_CODES } from './bn.js';
4
+ export { LOCALE_CODES as HI_LOCALE_CODES } from './hi.js';
5
+ export { LOCALE_CODES as TH_LOCALE_CODES } from './th.js';
@@ -0,0 +1,8 @@
1
+ export { LOCALE_CODES as FA_LOCALE_CODES } from '../chunk-WTS5RY7S.js';
2
+ export { LOCALE_CODES as AR_LOCALE_CODES } from '../chunk-IG7CVIA2.js';
3
+ export { LOCALE_CODES as BN_LOCALE_CODES } from '../chunk-NTROGAES.js';
4
+ export { LOCALE_CODES as HI_LOCALE_CODES } from '../chunk-NSFX2EAT.js';
5
+ export { LOCALE_CODES as TH_LOCALE_CODES } from '../chunk-VOBTYII2.js';
6
+ import '../chunk-NBAZIJ5W.js';
7
+ //# sourceMappingURL=index.js.map
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -0,0 +1,36 @@
1
+ 'use strict';
2
+
3
+ // src/core/normalizer.ts
4
+ var BUILTIN_DIGIT_BLOCKS = [
5
+ [1632, 1641],
6
+ // Arabic-Indic (arab)
7
+ [1776, 1785],
8
+ // Extended Arabic-Indic / Persian (arabext)
9
+ [2406, 2415],
10
+ // Devanagari / Hindi (deva)
11
+ [2534, 2543],
12
+ // Bengali (beng)
13
+ [3664, 3673]
14
+ // Thai (thai)
15
+ ];
16
+ var registeredBlocks = [...BUILTIN_DIGIT_BLOCKS];
17
+ function registerLocale(config) {
18
+ if (!config.digitBlocks) return;
19
+ for (const block of config.digitBlocks) {
20
+ const already = registeredBlocks.some(([s]) => s === block[0]);
21
+ if (!already) registeredBlocks.push(block);
22
+ }
23
+ }
24
+
25
+ // src/locales/th.ts
26
+ registerLocale({
27
+ digitBlocks: [
28
+ [3664, 3673]
29
+ // Thai ๐–๙
30
+ ]
31
+ });
32
+ var LOCALE_CODES = ["th", "th-TH"];
33
+
34
+ exports.LOCALE_CODES = LOCALE_CODES;
35
+ //# sourceMappingURL=th.cjs.map
36
+ //# sourceMappingURL=th.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/normalizer.ts","../../src/locales/th.ts"],"names":[],"mappings":";;;AAMA,IAAM,oBAAA,GAAqC;AAAA,EACzC,CAAC,MAAQ,IAAM,CAAA;AAAA;AAAA,EACf,CAAC,MAAQ,IAAM,CAAA;AAAA;AAAA,EACf,CAAC,MAAQ,IAAM,CAAA;AAAA;AAAA,EACf,CAAC,MAAQ,IAAM,CAAA;AAAA;AAAA,EACf,CAAC,MAAQ,IAAM;AAAA;AACjB,CAAA;AAGA,IAAM,gBAAA,GAAiC,CAAC,GAAG,oBAAoB,CAAA;AAaxD,SAAS,eAAe,MAAA,EAA4B;AACzD,EAAA,IAAI,CAAC,OAAO,WAAA,EAAa;AACzB,EAAA,KAAA,MAAW,KAAA,IAAS,OAAO,WAAA,EAAa;AACtC,IAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA,KAAM,CAAA,KAAM,KAAA,CAAM,CAAC,CAAC,CAAA;AAC7D,IAAA,IAAI,CAAC,OAAA,EAAS,gBAAA,CAAiB,IAAA,CAAK,KAAK,CAAA;AAAA,EAC3C;AACF;;;ACxBA,cAAA,CAAe;AAAA,EACb,WAAA,EAAa;AAAA,IACX,CAAC,MAAQ,IAAM;AAAA;AAAA;AAEnB,CAAC,CAAA;AAGM,IAAM,YAAA,GAAe,CAAC,IAAA,EAAM,OAAO","file":"th.cjs","sourcesContent":["import type { DigitBlock } from \"./types.js\";\n\n// ── Built-in digit blocks ────────────────────────────────────────────────────\n// These cover the digit systems required by the spec.\n// Additional blocks can be registered via registerLocale().\n\nconst BUILTIN_DIGIT_BLOCKS: DigitBlock[] = [\n [0x0660, 0x0669], // Arabic-Indic (arab)\n [0x06f0, 0x06f9], // Extended Arabic-Indic / Persian (arabext)\n [0x0966, 0x096f], // Devanagari / Hindi (deva)\n [0x09e6, 0x09ef], // Bengali (beng)\n [0x0e50, 0x0e59], // Thai (thai)\n];\n\n// Mutable registry — locale plugins can add blocks here\nconst registeredBlocks: DigitBlock[] = [...BUILTIN_DIGIT_BLOCKS];\n\n// ── Public API ────────────────────────────────────────────────────────────────\n\nexport interface LocaleConfig {\n /** Extra digit block ranges to register */\n digitBlocks?: DigitBlock[];\n}\n\n/**\n * Register additional digit blocks (called by locale plugins as a side effect).\n * Duplicate ranges are silently ignored.\n */\nexport function registerLocale(config: LocaleConfig): void {\n if (!config.digitBlocks) return;\n for (const block of config.digitBlocks) {\n const already = registeredBlocks.some(([s]) => s === block[0]);\n if (!already) registeredBlocks.push(block);\n }\n}\n\n/**\n * Normalise any Unicode decimal digit in `input` to its ASCII equivalent (0–9).\n * Non-digit characters pass through unchanged.\n */\nexport function normalizeDigits(input: string): string {\n // Fast path: if there are no non-ASCII chars, return as-is\n if (!/[^\\u0020-\\u007e]/.test(input)) return input;\n\n return input.replace(/\\p{Nd}/gu, (ch) => {\n const code = ch.codePointAt(0)!;\n for (const [start, end] of registeredBlocks) {\n if (code >= start && code <= end) {\n return String(code - start);\n }\n }\n // Fallback: let JS try to parse it as a decimal digit\n const digit = Number.parseInt(ch, 10);\n return Number.isNaN(digit) ? ch : String(digit);\n });\n}\n\n/**\n * Returns true if the character is a non-Latin Unicode decimal digit\n * (i.e. would need normalization).\n */\nexport function isNonLatinDigit(ch: string): boolean {\n const code = ch.codePointAt(0);\n if (code === undefined) return false;\n if (code >= 0x30 && code <= 0x39) return false; // ASCII 0-9\n for (const [start, end] of registeredBlocks) {\n if (code >= start && code <= end) return true;\n }\n return false;\n}\n","/**\n * Thai (th-TH) locale plugin.\n *\n * Registers Thai digit block (U+0E50–U+0E59).\n *\n * Usage:\n * import 'raqam/locales/th'\n */\nimport { registerLocale } from \"../core/normalizer.js\";\n\nregisterLocale({\n digitBlocks: [\n [0x0e50, 0x0e59], // Thai ๐–๙\n ],\n});\n\n/** BCP 47 locale tags that this plugin covers. */\nexport const LOCALE_CODES = [\"th\", \"th-TH\"] as const;\n"]}
@@ -0,0 +1,4 @@
1
+ /** BCP 47 locale tags that this plugin covers. */
2
+ declare const LOCALE_CODES: readonly ["th", "th-TH"];
3
+
4
+ export { LOCALE_CODES };
@@ -0,0 +1,4 @@
1
+ /** BCP 47 locale tags that this plugin covers. */
2
+ declare const LOCALE_CODES: readonly ["th", "th-TH"];
3
+
4
+ export { LOCALE_CODES };
@@ -0,0 +1,4 @@
1
+ export { LOCALE_CODES } from '../chunk-VOBTYII2.js';
2
+ import '../chunk-NBAZIJ5W.js';
3
+ //# sourceMappingURL=th.js.map
4
+ //# sourceMappingURL=th.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"th.js"}
package/dist/react.cjs ADDED
@@ -0,0 +1,3 @@
1
+ "use client";
2
+ 'use strict';var Rt=require('react'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var Rt__default=/*#__PURE__*/_interopDefault(Rt);function De({value:t,defaultValue:e,onChange:n}){let r=t!==void 0,o=Rt.useRef(r);typeof window<"u"&&window.__DEV__!==false&&o.current!==r&&console.warn(`[raqam] Component is changing from ${o.current?"controlled":"uncontrolled"} to ${r?"controlled":"uncontrolled"}. Decide between using a controlled or uncontrolled component and don't switch.`);let[i,u]=Rt.useState(e),c=Rt.useCallback(s=>{let l=typeof s=="function"?s(r?t:i):s;r||u(l),n?.(l);},[r,t,i,n]);return [r?t:i,c]}var Ke=new Map;function ze(t,e){let n=`${t??""}::${JSON.stringify(e??{})}`,r=Ke.get(n);return r||(r=new Intl.NumberFormat(t,e),Ke.set(n,r)),r}function at(t,e){let n=ze(t,e),r=n.formatToParts(12345.6),o=".",i=",",u="-",c="0";for(let b of r)b.type==="decimal"&&(o=b.value),b.type==="group"&&(i=b.value),b.type==="minusSign"&&(u=b.value);let s=n.formatToParts(0);for(let b of s)if(b.type==="integer"){c=b.value;break}let l=/^(ar|he|fa|ur|syc|nqo|ug|yi)/i,a=n.resolvedOptions().locale,m=l.test(a);return {decimalSeparator:o,groupingSeparator:i,minusSign:u,zero:c,isRTL:m}}function Z(t){let e={...t.formatOptions};t.minimumFractionDigits!==void 0&&(e.minimumFractionDigits=t.minimumFractionDigits),t.maximumFractionDigits!==void 0&&(e.maximumFractionDigits=t.maximumFractionDigits),t.fixedDecimalScale&&t.maximumFractionDigits!==void 0&&(e.minimumFractionDigits=t.maximumFractionDigits,e.maximumFractionDigits=t.maximumFractionDigits);let n=ze(t.locale,e),r=null;function o(){return r||(r=at(t.locale,e)),r}function i(s){let l=n.formatToParts(s);if(!t.prefix&&!t.suffix)return l;let a=[];return t.prefix&&a.push({type:"literal",value:t.prefix}),a.push(...l),t.suffix&&a.push({type:"literal",value:t.suffix}),a}function u(s){if(!Number.isFinite(s))return "";let l=n.format(s);return (t.prefix??"")+l+(t.suffix??"")}function c(s){let l=i(s);return {formatted:l.map(m=>m.value).join(""),parts:l}}return {format:u,formatToParts:i,getLocaleInfo:o,formatResult:c}}var ut=[[1632,1641],[1776,1785],[2406,2415],[2534,2543],[3664,3673]],lt=[...ut];function z(t){return /[^\u0020-\u007e]/.test(t)?t.replace(/\p{Nd}/gu,e=>{let n=e.codePointAt(0);for(let[o,i]of lt)if(n>=o&&n<=i)return String(n-o);let r=Number.parseInt(e,10);return Number.isNaN(r)?e:String(r)}):t}function Ye(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function qe(t,e,n,r){let o=Ye(e.decimalSeparator),i=Ye(e.minusSign);return !!(n&&(t==="-"||t===e.minusSign)||r&&new RegExp(`^${i}?\\d+${o}$`).test(t)||r&&new RegExp(`^${i}?\\d+${o}\\d*0+$`).test(t))}function ve(t={}){let e=t.allowNegative??true,n=t.allowDecimal??true,r=Z({locale:t.locale,formatOptions:t.formatOptions,prefix:t.prefix,suffix:t.suffix});function o(){return r.getLocaleInfo()}function i(s){let l=o(),a=z(s),m=a.match(/^\((.+)\)$/);return m&&(a=`-${m[1]}`),t.prefix&&a.startsWith(t.prefix)&&(a=a.slice(t.prefix.length)),t.suffix&&a.endsWith(t.suffix)&&(a=a.slice(0,-t.suffix.length)),l.groupingSeparator&&(a=a.split(l.groupingSeparator).join("")),l.decimalSeparator!=="."&&(a=a.split(l.decimalSeparator).join(".")),l.minusSign!=="-"&&(a=a.split(l.minusSign).join("-")),a=a.replace(/[^\d.\-]/g,"").trim(),a}function u(s){if(!s||s.trim()==="")return {value:null,isValid:false,isIntermediate:false};let l=o();if(qe(s,l,e,n))return {value:null,isValid:false,isIntermediate:true};let a=i(s);if(a==="")return {value:null,isValid:false,isIntermediate:false};if(a==="-")return {value:null,isValid:false,isIntermediate:e};if(!/^-?\d+\.?\d*$/.test(a))return {value:null,isValid:false,isIntermediate:false};if(!e&&a.startsWith("-"))return {value:null,isValid:false,isIntermediate:false};if(!n&&a.includes("."))return {value:null,isValid:false,isIntermediate:false};let m=Number.parseFloat(a);return Number.isFinite(m)?{value:m,isValid:true,isIntermediate:false}:{value:null,isValid:false,isIntermediate:false}}function c(s){let l=o();return qe(s,l,e,n)}return {parse:u,isIntermediate:c,getLocaleInfo:o}}function we(t,e,n){let r=t;return e!==void 0&&(r=Math.max(r,e)),n!==void 0&&(r=Math.min(r,n)),r}function We(t,e){let r=10**Math.max(Ge(t),Ge(e));return Math.round(t*r+e*r)/r}function Ge(t){let e=String(t),n=e.indexOf(".");return n===-1?0:e.length-n-1}function Ae(t){let{locale:e,formatOptions:n,minValue:r,maxValue:o,step:i=1,largeStep:u,smallStep:c,allowNegative:s=true,allowDecimal:l=true,maximumFractionDigits:a,minimumFractionDigits:m,fixedDecimalScale:b,clampBehavior:P="blur",prefix:x,suffix:h,allowOutOfRange:R=false,validate:j,onRawChange:K,formatValue:J}=t,Y=Rt.useMemo(()=>Z({locale:e,formatOptions:n,prefix:x,suffix:h,minimumFractionDigits:m,maximumFractionDigits:a,fixedDecimalScale:b}),[e,JSON.stringify(n),x,h,m,a,b]),p=Rt.useMemo(()=>ve({locale:e,formatOptions:n,allowNegative:s,allowDecimal:l,prefix:x,suffix:h}),[e,JSON.stringify(n),s,l,x,h]),[L,A]=De({value:t.value,defaultValue:t.defaultValue??null,onChange:t.onChange}),k=Rt.useCallback(f=>J?J(f):Y.format(f),[Y,J]),I=Rt.useMemo(()=>t.defaultValue!=null?k(t.defaultValue):t.value!=null?k(t.value):"",[]),[C,X]=Rt.useState(I),D=Rt.useRef(I),[ae,ue]=Rt.useState(t.defaultValue!=null?String(t.defaultValue):null),q=Rt.useCallback(f=>{if(!j)return {validationState:"valid",validationError:null};let y=j(f);return y===false?{validationState:"invalid",validationError:null}:typeof y=="string"?{validationState:"invalid",validationError:y}:{validationState:"valid",validationError:null}},[j]),re=Rt.useMemo(()=>{let f=t.defaultValue??t.value??null;return q(f??null)},[]),[Ie,de]=Rt.useState(re.validationState),[F,B]=Rt.useState(re.validationError),[N,le]=Rt.useState(false),[ye,Se]=Rt.useState(false),fe=Rt.useRef("input"),Fe=Rt.useCallback(f=>{fe.current=f;},[]),Pe=Rt.useCallback(()=>fe.current,[]),te=t.value,pe=Rt.useRef(te);if(pe.current!==te)if(pe.current=te,te!=null){let f=Y.format(te);f!==D.current&&(D.current=f);}else D.current="";let Q=Rt.useCallback(f=>{let{validationState:y,validationError:ne}=q(f);de(y),B(ne);},[q]),he=Rt.useCallback(f=>{let y=p.parse(f);P==="strict"&&!R&&y.value!==null&&(r!==void 0&&y.value<r||o!==void 0&&y.value>o)||(X(f),A(y.value),ue(y.value!==null?f:null),K?.(y.value!==null?f:null),Q(y.value));},[p,P,R,r,o,A,K,Q]),_=Rt.useCallback(f=>{if(A(f),f!=null){let y=k(f);X(y),D.current=y;let ne=String(f);ue(ne),K?.(ne);}else X(""),D.current="",ue(null),K?.(null);Q(f);},[k,A,K,Q]),Ee=Rt.useCallback(()=>{if(L==null){X(""),D.current="";return}let f=L;P==="blur"&&!R&&(f=we(L,r,o));let y=k(f);X(y),D.current=y,f!==L&&A(f),Q(f);},[L,P,R,r,o,Y,A,Q]),Te=u??i*10,be=c??i*.1,Ue=!t.disabled&&!t.readOnly&&(R||o===void 0||(L??Number.NEGATIVE_INFINITY)<o),se=!t.disabled&&!t.readOnly&&(R||r===void 0||(L??Number.POSITIVE_INFINITY)>r),Ne=Rt.useCallback(f=>{let ge=we(We(L??0,f??i),r,o);_(ge);},[L,i,r,o,_]),Me=Rt.useCallback(f=>{let ge=we(We(L??0,-(f??i)),r,o);_(ge);},[L,i,r,o,_]),Ce=Rt.useCallback(()=>{o!==void 0&&_(o);},[o,_]),Ve=Rt.useCallback(()=>{r!==void 0&&_(r);},[r,_]);return {inputValue:C,numberValue:L??null,rawValue:ae,canIncrement:Ue,canDecrement:se,isScrubbing:N,setIsScrubbing:le,isFocused:ye,setIsFocused:Se,validationState:Ie,validationError:F,_setLastChangeReason:Fe,_getLastChangeReason:Pe,setInputValue:he,setNumberValue:_,commit:Ee,increment:Ne,decrement:Me,incrementToMax:Ce,decrementToMin:Ve,options:{...t,step:i,largeStep:Te,smallStep:be}}}function Je(t,e){return t>="0"&&t<="9"||t===e.decimalSeparator||t===e.minusSign||t==="-"}function st(t,e,n){let r=z(t),o=0;for(let i=0;i<e&&i<r.length;i++)Je(r[i],n)&&o++;return o}function ct(t,e){let n=t.length,r=new Array(n+1).fill(true);for(let o=0;o<n;o++)t[o]===e.groupingSeparator&&(r[o+1]=false);return r[0]=true,r[n]=true,r}function Oe(t,e,n,r,o){let i=z(t),u=st(i,e,r);o==="deleteContentBackward"&&e>0&&t[e-1]===r.groupingSeparator&&(u=Math.max(0,u-1));let c=ct(n,r),s=z(n),l=0,a=0;for(let m=0;m<s.length;m++){if(l===u){a=m;break}Je(s[m],r)&&l++,a=m+1;}return u>0&&l<u&&(a=n.length),a=mt(a,c),a}function mt(t,e){if(e[t])return t;for(let n=t+1;n<e.length;n++)if(e[n])return n;for(let n=t-1;n>=0;n--)if(e[n])return n;return 0}function ke(t,e={}){let{delay:n=400,interval:r=200,disabled:o=false}=e,i=Rt.useRef(t);Rt.useEffect(()=>{i.current=t;});let u=Rt.useRef(n);Rt.useEffect(()=>{u.current=n;});let c=Rt.useRef(r);Rt.useEffect(()=>{c.current=r;});let s=Rt.useRef(null),l=Rt.useRef(null),a=Rt.useRef(false),m=Rt.useCallback(()=>{a.current=false,s.current!==null&&(clearTimeout(s.current),s.current=null),l.current!==null&&(clearTimeout(l.current),l.current=null);},[]),b=Rt.useCallback(R=>{if(!a.current)return;i.current();let j=Math.max(50,Math.floor(R/2));l.current=setTimeout(()=>{b(j);},R);},[]),P=Rt.useCallback(R=>{o||R.button!==0&&R.pointerType==="mouse"||(i.current(),a.current=true,s.current=setTimeout(()=>{b(c.current);},u.current));},[o,b]),x=Rt.useCallback(R=>{R.preventDefault(),m();},[m]),h=Rt.useCallback(R=>{m();},[m]);return Rt.useEffect(()=>m,[m]),{onPointerDown:P,onPointerUp:x,onPointerLeave:h}}function Qe(t){return t.replace(/[.*+?^${}()|[\]\\\-]/g,"\\$&")}function _e(t,e,n){let{locale:r,formatOptions:o,minValue:i,maxValue:u,allowNegative:c=true,allowDecimal:s=true,allowMouseWheel:l=false,liveFormat:a=true,prefix:m,suffix:b,name:P,disabled:x,readOnly:h,required:R,onFocus:j,onBlur:K,maximumFractionDigits:J,minimumFractionDigits:Y,fixedDecimalScale:p,copyBehavior:L="formatted",stepHoldDelay:A=400,stepHoldInterval:k=200,formatValue:I,parseValue:C}=t,{step:X=1,largeStep:D=X*10,smallStep:ae=X*.1}=e.options,ue=Rt.useId(),q=t.id??`raqam-${ue}`,re=`${q}-label`,Ie=`${q}-description`,de=`${q}-error`,F=Rt.useMemo(()=>Z({locale:r,formatOptions:o,prefix:m,suffix:b,minimumFractionDigits:Y,maximumFractionDigits:J,fixedDecimalScale:p}),[r,JSON.stringify(o),m,b,Y,J,p]),B=Rt.useMemo(()=>ve({locale:r,formatOptions:o,allowNegative:c,allowDecimal:s,prefix:m,suffix:b}),[r,JSON.stringify(o),c,s,m,b]),N=Rt.useRef(null);Rt.useLayoutEffect(()=>{N.current!==null&&n.current&&document.activeElement===n.current&&(n.current.setSelectionRange(N.current,N.current),N.current=null);},[e.inputValue,n]),Rt.useEffect(()=>{let d=n.current;if(!d||!l)return;let g=E=>{x||h||document.activeElement===d&&(E.preventDefault(),e._setLastChangeReason("wheel"),E.deltaY<0?e.increment():e.decrement());};return d.addEventListener("wheel",g,{passive:false}),()=>d.removeEventListener("wheel",g)},[l,x,h,e,n]);let le=Rt.useRef(false),ye=Rt.useCallback(()=>{le.current=true;},[]),Se=Rt.useCallback(d=>{le.current=false;let g=d.currentTarget.value,E=F.getLocaleInfo(),S=z(g),T;if(C){let v=C(S);v.isIntermediate?T=S:v.value!==null&&I?T=I(v.value):v.value!==null?T=F.format(v.value):T=S,N.current=T.length;}else if(a){let v=B.parse(S);v.isIntermediate?T=S:v.value!==null?T=I?I(v.value):F.format(v.value):T=S===""?"":S,N.current=Oe(g,g.length,T,E,"insertCompositionText");}else T=S,N.current=S.length;e._setLastChangeReason("input"),e.setInputValue(T);},[F,B,a,e,I,C]),fe=Rt.useCallback(d=>{let g=d.target.value,E=d.target.selectionStart??g.length,S=d.nativeEvent.inputType,T=F.getLocaleInfo();if(le.current){e.setInputValue(g);return}let v=z(g),M;if(C){let V=C(v);V.isIntermediate?M=v:V.value!==null?M=I?I(V.value):F.format(V.value):v===""?M="":M=v,N.current=M.length;}else if(a){let V=B.parse(v);V.isIntermediate?M=v:V.value!==null?M=I?I(V.value):F.format(V.value):v===""?M="":M=v,I?N.current=M.length:N.current=Oe(g,E,M,T,S);}else M=v,N.current=E;e._setLastChangeReason("input"),e.setInputValue(M);},[F,B,a,e,I,C]),Fe=Rt.useCallback(d=>{d.preventDefault();let g=d.clipboardData.getData("text/plain");if(!g)return;let E=g.replace(/[€$£¥₹₺₽﷼฿₩¢₦₨₪₫₱]/g,"").trim(),S=z(E);if(e._setLastChangeReason("paste"),C){let $=C(S);if($.value!==null){let je=I?I($.value):F.format($.value);e.setInputValue(je),N.current=je.length;}return}let T=B.parse(S);if(T.value!==null){let $=F.format(T.value);e.setInputValue($),N.current=$.length;return}let v=F.getLocaleInfo(),M=new RegExp(`[^0-9${Qe(v.decimalSeparator)}${Qe(v.minusSign)}-]`,"g"),V=S.replace(M,""),ce=B.parse(V);if(ce.value!==null){let $=F.format(ce.value);e.setInputValue($),N.current=$.length;}},[B,F,e,I,C]),Pe=Rt.useCallback(d=>{if(L==="formatted")return;d.preventDefault();let g=String(e.numberValue??"");d.clipboardData.setData("text/plain",g);},[L,e.numberValue]),te=Rt.useCallback(d=>{if(L==="formatted")return;d.preventDefault();let g=String(e.numberValue??"");d.clipboardData.setData("text/plain",g),e.setInputValue("");},[L,e]),pe=Rt.useCallback(d=>{if(x||h)return;let g=d.key;if(g==="Backspace"&&!d.shiftKey&&!d.altKey&&!d.metaKey&&!d.ctrlKey){let E=n.current;if(E){let S=E.selectionStart??0,T=E.selectionEnd??S,v=E.value,M=F.getLocaleInfo();if(S===T&&S>=2&&v[S-1]===M.groupingSeparator){d.preventDefault();let V=v.slice(0,S-2)+v.slice(S),ce=B.parse(V);if(e._setLastChangeReason("input"),ce.value!==null){let $=F.format(ce.value);e.setInputValue($);}else e.setInputValue(V);N.current=S-2;return}}}if(g==="ArrowUp"||g==="ArrowDown"){d.preventDefault();let E=g==="ArrowUp"?1:-1;e._setLastChangeReason("keyboard"),d.shiftKey?E>0?e.increment(D):e.decrement(D):d.metaKey||d.ctrlKey?E>0?e.increment(ae):e.decrement(ae):E>0?e.increment():e.decrement();return}if(g==="PageUp"){d.preventDefault(),e._setLastChangeReason("keyboard"),e.increment(D);return}if(g==="PageDown"){d.preventDefault(),e._setLastChangeReason("keyboard"),e.decrement(D);return}if(g==="Home"){i!==void 0&&(d.preventDefault(),e._setLastChangeReason("keyboard"),e.decrementToMin());return}if(g==="End"){u!==void 0&&(d.preventDefault(),e._setLastChangeReason("keyboard"),e.incrementToMax());return}if(g==="Enter"){e._setLastChangeReason("blur"),e.commit();return}},[x,h,e,D,ae,i,u,F,B,n]),Q=Rt.useCallback(d=>{e.setIsFocused(false),e._setLastChangeReason("blur"),e.commit(),K?.(d);},[e,K]),he=Rt.useCallback(d=>{e.setIsFocused(true),j?.(d);},[e,j]),_=ke(()=>{e._setLastChangeReason("increment"),e.increment();},{delay:A,interval:k,disabled:x||!e.canIncrement}),Ee=ke(()=>{e._setLastChangeReason("decrement"),e.decrement();},{delay:A,interval:k,disabled:x||!e.canDecrement}),Te=Rt.useMemo(()=>{if(e.numberValue!=null)return I?I(e.numberValue):F.format(e.numberValue)},[e.numberValue,F,I]),be=F.getLocaleInfo(),se=e.numberValue!==null&&(i!==void 0&&e.numberValue<i||u!==void 0&&e.numberValue>u)||e.validationState==="invalid",Ne={id:re,htmlFor:q},Me={role:"group","aria-labelledby":t["aria-labelledby"]??re},Ce={id:q,type:"text",inputMode:"decimal",role:"spinbutton",autoComplete:"off",autoCorrect:"off",spellCheck:false,"aria-label":t["aria-label"],"aria-labelledby":t["aria-labelledby"]??re,"aria-describedby":t["aria-describedby"],"aria-valuenow":e.numberValue??void 0,"aria-valuemin":i,"aria-valuemax":u,"aria-valuetext":Te,"aria-disabled":x||void 0,"aria-readonly":h||void 0,"aria-required":R||void 0,"aria-invalid":se?true:void 0,"aria-errormessage":se&&e.validationError?de:void 0,disabled:x,readOnly:h,required:R,value:e.inputValue,onChange:fe,onKeyDown:pe,onBlur:Q,onFocus:he,onPaste:Fe,onCopy:L!=="formatted"?Pe:void 0,onCut:L!=="formatted"?te:void 0,onCompositionStart:ye,onCompositionEnd:Se,style:be.isRTL?{direction:"ltr",textAlign:"right",unicodeBidi:"embed"}:void 0,"data-disabled":x?"":void 0,"data-readonly":h?"":void 0,"data-required":R?"":void 0,"data-invalid":se?"":void 0,"data-rtl":be.isRTL?"":void 0},Ve=P?{type:"hidden",name:P,value:e.numberValue??"","aria-hidden":true}:null,f={type:"button",tabIndex:-1,"aria-label":"Increase",disabled:x||!e.canIncrement,..._,"data-disabled":x||!e.canIncrement?"":void 0},y={type:"button",tabIndex:-1,"aria-label":"Decrease",disabled:x||!e.canDecrement,...Ee,"data-disabled":x||!e.canDecrement?"":void 0};return {labelProps:Ne,groupProps:Me,inputProps:Ce,hiddenInputProps:Ve,incrementButtonProps:f,decrementButtonProps:y,descriptionProps:{id:Ie},errorMessageProps:{id:de,role:"alert","aria-live":"polite"}}}function bt(t,e={}){let{locale:n,formatOptions:r,prefix:o,suffix:i,minimumFractionDigits:u,maximumFractionDigits:c,fixedDecimalScale:s}=e,l=Rt.useMemo(()=>Z({locale:n,formatOptions:r,prefix:o,suffix:i,minimumFractionDigits:u,maximumFractionDigits:c,fixedDecimalScale:s}),[n,JSON.stringify(r),o,i,u,c,s]);return Rt.useMemo(()=>t==null?"":l.format(t),[t,l])}var Le=Rt.createContext(null);function H(){let t=Rt.useContext(Le);if(!t)throw new Error("[raqam] NumberField sub-components must be used inside <NumberField.Root>.");return t}function nt(t,e={}){let{direction:n="horizontal",pixelSensitivity:r=4}=e,[o,i]=Rt.useState(false),u=Rt.useRef(t);u.current=t;let c=Rt.useRef(n);c.current=n;let s=Rt.useRef(r);s.current=r;let l=Rt.useRef(false),a=Rt.useRef(0),m=Rt.useRef(null),b=Rt.useRef({x:0,y:0}),[P,x]=Rt.useState({x:0,y:0}),h=Rt.useRef(p=>{if(!l.current)return;let L=b.current.x+p.movementX,A=b.current.y+p.movementY;b.current={x:L,y:A},x({x:L,y:A});let k=c.current,I=0;k==="horizontal"?I=p.movementX:k==="vertical"?I=-p.movementY:I=Math.abs(p.movementX)>=Math.abs(p.movementY)?p.movementX:-p.movementY,a.current+=I;let C=s.current;for(;a.current>=C;)u.current.increment(),a.current-=C;for(;a.current<=-C;)u.current.decrement(),a.current+=C;}),R=Rt.useRef(()=>{document.pointerLockElement===m.current?(l.current=true,a.current=0,i(true),u.current.setIsScrubbing(true),document.addEventListener("mousemove",h.current)):(l.current=false,a.current=0,document.removeEventListener("mousemove",h.current),i(false),u.current.setIsScrubbing(false));});Rt.useEffect(()=>{let p=R.current;return document.addEventListener("pointerlockchange",p),()=>{document.removeEventListener("pointerlockchange",p),document.removeEventListener("mousemove",h.current);}},[]);let j=Rt.useCallback(p=>{if(u.current.options.disabled||u.current.options.readOnly||p.button!==0)return;let L=p.currentTarget;m.current=L,b.current={x:p.clientX,y:p.clientY},x({x:p.clientX,y:p.clientY}),L.requestPointerLock();},[]),K=Rt.useCallback(p=>{u.current.options.disabled||u.current.options.readOnly||(p.key==="ArrowRight"||p.key==="ArrowUp"?(p.preventDefault(),u.current.increment()):(p.key==="ArrowLeft"||p.key==="ArrowDown")&&(p.preventDefault(),u.current.decrement()));},[]),J=n==="horizontal"?"ew-resize":n==="vertical"?"ns-resize":"move",Y={role:"slider",tabIndex:t.options.disabled?-1:0,style:{cursor:t.options.disabled?void 0:J,userSelect:"none",WebkitUserSelect:"none"},"aria-label":"Scrub to change value","data-scrubbing":o?"":void 0,onPointerDown:j,onKeyDown:K};return {isScrubbing:o,scrubAreaProps:Y,virtualCursor:P}}function ee(t,e,n){return e?typeof e=="function"?e(t.props,n):Rt__default.default.cloneElement(e,Object.assign({},t.props,e.props)):t}function Lt(t,e){let{options:n}=t;return {"data-disabled":n.disabled?"":void 0,"data-readonly":n.readOnly?"":void 0,"data-required":n.required?"":void 0,"data-scrubbing":t.isScrubbing?"":void 0,"data-focused":t.isFocused?"":void 0,"data-invalid":e?"":void 0}}var It=new Set(["className","style","id","tabIndex","title","role","aria-label","data-testid","onClick","onMouseEnter","onMouseLeave"]);function yt(t){let e={},n={};for(let[r,o]of Object.entries(t))It.has(r)||r.startsWith("data-")||r.startsWith("aria-")?n[r]=o:e[r]=o;return {fieldProps:e,divProps:n}}var St=Rt.forwardRef(function({children:e,onValueChange:n,onValueCommitted:r,...o},i){let u=Rt.useRef(null),{fieldProps:c,divProps:s}=yt(o),l=c,a=Rt.useRef(n);a.current=n;let m=Rt.useRef(null),b={...l,onChange:R=>{l.onChange?.(R),a.current&&m.current&&a.current(R,{reason:m.current._getLastChangeReason(),formattedValue:m.current.inputValue});}},P=Ae(b);m.current=P;let x=_e(b,P,u),h=P.validationState==="invalid"||P.numberValue!==null&&(l.minValue!==void 0&&P.numberValue<l.minValue||l.maxValue!==void 0&&P.numberValue>l.maxValue);return jsxRuntime.jsx(Le.Provider,{value:{state:P,aria:x,inputRef:u,props:b},children:jsxRuntime.jsx("div",{ref:i,...s,...Lt(P,h),children:e})})}),Ft=Rt.forwardRef(function({render:e,children:n,...r},o){let{aria:i,state:u}=H(),c=jsxRuntime.jsx("label",{ref:o,...i.labelProps,...r,children:n});return ee(c,e,u)}),Pt=Rt.forwardRef(function({render:e,children:n,...r},o){let{aria:i,state:u}=H(),c=jsxRuntime.jsx("div",{ref:o,...i.groupProps,...r,children:n});return ee(c,e,u)}),ht=Rt.forwardRef(function({render:e,...n},r){let{aria:o,state:i,inputRef:u}=H(),c=jsxRuntime.jsx("input",{ref:u,...o.inputProps,...n});return ee(c,e,i)}),Et=Rt.forwardRef(function({render:e,children:n,...r},o){let{aria:i,state:u}=H(),c=jsxRuntime.jsx("button",{ref:o,...i.incrementButtonProps,...r,children:n??"+"});return ee(c,e,u)}),Tt=Rt.forwardRef(function({render:e,children:n,...r},o){let{aria:i,state:u}=H(),c=jsxRuntime.jsx("button",{ref:o,...i.decrementButtonProps,...r,children:n??"\u2212"});return ee(c,e,u)}),Nt=function(){let{aria:e}=H();return e.hiddenInputProps?jsxRuntime.jsx("input",{...e.hiddenInputProps}):null},Mt=Rt.forwardRef(function({render:e,children:n,direction:r="horizontal",pixelSensitivity:o=4,...i},u){let{state:c}=H(),{scrubAreaProps:s}=nt(c,{direction:r,pixelSensitivity:o}),l=jsxRuntime.jsx("span",{ref:u,...s,...i,children:n});return ee(l,e,c)}),Ct=Rt.forwardRef(function({render:e,children:n,style:r,...o},i){let{state:u}=H();if(!u.isScrubbing)return null;let c=jsxRuntime.jsx("span",{ref:i,style:{position:"fixed",pointerEvents:"none",zIndex:9999,...r},...o,children:n});return ee(c,e,u)}),Vt=Rt.forwardRef(function({children:e,...n},r){let{aria:o}=H();return jsxRuntime.jsx("p",{ref:r,...o.descriptionProps,...n,children:e})}),Dt=Rt.forwardRef(function({children:e,...n},r){let{aria:o,state:i}=H(),u=e??i.validationError??null;return u?jsxRuntime.jsx("p",{ref:r,...o.errorMessageProps,...n,children:u}):null}),Ht=Rt.forwardRef(function({render:e,...n},r){let{state:o}=H(),i=jsxRuntime.jsx("span",{ref:r,"aria-hidden":"true",...n,children:o.inputValue});return ee(i,e,o)}),wt={Root:St,Label:Ft,Group:Pt,Input:ht,Increment:Et,Decrement:Tt,HiddenInput:Nt,ScrubArea:Mt,ScrubAreaCursor:Ct,Description:Vt,ErrorMessage:Dt,Formatted:Ht};exports.NumberField=wt;exports.NumberFieldContext=Le;exports.useControllableState=De;exports.useNumberField=_e;exports.useNumberFieldContext=H;exports.useNumberFieldFormat=bt;exports.useNumberFieldState=Ae;//# sourceMappingURL=react.cjs.map
3
+ //# sourceMappingURL=react.cjs.map