@eifi1/ui-kit 0.51.4 → 0.51.5

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 (757) hide show
  1. package/README.md +3 -3
  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.js +1 -13
  276. package/dist/components/treemap.js.map +1 -1
  277. package/dist/components/trigger-aria.js.map +1 -1
  278. package/dist/components/use-table-state.js +14 -11
  279. package/dist/components/use-table-state.js.map +1 -1
  280. package/dist/components/user-avatar.js +3 -26
  281. package/dist/components/user-avatar.js.map +1 -1
  282. package/dist/demo/demo-start.js +8 -4
  283. package/dist/demo/demo-start.js.map +1 -1
  284. package/dist/eslint/index.js +1 -1
  285. package/dist/feedback/feedback-attachment-labels.js.map +1 -1
  286. package/dist/feedback/feedback-attachment.js +1 -8
  287. package/dist/feedback/feedback-attachment.js.map +1 -1
  288. package/dist/feedback/feedback-capture.d.ts +1 -1
  289. package/dist/feedback/feedback-capture.js +3 -1
  290. package/dist/feedback/feedback-capture.js.map +1 -1
  291. package/dist/feedback/feedback-comment-thread.js +27 -13
  292. package/dist/feedback/feedback-comment-thread.js.map +1 -1
  293. package/dist/feedback/feedback-context.js +1 -4
  294. package/dist/feedback/feedback-context.js.map +1 -1
  295. package/dist/feedback/feedback-dialog.js.map +1 -1
  296. package/dist/feedback/feedback-inbox.js.map +1 -1
  297. package/dist/feedback/feedback-public-list.js +7 -1
  298. package/dist/feedback/feedback-public-list.js.map +1 -1
  299. package/dist/feedback/feedback-record.js +1 -5
  300. package/dist/feedback/feedback-record.js.map +1 -1
  301. package/dist/feedback/feedback-replies.js +25 -10
  302. package/dist/feedback/feedback-replies.js.map +1 -1
  303. package/dist/feedback/feedback-row-detail.js.map +1 -1
  304. package/dist/feedback/feedback-status-undo.js.map +1 -1
  305. package/dist/feedback/feedback-submit-dialog.js.map +1 -1
  306. package/dist/feedback/feedback-table.js +4 -1
  307. package/dist/feedback/feedback-table.js.map +1 -1
  308. package/dist/feedback/feedback-thread.js +2 -13
  309. package/dist/feedback/feedback-thread.js.map +1 -1
  310. package/dist/feedback/feedback-vocabulary.js.map +1 -1
  311. package/dist/feedback/feedback-vote-button.js.map +1 -1
  312. package/dist/hooks/use-anchored-rect.js.map +1 -1
  313. package/dist/hooks/use-document-title.js.map +1 -1
  314. package/dist/hooks/use-file-drop.js.map +1 -1
  315. package/dist/hooks/use-file-picker-labels.js.map +1 -1
  316. package/dist/hooks/use-file-picker.js.map +1 -1
  317. package/dist/hooks/use-focus-trap.js.map +1 -1
  318. package/dist/hooks/use-overlay-history.js +10 -5
  319. package/dist/hooks/use-overlay-history.js.map +1 -1
  320. package/dist/hooks/use-row-swipe.d.ts +1 -1
  321. package/dist/hooks/use-row-swipe.js +1 -6
  322. package/dist/hooks/use-row-swipe.js.map +1 -1
  323. package/dist/i18n/defaults.js +1 -4
  324. package/dist/i18n/defaults.js.map +1 -1
  325. package/dist/i18n/german.js +4 -1
  326. package/dist/i18n/german.js.map +1 -1
  327. package/dist/i18n/kit-labels.js +2 -8
  328. package/dist/i18n/kit-labels.js.map +1 -1
  329. package/dist/i18n/languages.js.map +1 -1
  330. package/dist/i18n/locales/en.js +4 -1
  331. package/dist/i18n/locales/en.js.map +2 -2
  332. package/dist/i18n/locales/es.js +4 -1
  333. package/dist/i18n/locales/es.js.map +1 -1
  334. package/dist/i18n/locales/fr.js +4 -1
  335. package/dist/i18n/locales/fr.js.map +1 -1
  336. package/dist/i18n/locales/hu.js +4 -1
  337. package/dist/i18n/locales/hu.js.map +1 -1
  338. package/dist/i18n/locales/it.js +4 -1
  339. package/dist/i18n/locales/it.js.map +1 -1
  340. package/dist/i18n/locales/zh.js.map +1 -1
  341. package/dist/i18n/plurals.js.map +1 -1
  342. package/dist/i18n/review.js +13 -7
  343. package/dist/i18n/review.js.map +1 -1
  344. package/dist/i18n/shared-labels.js.map +1 -1
  345. package/dist/index.d.ts +16 -16
  346. package/dist/index.js +40 -23
  347. package/dist/index.js.map +1 -1
  348. package/dist/landing/access.js +1 -4
  349. package/dist/landing/access.js.map +1 -1
  350. package/dist/landing/landing-sections.js +35 -38
  351. package/dist/landing/landing-sections.js.map +1 -1
  352. package/dist/landing/page-seo.js.map +1 -1
  353. package/dist/lib/calc.js.map +1 -1
  354. package/dist/lib/clipboard-minus.js.map +1 -1
  355. package/dist/lib/dates.js.map +1 -1
  356. package/dist/lib/decimal-marks.js.map +1 -1
  357. package/dist/lib/device-settings.js +2 -1
  358. package/dist/lib/device-settings.js.map +1 -1
  359. package/dist/lib/direction.js.map +1 -1
  360. package/dist/lib/iban.js.map +1 -1
  361. package/dist/lib/logger.js +1 -5
  362. package/dist/lib/logger.js.map +1 -1
  363. package/dist/lib/person-name.js.map +1 -1
  364. package/dist/lib/phone.js.map +1 -1
  365. package/dist/lib/qr-encode.js +344 -8
  366. package/dist/lib/qr-encode.js.map +1 -1
  367. package/dist/lib/session-refresh.js.map +1 -1
  368. package/dist/lib/table-text.js +15 -3
  369. package/dist/lib/table-text.js.map +1 -1
  370. package/dist/lib/text-match.d.ts +4 -0
  371. package/dist/lib/text-match.js.map +1 -1
  372. package/dist/lib/translation-review.js.map +1 -1
  373. package/dist/notifications/notification-inbox.js +63 -44
  374. package/dist/notifications/notification-inbox.js.map +1 -1
  375. package/dist/notifications/notification-parts.js.map +1 -1
  376. package/dist/notifications/notification-types-setting.js.map +1 -1
  377. package/dist/notifications/notifications-labels.js.map +1 -1
  378. package/dist/notifications/push-device-setting.js +6 -1
  379. package/dist/notifications/push-device-setting.js.map +1 -1
  380. package/dist/notifications/push-devices-setting.js.map +1 -1
  381. package/dist/notifications/push-worker.js.map +1 -1
  382. package/dist/notifications/quiet-hours-setting.js.map +1 -1
  383. package/dist/notifications/use-push-device.js +4 -1
  384. package/dist/notifications/use-push-device.js.map +1 -1
  385. package/dist/offline/pwa-update-prompt.d.ts +1 -1
  386. package/dist/offline/pwa-update-prompt.js +7 -1
  387. package/dist/offline/pwa-update-prompt.js.map +1 -1
  388. package/dist/offline/query-persistence.js.map +1 -1
  389. package/dist/offline.d.ts +1 -1
  390. package/dist/offline.js +6 -1
  391. package/dist/offline.js.map +1 -1
  392. package/dist/pay/pay.css +8 -1
  393. package/dist/rhf/fields.d.ts +1 -2
  394. package/dist/rhf/fields.js +1 -10
  395. package/dist/rhf/fields.js.map +1 -1
  396. package/dist/rhf/form-core.js +1 -4
  397. package/dist/rhf/form-core.js.map +1 -1
  398. package/dist/rhf/line-items.js.map +1 -1
  399. package/dist/rhf/use-rhf-wizard-step.js.map +1 -1
  400. package/dist/search/command-palette.js +71 -62
  401. package/dist/search/command-palette.js.map +1 -1
  402. package/dist/search/global-search.js +34 -5
  403. package/dist/search/global-search.js.map +1 -1
  404. package/dist/search/search-index.js.map +1 -1
  405. package/dist/settings/device-reset-setting.js +1 -6
  406. package/dist/settings/device-reset-setting.js.map +1 -1
  407. package/dist/settings/settings-heading.js.map +1 -1
  408. package/dist/settings/settings-layout.js +9 -20
  409. package/dist/settings/settings-layout.js.map +1 -1
  410. package/dist/settings/use-settings-route.js.map +1 -1
  411. package/dist/shell/app-shell.js +62 -31
  412. package/dist/shell/app-shell.js.map +1 -1
  413. package/dist/shell/auth-layout.js +1 -10
  414. package/dist/shell/auth-layout.js.map +1 -1
  415. package/dist/shell/dev-menu.js +12 -6
  416. package/dist/shell/dev-menu.js.map +1 -1
  417. package/dist/shell/option-switcher-menu.js.map +1 -1
  418. package/dist/shell/sync-status-indicator.js +7 -6
  419. package/dist/shell/sync-status-indicator.js.map +1 -1
  420. package/dist/shell/top-bar-parts-labels.js.map +1 -1
  421. package/dist/shell/topbar-action-menu.js.map +1 -1
  422. package/dist/shell/topbar-controls.js +1 -10
  423. package/dist/shell/topbar-controls.js.map +1 -1
  424. package/dist/shell/tour-menu.js +9 -1
  425. package/dist/shell/tour-menu.js.map +1 -1
  426. package/dist/sync/db.js.map +1 -1
  427. package/dist/sync/engine.js +24 -6
  428. package/dist/sync/engine.js.map +1 -1
  429. package/dist/sync.d.ts +2 -2
  430. package/dist/sync.js +7 -1
  431. package/dist/sync.js.map +1 -1
  432. package/dist/testing/css-variables.js.map +1 -1
  433. package/dist/testing/index.d.ts +1 -1
  434. package/dist/testing/index.js +1 -3
  435. package/dist/testing/index.js.map +1 -1
  436. package/dist/testing/react.js.map +1 -1
  437. package/dist/testing/viewport.js +7 -4
  438. package/dist/testing/viewport.js.map +1 -1
  439. package/dist/theme/contrast-tokens.js +13 -2
  440. package/dist/theme/contrast-tokens.js.map +1 -1
  441. package/dist/theme/palette-derive.d.ts +1 -1
  442. package/dist/theme/palette-derive.js +18 -29
  443. package/dist/theme/palette-derive.js.map +1 -1
  444. package/dist/theme/palette-presets.js.map +1 -1
  445. package/dist/theme/palette-store.js.map +1 -1
  446. package/dist/theme/text-size.js.map +1 -1
  447. package/dist/theme/theme-store.js +1 -3
  448. package/dist/theme/theme-store.js.map +1 -1
  449. package/dist/tour/tour-catalogue.js.map +1 -1
  450. package/dist/tour/tour-dock.js +5 -1
  451. package/dist/tour/tour-dock.js.map +1 -1
  452. package/dist/tour/tour-engine.js +1 -4
  453. package/dist/tour/tour-engine.js.map +1 -1
  454. package/dist/tour/tour.js +21 -12
  455. package/dist/tour/tour.js.map +1 -1
  456. package/dist/tour/use-tour-progress.js.map +1 -1
  457. package/dist/tour/use-tour-url-sync.js.map +1 -1
  458. package/dist/wizard/stepper-nav.js +3 -24
  459. package/dist/wizard/stepper-nav.js.map +1 -1
  460. package/dist/wizard/types.js.map +1 -1
  461. package/dist/wizard/use-wizard.js +24 -28
  462. package/dist/wizard/use-wizard.js.map +1 -1
  463. package/dist/wizard/validation.js.map +1 -1
  464. package/dist/wizard/wizard-context.js.map +1 -1
  465. package/dist/wizard/wizard-step.d.ts +1 -1
  466. package/dist/wizard/wizard-step.js +1 -8
  467. package/dist/wizard/wizard-step.js.map +1 -1
  468. package/dist/wizard/wizard-summary.js.map +1 -1
  469. package/package.json +5 -2
  470. package/src/account/account-settings-labels.ts +1 -2
  471. package/src/account/account-settings.tsx +11 -17
  472. package/src/account/delete-account-setting.tsx +1 -6
  473. package/src/account/email-change-setting-labels.ts +1 -2
  474. package/src/account/email-change-setting.tsx +3 -1
  475. package/src/account/passkeys-setting.tsx +1 -3
  476. package/src/account/sessions-setting.tsx +4 -2
  477. package/src/admin/admin-action-confirm.tsx +4 -7
  478. package/src/admin/admin-action-log.tsx +29 -29
  479. package/src/admin/admin-area-labels.ts +4 -1
  480. package/src/admin/admin-overview.tsx +8 -2
  481. package/src/admin/admin-sections.tsx +3 -1
  482. package/src/admin/admin-tool-links.tsx +7 -1
  483. package/src/admin/invitations-panel.tsx +5 -11
  484. package/src/admin/mail-test-card.tsx +1 -2
  485. package/src/admin/reviewer-scope-editor.tsx +4 -9
  486. package/src/admin/role-select.tsx +4 -2
  487. package/src/admin/user-roster.tsx +2 -11
  488. package/src/auth/accept-invitation.tsx +1 -7
  489. package/src/auth/auth-errors.ts +1 -6
  490. package/src/auth/forgot-password-form.tsx +2 -7
  491. package/src/auth/register-form.tsx +7 -8
  492. package/src/auth/reset-password-form.tsx +2 -5
  493. package/src/auth/sign-in-form.tsx +15 -14
  494. package/src/auth/verify-email.tsx +2 -7
  495. package/src/billing/billing-banner.tsx +3 -7
  496. package/src/billing/billing-labels.ts +6 -4
  497. package/src/billing/checkout-processing.ts +0 -1
  498. package/src/billing/plan-card.tsx +9 -8
  499. package/src/billing/plan-limit-toast.tsx +1 -2
  500. package/src/billing/plan-limit.ts +1 -2
  501. package/src/billing/plan-price.ts +1 -4
  502. package/src/billing/plan-switch.tsx +1 -2
  503. package/src/billing/subscription-actions.tsx +5 -2
  504. package/src/components/account-chips.tsx +1 -7
  505. package/src/components/alert-banner.tsx +2 -8
  506. package/src/components/amount-input.tsx +206 -178
  507. package/src/components/authed-image.tsx +7 -4
  508. package/src/components/autocomplete.tsx +7 -9
  509. package/src/components/bulk-action-bar.tsx +2 -7
  510. package/src/components/button-group.tsx +1 -2
  511. package/src/components/button-look.ts +6 -17
  512. package/src/components/button.tsx +1 -4
  513. package/src/components/calculator.tsx +6 -9
  514. package/src/components/calendar-heatmap.tsx +5 -10
  515. package/src/components/card.tsx +9 -13
  516. package/src/components/chart-zoom-core.tsx +6 -33
  517. package/src/components/chart.tsx +8 -31
  518. package/src/components/checkbox-group.tsx +1 -4
  519. package/src/components/chip-input.tsx +6 -6
  520. package/src/components/chip.tsx +14 -26
  521. package/src/components/choice-card.tsx +4 -18
  522. package/src/components/column-mapper-labels.ts +3 -10
  523. package/src/components/column-mapper.tsx +33 -122
  524. package/src/components/combobox-core.tsx +12 -42
  525. package/src/components/combobox.tsx +2 -6
  526. package/src/components/confirm-dialog.tsx +1 -3
  527. package/src/components/copy-button.tsx +2 -4
  528. package/src/components/country-select.tsx +9 -21
  529. package/src/components/currency-option-list.tsx +13 -14
  530. package/src/components/currency-select.tsx +2 -7
  531. package/src/components/danger-confirm.tsx +8 -9
  532. package/src/components/data-table-cells.tsx +1 -2
  533. package/src/components/data-table-column-settings.tsx +1 -3
  534. package/src/components/data-table-filter-popover.tsx +5 -19
  535. package/src/components/data-table-filters.ts +1 -6
  536. package/src/components/data-table-fit.ts +1 -3
  537. package/src/components/data-table-groups.tsx +3 -1
  538. package/src/components/data-table-head.tsx +27 -45
  539. package/src/components/data-table-mobile.tsx +99 -108
  540. package/src/components/data-table-pagination.tsx +2 -6
  541. package/src/components/data-table-row-actions.tsx +25 -24
  542. package/src/components/data-table-row.tsx +16 -17
  543. package/src/components/data-table-shared.tsx +10 -16
  544. package/src/components/data-table-sort.ts +1 -2
  545. package/src/components/data-table-virtual.ts +9 -4
  546. package/src/components/data-table.tsx +489 -501
  547. package/src/components/date-picker.tsx +1 -7
  548. package/src/components/date-range-picker.tsx +3 -13
  549. package/src/components/description-list.tsx +7 -13
  550. package/src/components/dialog-frame.tsx +12 -3
  551. package/src/components/disclosure.tsx +8 -12
  552. package/src/components/dropdown.tsx +3 -11
  553. package/src/components/empty-state.tsx +1 -3
  554. package/src/components/entity-combobox.tsx +2 -6
  555. package/src/components/error-boundary.tsx +7 -7
  556. package/src/components/field-base.tsx +8 -14
  557. package/src/components/field-parts.tsx +12 -23
  558. package/src/components/field-sync.tsx +7 -11
  559. package/src/components/file-button.tsx +7 -3
  560. package/src/components/file-dropzone.tsx +7 -12
  561. package/src/components/floating-panel.tsx +44 -51
  562. package/src/components/focus-ring.ts +1 -2
  563. package/src/components/form-actions.tsx +1 -4
  564. package/src/components/grouped-picker.tsx +6 -8
  565. package/src/components/hover-menu.tsx +1 -4
  566. package/src/components/iban-input-labels.ts +1 -2
  567. package/src/components/icon-button.tsx +46 -48
  568. package/src/components/icon-picker.tsx +4 -17
  569. package/src/components/image-grid.tsx +1 -6
  570. package/src/components/inline-edit-field.tsx +1 -5
  571. package/src/components/inline-entity-combobox.tsx +6 -21
  572. package/src/components/input.tsx +14 -2
  573. package/src/components/jump-calendar.tsx +2 -6
  574. package/src/components/legal-labels.ts +1 -2
  575. package/src/components/legal-page.tsx +18 -7
  576. package/src/components/legal.tsx +14 -5
  577. package/src/components/lightbox.tsx +1 -3
  578. package/src/components/line-items.tsx +7 -15
  579. package/src/components/list.tsx +29 -25
  580. package/src/components/measured-grid.tsx +8 -30
  581. package/src/components/menu-item.tsx +1 -3
  582. package/src/components/mini-calendar.tsx +129 -159
  583. package/src/components/money-field.tsx +4 -2
  584. package/src/components/month-picker.tsx +14 -21
  585. package/src/components/multi-entity-combobox.tsx +6 -26
  586. package/src/components/multi-select.tsx +5 -9
  587. package/src/components/nav-pills.tsx +10 -2
  588. package/src/components/number-field.tsx +18 -15
  589. package/src/components/number-input.tsx +3 -19
  590. package/src/components/numpad-sheet.tsx +9 -13
  591. package/src/components/one-time-code-input.tsx +6 -11
  592. package/src/components/page-contents.tsx +2 -9
  593. package/src/components/page-header.tsx +5 -10
  594. package/src/components/password-strength-labels.ts +1 -2
  595. package/src/components/password-strength.tsx +6 -9
  596. package/src/components/phone-input.tsx +2 -13
  597. package/src/components/picker-sheet.tsx +2 -5
  598. package/src/components/pie-chart.tsx +6 -12
  599. package/src/components/popover.tsx +2 -1
  600. package/src/components/progress-bar.tsx +16 -25
  601. package/src/components/qr-code.tsx +2 -9
  602. package/src/components/row-actions.tsx +9 -1
  603. package/src/components/search-field.tsx +4 -5
  604. package/src/components/select.tsx +2 -10
  605. package/src/components/separator.tsx +1 -5
  606. package/src/components/series-chart-axes.ts +5 -5
  607. package/src/components/series-chart-budget.ts +1 -4
  608. package/src/components/series-chart-ticks.ts +1 -4
  609. package/src/components/series-chart.tsx +43 -83
  610. package/src/components/settings-fields.tsx +20 -15
  611. package/src/components/share-card.tsx +6 -14
  612. package/src/components/sign-chip.tsx +16 -16
  613. package/src/components/signature-pad.tsx +21 -13
  614. package/src/components/signed-amount.tsx +6 -14
  615. package/src/components/skeleton.tsx +2 -13
  616. package/src/components/slider.tsx +9 -20
  617. package/src/components/sparkline.tsx +2 -13
  618. package/src/components/stat-tile.tsx +13 -24
  619. package/src/components/swatch-picker.tsx +8 -3
  620. package/src/components/swipeable-row.tsx +2 -11
  621. package/src/components/table-skeleton.tsx +4 -1
  622. package/src/components/table.tsx +12 -8
  623. package/src/components/tabs.tsx +24 -39
  624. package/src/components/text-link.tsx +6 -6
  625. package/src/components/text.tsx +1 -2
  626. package/src/components/tile-radio.tsx +6 -19
  627. package/src/components/time-input.tsx +4 -5
  628. package/src/components/toast.tsx +3 -12
  629. package/src/components/toggle-group.tsx +9 -9
  630. package/src/components/toggle-legend.tsx +4 -16
  631. package/src/components/tooltip.tsx +9 -48
  632. package/src/components/translation-review-editor.tsx +4 -4
  633. package/src/components/translation-review-parts.tsx +7 -1
  634. package/src/components/translation-review.tsx +15 -16
  635. package/src/components/tree-view.tsx +17 -20
  636. package/src/components/treemap.tsx +3 -15
  637. package/src/components/trigger-aria.ts +1 -4
  638. package/src/components/use-table-state.ts +16 -17
  639. package/src/components/user-avatar.tsx +4 -21
  640. package/src/demo/demo-start.tsx +8 -4
  641. package/src/feedback/feedback-attachment-labels.ts +2 -1
  642. package/src/feedback/feedback-attachment.tsx +16 -29
  643. package/src/feedback/feedback-capture.ts +3 -1
  644. package/src/feedback/feedback-comment-thread.tsx +9 -6
  645. package/src/feedback/feedback-context.tsx +1 -4
  646. package/src/feedback/feedback-dialog.tsx +3 -4
  647. package/src/feedback/feedback-inbox.tsx +3 -9
  648. package/src/feedback/feedback-public-list.tsx +7 -1
  649. package/src/feedback/feedback-record.ts +6 -14
  650. package/src/feedback/feedback-replies.tsx +10 -5
  651. package/src/feedback/feedback-row-detail.tsx +2 -5
  652. package/src/feedback/feedback-status-undo.ts +1 -4
  653. package/src/feedback/feedback-submit-dialog.tsx +4 -4
  654. package/src/feedback/feedback-table.tsx +12 -8
  655. package/src/feedback/feedback-thread.tsx +4 -16
  656. package/src/feedback/feedback-vocabulary.ts +72 -82
  657. package/src/feedback/feedback-vote-button.tsx +9 -8
  658. package/src/hooks/use-anchored-rect.ts +1 -4
  659. package/src/hooks/use-document-title.ts +3 -1
  660. package/src/hooks/use-file-drop.ts +1 -3
  661. package/src/hooks/use-file-picker-labels.ts +1 -2
  662. package/src/hooks/use-file-picker.tsx +1 -5
  663. package/src/hooks/use-focus-trap.ts +1 -2
  664. package/src/hooks/use-overlay-history.ts +10 -5
  665. package/src/hooks/use-row-swipe.ts +1 -6
  666. package/src/i18n/defaults.ts +1 -4
  667. package/src/i18n/german.ts +33 -49
  668. package/src/i18n/kit-labels.tsx +5 -20
  669. package/src/i18n/languages.ts +2 -8
  670. package/src/i18n/locales/en.ts +11 -31
  671. package/src/i18n/locales/es.ts +35 -49
  672. package/src/i18n/locales/fr.ts +34 -51
  673. package/src/i18n/locales/hu.ts +26 -37
  674. package/src/i18n/locales/it.ts +35 -52
  675. package/src/i18n/locales/zh.ts +14 -32
  676. package/src/i18n/plurals.ts +4 -1
  677. package/src/i18n/review.ts +18 -7
  678. package/src/i18n/shared-labels.ts +1 -2
  679. package/src/index.ts +106 -32
  680. package/src/landing/access.ts +2 -7
  681. package/src/landing/landing-sections.tsx +14 -15
  682. package/src/landing/page-seo.ts +1 -3
  683. package/src/lib/calc.ts +4 -1
  684. package/src/lib/clipboard-minus.ts +4 -1
  685. package/src/lib/dates.ts +2 -10
  686. package/src/lib/decimal-marks.ts +1 -3
  687. package/src/lib/device-settings.ts +2 -1
  688. package/src/lib/direction.ts +1 -3
  689. package/src/lib/iban.ts +89 -9
  690. package/src/lib/logger.ts +1 -5
  691. package/src/lib/person-name.ts +1 -3
  692. package/src/lib/phone.ts +5 -8
  693. package/src/lib/qr-encode.ts +32 -8
  694. package/src/lib/session-refresh.ts +5 -6
  695. package/src/lib/table-text.ts +24 -6
  696. package/src/lib/text-match.ts +15 -3
  697. package/src/lib/translation-review.ts +1 -3
  698. package/src/notifications/notification-inbox.tsx +17 -4
  699. package/src/notifications/notification-parts.tsx +1 -2
  700. package/src/notifications/notification-types-setting.tsx +19 -18
  701. package/src/notifications/notifications-labels.ts +1 -2
  702. package/src/notifications/push-device-setting.tsx +7 -1
  703. package/src/notifications/push-devices-setting.tsx +7 -3
  704. package/src/notifications/push-worker.ts +10 -2
  705. package/src/notifications/quiet-hours-setting.tsx +4 -1
  706. package/src/notifications/use-push-device.ts +4 -1
  707. package/src/offline/pwa-update-prompt.tsx +7 -1
  708. package/src/offline/query-persistence.ts +9 -6
  709. package/src/offline.ts +6 -1
  710. package/src/rhf/fields.tsx +50 -19
  711. package/src/rhf/form-core.tsx +2 -6
  712. package/src/rhf/line-items.tsx +5 -7
  713. package/src/rhf/use-rhf-wizard-step.ts +3 -12
  714. package/src/search/command-palette.tsx +15 -23
  715. package/src/search/global-search.tsx +38 -8
  716. package/src/search/search-index.ts +5 -1
  717. package/src/settings/device-reset-setting.tsx +5 -8
  718. package/src/settings/settings-heading.tsx +3 -1
  719. package/src/settings/settings-layout.tsx +6 -13
  720. package/src/settings/use-settings-route.ts +4 -3
  721. package/src/shell/app-shell.tsx +48 -24
  722. package/src/shell/auth-layout.tsx +1 -6
  723. package/src/shell/dev-menu.tsx +12 -6
  724. package/src/shell/option-switcher-menu.tsx +1 -3
  725. package/src/shell/sync-status-indicator.tsx +14 -12
  726. package/src/shell/top-bar-parts-labels.ts +1 -3
  727. package/src/shell/topbar-action-menu.tsx +9 -8
  728. package/src/shell/topbar-controls.tsx +5 -19
  729. package/src/shell/tour-menu.tsx +9 -1
  730. package/src/sync/db.ts +5 -1
  731. package/src/sync/engine.ts +44 -12
  732. package/src/sync.ts +16 -2
  733. package/src/testing/css-variables.ts +1 -2
  734. package/src/testing/index.ts +1 -6
  735. package/src/testing/react.ts +1 -2
  736. package/src/testing/viewport.ts +9 -9
  737. package/src/theme/contrast-tokens.ts +13 -2
  738. package/src/theme/palette-derive.ts +24 -50
  739. package/src/theme/palette-presets.ts +0 -1
  740. package/src/theme/palette-store.ts +1 -4
  741. package/src/theme/text-size.ts +1 -1
  742. package/src/theme/theme-store.ts +2 -6
  743. package/src/tour/tour-catalogue.tsx +4 -2
  744. package/src/tour/tour-dock.ts +5 -1
  745. package/src/tour/tour-engine.ts +2 -6
  746. package/src/tour/tour.tsx +28 -12
  747. package/src/tour/use-tour-progress.ts +8 -2
  748. package/src/tour/use-tour-url-sync.ts +3 -1
  749. package/src/vite-env.d.ts +1 -4
  750. package/src/wizard/stepper-nav.tsx +10 -35
  751. package/src/wizard/types.ts +1 -4
  752. package/src/wizard/use-wizard.ts +28 -43
  753. package/src/wizard/validation.ts +1 -5
  754. package/src/wizard/wizard-context.tsx +2 -6
  755. package/src/wizard/wizard-step.tsx +1 -8
  756. package/src/wizard/wizard-summary.tsx +2 -6
  757. package/tokens.css +393 -152
