@eifi1/ui-kit 0.51.4 → 0.51.6

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 (759) hide show
  1. package/README.md +5 -5
  2. package/dist/account/account-settings-labels.js.map +1 -1
  3. package/dist/account/account-settings.js +11 -9
  4. package/dist/account/account-settings.js.map +1 -1
  5. package/dist/account/delete-account-setting.js +56 -65
  6. package/dist/account/delete-account-setting.js.map +1 -1
  7. package/dist/account/email-change-setting-labels.js.map +1 -1
  8. package/dist/account/email-change-setting.js.map +1 -1
  9. package/dist/account/passkeys-setting.js.map +1 -1
  10. package/dist/account/sessions-setting.js.map +1 -1
  11. package/dist/admin/admin-action-confirm.js +1 -3
  12. package/dist/admin/admin-action-confirm.js.map +1 -1
  13. package/dist/admin/admin-action-log.js.map +1 -1
  14. package/dist/admin/admin-area-labels.js +4 -1
  15. package/dist/admin/admin-area-labels.js.map +1 -1
  16. package/dist/admin/admin-overview.js +19 -11
  17. package/dist/admin/admin-overview.js.map +1 -1
  18. package/dist/admin/admin-sections.js.map +1 -1
  19. package/dist/admin/admin-tool-links.d.ts +1 -1
  20. package/dist/admin/admin-tool-links.js +7 -1
  21. package/dist/admin/admin-tool-links.js.map +1 -1
  22. package/dist/admin/invitations-panel.js +2 -13
  23. package/dist/admin/invitations-panel.js.map +1 -1
  24. package/dist/admin/mail-test-card.js.map +1 -1
  25. package/dist/admin/reviewer-scope-editor.js +4 -11
  26. package/dist/admin/reviewer-scope-editor.js.map +1 -1
  27. package/dist/admin/role-select.js.map +1 -1
  28. package/dist/admin/user-roster.js +1 -9
  29. package/dist/admin/user-roster.js.map +1 -1
  30. package/dist/auth/accept-invitation.js.map +1 -1
  31. package/dist/auth/auth-errors.js.map +1 -1
  32. package/dist/auth/forgot-password-form.js +23 -31
  33. package/dist/auth/forgot-password-form.js.map +1 -1
  34. package/dist/auth/register-form.js.map +1 -1
  35. package/dist/auth/reset-password-form.js.map +1 -1
  36. package/dist/auth/sign-in-form.js +13 -5
  37. package/dist/auth/sign-in-form.js.map +1 -1
  38. package/dist/auth/verify-email.js +1 -8
  39. package/dist/auth/verify-email.js.map +1 -1
  40. package/dist/billing/billing-banner.js.map +1 -1
  41. package/dist/billing/billing-labels.js.map +1 -1
  42. package/dist/billing/checkout-processing.js.map +1 -1
  43. package/dist/billing/plan-card.js +91 -85
  44. package/dist/billing/plan-card.js.map +1 -1
  45. package/dist/billing/plan-limit-toast.js.map +1 -1
  46. package/dist/billing/plan-limit.js.map +1 -1
  47. package/dist/billing/plan-price.js.map +1 -1
  48. package/dist/billing/plan-switch.js.map +1 -1
  49. package/dist/billing/subscription-actions.js.map +1 -1
  50. package/dist/bin/eifi1-pay-page.mjs +6 -1
  51. package/dist/components/account-chips.js.map +1 -1
  52. package/dist/components/alert-banner.js +1 -5
  53. package/dist/components/alert-banner.js.map +1 -1
  54. package/dist/components/amount-input.js +29 -12
  55. package/dist/components/amount-input.js.map +1 -1
  56. package/dist/components/authed-image.js.map +1 -1
  57. package/dist/components/autocomplete.js.map +1 -1
  58. package/dist/components/bulk-action-bar.js +1 -4
  59. package/dist/components/bulk-action-bar.js.map +1 -1
  60. package/dist/components/button-group.js.map +1 -1
  61. package/dist/components/button-look.js.map +1 -1
  62. package/dist/components/button.js +1 -7
  63. package/dist/components/button.js.map +1 -1
  64. package/dist/components/calculator.js +5 -5
  65. package/dist/components/calculator.js.map +1 -1
  66. package/dist/components/calendar-heatmap.js +4 -10
  67. package/dist/components/calendar-heatmap.js.map +1 -1
  68. package/dist/components/card.js +1 -8
  69. package/dist/components/card.js.map +1 -1
  70. package/dist/components/chart-zoom-core.js +3 -17
  71. package/dist/components/chart-zoom-core.js.map +1 -1
  72. package/dist/components/chart.d.ts +1 -1
  73. package/dist/components/chart.js +4 -22
  74. package/dist/components/chart.js.map +1 -1
  75. package/dist/components/checkbox-group.js +1 -4
  76. package/dist/components/checkbox-group.js.map +1 -1
  77. package/dist/components/chip-input.js +4 -1
  78. package/dist/components/chip-input.js.map +1 -1
  79. package/dist/components/chip.js +10 -5
  80. package/dist/components/chip.js.map +1 -1
  81. package/dist/components/choice-card.js +58 -74
  82. package/dist/components/choice-card.js.map +1 -1
  83. package/dist/components/column-mapper-labels.js.map +1 -1
  84. package/dist/components/column-mapper.js +167 -227
  85. package/dist/components/column-mapper.js.map +1 -1
  86. package/dist/components/combobox-core.js +1 -4
  87. package/dist/components/combobox-core.js.map +1 -1
  88. package/dist/components/combobox.js +1 -4
  89. package/dist/components/combobox.js.map +1 -1
  90. package/dist/components/confirm-dialog.js.map +1 -1
  91. package/dist/components/copy-button.js.map +1 -1
  92. package/dist/components/country-select.d.ts +5 -4
  93. package/dist/components/country-select.js +3 -19
  94. package/dist/components/country-select.js.map +1 -1
  95. package/dist/components/currency-option-list.js +10 -8
  96. package/dist/components/currency-option-list.js.map +1 -1
  97. package/dist/components/currency-select.js +1 -6
  98. package/dist/components/currency-select.js.map +1 -1
  99. package/dist/components/danger-confirm.js.map +1 -1
  100. package/dist/components/data-table-cells.js.map +1 -1
  101. package/dist/components/data-table-column-settings.js.map +1 -1
  102. package/dist/components/data-table-filter-popover.js +2 -18
  103. package/dist/components/data-table-filter-popover.js.map +1 -1
  104. package/dist/components/data-table-filters.js.map +1 -1
  105. package/dist/components/data-table-fit.js.map +1 -1
  106. package/dist/components/data-table-groups.js +3 -1
  107. package/dist/components/data-table-groups.js.map +1 -1
  108. package/dist/components/data-table-head.js +44 -56
  109. package/dist/components/data-table-head.js.map +1 -1
  110. package/dist/components/data-table-mobile.js +31 -44
  111. package/dist/components/data-table-mobile.js.map +1 -1
  112. package/dist/components/data-table-pagination.js.map +1 -1
  113. package/dist/components/data-table-row-actions.js +19 -16
  114. package/dist/components/data-table-row-actions.js.map +1 -1
  115. package/dist/components/data-table-row.js.map +1 -1
  116. package/dist/components/data-table-shared.js.map +1 -1
  117. package/dist/components/data-table-sort.js.map +1 -1
  118. package/dist/components/data-table-virtual.js +4 -1
  119. package/dist/components/data-table-virtual.js.map +1 -1
  120. package/dist/components/data-table.js +30 -39
  121. package/dist/components/data-table.js.map +1 -1
  122. package/dist/components/date-picker.js +1 -6
  123. package/dist/components/date-picker.js.map +1 -1
  124. package/dist/components/date-range-picker.js.map +1 -1
  125. package/dist/components/description-list.js +10 -10
  126. package/dist/components/description-list.js.map +1 -1
  127. package/dist/components/dialog-frame.js +9 -2
  128. package/dist/components/dialog-frame.js.map +1 -1
  129. package/dist/components/disclosure.js +17 -27
  130. package/dist/components/disclosure.js.map +1 -1
  131. package/dist/components/dropdown.js +25 -35
  132. package/dist/components/dropdown.js.map +1 -1
  133. package/dist/components/empty-state.js.map +1 -1
  134. package/dist/components/entity-combobox.js.map +1 -1
  135. package/dist/components/error-boundary.js.map +1 -1
  136. package/dist/components/field-base.js +5 -5
  137. package/dist/components/field-base.js.map +1 -1
  138. package/dist/components/field-parts.d.ts +1 -1
  139. package/dist/components/field-parts.js +10 -14
  140. package/dist/components/field-parts.js.map +1 -1
  141. package/dist/components/field-sync.js +8 -10
  142. package/dist/components/field-sync.js.map +1 -1
  143. package/dist/components/file-button.js.map +1 -1
  144. package/dist/components/file-dropzone.js.map +1 -1
  145. package/dist/components/floating-panel.js +4 -1
  146. package/dist/components/floating-panel.js.map +1 -1
  147. package/dist/components/focus-ring.js.map +1 -1
  148. package/dist/components/form-actions.js.map +1 -1
  149. package/dist/components/grouped-picker.js +6 -8
  150. package/dist/components/grouped-picker.js.map +1 -1
  151. package/dist/components/hover-menu.js +1 -4
  152. package/dist/components/hover-menu.js.map +1 -1
  153. package/dist/components/iban-input-labels.js.map +1 -1
  154. package/dist/components/icon-button.js +4 -1
  155. package/dist/components/icon-button.js.map +1 -1
  156. package/dist/components/icon-picker.js +2 -7
  157. package/dist/components/icon-picker.js.map +1 -1
  158. package/dist/components/image-grid.js +41 -50
  159. package/dist/components/image-grid.js.map +1 -1
  160. package/dist/components/inline-edit-field.js.map +1 -1
  161. package/dist/components/inline-entity-combobox.js +2 -8
  162. package/dist/components/inline-entity-combobox.js.map +1 -1
  163. package/dist/components/input.js +14 -2
  164. package/dist/components/input.js.map +1 -1
  165. package/dist/components/jump-calendar.js +1 -7
  166. package/dist/components/jump-calendar.js.map +1 -1
  167. package/dist/components/legal-labels.js.map +1 -1
  168. package/dist/components/legal-page.js +14 -2
  169. package/dist/components/legal-page.js.map +1 -1
  170. package/dist/components/legal.js +12 -2
  171. package/dist/components/legal.js.map +1 -1
  172. package/dist/components/lightbox.js.map +1 -1
  173. package/dist/components/line-items.js +26 -36
  174. package/dist/components/line-items.js.map +1 -1
  175. package/dist/components/list.js +22 -10
  176. package/dist/components/list.js.map +1 -1
  177. package/dist/components/measured-grid.js +29 -53
  178. package/dist/components/measured-grid.js.map +1 -1
  179. package/dist/components/menu-item.js.map +1 -1
  180. package/dist/components/mini-calendar.js +13 -31
  181. package/dist/components/mini-calendar.js.map +1 -1
  182. package/dist/components/money-field.js.map +1 -1
  183. package/dist/components/month-picker.js +10 -21
  184. package/dist/components/month-picker.js.map +1 -1
  185. package/dist/components/multi-entity-combobox.js +3 -16
  186. package/dist/components/multi-entity-combobox.js.map +1 -1
  187. package/dist/components/multi-select.js.map +1 -1
  188. package/dist/components/nav-pills.js +10 -1
  189. package/dist/components/nav-pills.js.map +1 -1
  190. package/dist/components/number-field.js.map +1 -1
  191. package/dist/components/number-input.js +1 -7
  192. package/dist/components/number-input.js.map +1 -1
  193. package/dist/components/numpad-sheet.js +1 -4
  194. package/dist/components/numpad-sheet.js.map +1 -1
  195. package/dist/components/one-time-code-input.js +1 -7
  196. package/dist/components/one-time-code-input.js.map +1 -1
  197. package/dist/components/page-contents.js +13 -22
  198. package/dist/components/page-contents.js.map +1 -1
  199. package/dist/components/page-header.js +1 -11
  200. package/dist/components/page-header.js.map +1 -1
  201. package/dist/components/password-strength-labels.js.map +1 -1
  202. package/dist/components/password-strength.js +2 -8
  203. package/dist/components/password-strength.js.map +1 -1
  204. package/dist/components/phone-input.js +42 -57
  205. package/dist/components/phone-input.js.map +1 -1
  206. package/dist/components/picker-sheet.js.map +1 -1
  207. package/dist/components/pie-chart.js +1 -8
  208. package/dist/components/pie-chart.js.map +1 -1
  209. package/dist/components/popover.js.map +1 -1
  210. package/dist/components/progress-bar.js +16 -9
  211. package/dist/components/progress-bar.js.map +1 -1
  212. package/dist/components/qr-code.js +1 -8
  213. package/dist/components/qr-code.js.map +1 -1
  214. package/dist/components/row-actions.js +5 -1
  215. package/dist/components/row-actions.js.map +1 -1
  216. package/dist/components/search-field.js.map +1 -1
  217. package/dist/components/select.js +28 -38
  218. package/dist/components/select.js.map +1 -1
  219. package/dist/components/separator.js +1 -5
  220. package/dist/components/separator.js.map +1 -1
  221. package/dist/components/series-chart-axes.js +4 -1
  222. package/dist/components/series-chart-axes.js.map +1 -1
  223. package/dist/components/series-chart-budget.js.map +1 -1
  224. package/dist/components/series-chart-ticks.js.map +1 -1
  225. package/dist/components/series-chart.js +29 -45
  226. package/dist/components/series-chart.js.map +1 -1
  227. package/dist/components/settings-fields.js +21 -17
  228. package/dist/components/settings-fields.js.map +1 -1
  229. package/dist/components/share-card.js +4 -9
  230. package/dist/components/share-card.js.map +1 -1
  231. package/dist/components/sign-chip.js.map +1 -1
  232. package/dist/components/signature-pad.js +4 -13
  233. package/dist/components/signature-pad.js.map +1 -1
  234. package/dist/components/signed-amount.js +12 -5
  235. package/dist/components/signed-amount.js.map +1 -1
  236. package/dist/components/skeleton.js +2 -17
  237. package/dist/components/skeleton.js.map +1 -1
  238. package/dist/components/slider.js +13 -36
  239. package/dist/components/slider.js.map +1 -1
  240. package/dist/components/sparkline.js.map +1 -1
  241. package/dist/components/stat-tile.js +14 -10
  242. package/dist/components/stat-tile.js.map +1 -1
  243. package/dist/components/swatch-picker.js +14 -4
  244. package/dist/components/swatch-picker.js.map +1 -1
  245. package/dist/components/swipeable-row.d.ts +1 -1
  246. package/dist/components/swipeable-row.js +1 -8
  247. package/dist/components/swipeable-row.js.map +1 -1
  248. package/dist/components/table-skeleton.js +4 -1
  249. package/dist/components/table-skeleton.js.map +1 -1
  250. package/dist/components/table.js +12 -9
  251. package/dist/components/table.js.map +1 -1
  252. package/dist/components/tabs.js +5 -24
  253. package/dist/components/tabs.js.map +1 -1
  254. package/dist/components/text-link.js.map +1 -1
  255. package/dist/components/text.js.map +1 -1
  256. package/dist/components/tile-radio.js +1 -7
  257. package/dist/components/tile-radio.js.map +1 -1
  258. package/dist/components/time-input.js.map +1 -1
  259. package/dist/components/toast.js.map +1 -1
  260. package/dist/components/toggle-group.js +6 -1
  261. package/dist/components/toggle-group.js.map +1 -1
  262. package/dist/components/toggle-legend.js +2 -11
  263. package/dist/components/toggle-legend.js.map +1 -1
  264. package/dist/components/tooltip.js +2 -22
  265. package/dist/components/tooltip.js.map +1 -1
  266. package/dist/components/translation-review-editor.js +1 -4
  267. package/dist/components/translation-review-editor.js.map +1 -1
  268. package/dist/components/translation-review-parts.d.ts +1 -1
  269. package/dist/components/translation-review-parts.js +7 -1
  270. package/dist/components/translation-review-parts.js.map +1 -1
  271. package/dist/components/translation-review.js +18 -7
  272. package/dist/components/translation-review.js.map +1 -1
  273. package/dist/components/tree-view.js +14 -10
  274. package/dist/components/tree-view.js.map +1 -1
  275. package/dist/components/treemap.d.ts +24 -2
  276. package/dist/components/treemap.js +28 -4
  277. package/dist/components/treemap.js.map +1 -1
  278. package/dist/components/trigger-aria.js.map +1 -1
  279. package/dist/components/use-table-state.js +14 -11
  280. package/dist/components/use-table-state.js.map +1 -1
  281. package/dist/components/user-avatar.js +3 -26
  282. package/dist/components/user-avatar.js.map +1 -1
  283. package/dist/demo/demo-start.js +8 -4
  284. package/dist/demo/demo-start.js.map +1 -1
  285. package/dist/eslint/index.js +1 -1
  286. package/dist/feedback/feedback-attachment-labels.js.map +1 -1
  287. package/dist/feedback/feedback-attachment.js +1 -8
  288. package/dist/feedback/feedback-attachment.js.map +1 -1
  289. package/dist/feedback/feedback-capture.d.ts +1 -1
  290. package/dist/feedback/feedback-capture.js +3 -1
  291. package/dist/feedback/feedback-capture.js.map +1 -1
  292. package/dist/feedback/feedback-comment-thread.js +27 -13
  293. package/dist/feedback/feedback-comment-thread.js.map +1 -1
  294. package/dist/feedback/feedback-context.js +1 -4
  295. package/dist/feedback/feedback-context.js.map +1 -1
  296. package/dist/feedback/feedback-dialog.js.map +1 -1
  297. package/dist/feedback/feedback-inbox.js.map +1 -1
  298. package/dist/feedback/feedback-public-list.js +7 -1
  299. package/dist/feedback/feedback-public-list.js.map +1 -1
  300. package/dist/feedback/feedback-record.js +1 -5
  301. package/dist/feedback/feedback-record.js.map +1 -1
  302. package/dist/feedback/feedback-replies.js +25 -10
  303. package/dist/feedback/feedback-replies.js.map +1 -1
  304. package/dist/feedback/feedback-row-detail.js.map +1 -1
  305. package/dist/feedback/feedback-status-undo.js.map +1 -1
  306. package/dist/feedback/feedback-submit-dialog.js.map +1 -1
  307. package/dist/feedback/feedback-table.js +4 -1
  308. package/dist/feedback/feedback-table.js.map +1 -1
  309. package/dist/feedback/feedback-thread.js +2 -13
  310. package/dist/feedback/feedback-thread.js.map +1 -1
  311. package/dist/feedback/feedback-vocabulary.js.map +1 -1
  312. package/dist/feedback/feedback-vote-button.js.map +1 -1
  313. package/dist/hooks/use-anchored-rect.js.map +1 -1
  314. package/dist/hooks/use-document-title.js.map +1 -1
  315. package/dist/hooks/use-file-drop.js.map +1 -1
  316. package/dist/hooks/use-file-picker-labels.js.map +1 -1
  317. package/dist/hooks/use-file-picker.js.map +1 -1
  318. package/dist/hooks/use-focus-trap.js.map +1 -1
  319. package/dist/hooks/use-overlay-history.js +10 -5
  320. package/dist/hooks/use-overlay-history.js.map +1 -1
  321. package/dist/hooks/use-row-swipe.d.ts +1 -1
  322. package/dist/hooks/use-row-swipe.js +1 -6
  323. package/dist/hooks/use-row-swipe.js.map +1 -1
  324. package/dist/i18n/defaults.js +1 -4
  325. package/dist/i18n/defaults.js.map +1 -1
  326. package/dist/i18n/german.js +4 -1
  327. package/dist/i18n/german.js.map +1 -1
  328. package/dist/i18n/kit-labels.js +2 -8
  329. package/dist/i18n/kit-labels.js.map +1 -1
  330. package/dist/i18n/languages.js.map +1 -1
  331. package/dist/i18n/locales/en.js +4 -1
  332. package/dist/i18n/locales/en.js.map +2 -2
  333. package/dist/i18n/locales/es.js +4 -1
  334. package/dist/i18n/locales/es.js.map +1 -1
  335. package/dist/i18n/locales/fr.js +4 -1
  336. package/dist/i18n/locales/fr.js.map +1 -1
  337. package/dist/i18n/locales/hu.js +4 -1
  338. package/dist/i18n/locales/hu.js.map +1 -1
  339. package/dist/i18n/locales/it.js +4 -1
  340. package/dist/i18n/locales/it.js.map +1 -1
  341. package/dist/i18n/locales/zh.js.map +1 -1
  342. package/dist/i18n/plurals.js.map +1 -1
  343. package/dist/i18n/review.js +13 -7
  344. package/dist/i18n/review.js.map +1 -1
  345. package/dist/i18n/shared-labels.js.map +1 -1
  346. package/dist/index.d.ts +16 -16
  347. package/dist/index.js +40 -23
  348. package/dist/index.js.map +1 -1
  349. package/dist/landing/access.js +1 -4
  350. package/dist/landing/access.js.map +1 -1
  351. package/dist/landing/landing-sections.js +35 -38
  352. package/dist/landing/landing-sections.js.map +1 -1
  353. package/dist/landing/page-seo.js.map +1 -1
  354. package/dist/lib/calc.js.map +1 -1
  355. package/dist/lib/clipboard-minus.js.map +1 -1
  356. package/dist/lib/dates.js.map +1 -1
  357. package/dist/lib/decimal-marks.js.map +1 -1
  358. package/dist/lib/device-settings.js +2 -1
  359. package/dist/lib/device-settings.js.map +1 -1
  360. package/dist/lib/direction.js.map +1 -1
  361. package/dist/lib/iban.js.map +1 -1
  362. package/dist/lib/logger.js +1 -5
  363. package/dist/lib/logger.js.map +1 -1
  364. package/dist/lib/person-name.js.map +1 -1
  365. package/dist/lib/phone.js.map +1 -1
  366. package/dist/lib/qr-encode.js +344 -8
  367. package/dist/lib/qr-encode.js.map +1 -1
  368. package/dist/lib/session-refresh.js.map +1 -1
  369. package/dist/lib/table-text.js +15 -3
  370. package/dist/lib/table-text.js.map +1 -1
  371. package/dist/lib/text-match.d.ts +4 -0
  372. package/dist/lib/text-match.js.map +1 -1
  373. package/dist/lib/translation-review.js.map +1 -1
  374. package/dist/notifications/notification-inbox.js +63 -44
  375. package/dist/notifications/notification-inbox.js.map +1 -1
  376. package/dist/notifications/notification-parts.js.map +1 -1
  377. package/dist/notifications/notification-types-setting.js.map +1 -1
  378. package/dist/notifications/notifications-labels.js.map +1 -1
  379. package/dist/notifications/push-device-setting.js +6 -1
  380. package/dist/notifications/push-device-setting.js.map +1 -1
  381. package/dist/notifications/push-devices-setting.js.map +1 -1
  382. package/dist/notifications/push-worker.js.map +1 -1
  383. package/dist/notifications/quiet-hours-setting.js.map +1 -1
  384. package/dist/notifications/use-push-device.js +4 -1
  385. package/dist/notifications/use-push-device.js.map +1 -1
  386. package/dist/offline/pwa-update-prompt.d.ts +1 -1
  387. package/dist/offline/pwa-update-prompt.js +7 -1
  388. package/dist/offline/pwa-update-prompt.js.map +1 -1
  389. package/dist/offline/query-persistence.js.map +1 -1
  390. package/dist/offline.d.ts +1 -1
  391. package/dist/offline.js +6 -1
  392. package/dist/offline.js.map +1 -1
  393. package/dist/pay/pay.css +8 -1
  394. package/dist/rhf/fields.d.ts +1 -2
  395. package/dist/rhf/fields.js +1 -10
  396. package/dist/rhf/fields.js.map +1 -1
  397. package/dist/rhf/form-core.js +1 -4
  398. package/dist/rhf/form-core.js.map +1 -1
  399. package/dist/rhf/line-items.js.map +1 -1
  400. package/dist/rhf/use-rhf-wizard-step.js.map +1 -1
  401. package/dist/search/command-palette.js +71 -62
  402. package/dist/search/command-palette.js.map +1 -1
  403. package/dist/search/global-search.js +34 -5
  404. package/dist/search/global-search.js.map +1 -1
  405. package/dist/search/search-index.js.map +1 -1
  406. package/dist/settings/device-reset-setting.js +1 -6
  407. package/dist/settings/device-reset-setting.js.map +1 -1
  408. package/dist/settings/settings-heading.js.map +1 -1
  409. package/dist/settings/settings-layout.js +9 -20
  410. package/dist/settings/settings-layout.js.map +1 -1
  411. package/dist/settings/use-settings-route.js.map +1 -1
  412. package/dist/shell/app-shell.js +62 -31
  413. package/dist/shell/app-shell.js.map +1 -1
  414. package/dist/shell/auth-layout.js +1 -10
  415. package/dist/shell/auth-layout.js.map +1 -1
  416. package/dist/shell/dev-menu.js +12 -6
  417. package/dist/shell/dev-menu.js.map +1 -1
  418. package/dist/shell/option-switcher-menu.js.map +1 -1
  419. package/dist/shell/sync-status-indicator.js +7 -6
  420. package/dist/shell/sync-status-indicator.js.map +1 -1
  421. package/dist/shell/top-bar-parts-labels.js.map +1 -1
  422. package/dist/shell/topbar-action-menu.js.map +1 -1
  423. package/dist/shell/topbar-controls.js +1 -10
  424. package/dist/shell/topbar-controls.js.map +1 -1
  425. package/dist/shell/tour-menu.js +9 -1
  426. package/dist/shell/tour-menu.js.map +1 -1
  427. package/dist/sync/db.js.map +1 -1
  428. package/dist/sync/engine.js +24 -6
  429. package/dist/sync/engine.js.map +1 -1
  430. package/dist/sync.d.ts +2 -2
  431. package/dist/sync.js +7 -1
  432. package/dist/sync.js.map +1 -1
  433. package/dist/testing/css-variables.js.map +1 -1
  434. package/dist/testing/index.d.ts +1 -1
  435. package/dist/testing/index.js +1 -3
  436. package/dist/testing/index.js.map +1 -1
  437. package/dist/testing/react.js.map +1 -1
  438. package/dist/testing/viewport.js +7 -4
  439. package/dist/testing/viewport.js.map +1 -1
  440. package/dist/theme/contrast-tokens.js +13 -2
  441. package/dist/theme/contrast-tokens.js.map +1 -1
  442. package/dist/theme/contrast.d.ts +2 -2
  443. package/dist/theme/palette-derive.d.ts +1 -1
  444. package/dist/theme/palette-derive.js +18 -29
  445. package/dist/theme/palette-derive.js.map +1 -1
  446. package/dist/theme/palette-presets.js.map +1 -1
  447. package/dist/theme/palette-store.js.map +1 -1
  448. package/dist/theme/text-size.js.map +1 -1
  449. package/dist/theme/theme-store.js +1 -3
  450. package/dist/theme/theme-store.js.map +1 -1
  451. package/dist/tour/tour-catalogue.js.map +1 -1
  452. package/dist/tour/tour-dock.js +5 -1
  453. package/dist/tour/tour-dock.js.map +1 -1
  454. package/dist/tour/tour-engine.js +1 -4
  455. package/dist/tour/tour-engine.js.map +1 -1
  456. package/dist/tour/tour.js +21 -12
  457. package/dist/tour/tour.js.map +1 -1
  458. package/dist/tour/use-tour-progress.js.map +1 -1
  459. package/dist/tour/use-tour-url-sync.js.map +1 -1
  460. package/dist/wizard/stepper-nav.js +3 -24
  461. package/dist/wizard/stepper-nav.js.map +1 -1
  462. package/dist/wizard/types.js.map +1 -1
  463. package/dist/wizard/use-wizard.js +24 -28
  464. package/dist/wizard/use-wizard.js.map +1 -1
  465. package/dist/wizard/validation.js.map +1 -1
  466. package/dist/wizard/wizard-context.js.map +1 -1
  467. package/dist/wizard/wizard-step.d.ts +1 -1
  468. package/dist/wizard/wizard-step.js +1 -8
  469. package/dist/wizard/wizard-step.js.map +1 -1
  470. package/dist/wizard/wizard-summary.js.map +1 -1
  471. package/package.json +5 -2
  472. package/src/account/account-settings-labels.ts +1 -2
  473. package/src/account/account-settings.tsx +11 -17
  474. package/src/account/delete-account-setting.tsx +1 -6
  475. package/src/account/email-change-setting-labels.ts +1 -2
  476. package/src/account/email-change-setting.tsx +3 -1
  477. package/src/account/passkeys-setting.tsx +1 -3
  478. package/src/account/sessions-setting.tsx +4 -2
  479. package/src/admin/admin-action-confirm.tsx +4 -7
  480. package/src/admin/admin-action-log.tsx +29 -29
  481. package/src/admin/admin-area-labels.ts +4 -1
  482. package/src/admin/admin-overview.tsx +8 -2
  483. package/src/admin/admin-sections.tsx +3 -1
  484. package/src/admin/admin-tool-links.tsx +7 -1
  485. package/src/admin/invitations-panel.tsx +5 -11
  486. package/src/admin/mail-test-card.tsx +1 -2
  487. package/src/admin/reviewer-scope-editor.tsx +4 -9
  488. package/src/admin/role-select.tsx +4 -2
  489. package/src/admin/user-roster.tsx +2 -11
  490. package/src/auth/accept-invitation.tsx +1 -7
  491. package/src/auth/auth-errors.ts +1 -6
  492. package/src/auth/forgot-password-form.tsx +2 -7
  493. package/src/auth/register-form.tsx +7 -8
  494. package/src/auth/reset-password-form.tsx +2 -5
  495. package/src/auth/sign-in-form.tsx +15 -14
  496. package/src/auth/verify-email.tsx +2 -7
  497. package/src/billing/billing-banner.tsx +3 -7
  498. package/src/billing/billing-labels.ts +6 -4
  499. package/src/billing/checkout-processing.ts +0 -1
  500. package/src/billing/plan-card.tsx +9 -8
  501. package/src/billing/plan-limit-toast.tsx +1 -2
  502. package/src/billing/plan-limit.ts +1 -2
  503. package/src/billing/plan-price.ts +1 -4
  504. package/src/billing/plan-switch.tsx +1 -2
  505. package/src/billing/subscription-actions.tsx +5 -2
  506. package/src/components/account-chips.tsx +1 -7
  507. package/src/components/alert-banner.tsx +2 -8
  508. package/src/components/amount-input.tsx +206 -178
  509. package/src/components/authed-image.tsx +7 -4
  510. package/src/components/autocomplete.tsx +7 -9
  511. package/src/components/bulk-action-bar.tsx +2 -7
  512. package/src/components/button-group.tsx +1 -2
  513. package/src/components/button-look.ts +6 -17
  514. package/src/components/button.tsx +1 -4
  515. package/src/components/calculator.tsx +6 -9
  516. package/src/components/calendar-heatmap.tsx +5 -10
  517. package/src/components/card.tsx +9 -13
  518. package/src/components/chart-zoom-core.tsx +6 -33
  519. package/src/components/chart.tsx +8 -31
  520. package/src/components/checkbox-group.tsx +1 -4
  521. package/src/components/chip-input.tsx +6 -6
  522. package/src/components/chip.tsx +14 -26
  523. package/src/components/choice-card.tsx +4 -18
  524. package/src/components/column-mapper-labels.ts +3 -10
  525. package/src/components/column-mapper.tsx +33 -122
  526. package/src/components/combobox-core.tsx +12 -42
  527. package/src/components/combobox.tsx +2 -6
  528. package/src/components/confirm-dialog.tsx +1 -3
  529. package/src/components/copy-button.tsx +2 -4
  530. package/src/components/country-select.tsx +9 -21
  531. package/src/components/currency-option-list.tsx +13 -14
  532. package/src/components/currency-select.tsx +2 -7
  533. package/src/components/danger-confirm.tsx +8 -9
  534. package/src/components/data-table-cells.tsx +1 -2
  535. package/src/components/data-table-column-settings.tsx +1 -3
  536. package/src/components/data-table-filter-popover.tsx +5 -19
  537. package/src/components/data-table-filters.ts +1 -6
  538. package/src/components/data-table-fit.ts +1 -3
  539. package/src/components/data-table-groups.tsx +3 -1
  540. package/src/components/data-table-head.tsx +27 -45
  541. package/src/components/data-table-mobile.tsx +99 -108
  542. package/src/components/data-table-pagination.tsx +2 -6
  543. package/src/components/data-table-row-actions.tsx +25 -24
  544. package/src/components/data-table-row.tsx +16 -17
  545. package/src/components/data-table-shared.tsx +10 -16
  546. package/src/components/data-table-sort.ts +1 -2
  547. package/src/components/data-table-virtual.ts +9 -4
  548. package/src/components/data-table.tsx +489 -501
  549. package/src/components/date-picker.tsx +1 -7
  550. package/src/components/date-range-picker.tsx +3 -13
  551. package/src/components/description-list.tsx +7 -13
  552. package/src/components/dialog-frame.tsx +12 -3
  553. package/src/components/disclosure.tsx +8 -12
  554. package/src/components/dropdown.tsx +3 -11
  555. package/src/components/empty-state.tsx +1 -3
  556. package/src/components/entity-combobox.tsx +2 -6
  557. package/src/components/error-boundary.tsx +7 -7
  558. package/src/components/field-base.tsx +8 -14
  559. package/src/components/field-parts.tsx +12 -23
  560. package/src/components/field-sync.tsx +7 -11
  561. package/src/components/file-button.tsx +7 -3
  562. package/src/components/file-dropzone.tsx +7 -12
  563. package/src/components/floating-panel.tsx +44 -51
  564. package/src/components/focus-ring.ts +1 -2
  565. package/src/components/form-actions.tsx +1 -4
  566. package/src/components/grouped-picker.tsx +6 -8
  567. package/src/components/hover-menu.tsx +1 -4
  568. package/src/components/iban-input-labels.ts +1 -2
  569. package/src/components/icon-button.tsx +46 -48
  570. package/src/components/icon-picker.tsx +4 -17
  571. package/src/components/image-grid.tsx +1 -6
  572. package/src/components/inline-edit-field.tsx +1 -5
  573. package/src/components/inline-entity-combobox.tsx +6 -21
  574. package/src/components/input.tsx +14 -2
  575. package/src/components/jump-calendar.tsx +2 -6
  576. package/src/components/legal-labels.ts +1 -2
  577. package/src/components/legal-page.tsx +18 -7
  578. package/src/components/legal.tsx +14 -5
  579. package/src/components/lightbox.tsx +1 -3
  580. package/src/components/line-items.tsx +7 -15
  581. package/src/components/list.tsx +29 -25
  582. package/src/components/measured-grid.tsx +8 -30
  583. package/src/components/menu-item.tsx +1 -3
  584. package/src/components/mini-calendar.tsx +129 -159
  585. package/src/components/money-field.tsx +4 -2
  586. package/src/components/month-picker.tsx +14 -21
  587. package/src/components/multi-entity-combobox.tsx +6 -26
  588. package/src/components/multi-select.tsx +5 -9
  589. package/src/components/nav-pills.tsx +10 -2
  590. package/src/components/number-field.tsx +18 -15
  591. package/src/components/number-input.tsx +3 -19
  592. package/src/components/numpad-sheet.tsx +9 -13
  593. package/src/components/one-time-code-input.tsx +6 -11
  594. package/src/components/page-contents.tsx +2 -9
  595. package/src/components/page-header.tsx +5 -10
  596. package/src/components/password-strength-labels.ts +1 -2
  597. package/src/components/password-strength.tsx +6 -9
  598. package/src/components/phone-input.tsx +2 -13
  599. package/src/components/picker-sheet.tsx +2 -5
  600. package/src/components/pie-chart.tsx +6 -12
  601. package/src/components/popover.tsx +2 -1
  602. package/src/components/progress-bar.tsx +16 -25
  603. package/src/components/qr-code.tsx +2 -9
  604. package/src/components/row-actions.tsx +9 -1
  605. package/src/components/search-field.tsx +4 -5
  606. package/src/components/select.tsx +2 -10
  607. package/src/components/separator.tsx +1 -5
  608. package/src/components/series-chart-axes.ts +5 -5
  609. package/src/components/series-chart-budget.ts +1 -4
  610. package/src/components/series-chart-ticks.ts +1 -4
  611. package/src/components/series-chart.tsx +43 -83
  612. package/src/components/settings-fields.tsx +20 -15
  613. package/src/components/share-card.tsx +6 -14
  614. package/src/components/sign-chip.tsx +16 -16
  615. package/src/components/signature-pad.tsx +21 -13
  616. package/src/components/signed-amount.tsx +6 -14
  617. package/src/components/skeleton.tsx +2 -13
  618. package/src/components/slider.tsx +9 -20
  619. package/src/components/sparkline.tsx +2 -13
  620. package/src/components/stat-tile.tsx +13 -24
  621. package/src/components/swatch-picker.tsx +8 -3
  622. package/src/components/swipeable-row.tsx +2 -11
  623. package/src/components/table-skeleton.tsx +4 -1
  624. package/src/components/table.tsx +12 -8
  625. package/src/components/tabs.tsx +24 -39
  626. package/src/components/text-link.tsx +6 -6
  627. package/src/components/text.tsx +1 -2
  628. package/src/components/tile-radio.tsx +6 -19
  629. package/src/components/time-input.tsx +4 -5
  630. package/src/components/toast.tsx +3 -12
  631. package/src/components/toggle-group.tsx +9 -9
  632. package/src/components/toggle-legend.tsx +4 -16
  633. package/src/components/tooltip.tsx +9 -48
  634. package/src/components/translation-review-editor.tsx +4 -4
  635. package/src/components/translation-review-parts.tsx +7 -1
  636. package/src/components/translation-review.tsx +15 -16
  637. package/src/components/tree-view.tsx +17 -20
  638. package/src/components/treemap.tsx +59 -9
  639. package/src/components/trigger-aria.ts +1 -4
  640. package/src/components/use-table-state.ts +16 -17
  641. package/src/components/user-avatar.tsx +4 -21
  642. package/src/demo/demo-start.tsx +8 -4
  643. package/src/feedback/feedback-attachment-labels.ts +2 -1
  644. package/src/feedback/feedback-attachment.tsx +16 -29
  645. package/src/feedback/feedback-capture.ts +3 -1
  646. package/src/feedback/feedback-comment-thread.tsx +9 -6
  647. package/src/feedback/feedback-context.tsx +1 -4
  648. package/src/feedback/feedback-dialog.tsx +3 -4
  649. package/src/feedback/feedback-inbox.tsx +3 -9
  650. package/src/feedback/feedback-public-list.tsx +7 -1
  651. package/src/feedback/feedback-record.ts +6 -14
  652. package/src/feedback/feedback-replies.tsx +10 -5
  653. package/src/feedback/feedback-row-detail.tsx +2 -5
  654. package/src/feedback/feedback-status-undo.ts +1 -4
  655. package/src/feedback/feedback-submit-dialog.tsx +4 -4
  656. package/src/feedback/feedback-table.tsx +12 -8
  657. package/src/feedback/feedback-thread.tsx +4 -16
  658. package/src/feedback/feedback-vocabulary.ts +72 -82
  659. package/src/feedback/feedback-vote-button.tsx +9 -8
  660. package/src/hooks/use-anchored-rect.ts +1 -4
  661. package/src/hooks/use-document-title.ts +3 -1
  662. package/src/hooks/use-file-drop.ts +1 -3
  663. package/src/hooks/use-file-picker-labels.ts +1 -2
  664. package/src/hooks/use-file-picker.tsx +1 -5
  665. package/src/hooks/use-focus-trap.ts +1 -2
  666. package/src/hooks/use-overlay-history.ts +10 -5
  667. package/src/hooks/use-row-swipe.ts +1 -6
  668. package/src/i18n/defaults.ts +1 -4
  669. package/src/i18n/german.ts +33 -49
  670. package/src/i18n/kit-labels.tsx +5 -20
  671. package/src/i18n/languages.ts +2 -8
  672. package/src/i18n/locales/en.ts +11 -31
  673. package/src/i18n/locales/es.ts +35 -49
  674. package/src/i18n/locales/fr.ts +34 -51
  675. package/src/i18n/locales/hu.ts +26 -37
  676. package/src/i18n/locales/it.ts +35 -52
  677. package/src/i18n/locales/zh.ts +14 -32
  678. package/src/i18n/plurals.ts +4 -1
  679. package/src/i18n/review.ts +18 -7
  680. package/src/i18n/shared-labels.ts +1 -2
  681. package/src/index.ts +106 -32
  682. package/src/landing/access.ts +2 -7
  683. package/src/landing/landing-sections.tsx +14 -15
  684. package/src/landing/page-seo.ts +1 -3
  685. package/src/lib/calc.ts +4 -1
  686. package/src/lib/clipboard-minus.ts +4 -1
  687. package/src/lib/dates.ts +2 -10
  688. package/src/lib/decimal-marks.ts +1 -3
  689. package/src/lib/device-settings.ts +2 -1
  690. package/src/lib/direction.ts +1 -3
  691. package/src/lib/iban.ts +89 -9
  692. package/src/lib/logger.ts +1 -5
  693. package/src/lib/person-name.ts +1 -3
  694. package/src/lib/phone.ts +5 -8
  695. package/src/lib/qr-encode.ts +32 -8
  696. package/src/lib/session-refresh.ts +5 -6
  697. package/src/lib/table-text.ts +24 -6
  698. package/src/lib/text-match.ts +15 -3
  699. package/src/lib/translation-review.ts +1 -3
  700. package/src/notifications/notification-inbox.tsx +17 -4
  701. package/src/notifications/notification-parts.tsx +1 -2
  702. package/src/notifications/notification-types-setting.tsx +19 -18
  703. package/src/notifications/notifications-labels.ts +1 -2
  704. package/src/notifications/push-device-setting.tsx +7 -1
  705. package/src/notifications/push-devices-setting.tsx +7 -3
  706. package/src/notifications/push-worker.ts +10 -2
  707. package/src/notifications/quiet-hours-setting.tsx +4 -1
  708. package/src/notifications/use-push-device.ts +4 -1
  709. package/src/offline/pwa-update-prompt.tsx +7 -1
  710. package/src/offline/query-persistence.ts +9 -6
  711. package/src/offline.ts +6 -1
  712. package/src/rhf/fields.tsx +50 -19
  713. package/src/rhf/form-core.tsx +2 -6
  714. package/src/rhf/line-items.tsx +5 -7
  715. package/src/rhf/use-rhf-wizard-step.ts +3 -12
  716. package/src/search/command-palette.tsx +15 -23
  717. package/src/search/global-search.tsx +38 -8
  718. package/src/search/search-index.ts +5 -1
  719. package/src/settings/device-reset-setting.tsx +5 -8
  720. package/src/settings/settings-heading.tsx +3 -1
  721. package/src/settings/settings-layout.tsx +6 -13
  722. package/src/settings/use-settings-route.ts +4 -3
  723. package/src/shell/app-shell.tsx +48 -24
  724. package/src/shell/auth-layout.tsx +1 -6
  725. package/src/shell/dev-menu.tsx +12 -6
  726. package/src/shell/option-switcher-menu.tsx +1 -3
  727. package/src/shell/sync-status-indicator.tsx +14 -12
  728. package/src/shell/top-bar-parts-labels.ts +1 -3
  729. package/src/shell/topbar-action-menu.tsx +9 -8
  730. package/src/shell/topbar-controls.tsx +5 -19
  731. package/src/shell/tour-menu.tsx +9 -1
  732. package/src/sync/db.ts +5 -1
  733. package/src/sync/engine.ts +44 -12
  734. package/src/sync.ts +16 -2
  735. package/src/testing/css-variables.ts +1 -2
  736. package/src/testing/index.ts +1 -6
  737. package/src/testing/react.ts +1 -2
  738. package/src/testing/viewport.ts +9 -9
  739. package/src/theme/contrast-tokens.ts +13 -2
  740. package/src/theme/palette-derive.ts +24 -50
  741. package/src/theme/palette-presets.ts +0 -1
  742. package/src/theme/palette-store.ts +1 -4
  743. package/src/theme/text-size.ts +1 -1
  744. package/src/theme/theme-store.ts +2 -6
  745. package/src/tour/tour-catalogue.tsx +4 -2
  746. package/src/tour/tour-dock.ts +5 -1
  747. package/src/tour/tour-engine.ts +2 -6
  748. package/src/tour/tour.tsx +28 -12
  749. package/src/tour/use-tour-progress.ts +8 -2
  750. package/src/tour/use-tour-url-sync.ts +3 -1
  751. package/src/vite-env.d.ts +1 -4
  752. package/src/wizard/stepper-nav.tsx +10 -35
  753. package/src/wizard/types.ts +1 -4
  754. package/src/wizard/use-wizard.ts +28 -43
  755. package/src/wizard/validation.ts +1 -5
  756. package/src/wizard/wizard-context.tsx +2 -6
  757. package/src/wizard/wizard-step.tsx +1 -8
  758. package/src/wizard/wizard-summary.tsx +2 -6
  759. package/tokens.css +393 -152
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/phone.ts"],"sourcesContent":["/**\n * Phone numbers — E.164 in, grouped out — for kastlan's contacts, without a\n * libphonenumber dependency.\n *\n * kastlan stored whatever was typed (\"079 …\", \"+41 (0)79 …\", \"0041 79 …\") and could\n * neither dial nor de-duplicate it. What it needs is one canonical form to store —\n * E.164, \"+41210000001\" — and a readable one to show. libphonenumber gets both right\n * for every country, at ~150 kB of metadata in every app's bundle; the kit's apps are\n * Swiss and their neighbours, so this is **light per-country rules** for the six that\n * matter and a generic shape check for the rest:\n *\n * - **CH, LI, DE, AT, FR, IT**: the national trunk prefix is dropped (a leading 0 —\n * but NOT for Italy, whose fixed-line numbers keep their 0 after +39, and not for\n * Liechtenstein, which has none), and the remaining national number has to be a\n * plausible length for the country.\n * - **Anything else** typed with its own \"+\" (or \"00\"): the digits, 8 to 15 in all,\n * are taken as an E.164 number as they stand.\n *\n * **The limitation:** a plausible length is not a valid number. There is no check of\n * area codes or number ranges, so a well-formed number that does not exist passes, and\n * a German or Austrian number (whose area codes run from one to five digits) is\n * grouped only where the split is known (mobile prefixes, the largest cities) and\n * otherwise shown in one block. A number these rules cannot read is not an error —\n * {@link parsePhone} returns `null` and the field keeps the text as typed.\n */\n\n/** The countries with their own rules. */\nexport type PhoneCountryCode = \"CH\" | \"LI\" | \"DE\" | \"AT\" | \"FR\" | \"IT\";\n\n/** A country with rules, or `\"other\"`: a number typed with its own \"+\". */\nexport type PhoneCountry = PhoneCountryCode | \"other\";\n\ninterface CountryRule {\n /** The country calling code, without the \"+\". */\n dial: string;\n /** A national number starts with a trunk 0 that is dropped after the country code. */\n trunk: boolean;\n /** The national significant number itself may start with 0 (Italy's fixed lines). */\n zeroStart?: boolean;\n /** The national significant number's length, inclusive. */\n min: number;\n max: number;\n /** Groups for display, given the national significant number. */\n group: (nsn: string) => string[];\n}\n\n/** `nsn` cut into the given sizes; whatever is left is one last group. */\nfunction cut(nsn: string, sizes: number[]): string[] {\n const out: string[] = [];\n let at = 0;\n for (const size of sizes) {\n if (at >= nsn.length) break;\n out.push(nsn.slice(at, at + size));\n at += size;\n }\n if (at < nsn.length) out.push(nsn.slice(at));\n return out;\n}\n\nconst RULES: Record<PhoneCountryCode, CountryRule> = {\n // 9 digits, 2-3-2-2 (\"21 000 00 01\"); the 08xx/09xx service numbers 3-3-3.\n CH: {\n dial: \"41\",\n trunk: true,\n min: 9,\n max: 9,\n group: (n) => (/^[89]/.test(n) ? cut(n, [3, 3, 3]) : cut(n, [2, 3, 2, 2])),\n },\n // 7 digits, 3-2-2 (\"100 00 01\"), and 9 for some mobile ranges (3-3-3). No trunk prefix.\n LI: {\n dial: \"423\",\n trunk: false,\n min: 7,\n max: 9,\n group: (n) => (n.length === 7 ? cut(n, [3, 2, 2]) : n.length === 9 ? cut(n, [3, 3, 3]) : [n]),\n },\n // Area codes of two to five digits: only the mobile prefixes and the four\n // two-digit cities are split; anything else is one block rather than a wrong split.\n DE: {\n dial: \"49\",\n trunk: true,\n min: 6,\n max: 13,\n group: (n) =>\n /^15/.test(n)\n ? cut(n, [4])\n : /^1[67]/.test(n)\n ? cut(n, [3])\n : /^(30|40|69|89)/.test(n)\n ? cut(n, [2])\n : [n],\n },\n // Vienna is \"1\"; mobile numbers start 6xx; other area codes vary, so one block.\n AT: {\n dial: \"43\",\n trunk: true,\n min: 6,\n max: 13,\n group: (n) => (/^6/.test(n) ? cut(n, [3]) : /^1/.test(n) ? cut(n, [1]) : [n]),\n },\n // 9 digits, 1-2-2-2-2 (\"1 99 00 00 01\").\n FR: { dial: \"33\", trunk: true, min: 9, max: 9, group: (n) => cut(n, [1, 2, 2, 2, 2]) },\n // The 0 of a fixed line is part of the number (\"+39 06 …\"); mobiles start with 3.\n IT: {\n dial: \"39\",\n trunk: false,\n zeroStart: true,\n min: 6,\n max: 11,\n group: (n) => (/^3/.test(n) ? cut(n, [3, 3]) : /^0[26]/.test(n) ? cut(n, [2, 4]) : [n]),\n },\n};\n\n/** The country calling codes with rules, \"+\" left off: `{ CH: \"41\", … }`. */\nexport const PHONE_DIAL_CODES: Readonly<Record<PhoneCountryCode, string>> = Object.freeze({\n CH: RULES.CH.dial,\n LI: RULES.LI.dial,\n DE: RULES.DE.dial,\n AT: RULES.AT.dial,\n FR: RULES.FR.dial,\n IT: RULES.IT.dial,\n});\n\n/** The countries with rules, in the order a picker offers them by default. */\nexport const PHONE_COUNTRIES: readonly PhoneCountryCode[] = Object.freeze([\"CH\", \"LI\", \"DE\", \"AT\", \"FR\", \"IT\"]);\n\n/** Longest dial code first, so \"+423\" is Liechtenstein before anything shorter. */\nconst BY_DIAL = [...PHONE_COUNTRIES].sort((a, b) => RULES[b].dial.length - RULES[a].dial.length);\n\n/** What {@link parsePhone} reads out of a number. */\nexport interface ParsedPhone {\n /** The number in E.164: \"+\", the country code, the national number. */\n e164: string;\n /** The country whose rules read it, or `null` for a generic \"+…\" number. */\n country: PhoneCountryCode | null;\n /** The national significant number — the digits after the country code. For a\n * generic number, every digit after the \"+\" (the country code is not split off). */\n national: string;\n}\n\n/** A national significant number that passes `rule`, or `null`. */\nfunction national(digits: string, rule: CountryRule): string | null {\n const nsn = rule.trunk && digits.startsWith(\"0\") ? digits.slice(1) : digits;\n // A national number starts with 0 only where 0 is part of it (Italy's fixed lines).\n if (nsn.startsWith(\"0\") && !rule.zeroStart) return null;\n if (nsn.length < rule.min || nsn.length > rule.max) return null;\n return nsn;\n}\n\n/**\n * Read a typed number. With a leading \"+\" or \"00\" the number carries its own country\n * code — one of the six with rules, or any other (8–15 digits in all, the E.164\n * limit). Without one it is a national number of `country` (default `\"CH\"`), its\n * trunk 0 optional; with `country=\"other\"` a number without \"+\" cannot be read.\n *\n * Spaces, hyphens, dots, slashes and parentheses are ignored (\"(030) 1234567\"), and\n * so is the \"(0)\" of \"+41 (0)21 …\". Anything else — a letter, an extension (\"ext. 12\"), a note —\n * and the result is `null`: the text is not a number these rules can read, and a field\n * keeps it as it is rather than guess.\n */\nexport function parsePhone(input: string, country: PhoneCountry = \"CH\"): ParsedPhone | null {\n const text = input.trim();\n if (text === \"\" || !/^\\+?[\\d\\s().\\-/]+$/.test(text)) return null;\n let digits = text.replace(/\\D/g, \"\");\n let international = text.startsWith(\"+\");\n if (!international && digits.startsWith(\"00\")) {\n international = true;\n digits = digits.slice(2);\n }\n if (international) {\n // \"+41 (0)21 …\": the bracketed trunk prefix written for callers inside the country.\n digits = text.replace(/\\(\\s*0\\s*\\)/g, \"\").replace(/\\D/g, \"\").replace(/^00/, \"\");\n if (digits.startsWith(\"0\")) return null;\n const known = BY_DIAL.find((c) => digits.startsWith(RULES[c].dial));\n if (known) {\n const rule = RULES[known];\n const nsn = national(digits.slice(rule.dial.length), rule);\n return nsn === null ? null : { e164: `+${rule.dial}${nsn}`, country: known, national: nsn };\n }\n if (digits.length < 8 || digits.length > 15) return null;\n return { e164: `+${digits}`, country: null, national: digits };\n }\n if (country === \"other\") return null;\n const rule = RULES[country];\n const nsn = national(digits, rule);\n return nsn === null ? null : { e164: `+${rule.dial}${nsn}`, country, national: nsn };\n}\n\n/** The national number grouped by its country's rules (\"21 000 00 01\"). */\nexport function formatNationalPhone(nsn: string, country: PhoneCountryCode): string {\n return RULES[country].group(nsn).join(\" \");\n}\n\n/**\n * A number for display: an E.164 number (or anything {@link parsePhone} reads with a\n * \"+\") grouped by its country's rules — \"+41 21 000 00 01\" — and a generic one as\n * \"+\" and its digits. Anything it cannot read comes back exactly as it went in, so a\n * list of contacts can format every row without first sorting out the free text.\n */\nexport function formatPhone(value: string): string {\n const parsed = value.trim().startsWith(\"+\") ? parsePhone(value, \"other\") : null;\n if (!parsed) return value;\n if (!parsed.country) return parsed.e164;\n return `+${RULES[parsed.country].dial} ${formatNationalPhone(parsed.national, parsed.country)}`;\n}\n\n/** Whether `value` is in E.164 shape: \"+\" and 8–15 digits, nothing else. Shape only —\n * what {@link PhoneInput} emits for every number it could read. */\nexport function isE164(value: string): boolean {\n return /^\\+[1-9]\\d{7,14}$/.test(value);\n}\n"],"mappings":"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","names":["rule","nsn"]}
1
+ {"version":3,"sources":["../../src/lib/phone.ts"],"sourcesContent":["/**\n * Phone numbers — E.164 in, grouped out — for kastlan's contacts, without a\n * libphonenumber dependency.\n *\n * kastlan stored whatever was typed (\"079 …\", \"+41 (0)79 …\", \"0041 79 …\") and could\n * neither dial nor de-duplicate it. What it needs is one canonical form to store —\n * E.164, \"+41210000001\" — and a readable one to show. libphonenumber gets both right\n * for every country, at ~150 kB of metadata in every app's bundle; the kit's apps are\n * Swiss and their neighbours, so this is **light per-country rules** for the six that\n * matter and a generic shape check for the rest:\n *\n * - **CH, LI, DE, AT, FR, IT**: the national trunk prefix is dropped (a leading 0 —\n * but NOT for Italy, whose fixed-line numbers keep their 0 after +39, and not for\n * Liechtenstein, which has none), and the remaining national number has to be a\n * plausible length for the country.\n * - **Anything else** typed with its own \"+\" (or \"00\"): the digits, 8 to 15 in all,\n * are taken as an E.164 number as they stand.\n *\n * **The limitation:** a plausible length is not a valid number. There is no check of\n * area codes or number ranges, so a well-formed number that does not exist passes, and\n * a German or Austrian number (whose area codes run from one to five digits) is\n * grouped only where the split is known (mobile prefixes, the largest cities) and\n * otherwise shown in one block. A number these rules cannot read is not an error —\n * {@link parsePhone} returns `null` and the field keeps the text as typed.\n */\n\n/** The countries with their own rules. */\nexport type PhoneCountryCode = \"CH\" | \"LI\" | \"DE\" | \"AT\" | \"FR\" | \"IT\";\n\n/** A country with rules, or `\"other\"`: a number typed with its own \"+\". */\nexport type PhoneCountry = PhoneCountryCode | \"other\";\n\ninterface CountryRule {\n /** The country calling code, without the \"+\". */\n dial: string;\n /** A national number starts with a trunk 0 that is dropped after the country code. */\n trunk: boolean;\n /** The national significant number itself may start with 0 (Italy's fixed lines). */\n zeroStart?: boolean;\n /** The national significant number's length, inclusive. */\n min: number;\n max: number;\n /** Groups for display, given the national significant number. */\n group: (nsn: string) => string[];\n}\n\n/** `nsn` cut into the given sizes; whatever is left is one last group. */\nfunction cut(nsn: string, sizes: number[]): string[] {\n const out: string[] = [];\n let at = 0;\n for (const size of sizes) {\n if (at >= nsn.length) break;\n out.push(nsn.slice(at, at + size));\n at += size;\n }\n if (at < nsn.length) out.push(nsn.slice(at));\n return out;\n}\n\nconst RULES: Record<PhoneCountryCode, CountryRule> = {\n // 9 digits, 2-3-2-2 (\"21 000 00 01\"); the 08xx/09xx service numbers 3-3-3.\n CH: {\n dial: \"41\",\n trunk: true,\n min: 9,\n max: 9,\n group: (n) => (/^[89]/.test(n) ? cut(n, [3, 3, 3]) : cut(n, [2, 3, 2, 2])),\n },\n // 7 digits, 3-2-2 (\"100 00 01\"), and 9 for some mobile ranges (3-3-3). No trunk prefix.\n LI: {\n dial: \"423\",\n trunk: false,\n min: 7,\n max: 9,\n group: (n) => (n.length === 7 ? cut(n, [3, 2, 2]) : n.length === 9 ? cut(n, [3, 3, 3]) : [n]),\n },\n // Area codes of two to five digits: only the mobile prefixes and the four\n // two-digit cities are split; anything else is one block rather than a wrong split.\n DE: {\n dial: \"49\",\n trunk: true,\n min: 6,\n max: 13,\n group: (n) =>\n /^15/.test(n) ? cut(n, [4]) : /^1[67]/.test(n) ? cut(n, [3]) : /^(30|40|69|89)/.test(n) ? cut(n, [2]) : [n],\n },\n // Vienna is \"1\"; mobile numbers start 6xx; other area codes vary, so one block.\n AT: {\n dial: \"43\",\n trunk: true,\n min: 6,\n max: 13,\n group: (n) => (/^6/.test(n) ? cut(n, [3]) : /^1/.test(n) ? cut(n, [1]) : [n]),\n },\n // 9 digits, 1-2-2-2-2 (\"1 99 00 00 01\").\n FR: { dial: \"33\", trunk: true, min: 9, max: 9, group: (n) => cut(n, [1, 2, 2, 2, 2]) },\n // The 0 of a fixed line is part of the number (\"+39 06 …\"); mobiles start with 3.\n IT: {\n dial: \"39\",\n trunk: false,\n zeroStart: true,\n min: 6,\n max: 11,\n group: (n) => (/^3/.test(n) ? cut(n, [3, 3]) : /^0[26]/.test(n) ? cut(n, [2, 4]) : [n]),\n },\n};\n\n/** The country calling codes with rules, \"+\" left off: `{ CH: \"41\", … }`. */\nexport const PHONE_DIAL_CODES: Readonly<Record<PhoneCountryCode, string>> = Object.freeze({\n CH: RULES.CH.dial,\n LI: RULES.LI.dial,\n DE: RULES.DE.dial,\n AT: RULES.AT.dial,\n FR: RULES.FR.dial,\n IT: RULES.IT.dial,\n});\n\n/** The countries with rules, in the order a picker offers them by default. */\nexport const PHONE_COUNTRIES: readonly PhoneCountryCode[] = Object.freeze([\"CH\", \"LI\", \"DE\", \"AT\", \"FR\", \"IT\"]);\n\n/** Longest dial code first, so \"+423\" is Liechtenstein before anything shorter. */\nconst BY_DIAL = [...PHONE_COUNTRIES].sort((a, b) => RULES[b].dial.length - RULES[a].dial.length);\n\n/** What {@link parsePhone} reads out of a number. */\nexport interface ParsedPhone {\n /** The number in E.164: \"+\", the country code, the national number. */\n e164: string;\n /** The country whose rules read it, or `null` for a generic \"+…\" number. */\n country: PhoneCountryCode | null;\n /** The national significant number — the digits after the country code. For a\n * generic number, every digit after the \"+\" (the country code is not split off). */\n national: string;\n}\n\n/** A national significant number that passes `rule`, or `null`. */\nfunction national(digits: string, rule: CountryRule): string | null {\n const nsn = rule.trunk && digits.startsWith(\"0\") ? digits.slice(1) : digits;\n // A national number starts with 0 only where 0 is part of it (Italy's fixed lines).\n if (nsn.startsWith(\"0\") && !rule.zeroStart) return null;\n if (nsn.length < rule.min || nsn.length > rule.max) return null;\n return nsn;\n}\n\n/**\n * Read a typed number. With a leading \"+\" or \"00\" the number carries its own country\n * code — one of the six with rules, or any other (8–15 digits in all, the E.164\n * limit). Without one it is a national number of `country` (default `\"CH\"`), its\n * trunk 0 optional; with `country=\"other\"` a number without \"+\" cannot be read.\n *\n * Spaces, hyphens, dots, slashes and parentheses are ignored (\"(030) 1234567\"), and\n * so is the \"(0)\" of \"+41 (0)21 …\". Anything else — a letter, an extension (\"ext. 12\"), a note —\n * and the result is `null`: the text is not a number these rules can read, and a field\n * keeps it as it is rather than guess.\n */\nexport function parsePhone(input: string, country: PhoneCountry = \"CH\"): ParsedPhone | null {\n const text = input.trim();\n if (text === \"\" || !/^\\+?[\\d\\s().\\-/]+$/.test(text)) return null;\n let digits = text.replace(/\\D/g, \"\");\n let international = text.startsWith(\"+\");\n if (!international && digits.startsWith(\"00\")) {\n international = true;\n digits = digits.slice(2);\n }\n if (international) {\n // \"+41 (0)21 …\": the bracketed trunk prefix written for callers inside the country.\n digits = text\n .replace(/\\(\\s*0\\s*\\)/g, \"\")\n .replace(/\\D/g, \"\")\n .replace(/^00/, \"\");\n if (digits.startsWith(\"0\")) return null;\n const known = BY_DIAL.find((c) => digits.startsWith(RULES[c].dial));\n if (known) {\n const rule = RULES[known];\n const nsn = national(digits.slice(rule.dial.length), rule);\n return nsn === null ? null : { e164: `+${rule.dial}${nsn}`, country: known, national: nsn };\n }\n if (digits.length < 8 || digits.length > 15) return null;\n return { e164: `+${digits}`, country: null, national: digits };\n }\n if (country === \"other\") return null;\n const rule = RULES[country];\n const nsn = national(digits, rule);\n return nsn === null ? null : { e164: `+${rule.dial}${nsn}`, country, national: nsn };\n}\n\n/** The national number grouped by its country's rules (\"21 000 00 01\"). */\nexport function formatNationalPhone(nsn: string, country: PhoneCountryCode): string {\n return RULES[country].group(nsn).join(\" \");\n}\n\n/**\n * A number for display: an E.164 number (or anything {@link parsePhone} reads with a\n * \"+\") grouped by its country's rules — \"+41 21 000 00 01\" — and a generic one as\n * \"+\" and its digits. Anything it cannot read comes back exactly as it went in, so a\n * list of contacts can format every row without first sorting out the free text.\n */\nexport function formatPhone(value: string): string {\n const parsed = value.trim().startsWith(\"+\") ? parsePhone(value, \"other\") : null;\n if (!parsed) return value;\n if (!parsed.country) return parsed.e164;\n return `+${RULES[parsed.country].dial} ${formatNationalPhone(parsed.national, parsed.country)}`;\n}\n\n/** Whether `value` is in E.164 shape: \"+\" and 8–15 digits, nothing else. Shape only —\n * what {@link PhoneInput} emits for every number it could read. */\nexport function isE164(value: string): boolean {\n return /^\\+[1-9]\\d{7,14}$/.test(value);\n}\n"],"mappings":"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","names":["rule","nsn"]}
@@ -2,16 +2,352 @@
2
2
  const LEVELS = ["L", "M", "Q", "H"];
