@keepkit/ui 0.3.0 → 0.5.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/README.md CHANGED
@@ -4,57 +4,85 @@
4
4
 
5
5
  ## 日本語
6
6
 
7
- `@keepkit/core` の保存状態を、アプリ固有のCSSやUIライブラリに接続するための、低依存・スタイルレスなReact UIパーツです。Tailwind CSS、shadcn/ui、その他のデザインシステムには依存しません。
7
+ Reactアプリケーション向けの標準利用パッケージです。`@keepkit/core`を内包し、Provider、保存ボタン、検索・ソート・ページング付きの一覧を少ないコードで構成できます。
8
8
 
9
9
  ```bash
10
- pnpm add @keepkit/core @keepkit/ui
10
+ pnpm add @keepkit/ui
11
11
  ```
12
12
 
13
13
  ```tsx
14
- import { KeepList, KeepProvider, KeepTagFilter } from "@keepkit/ui";
14
+ import { createBrowserStorageAdapter, createKeepKit } from "@keepkit/ui";
15
15
 
16
- function SavedItems() {
16
+ type ArticleMeta = { title: string; url: string };
17
+ const keep = createKeepKit<ArticleMeta>({
18
+ storage: createBrowserStorageAdapter({ key: "articles" }),
19
+ locale: "ja-JP",
20
+ labels: { save: "保存", remove: "削除" },
21
+ });
22
+
23
+ function SavedArticles() {
17
24
  return (
18
- <KeepProvider>
19
- <KeepTagFilter value={selectedTag} onValueChange={setSelectedTag} />
20
- <KeepList options={{ tag: selectedTag }} />
21
- </KeepProvider>
25
+ <keep.Provider>
26
+ <keep.Collection
27
+ query={{ targetType: "article" }}
28
+ renderItem={(item) => <keep.Button item={{ id: item.id, targetType: item.targetType, meta: item.meta }} />}
29
+ />
30
+ </keep.Provider>
22
31
  );
23
32
  }
24
33
  ```
25
34
 
26
- 提供するコンポーネントは次のとおりです。
35
+ `keep.Collection`は検索、ソート、ページング、loading / empty / error、ARIA live通知を標準で提供します。`features={{ tagFilter: true, bulkActions: true }}`でタグフィルターと一括操作も有効にできます。個別の`KeepList`、`KeepSearchInput`、`KeepSortSelect`、`KeepPagination`などは高度なレイアウト用に利用できます。
36
+
37
+ 一覧のqueryは次の形式に統一されています。
38
+
39
+ ```tsx
40
+ const query = {
41
+ targetType: "article",
42
+ tags: ["read"],
43
+ search: { query: "react", mode: "and" as const },
44
+ sort: { by: "updatedAt" as const, direction: "desc" as const },
45
+ pagination: { page: 1, pageSize: 20 },
46
+ };
47
+ ```
48
+
49
+ 保存操作にはID付きの最小入力を渡します。保存・更新時刻はKeepKitが管理します。
27
50
 
28
- - `KeepButton`: 保存済み状態、`aria-pressed`、ローディング・エラー状態、`asChild`、render props。`labels` または既存の `savedAriaLabel` / `unsavedAriaLabel` で翻訳できます。
29
- - `KeepList`: 保存一覧、読み込み中・空・エラー状態、標準カード、削除操作。`renderItem` で行単位を置き換えられます。
30
- - `KeepItemCard`: タイトル、画像、保存ボタン、削除ボタン。`getImageUrl` とrender propsで表示を差し替えられます。
31
- - `KeepTagFilter`: タグと件数を表示するキーボード操作可能なフィルター。`value` / `onValueChange` のcontrolled APIに対応します。
32
- - `KeepNoteEditor`: ノートの編集・保存フォーム。`render` で完全なカスタムUIにできます。
33
- - `KeepEmptyState` / `KeepStatus`: 空、読み込み中、保存中、同期中、エラー状態の表示。
51
+ ```tsx
52
+ const article = { id: "article-123", targetType: "article", meta: { title, url } };
53
+ const item = keep.useItem(article);
54
+ ```
34
55
 
