@keepkit/ui 0.15.0 → 0.16.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
@@ -60,7 +60,29 @@ function SavedArticles() {
60
60
  `KeepItemCard`は`href`、`onOpen`、`linkTarget`、`linkComponent`に対応し、保存アイテムから詳細ページへ遷移できます。非公開・期限切れ等の`status`を持つアイテムは自動的にリンクを無効化します。`KeepBackup`はJSONのエクスポート、merge / replaceインポート、結果件数、容量エラー表示を提供します。
61
61
  外部URLの詳細リンクには`target="_blank"`と`rel="noreferrer"`が既定で補完され、利用できないカードには`aria-disabled="true"`と`data-item-status`が付与されます。同期競合ダイアログではローカルとリモートの更新日時・メモを並べて確認できます。
62
62
 
63
- v0.15.0では`KeepCollection urlSync layout="list" | "grid" | "compact"`、`KeepBulkActions selectionScope="page" | "query" | "all"`、`KeepUndo`を利用できます。`createNextPagesRouterAdapter`はNext.js Pages Router用の注入adapterです。`locale`は英語、日本語、韓国語、中国語簡体字・繁体字、タイ語、フランス語、スペイン語、ポルトガル語、イタリア語、ドイツ語、ロシア語、フィリピン語、ベトナム語、インドネシア語、マレー語の16言語に対応し、`labels`で上書きできます。認証付き同期は`createAuthenticatedSyncKit`から利用できます。
63
+ `KeepList`は初回ロード中、`layout`に合う`KeepItemCardSkeleton`を既定で6枚表示します。`loadingCount`で枚数を変更でき、従来の`loading`または`renderLoading`で完全に差し替えられます。`layout="auto"`は画面幅ではなく配置コンテナ幅に追従し、サイドバーやモーダルでも1列から複数列へ切り替わります。スケルトンのパルスは`prefers-reduced-motion`で静止表示になります。
64
+
65
+ カードの一部だけを配置し直す場合はCompound APIを利用できます。画像alt、タイトルリンク、タグ一覧のARIAラベル、保存操作の状態は各パーツでも維持されます。
66
+
67
+ ```tsx
68
+ <KeepItemCard item={item} href={`/items/${item.id}`} getImageProps={getImageProps}>
69
+ <KeepItemCard.Media fallback="No image" />
70
+ <KeepItemCard.Content>
71
+ <KeepItemCard.Title />
72
+ <KeepItemCard.Tags />
73
+ </KeepItemCard.Content>
74
+ <KeepItemCard.Actions />
75
+ </KeepItemCard>
76
+ ```
77
+
78
+ `KeepKitProvider` / `KeepUiProvider`の`onFeedback`は`item-saved`、`item-removed`、`item-restored`、`sync-completed`、`sync-failed`、`stale-pruned`を通知します。削除系イベントには`undo`と現在ロケールの`undoLabel`が含まれます。Sonner互換の関数なら次の1行で接続できます(ライブラリ依存は追加されません)。
79
+
80
+ ```tsx
81
+ const onFeedback = useKeepToastFeedback(toast);
82
+ <KeepKitProvider storage={storage} onFeedback={onFeedback}>{children}</KeepKitProvider>;
83
+ ```
84
+
85
+ v0.16.0では`KeepCollection urlSync layout="list" | "grid" | "compact"`、`KeepBulkActions selectionScope="page" | "query" | "all"`、`KeepUndo`を利用できます。`createNextPagesRouterAdapter`はNext.js Pages Router用の注入adapterです。`locale`は英語、日本語、韓国語、中国語簡体字・繁体字、タイ語、フランス語、スペイン語、ポルトガル語、イタリア語、ドイツ語、ロシア語、フィリピン語、ベトナム語、インドネシア語、マレー語の16言語に対応し、`labels`で上書きできます。認証付き同期は`createAuthenticatedSyncKit`から利用できます。
64
86
  Phase 4の状態UIとして`KeepItemStatusBadge`、`KeepStaleNotice`、`KeepPruneStaleButton`、`KeepSyncStatusBanner`、`KeepSyncRecoveryDialog`を利用できます。`import "@keepkit/ui/theme.css"`でテーマCSSを有効にできます。
65
87
 
66
88
  ### Tailwind/shadcnテーマ
@@ -151,7 +173,29 @@ The opt-in theme adds neutral borders, surfaces, shadows, focus treatment, and d
151
173
  `KeepItemCard` accepts `href`, `onOpen`, `linkTarget`, and `linkComponent` for detail-page navigation. Links are disabled for unavailable `status` values such as private or expired. `KeepBackup` provides JSON export, merge/replace import, result counts, and quota-error messaging.
152
174
  External detail URLs receive `target="_blank"` and `rel="noreferrer"` defaults. Unavailable cards expose `aria-disabled="true"` and normalized `data-item-status` values, and the sync recovery dialog compares local and remote updated dates and notes side by side.
153
175
 
154
- In v0.15.0, use `KeepCollection urlSync` with `layout="list" | "grid" | "compact"`, `KeepBulkActions selectionScope="page" | "query" | "all"`, and `KeepUndo`. `createNextPagesRouterAdapter` is the injected adapter for Next.js Pages Router. `locale` includes complete dictionaries for 16 built-in locales; `labels` overrides individual entries. Authenticated sync is available through `createAuthenticatedSyncKit`.
176
+ During initial loading, `KeepList` renders six layout-matched `KeepItemCardSkeleton` placeholders by default. Change the count with `loadingCount`, or replace them with the existing `loading` prop or its `renderLoading` alias. `layout="auto"` responds to the available container width rather than viewport width, so embedded sidebars and dialogs collapse to one column. Skeleton pulses become static under `prefers-reduced-motion`.
177
+
178
+ Use the compound parts to rearrange only the card regions you own while preserving image alt text, linked headings, the labelled tag list, and action state:
179
+
180
+ ```tsx
181
+ <KeepItemCard item={item} href={`/items/${item.id}`} getImageProps={getImageProps}>
182
+ <KeepItemCard.Media fallback="No image" />
183
+ <KeepItemCard.Content>
184
+ <KeepItemCard.Title />
185
+ <KeepItemCard.Tags />
186
+ </KeepItemCard.Content>
187
+ <KeepItemCard.Actions />
188
+ </KeepItemCard>
189
+ ```
190
+
191
+ `onFeedback` on `KeepKitProvider` / `KeepUiProvider` receives `item-saved`, `item-removed`, `item-restored`, `sync-completed`, `sync-failed`, and `stale-pruned`. Removal events include an `undo` function and locale-aware `undoLabel`. Connect a Sonner-compatible function without adding a package dependency:
192
+
193
+ ```tsx
194
+ const onFeedback = useKeepToastFeedback(toast);
195
+ <KeepKitProvider storage={storage} onFeedback={onFeedback}>{children}</KeepKitProvider>;
196
+ ```
197
+
198
+ In v0.16.0, use `KeepCollection urlSync` with `layout="list" | "grid" | "compact"`, `KeepBulkActions selectionScope="page" | "query" | "all"`, and `KeepUndo`. `createNextPagesRouterAdapter` is the injected adapter for Next.js Pages Router. `locale` includes complete dictionaries for 16 built-in locales; `labels` overrides individual entries. Authenticated sync is available through `createAuthenticatedSyncKit`.
155
199
  Phase 4 adds `KeepItemStatusBadge`, `KeepStaleNotice`, `KeepPruneStaleButton`, `KeepSyncStatusBanner`, and `KeepSyncRecoveryDialog` for unavailable items, sync failures, conflict resolution, and backup recovery. Import `@keepkit/ui/theme.css` or `@keepkit/ui/tailwind.css` for the opt-in theme layer.
156
200
 
157
201
  ### Tailwind and shadcn theme
package/dist/index.d.ts CHANGED
@@ -1,11 +1,70 @@
1
1
  import * as react from 'react';
2
- import { HTMLAttributes, ReactNode, ComponentType, ImgHTMLAttributes, MouseEvent, HTMLAttributeAnchorTarget, InputHTMLAttributes, FormHTMLAttributes, ButtonHTMLAttributes, SelectHTMLAttributes, CSSProperties } from 'react';
3
- import { ImportItemsResult, KeepItem, KeepListQuery, KeepUrlSyncOptions, KeepItemStatus, KeepSyncConflict, KeepItemInput } from '@keepkit/core/core';
2
+ import { ReactNode, HTMLAttributes, ComponentType, ImgHTMLAttributes, MouseEvent, HTMLAttributeAnchorTarget, InputHTMLAttributes, FormHTMLAttributes, ButtonHTMLAttributes, SelectHTMLAttributes, CSSProperties } from 'react';
3
+ import { KeepItem, ImportItemsResult, KeepListQuery, KeepUrlSyncOptions, 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, CreateKeepKitOptions as CreateKeepKitOptions$1, KeepProviderProps, useKeepContext, useKeepItem, useKeepList, KeepShortcutOptions } from '@keepkit/core/react';
6
6
  export { KeepButtonState, KeepContextValue, KeepErrorBoundary, KeepErrorBoundaryProps, KeepProvider, KeepProviderProps, KeepShortcutOptions, useKeepContext, useKeepItem, useKeepList, 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;
53
+ };
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;
62
+ };
63
+ };
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;
67
+
9
68
  type KeepBackupProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, "children"> & {
10
69
  filename?: string;
11
70
  onExport?: (data: string) => void;
@@ -82,7 +141,7 @@ type KeepButtonProps<TMeta = Record<string, unknown>> = KeepButtonProps$1<TMeta>
82
141
  iconClassName?: string;
83
142
  };
