@eifi1/ui-kit 0.45.0 → 0.46.1

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 (238) hide show
  1. package/README.md +26 -14
  2. package/dist/admin/admin-area-labels.d.ts +9 -0
  3. package/dist/admin/admin-area-labels.js +5 -1
  4. package/dist/admin/admin-area-labels.js.map +1 -1
  5. package/dist/admin/admin-overview.d.ts +16 -1
  6. package/dist/admin/admin-overview.js +12 -1
  7. package/dist/admin/admin-overview.js.map +1 -1
  8. package/dist/admin/mail-test-card.d.ts +3 -2
  9. package/dist/admin/mail-test-card.js +3 -1
  10. package/dist/admin/mail-test-card.js.map +1 -1
  11. package/dist/admin/user-roster.d.ts +6 -2
  12. package/dist/admin/user-roster.js +7 -3
  13. package/dist/admin/user-roster.js.map +1 -1
  14. package/dist/components/appearance-labels.d.ts +10 -0
  15. package/dist/components/appearance-labels.js +6 -1
  16. package/dist/components/appearance-labels.js.map +1 -1
  17. package/dist/components/data-table-column-settings.js +2 -2
  18. package/dist/components/data-table-column-settings.js.map +1 -1
  19. package/dist/components/data-table-head.js +2 -2
  20. package/dist/components/data-table-head.js.map +1 -1
  21. package/dist/components/data-table-row-actions.d.ts +35 -2
  22. package/dist/components/data-table-row-actions.js +98 -5
  23. package/dist/components/data-table-row-actions.js.map +1 -1
  24. package/dist/components/data-table-shared.js +9 -2
  25. package/dist/components/data-table-shared.js.map +1 -1
  26. package/dist/components/data-table.d.ts +58 -2
  27. package/dist/components/data-table.js +11 -4
  28. package/dist/components/data-table.js.map +1 -1
  29. package/dist/components/date-format-setting.d.ts +29 -0
  30. package/dist/components/date-format-setting.js +36 -0
  31. package/dist/components/date-format-setting.js.map +1 -0
  32. package/dist/components/row-actions.d.ts +12 -5
  33. package/dist/components/row-actions.js +11 -4
  34. package/dist/components/row-actions.js.map +1 -1
  35. package/dist/components/swipeable-row.d.ts +8 -0
  36. package/dist/components/swipeable-row.js.map +1 -1
  37. package/dist/components/tabs.d.ts +3 -2
  38. package/dist/components/tabs.js +1 -1
  39. package/dist/components/tabs.js.map +1 -1
  40. package/dist/components/translation-review-editor.js +1 -0
  41. package/dist/components/translation-review-editor.js.map +1 -1
  42. package/dist/components/translation-review-labels.d.ts +5 -0
  43. package/dist/components/translation-review-labels.js +2 -0
  44. package/dist/components/translation-review-labels.js.map +1 -1
  45. package/dist/components/translation-review.d.ts +18 -8
  46. package/dist/components/translation-review.js +67 -8
  47. package/dist/components/translation-review.js.map +1 -1
  48. package/dist/components/write-lock-labels.js +2 -1
  49. package/dist/components/write-lock-labels.js.map +1 -1
  50. package/dist/components/write-lock.d.ts +33 -3
  51. package/dist/components/write-lock.js +9 -0
  52. package/dist/components/write-lock.js.map +1 -1
  53. package/dist/data-table.d.ts +2 -1
  54. package/dist/data-table.js +2 -0
  55. package/dist/data-table.js.map +1 -1
  56. package/dist/eslint/index.js +1 -1
  57. package/dist/feedback/feedback-row-detail.d.ts +4 -2
  58. package/dist/feedback/feedback-row-detail.js +17 -26
  59. package/dist/feedback/feedback-row-detail.js.map +1 -1
  60. package/dist/feedback/feedback-swipe.d.ts +18 -0
  61. package/dist/feedback/feedback-swipe.js +10 -1
  62. package/dist/feedback/feedback-swipe.js.map +1 -1
  63. package/dist/i18n/german.js +41 -5
  64. package/dist/i18n/german.js.map +1 -1
  65. package/dist/i18n/kit-labels.d.ts +12 -1
  66. package/dist/i18n/kit-labels.js +8 -2
  67. package/dist/i18n/kit-labels.js.map +1 -1
  68. package/dist/i18n/locales/en.js +40 -6
  69. package/dist/i18n/locales/en.js.map +2 -2
  70. package/dist/i18n/locales/es.js +41 -5
  71. package/dist/i18n/locales/es.js.map +1 -1
  72. package/dist/i18n/locales/fr.js +41 -5
  73. package/dist/i18n/locales/fr.js.map +1 -1
  74. package/dist/i18n/locales/hu.js +41 -5
  75. package/dist/i18n/locales/hu.js.map +1 -1
  76. package/dist/i18n/locales/it.js +41 -5
  77. package/dist/i18n/locales/it.js.map +1 -1
  78. package/dist/i18n/locales/zh.js +41 -5
  79. package/dist/i18n/locales/zh.js.map +1 -1
  80. package/dist/i18n/review.js +3 -1
  81. package/dist/i18n/review.js.map +1 -1
  82. package/dist/index.d.ts +17 -4
  83. package/dist/index.js +38 -1
  84. package/dist/index.js.map +1 -1
  85. package/dist/lib/date-format.d.ts +81 -0
  86. package/dist/lib/date-format.js +56 -0
  87. package/dist/lib/date-format.js.map +1 -0
  88. package/dist/lib/format.d.ts +3 -0
  89. package/dist/lib/format.js +5 -4
  90. package/dist/lib/format.js.map +1 -1
  91. package/dist/notifications/device-zone-report.d.ts +34 -0
  92. package/dist/notifications/device-zone-report.js +31 -0
  93. package/dist/notifications/device-zone-report.js.map +1 -0
  94. package/dist/notifications/feedback-notification-types-labels.d.ts +7 -1
  95. package/dist/notifications/feedback-notification-types-labels.js +4 -1
  96. package/dist/notifications/feedback-notification-types-labels.js.map +1 -1
  97. package/dist/notifications/feedback-notification-types.d.ts +24 -5
  98. package/dist/notifications/feedback-notification-types.js +7 -2
  99. package/dist/notifications/feedback-notification-types.js.map +1 -1
  100. package/dist/notifications/notification-bell.d.ts +33 -0
  101. package/dist/notifications/notification-bell.js +74 -0
  102. package/dist/notifications/notification-bell.js.map +1 -0
  103. package/dist/notifications/notification-inbox.d.ts +86 -0
  104. package/dist/notifications/notification-inbox.js +206 -0
  105. package/dist/notifications/notification-inbox.js.map +1 -0
  106. package/dist/notifications/notification-types-setting.d.ts +6 -4
  107. package/dist/notifications/notification-types-setting.js +103 -45
  108. package/dist/notifications/notification-types-setting.js.map +1 -1
  109. package/dist/notifications/notification-types.d.ts +19 -7
  110. package/dist/notifications/notifications-labels.d.ts +44 -8
  111. package/dist/notifications/notifications-labels.js +18 -1
  112. package/dist/notifications/notifications-labels.js.map +1 -1
  113. package/dist/notifications/push-devices-setting.d.ts +20 -3
  114. package/dist/notifications/push-devices-setting.js +93 -33
  115. package/dist/notifications/push-devices-setting.js.map +1 -1
  116. package/dist/notifications/push-worker.d.ts +108 -0
  117. package/dist/notifications/push-worker.js +62 -0
  118. package/dist/notifications/push-worker.js.map +1 -0
  119. package/dist/notifications/quiet-hours-setting.d.ts +29 -17
  120. package/dist/notifications/quiet-hours-setting.js +9 -41
  121. package/dist/notifications/quiet-hours-setting.js.map +1 -1
  122. package/dist/notifications/time-zone-select.d.ts +8 -4
  123. package/dist/notifications/time-zone-select.js +2 -7
  124. package/dist/notifications/time-zone-select.js.map +1 -1
  125. package/dist/notifications/use-push-device.d.ts +4 -17
  126. package/dist/notifications/use-push-device.js +7 -15
  127. package/dist/notifications/use-push-device.js.map +1 -1
  128. package/dist/offline/local-first.d.ts +42 -0
  129. package/dist/offline/local-first.js +53 -0
  130. package/dist/offline/local-first.js.map +1 -0
  131. package/dist/offline/query-persistence.d.ts +26 -1
  132. package/dist/offline/query-persistence.js +27 -23
  133. package/dist/offline/query-persistence.js.map +1 -1
  134. package/dist/offline/service-worker-updates.d.ts +46 -0
  135. package/dist/offline/service-worker-updates.js +39 -0
  136. package/dist/offline/service-worker-updates.js.map +1 -0
  137. package/dist/offline.d.ts +5 -2
  138. package/dist/offline.js +12 -2
  139. package/dist/offline.js.map +1 -1
  140. package/dist/push-worker.d.ts +2 -0
  141. package/dist/push-worker.js +14 -0
  142. package/dist/push-worker.js.map +1 -0
  143. package/dist/shell/account-menu-text-size.d.ts +33 -0
  144. package/dist/shell/account-menu-text-size.js +51 -0
  145. package/dist/shell/account-menu-text-size.js.map +1 -0
  146. package/dist/shell/top-bar-actions.d.ts +6 -2
  147. package/dist/shell/top-bar-actions.js +1 -0
  148. package/dist/shell/top-bar-actions.js.map +1 -1
  149. package/dist/shell.d.ts +2 -0
  150. package/dist/shell.js +2 -0
  151. package/dist/shell.js.map +1 -1
  152. package/dist/sync/db.d.ts +93 -0
  153. package/dist/sync/db.js +33 -0
  154. package/dist/sync/db.js.map +1 -0
  155. package/dist/sync/engine.d.ts +126 -0
  156. package/dist/sync/engine.js +474 -0
  157. package/dist/sync/engine.js.map +1 -0
  158. package/dist/sync/hooks.d.ts +35 -0
  159. package/dist/sync/hooks.js +67 -0
  160. package/dist/sync/hooks.js.map +1 -0
  161. package/dist/sync/testing.d.ts +28 -0
  162. package/dist/sync/testing.js +41 -0
  163. package/dist/sync/testing.js.map +1 -0
  164. package/dist/sync/wire.d.ts +50 -0
  165. package/dist/sync/wire.js +2 -0
  166. package/dist/sync/wire.js.map +1 -0
  167. package/dist/sync.d.ts +7 -0
  168. package/dist/sync.js +25 -0
  169. package/dist/sync.js.map +1 -0
  170. package/dist/tour/tour-labels.js +1 -0
  171. package/dist/tour/tour-labels.js.map +1 -1
  172. package/dist/tour/tour.d.ts +30 -0
  173. package/dist/tour/tour.js +50 -6
  174. package/dist/tour/tour.js.map +1 -1
  175. package/package.json +19 -1
  176. package/src/admin/admin-area-labels.ts +13 -0
  177. package/src/admin/admin-overview.tsx +37 -2
  178. package/src/admin/mail-test-card.tsx +7 -3
  179. package/src/admin/user-roster.tsx +12 -3
  180. package/src/components/appearance-labels.ts +16 -0
  181. package/src/components/data-table-column-settings.tsx +2 -2
  182. package/src/components/data-table-head.tsx +2 -2
  183. package/src/components/data-table-row-actions.tsx +145 -5
  184. package/src/components/data-table-shared.tsx +21 -2
  185. package/src/components/data-table.tsx +68 -6
  186. package/src/components/date-format-setting.tsx +64 -0
  187. package/src/components/row-actions.tsx +33 -9
  188. package/src/components/swipeable-row.tsx +8 -0
  189. package/src/components/tabs.tsx +4 -3
  190. package/src/components/translation-review-editor.tsx +2 -0
  191. package/src/components/translation-review-labels.ts +7 -0
  192. package/src/components/translation-review.tsx +105 -15
  193. package/src/components/write-lock-labels.ts +1 -0
  194. package/src/components/write-lock.tsx +36 -3
  195. package/src/data-table.ts +4 -0
  196. package/src/feedback/feedback-row-detail.tsx +18 -23
  197. package/src/feedback/feedback-swipe.tsx +28 -1
  198. package/src/i18n/german.ts +44 -4
  199. package/src/i18n/kit-labels.tsx +18 -1
  200. package/src/i18n/locales/en.ts +1 -0
  201. package/src/i18n/locales/es.ts +44 -4
  202. package/src/i18n/locales/fr.ts +44 -4
  203. package/src/i18n/locales/hu.ts +44 -4
  204. package/src/i18n/locales/it.ts +44 -4
  205. package/src/i18n/locales/zh.ts +44 -2
  206. package/src/i18n/review.ts +3 -1
  207. package/src/index.ts +50 -1
  208. package/src/lib/date-format.ts +151 -0
  209. package/src/lib/format.ts +10 -4
  210. package/src/notifications/device-zone-report.ts +67 -0
  211. package/src/notifications/feedback-notification-types-labels.ts +10 -1
  212. package/src/notifications/feedback-notification-types.ts +30 -5
  213. package/src/notifications/notification-bell.tsx +116 -0
  214. package/src/notifications/notification-inbox.tsx +314 -0
  215. package/src/notifications/notification-types-setting.tsx +151 -55
  216. package/src/notifications/notification-types.ts +20 -8
  217. package/src/notifications/notifications-labels.ts +72 -12
  218. package/src/notifications/push-devices-setting.tsx +123 -34
  219. package/src/notifications/push-worker.ts +160 -0
  220. package/src/notifications/quiet-hours-setting.tsx +41 -58
  221. package/src/notifications/time-zone-select.tsx +9 -10
  222. package/src/notifications/use-push-device.ts +20 -33
  223. package/src/offline/local-first.ts +100 -0
  224. package/src/offline/query-persistence.ts +57 -24
  225. package/src/offline/service-worker-updates.ts +81 -0
  226. package/src/offline.ts +7 -1
  227. package/src/push-worker.ts +25 -0
  228. package/src/shell/account-menu-text-size.tsx +77 -0
  229. package/src/shell/top-bar-actions.tsx +6 -1
  230. package/src/shell.ts +3 -0
  231. package/src/sync/db.ts +125 -0
  232. package/src/sync/engine.ts +701 -0
  233. package/src/sync/hooks.ts +98 -0
  234. package/src/sync/testing.ts +73 -0
  235. package/src/sync/wire.ts +61 -0
  236. package/src/sync.ts +29 -0
  237. package/src/tour/tour-labels.ts +1 -0
  238. package/src/tour/tour.tsx +100 -7
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// @eifi1/ui-kit — shared design-system barrel.\n//\n// Domain-free UI + theme surface shared across apps (lead app: Keksdose). Consumers import\n// components/theme from \"@eifi1/ui-kit\" and the token stylesheet from \"@eifi1/ui-kit/tokens.css\".\n//\n// Grouped by folder. A subpath entry (chart, data-table, shell, feedback, wizard, tour,\n// search) is re-exported whole — `export * from \"./chart\"` — instead of its list typed out a\n// second time here: the two copies had drifted (refactor audit 2026-10, MOD-5). A name that\n// arrives twice that way is the same binding from the same module, which ESM does not count\n// as a clash.\n\n// ── lib ────────────────────────────────────────────────────────────────────\nexport * from \"./lib/calc\";\nexport { cn } from \"./lib/cn\";\nexport { logger, setStoreLog } from \"./lib/logger\";\n// Intl number / money / percent / date / relative-time formatting, and `useKitFormat()`\n// for the same bound to the provider's locale (kastlan's formatters.ts, English \"5m ago\").\nexport * from \"./lib/format\";\n// localStorage that never throws (Safari private mode, blocked site data).\nexport { readStored, writeStored } from \"./lib/safe-storage\";\n// Save a fetched Blob as a download, and read the name a Content-Disposition asks for\n// (`filename*` first) — 0.34, KS U5; the kit's own three downloads use them.\nexport { saveBlob, filenameFromDisposition } from \"./lib/download\";\n// Date helpers are also available via the \"@eifi1/ui-kit/dates\" subpath.\n// One fold and one ranking for every list's search box (DUP-5), for an app's own lists.\nexport { foldForSearch, rankMatch } from \"./lib/text-match\";\nexport type { MatchRank } from \"./lib/text-match\";\n// 0.12.0: the QR encoder QrCode draws with — no dependency, see lib/qr-encode.ts.\nexport { encodeQr } from \"./lib/qr-encode\";\nexport type { QrEncodeOptions, QrErrorCorrection, QrMatrix } from \"./lib/qr-encode\";\n// 0.18: the cold-start notice keksdose built (#199), for every app: the framework-free\n// watchdog over the app's requests (the corner notice is components/server-wake).\nexport { createServerWake, serverWake, watchReadsAnd, attachServerWake, wrapFetch } from \"./lib/server-wake\";\nexport type { ServerWakeStage, ServerWakeFilter, ServerWakeOptions, ServerWakeRequest, ServerWakeWatcher, ServerWakeAxiosConfig, AxiosLikeInstance } from \"./lib/server-wake\";\n// 0.34 (docs/auth-harmonization.md §11, round 0.34 C7): renewing a session — one refresh\n// per tab, a definitive failure ends the session once, a transient one keeps it.\nexport { createSessionRefresh, attachSessionRefresh, isTransientRefreshFailure, isSignedOutStep } from \"./lib/session-refresh\";\nexport type { SessionRefresh, SessionRefreshOptions, SessionRenewal, SessionRefreshOutcome } from \"./lib/session-refresh\";\n// 0.29.0 (docs/auth-harmonization.md): the person-name order of each language.\nexport { formatPersonName, personInitials } from \"./lib/person-name\";\nexport type { PersonName } from \"./lib/person-name\";\n// Translation review (0.19): one contract for kastlan's and keksdose's review pages — the\n// pure rows/status/placeholder logic here, the presentational page parts under components.\nexport {\n REVIEW_STATUSES,\n fromApiReview,\n toApiWrite,\n flattenStrings,\n keyNamespace,\n placeholderTokens,\n placeholderMismatch,\n reviewStatus,\n keyInArea,\n keyInAreas,\n // 0.28: the area a key is grouped under — `kit.legal.*` in `legal` (legal round §7.5).\n reviewAreaOf,\n translationRows,\n summariseRows,\n DEFAULT_TRANSLATION_REVIEW_FILTER,\n filterTranslationRows,\n reviewWrite,\n mergeReviews,\n dropReviews,\n translationCorrections,\n // 0.25: grouping and the approvals' Undo (keksdose live #377).\n groupTranslationRows,\n unreviewedRows,\n reviewUndo,\n // 0.26: swipe bindings for an app's Settings → Interaction (keksdose #377 rework).\n TRANSLATION_REVIEW_SWIPE_ACTIONS,\n DEFAULT_TRANSLATION_REVIEW_SWIPE,\n translationReviewSwipePlan,\n} from \"./lib/translation-review\";\nexport type {\n TranslationVerdict,\n TranslationReview,\n TranslationReviewWrite,\n TranslationReviewKey,\n ReviewStatus,\n TranslationRow,\n ApiTranslationReview,\n ApiTranslationReviewsResponse,\n ApiTranslationReviewWrite,\n TranslationRowsInput,\n TranslationSummary,\n TranslationReviewFilter,\n TranslationCorrection,\n TranslationRowGroup,\n TranslationReviewUndo,\n TranslationReviewSwipeAction,\n TranslationReviewSwipeBinding,\n} from \"./lib/translation-review\";\n// 0.22.0, the inputs round: the country list and the IBAN, ISIN and phone helpers that\n// CountrySelect, IbanInput and PhoneInput are built on.\nexport { COUNTRY_CODES, countryName } from \"./lib/countries\";\nexport {\n IBAN_LENGTHS,\n compactIban,\n formatIban,\n ibanCheckDigits,\n ibanProblem,\n isValidIban,\n isQrIban,\n} from \"./lib/iban\";\nexport type { IbanKind, IbanProblem } from \"./lib/iban\";\nexport { formatIsin, isinCheckDigit, isValidIsin } from \"./lib/isin\";\nexport {\n PHONE_DIAL_CODES,\n PHONE_COUNTRIES,\n parsePhone,\n formatNationalPhone,\n formatPhone,\n isE164,\n} from \"./lib/phone\";\nexport type { PhoneCountryCode, PhoneCountry, ParsedPhone } from \"./lib/phone\";\n// 0.23.0: ColumnMapper's pure half (Kurvenschmiede's columns input, keksdose's import map).\nexport {\n assignColumnRole,\n guessMapping,\n missingRoles,\n readMappedTable,\n readTextFile,\n roleOfColumn,\n} from \"./lib/column-mapping\";\nexport type { ColumnMapperResult, ColumnMapping, ColumnRole } from \"./lib/column-mapping\";\n\n// ── hooks ────────────────────────────────────────────────────────────────────\nexport { useMediaQuery } from \"./hooks/use-media-query\";\nexport { useBodyScrollLock } from \"./hooks/use-body-scroll-lock\";\nexport { useAnchoredRect } from \"./hooks/use-anchored-rect\";\nexport type { AnchorRect } from \"./hooks/use-anchored-rect\";\nexport {\n useAnchoredPanel,\n anchoredPanelPlacement,\n useVisualViewport,\n readKeyboardInset,\n} from \"./hooks/use-anchored-panel\";\nexport type {\n AnchoredPanel,\n AnchoredPanelOptions,\n ViewportBox,\n KeyboardInsetOptions,\n} from \"./hooks/use-anchored-panel\";\nexport { useEscapeKey, useOutsideClick } from \"./hooks/use-dismiss\";\n// Focus containment for an overlay, and a live region for a change that moves no focus.\n// Both were extracted from the two components that already did them correctly (Modal and\n// CommandPalette) so the rest of the kit stops being the exception.\nexport { useFocusTrap } from \"./hooks/use-focus-trap\";\nexport type { FocusTrapOptions } from \"./hooks/use-focus-trap\";\nexport { useAnnounce } from \"./hooks/use-announce\";\nexport type { UseAnnounceReturn, UseAnnounceOptions, AnnounceRegionProps } from \"./hooks/use-announce\";\nexport { useOverlayHistory } from \"./hooks/use-overlay-history\";\nexport { useCloseTransition, OVERLAY_EXIT_MS } from \"./hooks/use-close-transition\";\nexport { useRowSwipe } from \"./hooks/use-row-swipe\";\n// 0.28: keksdose's noindex marker, for the legal and auth pages of every app.\nexport { useNoIndex } from \"./hooks/use-noindex\";\nexport type { SwipeStage, RowSwipeOptions, RowSwipeReturn } from \"./hooks/use-row-swipe\";\n// Any element as a file drop target, screened like FileButton (kastlan).\nexport { useFileDrop, dragHasFiles } from \"./hooks/use-file-drop\";\nexport type { UseFileDropOptions, UseFileDropReturn, FileDropProps } from \"./hooks/use-file-drop\";\n// kastlan's search boxes each carried a hand-rolled copy, two without the cleanup.\nexport { useDebounce, useDebouncedCallback } from \"./hooks/use-debounce\";\nexport type { DebouncedCallbackOptions, DebouncedFunction } from \"./hooks/use-debounce\";\n// One search param as state, the active tab in `?tab=`, and a dialog's open state in the\n// URL (Modal's `urlParam`) — kastlan's and keksdose's use-search-param-state, in the kit.\nexport { useSearchParamState, useTabParam, useDialogParam } from \"./hooks/use-search-param-state\";\nexport type { SearchParamStateOptions, DialogParam } from \"./hooks/use-search-param-state\";\n// 0.25: several keys, one navigation (keksdose live #378 — four setters in a row clobbered).\nexport { useSearchParamsState } from \"./hooks/use-search-param-state\";\nexport type { SearchParamField, SearchParamFields, SearchParamsUpdate } from \"./hooks/use-search-param-state\";\n// Copy that reports whether it worked — keksdose's copy buttons said \"Copied\" when it had not.\nexport { useCopyToClipboard, copyToClipboard } from \"./hooks/use-copy-to-clipboard\";\nexport type { CopyState, UseCopyToClipboardOptions, UseCopyToClipboardReturn } from \"./hooks/use-copy-to-clipboard\";\n// Keyboard shortcuts (\"Mod+K\", \"Ctrl+Shift+F\") that leave typing in fields alone.\nexport { useHotkey, parseHotkey, matchesHotkey } from \"./hooks/use-hotkey\";\nexport type { Hotkey, ParsedHotkey, UseHotkeyOptions } from \"./hooks/use-hotkey\";\n// A protected file as an object URL, fetched with the app's own auth (kastlan's AuthedImage).\nexport { useAuthedSrc } from \"./hooks/use-authed-src\";\nexport type { AuthedFetcher, AuthedSrcStatus, UseAuthedSrcOptions, UseAuthedSrcResult } from \"./hooks/use-authed-src\";\n// Row windowing for a long list (0.7.0, lenkbank's measured grid is built on it).\nexport { useWindowedRows, WINDOWED_ROW_INDEX } from \"./hooks/use-windowed-rows\";\nexport type { WindowedRows } from \"./hooks/use-windowed-rows\";\n// 0.32.0 (docs/text-size-harmonization.md): the breakpoints, and the hooks components read\n// the behaviours at Large from (§4, §10.7–10.9).\nexport { useBreakpoint, usePhoneLayout, breakpointQuery, BREAKPOINT_REM, remPx, useRemPx } from \"./hooks/use-breakpoint\";\nexport type { Breakpoint, BreakpointVariant, RemLength } from \"./hooks/use-breakpoint\";\nexport { useLargeText, useCoarsePointer, useInlineFacts } from \"./hooks/use-large-text\";\n\n// ── theme / palettes ─────────────────────────────────────────────────────────\n// The chart palette (theme/chart-palette) comes with the chart kit, `./chart` below.\n// Colour maths (sRGB ↔ OKLCH, WCAG contrast, CVD simulation) and the palette deriver\n// that builds a whole, contrast-solved palette from one brand colour plus any colours\n// pinned by hand. `auditPalette` / `auditChartRamp` measure a palette rather than\n// trusting a comment about it.\nexport * from \"./theme/color\";\nexport * from \"./theme/palette-derive\";\nexport * from \"./theme/palette-presets\";\nexport * from \"./theme/theme-store\";\nexport * from \"./theme/palette-store\";\n// 0.32.0: text size and contrast (docs/text-size-harmonization.md).\nexport * from \"./theme/text-size\";\nexport * from \"./theme/contrast\";\n\n// ── i18n: one label tree, one optional provider ──────────────────────────────\n// `UiKitLabels` names every string the kit renders; `<UiKitProvider labels locale>`\n// hands a translation to every component below it. Precedence: a component's own\n// prop > the provider > the English default. See src/i18n/kit-labels.tsx.\nexport * from \"./i18n/kit-labels\";\nexport * from \"./i18n/defaults\";\n// The kit's words as `key → text` rows for an app's translation review (keksdose).\nexport { kitLabelStrings } from \"./i18n/review\";\nexport type { KitLabelStringsOptions } from \"./i18n/review\";\n// The seven languages, how an app resolves one, and the kit catalogue loader for it.\nexport * from \"./i18n/languages\";\n// CLDR plural categories for an app's i18next catalogue, filled from `_other`; and the\n// forms of an app's word a kit part picks from by count (0.33.1, `PlanColumnUsage.label`).\nexport { withAllPlurals } from \"./i18n/plurals\";\nexport type { PluralForms } from \"./i18n/plurals\";\n\n// ── components ───────────────────────────────────────────────────────────────\n// The kit's core controls, one module each since 0.34 (MOD-2, refactor audit 2026-10):\n// Button, IconButton, the field base, Input, Select, Textarea, Card, Spinner, EmptyState\n// and Tabs. Named, not `*`, for `button-look` and `field-base`: they also hold parts the\n// controls share, which are internal. The others are public whole.\nexport * from \"./components/button\";\nexport {\n buttonClasses,\n TOUCH_TARGET_LARGE,\n type ButtonClassesOptions,\n type ButtonSize,\n type ButtonTone,\n type ButtonVariant,\n} from \"./components/button-look\";\nexport * from \"./components/icon-button\";\nexport {\n FIELD_TOUCH_TEXT,\n FIELD_BASE,\n FIELD_WRITABLE_LOOK,\n FIELD_FLOATING_PAD,\n FIELD_INVALID,\n FLOATING_INPUT_CLASS,\n FIELD_DISPLAY,\n FIELD_TRIGGER,\n FieldChevron,\n FLOATING_LABEL_CLASS,\n FloatingField,\n Label,\n DEFAULT_PASSWORD_REVEAL_LABELS,\n DEFAULT_CHARACTER_COUNT_LABELS,\n type FieldChevronProps,\n type FloatingFieldProps,\n type LabelProps,\n type PasswordRevealLabels,\n type CharacterCountLabels,\n} from \"./components/field-base\";\nexport * from \"./components/input\";\nexport * from \"./components/select\";\nexport * from \"./components/textarea\";\nexport * from \"./components/card\";\nexport * from \"./components/spinner\";\nexport * from \"./components/empty-state\";\nexport * from \"./components/tabs\";\n// The static label lives in field-parts since 0.23 (it is what the field anatomy there\n// draws, and field-parts must not import the controls).\nexport { FieldLabel, FLOATING_LABEL_STATIC, FieldHint } from \"./components/field-parts\";\nexport type { FieldLabelProps, FieldHintProps } from \"./components/field-parts\";\n// The kit's focus frame (§5), in its own module so the parts the controls import\n// (field-parts, the choice controls) can draw it too.\nexport { FOCUS_RING, FOCUS_RING_WIDTH } from \"./components/focus-ring\";\n// No fact only in a tooltip (§4): the reason line and the compact region live in\n// field-parts, where the self-saving controls (Switch, Checkbox) reach them too.\nexport {\n CompactControls,\n DisabledReasonLine,\n DISABLED_REASON_LINE_CLASS,\n useDisabledReasonLine,\n} from \"./components/field-parts\";\nexport type { DisabledReasonDisplay } from \"./components/field-parts\";\n// The label-ABOVE field group (label, hint, error, required), inside wizards or out.\nexport * from \"./components/field\";\nexport * from \"./components/search-field\";\nexport * from \"./components/dropdown\";\nexport * from \"./components/popover\";\n// 0.34 (keksdose K3): paragraph-long help behind a \"?\", opened on a tap — FieldHint's\n// sibling for help rather than a fact (docs/text-size-harmonization.md §10.23).\nexport { HelpPopover } from \"./components/help-popover\";\nexport type { HelpPopoverProps } from \"./components/help-popover\";\nexport { SwipeableRow } from \"./components/swipeable-row\";\nexport type { SwipeAction, SwipePaint, SwipeTone, SwipeableRowProps } from \"./components/swipeable-row\";\nexport * from \"./components/calculator\";\nexport * from \"./components/numpad-sheet\";\nexport * from \"./components/number-input\";\nexport * from \"./components/currency-select\";\n// 0.35: each currency's flag-icons country. `CURRENCIES` and it are also the pure-data\n// entry \"@eifi1/ui-kit/currencies\", which imports nothing, for an app's build in Node.\nexport { CURRENCY_COUNTRIES } from \"./currencies\";\nexport * from \"./components/amount-input\";\nexport * from \"./components/money-field\";\nexport * from \"./components/combobox\";\nexport * from \"./components/picker-sheet\";\nexport * from \"./components/entity-combobox\";\nexport * from \"./components/multi-entity-combobox\";\nexport * from \"./components/multi-select\";\nexport * from \"./components/tooltip\";\nexport * from \"./components/user-avatar\";\nexport * from \"./components/settings-fields\";\n// Sync state for a database-backed field: the engine (`useFieldSync`) and the\n// affordance (`FieldSyncIndicator`), kept separate because the state is useful\n// without the dot — a form can gate its submit on any field being `pending`.\nexport * from \"./components/field-sync\";\nexport * from \"./components/month-picker\";\nexport * from \"./components/checkbox\";\nexport * from \"./components/switch\";\nexport * from \"./components/slider\";\nexport * from \"./components/time-input\";\nexport * from \"./components/number-field\";\nexport * from \"./components/sparkline\";\nexport * from \"./components/stat-tile\";\nexport * from \"./components/signature-pad\";\nexport * from \"./components/password-strength\";\nexport * from \"./components/page-contents\";\nexport * from \"./components/disclosure\";\nexport * from \"./components/dialog-frame\";\n// Named, not `*`: danger-confirm also holds the password field and pending hook that\n// ReauthDialog shares with it, which are kit-internal.\nexport {\n DangerConfirm,\n DEFAULT_DANGER_CONFIRM_LABELS,\n typedMatches,\n // 0.22.0: the typed-confirmation field on its own (keksdose K7) and the current-password\n // field kastlan wants for sign-in and re-authentication (kastlan 1).\n TypedConfirmField,\n CurrentPasswordInput,\n} from \"./components/danger-confirm\";\nexport type {\n DangerConfirmLabels,\n DangerConfirmProps,\n TypedMatch,\n DangerConsequence,\n TypedConfirmFieldProps,\n TypedConfirmFieldLabels,\n CurrentPasswordInputProps,\n CurrentPasswordInputLabels,\n // 0.23.0: onConfirm's second argument — the guards' values (keksdose G4b).\n DangerConfirmValues,\n} from \"./components/danger-confirm\";\n// 0.18: re-authentication before a sensitive action (Kurvenschmiede 4).\nexport { ReauthDialog, DEFAULT_REAUTH_DIALOG_LABELS } from \"./components/reauth-dialog\";\nexport type { ReauthDialogProps, ReauthDialogLabels } from \"./components/reauth-dialog\";\n// `useConfirm()` — the promise-based replacement for `window.confirm`, one host per app.\nexport * from \"./components/confirm-dialog\";\n// A non-modal corner panel and its round trigger (keksdose's assistant launcher).\nexport * from \"./components/floating-panel\";\n// The count / clear / actions bar a selection brings up (keksdose's three copies).\nexport * from \"./components/bulk-action-bar\";\nexport * from \"./components/swatch-picker\";\nexport * from \"./components/icon-picker\";\nexport * from \"./components/choice-card\";\nexport * from \"./components/autocomplete\";\nexport * from \"./components/measured-grid\";\n// Named, not `export *`: file-button.tsx also re-exports the screening helpers the\n// dropzone shares (hooks/use-file-picker since 0.34, MOD-8), which are internal.\nexport { FileButton, useFilePicker, matchesAccept, DEFAULT_FILE_PICKER_LABELS } from \"./components/file-button\";\nexport type {\n FileButtonProps,\n UseFilePickerOptions,\n UseFilePickerReturn,\n FilePickerLabels,\n FileRejection,\n FileRejectionReason,\n FileScreenOptions,\n} from \"./components/file-button\";\n// The chart kit, whole, from its subpath (`@eifi1/ui-kit/chart`, which names its parts):\n// the chart shell and its palette, the treemap, the series chart with its zoom, legend,\n// labels and facing-pair axes, the height every chart takes, and the pie chart.\nexport * from \"./chart\";\n// 0.12.0: the QR code TwoFactorSetting draws its otpauth URI with (encoder in\n// lib/qr-encode.ts — no dependency, see there).\nexport * from \"./components/qr-code\";\nexport * from \"./components/alert-banner\";\nexport * from \"./components/toggle-group\";\n// A wrapping set of links/buttons marked `aria-current` — Tabs-like looks, not tabs.\nexport * from \"./components/nav-pills\";\n// A pill carrying one VALUE — inert, a link, or a toggle, depending on which prop it is\n// given — and the list field built from it. Distinct from Button on purpose: a row of\n// buttons reads as \"choose an action\", a row of chips as \"here are the things\".\nexport * from \"./components/chip\";\n// ChipInput's own module since MOD-9: it renders Chip, so chip.tsx re-exports only its types.\nexport * from \"./components/chip-input\";\nexport * from \"./components/wizard-stepper\";\nexport * from \"./components/hover-menu\";\nexport * from \"./components/modal\";\nexport * from \"./components/full-bleed-dialog\";\nexport * from \"./components/grouped-picker\";\nexport * from \"./components/file-dropzone\";\nexport * from \"./components/mini-calendar\";\nexport * from \"./components/calendar-heatmap\";\nexport * from \"./components/date-picker\";\nexport * from \"./components/tree-view\";\n// 0.8.0 layout and feedback primitives the apps hand-rolled or took from shadcn/Radix.\nexport * from \"./components/description-list\";\n// The Save / Cancel row forms and dialogs end in, and the editable line-item repeater\n// (journal lines, lease components, invoice positions). 0.12.0.\nexport * from \"./components/form-actions\";\n// 0.18: lock every opted-in commit under one provider, the reason in its tooltip\n// (Kurvenschmiede 2). `useCommitReason` stays internal.\n// 0.33: a lock says its source, and a control can be exempt from one\n// (docs/billing-harmonization.md §12.36): the kinds, the holds, `CommitScope`,\n// `COMMIT_EXCEPT_BILLING` and the pure `writeLockFor`.\nexport { WriteLockProvider, useWriteLock, writeLockFor, COMMIT_EXCEPT_BILLING, DEFAULT_WRITE_LOCK_LABELS } from \"./components/write-lock\";\nexport type { WriteLock, WriteLockLabels, WriteLockProviderProps, WriteLockKind, WriteLockHold, CommitScope } from \"./components/write-lock\";\n// 0.18: the parts both apps' admin rosters repeat (Kurvenschmiede 6).\nexport { RoleChip, AccountStateChip, DateMark, dateColumn, DEFAULT_ACCOUNT_STATE_LABELS, ACCOUNT_STATE_TONES } from \"./components/account-chips\";\nexport type { RoleChipProps, RoleDefinition, RoleVocabulary, AccountState, AccountStateLabels, AccountStateChipProps, DateMarkProps, DateColumnOptions } from \"./components/account-chips\";\n// 0.42 (docs/admin-harmonization.md §2.1): the role in the account menu's header, a link\n// to the role's tool (`RoleDefinition.href`).\nexport { AccountRoleChip } from \"./components/account-chips\";\nexport type { AccountRoleChipProps } from \"./components/account-chips\";\n// 0.18: the cold-start notice keksdose built (#199), for every app: the corner notice\n// that explains the wait (its framework-free watchdog is lib/server-wake).\nexport { ServerWakeNotice, useServerWakeStage, DEFAULT_SERVER_WAKE_LABELS } from \"./components/server-wake\";\nexport type { ServerWakeLabels, ServerWakeNoticeProps } from \"./components/server-wake\";\n// 0.18: sharing — grantees, roles, pending grants, candidates (Kurvenschmiede 1).\nexport { ShareCard, ShareDialog, SharePanel, DEFAULT_SHARE_CARD_LABELS } from \"./components/share-card\";\nexport type { ShareCardProps, ShareDialogProps, SharePanelProps, ShareCardLabels, ShareRole, ShareGrantee, SharePendingGrant, ShareCandidate, ShareAddRequest } from \"./components/share-card\";\nexport * from \"./components/line-items\";\nexport * from \"./components/progress-bar\";\n// Named: skeleton.tsx also holds SKELETON_CLASS, the look StatTile shares — internal.\nexport { Skeleton } from \"./components/skeleton\";\nexport type { SkeletonProps, SkeletonShape } from \"./components/skeleton\";\n// 0.12.0: a centred spinner with words, signed figures and deltas, a render-error fallback.\nexport * from \"./components/loading-state\";\nexport * from \"./components/signed-amount\";\nexport * from \"./components/error-boundary\";\nexport * from \"./components/copy-button\";\nexport { AuthedImage, DEFAULT_AUTHED_IMAGE_LABELS } from \"./components/authed-image\";\nexport type { AuthedImageProps, AuthedImageLabels } from \"./components/authed-image\";\nexport * from \"./components/image-grid\";\nexport * from \"./components/lightbox\";\nexport * from \"./components/button-group\";\nexport * from \"./components/table\";\nexport * from \"./components/separator\";\n// Named: scroll-area.tsx also holds the overflow hook and scrollbar class Table shares.\nexport { ScrollArea } from \"./components/scroll-area\";\nexport type { ScrollAreaProps } from \"./components/scroll-area\";\n// 0.10.0 rows, menu rows, text primitives and page chrome the apps drew by hand.\nexport * from \"./components/list\";\nexport * from \"./components/menu-item\";\nexport * from \"./components/text\";\nexport * from \"./components/status-dot\";\nexport * from \"./components/page-header\";\nexport * from \"./components/breadcrumbs\";\n// The one inline link (kastlan's EntityLink / CellLink / legal and source links), through\n// `<UiKitProvider linkComponent>`. Named: the file also holds the kit's internal link picker.\nexport { TextLink } from \"./components/text-link\";\nexport type {\n TextLinkProps,\n TextLinkRenderProps,\n TextLinkTone,\n TextLinkUnderline,\n TextLinkCurrent,\n} from \"./components/text-link\";\n// The toast layer over sonner (an OPTIONAL peer, loaded lazily): `toast` mirrors sonner's\n// API so apps migrate by swapping the import; `<Toaster>` carries the placement, theme,\n// tones and z-index both apps had wired by hand.\nexport {\n toast,\n Toaster,\n DEFAULT_TOAST_LABELS,\n TOAST_ACTION_DURATION,\n TOASTER_OFFSET_TOP,\n TOASTER_OFFSET_BOTTOM,\n} from \"./components/toast\";\nexport type {\n ToastId,\n ToastAction,\n ToastOptions,\n ToastPromiseOptions,\n ToastUndoOptions,\n ToastRedoOptions,\n ToastLabels,\n ToastPosition,\n ToastSwipeDirection,\n ToasterOffset,\n ToasterProps,\n} from \"./components/toast\";\n// Translation review (0.19): the presentational page parts (the pure logic is\n// lib/translation-review).\nexport {\n TranslationReviewPanel,\n TranslationReviewEditor,\n ReviewStatusChip,\n TranslationProgress,\n TranslationLocaleTabs,\n TranslationExportButton,\n REVIEW_STATUS_TONES,\n DEFAULT_TRANSLATION_REVIEW_LABELS,\n} from \"./components/translation-review\";\nexport type {\n TranslationReviewPanelProps,\n TranslationReviewEditorProps,\n ReviewStatusChipProps,\n TranslationProgressProps,\n TranslationLocaleTab,\n TranslationLocaleTabsProps,\n TranslationExportButtonProps,\n TranslationReviewLabels,\n TranslationReviewSaveInfo,\n TranslationReviewOrigin,\n TranslationReviewGroupBy,\n} from \"./components/translation-review\";\n// The legal pages' shell (0.19, H10): Imprint, Privacy Policy, Terms in every app.\n// 0.28 (docs/legal-harmonization.md): the shared wording, the page frame, the kit's\n// sections, the public footer and the terms checkbox.\nexport {\n LegalLayout,\n LegalSection,\n LegalLinks,\n LegalFooter,\n DEFAULT_LEGAL_LABELS,\n LEGAL_HREFS,\n legalOperatorText,\n useLegalLabels,\n} from \"./components/legal\";\nexport type {\n LegalLabels,\n LegalLink,\n LegalLinksProps,\n LegalSectionProps,\n LegalLayoutProps,\n LegalFooterProps,\n LegalOperator,\n LegalOperatorText,\n LegalPageKey,\n LegalTextSectionLabels,\n LegalOperatorSectionLabels,\n LegalFramedSectionLabels,\n LegalDisclaimerSectionLabels,\n} from \"./components/legal\";\nexport { LegalPage, LegalKitSection, LegalAcceptCheckbox, LEGAL_SKELETON } from \"./components/legal-page\";\nexport type {\n LegalPageProps,\n LegalKitSectionProps,\n LegalKitSectionKey,\n LegalAcceptCheckboxProps,\n LegalSkeletonEntry,\n LegalSkeletonPage,\n LegalSectionOwner,\n LegalDisclaimerVariant,\n} from \"./components/legal-page\";\n// 0.32.0 (docs/text-size-harmonization.md): the appearance settings' words, and a row's\n// actions, one of the behaviours at Large (§4, §10.7–10.9).\nexport { DEFAULT_APPEARANCE_LABELS, useAppearanceLabels } from \"./components/appearance-labels\";\nexport type { AppearanceLabels } from \"./components/appearance-labels\";\nexport { RowActions, rowActionsColumn, DEFAULT_ROW_ACTIONS_LABELS } from \"./components/row-actions\";\nexport type {\n RowAction,\n RowActionList,\n RowActionsLabels,\n RowActionsProps,\n RowActionsCollapse,\n RowActionsSize,\n RowActionsColumnOptions,\n RowActionTone,\n} from \"./components/row-actions\";\n// 0.22.0: the inputs round (kastlan's, keksdose's and Kurvenschmiede's audits).\nexport * from \"./components/checkbox-group\";\nexport * from \"./components/one-time-code-input\";\nexport * from \"./components/language-select\";\nexport * from \"./components/tile-radio\";\nexport * from \"./components/inline-edit-field\";\nexport * from \"./components/sign-chip\";\nexport * from \"./components/country-select\";\nexport * from \"./components/iban-input\";\nexport * from \"./components/phone-input\";\n// 0.23.0, the apps' 0.22 adoption round: the label strip over custom content (keksdose G8).\nexport * from \"./components/field-strip\";\n// Paste or drop a table, give each column a role (Kurvenschmiede's columns input,\n// keksdose's import map step). The lexer itself stays in `@eifi1/ui-kit/table-text`.\nexport * from \"./components/column-mapper\";\n\n// ── data-table suite ─────────────────────────────────────────────────────────\n// Whole, from its subpath (`@eifi1/ui-kit/data-table`, which names its parts): DataTable,\n// its sort, filters, pagination and cells, and a server table's state held by its owner,\n// URL-synced.\nexport * from \"./data-table\";\n\n// ── shell (composable app chrome) ────────────────────────────────────────────\n// Whole, from `@eifi1/ui-kit/shell`: the top bar and its controls, AppShell, the switchers\n// and AuthLayout, and (0.31.0) the router-aware parts of settings and landing —\n// SettingsLayout with its route, focus, section, context, heading and catalogue;\n// PublicHeader, RootEntry, RedirectIfAuthed and the last-visited page.\nexport * from \"./shell\";\n// 0.29.0 (docs/auth-harmonization.md): kastlan's company switcher.\nexport { CompanySwitcher, DEFAULT_COMPANY_SWITCHER_LABELS } from \"./shell/company-switcher\";\nexport type { CompanySwitcherProps, CompanySwitcherLabels, CompanySwitcherCompany } from \"./shell/company-switcher\";\n\n// ── feedback ─────────────────────────────────────────────────────────────────\n// The form somebody files a report with, and the parts an inbox is built from:\n// the status vocabulary both apps share value for value, the policy about what a\n// row may move to from where it stands, and the look of a status control, a\n// category badge and an opened report. The app still wires its own API, columns\n// and strings — see the note at the top of `feedback-inbox.tsx` for what is\n// deliberately left to it. Whole, from `@eifi1/ui-kit/feedback`, which also has 0.27.0's\n// harmonization (docs/feedback-harmonization.md): the record, menu, table, detail and\n// crash reporter.\nexport * from \"./feedback\";\n\n// ── multi-step wizard ────────────────────────────────────────────────────────\n// The engine (step machine, validators, collected data), the chrome around it\n// (indicator + nav bar + cancel confirm) and the review step it ends on.\n// `components/wizard-stepper` next door is a different, much smaller thing: a bare\n// step indicator for a two-step import flow, with no engine.\n//\n// `wizard-field` was removed here rather than kept as stock: it held a\n// `WizardField`/`WizardSelectField` pair that had never been rendered in any app — a\n// field group nothing was built from, which this comment used to advertise. A design\n// system may carry stock; untested stock nothing has ever rendered is not stock, it is\n// a liability with an export. The react-hook-form bridge to the Next gate\n// (`useRhfWizardStep`) is NOT here either: it left the barrel in 0.4.x so the barrel\n// imports no react-hook-form, and came back in 0.11 under `@eifi1/ui-kit/rhf`\n// (src/rhf.ts), where the optional peer is that subpath's alone.\n// Whole, from `@eifi1/ui-kit/wizard`.\nexport * from \"./wizard\";\n\n// ── guided tours ─────────────────────────────────────────────────────────────\nexport * from \"./tour\";\n\n// ── command palette / global search ──────────────────────────────────────────\n// The palette, its pure matcher and the ⌘K search on it. The list fold every search box\n// shares is lib/text-match, above.\nexport * from \"./search\";\n\n// ── auth ─────────────────────────────────────────────────────────────────────\n// 0.29.0 (docs/auth-harmonization.md): sign-in, sign-up and the signed-out pages — forms\n// that take callbacks and never send a request themselves. The person-name order of each\n// language is lib/person-name, kastlan's company switcher is in the shell section.\nexport { SignInForm, DEFAULT_SIGN_IN_LABELS } from \"./auth/sign-in-form\";\nexport type {\n SignInFormProps,\n SignInLabels,\n SignInAnswer,\n SignInStep,\n SignInAction,\n SignInCredentials,\n SignInCodeValues,\n SignInNewPasswordValues,\n} from \"./auth/sign-in-form\";\nexport { RegisterForm, DEFAULT_REGISTER_LABELS } from \"./auth/register-form\";\nexport type { RegisterFormProps, RegisterLabels, RegisterValues } from \"./auth/register-form\";\nexport { CompleteNameDialog, DEFAULT_COMPLETE_NAME_LABELS } from \"./auth/complete-name-dialog\";\nexport type { CompleteNameDialogProps, CompleteNameLabels, CompleteNameValues } from \"./auth/complete-name-dialog\";\nexport { taggedEmail } from \"./auth/email-tag\";\nexport { isAuthError, authErrorCode, isBillingError } from \"./auth/auth-errors\";\nexport type { AuthErrorCode } from \"./auth/auth-errors\";\nexport { ForgotPasswordForm, DEFAULT_FORGOT_PASSWORD_LABELS } from \"./auth/forgot-password-form\";\nexport type { ForgotPasswordFormProps, ForgotPasswordLabels } from \"./auth/forgot-password-form\";\nexport { ResetPasswordForm, DEFAULT_RESET_PASSWORD_LABELS } from \"./auth/reset-password-form\";\nexport type {\n ResetPasswordFormProps,\n ResetPasswordLabels,\n ResetPasswordCheck,\n ResetPasswordValues,\n ResetPasswordResult,\n} from \"./auth/reset-password-form\";\nexport { VerifyEmailStatus, EmailVerificationBanner, DEFAULT_VERIFY_EMAIL_LABELS } from \"./auth/verify-email\";\nexport type {\n VerifyEmailStatusProps,\n EmailVerificationBannerProps,\n VerifyEmailLabels,\n VerifyEmailFailure,\n} from \"./auth/verify-email\";\nexport { NotFoundPage, DEFAULT_NOT_FOUND_LABELS } from \"./auth/not-found-page\";\nexport type { NotFoundPageProps, NotFoundLabels } from \"./auth/not-found-page\";\nexport { AcceptInvitation, DEFAULT_ACCEPT_INVITATION_LABELS } from \"./auth/accept-invitation\";\nexport type {\n AcceptInvitationProps,\n AcceptInvitationLabels,\n AcceptInvitationResult,\n AcceptInvitationFailure,\n} from \"./auth/accept-invitation\";\nexport type { AuthHeadingLevel } from \"./auth/status-parts\";\n// 0.30.0: a rate limit and its wait, and the codes the account, billing and demo calls\n// answer with.\nexport { isRateLimited, retryAfterSeconds } from \"./auth/auth-errors\";\nexport type { AccountErrorCode, BillingErrorCode, DemoErrorCode, KitErrorCode } from \"./auth/auth-errors\";\n\n// ── account ──────────────────────────────────────────────────────────────────\n// In account/ since 0.34, beside the other account cards (MOD-8, refactor audit 2026-10):\n// the profile, password and two-factor cards, and (0.12.0) the fourth account section,\n// the passkeys.\nexport * from \"./account/account-settings\";\nexport * from \"./account/passkeys-setting\";\n// 0.30.0 (docs/user-admin-harmonization.md): the account's own settings — email change,\n// sessions, deletion, export. Callbacks only; the confirmation level is the server's.\nexport { EmailChangeSetting, DEFAULT_EMAIL_CHANGE_LABELS } from \"./account/email-change-setting\";\nexport type {\n EmailChangeSettingProps,\n EmailChangeLabels,\n EmailChangeValues,\n EmailChangeAction,\n} from \"./account/email-change-setting\";\nexport { SessionsSetting, DEFAULT_SESSIONS_LABELS } from \"./account/sessions-setting\";\nexport type { SessionsSettingProps, SessionsLabels, SessionItem, SessionId, SessionsAction } from \"./account/sessions-setting\";\nexport { DeleteAccountSetting, DEFAULT_DELETE_ACCOUNT_LABELS } from \"./account/delete-account-setting\";\nexport type {\n DeleteAccountSettingProps,\n DeleteAccountLabels,\n DeleteAccountValues,\n DeletionMode,\n DeleteAccountConsequence,\n} from \"./account/delete-account-setting\";\nexport { DataExportSetting, DEFAULT_DATA_EXPORT_LABELS } from \"./account/data-export-setting\";\nexport type { DataExportSettingProps, DataExportLabels, DataExportFile } from \"./account/data-export-setting\";\n\n// ── admin ────────────────────────────────────────────────────────────────────\n// 0.30.0 (docs/user-admin-harmonization.md): the admin user list and its actions, and the\n// invitations panel. Callbacks only; the confirmation level is the server's.\nexport {\n userRosterColumns,\n useUserRosterColumns,\n UserIdentityCell,\n UserRowActions,\n adminUserStates,\n userRosterSort,\n USER_ROSTER_SORT_KEYS,\n DEFAULT_USER_ROSTER_LABELS,\n} from \"./admin/user-roster\";\nexport type {\n UserRosterRow,\n AdminUserStateFields,\n RosterState,\n UserRosterSortKey,\n UserRosterLabels,\n UserIdentityCellProps,\n UserRowAction,\n UserRowActionList,\n UserRowActionsProps,\n RoleEditing,\n UserRosterColumnsOptions,\n} from \"./admin/user-roster\";\nexport { RoleSelect, RolesEditor, DEFAULT_ROLE_SELECT_LABELS } from \"./admin/role-select\";\nexport type { RoleSelectProps, RolesEditorProps, RoleSelectLabels, RoleLock, RoleLockCode } from \"./admin/role-select\";\nexport { ReviewerScopeEditor, DEFAULT_REVIEWER_SCOPE_LABELS } from \"./admin/reviewer-scope-editor\";\nexport type {\n ReviewerScope,\n ReviewerScopeArea,\n ReviewerScopeLanguage,\n ReviewerScopeLabels,\n ReviewerScopeEditorProps,\n} from \"./admin/reviewer-scope-editor\";\nexport { AdminActionConfirm, DEFAULT_ADMIN_ACTION_LABELS } from \"./admin/admin-action-confirm\";\nexport type {\n AdminConfirmLevel,\n AdminActionConfirmValues,\n AdminActionTarget,\n AdminActionLabels,\n AdminActionConfirmProps,\n} from \"./admin/admin-action-confirm\";\nexport { AdminActionLog, ADMIN_ACTION_KINDS, DEFAULT_ADMIN_ACTION_LOG_LABELS } from \"./admin/admin-action-log\";\nexport type {\n AdminActionKind,\n AdminActionLogEntry,\n AdminActionLogLabels,\n AdminActionLogPaging,\n AdminActionLogProps,\n // 0.34 (docs/user-admin-harmonization.md §11): a log target that is not a person, and\n // the app's noun for its groups.\n AdminGroupTarget,\n AdminOtherTarget,\n AdminGroupNoun,\n} from \"./admin/admin-action-log\";\nexport { TransferOwnershipDialog, DEFAULT_TRANSFER_OWNERSHIP_LABELS } from \"./admin/transfer-ownership-dialog\";\nexport type {\n TransferCandidate,\n TransferUnavailable,\n TransferValues,\n TransferOwnershipLabels,\n TransferOwnershipDialogProps,\n} from \"./admin/transfer-ownership-dialog\";\nexport { InvitationsPanel, DEFAULT_INVITATIONS_LABELS } from \"./admin/invitations-panel\";\nexport type {\n InvitationStatus,\n InvitationRow,\n InvitationDraft,\n InvitationSentAnswer,\n InvitationScope,\n InvitationsLabels,\n InvitationsPanelProps,\n} from \"./admin/invitations-panel\";\nexport type { AdminPerson } from \"./admin/admin-parts\";\n// 0.42.0 (docs/admin-harmonization.md §3.1): the admin area's template — its words, the\n// shared sections and the catalogue helper, the 403 page, the overview and its tiles fed\n// by `GET /admin/attention`, and the Tools list. The menu row is `./shell`'s.\nexport { DEFAULT_ADMIN_AREA_LABELS, useAdminAreaLabels } from \"./admin/admin-area-labels\";\nexport type { AdminAreaLabels, AdminTileLabels, AdminSharedSection } from \"./admin/admin-area-labels\";\nexport { ADMIN_SECTIONS, adminSections } from \"./admin/admin-sections\";\nexport type { AdminSectionDefinition, AdminOwnSection, AdminSectionsOptions } from \"./admin/admin-sections\";\n// 0.43.0 (keksdose): the section order as ids, and the narrowed `leaveOut`.\nexport { adminSectionOrder } from \"./admin/admin-sections\";\nexport type { AdminSectionPlace, AdminSectionOrderOptions, AdminKeptSection } from \"./admin/admin-sections\";\nexport { AdminForbidden } from \"./admin/admin-forbidden\";\nexport type { AdminForbiddenProps } from \"./admin/admin-forbidden\";\nexport { AdminOverview, AttentionTile, adminWaitingCount, DEFAULT_ADMIN_ATTENTION_HREFS } from \"./admin/admin-overview\";\nexport type {\n AdminAttention,\n AdminAttentionTile,\n AdminExtraTile,\n AdminOverviewProps,\n AttentionTileProps,\n} from \"./admin/admin-overview\";\nexport { AdminToolLinks } from \"./admin/admin-tool-links\";\nexport type { AdminToolLink, AdminToolLinksProps } from \"./admin/admin-tool-links\";\n// 0.45.0 (docs/admin-harmonization.md §9.2.4): \"Send a test mail to me\".\nexport { MailTestCard, DEFAULT_MAIL_TEST_CARD_LABELS, MAIL_TEST_ANCHOR, maskMailAddress } from \"./admin/mail-test-card\";\nexport type { MailTestCardProps, MailTestCardLabels, MailTestAnswer } from \"./admin/mail-test-card\";\n// 0.33.0: the operator's plan parts (docs/billing-harmonization.md §14.12).\nexport {\n planColumn,\n usePlanColumn,\n PlanChangeConfirm,\n usePlanChangeResult,\n DEFAULT_PLAN_CHANGE_LABELS,\n} from \"./admin/plan-change\";\nexport type {\n PlanChangeLabels,\n PlanColumnOptions,\n PlanColumnUsage,\n PlanChange,\n PlanChangeConfirmProps,\n PlanChangeOutcome,\n PlanChangeTone,\n PlanChangeLine,\n PlanChangeResultOptions,\n} from \"./admin/plan-change\";\n\n// ── billing ──────────────────────────────────────────────────────────────────\n// 0.32.0: plans, standing, banners, the limit notice (docs/billing-harmonization.md §7).\nexport { DEFAULT_BILLING_LABELS, useBillingLabels, SUBSCRIPTION_STATUSES } from \"./billing/billing-labels\";\nexport type { BillingLabels, SubscriptionStatus } from \"./billing/billing-labels\";\nexport { BILLING_INTERVALS, planPrice, minorToMajor, formatPlanPrice, billingCurrencyFor } from \"./billing/plan-price\";\nexport type { BillingInterval, BillingCurrency, PlanIntervalPrices, PlanPrices, PlanPriceAnswer } from \"./billing/plan-price\";\nexport { PlanCard, PlanPicker, GrantWarningConfirm, planRelation } from \"./billing/plan-card\";\nexport type { BillingPlan, PlanRelation, PlanCardProps, PlanPickerProps, PlanChoice, GrantWarningConfirmProps } from \"./billing/plan-card\";\nexport { SubscriptionStatusChip, SUBSCRIPTION_STATUS_TONES } from \"./billing/subscription-status-chip\";\nexport type { SubscriptionStatusChipProps } from \"./billing/subscription-status-chip\";\nexport { BillingBanner } from \"./billing/billing-banner\";\nexport type { BillingBannerProps, BillingBannerKind } from \"./billing/billing-banner\";\nexport { PlanLimitNotice, planLimitMailto } from \"./billing/plan-limit-notice\";\nexport type { PlanLimitNoticeProps } from \"./billing/plan-limit-notice\";\nexport { isPlanLimit } from \"./billing/plan-limit\";\nexport type { PlanLimitRefusal } from \"./billing/plan-limit\";\n// 0.33.0: sources name their kind, the combined lock holds them all, and billing's is one\n// hook (docs/billing-harmonization.md §12.36).\nexport { combineWriteLocks, useBillingLockReason, useBillingWriteLock } from \"./billing/billing-lock\";\nexport type { WriteLockSource, CombinedWriteLock, BillingLockReasonOptions } from \"./billing/billing-lock\";\nexport { billingLockAt, isBillingReadOnly, billingDaysLeft } from \"./billing/billing-standing\";\nexport type { BillingStanding } from \"./billing/billing-standing\";\nexport { SubscriptionActions } from \"./billing/subscription-actions\";\nexport type { SubscriptionActionsProps } from \"./billing/subscription-actions\";\n// 0.33.0, billing's round 0.33 (docs/billing-harmonization.md §14):\n// the way back from a checkout and its \"processing\", router-agnostic (§14.4).\nexport {\n CHECKOUT_RETURN_PARAM,\n CHECKOUT_RETURN_VALUE,\n isCheckoutReturn,\n withoutCheckoutReturn,\n checkoutReturnUrl,\n} from \"./billing/checkout-return\";\nexport { checkoutFingerprint, checkoutLanded, noteCheckoutStarted, useCheckoutProcessing } from \"./billing/checkout-processing\";\nexport type { CheckoutOverview, CheckoutProcessingOptions } from \"./billing/checkout-processing\";\n// The link to the pay page and Paddle's locale (§14.4); the page itself ships as dist/pay/.\nexport { PAY_PAGE_LANG_PARAM, paddleLocale, payPageUrl } from \"./billing/pay-page\";\nexport type { PaddleEnvironment } from \"./billing/pay-page\";\n// 0.39 (§15.2.6): the apps every pay page serves, by their `billing_app` tag.\nexport { PAY_PAGE_APPS } from \"./billing/pay-page\";\nexport type { PayPageApp } from \"./billing/pay-page\";\n// The API's shapes the parts read, server-kit 0.7's (§4, §14.5), and the plan limit as\n// a toast (§14.11).\nexport type { BillingOverview, SubscriptionSource, PortalTarget, PortalRequest } from \"./billing/billing-overview\";\nexport { usePlanLimitToast } from \"./billing/plan-limit-toast\";\nexport type { PlanLimitToastOptions } from \"./billing/plan-limit-toast\";\n// 0.39 (§15.2.10): the payer's plan switch, its shapes, and what the payer pays.\nexport { PlanSwitchConfirm } from \"./billing/plan-switch\";\nexport type { PlanSwitchConfirmProps, PlanSwitchSide } from \"./billing/plan-switch\";\nexport type { PaidPrice, PlanSwitchRequest, PlanSwitchPreview } from \"./billing/billing-overview\";\n// 0.42 (§16): the portal for the buyer only, the in-app cancel, the permanent-grant warning.\nexport { isPermanentGrant } from \"./billing/billing-overview\";\nexport type { BillingPortalAccess } from \"./billing/billing-overview\";\nexport { CancelSubscriptionConfirm } from \"./billing/cancel-subscription\";\nexport type { CancelSubscriptionConfirmProps } from \"./billing/cancel-subscription\";\n// 0.43 (§17): the provider's portal in a new tab; the in-app cancel's follow-up.\nexport { openProviderPage } from \"./billing/provider-page\";\nexport type { OpenProviderPageOptions, ProviderPageWay } from \"./billing/provider-page\";\nexport { useCancelRequest } from \"./billing/cancel-request\";\nexport type { CancelRequest, CancelRequested, CancelRequestView } from \"./billing/cancel-request\";\n// The operator's plan parts (§14.12) are admin/plan-change, in the admin section.\n\n// ── settings ─────────────────────────────────────────────────────────────────\n// 0.31.0 (docs/settings-harmonization.md): the settings page and the admin page on one\n// shell. The router-aware layout with its\n// route and focus hooks, and the router-free section, context, heading level and catalogue,\n// come with `./shell` above (also `@eifi1/ui-kit/shell`).\nexport { DEFAULT_SETTINGS_LABELS, useSettingsLabels } from \"./settings/settings-labels\";\nexport type { SettingsLabels, SettingsGroupLabels, SettingsCoreGroup } from \"./settings/settings-labels\";\n// 0.36.0 (§11): \"Reset this device's settings\" — the registry the kit's stores, provider\n// and shell join on their own and an app adds its own device keys to, and the card, the\n// appearance group's last.\nexport { registerDeviceSetting, deviceSettings, resetDeviceSettings } from \"./lib/device-settings\";\nexport type { DeviceSetting, DeviceSettingKind } from \"./lib/device-settings\";\nexport { DeviceResetSetting, DEVICE_RESET_ANCHOR, DEFAULT_DEVICE_RESET_LABELS } from \"./settings/device-reset-setting\";\nexport type { DeviceResetSettingProps, DeviceResetLabels } from \"./settings/device-reset-setting\";\n// The language follows the account (§6.2); since 0.32 so do the text size and the\n// contrast (useAccountAppearance below, docs/text-size-harmonization.md §6).\nexport { useAccountLanguage, resolveAccountLanguage, matchOfferedLanguage } from \"./settings/use-account-language\";\nexport type {\n UseAccountLanguageOptions,\n AccountLanguage,\n AccountLanguageSource,\n ResolveAccountLanguageInput,\n ResolvedAccountLanguage,\n} from \"./settings/use-account-language\";\nexport { useAccountAppearance, resolveAccountAppearance } from \"./settings/use-account-appearance\";\nexport type {\n AppearanceSource,\n AccountAppearanceFields,\n DeviceAppearance,\n AccountAppearancePatch,\n ResolvedAccountAppearance,\n UseAccountAppearanceOptions,\n AccountAppearance,\n} from \"./settings/use-account-appearance\";\n\n// ── notifications ────────────────────────────────────────────────────────────\n// 0.36.0 (docs/notifications-harmonization.md §4.2): the notification cards — the types\n// the server answers (the kit keeps no list of its own), quiet hours with the zone picker,\n// this device's push on its hook, the device list — and the signed-out unsubscribe page.\n// Each card takes the app's request functions; the kit makes no request itself.\nexport { DEFAULT_NOTIFICATIONS_LABELS } from \"./notifications/notifications-labels\";\nexport type { NotificationsLabels, NotificationRegionLabels } from \"./notifications/notifications-labels\";\nexport type {\n DigestCadence,\n NotificationSwitches,\n NotificationTypesValue,\n NotificationTypeEntry,\n NotificationTypeGroup,\n NotificationSettingsPatch,\n PushDeviceItem,\n} from \"./notifications/notification-types\";\nexport { NotificationTypesSetting } from \"./notifications/notification-types-setting\";\nexport type { NotificationTypesSettingProps } from \"./notifications/notification-types-setting\";\nexport { QuietHoursSetting } from \"./notifications/quiet-hours-setting\";\nexport type { QuietHoursSettingProps } from \"./notifications/quiet-hours-setting\";\nexport { TimeZoneSelect, timeZoneOptions, deviceTimeZone } from \"./notifications/time-zone-select\";\nexport type { TimeZoneSelectProps } from \"./notifications/time-zone-select\";\nexport {\n usePushDevice,\n PUSH_SUBSCRIPTION_CHANGED,\n notifyPushSubscriptionChanged,\n pushSupported,\n PushDeviceError,\n} from \"./notifications/use-push-device\";\nexport type {\n PushDevice,\n UsePushDeviceOptions,\n PushSubscriptionInput,\n PushPermission,\n PushDeviceErrorCode,\n} from \"./notifications/use-push-device\";\nexport { PushDeviceSetting } from \"./notifications/push-device-setting\";\nexport type { PushDeviceSettingProps, PushDeviceAction } from \"./notifications/push-device-setting\";\nexport { PushDevicesSetting, describeUserAgent } from \"./notifications/push-devices-setting\";\nexport type { PushDevicesSettingProps } from \"./notifications/push-devices-setting\";\nexport { UnsubscribePanel, unsubscribeTokenType } from \"./notifications/unsubscribe-panel\";\nexport type { UnsubscribePanelProps } from \"./notifications/unsubscribe-panel\";\n// 0.38.0 (docs/feedback-harmonization.md §9.11): the two feedback types' setting words.\nexport {\n useFeedbackNotificationTypes,\n DEFAULT_FEEDBACK_NOTIFICATION_TYPES_LABELS,\n} from \"./notifications/feedback-notification-types\";\nexport type {\n FeedbackNotificationTypeId,\n FeedbackNotificationTypesLabels,\n} from \"./notifications/feedback-notification-types\";\n\n// ── landing ──────────────────────────────────────────────────────────────────\n// 0.31.0 (docs/landing-demo-harmonization.md): the public landing page. Its router-aware parts — the header and the resume (RootEntry,\n// RedirectIfAuthed, the last-visited page) — come with `./shell` above.\nexport { DEFAULT_LANDING_LABELS, useLandingLabels } from \"./landing/landing-labels\";\nexport type { LandingLabels } from \"./landing/landing-labels\";\nexport { accessAction, useAccessAction } from \"./landing/access\";\nexport type { AccessChoice, AccessLink, AccessLabels } from \"./landing/access\";\nexport { LandingActions } from \"./landing/landing-actions\";\nexport type { LandingActionsProps, LandingSession } from \"./landing/landing-actions\";\nexport { Hero, FeatureRows, FeatureRow, TrustStrip, CtaBand, PublicFooter } from \"./landing/landing-sections\";\nexport type {\n HeroProps,\n FeatureRowsProps,\n FeatureRowProps,\n TrustItem,\n TrustStripProps,\n CtaBandProps,\n PublicFooterProps,\n} from \"./landing/landing-sections\";\nexport { usePageSeo, seoCopyProblems, metaContent } from \"./landing/page-seo\";\nexport type { SeoCopy, SeoCopyLimits, SeoCopyProblem, SeoCopyProblemCode } from \"./landing/page-seo\";\n\n// ── demo ─────────────────────────────────────────────────────────────────────\n// 0.31.0 (docs/landing-demo-harmonization.md): the demo's start, banner, countdown and end.\nexport { DEFAULT_DEMO_LABELS, useDemoLabels } from \"./demo/demo-labels\";\nexport type { DemoLabels } from \"./demo/demo-labels\";\nexport { isDemoSession } from \"./demo/demo-session\";\nexport type { DemoModel, DemoSessionUser } from \"./demo/demo-session\";\nexport { useDemoCountdown, demoCountdown, DEMO_WARNING_MINUTES, DEMO_MINUTES_ONLY } from \"./demo/demo-countdown\";\nexport type { DemoCountdown, DemoCountdownOptions, DemoExpiry } from \"./demo/demo-countdown\";\nexport { DemoStart } from \"./demo/demo-start\";\nexport type { DemoStartProps } from \"./demo/demo-start\";\nexport { DemoBanner } from \"./demo/demo-banner\";\nexport type { DemoBannerProps } from \"./demo/demo-banner\";\nexport { DemoEnded } from \"./demo/demo-ended\";\nexport type { DemoEndedProps } from \"./demo/demo-ended\";\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// @eifi1/ui-kit — shared design-system barrel.\n//\n// Domain-free UI + theme surface shared across apps (lead app: Keksdose). Consumers import\n// components/theme from \"@eifi1/ui-kit\" and the token stylesheet from \"@eifi1/ui-kit/tokens.css\".\n//\n// Grouped by folder. A subpath entry (chart, data-table, shell, feedback, wizard, tour,\n// search) is re-exported whole — `export * from \"./chart\"` — instead of its list typed out a\n// second time here: the two copies had drifted (refactor audit 2026-10, MOD-5). A name that\n// arrives twice that way is the same binding from the same module, which ESM does not count\n// as a clash.\n\n// ── lib ────────────────────────────────────────────────────────────────────\nexport * from \"./lib/calc\";\nexport { cn } from \"./lib/cn\";\nexport { logger, setStoreLog } from \"./lib/logger\";\n// Intl number / money / percent / date / relative-time formatting, and `useKitFormat()`\n// for the same bound to the provider's locale (kastlan's formatters.ts, English \"5m ago\").\nexport * from \"./lib/format\";\n// localStorage that never throws (Safari private mode, blocked site data).\nexport { readStored, writeStored } from \"./lib/safe-storage\";\n// Save a fetched Blob as a download, and read the name a Content-Disposition asks for\n// (`filename*` first) — 0.34, KS U5; the kit's own three downloads use them.\nexport { saveBlob, filenameFromDisposition } from \"./lib/download\";\n// Date helpers are also available via the \"@eifi1/ui-kit/dates\" subpath.\n// One fold and one ranking for every list's search box (DUP-5), for an app's own lists.\nexport { foldForSearch, rankMatch } from \"./lib/text-match\";\nexport type { MatchRank } from \"./lib/text-match\";\n// 0.12.0: the QR encoder QrCode draws with — no dependency, see lib/qr-encode.ts.\nexport { encodeQr } from \"./lib/qr-encode\";\nexport type { QrEncodeOptions, QrErrorCorrection, QrMatrix } from \"./lib/qr-encode\";\n// 0.18: the cold-start notice keksdose built (#199), for every app: the framework-free\n// watchdog over the app's requests (the corner notice is components/server-wake).\nexport { createServerWake, serverWake, watchReadsAnd, attachServerWake, wrapFetch } from \"./lib/server-wake\";\nexport type { ServerWakeStage, ServerWakeFilter, ServerWakeOptions, ServerWakeRequest, ServerWakeWatcher, ServerWakeAxiosConfig, AxiosLikeInstance } from \"./lib/server-wake\";\n// 0.34 (docs/auth-harmonization.md §11, round 0.34 C7): renewing a session — one refresh\n// per tab, a definitive failure ends the session once, a transient one keeps it.\nexport { createSessionRefresh, attachSessionRefresh, isTransientRefreshFailure, isSignedOutStep } from \"./lib/session-refresh\";\nexport type { SessionRefresh, SessionRefreshOptions, SessionRenewal, SessionRefreshOutcome } from \"./lib/session-refresh\";\n// 0.29.0 (docs/auth-harmonization.md): the person-name order of each language.\nexport { formatPersonName, personInitials } from \"./lib/person-name\";\nexport type { PersonName } from \"./lib/person-name\";\n// Translation review (0.19): one contract for kastlan's and keksdose's review pages — the\n// pure rows/status/placeholder logic here, the presentational page parts under components.\nexport {\n REVIEW_STATUSES,\n fromApiReview,\n toApiWrite,\n flattenStrings,\n keyNamespace,\n placeholderTokens,\n placeholderMismatch,\n reviewStatus,\n keyInArea,\n keyInAreas,\n // 0.28: the area a key is grouped under — `kit.legal.*` in `legal` (legal round §7.5).\n reviewAreaOf,\n translationRows,\n summariseRows,\n DEFAULT_TRANSLATION_REVIEW_FILTER,\n filterTranslationRows,\n reviewWrite,\n mergeReviews,\n dropReviews,\n translationCorrections,\n // 0.25: grouping and the approvals' Undo (keksdose live #377).\n groupTranslationRows,\n unreviewedRows,\n reviewUndo,\n // 0.26: swipe bindings for an app's Settings → Interaction (keksdose #377 rework).\n TRANSLATION_REVIEW_SWIPE_ACTIONS,\n DEFAULT_TRANSLATION_REVIEW_SWIPE,\n translationReviewSwipePlan,\n} from \"./lib/translation-review\";\nexport type {\n TranslationVerdict,\n TranslationReview,\n TranslationReviewWrite,\n TranslationReviewKey,\n ReviewStatus,\n TranslationRow,\n ApiTranslationReview,\n ApiTranslationReviewsResponse,\n ApiTranslationReviewWrite,\n TranslationRowsInput,\n TranslationSummary,\n TranslationReviewFilter,\n TranslationCorrection,\n TranslationRowGroup,\n TranslationReviewUndo,\n TranslationReviewSwipeAction,\n TranslationReviewSwipeBinding,\n} from \"./lib/translation-review\";\n// 0.22.0, the inputs round: the country list and the IBAN, ISIN and phone helpers that\n// CountrySelect, IbanInput and PhoneInput are built on.\nexport { COUNTRY_CODES, countryName } from \"./lib/countries\";\nexport {\n IBAN_LENGTHS,\n compactIban,\n formatIban,\n ibanCheckDigits,\n ibanProblem,\n isValidIban,\n isQrIban,\n} from \"./lib/iban\";\nexport type { IbanKind, IbanProblem } from \"./lib/iban\";\nexport { formatIsin, isinCheckDigit, isValidIsin } from \"./lib/isin\";\nexport {\n PHONE_DIAL_CODES,\n PHONE_COUNTRIES,\n parsePhone,\n formatNationalPhone,\n formatPhone,\n isE164,\n} from \"./lib/phone\";\nexport type { PhoneCountryCode, PhoneCountry, ParsedPhone } from \"./lib/phone\";\n// 0.23.0: ColumnMapper's pure half (Kurvenschmiede's columns input, keksdose's import map).\nexport {\n assignColumnRole,\n guessMapping,\n missingRoles,\n readMappedTable,\n readTextFile,\n roleOfColumn,\n} from \"./lib/column-mapping\";\nexport type { ColumnMapperResult, ColumnMapping, ColumnRole } from \"./lib/column-mapping\";\n\n// ── hooks ────────────────────────────────────────────────────────────────────\nexport { useMediaQuery } from \"./hooks/use-media-query\";\nexport { useBodyScrollLock } from \"./hooks/use-body-scroll-lock\";\nexport { useAnchoredRect } from \"./hooks/use-anchored-rect\";\nexport type { AnchorRect } from \"./hooks/use-anchored-rect\";\nexport {\n useAnchoredPanel,\n anchoredPanelPlacement,\n useVisualViewport,\n readKeyboardInset,\n} from \"./hooks/use-anchored-panel\";\nexport type {\n AnchoredPanel,\n AnchoredPanelOptions,\n ViewportBox,\n KeyboardInsetOptions,\n} from \"./hooks/use-anchored-panel\";\nexport { useEscapeKey, useOutsideClick } from \"./hooks/use-dismiss\";\n// Focus containment for an overlay, and a live region for a change that moves no focus.\n// Both were extracted from the two components that already did them correctly (Modal and\n// CommandPalette) so the rest of the kit stops being the exception.\nexport { useFocusTrap } from \"./hooks/use-focus-trap\";\nexport type { FocusTrapOptions } from \"./hooks/use-focus-trap\";\nexport { useAnnounce } from \"./hooks/use-announce\";\nexport type { UseAnnounceReturn, UseAnnounceOptions, AnnounceRegionProps } from \"./hooks/use-announce\";\nexport { useOverlayHistory } from \"./hooks/use-overlay-history\";\nexport { useCloseTransition, OVERLAY_EXIT_MS } from \"./hooks/use-close-transition\";\nexport { useRowSwipe } from \"./hooks/use-row-swipe\";\n// 0.28: keksdose's noindex marker, for the legal and auth pages of every app.\nexport { useNoIndex } from \"./hooks/use-noindex\";\nexport type { SwipeStage, RowSwipeOptions, RowSwipeReturn } from \"./hooks/use-row-swipe\";\n// Any element as a file drop target, screened like FileButton (kastlan).\nexport { useFileDrop, dragHasFiles } from \"./hooks/use-file-drop\";\nexport type { UseFileDropOptions, UseFileDropReturn, FileDropProps } from \"./hooks/use-file-drop\";\n// kastlan's search boxes each carried a hand-rolled copy, two without the cleanup.\nexport { useDebounce, useDebouncedCallback } from \"./hooks/use-debounce\";\nexport type { DebouncedCallbackOptions, DebouncedFunction } from \"./hooks/use-debounce\";\n// One search param as state, the active tab in `?tab=`, and a dialog's open state in the\n// URL (Modal's `urlParam`) — kastlan's and keksdose's use-search-param-state, in the kit.\nexport { useSearchParamState, useTabParam, useDialogParam } from \"./hooks/use-search-param-state\";\nexport type { SearchParamStateOptions, DialogParam } from \"./hooks/use-search-param-state\";\n// 0.25: several keys, one navigation (keksdose live #378 — four setters in a row clobbered).\nexport { useSearchParamsState } from \"./hooks/use-search-param-state\";\nexport type { SearchParamField, SearchParamFields, SearchParamsUpdate } from \"./hooks/use-search-param-state\";\n// Copy that reports whether it worked — keksdose's copy buttons said \"Copied\" when it had not.\nexport { useCopyToClipboard, copyToClipboard } from \"./hooks/use-copy-to-clipboard\";\nexport type { CopyState, UseCopyToClipboardOptions, UseCopyToClipboardReturn } from \"./hooks/use-copy-to-clipboard\";\n// Keyboard shortcuts (\"Mod+K\", \"Ctrl+Shift+F\") that leave typing in fields alone.\nexport { useHotkey, parseHotkey, matchesHotkey } from \"./hooks/use-hotkey\";\nexport type { Hotkey, ParsedHotkey, UseHotkeyOptions } from \"./hooks/use-hotkey\";\n// A protected file as an object URL, fetched with the app's own auth (kastlan's AuthedImage).\nexport { useAuthedSrc } from \"./hooks/use-authed-src\";\nexport type { AuthedFetcher, AuthedSrcStatus, UseAuthedSrcOptions, UseAuthedSrcResult } from \"./hooks/use-authed-src\";\n// Row windowing for a long list (0.7.0, lenkbank's measured grid is built on it).\nexport { useWindowedRows, WINDOWED_ROW_INDEX } from \"./hooks/use-windowed-rows\";\nexport type { WindowedRows } from \"./hooks/use-windowed-rows\";\n// 0.32.0 (docs/text-size-harmonization.md): the breakpoints, and the hooks components read\n// the behaviours at Large from (§4, §10.7–10.9).\nexport { useBreakpoint, usePhoneLayout, breakpointQuery, BREAKPOINT_REM, remPx, useRemPx } from \"./hooks/use-breakpoint\";\nexport type { Breakpoint, BreakpointVariant, RemLength } from \"./hooks/use-breakpoint\";\nexport { useLargeText, useCoarsePointer, useInlineFacts } from \"./hooks/use-large-text\";\n\n// ── theme / palettes ─────────────────────────────────────────────────────────\n// The chart palette (theme/chart-palette) comes with the chart kit, `./chart` below.\n// Colour maths (sRGB ↔ OKLCH, WCAG contrast, CVD simulation) and the palette deriver\n// that builds a whole, contrast-solved palette from one brand colour plus any colours\n// pinned by hand. `auditPalette` / `auditChartRamp` measure a palette rather than\n// trusting a comment about it.\nexport * from \"./theme/color\";\nexport * from \"./theme/palette-derive\";\nexport * from \"./theme/palette-presets\";\nexport * from \"./theme/theme-store\";\nexport * from \"./theme/palette-store\";\n// 0.32.0: text size and contrast (docs/text-size-harmonization.md).\nexport * from \"./theme/text-size\";\nexport * from \"./theme/contrast\";\n\n// ── i18n: one label tree, one optional provider ──────────────────────────────\n// `UiKitLabels` names every string the kit renders; `<UiKitProvider labels locale>`\n// hands a translation to every component below it. Precedence: a component's own\n// prop > the provider > the English default. See src/i18n/kit-labels.tsx.\nexport * from \"./i18n/kit-labels\";\nexport * from \"./i18n/defaults\";\n// The kit's words as `key → text` rows for an app's translation review (keksdose).\nexport { kitLabelStrings } from \"./i18n/review\";\nexport type { KitLabelStringsOptions } from \"./i18n/review\";\n// The seven languages, how an app resolves one, and the kit catalogue loader for it.\nexport * from \"./i18n/languages\";\n// CLDR plural categories for an app's i18next catalogue, filled from `_other`; and the\n// forms of an app's word a kit part picks from by count (0.33.1, `PlanColumnUsage.label`).\nexport { withAllPlurals } from \"./i18n/plurals\";\nexport type { PluralForms } from \"./i18n/plurals\";\n\n// ── components ───────────────────────────────────────────────────────────────\n// The kit's core controls, one module each since 0.34 (MOD-2, refactor audit 2026-10):\n// Button, IconButton, the field base, Input, Select, Textarea, Card, Spinner, EmptyState\n// and Tabs. Named, not `*`, for `button-look` and `field-base`: they also hold parts the\n// controls share, which are internal. The others are public whole.\nexport * from \"./components/button\";\nexport {\n buttonClasses,\n TOUCH_TARGET_LARGE,\n type ButtonClassesOptions,\n type ButtonSize,\n type ButtonTone,\n type ButtonVariant,\n} from \"./components/button-look\";\nexport * from \"./components/icon-button\";\nexport {\n FIELD_TOUCH_TEXT,\n FIELD_BASE,\n FIELD_WRITABLE_LOOK,\n FIELD_FLOATING_PAD,\n FIELD_INVALID,\n FLOATING_INPUT_CLASS,\n FIELD_DISPLAY,\n FIELD_TRIGGER,\n FieldChevron,\n FLOATING_LABEL_CLASS,\n FloatingField,\n Label,\n DEFAULT_PASSWORD_REVEAL_LABELS,\n DEFAULT_CHARACTER_COUNT_LABELS,\n type FieldChevronProps,\n type FloatingFieldProps,\n type LabelProps,\n type PasswordRevealLabels,\n type CharacterCountLabels,\n} from \"./components/field-base\";\nexport * from \"./components/input\";\nexport * from \"./components/select\";\nexport * from \"./components/textarea\";\nexport * from \"./components/card\";\nexport * from \"./components/spinner\";\nexport * from \"./components/empty-state\";\nexport * from \"./components/tabs\";\n// The static label lives in field-parts since 0.23 (it is what the field anatomy there\n// draws, and field-parts must not import the controls).\nexport { FieldLabel, FLOATING_LABEL_STATIC, FieldHint } from \"./components/field-parts\";\nexport type { FieldLabelProps, FieldHintProps } from \"./components/field-parts\";\n// The kit's focus frame (§5), in its own module so the parts the controls import\n// (field-parts, the choice controls) can draw it too.\nexport { FOCUS_RING, FOCUS_RING_WIDTH } from \"./components/focus-ring\";\n// No fact only in a tooltip (§4): the reason line and the compact region live in\n// field-parts, where the self-saving controls (Switch, Checkbox) reach them too.\nexport {\n CompactControls,\n DisabledReasonLine,\n DISABLED_REASON_LINE_CLASS,\n useDisabledReasonLine,\n} from \"./components/field-parts\";\nexport type { DisabledReasonDisplay } from \"./components/field-parts\";\n// The label-ABOVE field group (label, hint, error, required), inside wizards or out.\nexport * from \"./components/field\";\nexport * from \"./components/search-field\";\nexport * from \"./components/dropdown\";\nexport * from \"./components/popover\";\n// 0.34 (keksdose K3): paragraph-long help behind a \"?\", opened on a tap — FieldHint's\n// sibling for help rather than a fact (docs/text-size-harmonization.md §10.23).\nexport { HelpPopover } from \"./components/help-popover\";\nexport type { HelpPopoverProps } from \"./components/help-popover\";\nexport { SwipeableRow } from \"./components/swipeable-row\";\nexport type { SwipeAction, SwipePaint, SwipeTone, SwipeableRowProps } from \"./components/swipeable-row\";\nexport * from \"./components/calculator\";\nexport * from \"./components/numpad-sheet\";\nexport * from \"./components/number-input\";\nexport * from \"./components/currency-select\";\n// 0.35: each currency's flag-icons country. `CURRENCIES` and it are also the pure-data\n// entry \"@eifi1/ui-kit/currencies\", which imports nothing, for an app's build in Node.\nexport { CURRENCY_COUNTRIES } from \"./currencies\";\nexport * from \"./components/amount-input\";\nexport * from \"./components/money-field\";\nexport * from \"./components/combobox\";\nexport * from \"./components/picker-sheet\";\nexport * from \"./components/entity-combobox\";\nexport * from \"./components/multi-entity-combobox\";\nexport * from \"./components/multi-select\";\nexport * from \"./components/tooltip\";\nexport * from \"./components/user-avatar\";\nexport * from \"./components/settings-fields\";\n// Sync state for a database-backed field: the engine (`useFieldSync`) and the\n// affordance (`FieldSyncIndicator`), kept separate because the state is useful\n// without the dot — a form can gate its submit on any field being `pending`.\nexport * from \"./components/field-sync\";\nexport * from \"./components/month-picker\";\nexport * from \"./components/checkbox\";\nexport * from \"./components/switch\";\nexport * from \"./components/slider\";\nexport * from \"./components/time-input\";\nexport * from \"./components/number-field\";\nexport * from \"./components/sparkline\";\nexport * from \"./components/stat-tile\";\nexport * from \"./components/signature-pad\";\nexport * from \"./components/password-strength\";\nexport * from \"./components/page-contents\";\nexport * from \"./components/disclosure\";\nexport * from \"./components/dialog-frame\";\n// Named, not `*`: danger-confirm also holds the password field and pending hook that\n// ReauthDialog shares with it, which are kit-internal.\nexport {\n DangerConfirm,\n DEFAULT_DANGER_CONFIRM_LABELS,\n typedMatches,\n // 0.22.0: the typed-confirmation field on its own (keksdose K7) and the current-password\n // field kastlan wants for sign-in and re-authentication (kastlan 1).\n TypedConfirmField,\n CurrentPasswordInput,\n} from \"./components/danger-confirm\";\nexport type {\n DangerConfirmLabels,\n DangerConfirmProps,\n TypedMatch,\n DangerConsequence,\n TypedConfirmFieldProps,\n TypedConfirmFieldLabels,\n CurrentPasswordInputProps,\n CurrentPasswordInputLabels,\n // 0.23.0: onConfirm's second argument — the guards' values (keksdose G4b).\n DangerConfirmValues,\n} from \"./components/danger-confirm\";\n// 0.18: re-authentication before a sensitive action (Kurvenschmiede 4).\nexport { ReauthDialog, DEFAULT_REAUTH_DIALOG_LABELS } from \"./components/reauth-dialog\";\nexport type { ReauthDialogProps, ReauthDialogLabels } from \"./components/reauth-dialog\";\n// `useConfirm()` — the promise-based replacement for `window.confirm`, one host per app.\nexport * from \"./components/confirm-dialog\";\n// A non-modal corner panel and its round trigger (keksdose's assistant launcher).\nexport * from \"./components/floating-panel\";\n// The count / clear / actions bar a selection brings up (keksdose's three copies).\nexport * from \"./components/bulk-action-bar\";\nexport * from \"./components/swatch-picker\";\nexport * from \"./components/icon-picker\";\nexport * from \"./components/choice-card\";\nexport * from \"./components/autocomplete\";\nexport * from \"./components/measured-grid\";\n// Named, not `export *`: file-button.tsx also re-exports the screening helpers the\n// dropzone shares (hooks/use-file-picker since 0.34, MOD-8), which are internal.\nexport { FileButton, useFilePicker, matchesAccept, DEFAULT_FILE_PICKER_LABELS } from \"./components/file-button\";\nexport type {\n FileButtonProps,\n UseFilePickerOptions,\n UseFilePickerReturn,\n FilePickerLabels,\n FileRejection,\n FileRejectionReason,\n FileScreenOptions,\n} from \"./components/file-button\";\n// The chart kit, whole, from its subpath (`@eifi1/ui-kit/chart`, which names its parts):\n// the chart shell and its palette, the treemap, the series chart with its zoom, legend,\n// labels and facing-pair axes, the height every chart takes, and the pie chart.\nexport * from \"./chart\";\n// 0.12.0: the QR code TwoFactorSetting draws its otpauth URI with (encoder in\n// lib/qr-encode.ts — no dependency, see there).\nexport * from \"./components/qr-code\";\nexport * from \"./components/alert-banner\";\nexport * from \"./components/toggle-group\";\n// A wrapping set of links/buttons marked `aria-current` — Tabs-like looks, not tabs.\nexport * from \"./components/nav-pills\";\n// A pill carrying one VALUE — inert, a link, or a toggle, depending on which prop it is\n// given — and the list field built from it. Distinct from Button on purpose: a row of\n// buttons reads as \"choose an action\", a row of chips as \"here are the things\".\nexport * from \"./components/chip\";\n// ChipInput's own module since MOD-9: it renders Chip, so chip.tsx re-exports only its types.\nexport * from \"./components/chip-input\";\nexport * from \"./components/wizard-stepper\";\nexport * from \"./components/hover-menu\";\nexport * from \"./components/modal\";\nexport * from \"./components/full-bleed-dialog\";\nexport * from \"./components/grouped-picker\";\nexport * from \"./components/file-dropzone\";\nexport * from \"./components/mini-calendar\";\nexport * from \"./components/calendar-heatmap\";\nexport * from \"./components/date-picker\";\nexport * from \"./components/tree-view\";\n// 0.8.0 layout and feedback primitives the apps hand-rolled or took from shadcn/Radix.\nexport * from \"./components/description-list\";\n// The Save / Cancel row forms and dialogs end in, and the editable line-item repeater\n// (journal lines, lease components, invoice positions). 0.12.0.\nexport * from \"./components/form-actions\";\n// 0.18: lock every opted-in commit under one provider, the reason in its tooltip\n// (Kurvenschmiede 2). `useCommitReason` stays internal.\n// 0.33: a lock says its source, and a control can be exempt from one\n// (docs/billing-harmonization.md §12.36): the kinds, the holds, `CommitScope`,\n// `COMMIT_EXCEPT_BILLING` and the pure `writeLockFor`.\nexport { WriteLockProvider, useWriteLock, writeLockFor, COMMIT_EXCEPT_BILLING, DEFAULT_WRITE_LOCK_LABELS } from \"./components/write-lock\";\n// 0.46 (kastlan K4): the offline lock kind, its scope and its source.\nexport { OFFLINE_LOCK, COMMIT_EXCEPT_OFFLINE, useOfflineWriteLock } from \"./components/write-lock\";\nexport type { WriteLock, WriteLockLabels, WriteLockProviderProps, WriteLockKind, WriteLockHold, CommitScope } from \"./components/write-lock\";\n// 0.18: the parts both apps' admin rosters repeat (Kurvenschmiede 6).\nexport { RoleChip, AccountStateChip, DateMark, dateColumn, DEFAULT_ACCOUNT_STATE_LABELS, ACCOUNT_STATE_TONES } from \"./components/account-chips\";\nexport type { RoleChipProps, RoleDefinition, RoleVocabulary, AccountState, AccountStateLabels, AccountStateChipProps, DateMarkProps, DateColumnOptions } from \"./components/account-chips\";\n// 0.42 (docs/admin-harmonization.md §2.1): the role in the account menu's header, a link\n// to the role's tool (`RoleDefinition.href`).\nexport { AccountRoleChip } from \"./components/account-chips\";\nexport type { AccountRoleChipProps } from \"./components/account-chips\";\n// 0.18: the cold-start notice keksdose built (#199), for every app: the corner notice\n// that explains the wait (its framework-free watchdog is lib/server-wake).\nexport { ServerWakeNotice, useServerWakeStage, DEFAULT_SERVER_WAKE_LABELS } from \"./components/server-wake\";\nexport type { ServerWakeLabels, ServerWakeNoticeProps } from \"./components/server-wake\";\n// 0.18: sharing — grantees, roles, pending grants, candidates (Kurvenschmiede 1).\nexport { ShareCard, ShareDialog, SharePanel, DEFAULT_SHARE_CARD_LABELS } from \"./components/share-card\";\nexport type { ShareCardProps, ShareDialogProps, SharePanelProps, ShareCardLabels, ShareRole, ShareGrantee, SharePendingGrant, ShareCandidate, ShareAddRequest } from \"./components/share-card\";\nexport * from \"./components/line-items\";\nexport * from \"./components/progress-bar\";\n// Named: skeleton.tsx also holds SKELETON_CLASS, the look StatTile shares — internal.\nexport { Skeleton } from \"./components/skeleton\";\nexport type { SkeletonProps, SkeletonShape } from \"./components/skeleton\";\n// 0.12.0: a centred spinner with words, signed figures and deltas, a render-error fallback.\nexport * from \"./components/loading-state\";\nexport * from \"./components/signed-amount\";\nexport * from \"./components/error-boundary\";\nexport * from \"./components/copy-button\";\nexport { AuthedImage, DEFAULT_AUTHED_IMAGE_LABELS } from \"./components/authed-image\";\nexport type { AuthedImageProps, AuthedImageLabels } from \"./components/authed-image\";\nexport * from \"./components/image-grid\";\nexport * from \"./components/lightbox\";\nexport * from \"./components/button-group\";\nexport * from \"./components/table\";\nexport * from \"./components/separator\";\n// Named: scroll-area.tsx also holds the overflow hook and scrollbar class Table shares.\nexport { ScrollArea } from \"./components/scroll-area\";\nexport type { ScrollAreaProps } from \"./components/scroll-area\";\n// 0.10.0 rows, menu rows, text primitives and page chrome the apps drew by hand.\nexport * from \"./components/list\";\nexport * from \"./components/menu-item\";\nexport * from \"./components/text\";\nexport * from \"./components/status-dot\";\nexport * from \"./components/page-header\";\nexport * from \"./components/breadcrumbs\";\n// The one inline link (kastlan's EntityLink / CellLink / legal and source links), through\n// `<UiKitProvider linkComponent>`. Named: the file also holds the kit's internal link picker.\nexport { TextLink } from \"./components/text-link\";\nexport type {\n TextLinkProps,\n TextLinkRenderProps,\n TextLinkTone,\n TextLinkUnderline,\n TextLinkCurrent,\n} from \"./components/text-link\";\n// The toast layer over sonner (an OPTIONAL peer, loaded lazily): `toast` mirrors sonner's\n// API so apps migrate by swapping the import; `<Toaster>` carries the placement, theme,\n// tones and z-index both apps had wired by hand.\nexport {\n toast,\n Toaster,\n DEFAULT_TOAST_LABELS,\n TOAST_ACTION_DURATION,\n TOASTER_OFFSET_TOP,\n TOASTER_OFFSET_BOTTOM,\n} from \"./components/toast\";\nexport type {\n ToastId,\n ToastAction,\n ToastOptions,\n ToastPromiseOptions,\n ToastUndoOptions,\n ToastRedoOptions,\n ToastLabels,\n ToastPosition,\n ToastSwipeDirection,\n ToasterOffset,\n ToasterProps,\n} from \"./components/toast\";\n// Translation review (0.19): the presentational page parts (the pure logic is\n// lib/translation-review).\nexport {\n TranslationReviewPanel,\n TranslationReviewEditor,\n ReviewStatusChip,\n TranslationProgress,\n TranslationLocaleTabs,\n TranslationExportButton,\n REVIEW_STATUS_TONES,\n DEFAULT_TRANSLATION_REVIEW_LABELS,\n} from \"./components/translation-review\";\nexport type {\n TranslationReviewPanelProps,\n TranslationReviewEditorProps,\n ReviewStatusChipProps,\n TranslationProgressProps,\n TranslationLocaleTab,\n TranslationLocaleTabsProps,\n TranslationExportButtonProps,\n TranslationReviewLabels,\n TranslationReviewSaveInfo,\n TranslationReviewOrigin,\n TranslationReviewGroupBy,\n} from \"./components/translation-review\";\n// The legal pages' shell (0.19, H10): Imprint, Privacy Policy, Terms in every app.\n// 0.28 (docs/legal-harmonization.md): the shared wording, the page frame, the kit's\n// sections, the public footer and the terms checkbox.\nexport {\n LegalLayout,\n LegalSection,\n LegalLinks,\n LegalFooter,\n DEFAULT_LEGAL_LABELS,\n LEGAL_HREFS,\n legalOperatorText,\n useLegalLabels,\n} from \"./components/legal\";\nexport type {\n LegalLabels,\n LegalLink,\n LegalLinksProps,\n LegalSectionProps,\n LegalLayoutProps,\n LegalFooterProps,\n LegalOperator,\n LegalOperatorText,\n LegalPageKey,\n LegalTextSectionLabels,\n LegalOperatorSectionLabels,\n LegalFramedSectionLabels,\n LegalDisclaimerSectionLabels,\n} from \"./components/legal\";\nexport { LegalPage, LegalKitSection, LegalAcceptCheckbox, LEGAL_SKELETON } from \"./components/legal-page\";\nexport type {\n LegalPageProps,\n LegalKitSectionProps,\n LegalKitSectionKey,\n LegalAcceptCheckboxProps,\n LegalSkeletonEntry,\n LegalSkeletonPage,\n LegalSectionOwner,\n LegalDisclaimerVariant,\n} from \"./components/legal-page\";\n// 0.32.0 (docs/text-size-harmonization.md): the appearance settings' words, and a row's\n// actions, one of the behaviours at Large (§4, §10.7–10.9).\nexport { DEFAULT_APPEARANCE_LABELS, useAppearanceLabels } from \"./components/appearance-labels\";\nexport type { AppearanceLabels } from \"./components/appearance-labels\";\n// 0.46 (keksdose's date format, lifted): the preference, its resolver and renderer, the\n// provider's formatter for it, and the settings field.\nexport {\n DATE_FORMAT_PREFERENCES,\n isDateFormatPreference,\n resolveDateFormat,\n formatDateWithPreference,\n dateFormatSample,\n dateFormatterFor,\n} from \"./lib/date-format\";\nexport type { DateFormatPreference, DateFormatOptions, ResolvedDateFormat } from \"./lib/date-format\";\nexport { DateFormatSetting } from \"./components/date-format-setting\";\nexport type { DateFormatSettingProps } from \"./components/date-format-setting\";\nexport { RowActions, rowActionsColumn, DEFAULT_ROW_ACTIONS_LABELS } from \"./components/row-actions\";\nexport type {\n RowAction,\n RowActionList,\n RowActionsLabels,\n RowActionsProps,\n RowActionsCollapse,\n RowActionsSize,\n RowActionsColumnOptions,\n RowActionTone,\n} from \"./components/row-actions\";\n// 0.22.0: the inputs round (kastlan's, keksdose's and Kurvenschmiede's audits).\nexport * from \"./components/checkbox-group\";\nexport * from \"./components/one-time-code-input\";\nexport * from \"./components/language-select\";\nexport * from \"./components/tile-radio\";\nexport * from \"./components/inline-edit-field\";\nexport * from \"./components/sign-chip\";\nexport * from \"./components/country-select\";\nexport * from \"./components/iban-input\";\nexport * from \"./components/phone-input\";\n// 0.23.0, the apps' 0.22 adoption round: the label strip over custom content (keksdose G8).\nexport * from \"./components/field-strip\";\n// Paste or drop a table, give each column a role (Kurvenschmiede's columns input,\n// keksdose's import map step). The lexer itself stays in `@eifi1/ui-kit/table-text`.\nexport * from \"./components/column-mapper\";\n\n// ── data-table suite ─────────────────────────────────────────────────────────\n// Whole, from its subpath (`@eifi1/ui-kit/data-table`, which names its parts): DataTable,\n// its sort, filters, pagination and cells, and a server table's state held by its owner,\n// URL-synced.\nexport * from \"./data-table\";\n\n// ── shell (composable app chrome) ────────────────────────────────────────────\n// Whole, from `@eifi1/ui-kit/shell`: the top bar and its controls, AppShell, the switchers\n// and AuthLayout, and (0.31.0) the router-aware parts of settings and landing —\n// SettingsLayout with its route, focus, section, context, heading and catalogue;\n// PublicHeader, RootEntry, RedirectIfAuthed and the last-visited page.\nexport * from \"./shell\";\n// 0.29.0 (docs/auth-harmonization.md): kastlan's company switcher.\nexport { CompanySwitcher, DEFAULT_COMPANY_SWITCHER_LABELS } from \"./shell/company-switcher\";\nexport type { CompanySwitcherProps, CompanySwitcherLabels, CompanySwitcherCompany } from \"./shell/company-switcher\";\n\n// ── feedback ─────────────────────────────────────────────────────────────────\n// The form somebody files a report with, and the parts an inbox is built from:\n// the status vocabulary both apps share value for value, the policy about what a\n// row may move to from where it stands, and the look of a status control, a\n// category badge and an opened report. The app still wires its own API, columns\n// and strings — see the note at the top of `feedback-inbox.tsx` for what is\n// deliberately left to it. Whole, from `@eifi1/ui-kit/feedback`, which also has 0.27.0's\n// harmonization (docs/feedback-harmonization.md): the record, menu, table, detail and\n// crash reporter.\nexport * from \"./feedback\";\n\n// ── multi-step wizard ────────────────────────────────────────────────────────\n// The engine (step machine, validators, collected data), the chrome around it\n// (indicator + nav bar + cancel confirm) and the review step it ends on.\n// `components/wizard-stepper` next door is a different, much smaller thing: a bare\n// step indicator for a two-step import flow, with no engine.\n//\n// `wizard-field` was removed here rather than kept as stock: it held a\n// `WizardField`/`WizardSelectField` pair that had never been rendered in any app — a\n// field group nothing was built from, which this comment used to advertise. A design\n// system may carry stock; untested stock nothing has ever rendered is not stock, it is\n// a liability with an export. The react-hook-form bridge to the Next gate\n// (`useRhfWizardStep`) is NOT here either: it left the barrel in 0.4.x so the barrel\n// imports no react-hook-form, and came back in 0.11 under `@eifi1/ui-kit/rhf`\n// (src/rhf.ts), where the optional peer is that subpath's alone.\n// Whole, from `@eifi1/ui-kit/wizard`.\nexport * from \"./wizard\";\n\n// ── guided tours ─────────────────────────────────────────────────────────────\nexport * from \"./tour\";\n\n// ── command palette / global search ──────────────────────────────────────────\n// The palette, its pure matcher and the ⌘K search on it. The list fold every search box\n// shares is lib/text-match, above.\nexport * from \"./search\";\n\n// ── auth ─────────────────────────────────────────────────────────────────────\n// 0.29.0 (docs/auth-harmonization.md): sign-in, sign-up and the signed-out pages — forms\n// that take callbacks and never send a request themselves. The person-name order of each\n// language is lib/person-name, kastlan's company switcher is in the shell section.\nexport { SignInForm, DEFAULT_SIGN_IN_LABELS } from \"./auth/sign-in-form\";\nexport type {\n SignInFormProps,\n SignInLabels,\n SignInAnswer,\n SignInStep,\n SignInAction,\n SignInCredentials,\n SignInCodeValues,\n SignInNewPasswordValues,\n} from \"./auth/sign-in-form\";\nexport { RegisterForm, DEFAULT_REGISTER_LABELS } from \"./auth/register-form\";\nexport type { RegisterFormProps, RegisterLabels, RegisterValues } from \"./auth/register-form\";\nexport { CompleteNameDialog, DEFAULT_COMPLETE_NAME_LABELS } from \"./auth/complete-name-dialog\";\nexport type { CompleteNameDialogProps, CompleteNameLabels, CompleteNameValues } from \"./auth/complete-name-dialog\";\nexport { taggedEmail } from \"./auth/email-tag\";\nexport { isAuthError, authErrorCode, isBillingError } from \"./auth/auth-errors\";\nexport type { AuthErrorCode } from \"./auth/auth-errors\";\nexport { ForgotPasswordForm, DEFAULT_FORGOT_PASSWORD_LABELS } from \"./auth/forgot-password-form\";\nexport type { ForgotPasswordFormProps, ForgotPasswordLabels } from \"./auth/forgot-password-form\";\nexport { ResetPasswordForm, DEFAULT_RESET_PASSWORD_LABELS } from \"./auth/reset-password-form\";\nexport type {\n ResetPasswordFormProps,\n ResetPasswordLabels,\n ResetPasswordCheck,\n ResetPasswordValues,\n ResetPasswordResult,\n} from \"./auth/reset-password-form\";\nexport { VerifyEmailStatus, EmailVerificationBanner, DEFAULT_VERIFY_EMAIL_LABELS } from \"./auth/verify-email\";\nexport type {\n VerifyEmailStatusProps,\n EmailVerificationBannerProps,\n VerifyEmailLabels,\n VerifyEmailFailure,\n} from \"./auth/verify-email\";\nexport { NotFoundPage, DEFAULT_NOT_FOUND_LABELS } from \"./auth/not-found-page\";\nexport type { NotFoundPageProps, NotFoundLabels } from \"./auth/not-found-page\";\nexport { AcceptInvitation, DEFAULT_ACCEPT_INVITATION_LABELS } from \"./auth/accept-invitation\";\nexport type {\n AcceptInvitationProps,\n AcceptInvitationLabels,\n AcceptInvitationResult,\n AcceptInvitationFailure,\n} from \"./auth/accept-invitation\";\nexport type { AuthHeadingLevel } from \"./auth/status-parts\";\n// 0.30.0: a rate limit and its wait, and the codes the account, billing and demo calls\n// answer with.\nexport { isRateLimited, retryAfterSeconds } from \"./auth/auth-errors\";\nexport type { AccountErrorCode, BillingErrorCode, DemoErrorCode, KitErrorCode } from \"./auth/auth-errors\";\n\n// ── account ──────────────────────────────────────────────────────────────────\n// In account/ since 0.34, beside the other account cards (MOD-8, refactor audit 2026-10):\n// the profile, password and two-factor cards, and (0.12.0) the fourth account section,\n// the passkeys.\nexport * from \"./account/account-settings\";\nexport * from \"./account/passkeys-setting\";\n// 0.30.0 (docs/user-admin-harmonization.md): the account's own settings — email change,\n// sessions, deletion, export. Callbacks only; the confirmation level is the server's.\nexport { EmailChangeSetting, DEFAULT_EMAIL_CHANGE_LABELS } from \"./account/email-change-setting\";\nexport type {\n EmailChangeSettingProps,\n EmailChangeLabels,\n EmailChangeValues,\n EmailChangeAction,\n} from \"./account/email-change-setting\";\nexport { SessionsSetting, DEFAULT_SESSIONS_LABELS } from \"./account/sessions-setting\";\nexport type { SessionsSettingProps, SessionsLabels, SessionItem, SessionId, SessionsAction } from \"./account/sessions-setting\";\nexport { DeleteAccountSetting, DEFAULT_DELETE_ACCOUNT_LABELS } from \"./account/delete-account-setting\";\nexport type {\n DeleteAccountSettingProps,\n DeleteAccountLabels,\n DeleteAccountValues,\n DeletionMode,\n DeleteAccountConsequence,\n} from \"./account/delete-account-setting\";\nexport { DataExportSetting, DEFAULT_DATA_EXPORT_LABELS } from \"./account/data-export-setting\";\nexport type { DataExportSettingProps, DataExportLabels, DataExportFile } from \"./account/data-export-setting\";\n\n// ── admin ────────────────────────────────────────────────────────────────────\n// 0.30.0 (docs/user-admin-harmonization.md): the admin user list and its actions, and the\n// invitations panel. Callbacks only; the confirmation level is the server's.\nexport {\n userRosterColumns,\n useUserRosterColumns,\n UserIdentityCell,\n UserRowActions,\n adminUserStates,\n userRosterSort,\n USER_ROSTER_SORT_KEYS,\n DEFAULT_USER_ROSTER_LABELS,\n} from \"./admin/user-roster\";\nexport type {\n UserRosterRow,\n AdminUserStateFields,\n RosterState,\n UserRosterSortKey,\n UserRosterLabels,\n UserIdentityCellProps,\n UserRowAction,\n UserRowActionList,\n UserRowActionsProps,\n RoleEditing,\n UserRosterColumnsOptions,\n} from \"./admin/user-roster\";\nexport { RoleSelect, RolesEditor, DEFAULT_ROLE_SELECT_LABELS } from \"./admin/role-select\";\nexport type { RoleSelectProps, RolesEditorProps, RoleSelectLabels, RoleLock, RoleLockCode } from \"./admin/role-select\";\nexport { ReviewerScopeEditor, DEFAULT_REVIEWER_SCOPE_LABELS } from \"./admin/reviewer-scope-editor\";\nexport type {\n ReviewerScope,\n ReviewerScopeArea,\n ReviewerScopeLanguage,\n ReviewerScopeLabels,\n ReviewerScopeEditorProps,\n} from \"./admin/reviewer-scope-editor\";\nexport { AdminActionConfirm, DEFAULT_ADMIN_ACTION_LABELS } from \"./admin/admin-action-confirm\";\nexport type {\n AdminConfirmLevel,\n AdminActionConfirmValues,\n AdminActionTarget,\n AdminActionLabels,\n AdminActionConfirmProps,\n} from \"./admin/admin-action-confirm\";\nexport { AdminActionLog, ADMIN_ACTION_KINDS, DEFAULT_ADMIN_ACTION_LOG_LABELS } from \"./admin/admin-action-log\";\nexport type {\n AdminActionKind,\n AdminActionLogEntry,\n AdminActionLogLabels,\n AdminActionLogPaging,\n AdminActionLogProps,\n // 0.34 (docs/user-admin-harmonization.md §11): a log target that is not a person, and\n // the app's noun for its groups.\n AdminGroupTarget,\n AdminOtherTarget,\n AdminGroupNoun,\n} from \"./admin/admin-action-log\";\nexport { TransferOwnershipDialog, DEFAULT_TRANSFER_OWNERSHIP_LABELS } from \"./admin/transfer-ownership-dialog\";\nexport type {\n TransferCandidate,\n TransferUnavailable,\n TransferValues,\n TransferOwnershipLabels,\n TransferOwnershipDialogProps,\n} from \"./admin/transfer-ownership-dialog\";\nexport { InvitationsPanel, DEFAULT_INVITATIONS_LABELS } from \"./admin/invitations-panel\";\nexport type {\n InvitationStatus,\n InvitationRow,\n InvitationDraft,\n InvitationSentAnswer,\n InvitationScope,\n InvitationsLabels,\n InvitationsPanelProps,\n} from \"./admin/invitations-panel\";\nexport type { AdminPerson } from \"./admin/admin-parts\";\n// 0.42.0 (docs/admin-harmonization.md §3.1): the admin area's template — its words, the\n// shared sections and the catalogue helper, the 403 page, the overview and its tiles fed\n// by `GET /admin/attention`, and the Tools list. The menu row is `./shell`'s.\nexport { DEFAULT_ADMIN_AREA_LABELS, useAdminAreaLabels } from \"./admin/admin-area-labels\";\nexport type { AdminAreaLabels, AdminTileLabels, AdminSharedSection } from \"./admin/admin-area-labels\";\nexport { ADMIN_SECTIONS, adminSections } from \"./admin/admin-sections\";\nexport type { AdminSectionDefinition, AdminOwnSection, AdminSectionsOptions } from \"./admin/admin-sections\";\n// 0.43.0 (keksdose): the section order as ids, and the narrowed `leaveOut`.\nexport { adminSectionOrder } from \"./admin/admin-sections\";\nexport type { AdminSectionPlace, AdminSectionOrderOptions, AdminKeptSection } from \"./admin/admin-sections\";\nexport { AdminForbidden } from \"./admin/admin-forbidden\";\nexport type { AdminForbiddenProps } from \"./admin/admin-forbidden\";\nexport { AdminOverview, AttentionTile, adminWaitingCount, DEFAULT_ADMIN_ATTENTION_HREFS } from \"./admin/admin-overview\";\nexport type {\n AdminAttention,\n AdminAttentionTile,\n AdminExtraTile,\n AdminOverviewProps,\n AttentionTileProps,\n // 0.46 (Kurvenschmiede 1): the feedback tiles with the kit's words.\n AdminFeedbackTile,\n AdminFeedbackTileKey,\n AdminOwnTile,\n} from \"./admin/admin-overview\";\nexport { AdminToolLinks } from \"./admin/admin-tool-links\";\nexport type { AdminToolLink, AdminToolLinksProps } from \"./admin/admin-tool-links\";\n// 0.45.0 (docs/admin-harmonization.md §9.2.4): \"Send a test mail to me\".\nexport { MailTestCard, DEFAULT_MAIL_TEST_CARD_LABELS, MAIL_TEST_ANCHOR, maskMailAddress } from \"./admin/mail-test-card\";\nexport type { MailTestCardProps, MailTestCardLabels, MailTestAnswer } from \"./admin/mail-test-card\";\n// 0.33.0: the operator's plan parts (docs/billing-harmonization.md §14.12).\nexport {\n planColumn,\n usePlanColumn,\n PlanChangeConfirm,\n usePlanChangeResult,\n DEFAULT_PLAN_CHANGE_LABELS,\n} from \"./admin/plan-change\";\nexport type {\n PlanChangeLabels,\n PlanColumnOptions,\n PlanColumnUsage,\n PlanChange,\n PlanChangeConfirmProps,\n PlanChangeOutcome,\n PlanChangeTone,\n PlanChangeLine,\n PlanChangeResultOptions,\n} from \"./admin/plan-change\";\n\n// ── billing ──────────────────────────────────────────────────────────────────\n// 0.32.0: plans, standing, banners, the limit notice (docs/billing-harmonization.md §7).\nexport { DEFAULT_BILLING_LABELS, useBillingLabels, SUBSCRIPTION_STATUSES } from \"./billing/billing-labels\";\nexport type { BillingLabels, SubscriptionStatus } from \"./billing/billing-labels\";\nexport { BILLING_INTERVALS, planPrice, minorToMajor, formatPlanPrice, billingCurrencyFor } from \"./billing/plan-price\";\nexport type { BillingInterval, BillingCurrency, PlanIntervalPrices, PlanPrices, PlanPriceAnswer } from \"./billing/plan-price\";\nexport { PlanCard, PlanPicker, GrantWarningConfirm, planRelation } from \"./billing/plan-card\";\nexport type { BillingPlan, PlanRelation, PlanCardProps, PlanPickerProps, PlanChoice, GrantWarningConfirmProps } from \"./billing/plan-card\";\nexport { SubscriptionStatusChip, SUBSCRIPTION_STATUS_TONES } from \"./billing/subscription-status-chip\";\nexport type { SubscriptionStatusChipProps } from \"./billing/subscription-status-chip\";\nexport { BillingBanner } from \"./billing/billing-banner\";\nexport type { BillingBannerProps, BillingBannerKind } from \"./billing/billing-banner\";\nexport { PlanLimitNotice, planLimitMailto } from \"./billing/plan-limit-notice\";\nexport type { PlanLimitNoticeProps } from \"./billing/plan-limit-notice\";\nexport { isPlanLimit } from \"./billing/plan-limit\";\nexport type { PlanLimitRefusal } from \"./billing/plan-limit\";\n// 0.33.0: sources name their kind, the combined lock holds them all, and billing's is one\n// hook (docs/billing-harmonization.md §12.36).\nexport { combineWriteLocks, useBillingLockReason, useBillingWriteLock } from \"./billing/billing-lock\";\nexport type { WriteLockSource, CombinedWriteLock, BillingLockReasonOptions } from \"./billing/billing-lock\";\nexport { billingLockAt, isBillingReadOnly, billingDaysLeft } from \"./billing/billing-standing\";\nexport type { BillingStanding } from \"./billing/billing-standing\";\nexport { SubscriptionActions } from \"./billing/subscription-actions\";\nexport type { SubscriptionActionsProps } from \"./billing/subscription-actions\";\n// 0.33.0, billing's round 0.33 (docs/billing-harmonization.md §14):\n// the way back from a checkout and its \"processing\", router-agnostic (§14.4).\nexport {\n CHECKOUT_RETURN_PARAM,\n CHECKOUT_RETURN_VALUE,\n isCheckoutReturn,\n withoutCheckoutReturn,\n checkoutReturnUrl,\n} from \"./billing/checkout-return\";\nexport { checkoutFingerprint, checkoutLanded, noteCheckoutStarted, useCheckoutProcessing } from \"./billing/checkout-processing\";\nexport type { CheckoutOverview, CheckoutProcessingOptions } from \"./billing/checkout-processing\";\n// The link to the pay page and Paddle's locale (§14.4); the page itself ships as dist/pay/.\nexport { PAY_PAGE_LANG_PARAM, paddleLocale, payPageUrl } from \"./billing/pay-page\";\nexport type { PaddleEnvironment } from \"./billing/pay-page\";\n// 0.39 (§15.2.6): the apps every pay page serves, by their `billing_app` tag.\nexport { PAY_PAGE_APPS } from \"./billing/pay-page\";\nexport type { PayPageApp } from \"./billing/pay-page\";\n// The API's shapes the parts read, server-kit 0.7's (§4, §14.5), and the plan limit as\n// a toast (§14.11).\nexport type { BillingOverview, SubscriptionSource, PortalTarget, PortalRequest } from \"./billing/billing-overview\";\nexport { usePlanLimitToast } from \"./billing/plan-limit-toast\";\nexport type { PlanLimitToastOptions } from \"./billing/plan-limit-toast\";\n// 0.39 (§15.2.10): the payer's plan switch, its shapes, and what the payer pays.\nexport { PlanSwitchConfirm } from \"./billing/plan-switch\";\nexport type { PlanSwitchConfirmProps, PlanSwitchSide } from \"./billing/plan-switch\";\nexport type { PaidPrice, PlanSwitchRequest, PlanSwitchPreview } from \"./billing/billing-overview\";\n// 0.42 (§16): the portal for the buyer only, the in-app cancel, the permanent-grant warning.\nexport { isPermanentGrant } from \"./billing/billing-overview\";\nexport type { BillingPortalAccess } from \"./billing/billing-overview\";\nexport { CancelSubscriptionConfirm } from \"./billing/cancel-subscription\";\nexport type { CancelSubscriptionConfirmProps } from \"./billing/cancel-subscription\";\n// 0.43 (§17): the provider's portal in a new tab; the in-app cancel's follow-up.\nexport { openProviderPage } from \"./billing/provider-page\";\nexport type { OpenProviderPageOptions, ProviderPageWay } from \"./billing/provider-page\";\nexport { useCancelRequest } from \"./billing/cancel-request\";\nexport type { CancelRequest, CancelRequested, CancelRequestView } from \"./billing/cancel-request\";\n// The operator's plan parts (§14.12) are admin/plan-change, in the admin section.\n\n// ── settings ─────────────────────────────────────────────────────────────────\n// 0.31.0 (docs/settings-harmonization.md): the settings page and the admin page on one\n// shell. The router-aware layout with its\n// route and focus hooks, and the router-free section, context, heading level and catalogue,\n// come with `./shell` above (also `@eifi1/ui-kit/shell`).\nexport { DEFAULT_SETTINGS_LABELS, useSettingsLabels } from \"./settings/settings-labels\";\nexport type { SettingsLabels, SettingsGroupLabels, SettingsCoreGroup } from \"./settings/settings-labels\";\n// 0.36.0 (§11): \"Reset this device's settings\" — the registry the kit's stores, provider\n// and shell join on their own and an app adds its own device keys to, and the card, the\n// appearance group's last.\nexport { registerDeviceSetting, deviceSettings, resetDeviceSettings } from \"./lib/device-settings\";\nexport type { DeviceSetting, DeviceSettingKind } from \"./lib/device-settings\";\nexport { DeviceResetSetting, DEVICE_RESET_ANCHOR, DEFAULT_DEVICE_RESET_LABELS } from \"./settings/device-reset-setting\";\nexport type { DeviceResetSettingProps, DeviceResetLabels } from \"./settings/device-reset-setting\";\n// The language follows the account (§6.2); since 0.32 so do the text size and the\n// contrast (useAccountAppearance below, docs/text-size-harmonization.md §6).\nexport { useAccountLanguage, resolveAccountLanguage, matchOfferedLanguage } from \"./settings/use-account-language\";\nexport type {\n UseAccountLanguageOptions,\n AccountLanguage,\n AccountLanguageSource,\n ResolveAccountLanguageInput,\n ResolvedAccountLanguage,\n} from \"./settings/use-account-language\";\nexport { useAccountAppearance, resolveAccountAppearance } from \"./settings/use-account-appearance\";\nexport type {\n AppearanceSource,\n AccountAppearanceFields,\n DeviceAppearance,\n AccountAppearancePatch,\n ResolvedAccountAppearance,\n UseAccountAppearanceOptions,\n AccountAppearance,\n} from \"./settings/use-account-appearance\";\n\n// ── notifications ────────────────────────────────────────────────────────────\n// 0.36.0 (docs/notifications-harmonization.md §4.2): the notification cards — the types\n// the server answers (the kit keeps no list of its own), quiet hours with the zone picker,\n// this device's push on its hook, the device list — and the signed-out unsubscribe page.\n// Each card takes the app's request functions; the kit makes no request itself.\nexport { DEFAULT_NOTIFICATIONS_LABELS } from \"./notifications/notifications-labels\";\nexport type { NotificationsLabels, NotificationRegionLabels } from \"./notifications/notifications-labels\";\nexport type {\n DigestCadence,\n NotificationSwitches,\n NotificationTypesValue,\n NotificationTypeEntry,\n NotificationTypeGroup,\n NotificationSettingsPatch,\n PushDeviceItem,\n NotificationChannel,\n} from \"./notifications/notification-types\";\nexport { NotificationTypesSetting } from \"./notifications/notification-types-setting\";\nexport type { NotificationTypesSettingProps } from \"./notifications/notification-types-setting\";\nexport { QuietHoursSetting } from \"./notifications/quiet-hours-setting\";\nexport type { QuietHoursSettingProps } from \"./notifications/quiet-hours-setting\";\nexport { TimeZoneSelect, timeZoneOptions } from \"./notifications/time-zone-select\";\nexport type { TimeZoneSelectProps } from \"./notifications/time-zone-select\";\n// 0.46 (docs/notifications-harmonization.md §10.1, §10.3): the inbox list, the bell and\n// the device-zone report (the account's zone is automatic only, amended 2026-10-20).\nexport { NotificationInbox, INBOX_BADGE_INTERVAL } from \"./notifications/notification-inbox\";\nexport type {\n NotificationInboxAction,\n NotificationInboxItem,\n NotificationInboxProps,\n} from \"./notifications/notification-inbox\";\nexport { NotificationBell } from \"./notifications/notification-bell\";\nexport type { NotificationBellProps } from \"./notifications/notification-bell\";\n// `deviceTimeZone` lives beside the report since 0.46.1 (keksdose N6; sign-up needs it).\nexport { useDeviceZoneReport, deviceTimeZone } from \"./notifications/device-zone-report\";\nexport type { DeviceZoneReportOptions } from \"./notifications/device-zone-report\";\nexport {\n usePushDevice,\n PUSH_SUBSCRIPTION_CHANGED,\n notifyPushSubscriptionChanged,\n pushSupported,\n PushDeviceError,\n} from \"./notifications/use-push-device\";\nexport type {\n PushDevice,\n UsePushDeviceOptions,\n PushSubscriptionInput,\n PushPermission,\n PushDeviceErrorCode,\n} from \"./notifications/use-push-device\";\n// 0.46 (NT:1028): the service worker re-registers a rotated subscription. A worker imports\n// them from `@eifi1/ui-kit/push-worker` (§10.6 rule 5); the barrel keeps them too.\nexport {\n handlePushSubscriptionChange,\n resubscribeAfterChange,\n pushSubscriptionInput,\n} from \"./notifications/push-worker\";\nexport type {\n PushReplaceInput,\n PushSubscriptionChangeOptions,\n PushSubscriptionChangeEventLike,\n PushResubscribeOutcome,\n PushWorkerScope,\n} from \"./notifications/push-worker\";\nexport { PushDeviceSetting } from \"./notifications/push-device-setting\";\nexport type { PushDeviceSettingProps, PushDeviceAction } from \"./notifications/push-device-setting\";\nexport { PushDevicesSetting, describeUserAgent } from \"./notifications/push-devices-setting\";\nexport type { PushDevicesSettingProps } from \"./notifications/push-devices-setting\";\nexport { UnsubscribePanel, unsubscribeTokenType } from \"./notifications/unsubscribe-panel\";\nexport type { UnsubscribePanelProps } from \"./notifications/unsubscribe-panel\";\n// 0.38.0 (docs/feedback-harmonization.md §9.11): the two feedback types' setting words.\n// 0.46.1 (keksdose N9): `useFeedbackNotificationTypesLabels`, the words resolved, for `adminGroup`.\nexport {\n useFeedbackNotificationTypes,\n useFeedbackNotificationTypesLabels,\n DEFAULT_FEEDBACK_NOTIFICATION_TYPES_LABELS,\n} from \"./notifications/feedback-notification-types\";\nexport type {\n FeedbackNotificationTypeId,\n FeedbackNotificationTypesLabels,\n} from \"./notifications/feedback-notification-types\";\n\n// ── landing ──────────────────────────────────────────────────────────────────\n// 0.31.0 (docs/landing-demo-harmonization.md): the public landing page. Its router-aware parts — the header and the resume (RootEntry,\n// RedirectIfAuthed, the last-visited page) — come with `./shell` above.\nexport { DEFAULT_LANDING_LABELS, useLandingLabels } from \"./landing/landing-labels\";\nexport type { LandingLabels } from \"./landing/landing-labels\";\nexport { accessAction, useAccessAction } from \"./landing/access\";\nexport type { AccessChoice, AccessLink, AccessLabels } from \"./landing/access\";\nexport { LandingActions } from \"./landing/landing-actions\";\nexport type { LandingActionsProps, LandingSession } from \"./landing/landing-actions\";\nexport { Hero, FeatureRows, FeatureRow, TrustStrip, CtaBand, PublicFooter } from \"./landing/landing-sections\";\nexport type {\n HeroProps,\n FeatureRowsProps,\n FeatureRowProps,\n TrustItem,\n TrustStripProps,\n CtaBandProps,\n PublicFooterProps,\n} from \"./landing/landing-sections\";\nexport { usePageSeo, seoCopyProblems, metaContent } from \"./landing/page-seo\";\nexport type { SeoCopy, SeoCopyLimits, SeoCopyProblem, SeoCopyProblemCode } from \"./landing/page-seo\";\n\n// ── demo ─────────────────────────────────────────────────────────────────────\n// 0.31.0 (docs/landing-demo-harmonization.md): the demo's start, banner, countdown and end.\nexport { DEFAULT_DEMO_LABELS, useDemoLabels } from \"./demo/demo-labels\";\nexport type { DemoLabels } from \"./demo/demo-labels\";\nexport { isDemoSession } from \"./demo/demo-session\";\nexport type { DemoModel, DemoSessionUser } from \"./demo/demo-session\";\nexport { useDemoCountdown, demoCountdown, DEMO_WARNING_MINUTES, DEMO_MINUTES_ONLY } from \"./demo/demo-countdown\";\nexport type { DemoCountdown, DemoCountdownOptions, DemoExpiry } from \"./demo/demo-countdown\";\nexport { DemoStart } from \"./demo/demo-start\";\nexport type { DemoStartProps } from \"./demo/demo-start\";\nexport { DemoBanner } from \"./demo/demo-banner\";\nexport type { DemoBannerProps } from \"./demo/demo-banner\";\nexport { DemoEnded } from \"./demo/demo-ended\";\nexport type { DemoEndedProps } from \"./demo/demo-ended\";\n"],"mappings":"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","names":[]}
@@ -0,0 +1,81 @@
1
+ import type { KitDateFormatter } from "../i18n/kit-labels.js";
2
+ /**
3
+ * The date-format preference (0.46, lifted from keksdose's `date-format-store.ts`,
4
+ * feedback #180): how a DAY is written — the order of day, month and year and the
5
+ * separator between them — as a choice of its own, apart from the interface language.
6
+ * "Read the app in English and still see German dates", or ISO everywhere.
7
+ *
8
+ * keksdose's rules, which the kit keeps:
9
+ *
10
+ * 1. **A label that identifies a day follows the preference** — anything that prints
11
+ * day, month and year goes through {@link formatDateWithPreference} (or the
12
+ * provider's `formatDate`, {@link dateFormatterFor}, for the kit's own date fields).
13
+ * 2. **A label without a day follows the language**: "August 2026", a month or weekday
14
+ * NAME has no order to arrange. {@link dateFormatterFor} answers `""` for a month or a
15
+ * year, so the kit keeps its own rendering in the language.
16
+ * 3. **A clock time follows the language**: `sv-SE` is a statement about digit order in
17
+ * a date, not about a 12- or 24-hour clock.
18
+ * 4. **A weekday's NAME follows the language** (dev#546): `sv-SE` means "year first,
19
+ * with dashes", not "the reader speaks Swedish" — so with `weekday` the day's name is
20
+ * the language's, joined to the date the preference renders.
21
+ *
22
+ * The preference is the APP's to keep — keksdose holds it per device (a persisted store,
23
+ * not an account column: nothing server-written formats a date for the reader). The kit
24
+ * owns the vocabulary, the resolver, the renderer and the settings field
25
+ * ({@link DateFormatSetting}).
26
+ */
27
+ /** `"auto"` follows the interface language (the default — nobody's dates move until
28
+ * they ask); the rest are BCP 47 tags chosen for the SHAPE they produce: German
29
+ * 01.08.2026, British 01/08/2026, US 08/01/2026, ISO 2026-08-01. */
30
+ export type DateFormatPreference = "auto" | "de-DE" | "en-GB" | "en-US" | "sv-SE";
31
+ /** The options in the order the setting lists them: `auto` first (the default), then
32
+ * German → UK → US → ISO. */
33
+ export declare const DATE_FORMAT_PREFERENCES: readonly DateFormatPreference[];
34
+ /** Whether `value` is one of {@link DATE_FORMAT_PREFERENCES} — for a value read back from
35
+ * storage, where anything else falls back to `"auto"`. */
36
+ export declare function isDateFormatPreference(value: unknown): value is DateFormatPreference;
37
+ /** A resolved preference: the locale and `Intl` options the date itself is rendered
38
+ * with, and — only when asked for — the locale the weekday's NAME comes from. */
39
+ export interface ResolvedDateFormat {
40
+ locale: string | undefined;
41
+ options: Intl.DateTimeFormatOptions;
42
+ /** The language's format locale, present when `weekday` was asked for. */
43
+ weekday?: {
44
+ locale: string | undefined;
45
+ };
46
+ }
47
+ /** What {@link resolveDateFormat} and the renderers take beyond the preference. */
48
+ export interface DateFormatOptions {
49
+ /** Name the day of the week too, in the interface language ("Mo., 01.08.2026"). A date
50
+ * in a COLUMN carries it; a date in a SENTENCE does not (keksdose dev#546). */
51
+ weekday?: boolean;
52
+ }
53
+ /**
54
+ * What a date is rendered with, given the preference and the interface language
55
+ * (`language`: a code or tag — `"de"`, `"en"`, i18next's `resolvedLanguage`; it is read
56
+ * through `formatLocaleOf`, so English is British and an unshipped tag stays itself).
57
+ *
58
+ * `"auto"` keeps the short-month shape ("01 Aug 2026", "01. Aug. 2026"); every explicit
59
+ * choice is all-numeric, the only way it produces the shape its option promises —
60
+ * `month: "short"` under `sv-SE` would print "2026 aug. 01", not ISO.
61
+ */
62
+ export declare function resolveDateFormat(preference: DateFormatPreference, language: string | undefined, options?: DateFormatOptions): ResolvedDateFormat;
63
+ /**
64
+ * A date under the preference: `""` for no value, the input itself when it does not
65
+ * parse. A bare "YYYY-MM-DD" is the calendar day it names in every zone (formatted in
66
+ * UTC, undoing `new Date`'s UTC-midnight parse — west of Greenwich it read a day early);
67
+ * a timestamp is an instant and stays in the reader's zone. The weekday, when asked for,
68
+ * is rendered in the same zone, so a Sunday is never captioned Saturday.
69
+ */
70
+ export declare function formatDateWithPreference(value: string | Date | null | undefined, preference: DateFormatPreference, language: string | undefined, options?: DateFormatOptions): string;
71
+ /** The sample an option is labelled with — 1 August 2026 in its shape, the shape being
72
+ * the whole choice (a country name would say nothing about the digit order). */
73
+ export declare function dateFormatSample(preference: DateFormatPreference, language: string | undefined): string;
74
+ /**
75
+ * The `<UiKitProvider formatDate>` for a preference — so the kit's own date fields
76
+ * (DatePicker, DateRangePicker, DateMark) write a day as the app's dates do. A day
77
+ * follows the preference, with the weekday where the kit suggests it; a month or a year
78
+ * answers `""` and keeps the kit's rendering in the language (rule 2). Rebuild it when
79
+ * the preference or the language changes (a `useMemo` on both).
80
+ */
81
+ export declare function dateFormatterFor(preference: DateFormatPreference, language: string | undefined): KitDateFormatter;
@@ -0,0 +1,56 @@
1
+ "use client";
2
+ import { formatLocaleOf } from "../i18n/languages.js";
3
+ const DATE_FORMAT_PREFERENCES = ["auto", "de-DE", "en-GB", "en-US", "sv-SE"];
4
+ function isDateFormatPreference(value) {
5
+ return typeof value === "string" && DATE_FORMAT_PREFERENCES.includes(value);
6
+ }
7
+ function resolveDateFormat(preference, language, options = {}) {
8
+ const languageLocale = language ? formatLocaleOf(language) : void 0;
9
+ const weekday = options.weekday ? { weekday: { locale: languageLocale } } : {};
10
+ if (preference === "auto") {
11
+ return { locale: languageLocale, options: { year: "numeric", month: "short", day: "2-digit" }, ...weekday };
12
+ }
13
+ return { locale: preference, options: { year: "numeric", month: "2-digit", day: "2-digit" }, ...weekday };
14
+ }
15
+ const DATE_ONLY = /^\d{4}-\d{2}-\d{2}$/;
16
+ function withWeekday(date, dateText, locale, options) {
17
+ const isDatePart = (p) => p.type === "day" || p.type === "month" || p.type === "year";
18
+ const parts = new Intl.DateTimeFormat(locale, { weekday: "short", ...options }).formatToParts(date);
19
+ const first = parts.findIndex(isDatePart);
20
+ if (first === -1) return dateText;
21
+ let last = first;
22
+ parts.forEach((p, i) => {
23
+ if (isDatePart(p)) last = i;
24
+ });
25
+ const join = (ps) => ps.map((p) => p.value).join("");
26
+ return join(parts.slice(0, first)) + dateText + join(parts.slice(last + 1));
27
+ }
28
+ function formatDateWithPreference(value, preference, language, options = {}) {
29
+ if (!value) return "";
30
+ const resolved = resolveDateFormat(preference, language, options);
31
+ const dateOnly = typeof value === "string" && DATE_ONLY.test(value);
32
+ const date = typeof value === "string" ? new Date(value) : value;
33
+ if (Number.isNaN(date.getTime())) return String(value);
34
+ const intl = dateOnly ? { ...resolved.options, timeZone: "UTC" } : resolved.options;
35
+ try {
36
+ const text = date.toLocaleDateString(resolved.locale, intl);
37
+ return resolved.weekday ? withWeekday(date, text, resolved.weekday.locale, intl) : text;
38
+ } catch {
39
+ return date.toISOString().slice(0, 10);
40
+ }
41
+ }
42
+ function dateFormatSample(preference, language) {
43
+ return formatDateWithPreference("2026-08-01", preference, language);
44
+ }
45
+ function dateFormatterFor(preference, language) {
46
+ return (iso, { unit, weekday, locale }) => unit === "day" ? formatDateWithPreference(iso, preference, locale ?? language, { weekday }) : "";
47
+ }
48
+ export {
49
+ DATE_FORMAT_PREFERENCES,
50
+ dateFormatSample,
51
+ dateFormatterFor,
52
+ formatDateWithPreference,
53
+ isDateFormatPreference,
54
+ resolveDateFormat
55
+ };
56
+ //# sourceMappingURL=date-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/date-format.ts"],"sourcesContent":["import { formatLocaleOf } from \"../i18n/languages\";\nimport type { KitDateFormatter } from \"../i18n/kit-labels\";\n\n/**\n * The date-format preference (0.46, lifted from keksdose's `date-format-store.ts`,\n * feedback #180): how a DAY is written — the order of day, month and year and the\n * separator between them — as a choice of its own, apart from the interface language.\n * \"Read the app in English and still see German dates\", or ISO everywhere.\n *\n * keksdose's rules, which the kit keeps:\n *\n * 1. **A label that identifies a day follows the preference** — anything that prints\n * day, month and year goes through {@link formatDateWithPreference} (or the\n * provider's `formatDate`, {@link dateFormatterFor}, for the kit's own date fields).\n * 2. **A label without a day follows the language**: \"August 2026\", a month or weekday\n * NAME has no order to arrange. {@link dateFormatterFor} answers `\"\"` for a month or a\n * year, so the kit keeps its own rendering in the language.\n * 3. **A clock time follows the language**: `sv-SE` is a statement about digit order in\n * a date, not about a 12- or 24-hour clock.\n * 4. **A weekday's NAME follows the language** (dev#546): `sv-SE` means \"year first,\n * with dashes\", not \"the reader speaks Swedish\" — so with `weekday` the day's name is\n * the language's, joined to the date the preference renders.\n *\n * The preference is the APP's to keep — keksdose holds it per device (a persisted store,\n * not an account column: nothing server-written formats a date for the reader). The kit\n * owns the vocabulary, the resolver, the renderer and the settings field\n * ({@link DateFormatSetting}).\n */\n\n/** `\"auto\"` follows the interface language (the default — nobody's dates move until\n * they ask); the rest are BCP 47 tags chosen for the SHAPE they produce: German\n * 01.08.2026, British 01/08/2026, US 08/01/2026, ISO 2026-08-01. */\nexport type DateFormatPreference = \"auto\" | \"de-DE\" | \"en-GB\" | \"en-US\" | \"sv-SE\";\n\n/** The options in the order the setting lists them: `auto` first (the default), then\n * German → UK → US → ISO. */\nexport const DATE_FORMAT_PREFERENCES: readonly DateFormatPreference[] = [\"auto\", \"de-DE\", \"en-GB\", \"en-US\", \"sv-SE\"];\n\n/** Whether `value` is one of {@link DATE_FORMAT_PREFERENCES} — for a value read back from\n * storage, where anything else falls back to `\"auto\"`. */\nexport function isDateFormatPreference(value: unknown): value is DateFormatPreference {\n return typeof value === \"string\" && (DATE_FORMAT_PREFERENCES as readonly string[]).includes(value);\n}\n\n/** A resolved preference: the locale and `Intl` options the date itself is rendered\n * with, and — only when asked for — the locale the weekday's NAME comes from. */\nexport interface ResolvedDateFormat {\n locale: string | undefined;\n options: Intl.DateTimeFormatOptions;\n /** The language's format locale, present when `weekday` was asked for. */\n weekday?: { locale: string | undefined };\n}\n\n/** What {@link resolveDateFormat} and the renderers take beyond the preference. */\nexport interface DateFormatOptions {\n /** Name the day of the week too, in the interface language (\"Mo., 01.08.2026\"). A date\n * in a COLUMN carries it; a date in a SENTENCE does not (keksdose dev#546). */\n weekday?: boolean;\n}\n\n/**\n * What a date is rendered with, given the preference and the interface language\n * (`language`: a code or tag — `\"de\"`, `\"en\"`, i18next's `resolvedLanguage`; it is read\n * through `formatLocaleOf`, so English is British and an unshipped tag stays itself).\n *\n * `\"auto\"` keeps the short-month shape (\"01 Aug 2026\", \"01. Aug. 2026\"); every explicit\n * choice is all-numeric, the only way it produces the shape its option promises —\n * `month: \"short\"` under `sv-SE` would print \"2026 aug. 01\", not ISO.\n */\nexport function resolveDateFormat(\n preference: DateFormatPreference,\n language: string | undefined,\n options: DateFormatOptions = {},\n): ResolvedDateFormat {\n const languageLocale = language ? formatLocaleOf(language) : undefined;\n const weekday = options.weekday ? { weekday: { locale: languageLocale } } : {};\n if (preference === \"auto\") {\n return { locale: languageLocale, options: { year: \"numeric\", month: \"short\", day: \"2-digit\" }, ...weekday };\n }\n return { locale: preference, options: { year: \"numeric\", month: \"2-digit\", day: \"2-digit\" }, ...weekday };\n}\n\n/** A bare calendar day: no time, no zone. */\nconst DATE_ONLY = /^\\d{4}-\\d{2}-\\d{2}$/;\n\n/**\n * `dateText`, already rendered under the preference, with the day's NAME around it in\n * `locale` (the language's). Not \"weekday alone + comma\": German says \"So\" alone and\n * \"So., 06.09.2026\" in company. The full date is formatted in the language and split\n * into parts; what that language puts before the first and after the last day/month/\n * year part (the weekday, its comma) frames the preference's digits — so where the two\n * locales coincide the output is the native string, character for character.\n */\nfunction withWeekday(date: Date, dateText: string, locale: string | undefined, options: Intl.DateTimeFormatOptions) {\n const isDatePart = (p: Intl.DateTimeFormatPart) => p.type === \"day\" || p.type === \"month\" || p.type === \"year\";\n const parts = new Intl.DateTimeFormat(locale, { weekday: \"short\", ...options }).formatToParts(date);\n const first = parts.findIndex(isDatePart);\n if (first === -1) return dateText;\n let last = first;\n parts.forEach((p, i) => {\n if (isDatePart(p)) last = i;\n });\n const join = (ps: Intl.DateTimeFormatPart[]) => ps.map((p) => p.value).join(\"\");\n return join(parts.slice(0, first)) + dateText + join(parts.slice(last + 1));\n}\n\n/**\n * A date under the preference: `\"\"` for no value, the input itself when it does not\n * parse. A bare \"YYYY-MM-DD\" is the calendar day it names in every zone (formatted in\n * UTC, undoing `new Date`'s UTC-midnight parse — west of Greenwich it read a day early);\n * a timestamp is an instant and stays in the reader's zone. The weekday, when asked for,\n * is rendered in the same zone, so a Sunday is never captioned Saturday.\n */\nexport function formatDateWithPreference(\n value: string | Date | null | undefined,\n preference: DateFormatPreference,\n language: string | undefined,\n options: DateFormatOptions = {},\n): string {\n if (!value) return \"\";\n const resolved = resolveDateFormat(preference, language, options);\n const dateOnly = typeof value === \"string\" && DATE_ONLY.test(value);\n const date = typeof value === \"string\" ? new Date(value) : value;\n if (Number.isNaN(date.getTime())) return String(value);\n const intl: Intl.DateTimeFormatOptions = dateOnly ? { ...resolved.options, timeZone: \"UTC\" } : resolved.options;\n try {\n const text = date.toLocaleDateString(resolved.locale, intl);\n return resolved.weekday ? withWeekday(date, text, resolved.weekday.locale, intl) : text;\n } catch {\n // A language tag `Intl` refuses: the ISO day rather than nothing (keksdose's fallback).\n return date.toISOString().slice(0, 10);\n }\n}\n\n/** The sample an option is labelled with — 1 August 2026 in its shape, the shape being\n * the whole choice (a country name would say nothing about the digit order). */\nexport function dateFormatSample(preference: DateFormatPreference, language: string | undefined): string {\n return formatDateWithPreference(\"2026-08-01\", preference, language);\n}\n\n/**\n * The `<UiKitProvider formatDate>` for a preference — so the kit's own date fields\n * (DatePicker, DateRangePicker, DateMark) write a day as the app's dates do. A day\n * follows the preference, with the weekday where the kit suggests it; a month or a year\n * answers `\"\"` and keeps the kit's rendering in the language (rule 2). Rebuild it when\n * the preference or the language changes (a `useMemo` on both).\n */\nexport function dateFormatterFor(preference: DateFormatPreference, language: string | undefined): KitDateFormatter {\n return (iso, { unit, weekday, locale }) =>\n unit === \"day\" ? formatDateWithPreference(iso, preference, locale ?? language, { weekday }) : \"\";\n}\n"],"mappings":";AAAA,SAAS,sBAAsB;AAoCxB,MAAM,0BAA2D,CAAC,QAAQ,SAAS,SAAS,SAAS,OAAO;AAI5G,SAAS,uBAAuB,OAA+C;AACpF,SAAO,OAAO,UAAU,YAAa,wBAA8C,SAAS,KAAK;AACnG;AA2BO,SAAS,kBACd,YACA,UACA,UAA6B,CAAC,GACV;AACpB,QAAM,iBAAiB,WAAW,eAAe,QAAQ,IAAI;AAC7D,QAAM,UAAU,QAAQ,UAAU,EAAE,SAAS,EAAE,QAAQ,eAAe,EAAE,IAAI,CAAC;AAC7E,MAAI,eAAe,QAAQ;AACzB,WAAO,EAAE,QAAQ,gBAAgB,SAAS,EAAE,MAAM,WAAW,OAAO,SAAS,KAAK,UAAU,GAAG,GAAG,QAAQ;AAAA,EAC5G;AACA,SAAO,EAAE,QAAQ,YAAY,SAAS,EAAE,MAAM,WAAW,OAAO,WAAW,KAAK,UAAU,GAAG,GAAG,QAAQ;AAC1G;AAGA,MAAM,YAAY;AAUlB,SAAS,YAAY,MAAY,UAAkB,QAA4B,SAAqC;AAClH,QAAM,aAAa,CAAC,MAA+B,EAAE,SAAS,SAAS,EAAE,SAAS,WAAW,EAAE,SAAS;AACxG,QAAM,QAAQ,IAAI,KAAK,eAAe,QAAQ,EAAE,SAAS,SAAS,GAAG,QAAQ,CAAC,EAAE,cAAc,IAAI;AAClG,QAAM,QAAQ,MAAM,UAAU,UAAU;AACxC,MAAI,UAAU,GAAI,QAAO;AACzB,MAAI,OAAO;AACX,QAAM,QAAQ,CAAC,GAAG,MAAM;AACtB,QAAI,WAAW,CAAC,EAAG,QAAO;AAAA,EAC5B,CAAC;AACD,QAAM,OAAO,CAAC,OAAkC,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE;AAC9E,SAAO,KAAK,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,WAAW,KAAK,MAAM,MAAM,OAAO,CAAC,CAAC;AAC5E;AASO,SAAS,yBACd,OACA,YACA,UACA,UAA6B,CAAC,GACtB;AACR,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,WAAW,kBAAkB,YAAY,UAAU,OAAO;AAChE,QAAM,WAAW,OAAO,UAAU,YAAY,UAAU,KAAK,KAAK;AAClE,QAAM,OAAO,OAAO,UAAU,WAAW,IAAI,KAAK,KAAK,IAAI;AAC3D,MAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,EAAG,QAAO,OAAO,KAAK;AACrD,QAAM,OAAmC,WAAW,EAAE,GAAG,SAAS,SAAS,UAAU,MAAM,IAAI,SAAS;AACxG,MAAI;AACF,UAAM,OAAO,KAAK,mBAAmB,SAAS,QAAQ,IAAI;AAC1D,WAAO,SAAS,UAAU,YAAY,MAAM,MAAM,SAAS,QAAQ,QAAQ,IAAI,IAAI;AAAA,EACrF,QAAQ;AAEN,WAAO,KAAK,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,EACvC;AACF;AAIO,SAAS,iBAAiB,YAAkC,UAAsC;AACvG,SAAO,yBAAyB,cAAc,YAAY,QAAQ;AACpE;AASO,SAAS,iBAAiB,YAAkC,UAAgD;AACjH,SAAO,CAAC,KAAK,EAAE,MAAM,SAAS,OAAO,MACnC,SAAS,QAAQ,yBAAyB,KAAK,YAAY,UAAU,UAAU,EAAE,QAAQ,CAAC,IAAI;AAClG;","names":[]}
@@ -115,6 +115,9 @@ export declare function toDate(value: DateInput): Date | null;
115
115
  */