35
- すべてのルート要素で `className` を利用でき、対応コンポーネントでは `asChild` で既存要素をルートとして利用できます。コンポーネントの標準HTMLは意味的な要素、ネイティブボタン、フォーム、`aria-live` を利用します。
56
+ 高度なフレームワーク中立APIは`@keepkit/core/core`、低レベルのReact APIは`@keepkit/core/react`、ストレージ実装は`@keepkit/core/storage`から利用できます。
36
57
 
37
58
  ## English
38
59
 
39
- `@keepkit/ui` provides low-dependency, style-free React UI primitives that connect `@keepkit/core` state to an app's own CSS or design system. It has no direct dependency on Tailwind CSS, shadcn/ui, or another component library.
60
+ The standard React package for KeepKit. It includes `@keepkit/core` and provides a single typed provider, save button, and searchable/sortable/paginated collection workflow.
40
61
 
41
62
  ```bash
42
- pnpm add @keepkit/core @keepkit/ui
63
+ pnpm add @keepkit/ui
43
64
  ```
44
65
 
45
66
  ```tsx
46
- import { KeepList, KeepProvider, KeepTagFilter } from "@keepkit/ui";
67
+ import { createBrowserStorageAdapter, createKeepKit } from "@keepkit/ui";
47
68
 
48
- function SavedItems() {
69
+ type ArticleMeta = { title: string; url: string };
70
+ const keep = createKeepKit<ArticleMeta>({
71
+ storage: createBrowserStorageAdapter({ key: "articles" }),
72
+ labels: { save: "Save", remove: "Remove" },
73
+ });
74
+
75
+ function SavedArticles() {
49
76
  return (
50
- <KeepProvider>
51
- <KeepTagFilter value={selectedTag} onValueChange={setSelectedTag} />
52
- <KeepList options={{ tag: selectedTag }} />
53
- </KeepProvider>
77
+ <keep.Provider>
78
+ <keep.Collection query={{ targetType: "article" }} />
79
+ </keep.Provider>
54
80
  );
55
81
  }
56
82
  ```
57
83
 
58
- Components include `KeepButton`, `KeepList`, `KeepItemCard`, `KeepTagFilter`, `KeepNoteEditor`, `KeepEmptyState`, and `KeepStatus`. They support `className`, render props, localized labels, and `asChild` where a root element can be replaced. The defaults use semantic HTML, native keyboard behavior, `aria-pressed`, and live-region status announcements. `KeepList` includes loading, empty, error, and removal states, while `KeepTagFilter` exposes controlled `value` / `onValueChange` state.
84
+ `keep.Collection` includes search, sorting, pagination, loading/empty/error states, and polite live announcements. Enable `features={{ tagFilter: true, bulkActions: true }}` for tag filtering and bulk operations. Use the individual `KeepList`, `KeepSearchInput`, `KeepSortSelect`, and `KeepPagination` primitives when you need a custom layout.
85
+
86
+ Collection queries use one canonical shape: `targetType`, `tags`, `search`, `sort`, `pagination`, `filter`, and `savedBetween`. Saved item inputs contain only `id`, `meta`, `targetType`, `note`, and `tags`; KeepKit owns persistence timestamps.
59
87
 
60
- The package re-exports `KeepProvider` and the core React hooks for convenient composition. The state and storage implementation remains in `@keepkit/core`; this package only adds the UI layer.
88
+ Framework-neutral APIs remain available from `@keepkit/core/core`, low-level React bindings from `@keepkit/core/react`, and storage adapters from `@keepkit/core/storage`.
package/dist/index.d.ts CHANGED
@@ -1,10 +1,50 @@
1
1
  import * as react from 'react';