@@ -19,11 +19,7 @@ export const TOPBAR_MENU_ITEM_CLASS =
19
19
 
20
20
  /** The small uppercase heading row the top-bar menus share (`heading`). */
21
21
  function MenuHeading({ children }: { children: string }) {
22
- return (
23
- <li className="px-3 py-1 text-micro font-semibold uppercase tracking-wide text-placeholder">
24
- {children}
25
- </li>
26
- );
22
+ return <li className="px-3 py-1 text-micro font-semibold uppercase tracking-wide text-placeholder">{children}</li>;
27
23
  }
28
24
 
29
25
  /**
@@ -108,12 +104,7 @@ export function PaletteMenu({
108
104
  aria-label={labels.palette}
109
105
  trigger={({ toggle }) => (
110
106
  <Tooltip label={activeName} portal>
111
- <button
112
- type="button"
113
- onClick={toggle}
114
- aria-label={labels.palette}
115
- className={TOPBAR_TRIGGER_CLASS}
116
- >
107
+ <button type="button" onClick={toggle} aria-label={labels.palette} className={TOPBAR_TRIGGER_CLASS}>
117
108
  {/* A DATA colour, not a semantic one: the palette mark is the
118
109
  "colour" control, so it carries a colour, and which hue is
119
110
  arbitrary. `--chart-1` is the violet end of the CVD-safe
@@ -155,14 +146,10 @@ export function PaletteMenu({
155
146
  </span>
156
147
  <span className="flex min-w-0 flex-col text-start">
157
148
  <span className="truncate">{p.name}</span>
158
- <span className="truncate text-caption text-placeholder">
159
- {p.blurb}
160
- </span>
149
+ <span className="truncate text-caption text-placeholder">{p.blurb}</span>
161
150
  </span>
162
151
  </span>
163
- {activeId === p.id && (
164
- <Check className="size-4 shrink-0 text-secondary" />
165
- )}
152
+ {activeId === p.id && <Check className="size-4 shrink-0 text-secondary" />}
166
153
  </button>
167
154
  </li>
168
155
  );
@@ -186,8 +173,7 @@ export type LanguageMenuTrigger = "flag+code" | "code" | "flag";
186
173
  /** The trigger with a code: as tall as the others, as wide as flag and code need. */