116
116
  export declare function formatDate(value: DateInput, style?: FormatDateStyle | Intl.DateTimeFormatOptions, options?: FormatDateOptions): string;
117
117
  export interface FormatRelativeTimeOptions extends BaseOptions {
118
+ /** The zone of the date printed past `absoluteAfterDays` (0.46). Left out: the
119
+ * device's. */
120
+ timeZone?: string;
118
121
  /** The moment it is measured from. Default: now. */
119
122
  now?: DateInput;
120
123
  /** `"auto"` (default): "yesterday", "now", "next week". `"always"`: "1 day ago". */
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { useMemo } from "react";
3
- import { useKitLocale } from "../i18n/kit-labels.js";
3
+ import { useKitLocale, useKitTimeZone } from "../i18n/kit-labels.js";
4
4
  import { parseIsoDate } from "./dates.js";
5
5
  import { roundHalfAway } from "./round.js";
6
6
  const EMPTY_FORMATTED_VALUE = "\u2014";
@@ -132,16 +132,17 @@ function formatRelativeTime(value, options = {}) {
132
132
  }
133
133
  function useKitFormat(locale) {
134
134
  const kitLocale = useKitLocale(locale);
135
+ const timeZone = useKitTimeZone();
135
136
  return useMemo(
136
137
  () => ({
137
138
  locale: kitLocale,
138
139
  formatNumber: (value, options) => formatNumber(value, { locale: kitLocale, ...options }),
139
140
  formatMoney: (value, currency, options) => formatMoney(value, currency, { locale: kitLocale, ...options }),
140
141
  formatPercent: (value, options) => formatPercent(value, { locale: kitLocale, ...options }),
141
- formatDate: (value, style, options) => formatDate(value, style, { locale: kitLocale, ...options }),
142
- formatRelativeTime: (value, options) => formatRelativeTime(value, { locale: kitLocale, ...options })
142
+ formatDate: (value, style, options) => formatDate(value, style, { locale: kitLocale, timeZone, ...options }),
143
+ formatRelativeTime: (value, options) => formatRelativeTime(value, { locale: kitLocale, timeZone, ...options })
143
144
  }),
144
- [kitLocale]
145
+ [kitLocale, timeZone]
145
146
  );
146
147
  }
147
148
  function currencyMinorDigits(currency) {