3
3
  const FORMAT_BITS = { L: 1, M: 0, Q: 3, H: 2 };
4
4
  const ECC_CODEWORDS_PER_BLOCK = [
5
- [-1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],
6
- [-1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28],
7
- [-1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],
8
- [-1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30]
5
+ [
6
+ -1,
7
+ 7,
8
+ 10,
9
+ 15,
10
+ 20,
11
+ 26,
12
+ 18,
13
+ 20,
14
+ 24,
15
+ 30,
16
+ 18,
17
+ 20,
18
+ 24,
19
+ 26,
20
+ 30,
21
+ 22,
22
+ 24,
23
+ 28,
24
+ 30,
25
+ 28,
26
+ 28,
27
+ 28,
28
+ 28,
29
+ 30,
30
+ 30,
31
+ 26,
32
+ 28,
33
+ 30,
34
+ 30,
35
+ 30,
36
+ 30,
37
+ 30,
38
+ 30,
39
+ 30,
40
+ 30,
41
+ 30,
42
+ 30,
43
+ 30,
44
+ 30,
45
+ 30,
46
+ 30
47
+ ],
48
+ [
49
+ -1,
50
+ 10,
51
+ 16,
52
+ 26,
53
+ 18,
54
+ 24,
55
+ 16,
56
+ 18,
57
+ 22,
58
+ 22,
59
+ 26,
60
+ 30,
61
+ 22,
62
+ 22,
63
+ 24,
64
+ 24,
65
+ 28,
66
+ 28,
67
+ 26,
68
+ 26,
69
+ 26,
70
+ 26,
71
+ 28,
72
+ 28,
73
+ 28,
74
+ 28,
75
+ 28,
76
+ 28,
77
+ 28,
78
+ 28,
79
+ 28,
80
+ 28,
81
+ 28,
82
+ 28,
83
+ 28,
84
+ 28,
85
+ 28,
86
+ 28,
87
+ 28,
88
+ 28,
89
+ 28
90
+ ],
91
+ [
92
+ -1,
93
+ 13,
94
+ 22,
95
+ 18,
96
+ 26,
97
+ 18,
98
+ 24,
99
+ 18,
100
+ 22,
101
+ 20,
102
+ 24,
103
+ 28,
104
+ 26,
105
+ 24,
106
+ 20,
107
+ 30,
108
+ 24,
109
+ 28,
110
+ 28,
111
+ 26,
112
+ 30,
113
+ 28,
114
+ 30,
115
+ 30,
116
+ 30,
117
+ 30,
118
+ 28,
119
+ 30,
120
+ 30,
121
+ 30,
122
+ 30,
123
+ 30,
124
+ 30,
125
+ 30,
126
+ 30,
127
+ 30,
128
+ 30,
129
+ 30,
130
+ 30,
131
+ 30,
132
+ 30
133
+ ],
134
+ [
135
+ -1,
136
+ 17,
137
+ 28,
138
+ 22,
139
+ 16,
140
+ 22,
141
+ 28,
142
+ 26,
143
+ 26,
144
+ 24,
145
+ 28,
146
+ 24,
147
+ 28,
148
+ 22,
149
+ 24,
150
+ 24,
151
+ 30,
152
+ 28,
153
+ 28,
154
+ 26,
155
+ 28,
156
+ 30,
157
+ 24,
158
+ 30,
159
+ 30,
160
+ 30,
161
+ 30,
162
+ 30,
163
+ 30,
164
+ 30,
165
+ 30,
166
+ 30,
167
+ 30,
168
+ 30,
169
+ 30,
170
+ 30,
171
+ 30,
172
+ 30,
173
+ 30,
174
+ 30,
175
+ 30
176
+ ]
9
177
  ];