2
- import { ReactNode, HTMLAttributes, ReactElement, FormHTMLAttributes } from 'react';
3
- import { KeepItem, KeepListOptions } from '@keepkit/core/core';
4
- export { KeepItem, KeepItemInput, KeepListOptions, KeepSyncStatus } from '@keepkit/core/core';
5
- import { KeepButtonProps as KeepButtonProps$1, UseKeepListResult } from '@keepkit/core/react';
6
- export { KeepContextValue, KeepProvider, KeepProviderProps, useKeepContext, useKeepItem, useKeepList } from '@keepkit/core/react';
2
+ import { ReactNode, ImgHTMLAttributes, HTMLAttributes, ComponentType, ReactElement, FormHTMLAttributes, InputHTMLAttributes, SelectHTMLAttributes } from 'react';
3
+ import { KeepItem, KeepListQuery, KeepItemInput } from '@keepkit/core/core';
4
+ export { KeepItem, KeepItemInput, KeepListQuery, KeepSyncStatus } from '@keepkit/core/core';
5
+ import { CreateKeepKitOptions as CreateKeepKitOptions$1, KeepButtonProps as KeepButtonProps$1, UseKeepListResult, KeepProviderProps, useKeepContext, useKeepItem, KeepShortcutOptions } from '@keepkit/core/react';
6
+ export { KeepContextValue, KeepProvider, KeepProviderProps, KeepShortcutOptions, useKeepContext, useKeepItem, useKeepList, useKeepShortcut } from '@keepkit/core/react';
7
+ export { FallbackStorageAdapter, IndexedDBAdapter, IndexedDBSyncQueueAdapter, LocalStorageAdapter, LocalStorageSyncQueueAdapter, SyncStorageAdapter, createBrowserStorageAdapter, createStorageAdapter } from '@keepkit/core/storage';
7
8
 
9
+ type KeepUiLabelKey = "save" | "saved" | "remove" | "loading" | "saving" | "syncing" | "error" | "allTags" | "filterTags" | "note" | "saveNote" | "noItems" | "loadingItems" | "errorItems" | "search" | "sort" | "newest" | "oldest" | "previousPage" | "nextPage" | "pagination" | "page" | "selectItems" | "selectedCount" | "deleteSelected" | "tagsToApply" | "applyTags" | "savedMessage" | "removedMessage" | "noteSavedMessage";
10
+ type KeepUiLabels = Partial<Record<KeepUiLabelKey, string>>;
11
+ type KeepUiLabelContext = {
12
+ locale?: string;
13
+ labels: Readonly<Record<KeepUiLabelKey, string>>;
14
+ labelResolver?: (key: KeepUiLabelKey, context: {
15
+ locale?: string;
16
+ }) => string | undefined;
17
+ };
18
+ type KeepUiProviderProps = {
19
+ labels?: KeepUiLabels;
20
+ locale?: string;
21
+ labelResolver?: KeepUiLabelContext["labelResolver"];
22
+ children?: ReactNode;
23
+ };
24
+ /** Provides one locale-aware label source to every UI primitive. */
25
+ declare function KeepUiProvider({ labels, locale, labelResolver, children }: KeepUiProviderProps): react.JSX.Element;
26
+ type KeepKitProviderProps<TMeta = Record<string, unknown>> = Omit<KeepProviderProps<TMeta>, "children"> & Omit<KeepUiProviderProps, "children"> & {
27
+ children?: ReactNode;
28
+ };
29
+ /** Combines the core store and UI labels into the default application provider. */
30
+ declare function KeepKitProvider<TMeta = Record<string, unknown>>({ labels, locale, labelResolver, children, ...providerProps }: KeepKitProviderProps<TMeta>): react.JSX.Element;
31
+ declare function useKeepUiLabels(): KeepUiLabelContext;
32
+
33
+ type CreateKeepKitOptions<TMeta = Record<string, unknown>> = CreateKeepKitOptions$1<TMeta> & Omit<KeepUiProviderProps, "children"> & {
34
+ getTitle?: (item: KeepItem<TMeta>) => ReactNode;
35
+ getImageProps?: (item: KeepItem<TMeta>, title: ReactNode) => KeepImageProps | undefined;
36
+ };
37
+ type KeepKit<TMeta = Record<string, unknown>> = {
38
+ Provider: ComponentType<KeepKitProviderProps<TMeta>>;
39
+ Button: ComponentType<KeepButtonProps<TMeta>>;
40
+ Collection: ComponentType<KeepCollectionProps<TMeta>>;
41
+ useContext: () => ReturnType<typeof useKeepContext<TMeta>>;
42
+ useItem: (item?: KeepItemInput<TMeta>) => ReturnType<typeof useKeepItem<TMeta>>;
43
+ useList: (query?: KeepListQuery<TMeta>) => UseKeepListResult<TMeta>;
44
+ useShortcut: (options: KeepShortcutOptions<TMeta>) => void;
45
+ };
46
+ /** Create one typed application API for the core and the standard UI layer. */
47
+ declare function createKeepKit<TMeta = Record<string, unknown>>(options?: CreateKeepKitOptions<TMeta>): KeepKit<TMeta>;
8
48
  type RenderProp<TState> = (state: TState) => ReactNode;