187
174
  const LANGUAGE_TRIGGER_WIDE_CLASS = TOPBAR_TRIGGER_CLASS.replace("size-9", "h-9 min-w-9 gap-1.5 px-2");
188
175
 
189
- const FLAG_CLASS =
190
- "inline-block h-[0.9375rem] w-5 shrink-0 rounded-sm shadow-[0_0_0_1px_rgba(0,0,0,0.08)]";
176
+ const FLAG_CLASS = "inline-block h-[0.9375rem] w-5 shrink-0 rounded-sm shadow-[0_0_0_1px_rgba(0,0,0,0.08)]";
191
177
 
192
178
  /** Language switcher: a hover menu of options with flags and a check on the
193
179
  * active one. Controlled — the app owns the current code and change handler.
@@ -148,7 +148,15 @@ export function TourMenu({
148
148
  const tail: TopBarMenuEntry[] = [
149
149
  ...rest.map(entryFor),
150
150
  ...(href
151
- ? [{ kind: "link" as const, key: "all-tours", icon: <Compass className="size-4" />, label: words.allTours, to: href }]
151
+ ? [
152
+ {
153
+ kind: "link" as const,
154
+ key: "all-tours",
155
+ icon: <Compass className="size-4" />,
156
+ label: words.allTours,
157
+ to: href,
158
+ },
159
+ ]
152
160
  : []),
153
161
  ];
154
162
 
package/src/sync/db.ts CHANGED
@@ -98,7 +98,11 @@ export const SYNC_DB_PK_INDEX = {
98
98
  */
