@eifi1/ui-kit 0.32.0 → 0.32.2

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 (216) hide show
  1. package/dist/account/delete-account-setting.d.ts +1 -1
  2. package/dist/admin/admin-action-confirm.d.ts +1 -1
  3. package/dist/admin/admin-action-log.d.ts +1 -1
  4. package/dist/admin/admin-action-log.js +4 -2
  5. package/dist/admin/admin-action-log.js.map +1 -1
  6. package/dist/admin/invitations-panel.d.ts +1 -1
  7. package/dist/admin/reviewer-scope-editor.d.ts +1 -1
  8. package/dist/admin/role-select.d.ts +1 -1
  9. package/dist/admin/transfer-ownership-dialog.d.ts +1 -1
  10. package/dist/admin/user-roster.d.ts +1 -1
  11. package/dist/auth/register-form.d.ts +1 -1
  12. package/dist/billing/billing-banner.d.ts +1 -1
  13. package/dist/billing/billing-labels.d.ts +1 -1
  14. package/dist/billing/billing-labels.js +3 -1
  15. package/dist/billing/billing-labels.js.map +1 -1
  16. package/dist/billing/billing-lock.d.ts +1 -1
  17. package/dist/billing/billing-standing.d.ts +1 -1
  18. package/dist/billing/plan-card.d.ts +1 -1
  19. package/dist/billing/plan-card.js +1 -1
  20. package/dist/billing/plan-card.js.map +1 -1
  21. package/dist/billing/plan-limit-notice.d.ts +1 -1
  22. package/dist/billing/subscription-actions.d.ts +1 -1
  23. package/dist/billing/subscription-status-chip.d.ts +1 -1
  24. package/dist/chart.d.ts +2 -2
  25. package/dist/chart.js.map +1 -1
  26. package/dist/components/alert-banner.js +1 -1
  27. package/dist/components/alert-banner.js.map +1 -1
  28. package/dist/components/amount-input.d.ts +1 -1
  29. package/dist/components/appearance-labels.d.ts +6 -0
  30. package/dist/components/appearance-labels.js +2 -1
  31. package/dist/components/appearance-labels.js.map +1 -1
  32. package/dist/components/button-group.d.ts +1 -1
  33. package/dist/components/button-group.js +7 -1
  34. package/dist/components/button-group.js.map +1 -1
  35. package/dist/components/calculator.d.ts +1 -1
  36. package/dist/components/chip.js +7 -2
  37. package/dist/components/chip.js.map +1 -1
  38. package/dist/components/choice-card.js +1 -1
  39. package/dist/components/choice-card.js.map +1 -1
  40. package/dist/components/confirm-dialog.d.ts +1 -1
  41. package/dist/components/copy-button.d.ts +1 -1
  42. package/dist/components/danger-confirm.d.ts +1 -1
  43. package/dist/components/data-table-pagination.d.ts +2 -1
  44. package/dist/components/data-table-pagination.js +15 -6
  45. package/dist/components/data-table-pagination.js.map +1 -1
  46. package/dist/components/data-table.js +2 -2
  47. package/dist/components/data-table.js.map +1 -1
  48. package/dist/components/date-picker.js +11 -1
  49. package/dist/components/date-picker.js.map +1 -1
  50. package/dist/components/facing-pair.d.ts +1 -1
  51. package/dist/components/file-button.d.ts +1 -1
  52. package/dist/components/file-dropzone.d.ts +1 -1
  53. package/dist/components/form-actions.d.ts +1 -1
  54. package/dist/components/iban-input.d.ts +1 -1
  55. package/dist/components/inline-edit-field.js +4 -1
  56. package/dist/components/inline-edit-field.js.map +1 -1
  57. package/dist/components/language-select.d.ts +1 -1
  58. package/dist/components/legal-page.d.ts +1 -1
  59. package/dist/components/legal.d.ts +1 -1
  60. package/dist/components/money-field.d.ts +1 -1
  61. package/dist/components/month-picker.js +41 -34
  62. package/dist/components/month-picker.js.map +1 -1
  63. package/dist/components/number-field.d.ts +1 -1
  64. package/dist/components/number-input.d.ts +1 -1
  65. package/dist/components/numpad-sheet.d.ts +1 -1
  66. package/dist/components/page-header.js +6 -1
  67. package/dist/components/page-header.js.map +1 -1
  68. package/dist/components/phone-input.d.ts +1 -1
  69. package/dist/components/phone-input.js +2 -2
  70. package/dist/components/phone-input.js.map +1 -1
  71. package/dist/components/popover.d.ts +1 -1
  72. package/dist/components/popover.js +2 -0
  73. package/dist/components/popover.js.map +1 -1
  74. package/dist/components/row-actions.d.ts +1 -1
  75. package/dist/components/row-actions.js +97 -37
  76. package/dist/components/row-actions.js.map +1 -1
  77. package/dist/components/series-chart.d.ts +1 -1
  78. package/dist/components/settings-fields.d.ts +7 -3
  79. package/dist/components/settings-fields.js +2 -1
  80. package/dist/components/settings-fields.js.map +1 -1
  81. package/dist/components/share-card.d.ts +1 -1
  82. package/dist/components/share-card.js +6 -2
  83. package/dist/components/share-card.js.map +1 -1
  84. package/dist/components/status-dot.js +9 -2
  85. package/dist/components/status-dot.js.map +1 -1
  86. package/dist/components/swipeable-row.js +8 -1
  87. package/dist/components/swipeable-row.js.map +1 -1
  88. package/dist/components/text-link.d.ts +1 -1
  89. package/dist/components/time-input.d.ts +1 -1
  90. package/dist/components/toggle-group.d.ts +9 -2
  91. package/dist/components/toggle-group.js +3 -3
  92. package/dist/components/toggle-group.js.map +1 -1
  93. package/dist/components/translation-review-editor.js +1 -1
  94. package/dist/components/translation-review-editor.js.map +1 -1
  95. package/dist/components/translation-review.js +2 -2
  96. package/dist/components/translation-review.js.map +1 -1
  97. package/dist/components/ui.d.ts +1 -1
  98. package/dist/components/ui.js +6 -6
  99. package/dist/components/ui.js.map +1 -1
  100. package/dist/components/wizard-stepper.js +20 -14
  101. package/dist/components/wizard-stepper.js.map +1 -1
  102. package/dist/{delete-account-setting-BvdQdbv3.d.ts → delete-account-setting-Dy4kJgUm.d.ts} +53 -14
  103. package/dist/feedback/feedback-attachment.d.ts +1 -1
  104. package/dist/feedback/feedback-context.d.ts +1 -1
  105. package/dist/feedback/feedback-crash.d.ts +1 -1
  106. package/dist/feedback/feedback-dialog.d.ts +1 -1
  107. package/dist/feedback/feedback-inbox.d.ts +1 -1
  108. package/dist/feedback/feedback-labels.d.ts +1 -1
  109. package/dist/feedback/feedback-menu.d.ts +1 -1
  110. package/dist/feedback/feedback-record.d.ts +1 -1
  111. package/dist/feedback/feedback-row-detail.d.ts +1 -1
  112. package/dist/feedback/feedback-status-undo.d.ts +1 -1
  113. package/dist/feedback/feedback-submit.d.ts +1 -1
  114. package/dist/feedback/feedback-swipe.d.ts +1 -1
  115. package/dist/feedback/feedback-table.d.ts +1 -1
  116. package/dist/feedback/feedback-thread.d.ts +1 -1
  117. package/dist/feedback.d.ts +1 -1
  118. package/dist/hooks/use-breakpoint.d.ts +19 -8
  119. package/dist/hooks/use-breakpoint.js +1 -1
  120. package/dist/hooks/use-breakpoint.js.map +1 -1
  121. package/dist/hooks/use-file-drop.d.ts +1 -1
  122. package/dist/i18n/defaults.d.ts +1 -1
  123. package/dist/i18n/german.d.ts +1 -1
  124. package/dist/i18n/german.js +7 -3
  125. package/dist/i18n/german.js.map +1 -1
  126. package/dist/i18n/kit-labels.d.ts +1 -1
  127. package/dist/i18n/languages.d.ts +1 -1
  128. package/dist/i18n/locales/de-CH.d.ts +1 -1
  129. package/dist/i18n/locales/en.d.ts +1 -1
  130. package/dist/i18n/locales/es.d.ts +1 -1
  131. package/dist/i18n/locales/es.js +7 -3
  132. package/dist/i18n/locales/es.js.map +1 -1
  133. package/dist/i18n/locales/fr.d.ts +1 -1
  134. package/dist/i18n/locales/fr.js +7 -3
  135. package/dist/i18n/locales/fr.js.map +1 -1
  136. package/dist/i18n/locales/hu.d.ts +1 -1
  137. package/dist/i18n/locales/hu.js +7 -3
  138. package/dist/i18n/locales/hu.js.map +1 -1
  139. package/dist/i18n/locales/it.d.ts +1 -1
  140. package/dist/i18n/locales/it.js +7 -3
  141. package/dist/i18n/locales/it.js.map +1 -1
  142. package/dist/i18n/locales/zh.d.ts +1 -1
  143. package/dist/i18n/locales/zh.js +7 -3
  144. package/dist/i18n/locales/zh.js.map +1 -1
  145. package/dist/i18n/review.d.ts +1 -1
  146. package/dist/index.d.ts +3 -3
  147. package/dist/index.js +3 -1
  148. package/dist/index.js.map +1 -1
  149. package/dist/landing/landing-actions.d.ts +1 -1
  150. package/dist/landing/landing-sections.d.ts +1 -1
  151. package/dist/landing/landing-sections.js +7 -3
  152. package/dist/landing/landing-sections.js.map +1 -1
  153. package/dist/landing/public-header.d.ts +1 -1
  154. package/dist/landing/routing.d.ts +1 -1
  155. package/dist/rhf/fields.d.ts +1 -1
  156. package/dist/rhf/form.d.ts +1 -1
  157. package/dist/rhf.d.ts +1 -1
  158. package/dist/settings/settings-section.d.ts +1 -1
  159. package/dist/settings/use-account-appearance.d.ts +1 -1
  160. package/dist/settings/use-account-appearance.js.map +1 -1
  161. package/dist/shell/app-shell.d.ts +1 -1
  162. package/dist/shell/app-shell.js +2 -1
  163. package/dist/shell/app-shell.js.map +1 -1
  164. package/dist/shell/top-bar-brand.d.ts +1 -1
  165. package/dist/shell.d.ts +1 -1
  166. package/dist/theme/contrast.d.ts +3 -2
  167. package/dist/theme/contrast.js.map +1 -1
  168. package/dist/theme/text-size.d.ts +19 -3
  169. package/dist/theme/text-size.js.map +1 -1
  170. package/dist/wizard/stepper-nav.d.ts +1 -1
  171. package/dist/wizard/wizard-summary.js +1 -1
  172. package/dist/wizard/wizard-summary.js.map +1 -1
  173. package/dist/wizard.d.ts +1 -1
  174. package/package.json +1 -1
  175. package/src/admin/admin-action-log.tsx +6 -1
  176. package/src/billing/billing-labels.ts +16 -0
  177. package/src/billing/plan-card.tsx +1 -1
  178. package/src/chart.ts +2 -0
  179. package/src/components/alert-banner.tsx +5 -1
  180. package/src/components/appearance-labels.ts +7 -0
  181. package/src/components/button-group.tsx +21 -0
  182. package/src/components/chip.tsx +34 -6
  183. package/src/components/choice-card.tsx +1 -1
  184. package/src/components/data-table-pagination.tsx +60 -31
  185. package/src/components/data-table.tsx +8 -4
  186. package/src/components/date-picker.tsx +32 -1
  187. package/src/components/inline-edit-field.tsx +20 -1
  188. package/src/components/month-picker.tsx +6 -1
  189. package/src/components/page-header.tsx +15 -1
  190. package/src/components/phone-input.tsx +7 -2
  191. package/src/components/popover.tsx +4 -0
  192. package/src/components/row-actions.tsx +156 -49
  193. package/src/components/settings-fields.tsx +8 -3
  194. package/src/components/share-card.tsx +21 -2
  195. package/src/components/status-dot.tsx +25 -2
  196. package/src/components/swipeable-row.tsx +8 -1
  197. package/src/components/toggle-group.tsx +26 -12
  198. package/src/components/translation-review-editor.tsx +1 -1
  199. package/src/components/translation-review.tsx +5 -4
  200. package/src/components/ui.tsx +28 -9
  201. package/src/components/wizard-stepper.tsx +5 -1
  202. package/src/hooks/use-breakpoint.ts +20 -9
  203. package/src/i18n/german.ts +4 -0
  204. package/src/i18n/locales/es.ts +4 -0
  205. package/src/i18n/locales/fr.ts +4 -0
  206. package/src/i18n/locales/hu.ts +4 -0
  207. package/src/i18n/locales/it.ts +4 -0
  208. package/src/i18n/locales/zh.ts +4 -0
  209. package/src/index.ts +4 -2
  210. package/src/landing/landing-sections.tsx +7 -3
  211. package/src/settings/use-account-appearance.ts +1 -1
  212. package/src/shell/app-shell.tsx +11 -6
  213. package/src/theme/contrast.ts +3 -2
  214. package/src/theme/text-size.ts +19 -3
  215. package/src/wizard/wizard-summary.tsx +4 -2
  216. package/tokens.css +15 -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// ── 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// Date helpers are also available via the \"@eifi1/ui-kit/dates\" subpath.\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\n// ── theme / palettes ─────────────────────────────────────────────────────────\nexport * from \"./theme/chart-palette\";\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\n// ── components ───────────────────────────────────────────────────────────────\nexport * from \"./components/ui\";\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\";\nexport { SwipeableRow } from \"./components/swipeable-row\";\nexport type { SwipeAction, SwipeableRowProps } from \"./components/swipeable-row\";\nexport * from \"./components/calculator\";\nexport * from \"./components/numpad-sheet\";\nexport * from \"./components/number-input\";\nexport * from \"./components/currency-select\";\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\";\nexport { useWindowedRows, WINDOWED_ROW_INDEX } from \"./hooks/use-windowed-rows\";\nexport type { WindowedRows } from \"./hooks/use-windowed-rows\";\n// Named, not `export *`: file-button.tsx also holds the screening helpers the\n// dropzone shares, 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\";\nexport * from \"./components/treemap\";\nexport * from \"./components/series-chart\";\nexport * from \"./components/chart-zoom\";\nexport * from \"./components/toggle-legend\";\nexport * from \"./components/facing-pair\";\nexport * from \"./components/series-chart-labels\";\nexport * from \"./components/pie-chart\";\nexport * from \"./components/pie-chart-labels\";\nexport * from \"./components/account-settings\";\n// 0.12.0: the fourth account section, and the QR code TwoFactorSetting draws its\n// otpauth URI with (encoder in lib/qr-encode.ts — no dependency, see there).\nexport * from \"./components/passkeys-setting\";\nexport * from \"./components/qr-code\";\nexport { encodeQr } from \"./lib/qr-encode\";\nexport type { QrEncodeOptions, QrErrorCorrection, QrMatrix } from \"./lib/qr-encode\";\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\";\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\";\nexport * from \"./components/chart\";\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.\nexport { WriteLockProvider, useWriteLock, DEFAULT_WRITE_LOCK_LABELS } from \"./components/write-lock\";\nexport type { WriteLock, WriteLockLabels, WriteLockProviderProps } 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.18: the cold-start notice keksdose built (#199), for every app: a framework-free\n// watchdog over the app's requests and the corner notice that explains the wait.\nexport { createServerWake, serverWake, watchReadsAnd, attachServerWake, wrapFetch } from \"./lib/server-wake\";\nexport type { ServerWakeStage, ServerWakeFilter, ServerWakeOptions, ServerWakeRequest, ServerWakeWatcher, ServerWakeAxiosConfig, AxiosLikeInstance } from \"./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\n// ── data-table suite ─────────────────────────────────────────────────────────\nexport * from \"./components/data-table-labels\";\nexport * from \"./components/data-table-sort\";\nexport * from \"./components/data-table-filters\";\nexport * from \"./components/data-table-pagination\";\nexport { FilterPopover } from \"./components/data-table-filter-popover\";\n// data-table re-exports SortState internally; export the rest explicitly to\n// avoid a duplicate SortState star-export (it comes from data-table-sort).\nexport { DataTable, DEFAULT_DATA_TABLE_SORT_LABELS } from \"./components/data-table\";\nexport type {\n DataTableSortLabels,\n DataTableColumn,\n DataTableCellProps,\n DataTableHeadProps,\n DataTableProps,\n ServerPagination,\n FilterState,\n MobileSwipeActions,\n DataTableDensity,\n DataTableChrome,\n DataTableRowAction,\n} from \"./components/data-table\";\n// 0.12.0: the yes/no cell, and a server table's state held by its owner, URL-synced.\nexport * from \"./components/data-table-cells\";\nexport { useTableUrlState, readTableUrlState } from \"./components/use-table-state\";\nexport type {\n TableUrlState,\n TableUrlSync,\n TableUrlStateProps,\n UseTableUrlStateOptions,\n UseTableUrlStateReturn,\n} from \"./components/use-table-state\";\n\n// ── shell (composable app chrome) ────────────────────────────────────────────\nexport * from \"./shell/topbar-controls\";\nexport * from \"./shell/top-bar\";\nexport * from \"./shell/app-shell\";\nexport * from \"./shell/option-switcher-menu\";\nexport * from \"./shell/role-switcher\";\nexport * from \"./shell/topbar-action-menu\";\nexport * from \"./shell/top-bar-brand\";\nexport * from \"./shell/auth-layout\";\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.\nexport * from \"./feedback/feedback-attachment\";\nexport * from \"./feedback/feedback-dialog\";\nexport * from \"./feedback/feedback-inbox\";\nexport * from \"./feedback/feedback-thread\";\n// 0.27.0: the feedback harmonization (docs/feedback-harmonization.md) — one record,\n// one menu, dialog, table, detail and crash reporter for keksdose, kastlan, Kurvenschmiede.\nexport * from \"./feedback/feedback-record\";\nexport * from \"./feedback/feedback-labels\";\nexport * from \"./feedback/feedback-status-undo\";\nexport * from \"./feedback/feedback-swipe\";\nexport * from \"./feedback/feedback-menu\";\nexport * from \"./feedback/feedback-context\";\nexport * from \"./feedback/feedback-capture\";\nexport * from \"./feedback/feedback-submit\";\nexport * from \"./feedback/feedback-table\";\nexport * from \"./feedback/feedback-row-detail\";\nexport * from \"./feedback/feedback-crash\";\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// Two modules were removed here rather than kept as stock. `wizard-field` held a\n// `WizardField`/`WizardSelectField` pair that had never been rendered in any app —\n// a field group nothing was built from, which this comment used to advertise. And\n// `use-rhf-wizard-step` was the only thing in the package that touched\n// react-hook-form, for a hook neither consumer called: keeping it meant an optional\n// peer, a dev dependency and a type import in every consumer's typecheck, bought\n// for nobody. A design system may carry stock; untested stock nothing has ever\n// rendered is not stock, it is a liability with an export.\nexport * from \"./wizard/types\";\nexport * from \"./wizard/use-wizard\";\nexport * from \"./wizard/wizard-context\";\nexport * from \"./wizard/validation\";\nexport * from \"./wizard/wizard-step\";\nexport * from \"./wizard/wizard-summary\";\nexport * from \"./wizard/stepper-nav\";\n\n// ── guided tours ─────────────────────────────────────────────────────────────\nexport * from \"./tour/tour\";\n\n// ── command palette / global search ──────────────────────────────────────────\nexport * from \"./search/command-palette\";\nexport * from \"./search/search-index\";\nexport * from \"./search/global-search\";\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`.\nexport { withAllPlurals } from \"./i18n/plurals\";\n// Translation review (0.19): one contract for kastlan's and keksdose's review pages —\n// the pure rows/status/placeholder logic and the presentational page parts.\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 ApiTranslationReviewWrite,\n TranslationRowsInput,\n TranslationSummary,\n TranslationReviewFilter,\n TranslationCorrection,\n TranslationRowGroup,\n TranslationReviewUndo,\n TranslationReviewSwipeAction,\n TranslationReviewSwipeBinding,\n} from \"./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\";\n\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, and kastlan's company switcher.\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\";\nexport { formatPersonName, personInitials } from \"./lib/person-name\";\nexport type { PersonName } from \"./lib/person-name\";\nexport { CompanySwitcher, DEFAULT_COMPANY_SWITCHER_LABELS } from \"./shell/company-switcher\";\nexport type { CompanySwitcherProps, CompanySwitcherLabels, CompanySwitcherCompany } from \"./shell/company-switcher\";\n\n// 0.30.0 (docs/user-admin-harmonization.md): the admin user list and its actions, the\n// invitations panel, and the account's own settings — email change, sessions, deletion,\n// export. Callbacks only; the confirmation level is the server's.\nexport { isRateLimited, retryAfterSeconds } from \"./auth/auth-errors\";\nexport type { AccountErrorCode, BillingErrorCode, DemoErrorCode, KitErrorCode } from \"./auth/auth-errors\";\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\";\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} 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\n// ── 0.31.0: the settings page and the admin page on one shell (docs/settings-harmonization.md) ──\n// Router-aware: the layout, its route and focus hooks (also in `@eifi1/ui-kit/shell`).\nexport { SettingsLayout, SETTINGS_SEARCH_THRESHOLD } from \"./settings/settings-layout\";\nexport type { SettingsLayoutProps, SettingsLayoutWidth } from \"./settings/settings-layout\";\nexport {\n useSettingsRoute,\n resolveSettingsLocation,\n settingsFromListState,\n SETTINGS_FROM_LIST_STATE,\n} from \"./settings/use-settings-route\";\nexport type {\n UseSettingsRouteOptions,\n SettingsRoute,\n SettingsLayoutMode,\n SettingsLocation,\n SettingsLocationRules,\n SettingsLocationResult,\n} from \"./settings/use-settings-route\";\nexport { useSettingsFocus, SETTINGS_FOCUS_RING, SETTINGS_FOCUS_MS } from \"./settings/use-settings-focus\";\n// The router-free companions: a card, the context, the heading level, the catalogue.\nexport { SettingsSection } from \"./settings/settings-section\";\nexport type { SettingsSectionProps } from \"./settings/settings-section\";\nexport { useSettingsLayout } from \"./settings/settings-context\";\nexport type { SettingsLayoutContextValue } from \"./settings/settings-context\";\nexport { SettingsHeadingLevel, useSettingsHeadingLevel } from \"./settings/settings-heading\";\nexport type { SettingsHeadingLevelProps, SettingsHeadingTag } from \"./settings/settings-heading\";\nexport {\n settingsSearchEntries,\n visibleSettingsGroups,\n visibleSettingsEntries,\n settingsHref,\n} from \"./settings/settings-catalogue\";\nexport type { SettingsGroup, SettingsEntry, SettingsSearchEntriesOptions } from \"./settings/settings-catalogue\";\nexport { DEFAULT_SETTINGS_LABELS, useSettingsLabels } from \"./settings/settings-labels\";\nexport type { SettingsLabels, SettingsGroupLabels, SettingsCoreGroup } from \"./settings/settings-labels\";\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\";\n\n// ── 0.31.0: the public landing page and the demo (docs/landing-demo-harmonization.md) ──\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// Router-aware (also in `@eifi1/ui-kit/shell`): the header and the resume.\nexport {\n RootEntry,\n RedirectIfAuthed,\n useLastVisitedPage,\n readLastVisitedPage,\n clearLastVisitedPage,\n safeNextPath,\n NEXT_PARAM,\n DEFAULT_LAST_VISITED_EXCLUDES,\n} from \"./landing/routing\";\nexport type {\n RootEntryProps,\n RedirectIfAuthedProps,\n RoutingSession,\n LastVisitedPageOptions,\n PathPattern,\n} from \"./landing/routing\";\nexport { PublicHeader } from \"./landing/public-header\";\nexport type { PublicHeaderProps, PublicHeaderBrand } from \"./landing/public-header\";\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\";\nexport type {\n LegalPageProps,\n LegalKitSectionProps,\n LegalKitSectionKey,\n LegalAcceptCheckboxProps,\n LegalSkeletonEntry,\n LegalSkeletonPage,\n LegalSectionOwner,\n LegalDisclaimerVariant,\n} from \"./components/legal-page\";\n\n// ── 0.32.0: text size and contrast (docs/text-size-harmonization.md) ──\nexport * from \"./theme/text-size\";\nexport * from \"./theme/contrast\";\nexport { useBreakpoint, usePhoneLayout, breakpointQuery, BREAKPOINT_REM } from \"./hooks/use-breakpoint\";\nexport type { Breakpoint, BreakpointVariant } from \"./hooks/use-breakpoint\";\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\";\nexport { DEFAULT_APPEARANCE_LABELS, useAppearanceLabels } from \"./components/appearance-labels\";\n// The behaviours at Large (§4, §10.7–10.9): a row's actions, the hooks components read.\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} from \"./components/row-actions\";\nexport { useLargeText, useCoarsePointer, useInlineFacts } from \"./hooks/use-large-text\";\nexport type { AppearanceLabels } from \"./components/appearance-labels\";\n\n// ── 0.32.0: billing — 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, planRelation } from \"./billing/plan-card\";\nexport type { BillingPlan, PlanRelation, PlanCardProps, PlanPickerProps, PlanChoice } 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\";\nexport { combineWriteLocks, useBillingLockReason } 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\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 { COUNTRY_CODES, countryName } from \"./lib/countries\";\nexport * from \"./components/iban-input\";\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 * from \"./components/phone-input\";\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\n// ── 0.23.0: the apps' 0.22 adoption round (kastlan, keksdose, Kurvenschmiede) ──\n// 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\";\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"],"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// ── 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// Date helpers are also available via the \"@eifi1/ui-kit/dates\" subpath.\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\n// ── theme / palettes ─────────────────────────────────────────────────────────\nexport * from \"./theme/chart-palette\";\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\n// ── components ───────────────────────────────────────────────────────────────\nexport * from \"./components/ui\";\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\";\nexport { SwipeableRow } from \"./components/swipeable-row\";\nexport type { SwipeAction, SwipeableRowProps } from \"./components/swipeable-row\";\nexport * from \"./components/calculator\";\nexport * from \"./components/numpad-sheet\";\nexport * from \"./components/number-input\";\nexport * from \"./components/currency-select\";\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\";\nexport { useWindowedRows, WINDOWED_ROW_INDEX } from \"./hooks/use-windowed-rows\";\nexport type { WindowedRows } from \"./hooks/use-windowed-rows\";\n// Named, not `export *`: file-button.tsx also holds the screening helpers the\n// dropzone shares, 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\";\nexport * from \"./components/treemap\";\nexport * from \"./components/series-chart\";\n// 0.32.1 (keksdose's 0.32 report): the height every chart takes, for an app's wrappers.\nexport type { ChartHeight } from \"./components/chart-height\";\nexport * from \"./components/chart-zoom\";\nexport * from \"./components/toggle-legend\";\nexport * from \"./components/facing-pair\";\nexport * from \"./components/series-chart-labels\";\nexport * from \"./components/pie-chart\";\nexport * from \"./components/pie-chart-labels\";\nexport * from \"./components/account-settings\";\n// 0.12.0: the fourth account section, and the QR code TwoFactorSetting draws its\n// otpauth URI with (encoder in lib/qr-encode.ts — no dependency, see there).\nexport * from \"./components/passkeys-setting\";\nexport * from \"./components/qr-code\";\nexport { encodeQr } from \"./lib/qr-encode\";\nexport type { QrEncodeOptions, QrErrorCorrection, QrMatrix } from \"./lib/qr-encode\";\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\";\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\";\nexport * from \"./components/chart\";\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.\nexport { WriteLockProvider, useWriteLock, DEFAULT_WRITE_LOCK_LABELS } from \"./components/write-lock\";\nexport type { WriteLock, WriteLockLabels, WriteLockProviderProps } 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.18: the cold-start notice keksdose built (#199), for every app: a framework-free\n// watchdog over the app's requests and the corner notice that explains the wait.\nexport { createServerWake, serverWake, watchReadsAnd, attachServerWake, wrapFetch } from \"./lib/server-wake\";\nexport type { ServerWakeStage, ServerWakeFilter, ServerWakeOptions, ServerWakeRequest, ServerWakeWatcher, ServerWakeAxiosConfig, AxiosLikeInstance } from \"./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\n// ── data-table suite ─────────────────────────────────────────────────────────\nexport * from \"./components/data-table-labels\";\nexport * from \"./components/data-table-sort\";\nexport * from \"./components/data-table-filters\";\nexport * from \"./components/data-table-pagination\";\nexport { FilterPopover } from \"./components/data-table-filter-popover\";\n// data-table re-exports SortState internally; export the rest explicitly to\n// avoid a duplicate SortState star-export (it comes from data-table-sort).\nexport { DataTable, DEFAULT_DATA_TABLE_SORT_LABELS } from \"./components/data-table\";\nexport type {\n DataTableSortLabels,\n DataTableColumn,\n DataTableCellProps,\n DataTableHeadProps,\n DataTableProps,\n ServerPagination,\n FilterState,\n MobileSwipeActions,\n DataTableDensity,\n DataTableChrome,\n DataTableRowAction,\n} from \"./components/data-table\";\n// 0.12.0: the yes/no cell, and a server table's state held by its owner, URL-synced.\nexport * from \"./components/data-table-cells\";\nexport { useTableUrlState, readTableUrlState } from \"./components/use-table-state\";\nexport type {\n TableUrlState,\n TableUrlSync,\n TableUrlStateProps,\n UseTableUrlStateOptions,\n UseTableUrlStateReturn,\n} from \"./components/use-table-state\";\n\n// ── shell (composable app chrome) ────────────────────────────────────────────\nexport * from \"./shell/topbar-controls\";\nexport * from \"./shell/top-bar\";\nexport * from \"./shell/app-shell\";\nexport * from \"./shell/option-switcher-menu\";\nexport * from \"./shell/role-switcher\";\nexport * from \"./shell/topbar-action-menu\";\nexport * from \"./shell/top-bar-brand\";\nexport * from \"./shell/auth-layout\";\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.\nexport * from \"./feedback/feedback-attachment\";\nexport * from \"./feedback/feedback-dialog\";\nexport * from \"./feedback/feedback-inbox\";\nexport * from \"./feedback/feedback-thread\";\n// 0.27.0: the feedback harmonization (docs/feedback-harmonization.md) — one record,\n// one menu, dialog, table, detail and crash reporter for keksdose, kastlan, Kurvenschmiede.\nexport * from \"./feedback/feedback-record\";\nexport * from \"./feedback/feedback-labels\";\nexport * from \"./feedback/feedback-status-undo\";\nexport * from \"./feedback/feedback-swipe\";\nexport * from \"./feedback/feedback-menu\";\nexport * from \"./feedback/feedback-context\";\nexport * from \"./feedback/feedback-capture\";\nexport * from \"./feedback/feedback-submit\";\nexport * from \"./feedback/feedback-table\";\nexport * from \"./feedback/feedback-row-detail\";\nexport * from \"./feedback/feedback-crash\";\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// Two modules were removed here rather than kept as stock. `wizard-field` held a\n// `WizardField`/`WizardSelectField` pair that had never been rendered in any app —\n// a field group nothing was built from, which this comment used to advertise. And\n// `use-rhf-wizard-step` was the only thing in the package that touched\n// react-hook-form, for a hook neither consumer called: keeping it meant an optional\n// peer, a dev dependency and a type import in every consumer's typecheck, bought\n// for nobody. A design system may carry stock; untested stock nothing has ever\n// rendered is not stock, it is a liability with an export.\nexport * from \"./wizard/types\";\nexport * from \"./wizard/use-wizard\";\nexport * from \"./wizard/wizard-context\";\nexport * from \"./wizard/validation\";\nexport * from \"./wizard/wizard-step\";\nexport * from \"./wizard/wizard-summary\";\nexport * from \"./wizard/stepper-nav\";\n\n// ── guided tours ─────────────────────────────────────────────────────────────\nexport * from \"./tour/tour\";\n\n// ── command palette / global search ──────────────────────────────────────────\nexport * from \"./search/command-palette\";\nexport * from \"./search/search-index\";\nexport * from \"./search/global-search\";\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`.\nexport { withAllPlurals } from \"./i18n/plurals\";\n// Translation review (0.19): one contract for kastlan's and keksdose's review pages —\n// the pure rows/status/placeholder logic and the presentational page parts.\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 ApiTranslationReviewWrite,\n TranslationRowsInput,\n TranslationSummary,\n TranslationReviewFilter,\n TranslationCorrection,\n TranslationRowGroup,\n TranslationReviewUndo,\n TranslationReviewSwipeAction,\n TranslationReviewSwipeBinding,\n} from \"./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\";\n\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, and kastlan's company switcher.\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\";\nexport { formatPersonName, personInitials } from \"./lib/person-name\";\nexport type { PersonName } from \"./lib/person-name\";\nexport { CompanySwitcher, DEFAULT_COMPANY_SWITCHER_LABELS } from \"./shell/company-switcher\";\nexport type { CompanySwitcherProps, CompanySwitcherLabels, CompanySwitcherCompany } from \"./shell/company-switcher\";\n\n// 0.30.0 (docs/user-admin-harmonization.md): the admin user list and its actions, the\n// invitations panel, and the account's own settings — email change, sessions, deletion,\n// export. Callbacks only; the confirmation level is the server's.\nexport { isRateLimited, retryAfterSeconds } from \"./auth/auth-errors\";\nexport type { AccountErrorCode, BillingErrorCode, DemoErrorCode, KitErrorCode } from \"./auth/auth-errors\";\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\";\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} 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\n// ── 0.31.0: the settings page and the admin page on one shell (docs/settings-harmonization.md) ──\n// Router-aware: the layout, its route and focus hooks (also in `@eifi1/ui-kit/shell`).\nexport { SettingsLayout, SETTINGS_SEARCH_THRESHOLD } from \"./settings/settings-layout\";\nexport type { SettingsLayoutProps, SettingsLayoutWidth } from \"./settings/settings-layout\";\nexport {\n useSettingsRoute,\n resolveSettingsLocation,\n settingsFromListState,\n SETTINGS_FROM_LIST_STATE,\n} from \"./settings/use-settings-route\";\nexport type {\n UseSettingsRouteOptions,\n SettingsRoute,\n SettingsLayoutMode,\n SettingsLocation,\n SettingsLocationRules,\n SettingsLocationResult,\n} from \"./settings/use-settings-route\";\nexport { useSettingsFocus, SETTINGS_FOCUS_RING, SETTINGS_FOCUS_MS } from \"./settings/use-settings-focus\";\n// The router-free companions: a card, the context, the heading level, the catalogue.\nexport { SettingsSection } from \"./settings/settings-section\";\nexport type { SettingsSectionProps } from \"./settings/settings-section\";\nexport { useSettingsLayout } from \"./settings/settings-context\";\nexport type { SettingsLayoutContextValue } from \"./settings/settings-context\";\nexport { SettingsHeadingLevel, useSettingsHeadingLevel } from \"./settings/settings-heading\";\nexport type { SettingsHeadingLevelProps, SettingsHeadingTag } from \"./settings/settings-heading\";\nexport {\n settingsSearchEntries,\n visibleSettingsGroups,\n visibleSettingsEntries,\n settingsHref,\n} from \"./settings/settings-catalogue\";\nexport type { SettingsGroup, SettingsEntry, SettingsSearchEntriesOptions } from \"./settings/settings-catalogue\";\nexport { DEFAULT_SETTINGS_LABELS, useSettingsLabels } from \"./settings/settings-labels\";\nexport type { SettingsLabels, SettingsGroupLabels, SettingsCoreGroup } from \"./settings/settings-labels\";\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\";\n\n// ── 0.31.0: the public landing page and the demo (docs/landing-demo-harmonization.md) ──\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// Router-aware (also in `@eifi1/ui-kit/shell`): the header and the resume.\nexport {\n RootEntry,\n RedirectIfAuthed,\n useLastVisitedPage,\n readLastVisitedPage,\n clearLastVisitedPage,\n safeNextPath,\n NEXT_PARAM,\n DEFAULT_LAST_VISITED_EXCLUDES,\n} from \"./landing/routing\";\nexport type {\n RootEntryProps,\n RedirectIfAuthedProps,\n RoutingSession,\n LastVisitedPageOptions,\n PathPattern,\n} from \"./landing/routing\";\nexport { PublicHeader } from \"./landing/public-header\";\nexport type { PublicHeaderProps, PublicHeaderBrand } from \"./landing/public-header\";\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\";\nexport type {\n LegalPageProps,\n LegalKitSectionProps,\n LegalKitSectionKey,\n LegalAcceptCheckboxProps,\n LegalSkeletonEntry,\n LegalSkeletonPage,\n LegalSectionOwner,\n LegalDisclaimerVariant,\n} from \"./components/legal-page\";\n\n// ── 0.32.0: text size and contrast (docs/text-size-harmonization.md) ──\nexport * from \"./theme/text-size\";\nexport * from \"./theme/contrast\";\nexport { useBreakpoint, usePhoneLayout, breakpointQuery, BREAKPOINT_REM, remPx, useRemPx } from \"./hooks/use-breakpoint\";\nexport type { Breakpoint, BreakpointVariant, RemLength } from \"./hooks/use-breakpoint\";\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\";\nexport { DEFAULT_APPEARANCE_LABELS, useAppearanceLabels } from \"./components/appearance-labels\";\n// The behaviours at Large (§4, §10.7–10.9): a row's actions, the hooks components read.\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} from \"./components/row-actions\";\nexport { useLargeText, useCoarsePointer, useInlineFacts } from \"./hooks/use-large-text\";\nexport type { AppearanceLabels } from \"./components/appearance-labels\";\n\n// ── 0.32.0: billing — 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, planRelation } from \"./billing/plan-card\";\nexport type { BillingPlan, PlanRelation, PlanCardProps, PlanPickerProps, PlanChoice } 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\";\nexport { combineWriteLocks, useBillingLockReason } 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\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 { COUNTRY_CODES, countryName } from \"./lib/countries\";\nexport * from \"./components/iban-input\";\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 * from \"./components/phone-input\";\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\n// ── 0.23.0: the apps' 0.22 adoption round (kastlan, keksdose, Kurvenschmiede) ──\n// 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\";\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"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import * as react from 'react';