84
143
  /** A style-free save toggle with localized labels and the core button's ARIA/asChild behavior. */
85
- declare function KeepButton<TMeta = Record<string, unknown>>({ labels, icons, iconOnly, showLabel, iconClassName, ...props }: KeepButtonProps<TMeta>): react.JSX.Element;
144
+ declare function KeepButton<TMeta = Record<string, unknown>>({ labels, icons, iconOnly, showLabel, iconClassName, onClick, onToggleError, ...props }: KeepButtonProps<TMeta>): react.JSX.Element;
86
145
 
87
146
  type KeepItemCardState<TMeta = Record<string, unknown>> = {
88
147
  item: KeepItem<TMeta>;
@@ -130,8 +189,315 @@ type KeepItemCardProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HT
130
189
  linkTargetAttribute?: HTMLAttributeAnchorTarget;
131
190
  linkRel?: string;
132
191
  };
133
- /** A low-dependency item presentation primitive. The default markup can be replaced with render props. */
134
- declare function KeepItemCard<TMeta = Record<string, unknown>>({ item, title, getTitle, getImageProps, imageComponent: ImageComponent, renderImage, renderTags, showTags, showSavedAt, imageAlt, render, children, removeLabel, onRemoveError, onRemoved, onRetry, showSaveButton, saveButtonLabels, asChild, href: hrefOption, onOpen, linkTarget, linkComponent: LinkComponent, linkTargetAttribute, linkRel, className, ...rootProps }: KeepItemCardProps<TMeta>): react.ReactElement<unknown, string | react.JSXElementConstructor<any>>;
192
+ type KeepItemCardMediaProps = Omit<HTMLAttributes<HTMLDivElement>, "children"> & {
193
+ children?: ReactNode;
194
+ fallback?: ReactNode;
195
+ };
196
+ type KeepItemCardContentProps = HTMLAttributes<HTMLDivElement>;
197
+ type KeepItemCardTitleProps = Omit<HTMLAttributes<HTMLHeadingElement>, "title"> & {
198
+ as?: "h2" | "h3" | "h4" | "h5" | "h6";
199
+ };
200
+ type KeepItemCardTagsProps = HTMLAttributes<HTMLUListElement>;
201
+ type KeepItemCardActionsProps = HTMLAttributes<HTMLDivElement>;
202
+ type KeepItemCardSkeletonProps = Omit<HTMLAttributes<HTMLElement>, "children"> & {
203
+ layout?: KeepLayoutPreset;
204
+ };
205
+ /** A low-dependency item presentation primitive with composable card parts. */
206
+ declare function KeepItemCardRoot<TMeta = Record<string, unknown>>({ item, title, getTitle, getImageProps, imageComponent: ImageComponent, renderImage, renderTags, showTags, showSavedAt, imageAlt, render, children, removeLabel, onRemoveError, onRemoved, onRetry, showSaveButton, saveButtonLabels, asChild, href: hrefOption, onOpen, linkTarget, linkComponent: LinkComponent, linkTargetAttribute, linkRel, className, ...rootProps }: KeepItemCardProps<TMeta>): react.JSX.Element;
207
+ declare function KeepItemCardMedia({ children, fallback, ...props }: KeepItemCardMediaProps): react.JSX.Element;
208
+ declare function KeepItemCardContent({ children, ...props }: KeepItemCardContentProps): react.JSX.Element;
209
+ declare function KeepItemCardTitle({ as, children, ...props }: KeepItemCardTitleProps): react.DetailedReactHTMLElement<{
210
+ "data-keep-card-part": string;
211
+ onChange?: react.ChangeEventHandler<HTMLHeadingElement, Element> | undefined;
212
+ onError?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
213
+ className?: string | undefined | undefined;
214
+ id?: string | undefined | undefined;
215
+ role?: react.AriaRole | undefined;
216
+ tabIndex?: number | undefined | undefined;
217
+ "aria-label"?: string | undefined | undefined;
218
+ "aria-labelledby"?: string | undefined | undefined;
219
+ "aria-describedby"?: string | undefined | undefined;
220
+ style?: react.CSSProperties | undefined;
221
+ onClick?: react.MouseEventHandler<HTMLHeadingElement> | undefined;
222
+ "aria-pressed"?: boolean | "false" | "mixed" | "true" | undefined | undefined;
223
+ defaultChecked?: boolean | undefined | undefined;
224
+ defaultValue?: string | number | readonly string[] | undefined;
225
+ suppressContentEditableWarning?: boolean | undefined | undefined;
226
+ suppressHydrationWarning?: boolean | undefined | undefined;
227
+ accessKey?: string | undefined | undefined;
228
+ autoCapitalize?: "off" | "none" | "on" | "sentences" | "words" | "characters" | undefined | (string & {}) | undefined;
229
+ autoFocus?: boolean | undefined | undefined;
230
+ contentEditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
231
+ contextMenu?: string | undefined | undefined;
232
+ dir?: string | undefined | undefined;
233
+ draggable?: (boolean | "true" | "false") | undefined;
234
+ enterKeyHint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
235
+ hidden?: boolean | undefined | undefined;
236
+ lang?: string | undefined | undefined;
237
+ nonce?: string | undefined | undefined;
238
+ slot?: string | undefined | undefined;
239
+ spellCheck?: (boolean | "true" | "false") | undefined;
240
+ translate?: "yes" | "no" | undefined | undefined;
241
+ radioGroup?: string | undefined | undefined;
242
+ about?: string | undefined | undefined;
243
+ content?: string | undefined | undefined;
244
+ datatype?: string | undefined | undefined;
245
+ inlist?: any;
246
+ prefix?: string | undefined | undefined;
247
+ property?: string | undefined | undefined;
248
+ rel?: string | undefined | undefined;
249
+ resource?: string | undefined | undefined;
250
+ rev?: string | undefined | undefined;
251
+ typeof?: string | undefined | undefined;
252
+ vocab?: string | undefined | undefined;
253
+ autoCorrect?: string | undefined | undefined;
254
+ autoSave?: string | undefined | undefined;
255
+ color?: string | undefined | undefined;
256
+ itemProp?: string | undefined | undefined;
257
+ itemScope?: boolean | undefined | undefined;
258
+ itemType?: string | undefined | undefined;
259
+ itemID?: string | undefined | undefined;
260
+ itemRef?: string | undefined | undefined;
261
+ results?: number | undefined | undefined;
262
+ security?: string | undefined | undefined;
263
+ unselectable?: "on" | "off" | undefined | undefined;
264
+ popover?: "" | "auto" | "manual" | "hint" | undefined | undefined;
265
+ popoverTargetAction?: "toggle" | "show" | "hide" | undefined | undefined;
266
+ popoverTarget?: string | undefined | undefined;
267
+ inert?: boolean | undefined | undefined;
268
+ inputMode?: "none" | "text" | "tel" | "url" | "email" | "numeric" | "decimal" | "search" | undefined | undefined;
269
+ is?: string | undefined | undefined;
270
+ exportparts?: string | undefined | undefined;
271
+ part?: string | undefined | undefined;
272
+ "aria-activedescendant"?: string | undefined | undefined;
273
+ "aria-atomic"?: (boolean | "true" | "false") | undefined;
274
+ "aria-autocomplete"?: "none" | "inline" | "list" | "both" | undefined | undefined;
275
+ "aria-braillelabel"?: string | undefined | undefined;
276
+ "aria-brailleroledescription"?: string | undefined | undefined;
277
+ "aria-busy"?: (boolean | "true" | "false") | undefined;
278
+ "aria-checked"?: boolean | "false" | "mixed" | "true" | undefined | undefined;
279
+ "aria-colcount"?: number | undefined | undefined;
280
+ "aria-colindex"?: number | undefined | undefined;
281
+ "aria-colindextext"?: string | undefined | undefined;
282
+ "aria-colspan"?: number | undefined | undefined;
283
+ "aria-controls"?: string | undefined | undefined;
284
+ "aria-current"?: boolean | "false" | "true" | "page" | "step" | "location" | "date" | "time" | undefined | undefined;
285
+ "aria-description"?: string | undefined | undefined;
286
+ "aria-details"?: string | undefined | undefined;
287
+ "aria-disabled"?: (boolean | "true" | "false") | undefined;
288
+ "aria-dropeffect"?: "none" | "copy" | "execute" | "link" | "move" | "popup" | undefined | undefined;
289
+ "aria-errormessage"?: string | undefined | undefined;
290
+ "aria-expanded"?: (boolean | "true" | "false") | undefined;
291
+ "aria-flowto"?: string | undefined | undefined;
292
+ "aria-grabbed"?: (boolean | "true" | "false") | undefined;
293
+ "aria-haspopup"?: boolean | "false" | "true" | "menu" | "listbox" | "tree" | "grid" | "dialog" | undefined | undefined;
294
+ "aria-hidden"?: (boolean | "true" | "false") | undefined;
295
+ "aria-invalid"?: boolean | "false" | "true" | "grammar" | "spelling" | undefined | undefined;
296
+ "aria-keyshortcuts"?: string | undefined | undefined;
297
+ "aria-level"?: number | undefined | undefined;
298
+ "aria-live"?: "off" | "assertive" | "polite" | undefined | undefined;
299
+ "aria-modal"?: (boolean | "true" | "false") | undefined;
300
+ "aria-multiline"?: (boolean | "true" | "false") | undefined;
301
+ "aria-multiselectable"?: (boolean | "true" | "false") | undefined;
302
+ "aria-orientation"?: "horizontal" | "vertical" | undefined | undefined;
303
+ "aria-owns"?: string | undefined | undefined;
304
+ "aria-placeholder"?: string | undefined | undefined;
305
+ "aria-posinset"?: number | undefined | undefined;
306
+ "aria-readonly"?: (boolean | "true" | "false") | undefined;
307
+ "aria-relevant"?: "additions" | "additions removals" | "additions text" | "all" | "removals" | "removals additions" | "removals text" | "text" | "text additions" | "text removals" | undefined | undefined;
308
+ "aria-required"?: (boolean | "true" | "false") | undefined;
309
+ "aria-roledescription"?: string | undefined | undefined;
310
+ "aria-rowcount"?: number | undefined | undefined;
311
+ "aria-rowindex"?: number | undefined | undefined;
312
+ "aria-rowindextext"?: string | undefined | undefined;
313
+ "aria-rowspan"?: number | undefined | undefined;
314
+ "aria-selected"?: (boolean | "true" | "false") | undefined;
315
+ "aria-setsize"?: number | undefined | undefined;
316
+ "aria-sort"?: "none" | "ascending" | "descending" | "other" | undefined | undefined;
317
+ "aria-valuemax"?: number | undefined | undefined;
318
+ "aria-valuemin"?: number | undefined | undefined;
319
+ "aria-valuenow"?: number | undefined | undefined;
320
+ "aria-valuetext"?: string | undefined | undefined;
321
+ dangerouslySetInnerHTML?: {
322
+ __html: string | TrustedHTML;
323
+ } | undefined | undefined;
324
+ onCopy?: react.ClipboardEventHandler<HTMLHeadingElement> | undefined;
325
+ onCopyCapture?: react.ClipboardEventHandler<HTMLHeadingElement> | undefined;
326
+ onCut?: react.ClipboardEventHandler<HTMLHeadingElement> | undefined;
327
+ onCutCapture?: react.ClipboardEventHandler<HTMLHeadingElement> | undefined;
328
+ onPaste?: react.ClipboardEventHandler<HTMLHeadingElement> | undefined;
329
+ onPasteCapture?: react.ClipboardEventHandler<HTMLHeadingElement> | undefined;
330
+ onCompositionEnd?: react.CompositionEventHandler<HTMLHeadingElement> | undefined;
331
+ onCompositionEndCapture?: react.CompositionEventHandler<HTMLHeadingElement> | undefined;
332
+ onCompositionStart?: react.CompositionEventHandler<HTMLHeadingElement> | undefined;
333
+ onCompositionStartCapture?: react.CompositionEventHandler<HTMLHeadingElement> | undefined;
334
+ onCompositionUpdate?: react.CompositionEventHandler<HTMLHeadingElement> | undefined;
335
+ onCompositionUpdateCapture?: react.CompositionEventHandler<HTMLHeadingElement> | undefined;
336
+ onFocus?: react.FocusEventHandler<HTMLHeadingElement> | undefined;
337
+ onFocusCapture?: react.FocusEventHandler<HTMLHeadingElement> | undefined;
338
+ onBlur?: react.FocusEventHandler<HTMLHeadingElement> | undefined;
339
+ onBlurCapture?: react.FocusEventHandler<HTMLHeadingElement> | undefined;
340
+ onChangeCapture?: react.ChangeEventHandler<HTMLHeadingElement, Element> | undefined;
341
+ onBeforeInput?: react.InputEventHandler<HTMLHeadingElement> | undefined;
342
+ onBeforeInputCapture?: react.InputEventHandler<HTMLHeadingElement> | undefined;
343
+ onInput?: react.InputEventHandler<HTMLHeadingElement> | undefined;
344
+ onInputCapture?: react.InputEventHandler<HTMLHeadingElement> | undefined;
345
+ onReset?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
346
+ onResetCapture?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
347
+ onSubmit?: react.SubmitEventHandler<HTMLHeadingElement> | undefined;
348
+ onSubmitCapture?: react.SubmitEventHandler<HTMLHeadingElement> | undefined;
349
+ onInvalid?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
350
+ onInvalidCapture?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
351
+ onLoad?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
352
+ onLoadCapture?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
353
+ onErrorCapture?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
354
+ onKeyDown?: react.KeyboardEventHandler<HTMLHeadingElement> | undefined;
355
+ onKeyDownCapture?: react.KeyboardEventHandler<HTMLHeadingElement> | undefined;
356
+ onKeyPress?: react.KeyboardEventHandler<HTMLHeadingElement> | undefined;
357
+ onKeyPressCapture?: react.KeyboardEventHandler<HTMLHeadingElement> | undefined;
358
+ onKeyUp?: react.KeyboardEventHandler<HTMLHeadingElement> | undefined;
359
+ onKeyUpCapture?: react.KeyboardEventHandler<HTMLHeadingElement> | undefined;
360
+ onAbort?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
361
+ onAbortCapture?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
362
+ onCanPlay?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
363
+ onCanPlayCapture?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
364
+ onCanPlayThrough?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
365
+ onCanPlayThroughCapture?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
366
+ onDurationChange?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
367
+ onDurationChangeCapture?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
368
+ onEmptied?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
369
+ onEmptiedCapture?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
370
+ onEncrypted?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
371
+ onEncryptedCapture?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
372
+ onEnded?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
373
+ onEndedCapture?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
374
+ onLoadedData?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
375
+ onLoadedDataCapture?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
376
+ onLoadedMetadata?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
377
+ onLoadedMetadataCapture?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
378
+ onLoadStart?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
379
+ onLoadStartCapture?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
380
+ onPause?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
381
+ onPauseCapture?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
382
+ onPlay?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
383
+ onPlayCapture?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
384
+ onPlaying?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
385
+ onPlayingCapture?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
386
+ onProgress?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
387
+ onProgressCapture?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
388
+ onRateChange?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
389
+ onRateChangeCapture?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
390
+ onSeeked?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
391
+ onSeekedCapture?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
392
+ onSeeking?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
393
+ onSeekingCapture?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
394
+ onStalled?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
395
+ onStalledCapture?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
396
+ onSuspend?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
397
+ onSuspendCapture?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
398
+ onTimeUpdate?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
399
+ onTimeUpdateCapture?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
400
+ onVolumeChange?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
401
+ onVolumeChangeCapture?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
402
+ onWaiting?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
403
+ onWaitingCapture?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
404
+ onAuxClick?: react.MouseEventHandler<HTMLHeadingElement> | undefined;
405
+ onAuxClickCapture?: react.MouseEventHandler<HTMLHeadingElement> | undefined;
406
+ onClickCapture?: react.MouseEventHandler<HTMLHeadingElement> | undefined;
407
+ onContextMenu?: react.MouseEventHandler<HTMLHeadingElement> | undefined;
408
+ onContextMenuCapture?: react.MouseEventHandler<HTMLHeadingElement> | undefined;
409
+ onDoubleClick?: react.MouseEventHandler<HTMLHeadingElement> | undefined;
410
+ onDoubleClickCapture?: react.MouseEventHandler<HTMLHeadingElement> | undefined;
411
+ onDrag?: react.DragEventHandler<HTMLHeadingElement> | undefined;
412
+ onDragCapture?: react.DragEventHandler<HTMLHeadingElement> | undefined;
413
+ onDragEnd?: react.DragEventHandler<HTMLHeadingElement> | undefined;
414
+ onDragEndCapture?: react.DragEventHandler<HTMLHeadingElement> | undefined;
415
+ onDragEnter?: react.DragEventHandler<HTMLHeadingElement> | undefined;
416
+ onDragEnterCapture?: react.DragEventHandler<HTMLHeadingElement> | undefined;
417
+ onDragExit?: react.DragEventHandler<HTMLHeadingElement> | undefined;
418
+ onDragExitCapture?: react.DragEventHandler<HTMLHeadingElement> | undefined;
419
+ onDragLeave?: react.DragEventHandler<HTMLHeadingElement> | undefined;
420
+ onDragLeaveCapture?: react.DragEventHandler<HTMLHeadingElement> | undefined;
421
+ onDragOver?: react.DragEventHandler<HTMLHeadingElement> | undefined;
422
+ onDragOverCapture?: react.DragEventHandler<HTMLHeadingElement> | undefined;
423
+ onDragStart?: react.DragEventHandler<HTMLHeadingElement> | undefined;
424
+ onDragStartCapture?: react.DragEventHandler<HTMLHeadingElement> | undefined;
425
+ onDrop?: react.DragEventHandler<HTMLHeadingElement> | undefined;
426
+ onDropCapture?: react.DragEventHandler<HTMLHeadingElement> | undefined;
427
+ onMouseDown?: react.MouseEventHandler<HTMLHeadingElement> | undefined;
428
+ onMouseDownCapture?: react.MouseEventHandler<HTMLHeadingElement> | undefined;
429
+ onMouseEnter?: react.MouseEventHandler<HTMLHeadingElement> | undefined;
430
+ onMouseLeave?: react.MouseEventHandler<HTMLHeadingElement> | undefined;
431
+ onMouseMove?: react.MouseEventHandler<HTMLHeadingElement> | undefined;
432
+ onMouseMoveCapture?: react.MouseEventHandler<HTMLHeadingElement> | undefined;
433
+ onMouseOut?: react.MouseEventHandler<HTMLHeadingElement> | undefined;
434
+ onMouseOutCapture?: react.MouseEventHandler<HTMLHeadingElement> | undefined;
435
+ onMouseOver?: react.MouseEventHandler<HTMLHeadingElement> | undefined;
436
+ onMouseOverCapture?: react.MouseEventHandler<HTMLHeadingElement> | undefined;
437
+ onMouseUp?: react.MouseEventHandler<HTMLHeadingElement> | undefined;
438
+ onMouseUpCapture?: react.MouseEventHandler<HTMLHeadingElement> | undefined;
439
+ onSelect?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
440
+ onSelectCapture?: react.ReactEventHandler<HTMLHeadingElement> | undefined;
441
+ onTouchCancel?: react.TouchEventHandler<HTMLHeadingElement> | undefined;
442
+ onTouchCancelCapture?: react.TouchEventHandler<HTMLHeadingElement> | undefined;
443
+ onTouchEnd?: react.TouchEventHandler<HTMLHeadingElement> | undefined;
444
+ onTouchEndCapture?: react.TouchEventHandler<HTMLHeadingElement> | undefined;
445
+ onTouchMove?: react.TouchEventHandler<HTMLHeadingElement> | undefined;
446
+ onTouchMoveCapture?: react.TouchEventHandler<HTMLHeadingElement> | undefined;
447
+ onTouchStart?: react.TouchEventHandler<HTMLHeadingElement> | undefined;
448
+ onTouchStartCapture?: react.TouchEventHandler<HTMLHeadingElement> | undefined;
449
+ onPointerDown?: react.PointerEventHandler<HTMLHeadingElement> | undefined;
450
+ onPointerDownCapture?: react.PointerEventHandler<HTMLHeadingElement> | undefined;
451
+ onPointerMove?: react.PointerEventHandler<HTMLHeadingElement> | undefined;
452
+ onPointerMoveCapture?: react.PointerEventHandler<HTMLHeadingElement> | undefined;
453
+ onPointerUp?: react.PointerEventHandler<HTMLHeadingElement> | undefined;
454
+ onPointerUpCapture?: react.PointerEventHandler<HTMLHeadingElement> | undefined;
455
+ onPointerCancel?: react.PointerEventHandler<HTMLHeadingElement> | undefined;
456
+ onPointerCancelCapture?: react.PointerEventHandler<HTMLHeadingElement> | undefined;
457
+ onPointerEnter?: react.PointerEventHandler<HTMLHeadingElement> | undefined;
458
+ onPointerLeave?: react.PointerEventHandler<HTMLHeadingElement> | undefined;
459
+ onPointerOver?: react.PointerEventHandler<HTMLHeadingElement> | undefined;
460
+ onPointerOverCapture?: react.PointerEventHandler<HTMLHeadingElement> | undefined;
461
+ onPointerOut?: react.PointerEventHandler<HTMLHeadingElement> | undefined;
462
+ onPointerOutCapture?: react.PointerEventHandler<HTMLHeadingElement> | undefined;
463
+ onGotPointerCapture?: react.PointerEventHandler<HTMLHeadingElement> | undefined;
464
+ onGotPointerCaptureCapture?: react.PointerEventHandler<HTMLHeadingElement> | undefined;
465
+ onLostPointerCapture?: react.PointerEventHandler<HTMLHeadingElement> | undefined;
466
+ onLostPointerCaptureCapture?: react.PointerEventHandler<HTMLHeadingElement> | undefined;
467
+ onScroll?: react.UIEventHandler<HTMLHeadingElement> | undefined;
468
+ onScrollCapture?: react.UIEventHandler<HTMLHeadingElement> | undefined;
469
+ onScrollEnd?: react.UIEventHandler<HTMLHeadingElement> | undefined;
470
+ onScrollEndCapture?: react.UIEventHandler<HTMLHeadingElement> | undefined;
471
+ onWheel?: react.WheelEventHandler<HTMLHeadingElement> | undefined;
472
+ onWheelCapture?: react.WheelEventHandler<HTMLHeadingElement> | undefined;
473
+ onAnimationStart?: react.AnimationEventHandler<HTMLHeadingElement> | undefined;
474
+ onAnimationStartCapture?: react.AnimationEventHandler<HTMLHeadingElement> | undefined;
475
+ onAnimationEnd?: react.AnimationEventHandler<HTMLHeadingElement> | undefined;
476
+ onAnimationEndCapture?: react.AnimationEventHandler<HTMLHeadingElement> | undefined;
477
+ onAnimationIteration?: react.AnimationEventHandler<HTMLHeadingElement> | undefined;
478
+ onAnimationIterationCapture?: react.AnimationEventHandler<HTMLHeadingElement> | undefined;
479
+ onToggle?: react.ToggleEventHandler<HTMLHeadingElement> | undefined;
480
+ onBeforeToggle?: react.ToggleEventHandler<HTMLHeadingElement> | undefined;
481
+ onTransitionCancel?: react.TransitionEventHandler<HTMLHeadingElement> | undefined;
482
+ onTransitionCancelCapture?: react.TransitionEventHandler<HTMLHeadingElement> | undefined;
483
+ onTransitionEnd?: react.TransitionEventHandler<HTMLHeadingElement> | undefined;
484
+ onTransitionEndCapture?: react.TransitionEventHandler<HTMLHeadingElement> | undefined;
485
+ onTransitionRun?: react.TransitionEventHandler<HTMLHeadingElement> | undefined;
486
+ onTransitionRunCapture?: react.TransitionEventHandler<HTMLHeadingElement> | undefined;
487
+ onTransitionStart?: react.TransitionEventHandler<HTMLHeadingElement> | undefined;
488
+ onTransitionStartCapture?: react.TransitionEventHandler<HTMLHeadingElement> | undefined;
489
+ }, HTMLElement>;
490
+ declare function KeepItemCardTags({ children, ...props }: KeepItemCardTagsProps): string | number | bigint | true | Iterable<ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | react.JSX.Element | null;
491
+ declare function KeepItemCardActions({ children, ...props }: KeepItemCardActionsProps): react.JSX.Element;
492
+ declare const KeepItemCard: typeof KeepItemCardRoot & {
493
+ Media: typeof KeepItemCardMedia;
494
+ Content: typeof KeepItemCardContent;
495
+ Title: typeof KeepItemCardTitle;
496
+ Tags: typeof KeepItemCardTags;
497
+ Actions: typeof KeepItemCardActions;
498
+ };
499
+ /** A non-interactive placeholder that preserves the selected card layout while data loads. */
500
+ declare function KeepItemCardSkeleton({ layout, ...props }: KeepItemCardSkeletonProps): react.JSX.Element;
135
501
 