9
49
  type KeepButtonLabels = {
10
50
  saved?: ReactNode;
@@ -26,10 +66,17 @@ type KeepItemCardState<TMeta = Record<string, unknown>> = {
26
66
  error: unknown | null;
27
67
  remove: () => Promise<void>;
28
68
  };
69
+ type KeepImageProps = ImgHTMLAttributes<HTMLImageElement> & {
70
+ src: string;
71
+ alt: string;
72
+ };
29
73
  type KeepItemCardProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, "children" | "title"> & {
30
74
  item: KeepItem<TMeta>;
31
75
  title?: ReactNode | ((item: KeepItem<TMeta>) => ReactNode);
32
- getImageUrl?: (item: KeepItem<TMeta>) => string | undefined;
76
+ getTitle?: (item: KeepItem<TMeta>) => ReactNode;
77
+ getImageProps?: (item: KeepItem<TMeta>, title: ReactNode) => KeepImageProps | undefined;
78
+ imageComponent?: ComponentType<KeepImageProps>;
79
+ renderImage?: (props: KeepImageProps, item: KeepItem<TMeta>) => ReactNode;
33
80
  imageAlt?: string;
34
81
  render?: RenderProp<KeepItemCardState<TMeta>>;
35
82
  children?: ReactNode | RenderProp<KeepItemCardState<TMeta>>;
@@ -41,10 +88,10 @@ type KeepItemCardProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HT
41
88
  asChild?: boolean;
42
89
  };
43
90
  /** A low-dependency item presentation primitive. The default markup can be replaced with render props. */
44
- declare function KeepItemCard<TMeta = Record<string, unknown>>({ item, title, getImageUrl, imageAlt, render, children, removeLabel, onRemoveError, onRemoved, showSaveButton, saveButtonLabels, asChild, className, ...rootProps }: KeepItemCardProps<TMeta>): ReactElement<unknown, string | react.JSXElementConstructor<any>>;
91
+ declare function KeepItemCard<TMeta = Record<string, unknown>>({ item, title, getTitle, getImageProps, imageComponent: ImageComponent, renderImage, imageAlt, render, children, removeLabel, onRemoveError, onRemoved, showSaveButton, saveButtonLabels, asChild, className, ...rootProps }: KeepItemCardProps<TMeta>): ReactElement<unknown, string | react.JSXElementConstructor<any>>;
45
92
  type KeepListState<TMeta = Record<string, unknown>> = UseKeepListResult<TMeta>;
46
93
  type KeepListProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, "children"> & {
47
- options?: KeepListOptions<TMeta>;
94
+ query?: KeepListQuery<TMeta>;
48
95
  children?: ReactNode | RenderProp<KeepListState<TMeta>>;
49
96
  renderItem?: (item: KeepItem<TMeta>, state: KeepListState<TMeta>) => ReactNode;
50
97
  loading?: ReactNode | RenderProp<KeepListState<TMeta>>;
@@ -54,7 +101,20 @@ type KeepListProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLEl
54
101
  asChild?: boolean;
55
102
  };
56
103
  /** A list primitive with built-in loading, empty, error, and removal states. */
57
- declare function KeepList<TMeta = Record<string, unknown>>({ options, children, renderItem, loading, empty, error: errorContent, itemCardProps, asChild, className, ...rootProps }: KeepListProps<TMeta>): ReactElement<unknown, string | react.JSXElementConstructor<any>>;
104
+ declare function KeepList<TMeta = Record<string, unknown>>({ query, children, renderItem, loading, empty, error: errorContent, itemCardProps, asChild, className, ...rootProps }: KeepListProps<TMeta>): ReactElement<unknown, string | react.JSXElementConstructor<any>>;
105
+ type KeepCollectionFeature = "search" | "sort" | "pagination" | "tagFilter" | "bulkActions";
106
+ type KeepCollectionProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, "children"> & {
107
+ query?: KeepListQuery<TMeta>;
108
+ pageSize?: number;
109
+ features?: Partial<Record<KeepCollectionFeature, boolean>>;
110
+ renderItem?: (item: KeepItem<TMeta>, state: KeepListState<TMeta>) => ReactNode;
111
+ itemCardProps?: Omit<KeepItemCardProps<TMeta>, "item" | "children" | "render">;
112
+ loading?: ReactNode | RenderProp<KeepListState<TMeta>>;
113
+ empty?: ReactNode | RenderProp<KeepListState<TMeta>>;
114
+ error?: ReactNode | RenderProp<KeepListState<TMeta>>;
115
+ };
116
+ /** A batteries-included collection with query controls and accessible status feedback. */
117
+ declare function KeepCollection<TMeta = Record<string, unknown>>({ query, pageSize, features, renderItem, itemCardProps, loading, empty, error, className, ...rootProps }: KeepCollectionProps<TMeta>): react.JSX.Element;
58
118
  type KeepTagFilterState = {
59
119
  tags: string[];
60
120
  tagCounts: Record<string, number>;
@@ -62,7 +122,7 @@ type KeepTagFilterState = {
62
122
  select: (tag?: string) => void;
63
123
  };
64
124
  type KeepTagFilterProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, "children" | "onChange"> & {
65
- listOptions?: KeepListOptions<TMeta>;
125
+ query?: KeepListQuery<TMeta>;
66
126
  value?: string;
67
127
  defaultValue?: string;
68
128
  onChange?: (tag?: string) => void;
@@ -74,8 +134,8 @@ type KeepTagFilterProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<H
74
134
  children?: ReactNode | RenderProp<KeepTagFilterState>;
75
135
  asChild?: boolean;
76
136
  };
77
- /** An ARIA button group for tag filtering; consumers can connect value to KeepList options. */
78
- declare function KeepTagFilter<TMeta = Record<string, unknown>>({ listOptions, value: controlledValue, defaultValue, onChange, onValueChange, allLabel, ariaLabel, renderTag, render, children, asChild, className, ...rootProps }: KeepTagFilterProps<TMeta>): ReactElement<unknown, string | react.JSXElementConstructor<any>>;
137
+ /** An ARIA button group for tag filtering; consumers can connect value to a collection query. */
138
+ declare function KeepTagFilter<TMeta = Record<string, unknown>>({ query, value: controlledValue, defaultValue, onChange, onValueChange, allLabel, ariaLabel, renderTag, render, children, asChild, className, ...rootProps }: KeepTagFilterProps<TMeta>): ReactElement<unknown, string | react.JSXElementConstructor<any>>;
79
139
  type KeepNoteEditorState<TMeta = Record<string, unknown>> = {
80
140
  item: KeepItem<TMeta>;
81
141
  note: string;
@@ -97,7 +157,59 @@ type KeepNoteEditorProps<TMeta = Record<string, unknown>> = Omit<FormHTMLAttribu
97
157
  asChild?: boolean;
98
158
  };
99
159
  /** A controlled-by-default note editor that persists through useKeepItem. */
100
- declare function KeepNoteEditor<TMeta = Record<string, unknown>>({ item, label, saveLabel, placeholder, onSaved, onSaveError, render, children, asChild, className, ...formProps }: KeepNoteEditorProps<TMeta>): ReactElement<unknown, string | react.JSXElementConstructor<any>>;
160
+ declare function KeepNoteEditor<TMeta = Record<string, unknown>>({ item, label, saveLabel, placeholder, onSaved, onSaveError, render, children, asChild, className, ...formProps }: KeepNoteEditorProps<TMeta>): react.JSX.Element;
161
+ type KeepSearchInputProps = Omit<InputHTMLAttributes<HTMLInputElement>, "value" | "defaultValue" | "onChange"> & {
162
+ value?: string;
163
+ defaultValue?: string;
164
+ onValueChange?: (value: string) => void;
165
+ };
166
+ /** A controlled/uncontrolled search field for wiring into KeepListQuery.search. */
167
+ declare function KeepSearchInput({ value: controlledValue, defaultValue, onValueChange, "aria-label": ariaLabel, placeholder, ...props }: KeepSearchInputProps): react.JSX.Element;
168
+ type KeepSortValue = "savedAt:desc" | "savedAt:asc" | "updatedAt:desc" | "updatedAt:asc";
169
+ type KeepSortSelectProps = Omit<SelectHTMLAttributes<HTMLSelectElement>, "value" | "defaultValue" | "onChange"> & {
170
+ value?: KeepSortValue;
171
+ defaultValue?: KeepSortValue;
172
+ onValueChange?: (value: KeepSortValue, sort: NonNullable<KeepListQuery["sort"]>) => void;
173
+ };
174
+ /** Emits a normalized sort descriptor that can be passed directly to useKeepList. */
175
+ declare function KeepSortSelect({ value: controlledValue, defaultValue, onValueChange, "aria-label": ariaLabel, children, ...props }: KeepSortSelectProps): react.JSX.Element;
176
+ type KeepPaginationProps = Omit<HTMLAttributes<HTMLElement>, "children"> & {
177
+ totalCount: number;
178
+ pageSize: number;
179
+ page?: number;
180
+ onPageChange?: (page: number, offset: number) => void;
181
+ render?: RenderProp<{
182
+ page: number;
183
+ pageCount: number;
184
+ goToPage: (page: number) => void;
185
+ }>;
186
+ };
187
+ /** A small accessible pagination control using one-based pages and zero-based offsets. */
188
+ declare function KeepPagination({ totalCount, pageSize, page, onPageChange, render, ...props }: KeepPaginationProps): react.JSX.Element;
189
+ type KeepTagEditorProps<TMeta = Record<string, unknown>> = Omit<FormHTMLAttributes<HTMLFormElement>, "children" | "onSubmit"> & {
190
+ item: KeepItem<TMeta>;
191
+ availableTags?: string[];
192
+ onSaved?: (tags?: string[]) => void;
193
+ onSaveError?: (error: unknown) => void;
194
+ render?: RenderProp<{
195
+ tags: string[];
196
+ setTags: (tags: string[]) => void;
197
+ save: () => Promise<void>;
198
+ isSaving: boolean;
199
+ }>;
200
+ };
201
+ /** Edits one item's normalized tag set and exposes a render-prop escape hatch. */
202
+ declare function KeepTagEditor<TMeta = Record<string, unknown>>({ item, availableTags, onSaved, onSaveError, render, ...props }: KeepTagEditorProps<TMeta>): react.JSX.Element;
203
+ type KeepBulkActionsProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, "children"> & {
204
+ query?: KeepListQuery<TMeta>;
205
+ selectedIds?: string[];
206
+ defaultSelectedIds?: string[];
207
+ onSelectedIdsChange?: (ids: string[]) => void;
208
+ renderItem?: (item: KeepItem<TMeta>, selected: boolean) => ReactNode;
209
+ onCompleted?: (action: "remove" | "tags", ids: string[]) => void;
210
+ };
211
+ /** Selects visible items and performs one storage operation for the whole selection. */
212
+ declare function KeepBulkActions<TMeta = Record<string, unknown>>({ query, selectedIds: controlledSelectedIds, defaultSelectedIds, onSelectedIdsChange, renderItem, onCompleted, ...props }: KeepBulkActionsProps<TMeta>): react.JSX.Element;
101
213
  type KeepEmptyStateProps = Omit<HTMLAttributes<HTMLElement>, "children" | "title"> & {
102
214
  title?: ReactNode;
103
215
  description?: ReactNode;
@@ -124,5 +236,10 @@ type KeepStatusProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTML
124
236
  };
125
237
  /** Presents provider loading, mutation, synchronization, empty, and error states accessibly. */
126
238
  declare function KeepStatus<TMeta = Record<string, unknown>>({ status, labels, children, render, asChild, className, ...rootProps }: KeepStatusProps<TMeta>): ReactElement<unknown, string | react.JSXElementConstructor<any>>;
239
+ type KeepAnnouncementsProps = Omit<HTMLAttributes<HTMLElement>, "children"> & {
240
+ messages?: Partial<Record<"save" | "remove" | "note", string>>;
241
+ };
242
+ /** Announces successful save, remove, and note operations in a polite live region. */
243
+ declare function KeepAnnouncements<TMeta = Record<string, unknown>>({ messages, ...props }: KeepAnnouncementsProps): react.JSX.Element;
127
244
 
128
- export { KeepButton, type KeepButtonLabels, type KeepButtonProps, KeepEmptyState, type KeepEmptyStateProps, KeepItemCard, type KeepItemCardProps, type KeepItemCardState, KeepList, type KeepListProps, type KeepListState, KeepNoteEditor, type KeepNoteEditorProps, type KeepNoteEditorState, KeepStatus, type KeepStatusLabels, type KeepStatusProps, type KeepStatusState, type KeepStatusValue, KeepTagFilter, type KeepTagFilterProps, type KeepTagFilterState, type RenderProp };
245
+ export { type CreateKeepKitOptions, KeepAnnouncements, type KeepAnnouncementsProps, KeepBulkActions, type KeepBulkActionsProps, KeepButton, type KeepButtonLabels, type KeepButtonProps, KeepCollection, type KeepCollectionFeature, type KeepCollectionProps, KeepEmptyState, type KeepEmptyStateProps, type KeepImageProps, KeepItemCard, type KeepItemCardProps, type KeepItemCardState, type KeepKit, KeepKitProvider, type KeepKitProviderProps, KeepList, type KeepListProps, type KeepListState, KeepNoteEditor, type KeepNoteEditorProps, type KeepNoteEditorState, KeepPagination, type KeepPaginationProps, KeepSearchInput, type KeepSearchInputProps, KeepSortSelect, type KeepSortSelectProps, type KeepSortValue, KeepStatus, type KeepStatusLabels, type KeepStatusProps, type KeepStatusState, type KeepStatusValue, KeepTagEditor, type KeepTagEditorProps, KeepTagFilter, type KeepTagFilterProps, type KeepTagFilterState, type KeepUiLabelContext, type KeepUiLabelKey, type KeepUiLabels, KeepUiProvider, type KeepUiProviderProps, type RenderProp, createKeepKit, useKeepUiLabels };