10
178
  const NUM_ERROR_CORRECTION_BLOCKS = [
11
- [-1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25],
12
- [-1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49],
13
- [-1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68],
14
- [-1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81]
179
+ [
180
+ -1,
181
+ 1,
182
+ 1,
183
+ 1,
184
+ 1,
185
+ 1,
186
+ 2,
187
+ 2,
188
+ 2,
189
+ 2,
190
+ 4,
191
+ 4,
192
+ 4,
193
+ 4,
194
+ 4,
195
+ 6,
196
+ 6,
197
+ 6,
198
+ 6,
199
+ 7,
200
+ 8,
201
+ 8,
202
+ 9,
203
+ 9,
204
+ 10,
205
+ 12,
206
+ 12,
207
+ 12,
208
+ 13,
209
+ 14,
210
+ 15,
211
+ 16,
212
+ 17,
213
+ 18,
214
+ 19,
215
+ 19,
216
+ 20,
217
+ 21,
218
+ 22,
219
+ 24,
220
+ 25
221
+ ],
222
+ [
223
+ -1,
224
+ 1,
225
+ 1,
226
+ 1,
227
+ 2,
228
+ 2,
229
+ 4,
230
+ 4,
231
+ 4,
232
+ 5,
233
+ 5,
234
+ 5,
235
+ 8,
236
+ 9,
237
+ 9,
238
+ 10,
239
+ 10,
240
+ 11,
241
+ 13,
242
+ 14,
243
+ 16,
244
+ 17,
245
+ 17,
246
+ 18,
247
+ 20,
248
+ 21,
249
+ 23,
250
+ 25,
251
+ 26,
252
+ 28,
253
+ 29,
254
+ 31,
255
+ 33,
256
+ 35,
257
+ 37,
258
+ 38,
259
+ 40,
260
+ 43,
261
+ 45,
262
+ 47,
263
+ 49
264
+ ],
265
+ [
266
+ -1,
267
+ 1,
268
+ 1,
269
+ 2,
270
+ 2,
271
+ 4,
272
+ 4,
273
+ 6,
274
+ 6,
275
+ 8,
276
+ 8,
277
+ 8,
278
+ 10,
279
+ 12,
280
+ 16,
281
+ 12,
282
+ 17,
283
+ 16,
284
+ 18,
285
+ 21,
286
+ 20,
287
+ 23,
288
+ 23,
289
+ 25,
290
+ 27,
291
+ 29,
292
+ 34,
293
+ 34,
294
+ 35,
295
+ 38,
296
+ 40,
297
+ 43,
298
+ 45,
299
+ 48,
300
+ 51,
301
+ 53,
302
+ 56,
303
+ 59,
304
+ 62,
305
+ 65,
306
+ 68
307
+ ],
308
+ [
309
+ -1,
310
+ 1,
311
+ 1,
312
+ 2,
313
+ 4,
314
+ 4,
315
+ 4,
316
+ 5,
317
+ 6,
318
+ 8,
319
+ 8,
320
+ 11,
321
+ 11,
322
+ 16,
323
+ 16,
324
+ 18,
325
+ 16,
326
+ 19,
327
+ 21,
328
+ 25,
329
+ 25,
330
+ 25,
331
+ 34,
332
+ 30,
333
+ 32,
334
+ 35,
335
+ 37,
336
+ 40,
337
+ 42,
338
+ 45,
339
+ 48,
340
+ 51,
341
+ 54,
342
+ 57,
343
+ 60,
344
+ 63,
345
+ 66,
346
+ 70,
347
+ 74,
348
+ 77,
349
+ 81
350
+ ]
15
351
  ];
