@keepkit/ui 0.17.0 → 0.19.0

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/dist/index.d.ts CHANGED
@@ -1,69 +1,40 @@
1
1
  import * as react from 'react';
2
- import { ReactNode, HTMLAttributes, ComponentType, ImgHTMLAttributes, MouseEvent, HTMLAttributeAnchorTarget, InputHTMLAttributes, FormHTMLAttributes, KeyboardEvent, ButtonHTMLAttributes, SelectHTMLAttributes, CSSProperties } from 'react';
3
- import { KeepItem, ImportItemsResult, KeepListQuery, KeepUrlSyncOptions, KeepItemStatus, KeepSyncConflict, KeepItemInput } from '@keepkit/core/core';
2
+ import { HTMLAttributes, ReactNode, ComponentType, ReactElement, InputHTMLAttributes, ImgHTMLAttributes, MouseEvent, HTMLAttributeAnchorTarget, KeyboardEvent, FormHTMLAttributes, SelectHTMLAttributes, ButtonHTMLAttributes, CSSProperties } from 'react';
3
+ import { KeepListQuery, KeepUrlSyncOptions, ImportItemsResult, KeepItem, KeepItemStatus, KeepSyncConflict, KeepItemInput } from '@keepkit/core/core';
4
4
  export { AuthenticatedSyncAuthContext, AuthenticatedSyncKit, AuthenticatedSyncKitOptions, AuthenticatedSyncRequestContext, AuthenticatedSyncTransport, KeepItem, KeepItemInput, KeepListQuery, KeepScope, KeepSyncConflict, KeepSyncResolution, KeepSyncState, KeepSyncStatus, KeepUndoState, KeepUrlSyncOptions, createAuthenticatedSyncKit } from '@keepkit/core/core';
5
5
  import { KeepButtonProps as KeepButtonProps$1, UseKeepListResult, KeepErrorBoundaryProps, UseKeepNavigatorResult, CreateKeepKitOptions as CreateKeepKitOptions$1, KeepProviderProps, useKeepContext, useKeepItem, useKeepList, UseKeepNavigatorOptions, KeepShortcutOptions } from '@keepkit/core/react';
6
6
  export { KeepButtonState, KeepContextValue, KeepErrorBoundary, KeepErrorBoundaryProps, KeepProvider, KeepProviderProps, KeepShortcutOptions, useKeepContext, useKeepItem, useKeepList, useKeepNavigator, useKeepShortcut } from '@keepkit/core/react';
7
7
  export { FallbackStorageAdapter, IndexedDBAdapter, IndexedDBSyncQueueAdapter, LocalStorageAdapter, LocalStorageSyncQueueAdapter, SyncStorageAdapter, createBrowserStorageAdapter, createStorageAdapter } from '@keepkit/core/storage';
8
8
 
