@eifi1/ui-kit 0.31.0 → 0.31.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/dist/account/delete-account-setting.d.ts +1 -1
- package/dist/admin/admin-action-confirm.d.ts +1 -1
- package/dist/admin/admin-parts.d.ts +8 -1
- package/dist/admin/admin-parts.js +1 -1
- package/dist/admin/admin-parts.js.map +1 -1
- package/dist/admin/invitations-panel.d.ts +1 -1
- package/dist/admin/reviewer-scope-editor.d.ts +1 -1
- package/dist/admin/role-select.d.ts +1 -1
- package/dist/admin/transfer-ownership-dialog.d.ts +1 -1
- package/dist/admin/user-roster.d.ts +1 -1
- package/dist/auth/register-form.d.ts +1 -1
- package/dist/auth/reset-password-form.d.ts +1 -1
- package/dist/auth/reset-password-form.js +2 -1
- package/dist/auth/reset-password-form.js.map +1 -1
- package/dist/auth/verify-email.d.ts +4 -0
- package/dist/auth/verify-email.js +3 -2
- package/dist/auth/verify-email.js.map +1 -1
- package/dist/chart.d.ts +1 -1
- package/dist/components/amount-input.d.ts +1 -1
- package/dist/components/button-group.d.ts +1 -1
- package/dist/components/calculator.d.ts +1 -1
- package/dist/components/confirm-dialog.d.ts +1 -1
- package/dist/components/confirm-dialog.js +7 -1
- package/dist/components/confirm-dialog.js.map +1 -1
- package/dist/components/copy-button.d.ts +1 -1
- package/dist/components/danger-confirm.d.ts +1 -1
- package/dist/components/facing-pair.d.ts +1 -1
- package/dist/components/file-button.d.ts +1 -1
- package/dist/components/file-dropzone.d.ts +1 -1
- package/dist/components/form-actions.d.ts +1 -1
- package/dist/components/iban-input.d.ts +1 -1
- package/dist/components/language-select.d.ts +1 -1
- package/dist/components/legal-page.d.ts +1 -1
- package/dist/components/legal.d.ts +1 -1
- package/dist/components/money-field.d.ts +1 -1
- package/dist/components/number-field.d.ts +1 -1
- package/dist/components/number-input.d.ts +1 -1
- package/dist/components/numpad-sheet.d.ts +1 -1
- package/dist/components/phone-input.d.ts +1 -1
- package/dist/components/series-chart.d.ts +1 -1
- package/dist/components/settings-fields.d.ts +1 -1
- package/dist/components/share-card.d.ts +1 -1
- package/dist/components/text-link.d.ts +1 -1
- package/dist/components/time-input.d.ts +1 -1
- package/dist/components/ui.d.ts +1 -1
- package/dist/{delete-account-setting-DCFS5Vof.d.ts → delete-account-setting-CpIhzxxZ.d.ts} +8 -0
- package/dist/feedback/feedback-attachment.d.ts +1 -1
- package/dist/feedback/feedback-context.d.ts +1 -1
- package/dist/feedback/feedback-crash.d.ts +1 -1
- package/dist/feedback/feedback-dialog.d.ts +1 -1
- package/dist/feedback/feedback-inbox.d.ts +1 -1
- package/dist/feedback/feedback-labels.d.ts +1 -1
- package/dist/feedback/feedback-menu.d.ts +1 -1
- package/dist/feedback/feedback-record.d.ts +1 -1
- package/dist/feedback/feedback-row-detail.d.ts +1 -1
- package/dist/feedback/feedback-status-undo.d.ts +1 -1
- package/dist/feedback/feedback-submit.d.ts +1 -1
- package/dist/feedback/feedback-swipe.d.ts +1 -1
- package/dist/feedback/feedback-table.d.ts +1 -1
- package/dist/feedback/feedback-thread.d.ts +1 -1
- package/dist/feedback.d.ts +1 -1
- package/dist/hooks/use-file-drop.d.ts +1 -1
- package/dist/i18n/defaults.d.ts +1 -1
- package/dist/i18n/german.d.ts +1 -1
- package/dist/i18n/german.js +2 -1
- package/dist/i18n/german.js.map +1 -1
- package/dist/i18n/kit-labels.d.ts +1 -1
- package/dist/i18n/languages.d.ts +1 -1
- package/dist/i18n/locales/de-CH.d.ts +1 -1
- package/dist/i18n/locales/en.d.ts +1 -1
- package/dist/i18n/locales/es.d.ts +1 -1
- package/dist/i18n/locales/es.js +2 -1
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +1 -1
- package/dist/i18n/locales/fr.js +2 -1
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hu.d.ts +1 -1
- package/dist/i18n/locales/hu.js +2 -1
- package/dist/i18n/locales/hu.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +1 -1
- package/dist/i18n/locales/it.js +2 -1
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +1 -1
- package/dist/i18n/locales/zh.js +2 -1
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/i18n/review.d.ts +1 -1
- package/dist/i18n/review.js +1 -0
- package/dist/i18n/review.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/landing/landing-actions.d.ts +5 -3
- package/dist/landing/landing-actions.js +1 -1
- package/dist/landing/landing-actions.js.map +1 -1
- package/dist/landing/landing-sections.d.ts +1 -1
- package/dist/landing/public-header.d.ts +1 -1
- package/dist/landing/routing.d.ts +20 -7
- package/dist/landing/routing.js +5 -2
- package/dist/landing/routing.js.map +1 -1
- package/dist/rhf/fields.d.ts +1 -1
- package/dist/rhf/form.d.ts +1 -1
- package/dist/rhf.d.ts +1 -1
- package/dist/settings/settings-labels.d.ts +8 -1
- package/dist/settings/settings-labels.js +7 -2
- package/dist/settings/settings-labels.js.map +1 -1
- package/dist/settings/settings-section.d.ts +1 -1
- package/dist/shell/app-shell.d.ts +1 -1
- package/dist/shell/top-bar-brand.d.ts +1 -1
- package/dist/shell.d.ts +2 -2
- package/dist/shell.js.map +1 -1
- package/dist/wizard/stepper-nav.d.ts +1 -1
- package/dist/wizard.d.ts +1 -1
- package/package.json +1 -1
- package/src/admin/admin-parts.ts +9 -2
- package/src/auth/reset-password-form.tsx +6 -2
- package/src/auth/verify-email.tsx +14 -2
- package/src/components/confirm-dialog.tsx +20 -1
- package/src/i18n/german.ts +2 -1
- package/src/i18n/locales/es.ts +2 -1
- package/src/i18n/locales/fr.ts +2 -1
- package/src/i18n/locales/hu.ts +2 -1
- package/src/i18n/locales/it.ts +2 -1
- package/src/i18n/locales/zh.ts +2 -1
- package/src/i18n/review.ts +1 -0
- package/src/index.ts +8 -2
- package/src/landing/landing-actions.tsx +9 -5
- package/src/landing/routing.tsx +22 -5
- package/src/settings/settings-labels.ts +13 -1
- package/src/shell.ts +7 -1
package/dist/index.d.ts
CHANGED
|
@@ -26,7 +26,7 @@ export { AnchorRole, ChartRampReport, ContrastCheck, ContrastReport, DeriveOptio
|
|
|
26
26
|
export { ALTERNATIVE_PRESETS, DEFAULT_PRESET, DERIVED_PRESETS, IMPRINT_PRESET, PALETTES, PalettePreset, TokenSet, applyTokenSet, presetById } from './theme/palette-presets.js';
|
|
27
27
|
export { ThemeMode, ThemePreference, ThemeState, ThemeStore, applyPersistedTheme, createThemeStore } from './theme/theme-store.js';
|
|
28
28
|
export { PaletteStore, applyPersistedPalette, createPaletteStore } from './theme/palette-store.js';
|
|
29
|
-
export { bt as AdminActionConfirm, bu as AdminActionConfirmProps, bv as AdminActionConfirmValues, bw as AdminActionLabels, bx as AdminActionTarget, by as AdminConfirmLevel, bz as AdminUserStateFields, bA as AppShellLabels, bB as Button, bC as ButtonClassesOptions, bD as ButtonLinkProps, bE as ButtonProps, bF as ButtonSize, bG as ButtonTone, bH as ButtonVariant, bI as CalculatorLabels, bJ as Card, bK as CardAction, bL as CardActionProps, bM as CardContent, bN as CardContentProps, bO as CardDensity, bP as CardDescription, bQ as CardDescriptionProps, bR as CardFooter, bS as CardFooterProps, bT as CardHeader, bU as CardHeaderProps, bV as CardProps, bW as CardTitle, bX as CardTitleLevel, bY as CardTitleProps, bZ as CardTone, b_ as CharacterCountLabels, b$ as ChartTooltipPlacement, C as ChatComposer, a as ChatComposerHandle, b as ChatComposerLabels, c as ChatComposerProps, d as ChatComposerSlotContext, c0 as ComboboxLabels, c1 as CommonLabels, c2 as ConfirmDialogLabels, c3 as ConfirmFn, c4 as ConfirmOptions, c5 as ConfirmProvider, c6 as ConfirmProviderProps, c7 as ConfirmTone, c8 as CopyButton, c9 as CopyButtonLabels, ca as CopyButtonProps, cb as CurrencyLabels, cc as CurrentPasswordInput, cd as CurrentPasswordInputLabels, ce as CurrentPasswordInputProps, cf as DEFAULT_ADMIN_ACTION_LABELS, cg as DEFAULT_APP_SHELL_LABELS, D as DEFAULT_ATTACHMENT_ACCEPT, ch as DEFAULT_CALCULATOR_LABELS, ci as DEFAULT_CHARACTER_COUNT_LABELS, cj as DEFAULT_COMBOBOX_LABELS, ck as DEFAULT_COMMON_LABELS, cl as DEFAULT_CONFIRM_DIALOG_LABELS, cm as DEFAULT_COPY_BUTTON_LABELS, cn as DEFAULT_CURRENCY_LABELS, co as DEFAULT_DANGER_CONFIRM_LABELS, cp as DEFAULT_DATE_PICKER_LABELS, cq as DEFAULT_DELETE_ACCOUNT_LABELS, e as DEFAULT_FEEDBACK_ATTACHMENT_LABELS, f as DEFAULT_FEEDBACK_CATEGORY_LABELS, g as DEFAULT_FEEDBACK_COMPOSER_LABELS, h as DEFAULT_FEEDBACK_CONTEXT_LABELS, i as DEFAULT_FEEDBACK_DETAIL_LABELS, j as DEFAULT_FEEDBACK_DIALOG_LABELS, k as DEFAULT_FEEDBACK_MENU_LABELS, l as DEFAULT_FEEDBACK_PAGE_LABELS, m as DEFAULT_FEEDBACK_STATUS_LABELS, n as DEFAULT_FEEDBACK_THREAD_LABELS, o as DEFAULT_FEEDBACK_TOAST_LABELS, cr as DEFAULT_FILE_LABELS, cs as DEFAULT_FILE_PICKER_LABELS, ct as DEFAULT_FORM_ACTIONS_LABELS, cu as DEFAULT_IBAN_INPUT_LABELS, cv as DEFAULT_INVITATIONS_LABELS, cw as DEFAULT_LEGAL_LABELS, p as DEFAULT_MAX_ATTACHMENTS, q as DEFAULT_MAX_ATTACHMENT_BYTES, cx as DEFAULT_MULTI_SELECT_LABELS, cy as DEFAULT_PASSWORD_REVEAL_LABELS, cz as DEFAULT_PHONE_INPUT_LABELS, cA as DEFAULT_PICKER_SHEET_LABELS, cB as DEFAULT_REGISTER_LABELS, cC as DEFAULT_REVIEWER_SCOPE_LABELS, cD as DEFAULT_ROLE_SELECT_LABELS, cE as DEFAULT_SHARE_CARD_LABELS, cF as DEFAULT_SWIPEABLE_ROW_LABELS, cG as DEFAULT_TABS_LABELS, cH as DEFAULT_TOP_BAR_LABELS, cI as DEFAULT_TRANSFER_OWNERSHIP_LABELS, cJ as DEFAULT_USER_ROSTER_LABELS, cK as DangerConfirm, cL as DangerConfirmLabels, cM as DangerConfirmProps, cN as DangerConfirmValues, cO as DangerConsequence, cP as DatePickerLabels, cQ as DeleteAccountConsequence, cR as DeleteAccountLabels, cS as DeleteAccountSetting, cT as DeleteAccountSettingProps, cU as DeleteAccountValues, cV as DeletionMode, cW as EmptyState, cX as EmptyStateProps, F as FEEDBACK_ATTACHMENT_ACCEPT, r as FEEDBACK_AUTHOR_EDITABLE_STATUSES, s as FEEDBACK_AWAITING_STATUSES, t as FEEDBACK_CATEGORY_META, u as FEEDBACK_CATEGORY_ORDER, v as FEEDBACK_PICKABLE_CATEGORIES, w as FEEDBACK_REWORKABLE_STATUSES, x as FEEDBACK_STATUS_META, y as FEEDBACK_STATUS_ORDER, z as FEEDBACK_UNDO_DURATION, cY as FIELD_BASE, cZ as FIELD_DISPLAY, c_ as FIELD_FLOATING_PAD, c$ as FIELD_INVALID, d0 as FIELD_TRIGGER, d1 as FIELD_WRITABLE_LOOK, d2 as FLOATING_INPUT_CLASS, d3 as FLOATING_LABEL_CLASS, A as FeedbackAttachmentError, B as FeedbackAttachmentErrorInfo, E as FeedbackAttachmentField, G as FeedbackAttachmentFieldLabels, H as FeedbackAttachmentFieldMultipleProps, I as FeedbackAttachmentFieldProps, J as FeedbackAttachmentFieldRefsProps, K as FeedbackAttachmentFieldSingleProps, L as FeedbackAttachmentLabels, M as FeedbackAttachmentRef, N as FeedbackAttachmentRefsError, O as FeedbackAwaitingToggle, P as FeedbackAwaitingToggleProps, Q as FeedbackCategory, R as FeedbackCategoryBadge, S as FeedbackCategoryLabels, T as FeedbackCategoryOption, U as FeedbackColumnsOptions, V as FeedbackComposer, W as FeedbackComposerAttachment, X as FeedbackComposerHandle, Y as FeedbackComposerLabels, Z as FeedbackComposerProps, _ as FeedbackComposerSlotContext, $ as FeedbackContext, a0 as FeedbackContextBox, a1 as FeedbackContextBoxProps, a2 as FeedbackContextInput, a3 as FeedbackContextLabels, a4 as FeedbackDetail, a5 as FeedbackDetailLabels, a6 as FeedbackDetailPatch, a7 as FeedbackDetailSection, a8 as FeedbackDetailUpdate, a9 as FeedbackDialog, aa as FeedbackDialogLabels, ab as FeedbackDialogMultipleProps, ac as FeedbackDialogProps, ad as FeedbackDialogSingleProps, ae as FeedbackDialogTextLabels, af as FeedbackEmptyState, ag as FeedbackEmptyStateProps, ah as FeedbackEnvironment, ai as FeedbackMenu, aj as FeedbackMenuLabels, ak as FeedbackMenuProps, al as FeedbackMobileCard, am as FeedbackMobileCardProps, an as FeedbackMultipleSubmission, ao as FeedbackNoteAttachment, ap as FeedbackNoteEditor, aq as FeedbackPageLabels, ar as FeedbackProse, as as FeedbackRecord, at as FeedbackRenderDate, au as FeedbackReworkSection, av as FeedbackReworkSectionProps, aw as FeedbackRowAccess, ax as FeedbackRowDetail, ay as FeedbackRowDetailProps, az as FeedbackStatus, aA as FeedbackStatusBadge, aB as FeedbackStatusChange, aC as FeedbackStatusLabels, aD as FeedbackStatusMutate, aE as FeedbackStatusPatch, aF as FeedbackStatusRow, aG as FeedbackStatusTransitions, aH as FeedbackStatusUndoOptions, aI as FeedbackSubject, aJ as FeedbackSubjectProps, aK as FeedbackSubmission, aL as FeedbackSubmitHint, aM as FeedbackSubmitter, aN as FeedbackTableRow, aO as FeedbackThread, aP as FeedbackThreadAttachment, aQ as FeedbackThreadEvent, aR as FeedbackThreadItem, aS as FeedbackThreadLabels, aT as FeedbackThreadMessage, aU as FeedbackThreadProps, aV as FeedbackToastLabels, aW as FeedbackUpload, d4 as FieldChevron, d5 as FieldChevronProps, d6 as FieldHint, d7 as FieldHintProps, d8 as FileButton, d9 as FileButtonProps, da as FileLabels, db as FilePickerLabels, dc as FileRejection, dd as FileRejectionReason, de as FileScreenOptions, df as FloatingField, dg as FloatingFieldProps, dh as FormActions, di as FormActionsAlign, dj as FormActionsDestructive, dk as FormActionsLabels, dl as FormActionsPlacement, dm as FormActionsProps, dn as FormActionsStickyWithin, dp as FormActionsSubmitProps, dq as FormActionsSubmitShortcut, dr as IbanInput, ds as IbanInputLabels, dt as IbanInputProps, du as IconButton, dv as IconButtonGlyphSize, dw as IconButtonLinkProps, dx as IconButtonProps, dy as IconButtonSize, dz as IconButtonTone, dA as IconButtonToneColor, dB as IconButtonVariant, dC as Input, dD as InputProps, dE as InvitationDraft, dF as InvitationRow, dG as InvitationScope, dH as InvitationSentAnswer, dI as InvitationStatus, dJ as InvitationsLabels, dK as InvitationsPanel, dL as InvitationsPanelProps, dM as KIT_LANGUAGES, dN as KitDateFormatContext, dO as KitDateFormatter, dP as KitLanguage, dQ as KitLanguageCode, dR as KitLinkComponent, dS as KitLinkProps, dT as LEGAL_HREFS, dU as Label, dV as LabelOverride, dW as LabelProps, dX as LegalFooter, dY as LegalFooterProps, dZ as LegalFramedSectionLabels, d_ as LegalLabels, d$ as LegalLayout, e0 as LegalLayoutProps, e1 as LegalLink, e2 as LegalLinks, e3 as LegalLinksProps, e4 as LegalOperator, e5 as LegalOperatorSectionLabels, e6 as LegalOperatorText, e7 as LegalPageKey, e8 as LegalSection, e9 as LegalSectionProps, ea as LegalTextSectionLabels, eb as MultiSelectLabels, ec as PHONE_QUERY, ed as PasswordRevealLabels, ee as PhoneInput, ef as PhoneInputLabels, eg as PhoneInputProps, eh as PickerSheetLabels, ei as RegisterForm, ej as RegisterFormProps, ek as RegisterLabels, el as RegisterValues, em as ResponsiveFormActionsPlacement, en as ReviewerScope, eo as ReviewerScopeArea, ep as ReviewerScopeEditor, eq as ReviewerScopeEditorProps, er as ReviewerScopeLabels, es as ReviewerScopeLanguage, et as RoleEditing, eu as RoleLock, ev as RoleLockCode, ew as RoleSelect, ex as RoleSelectLabels, ey as RoleSelectProps, ez as RolesEditor, eA as RolesEditorProps, eB as RosterState, eC as Select, eD as SelectProps, eE as ShareAddRequest, eF as ShareCandidate, eG as ShareCard, eH as ShareCardLabels, eI as ShareCardProps, eJ as ShareDialog, eK as ShareDialogProps, eL as ShareGrantee, eM as SharePanel, eN as SharePanelProps, eO as SharePendingGrant, eP as ShareRole, eQ as Spinner, eR as SpinnerProps, eS as SwipeableRowLabels, eT as TabItem, eU as Tabs, eV as TabsLabels, eW as TabsProps, eX as Textarea, eY as TextareaProps, eZ as TopBarLabels, e_ as TransferCandidate, e$ as TransferOwnershipDialog, f0 as TransferOwnershipDialogProps, f1 as TransferOwnershipLabels, f2 as TransferUnavailable, f3 as TransferValues, f4 as TypedConfirmField, f5 as TypedConfirmFieldLabels, f6 as TypedConfirmFieldProps, f7 as TypedMatch, f8 as USER_ROSTER_SORT_KEYS, f9 as UiKitLabelOverrides, fa as UiKitLabels, fb as UiKitProvider, fc as UiKitProviderProps, aX as UseFeedbackColumnsOptions, fd as UseFilePickerOptions, fe as UseFilePickerReturn, ff as UserIdentityCell, fg as UserIdentityCellProps, fh as UserRosterColumnsOptions, fi as UserRosterLabels, fj as UserRosterRow, fk as UserRosterSortKey, fl as UserRowAction, fm as UserRowActionList, fn as UserRowActions, fo as UserRowActionsProps, fp as adminUserStates, aY as appendRework, aZ as attachmentName, fq as buttonClasses, a_ as feedbackAttachmentLine, a$ as feedbackAttachmentUrls, b0 as feedbackCategoryRank, b1 as feedbackColumns, b2 as feedbackContext, b3 as feedbackEnvironment, b4 as feedbackMobileGroupBy, b5 as feedbackPageHref, b6 as feedbackPagePath, b7 as feedbackPageUrl, b8 as feedbackRowAccess, b9 as feedbackSubmitter, ba as feedbackSubmitterEmail, fr as formatFileSize, fs as formatLocaleOf, bb as isFeedbackAwaiting, bc as isImageAttachment, ft as languageOptions, fu as legalOperatorText, fv as loadUiKitLabels, fw as matchesAccept, fx as missingKitLabels, bd as nextFeedbackStatus, be as pastedName, fy as peekUiKitLabels, bf as replaceDescription, fz as resolveLanguage, fA as resolvePasswordRevealLabels, bg as reworkCount, bh as selectableFeedbackStatuses, bi as splitBodyAttachments, bj as splitDescription, fB as typedMatches, fC as useConfirm, bk as useFeedbackCategoryLabels, bl as useFeedbackColumns, bm as useFeedbackDetailLabels, bn as useFeedbackPageLabels, bo as useFeedbackRenderDate, bp as useFeedbackStatusLabels, bq as useFeedbackStatusUndo, br as useFeedbackToastLabels, fD as useFilePicker, fE as useKitChartTooltipPlacement, fF as useKitDateFormatter, fG as useKitFileLabels, fH as useKitLabelOverrides, fI as useKitLabels, fJ as useKitLink, fK as useKitLocale, fL as useKitWeekStart, fM as useLegalLabels, fN as useUiKitLabels, fO as useUserRosterColumns, fP as userRosterColumns, fQ as userRosterSort, bs as visibleFeedbackStatuses } from './delete-account-setting-DCFS5Vof.js';
|
|
29
|
+
export { bt as AdminActionConfirm, bu as AdminActionConfirmProps, bv as AdminActionConfirmValues, bw as AdminActionLabels, bx as AdminActionTarget, by as AdminConfirmLevel, bz as AdminUserStateFields, bA as AppShellLabels, bB as Button, bC as ButtonClassesOptions, bD as ButtonLinkProps, bE as ButtonProps, bF as ButtonSize, bG as ButtonTone, bH as ButtonVariant, bI as CalculatorLabels, bJ as Card, bK as CardAction, bL as CardActionProps, bM as CardContent, bN as CardContentProps, bO as CardDensity, bP as CardDescription, bQ as CardDescriptionProps, bR as CardFooter, bS as CardFooterProps, bT as CardHeader, bU as CardHeaderProps, bV as CardProps, bW as CardTitle, bX as CardTitleLevel, bY as CardTitleProps, bZ as CardTone, b_ as CharacterCountLabels, b$ as ChartTooltipPlacement, C as ChatComposer, a as ChatComposerHandle, b as ChatComposerLabels, c as ChatComposerProps, d as ChatComposerSlotContext, c0 as ComboboxLabels, c1 as CommonLabels, c2 as ConfirmDialogLabels, c3 as ConfirmFn, c4 as ConfirmOptions, c5 as ConfirmProvider, c6 as ConfirmProviderProps, c7 as ConfirmTone, c8 as CopyButton, c9 as CopyButtonLabels, ca as CopyButtonProps, cb as CurrencyLabels, cc as CurrentPasswordInput, cd as CurrentPasswordInputLabels, ce as CurrentPasswordInputProps, cf as DEFAULT_ADMIN_ACTION_LABELS, cg as DEFAULT_APP_SHELL_LABELS, D as DEFAULT_ATTACHMENT_ACCEPT, ch as DEFAULT_CALCULATOR_LABELS, ci as DEFAULT_CHARACTER_COUNT_LABELS, cj as DEFAULT_COMBOBOX_LABELS, ck as DEFAULT_COMMON_LABELS, cl as DEFAULT_CONFIRM_DIALOG_LABELS, cm as DEFAULT_COPY_BUTTON_LABELS, cn as DEFAULT_CURRENCY_LABELS, co as DEFAULT_DANGER_CONFIRM_LABELS, cp as DEFAULT_DATE_PICKER_LABELS, cq as DEFAULT_DELETE_ACCOUNT_LABELS, e as DEFAULT_FEEDBACK_ATTACHMENT_LABELS, f as DEFAULT_FEEDBACK_CATEGORY_LABELS, g as DEFAULT_FEEDBACK_COMPOSER_LABELS, h as DEFAULT_FEEDBACK_CONTEXT_LABELS, i as DEFAULT_FEEDBACK_DETAIL_LABELS, j as DEFAULT_FEEDBACK_DIALOG_LABELS, k as DEFAULT_FEEDBACK_MENU_LABELS, l as DEFAULT_FEEDBACK_PAGE_LABELS, m as DEFAULT_FEEDBACK_STATUS_LABELS, n as DEFAULT_FEEDBACK_THREAD_LABELS, o as DEFAULT_FEEDBACK_TOAST_LABELS, cr as DEFAULT_FILE_LABELS, cs as DEFAULT_FILE_PICKER_LABELS, ct as DEFAULT_FORM_ACTIONS_LABELS, cu as DEFAULT_IBAN_INPUT_LABELS, cv as DEFAULT_INVITATIONS_LABELS, cw as DEFAULT_LEGAL_LABELS, p as DEFAULT_MAX_ATTACHMENTS, q as DEFAULT_MAX_ATTACHMENT_BYTES, cx as DEFAULT_MULTI_SELECT_LABELS, cy as DEFAULT_PASSWORD_REVEAL_LABELS, cz as DEFAULT_PHONE_INPUT_LABELS, cA as DEFAULT_PICKER_SHEET_LABELS, cB as DEFAULT_REGISTER_LABELS, cC as DEFAULT_REVIEWER_SCOPE_LABELS, cD as DEFAULT_ROLE_SELECT_LABELS, cE as DEFAULT_SHARE_CARD_LABELS, cF as DEFAULT_SWIPEABLE_ROW_LABELS, cG as DEFAULT_TABS_LABELS, cH as DEFAULT_TOP_BAR_LABELS, cI as DEFAULT_TRANSFER_OWNERSHIP_LABELS, cJ as DEFAULT_USER_ROSTER_LABELS, cK as DangerConfirm, cL as DangerConfirmLabels, cM as DangerConfirmProps, cN as DangerConfirmValues, cO as DangerConsequence, cP as DatePickerLabels, cQ as DeleteAccountConsequence, cR as DeleteAccountLabels, cS as DeleteAccountSetting, cT as DeleteAccountSettingProps, cU as DeleteAccountValues, cV as DeletionMode, cW as EmptyState, cX as EmptyStateProps, F as FEEDBACK_ATTACHMENT_ACCEPT, r as FEEDBACK_AUTHOR_EDITABLE_STATUSES, s as FEEDBACK_AWAITING_STATUSES, t as FEEDBACK_CATEGORY_META, u as FEEDBACK_CATEGORY_ORDER, v as FEEDBACK_PICKABLE_CATEGORIES, w as FEEDBACK_REWORKABLE_STATUSES, x as FEEDBACK_STATUS_META, y as FEEDBACK_STATUS_ORDER, z as FEEDBACK_UNDO_DURATION, cY as FIELD_BASE, cZ as FIELD_DISPLAY, c_ as FIELD_FLOATING_PAD, c$ as FIELD_INVALID, d0 as FIELD_TRIGGER, d1 as FIELD_WRITABLE_LOOK, d2 as FLOATING_INPUT_CLASS, d3 as FLOATING_LABEL_CLASS, A as FeedbackAttachmentError, B as FeedbackAttachmentErrorInfo, E as FeedbackAttachmentField, G as FeedbackAttachmentFieldLabels, H as FeedbackAttachmentFieldMultipleProps, I as FeedbackAttachmentFieldProps, J as FeedbackAttachmentFieldRefsProps, K as FeedbackAttachmentFieldSingleProps, L as FeedbackAttachmentLabels, M as FeedbackAttachmentRef, N as FeedbackAttachmentRefsError, O as FeedbackAwaitingToggle, P as FeedbackAwaitingToggleProps, Q as FeedbackCategory, R as FeedbackCategoryBadge, S as FeedbackCategoryLabels, T as FeedbackCategoryOption, U as FeedbackColumnsOptions, V as FeedbackComposer, W as FeedbackComposerAttachment, X as FeedbackComposerHandle, Y as FeedbackComposerLabels, Z as FeedbackComposerProps, _ as FeedbackComposerSlotContext, $ as FeedbackContext, a0 as FeedbackContextBox, a1 as FeedbackContextBoxProps, a2 as FeedbackContextInput, a3 as FeedbackContextLabels, a4 as FeedbackDetail, a5 as FeedbackDetailLabels, a6 as FeedbackDetailPatch, a7 as FeedbackDetailSection, a8 as FeedbackDetailUpdate, a9 as FeedbackDialog, aa as FeedbackDialogLabels, ab as FeedbackDialogMultipleProps, ac as FeedbackDialogProps, ad as FeedbackDialogSingleProps, ae as FeedbackDialogTextLabels, af as FeedbackEmptyState, ag as FeedbackEmptyStateProps, ah as FeedbackEnvironment, ai as FeedbackMenu, aj as FeedbackMenuLabels, ak as FeedbackMenuProps, al as FeedbackMobileCard, am as FeedbackMobileCardProps, an as FeedbackMultipleSubmission, ao as FeedbackNoteAttachment, ap as FeedbackNoteEditor, aq as FeedbackPageLabels, ar as FeedbackProse, as as FeedbackRecord, at as FeedbackRenderDate, au as FeedbackReworkSection, av as FeedbackReworkSectionProps, aw as FeedbackRowAccess, ax as FeedbackRowDetail, ay as FeedbackRowDetailProps, az as FeedbackStatus, aA as FeedbackStatusBadge, aB as FeedbackStatusChange, aC as FeedbackStatusLabels, aD as FeedbackStatusMutate, aE as FeedbackStatusPatch, aF as FeedbackStatusRow, aG as FeedbackStatusTransitions, aH as FeedbackStatusUndoOptions, aI as FeedbackSubject, aJ as FeedbackSubjectProps, aK as FeedbackSubmission, aL as FeedbackSubmitHint, aM as FeedbackSubmitter, aN as FeedbackTableRow, aO as FeedbackThread, aP as FeedbackThreadAttachment, aQ as FeedbackThreadEvent, aR as FeedbackThreadItem, aS as FeedbackThreadLabels, aT as FeedbackThreadMessage, aU as FeedbackThreadProps, aV as FeedbackToastLabels, aW as FeedbackUpload, d4 as FieldChevron, d5 as FieldChevronProps, d6 as FieldHint, d7 as FieldHintProps, d8 as FileButton, d9 as FileButtonProps, da as FileLabels, db as FilePickerLabels, dc as FileRejection, dd as FileRejectionReason, de as FileScreenOptions, df as FloatingField, dg as FloatingFieldProps, dh as FormActions, di as FormActionsAlign, dj as FormActionsDestructive, dk as FormActionsLabels, dl as FormActionsPlacement, dm as FormActionsProps, dn as FormActionsStickyWithin, dp as FormActionsSubmitProps, dq as FormActionsSubmitShortcut, dr as IbanInput, ds as IbanInputLabels, dt as IbanInputProps, du as IconButton, dv as IconButtonGlyphSize, dw as IconButtonLinkProps, dx as IconButtonProps, dy as IconButtonSize, dz as IconButtonTone, dA as IconButtonToneColor, dB as IconButtonVariant, dC as Input, dD as InputProps, dE as InvitationDraft, dF as InvitationRow, dG as InvitationScope, dH as InvitationSentAnswer, dI as InvitationStatus, dJ as InvitationsLabels, dK as InvitationsPanel, dL as InvitationsPanelProps, dM as KIT_LANGUAGES, dN as KitDateFormatContext, dO as KitDateFormatter, dP as KitLanguage, dQ as KitLanguageCode, dR as KitLinkComponent, dS as KitLinkProps, dT as LEGAL_HREFS, dU as Label, dV as LabelOverride, dW as LabelProps, dX as LegalFooter, dY as LegalFooterProps, dZ as LegalFramedSectionLabels, d_ as LegalLabels, d$ as LegalLayout, e0 as LegalLayoutProps, e1 as LegalLink, e2 as LegalLinks, e3 as LegalLinksProps, e4 as LegalOperator, e5 as LegalOperatorSectionLabels, e6 as LegalOperatorText, e7 as LegalPageKey, e8 as LegalSection, e9 as LegalSectionProps, ea as LegalTextSectionLabels, eb as MultiSelectLabels, ec as PHONE_QUERY, ed as PasswordRevealLabels, ee as PhoneInput, ef as PhoneInputLabels, eg as PhoneInputProps, eh as PickerSheetLabels, ei as RegisterForm, ej as RegisterFormProps, ek as RegisterLabels, el as RegisterValues, em as ResponsiveFormActionsPlacement, en as ReviewerScope, eo as ReviewerScopeArea, ep as ReviewerScopeEditor, eq as ReviewerScopeEditorProps, er as ReviewerScopeLabels, es as ReviewerScopeLanguage, et as RoleEditing, eu as RoleLock, ev as RoleLockCode, ew as RoleSelect, ex as RoleSelectLabels, ey as RoleSelectProps, ez as RolesEditor, eA as RolesEditorProps, eB as RosterState, eC as Select, eD as SelectProps, eE as ShareAddRequest, eF as ShareCandidate, eG as ShareCard, eH as ShareCardLabels, eI as ShareCardProps, eJ as ShareDialog, eK as ShareDialogProps, eL as ShareGrantee, eM as SharePanel, eN as SharePanelProps, eO as SharePendingGrant, eP as ShareRole, eQ as Spinner, eR as SpinnerProps, eS as SwipeableRowLabels, eT as TabItem, eU as Tabs, eV as TabsLabels, eW as TabsProps, eX as Textarea, eY as TextareaProps, eZ as TopBarLabels, e_ as TransferCandidate, e$ as TransferOwnershipDialog, f0 as TransferOwnershipDialogProps, f1 as TransferOwnershipLabels, f2 as TransferUnavailable, f3 as TransferValues, f4 as TypedConfirmField, f5 as TypedConfirmFieldLabels, f6 as TypedConfirmFieldProps, f7 as TypedMatch, f8 as USER_ROSTER_SORT_KEYS, f9 as UiKitLabelOverrides, fa as UiKitLabels, fb as UiKitProvider, fc as UiKitProviderProps, aX as UseFeedbackColumnsOptions, fd as UseFilePickerOptions, fe as UseFilePickerReturn, ff as UserIdentityCell, fg as UserIdentityCellProps, fh as UserRosterColumnsOptions, fi as UserRosterLabels, fj as UserRosterRow, fk as UserRosterSortKey, fl as UserRowAction, fm as UserRowActionList, fn as UserRowActions, fo as UserRowActionsProps, fp as adminUserStates, aY as appendRework, aZ as attachmentName, fq as buttonClasses, a_ as feedbackAttachmentLine, a$ as feedbackAttachmentUrls, b0 as feedbackCategoryRank, b1 as feedbackColumns, b2 as feedbackContext, b3 as feedbackEnvironment, b4 as feedbackMobileGroupBy, b5 as feedbackPageHref, b6 as feedbackPagePath, b7 as feedbackPageUrl, b8 as feedbackRowAccess, b9 as feedbackSubmitter, ba as feedbackSubmitterEmail, fr as formatFileSize, fs as formatLocaleOf, bb as isFeedbackAwaiting, bc as isImageAttachment, ft as languageOptions, fu as legalOperatorText, fv as loadUiKitLabels, fw as matchesAccept, fx as missingKitLabels, bd as nextFeedbackStatus, be as pastedName, fy as peekUiKitLabels, bf as replaceDescription, fz as resolveLanguage, fA as resolvePasswordRevealLabels, bg as reworkCount, bh as selectableFeedbackStatuses, bi as splitBodyAttachments, bj as splitDescription, fB as typedMatches, fC as useConfirm, bk as useFeedbackCategoryLabels, bl as useFeedbackColumns, bm as useFeedbackDetailLabels, bn as useFeedbackPageLabels, bo as useFeedbackRenderDate, bp as useFeedbackStatusLabels, bq as useFeedbackStatusUndo, br as useFeedbackToastLabels, fD as useFilePicker, fE as useKitChartTooltipPlacement, fF as useKitDateFormatter, fG as useKitFileLabels, fH as useKitLabelOverrides, fI as useKitLabels, fJ as useKitLink, fK as useKitLocale, fL as useKitWeekStart, fM as useLegalLabels, fN as useUiKitLabels, fO as useUserRosterColumns, fP as userRosterColumns, fQ as userRosterSort, bs as visibleFeedbackStatuses } from './delete-account-setting-CpIhzxxZ.js';
|
|
30
30
|
export { Field, FieldControlProps, FieldLabelVisibility, FieldProps, FieldRenderMeta } from './components/field.js';
|
|
31
31
|
export { SearchField, SearchFieldProps } from './components/search-field.js';
|
|
32
32
|
export { DropdownPanel, DropdownPanelProps, DropdownSearchHeader, DropdownSearchHeaderProps, useDropdown, useDropdownSearch } from './components/dropdown.js';
|
|
@@ -180,14 +180,14 @@ export { SettingsSection, SettingsSectionProps } from './settings/settings-secti
|
|
|
180
180
|
export { SettingsLayoutContextValue, useSettingsLayout } from './settings/settings-context.js';
|
|
181
181
|
export { SettingsHeadingLevel, SettingsHeadingLevelProps, SettingsHeadingTag, useSettingsHeadingLevel } from './settings/settings-heading.js';
|
|
182
182
|
export { SettingsEntry, SettingsGroup, SettingsSearchEntriesOptions, settingsHref, settingsSearchEntries, visibleSettingsEntries, visibleSettingsGroups } from './settings/settings-catalogue.js';
|
|
183
|
-
export { DEFAULT_SETTINGS_LABELS, SettingsCoreGroup, SettingsGroupLabels, SettingsLabels } from './settings/settings-labels.js';
|
|
183
|
+
export { DEFAULT_SETTINGS_LABELS, SettingsCoreGroup, SettingsGroupLabels, SettingsLabels, useSettingsLabels } from './settings/settings-labels.js';
|
|
184
184
|
export { AccountLanguage, AccountLanguageSource, ResolveAccountLanguageInput, ResolvedAccountLanguage, UseAccountLanguageOptions, matchOfferedLanguage, resolveAccountLanguage, useAccountLanguage } from './settings/use-account-language.js';
|
|
185
185
|
export { DEFAULT_LANDING_LABELS, LandingLabels, useLandingLabels } from './landing/landing-labels.js';
|
|
186
186
|
export { AccessChoice, AccessLabels, AccessLink, accessAction, useAccessAction } from './landing/access.js';
|
|
187
187
|
export { LandingActions, LandingActionsProps, LandingSession } from './landing/landing-actions.js';
|
|
188
188
|
export { CtaBand, CtaBandProps, FeatureRow, FeatureRowProps, FeatureRows, FeatureRowsProps, Hero, HeroProps, PublicFooter, PublicFooterProps, TrustItem, TrustStrip, TrustStripProps } from './landing/landing-sections.js';
|
|
189
189
|
export { SeoCopy, SeoCopyLimits, SeoCopyProblem, SeoCopyProblemCode, metaContent, seoCopyProblems, usePageSeo } from './landing/page-seo.js';
|
|
190
|
-
export { DEFAULT_LAST_VISITED_EXCLUDES, LastVisitedPageOptions, NEXT_PARAM, PathPattern, RedirectIfAuthed, RedirectIfAuthedProps, RootEntry, RootEntryProps, clearLastVisitedPage, readLastVisitedPage, safeNextPath, useLastVisitedPage } from './landing/routing.js';
|
|
190
|
+
export { DEFAULT_LAST_VISITED_EXCLUDES, LastVisitedPageOptions, NEXT_PARAM, PathPattern, RedirectIfAuthed, RedirectIfAuthedProps, RootEntry, RootEntryProps, RoutingSession, clearLastVisitedPage, readLastVisitedPage, safeNextPath, useLastVisitedPage } from './landing/routing.js';
|
|
191
191
|
export { PublicHeader, PublicHeaderBrand, PublicHeaderProps } from './landing/public-header.js';
|
|
192
192
|
export { DEFAULT_DEMO_LABELS, DemoLabels, useDemoLabels } from './demo/demo-labels.js';
|
|
193
193
|
export { DemoModel, DemoSessionUser, isDemoSession } from './demo/demo-session.js';
|
package/dist/index.js
CHANGED
|
@@ -281,7 +281,7 @@ import {
|
|
|
281
281
|
visibleSettingsEntries,
|
|
282
282
|
settingsHref
|
|
283
283
|
} from "./settings/settings-catalogue.js";
|
|
284
|
-
import { DEFAULT_SETTINGS_LABELS } from "./settings/settings-labels.js";
|
|
284
|
+
import { DEFAULT_SETTINGS_LABELS, useSettingsLabels } from "./settings/settings-labels.js";
|
|
285
285
|
import { useAccountLanguage, resolveAccountLanguage, matchOfferedLanguage } from "./settings/use-account-language.js";
|
|
286
286
|
import { DEFAULT_LANDING_LABELS, useLandingLabels } from "./landing/landing-labels.js";
|
|
287
287
|
import { accessAction, useAccessAction } from "./landing/access.js";
|
|
@@ -592,6 +592,7 @@ export {
|
|
|
592
592
|
useServerWakeStage,
|
|
593
593
|
useSettingsFocus,
|
|
594
594
|
useSettingsHeadingLevel,
|
|
595
|
+
useSettingsLabels,
|
|
595
596
|
useSettingsLayout,
|
|
596
597
|
useSettingsRoute,
|
|
597
598
|
useTabParam,
|
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 { useAnchoredPanel, anchoredPanelPlacement, useVisualViewport } from \"./hooks/use-anchored-panel\";\nexport type {\n AnchoredPanel,\n AnchoredPanelOptions,\n ViewportBox,\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 } 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 { toast, Toaster, DEFAULT_TOAST_LABELS, TOAST_ACTION_DURATION } 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} 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 } 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, 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 } from \"./settings/settings-labels\";\nexport type { SettingsLabels, SettingsGroupLabels, SettingsCoreGroup } from \"./settings/settings-labels\";\n// Only the language follows the account (§6.2).\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 { RootEntryProps, RedirectIfAuthedProps, LastVisitedPageOptions, PathPattern } 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} from \"./components/legal-page\";\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 { useAnchoredPanel, anchoredPanelPlacement, useVisualViewport } from \"./hooks/use-anchored-panel\";\nexport type {\n AnchoredPanel,\n AnchoredPanelOptions,\n ViewportBox,\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 } 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 { toast, Toaster, DEFAULT_TOAST_LABELS, TOAST_ACTION_DURATION } 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} 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 } 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, 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// Only the language follows the account (§6.2).\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} from \"./components/legal-page\";\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 { bF as ButtonSize } from '../delete-account-setting-
|
|
3
|
+
import { bF as ButtonSize } from '../delete-account-setting-CpIhzxxZ.js';
|
|
4
4
|
import { AccessChoice } from './access.js';
|
|
5
5
|
import { LandingLabels } from './landing-labels.js';
|
|
6
6
|
import '../components/tooltip.js';
|
|
@@ -105,8 +105,10 @@ interface LandingActionsProps extends Omit<ComponentPropsWithoutRef<"div">, "chi
|
|
|
105
105
|
session: LandingSession;
|
|
106
106
|
access: AccessChoice;
|
|
107
107
|
/** "Try the demo" without a session, "Continue the demo" with a demo one. Default
|
|
108
|
-
* `/demo`, which starts a demo — or, for a live one, continues it (§3.1).
|
|
109
|
-
|
|
108
|
+
* `/demo`, which starts a demo — or, for a live one, continues it (§3.1). `null`
|
|
109
|
+
* (0.31.1): the app has no demo yet, and the action is left out — "Request access"
|
|
110
|
+
* stands alone (Kurvenschmiede's 0.31 adoption). */
|
|
111
|
+
demoHref?: string | null;
|
|
110
112
|
/** "Open app" for a real session: the resume target. Default `/`, which resumes
|
|
111
113
|
* through `RootEntry`. */
|
|
112
114
|
openAppHref?: string;
|
|
@@ -28,7 +28,7 @@ function LandingActions({
|
|
|
28
28
|
className: cn("flex flex-col gap-3 sm:flex-row", align === "center" && "sm:justify-center", className),
|
|
29
29
|
children: session === "user" ? /* @__PURE__ */ jsx(Button, { href: openAppHref, variant: "brand", size: buttonSize, className: extra, children: labels.openApp }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
30
30
|
/* @__PURE__ */ jsx(Button, { href: accessLink.href, variant: "brand", size: buttonSize, className: extra, children: accessLink.label }),
|
|
31
|
-
/* @__PURE__ */ jsx(Button, { href: demoHref, variant: "secondary", size: buttonSize, className: extra, children: session === "demo" ? labels.continueDemo : labels.tryDemo })
|
|
31
|
+
demoHref !== null && /* @__PURE__ */ jsx(Button, { href: demoHref, variant: "secondary", size: buttonSize, className: extra, children: session === "demo" ? labels.continueDemo : labels.tryDemo })
|
|
32
32
|
] })
|
|
33
33
|
}
|
|
34
34
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/landing/landing-actions.tsx"],"sourcesContent":["import type { ComponentPropsWithoutRef } from \"react\";\n\nimport { cn } from \"../lib/cn\";\nimport { Button } from \"../components/ui\";\nimport type { ButtonSize } from \"../components/ui\";\nimport { useAccessAction } from \"./access\";\nimport type { AccessChoice } from \"./access\";\nimport { useLandingLabels } from \"./landing-labels\";\nimport type { LandingLabels } from \"./landing-labels\";\n\n/**\n * Who is looking at a public page (docs/landing-demo-harmonization.md §3.1, §4.1):\n * nobody signed in, a demo session, or a real account. The app derives it from its auth\n * state — a demo is `isDemoSession(me)`.\n */\nexport type LandingSession = \"none\" | \"demo\" | \"user\";\n\n/** keksdose's hero buttons: wider than the kit's `md` (px-5 py-2.5), the page's\n * largest actions. */\nconst LARGE = \"px-5 py-2.5\";\n\nexport interface LandingActionsProps extends Omit<ComponentPropsWithoutRef<\"div\">, \"children\"> {\n session: LandingSession;\n access: AccessChoice;\n /** \"Try the demo\" without a session, \"Continue the demo\" with a demo one. Default\n * `/demo`, which starts a demo — or, for a live one, continues it (§3.1). */\n demoHref?: string;\n /** \"Open app\" for a real session: the resume target. Default `/`, which resumes\n * through `RootEntry`. */\n openAppHref?: string;\n /** `large` (default): the hero's and the CTA band's size. Or a kit `ButtonSize`. */\n size?: ButtonSize | \"large\";\n /** `start` (default) under the hero's copy; `center` in the CTA band. */\n align?: \"start\" | \"center\";\n labels?: Partial<LandingLabels>;\n}\n\n/**\n * The landing's action pair for the visitor's state (§4.1), shared by {@link Hero} and\n * {@link CtaBand}:\n *\n * | session | actions |\n * |---|---|\n * | none | **Request access** (primary), Try the demo |\n * | demo | **Request access** (primary), Continue the demo |\n * | user | **Open app** (primary), alone |\n *\n * keksdose showed a signed-in visitor (who reached the landing by its brand link,\n * `/welcome`) the register/demo pair, which `RedirectIfAuthed` then silently bounced\n * back into the app; one \"Open app\" says where it goes. \"Request access\" is the mail of\n * {@link accessAction}, or \"Get started\" once the app opens registration.\n *\n * Stacked full-width on a phone, a row from `sm` up — keksdose's layout.\n */\nexport function LandingActions({\n session,\n access,\n demoHref = \"/demo\",\n openAppHref = \"/\",\n size = \"large\",\n align = \"start\",\n labels: labelsProp,\n className,\n ...rest\n}: LandingActionsProps) {\n const labels = useLandingLabels(labelsProp);\n const accessLink = useAccessAction(access, labelsProp);\n const buttonSize: ButtonSize = size === \"large\" ? \"md\" : size;\n const extra = size === \"large\" ? LARGE : undefined;\n return (\n <div\n {...rest}\n data-slot=\"landing-actions\"\n className={cn(\"flex flex-col gap-3 sm:flex-row\", align === \"center\" && \"sm:justify-center\", className)}\n >\n {session === \"user\" ? (\n <Button href={openAppHref} variant=\"brand\" size={buttonSize} className={extra}>\n {labels.openApp}\n </Button>\n ) : (\n <>\n <Button href={accessLink.href} variant=\"brand\" size={buttonSize} className={extra}>\n {accessLink.label}\n </Button>\n <Button href={demoHref} variant=\"secondary\" size={buttonSize} className={extra}>\n
|
|
1
|
+
{"version":3,"sources":["../../src/landing/landing-actions.tsx"],"sourcesContent":["import type { ComponentPropsWithoutRef } from \"react\";\n\nimport { cn } from \"../lib/cn\";\nimport { Button } from \"../components/ui\";\nimport type { ButtonSize } from \"../components/ui\";\nimport { useAccessAction } from \"./access\";\nimport type { AccessChoice } from \"./access\";\nimport { useLandingLabels } from \"./landing-labels\";\nimport type { LandingLabels } from \"./landing-labels\";\n\n/**\n * Who is looking at a public page (docs/landing-demo-harmonization.md §3.1, §4.1):\n * nobody signed in, a demo session, or a real account. The app derives it from its auth\n * state — a demo is `isDemoSession(me)`.\n */\nexport type LandingSession = \"none\" | \"demo\" | \"user\";\n\n/** keksdose's hero buttons: wider than the kit's `md` (px-5 py-2.5), the page's\n * largest actions. */\nconst LARGE = \"px-5 py-2.5\";\n\nexport interface LandingActionsProps extends Omit<ComponentPropsWithoutRef<\"div\">, \"children\"> {\n session: LandingSession;\n access: AccessChoice;\n /** \"Try the demo\" without a session, \"Continue the demo\" with a demo one. Default\n * `/demo`, which starts a demo — or, for a live one, continues it (§3.1). `null`\n * (0.31.1): the app has no demo yet, and the action is left out — \"Request access\"\n * stands alone (Kurvenschmiede's 0.31 adoption). */\n demoHref?: string | null;\n /** \"Open app\" for a real session: the resume target. Default `/`, which resumes\n * through `RootEntry`. */\n openAppHref?: string;\n /** `large` (default): the hero's and the CTA band's size. Or a kit `ButtonSize`. */\n size?: ButtonSize | \"large\";\n /** `start` (default) under the hero's copy; `center` in the CTA band. */\n align?: \"start\" | \"center\";\n labels?: Partial<LandingLabels>;\n}\n\n/**\n * The landing's action pair for the visitor's state (§4.1), shared by {@link Hero} and\n * {@link CtaBand}:\n *\n * | session | actions |\n * |---|---|\n * | none | **Request access** (primary), Try the demo |\n * | demo | **Request access** (primary), Continue the demo |\n * | user | **Open app** (primary), alone |\n *\n * keksdose showed a signed-in visitor (who reached the landing by its brand link,\n * `/welcome`) the register/demo pair, which `RedirectIfAuthed` then silently bounced\n * back into the app; one \"Open app\" says where it goes. \"Request access\" is the mail of\n * {@link accessAction}, or \"Get started\" once the app opens registration.\n *\n * Stacked full-width on a phone, a row from `sm` up — keksdose's layout.\n */\nexport function LandingActions({\n session,\n access,\n demoHref = \"/demo\",\n openAppHref = \"/\",\n size = \"large\",\n align = \"start\",\n labels: labelsProp,\n className,\n ...rest\n}: LandingActionsProps) {\n const labels = useLandingLabels(labelsProp);\n const accessLink = useAccessAction(access, labelsProp);\n const buttonSize: ButtonSize = size === \"large\" ? \"md\" : size;\n const extra = size === \"large\" ? LARGE : undefined;\n return (\n <div\n {...rest}\n data-slot=\"landing-actions\"\n className={cn(\"flex flex-col gap-3 sm:flex-row\", align === \"center\" && \"sm:justify-center\", className)}\n >\n {session === \"user\" ? (\n <Button href={openAppHref} variant=\"brand\" size={buttonSize} className={extra}>\n {labels.openApp}\n </Button>\n ) : (\n <>\n <Button href={accessLink.href} variant=\"brand\" size={buttonSize} className={extra}>\n {accessLink.label}\n </Button>\n {demoHref !== null && (\n <Button href={demoHref} variant=\"secondary\" size={buttonSize} className={extra}>\n {session === \"demo\" ? labels.continueDemo : labels.tryDemo}\n </Button>\n )}\n </>\n )}\n </div>\n );\n}\n"],"mappings":";AA8EQ,SAIA,UAJA,KAIA,YAJA;AA5ER,SAAS,UAAU;AACnB,SAAS,cAAc;AAEvB,SAAS,uBAAuB;AAEhC,SAAS,wBAAwB;AAYjC,MAAM,QAAQ;AAqCP,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,cAAc;AAAA,EACd,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR;AAAA,EACA,GAAG;AACL,GAAwB;AACtB,QAAM,SAAS,iBAAiB,UAAU;AAC1C,QAAM,aAAa,gBAAgB,QAAQ,UAAU;AACrD,QAAM,aAAyB,SAAS,UAAU,OAAO;AACzD,QAAM,QAAQ,SAAS,UAAU,QAAQ;AACzC,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,aAAU;AAAA,MACV,WAAW,GAAG,mCAAmC,UAAU,YAAY,qBAAqB,SAAS;AAAA,MAEpG,sBAAY,SACX,oBAAC,UAAO,MAAM,aAAa,SAAQ,SAAQ,MAAM,YAAY,WAAW,OACrE,iBAAO,SACV,IAEA,iCACE;AAAA,4BAAC,UAAO,MAAM,WAAW,MAAM,SAAQ,SAAQ,MAAM,YAAY,WAAW,OACzE,qBAAW,OACd;AAAA,QACC,aAAa,QACZ,oBAAC,UAAO,MAAM,UAAU,SAAQ,aAAY,MAAM,YAAY,WAAW,OACtE,sBAAY,SAAS,OAAO,eAAe,OAAO,SACrD;AAAA,SAEJ;AAAA;AAAA,EAEJ;AAEJ;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
import { ComponentPropsWithoutRef, ReactNode } from 'react';
|
|
3
|
-
import { dY as LegalFooterProps } from '../delete-account-setting-
|
|
3
|
+
import { dY as LegalFooterProps } from '../delete-account-setting-CpIhzxxZ.js';
|
|
4
4
|
import { LandingActionsProps } from './landing-actions.js';
|
|
5
5
|
import { LandingLabels } from './landing-labels.js';
|
|
6
6
|
import '../components/tooltip.js';
|
|
@@ -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-
|
|
7
|
+
import '../delete-account-setting-CpIhzxxZ.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-
|
|
4
|
+
import '../delete-account-setting-CpIhzxxZ.js';
|
|
5
5
|
import '../components/tooltip.js';
|
|
6
6
|
import '../hooks/use-anchored-rect.js';
|
|
7
7
|
import '../lib/clipping.js';
|
|
@@ -96,6 +96,13 @@ import '../lib/column-mapping.js';
|
|
|
96
96
|
import '../lib/table-text.js';
|
|
97
97
|
import '../components/field-parts.js';
|
|
98
98
|
|
|
99
|
+
/**
|
|
100
|
+
* 0.31.1: a session that is still being restored — an app whose access token lives in
|
|
101
|
+
* memory reads it back from its refresh token first (kastlan's 0.31 adoption). Until
|
|
102
|
+
* then `/` neither shows the landing nor resumes, and a public page neither shows nor
|
|
103
|
+
* redirects: both render `loading` instead.
|
|
104
|
+
*/
|
|
105
|
+
type RoutingSession = LandingSession | "loading";
|
|
99
106
|
/**
|
|
100
107
|
* The public routes' logic (docs/landing-demo-harmonization.md §3): what `/` shows,
|
|
101
108
|
* which pages a session skips, and the page a session resumes on — keksdose's
|
|
@@ -167,8 +174,11 @@ declare function readLastVisitedPage(key: string, fallback?: null): string | nul
|
|
|
167
174
|
* resume on the previous one's page. */
|
|
168
175
|
declare function clearLastVisitedPage(key: string): void;
|
|
169
176
|
interface RootEntryProps {
|
|
170
|
-
/** Without a session `/` is the landing; with one (real or demo) it resumes
|
|
171
|
-
|
|
177
|
+
/** Without a session `/` is the landing; with one (real or demo) it resumes;
|
|
178
|
+
* `"loading"` while the app restores one. */
|
|
179
|
+
session: RoutingSession;
|
|
180
|
+
/** What shows while `session` is `"loading"`. Default: the kit's `LoadingState`. */
|
|
181
|
+
loading?: ReactNode;
|
|
172
182
|
/** The remembered page — `readLastVisitedPage(key)`. */
|
|
173
183
|
resumePath?: string | null;
|
|
174
184
|
/** The landing page element. */
|
|
@@ -186,9 +196,12 @@ interface RootEntryProps {
|
|
|
186
196
|
* home instead, because a session at `/` came to use the app. The landing stays one tap
|
|
187
197
|
* away at `/welcome`, where the signed-in brand link points.
|
|
188
198
|
*/
|
|
189
|
-
declare function RootEntry({ session, resumePath, landing, home }: RootEntryProps): react.JSX.Element;
|
|
199
|
+
declare function RootEntry({ session, resumePath, landing, home, loading }: RootEntryProps): react.JSX.Element;
|
|
190
200
|
interface RedirectIfAuthedProps {
|
|
191
|
-
session:
|
|
201
|
+
/** `"loading"` while the app restores a session: neither the page nor a redirect. */
|
|
202
|
+
session: RoutingSession;
|
|
203
|
+
/** What shows while `session` is `"loading"`. Default: the kit's `LoadingState`. */
|
|
204
|
+
loading?: ReactNode;
|
|
192
205
|
/**
|
|
193
206
|
* Let a DEMO session through (§5.6): on `/login`, `/register` and the app's invitation
|
|
194
207
|
* pages, so a demo visitor can sign in or accept an invitation — a successful one
|
|
@@ -213,6 +226,6 @@ interface RedirectIfAuthedProps {
|
|
|
213
226
|
* `allowDemo` around `/login`, `/register` and the invitation pages, and one without
|
|
214
227
|
* around `/demo` (and `/forgot-password`).
|
|
215
228
|
*/
|
|
216
|
-
declare function RedirectIfAuthed({ session, allowDemo, fallback, children }: RedirectIfAuthedProps): react.JSX.Element;
|
|
229
|
+
declare function RedirectIfAuthed({ session, allowDemo, fallback, children, loading }: RedirectIfAuthedProps): react.JSX.Element;
|
|
217
230
|
|
|
218
|
-
export { DEFAULT_LAST_VISITED_EXCLUDES, type LastVisitedPageOptions, NEXT_PARAM, type PathPattern, RedirectIfAuthed, type RedirectIfAuthedProps, RootEntry, type RootEntryProps, clearLastVisitedPage, readLastVisitedPage, safeNextPath, useLastVisitedPage };
|
|
231
|
+
export { DEFAULT_LAST_VISITED_EXCLUDES, type LastVisitedPageOptions, NEXT_PARAM, type PathPattern, RedirectIfAuthed, type RedirectIfAuthedProps, RootEntry, type RootEntryProps, type RoutingSession, clearLastVisitedPage, readLastVisitedPage, safeNextPath, useLastVisitedPage };
|
package/dist/landing/routing.js
CHANGED
|
@@ -3,6 +3,7 @@ import { Fragment, jsx } from "react/jsx-runtime";
|
|
|
3
3
|
import { useEffect } from "react";
|
|
4
4
|
import { Navigate, Outlet, useLocation } from "react-router";
|
|
5
5
|
import { readStored, writeStored } from "../lib/safe-storage.js";
|
|
6
|
+
import { LoadingState } from "../components/loading-state.js";
|
|
6
7
|
const NEXT_PARAM = "next";
|
|
7
8
|
function safeNextPath(raw) {
|
|
8
9
|
if (!raw) return null;
|
|
@@ -55,13 +56,15 @@ function clearLastVisitedPage(key) {
|
|
|
55
56
|
} catch {
|
|
56
57
|
}
|
|
57
58
|
}
|
|
58
|
-
function RootEntry({ session, resumePath, landing, home }) {
|
|
59
|
+
function RootEntry({ session, resumePath, landing, home, loading }) {
|
|
60
|
+
if (session === "loading") return /* @__PURE__ */ jsx(Fragment, { children: loading ?? /* @__PURE__ */ jsx(LoadingState, {}) });
|
|
59
61
|
if (session === "none") return /* @__PURE__ */ jsx(Fragment, { children: landing });
|
|
60
62
|
const resume = safeNextPath(resumePath);
|
|
61
63
|
return /* @__PURE__ */ jsx(Navigate, { to: resume && resume !== "/" ? resume : home, replace: true });
|
|
62
64
|
}
|
|
63
|
-
function RedirectIfAuthed({ session, allowDemo = false, fallback, children }) {
|
|
65
|
+
function RedirectIfAuthed({ session, allowDemo = false, fallback, children, loading }) {
|
|
64
66
|
const { search } = useLocation();
|
|
67
|
+
if (session === "loading") return /* @__PURE__ */ jsx(Fragment, { children: loading ?? /* @__PURE__ */ jsx(LoadingState, {}) });
|
|
65
68
|
if (session === "none" || session === "demo" && allowDemo) {
|
|
66
69
|
return children === void 0 ? /* @__PURE__ */ jsx(Outlet, {}) : /* @__PURE__ */ jsx(Fragment, { children });
|
|
67
70
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/landing/routing.tsx"],"sourcesContent":["import { useEffect } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { Navigate, Outlet, useLocation } from \"react-router\";\n\nimport { readStored, writeStored } from \"../lib/safe-storage\";\nimport type { LandingSession } from \"./landing-actions\";\n\n/**\n * The public routes' logic (docs/landing-demo-harmonization.md §3): what `/` shows,\n * which pages a session skips, and the page a session resumes on — keksdose's\n * `RootEntry`, `RedirectIfAuthed` and use-last-visited-page.ts, for every app.\n * Router-aware (react-router), so they belong to the `./shell` entry.\n */\n\n/* ── ?next= ──────────────────────────────────────────────────────────────── */\n\n/** The query parameter that carries \"where I was actually trying to go\" through the\n * sign-in bounce (keksdose's `NEXT_PARAM`). */\nexport const NEXT_PARAM = \"next\";\n\n/**\n * A `?next=` value that is safe to navigate to, or null.\n *\n * Same-origin PATHS only, decided by the URL PARSER rather than by string prefix —\n * this is the open-redirect check, and it is the reason this lives in one place\n * instead of at each call site.\n *\n * The prefix version (\"starts with `/`, does not start with `//`\") let two shapes\n * through that the browser resolves cross-origin, because the WHATWG parser does not\n * read them as text: a backslash after the leading slash counts as a second slash for\n * a special scheme, so `/\\evil.example` resolves to `https://evil.example/`; and tab,\n * LF and CR are STRIPPED anywhere in the input before parsing, so `/<TAB>/evil.example`\n * becomes `//evil.example`. Asking the same parser the browser will use closes every\n * such shape at once, including ones nobody has thought of yet, and it normalises what\n * comes back instead of echoing the caller's spelling.\n *\n * keksdose's (shared/hooks/use-last-visited-page.ts), verbatim but for the fallback\n * origin.\n */\nexport function safeNextPath(raw: string | null | undefined): string | null {\n if (!raw) return null;\n const base = typeof window !== \"undefined\" ? window.location.origin : \"https://kit.invalid\";\n try {\n const url = new URL(raw, base);\n if (url.origin !== base) return null;\n return `${url.pathname}${url.search}${url.hash}`;\n } catch {\n return null;\n }\n}\n\n/* ── The last visited page (§3.2) ────────────────────────────────────────── */\n\n/** A path to leave out: a string is the path and everything under it (`/demo` is\n * `/demo` and `/demo/ended`; `/` is only `/`), a RegExp is tested on the pathname. */\nexport type PathPattern = string | RegExp;\n\n/**\n * The pages never recorded as a resume target (§3.2): the landing (`/`, `/welcome`), the\n * auth pages, the demo's own (`/demo*`) and the legal pages. The 404 has no path of its\n * own — call {@link useLastVisitedPage} inside the signed-in layout, as keksdose does,\n * and it never sees one. The app adds its own one-shot routes (keksdose:\n * `/banks/callback`, `/join`, `/share-target`) through `exclude`.\n */\nexport const DEFAULT_LAST_VISITED_EXCLUDES: readonly PathPattern[] = Object.freeze([\n \"/\",\n \"/welcome\",\n \"/login\",\n \"/register\",\n \"/forgot-password\",\n \"/reset-password\",\n \"/verify-email\",\n \"/demo\",\n \"/impressum\",\n \"/privacy\",\n \"/terms\",\n]);\n\nfunction matchesPath(pathname: string, pattern: PathPattern): boolean {\n if (typeof pattern !== \"string\") return new RegExp(pattern.source, pattern.flags.replace(\"g\", \"\")).test(pathname);\n if (pattern === \"/\") return pathname === \"/\";\n const base = pattern.endsWith(\"/\") ? pattern.slice(0, -1) : pattern;\n return pathname === base || pathname.startsWith(`${base}/`);\n}\n\n/** Whether `pathname` is one of the defaults or the app's `exclude`. */\nfunction isExcluded(pathname: string, exclude: readonly PathPattern[]): boolean {\n return [...DEFAULT_LAST_VISITED_EXCLUDES, ...exclude].some((pattern) => matchesPath(pathname, pattern));\n}\n\nexport interface LastVisitedPageOptions {\n /** The device key: `<app>.lastVisitedPage` (§3.2), one per app on the origin. */\n key: string;\n /** The app's own paths to leave out, ON TOP of {@link DEFAULT_LAST_VISITED_EXCLUDES}. */\n exclude?: readonly PathPattern[];\n /** `false` records nothing — while the session is still being restored, say. */\n enabled?: boolean;\n}\n\n/**\n * Remember the page a session is on (path and query), on every navigation, so `/` — a\n * revisit, a fresh sign-in, the installed PWA, whose `start_url` is `/` — resumes there\n * (§3.2, keksdose feedback #59). Device-local, in `localStorage` under `key`; a blocked\n * storage records nothing.\n *\n * Call it once in the signed-in layout. The excluded paths are never written, so a\n * one-shot page (a bank callback, an invitation link) never becomes the place the next\n * launch opens on.\n */\nexport function useLastVisitedPage({ key, exclude = [], enabled = true }: LastVisitedPageOptions): void {\n const { pathname, search } = useLocation();\n // Decided here, so the effect depends on the answer and not on an `exclude` array the\n // caller likely builds inline.\n const skip = !enabled || isExcluded(pathname, exclude);\n useEffect(() => {\n if (skip) return;\n writeStored(key, pathname + search);\n }, [key, pathname, search, skip]);\n}\n\n/**\n * The page {@link useLastVisitedPage} remembered under `key` — checked by\n * {@link safeNextPath}, so a value someone planted in storage cannot leave the origin —\n * or `fallback` (default `null`) when there is none or storage is blocked. A string\n * fallback narrows the answer to a string, for react-router's `to`.\n */\nexport function readLastVisitedPage(key: string, fallback: string): string;\nexport function readLastVisitedPage(key: string, fallback?: null): string | null;\nexport function readLastVisitedPage(key: string, fallback: string | null = null): string | null {\n return safeNextPath(readStored(key)) ?? fallback;\n}\n\n/** Forget the remembered page — on an explicit sign-out, so the next account does not\n * resume on the previous one's page. */\nexport function clearLastVisitedPage(key: string): void {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.removeItem(key);\n } catch {\n // storage blocked: there is nothing to forget\n }\n}\n\n/* ── RootEntry ───────────────────────────────────────────────────────────── */\n\nexport interface RootEntryProps {\n /** Without a session `/` is the landing; with one (real or demo) it resumes. */\n session: LandingSession;\n /** The remembered page — `readLastVisitedPage(key)`. */\n resumePath?: string | null;\n /** The landing page element. */\n landing: ReactNode;\n /** The app's home: where a session goes with nothing to resume (keksdose `/budget`,\n * kastlan and Kurvenschmiede `/dashboard`). */\n home: string;\n}\n\n/**\n * The `/` route (§3.1): the landing for a visitor, and for a session — real or demo —\n * the last visited page, else the app's home. Indexed and canonical `/` for the visitor;\n * a crawler never has a session, so for it `/` is stable.\n *\n * keksdose showed a session with nothing remembered the landing; the contract sends it\n * home instead, because a session at `/` came to use the app. The landing stays one tap\n * away at `/welcome`, where the signed-in brand link points.\n */\nexport function RootEntry({ session, resumePath, landing, home }: RootEntryProps) {\n if (session === \"none\") return <>{landing}</>;\n const resume = safeNextPath(resumePath);\n return <Navigate to={resume && resume !== \"/\" ? resume : home} replace />;\n}\n\n/* ── RedirectIfAuthed ────────────────────────────────────────────────────── */\n\nexport interface RedirectIfAuthedProps {\n session: LandingSession;\n /**\n * Let a DEMO session through (§5.6): on `/login`, `/register` and the app's invitation\n * pages, so a demo visitor can sign in or accept an invitation — a successful one\n * replaces the demo session. Default `false`: on `/demo` a live demo continues instead\n * of starting a second one (§5.2), and on `/forgot-password` a demo has no password.\n */\n allowDemo?: boolean;\n /** Where a redirected session goes: the resume target —\n * `readLastVisitedPage(key, home)`. A safe `?next=` goes first. */\n fallback: string;\n /** The page. Left out, an `<Outlet />`: the component is a layout route around the\n * public pages, as in keksdose. */\n children?: ReactNode;\n}\n\n/**\n * Public pages a session skips (§3.1): a signed-in visitor at `/login` goes back into\n * the app, to a safe `?next=` when the URL carries one (a share invitation or a push\n * deep link opened with a live session in another tab — keksdose) and else to\n * `fallback`.\n *\n * A demo session passes where `allowDemo` says so (§5.6). Mount one wrapper with\n * `allowDemo` around `/login`, `/register` and the invitation pages, and one without\n * around `/demo` (and `/forgot-password`).\n */\nexport function RedirectIfAuthed({ session, allowDemo = false, fallback, children }: RedirectIfAuthedProps) {\n const { search } = useLocation();\n if (session === \"none\" || (session === \"demo\" && allowDemo)) {\n return children === undefined ? <Outlet /> : <>{children}</>;\n }\n const next = safeNextPath(new URLSearchParams(search).get(NEXT_PARAM));\n return <Navigate to={next ?? fallback} replace />;\n}\n"],"mappings":";AAuKiC;AAvKjC,SAAS,iBAAiB;AAE1B,SAAS,UAAU,QAAQ,mBAAmB;AAE9C,SAAS,YAAY,mBAAmB;AAcjC,MAAM,aAAa;AAqBnB,SAAS,aAAa,KAA+C;AAC1E,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,OAAO,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AACtE,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,KAAK,IAAI;AAC7B,QAAI,IAAI,WAAW,KAAM,QAAO;AAChC,WAAO,GAAG,IAAI,QAAQ,GAAG,IAAI,MAAM,GAAG,IAAI,IAAI;AAAA,EAChD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAeO,MAAM,gCAAwD,OAAO,OAAO;AAAA,EACjF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,YAAY,UAAkB,SAA+B;AACpE,MAAI,OAAO,YAAY,SAAU,QAAO,IAAI,OAAO,QAAQ,QAAQ,QAAQ,MAAM,QAAQ,KAAK,EAAE,CAAC,EAAE,KAAK,QAAQ;AAChH,MAAI,YAAY,IAAK,QAAO,aAAa;AACzC,QAAM,OAAO,QAAQ,SAAS,GAAG,IAAI,QAAQ,MAAM,GAAG,EAAE,IAAI;AAC5D,SAAO,aAAa,QAAQ,SAAS,WAAW,GAAG,IAAI,GAAG;AAC5D;AAGA,SAAS,WAAW,UAAkB,SAA0C;AAC9E,SAAO,CAAC,GAAG,+BAA+B,GAAG,OAAO,EAAE,KAAK,CAAC,YAAY,YAAY,UAAU,OAAO,CAAC;AACxG;AAqBO,SAAS,mBAAmB,EAAE,KAAK,UAAU,CAAC,GAAG,UAAU,KAAK,GAAiC;AACtG,QAAM,EAAE,UAAU,OAAO,IAAI,YAAY;AAGzC,QAAM,OAAO,CAAC,WAAW,WAAW,UAAU,OAAO;AACrD,YAAU,MAAM;AACd,QAAI,KAAM;AACV,gBAAY,KAAK,WAAW,MAAM;AAAA,EACpC,GAAG,CAAC,KAAK,UAAU,QAAQ,IAAI,CAAC;AAClC;AAUO,SAAS,oBAAoB,KAAa,WAA0B,MAAqB;AAC9F,SAAO,aAAa,WAAW,GAAG,CAAC,KAAK;AAC1C;AAIO,SAAS,qBAAqB,KAAmB;AACtD,MAAI,OAAO,WAAW,YAAa;AACnC,MAAI;AACF,WAAO,aAAa,WAAW,GAAG;AAAA,EACpC,QAAQ;AAAA,EAER;AACF;AAyBO,SAAS,UAAU,EAAE,SAAS,YAAY,SAAS,KAAK,GAAmB;AAChF,MAAI,YAAY,OAAQ,QAAO,gCAAG,mBAAQ;AAC1C,QAAM,SAAS,aAAa,UAAU;AACtC,SAAO,oBAAC,YAAS,IAAI,UAAU,WAAW,MAAM,SAAS,MAAM,SAAO,MAAC;AACzE;AA+BO,SAAS,iBAAiB,EAAE,SAAS,YAAY,OAAO,UAAU,SAAS,GAA0B;AAC1G,QAAM,EAAE,OAAO,IAAI,YAAY;AAC/B,MAAI,YAAY,UAAW,YAAY,UAAU,WAAY;AAC3D,WAAO,aAAa,SAAY,oBAAC,UAAO,IAAK,gCAAG,UAAS;AAAA,EAC3D;AACA,QAAM,OAAO,aAAa,IAAI,gBAAgB,MAAM,EAAE,IAAI,UAAU,CAAC;AACrE,SAAO,oBAAC,YAAS,IAAI,QAAQ,UAAU,SAAO,MAAC;AACjD;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/landing/routing.tsx"],"sourcesContent":["import { useEffect } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { Navigate, Outlet, useLocation } from \"react-router\";\n\nimport { readStored, writeStored } from \"../lib/safe-storage\";\nimport type { LandingSession } from \"./landing-actions\";\nimport { LoadingState } from \"../components/loading-state\";\n\n/**\n * 0.31.1: a session that is still being restored — an app whose access token lives in\n * memory reads it back from its refresh token first (kastlan's 0.31 adoption). Until\n * then `/` neither shows the landing nor resumes, and a public page neither shows nor\n * redirects: both render `loading` instead.\n */\nexport type RoutingSession = LandingSession | \"loading\";\n\n/**\n * The public routes' logic (docs/landing-demo-harmonization.md §3): what `/` shows,\n * which pages a session skips, and the page a session resumes on — keksdose's\n * `RootEntry`, `RedirectIfAuthed` and use-last-visited-page.ts, for every app.\n * Router-aware (react-router), so they belong to the `./shell` entry.\n */\n\n/* ── ?next= ──────────────────────────────────────────────────────────────── */\n\n/** The query parameter that carries \"where I was actually trying to go\" through the\n * sign-in bounce (keksdose's `NEXT_PARAM`). */\nexport const NEXT_PARAM = \"next\";\n\n/**\n * A `?next=` value that is safe to navigate to, or null.\n *\n * Same-origin PATHS only, decided by the URL PARSER rather than by string prefix —\n * this is the open-redirect check, and it is the reason this lives in one place\n * instead of at each call site.\n *\n * The prefix version (\"starts with `/`, does not start with `//`\") let two shapes\n * through that the browser resolves cross-origin, because the WHATWG parser does not\n * read them as text: a backslash after the leading slash counts as a second slash for\n * a special scheme, so `/\\evil.example` resolves to `https://evil.example/`; and tab,\n * LF and CR are STRIPPED anywhere in the input before parsing, so `/<TAB>/evil.example`\n * becomes `//evil.example`. Asking the same parser the browser will use closes every\n * such shape at once, including ones nobody has thought of yet, and it normalises what\n * comes back instead of echoing the caller's spelling.\n *\n * keksdose's (shared/hooks/use-last-visited-page.ts), verbatim but for the fallback\n * origin.\n */\nexport function safeNextPath(raw: string | null | undefined): string | null {\n if (!raw) return null;\n const base = typeof window !== \"undefined\" ? window.location.origin : \"https://kit.invalid\";\n try {\n const url = new URL(raw, base);\n if (url.origin !== base) return null;\n return `${url.pathname}${url.search}${url.hash}`;\n } catch {\n return null;\n }\n}\n\n/* ── The last visited page (§3.2) ────────────────────────────────────────── */\n\n/** A path to leave out: a string is the path and everything under it (`/demo` is\n * `/demo` and `/demo/ended`; `/` is only `/`), a RegExp is tested on the pathname. */\nexport type PathPattern = string | RegExp;\n\n/**\n * The pages never recorded as a resume target (§3.2): the landing (`/`, `/welcome`), the\n * auth pages, the demo's own (`/demo*`) and the legal pages. The 404 has no path of its\n * own — call {@link useLastVisitedPage} inside the signed-in layout, as keksdose does,\n * and it never sees one. The app adds its own one-shot routes (keksdose:\n * `/banks/callback`, `/join`, `/share-target`) through `exclude`.\n */\nexport const DEFAULT_LAST_VISITED_EXCLUDES: readonly PathPattern[] = Object.freeze([\n \"/\",\n \"/welcome\",\n \"/login\",\n \"/register\",\n \"/forgot-password\",\n \"/reset-password\",\n \"/verify-email\",\n \"/demo\",\n \"/impressum\",\n \"/privacy\",\n \"/terms\",\n]);\n\nfunction matchesPath(pathname: string, pattern: PathPattern): boolean {\n if (typeof pattern !== \"string\") return new RegExp(pattern.source, pattern.flags.replace(\"g\", \"\")).test(pathname);\n if (pattern === \"/\") return pathname === \"/\";\n const base = pattern.endsWith(\"/\") ? pattern.slice(0, -1) : pattern;\n return pathname === base || pathname.startsWith(`${base}/`);\n}\n\n/** Whether `pathname` is one of the defaults or the app's `exclude`. */\nfunction isExcluded(pathname: string, exclude: readonly PathPattern[]): boolean {\n return [...DEFAULT_LAST_VISITED_EXCLUDES, ...exclude].some((pattern) => matchesPath(pathname, pattern));\n}\n\nexport interface LastVisitedPageOptions {\n /** The device key: `<app>.lastVisitedPage` (§3.2), one per app on the origin. */\n key: string;\n /** The app's own paths to leave out, ON TOP of {@link DEFAULT_LAST_VISITED_EXCLUDES}. */\n exclude?: readonly PathPattern[];\n /** `false` records nothing — while the session is still being restored, say. */\n enabled?: boolean;\n}\n\n/**\n * Remember the page a session is on (path and query), on every navigation, so `/` — a\n * revisit, a fresh sign-in, the installed PWA, whose `start_url` is `/` — resumes there\n * (§3.2, keksdose feedback #59). Device-local, in `localStorage` under `key`; a blocked\n * storage records nothing.\n *\n * Call it once in the signed-in layout. The excluded paths are never written, so a\n * one-shot page (a bank callback, an invitation link) never becomes the place the next\n * launch opens on.\n */\nexport function useLastVisitedPage({ key, exclude = [], enabled = true }: LastVisitedPageOptions): void {\n const { pathname, search } = useLocation();\n // Decided here, so the effect depends on the answer and not on an `exclude` array the\n // caller likely builds inline.\n const skip = !enabled || isExcluded(pathname, exclude);\n useEffect(() => {\n if (skip) return;\n writeStored(key, pathname + search);\n }, [key, pathname, search, skip]);\n}\n\n/**\n * The page {@link useLastVisitedPage} remembered under `key` — checked by\n * {@link safeNextPath}, so a value someone planted in storage cannot leave the origin —\n * or `fallback` (default `null`) when there is none or storage is blocked. A string\n * fallback narrows the answer to a string, for react-router's `to`.\n */\nexport function readLastVisitedPage(key: string, fallback: string): string;\nexport function readLastVisitedPage(key: string, fallback?: null): string | null;\nexport function readLastVisitedPage(key: string, fallback: string | null = null): string | null {\n return safeNextPath(readStored(key)) ?? fallback;\n}\n\n/** Forget the remembered page — on an explicit sign-out, so the next account does not\n * resume on the previous one's page. */\nexport function clearLastVisitedPage(key: string): void {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.removeItem(key);\n } catch {\n // storage blocked: there is nothing to forget\n }\n}\n\n/* ── RootEntry ───────────────────────────────────────────────────────────── */\n\nexport interface RootEntryProps {\n /** Without a session `/` is the landing; with one (real or demo) it resumes;\n * `\"loading\"` while the app restores one. */\n session: RoutingSession;\n /** What shows while `session` is `\"loading\"`. Default: the kit's `LoadingState`. */\n loading?: ReactNode;\n /** The remembered page — `readLastVisitedPage(key)`. */\n resumePath?: string | null;\n /** The landing page element. */\n landing: ReactNode;\n /** The app's home: where a session goes with nothing to resume (keksdose `/budget`,\n * kastlan and Kurvenschmiede `/dashboard`). */\n home: string;\n}\n\n/**\n * The `/` route (§3.1): the landing for a visitor, and for a session — real or demo —\n * the last visited page, else the app's home. Indexed and canonical `/` for the visitor;\n * a crawler never has a session, so for it `/` is stable.\n *\n * keksdose showed a session with nothing remembered the landing; the contract sends it\n * home instead, because a session at `/` came to use the app. The landing stays one tap\n * away at `/welcome`, where the signed-in brand link points.\n */\nexport function RootEntry({ session, resumePath, landing, home, loading }: RootEntryProps) {\n if (session === \"loading\") return <>{loading ?? <LoadingState />}</>;\n if (session === \"none\") return <>{landing}</>;\n const resume = safeNextPath(resumePath);\n return <Navigate to={resume && resume !== \"/\" ? resume : home} replace />;\n}\n\n/* ── RedirectIfAuthed ────────────────────────────────────────────────────── */\n\nexport interface RedirectIfAuthedProps {\n /** `\"loading\"` while the app restores a session: neither the page nor a redirect. */\n session: RoutingSession;\n /** What shows while `session` is `\"loading\"`. Default: the kit's `LoadingState`. */\n loading?: ReactNode;\n /**\n * Let a DEMO session through (§5.6): on `/login`, `/register` and the app's invitation\n * pages, so a demo visitor can sign in or accept an invitation — a successful one\n * replaces the demo session. Default `false`: on `/demo` a live demo continues instead\n * of starting a second one (§5.2), and on `/forgot-password` a demo has no password.\n */\n allowDemo?: boolean;\n /** Where a redirected session goes: the resume target —\n * `readLastVisitedPage(key, home)`. A safe `?next=` goes first. */\n fallback: string;\n /** The page. Left out, an `<Outlet />`: the component is a layout route around the\n * public pages, as in keksdose. */\n children?: ReactNode;\n}\n\n/**\n * Public pages a session skips (§3.1): a signed-in visitor at `/login` goes back into\n * the app, to a safe `?next=` when the URL carries one (a share invitation or a push\n * deep link opened with a live session in another tab — keksdose) and else to\n * `fallback`.\n *\n * A demo session passes where `allowDemo` says so (§5.6). Mount one wrapper with\n * `allowDemo` around `/login`, `/register` and the invitation pages, and one without\n * around `/demo` (and `/forgot-password`).\n */\nexport function RedirectIfAuthed({ session, allowDemo = false, fallback, children, loading }: RedirectIfAuthedProps) {\n const { search } = useLocation();\n if (session === \"loading\") return <>{loading ?? <LoadingState />}</>;\n if (session === \"none\" || (session === \"demo\" && allowDemo)) {\n return children === undefined ? <Outlet /> : <>{children}</>;\n }\n const next = safeNextPath(new URLSearchParams(search).get(NEXT_PARAM));\n return <Navigate to={next ?? fallback} replace />;\n}\n"],"mappings":";AAmLoC,mBAAc,WAAd;AAnLpC,SAAS,iBAAiB;AAE1B,SAAS,UAAU,QAAQ,mBAAmB;AAE9C,SAAS,YAAY,mBAAmB;AAExC,SAAS,oBAAoB;AAqBtB,MAAM,aAAa;AAqBnB,SAAS,aAAa,KAA+C;AAC1E,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,OAAO,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AACtE,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,KAAK,IAAI;AAC7B,QAAI,IAAI,WAAW,KAAM,QAAO;AAChC,WAAO,GAAG,IAAI,QAAQ,GAAG,IAAI,MAAM,GAAG,IAAI,IAAI;AAAA,EAChD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAeO,MAAM,gCAAwD,OAAO,OAAO;AAAA,EACjF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,YAAY,UAAkB,SAA+B;AACpE,MAAI,OAAO,YAAY,SAAU,QAAO,IAAI,OAAO,QAAQ,QAAQ,QAAQ,MAAM,QAAQ,KAAK,EAAE,CAAC,EAAE,KAAK,QAAQ;AAChH,MAAI,YAAY,IAAK,QAAO,aAAa;AACzC,QAAM,OAAO,QAAQ,SAAS,GAAG,IAAI,QAAQ,MAAM,GAAG,EAAE,IAAI;AAC5D,SAAO,aAAa,QAAQ,SAAS,WAAW,GAAG,IAAI,GAAG;AAC5D;AAGA,SAAS,WAAW,UAAkB,SAA0C;AAC9E,SAAO,CAAC,GAAG,+BAA+B,GAAG,OAAO,EAAE,KAAK,CAAC,YAAY,YAAY,UAAU,OAAO,CAAC;AACxG;AAqBO,SAAS,mBAAmB,EAAE,KAAK,UAAU,CAAC,GAAG,UAAU,KAAK,GAAiC;AACtG,QAAM,EAAE,UAAU,OAAO,IAAI,YAAY;AAGzC,QAAM,OAAO,CAAC,WAAW,WAAW,UAAU,OAAO;AACrD,YAAU,MAAM;AACd,QAAI,KAAM;AACV,gBAAY,KAAK,WAAW,MAAM;AAAA,EACpC,GAAG,CAAC,KAAK,UAAU,QAAQ,IAAI,CAAC;AAClC;AAUO,SAAS,oBAAoB,KAAa,WAA0B,MAAqB;AAC9F,SAAO,aAAa,WAAW,GAAG,CAAC,KAAK;AAC1C;AAIO,SAAS,qBAAqB,KAAmB;AACtD,MAAI,OAAO,WAAW,YAAa;AACnC,MAAI;AACF,WAAO,aAAa,WAAW,GAAG;AAAA,EACpC,QAAQ;AAAA,EAER;AACF;AA4BO,SAAS,UAAU,EAAE,SAAS,YAAY,SAAS,MAAM,QAAQ,GAAmB;AACzF,MAAI,YAAY,UAAW,QAAO,gCAAG,qBAAW,oBAAC,gBAAa,GAAG;AACjE,MAAI,YAAY,OAAQ,QAAO,gCAAG,mBAAQ;AAC1C,QAAM,SAAS,aAAa,UAAU;AACtC,SAAO,oBAAC,YAAS,IAAI,UAAU,WAAW,MAAM,SAAS,MAAM,SAAO,MAAC;AACzE;AAkCO,SAAS,iBAAiB,EAAE,SAAS,YAAY,OAAO,UAAU,UAAU,QAAQ,GAA0B;AACnH,QAAM,EAAE,OAAO,IAAI,YAAY;AAC/B,MAAI,YAAY,UAAW,QAAO,gCAAG,qBAAW,oBAAC,gBAAa,GAAG;AACjE,MAAI,YAAY,UAAW,YAAY,UAAU,WAAY;AAC3D,WAAO,aAAa,SAAY,oBAAC,UAAO,IAAK,gCAAG,UAAS;AAAA,EAC3D;AACA,QAAM,OAAO,aAAa,IAAI,gBAAgB,MAAM,EAAE,IAAI,UAAU,CAAC;AACrE,SAAO,oBAAC,YAAS,IAAI,QAAQ,UAAU,SAAO,MAAC;AACjD;","names":[]}
|
package/dist/rhf/fields.d.ts
CHANGED
|
@@ -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 { dt as IbanInputProps, eg as PhoneInputProps, eD as SelectProps, dD as InputProps, eY as TextareaProps } from '../delete-account-setting-
|
|
4
|
+
import { dt as IbanInputProps, eg as PhoneInputProps, eD as SelectProps, dD as InputProps, eY as TextareaProps } from '../delete-account-setting-CpIhzxxZ.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';
|
package/dist/rhf/form.d.ts
CHANGED
|
@@ -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 { dW as LabelProps } from '../delete-account-setting-
|
|
5
|
+
import { dW as LabelProps } from '../delete-account-setting-CpIhzxxZ.js';
|
|
6
6
|
import '../components/tooltip.js';
|
|
7
7
|
import '../hooks/use-anchored-rect.js';
|
|
8
8
|
import '../lib/clipping.js';
|