2
2
  import { ComponentPropsWithoutRef } from 'react';
3
- import { bM as ButtonSize } from '../delete-account-setting-BvdQdbv3.js';
3
+ import { bM as ButtonSize } from '../delete-account-setting-Dy4kJgUm.js';
4
4
  import { AccessChoice } from './access.js';
5
5
  import { LandingLabels } from './landing-labels.js';
6
6
  import '../components/tooltip.js';
@@ -1,6 +1,6 @@
1
1
  import * as react from 'react';
2
2
  import { ComponentPropsWithoutRef, ReactNode } from 'react';
3
- import { e8 as LegalFooterProps } from '../delete-account-setting-BvdQdbv3.js';
3
+ import { e8 as LegalFooterProps } from '../delete-account-setting-Dy4kJgUm.js';
4
4
  import { LandingActionsProps } from './landing-actions.js';
5
5
  import { LandingLabels } from './landing-labels.js';
6
6
  import '../components/tooltip.js';
@@ -36,7 +36,11 @@ function Hero({
36
36
  ...rest,
37
37
  "data-slot": "landing-hero",
38
38
  className: cn(
39
- "mx-auto grid max-w-6xl items-center gap-12 px-4 py-16 sm:py-24",
39
+ // `grid-cols-1` below `lg` (0.32.1, Kurvenschmiede's 0.32 report): without a
40
+ // template the one column is `auto` and grows to the visual's longest unwrapped
41
+ // line — 80 px past a 360 px phone at Extra large. `minmax(0, 1fr)` holds it to
42
+ // the page. The same in FeatureRow and TrustStrip.
43
+ "mx-auto grid max-w-6xl grid-cols-1 items-center gap-12 px-4 py-16 sm:py-24",
40
44
  visual != null && "lg:grid-cols-2",
41
45
  className
42
46
  ),
@@ -90,7 +94,7 @@ function FeatureRow({
90
94
  {
91
95
  ...rest,
92
96
  "data-slot": "landing-feature-row",
93
- className: cn("group/feature grid items-center gap-8 py-10", visual != null && "lg:grid-cols-2 lg:gap-16", className),
97
+ className: cn("group/feature grid grid-cols-1 items-center gap-8 py-10", visual != null && "lg:grid-cols-2 lg:gap-16", className),
94
98
  children: [
95
99
  /* @__PURE__ */ jsxs("div", { className: "lg:group-even/feature:order-last", children: [
96
100
  (icon != null || eyebrow != null) && /* @__PURE__ */ jsxs("p", { className: "flex items-center gap-2 text-xs font-semibold uppercase tracking-wider text-[var(--brand)]", children: [
@@ -110,7 +114,7 @@ function FeatureRow({
110
114
  );
111
115
  }
112
116
  function TrustStrip({ items, headingAs: Heading = "h3", className, ...rest }) {
113
- return /* @__PURE__ */ jsx("section", { ...rest, "data-slot": "landing-trust", className: cn("mx-auto max-w-6xl px-4 py-12 sm:py-16", className), children: /* @__PURE__ */ jsx("ul", { className: cn("grid gap-8 sm:grid-cols-2", items.length === 3 ? "lg:grid-cols-3" : "lg:grid-cols-4"), children: items.map((item, i) => /* @__PURE__ */ jsxs("li", { children: [
117
+ return /* @__PURE__ */ jsx("section", { ...rest, "data-slot": "landing-trust", className: cn("mx-auto max-w-6xl px-4 py-12 sm:py-16", className), children: /* @__PURE__ */ jsx("ul", { className: cn("grid grid-cols-1 gap-8 sm:grid-cols-2", items.length === 3 ? "lg:grid-cols-3" : "lg:grid-cols-4"), children: items.map((item, i) => /* @__PURE__ */ jsxs("li", { children: [
114
118
  item.icon != null && /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "flex text-[var(--brand)] [&_svg]:size-5", children: item.icon }),
115
119
  /* @__PURE__ */ jsx(Heading, { className: "mt-2 text-sm font-semibold text-[var(--text-primary)]", children: item.title }),
116
120
  /* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-[var(--text-secondary)]", children: item.description })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/landing/landing-sections.tsx"],"sourcesContent":["import type { ComponentPropsWithoutRef, ReactNode } from \"react\";\n\nimport { cn } from \"../lib/cn\";\nimport { Chip } from \"../components/chip\";\nimport { LegalFooter } from \"../components/legal\";\nimport type { LegalFooterProps } from \"../components/legal\";\nimport { LandingActions } from \"./landing-actions\";\nimport type { LandingActionsProps } from \"./landing-actions\";\nimport { useLandingLabels } from \"./landing-labels\";\nimport type { LandingLabels } from \"./landing-labels\";\n\n/**\n * The sections of the public landing page (docs/landing-demo-harmonization.md §4.1),\n * top to bottom: `Hero`, `FeatureRows` of `FeatureRow`, `TrustStrip`, `CtaBand`,\n * `PublicFooter` — keksdose's landing-page.tsx, taken apart.\n *\n * The kit draws the frame; every word of marketing copy is the app's. Colours are the\n * kit's tokens (`--brand`, `--text-*`, `--bg-surface`, `--border`), so keksdose's ten\n * hard-coded teal sites follow the palette now (§2.11).\n *\n * **Visuals are decorative** (§4.1): the `visual` slots are `aria-hidden` and `inert` —\n * mock UI drawn with kit tokens, never screenshots with real data, and never anything a\n * keyboard could land on. The copy beside each one carries the information. A mock's\n * amounts use the demo data's currency, so the landing shows what \"Try the demo\" opens.\n */\n\ntype HeadingLevel = \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n\n/** The decorative slot: hidden from assistive tech and out of the tab order. */\nfunction Visual({ children, className }: { children: ReactNode; className?: string }) {\n return (\n <div aria-hidden inert data-slot=\"landing-visual\" className={cn(\"mx-auto w-full select-none\", className)}>\n {children}\n </div>\n );\n}\n\n/** The action pair's props, as `Hero` and `CtaBand` pass them on. */\ntype ActionProps = Pick<LandingActionsProps, \"session\" | \"access\" | \"demoHref\" | \"openAppHref\">;\n\n/* ── Hero ────────────────────────────────────────────────────────────────── */\n\nexport interface HeroProps extends Omit<ComponentPropsWithoutRef<\"section\">, \"title\" | \"children\">, ActionProps {\n /** The page's `h1`: what the app does, in a line. */\n title: ReactNode;\n /** Under it: for whom, and why. */\n subtitle?: ReactNode;\n /** The kit's \"Beta\" chip above the title. */\n beta?: boolean;\n /** A badge of the app's own in that place; wins over `beta`. */\n badge?: ReactNode;\n /** Under the actions, quiet: \"Free while in beta. Your data stays yours.\" */\n trust?: ReactNode;\n /** The product glimpse beside the copy (below it on a phone). Decorative. */\n visual?: ReactNode;\n /** Replaces the action pair ({@link LandingActions}). */\n actions?: ReactNode;\n /** Default `h1`; lower where the hero is embedded in another page. */\n headingAs?: HeadingLevel;\n labels?: Partial<LandingLabels>;\n}\n\n/**\n * The top of the landing (§4.1.2): an optional \"Beta\" badge, the `h1`, a subtitle, the\n * action pair for the visitor's state ({@link LandingActions}: \"Request access\" and \"Try\n * the demo\", or \"Open app\" for a session), a trust line, and a visual. Copy left and\n * visual right from `lg` up, stacked below.\n */\nexport function Hero({\n title,\n subtitle,\n beta = false,\n badge,\n trust,\n visual,\n actions,\n headingAs: Heading = \"h1\",\n session,\n access,\n demoHref,\n openAppHref,\n labels: labelsProp,\n className,\n ...rest\n}: HeroProps) {\n const labels = useLandingLabels(labelsProp);\n const shownBadge =\n badge ??\n (beta ? (\n // keksdose's chip, padded out to the hero's scale.\n <Chip size=\"sm\" tone=\"warning\" className=\"px-3 py-1 font-medium\">\n {labels.beta}\n </Chip>\n ) : null);\n return (\n <section\n {...rest}\n data-slot=\"landing-hero\"\n className={cn(\n \"mx-auto grid max-w-6xl items-center gap-12 px-4 py-16 sm:py-24\",\n visual != null && \"lg:grid-cols-2\",\n className,\n )}\n >\n <div>\n {shownBadge != null && <div className=\"mb-4\">{shownBadge}</div>}\n <Heading className=\"text-4xl font-bold tracking-tight text-balance text-[var(--text-primary)] sm:text-5xl\">\n {title}\n </Heading>\n {subtitle != null && <p className=\"mt-4 max-w-xl text-lg text-[var(--text-secondary)]\">{subtitle}</p>}\n <div className=\"mt-8\">\n {actions ?? (\n <LandingActions\n session={session}\n access={access}\n demoHref={demoHref}\n openAppHref={openAppHref}\n labels={labelsProp}\n />\n )}\n </div>\n {trust != null && <p className=\"mt-4 text-sm text-[var(--text-muted)]\">{trust}</p>}\n </div>\n {visual != null && <Visual className=\"max-w-sm\">{visual}</Visual>}\n </section>\n );\n}\n\n/* ── Feature rows ────────────────────────────────────────────────────────── */\n\nexport type FeatureRowsProps = ComponentPropsWithoutRef<\"section\">;\n\n/**\n * The band that holds the feature rows (§4.1.3): two to four {@link FeatureRow}s on the\n * surface colour, between hairlines. The rows alternate sides by themselves — the copy\n * of every second row moves to the end from `lg` up — so the app lists them in order\n * and nothing else.\n */\nexport function FeatureRows({ className, children, ...rest }: FeatureRowsProps) {\n return (\n <section\n {...rest}\n data-slot=\"landing-feature-rows\"\n className={cn(\"border-t border-[var(--border)] bg-[var(--bg-surface)]\", className)}\n >\n <div className=\"mx-auto max-w-6xl px-4 py-8 sm:py-12\">{children}</div>\n </section>\n );\n}\n\nexport interface FeatureRowProps extends Omit<ComponentPropsWithoutRef<\"div\">, \"title\" | \"children\"> {\n /** A lucide icon (or any SVG) before the eyebrow. Decorative. */\n icon?: ReactNode;\n /** The small uppercase line above the heading: \"Capture\", \"Plan\". */\n eyebrow?: ReactNode;\n /** The row's `h2`. */\n title: ReactNode;\n description?: ReactNode;\n /** Up to three short points; the first three are shown. */\n bullets?: readonly ReactNode[];\n /** The mock beside the copy. Decorative. */\n visual?: ReactNode;\n /** Default `h2`. */\n headingAs?: HeadingLevel;\n}\n\n/**\n * One job of the app (§4.1.3), keksdose's \"capture → budget → understand\": an icon\n * eyebrow, the `h2`, a description, up to three bullets, and a visual on the other side.\n * Inside {@link FeatureRows} every second row puts its copy at the end (`group-even`),\n * which is keksdose's alternation without an index to pass.\n */\nexport function FeatureRow({\n icon,\n eyebrow,\n title,\n description,\n bullets,\n visual,\n headingAs: Heading = \"h2\",\n className,\n ...rest\n}: FeatureRowProps) {\n const shown = bullets?.slice(0, 3) ?? [];\n return (\n <div\n {...rest}\n data-slot=\"landing-feature-row\"\n className={cn(\"group/feature grid items-center gap-8 py-10\", visual != null && \"lg:grid-cols-2 lg:gap-16\", className)}\n >\n <div className=\"lg:group-even/feature:order-last\">\n {(icon != null || eyebrow != null) && (\n <p className=\"flex items-center gap-2 text-xs font-semibold uppercase tracking-wider text-[var(--brand)]\">\n {icon != null && (\n <span aria-hidden className=\"flex shrink-0 [&_svg]:size-4\">\n {icon}\n </span>\n )}\n {eyebrow}\n </p>\n )}\n <Heading className=\"mt-2 text-2xl font-semibold tracking-tight text-balance text-[var(--text-primary)] sm:text-3xl\">\n {title}\n </Heading>\n {description != null && <p className=\"mt-3 max-w-xl text-[var(--text-secondary)]\">{description}</p>}\n {shown.length > 0 && (\n <ul className=\"mt-4 space-y-2\">\n {shown.map((bullet, i) => (\n <li key={i} className=\"flex gap-2.5 text-sm text-[var(--text-secondary)]\">\n <span aria-hidden className=\"mt-1.5 size-1.5 shrink-0 rounded-full bg-[var(--brand)]\" />\n <span className=\"min-w-0\">{bullet}</span>\n </li>\n ))}\n </ul>\n )}\n </div>\n {visual != null && <Visual className=\"max-w-md\">{visual}</Visual>}\n </div>\n );\n}\n\n/* ── Trust strip ─────────────────────────────────────────────────────────── */\n\nexport interface TrustItem {\n /** A lucide icon. Decorative. */\n icon?: ReactNode;\n /** The item's `h3`: \"Hosted in Switzerland\". */\n title: ReactNode;\n /** One sentence. */\n description: ReactNode;\n}\n\nexport interface TrustStripProps extends Omit<ComponentPropsWithoutRef<\"section\">, \"children\"> {\n /** Three or four (§4.1.4): hosting, security, data ownership, sharing. */\n items: readonly TrustItem[];\n /** The items' heading level. Default `h3`. */\n headingAs?: HeadingLevel;\n}\n\n/**\n * Quiet, start-aligned facts after the feature rows (§4.1.4) — an icon, an `h3` and one\n * sentence each, on one row from `lg` up (three or four columns), two on a tablet, one\n * on a phone. No marketing volume: keksdose's \"trust strip\".\n */\nexport function TrustStrip({ items, headingAs: Heading = \"h3\", className, ...rest }: TrustStripProps) {\n return (\n <section {...rest} data-slot=\"landing-trust\" className={cn(\"mx-auto max-w-6xl px-4 py-12 sm:py-16\", className)}>\n <ul className={cn(\"grid gap-8 sm:grid-cols-2\", items.length === 3 ? \"lg:grid-cols-3\" : \"lg:grid-cols-4\")}>\n {items.map((item, i) => (\n <li key={i}>\n {item.icon != null && (\n <span aria-hidden className=\"flex text-[var(--brand)] [&_svg]:size-5\">\n {item.icon}\n </span>\n )}\n <Heading className=\"mt-2 text-sm font-semibold text-[var(--text-primary)]\">{item.title}</Heading>\n <p className=\"mt-1 text-sm text-[var(--text-secondary)]\">{item.description}</p>\n </li>\n ))}\n </ul>\n </section>\n );\n}\n\n/* ── CTA band ────────────────────────────────────────────────────────────── */\n\nexport interface CtaBandProps extends Omit<ComponentPropsWithoutRef<\"section\">, \"title\" | \"children\">, ActionProps {\n /** The band's `h2`: the last ask. */\n title: ReactNode;\n subtitle?: ReactNode;\n /** Replaces the action pair ({@link LandingActions}). */\n actions?: ReactNode;\n /** Default `h2`. */\n headingAs?: HeadingLevel;\n labels?: Partial<LandingLabels>;\n}\n\n/**\n * The closing band before the footer (§4.1.5): a centred `h2`, a subtitle, and the same\n * action pair as the hero.\n */\nexport function CtaBand({\n title,\n subtitle,\n actions,\n headingAs: Heading = \"h2\",\n session,\n access,\n demoHref,\n openAppHref,\n labels,\n className,\n ...rest\n}: CtaBandProps) {\n return (\n <section\n {...rest}\n data-slot=\"landing-cta\"\n className={cn(\"border-t border-[var(--border)] bg-[var(--bg-surface)]\", className)}\n >\n <div className=\"mx-auto max-w-5xl px-4 py-16 text-center\">\n <Heading className=\"text-2xl font-semibold tracking-tight text-balance text-[var(--text-primary)] sm:text-3xl\">\n {title}\n </Heading>\n {subtitle != null && <p className=\"mx-auto mt-3 max-w-xl text-[var(--text-secondary)]\">{subtitle}</p>}\n <div className=\"mt-8\">\n {actions ?? (\n <LandingActions\n session={session}\n access={access}\n demoHref={demoHref}\n openAppHref={openAppHref}\n align=\"center\"\n labels={labels}\n />\n )}\n </div>\n </div>\n </section>\n );\n}\n\n/* ── Footer ──────────────────────────────────────────────────────────────── */\n\nexport interface PublicFooterProps extends Omit<LegalFooterProps, \"children\"> {\n /** The app's line under the legal links: \"Self-hosted household budgeting.\" */\n tagline?: ReactNode;\n}\n\n/**\n * The public pages' footer (§4.1.6): the kit's {@link LegalFooter} — the three legal\n * links — with the app's tagline under them. keksdose's `SiteFooter`, which was already\n * this.\n */\nexport function PublicFooter({ tagline, ...rest }: PublicFooterProps) {\n return <LegalFooter {...rest}>{tagline}</LegalFooter>;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/landing/landing-sections.tsx"],"sourcesContent":["import type { ComponentPropsWithoutRef, ReactNode } from \"react\";\n\nimport { cn } from \"../lib/cn\";\nimport { Chip } from \"../components/chip\";\nimport { LegalFooter } from \"../components/legal\";\nimport type { LegalFooterProps } from \"../components/legal\";\nimport { LandingActions } from \"./landing-actions\";\nimport type { LandingActionsProps } from \"./landing-actions\";\nimport { useLandingLabels } from \"./landing-labels\";\nimport type { LandingLabels } from \"./landing-labels\";\n\n/**\n * The sections of the public landing page (docs/landing-demo-harmonization.md §4.1),\n * top to bottom: `Hero`, `FeatureRows` of `FeatureRow`, `TrustStrip`, `CtaBand`,\n * `PublicFooter` — keksdose's landing-page.tsx, taken apart.\n *\n * The kit draws the frame; every word of marketing copy is the app's. Colours are the\n * kit's tokens (`--brand`, `--text-*`, `--bg-surface`, `--border`), so keksdose's ten\n * hard-coded teal sites follow the palette now (§2.11).\n *\n * **Visuals are decorative** (§4.1): the `visual` slots are `aria-hidden` and `inert` —\n * mock UI drawn with kit tokens, never screenshots with real data, and never anything a\n * keyboard could land on. The copy beside each one carries the information. A mock's\n * amounts use the demo data's currency, so the landing shows what \"Try the demo\" opens.\n */\n\ntype HeadingLevel = \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n\n/** The decorative slot: hidden from assistive tech and out of the tab order. */\nfunction Visual({ children, className }: { children: ReactNode; className?: string }) {\n return (\n <div aria-hidden inert data-slot=\"landing-visual\" className={cn(\"mx-auto w-full select-none\", className)}>\n {children}\n </div>\n );\n}\n\n/** The action pair's props, as `Hero` and `CtaBand` pass them on. */\ntype ActionProps = Pick<LandingActionsProps, \"session\" | \"access\" | \"demoHref\" | \"openAppHref\">;\n\n/* ── Hero ────────────────────────────────────────────────────────────────── */\n\nexport interface HeroProps extends Omit<ComponentPropsWithoutRef<\"section\">, \"title\" | \"children\">, ActionProps {\n /** The page's `h1`: what the app does, in a line. */\n title: ReactNode;\n /** Under it: for whom, and why. */\n subtitle?: ReactNode;\n /** The kit's \"Beta\" chip above the title. */\n beta?: boolean;\n /** A badge of the app's own in that place; wins over `beta`. */\n badge?: ReactNode;\n /** Under the actions, quiet: \"Free while in beta. Your data stays yours.\" */\n trust?: ReactNode;\n /** The product glimpse beside the copy (below it on a phone). Decorative. */\n visual?: ReactNode;\n /** Replaces the action pair ({@link LandingActions}). */\n actions?: ReactNode;\n /** Default `h1`; lower where the hero is embedded in another page. */\n headingAs?: HeadingLevel;\n labels?: Partial<LandingLabels>;\n}\n\n/**\n * The top of the landing (§4.1.2): an optional \"Beta\" badge, the `h1`, a subtitle, the\n * action pair for the visitor's state ({@link LandingActions}: \"Request access\" and \"Try\n * the demo\", or \"Open app\" for a session), a trust line, and a visual. Copy left and\n * visual right from `lg` up, stacked below.\n */\nexport function Hero({\n title,\n subtitle,\n beta = false,\n badge,\n trust,\n visual,\n actions,\n headingAs: Heading = \"h1\",\n session,\n access,\n demoHref,\n openAppHref,\n labels: labelsProp,\n className,\n ...rest\n}: HeroProps) {\n const labels = useLandingLabels(labelsProp);\n const shownBadge =\n badge ??\n (beta ? (\n // keksdose's chip, padded out to the hero's scale.\n <Chip size=\"sm\" tone=\"warning\" className=\"px-3 py-1 font-medium\">\n {labels.beta}\n </Chip>\n ) : null);\n return (\n <section\n {...rest}\n data-slot=\"landing-hero\"\n className={cn(\n // `grid-cols-1` below `lg` (0.32.1, Kurvenschmiede's 0.32 report): without a\n // template the one column is `auto` and grows to the visual's longest unwrapped\n // line — 80 px past a 360 px phone at Extra large. `minmax(0, 1fr)` holds it to\n // the page. The same in FeatureRow and TrustStrip.\n \"mx-auto grid max-w-6xl grid-cols-1 items-center gap-12 px-4 py-16 sm:py-24\",\n visual != null && \"lg:grid-cols-2\",\n className,\n )}\n >\n <div>\n {shownBadge != null && <div className=\"mb-4\">{shownBadge}</div>}\n <Heading className=\"text-4xl font-bold tracking-tight text-balance text-[var(--text-primary)] sm:text-5xl\">\n {title}\n </Heading>\n {subtitle != null && <p className=\"mt-4 max-w-xl text-lg text-[var(--text-secondary)]\">{subtitle}</p>}\n <div className=\"mt-8\">\n {actions ?? (\n <LandingActions\n session={session}\n access={access}\n demoHref={demoHref}\n openAppHref={openAppHref}\n labels={labelsProp}\n />\n )}\n </div>\n {trust != null && <p className=\"mt-4 text-sm text-[var(--text-muted)]\">{trust}</p>}\n </div>\n {visual != null && <Visual className=\"max-w-sm\">{visual}</Visual>}\n </section>\n );\n}\n\n/* ── Feature rows ────────────────────────────────────────────────────────── */\n\nexport type FeatureRowsProps = ComponentPropsWithoutRef<\"section\">;\n\n/**\n * The band that holds the feature rows (§4.1.3): two to four {@link FeatureRow}s on the\n * surface colour, between hairlines. The rows alternate sides by themselves — the copy\n * of every second row moves to the end from `lg` up — so the app lists them in order\n * and nothing else.\n */\nexport function FeatureRows({ className, children, ...rest }: FeatureRowsProps) {\n return (\n <section\n {...rest}\n data-slot=\"landing-feature-rows\"\n className={cn(\"border-t border-[var(--border)] bg-[var(--bg-surface)]\", className)}\n >\n <div className=\"mx-auto max-w-6xl px-4 py-8 sm:py-12\">{children}</div>\n </section>\n );\n}\n\nexport interface FeatureRowProps extends Omit<ComponentPropsWithoutRef<\"div\">, \"title\" | \"children\"> {\n /** A lucide icon (or any SVG) before the eyebrow. Decorative. */\n icon?: ReactNode;\n /** The small uppercase line above the heading: \"Capture\", \"Plan\". */\n eyebrow?: ReactNode;\n /** The row's `h2`. */\n title: ReactNode;\n description?: ReactNode;\n /** Up to three short points; the first three are shown. */\n bullets?: readonly ReactNode[];\n /** The mock beside the copy. Decorative. */\n visual?: ReactNode;\n /** Default `h2`. */\n headingAs?: HeadingLevel;\n}\n\n/**\n * One job of the app (§4.1.3), keksdose's \"capture → budget → understand\": an icon\n * eyebrow, the `h2`, a description, up to three bullets, and a visual on the other side.\n * Inside {@link FeatureRows} every second row puts its copy at the end (`group-even`),\n * which is keksdose's alternation without an index to pass.\n */\nexport function FeatureRow({\n icon,\n eyebrow,\n title,\n description,\n bullets,\n visual,\n headingAs: Heading = \"h2\",\n className,\n ...rest\n}: FeatureRowProps) {\n const shown = bullets?.slice(0, 3) ?? [];\n return (\n <div\n {...rest}\n data-slot=\"landing-feature-row\"\n className={cn(\"group/feature grid grid-cols-1 items-center gap-8 py-10\", visual != null && \"lg:grid-cols-2 lg:gap-16\", className)}\n >\n <div className=\"lg:group-even/feature:order-last\">\n {(icon != null || eyebrow != null) && (\n <p className=\"flex items-center gap-2 text-xs font-semibold uppercase tracking-wider text-[var(--brand)]\">\n {icon != null && (\n <span aria-hidden className=\"flex shrink-0 [&_svg]:size-4\">\n {icon}\n </span>\n )}\n {eyebrow}\n </p>\n )}\n <Heading className=\"mt-2 text-2xl font-semibold tracking-tight text-balance text-[var(--text-primary)] sm:text-3xl\">\n {title}\n </Heading>\n {description != null && <p className=\"mt-3 max-w-xl text-[var(--text-secondary)]\">{description}</p>}\n {shown.length > 0 && (\n <ul className=\"mt-4 space-y-2\">\n {shown.map((bullet, i) => (\n <li key={i} className=\"flex gap-2.5 text-sm text-[var(--text-secondary)]\">\n <span aria-hidden className=\"mt-1.5 size-1.5 shrink-0 rounded-full bg-[var(--brand)]\" />\n <span className=\"min-w-0\">{bullet}</span>\n </li>\n ))}\n </ul>\n )}\n </div>\n {visual != null && <Visual className=\"max-w-md\">{visual}</Visual>}\n </div>\n );\n}\n\n/* ── Trust strip ─────────────────────────────────────────────────────────── */\n\nexport interface TrustItem {\n /** A lucide icon. Decorative. */\n icon?: ReactNode;\n /** The item's `h3`: \"Hosted in Switzerland\". */\n title: ReactNode;\n /** One sentence. */\n description: ReactNode;\n}\n\nexport interface TrustStripProps extends Omit<ComponentPropsWithoutRef<\"section\">, \"children\"> {\n /** Three or four (§4.1.4): hosting, security, data ownership, sharing. */\n items: readonly TrustItem[];\n /** The items' heading level. Default `h3`. */\n headingAs?: HeadingLevel;\n}\n\n/**\n * Quiet, start-aligned facts after the feature rows (§4.1.4) — an icon, an `h3` and one\n * sentence each, on one row from `lg` up (three or four columns), two on a tablet, one\n * on a phone. No marketing volume: keksdose's \"trust strip\".\n */\nexport function TrustStrip({ items, headingAs: Heading = \"h3\", className, ...rest }: TrustStripProps) {\n return (\n <section {...rest} data-slot=\"landing-trust\" className={cn(\"mx-auto max-w-6xl px-4 py-12 sm:py-16\", className)}>\n <ul className={cn(\"grid grid-cols-1 gap-8 sm:grid-cols-2\", items.length === 3 ? \"lg:grid-cols-3\" : \"lg:grid-cols-4\")}>\n {items.map((item, i) => (\n <li key={i}>\n {item.icon != null && (\n <span aria-hidden className=\"flex text-[var(--brand)] [&_svg]:size-5\">\n {item.icon}\n </span>\n )}\n <Heading className=\"mt-2 text-sm font-semibold text-[var(--text-primary)]\">{item.title}</Heading>\n <p className=\"mt-1 text-sm text-[var(--text-secondary)]\">{item.description}</p>\n </li>\n ))}\n </ul>\n </section>\n );\n}\n\n/* ── CTA band ────────────────────────────────────────────────────────────── */\n\nexport interface CtaBandProps extends Omit<ComponentPropsWithoutRef<\"section\">, \"title\" | \"children\">, ActionProps {\n /** The band's `h2`: the last ask. */\n title: ReactNode;\n subtitle?: ReactNode;\n /** Replaces the action pair ({@link LandingActions}). */\n actions?: ReactNode;\n /** Default `h2`. */\n headingAs?: HeadingLevel;\n labels?: Partial<LandingLabels>;\n}\n\n/**\n * The closing band before the footer (§4.1.5): a centred `h2`, a subtitle, and the same\n * action pair as the hero.\n */\nexport function CtaBand({\n title,\n subtitle,\n actions,\n headingAs: Heading = \"h2\",\n session,\n access,\n demoHref,\n openAppHref,\n labels,\n className,\n ...rest\n}: CtaBandProps) {\n return (\n <section\n {...rest}\n data-slot=\"landing-cta\"\n className={cn(\"border-t border-[var(--border)] bg-[var(--bg-surface)]\", className)}\n >\n <div className=\"mx-auto max-w-5xl px-4 py-16 text-center\">\n <Heading className=\"text-2xl font-semibold tracking-tight text-balance text-[var(--text-primary)] sm:text-3xl\">\n {title}\n </Heading>\n {subtitle != null && <p className=\"mx-auto mt-3 max-w-xl text-[var(--text-secondary)]\">{subtitle}</p>}\n <div className=\"mt-8\">\n {actions ?? (\n <LandingActions\n session={session}\n access={access}\n demoHref={demoHref}\n openAppHref={openAppHref}\n align=\"center\"\n labels={labels}\n />\n )}\n </div>\n </div>\n </section>\n );\n}\n\n/* ── Footer ──────────────────────────────────────────────────────────────── */\n\nexport interface PublicFooterProps extends Omit<LegalFooterProps, \"children\"> {\n /** The app's line under the legal links: \"Self-hosted household budgeting.\" */\n tagline?: ReactNode;\n}\n\n/**\n * The public pages' footer (§4.1.6): the kit's {@link LegalFooter} — the three legal\n * links — with the app's tagline under them. keksdose's `SiteFooter`, which was already\n * this.\n */\nexport function PublicFooter({ tagline, ...rest }: PublicFooterProps) {\n return <LegalFooter {...rest}>{tagline}</LegalFooter>;\n}\n"],"mappings":";AA+BI,cA6EE,YA7EF;AA7BJ,SAAS,UAAU;AACnB,SAAS,YAAY;AACrB,SAAS,mBAAmB;AAE5B,SAAS,sBAAsB;AAE/B,SAAS,wBAAwB;AAqBjC,SAAS,OAAO,EAAE,UAAU,UAAU,GAAgD;AACpF,SACE,oBAAC,SAAI,eAAW,MAAC,OAAK,MAAC,aAAU,kBAAiB,WAAW,GAAG,8BAA8B,SAAS,GACpG,UACH;AAEJ;AAiCO,SAAS,KAAK;AAAA,EACnB;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW,UAAU;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA,GAAG;AACL,GAAc;AACZ,QAAM,SAAS,iBAAiB,UAAU;AAC1C,QAAM,aACJ,UACC;AAAA;AAAA,IAEC,oBAAC,QAAK,MAAK,MAAK,MAAK,WAAU,WAAU,yBACtC,iBAAO,MACV;AAAA,MACE;AACN,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,aAAU;AAAA,MACV,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,QAKT;AAAA,QACA,UAAU,QAAQ;AAAA,QAClB;AAAA,MACF;AAAA,MAEA;AAAA,6BAAC,SACE;AAAA,wBAAc,QAAQ,oBAAC,SAAI,WAAU,QAAQ,sBAAW;AAAA,UACzD,oBAAC,WAAQ,WAAU,yFAChB,iBACH;AAAA,UACC,YAAY,QAAQ,oBAAC,OAAE,WAAU,sDAAsD,oBAAS;AAAA,UACjG,oBAAC,SAAI,WAAU,QACZ,qBACC;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,QAAQ;AAAA;AAAA,UACV,GAEJ;AAAA,UACC,SAAS,QAAQ,oBAAC,OAAE,WAAU,yCAAyC,iBAAM;AAAA,WAChF;AAAA,QACC,UAAU,QAAQ,oBAAC,UAAO,WAAU,YAAY,kBAAO;AAAA;AAAA;AAAA,EAC1D;AAEJ;AAYO,SAAS,YAAY,EAAE,WAAW,UAAU,GAAG,KAAK,GAAqB;AAC9E,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,aAAU;AAAA,MACV,WAAW,GAAG,0DAA0D,SAAS;AAAA,MAEjF,8BAAC,SAAI,WAAU,wCAAwC,UAAS;AAAA;AAAA,EAClE;AAEJ;AAwBO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW,UAAU;AAAA,EACrB;AAAA,EACA,GAAG;AACL,GAAoB;AAClB,QAAM,QAAQ,SAAS,MAAM,GAAG,CAAC,KAAK,CAAC;AACvC,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,aAAU;AAAA,MACV,WAAW,GAAG,2DAA2D,UAAU,QAAQ,4BAA4B,SAAS;AAAA,MAEhI;AAAA,6BAAC,SAAI,WAAU,oCACX;AAAA,mBAAQ,QAAQ,WAAW,SAC3B,qBAAC,OAAE,WAAU,8FACV;AAAA,oBAAQ,QACP,oBAAC,UAAK,eAAW,MAAC,WAAU,gCACzB,gBACH;AAAA,YAED;AAAA,aACH;AAAA,UAEF,oBAAC,WAAQ,WAAU,kGAChB,iBACH;AAAA,UACC,eAAe,QAAQ,oBAAC,OAAE,WAAU,8CAA8C,uBAAY;AAAA,UAC9F,MAAM,SAAS,KACd,oBAAC,QAAG,WAAU,kBACX,gBAAM,IAAI,CAAC,QAAQ,MAClB,qBAAC,QAAW,WAAU,qDACpB;AAAA,gCAAC,UAAK,eAAW,MAAC,WAAU,2DAA0D;AAAA,YACtF,oBAAC,UAAK,WAAU,WAAW,kBAAO;AAAA,eAF3B,CAGT,CACD,GACH;AAAA,WAEJ;AAAA,QACC,UAAU,QAAQ,oBAAC,UAAO,WAAU,YAAY,kBAAO;AAAA;AAAA;AAAA,EAC1D;AAEJ;AAyBO,SAAS,WAAW,EAAE,OAAO,WAAW,UAAU,MAAM,WAAW,GAAG,KAAK,GAAoB;AACpG,SACE,oBAAC,aAAS,GAAG,MAAM,aAAU,iBAAgB,WAAW,GAAG,yCAAyC,SAAS,GAC3G,8BAAC,QAAG,WAAW,GAAG,yCAAyC,MAAM,WAAW,IAAI,mBAAmB,gBAAgB,GAChH,gBAAM,IAAI,CAAC,MAAM,MAChB,qBAAC,QACE;AAAA,SAAK,QAAQ,QACZ,oBAAC,UAAK,eAAW,MAAC,WAAU,2CACzB,eAAK,MACR;AAAA,IAEF,oBAAC,WAAQ,WAAU,yDAAyD,eAAK,OAAM;AAAA,IACvF,oBAAC,OAAE,WAAU,6CAA6C,eAAK,aAAY;AAAA,OAPpE,CAQT,CACD,GACH,GACF;AAEJ;AAmBO,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW,UAAU;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAiB;AACf,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,aAAU;AAAA,MACV,WAAW,GAAG,0DAA0D,SAAS;AAAA,MAEjF,+BAAC,SAAI,WAAU,4CACb;AAAA,4BAAC,WAAQ,WAAU,6FAChB,iBACH;AAAA,QACC,YAAY,QAAQ,oBAAC,OAAE,WAAU,sDAAsD,oBAAS;AAAA,QACjG,oBAAC,SAAI,WAAU,QACZ,qBACC;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,OAAM;AAAA,YACN;AAAA;AAAA,QACF,GAEJ;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;AAcO,SAAS,aAAa,EAAE,SAAS,GAAG,KAAK,GAAsB;AACpE,SAAO,oBAAC,eAAa,GAAG,MAAO,mBAAQ;AACzC;","names":[]}
@@ -4,7 +4,7 @@ import { TopBarProps } from '../shell/top-bar.js';
4
4
  import { AccessChoice } from './access.js';
5
5
  import { LandingLabels } from './landing-labels.js';
6
6
  import { LandingSession } from './landing-actions.js';
7
- import '../delete-account-setting-BvdQdbv3.js';
7
+ import '../delete-account-setting-Dy4kJgUm.js';
8
8
  import '../components/tooltip.js';
9
9
  import '../hooks/use-anchored-rect.js';
10
10
  import '../lib/clipping.js';
@@ -1,7 +1,7 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
3
  import { LandingSession } from './landing-actions.js';
4
- import '../delete-account-setting-BvdQdbv3.js';
4
+ import '../delete-account-setting-Dy4kJgUm.js';
5
5
  import '../components/tooltip.js';
6
6
  import '../hooks/use-anchored-rect.js';
7
7
  import '../lib/clipping.js';
@@ -1,7 +1,7 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode, ReactElement } from 'react';
3
3
  import { FieldValues, FieldPath, ControllerProps, ControllerRenderProps, ControllerFieldState } from 'react-hook-form';
4
- import { dE as IbanInputProps, es as PhoneInputProps, eY as SelectProps, dO as InputProps, fj as TextareaProps } from '../delete-account-setting-BvdQdbv3.js';
4
+ import { dE as IbanInputProps, es as PhoneInputProps, eY as SelectProps, dO as InputProps, fj as TextareaProps } from '../delete-account-setting-Dy4kJgUm.js';
5
5
  import { NumberFieldProps } from '../components/number-field.js';
6
6
  import { DatePickerProps, DateRangePickerProps } from '../components/date-picker.js';
7
7
  import { TimeInputProps } from '../components/time-input.js';
@@ -2,7 +2,7 @@ import * as react from 'react';
2
2
  import { ReactElement, ComponentProps } from 'react';
3
3
  import * as react_hook_form from 'react-hook-form';
4
4
  import { FieldValues, FieldPath, ControllerProps } from 'react-hook-form';
5
- import { e5 as LabelProps } from '../delete-account-setting-BvdQdbv3.js';
5
+ import { e5 as LabelProps } from '../delete-account-setting-Dy4kJgUm.js';
6
6
  import '../components/tooltip.js';
7
7
  import '../hooks/use-anchored-rect.js';
8
8
  import '../lib/clipping.js';
package/dist/rhf.d.ts CHANGED
@@ -4,7 +4,7 @@ export { RhfCheckbox, RhfCheckboxProps, RhfCombobox, RhfComboboxProps, RhfCountr
4
4
  export { RhfLineItemCellContext, RhfLineItems, RhfLineItemsColumn, RhfLineItemsProps } from './rhf/line-items.js';
5
5
  import 'react';
6
6
  import 'react-hook-form';
7
- import './delete-account-setting-BvdQdbv3.js';
7
+ import './delete-account-setting-Dy4kJgUm.js';
8
8
  import './components/tooltip.js';
9
9
  import './hooks/use-anchored-rect.js';
10
10
  import './lib/clipping.js';
@@ -1,6 +1,6 @@
1
1
  import * as react from 'react';
2
2
  import { ComponentPropsWithoutRef, ReactNode } from 'react';
3
- import { c4 as CardTone } from '../delete-account-setting-BvdQdbv3.js';
3
+ import { c4 as CardTone } from '../delete-account-setting-Dy4kJgUm.js';
4
4
  import '../components/tooltip.js';
5
5
  import '../hooks/use-anchored-rect.js';
6
6
  import '../lib/clipping.js';
@@ -64,7 +64,7 @@ interface UseAccountAppearanceOptions {
64
64
  interface AccountAppearance extends ResolvedAccountAppearance {
65
65
  /** The user picked a size: it becomes the device's choice and — signed in, and not a
66
66
  * demo — the account's. The promise is `save`'s; the device keeps the pick if it
67
- * fails, and the app says so. */
67
+ * fails, and the app says so (`appearance.saveFailed`, 0.32.1). */
68
68
  pickTextSize: (size: TextSize) => Promise<unknown>;
69
69
  /** As {@link pickTextSize}, for the contrast mode. */
70
70
  pickContrast: (mode: ContrastMode) => Promise<unknown>;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/settings/use-account-appearance.ts"],"sourcesContent":["import { useCallback, useMemo } from \"react\";\nimport { isTextSize, resolveTextSize } from \"../theme/text-size\";\nimport type { TextSize } from \"../theme/text-size\";\nimport { isContrastMode, resolveContrastMode } from \"../theme/contrast\";\nimport type { ContrastMode } from \"../theme/contrast\";\n\n/**\n * The text size and contrast follow the account like the language does\n * (docs/text-size-harmonization.md §2.2, §2.6, §6; settings contract §6.2) — the same\n * rule as {@link useAccountLanguage}, for two values at once.\n */\n\n/** Where a value in force came from, in the order they are asked. */\nexport type AppearanceSource = \"device\" | \"account\" | \"default\";\n\n/** The two fields of an `/auth/me` answer this reads — server-kit 0.6's `UserResponse`,\n * both nullable (null = never chosen). */\nexport interface AccountAppearanceFields {\n text_size?: string | null;\n contrast?: string | null;\n}\n\n/** This device's own choices — the text-size and contrast stores' values, `null` where\n * this device never chose. */\nexport interface DeviceAppearance {\n textSize?: string | null;\n contrast?: string | null;\n}\n\n/** The body of `PATCH /auth/me` for a pick: one field, as server-kit's `ProfileUpdate`\n * spells it. */\nexport type AccountAppearancePatch = { text_size: TextSize } | { contrast: ContrastMode };\n\nexport interface ResolvedAccountAppearance {\n textSize: TextSize;\n /** The stored MODE — \"system\" included — not whether more contrast is on now. */\n contrast: ContrastMode;\n sources: { textSize: AppearanceSource; contrast: AppearanceSource };\n}\n\nfunction source(device: boolean, account: boolean): AppearanceSource {\n return device ? \"device\" : account ? \"account\" : \"default\";\n}\n\n/**\n * The values on a device (§2.6): **its own choice → the account's → the default**\n * (Normal; \"system\" for contrast), each taken only when it is a known value. Pure.\n */\nexport function resolveAccountAppearance(\n device: DeviceAppearance,\n account: AccountAppearanceFields | null | undefined,\n): ResolvedAccountAppearance {\n return {\n textSize: resolveTextSize(device.textSize, account?.text_size),\n contrast: resolveContrastMode(device.contrast, account?.contrast),\n sources: {\n textSize: source(isTextSize(device.textSize), isTextSize(account?.text_size)),\n contrast: source(isContrastMode(device.contrast), isContrastMode(account?.contrast)),\n },\n };\n}\n\nexport interface UseAccountAppearanceOptions {\n /** The signed-in account (`/auth/me`), or `null` / `undefined` while signed out or not\n * loaded yet — then nothing is saved to it. */\n account: AccountAppearanceFields | null | undefined;\n /** This device's own choices: `useTextSizeStore((s) => s.size)` and\n * `useContrastStore((s) => s.contrast)`. */\n device: DeviceAppearance;\n /** Store a device choice: `(patch) => { if (patch.textSize) setSize(patch.textSize);\n * if (patch.contrast) setContrast(patch.contrast); }`. */\n setDevice: (patch: { textSize?: TextSize; contrast?: ContrastMode }) => void;\n /** Write the account: `PATCH /auth/me` with the patch as its body. Return its promise. */\n save: (patch: AccountAppearancePatch) => unknown;\n /** A demo session: a pick stays on the device, the account is never written (§6). */\n isDemo?: boolean;\n}\n\nexport interface AccountAppearance extends ResolvedAccountAppearance {\n /** The user picked a size: it becomes the device's choice and — signed in, and not a\n * demo — the account's. The promise is `save`'s; the device keeps the pick if it\n * fails, and the app says so. */\n pickTextSize: (size: TextSize) => Promise<unknown>;\n /** As {@link pickTextSize}, for the contrast mode. */\n pickContrast: (mode: ContrastMode) => Promise<unknown>;\n}\n\n/**\n * The account's text size and contrast on this device (§6): the order of\n * {@link resolveAccountAppearance}, and the writes.\n *\n * - **Nothing writes the account on its own.** Rendering, signing in and adopting the\n * account's values call neither `save` nor `setDevice`, so a new device adopts the\n * account instead of overwriting it.\n * - **A pick** writes the device's choice, then `save` — except in a demo session or\n * signed out.\n *\n * The hook only answers. The values are put in force by the stores' apply hooks, which\n * resolve the same order from the same inputs:\n *\n * ```tsx\n * useApplyTextSize({ account: me?.text_size });\n * useApplyContrast({ account: me?.contrast });\n * ```\n */\nexport function useAccountAppearance(options: UseAccountAppearanceOptions): AccountAppearance {\n const { account, device, setDevice, save, isDemo = false } = options;\n const deviceTextSize = device.textSize;\n const deviceContrast = device.contrast;\n const accountTextSize = account?.text_size;\n const accountContrast = account?.contrast;\n const signedIn = account !== null && account !== undefined;\n // By value, so a fresh `/auth/me` object with the same two fields changes nothing.\n const resolved = useMemo(\n () =>\n resolveAccountAppearance(\n { textSize: deviceTextSize, contrast: deviceContrast },\n signedIn ? { text_size: accountTextSize, contrast: accountContrast } : undefined,\n ),\n [deviceTextSize, deviceContrast, signedIn, accountTextSize, accountContrast],\n );\n const write = useCallback(\n (patch: AccountAppearancePatch) => {\n if (isDemo || !signedIn) return Promise.resolve();\n try {\n return Promise.resolve(save(patch));\n } catch (error) {\n return Promise.reject(error);\n }\n },\n [save, isDemo, signedIn],\n );\n const pickTextSize = useCallback(\n (size: TextSize) => {\n setDevice({ textSize: size });\n return write({ text_size: size });\n },\n [setDevice, write],\n );\n const pickContrast = useCallback(\n (mode: ContrastMode) => {\n setDevice({ contrast: mode });\n return write({ contrast: mode });\n },\n [setDevice, write],\n );\n return { ...resolved, pickTextSize, pickContrast };\n}\n"],"mappings":";AAAA,SAAS,aAAa,eAAe;AACrC,SAAS,YAAY,uBAAuB;AAE5C,SAAS,gBAAgB,2BAA2B;AAqCpD,SAAS,OAAO,QAAiB,SAAoC;AACnE,SAAO,SAAS,WAAW,UAAU,YAAY;AACnD;AAMO,SAAS,yBACd,QACA,SAC2B;AAC3B,SAAO;AAAA,IACL,UAAU,gBAAgB,OAAO,UAAU,SAAS,SAAS;AAAA,IAC7D,UAAU,oBAAoB,OAAO,UAAU,SAAS,QAAQ;AAAA,IAChE,SAAS;AAAA,MACP,UAAU,OAAO,WAAW,OAAO,QAAQ,GAAG,WAAW,SAAS,SAAS,CAAC;AAAA,MAC5E,UAAU,OAAO,eAAe,OAAO,QAAQ,GAAG,eAAe,SAAS,QAAQ,CAAC;AAAA,IACrF;AAAA,EACF;AACF;AA6CO,SAAS,qBAAqB,SAAyD;AAC5F,QAAM,EAAE,SAAS,QAAQ,WAAW,MAAM,SAAS,MAAM,IAAI;AAC7D,QAAM,iBAAiB,OAAO;AAC9B,QAAM,iBAAiB,OAAO;AAC9B,QAAM,kBAAkB,SAAS;AACjC,QAAM,kBAAkB,SAAS;AACjC,QAAM,WAAW,YAAY,QAAQ,YAAY;AAEjD,QAAM,WAAW;AAAA,IACf,MACE;AAAA,MACE,EAAE,UAAU,gBAAgB,UAAU,eAAe;AAAA,MACrD,WAAW,EAAE,WAAW,iBAAiB,UAAU,gBAAgB,IAAI;AAAA,IACzE;AAAA,IACF,CAAC,gBAAgB,gBAAgB,UAAU,iBAAiB,eAAe;AAAA,EAC7E;AACA,QAAM,QAAQ;AAAA,IACZ,CAAC,UAAkC;AACjC,UAAI,UAAU,CAAC,SAAU,QAAO,QAAQ,QAAQ;AAChD,UAAI;AACF,eAAO,QAAQ,QAAQ,KAAK,KAAK,CAAC;AAAA,MACpC,SAAS,OAAO;AACd,eAAO,QAAQ,OAAO,KAAK;AAAA,MAC7B;AAAA,IACF;AAAA,IACA,CAAC,MAAM,QAAQ,QAAQ;AAAA,EACzB;AACA,QAAM,eAAe;AAAA,IACnB,CAAC,SAAmB;AAClB,gBAAU,EAAE,UAAU,KAAK,CAAC;AAC5B,aAAO,MAAM,EAAE,WAAW,KAAK,CAAC;AAAA,IAClC;AAAA,IACA,CAAC,WAAW,KAAK;AAAA,EACnB;AACA,QAAM,eAAe;AAAA,IACnB,CAAC,SAAuB;AACtB,gBAAU,EAAE,UAAU,KAAK,CAAC;AAC5B,aAAO,MAAM,EAAE,UAAU,KAAK,CAAC;AAAA,IACjC;AAAA,IACA,CAAC,WAAW,KAAK;AAAA,EACnB;AACA,SAAO,EAAE,GAAG,UAAU,cAAc,aAAa;AACnD;","names":[]}
1
+ {"version":3,"sources":["../../src/settings/use-account-appearance.ts"],"sourcesContent":["import { useCallback, useMemo } from \"react\";\nimport { isTextSize, resolveTextSize } from \"../theme/text-size\";\nimport type { TextSize } from \"../theme/text-size\";\nimport { isContrastMode, resolveContrastMode } from \"../theme/contrast\";\nimport type { ContrastMode } from \"../theme/contrast\";\n\n/**\n * The text size and contrast follow the account like the language does\n * (docs/text-size-harmonization.md §2.2, §2.6, §6; settings contract §6.2) — the same\n * rule as {@link useAccountLanguage}, for two values at once.\n */\n\n/** Where a value in force came from, in the order they are asked. */\nexport type AppearanceSource = \"device\" | \"account\" | \"default\";\n\n/** The two fields of an `/auth/me` answer this reads — server-kit 0.6's `UserResponse`,\n * both nullable (null = never chosen). */\nexport interface AccountAppearanceFields {\n text_size?: string | null;\n contrast?: string | null;\n}\n\n/** This device's own choices — the text-size and contrast stores' values, `null` where\n * this device never chose. */\nexport interface DeviceAppearance {\n textSize?: string | null;\n contrast?: string | null;\n}\n\n/** The body of `PATCH /auth/me` for a pick: one field, as server-kit's `ProfileUpdate`\n * spells it. */\nexport type AccountAppearancePatch = { text_size: TextSize } | { contrast: ContrastMode };\n\nexport interface ResolvedAccountAppearance {\n textSize: TextSize;\n /** The stored MODE — \"system\" included — not whether more contrast is on now. */\n contrast: ContrastMode;\n sources: { textSize: AppearanceSource; contrast: AppearanceSource };\n}\n\nfunction source(device: boolean, account: boolean): AppearanceSource {\n return device ? \"device\" : account ? \"account\" : \"default\";\n}\n\n/**\n * The values on a device (§2.6): **its own choice → the account's → the default**\n * (Normal; \"system\" for contrast), each taken only when it is a known value. Pure.\n */\nexport function resolveAccountAppearance(\n device: DeviceAppearance,\n account: AccountAppearanceFields | null | undefined,\n): ResolvedAccountAppearance {\n return {\n textSize: resolveTextSize(device.textSize, account?.text_size),\n contrast: resolveContrastMode(device.contrast, account?.contrast),\n sources: {\n textSize: source(isTextSize(device.textSize), isTextSize(account?.text_size)),\n contrast: source(isContrastMode(device.contrast), isContrastMode(account?.contrast)),\n },\n };\n}\n\nexport interface UseAccountAppearanceOptions {\n /** The signed-in account (`/auth/me`), or `null` / `undefined` while signed out or not\n * loaded yet — then nothing is saved to it. */\n account: AccountAppearanceFields | null | undefined;\n /** This device's own choices: `useTextSizeStore((s) => s.size)` and\n * `useContrastStore((s) => s.contrast)`. */\n device: DeviceAppearance;\n /** Store a device choice: `(patch) => { if (patch.textSize) setSize(patch.textSize);\n * if (patch.contrast) setContrast(patch.contrast); }`. */\n setDevice: (patch: { textSize?: TextSize; contrast?: ContrastMode }) => void;\n /** Write the account: `PATCH /auth/me` with the patch as its body. Return its promise. */\n save: (patch: AccountAppearancePatch) => unknown;\n /** A demo session: a pick stays on the device, the account is never written (§6). */\n isDemo?: boolean;\n}\n\nexport interface AccountAppearance extends ResolvedAccountAppearance {\n /** The user picked a size: it becomes the device's choice and — signed in, and not a\n * demo — the account's. The promise is `save`'s; the device keeps the pick if it\n * fails, and the app says so (`appearance.saveFailed`, 0.32.1). */\n pickTextSize: (size: TextSize) => Promise<unknown>;\n /** As {@link pickTextSize}, for the contrast mode. */\n pickContrast: (mode: ContrastMode) => Promise<unknown>;\n}\n\n/**\n * The account's text size and contrast on this device (§6): the order of\n * {@link resolveAccountAppearance}, and the writes.\n *\n * - **Nothing writes the account on its own.** Rendering, signing in and adopting the\n * account's values call neither `save` nor `setDevice`, so a new device adopts the\n * account instead of overwriting it.\n * - **A pick** writes the device's choice, then `save` — except in a demo session or\n * signed out.\n *\n * The hook only answers. The values are put in force by the stores' apply hooks, which\n * resolve the same order from the same inputs:\n *\n * ```tsx\n * useApplyTextSize({ account: me?.text_size });\n * useApplyContrast({ account: me?.contrast });\n * ```\n */\nexport function useAccountAppearance(options: UseAccountAppearanceOptions): AccountAppearance {\n const { account, device, setDevice, save, isDemo = false } = options;\n const deviceTextSize = device.textSize;\n const deviceContrast = device.contrast;\n const accountTextSize = account?.text_size;\n const accountContrast = account?.contrast;\n const signedIn = account !== null && account !== undefined;\n // By value, so a fresh `/auth/me` object with the same two fields changes nothing.\n const resolved = useMemo(\n () =>\n resolveAccountAppearance(\n { textSize: deviceTextSize, contrast: deviceContrast },\n signedIn ? { text_size: accountTextSize, contrast: accountContrast } : undefined,\n ),\n [deviceTextSize, deviceContrast, signedIn, accountTextSize, accountContrast],\n );\n const write = useCallback(\n (patch: AccountAppearancePatch) => {\n if (isDemo || !signedIn) return Promise.resolve();\n try {\n return Promise.resolve(save(patch));\n } catch (error) {\n return Promise.reject(error);\n }\n },\n [save, isDemo, signedIn],\n );\n const pickTextSize = useCallback(\n (size: TextSize) => {\n setDevice({ textSize: size });\n return write({ text_size: size });\n },\n [setDevice, write],\n );\n const pickContrast = useCallback(\n (mode: ContrastMode) => {\n setDevice({ contrast: mode });\n return write({ contrast: mode });\n },\n [setDevice, write],\n );\n return { ...resolved, pickTextSize, pickContrast };\n}\n"],"mappings":";AAAA,SAAS,aAAa,eAAe;AACrC,SAAS,YAAY,uBAAuB;AAE5C,SAAS,gBAAgB,2BAA2B;AAqCpD,SAAS,OAAO,QAAiB,SAAoC;AACnE,SAAO,SAAS,WAAW,UAAU,YAAY;AACnD;AAMO,SAAS,yBACd,QACA,SAC2B;AAC3B,SAAO;AAAA,IACL,UAAU,gBAAgB,OAAO,UAAU,SAAS,SAAS;AAAA,IAC7D,UAAU,oBAAoB,OAAO,UAAU,SAAS,QAAQ;AAAA,IAChE,SAAS;AAAA,MACP,UAAU,OAAO,WAAW,OAAO,QAAQ,GAAG,WAAW,SAAS,SAAS,CAAC;AAAA,MAC5E,UAAU,OAAO,eAAe,OAAO,QAAQ,GAAG,eAAe,SAAS,QAAQ,CAAC;AAAA,IACrF;AAAA,EACF;AACF;AA6CO,SAAS,qBAAqB,SAAyD;AAC5F,QAAM,EAAE,SAAS,QAAQ,WAAW,MAAM,SAAS,MAAM,IAAI;AAC7D,QAAM,iBAAiB,OAAO;AAC9B,QAAM,iBAAiB,OAAO;AAC9B,QAAM,kBAAkB,SAAS;AACjC,QAAM,kBAAkB,SAAS;AACjC,QAAM,WAAW,YAAY,QAAQ,YAAY;AAEjD,QAAM,WAAW;AAAA,IACf,MACE;AAAA,MACE,EAAE,UAAU,gBAAgB,UAAU,eAAe;AAAA,MACrD,WAAW,EAAE,WAAW,iBAAiB,UAAU,gBAAgB,IAAI;AAAA,IACzE;AAAA,IACF,CAAC,gBAAgB,gBAAgB,UAAU,iBAAiB,eAAe;AAAA,EAC7E;AACA,QAAM,QAAQ;AAAA,IACZ,CAAC,UAAkC;AACjC,UAAI,UAAU,CAAC,SAAU,QAAO,QAAQ,QAAQ;AAChD,UAAI;AACF,eAAO,QAAQ,QAAQ,KAAK,KAAK,CAAC;AAAA,MACpC,SAAS,OAAO;AACd,eAAO,QAAQ,OAAO,KAAK;AAAA,MAC7B;AAAA,IACF;AAAA,IACA,CAAC,MAAM,QAAQ,QAAQ;AAAA,EACzB;AACA,QAAM,eAAe;AAAA,IACnB,CAAC,SAAmB;AAClB,gBAAU,EAAE,UAAU,KAAK,CAAC;AAC5B,aAAO,MAAM,EAAE,WAAW,KAAK,CAAC;AAAA,IAClC;AAAA,IACA,CAAC,WAAW,KAAK;AAAA,EACnB;AACA,QAAM,eAAe;AAAA,IACnB,CAAC,SAAuB;AACtB,gBAAU,EAAE,UAAU,KAAK,CAAC;AAC5B,aAAO,MAAM,EAAE,UAAU,KAAK,CAAC;AAAA,IACjC;AAAA,IACA,CAAC,WAAW,KAAK;AAAA,EACnB;AACA,SAAO,EAAE,GAAG,UAAU,cAAc,aAAa;AACnD;","names":[]}
@@ -1,7 +1,7 @@
1
1
  import 'react';
2
2
  import 'lucide-react';
3
3
  import '../theme/text-size.js';
4
- export { bA as AppShell, bC as AppShellMoreLabels, bD as AppShellNavItem, bE as AppShellProps, bF as AppShellSidebarFooterItem, bG as AppShellSubItem, co as DEFAULT_APP_SHELL_MORE_LABELS, cG as DEFAULT_MOBILE_BAR_MAX, fZ as splitMobileBar } from '../delete-account-setting-BvdQdbv3.js';
4
+ export { bA as AppShell, bC as AppShellMoreLabels, bD as AppShellNavItem, bE as AppShellProps, bF as AppShellSidebarFooterItem, bG as AppShellSubItem, co as DEFAULT_APP_SHELL_MORE_LABELS, cG as DEFAULT_MOBILE_BAR_MAX, fZ as splitMobileBar } from '../delete-account-setting-Dy4kJgUm.js';
5
5
  import 'zustand/middleware';
6
6
  import 'zustand';
7
7
  import '../components/tooltip.js';
@@ -67,7 +67,7 @@ function AppShell({
67
67
  expandLabel,
68
68
  subNav = "flyout",
69
69
  mobileSubNav = true,
70
- mobileSubNavLayout = "wrap",
70
+ mobileSubNavLayout: mobileSubNavLayoutProp,
71
71
  mobileBarMax,
72
72
  moreLabels,
73
73
  toggleGroupLabel,
@@ -78,6 +78,7 @@ function AppShell({
78
78
  const embedded = useContext(AppShellNesting) || !!embeddedProp;
79
79
  const { size: textSize } = useTextSize();
80
80
  const large = textSize !== "normal";
81
+ const mobileSubNavLayout = mobileSubNavLayoutProp ?? (large ? "scroll" : "wrap");
81
82
  const barMax = typeof mobileBarMax === "number" ? mobileBarMax : mobileBarMax?.[textSize] ?? DEFAULT_MOBILE_BAR_MAX[textSize];
82
83
  const { shown: barNav, hidden: moreNav } = splitMobileBar(
83
84
  nav.filter((item) => !item.mobileHidden),