99
99
  export async function rowByPk(db: SyncDb, entity: string, pk: number): Promise<SyncedRow | undefined> {
100
100
  if (db.rows.schema.idxByName["[entity+pk]"]) return db.rows.where("[entity+pk]").equals([entity, pk]).first();
101
- return db.rows.where("entity").equals(entity).filter((row) => row.pk === pk).first();
101
+ return db.rows
102
+ .where("entity")
103
+ .equals(entity)
104
+ .filter((row) => row.pk === pk)
105
+ .first();
102
106
  }
103
107
 
104
108
  /**
@@ -103,7 +103,13 @@ export interface SyncEngine {
103
103
  /** Into the copy at once and into the queue, in the scope the caller names (D11). An edit
104
104
  * merges into the row's last `pending` upsert; deleting a row that never reached the
105
105
  * server forgets its queue; stamped with `stampAfter`. */
106
- write(scope: string, entity: string, id: string, op: "upsert" | "delete", data?: Record<string, unknown>): Promise<void>;
106
+ write(
107
+ scope: string,
108
+ entity: string,
109
+ id: string,
110
+ op: "upsert" | "delete",
111
+ data?: Record<string, unknown>,
112
+ ): Promise<void>;
107
113
  start(): void;
108
114
  /** Stops the poll and the timers, aborts the round in flight and drops its answer (the
109
115
  * queue is laid back). A new engine's round on the same database waits for it. */