16
352
  function encodeQr(text, options = {}) {
17
353
  const bytes = Array.from(new TextEncoder().encode(text));
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/qr-encode.ts"],"sourcesContent":["/**\n * A QR code encoder: text in, a square of dark / light modules out (ISO/IEC 18004).\n *\n * WHY IT IS IN THE KIT rather than a dependency. `TwoFactorSetting` needs one QR code —\n * an `otpauth://` URI, around 100–200 bytes — and every app that shows it was pulling\n * in `qrcode.react` plus `react-dom/server` to render that one code to a static SVG\n * string, then base64-encoding it so the kit could draw it back as an `<img>`.\n * A dependency here would land in all three apps whether they show 2FA or not; an\n * optional peer would mean a lazy import and a loading state for something that is\n * a few hundred lines of arithmetic. So it is those lines: pure, no imports, no module\n * state beyond two constant tables, safe under `sideEffects: false`, and\n * tree-shaken out of every app that never renders a {@link QrCode}.\n *\n * Scope, chosen for what the kit renders: BYTE mode only (UTF-8), all 40 versions,\n * all four error-correction levels, automatic version and mask selection. Numeric,\n * alphanumeric and Kanji modes are denser for their alphabets but would not shrink an\n * otpauth URI (lower-case letters are not in the alphanumeric set). The algorithm and\n * its penalty rules follow the reference implementation by Project Nayuki (MIT),\n * which is also what `qrcode.react` wraps — so for the same input, level and boost\n * the modules match that library's output exactly (the test suite pins a matrix).\n */\n\nexport type QrErrorCorrection = \"L\" | \"M\" | \"Q\" | \"H\";\n\nexport interface QrEncodeOptions {\n /** How much of the code may be damaged and still read. Default `\"M\"` (~15 %). */\n errorCorrection?: QrErrorCorrection;\n /** Raise the level as far as the chosen version still fits, for free. Default true. */\n boostErrorCorrection?: boolean;\n}\n\nexport interface QrMatrix {\n /** 1–40. */\n version: number;\n /** Modules per side: `version * 4 + 17`. */\n size: number;\n /** The level actually used — higher than asked when boosted. */\n errorCorrection: QrErrorCorrection;\n /** 0–7. */\n mask: number;\n /** `modules[y][x]`, true = dark. No quiet zone: the renderer adds its own. */\n modules: boolean[][];\n}\n\nconst LEVELS: QrErrorCorrection[] = [\"L\", \"M\", \"Q\", \"H\"];\n/** The two format-information bits per level (not in ordinal order: M is 00). */\nconst FORMAT_BITS: Record<QrErrorCorrection, number> = { L: 1, M: 0, Q: 3, H: 2 };\n\n// Index 0 is padding; rows are L, M, Q, H.\nconst ECC_CODEWORDS_PER_BLOCK: readonly (readonly number[])[] = [\n [-1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],\n [-1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28],\n [-1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],\n [-1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30],\n];\nconst NUM_ERROR_CORRECTION_BLOCKS: readonly (readonly number[])[] = [\n [-1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25],\n [-1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49],\n [-1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68],\n [-1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81],\n];\n\n/** Encode `text` (as UTF-8 bytes). Throws a `RangeError` past version 40's capacity. */\nexport function encodeQr(text: string, options: QrEncodeOptions = {}): QrMatrix {\n const bytes = Array.from(new TextEncoder().encode(text));\n let level = LEVELS.indexOf(options.errorCorrection ?? \"M\");\n\n // The smallest version that holds the data at the requested level.\n let version = 1;\n let usedBits: number;\n for (; ; version++) {\n const countBits = version <= 9 ? 8 : 16;\n usedBits = bytes.length < 1 << countBits ? 4 + countBits + bytes.length * 8 : Infinity;\n if (usedBits <= dataCodewords(version, level) * 8) break;\n if (version >= 40) throw new RangeError(\"QR data too long\");\n }\n if (options.boostErrorCorrection ?? true) {\n for (let higher = level + 1; higher < LEVELS.length; higher++) {\n if (usedBits <= dataCodewords(version, higher) * 8) level = higher;\n }\n }\n\n // Mode, count, data; then terminator, byte padding and the 0xEC/0x11 fill.\n const bits: number[] = [];\n const append = (value: number, length: number) => {\n for (let i = length - 1; i >= 0; i--) bits.push((value >>> i) & 1);\n };\n append(0b0100, 4);\n append(bytes.length, version <= 9 ? 8 : 16);\n for (const b of bytes) append(b, 8);\n const capacity = dataCodewords(version, level) * 8;\n append(0, Math.min(4, capacity - bits.length));\n append(0, (8 - (bits.length % 8)) % 8);\n for (let pad = 0xec; bits.length < capacity; pad ^= 0xec ^ 0x11) append(pad, 8);\n\n const data: number[] = [];\n for (let i = 0; i < bits.length; i += 8) {\n let byte = 0;\n for (let j = 0; j < 8; j++) byte = (byte << 1) | bits[i + j];\n data.push(byte);\n }\n\n const grid = new Grid(version, LEVELS[level]);\n grid.drawFunctionPatterns();\n grid.drawCodewords(interleaveWithEcc(data, version, level));\n\n let bestMask = 0;\n let bestPenalty = Infinity;\n for (let mask = 0; mask < 8; mask++) {\n grid.applyMask(mask);\n grid.drawFormatBits(mask);\n const penalty = grid.penalty();\n if (penalty < bestPenalty) {\n bestMask = mask;\n bestPenalty = penalty;\n }\n grid.applyMask(mask); // XOR again undoes it\n }\n grid.applyMask(bestMask);\n grid.drawFormatBits(bestMask);\n\n return {\n version,\n size: grid.size,\n errorCorrection: LEVELS[level],\n mask: bestMask,\n modules: grid.modules,\n };\n}\n\nfunction rawDataModules(version: number): number {\n let result = (16 * version + 128) * version + 64;\n if (version >= 2) {\n const numAlign = Math.floor(version / 7) + 2;\n result -= (25 * numAlign - 10) * numAlign - 55;\n if (version >= 7) result -= 36;\n }\n return result;\n}\n\nfunction dataCodewords(version: number, level: number): number {\n return (\n Math.floor(rawDataModules(version) / 8) -\n ECC_CODEWORDS_PER_BLOCK[level][version] * NUM_ERROR_CORRECTION_BLOCKS[level][version]\n );\n}\n\n/** Split into blocks, append each block's Reed–Solomon codewords, interleave. */\nfunction interleaveWithEcc(data: number[], version: number, level: number): number[] {\n const numBlocks = NUM_ERROR_CORRECTION_BLOCKS[level][version];\n const eccLen = ECC_CODEWORDS_PER_BLOCK[level][version];\n const rawCodewords = Math.floor(rawDataModules(version) / 8);\n const numShortBlocks = numBlocks - (rawCodewords % numBlocks);\n const shortBlockLen = Math.floor(rawCodewords / numBlocks);\n const divisor = reedSolomonDivisor(eccLen);\n\n const blocks: number[][] = [];\n for (let i = 0, k = 0; i < numBlocks; i++) {\n const block = data.slice(k, k + shortBlockLen - eccLen + (i < numShortBlocks ? 0 : 1));\n k += block.length;\n const ecc = reedSolomonRemainder(block, divisor);\n if (i < numShortBlocks) block.push(0); // placeholder, skipped below\n blocks.push(block.concat(ecc));\n }\n\n const result: number[] = [];\n for (let i = 0; i < blocks[0].length; i++) {\n blocks.forEach((block, j) => {\n if (i !== shortBlockLen - eccLen || j >= numShortBlocks) result.push(block[i]);\n });\n }\n return result;\n}\n\nfunction gfMultiply(x: number, y: number): number {\n let z = 0;\n for (let i = 7; i >= 0; i--) {\n z = (z << 1) ^ ((z >>> 7) * 0x11d);\n z ^= ((y >>> i) & 1) * x;\n }\n return z;\n}\n\nfunction reedSolomonDivisor(degree: number): number[] {\n const result = new Array<number>(degree).fill(0);\n result[degree - 1] = 1;\n let root = 1;\n for (let i = 0; i < degree; i++) {\n for (let j = 0; j < degree; j++) {\n result[j] = gfMultiply(result[j], root);\n if (j + 1 < degree) result[j] ^= result[j + 1];\n }\n root = gfMultiply(root, 0x02);\n }\n return result;\n}\n\nfunction reedSolomonRemainder(data: number[], divisor: number[]): number[] {\n const result = new Array<number>(divisor.length).fill(0);\n for (const b of data) {\n const factor = b ^ (result.shift() as number);\n result.push(0);\n divisor.forEach((coef, i) => {\n result[i] ^= gfMultiply(coef, factor);\n });\n }\n return result;\n}\n\nconst bit = (value: number, i: number) => ((value >>> i) & 1) !== 0;\n\nclass Grid {\n readonly size: number;\n readonly modules: boolean[][];\n private readonly reserved: boolean[][];\n private readonly version: number;\n private readonly level: QrErrorCorrection;\n\n constructor(version: number, level: QrErrorCorrection) {\n this.version = version;\n this.level = level;\n this.size = version * 4 + 17;\n this.modules = Array.from({ length: this.size }, () => new Array<boolean>(this.size).fill(false));\n this.reserved = Array.from({ length: this.size }, () => new Array<boolean>(this.size).fill(false));\n }\n\n private set(x: number, y: number, dark: boolean) {\n this.modules[y][x] = dark;\n this.reserved[y][x] = true;\n }\n\n drawFunctionPatterns() {\n const { size } = this;\n for (let i = 0; i < size; i++) {\n this.set(6, i, i % 2 === 0);\n this.set(i, 6, i % 2 === 0);\n }\n this.drawFinder(3, 3);\n this.drawFinder(size - 4, 3);\n this.drawFinder(3, size - 4);\n const align = this.alignmentPositions();\n const n = align.length;\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n const corner = (i === 0 && j === 0) || (i === 0 && j === n - 1) || (i === n - 1 && j === 0);\n if (!corner) this.drawAlignment(align[i], align[j]);\n }\n }\n this.drawFormatBits(0); // reserves the area; redrawn once the mask is chosen\n this.drawVersion();\n }\n\n private drawFinder(x: number, y: number) {\n for (let dy = -4; dy <= 4; dy++) {\n for (let dx = -4; dx <= 4; dx++) {\n const dist = Math.max(Math.abs(dx), Math.abs(dy));\n const xx = x + dx;\n const yy = y + dy;\n if (xx >= 0 && xx < this.size && yy >= 0 && yy < this.size) {\n this.set(xx, yy, dist !== 2 && dist !== 4);\n }\n }\n }\n }\n\n private drawAlignment(x: number, y: number) {\n for (let dy = -2; dy <= 2; dy++) {\n for (let dx = -2; dx <= 2; dx++) {\n this.set(x + dx, y + dy, Math.max(Math.abs(dx), Math.abs(dy)) !== 1);\n }\n }\n }\n\n private alignmentPositions(): number[] {\n if (this.version === 1) return [];\n const numAlign = Math.floor(this.version / 7) + 2;\n const step = Math.floor((this.version * 8 + numAlign * 3 + 5) / (numAlign * 4 - 4)) * 2;\n const result = [6];\n for (let pos = this.size - 7; result.length < numAlign; pos -= step) result.splice(1, 0, pos);\n return result;\n }\n\n drawFormatBits(mask: number) {\n const data = (FORMAT_BITS[this.level] << 3) | mask;\n let rem = data;\n for (let i = 0; i < 10; i++) rem = (rem << 1) ^ ((rem >>> 9) * 0x537);\n const bits = ((data << 10) | rem) ^ 0x5412;\n const { size } = this;\n for (let i = 0; i <= 5; i++) this.set(8, i, bit(bits, i));\n this.set(8, 7, bit(bits, 6));\n this.set(8, 8, bit(bits, 7));\n this.set(7, 8, bit(bits, 8));\n for (let i = 9; i < 15; i++) this.set(14 - i, 8, bit(bits, i));\n for (let i = 0; i < 8; i++) this.set(size - 1 - i, 8, bit(bits, i));\n for (let i = 8; i < 15; i++) this.set(8, size - 15 + i, bit(bits, i));\n this.set(8, size - 8, true); // the always-dark module\n }\n\n private drawVersion() {\n if (this.version < 7) return;\n let rem = this.version;\n for (let i = 0; i < 12; i++) rem = (rem << 1) ^ ((rem >>> 11) * 0x1f25);\n const bits = (this.version << 12) | rem;\n for (let i = 0; i < 18; i++) {\n const dark = bit(bits, i);\n const a = this.size - 11 + (i % 3);\n const b = Math.floor(i / 3);\n this.set(a, b, dark);\n this.set(b, a, dark);\n }\n }\n\n /** The zig-zag placement: two-module columns, right to left, alternating up and down. */\n drawCodewords(data: number[]) {\n const { size } = this;\n let i = 0;\n for (let right = size - 1; right >= 1; right -= 2) {\n if (right === 6) right = 5; // skip the vertical timing column\n for (let vert = 0; vert < size; vert++) {\n for (let j = 0; j < 2; j++) {\n const x = right - j;\n const upward = ((right + 1) & 2) === 0;\n const y = upward ? size - 1 - vert : vert;\n if (!this.reserved[y][x] && i < data.length * 8) {\n this.modules[y][x] = bit(data[i >>> 3], 7 - (i & 7));\n i++;\n }\n }\n }\n }\n }\n\n applyMask(mask: number) {\n for (let y = 0; y < this.size; y++) {\n for (let x = 0; x < this.size; x++) {\n if (!this.reserved[y][x] && maskBit(mask, x, y)) this.modules[y][x] = !this.modules[y][x];\n }\n }\n }\n\n penalty(): number {\n const { size, modules } = this;\n let result = 0;\n const line = (get: (a: number, b: number) => boolean) => {\n for (let a = 0; a < size; a++) {\n let runColor = false;\n let run = 0;\n const history = [0, 0, 0, 0, 0, 0, 0];\n for (let b = 0; b < size; b++) {\n if (get(a, b) === runColor) {\n run++;\n if (run === 5) result += 3;\n else if (run > 5) result++;\n } else {\n this.addHistory(run, history);\n if (!runColor) result += this.countFinderLike(history) * 40;\n runColor = get(a, b);\n run = 1;\n }\n }\n if (runColor) {\n this.addHistory(run, history);\n run = 0;\n }\n this.addHistory(run + size, history);\n result += this.countFinderLike(history) * 40;\n }\n };\n line((y, x) => modules[y][x]);\n line((x, y) => modules[y][x]);\n\n for (let y = 0; y < size - 1; y++) {\n for (let x = 0; x < size - 1; x++) {\n const c = modules[y][x];\n if (c === modules[y][x + 1] && c === modules[y + 1][x] && c === modules[y + 1][x + 1]) {\n result += 3;\n }\n }\n }\n\n let dark = 0;\n for (const row of modules) for (const m of row) if (m) dark++;\n const total = size * size;\n result += (Math.ceil(Math.abs(dark * 20 - total * 10) / total) - 1) * 10;\n return result;\n }\n\n private addHistory(run: number, history: number[]) {\n if (history[0] === 0) run += this.size; // the light border before the first run\n history.pop();\n history.unshift(run);\n }\n\n private countFinderLike(h: number[]): number {\n const n = h[1];\n const core = n > 0 && h[2] === n && h[3] === n * 3 && h[4] === n && h[5] === n;\n return (core && h[0] >= n * 4 && h[6] >= n ? 1 : 0) + (core && h[6] >= n * 4 && h[0] >= n ? 1 : 0);\n }\n}\n\nfunction maskBit(mask: number, x: number, y: number): boolean {\n switch (mask) {\n case 0:\n return (x + y) % 2 === 0;\n case 1:\n return y % 2 === 0;\n case 2:\n return x % 3 === 0;\n case 3:\n return (x + y) % 3 === 0;\n case 4:\n return (Math.floor(x / 3) + Math.floor(y / 2)) % 2 === 0;\n case 5:\n return ((x * y) % 2) + ((x * y) % 3) === 0;\n case 6:\n return (((x * y) % 2) + ((x * y) % 3)) % 2 === 0;\n default:\n return (((x + y) % 2) + ((x * y) % 3)) % 2 === 0;\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/lib/qr-encode.ts"],"sourcesContent":["/**\n * A QR code encoder: text in, a square of dark / light modules out (ISO/IEC 18004).\n *\n * WHY IT IS IN THE KIT rather than a dependency. `TwoFactorSetting` needs one QR code —\n * an `otpauth://` URI, around 100–200 bytes — and every app that shows it was pulling\n * in `qrcode.react` plus `react-dom/server` to render that one code to a static SVG\n * string, then base64-encoding it so the kit could draw it back as an `<img>`.\n * A dependency here would land in all three apps whether they show 2FA or not; an\n * optional peer would mean a lazy import and a loading state for something that is\n * a few hundred lines of arithmetic. So it is those lines: pure, no imports, no module\n * state beyond two constant tables, safe under `sideEffects: false`, and\n * tree-shaken out of every app that never renders a {@link QrCode}.\n *\n * Scope, chosen for what the kit renders: BYTE mode only (UTF-8), all 40 versions,\n * all four error-correction levels, automatic version and mask selection. Numeric,\n * alphanumeric and Kanji modes are denser for their alphabets but would not shrink an\n * otpauth URI (lower-case letters are not in the alphanumeric set). The algorithm and\n * its penalty rules follow the reference implementation by Project Nayuki (MIT),\n * which is also what `qrcode.react` wraps — so for the same input, level and boost\n * the modules match that library's output exactly (the test suite pins a matrix).\n */\n\nexport type QrErrorCorrection = \"L\" | \"M\" | \"Q\" | \"H\";\n\nexport interface QrEncodeOptions {\n /** How much of the code may be damaged and still read. Default `\"M\"` (~15 %). */\n errorCorrection?: QrErrorCorrection;\n /** Raise the level as far as the chosen version still fits, for free. Default true. */\n boostErrorCorrection?: boolean;\n}\n\nexport interface QrMatrix {\n /** 1–40. */\n version: number;\n /** Modules per side: `version * 4 + 17`. */\n size: number;\n /** The level actually used — higher than asked when boosted. */\n errorCorrection: QrErrorCorrection;\n /** 0–7. */\n mask: number;\n /** `modules[y][x]`, true = dark. No quiet zone: the renderer adds its own. */\n modules: boolean[][];\n}\n\nconst LEVELS: QrErrorCorrection[] = [\"L\", \"M\", \"Q\", \"H\"];\n/** The two format-information bits per level (not in ordinal order: M is 00). */\nconst FORMAT_BITS: Record<QrErrorCorrection, number> = { L: 1, M: 0, Q: 3, H: 2 };\n\n// Index 0 is padding; rows are L, M, Q, H.\nconst ECC_CODEWORDS_PER_BLOCK: readonly (readonly number[])[] = [\n [\n -1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30,\n 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,\n ],\n [\n -1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28,\n 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n ],\n [\n -1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30,\n 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,\n ],\n [\n -1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30,\n 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,\n ],\n];\nconst NUM_ERROR_CORRECTION_BLOCKS: readonly (readonly number[])[] = [\n [\n -1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19,\n 19, 20, 21, 22, 24, 25,\n ],\n [\n -1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31,\n 33, 35, 37, 38, 40, 43, 45, 47, 49,\n ],\n [\n -1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43,\n 45, 48, 51, 53, 56, 59, 62, 65, 68,\n ],\n [\n -1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48,\n 51, 54, 57, 60, 63, 66, 70, 74, 77, 81,\n ],\n];\n\n/** Encode `text` (as UTF-8 bytes). Throws a `RangeError` past version 40's capacity. */\nexport function encodeQr(text: string, options: QrEncodeOptions = {}): QrMatrix {\n const bytes = Array.from(new TextEncoder().encode(text));\n let level = LEVELS.indexOf(options.errorCorrection ?? \"M\");\n\n // The smallest version that holds the data at the requested level.\n let version = 1;\n let usedBits: number;\n for (; ; version++) {\n const countBits = version <= 9 ? 8 : 16;\n usedBits = bytes.length < 1 << countBits ? 4 + countBits + bytes.length * 8 : Infinity;\n if (usedBits <= dataCodewords(version, level) * 8) break;\n if (version >= 40) throw new RangeError(\"QR data too long\");\n }\n if (options.boostErrorCorrection ?? true) {\n for (let higher = level + 1; higher < LEVELS.length; higher++) {\n if (usedBits <= dataCodewords(version, higher) * 8) level = higher;\n }\n }\n\n // Mode, count, data; then terminator, byte padding and the 0xEC/0x11 fill.\n const bits: number[] = [];\n const append = (value: number, length: number) => {\n for (let i = length - 1; i >= 0; i--) bits.push((value >>> i) & 1);\n };\n append(0b0100, 4);\n append(bytes.length, version <= 9 ? 8 : 16);\n for (const b of bytes) append(b, 8);\n const capacity = dataCodewords(version, level) * 8;\n append(0, Math.min(4, capacity - bits.length));\n append(0, (8 - (bits.length % 8)) % 8);\n for (let pad = 0xec; bits.length < capacity; pad ^= 0xec ^ 0x11) append(pad, 8);\n\n const data: number[] = [];\n for (let i = 0; i < bits.length; i += 8) {\n let byte = 0;\n for (let j = 0; j < 8; j++) byte = (byte << 1) | bits[i + j];\n data.push(byte);\n }\n\n const grid = new Grid(version, LEVELS[level]);\n grid.drawFunctionPatterns();\n grid.drawCodewords(interleaveWithEcc(data, version, level));\n\n let bestMask = 0;\n let bestPenalty = Infinity;\n for (let mask = 0; mask < 8; mask++) {\n grid.applyMask(mask);\n grid.drawFormatBits(mask);\n const penalty = grid.penalty();\n if (penalty < bestPenalty) {\n bestMask = mask;\n bestPenalty = penalty;\n }\n grid.applyMask(mask); // XOR again undoes it\n }\n grid.applyMask(bestMask);\n grid.drawFormatBits(bestMask);\n\n return {\n version,\n size: grid.size,\n errorCorrection: LEVELS[level],\n mask: bestMask,\n modules: grid.modules,\n };\n}\n\nfunction rawDataModules(version: number): number {\n let result = (16 * version + 128) * version + 64;\n if (version >= 2) {\n const numAlign = Math.floor(version / 7) + 2;\n result -= (25 * numAlign - 10) * numAlign - 55;\n if (version >= 7) result -= 36;\n }\n return result;\n}\n\nfunction dataCodewords(version: number, level: number): number {\n return (\n Math.floor(rawDataModules(version) / 8) -\n ECC_CODEWORDS_PER_BLOCK[level][version] * NUM_ERROR_CORRECTION_BLOCKS[level][version]\n );\n}\n\n/** Split into blocks, append each block's Reed–Solomon codewords, interleave. */\nfunction interleaveWithEcc(data: number[], version: number, level: number): number[] {\n const numBlocks = NUM_ERROR_CORRECTION_BLOCKS[level][version];\n const eccLen = ECC_CODEWORDS_PER_BLOCK[level][version];\n const rawCodewords = Math.floor(rawDataModules(version) / 8);\n const numShortBlocks = numBlocks - (rawCodewords % numBlocks);\n const shortBlockLen = Math.floor(rawCodewords / numBlocks);\n const divisor = reedSolomonDivisor(eccLen);\n\n const blocks: number[][] = [];\n for (let i = 0, k = 0; i < numBlocks; i++) {\n const block = data.slice(k, k + shortBlockLen - eccLen + (i < numShortBlocks ? 0 : 1));\n k += block.length;\n const ecc = reedSolomonRemainder(block, divisor);\n if (i < numShortBlocks) block.push(0); // placeholder, skipped below\n blocks.push(block.concat(ecc));\n }\n\n const result: number[] = [];\n for (let i = 0; i < blocks[0].length; i++) {\n blocks.forEach((block, j) => {\n if (i !== shortBlockLen - eccLen || j >= numShortBlocks) result.push(block[i]);\n });\n }\n return result;\n}\n\nfunction gfMultiply(x: number, y: number): number {\n let z = 0;\n for (let i = 7; i >= 0; i--) {\n z = (z << 1) ^ ((z >>> 7) * 0x11d);\n z ^= ((y >>> i) & 1) * x;\n }\n return z;\n}\n\nfunction reedSolomonDivisor(degree: number): number[] {\n const result = new Array<number>(degree).fill(0);\n result[degree - 1] = 1;\n let root = 1;\n for (let i = 0; i < degree; i++) {\n for (let j = 0; j < degree; j++) {\n result[j] = gfMultiply(result[j], root);\n if (j + 1 < degree) result[j] ^= result[j + 1];\n }\n root = gfMultiply(root, 0x02);\n }\n return result;\n}\n\nfunction reedSolomonRemainder(data: number[], divisor: number[]): number[] {\n const result = new Array<number>(divisor.length).fill(0);\n for (const b of data) {\n const factor = b ^ (result.shift() as number);\n result.push(0);\n divisor.forEach((coef, i) => {\n result[i] ^= gfMultiply(coef, factor);\n });\n }\n return result;\n}\n\nconst bit = (value: number, i: number) => ((value >>> i) & 1) !== 0;\n\nclass Grid {\n readonly size: number;\n readonly modules: boolean[][];\n private readonly reserved: boolean[][];\n private readonly version: number;\n private readonly level: QrErrorCorrection;\n\n constructor(version: number, level: QrErrorCorrection) {\n this.version = version;\n this.level = level;\n this.size = version * 4 + 17;\n this.modules = Array.from({ length: this.size }, () => new Array<boolean>(this.size).fill(false));\n this.reserved = Array.from({ length: this.size }, () => new Array<boolean>(this.size).fill(false));\n }\n\n private set(x: number, y: number, dark: boolean) {\n this.modules[y][x] = dark;\n this.reserved[y][x] = true;\n }\n\n drawFunctionPatterns() {\n const { size } = this;\n for (let i = 0; i < size; i++) {\n this.set(6, i, i % 2 === 0);\n this.set(i, 6, i % 2 === 0);\n }\n this.drawFinder(3, 3);\n this.drawFinder(size - 4, 3);\n this.drawFinder(3, size - 4);\n const align = this.alignmentPositions();\n const n = align.length;\n for (let i = 0; i < n; i++) {\n for (let j = 0; j < n; j++) {\n const corner = (i === 0 && j === 0) || (i === 0 && j === n - 1) || (i === n - 1 && j === 0);\n if (!corner) this.drawAlignment(align[i], align[j]);\n }\n }\n this.drawFormatBits(0); // reserves the area; redrawn once the mask is chosen\n this.drawVersion();\n }\n\n private drawFinder(x: number, y: number) {\n for (let dy = -4; dy <= 4; dy++) {\n for (let dx = -4; dx <= 4; dx++) {\n const dist = Math.max(Math.abs(dx), Math.abs(dy));\n const xx = x + dx;\n const yy = y + dy;\n if (xx >= 0 && xx < this.size && yy >= 0 && yy < this.size) {\n this.set(xx, yy, dist !== 2 && dist !== 4);\n }\n }\n }\n }\n\n private drawAlignment(x: number, y: number) {\n for (let dy = -2; dy <= 2; dy++) {\n for (let dx = -2; dx <= 2; dx++) {\n this.set(x + dx, y + dy, Math.max(Math.abs(dx), Math.abs(dy)) !== 1);\n }\n }\n }\n\n private alignmentPositions(): number[] {\n if (this.version === 1) return [];\n const numAlign = Math.floor(this.version / 7) + 2;\n const step = Math.floor((this.version * 8 + numAlign * 3 + 5) / (numAlign * 4 - 4)) * 2;\n const result = [6];\n for (let pos = this.size - 7; result.length < numAlign; pos -= step) result.splice(1, 0, pos);\n return result;\n }\n\n drawFormatBits(mask: number) {\n const data = (FORMAT_BITS[this.level] << 3) | mask;\n let rem = data;\n for (let i = 0; i < 10; i++) rem = (rem << 1) ^ ((rem >>> 9) * 0x537);\n const bits = ((data << 10) | rem) ^ 0x5412;\n const { size } = this;\n for (let i = 0; i <= 5; i++) this.set(8, i, bit(bits, i));\n this.set(8, 7, bit(bits, 6));\n this.set(8, 8, bit(bits, 7));\n this.set(7, 8, bit(bits, 8));\n for (let i = 9; i < 15; i++) this.set(14 - i, 8, bit(bits, i));\n for (let i = 0; i < 8; i++) this.set(size - 1 - i, 8, bit(bits, i));\n for (let i = 8; i < 15; i++) this.set(8, size - 15 + i, bit(bits, i));\n this.set(8, size - 8, true); // the always-dark module\n }\n\n private drawVersion() {\n if (this.version < 7) return;\n let rem = this.version;\n for (let i = 0; i < 12; i++) rem = (rem << 1) ^ ((rem >>> 11) * 0x1f25);\n const bits = (this.version << 12) | rem;\n for (let i = 0; i < 18; i++) {\n const dark = bit(bits, i);\n const a = this.size - 11 + (i % 3);\n const b = Math.floor(i / 3);\n this.set(a, b, dark);\n this.set(b, a, dark);\n }\n }\n\n /** The zig-zag placement: two-module columns, right to left, alternating up and down. */\n drawCodewords(data: number[]) {\n const { size } = this;\n let i = 0;\n for (let right = size - 1; right >= 1; right -= 2) {\n if (right === 6) right = 5; // skip the vertical timing column\n for (let vert = 0; vert < size; vert++) {\n for (let j = 0; j < 2; j++) {\n const x = right - j;\n const upward = ((right + 1) & 2) === 0;\n const y = upward ? size - 1 - vert : vert;\n if (!this.reserved[y][x] && i < data.length * 8) {\n this.modules[y][x] = bit(data[i >>> 3], 7 - (i & 7));\n i++;\n }\n }\n }\n }\n }\n\n applyMask(mask: number) {\n for (let y = 0; y < this.size; y++) {\n for (let x = 0; x < this.size; x++) {\n if (!this.reserved[y][x] && maskBit(mask, x, y)) this.modules[y][x] = !this.modules[y][x];\n }\n }\n }\n\n penalty(): number {\n const { size, modules } = this;\n let result = 0;\n const line = (get: (a: number, b: number) => boolean) => {\n for (let a = 0; a < size; a++) {\n let runColor = false;\n let run = 0;\n const history = [0, 0, 0, 0, 0, 0, 0];\n for (let b = 0; b < size; b++) {\n if (get(a, b) === runColor) {\n run++;\n if (run === 5) result += 3;\n else if (run > 5) result++;\n } else {\n this.addHistory(run, history);\n if (!runColor) result += this.countFinderLike(history) * 40;\n runColor = get(a, b);\n run = 1;\n }\n }\n if (runColor) {\n this.addHistory(run, history);\n run = 0;\n }\n this.addHistory(run + size, history);\n result += this.countFinderLike(history) * 40;\n }\n };\n line((y, x) => modules[y][x]);\n line((x, y) => modules[y][x]);\n\n for (let y = 0; y < size - 1; y++) {\n for (let x = 0; x < size - 1; x++) {\n const c = modules[y][x];\n if (c === modules[y][x + 1] && c === modules[y + 1][x] && c === modules[y + 1][x + 1]) {\n result += 3;\n }\n }\n }\n\n let dark = 0;\n for (const row of modules) for (const m of row) if (m) dark++;\n const total = size * size;\n result += (Math.ceil(Math.abs(dark * 20 - total * 10) / total) - 1) * 10;\n return result;\n }\n\n private addHistory(run: number, history: number[]) {\n if (history[0] === 0) run += this.size; // the light border before the first run\n history.pop();\n history.unshift(run);\n }\n\n private countFinderLike(h: number[]): number {\n const n = h[1];\n const core = n > 0 && h[2] === n && h[3] === n * 3 && h[4] === n && h[5] === n;\n return (core && h[0] >= n * 4 && h[6] >= n ? 1 : 0) + (core && h[6] >= n * 4 && h[0] >= n ? 1 : 0);\n }\n}\n\nfunction maskBit(mask: number, x: number, y: number): boolean {\n switch (mask) {\n case 0:\n return (x + y) % 2 === 0;\n case 1:\n return y % 2 === 0;\n case 2:\n return x % 3 === 0;\n case 3:\n return (x + y) % 3 === 0;\n case 4:\n return (Math.floor(x / 3) + Math.floor(y / 2)) % 2 === 0;\n case 5:\n return ((x * y) % 2) + ((x * y) % 3) === 0;\n case 6:\n return (((x * y) % 2) + ((x * y) % 3)) % 2 === 0;\n default:\n return (((x + y) % 2) + ((x * y) % 3)) % 2 === 0;\n }\n}\n"],"mappings":";AA4CA,MAAM,SAA8B,CAAC,KAAK,KAAK,KAAK,GAAG;AAEvD,MAAM,cAAiD,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAGhF,MAAM,0BAA0D;AAAA,EAC9D;AAAA,IACE;AAAA,IAAI;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAC/G;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,EAC9C;AAAA,EACA;AAAA,IACE;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAChH;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,EAC9C;AAAA,EACA;AAAA,IACE;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAChH;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,EAC9C;AAAA,EACA;AAAA,IACE;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAChH;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,EAC9C;AACF;AACA,MAAM,8BAA8D;AAAA,EAClE;AAAA,IACE;AAAA,IAAI;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACjH;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,EACtB;AAAA,EACA;AAAA,IACE;AAAA,IAAI;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAC9G;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,EAClC;AAAA,EACA;AAAA,IACE;AAAA,IAAI;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACjH;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,EAClC;AAAA,EACA;AAAA,IACE;AAAA,IAAI;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAC9G;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,EAC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","names":[]}