9
- type KeepUiLabelKey = "save" | "saved" | "remove" | "loading" | "saving" | "syncing" | "error" | "allTags" | "tags" | "filterTags" | "note" | "saveNote" | "noItems" | "loadingItems" | "errorItems" | "search" | "sort" | "newest" | "oldest" | "savedNewest" | "savedOldest" | "updatedNewest" | "updatedOldest" | "previousPage" | "nextPage" | "pagination" | "page" | "selectItems" | "selectedCount" | "deleteSelected" | "tagsToApply" | "applyTags" | "savedMessage" | "removedMessage" | "restoredMessage" | "syncFailedMessage" | "stalePrunedMessage" | "undo" | "undoAvailable" | "selectionScope" | "currentPage" | "searchResults" | "allItems" | "localVersion" | "remoteVersion" | "updatedAt" | "statusAvailable" | "noteSavedMessage" | "exportData" | "importData" | "importMode" | "merge" | "replace" | "importedCount" | "failedCount" | "storageQuotaError" | "statusExpired" | "statusRemoved" | "statusDeleted" | "statusPrivate" | "statusUnknown" | "retry" | "removeFromList" | "pruneStale" | "retrySync" | "resolveSync" | "keepLocal" | "useServer" | "manualMerge" | "close" | "backupRecovery" | "backupRecoveryDescription" | "syncPending" | "syncSynced" | "syncConflict";
10
- type KeepUiLabels = Partial<Record<KeepUiLabelKey, string>>;
11
- type KeepUiLocaleLabels = Record<KeepUiLabelKey, string>;
12
-
13
- declare const KEEP_BUILT_IN_LOCALES: readonly ["en", "ja", "ko", "zh-Hans", "zh-Hant", "th", "fr", "es", "pt-BR", "it", "de", "ru", "fil", "vi", "id", "ms"];
14
- type KeepUiLocale = (typeof KEEP_BUILT_IN_LOCALES)[number];
15
- declare function getKeepLocaleLabels(locale?: string): KeepUiLocaleLabels;
16
-
17
- type KeepUiLabelContext = {
18
- locale?: string;
19
- labels: Readonly<Record<KeepUiLabelKey, string>>;
20
- customLabels?: KeepUiLabels;
21
- labelResolver?: (key: KeepUiLabelKey, context: {
22
- locale?: string;
23
- }) => string | undefined;
24
- emitFeedback: <TMeta>(event: KeepUiFeedbackEvent<TMeta>) => void;
25
- };
26
- type KeepUiFeedbackBase<TType extends string> = {
27
- type: TType;
28
- message: string;
29
- };
30
- type KeepUiFeedbackEvent<TMeta = Record<string, unknown>> = (KeepUiFeedbackBase<"item-saved"> & {
31
- item: KeepItem<TMeta>;
32
- }) | (KeepUiFeedbackBase<"item-removed"> & {
33
- item: KeepItem<TMeta>;
34
- undo: () => void | Promise<void>;
35
- undoLabel: string;
36
- }) | (KeepUiFeedbackBase<"item-restored"> & {
37
- item?: KeepItem<TMeta>;
38
- items: KeepItem<TMeta>[];
39
- }) | KeepUiFeedbackBase<"sync-completed"> | (KeepUiFeedbackBase<"sync-failed"> & {
40
- error: unknown;
41
- }) | (KeepUiFeedbackBase<"stale-pruned"> & {
42
- item?: KeepItem<TMeta>;
43
- items: KeepItem<TMeta>[];
44
- undo: () => void | Promise<void>;
45
- undoLabel: string;
46
- });
47
- type KeepUiProviderProps<TMeta = Record<string, unknown>> = {
48
- labels?: KeepUiLabels;
49
- locale?: string;
50
- labelResolver?: KeepUiLabelContext["labelResolver"];
51
- onFeedback?: (event: KeepUiFeedbackEvent<TMeta>) => void;
52
- children?: ReactNode;
9
+ type KeepUrlAdapter = {
10
+ getUrl: () => string;
11
+ subscribe?: (listener: () => void) => () => void;
12
+ navigate: (url: string, mode: "replace" | "push") => void;
53
13
  };
54
- /** Provides one complete locale-aware label source to every UI primitive. */
55
- declare function KeepUiProvider<TMeta = Record<string, unknown>>({ labels, locale, labelResolver, onFeedback, children, }: KeepUiProviderProps<TMeta>): react.JSX.Element;
56
- declare function useKeepUiLabels(): KeepUiLabelContext;
57
-
58
- type KeepToastFeedbackOptions = {
59
- action?: {
60
- label: string;
61
- onClick: () => void;
14
+ type KeepPagesRouterLike = {
15
+ asPath?: string;
16
+ push: (url: string, as?: string, options?: {
17
+ shallow?: boolean;
18
+ }) => Promise<boolean> | boolean;
19
+ replace: (url: string, as?: string, options?: {
20
+ shallow?: boolean;
21
+ }) => Promise<boolean> | boolean;
22
+ events?: {
23
+ on: (event: string, listener: () => void) => void;
24
+ off: (event: string, listener: () => void) => void;
62
25
  };
63
26
  };
64
- type KeepToastHandler = (message: string, options?: KeepToastFeedbackOptions) => unknown;
65
- /** Adapts KeepKit feedback to Sonner-like toast functions without adding a toast dependency. */
66
- declare function useKeepToastFeedback<TMeta = Record<string, unknown>>(showToast: KeepToastHandler): (event: KeepUiFeedbackEvent<TMeta>) => void;
27
+ type KeepUrlSyncProps<TMeta = Record<string, unknown>> = {
28
+ enabled?: boolean;
29
+ query: KeepListQuery<TMeta>;
30
+ onQueryChange: (query: KeepListQuery<TMeta> | ((previous: KeepListQuery<TMeta>) => KeepListQuery<TMeta>)) => void;
31
+ options?: KeepUrlSyncOptions;
32
+ adapter?: KeepUrlAdapter;
33
+ };
34
+ /** Adapter for Next.js Pages Router. It intentionally uses structural typing and has no Next dependency. */
35
+ declare function createNextPagesRouterAdapter(router: KeepPagesRouterLike): KeepUrlAdapter;
36
+ /** Synchronizes collection filters with browser history and supports back/forward restoration. */
37
+ declare function useKeepUrlSync<TMeta = Record<string, unknown>>({ enabled, query, onQueryChange, options, adapter: providedAdapter, }: KeepUrlSyncProps<TMeta>): void;
67
38
 
68
39
  type KeepBackupProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, "children"> & {
69
40
  filename?: string;
@@ -101,6 +72,12 @@ type KeepButtonIcons = {
101
72
  loading?: KeepButtonIcon;
102
73
  error?: KeepButtonIcon;
103
74
  };
75
+ type MergeableProps = Record<string, unknown>;
76
+ /** Chains child and component event handlers while preserving both handlers' event order. */
77
+ declare function chainedFunction<T extends (...args: never[]) => unknown>(childHandler: T | undefined, parentHandler: T | undefined): T | undefined;
78
+ /** Merges slot props without dropping child classes, styles, ARIA attributes, or events. */
79
+ declare function mergeProps<T extends MergeableProps>(childProps: T, parentProps: Partial<T> & MergeableProps): T;
80
+ declare function createSlot(child: ReactElement<MergeableProps>, props: MergeableProps, body?: ReactNode): ReactElement<MergeableProps>;
104
81
 
105
82
  /** Returns whether every visible item is selected. Empty lists are never all selected. */
106
83
  declare function isAllSelected<TMeta>(items: readonly Pick<KeepItem<TMeta>, "id">[], selectedIds: readonly string[]): boolean;
@@ -150,6 +127,22 @@ type KeepButtonProps<TMeta = Record<string, unknown>> = KeepButtonProps$1<TMeta>
150
127
  /** A style-free save toggle with localized labels and the core button's ARIA/asChild behavior. */
151
128
  declare function KeepButton<TMeta = Record<string, unknown>>({ labels, icons, iconOnly, showLabel, iconClassName, onClick, onToggleError, ...props }: KeepButtonProps<TMeta>): react.JSX.Element;
152
129
 
130
+ type KeepItemCheckboxProps<TMeta = Record<string, unknown>> = Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "checked" | "defaultChecked" | "onChange"> & {
131
+ item: KeepItem<TMeta>;
132
+ checked?: boolean;
133
+ label?: ReactNode;
134
+ onCheckedChange?: (checked: boolean) => void;
135
+ };
136
+ /** A reusable accessible selection checkbox for a saved item. */
137
+ declare function KeepItemCheckbox<TMeta = Record<string, unknown>>({ item, checked, label, onCheckedChange, "aria-label": ariaLabel, ...props }: KeepItemCheckboxProps<TMeta>): react.JSX.Element;
138
+
139
+ type KeepUndoProps = Omit<HTMLAttributes<HTMLElement>, "children"> & {
140
+ children?: ReactNode;
141
+ label?: ReactNode;
142
+ };
143
+ /** Presents the short-lived undo action created by removeWithUndo/removeBatchWithUndo. */
144
+ declare function KeepUndo({ children, label, ...props }: KeepUndoProps): react.JSX.Element | null;
145
+
153
146
  type KeepItemCardState<TMeta = Record<string, unknown>> = {
154
147
  item: KeepItem<TMeta>;
155
148
  isSaved: boolean;
@@ -216,6 +209,7 @@ declare function KeepItemCardMedia({ children, fallback, ...props }: KeepItemCar
216
209
  declare function KeepItemCardContent({ children, ...props }: KeepItemCardContentProps): react.JSX.Element;
217
210
  declare function KeepItemCardTitle({ as, children, ...props }: KeepItemCardTitleProps): react.DetailedReactHTMLElement<{
218
211
  "data-keep-card-part": string;
212
+ "data-line-clamp": string;
219
213
  onChange?: react.ChangeEventHandler<HTMLHeadingElement, Element> | undefined;
220
214
  onError?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
221
215
  className?: string | undefined | undefined;
@@ -518,6 +512,7 @@ type KeepListProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLEl
518
512
  loadingCount?: number;
519
513
  empty?: ReactNode | RenderProp<KeepListState<TMeta>>;
520
514
  error?: ReactNode | RenderProp<KeepListState<TMeta>>;
515
+ onClearFilters?: () => void;
521
516
  itemCardProps?: Omit<KeepItemCardProps<TMeta>, "item" | "children" | "render">;
522
517
  layout?: KeepLayoutPreset;
523
518
  asChild?: boolean;
@@ -528,36 +523,6 @@ type KeepListProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLEl
528
523
  /** A list primitive with built-in loading, empty, error, and removal states. */
529
524
  declare function KeepList<TMeta = Record<string, unknown>>(props: KeepListProps<TMeta>): react.JSX.Element;
530
525
 
531
- type KeepUrlAdapter = {
532
- getUrl: () => string;
533
- subscribe?: (listener: () => void) => () => void;
534
- navigate: (url: string, mode: "replace" | "push") => void;
535
- };
536
- type KeepPagesRouterLike = {
537
- asPath?: string;
538
- push: (url: string, as?: string, options?: {
539
- shallow?: boolean;
540
- }) => Promise<boolean> | boolean;
541
- replace: (url: string, as?: string, options?: {
542
- shallow?: boolean;
543
- }) => Promise<boolean> | boolean;
544
- events?: {
545
- on: (event: string, listener: () => void) => void;
546
- off: (event: string, listener: () => void) => void;
547
- };
548
- };
549
- type KeepUrlSyncProps<TMeta = Record<string, unknown>> = {
550
- enabled?: boolean;
551
- query: KeepListQuery<TMeta>;
552
- onQueryChange: (query: KeepListQuery<TMeta> | ((previous: KeepListQuery<TMeta>) => KeepListQuery<TMeta>)) => void;
553
- options?: KeepUrlSyncOptions;
554
- adapter?: KeepUrlAdapter;
555
- };
556
- /** Adapter for Next.js Pages Router. It intentionally uses structural typing and has no Next dependency. */
557
- declare function createNextPagesRouterAdapter(router: KeepPagesRouterLike): KeepUrlAdapter;
558
- /** Synchronizes collection filters with browser history and supports back/forward restoration. */
559
- declare function useKeepUrlSync<TMeta = Record<string, unknown>>({ enabled, query, onQueryChange, options, adapter: providedAdapter, }: KeepUrlSyncProps<TMeta>): void;
560
-
561
526
  type KeepCollectionFeature = "search" | "sort" | "pagination" | "tagFilter" | "bulkActions";
562
527
  type KeepLayoutPreset = "list" | "grid" | "compact" | "auto";
563
528
  type KeepCollectionProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, "children"> & {
@@ -573,6 +538,7 @@ type KeepCollectionProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<
573
538
  /** Alias for `loading`. When neither is provided, KeepList renders skeleton cards. */
574
539
  renderLoading?: ReactNode | RenderProp<KeepListState<TMeta>>;
575
540
  loadingCount?: number;
541
+ activeFilters?: ReactNode | RenderProp<KeepListState<TMeta>>;
576
542
  empty?: ReactNode | RenderProp<KeepListState<TMeta>>;
577
543
  error?: ReactNode | RenderProp<KeepListState<TMeta>>;
578
544
  fallback?: KeepErrorBoundaryProps["fallback"];
@@ -582,23 +548,6 @@ type KeepCollectionProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<
582
548
  /** A batteries-included collection with query controls and accessible status feedback. */
583
549
  declare function KeepCollection<TMeta = Record<string, unknown>>(props: KeepCollectionProps<TMeta>): react.JSX.Element;
584
550
 
585
- type KeepItemCheckboxProps<TMeta = Record<string, unknown>> = Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "checked" | "defaultChecked" | "onChange"> & {
586
- item: KeepItem<TMeta>;
587
- checked?: boolean;
588
- label?: ReactNode;
589
- onCheckedChange?: (checked: boolean) => void;
590
- };
591
- /** A reusable accessible selection checkbox for a saved item. */
592
- declare function KeepItemCheckbox<TMeta = Record<string, unknown>>({ item, checked, label, onCheckedChange, "aria-label": ariaLabel, ...props }: KeepItemCheckboxProps<TMeta>): react.JSX.Element;
593
-
594
- type KeepItemStatusBadgeProps = Omit<HTMLAttributes<HTMLSpanElement>, "children"> & {
595
- status?: KeepItemStatus | "restricted";
596
- label?: ReactNode;
597
- };
598
- type KeepDisplayStatus = "available" | "expired" | "removed" | "restricted";
599
- /** Displays the normalized availability state of a saved item. */
600
- declare function KeepItemStatusBadge({ status, label, className, ...props }: KeepItemStatusBadgeProps): react.JSX.Element;
601
-
602
551
  type KeepLayoutProps = Omit<HTMLAttributes<HTMLElement>, "children"> & {
603
552
  layout?: KeepLayoutPreset;
604
553
  children?: ReactNode;
@@ -606,31 +555,6 @@ type KeepLayoutProps = Omit<HTMLAttributes<HTMLElement>, "children"> & {
606
555
  /** A container-aware layout wrapper with a stable preset attribute for host or theme CSS. */
607
556
  declare function KeepLayout({ layout, children, onKeyDown, onFocusCapture, ...props }: KeepLayoutProps): react.JSX.Element;
608
557
 
609
- type KeepNoteEditorState<TMeta = Record<string, unknown>> = {
610
- item: KeepItem<TMeta>;
611
- note: string;
612
- setNote: (note: string) => void;
613
- isDirty: boolean;
614
- isSaving: boolean;
615
- error: unknown | null;
616
- save: () => Promise<void>;
617
- };
618
- type KeepNoteEditorProps<TMeta = Record<string, unknown>> = Omit<FormHTMLAttributes<HTMLFormElement>, "children" | "onSubmit"> & {
619
- item: KeepItem<TMeta>;
620
- label?: ReactNode;
621
- saveLabel?: ReactNode;
622
- placeholder?: string;
623
- /** Automatically save dirty notes after this delay; set to 0 to disable auto-save. */
624
- debounceMs?: number;
625
- onSaved?: (note?: string) => void;
626
- onSaveError?: (error: unknown) => void;
627
- render?: RenderProp<KeepNoteEditorState<TMeta>>;
628
- children?: ReactNode | RenderProp<KeepNoteEditorState<TMeta>>;
629
- asChild?: boolean;
630
- };
631
- /** A controlled-by-default note editor that persists through useKeepItem. */
632
- declare function KeepNoteEditor<TMeta = Record<string, unknown>>({ item, label, saveLabel, placeholder, debounceMs, onSaved, onSaveError, render, children, asChild, className, ...formProps }: KeepNoteEditorProps<TMeta>): react.JSX.Element;
633
-
634
558
  type KeepReorderableItemState = {
635
559
  index: number;
636
560
  isDragging: boolean;
@@ -638,6 +562,7 @@ type KeepReorderableItemState = {
638
562
  role: "button";
639
563
  tabIndex: 0;
640
564
  draggable: true;
565
+ "data-drag-handle": "true";
641
566
  "aria-label": string;
642
567
  "aria-grabbed": boolean;
643
568
  onDragStart: () => void;
@@ -660,45 +585,31 @@ declare function KeepReorderableList<TItem extends {
660
585
  id: string;
661
586
  } = KeepItem>({ items, onReorder, renderItem, itemLabel, ...props }: KeepReorderableListProps<TItem>): react.JSX.Element;
662
587
 
663
- type KeepStaleNoticeProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, "children"> & {
588
+ type KeepNoteEditorState<TMeta = Record<string, unknown>> = {
664
589
  item: KeepItem<TMeta>;
665
- onRetry?: (item: KeepItem<TMeta>) => void | Promise<void>;
666
- onRemoved?: (item: KeepItem<TMeta>) => void;
667
- retryLabel?: ReactNode;
668
- removeLabel?: ReactNode;
669
- children?: ReactNode;
590
+ note: string;
591
+ setNote: (note: string) => void;
592
+ isDirty: boolean;
593
+ isSaving: boolean;
594
+ error: unknown | null;
595
+ save: () => Promise<void>;
670
596
  };
671
- /** Provides retry and remove actions for an item whose source is no longer available. */
672
- declare function KeepStaleNotice<TMeta = Record<string, unknown>>({ item, onRetry, onRemoved, retryLabel, removeLabel, children, className, ...props }: KeepStaleNoticeProps<TMeta>): react.JSX.Element;
673
- type KeepPruneStaleButtonProps = Omit<ButtonHTMLAttributes<HTMLButtonElement>, "children"> & {
674
- statuses?: KeepItemStatus[];
597
+ type KeepNoteEditorProps<TMeta = Record<string, unknown>> = Omit<FormHTMLAttributes<HTMLFormElement>, "children" | "onSubmit"> & {
598
+ item: KeepItem<TMeta>;
675
599
  label?: ReactNode;
676
- onPruned?: (ids: string[]) => void;
677
- children?: ReactNode;
678
- };
679
- /** Removes all unavailable items through the provider's undo-capable batch action. */
680
- declare function KeepPruneStaleButton<TMeta = Record<string, unknown>>({ statuses, label, onPruned, children, disabled, ...props }: KeepPruneStaleButtonProps): react.JSX.Element;
681
-
682
- type KeepSyncRecoveryDialogProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, "children" | "title"> & {
683
- open?: boolean;
684
- onOpenChange?: (open: boolean) => void;
685
- conflicts?: KeepSyncConflict<TMeta>[];
686
- onManualMerge?: (conflict: KeepSyncConflict<TMeta>) => KeepItem<TMeta> | Promise<KeepItem<TMeta>>;
687
- backup?: ReactNode;
688
- showBackupControls?: boolean;
689
- title?: ReactNode;
690
- children?: ReactNode;
691
- };
692
- /** Resolves queued sync conflicts and guides users to restore a backup after data corruption. */
693
- declare function KeepSyncRecoveryDialog<TMeta = Record<string, unknown>>({ open, onOpenChange, conflicts, onManualMerge, backup, showBackupControls, title, children, className, ...props }: KeepSyncRecoveryDialogProps<TMeta>): react.JSX.Element | null;
694
-
695
- type KeepSyncStatusBannerProps = Omit<HTMLAttributes<HTMLElement>, "children"> & {
696
- onRetry?: () => void | Promise<void>;
697
- onResolveConflicts?: () => void;
698
- children?: ReactNode;
600
+ saveLabel?: ReactNode;
601
+ placeholder?: string;
602
+ /** Automatically save dirty notes after this delay; set to 0 to disable auto-save. */
603
+ debounceMs?: number;
604
+ showShortcutHint?: boolean;
605
+ onSaved?: (note?: string) => void;
606
+ onSaveError?: (error: unknown) => void;
607
+ render?: RenderProp<KeepNoteEditorState<TMeta>>;
608
+ children?: ReactNode | RenderProp<KeepNoteEditorState<TMeta>>;
609
+ asChild?: boolean;
699
610
  };
700
- /** Announces synchronization failures and exposes retry or conflict-recovery entry points. */
701
- declare function KeepSyncStatusBanner({ onRetry, onResolveConflicts, children, className, ...props }: KeepSyncStatusBannerProps): react.JSX.Element | null;
611
+ /** A controlled-by-default note editor that persists through useKeepItem. */
612
+ declare function KeepNoteEditor<TMeta = Record<string, unknown>>({ item, label, saveLabel, placeholder, debounceMs, showShortcutHint, onSaved, onSaveError, render, children, asChild, className, ...formProps }: KeepNoteEditorProps<TMeta>): react.JSX.Element;
702
613
 
703
614
  type KeepTagEditorState = {
704
615
  tags: string[];
@@ -716,27 +627,79 @@ type KeepTagEditorProps<TMeta = Record<string, unknown>> = Omit<FormHTMLAttribut
716
627
  /** Edits one item's normalized tag set; Enter adds and Backspace removes the last tag. */
717
628
  declare function KeepTagEditor<TMeta = Record<string, unknown>>({ item, availableTags, onSaved, onSaveError, render, ...props }: KeepTagEditorProps<TMeta>): react.JSX.Element;
718
629
 
719
- type KeepTagFilterState = {
720
- tags: string[];
721
- tagCounts: Record<string, number>;
722
- value?: string;
723
- select: (tag?: string) => void;
630
+ type KeepUiLabelKey = "save" | "saved" | "remove" | "loading" | "saving" | "syncing" | "error" | "allTags" | "tags" | "filterTags" | "activeFilters" | "clearFilters" | "clearAllFilters" | "removeFilter" | "noFilteredItems" | "noFilteredItemsDescription" | "emptyStorageDescription" | "note" | "saveNote" | "noItems" | "loadingItems" | "errorItems" | "search" | "sort" | "newest" | "oldest" | "savedNewest" | "savedOldest" | "updatedNewest" | "updatedOldest" | "previousPage" | "nextPage" | "pagination" | "page" | "selectItems" | "selectedCount" | "deleteSelected" | "tagsToApply" | "applyTags" | "savedMessage" | "removedMessage" | "restoredMessage" | "syncFailedMessage" | "stalePrunedMessage" | "undo" | "undoAvailable" | "selectionScope" | "currentPage" | "searchResults" | "allItems" | "localVersion" | "remoteVersion" | "updatedAt" | "statusAvailable" | "noteSavedMessage" | "exportData" | "importData" | "importMode" | "merge" | "replace" | "importedCount" | "failedCount" | "storageQuotaError" | "statusExpired" | "statusRemoved" | "statusDeleted" | "statusPrivate" | "statusUnknown" | "retry" | "removeFromList" | "pruneStale" | "retrySync" | "resolveSync" | "keepLocal" | "useServer" | "manualMerge" | "close" | "backupRecovery" | "backupRecoveryDescription" | "syncPending" | "syncSynced" | "syncConflict";
631
+ type KeepUiLabels = Partial<Record<KeepUiLabelKey, string>>;
632
+ type KeepUiLocaleLabels = Record<KeepUiLabelKey, string>;
633
+
634
+ declare const KEEP_BUILT_IN_LOCALES: readonly ["en", "ja", "ko", "zh-Hans", "zh-Hant", "th", "fr", "es", "pt-BR", "it", "de", "ru", "fil", "vi", "id", "ms"];
635
+ type KeepUiLocale = (typeof KEEP_BUILT_IN_LOCALES)[number];
636
+ declare function getKeepLocaleLabels(locale?: string): KeepUiLocaleLabels;
637
+
638
+ type KeepUiLabelContext = {
639
+ locale?: string;
640
+ labels: Readonly<Record<KeepUiLabelKey, string>>;
641
+ customLabels?: KeepUiLabels;
642
+ labelResolver?: (key: KeepUiLabelKey, context: {
643
+ locale?: string;
644
+ }) => string | undefined;
645
+ emitFeedback: <TMeta>(event: KeepUiFeedbackEvent<TMeta>) => void;
724
646
  };
725
- type KeepTagFilterProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, "children" | "onChange"> & {
726
- query?: KeepListQuery<TMeta>;
727
- value?: string;
728
- defaultValue?: string;
729
- onChange?: (tag?: string) => void;
730
- onValueChange?: (tag?: string) => void;
731
- allLabel?: ReactNode;
732
- ariaLabel?: string;
733
- renderTag?: (tag: string, count: number, selected: boolean) => ReactNode;
734
- render?: RenderProp<KeepTagFilterState>;
735
- children?: ReactNode | RenderProp<KeepTagFilterState>;
736
- asChild?: boolean;
647
+ type KeepUiFeedbackBase<TType extends string> = {
648
+ type: TType;
649
+ message: string;
737
650
  };
738
- /** An ARIA button group for tag filtering; consumers can connect value to a collection query. */
739
- declare function KeepTagFilter<TMeta = Record<string, unknown>>({ query, value: controlledValue, defaultValue, onChange, onValueChange, allLabel, ariaLabel, renderTag, render, children, asChild, className, ...rootProps }: KeepTagFilterProps<TMeta>): react.ReactElement<unknown, string | react.JSXElementConstructor<any>>;
651
+ type KeepUiFeedbackEvent<TMeta = Record<string, unknown>> = (KeepUiFeedbackBase<"item-saved"> & {
652
+ item: KeepItem<TMeta>;
653
+ }) | (KeepUiFeedbackBase<"item-removed"> & {
654
+ item: KeepItem<TMeta>;
655
+ undo: () => void | Promise<void>;
656
+ undoLabel: string;
657
+ }) | (KeepUiFeedbackBase<"item-restored"> & {
658
+ item?: KeepItem<TMeta>;
659
+ items: KeepItem<TMeta>[];
660
+ }) | KeepUiFeedbackBase<"sync-completed"> | (KeepUiFeedbackBase<"sync-failed"> & {
661
+ error: unknown;
662
+ }) | (KeepUiFeedbackBase<"stale-pruned"> & {
663
+ item?: KeepItem<TMeta>;
664
+ items: KeepItem<TMeta>[];
665
+ undo: () => void | Promise<void>;
666
+ undoLabel: string;
667
+ });
668
+ type KeepUiProviderProps<TMeta = Record<string, unknown>> = {
669
+ labels?: KeepUiLabels;
670
+ locale?: string;
671
+ labelResolver?: KeepUiLabelContext["labelResolver"];
672
+ onFeedback?: (event: KeepUiFeedbackEvent<TMeta>) => void;
673
+ children?: ReactNode;
674
+ };
675
+ /** Provides one complete locale-aware label source to every UI primitive. */
676
+ declare function KeepUiProvider<TMeta = Record<string, unknown>>({ labels, locale, labelResolver, onFeedback, children, }: KeepUiProviderProps<TMeta>): react.JSX.Element;
677
+ declare function useKeepUiLabels(): KeepUiLabelContext;
678
+
679
+ type KeepToastFeedbackOptions = {
680
+ action?: {
681
+ label: string;
682
+ onClick: () => void;
683
+ };
684
+ };
685
+ type KeepToastHandler = (message: string, options?: KeepToastFeedbackOptions) => unknown;
686
+ /** Adapts KeepKit feedback to Sonner-like toast functions without adding a toast dependency. */
687
+ declare function useKeepToastFeedback<TMeta = Record<string, unknown>>(showToast: KeepToastHandler): (event: KeepUiFeedbackEvent<TMeta>) => void;
688
+
689
+ type KeepItemStatusBadgeProps = Omit<HTMLAttributes<HTMLSpanElement>, "children"> & {
690
+ status?: KeepItemStatus | "restricted";
691
+ label?: ReactNode;
692
+ };
693
+ type KeepDisplayStatus = "available" | "expired" | "removed" | "restricted";
694
+ /** Displays the normalized availability state of a saved item. */
695
+ declare function KeepItemStatusBadge({ status, label, className, ...props }: KeepItemStatusBadgeProps): react.JSX.Element;
696
+
697
+ type KeepShortcutHintProps = Omit<HTMLAttributes<HTMLSpanElement>, "children"> & {
698
+ shortcut: string | readonly string[];
699
+ separator?: ReactNode;
700
+ };
701
+ /** Displays a keyboard shortcut using semantic kbd elements. */
702
+ declare function KeepShortcutHint({ shortcut, separator, ...props }: KeepShortcutHintProps): react.JSX.Element;
740
703
 
741
704
  type KeepTourShortcutsOptions = {
742
705
  onNext: () => void | Promise<void>;
@@ -766,19 +729,59 @@ type KeepTourBarProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTM
766
729
  nextLabel?: string;
767
730
  backLabel?: string;
768
731
  keyboardShortcuts?: boolean;
732
+ showShortcutHint?: boolean;
769
733
  shortcutOptions?: Omit<KeepTourShortcutsOptions, "onNext" | "onPrev">;
770
734
  progress?: ReactNode;
735
+ getItemTitle?: (item: KeepItem<TMeta>) => ReactNode;
736
+ children?: ReactNode;
737
+ asChild?: boolean;
771
738
  };
772
739
  /** Headless previous/current/next navigation with optional URL links and keyboard shortcuts. */
773
- declare function KeepTourBar<TMeta = Record<string, unknown>>({ navigation: providedNavigation, currentId, initialIndex, showProgress, prevHref, nextHref, backHref, onPrev, onNext, onBack, prevLabel, nextLabel, backLabel, keyboardShortcuts, shortcutOptions, progress, ...props }: KeepTourBarProps<TMeta>): react.JSX.Element;
740
+ declare function KeepTourBar<TMeta = Record<string, unknown>>({ navigation: providedNavigation, currentId, initialIndex, showProgress, prevHref, nextHref, backHref, onPrev, onNext, onBack, prevLabel, nextLabel, backLabel, keyboardShortcuts, showShortcutHint, shortcutOptions, progress, getItemTitle, children, asChild, ...props }: KeepTourBarProps<TMeta>): react.ReactElement<unknown, string | react.JSXElementConstructor<any>>;
774
741
  declare const KeepNavigator: typeof KeepTourBar;
775
742
 
776
- type KeepUndoProps = Omit<HTMLAttributes<HTMLElement>, "children"> & {
777
- children?: ReactNode;
778
- label?: ReactNode;
743
+ type KeepActiveFiltersSummaryProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, "children"> & {
744
+ query?: KeepListQuery<TMeta>;
745
+ search?: string;
746
+ tags?: readonly string[];
747
+ onSearchChange?: (value: string) => void;
748
+ onTagChange?: (tag: string) => void;
749
+ onClear?: () => void;
750
+ children?: ReactNode | RenderProp<KeepActiveFiltersSummaryState>;
751
+ asChild?: boolean;
779
752
  };
780
- /** Presents the short-lived undo action created by removeWithUndo/removeBatchWithUndo. */
781
- declare function KeepUndo({ children, label, ...props }: KeepUndoProps): react.JSX.Element | null;
753
+ type KeepActiveFiltersSummaryState = {
754
+ search: string;
755
+ tags: string[];
756
+ hasFilters: boolean;
757
+ clear: () => void;
758
+ removeSearch: () => void;
759
+ removeTag: (tag: string) => void;
760
+ };
761
+ /** Lists active search and tag filters with one-tap recovery actions. */
762
+ declare function KeepActiveFiltersSummary<TMeta = Record<string, unknown>>({ query, search: providedSearch, tags: providedTags, onSearchChange, onTagChange, onClear, children, asChild, className, ...rootProps }: KeepActiveFiltersSummaryProps<TMeta>): ReactElement<unknown, string | react.JSXElementConstructor<any>> | null;
763
+
764
+ type KeepTagFilterState = {
765
+ tags: string[];
766
+ tagCounts: Record<string, number>;
767
+ value?: string;
768
+ select: (tag?: string) => void;
769
+ };
770
+ type KeepTagFilterProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, "children" | "onChange"> & {
771
+ query?: KeepListQuery<TMeta>;
772
+ value?: string;
773
+ defaultValue?: string;
774
+ onChange?: (tag?: string) => void;
775
+ onValueChange?: (tag?: string) => void;
776
+ allLabel?: ReactNode;
777
+ ariaLabel?: string;
778
+ renderTag?: (tag: string, count: number, selected: boolean) => ReactNode;
779
+ render?: RenderProp<KeepTagFilterState>;
780
+ children?: ReactNode | RenderProp<KeepTagFilterState>;
781
+ asChild?: boolean;
782
+ };
783
+ /** An ARIA button group for tag filtering; consumers can connect value to a collection query. */
784
+ declare function KeepTagFilter<TMeta = Record<string, unknown>>({ query, value: controlledValue, defaultValue, onChange, onValueChange, allLabel, ariaLabel, renderTag, render, children, asChild, className, ...rootProps }: KeepTagFilterProps<TMeta>): react.ReactElement<unknown, string | react.JSXElementConstructor<any>>;
782
785
 
783
786
  type KeepSearchInputProps = Omit<InputHTMLAttributes<HTMLInputElement>, "value" | "defaultValue" | "onChange"> & {
784
787
  value?: string;
@@ -813,15 +816,38 @@ type KeepPaginationProps = Omit<React.HTMLAttributes<HTMLElement>, "children"> &
813
816
  /** Accessible pagination with previous/next controls and numbered page buttons. */
814
817
  declare function KeepPagination({ totalCount, pageSize, page, maxPageButtons, onPageChange, render, ...props }: KeepPaginationProps): react.JSX.Element;
815
818
 
819
+ type KeepStaleNoticeProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, "children"> & {
820
+ item: KeepItem<TMeta>;
821
+ onRetry?: (item: KeepItem<TMeta>) => void | Promise<void>;
822
+ onRemoved?: (item: KeepItem<TMeta>) => void;
823
+ retryLabel?: ReactNode;
824
+ removeLabel?: ReactNode;
825
+ children?: ReactNode;
826
+ };
827
+ /** Provides retry and remove actions for an item whose source is no longer available. */
828
+ declare function KeepStaleNotice<TMeta = Record<string, unknown>>({ item, onRetry, onRemoved, retryLabel, removeLabel, children, className, ...props }: KeepStaleNoticeProps<TMeta>): react.JSX.Element;
829
+ type KeepPruneStaleButtonProps = Omit<ButtonHTMLAttributes<HTMLButtonElement>, "children"> & {
830
+ statuses?: KeepItemStatus[];
831
+ label?: ReactNode;
832
+ onPruned?: (ids: string[]) => void;
833
+ children?: ReactNode;
834
+ };
835
+ /** Removes all unavailable items through the provider's undo-capable batch action. */
836
+ declare function KeepPruneStaleButton<TMeta = Record<string, unknown>>({ statuses, label, onPruned, children, disabled, ...props }: KeepPruneStaleButtonProps): react.JSX.Element;
837
+
838
+ type KeepEmptyStateVariant = "empty-storage" | "empty-filtered";
816
839
  type KeepEmptyStateProps = Omit<HTMLAttributes<HTMLElement>, "children" | "title"> & {
817
840
  title?: ReactNode;
818
841
  description?: ReactNode;
819
842
  action?: ReactNode;
820
843
  children?: ReactNode;
844
+ variant?: KeepEmptyStateVariant;
845
+ onClearFilters?: () => void;
821
846
  asChild?: boolean;
822
847
  };
823
- /** A style-free, reusable empty collection state. */
824
- declare function KeepEmptyState({ title, description, action, children, asChild, className, ...rootProps }: KeepEmptyStateProps): react.ReactElement<unknown, string | react.JSXElementConstructor<any>>;
848
+ /** An accessible empty state that distinguishes an empty store from an empty filter result. */
849
+ declare function KeepEmptyState({ title, description, action, children, variant, onClearFilters, asChild, className, ...rootProps }: KeepEmptyStateProps): react.ReactElement<unknown, string | react.JSXElementConstructor<any>>;
850
+
825
851
  type KeepStatusValue = "idle" | "empty" | "loading" | "saving" | "syncing" | "error";
826
852
  type KeepStatusLabels = Partial<Record<KeepStatusValue, ReactNode>>;
827
853
  type KeepStatusState<TMeta = Record<string, unknown>> = {
@@ -847,6 +873,27 @@ declare function KeepAnnouncements<TMeta = Record<string, unknown>>({ messages,
847
873
  /** Singular alias for applications that mount one announcer explicitly. */
848
874
  declare const KeepAnnouncer: typeof KeepAnnouncements;
849
875
 
876
+ type KeepSyncRecoveryDialogProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, "children" | "title"> & {
877
+ open?: boolean;
878
+ onOpenChange?: (open: boolean) => void;
879
+ conflicts?: KeepSyncConflict<TMeta>[];
880
+ onManualMerge?: (conflict: KeepSyncConflict<TMeta>) => KeepItem<TMeta> | Promise<KeepItem<TMeta>>;
881
+ backup?: ReactNode;
882
+ showBackupControls?: boolean;
883
+ title?: ReactNode;
884
+ children?: ReactNode;
885
+ };
886
+ /** Resolves queued sync conflicts and guides users to restore a backup after data corruption. */
887
+ declare function KeepSyncRecoveryDialog<TMeta = Record<string, unknown>>({ open, onOpenChange, conflicts, onManualMerge, backup, showBackupControls, title, children, className, ...props }: KeepSyncRecoveryDialogProps<TMeta>): react.JSX.Element | null;
888
+
889
+ type KeepSyncStatusBannerProps = Omit<HTMLAttributes<HTMLElement>, "children"> & {
890
+ onRetry?: () => void | Promise<void>;
891
+ onResolveConflicts?: () => void;
892
+ children?: ReactNode;
893
+ };
894
+ /** Announces synchronization failures and exposes retry or conflict-recovery entry points. */
895
+ declare function KeepSyncStatusBanner({ onRetry, onResolveConflicts, children, className, ...props }: KeepSyncStatusBannerProps): react.JSX.Element | null;
896
+
850
897
  declare const keepThemeNames: readonly ["default", "ocean", "forest", "sunset", "lavender", "compact", "minimal", "rounded", "high-contrast", "dark"];
851
898
  type KeepThemeName = (typeof keepThemeNames)[number];
852
899
  type KeepThemeMode = "light" | "dark" | "system";
@@ -913,4 +960,4 @@ type KeepKit<TMeta = Record<string, unknown>> = {
913
960
  /** Create one typed application API for the core and standard UI layer. */
914
961
  declare function createKeepKit<TMeta = Record<string, unknown>>(options?: CreateKeepKitOptions<TMeta>): KeepKit<TMeta>;
915
962
 
916
- export { type CreateKeepKitOptions, KeepAnnouncements, type KeepAnnouncementsProps, KeepAnnouncer, KeepBackup, type KeepBackupProps, KeepBulkActions, type KeepBulkActionsProps, type KeepBulkActionsState, KeepButton, type KeepButtonIcon, type KeepButtonIconProps, type KeepButtonIcons, type KeepButtonLabels, type KeepButtonProps, KeepCollection, type KeepCollectionFeature, type KeepCollectionProps, type KeepDisplayStatus, KeepEmptyState, type KeepEmptyStateProps, KeepHighlight, type KeepHighlightProps, type KeepImageProps, KeepItemCard, type KeepItemCardActionsProps, type KeepItemCardContentProps, type KeepItemCardLinkProps, type KeepItemCardMediaProps, type KeepItemCardProps, KeepItemCardSkeleton, type KeepItemCardSkeletonProps, type KeepItemCardState, type KeepItemCardTagsProps, type KeepItemCardTitleProps, KeepItemCheckbox, type KeepItemCheckboxProps, KeepItemStatusBadge, type KeepItemStatusBadgeProps, type KeepKit, KeepKitProvider, type KeepKitProviderProps, KeepLayout, type KeepLayoutPreset, type KeepLayoutProps, KeepList, type KeepListProps, type KeepListState, KeepNavigator, KeepNoteEditor, type KeepNoteEditorProps, type KeepNoteEditorState, type KeepPagesRouterLike, KeepPagination, type KeepPaginationProps, type KeepPaginationState, KeepPruneStaleButton, type KeepPruneStaleButtonProps, type KeepReorderableItemState, KeepReorderableList, type KeepReorderableListProps, KeepSearchInput, type KeepSearchInputProps, type KeepSelectionScope, KeepSortSelect, type KeepSortSelectProps, type KeepSortValue, KeepStaleNotice, type KeepStaleNoticeProps, KeepStatus, type KeepStatusLabels, type KeepStatusProps, type KeepStatusState, type KeepStatusValue, KeepSyncRecoveryDialog, type KeepSyncRecoveryDialogProps, KeepSyncStatusBanner, type KeepSyncStatusBannerProps, KeepTagEditor, type KeepTagEditorProps, type KeepTagEditorState, KeepTagFilter, type KeepTagFilterProps, type KeepTagFilterState, type KeepThemeDensity, type KeepThemeMode, type KeepThemeName, KeepThemeProvider, type KeepThemeProviderProps, type KeepThemeRadius, type KeepThemeVariables, type KeepToastFeedbackOptions, type KeepToastHandler, KeepTourBar, type KeepTourBarProps, type KeepTourShortcutsOptions, type KeepUiFeedbackEvent, type KeepUiLabelContext, type KeepUiLabelKey, type KeepUiLabels, type KeepUiLocale, type KeepUiLocaleLabels, KeepUiProvider, type KeepUiProviderProps, KeepUndo, type KeepUndoProps, type KeepUrlAdapter, type RenderProp, createKeepKit, createNextPagesRouterAdapter, getKeepLocaleLabels, highlightText, isAllSelected, keepThemeNames, toggleSelectAll, useKeepToastFeedback, useKeepTourShortcuts, useKeepUiLabels, useKeepUrlSync };
963
+ export { type CreateKeepKitOptions, KeepActiveFiltersSummary, type KeepActiveFiltersSummaryProps, type KeepActiveFiltersSummaryState, KeepAnnouncements, type KeepAnnouncementsProps, KeepAnnouncer, KeepBackup, type KeepBackupProps, KeepBulkActions, type KeepBulkActionsProps, type KeepBulkActionsState, KeepButton, type KeepButtonIcon, type KeepButtonIconProps, type KeepButtonIcons, type KeepButtonLabels, type KeepButtonProps, KeepCollection, type KeepCollectionFeature, type KeepCollectionProps, type KeepDisplayStatus, KeepEmptyState, type KeepEmptyStateProps, type KeepEmptyStateVariant, KeepHighlight, type KeepHighlightProps, type KeepImageProps, KeepItemCard, type KeepItemCardActionsProps, type KeepItemCardContentProps, type KeepItemCardLinkProps, type KeepItemCardMediaProps, type KeepItemCardProps, KeepItemCardSkeleton, type KeepItemCardSkeletonProps, type KeepItemCardState, type KeepItemCardTagsProps, type KeepItemCardTitleProps, KeepItemCheckbox, type KeepItemCheckboxProps, KeepItemStatusBadge, type KeepItemStatusBadgeProps, type KeepKit, KeepKitProvider, type KeepKitProviderProps, KeepLayout, type KeepLayoutPreset, type KeepLayoutProps, KeepList, type KeepListProps, type KeepListState, KeepNavigator, KeepNoteEditor, type KeepNoteEditorProps, type KeepNoteEditorState, type KeepPagesRouterLike, KeepPagination, type KeepPaginationProps, type KeepPaginationState, KeepPruneStaleButton, type KeepPruneStaleButtonProps, type KeepReorderableItemState, KeepReorderableList, type KeepReorderableListProps, KeepSearchInput, type KeepSearchInputProps, type KeepSelectionScope, KeepShortcutHint, type KeepShortcutHintProps, KeepSortSelect, type KeepSortSelectProps, type KeepSortValue, KeepStaleNotice, type KeepStaleNoticeProps, KeepStatus, type KeepStatusLabels, type KeepStatusProps, type KeepStatusState, type KeepStatusValue, KeepSyncRecoveryDialog, type KeepSyncRecoveryDialogProps, KeepSyncStatusBanner, type KeepSyncStatusBannerProps, KeepTagEditor, type KeepTagEditorProps, type KeepTagEditorState, KeepTagFilter, type KeepTagFilterProps, type KeepTagFilterState, type KeepThemeDensity, type KeepThemeMode, type KeepThemeName, KeepThemeProvider, type KeepThemeProviderProps, type KeepThemeRadius, type KeepThemeVariables, type KeepToastFeedbackOptions, type KeepToastHandler, KeepTourBar, type KeepTourBarProps, type KeepTourShortcutsOptions, type KeepUiFeedbackEvent, type KeepUiLabelContext, type KeepUiLabelKey, type KeepUiLabels, type KeepUiLocale, type KeepUiLocaleLabels, KeepUiProvider, type KeepUiProviderProps, KeepUndo, type KeepUndoProps, type KeepUrlAdapter, type RenderProp, chainedFunction, createKeepKit, createNextPagesRouterAdapter, createSlot, getKeepLocaleLabels, highlightText, isAllSelected, keepThemeNames, mergeProps, toggleSelectAll, useKeepToastFeedback, useKeepTourShortcuts, useKeepUiLabels, useKeepUrlSync };