136
502
  type KeepListState<TMeta = Record<string, unknown>> = UseKeepListResult<TMeta>;
137
503
  type KeepListProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, "children"> & {
@@ -139,6 +505,9 @@ type KeepListProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLEl
139
505
  children?: ReactNode | RenderProp<KeepListState<TMeta>>;
140
506
  renderItem?: (item: KeepItem<TMeta>, state: KeepListState<TMeta>) => ReactNode;
141
507
  loading?: ReactNode | RenderProp<KeepListState<TMeta>>;
508
+ /** Alias for `loading`. When neither is provided, layout-matched skeletons are rendered. */
509
+ renderLoading?: ReactNode | RenderProp<KeepListState<TMeta>>;
510
+ loadingCount?: number;
142
511
  empty?: ReactNode | RenderProp<KeepListState<TMeta>>;
143
512
  error?: ReactNode | RenderProp<KeepListState<TMeta>>;
144
513
  itemCardProps?: Omit<KeepItemCardProps<TMeta>, "item" | "children" | "render">;
@@ -182,7 +551,7 @@ declare function createNextPagesRouterAdapter(router: KeepPagesRouterLike): Keep
182
551
  declare function useKeepUrlSync<TMeta = Record<string, unknown>>({ enabled, query, onQueryChange, options, adapter: providedAdapter, }: KeepUrlSyncProps<TMeta>): void;
183
552
 
184
553
  type KeepCollectionFeature = "search" | "sort" | "pagination" | "tagFilter" | "bulkActions";
185
- type KeepLayoutPreset = "list" | "grid" | "compact";
554
+ type KeepLayoutPreset = "list" | "grid" | "compact" | "auto";
186
555
  type KeepCollectionProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, "children"> & {
187
556
  query?: KeepListQuery<TMeta>;
188
557
  pageSize?: number;
@@ -193,6 +562,9 @@ type KeepCollectionProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<
193
562
  renderItem?: (item: KeepItem<TMeta>, state: KeepListState<TMeta>) => ReactNode;
194
563
  itemCardProps?: Omit<KeepItemCardProps<TMeta>, "item" | "children" | "render">;
195
564
  loading?: ReactNode | RenderProp<KeepListState<TMeta>>;
565
+ /** Alias for `loading`. When neither is provided, KeepList renders skeleton cards. */
566
+ renderLoading?: ReactNode | RenderProp<KeepListState<TMeta>>;
567
+ loadingCount?: number;
196
568
  empty?: ReactNode | RenderProp<KeepListState<TMeta>>;
197
569
  error?: ReactNode | RenderProp<KeepListState<TMeta>>;
198
570
  fallback?: KeepErrorBoundaryProps["fallback"];
@@ -223,7 +595,7 @@ type KeepLayoutProps = Omit<HTMLAttributes<HTMLElement>, "children"> & {
223
595
  layout?: KeepLayoutPreset;
224
596
  children?: ReactNode;
225
597
  };
226
- /** A style-free layout wrapper with a stable preset attribute for host or theme CSS. */
598
+ /** A container-aware layout wrapper with a stable preset attribute for host or theme CSS. */
227
599
  declare function KeepLayout({ layout, children, ...props }: KeepLayoutProps): react.JSX.Element;
228
600
 
229
601
  type KeepNoteEditorState<TMeta = Record<string, unknown>> = {
@@ -435,39 +807,13 @@ type KeepThemeProviderProps = {
435
807
  /** Scopes KeepKit tokens and opt-in component styles to one subtree. */
436
808
  declare function KeepThemeProvider({ children, theme, mode, density, radius, accentColor, highContrast, reducedMotion, variables, style, className, asChild, ...props }: KeepThemeProviderProps): react.JSX.Element;
437
809
 
438
- 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" | "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";
439
- type KeepUiLabels = Partial<Record<KeepUiLabelKey, string>>;
440
- type KeepUiLocaleLabels = Record<KeepUiLabelKey, string>;
441
-
442
- 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"];
443
- type KeepUiLocale = (typeof KEEP_BUILT_IN_LOCALES)[number];
444
- declare function getKeepLocaleLabels(locale?: string): KeepUiLocaleLabels;
445
-
446
- type KeepUiLabelContext = {
447
- locale?: string;
448
- labels: Readonly<Record<KeepUiLabelKey, string>>;
449
- customLabels?: KeepUiLabels;
450
- labelResolver?: (key: KeepUiLabelKey, context: {
451
- locale?: string;
452
- }) => string | undefined;
453
- };
454
- type KeepUiProviderProps = {
455
- labels?: KeepUiLabels;
456
- locale?: string;
457
- labelResolver?: KeepUiLabelContext["labelResolver"];
458
- children?: ReactNode;
459
- };
460
- /** Provides one complete locale-aware label source to every UI primitive. */
461
- declare function KeepUiProvider({ labels, locale, labelResolver, children }: KeepUiProviderProps): react.JSX.Element;
462
- declare function useKeepUiLabels(): KeepUiLabelContext;
463
-
464
- type KeepKitProviderProps<TMeta = Record<string, unknown>> = Omit<KeepProviderProps<TMeta>, "children"> & Omit<KeepUiProviderProps, "children"> & Omit<KeepThemeProviderProps, "children"> & {
810
+ type KeepKitProviderProps<TMeta = Record<string, unknown>> = Omit<KeepProviderProps<TMeta>, "children"> & Omit<KeepUiProviderProps<TMeta>, "children"> & Omit<KeepThemeProviderProps, "children"> & {
465
811
  children?: ReactNode;
466
812
  };
467
813
  /** Combines the core store, UI labels, and the global live announcer. */
468
- declare function KeepKitProvider<TMeta = Record<string, unknown>>({ labels, locale, labelResolver, theme, mode, density, radius, accentColor, highContrast, reducedMotion, variables, className: themeClassName, style: themeStyle, asChild: themeAsChild, children, ...providerProps }: KeepKitProviderProps<TMeta>): react.JSX.Element;
814
+ declare function KeepKitProvider<TMeta = Record<string, unknown>>({ labels, locale, labelResolver, onFeedback, theme, mode, density, radius, accentColor, highContrast, reducedMotion, variables, className: themeClassName, style: themeStyle, asChild: themeAsChild, children, ...providerProps }: KeepKitProviderProps<TMeta>): react.JSX.Element;
469
815
 
470
- type CreateKeepKitOptions<TMeta = Record<string, unknown>> = CreateKeepKitOptions$1<TMeta> & Omit<KeepUiProviderProps, "children"> & {
816
+ type CreateKeepKitOptions<TMeta = Record<string, unknown>> = CreateKeepKitOptions$1<TMeta> & Omit<KeepUiProviderProps<TMeta>, "children"> & {
471
817
  theme?: KeepThemeName;
472
818
  mode?: KeepThemeMode;
473
819
  density?: KeepThemeDensity;
@@ -494,4 +840,4 @@ type KeepKit<TMeta = Record<string, unknown>> = {
494
840
  /** Create one typed application API for the core and standard UI layer. */
495
841
  declare function createKeepKit<TMeta = Record<string, unknown>>(options?: CreateKeepKitOptions<TMeta>): KeepKit<TMeta>;
496
842
 
497
- 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, type KeepImageProps, KeepItemCard, type KeepItemCardLinkProps, type KeepItemCardProps, type KeepItemCardState, KeepItemCheckbox, type KeepItemCheckboxProps, KeepItemStatusBadge, type KeepItemStatusBadgeProps, type KeepKit, KeepKitProvider, type KeepKitProviderProps, KeepLayout, type KeepLayoutPreset, type KeepLayoutProps, KeepList, type KeepListProps, type KeepListState, KeepNoteEditor, type KeepNoteEditorProps, type KeepNoteEditorState, type KeepPagesRouterLike, KeepPagination, type KeepPaginationProps, type KeepPaginationState, KeepPruneStaleButton, type KeepPruneStaleButtonProps, 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 KeepUiLabelContext, type KeepUiLabelKey, type KeepUiLabels, type KeepUiLocale, type KeepUiLocaleLabels, KeepUiProvider, type KeepUiProviderProps, KeepUndo, type KeepUndoProps, type KeepUrlAdapter, type RenderProp, createKeepKit, createNextPagesRouterAdapter, getKeepLocaleLabels, isAllSelected, keepThemeNames, toggleSelectAll, useKeepUiLabels, useKeepUrlSync };
843
+ 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, 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, KeepNoteEditor, type KeepNoteEditorProps, type KeepNoteEditorState, type KeepPagesRouterLike, KeepPagination, type KeepPaginationProps, type KeepPaginationState, KeepPruneStaleButton, type KeepPruneStaleButtonProps, 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, 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, isAllSelected, keepThemeNames, toggleSelectAll, useKeepToastFeedback, useKeepUiLabels, useKeepUrlSync };