@@ -164,9 +170,9 @@ function defaultPlanCode(err: unknown): string | null {
164
170
  * `{detail: {code, detail}}`. */
165
171
  function refusalOf(err: unknown): { code?: string; detail?: string } {
166
172
  const body = (err as { response?: { data?: unknown } }).response?.data as
167
- | { code?: unknown; detail?: unknown }
168
- | undefined;
169
- const inner = body?.detail && typeof body.detail === "object" ? (body.detail as { code?: unknown; detail?: unknown }) : body;
173
+ { code?: unknown; detail?: unknown } | undefined;
174
+ const inner =
175
+ body?.detail && typeof body.detail === "object" ? (body.detail as { code?: unknown; detail?: unknown }) : body;
170
176
  const text = (v: unknown) => (typeof v === "string" && v ? v : undefined);
171
177
  return { code: text(inner?.code), detail: text(inner?.detail) };
172
178
  }
@@ -200,7 +206,13 @@ export function createSyncEngine<D extends SyncDb = SyncDb>(options: SyncEngineO
200
206
  const sharedComputer = options.sharedComputer ?? isSharedComputer;
201
207
 
202
208
  let generation = 0;
203
- let state: SyncEngineState = { phase: "idle", online: browserOnline(), counts: ZERO, lastSyncedAt: null, nextRetryAt: null };
209
+ let state: SyncEngineState = {
210
+ phase: "idle",
211
+ online: browserOnline(),
212
+ counts: ZERO,
213
+ lastSyncedAt: null,
214
+ nextRetryAt: null,
215
+ };
204
216
  const listeners = new Set<() => void>();
205
217
  let started = false;
206
218
  let poll: ReturnType<typeof setInterval> | null = null;
@@ -281,7 +293,8 @@ export function createSyncEngine<D extends SyncDb = SyncDb>(options: SyncEngineO
281
293
  const rejected = sent.filter((c) => !refusedIds.has(c.id) && rejections.has(c.id));
282
294
  await db.outbox.bulkDelete(sent.filter((c) => !refusedIds.has(c.id) && !rejections.has(c.id)).map((c) => c.seq!));
283
295
  const hold = refused != null && holdCodes.has(refused.code);
284
- if (refused) await mark(kept, { status: hold ? "waiting" : "blocked", code: refused.code, reason: refused.detail });
296
+ if (refused)
297
+ await mark(kept, { status: hold ? "waiting" : "blocked", code: refused.code, reason: refused.detail });
285
298
  for (const change of rejected) {
286
299
  const why = rejections.get(change.id)!;
287
300
  await db.outbox.update(change.seq!, { status: "rejected", code: why.code, reason: why.detail });
@@ -313,7 +326,13 @@ export function createSyncEngine<D extends SyncDb = SyncDb>(options: SyncEngineO
313
326
  continue;
314
327
  }
315
328
  const row = (await db.rows.get([change.entity, change.id])) as CopyRow | undefined;
316
- await db.rows.put({ ...row, entity: change.entity, id: change.id, pk: row?.pk ?? null, data: { ...row?.data, ...change.data } });
329
+ await db.rows.put({
330
+ ...row,
331
+ entity: change.entity,
332
+ id: change.id,
333
+ pk: row?.pk ?? null,
334
+ data: { ...row?.data, ...change.data },
335
+ });
317
336
  }
318
337
  if (lastPage) {
319
338
  await db.meta.put({ key: lastKnowledgeKey(scope), value: answer.server_knowledge });
@@ -345,7 +364,12 @@ export function createSyncEngine<D extends SyncDb = SyncDb>(options: SyncEngineO
345
364
 
346
365
  type ScopeResult = { offline: true } | { offline: false; waiting: number; blocked: number; rejected: number };
347
366
 
348
- async function syncScope(scope: string, gen: number, signal: AbortSignal, withBlocked: boolean): Promise<ScopeResult> {
367
+ async function syncScope(
368
+ scope: string,
369
+ gen: number,
370
+ signal: AbortSignal,
371
+ withBlocked: boolean,
372
+ ): Promise<ScopeResult> {
349
373
  const sent = await takeQueue(scope, withBlocked);
350
374
  const last = Number((await db.meta.get(lastKnowledgeKey(scope)))?.value ?? 0) || 0;
351
375
  const body = (changes: SyncWireChange[], page_cursor: SyncRequestBody["page_cursor"]): SyncRequestBody => ({
@@ -369,7 +393,8 @@ export function createSyncEngine<D extends SyncDb = SyncDb>(options: SyncEngineO
369
393
  await mark(sent, { status: "waiting", code: plan, reason: plan });
370
394
  return { offline: false, waiting: sent.length, blocked: 0, rejected: 0 };
371
395
  }
372
- if (httpStatusOf(err) === 403) return { offline: false, waiting: 0, blocked: 0, rejected: await loseScope(scope, err) };
396
+ if (httpStatusOf(err) === 403)
397
+ return { offline: false, waiting: 0, blocked: 0, rejected: await loseScope(scope, err) };
373
398
  throw err;
374
399
  }
375
400
  let cursor = options.paged ? (answer.page_cursor ?? null) : null;
@@ -545,7 +570,9 @@ export function createSyncEngine<D extends SyncDb = SyncDb>(options: SyncEngineO
545
570
  const row = (await db.rows.get([entity, id])) as CopyRow | undefined;
546
571
  const ofRow = await db.outbox.where("[entity+id]").equals([entity, id]).toArray();
547
572
  ofRow.sort((a, b) => a.seq! - b.seq!);
548
- const updated_at = stampAfter(latest([row?.updated_at, row?.data.updated_at, ...ofRow.map((c) => c.updated_at)]));
573
+ const updated_at = stampAfter(
574
+ latest([row?.updated_at, row?.data.updated_at, ...ofRow.map((c) => c.updated_at)]),
575
+ );
549
576
  // A new edit to the row moves a rejected change out of the way (D13).
550
577
  const rejected = ofRow.filter((c) => c.scope === scope && c.status === "rejected");
551
578
  if (op === "delete") {
@@ -564,7 +591,10 @@ export function createSyncEngine<D extends SyncDb = SyncDb>(options: SyncEngineO
564
591
  const next: CopyRow = { ...row, entity, id, pk: row?.pk ?? null, data: { ...row?.data, ...data } };
565
592
  if (!row) next.local = true;
566
593
  await db.rows.put(next);
567
- const carried = Object.assign({}, ...rejected.filter((c) => c.op === "upsert").map((c) => c.data)) as Record<string, unknown>;
594
+ const carried = Object.assign({}, ...rejected.filter((c) => c.op === "upsert").map((c) => c.data)) as Record<
595
+ string,
596
+ unknown
597
+ >;
568
598
  await db.outbox.bulkDelete(rejected.map((c) => c.seq!));
569
599
  const last = ofRow.filter((c) => c.scope === scope && c.status === "pending").at(-1);
570
600
  if (last && last.op === "upsert") {
@@ -628,7 +658,9 @@ export function createSyncEngine<D extends SyncDb = SyncDb>(options: SyncEngineO
628
658
  },
629
659
 
630
660
  async discardRejected(scope) {
631
- const gone = (await db.outbox.where("status").equals("rejected").toArray()).filter((c) => !scope || c.scope === scope);
661
+ const gone = (await db.outbox.where("status").equals("rejected").toArray()).filter(
662
+ (c) => !scope || c.scope === scope,
663
+ );
632
664
  if (gone.length === 0) return;
633
665
  await db.transaction("rw", db.rows, db.outbox, db.meta, async () => {
634
666
  await db.outbox.bulkDelete(gone.map((c) => c.seq!));
package/src/sync.ts CHANGED
@@ -5,8 +5,22 @@
5
5
  // `/offline`'s TanStack and idb-keyval peers: the leaf utilities both entries export live in
6
6
  // one module of their own (src/offline/local-first.ts). NOT re-exported from the main barrel.
7
7
  export { createSyncDb, rowByPk, SYNC_DB_PK_INDEX, SYNC_DB_STORES } from "./sync/db";
8
- export type { CreateSyncDbOptions, OutboxChange, OutboxStatus, SyncDb, SyncDbUpgrade, SyncedRow, SyncMetaEntry } from "./sync/db";
9
- export { createSyncEngine, DEFAULT_HOLD_CODES, DEFAULT_SYNC_BACKOFF_MS, releaseSyncEngine, syncEngineFor } from "./sync/engine";
8
+ export type {
9
+ CreateSyncDbOptions,
10
+ OutboxChange,
11
+ OutboxStatus,
12
+ SyncDb,
13
+ SyncDbUpgrade,
14
+ SyncedRow,
15
+ SyncMetaEntry,
16
+ } from "./sync/db";
17
+ export {
18
+ createSyncEngine,
19
+ DEFAULT_HOLD_CODES,
20
+ DEFAULT_SYNC_BACKOFF_MS,
21
+ releaseSyncEngine,
22
+ syncEngineFor,
23
+ } from "./sync/engine";
10
24
  export type {
11
25
  SyncCounts,
12
26
  SyncEngine,
@@ -158,8 +158,7 @@ export function undeclaredCssVariables(
158
158
  if (isCssPath(path)) for (const name of declaredCustomProperties(text)) declared.add(name);
159
159
  for (const name of runtimeWrites(text)) declared.add(name);
160
160
  }
161
- const listed = (name: string) =>
162
- runtime.some((r) => (typeof r === "string" ? r === name : r.test(name)));
161
+ const listed = (name: string) => runtime.some((r) => (typeof r === "string" ? r === name : r.test(name)));
163
162
 
164
163
  const out: string[] = [];
165
164
  for (const [path, text] of code) {
@@ -26,9 +26,4 @@ export {
26
26
  } from "./viewport";
27
27
  // 0.50.1 (keksdose N4): a valid `TourStepContext` for a test that calls a step's
28
28
  // `beforeStep` or `when` itself — `beforeStep!(tourStepContext())`.
29
- export {
30
- tourStepContext,
31
- type TestTourStepContext,
32
- type TourStepContextOptions,
33
- type TourStepVia,
34
- } from "./tour";
29
+ export { tourStepContext, type TestTourStepContext, type TourStepContextOptions, type TourStepVia } from "./tour";
@@ -49,8 +49,7 @@ export async function rowMenuAction(
49
49
  // Any row's name: the words around the name, whatever the language puts first.
50
50
  const [before, after] = actionsFor("\u0000").split("\u0000");
51
51
  const anyRow = (name: string) =>
52
- name === actions ||
53
- (name.length > before.length + after.length && name.startsWith(before) && name.endsWith(after));
52
+ name === actions || (name.length > before.length + after.length && name.startsWith(before) && name.endsWith(after));
54
53
  const trigger = (await screen.findAllByRole("button", { name: row === undefined ? anyRow : actionsFor(row) }))[0];
55
54
  fireEvent.click(trigger);
56
55
  const title = trigger.getAttribute("aria-label") ?? trigger.textContent ?? "";
@@ -89,9 +89,7 @@ function condition(part: string, width: number, options: ViewportOptions): boole
89
89
  function answer(query: string, width: number, options: ViewportOptions): boolean {
90
90
  return query
91
91
  .split(",")
92
- .some((alternative) =>
93
- alternative.split(/\s+and\s+/).every((part) => condition(part, width, options)),
94
- );
92
+ .some((alternative) => alternative.split(/\s+and\s+/).every((part) => condition(part, width, options)));
95
93
  }
96
94
 
97
95
  /** A list {@link viewportMatchMedia} handed out: what {@link setViewportWidth} flips. */
@@ -155,7 +153,12 @@ function mediaQueryList(query: string, viewport: StubViewport): StubMediaQueryLi
155
153
  * `matches` and `media`, on an `Event` (jsdom has no `MediaQueryListEvent`). */
156
154
  function changeEvent(list: StubMediaQueryList): Event {
157
155
  const event = new Event("change");
158
- for (const [key, value] of Object.entries({ matches: list.matches, media: list.media, target: list, currentTarget: list })) {
156
+ for (const [key, value] of Object.entries({
157
+ matches: list.matches,
158
+ media: list.media,
159
+ target: list,
160
+ currentTarget: list,
161
+ })) {
159
162
  Object.defineProperty(event, key, { value, enumerable: true });
160
163
  }
161
164
  return event;
@@ -175,10 +178,7 @@ function changeEvent(list: StubMediaQueryList): Event {
175
178
  * `vi.stubGlobal("matchMedia", viewportMatchMedia(375))` — or use
176
179
  * {@link stubViewportWidth}.
177
180
  */
178
- export function viewportMatchMedia(
179
- width: number,
180
- options: ViewportOptions = {},
181
- ): (query: string) => MediaQueryList {
181
+ export function viewportMatchMedia(width: number, options: ViewportOptions = {}): (query: string) => MediaQueryList {
182
182
  const viewport: StubViewport = { width, options, lists: new Set() };
183
183
  const matchMedia = (query: string) => {
184
184
  const list = mediaQueryList(query, viewport);
@@ -215,7 +215,7 @@ export function setViewportWidth(width: number): void {
215
215
  if (!viewport) {
216
216
  throw new Error(
217
217
  "setViewportWidth: no viewport stub is in force — put one in first with " +
218
- "stubViewportWidth(width), or vi.stubGlobal(\"matchMedia\", viewportMatchMedia(width)).",
218
+ 'stubViewportWidth(width), or vi.stubGlobal("matchMedia", viewportMatchMedia(width)).',
219
219
  );
220
220
  }
221
221
  viewport.width = width;
@@ -1,4 +1,14 @@
1
- import { contrast, hexToOklch, luminance, oklchToHex, oklchToRgb, parseHex, rgbToOklch, solveLightness, toHex } from "./color";
1
+ import {
2
+ contrast,
3
+ hexToOklch,
4
+ luminance,
5
+ oklchToHex,
6
+ oklchToRgb,
7
+ parseHex,
8
+ rgbToOklch,
9
+ solveLightness,
10
+ toHex,
11
+ } from "./color";
2
12
  import type { TokenSet } from "./palette-presets";
3
13
 
4
14
  /**
@@ -218,7 +228,8 @@ function steppedBorder(t: TokenSet, well: WellStep | null): string {
218
228
  // light well (§13.4), which is the darkest surface under More contrast.
219
229
  const surface2 = well?.bgSurface2 ?? t.bgSurface2;
220
230
  let lo = BORDER_STRONG_SHARE;
221
- if (worstContrast(mix(t.border, t.textPrimary, 1 - lo), t, surface2) >= BORDER_TARGET) return mix(t.border, t.textPrimary, 1 - lo);
231
+ if (worstContrast(mix(t.border, t.textPrimary, 1 - lo), t, surface2) >= BORDER_TARGET)
232
+ return mix(t.border, t.textPrimary, 1 - lo);
222
233
  let hi = 1;
223
234
  for (let i = 0; i < 16; i++) {
224
235
  const mid = (lo + hi) / 2;
@@ -218,8 +218,7 @@ function surfaceSet(hue: number, mode: ThemeMode, tint: number, weight: number)
218
218
  // the three. Solving against `bgSurface` alone left it at 1.36:1 on `bgPage`, so the
219
219
  // target and the audit disagreed about the same border.
220
220
  const hardest = [bgPage, bgSurface, bgSurface2].reduce((a, b) =>
221
- contrast(a, mode === "light" ? "#000000" : "#ffffff") <
222
- contrast(b, mode === "light" ? "#000000" : "#ffffff")
221
+ contrast(a, mode === "light" ? "#000000" : "#ffffff") < contrast(b, mode === "light" ? "#000000" : "#ffffff")
223
222
  ? a
224
223
  : b,
225
224
  );
@@ -261,12 +260,7 @@ function tintOn(hue: number, chroma: number, surface: string, mode: ThemeMode):
261
260
  return oklchToHex({ l, c: Math.min(chroma * 0.45, 0.06), h: hue });
262
261
  }
263
262
 
264
- export function derivePalette({
265
- anchors,
266
- mode,
267
- surfaceTint = 0.55,
268
- textContrast,
269
- }: DeriveOptions): DerivedPalette {
263
+ export function derivePalette({ anchors, mode, surfaceTint = 0.55, textContrast }: DeriveOptions): DerivedPalette {
270
264
  const warnings: string[] = [];
271
265
  const brand = hexToOklch(anchors.brand);
272
266
  if (!brand) {
@@ -285,8 +279,7 @@ export function derivePalette({
285
279
  // wherever it lands. Solving against `bgSurface` alone is the mistake that makes a
286
280
  // muted label fail on the page background it also sits on.
287
281
  const worstSurface = [surfaces.bgPage, surfaces.bgSurface, surfaces.bgSurface2].reduce((a, b) =>
288
- contrast(a, mode === "light" ? "#000000" : "#ffffff") <
289
- contrast(b, mode === "light" ? "#000000" : "#ffffff")
282
+ contrast(a, mode === "light" ? "#000000" : "#ffffff") < contrast(b, mode === "light" ? "#000000" : "#ffffff")
290
283
  ? a
291
284
  : b,
292
285
  );
@@ -304,8 +297,7 @@ export function derivePalette({
304
297
  // roles above keep their margin (4.6:1 and up) and need no second solve.
305
298
  const hover = hoverFill({ textPrimary, bgSurface: surfaces.bgSurface });
306
299
  const worstText = [worstSurface, hover].reduce((a, b) =>
307
- contrast(a, mode === "light" ? "#000000" : "#ffffff") <
308
- contrast(b, mode === "light" ? "#000000" : "#ffffff")
300
+ contrast(a, mode === "light" ? "#000000" : "#ffffff") < contrast(b, mode === "light" ? "#000000" : "#ffffff")
309
301
  ? a
310
302
  : b,
311
303
  );
@@ -328,9 +320,7 @@ export function derivePalette({
328
320
  // and passing either through unchanged put a value in the TokenSet that is not a CSS
329
321
  // colour — it then fails silently at paint time, three layers from here.
330
322
  let brandHex =
331
- brandRatio >= 3
332
- ? toHex(parseHex(anchors.brand)!)
333
- : solveAgainst(brand.h, brandChroma, 3, brandGround, mode);
323
+ brandRatio >= 3 ? toHex(parseHex(anchors.brand)!) : solveAgainst(brand.h, brandChroma, 3, brandGround, mode);
334
324
  if (brandRatio < 3) {
335
325
  warnings.push(
336
326
  `brand ${anchors.brand} sits at ${brandRatio.toFixed(2)}:1 against the ${mode} surfaces, ` +
@@ -425,20 +415,8 @@ export function derivePalette({
425
415
  const hue = semanticHue[role];
426
416
  const chroma = semanticChroma[role];
427
417
  const bg = tintOn(hue, chroma, surfaces.bgSurface, mode);
428
- const onSurface = solveLightness(
429
- 4.5,
430
- parseHex(worstText)!,
431
- hue,
432
- chroma,
433
- mode === "light" ? "darker" : "lighter",
434
- );
435
- const onTint = solveLightness(
436
- 4.5,
437
- parseHex(bg)!,
438
- hue,
439
- chroma,
440
- mode === "light" ? "darker" : "lighter",
441
- );
418
+ const onSurface = solveLightness(4.5, parseHex(worstText)!, hue, chroma, mode === "light" ? "darker" : "lighter");
419
+ const onTint = solveLightness(4.5, parseHex(bg)!, hue, chroma, mode === "light" ? "darker" : "lighter");
442
420
  const l = mode === "light" ? Math.min(onSurface, onTint) : Math.max(onSurface, onTint);
443
421
  return oklchToHex({ l, c: chroma, h: hue });
444
422
  };
@@ -508,7 +486,13 @@ export function derivePalette({
508
486
  // numpad's sign, a future row's figure), so it gets the text floor too (0.33). The
509
487
  // fixed lightness left it at 4.24:1 on four light pages.
510
488
  const neutralChroma = 0.012 * weight;
511
- const neutralFloor = solveLightness(4.5, parseHex(worstText)!, brand.h, neutralChroma, mode === "light" ? "darker" : "lighter");
489
+ const neutralFloor = solveLightness(
490
+ 4.5,
491
+ parseHex(worstText)!,
492
+ brand.h,
493
+ neutralChroma,
494
+ mode === "light" ? "darker" : "lighter",
495
+ );
512
496
  const moneyNeutral = oklchToHex({
513
497
  l: mode === "light" ? Math.min(0.52, neutralFloor) : Math.max(0.72, neutralFloor),
514
498
  c: neutralChroma,
@@ -557,12 +541,7 @@ export function derivePalette({
557
541
  * `moneyIncome`/`moneyExpense` — so a heatmap cell and the figure printed beside it
558
542
  * agree about which way is which, rather than each inventing its own convention.
559
543
  */
560
- function deriveHeat(
561
- income: string,
562
- expense: string,
563
- surfaces: { bgSurface2: string },
564
- mode: ThemeMode,
565
- ): HeatStops {
544
+ function deriveHeat(income: string, expense: string, surfaces: { bgSurface2: string }, mode: ThemeMode): HeatStops {
566
545
  const exp = hexToOklch(expense)!;
567
546
  return {
568
547
  neutral: surfaces.bgSurface2,
@@ -649,7 +628,13 @@ export function auditPalette(
649
628
  }
650
629
  // The stepped light well, a hex `applyTokenSet` writes (§13.3, decision 2).
651
630
  if (step?.well) {
652
- add("bgSurface2 on bgSurface", t.bgSurface2, t.bgSurface, WELL_STEP_MIN, "house rule: the well stands two hover steps from the card");
631
+ add(
632
+ "bgSurface2 on bgSurface",
633
+ t.bgSurface2,
634
+ t.bgSurface,
635
+ WELL_STEP_MIN,
636
+ "house rule: the well stands two hover steps from the card",
637
+ );
653
638
  }
654
639
  for (const [name, bg] of textGrounds) {
655
640
  add(`textPrimary on ${name}`, t.textPrimary, bg, 7, "WCAG 1.4.6 AAA body text");
@@ -694,13 +679,7 @@ export function auditPalette(
694
679
  add("warning on warningBg", semantic.warning, semantic.warningBg, 4.5, "WCAG 1.4.3 — badge text");
695
680
  add("info on infoBg", semantic.info, semantic.infoBg, 4.5, "WCAG 1.4.3 — badge text");
696
681
  add("success on successBg", semantic.success, semantic.successBg, 4.5, "WCAG 1.4.3 — badge text");
697
- add(
698
- "dangerContrast on danger",
699
- semantic.dangerContrast,
700
- semantic.danger,
701
- 4.5,
702
- "WCAG 1.4.3 AA body text",
703
- );
682
+ add("dangerContrast on danger", semantic.dangerContrast, semantic.danger, 4.5, "WCAG 1.4.3 AA body text");
704
683
  }
705
684
 
706
685
  const failures = checks.filter((c) => !c.passes);
@@ -771,12 +750,7 @@ const SINGLE_LIGHTNESS_MAX_SERIES = 4;
771
750
  * wants their charts to follow their brand and is willing to read the report — not as
772
751
  * a silent upgrade to the default.
773
752
  */
774
- export function deriveChartRamp(
775
- brandHex: string,
776
- mode: ThemeMode,
777
- surfaces: string[],
778
- count = 9,
779
- ): ChartRampReport {
753
+ export function deriveChartRamp(brandHex: string, mode: ThemeMode, surfaces: string[], count = 9): ChartRampReport {
780
754
  const brand = hexToOklch(brandHex) ?? { l: 0.6, c: 0.12, h: 264 };
781
755
  const base = mode === "light" ? 0.58 : 0.74;
782
756
  const c = Math.max(0.09, Math.min(brand.c, 0.15));
@@ -174,7 +174,6 @@ export const DEFAULT_PRESET: PalettePreset = {
174
174
  },
175
175
  };
176
176
 
177
-
178
177
  /**
179
178
  * The 0.48 default: the same surfaces, brand and money, with Paul Tol's "Muted" nine
180
179
  * as the chart ramp and the teal/amber heat stops that went with it. Selectable, no
@@ -41,10 +41,7 @@ interface PaletteState {
41
41
  * that app's theme store (for the active light/dark mode). Returns the palette
42
42
  * hook plus the effect + selector hooks that read the active preset's tokens.
43
43
  */
44
- export function createPaletteStore(
45
- storageKey: string,
46
- useTheme: UseBoundStore<StoreApi<ThemeState>>,
47
- ) {
44
+ export function createPaletteStore(storageKey: string, useTheme: UseBoundStore<StoreApi<ThemeState>>) {
48
45
  const usePalette = create<PaletteState>()(
49
46
  logger(
50
47
  persist(
@@ -260,7 +260,7 @@ export function createTextSizeStore(storageKey: string) {
260
260
  merge: (persisted, current) => ({
261
261
  ...current,
262
262
  size: isTextSize((persisted as { size?: unknown } | null)?.size)
263
- ? ((persisted as { size: TextSize }).size)
263
+ ? (persisted as { size: TextSize }).size
264
264
  : null,
265
265
  }),
266
266
  },
@@ -37,9 +37,7 @@ function resolve(preference: ThemePreference): ThemeMode {
37
37
  * persisted the concrete `mode` (light/dark); carry that over as an explicit
38
38
  * preference so the choice survives. Shared by the store's `migrate` and the
39
39
  * pre-hydration {@link applyPersistedTheme}. */
40
- function preferenceFromState(
41
- s: { mode?: string; preference?: string } | null | undefined,
42
- ): ThemePreference {
40
+ function preferenceFromState(s: { mode?: string; preference?: string } | null | undefined): ThemePreference {
43
41
  if (s?.preference === "light" || s?.preference === "dark" || s?.preference === "system") {
44
42
  return s.preference;
45
43
  }
@@ -112,9 +110,7 @@ export function createThemeStore(storageKey: string) {
112
110
  // Only the preference is persisted; `mode` is derived on load.
113
111
  partialize: (s) => ({ preference: s.preference }),
114
112
  migrate: (persistedState): { preference: ThemePreference } => ({
115
- preference: preferenceFromState(
116
- persistedState as { mode?: string; preference?: string } | null,
117
- ),
113
+ preference: preferenceFromState(persistedState as { mode?: string; preference?: string } | null),
118
114
  }),
119
115
  onRehydrateStorage: () => (state) => {
120
116
  // The persisted preference decides the concrete mode at load.
@@ -220,14 +220,16 @@ export function TourCatalogue({
220
220
  const done = (tour: TourInfo) => isTourDone(tour, completed[tour.id]);
221
221
  const needle = foldForSearch(query.trim(), locale);
222
222
  const matchesQuery = (tour: TourInfo) =>
223
- !needle || [tour.title, tour.description, tour.about].some((text) => !!text && foldForSearch(text, locale).includes(needle));
223
+ !needle ||
224
+ [tour.title, tour.description, tour.about].some((text) => !!text && foldForSearch(text, locale).includes(needle));
224
225
  const inState = (tour: TourInfo) => (state === "all" ? true : state === "done" ? done(tour) : !done(tour));
225
226
  const inGroup = (tour: TourInfo, id: string | null = group) => id === null || tour.group === id;
226
227
 
227
228
  const found = listed.filter((t) => matchesQuery(t) && inGroup(t));
228
229
  const foundDone = found.filter(done).length;
229
230
  const visible = found.filter(inState);
230
- const groupCount = (id: string | null) => listed.filter((t) => matchesQuery(t) && inState(t) && inGroup(t, id)).length;
231
+ const groupCount = (id: string | null) =>
232
+ listed.filter((t) => matchesQuery(t) && inState(t) && inGroup(t, id)).length;
231
233
  const filtering = needle.length > 0 || state !== "all" || group !== null;
232
234
  const sections = groups
233
235
  .map((g) => ({ ...g, tours: visible.filter((t) => t.group === g.id) }))
@@ -89,7 +89,11 @@ export function dockStyle(edge: DockEdge, spot: DockRect | null, band: Band): CS
89
89
  maxHeight: cap,
90
90
  };
91
91
  if (edge === "top") {
92
- return { ...base, top: band.top <= 0 ? `max(${GUTTER}px, env(safe-area-inset-top))` : band.top + GUTTER, bottom: "auto" };
92
+ return {
93
+ ...base,
94
+ top: band.top <= 0 ? `max(${GUTTER}px, env(safe-area-inset-top))` : band.top + GUTTER,
95
+ bottom: "auto",
96
+ };
93
97
  }
94
98
  const fromBottom = vh - band.bottom;
95
99
  return {
@@ -12,10 +12,7 @@ export function liveEngine<T extends object>(
12
12
  ): { engine: T; set: (current: T) => void } {
13
13
  let current = initial;
14
14
  const read = () => {
15
- if (!current)
16
- throw new Error(
17
- "[ui-kit] The tour engine was read before its provider rendered.",
18
- );
15
+ if (!current) throw new Error("[ui-kit] The tour engine was read before its provider rendered.");
19
16
  return current;
20
17
  };
21
18
  const engine = {} as T;
@@ -26,8 +23,7 @@ export function liveEngine<T extends object>(
26
23
  const value = read()[key];
27
24
  // A method is looked up when it is CALLED, so a kept `engine.stop` is the latest too.
28
25
  return typeof value === "function"
29
- ? (...args: unknown[]) =>
30
- (read()[key] as (...a: unknown[]) => unknown)(...args)
26
+ ? (...args: unknown[]) => (read()[key] as (...a: unknown[]) => unknown)(...args)
31
27
  : value;
32
28
  },
33
29
  });