@keepkit/ui 0.24.0 → 0.25.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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.tsx","../src/adapters/url-sync.tsx","../src/features/actions/KeepArchiveButton.tsx","../src/foundation/ui-context.tsx","../src/locales/de.ts","../src/locales/en.ts","../src/locales/es.ts","../src/locales/fil.ts","../src/locales/fr.ts","../src/locales/id.ts","../src/locales/it.ts","../src/locales/ja.ts","../src/locales/ko.ts","../src/locales/ms.ts","../src/locales/pt-BR.ts","../src/locales/ru.ts","../src/locales/th.ts","../src/locales/vi.ts","../src/locales/zh-Hans.ts","../src/locales/zh-Hant.ts","../src/locales/index.ts","../src/features/actions/hooks/useKeepBackup.ts","../src/features/actions/KeepBackup.tsx","../src/foundation/shared.tsx","../src/features/actions/hooks/useKeepBulkActions.ts","../src/features/actions/KeepItemCheckbox.tsx","../src/features/actions/KeepBulkActions.tsx","../src/features/actions/KeepButton.tsx","../src/features/actions/hooks/useKeepButton.ts","../src/features/actions/KeepSavePopover.tsx","../src/features/editor/KeepQuickEditor.tsx","../src/features/actions/hooks/useKeepUndo.ts","../src/features/actions/KeepUndo.tsx","../src/features/collection/KeepCollection.tsx","../src/features/query/KeepActiveFiltersSummary.tsx","../src/features/query/KeepCollectionFilter.tsx","../src/features/query/KeepTagFilter.tsx","../src/features/query/hooks/useKeepTagFilter.ts","../src/features/query/hooks/useQueryControls.ts","../src/features/query/query-controls.tsx","../src/features/collection/hooks/useKeepCollection.ts","../src/features/collection/KeepList.tsx","../src/features/item/KeepItemCard.tsx","../src/features/item/hooks/useKeepItemStatusBadge.ts","../src/features/item/KeepItemStatusBadge.tsx","../src/features/status/hooks/useKeepStaleNotice.ts","../src/features/status/KeepStaleNotice.tsx","../src/features/item/hooks/useKeepItemCard.ts","../src/features/status/KeepEmptyState.tsx","../src/features/collection/hooks/useKeepListView.ts","../src/features/collection/hooks/useRovingTabIndex.ts","../src/features/collection/KeepLayout.tsx","../src/features/collection/KeepReorderableList.tsx","../src/features/editor/KeepNoteEditor.tsx","../src/features/navigation/KeepShortcutHint.tsx","../src/features/editor/hooks/useKeepNoteEditor.ts","../src/features/editor/hooks/useKeepTagEditor.ts","../src/features/editor/KeepTagEditor.tsx","../src/features/feedback/useKeepToastFeedback.ts","../src/features/navigation/KeepTourBar.tsx","../src/features/navigation/hooks/useKeepTourShortcuts.ts","../src/features/status/status.tsx","../src/features/status/hooks/useStatusViews.ts","../src/features/sync/hooks/useKeepSyncFeedback.ts","../src/features/sync/KeepSyncFeedbackObserver.tsx","../src/features/sync/hooks/useKeepSyncRecoveryDialog.ts","../src/features/sync/KeepSyncRecoveryDialog.tsx","../src/features/sync/hooks/useKeepSyncStatusBanner.ts","../src/features/sync/KeepSyncStatusBanner.tsx","../src/features/workspace/hooks/useKeepWorkspace.ts","../src/features/workspace/KeepWorkspace.tsx","../src/foundation/theme.tsx"],"sourcesContent":["\"use client\";\n\nimport type {\n KeepItem,\n KeepItemInput,\n KeepListQuery,\n KeepScope,\n KeepUndoState,\n KeepUrlSyncOptions,\n} from \"@keepkit/core/core\";\nimport {\n type CreateKeepKitOptions as CoreCreateKeepKitOptions,\n KeepProvider as CoreKeepProvider,\n createKeepKit as createCoreKeepKit,\n type KeepProviderProps,\n type KeepShortcutOptions,\n type UseKeepNavigatorOptions,\n type UseKeepNavigatorResult,\n type useKeepContext,\n type useKeepItem,\n type useKeepList,\n} from \"@keepkit/core/react\";\nimport type { ComponentType, ReactNode } from \"react\";\nimport {\n createNextPagesRouterAdapter,\n type KeepPagesRouterLike,\n type KeepUrlAdapter,\n useKeepUrlSync,\n} from \"./adapters/url-sync\";\nimport {\n KeepArchiveButton,\n type KeepArchiveButtonProps,\n type KeepArchiveButtonState,\n KeepPinButton,\n type KeepPinButtonProps,\n type KeepPinButtonState,\n} from \"./features/actions/KeepArchiveButton\";\nimport { KeepBackup, type KeepBackupProps } from \"./features/actions/KeepBackup\";\nimport {\n KeepBulkActions,\n type KeepBulkActionsProps,\n type KeepBulkActionsState,\n} from \"./features/actions/KeepBulkActions\";\nimport {\n KeepButton,\n type KeepButtonIcon,\n type KeepButtonIconProps,\n type KeepButtonIcons,\n type KeepButtonLabels,\n type KeepButtonProps,\n} from \"./features/actions/KeepButton\";\nimport { KeepItemCheckbox, type KeepItemCheckboxProps } from \"./features/actions/KeepItemCheckbox\";\nimport { KeepSavePopover, type KeepSavePopoverProps } from \"./features/actions/KeepSavePopover\";\nimport { KeepUndo, type KeepUndoProps } from \"./features/actions/KeepUndo\";\nimport {\n KeepCollection,\n type KeepCollectionFeature,\n type KeepCollectionProps,\n type KeepLayoutPreset,\n} from \"./features/collection/KeepCollection\";\nimport { KeepLayout, type KeepLayoutProps } from \"./features/collection/KeepLayout\";\nimport { KeepList, type KeepListProps, type KeepListState } from \"./features/collection/KeepList\";\nimport {\n type KeepReorderableItemState,\n KeepReorderableList,\n type KeepReorderableListProps,\n} from \"./features/collection/KeepReorderableList\";\nimport { KeepNoteEditor, type KeepNoteEditorProps, type KeepNoteEditorState } from \"./features/editor/KeepNoteEditor\";\nimport {\n KeepQuickEditor,\n type KeepQuickEditorProps,\n type KeepQuickEditorState,\n useKeepQuickEditor,\n} from \"./features/editor/KeepQuickEditor\";\nimport { KeepTagEditor, type KeepTagEditorProps, type KeepTagEditorState } from \"./features/editor/KeepTagEditor\";\nimport {\n type KeepToastFeedbackOptions,\n type KeepToastHandler,\n useKeepToastFeedback,\n} from \"./features/feedback/useKeepToastFeedback\";\nimport {\n type KeepImageProps,\n KeepItemCard,\n type KeepItemCardActionSlotProps,\n type KeepItemCardActionsProps,\n type KeepItemCardBadgeProps,\n type KeepItemCardContentProps,\n type KeepItemCardLinkProps,\n type KeepItemCardMediaProps,\n type KeepItemCardProps,\n type KeepItemCardRemoveProps,\n type KeepItemCardSaveProps,\n KeepItemCardSkeleton,\n type KeepItemCardSkeletonProps,\n type KeepItemCardState,\n type KeepItemCardTagsProps,\n type KeepItemCardTitleProps,\n} from \"./features/item/KeepItemCard\";\nimport {\n type KeepDisplayStatus,\n KeepItemStatusBadge,\n type KeepItemStatusBadgeProps,\n} from \"./features/item/KeepItemStatusBadge\";\nimport { KeepShortcutHint, type KeepShortcutHintProps } from \"./features/navigation/KeepShortcutHint\";\nimport { KeepNavigator, KeepTourBar, type KeepTourBarProps } from \"./features/navigation/KeepTourBar\";\nimport {\n KeepActiveFiltersSummary,\n type KeepActiveFiltersSummaryProps,\n type KeepActiveFiltersSummaryState,\n} from \"./features/query/KeepActiveFiltersSummary\";\nimport {\n type KeepCollectionControlProps,\n KeepCollectionFilter,\n type KeepCollectionOption,\n KeepCollectionSelect,\n} from \"./features/query/KeepCollectionFilter\";\nimport { KeepTagFilter, type KeepTagFilterProps, type KeepTagFilterState } from \"./features/query/KeepTagFilter\";\nimport {\n KeepPagination,\n type KeepPaginationProps,\n type KeepPaginationState,\n KeepSearchInput,\n type KeepSearchInputProps,\n KeepSortSelect,\n type KeepSortSelectProps,\n type KeepSortValue,\n} from \"./features/query/query-controls\";\nimport {\n KeepPruneStaleButton,\n type KeepPruneStaleButtonProps,\n KeepStaleNotice,\n type KeepStaleNoticeProps,\n} from \"./features/status/KeepStaleNotice\";\nimport {\n KeepAnnouncements,\n type KeepAnnouncementsProps,\n KeepAnnouncer,\n KeepEmptyState,\n type KeepEmptyStateProps,\n KeepStatus,\n type KeepStatusLabels,\n type KeepStatusProps,\n type KeepStatusState,\n type KeepStatusValue,\n} from \"./features/status/status\";\nimport { KeepSyncFeedbackObserver } from \"./features/sync/KeepSyncFeedbackObserver\";\nimport { KeepSyncRecoveryDialog, type KeepSyncRecoveryDialogProps } from \"./features/sync/KeepSyncRecoveryDialog\";\nimport { KeepSyncStatusBanner, type KeepSyncStatusBannerProps } from \"./features/sync/KeepSyncStatusBanner\";\nimport {\n KeepWorkspace,\n type KeepWorkspaceModule,\n type KeepWorkspacePreset,\n type KeepWorkspaceProps,\n type KeepWorkspaceSlots,\n type KeepWorkspaceState,\n} from \"./features/workspace/KeepWorkspace\";\nimport {\n type KeepThemeDensity,\n type KeepThemeMode,\n type KeepThemeName,\n KeepThemeProvider,\n type KeepThemeProviderProps,\n type KeepThemeRadius,\n type KeepThemeVariables,\n keepThemeNames,\n} from \"./foundation/theme\";\nimport {\n getKeepLocaleLabels,\n type KeepUiFeedbackEvent,\n type KeepUiLabelContext,\n type KeepUiLabelKey,\n type KeepUiLabels,\n type KeepUiLocale,\n type KeepUiLocaleLabels,\n KeepUiProvider,\n type KeepUiProviderProps,\n useKeepUiLabels,\n} from \"./foundation/ui-context\";\n\nexport type { KeepTourShortcutsOptions } from \"./features/navigation/hooks/useKeepTourShortcuts\";\nexport { useKeepTourShortcuts } from \"./features/navigation/hooks/useKeepTourShortcuts\";\n\nexport type KeepKitProviderProps<TMeta = Record<string, unknown>> = Omit<KeepProviderProps<TMeta>, \"children\"> &\n Omit<KeepUiProviderProps<TMeta>, \"children\"> &\n Omit<KeepThemeProviderProps, \"children\"> & { children?: ReactNode };\n\n/** Combines the core store, UI labels, and the global live announcer. */\nexport function KeepKitProvider<TMeta = Record<string, unknown>>({\n labels,\n locale,\n labelResolver,\n onFeedback,\n theme,\n mode,\n density,\n radius,\n accentColor,\n highContrast,\n reducedMotion,\n variables,\n className: themeClassName,\n style: themeStyle,\n asChild: themeAsChild,\n children,\n ...providerProps\n}: KeepKitProviderProps<TMeta>) {\n return (\n <KeepUiProvider<TMeta> labels={labels} locale={locale} labelResolver={labelResolver} onFeedback={onFeedback}>\n <KeepThemeProvider\n theme={theme}\n mode={mode}\n density={density}\n radius={radius}\n accentColor={accentColor}\n highContrast={highContrast}\n reducedMotion={reducedMotion}\n variables={variables}\n className={themeClassName}\n style={themeStyle}\n asChild={themeAsChild}\n >\n <CoreKeepProvider<TMeta> {...providerProps}>\n <KeepSyncFeedbackObserver />\n {children}\n <KeepAnnouncements />\n </CoreKeepProvider>\n </KeepThemeProvider>\n </KeepUiProvider>\n );\n}\n\nexport type {\n AuthenticatedSyncAuthContext,\n AuthenticatedSyncKit,\n AuthenticatedSyncKitOptions,\n AuthenticatedSyncRequestContext,\n AuthenticatedSyncTransport,\n KeepItem,\n KeepItemInput,\n KeepListQuery,\n KeepSyncConflict,\n KeepSyncResolution,\n KeepSyncState,\n KeepSyncStatus,\n} from \"@keepkit/core/core\";\nexport { createAuthenticatedSyncKit } from \"@keepkit/core/core\";\nexport type {\n KeepButtonState,\n KeepContextValue,\n KeepErrorBoundaryProps,\n KeepProviderProps,\n KeepShortcutOptions,\n} from \"@keepkit/core/react\";\nexport {\n KeepErrorBoundary,\n KeepProvider,\n useKeepContext,\n useKeepItem,\n useKeepList,\n useKeepNavigator,\n useKeepShortcut,\n} from \"@keepkit/core/react\";\nexport {\n createBrowserStorageAdapter,\n createStorageAdapter,\n FallbackStorageAdapter,\n IndexedDBAdapter,\n IndexedDBSyncQueueAdapter,\n LocalStorageAdapter,\n LocalStorageSyncQueueAdapter,\n SyncStorageAdapter,\n} from \"@keepkit/core/storage\";\nexport type { KeepSelectionScope } from \"./features/actions/KeepBulkActions\";\nexport { isAllSelected, toggleSelectAll } from \"./features/actions/KeepBulkActions\";\nexport type { KeepEmptyStateVariant } from \"./features/status/KeepEmptyState\";\nexport type { KeepHighlightProps, RenderProp } from \"./foundation/shared\";\nexport {\n chainedFunction,\n composeRefs,\n createSlot,\n highlightText,\n KeepHighlight,\n mergeProps,\n} from \"./foundation/shared\";\nexport type {\n KeepActiveFiltersSummaryProps,\n KeepActiveFiltersSummaryState,\n KeepAnnouncementsProps,\n KeepArchiveButtonProps,\n KeepArchiveButtonState,\n KeepBackupProps,\n KeepBulkActionsProps,\n KeepBulkActionsState,\n KeepButtonIcon,\n KeepButtonIconProps,\n KeepButtonIcons,\n KeepButtonLabels,\n KeepButtonProps,\n KeepCollectionControlProps,\n KeepCollectionFeature,\n KeepCollectionOption,\n KeepCollectionProps,\n KeepDisplayStatus,\n KeepEmptyStateProps,\n KeepImageProps,\n KeepItemCardActionSlotProps,\n KeepItemCardActionsProps,\n KeepItemCardBadgeProps,\n KeepItemCardContentProps,\n KeepItemCardLinkProps,\n KeepItemCardMediaProps,\n KeepItemCardProps,\n KeepItemCardRemoveProps,\n KeepItemCardSaveProps,\n KeepItemCardSkeletonProps,\n KeepItemCardState,\n KeepItemCardTagsProps,\n KeepItemCardTitleProps,\n KeepItemCheckboxProps,\n KeepItemStatusBadgeProps,\n KeepLayoutPreset,\n KeepLayoutProps,\n KeepListProps,\n KeepListState,\n KeepNoteEditorProps,\n KeepNoteEditorState,\n KeepPagesRouterLike,\n KeepPaginationProps,\n KeepPaginationState,\n KeepPinButtonProps,\n KeepPinButtonState,\n KeepPruneStaleButtonProps,\n KeepQuickEditorProps,\n KeepQuickEditorState,\n KeepReorderableItemState,\n KeepReorderableListProps,\n KeepSavePopoverProps,\n KeepScope,\n KeepSearchInputProps,\n KeepShortcutHintProps,\n KeepSortSelectProps,\n KeepSortValue,\n KeepStaleNoticeProps,\n KeepStatusLabels,\n KeepStatusProps,\n KeepStatusState,\n KeepStatusValue,\n KeepSyncRecoveryDialogProps,\n KeepSyncStatusBannerProps,\n KeepTagEditorProps,\n KeepTagEditorState,\n KeepTagFilterProps,\n KeepTagFilterState,\n KeepThemeDensity,\n KeepThemeMode,\n KeepThemeName,\n KeepThemeProviderProps,\n KeepThemeRadius,\n KeepThemeVariables,\n KeepToastFeedbackOptions,\n KeepToastHandler,\n KeepTourBarProps,\n KeepUiFeedbackEvent,\n KeepUiLabelContext,\n KeepUiLabelKey,\n KeepUiLabels,\n KeepUiLocale,\n KeepUiLocaleLabels,\n KeepUiProviderProps,\n KeepUndoProps,\n KeepUndoState,\n KeepUrlAdapter,\n KeepUrlSyncOptions,\n KeepWorkspaceModule,\n KeepWorkspacePreset,\n KeepWorkspaceProps,\n KeepWorkspaceSlots,\n KeepWorkspaceState,\n};\nexport {\n createNextPagesRouterAdapter,\n getKeepLocaleLabels,\n KeepActiveFiltersSummary,\n KeepAnnouncements,\n KeepAnnouncer,\n KeepArchiveButton,\n KeepBackup,\n KeepBulkActions,\n KeepButton,\n KeepCollection,\n KeepCollectionFilter,\n KeepCollectionSelect,\n KeepEmptyState,\n KeepItemCard,\n KeepItemCardSkeleton,\n KeepItemCheckbox,\n KeepItemStatusBadge,\n KeepLayout,\n KeepList,\n KeepNavigator,\n KeepNoteEditor,\n KeepPagination,\n KeepPinButton,\n KeepPruneStaleButton,\n KeepQuickEditor,\n KeepReorderableList,\n KeepSavePopover,\n KeepSearchInput,\n KeepShortcutHint,\n KeepSortSelect,\n KeepStaleNotice,\n KeepStatus,\n KeepSyncRecoveryDialog,\n KeepSyncStatusBanner,\n KeepTagEditor,\n KeepTagFilter,\n KeepThemeProvider,\n KeepTourBar,\n KeepUiProvider,\n KeepUndo,\n KeepWorkspace,\n keepThemeNames,\n useKeepQuickEditor,\n useKeepToastFeedback,\n useKeepUiLabels,\n useKeepUrlSync,\n};\n\nexport type CreateKeepKitOptions<TMeta = Record<string, unknown>> = CoreCreateKeepKitOptions<TMeta> &\n Omit<KeepUiProviderProps<TMeta>, \"children\"> & {\n theme?: KeepThemeName;\n mode?: KeepThemeMode;\n density?: KeepThemeDensity;\n radius?: KeepThemeRadius;\n accentColor?: KeepThemeProviderProps[\"accentColor\"];\n highContrast?: boolean;\n reducedMotion?: boolean;\n variables?: KeepThemeVariables;\n themeClassName?: string;\n themeStyle?: KeepThemeProviderProps[\"style\"];\n getTitle?: (item: KeepItem<TMeta>) => ReactNode;\n getImageProps?: (item: KeepItem<TMeta>, title: ReactNode) => KeepImageProps | undefined;\n };\n\nexport type KeepKit<TMeta = Record<string, unknown>> = {\n Provider: ComponentType<KeepKitProviderProps<TMeta>>;\n Button: ComponentType<KeepButtonProps<TMeta>>;\n Backup: ComponentType<KeepBackupProps<TMeta>>;\n Collection: ComponentType<KeepCollectionProps<TMeta>>;\n Workspace: ComponentType<KeepWorkspaceProps<TMeta>>;\n useContext: () => ReturnType<typeof useKeepContext<TMeta>>;\n useItem: (item?: KeepItemInput<TMeta>) => ReturnType<typeof useKeepItem<TMeta>>;\n useList: (query?: KeepListQuery<TMeta>) => ReturnType<typeof useKeepList<TMeta>>;\n useNavigator: (options?: UseKeepNavigatorOptions<TMeta>) => UseKeepNavigatorResult<TMeta>;\n useShortcut: (options: KeepShortcutOptions<TMeta>) => void;\n};\n\n/** Create one typed application API for the core and standard UI layer. */\nexport function createKeepKit<TMeta = Record<string, unknown>>(\n options: CreateKeepKitOptions<TMeta> = {},\n): KeepKit<TMeta> {\n const {\n labels,\n locale,\n labelResolver,\n onFeedback,\n theme,\n mode,\n density,\n radius,\n accentColor,\n highContrast,\n reducedMotion,\n variables,\n themeClassName,\n themeStyle,\n getTitle,\n getImageProps,\n ...coreOptions\n } = options;\n const coreKit = createCoreKeepKit<TMeta>(coreOptions);\n return {\n Provider: (props) => (\n <KeepKitProvider<TMeta>\n {...coreOptions}\n labels={labels}\n locale={locale}\n labelResolver={labelResolver}\n onFeedback={onFeedback}\n theme={theme}\n mode={mode}\n density={density}\n radius={radius}\n accentColor={accentColor}\n highContrast={highContrast}\n reducedMotion={reducedMotion}\n variables={variables}\n className={themeClassName}\n style={themeStyle}\n {...props}\n />\n ),\n Button: (props) => <KeepButton<TMeta> {...props} />,\n Backup: (props) => <KeepBackup<TMeta> {...props} />,\n Collection: (props) => (\n <KeepCollection<TMeta>\n {...props}\n itemCardProps={{\n ...(getTitle ? { getTitle } : {}),\n ...(getImageProps ? { getImageProps } : {}),\n ...props.itemCardProps,\n }}\n />\n ),\n Workspace: (props) => (\n <KeepWorkspace<TMeta>\n {...props}\n collectionProps={{\n ...props.collectionProps,\n itemCardProps: {\n ...(getTitle ? { getTitle } : {}),\n ...(getImageProps ? { getImageProps } : {}),\n ...props.collectionProps?.itemCardProps,\n },\n }}\n />\n ),\n useContext: () => coreKit.useContext(),\n useItem: (item) => coreKit.useItem(item),\n useList: (query) => coreKit.useList(query),\n useNavigator: (navigatorOptions) => coreKit.useNavigator(navigatorOptions),\n useShortcut: (shortcutOptions) => coreKit.useShortcut(shortcutOptions),\n };\n}\n","\"use client\";\n\nimport type { KeepListQuery } from \"@keepkit/core/core\";\nimport {\n DEFAULT_KEEP_URL_PARAMS,\n decodeKeepListQuery,\n encodeKeepListQuery,\n type KeepUrlSyncOptions,\n} from \"@keepkit/core/core\";\nimport { useEffect, useRef } from \"react\";\n\nexport type KeepUrlAdapter = {\n getUrl: () => string;\n subscribe?: (listener: () => void) => () => void;\n navigate: (url: string, mode: \"replace\" | \"push\") => void;\n};\n\nexport type KeepPagesRouterLike = {\n asPath?: string;\n push: (url: string, as?: string, options?: { shallow?: boolean }) => Promise<boolean> | boolean;\n replace: (url: string, as?: string, options?: { shallow?: boolean }) => Promise<boolean> | boolean;\n events?: { on: (event: string, listener: () => void) => void; off: (event: string, listener: () => void) => void };\n};\n\nexport type KeepUrlSyncProps<TMeta = Record<string, unknown>> = {\n enabled?: boolean;\n query: KeepListQuery<TMeta>;\n onQueryChange: (query: KeepListQuery<TMeta> | ((previous: KeepListQuery<TMeta>) => KeepListQuery<TMeta>)) => void;\n options?: KeepUrlSyncOptions;\n adapter?: KeepUrlAdapter;\n};\n\n/** Adapter for Next.js Pages Router. It intentionally uses structural typing and has no Next dependency. */\nexport function createNextPagesRouterAdapter(router: KeepPagesRouterLike): KeepUrlAdapter {\n const getUrl = () => router.asPath ?? (typeof window === \"undefined\" ? \"/\" : window.location.href);\n return {\n getUrl,\n subscribe: router.events\n ? (listener) => {\n router.events?.on(\"routeChangeComplete\", listener);\n return () => router.events?.off(\"routeChangeComplete\", listener);\n }\n : undefined,\n navigate: (url, mode) => {\n void router[mode](url, undefined, { shallow: true });\n },\n };\n}\n\n/** Synchronizes collection filters with browser history and supports back/forward restoration. */\nexport function useKeepUrlSync<TMeta = Record<string, unknown>>({\n enabled = true,\n query,\n onQueryChange,\n options = {},\n adapter: providedAdapter,\n}: KeepUrlSyncProps<TMeta>): void {\n const browserAdapterRef = useRef<KeepUrlAdapter>(getBrowserAdapter());\n const adapter = providedAdapter ?? browserAdapterRef.current;\n const onQueryChangeRef = useRef(onQueryChange);\n onQueryChangeRef.current = onQueryChange;\n const skipWriteRef = useRef(true);\n const params = options.params;\n\n useEffect(() => {\n if (!enabled) return;\n const read = () => {\n const url = adapter.getUrl();\n const decoded = decodeKeepListQuery(url, { params });\n skipWriteRef.current = true;\n onQueryChangeRef.current((previousQuery) => ({\n ...previousQuery,\n ...(decoded.search ? { search: decoded.search } : { search: undefined }),\n ...(decoded.tags ? { tags: decoded.tags } : { tags: undefined }),\n ...(decoded.sort ? { sort: decoded.sort } : {}),\n ...(decoded.pagination ? { pagination: { ...previousQuery.pagination, ...decoded.pagination } } : {}),\n }));\n };\n read();\n return adapter.subscribe?.(read);\n }, [adapter, enabled, params]);\n\n useEffect(() => {\n if (!enabled) return;\n if (skipWriteRef.current) {\n skipWriteRef.current = false;\n return;\n }\n const currentUrl = new URL(adapter.getUrl(), \"http://keepkit.invalid\");\n const urlParams = { ...DEFAULT_KEEP_URL_PARAMS, ...params };\n for (const key of Object.values(urlParams)) currentUrl.searchParams.delete(key);\n const nextParams = encodeKeepListQuery(query, { params });\n nextParams.forEach((value, key) => {\n currentUrl.searchParams.append(key, value);\n });\n const nextUrl = `${currentUrl.pathname}${currentUrl.search}${currentUrl.hash}`;\n adapter.navigate(nextUrl, options.history ?? \"push\");\n }, [adapter, enabled, options.history, params, query]);\n}\n\nfunction getBrowserAdapter(): KeepUrlAdapter {\n return {\n getUrl: () => (typeof window === \"undefined\" ? \"/\" : window.location.href),\n subscribe: (listener) => {\n if (typeof window === \"undefined\") return () => undefined;\n window.addEventListener(\"popstate\", listener);\n return () => window.removeEventListener(\"popstate\", listener);\n },\n navigate: (url, mode) => {\n if (typeof window === \"undefined\") return;\n window.history[mode === \"push\" ? \"pushState\" : \"replaceState\"]({}, \"\", url);\n },\n };\n}\n","\"use client\";\n\nimport type { KeepItemInput } from \"@keepkit/core/core\";\nimport { useKeepItem } from \"@keepkit/core/react\";\nimport type { ButtonHTMLAttributes, ReactNode } from \"react\";\nimport { useUiLabel } from \"../../foundation/ui-context\";\n\nexport type KeepArchiveButtonState<TMeta = Record<string, unknown>> = ReturnType<typeof useKeepItem<TMeta>>;\n\nexport type KeepArchiveButtonProps<TMeta = Record<string, unknown>> = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"children\" | \"onClick\" | \"aria-pressed\"\n> & {\n item: KeepItemInput<TMeta>;\n children?: ReactNode | ((state: KeepArchiveButtonState<TMeta>) => ReactNode);\n archiveLabel?: ReactNode;\n unarchiveLabel?: ReactNode;\n onToggleError?: (error: unknown) => void;\n};\n\n/** A style-free accessible archive toggle. */\nexport function KeepArchiveButton<TMeta = Record<string, unknown>>({\n item,\n children,\n archiveLabel,\n unarchiveLabel,\n onToggleError,\n disabled,\n ...props\n}: KeepArchiveButtonProps<TMeta>) {\n const state = useKeepItem(item);\n const archive = useUiLabel(\"archive\");\n const unarchive = useUiLabel(\"unarchive\");\n const archivedLabel = useUiLabel(\"archived\");\n const isArchived = state.item?.archived === true;\n const isDisabled = disabled ?? state.isMutating;\n return (\n <button\n {...props}\n type={props.type ?? \"button\"}\n disabled={isDisabled}\n aria-pressed={isArchived}\n data-archived={isArchived ? \"true\" : \"false\"}\n data-keep-action=\"toggle-archive\"\n onClick={() => void state.toggleArchive().catch((error) => onToggleError?.(error))}\n >\n {typeof children === \"function\"\n ? children(state)\n : (children ?? (isArchived ? (unarchiveLabel ?? unarchive) : (archiveLabel ?? archive)))}\n {isArchived && children === undefined ? <span aria-hidden=\"true\"> ({archivedLabel})</span> : null}\n </button>\n );\n}\n\nexport type KeepPinButtonState<TMeta = Record<string, unknown>> = ReturnType<typeof useKeepItem<TMeta>>;\n\nexport type KeepPinButtonProps<TMeta = Record<string, unknown>> = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"children\" | \"onClick\" | \"aria-pressed\"\n> & {\n item: KeepItemInput<TMeta>;\n children?: ReactNode | ((state: KeepPinButtonState<TMeta>) => ReactNode);\n pinLabel?: ReactNode;\n unpinLabel?: ReactNode;\n onToggleError?: (error: unknown) => void;\n};\n\n/** A style-free accessible pin toggle. */\nexport function KeepPinButton<TMeta = Record<string, unknown>>({\n item,\n children,\n pinLabel,\n unpinLabel,\n onToggleError,\n disabled,\n ...props\n}: KeepPinButtonProps<TMeta>) {\n const state = useKeepItem(item);\n const pin = useUiLabel(\"pin\");\n const unpin = useUiLabel(\"unpin\");\n const pinnedLabel = useUiLabel(\"pinned\");\n const isPinned = state.item?.pinned === true;\n const isDisabled = disabled ?? state.isMutating;\n return (\n <button\n {...props}\n type={props.type ?? \"button\"}\n disabled={isDisabled}\n aria-pressed={isPinned}\n data-pinned={isPinned ? \"true\" : \"false\"}\n data-keep-action=\"toggle-pin\"\n onClick={() => void state.togglePin().catch((error) => onToggleError?.(error))}\n >\n {typeof children === \"function\"\n ? children(state)\n : (children ?? (isPinned ? (unpinLabel ?? unpin) : (pinLabel ?? pin)))}\n {isPinned && children === undefined ? <span aria-hidden=\"true\"> ({pinnedLabel})</span> : null}\n </button>\n );\n}\n","\"use client\";\n\nimport type { KeepItem } from \"@keepkit/core/core\";\nimport { createContext, type ReactNode, useCallback, useContext, useMemo } from \"react\";\nimport { getKeepLocaleLabels, KEEP_LOCALE_LABELS, normalizeKeepLocale } from \"../locales\";\nimport type { KeepUiLabelKey, KeepUiLabels, KeepUiLocaleLabels } from \"../locales/types\";\n\nexport type { KeepUiLocale } from \"../locales\";\nexport type { KeepUiLabelKey, KeepUiLabels, KeepUiLocaleLabels } from \"../locales/types\";\n\nexport type KeepUiLabelContext = {\n locale?: string;\n labels: Readonly<Record<KeepUiLabelKey, string>>;\n customLabels?: KeepUiLabels;\n labelResolver?: (key: KeepUiLabelKey, context: { locale?: string }) => string | undefined;\n emitFeedback: <TMeta>(event: KeepUiFeedbackEvent<TMeta>) => void;\n};\n\ntype KeepUiFeedbackBase<TType extends string> = { type: TType; message: string };\n\nexport type KeepUiFeedbackEvent<TMeta = Record<string, unknown>> =\n | (KeepUiFeedbackBase<\"item-saved\"> & { item: KeepItem<TMeta> })\n | (KeepUiFeedbackBase<\"item-removed\"> & {\n item: KeepItem<TMeta>;\n undo: () => void | Promise<void>;\n undoLabel: string;\n })\n | (KeepUiFeedbackBase<\"item-restored\"> & { item?: KeepItem<TMeta>; items: KeepItem<TMeta>[] })\n | KeepUiFeedbackBase<\"sync-completed\">\n | (KeepUiFeedbackBase<\"sync-failed\"> & { error: unknown })\n | (KeepUiFeedbackBase<\"stale-pruned\"> & {\n item?: KeepItem<TMeta>;\n items: KeepItem<TMeta>[];\n undo: () => void | Promise<void>;\n undoLabel: string;\n });\n\nexport const DEFAULT_LABELS: KeepUiLocaleLabels = KEEP_LOCALE_LABELS.en;\n\nconst KeepUiLabelsContext = createContext<KeepUiLabelContext>({\n labels: DEFAULT_LABELS,\n emitFeedback: () => undefined,\n});\n\nexport type KeepUiProviderProps<TMeta = Record<string, unknown>> = {\n labels?: KeepUiLabels;\n locale?: string;\n labelResolver?: KeepUiLabelContext[\"labelResolver\"];\n onFeedback?: (event: KeepUiFeedbackEvent<TMeta>) => void;\n children?: ReactNode;\n};\n\n/** Provides one complete locale-aware label source to every UI primitive. */\nexport function KeepUiProvider<TMeta = Record<string, unknown>>({\n labels,\n locale,\n labelResolver,\n onFeedback,\n children,\n}: KeepUiProviderProps<TMeta>) {\n const emitFeedback = useCallback(\n <TEventMeta,>(event: KeepUiFeedbackEvent<TEventMeta>) => {\n onFeedback?.(event as KeepUiFeedbackEvent<TMeta>);\n },\n [onFeedback],\n );\n const value = useMemo<KeepUiLabelContext>(() => {\n const resolvedLocale = normalizeKeepLocale(locale);\n const dictionary = getKeepLocaleLabels(resolvedLocale);\n const resolved = { ...DEFAULT_LABELS, ...dictionary, ...labels };\n return { locale: locale ?? resolvedLocale, labels: resolved, customLabels: labels, labelResolver, emitFeedback };\n }, [emitFeedback, labelResolver, labels, locale]);\n return <KeepUiLabelsContext.Provider value={value}>{children}</KeepUiLabelsContext.Provider>;\n}\n\nexport function useKeepUiLabels(): KeepUiLabelContext {\n return useContext(KeepUiLabelsContext);\n}\n\nexport function useUiLabel(key: KeepUiLabelKey, override?: string): string {\n const context = useKeepUiLabels();\n return (\n override ??\n context.customLabels?.[key] ??\n context.labelResolver?.(key, { locale: context.locale }) ??\n context.labels[key]\n );\n}\n\nexport function useKeepUiFeedback<TMeta = Record<string, unknown>>() {\n const { emitFeedback } = useKeepUiLabels();\n return useCallback((event: KeepUiFeedbackEvent<TMeta>) => emitFeedback(event), [emitFeedback]);\n}\n\nexport { getKeepLocaleLabels };\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const DE_LABELS: KeepUiLocaleLabels = {\n archive: \"Archivieren\",\n unarchive: \"Archivierung aufheben\",\n archived: \"Archiviert\",\n pin: \"Anheften\",\n unpin: \"Anheften lösen\",\n pinned: \"Angeheftet\",\n collection: \"Sammlung\",\n allCollections: \"Alle Sammlungen\",\n filterCollections: \"Nach Sammlung filtern\",\n uncategorized: \"Nicht kategorisiert\",\n saveWithNote: \"Mit Notiz speichern\",\n editSavedItem: \"Gespeichertes Element bearbeiten\",\n unsavedChanges: \"Nicht gespeicherte Änderungen\",\n save: \"Speichern\",\n saved: \"Gespeichert\",\n remove: \"Entfernen\",\n loading: \"Wird geladen…\",\n saving: \"Wird gespeichert…\",\n syncing: \"Wird synchronisiert…\",\n error: \"Ein Fehler ist aufgetreten.\",\n allTags: \"Alle\",\n tags: \"Tags\",\n filterTags: \"Gespeicherte Elemente nach Tag filtern\",\n activeFilters: \"Aktive Filter\",\n clearFilters: \"Filter löschen\",\n clearAllFilters: \"Alle Filter löschen\",\n removeFilter: \"entfernen\",\n noFilteredItems: \"Keine passenden Elemente gefunden.\",\n noFilteredItemsDescription: \"Passe die Suche an oder entferne einen Tag-Filter.\",\n emptyStorageDescription: \"Speichere ein Element, damit es hier angezeigt wird.\",\n note: \"Notiz\",\n saveNote: \"Notiz speichern\",\n noItems: \"Keine gespeicherten Elemente.\",\n loadingItems: \"Gespeicherte Elemente werden geladen…\",\n errorItems: \"Gespeicherte Elemente konnten nicht geladen werden.\",\n search: \"Gespeicherte Elemente durchsuchen\",\n sort: \"Gespeicherte Elemente sortieren\",\n newest: \"Neueste zuerst\",\n oldest: \"Älteste zuerst\",\n savedNewest: \"Zuletzt gespeichert zuerst\",\n savedOldest: \"Am längsten gespeichert zuerst\",\n updatedNewest: \"Zuletzt aktualisiert zuerst\",\n updatedOldest: \"Am längsten nicht aktualisiert zuerst\",\n previousPage: \"Vorherige Seite\",\n nextPage: \"Nächste Seite\",\n pagination: \"Seitennavigation\",\n page: \"Seite\",\n selectItems: \"Gespeicherte Elemente auswählen\",\n selectedCount: \"ausgewählt\",\n deleteSelected: \"Auswahl löschen\",\n tagsToApply: \"Anzuwendende Tags\",\n applyTags: \"Tags anwenden\",\n savedMessage: \"Element gespeichert.\",\n removedMessage: \"Element entfernt.\",\n restoredMessage: \"Element wiederhergestellt.\",\n syncFailedMessage: \"Synchronisierung fehlgeschlagen.\",\n stalePrunedMessage: \"Nicht verfügbare Elemente entfernt.\",\n undo: \"Rückgängig\",\n undoAvailable: \"Element entfernt. Rückgängig machen?\",\n selectionScope: \"Auswahlbereich\",\n currentPage: \"Aktuelle Seite\",\n searchResults: \"Aktuelle Suchergebnisse\",\n allItems: \"Alle gespeicherten Elemente\",\n localVersion: \"Lokal\",\n remoteVersion: \"Server\",\n updatedAt: \"Aktualisiert\",\n statusAvailable: \"Verfügbar\",\n noteSavedMessage: \"Notiz gespeichert.\",\n exportData: \"JSON exportieren\",\n importData: \"JSON importieren\",\n importMode: \"Importmodus\",\n merge: \"Zusammenführen\",\n replace: \"Ersetzen\",\n importedCount: \"Elemente importiert\",\n failedCount: \"Elemente fehlgeschlagen\",\n storageQuotaError: \"Der Speicher ist voll. Schaffen Sie Speicherplatz und versuchen Sie es erneut.\",\n statusExpired: \"Abgelaufen\",\n statusRemoved: \"Entfernt\",\n statusDeleted: \"Gelöscht\",\n statusPrivate: \"Privat\",\n statusUnknown: \"Nicht verfügbar\",\n retry: \"Erneut versuchen\",\n removeFromList: \"Aus Liste entfernen\",\n pruneStale: \"Nicht verfügbare Elemente entfernen\",\n retrySync: \"Synchronisierung erneut versuchen\",\n resolveSync: \"Konflikte lösen\",\n keepLocal: \"Lokale Version behalten\",\n useServer: \"Serverversion verwenden\",\n manualMerge: \"Manuell zusammenführen\",\n close: \"Schließen\",\n backupRecovery: \"Aus Backup wiederherstellen\",\n backupRecoveryDescription:\n \"Wenn lokale Synchronisierungsdaten beschädigt sind, stellen Sie ein gültiges JSON-Backup wieder her.\",\n syncPending: \"Änderungen warten auf die Synchronisierung.\",\n syncSynced: \"Alle Änderungen sind synchronisiert.\",\n syncConflict: \"Einige Änderungen benötigen eine Konfliktlösung.\",\n};\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const EN_LABELS: KeepUiLocaleLabels = {\n archive: \"Archive\",\n unarchive: \"Unarchive\",\n archived: \"Archived\",\n pin: \"Pin\",\n unpin: \"Unpin\",\n pinned: \"Pinned\",\n collection: \"Collection\",\n allCollections: \"All collections\",\n filterCollections: \"Filter collections\",\n uncategorized: \"Uncategorized\",\n saveWithNote: \"Save with note\",\n editSavedItem: \"Edit saved item\",\n unsavedChanges: \"Unsaved changes\",\n save: \"Save\",\n saved: \"Saved\",\n remove: \"Remove\",\n loading: \"Loading…\",\n saving: \"Saving…\",\n syncing: \"Syncing…\",\n error: \"Something went wrong.\",\n allTags: \"All\",\n tags: \"Tags\",\n filterTags: \"Filter saved items by tag\",\n activeFilters: \"Active filters\",\n clearFilters: \"Clear filters\",\n clearAllFilters: \"Clear all filters\",\n removeFilter: \"Remove\",\n noFilteredItems: \"No matching items found.\",\n noFilteredItemsDescription: \"Try adjusting your search or removing a tag filter.\",\n emptyStorageDescription: \"Save an item to see it here.\",\n note: \"Note\",\n saveNote: \"Save note\",\n noItems: \"No saved items.\",\n loadingItems: \"Loading saved items…\",\n errorItems: \"Could not load saved items.\",\n search: \"Search saved items\",\n sort: \"Sort saved items\",\n newest: \"Newest first\",\n oldest: \"Oldest first\",\n savedNewest: \"Saved newest first\",\n savedOldest: \"Saved oldest first\",\n updatedNewest: \"Updated newest first\",\n updatedOldest: \"Updated oldest first\",\n previousPage: \"Previous page\",\n nextPage: \"Next page\",\n pagination: \"Pagination\",\n page: \"Page\",\n selectItems: \"Select saved items\",\n selectedCount: \"selected\",\n deleteSelected: \"Delete selected\",\n tagsToApply: \"Tags to apply\",\n applyTags: \"Apply tags\",\n savedMessage: \"Item saved.\",\n removedMessage: \"Item removed.\",\n restoredMessage: \"Item restored.\",\n syncFailedMessage: \"Sync failed.\",\n stalePrunedMessage: \"Unavailable items removed.\",\n undo: \"Undo\",\n undoAvailable: \"Item removed. Undo?\",\n selectionScope: \"Selection scope\",\n currentPage: \"Current page\",\n searchResults: \"Current search results\",\n allItems: \"All saved items\",\n localVersion: \"Local\",\n remoteVersion: \"Remote\",\n updatedAt: \"Updated\",\n statusAvailable: \"Available\",\n noteSavedMessage: \"Note saved.\",\n exportData: \"Export JSON\",\n importData: \"Import JSON\",\n importMode: \"Import mode\",\n merge: \"Merge\",\n replace: \"Replace\",\n importedCount: \"items imported\",\n failedCount: \"items failed\",\n storageQuotaError: \"Storage is full. Free space and try again.\",\n statusExpired: \"Expired\",\n statusRemoved: \"Removed\",\n statusDeleted: \"Deleted\",\n statusPrivate: \"Private\",\n statusUnknown: \"Unavailable\",\n retry: \"Retry\",\n removeFromList: \"Remove from list\",\n pruneStale: \"Remove unavailable items\",\n retrySync: \"Retry sync\",\n resolveSync: \"Resolve conflicts\",\n keepLocal: \"Keep local\",\n useServer: \"Use server\",\n manualMerge: \"Manual merge\",\n close: \"Close\",\n backupRecovery: \"Restore from backup\",\n backupRecoveryDescription: \"If local sync data is damaged, restore a known-good JSON backup.\",\n syncPending: \"Changes are waiting to sync.\",\n syncSynced: \"All changes are synced.\",\n syncConflict: \"Some changes need conflict resolution.\",\n};\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const ES_LABELS: KeepUiLocaleLabels = {\n archive: \"Archivar\",\n unarchive: \"Desarchivar\",\n archived: \"Archivado\",\n pin: \"Fijar\",\n unpin: \"Desfijar\",\n pinned: \"Fijado\",\n collection: \"Colección\",\n allCollections: \"Todas las colecciones\",\n filterCollections: \"Filtrar por colección\",\n uncategorized: \"Sin categoría\",\n saveWithNote: \"Guardar con nota\",\n editSavedItem: \"Editar elemento guardado\",\n unsavedChanges: \"Cambios sin guardar\",\n save: \"Guardar\",\n saved: \"Guardado\",\n remove: \"Eliminar\",\n loading: \"Cargando…\",\n saving: \"Guardando…\",\n syncing: \"Sincronizando…\",\n error: \"Se produjo un error.\",\n allTags: \"Todos\",\n tags: \"Etiquetas\",\n filterTags: \"Filtrar elementos guardados por etiqueta\",\n activeFilters: \"Filtros activos\",\n clearFilters: \"Borrar filtros\",\n clearAllFilters: \"Borrar todos los filtros\",\n removeFilter: \"quitar\",\n noFilteredItems: \"No se encontraron elementos coincidentes.\",\n noFilteredItemsDescription: \"Ajusta la búsqueda o quita un filtro de etiqueta.\",\n emptyStorageDescription: \"Guarda un elemento para verlo aquí.\",\n note: \"Nota\",\n saveNote: \"Guardar nota\",\n noItems: \"No hay elementos guardados.\",\n loadingItems: \"Cargando elementos guardados…\",\n errorItems: \"No se pudieron cargar los elementos guardados.\",\n search: \"Buscar elementos guardados\",\n sort: \"Ordenar elementos guardados\",\n newest: \"Más recientes primero\",\n oldest: \"Más antiguos primero\",\n savedNewest: \"Guardados más recientemente primero\",\n savedOldest: \"Guardados más antiguos primero\",\n updatedNewest: \"Actualizados más recientemente primero\",\n updatedOldest: \"Actualizados más antiguos primero\",\n previousPage: \"Página anterior\",\n nextPage: \"Página siguiente\",\n pagination: \"Paginación\",\n page: \"Página\",\n selectItems: \"Seleccionar elementos guardados\",\n selectedCount: \"seleccionados\",\n deleteSelected: \"Eliminar seleccionados\",\n tagsToApply: \"Etiquetas que aplicar\",\n applyTags: \"Aplicar etiquetas\",\n savedMessage: \"Elemento guardado.\",\n removedMessage: \"Elemento eliminado.\",\n restoredMessage: \"Elemento restaurado.\",\n syncFailedMessage: \"Error de sincronización.\",\n stalePrunedMessage: \"Elementos no disponibles eliminados.\",\n undo: \"Deshacer\",\n undoAvailable: \"Elemento eliminado. ¿Deshacer?\",\n selectionScope: \"Ámbito de selección\",\n currentPage: \"Página actual\",\n searchResults: \"Resultados de búsqueda actuales\",\n allItems: \"Todos los elementos guardados\",\n localVersion: \"Local\",\n remoteVersion: \"Servidor\",\n updatedAt: \"Actualizado\",\n statusAvailable: \"Disponible\",\n noteSavedMessage: \"Nota guardada.\",\n exportData: \"Exportar JSON\",\n importData: \"Importar JSON\",\n importMode: \"Modo de importación\",\n merge: \"Combinar\",\n replace: \"Reemplazar\",\n importedCount: \"elementos importados\",\n failedCount: \"elementos fallidos\",\n storageQuotaError: \"El almacenamiento está lleno. Libere espacio y vuelva a intentarlo.\",\n statusExpired: \"Caducado\",\n statusRemoved: \"Eliminado\",\n statusDeleted: \"Borrado\",\n statusPrivate: \"Privado\",\n statusUnknown: \"No disponible\",\n retry: \"Reintentar\",\n removeFromList: \"Quitar de la lista\",\n pruneStale: \"Quitar elementos no disponibles\",\n retrySync: \"Reintentar sincronización\",\n resolveSync: \"Resolver conflictos\",\n keepLocal: \"Conservar versión local\",\n useServer: \"Usar versión del servidor\",\n manualMerge: \"Combinar manualmente\",\n close: \"Cerrar\",\n backupRecovery: \"Restaurar desde copia de seguridad\",\n backupRecoveryDescription: \"Si los datos locales están dañados, restaura una copia JSON válida.\",\n syncPending: \"Hay cambios pendientes de sincronización.\",\n syncSynced: \"Todos los cambios están sincronizados.\",\n syncConflict: \"Algunos cambios necesitan resolver un conflicto.\",\n};\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const FIL_LABELS: KeepUiLocaleLabels = {\n archive: \"I-archive\",\n unarchive: \"Alisin sa archive\",\n archived: \"Naka-archive\",\n pin: \"I-pin\",\n unpin: \"Alisin ang pin\",\n pinned: \"Naka-pin\",\n collection: \"Koleksyon\",\n allCollections: \"Lahat ng koleksyon\",\n filterCollections: \"I-filter ayon sa koleksyon\",\n uncategorized: \"Walang kategorya\",\n saveWithNote: \"I-save na may tala\",\n editSavedItem: \"I-edit ang naka-save na item\",\n unsavedChanges: \"Mga hindi pa nai-save na pagbabago\",\n save: \"I-save\",\n saved: \"Nai-save\",\n remove: \"Alisin\",\n loading: \"Naglo-load…\",\n saving: \"Sini-save…\",\n syncing: \"Sini-sync…\",\n error: \"May naganap na error.\",\n allTags: \"Lahat\",\n tags: \"Mga tag\",\n filterTags: \"I-filter ang mga naka-save na item ayon sa tag\",\n activeFilters: \"Mga aktibong filter\",\n clearFilters: \"I-clear ang mga filter\",\n clearAllFilters: \"I-clear ang lahat ng filter\",\n removeFilter: \"alisin\",\n noFilteredItems: \"Walang nakitang tumutugmang item.\",\n noFilteredItemsDescription: \"Baguhin ang paghahanap o alisin ang filter ng tag.\",\n emptyStorageDescription: \"Mag-save ng item para makita ito rito.\",\n note: \"Tala\",\n saveNote: \"I-save ang tala\",\n noItems: \"Walang naka-save na item.\",\n loadingItems: \"Nilo-load ang mga naka-save na item…\",\n errorItems: \"Hindi ma-load ang mga naka-save na item.\",\n search: \"Maghanap ng naka-save na item\",\n sort: \"Ayusin ang mga naka-save na item\",\n newest: \"Pinakabago muna\",\n oldest: \"Pinakaluma muna\",\n savedNewest: \"Pinakabagong na-save muna\",\n savedOldest: \"Pinakamatagal na naka-save muna\",\n updatedNewest: \"Pinakabagong na-update muna\",\n updatedOldest: \"Pinakamatagal na hindi na-update muna\",\n previousPage: \"Nakaraang pahina\",\n nextPage: \"Susunod na pahina\",\n pagination: \"Pagpapa-pahina\",\n page: \"Pahina\",\n selectItems: \"Pumili ng naka-save na item\",\n selectedCount: \"napili\",\n deleteSelected: \"Tanggalin ang napili\",\n tagsToApply: \"Mga tag na ilalapat\",\n applyTags: \"Ilapat ang mga tag\",\n savedMessage: \"Na-save ang item.\",\n removedMessage: \"Inalis ang item.\",\n restoredMessage: \"Naibalik ang item.\",\n syncFailedMessage: \"Hindi nagtagumpay ang pag-sync.\",\n stalePrunedMessage: \"Inalis ang mga hindi available na item.\",\n undo: \"I-undo\",\n undoAvailable: \"Inalis ang item. I-undo?\",\n selectionScope: \"Saklaw ng pagpili\",\n currentPage: \"Kasalukuyang pahina\",\n searchResults: \"Kasalukuyang resulta ng paghahanap\",\n allItems: \"Lahat ng naka-save na item\",\n localVersion: \"Lokal\",\n remoteVersion: \"Remote\",\n updatedAt: \"Na-update\",\n statusAvailable: \"Available\",\n noteSavedMessage: \"Na-save ang tala.\",\n exportData: \"I-export ang JSON\",\n importData: \"I-import ang JSON\",\n importMode: \"Mode ng pag-import\",\n merge: \"Pagsamahin\",\n replace: \"Palitan\",\n importedCount: \"item ang na-import\",\n failedCount: \"item ang nabigo\",\n storageQuotaError: \"Puno na ang storage. Magbakante ng espasyo at subukan muli.\",\n statusExpired: \"Nag-expire\",\n statusRemoved: \"Inalis\",\n statusDeleted: \"Tinanggal\",\n statusPrivate: \"Pribado\",\n statusUnknown: \"Hindi available\",\n retry: \"Subukan muli\",\n removeFromList: \"Alisin sa listahan\",\n pruneStale: \"Alisin ang hindi available na item\",\n retrySync: \"Subukan muli ang sync\",\n resolveSync: \"Ayusin ang mga conflict\",\n keepLocal: \"Panatilihin ang lokal\",\n useServer: \"Gamitin ang server\",\n manualMerge: \"Manwal na pagsamahin\",\n close: \"Isara\",\n backupRecovery: \"I-restore mula sa backup\",\n backupRecoveryDescription: \"Kung sira ang lokal na sync data, mag-restore ng gumaganang JSON backup.\",\n syncPending: \"May mga pagbabagong naghihintay ng sync.\",\n syncSynced: \"Naka-sync na ang lahat ng pagbabago.\",\n syncConflict: \"May mga pagbabagong kailangang ayusin ang conflict.\",\n};\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const FR_LABELS: KeepUiLocaleLabels = {\n archive: \"Archiver\",\n unarchive: \"Désarchiver\",\n archived: \"Archivé\",\n pin: \"Épingler\",\n unpin: \"Désépingler\",\n pinned: \"Épinglé\",\n collection: \"Collection\",\n allCollections: \"Toutes les collections\",\n filterCollections: \"Filtrer par collection\",\n uncategorized: \"Non classé\",\n saveWithNote: \"Enregistrer avec une note\",\n editSavedItem: \"Modifier l’élément enregistré\",\n unsavedChanges: \"Modifications non enregistrées\",\n save: \"Enregistrer\",\n saved: \"Enregistré\",\n remove: \"Supprimer\",\n loading: \"Chargement…\",\n saving: \"Enregistrement…\",\n syncing: \"Synchronisation…\",\n error: \"Une erreur s’est produite.\",\n allTags: \"Tous\",\n tags: \"Étiquettes\",\n filterTags: \"Filtrer les éléments enregistrés par étiquette\",\n activeFilters: \"Filtres actifs\",\n clearFilters: \"Effacer les filtres\",\n clearAllFilters: \"Effacer tous les filtres\",\n removeFilter: \"supprimer\",\n noFilteredItems: \"Aucun élément correspondant trouvé.\",\n noFilteredItemsDescription: \"Modifiez votre recherche ou supprimez un filtre de tag.\",\n emptyStorageDescription: \"Enregistrez un élément pour le voir ici.\",\n note: \"Note\",\n saveNote: \"Enregistrer la note\",\n noItems: \"Aucun élément enregistré.\",\n loadingItems: \"Chargement des éléments enregistrés…\",\n errorItems: \"Impossible de charger les éléments enregistrés.\",\n search: \"Rechercher des éléments enregistrés\",\n sort: \"Trier les éléments enregistrés\",\n newest: \"Plus récent d’abord\",\n oldest: \"Plus ancien d’abord\",\n savedNewest: \"Enregistrement le plus récent d’abord\",\n savedOldest: \"Enregistrement le plus ancien d’abord\",\n updatedNewest: \"Mise à jour la plus récente d’abord\",\n updatedOldest: \"Mise à jour la plus ancienne d’abord\",\n previousPage: \"Page précédente\",\n nextPage: \"Page suivante\",\n pagination: \"Pagination\",\n page: \"Page\",\n selectItems: \"Sélectionner les éléments enregistrés\",\n selectedCount: \"sélectionnés\",\n deleteSelected: \"Supprimer la sélection\",\n tagsToApply: \"Étiquettes à appliquer\",\n applyTags: \"Appliquer les étiquettes\",\n savedMessage: \"Élément enregistré.\",\n removedMessage: \"Élément supprimé.\",\n restoredMessage: \"Élément restauré.\",\n syncFailedMessage: \"Échec de la synchronisation.\",\n stalePrunedMessage: \"Éléments indisponibles supprimés.\",\n undo: \"Annuler\",\n undoAvailable: \"Élément supprimé. Annuler ?\",\n selectionScope: \"Portée de la sélection\",\n currentPage: \"Page actuelle\",\n searchResults: \"Résultats de recherche actuels\",\n allItems: \"Tous les éléments enregistrés\",\n localVersion: \"Local\",\n remoteVersion: \"Distant\",\n updatedAt: \"Mis à jour\",\n statusAvailable: \"Disponible\",\n noteSavedMessage: \"Note enregistrée.\",\n exportData: \"Exporter JSON\",\n importData: \"Importer JSON\",\n importMode: \"Mode d’importation\",\n merge: \"Fusionner\",\n replace: \"Remplacer\",\n importedCount: \"éléments importés\",\n failedCount: \"éléments en échec\",\n storageQuotaError: \"Le stockage est plein. Libérez de l’espace et réessayez.\",\n statusExpired: \"Expiré\",\n statusRemoved: \"Supprimé\",\n statusDeleted: \"Effacé\",\n statusPrivate: \"Privé\",\n statusUnknown: \"Indisponible\",\n retry: \"Réessayer\",\n removeFromList: \"Retirer de la liste\",\n pruneStale: \"Retirer les éléments indisponibles\",\n retrySync: \"Réessayer la synchronisation\",\n resolveSync: \"Résoudre les conflits\",\n keepLocal: \"Garder la version locale\",\n useServer: \"Utiliser la version serveur\",\n manualMerge: \"Fusion manuelle\",\n close: \"Fermer\",\n backupRecovery: \"Restaurer depuis une sauvegarde\",\n backupRecoveryDescription: \"Si les données locales sont endommagées, restaurez une sauvegarde JSON valide.\",\n syncPending: \"Des modifications attendent la synchronisation.\",\n syncSynced: \"Toutes les modifications sont synchronisées.\",\n syncConflict: \"Certaines modifications nécessitent une résolution de conflit.\",\n};\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const ID_LABELS: KeepUiLocaleLabels = {\n archive: \"Arsipkan\",\n unarchive: \"Batalkan arsip\",\n archived: \"Diarsipkan\",\n pin: \"Sematkan\",\n unpin: \"Lepas sematan\",\n pinned: \"Disematkan\",\n collection: \"Koleksi\",\n allCollections: \"Semua koleksi\",\n filterCollections: \"Filter koleksi\",\n uncategorized: \"Tanpa kategori\",\n saveWithNote: \"Simpan dengan catatan\",\n editSavedItem: \"Edit item tersimpan\",\n unsavedChanges: \"Perubahan belum disimpan\",\n save: \"Simpan\",\n saved: \"Tersimpan\",\n remove: \"Hapus\",\n loading: \"Memuat…\",\n saving: \"Menyimpan…\",\n syncing: \"Menyinkronkan…\",\n error: \"Terjadi kesalahan.\",\n allTags: \"Semua\",\n tags: \"Tag\",\n filterTags: \"Filter item tersimpan berdasarkan tag\",\n activeFilters: \"Filter aktif\",\n clearFilters: \"Hapus filter\",\n clearAllFilters: \"Hapus semua filter\",\n removeFilter: \"hapus\",\n noFilteredItems: \"Tidak ada item yang cocok.\",\n noFilteredItemsDescription: \"Ubah pencarian atau hapus filter tag.\",\n emptyStorageDescription: \"Simpan item untuk melihatnya di sini.\",\n note: \"Catatan\",\n saveNote: \"Simpan catatan\",\n noItems: \"Belum ada item tersimpan.\",\n loadingItems: \"Memuat item tersimpan…\",\n errorItems: \"Tidak dapat memuat item tersimpan.\",\n search: \"Cari item tersimpan\",\n sort: \"Urutkan item tersimpan\",\n newest: \"Terbaru dahulu\",\n oldest: \"Terlama dahulu\",\n savedNewest: \"Paling baru disimpan dahulu\",\n savedOldest: \"Paling lama disimpan dahulu\",\n updatedNewest: \"Paling baru diperbarui dahulu\",\n updatedOldest: \"Paling lama diperbarui dahulu\",\n previousPage: \"Halaman sebelumnya\",\n nextPage: \"Halaman berikutnya\",\n pagination: \"Paginasi\",\n page: \"Halaman\",\n selectItems: \"Pilih item tersimpan\",\n selectedCount: \"dipilih\",\n deleteSelected: \"Hapus yang dipilih\",\n tagsToApply: \"Tag yang akan diterapkan\",\n applyTags: \"Terapkan tag\",\n savedMessage: \"Item tersimpan.\",\n removedMessage: \"Item dihapus.\",\n restoredMessage: \"Item dipulihkan.\",\n syncFailedMessage: \"Sinkronisasi gagal.\",\n stalePrunedMessage: \"Item yang tidak tersedia dihapus.\",\n undo: \"Urungkan\",\n undoAvailable: \"Item dihapus. Urungkan?\",\n selectionScope: \"Cakupan pilihan\",\n currentPage: \"Halaman saat ini\",\n searchResults: \"Hasil pencarian saat ini\",\n allItems: \"Semua item tersimpan\",\n localVersion: \"Lokal\",\n remoteVersion: \"Server\",\n updatedAt: \"Diperbarui\",\n statusAvailable: \"Tersedia\",\n noteSavedMessage: \"Catatan tersimpan.\",\n exportData: \"Ekspor JSON\",\n importData: \"Impor JSON\",\n importMode: \"Mode impor\",\n merge: \"Gabungkan\",\n replace: \"Ganti\",\n importedCount: \"item diimpor\",\n failedCount: \"item gagal\",\n storageQuotaError: \"Penyimpanan penuh. Kosongkan ruang lalu coba lagi.\",\n statusExpired: \"Kedaluwarsa\",\n statusRemoved: \"Dihapus\",\n statusDeleted: \"Terhapus\",\n statusPrivate: \"Pribadi\",\n statusUnknown: \"Tidak tersedia\",\n retry: \"Coba lagi\",\n removeFromList: \"Hapus dari daftar\",\n pruneStale: \"Hapus item yang tidak tersedia\",\n retrySync: \"Coba sinkronisasi lagi\",\n resolveSync: \"Selesaikan konflik\",\n keepLocal: \"Pertahankan versi lokal\",\n useServer: \"Gunakan versi server\",\n manualMerge: \"Gabungkan manual\",\n close: \"Tutup\",\n backupRecovery: \"Pulihkan dari cadangan\",\n backupRecoveryDescription: \"Jika data sinkronisasi lokal rusak, pulihkan cadangan JSON yang valid.\",\n syncPending: \"Ada perubahan yang menunggu sinkronisasi.\",\n syncSynced: \"Semua perubahan telah disinkronkan.\",\n syncConflict: \"Beberapa perubahan memerlukan penyelesaian konflik.\",\n};\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const IT_LABELS: KeepUiLocaleLabels = {\n archive: \"Archivia\",\n unarchive: \"Rimuovi dall'archivio\",\n archived: \"Archiviato\",\n pin: \"Fissa\",\n unpin: \"Rimuovi fissaggio\",\n pinned: \"Fissato\",\n collection: \"Raccolta\",\n allCollections: \"Tutte le raccolte\",\n filterCollections: \"Filtra per raccolta\",\n uncategorized: \"Senza categoria\",\n saveWithNote: \"Salva con nota\",\n editSavedItem: \"Modifica elemento salvato\",\n unsavedChanges: \"Modifiche non salvate\",\n save: \"Salva\",\n saved: \"Salvato\",\n remove: \"Rimuovi\",\n loading: \"Caricamento…\",\n saving: \"Salvataggio…\",\n syncing: \"Sincronizzazione…\",\n error: \"Si è verificato un errore.\",\n allTags: \"Tutti\",\n tags: \"Tag\",\n filterTags: \"Filtra gli elementi salvati per tag\",\n activeFilters: \"Filtri attivi\",\n clearFilters: \"Cancella filtri\",\n clearAllFilters: \"Cancella tutti i filtri\",\n removeFilter: \"rimuovi\",\n noFilteredItems: \"Nessun elemento corrispondente trovato.\",\n noFilteredItemsDescription: \"Modifica la ricerca o rimuovi un filtro tag.\",\n emptyStorageDescription: \"Salva un elemento per visualizzarlo qui.\",\n note: \"Nota\",\n saveNote: \"Salva nota\",\n noItems: \"Nessun elemento salvato.\",\n loadingItems: \"Caricamento degli elementi salvati…\",\n errorItems: \"Impossibile caricare gli elementi salvati.\",\n search: \"Cerca elementi salvati\",\n sort: \"Ordina elementi salvati\",\n newest: \"Più recenti prima\",\n oldest: \"Più vecchi prima\",\n savedNewest: \"Salvati più di recente prima\",\n savedOldest: \"Salvati meno di recente prima\",\n updatedNewest: \"Aggiornati più di recente prima\",\n updatedOldest: \"Aggiornati meno di recente prima\",\n previousPage: \"Pagina precedente\",\n nextPage: \"Pagina successiva\",\n pagination: \"Paginazione\",\n page: \"Pagina\",\n selectItems: \"Seleziona elementi salvati\",\n selectedCount: \"selezionati\",\n deleteSelected: \"Elimina selezionati\",\n tagsToApply: \"Tag da applicare\",\n applyTags: \"Applica tag\",\n savedMessage: \"Elemento salvato.\",\n removedMessage: \"Elemento rimosso.\",\n restoredMessage: \"Elemento ripristinato.\",\n syncFailedMessage: \"Sincronizzazione non riuscita.\",\n stalePrunedMessage: \"Elementi non disponibili rimossi.\",\n undo: \"Annulla\",\n undoAvailable: \"Elemento rimosso. Annullare?\",\n selectionScope: \"Ambito della selezione\",\n currentPage: \"Pagina corrente\",\n searchResults: \"Risultati di ricerca correnti\",\n allItems: \"Tutti gli elementi salvati\",\n localVersion: \"Locale\",\n remoteVersion: \"Server\",\n updatedAt: \"Aggiornato\",\n statusAvailable: \"Disponibile\",\n noteSavedMessage: \"Nota salvata.\",\n exportData: \"Esporta JSON\",\n importData: \"Importa JSON\",\n importMode: \"Modalità di importazione\",\n merge: \"Unisci\",\n replace: \"Sostituisci\",\n importedCount: \"elementi importati\",\n failedCount: \"elementi non riusciti\",\n storageQuotaError: \"Lo spazio di archiviazione è pieno. Libera spazio e riprova.\",\n statusExpired: \"Scaduto\",\n statusRemoved: \"Rimosso\",\n statusDeleted: \"Eliminato\",\n statusPrivate: \"Privato\",\n statusUnknown: \"Non disponibile\",\n retry: \"Riprova\",\n removeFromList: \"Rimuovi dall'elenco\",\n pruneStale: \"Rimuovi elementi non disponibili\",\n retrySync: \"Riprova sincronizzazione\",\n resolveSync: \"Risolvi conflitti\",\n keepLocal: \"Mantieni versione locale\",\n useServer: \"Usa versione del server\",\n manualMerge: \"Unione manuale\",\n close: \"Chiudi\",\n backupRecovery: \"Ripristina dal backup\",\n backupRecoveryDescription: \"Se i dati locali sono danneggiati, ripristina un backup JSON valido.\",\n syncPending: \"Ci sono modifiche in attesa di sincronizzazione.\",\n syncSynced: \"Tutte le modifiche sono sincronizzate.\",\n syncConflict: \"Alcune modifiche richiedono la risoluzione di un conflitto.\",\n};\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const JA_LABELS: KeepUiLocaleLabels = {\n archive: \"アーカイブ\",\n unarchive: \"アーカイブを解除\",\n archived: \"アーカイブ済み\",\n pin: \"ピン留め\",\n unpin: \"ピン留めを解除\",\n pinned: \"ピン留め済み\",\n collection: \"コレクション\",\n allCollections: \"すべてのコレクション\",\n filterCollections: \"コレクションで絞り込む\",\n uncategorized: \"未分類\",\n saveWithNote: \"メモ付きで保存\",\n editSavedItem: \"保存したアイテムを編集\",\n unsavedChanges: \"未保存の変更があります\",\n save: \"保存\",\n saved: \"保存済み\",\n remove: \"削除\",\n loading: \"読み込み中…\",\n saving: \"保存中…\",\n syncing: \"同期中…\",\n error: \"問題が発生しました。\",\n allTags: \"すべて\",\n tags: \"タグ\",\n filterTags: \"保存アイテムをタグで絞り込む\",\n activeFilters: \"適用中の条件\",\n clearFilters: \"フィルターをクリア\",\n clearAllFilters: \"すべての条件をクリア\",\n removeFilter: \"を解除\",\n noFilteredItems: \"一致するアイテムが見つかりませんでした\",\n noFilteredItemsDescription: \"検索語を変更するか、タグの絞り込みを解除してください。\",\n emptyStorageDescription: \"アイテムを保存すると、ここに表示されます。\",\n note: \"メモ\",\n saveNote: \"メモを保存\",\n noItems: \"保存されたアイテムはありません。\",\n loadingItems: \"保存アイテムを読み込み中…\",\n errorItems: \"保存アイテムを読み込めませんでした。\",\n search: \"保存アイテムを検索\",\n sort: \"保存アイテムを並べ替え\",\n newest: \"新しい順\",\n oldest: \"古い順\",\n savedNewest: \"保存日時の新しい順\",\n savedOldest: \"保存日時の古い順\",\n updatedNewest: \"更新日時の新しい順\",\n updatedOldest: \"更新日時の古い順\",\n previousPage: \"前のページ\",\n nextPage: \"次のページ\",\n pagination: \"ページネーション\",\n page: \"ページ\",\n selectItems: \"保存アイテムを選択\",\n selectedCount: \"件を選択中\",\n deleteSelected: \"選択項目を削除\",\n tagsToApply: \"適用するタグ\",\n applyTags: \"タグを適用\",\n savedMessage: \"アイテムを保存しました。\",\n removedMessage: \"アイテムを削除しました。\",\n restoredMessage: \"アイテムを復元しました。\",\n syncFailedMessage: \"同期に失敗しました。\",\n stalePrunedMessage: \"利用できないアイテムを削除しました。\",\n undo: \"元に戻す\",\n undoAvailable: \"アイテムを削除しました。元に戻しますか?\",\n selectionScope: \"選択範囲\",\n currentPage: \"表示中のページ\",\n searchResults: \"現在の検索結果全体\",\n allItems: \"すべての保存アイテム\",\n localVersion: \"ローカル\",\n remoteVersion: \"リモート\",\n updatedAt: \"更新日時\",\n statusAvailable: \"利用可能\",\n noteSavedMessage: \"メモを保存しました。\",\n exportData: \"JSONをエクスポート\",\n importData: \"JSONをインポート\",\n importMode: \"インポート方法\",\n merge: \"統合\",\n replace: \"置き換え\",\n importedCount: \"件をインポートしました\",\n failedCount: \"件に失敗しました\",\n storageQuotaError: \"保存容量が不足しています。空き容量を確保して再試行してください。\",\n statusExpired: \"期限切れ\",\n statusRemoved: \"削除済み\",\n statusDeleted: \"削除済み\",\n statusPrivate: \"非公開\",\n statusUnknown: \"利用不可\",\n retry: \"再取得\",\n removeFromList: \"一覧から削除\",\n pruneStale: \"利用できない項目を削除\",\n retrySync: \"同期を再試行\",\n resolveSync: \"競合を解決\",\n keepLocal: \"ローカルを優先\",\n useServer: \"サーバーを優先\",\n manualMerge: \"手動で統合\",\n close: \"閉じる\",\n backupRecovery: \"バックアップから復元\",\n backupRecoveryDescription: \"ローカルの同期データが破損した場合は、正常なJSONバックアップから復元してください。\",\n syncPending: \"同期待ちの変更があります。\",\n syncSynced: \"すべての変更を同期しました。\",\n syncConflict: \"競合している変更があります。解決してください。\",\n};\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const KO_LABELS: KeepUiLocaleLabels = {\n archive: \"보관\",\n unarchive: \"보관 해제\",\n archived: \"보관됨\",\n pin: \"고정\",\n unpin: \"고정 해제\",\n pinned: \"고정됨\",\n collection: \"컬렉션\",\n allCollections: \"모든 컬렉션\",\n filterCollections: \"컬렉션 필터\",\n uncategorized: \"미분류\",\n saveWithNote: \"메모와 함께 저장\",\n editSavedItem: \"저장된 항목 편집\",\n unsavedChanges: \"저장되지 않은 변경 사항\",\n save: \"저장\",\n saved: \"저장됨\",\n remove: \"삭제\",\n loading: \"로드 중…\",\n saving: \"저장 중…\",\n syncing: \"동기화 중…\",\n error: \"문제가 발생했습니다.\",\n allTags: \"모두\",\n tags: \"태그\",\n filterTags: \"태그로 저장 항목 필터링\",\n activeFilters: \"활성 필터\",\n clearFilters: \"필터 지우기\",\n clearAllFilters: \"모든 필터 지우기\",\n removeFilter: \"제거\",\n noFilteredItems: \"일치하는 항목이 없습니다.\",\n noFilteredItemsDescription: \"검색어를 바꾸거나 태그 필터를 제거해 보세요.\",\n emptyStorageDescription: \"항목을 저장하면 여기에 표시됩니다.\",\n note: \"메모\",\n saveNote: \"메모 저장\",\n noItems: \"저장된 항목이 없습니다.\",\n loadingItems: \"저장 항목을 불러오는 중…\",\n errorItems: \"저장 항목을 불러오지 못했습니다.\",\n search: \"저장 항목 검색\",\n sort: \"저장 항목 정렬\",\n newest: \"최신순\",\n oldest: \"오래된순\",\n savedNewest: \"저장일 최신순\",\n savedOldest: \"저장일 오래된순\",\n updatedNewest: \"수정일 최신순\",\n updatedOldest: \"수정일 오래된순\",\n previousPage: \"이전 페이지\",\n nextPage: \"다음 페이지\",\n pagination: \"페이지 매김\",\n page: \"페이지\",\n selectItems: \"저장 항목 선택\",\n selectedCount: \"개 선택됨\",\n deleteSelected: \"선택 항목 삭제\",\n tagsToApply: \"적용할 태그\",\n applyTags: \"태그 적용\",\n savedMessage: \"항목을 저장했습니다.\",\n removedMessage: \"항목을 삭제했습니다.\",\n restoredMessage: \"항목을 복원했습니다.\",\n syncFailedMessage: \"동기화에 실패했습니다.\",\n stalePrunedMessage: \"사용할 수 없는 항목을 삭제했습니다.\",\n undo: \"실행 취소\",\n undoAvailable: \"항목을 삭제했습니다. 실행 취소할까요?\",\n selectionScope: \"선택 범위\",\n currentPage: \"현재 페이지\",\n searchResults: \"현재 검색 결과 전체\",\n allItems: \"모든 저장 항목\",\n localVersion: \"로컬\",\n remoteVersion: \"원격\",\n updatedAt: \"업데이트 시간\",\n statusAvailable: \"사용 가능\",\n noteSavedMessage: \"메모를 저장했습니다.\",\n exportData: \"JSON 내보내기\",\n importData: \"JSON 가져오기\",\n importMode: \"가져오기 방식\",\n merge: \"병합\",\n replace: \"교체\",\n importedCount: \"개 가져옴\",\n failedCount: \"개 실패\",\n storageQuotaError: \"저장 공간이 부족합니다. 공간을 확보한 후 다시 시도하세요.\",\n statusExpired: \"만료됨\",\n statusRemoved: \"제거됨\",\n statusDeleted: \"삭제됨\",\n statusPrivate: \"비공개\",\n statusUnknown: \"사용할 수 없음\",\n retry: \"다시 시도\",\n removeFromList: \"목록에서 삭제\",\n pruneStale: \"사용할 수 없는 항목 삭제\",\n retrySync: \"동기화 다시 시도\",\n resolveSync: \"충돌 해결\",\n keepLocal: \"로컬 버전 유지\",\n useServer: \"서버 버전 사용\",\n manualMerge: \"수동 병합\",\n close: \"닫기\",\n backupRecovery: \"백업에서 복원\",\n backupRecoveryDescription: \"로컬 동기화 데이터가 손상된 경우 정상적인 JSON 백업을 복원하세요.\",\n syncPending: \"동기화 대기 중인 변경 사항이 있습니다.\",\n syncSynced: \"모든 변경 사항이 동기화되었습니다.\",\n syncConflict: \"충돌을 해결해야 하는 변경 사항이 있습니다.\",\n};\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const MS_LABELS: KeepUiLocaleLabels = {\n archive: \"Arkibkan\",\n unarchive: \"Nyaharkib\",\n archived: \"Diarkibkan\",\n pin: \"Pin\",\n unpin: \"Nyahpin\",\n pinned: \"Dipinkan\",\n collection: \"Koleksi\",\n allCollections: \"Semua koleksi\",\n filterCollections: \"Tapis koleksi\",\n uncategorized: \"Tiada kategori\",\n saveWithNote: \"Simpan dengan nota\",\n editSavedItem: \"Edit item yang disimpan\",\n unsavedChanges: \"Perubahan belum disimpan\",\n save: \"Simpan\",\n saved: \"Disimpan\",\n remove: \"Buang\",\n loading: \"Memuatkan…\",\n saving: \"Menyimpan…\",\n syncing: \"Menyegerakkan…\",\n error: \"Ralat telah berlaku.\",\n allTags: \"Semua\",\n tags: \"Tag\",\n filterTags: \"Tapis item yang disimpan mengikut tag\",\n activeFilters: \"Penapis aktif\",\n clearFilters: \"Kosongkan penapis\",\n clearAllFilters: \"Kosongkan semua penapis\",\n removeFilter: \"alih keluar\",\n noFilteredItems: \"Tiada item yang sepadan ditemui.\",\n noFilteredItemsDescription: \"Laraskan carian atau alih keluar penapis tag.\",\n emptyStorageDescription: \"Simpan item untuk melihatnya di sini.\",\n note: \"Nota\",\n saveNote: \"Simpan nota\",\n noItems: \"Tiada item disimpan.\",\n loadingItems: \"Memuatkan item yang disimpan…\",\n errorItems: \"Tidak dapat memuatkan item yang disimpan.\",\n search: \"Cari item yang disimpan\",\n sort: \"Isih item yang disimpan\",\n newest: \"Terbaharu dahulu\",\n oldest: \"Terlama dahulu\",\n savedNewest: \"Disimpan paling baharu dahulu\",\n savedOldest: \"Disimpan paling lama dahulu\",\n updatedNewest: \"Dikemas kini paling baharu dahulu\",\n updatedOldest: \"Dikemas kini paling lama dahulu\",\n previousPage: \"Halaman sebelumnya\",\n nextPage: \"Halaman seterusnya\",\n pagination: \"Penomboran halaman\",\n page: \"Halaman\",\n selectItems: \"Pilih item yang disimpan\",\n selectedCount: \"dipilih\",\n deleteSelected: \"Padam pilihan\",\n tagsToApply: \"Tag untuk digunakan\",\n applyTags: \"Gunakan tag\",\n savedMessage: \"Item disimpan.\",\n removedMessage: \"Item dibuang.\",\n restoredMessage: \"Item dipulihkan.\",\n syncFailedMessage: \"Penyegerakan gagal.\",\n stalePrunedMessage: \"Item yang tidak tersedia dibuang.\",\n undo: \"Buat asal\",\n undoAvailable: \"Item dibuang. Buat asal?\",\n selectionScope: \"Skop pilihan\",\n currentPage: \"Halaman semasa\",\n searchResults: \"Hasil carian semasa\",\n allItems: \"Semua item yang disimpan\",\n localVersion: \"Tempatan\",\n remoteVersion: \"Pelayan\",\n updatedAt: \"Dikemas kini\",\n statusAvailable: \"Tersedia\",\n noteSavedMessage: \"Nota disimpan.\",\n exportData: \"Eksport JSON\",\n importData: \"Import JSON\",\n importMode: \"Mod import\",\n merge: \"Gabung\",\n replace: \"Ganti\",\n importedCount: \"item diimport\",\n failedCount: \"item gagal\",\n storageQuotaError: \"Storan penuh. Kosongkan ruang dan cuba lagi.\",\n statusExpired: \"Tamat tempoh\",\n statusRemoved: \"Dibuang\",\n statusDeleted: \"Dipadam\",\n statusPrivate: \"Peribadi\",\n statusUnknown: \"Tidak tersedia\",\n retry: \"Cuba lagi\",\n removeFromList: \"Buang daripada senarai\",\n pruneStale: \"Buang item yang tidak tersedia\",\n retrySync: \"Cuba penyegerakan lagi\",\n resolveSync: \"Selesaikan konflik\",\n keepLocal: \"Kekalkan versi setempat\",\n useServer: \"Gunakan versi pelayan\",\n manualMerge: \"Gabung secara manual\",\n close: \"Tutup\",\n backupRecovery: \"Pulihkan daripada sandaran\",\n backupRecoveryDescription: \"Jika data penyegerakan setempat rosak, pulihkan sandaran JSON yang sah.\",\n syncPending: \"Terdapat perubahan yang menunggu penyegerakan.\",\n syncSynced: \"Semua perubahan telah disegerakkan.\",\n syncConflict: \"Sesetengah perubahan memerlukan penyelesaian konflik.\",\n};\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const PT_BR_LABELS: KeepUiLocaleLabels = {\n archive: \"Arquivar\",\n unarchive: \"Desarquivar\",\n archived: \"Arquivado\",\n pin: \"Fixar\",\n unpin: \"Desafixar\",\n pinned: \"Fixado\",\n collection: \"Coleção\",\n allCollections: \"Todas as coleções\",\n filterCollections: \"Filtrar por coleção\",\n uncategorized: \"Sem categoria\",\n saveWithNote: \"Salvar com nota\",\n editSavedItem: \"Editar item salvo\",\n unsavedChanges: \"Alterações não salvas\",\n save: \"Salvar\",\n saved: \"Salvo\",\n remove: \"Remover\",\n loading: \"Carregando…\",\n saving: \"Salvando…\",\n syncing: \"Sincronizando…\",\n error: \"Ocorreu um erro.\",\n allTags: \"Todos\",\n tags: \"Tags\",\n filterTags: \"Filtrar itens salvos por tag\",\n activeFilters: \"Filtros ativos\",\n clearFilters: \"Limpar filtros\",\n clearAllFilters: \"Limpar todos os filtros\",\n removeFilter: \"remover\",\n noFilteredItems: \"Nenhum item correspondente encontrado.\",\n noFilteredItemsDescription: \"Ajuste sua busca ou remova um filtro de tag.\",\n emptyStorageDescription: \"Salve um item para vê-lo aqui.\",\n note: \"Nota\",\n saveNote: \"Salvar nota\",\n noItems: \"Nenhum item salvo.\",\n loadingItems: \"Carregando itens salvos…\",\n errorItems: \"Não foi possível carregar os itens salvos.\",\n search: \"Pesquisar itens salvos\",\n sort: \"Ordenar itens salvos\",\n newest: \"Mais recentes primeiro\",\n oldest: \"Mais antigos primeiro\",\n savedNewest: \"Salvos mais recentemente primeiro\",\n savedOldest: \"Salvos há mais tempo primeiro\",\n updatedNewest: \"Atualizados mais recentemente primeiro\",\n updatedOldest: \"Atualizados há mais tempo primeiro\",\n previousPage: \"Página anterior\",\n nextPage: \"Próxima página\",\n pagination: \"Paginação\",\n page: \"Página\",\n selectItems: \"Selecionar itens salvos\",\n selectedCount: \"selecionados\",\n deleteSelected: \"Excluir selecionados\",\n tagsToApply: \"Tags a aplicar\",\n applyTags: \"Aplicar tags\",\n savedMessage: \"Item salvo.\",\n removedMessage: \"Item removido.\",\n restoredMessage: \"Item restaurado.\",\n syncFailedMessage: \"Falha na sincronização.\",\n stalePrunedMessage: \"Itens indisponíveis removidos.\",\n undo: \"Desfazer\",\n undoAvailable: \"Item removido. Desfazer?\",\n selectionScope: \"Escopo da seleção\",\n currentPage: \"Página atual\",\n searchResults: \"Resultados da pesquisa atual\",\n allItems: \"Todos os itens salvos\",\n localVersion: \"Local\",\n remoteVersion: \"Servidor\",\n updatedAt: \"Atualizado\",\n statusAvailable: \"Disponível\",\n noteSavedMessage: \"Nota salva.\",\n exportData: \"Exportar JSON\",\n importData: \"Importar JSON\",\n importMode: \"Modo de importação\",\n merge: \"Mesclar\",\n replace: \"Substituir\",\n importedCount: \"itens importados\",\n failedCount: \"itens com falha\",\n storageQuotaError: \"O armazenamento está cheio. Libere espaço e tente novamente.\",\n statusExpired: \"Expirado\",\n statusRemoved: \"Removido\",\n statusDeleted: \"Excluído\",\n statusPrivate: \"Privado\",\n statusUnknown: \"Indisponível\",\n retry: \"Tentar novamente\",\n removeFromList: \"Remover da lista\",\n pruneStale: \"Remover itens indisponíveis\",\n retrySync: \"Tentar sincronizar novamente\",\n resolveSync: \"Resolver conflitos\",\n keepLocal: \"Manter versão local\",\n useServer: \"Usar versão do servidor\",\n manualMerge: \"Mesclagem manual\",\n close: \"Fechar\",\n backupRecovery: \"Restaurar do backup\",\n backupRecoveryDescription: \"Se os dados locais estiverem corrompidos, restaure um backup JSON válido.\",\n syncPending: \"Há alterações aguardando sincronização.\",\n syncSynced: \"Todas as alterações foram sincronizadas.\",\n syncConflict: \"Algumas alterações precisam de resolução de conflito.\",\n};\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const RU_LABELS: KeepUiLocaleLabels = {\n archive: \"Архивировать\",\n unarchive: \"Разархивировать\",\n archived: \"В архиве\",\n pin: \"Закрепить\",\n unpin: \"Открепить\",\n pinned: \"Закреплено\",\n collection: \"Коллекция\",\n allCollections: \"Все коллекции\",\n filterCollections: \"Фильтр коллекций\",\n uncategorized: \"Без категории\",\n saveWithNote: \"Сохранить с заметкой\",\n editSavedItem: \"Редактировать сохранённый элемент\",\n unsavedChanges: \"Несохранённые изменения\",\n save: \"Сохранить\",\n saved: \"Сохранено\",\n remove: \"Удалить\",\n loading: \"Загрузка…\",\n saving: \"Сохранение…\",\n syncing: \"Синхронизация…\",\n error: \"Произошла ошибка.\",\n allTags: \"Все\",\n tags: \"Теги\",\n filterTags: \"Фильтровать сохранённые элементы по тегу\",\n activeFilters: \"Активные фильтры\",\n clearFilters: \"Очистить фильтры\",\n clearAllFilters: \"Очистить все фильтры\",\n removeFilter: \"удалить\",\n noFilteredItems: \"Подходящие элементы не найдены.\",\n noFilteredItemsDescription: \"Измените поиск или удалите фильтр тега.\",\n emptyStorageDescription: \"Сохраните элемент, чтобы увидеть его здесь.\",\n note: \"Заметка\",\n saveNote: \"Сохранить заметку\",\n noItems: \"Нет сохранённых элементов.\",\n loadingItems: \"Загрузка сохранённых элементов…\",\n errorItems: \"Не удалось загрузить сохранённые элементы.\",\n search: \"Поиск сохранённых элементов\",\n sort: \"Сортировка сохранённых элементов\",\n newest: \"Сначала новые\",\n oldest: \"Сначала старые\",\n savedNewest: \"Сначала недавно сохранённые\",\n savedOldest: \"Сначала давно сохранённые\",\n updatedNewest: \"Сначала недавно обновлённые\",\n updatedOldest: \"Сначала давно обновлённые\",\n previousPage: \"Предыдущая страница\",\n nextPage: \"Следующая страница\",\n pagination: \"Пагинация\",\n page: \"Страница\",\n selectItems: \"Выбрать сохранённые элементы\",\n selectedCount: \"выбрано\",\n deleteSelected: \"Удалить выбранные\",\n tagsToApply: \"Теги для применения\",\n applyTags: \"Применить теги\",\n savedMessage: \"Элемент сохранён.\",\n removedMessage: \"Элемент удалён.\",\n restoredMessage: \"Элемент восстановлен.\",\n syncFailedMessage: \"Синхронизация не выполнена.\",\n stalePrunedMessage: \"Недоступные элементы удалены.\",\n undo: \"Отменить\",\n undoAvailable: \"Элемент удалён. Отменить?\",\n selectionScope: \"Область выбора\",\n currentPage: \"Текущая страница\",\n searchResults: \"Текущие результаты поиска\",\n allItems: \"Все сохранённые элементы\",\n localVersion: \"Локальная версия\",\n remoteVersion: \"Серверная версия\",\n updatedAt: \"Обновлено\",\n statusAvailable: \"Доступен\",\n noteSavedMessage: \"Заметка сохранена.\",\n exportData: \"Экспортировать JSON\",\n importData: \"Импортировать JSON\",\n importMode: \"Режим импорта\",\n merge: \"Объединить\",\n replace: \"Заменить\",\n importedCount: \"элементов импортировано\",\n failedCount: \"элементов не удалось импортировать\",\n storageQuotaError: \"Хранилище заполнено. Освободите место и повторите попытку.\",\n statusExpired: \"Истёк срок\",\n statusRemoved: \"Удалён\",\n statusDeleted: \"Удалён навсегда\",\n statusPrivate: \"Приватный\",\n statusUnknown: \"Недоступен\",\n retry: \"Повторить\",\n removeFromList: \"Удалить из списка\",\n pruneStale: \"Удалить недоступные элементы\",\n retrySync: \"Повторить синхронизацию\",\n resolveSync: \"Разрешить конфликты\",\n keepLocal: \"Оставить локальную версию\",\n useServer: \"Использовать версию сервера\",\n manualMerge: \"Объединить вручную\",\n close: \"Закрыть\",\n backupRecovery: \"Восстановить из резервной копии\",\n backupRecoveryDescription: \"Если локальные данные синхронизации повреждены, восстановите рабочую JSON-копию.\",\n syncPending: \"Есть изменения, ожидающие синхронизации.\",\n syncSynced: \"Все изменения синхронизированы.\",\n syncConflict: \"Некоторые изменения требуют разрешения конфликта.\",\n};\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const TH_LABELS: KeepUiLocaleLabels = {\n archive: \"เก็บถาวร\",\n unarchive: \"ยกเลิกการเก็บถาวร\",\n archived: \"เก็บถาวรแล้ว\",\n pin: \"ปักหมุด\",\n unpin: \"เลิกปักหมุด\",\n pinned: \"ปักหมุดแล้ว\",\n collection: \"คอลเลกชัน\",\n allCollections: \"คอลเลกชันทั้งหมด\",\n filterCollections: \"กรองคอลเลกชัน\",\n uncategorized: \"ไม่มีหมวดหมู่\",\n saveWithNote: \"บันทึกพร้อมโน้ต\",\n editSavedItem: \"แก้ไขรายการที่บันทึกไว้\",\n unsavedChanges: \"มีการเปลี่ยนแปลงที่ยังไม่ได้บันทึก\",\n save: \"บันทึก\",\n saved: \"บันทึกแล้ว\",\n remove: \"ลบ\",\n loading: \"กำลังโหลด…\",\n saving: \"กำลังบันทึก…\",\n syncing: \"กำลังซิงค์…\",\n error: \"เกิดข้อผิดพลาด\",\n allTags: \"ทั้งหมด\",\n tags: \"แท็ก\",\n filterTags: \"กรองรายการที่บันทึกด้วยแท็ก\",\n activeFilters: \"ตัวกรองที่ใช้งานอยู่\",\n clearFilters: \"ล้างตัวกรอง\",\n clearAllFilters: \"ล้างตัวกรองทั้งหมด\",\n removeFilter: \"นำออก\",\n noFilteredItems: \"ไม่พบรายการที่ตรงกัน\",\n noFilteredItemsDescription: \"ลองปรับการค้นหาหรือนำตัวกรองแท็กออก\",\n emptyStorageDescription: \"บันทึกรายการเพื่อดูที่นี่\",\n note: \"บันทึกย่อ\",\n saveNote: \"บันทึกบันทึกย่อ\",\n noItems: \"ไม่มีรายการที่บันทึกไว้\",\n loadingItems: \"กำลังโหลดรายการที่บันทึก…\",\n errorItems: \"โหลดรายการที่บันทึกไม่ได้\",\n search: \"ค้นหารายการที่บันทึก\",\n sort: \"เรียงรายการที่บันทึก\",\n newest: \"ใหม่สุดก่อน\",\n oldest: \"เก่าสุดก่อน\",\n savedNewest: \"บันทึกใหม่สุดก่อน\",\n savedOldest: \"บันทึกเก่าสุดก่อน\",\n updatedNewest: \"อัปเดตใหม่สุดก่อน\",\n updatedOldest: \"อัปเดตเก่าสุดก่อน\",\n previousPage: \"หน้าก่อนหน้า\",\n nextPage: \"หน้าถัดไป\",\n pagination: \"การแบ่งหน้า\",\n page: \"หน้า\",\n selectItems: \"เลือกรายการที่บันทึก\",\n selectedCount: \"รายการที่เลือก\",\n deleteSelected: \"ลบรายการที่เลือก\",\n tagsToApply: \"แท็กที่จะใช้\",\n applyTags: \"ใช้แท็ก\",\n savedMessage: \"บันทึกรายการแล้ว\",\n removedMessage: \"ลบรายการแล้ว\",\n restoredMessage: \"กู้คืนรายการแล้ว\",\n syncFailedMessage: \"ซิงค์ไม่สำเร็จ\",\n stalePrunedMessage: \"ลบรายการที่ใช้ไม่ได้แล้ว\",\n undo: \"เลิกทำ\",\n undoAvailable: \"ลบรายการแล้ว ต้องการเลิกทำหรือไม่\",\n selectionScope: \"ขอบเขตการเลือก\",\n currentPage: \"หน้าปัจจุบัน\",\n searchResults: \"ผลการค้นหาปัจจุบัน\",\n allItems: \"รายการที่บันทึกทั้งหมด\",\n localVersion: \"ในเครื่อง\",\n remoteVersion: \"ระยะไกล\",\n updatedAt: \"อัปเดตเมื่อ\",\n statusAvailable: \"พร้อมใช้งาน\",\n noteSavedMessage: \"บันทึกย่อแล้ว\",\n exportData: \"ส่งออก JSON\",\n importData: \"นำเข้า JSON\",\n importMode: \"โหมดนำเข้า\",\n merge: \"รวม\",\n replace: \"แทนที่\",\n importedCount: \"รายการนำเข้าแล้ว\",\n failedCount: \"รายการล้มเหลว\",\n storageQuotaError: \"พื้นที่จัดเก็บเต็ม โปรดเพิ่มพื้นที่แล้วลองอีกครั้ง\",\n statusExpired: \"หมดอายุ\",\n statusRemoved: \"นำออกแล้ว\",\n statusDeleted: \"ลบแล้ว\",\n statusPrivate: \"เป็นส่วนตัว\",\n statusUnknown: \"ไม่พร้อมใช้งาน\",\n retry: \"ลองใหม่\",\n removeFromList: \"ลบออกจากรายการ\",\n pruneStale: \"ลบรายการที่ใช้งานไม่ได้\",\n retrySync: \"ลองซิงค์ใหม่\",\n resolveSync: \"แก้ไขข้อขัดแย้ง\",\n keepLocal: \"ใช้เวอร์ชันในเครื่อง\",\n useServer: \"ใช้เวอร์ชันเซิร์ฟเวอร์\",\n manualMerge: \"รวมด้วยตนเอง\",\n close: \"ปิด\",\n backupRecovery: \"กู้คืนจากข้อมูลสำรอง\",\n backupRecoveryDescription: \"หากข้อมูลซิงค์ในเครื่องเสียหาย ให้กู้คืนจากข้อมูลสำรอง JSON ที่ใช้งานได้\",\n syncPending: \"มีการเปลี่ยนแปลงที่รอการซิงค์\",\n syncSynced: \"ซิงค์การเปลี่ยนแปลงทั้งหมดแล้ว\",\n syncConflict: \"มีการเปลี่ยนแปลงที่ต้องแก้ไขข้อขัดแย้ง\",\n};\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const VI_LABELS: KeepUiLocaleLabels = {\n archive: \"Lưu trữ\",\n unarchive: \"Bỏ lưu trữ\",\n archived: \"Đã lưu trữ\",\n pin: \"Ghim\",\n unpin: \"Bỏ ghim\",\n pinned: \"Đã ghim\",\n collection: \"Bộ sưu tập\",\n allCollections: \"Tất cả bộ sưu tập\",\n filterCollections: \"Lọc theo bộ sưu tập\",\n uncategorized: \"Chưa phân loại\",\n saveWithNote: \"Lưu kèm ghi chú\",\n editSavedItem: \"Chỉnh sửa mục đã lưu\",\n unsavedChanges: \"Thay đổi chưa được lưu\",\n save: \"Lưu\",\n saved: \"Đã lưu\",\n remove: \"Xóa\",\n loading: \"Đang tải…\",\n saving: \"Đang lưu…\",\n syncing: \"Đang đồng bộ…\",\n error: \"Đã xảy ra lỗi.\",\n allTags: \"Tất cả\",\n tags: \"Thẻ\",\n filterTags: \"Lọc mục đã lưu theo thẻ\",\n activeFilters: \"Bộ lọc đang dùng\",\n clearFilters: \"Xóa bộ lọc\",\n clearAllFilters: \"Xóa tất cả bộ lọc\",\n removeFilter: \"xóa\",\n noFilteredItems: \"Không tìm thấy mục phù hợp.\",\n noFilteredItemsDescription: \"Hãy điều chỉnh tìm kiếm hoặc xóa bộ lọc thẻ.\",\n emptyStorageDescription: \"Lưu một mục để xem mục đó tại đây.\",\n note: \"Ghi chú\",\n saveNote: \"Lưu ghi chú\",\n noItems: \"Chưa có mục nào được lưu.\",\n loadingItems: \"Đang tải các mục đã lưu…\",\n errorItems: \"Không thể tải các mục đã lưu.\",\n search: \"Tìm kiếm mục đã lưu\",\n sort: \"Sắp xếp mục đã lưu\",\n newest: \"Mới nhất trước\",\n oldest: \"Cũ nhất trước\",\n savedNewest: \"Lưu gần đây nhất trước\",\n savedOldest: \"Lưu lâu nhất trước\",\n updatedNewest: \"Cập nhật gần đây nhất trước\",\n updatedOldest: \"Cập nhật lâu nhất trước\",\n previousPage: \"Trang trước\",\n nextPage: \"Trang sau\",\n pagination: \"Phân trang\",\n page: \"Trang\",\n selectItems: \"Chọn mục đã lưu\",\n selectedCount: \"đã chọn\",\n deleteSelected: \"Xóa mục đã chọn\",\n tagsToApply: \"Thẻ cần áp dụng\",\n applyTags: \"Áp dụng thẻ\",\n savedMessage: \"Đã lưu mục.\",\n removedMessage: \"Đã xóa mục.\",\n restoredMessage: \"Đã khôi phục mục.\",\n syncFailedMessage: \"Đồng bộ không thành công.\",\n stalePrunedMessage: \"Đã xóa các mục không khả dụng.\",\n undo: \"Hoàn tác\",\n undoAvailable: \"Đã xóa mục. Hoàn tác?\",\n selectionScope: \"Phạm vi lựa chọn\",\n currentPage: \"Trang hiện tại\",\n searchResults: \"Kết quả tìm kiếm hiện tại\",\n allItems: \"Tất cả mục đã lưu\",\n localVersion: \"Cục bộ\",\n remoteVersion: \"Máy chủ\",\n updatedAt: \"Đã cập nhật\",\n statusAvailable: \"Khả dụng\",\n noteSavedMessage: \"Đã lưu ghi chú.\",\n exportData: \"Xuất JSON\",\n importData: \"Nhập JSON\",\n importMode: \"Chế độ nhập\",\n merge: \"Hợp nhất\",\n replace: \"Thay thế\",\n importedCount: \"mục đã nhập\",\n failedCount: \"mục bị lỗi\",\n storageQuotaError: \"Bộ nhớ đã đầy. Hãy giải phóng dung lượng rồi thử lại.\",\n statusExpired: \"Đã hết hạn\",\n statusRemoved: \"Đã gỡ\",\n statusDeleted: \"Đã xóa\",\n statusPrivate: \"Riêng tư\",\n statusUnknown: \"Không khả dụng\",\n retry: \"Thử lại\",\n removeFromList: \"Xóa khỏi danh sách\",\n pruneStale: \"Xóa các mục không khả dụng\",\n retrySync: \"Thử đồng bộ lại\",\n resolveSync: \"Giải quyết xung đột\",\n keepLocal: \"Giữ bản cục bộ\",\n useServer: \"Dùng bản máy chủ\",\n manualMerge: \"Gộp thủ công\",\n close: \"Đóng\",\n backupRecovery: \"Khôi phục từ bản sao lưu\",\n backupRecoveryDescription: \"Nếu dữ liệu đồng bộ cục bộ bị hỏng, hãy khôi phục bản sao lưu JSON hợp lệ.\",\n syncPending: \"Có thay đổi đang chờ đồng bộ.\",\n syncSynced: \"Tất cả thay đổi đã được đồng bộ.\",\n syncConflict: \"Một số thay đổi cần giải quyết xung đột.\",\n};\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const ZH_HANS_LABELS: KeepUiLocaleLabels = {\n archive: \"归档\",\n unarchive: \"取消归档\",\n archived: \"已归档\",\n pin: \"置顶\",\n unpin: \"取消置顶\",\n pinned: \"已置顶\",\n collection: \"集合\",\n allCollections: \"所有集合\",\n filterCollections: \"按集合筛选\",\n uncategorized: \"未分类\",\n saveWithNote: \"保存并添加备注\",\n editSavedItem: \"编辑已保存项目\",\n unsavedChanges: \"有未保存的更改\",\n save: \"保存\",\n saved: \"已保存\",\n remove: \"删除\",\n loading: \"加载中…\",\n saving: \"保存中…\",\n syncing: \"同步中…\",\n error: \"发生错误。\",\n allTags: \"全部\",\n tags: \"标签\",\n filterTags: \"按标签筛选已保存项目\",\n activeFilters: \"当前筛选条件\",\n clearFilters: \"清除筛选\",\n clearAllFilters: \"清除所有筛选条件\",\n removeFilter: \"移除\",\n noFilteredItems: \"未找到匹配项目。\",\n noFilteredItemsDescription: \"请调整搜索条件或移除标签筛选。\",\n emptyStorageDescription: \"保存项目后会显示在这里。\",\n note: \"备注\",\n saveNote: \"保存备注\",\n noItems: \"没有已保存的项目。\",\n loadingItems: \"正在加载已保存项目…\",\n errorItems: \"无法加载已保存项目。\",\n search: \"搜索已保存项目\",\n sort: \"排序已保存项目\",\n newest: \"最新优先\",\n oldest: \"最早优先\",\n savedNewest: \"保存时间最新优先\",\n savedOldest: \"保存时间最早优先\",\n updatedNewest: \"更新时间最新优先\",\n updatedOldest: \"更新时间最早优先\",\n previousPage: \"上一页\",\n nextPage: \"下一页\",\n pagination: \"分页\",\n page: \"页\",\n selectItems: \"选择已保存项目\",\n selectedCount: \"项已选择\",\n deleteSelected: \"删除所选项目\",\n tagsToApply: \"要应用的标签\",\n applyTags: \"应用标签\",\n savedMessage: \"项目已保存。\",\n removedMessage: \"项目已删除。\",\n restoredMessage: \"项目已恢复。\",\n syncFailedMessage: \"同步失败。\",\n stalePrunedMessage: \"不可用项目已删除。\",\n undo: \"撤销\",\n undoAvailable: \"项目已删除。要撤销吗?\",\n selectionScope: \"选择范围\",\n currentPage: \"当前页\",\n searchResults: \"当前全部搜索结果\",\n allItems: \"全部已保存项目\",\n localVersion: \"本地\",\n remoteVersion: \"远程\",\n updatedAt: \"更新时间\",\n statusAvailable: \"可用\",\n noteSavedMessage: \"备注已保存。\",\n exportData: \"导出JSON\",\n importData: \"导入JSON\",\n importMode: \"导入方式\",\n merge: \"合并\",\n replace: \"替换\",\n importedCount: \"项已导入\",\n failedCount: \"项失败\",\n storageQuotaError: \"存储空间已满。请释放空间后重试。\",\n statusExpired: \"已过期\",\n statusRemoved: \"已移除\",\n statusDeleted: \"已删除\",\n statusPrivate: \"不公开\",\n statusUnknown: \"不可用\",\n retry: \"重试\",\n removeFromList: \"从列表中删除\",\n pruneStale: \"删除不可用项目\",\n retrySync: \"重试同步\",\n resolveSync: \"解决冲突\",\n keepLocal: \"保留本地版本\",\n useServer: \"使用服务器版本\",\n manualMerge: \"手动合并\",\n close: \"关闭\",\n backupRecovery: \"从备份恢复\",\n backupRecoveryDescription: \"如果本地同步数据损坏,请恢复可用的 JSON 备份。\",\n syncPending: \"有更改等待同步。\",\n syncSynced: \"所有更改均已同步。\",\n syncConflict: \"有些更改需要解决冲突。\",\n};\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const ZH_HANT_LABELS: KeepUiLocaleLabels = {\n archive: \"封存\",\n unarchive: \"取消封存\",\n archived: \"已封存\",\n pin: \"釘選\",\n unpin: \"取消釘選\",\n pinned: \"已釘選\",\n collection: \"收藏集\",\n allCollections: \"所有收藏集\",\n filterCollections: \"依收藏集篩選\",\n uncategorized: \"未分類\",\n saveWithNote: \"儲存並加備註\",\n editSavedItem: \"編輯已儲存項目\",\n unsavedChanges: \"有未儲存的變更\",\n save: \"儲存\",\n saved: \"已儲存\",\n remove: \"刪除\",\n loading: \"載入中…\",\n saving: \"儲存中…\",\n syncing: \"同步中…\",\n error: \"發生錯誤。\",\n allTags: \"全部\",\n tags: \"標籤\",\n filterTags: \"依標籤篩選已儲存項目\",\n activeFilters: \"目前篩選條件\",\n clearFilters: \"清除篩選\",\n clearAllFilters: \"清除所有篩選條件\",\n removeFilter: \"移除\",\n noFilteredItems: \"找不到相符項目。\",\n noFilteredItemsDescription: \"請調整搜尋條件或移除標籤篩選。\",\n emptyStorageDescription: \"儲存項目後會顯示在這裡。\",\n note: \"備註\",\n saveNote: \"儲存備註\",\n noItems: \"沒有已儲存的項目。\",\n loadingItems: \"正在載入已儲存項目…\",\n errorItems: \"無法載入已儲存項目。\",\n search: \"搜尋已儲存項目\",\n sort: \"排序已儲存項目\",\n newest: \"最新優先\",\n oldest: \"最早優先\",\n savedNewest: \"儲存時間最新優先\",\n savedOldest: \"儲存時間最早優先\",\n updatedNewest: \"更新時間最新優先\",\n updatedOldest: \"更新時間最早優先\",\n previousPage: \"上一頁\",\n nextPage: \"下一頁\",\n pagination: \"分頁\",\n page: \"頁\",\n selectItems: \"選取已儲存項目\",\n selectedCount: \"項已選取\",\n deleteSelected: \"刪除所選項目\",\n tagsToApply: \"要套用的標籤\",\n applyTags: \"套用標籤\",\n savedMessage: \"項目已儲存。\",\n removedMessage: \"項目已刪除。\",\n restoredMessage: \"項目已還原。\",\n syncFailedMessage: \"同步失敗。\",\n stalePrunedMessage: \"無法使用的項目已刪除。\",\n undo: \"復原\",\n undoAvailable: \"項目已刪除。要復原嗎?\",\n selectionScope: \"選取範圍\",\n currentPage: \"目前頁面\",\n searchResults: \"目前全部搜尋結果\",\n allItems: \"所有已儲存項目\",\n localVersion: \"本機\",\n remoteVersion: \"遠端\",\n updatedAt: \"更新時間\",\n statusAvailable: \"可用\",\n noteSavedMessage: \"備註已儲存。\",\n exportData: \"匯出JSON\",\n importData: \"匯入JSON\",\n importMode: \"匯入方式\",\n merge: \"合併\",\n replace: \"取代\",\n importedCount: \"項已匯入\",\n failedCount: \"項失敗\",\n storageQuotaError: \"儲存空間已滿。請釋放空間後重試。\",\n statusExpired: \"已過期\",\n statusRemoved: \"已移除\",\n statusDeleted: \"已刪除\",\n statusPrivate: \"不公開\",\n statusUnknown: \"無法使用\",\n retry: \"重試\",\n removeFromList: \"從清單中刪除\",\n pruneStale: \"刪除無法使用的項目\",\n retrySync: \"重試同步\",\n resolveSync: \"解決衝突\",\n keepLocal: \"保留本機版本\",\n useServer: \"使用伺服器版本\",\n manualMerge: \"手動合併\",\n close: \"關閉\",\n backupRecovery: \"從備份還原\",\n backupRecoveryDescription: \"如果本機同步資料損毀,請還原可用的 JSON 備份。\",\n syncPending: \"有變更等待同步。\",\n syncSynced: \"所有變更都已同步。\",\n syncConflict: \"有些變更需要解決衝突。\",\n};\n","import { DE_LABELS } from \"./de\";\nimport { EN_LABELS } from \"./en\";\nimport { ES_LABELS } from \"./es\";\nimport { FIL_LABELS } from \"./fil\";\nimport { FR_LABELS } from \"./fr\";\nimport { ID_LABELS } from \"./id\";\nimport { IT_LABELS } from \"./it\";\nimport { JA_LABELS } from \"./ja\";\nimport { KO_LABELS } from \"./ko\";\nimport { MS_LABELS } from \"./ms\";\nimport { PT_BR_LABELS } from \"./pt-BR\";\nimport { RU_LABELS } from \"./ru\";\nimport { TH_LABELS } from \"./th\";\nimport type { KeepUiLocaleLabels } from \"./types\";\nimport { VI_LABELS } from \"./vi\";\nimport { ZH_HANS_LABELS } from \"./zh-Hans\";\nimport { ZH_HANT_LABELS } from \"./zh-Hant\";\n\nexport const KEEP_BUILT_IN_LOCALES = [\n \"en\",\n \"ja\",\n \"ko\",\n \"zh-Hans\",\n \"zh-Hant\",\n \"th\",\n \"fr\",\n \"es\",\n \"pt-BR\",\n \"it\",\n \"de\",\n \"ru\",\n \"fil\",\n \"vi\",\n \"id\",\n \"ms\",\n] as const;\n\nexport type KeepUiLocale = (typeof KEEP_BUILT_IN_LOCALES)[number];\n\nexport const KEEP_LOCALE_LABELS: Record<KeepUiLocale, KeepUiLocaleLabels> = {\n en: EN_LABELS,\n ja: JA_LABELS,\n ko: KO_LABELS,\n \"zh-Hans\": ZH_HANS_LABELS,\n \"zh-Hant\": ZH_HANT_LABELS,\n th: TH_LABELS,\n fr: FR_LABELS,\n es: ES_LABELS,\n \"pt-BR\": PT_BR_LABELS,\n it: IT_LABELS,\n de: DE_LABELS,\n ru: RU_LABELS,\n fil: FIL_LABELS,\n vi: VI_LABELS,\n id: ID_LABELS,\n ms: MS_LABELS,\n};\n\nconst LOCALE_ALIASES: Record<string, KeepUiLocale> = {\n \"zh-cn\": \"zh-Hans\",\n \"zh-sg\": \"zh-Hans\",\n zh: \"zh-Hans\",\n \"zh-tw\": \"zh-Hant\",\n \"zh-hk\": \"zh-Hant\",\n \"zh-mo\": \"zh-Hant\",\n \"pt-pt\": \"pt-BR\",\n};\n\nexport function normalizeKeepLocale(locale?: string): KeepUiLocale {\n const normalized = locale?.trim().replace(/_/g, \"-\").toLowerCase() ?? \"en\";\n const exact = KEEP_BUILT_IN_LOCALES.find((candidate) => candidate.toLowerCase() === normalized);\n if (exact) return exact;\n if (LOCALE_ALIASES[normalized]) return LOCALE_ALIASES[normalized];\n const language = normalized.split(\"-\")[0];\n const languageMatch = KEEP_BUILT_IN_LOCALES.find((candidate) => candidate.toLowerCase() === language);\n return languageMatch ?? \"en\";\n}\n\nexport function getKeepLocaleLabels(locale?: string): KeepUiLocaleLabels {\n return { ...KEEP_LOCALE_LABELS[normalizeKeepLocale(locale)] };\n}\n","import type { ImportItemsResult } from \"@keepkit/core/core\";\nimport { useKeepContext } from \"@keepkit/core/react\";\nimport type { ChangeEvent } from \"react\";\nimport { useRef, useState } from \"react\";\nimport { useUiLabel } from \"../../../foundation/ui-context\";\n\ntype KeepBackupOptions<TMeta> = {\n filename: string;\n onExport: ((data: string) => void) | undefined;\n onImported: ((result: ImportItemsResult<TMeta>) => void) | undefined;\n};\n\nexport function useKeepBackup<TMeta>({ filename, onExport, onImported }: KeepBackupOptions<TMeta>) {\n const context = useKeepContext<TMeta>();\n const inputRef = useRef<HTMLInputElement>(null);\n const [mode, setMode] = useState<\"merge\" | \"replace\">(\"merge\");\n const [result, setResult] = useState<ImportItemsResult<TMeta>>();\n const [error, setError] = useState<unknown>();\n\n async function exportBackup() {\n setError(undefined);\n try {\n const data = await context.exportBackup();\n onExport?.(data);\n if (typeof document === \"undefined\") return;\n const url = URL.createObjectURL(new Blob([data], { type: \"application/json\" }));\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = filename;\n anchor.click();\n URL.revokeObjectURL(url);\n } catch (cause) {\n setError(cause);\n }\n }\n\n async function importBackup(event: ChangeEvent<HTMLInputElement>) {\n const file = event.currentTarget.files?.[0];\n event.currentTarget.value = \"\";\n if (!file) return;\n setError(undefined);\n setResult(undefined);\n try {\n const imported = await context.importBackup(await file.text(), { mode });\n setResult(imported);\n onImported?.(imported);\n } catch (cause) {\n setError(cause);\n }\n }\n\n return {\n inputRef,\n mode,\n setMode,\n result,\n error,\n isMutating: context.isMutating,\n exportBackup,\n importBackup,\n openFilePicker: () => inputRef.current?.click(),\n labels: {\n export: useUiLabel(\"exportData\"),\n import: useUiLabel(\"importData\"),\n importMode: useUiLabel(\"importMode\"),\n merge: useUiLabel(\"merge\"),\n replace: useUiLabel(\"replace\"),\n importedCount: useUiLabel(\"importedCount\"),\n failedCount: useUiLabel(\"failedCount\"),\n quotaError: useUiLabel(\"storageQuotaError\"),\n },\n };\n}\n","\"use client\";\n\nimport type { ImportItemsResult } from \"@keepkit/core/core\";\nimport type { HTMLAttributes } from \"react\";\nimport { useKeepBackup } from \"./hooks/useKeepBackup\";\n\nexport type KeepBackupProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n filename?: string;\n onExport?: (data: string) => void;\n onImported?: (result: ImportItemsResult<TMeta>) => void;\n};\n\n/** Accessible JSON backup controls backed by the current KeepProvider storage. */\nexport function KeepBackup<TMeta = Record<string, unknown>>({\n filename = \"keepkit-backup.json\",\n onExport,\n onImported,\n ...props\n}: KeepBackupProps<TMeta>) {\n const view = useKeepBackup<TMeta>({ filename, onExport, onImported });\n\n return (\n <section\n {...props}\n data-keepkit=\"backup\"\n data-state={view.error ? \"error\" : view.result ? \"complete\" : \"idle\"}\n data-loading={view.isMutating ? \"true\" : undefined}\n >\n <button\n type=\"button\"\n data-keep-action=\"export-backup\"\n onClick={() => void view.exportBackup()}\n disabled={view.isMutating}\n >\n {view.labels.export}\n </button>\n <label>\n {view.labels.importMode}\n <select\n data-keep-action=\"select-import-mode\"\n value={view.mode}\n onChange={(event) => view.setMode(event.currentTarget.value as \"merge\" | \"replace\")}\n >\n <option value=\"merge\">{view.labels.merge}</option>\n <option value=\"replace\">{view.labels.replace}</option>\n </select>\n </label>\n <button type=\"button\" data-keep-action=\"import-backup\" onClick={view.openFilePicker} disabled={view.isMutating}>\n {view.labels.import}\n </button>\n <input\n ref={view.inputRef}\n type=\"file\"\n data-keep-action=\"select-backup-file\"\n accept=\"application/json,.json\"\n aria-label={view.labels.import}\n onChange={(event) => void view.importBackup(event)}\n />\n {view.result ? (\n <p role=\"status\">\n {view.result.imported} {view.labels.importedCount}; {view.result.failed} {view.labels.failedCount}\n </p>\n ) : null}\n {view.error ? (\n <p role=\"alert\">{isQuotaError(view.error) ? view.labels.quotaError : getErrorMessage(view.error)}</p>\n ) : null}\n </section>\n );\n}\n\nfunction isQuotaError(error: unknown): boolean {\n if (error instanceof Error && error.name === \"KeepStorageQuotaError\") return true;\n if (error && typeof error === \"object\" && \"cause\" in error) return isQuotaError(error.cause);\n return false;\n}\n\nfunction getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : \"Something went wrong.\";\n}\n","\"use client\";\n\nimport type { KeepItem, KeepItemInput, KeepListQuery } from \"@keepkit/core/core\";\nimport {\n type ComponentType,\n cloneElement,\n createContext,\n type HTMLAttributes,\n type ImgHTMLAttributes,\n isValidElement,\n type ReactElement,\n type ReactNode,\n type Ref,\n type RefCallback,\n useContext,\n useMemo,\n} from \"react\";\n\nexport type RenderProp<TState> = (state: TState) => ReactNode;\n\nconst KeepSearchQueryContext = createContext<string | undefined>(undefined);\n\ntype KeepSearchQueryProviderProps = {\n query: string | undefined;\n children: ReactNode;\n};\n\nexport function KeepSearchQueryProvider({ query, children }: KeepSearchQueryProviderProps) {\n return <KeepSearchQueryContext.Provider value={query}>{children}</KeepSearchQueryContext.Provider>;\n}\n\nexport function useKeepSearchQuery(): string | undefined {\n return useContext(KeepSearchQueryContext);\n}\n\nexport type KeepHighlightProps = {\n children?: ReactNode;\n query?: string;\n};\n\n/** Wraps case-insensitive, literal query matches in a style-free mark element. */\nexport function KeepHighlight({ children, query }: KeepHighlightProps): ReactNode {\n const contextQuery = useKeepSearchQuery();\n const resolvedQuery = query ?? contextQuery;\n const normalizedQuery = resolvedQuery?.trim() ?? \"\";\n return useMemo(() => {\n if (typeof children !== \"string\" || !normalizedQuery) return children ?? null;\n return highlightText(children, normalizedQuery);\n }, [children, normalizedQuery]);\n}\n\nexport function highlightText(text: string, query: string): ReactNode {\n const normalizedQuery = query.trim();\n if (!normalizedQuery) return text;\n const matcher = new RegExp(escapeRegExp(normalizedQuery), \"gi\");\n const parts: ReactNode[] = [];\n let lastIndex = 0;\n let matchIndex = 0;\n\n while (true) {\n const match = matcher.exec(text);\n if (match === null) break;\n const index = match.index;\n if (index > lastIndex) parts.push(text.slice(lastIndex, index));\n parts.push(\n <mark key={`highlight-${matchIndex}`} className=\"keep-highlight\" data-highlight=\"true\">\n {match[0]}\n </mark>,\n );\n lastIndex = index + match[0].length;\n matchIndex += 1;\n }\n if (lastIndex === 0) return text;\n if (lastIndex < text.length) parts.push(text.slice(lastIndex));\n return <>{parts}</>;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nexport type KeepButtonLabels = {\n saved?: ReactNode;\n unsaved?: ReactNode;\n loading?: ReactNode;\n error?: ReactNode;\n savedAriaLabel?: string;\n unsavedAriaLabel?: string;\n};\n\nexport type KeepButtonIconProps = { \"aria-hidden\"?: boolean; className?: string };\nexport type KeepButtonIcon = ReactNode | ComponentType<KeepButtonIconProps>;\nexport type KeepButtonIcons = {\n save?: KeepButtonIcon;\n saved?: KeepButtonIcon;\n remove?: KeepButtonIcon;\n loading?: KeepButtonIcon;\n error?: KeepButtonIcon;\n};\n\nexport type KeepImageProps = ImgHTMLAttributes<HTMLImageElement> & {\n src: string;\n alt: string;\n};\n\nexport function toKeepButtonItem<TMeta>(item: KeepItem<TMeta>): KeepItemInput<TMeta> {\n return {\n id: item.id,\n meta: item.meta,\n targetType: item.targetType,\n note: item.note,\n tags: item.tags,\n archived: item.archived,\n pinned: item.pinned,\n collectionId: item.collectionId,\n };\n}\n\nexport function getMetaTitle<TMeta>(meta: TMeta): string | undefined {\n if (typeof meta !== \"object\" || meta === null || !(\"title\" in meta)) return undefined;\n const title = (meta as { title?: unknown }).title;\n return typeof title === \"string\" && title.trim() ? title.trim() : undefined;\n}\n\nexport function normalizeUiTags(tags: string[]): string[] {\n return [...new Set(tags.map((tag) => tag.trim()).filter(Boolean))];\n}\n\nexport function sortToValue(sort: KeepListQuery[\"sort\"]): `${\"savedAt\" | \"updatedAt\"}:${\"asc\" | \"desc\"}` {\n return `${sort?.by ?? \"updatedAt\"}:${sort?.direction ?? \"desc\"}`;\n}\n\nexport function resolveContent<TState>(content: ReactNode | RenderProp<TState>, state: TState): ReactNode {\n return typeof content === \"function\" ? content(state) : content;\n}\n\ntype MergeableProps = Record<string, unknown>;\n\n/** Combines callback and object refs while preserving every ref target. */\nexport function composeRefs<T>(...refs: Array<Ref<T> | null | undefined>): RefCallback<T> {\n return (value) => {\n for (const ref of refs) {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref !== null && ref !== undefined) {\n ref.current = value;\n }\n }\n };\n}\n\n/** Chains child and component event handlers while preserving both handlers' event order. */\nexport function chainedFunction<T extends (...args: never[]) => unknown>(\n childHandler: T | undefined,\n parentHandler: T | undefined,\n): T | undefined {\n if (!childHandler) return parentHandler;\n if (!parentHandler) return childHandler;\n return ((...args: never[]) => {\n childHandler(...args);\n parentHandler(...args);\n }) as T;\n}\n\n/** Merges slot props without dropping child classes, styles, ARIA attributes, or events. */\nexport function mergeProps<T extends MergeableProps>(childProps: T, parentProps: Partial<T> & MergeableProps): T {\n const merged: MergeableProps = { ...parentProps, ...childProps };\n if (\"ref\" in childProps || \"ref\" in parentProps) {\n merged.ref = composeRefs(\n childProps.ref as Ref<never> | null | undefined,\n parentProps.ref as Ref<never> | null | undefined,\n );\n }\n const className = mergeClassNames(childProps.className, parentProps.className);\n if (className) merged.className = className;\n const style = mergeStyles(childProps.style, parentProps.style);\n if (style) merged.style = style;\n\n for (const key of Object.keys(parentProps)) {\n if (!isEventProp(key)) continue;\n const chained = chainedFunction(getHandler(childProps[key]), getHandler(parentProps[key]));\n if (chained) merged[key] = chained;\n }\n\n for (const [key, value] of Object.entries(merged)) {\n if (value === undefined && key.startsWith(\"aria-\") && childProps[key] !== undefined) {\n merged[key] = childProps[key];\n }\n }\n return merged as T;\n}\n\nfunction getHandler(value: unknown): ((...args: never[]) => unknown) | undefined {\n return typeof value === \"function\" ? (value as (...args: never[]) => unknown) : undefined;\n}\n\nfunction isEventProp(key: string): boolean {\n return key.startsWith(\"on\") && key.length > 2 && key[2] === key[2]?.toUpperCase();\n}\n\nfunction mergeClassNames(childClassName: unknown, parentClassName: unknown): string | undefined {\n const values = [childClassName, parentClassName].filter(\n (value): value is string => typeof value === \"string\" && Boolean(value),\n );\n return values.length > 0 ? values.join(\" \") : undefined;\n}\n\nfunction mergeStyles(childStyle: unknown, parentStyle: unknown): Record<string, unknown> | undefined {\n if (!childStyle && !parentStyle) return undefined;\n return {\n ...(isObject(childStyle) ? childStyle : {}),\n ...(isObject(parentStyle) ? parentStyle : {}),\n };\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nexport function createSlot(\n child: ReactElement<MergeableProps>,\n props: MergeableProps,\n body?: ReactNode,\n): ReactElement<MergeableProps> {\n const nextProps = body === undefined ? props : { ...props, children: body };\n return cloneElement(child, mergeProps(child.props, nextProps));\n}\n\nexport function renderRoot(\n asChild: boolean,\n child: ReactNode,\n props: HTMLAttributes<HTMLElement> & Record<string, unknown>,\n body: ReactNode,\n componentName: string,\n): ReactElement {\n if (asChild) {\n if (!isValidElement(child)) throw new Error(`${componentName} with asChild requires a single React element child.`);\n return createSlot(child as ReactElement<MergeableProps>, props, body);\n }\n return <div {...props}>{body}</div>;\n}\n","import type { KeepItem, KeepListQuery } from \"@keepkit/core/core\";\nimport { useKeepList } from \"@keepkit/core/react\";\nimport { useState } from \"react\";\nimport { normalizeUiTags } from \"../../../foundation/shared\";\nimport { useUiLabel } from \"../../../foundation/ui-context\";\nimport type { KeepBulkActionsState, KeepSelectionScope } from \"../KeepBulkActions\";\n\ntype KeepBulkActionsOptions<TMeta> = {\n query: KeepListQuery<TMeta> | undefined;\n controlledSelectedIds: string[] | undefined;\n defaultSelectedIds: string[];\n onSelectedIdsChange: ((ids: string[]) => void) | undefined;\n onCompleted: ((action: \"remove\" | \"tags\", ids: string[]) => void) | undefined;\n controlledScope: KeepSelectionScope | undefined;\n onSelectionScopeChange: ((scope: KeepSelectionScope) => void) | undefined;\n};\n\n/** Returns whether every visible item is selected. Empty lists are never all selected. */\nexport function isAllSelected<TMeta>(\n items: readonly Pick<KeepItem<TMeta>, \"id\">[],\n selectedIds: readonly string[],\n): boolean {\n if (items.length === 0) return false;\n const selected = new Set(selectedIds);\n return items.every((item) => selected.has(item.id));\n}\n\n/** Toggles only the visible items, preserving selections outside the current query or page. */\nexport function toggleSelectAll<TMeta>(\n items: readonly Pick<KeepItem<TMeta>, \"id\">[],\n selectedIds: readonly string[],\n): string[] {\n const visibleIds = new Set(items.map((item) => item.id));\n if (isAllSelected(items, selectedIds)) return selectedIds.filter((id) => !visibleIds.has(id));\n const nextIds = [...selectedIds];\n for (const item of items) {\n if (!nextIds.includes(item.id)) nextIds.push(item.id);\n }\n return nextIds;\n}\n\nexport function useKeepBulkActions<TMeta>(options: KeepBulkActionsOptions<TMeta>) {\n const {\n query,\n controlledSelectedIds,\n defaultSelectedIds,\n onSelectedIdsChange,\n onCompleted,\n controlledScope,\n onSelectionScopeChange,\n } = options;\n const list = useKeepList<TMeta>(query);\n const queryList = useKeepList<TMeta>(query ? { ...query, pagination: undefined } : { pagination: undefined });\n const allList = useKeepList<TMeta>({ pagination: undefined });\n const [uncontrolledScope, setUncontrolledScope] = useState<KeepSelectionScope>(controlledScope ?? \"page\");\n const selectionScope = controlledScope ?? uncontrolledScope;\n const targetItems =\n selectionScope === \"page\" ? list.items : selectionScope === \"query\" ? queryList.items : allList.items;\n const [uncontrolledSelectedIds, setUncontrolledSelectedIds] = useState(defaultSelectedIds);\n const selectedIds = controlledSelectedIds ?? uncontrolledSelectedIds;\n const selected = new Set(selectedIds);\n const [tagsInput, setTagsInput] = useState(\"\");\n\n const setSelectionScope = (scope: KeepSelectionScope) => {\n if (controlledScope === undefined) setUncontrolledScope(scope);\n onSelectionScopeChange?.(scope);\n };\n const setSelectedIds = (ids: string[]) => {\n if (controlledSelectedIds === undefined) setUncontrolledSelectedIds(ids);\n onSelectedIdsChange?.(ids);\n };\n const toggle = (id: string) =>\n setSelectedIds(selected.has(id) ? selectedIds.filter((current) => current !== id) : [...selectedIds, id]);\n const allSelected = isAllSelected(targetItems, selectedIds);\n const toggleAll = () => setSelectedIds(toggleSelectAll(targetItems, selectedIds));\n const remove = async () => {\n const ids = [...selectedIds];\n await list.removeBatchWithUndo(ids);\n onCompleted?.(\"remove\", ids);\n setSelectedIds([]);\n };\n const updateTags = async () => {\n const ids = [...selectedIds];\n await list.updateTagsBatch(ids, normalizeUiTags(tagsInput.split(\",\")));\n onCompleted?.(\"tags\", ids);\n setSelectedIds([]);\n };\n const state: KeepBulkActionsState<TMeta> = {\n items: targetItems,\n selectedIds,\n selectedCount: selectedIds.length,\n isAllSelected: allSelected,\n allSelected,\n tagsInput,\n setTagsInput,\n toggle,\n toggleSelectAll: toggleAll,\n toggleAll,\n remove,\n updateTags,\n isMutating: list.isMutating,\n selectionScope,\n setSelectionScope,\n };\n\n return {\n state,\n selected,\n isLoading: list.isLoading,\n labels: {\n selectItems: useUiLabel(\"selectItems\"),\n selectedCount: useUiLabel(\"selectedCount\"),\n deleteSelected: useUiLabel(\"deleteSelected\"),\n tags: useUiLabel(\"tagsToApply\"),\n applyTags: useUiLabel(\"applyTags\"),\n selectionScope: useUiLabel(\"selectionScope\"),\n currentPage: useUiLabel(\"currentPage\"),\n searchResults: useUiLabel(\"searchResults\"),\n allItems: useUiLabel(\"allItems\"),\n },\n };\n}\n","\"use client\";\n\nimport type { KeepItem } from \"@keepkit/core/core\";\nimport type { InputHTMLAttributes, ReactNode } from \"react\";\n\nexport type KeepItemCheckboxProps<TMeta = Record<string, unknown>> = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"type\" | \"checked\" | \"defaultChecked\" | \"onChange\"\n> & {\n item: KeepItem<TMeta>;\n checked?: boolean;\n label?: ReactNode;\n onCheckedChange?: (checked: boolean) => void;\n};\n\n/** A reusable accessible selection checkbox for a saved item. */\nexport function KeepItemCheckbox<TMeta = Record<string, unknown>>({\n item,\n checked = false,\n label,\n onCheckedChange,\n \"aria-label\": ariaLabel,\n ...props\n}: KeepItemCheckboxProps<TMeta>) {\n const itemLabel = getItemLabel(item) ?? item.id;\n const accessibleLabel = ariaLabel ?? (typeof label === \"string\" ? label : itemLabel);\n return (\n <input\n {...props}\n type=\"checkbox\"\n checked={checked}\n data-keepkit=\"item-checkbox\"\n data-keep-action=\"select-item\"\n data-state={checked ? \"checked\" : \"unchecked\"}\n data-disabled={props.disabled ? \"true\" : undefined}\n aria-label={accessibleLabel}\n onChange={(event) => onCheckedChange?.(event.currentTarget.checked)}\n />\n );\n}\n\nfunction getItemLabel<TMeta>(item: KeepItem<TMeta>): string | undefined {\n if (typeof item.meta !== \"object\" || item.meta === null || !(\"title\" in item.meta)) return undefined;\n const title = (item.meta as { title?: unknown }).title;\n return typeof title === \"string\" && title.trim() ? title.trim() : undefined;\n}\n","\"use client\";\n\nimport type { KeepItem, KeepListQuery } from \"@keepkit/core/core\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { getMetaTitle, type RenderProp } from \"../../foundation/shared\";\nimport { useKeepBulkActions } from \"./hooks/useKeepBulkActions\";\nimport { KeepItemCheckbox } from \"./KeepItemCheckbox\";\n\nexport { isAllSelected, toggleSelectAll } from \"./hooks/useKeepBulkActions\";\n\nexport type KeepBulkActionsState<TMeta = Record<string, unknown>> = {\n items: KeepItem<TMeta>[];\n selectedIds: string[];\n selectedCount: number;\n isAllSelected: boolean;\n allSelected: boolean;\n tagsInput: string;\n setTagsInput: (value: string) => void;\n toggle: (id: string) => void;\n toggleSelectAll: () => void;\n toggleAll: () => void;\n remove: () => Promise<void>;\n updateTags: () => Promise<void>;\n isMutating: boolean;\n selectionScope: KeepSelectionScope;\n setSelectionScope: (scope: KeepSelectionScope) => void;\n};\n\nexport type KeepSelectionScope = \"page\" | \"query\" | \"all\";\n\nexport type KeepBulkActionsProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n query?: KeepListQuery<TMeta>;\n selectedIds?: string[];\n defaultSelectedIds?: string[];\n onSelectedIdsChange?: (ids: string[]) => void;\n renderItem?: (item: KeepItem<TMeta>, selected: boolean) => ReactNode;\n onCompleted?: (action: \"remove\" | \"tags\", ids: string[]) => void;\n selectionScope?: KeepSelectionScope;\n onSelectionScopeChange?: (scope: KeepSelectionScope) => void;\n render?: RenderProp<KeepBulkActionsState<TMeta>>;\n children?: ReactNode | RenderProp<KeepBulkActionsState<TMeta>>;\n};\n\n/** Selects visible items and performs one storage operation for the whole selection. */\nexport function KeepBulkActions<TMeta = Record<string, unknown>>({\n query,\n selectedIds: controlledSelectedIds,\n defaultSelectedIds = [],\n onSelectedIdsChange,\n renderItem,\n onCompleted,\n selectionScope: controlledScope,\n onSelectionScopeChange,\n render,\n children,\n ...props\n}: KeepBulkActionsProps<TMeta>) {\n const { state, selected, isLoading, labels } = useKeepBulkActions<TMeta>({\n query,\n controlledSelectedIds,\n defaultSelectedIds,\n onSelectedIdsChange,\n onCompleted,\n controlledScope,\n onSelectionScopeChange,\n });\n const body = render\n ? render(state)\n : typeof children === \"function\"\n ? children(state)\n : (children ?? (\n <>\n <fieldset>\n <legend>{labels.selectItems}</legend>\n <label>\n {labels.selectionScope}\n <select\n data-keep-action=\"select-scope\"\n value={state.selectionScope}\n onChange={(event) => state.setSelectionScope(event.currentTarget.value as KeepSelectionScope)}\n >\n <option value=\"page\">{labels.currentPage}</option>\n <option value=\"query\">{labels.searchResults}</option>\n <option value=\"all\">{labels.allItems}</option>\n </select>\n </label>\n <label>\n <input\n type=\"checkbox\"\n data-keep-action=\"select-all\"\n checked={state.allSelected}\n onChange={state.toggleAll}\n aria-label={labels.selectItems}\n />\n {state.selectedIds.length} {labels.selectedCount}\n </label>\n {state.items.map((item) => (\n <span key={item.id}>\n <KeepItemCheckbox\n item={item}\n checked={selected.has(item.id)}\n onCheckedChange={() => state.toggle(item.id)}\n />\n {renderItem ? renderItem(item, selected.has(item.id)) : (getMetaTitle(item.meta) ?? item.id)}\n </span>\n ))}\n </fieldset>\n <button\n type=\"button\"\n data-keep-action=\"delete-selected\"\n onClick={() => void state.remove()}\n disabled={state.selectedIds.length === 0 || state.isMutating}\n >\n {labels.deleteSelected}\n </button>\n <label>\n {labels.tags}\n <input\n data-keep-action=\"edit-tags\"\n value={state.tagsInput}\n onChange={(event) => state.setTagsInput(event.currentTarget.value)}\n />\n </label>\n <button\n type=\"button\"\n data-keep-action=\"apply-tags\"\n onClick={() => void state.updateTags()}\n disabled={state.selectedIds.length === 0 || state.isMutating}\n >\n {labels.applyTags}\n </button>\n </>\n ));\n return (\n <section\n {...props}\n data-keepkit=\"bulk-actions\"\n aria-busy={state.isMutating || props[\"aria-busy\"]}\n data-state={state.selectedIds.length > 0 ? \"selected\" : \"idle\"}\n data-loading={isLoading || state.isMutating ? \"true\" : undefined}\n >\n {body}\n </section>\n );\n}\n","\"use client\";\n\nimport {\n KeepButton as CoreKeepButton,\n type KeepButtonProps as CoreKeepButtonProps,\n type KeepButtonState,\n} from \"@keepkit/core/react\";\nimport { createElement, type MouseEvent, type ReactNode, type Ref, useEffect, useRef } from \"react\";\nimport type { KeepButtonIcon, KeepButtonIcons, KeepButtonLabels } from \"../../foundation/shared\";\nimport { useKeepButton } from \"./hooks/useKeepButton\";\n\nexport type { KeepButtonIcon, KeepButtonIconProps, KeepButtonIcons, KeepButtonLabels } from \"../../foundation/shared\";\n\nexport type KeepButtonProps<TMeta = Record<string, unknown>> = CoreKeepButtonProps<TMeta> & {\n ref?: Ref<HTMLElement> | { readonly current: unknown };\n labels?: KeepButtonLabels;\n icons?: KeepButtonIcons;\n iconOnly?: boolean;\n showLabel?: boolean;\n iconClassName?: string;\n};\n\n/** A style-free save toggle with localized labels and the core button's ARIA/asChild behavior. */\nexport function KeepButton<TMeta = Record<string, unknown>>({\n labels,\n icons,\n iconOnly = false,\n showLabel = true,\n iconClassName,\n onClick,\n onToggleError,\n ...props\n}: KeepButtonProps<TMeta>) {\n const view = useKeepButton<TMeta>({ item: props.item, labels, icons, children: props.children });\n const pendingToggle = useRef<{ wasSaved: boolean; item: KeepButtonState<TMeta>[\"item\"] } | null>(null);\n useEffect(() => {\n const pending = pendingToggle.current;\n if (!pending || view.buttonState.isMutating || pending.wasSaved === view.buttonState.isSaved) return;\n pendingToggle.current = null;\n if (view.buttonState.isSaved && view.buttonState.item) {\n view.emitFeedback({ type: \"item-saved\", item: view.buttonState.item, message: view.labels.savedMessage });\n return;\n }\n if (!pending.item) return;\n const removedItem = pending.item;\n view.emitFeedback({\n type: \"item-removed\",\n item: removedItem,\n message: view.labels.removedMessage,\n undoLabel: view.labels.undo,\n undo: async () => {\n await view.buttonState.save();\n view.emitFeedback({\n type: \"item-restored\",\n item: removedItem,\n items: [removedItem],\n message: view.labels.restoredMessage,\n });\n },\n });\n }, [view]);\n const getStateContent = (state: KeepButtonState<TMeta>): ReactNode => {\n if (typeof props.children === \"function\") return props.children(state);\n if (props.children !== undefined) return props.children;\n const label = state.error\n ? (labels?.error ?? view.labels.error)\n : state.isMutating\n ? (labels?.loading ?? view.labels.loading)\n : state.isSaved\n ? (labels?.saved ?? view.labels.saved)\n : (labels?.unsaved ?? view.labels.save);\n if (!icons) return label;\n const icon = state.error\n ? icons.error\n : state.isMutating\n ? icons.loading\n : state.isSaved\n ? (icons.remove ?? icons.saved)\n : icons.save;\n return (\n <>\n {renderIcon(icon, iconClassName)}\n {showLabel && !iconOnly ? label : null}\n </>\n );\n };\n const sharedProps = {\n ...props,\n onClick: (event: MouseEvent<HTMLElement>) => {\n onClick?.(event as MouseEvent<HTMLButtonElement> & MouseEvent<HTMLElement>);\n if (!event.defaultPrevented) {\n pendingToggle.current = { wasSaved: view.buttonState.isSaved, item: view.buttonState.item };\n }\n },\n onToggleError: (error: unknown) => {\n pendingToggle.current = null;\n onToggleError?.(error);\n },\n \"data-keepkit\": \"button\",\n \"data-keep-action\": \"toggle-save\",\n \"data-has-custom-icon\": icons ? \"true\" : undefined,\n \"data-icon-only\": iconOnly ? \"true\" : undefined,\n \"aria-busy\": props[\"aria-busy\"] ?? (view.buttonState.isLoading || view.buttonState.isMutating),\n savedLabel: labels?.saved ?? props.savedLabel ?? view.labels.saved,\n unsavedLabel: labels?.unsaved ?? props.unsavedLabel ?? view.labels.save,\n savedAriaLabel: labels?.savedAriaLabel ?? props.savedAriaLabel,\n unsavedAriaLabel: labels?.unsavedAriaLabel ?? props.unsavedAriaLabel,\n };\n if (!view.customStateLabel) return <CoreKeepButton<TMeta> {...sharedProps} />;\n return (\n <CoreKeepButton<TMeta> {...sharedProps}>\n {(state: KeepButtonState<TMeta>) => <>{getStateContent(state)}</>}\n </CoreKeepButton>\n );\n}\n\nfunction renderIcon(icon: KeepButtonIcon | undefined, className?: string): ReactNode {\n if (typeof icon === \"function\") return createElement(icon, { \"aria-hidden\": true, className });\n return icon ?? null;\n}\n","import type { KeepButtonState } from \"@keepkit/core/react\";\nimport { useKeepItem } from \"@keepkit/core/react\";\nimport type { ReactNode } from \"react\";\nimport type { KeepButtonIcons, KeepButtonLabels } from \"../../../foundation/shared\";\nimport { useKeepUiFeedback, useUiLabel } from \"../../../foundation/ui-context\";\n\ntype KeepButtonOptions<TMeta> = {\n item: Parameters<typeof useKeepItem<TMeta>>[0];\n labels: KeepButtonLabels | undefined;\n icons: KeepButtonIcons | undefined;\n children: ReactNode | ((state: KeepButtonState<TMeta>) => ReactNode);\n};\n\nexport function useKeepButton<TMeta>({ item, labels, icons, children }: KeepButtonOptions<TMeta>) {\n return {\n buttonState: useKeepItem<TMeta>(item),\n emitFeedback: useKeepUiFeedback<TMeta>(),\n customStateLabel:\n labels?.loading !== undefined || labels?.error !== undefined || (icons !== undefined && children === undefined),\n labels: {\n save: useUiLabel(\"save\", typeof labels?.unsaved === \"string\" ? labels.unsaved : undefined),\n saved: useUiLabel(\"saved\", typeof labels?.saved === \"string\" ? labels.saved : undefined),\n loading: useUiLabel(\"loading\", typeof labels?.loading === \"string\" ? labels.loading : undefined),\n error: useUiLabel(\"error\", typeof labels?.error === \"string\" ? labels.error : undefined),\n savedMessage: useUiLabel(\"savedMessage\"),\n removedMessage: useUiLabel(\"removedMessage\"),\n restoredMessage: useUiLabel(\"restoredMessage\"),\n undo: useUiLabel(\"undo\"),\n },\n };\n}\n","\"use client\";\n\nimport type { KeepItem, KeepItemInput } from \"@keepkit/core/core\";\nimport { useKeepItem } from \"@keepkit/core/react\";\nimport {\n type HTMLAttributes,\n type ReactNode,\n type RefObject,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n} from \"react\";\nimport { useUiLabel } from \"../../foundation/ui-context\";\nimport { type KeepQuickEditorProps, KeepQuickEditorView, useKeepQuickEditor } from \"../editor/KeepQuickEditor\";\nimport { KeepButton, type KeepButtonProps } from \"./KeepButton\";\n\nexport type KeepSavePopoverProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> & {\n item: KeepItemInput<TMeta>;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n dialogLabel?: string;\n buttonProps?: Omit<KeepButtonProps<TMeta>, \"item\" | \"asChild\"> & { asChild?: false };\n editorProps?: Omit<KeepQuickEditorProps<TMeta>, \"item\" | \"onClose\">;\n children?: ReactNode;\n};\n\n/** Opens a quick editor only after this trigger changes from unsaved to saved. */\nexport function KeepSavePopover<TMeta = Record<string, unknown>>({\n item,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n dialogLabel,\n buttonProps,\n editorProps,\n children,\n ...props\n}: KeepSavePopoverProps<TMeta>) {\n const state = useKeepItem(item);\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const isOpen = controlledOpen ?? internalOpen;\n const triggerRef = useRef<HTMLElement>(null);\n const wasOpenRef = useRef(isOpen);\n const previousSaved = useRef(state.isSaved);\n const observedHydration = useRef(!state.isLoading);\n const panelId = useId();\n const titleId = `${panelId}-title`;\n const editSavedItemLabel = useUiLabel(\"editSavedItem\");\n const { ref: _buttonRef, ...resolvedButtonProps } = buttonProps ?? {};\n const setOpen = useCallback(\n (next: boolean) => {\n if (controlledOpen === undefined) setInternalOpen(next);\n onOpenChange?.(next);\n },\n [controlledOpen, onOpenChange],\n );\n\n useEffect(() => {\n if (wasOpenRef.current && !isOpen) window.setTimeout(() => triggerRef.current?.focus(), 0);\n wasOpenRef.current = isOpen;\n }, [isOpen]);\n\n useEffect(() => {\n if (!observedHydration.current) {\n if (state.isLoading) return;\n observedHydration.current = true;\n previousSaved.current = state.isSaved;\n return;\n }\n if (!previousSaved.current && state.isSaved) setOpen(true);\n previousSaved.current = state.isSaved;\n }, [setOpen, state.isLoading, state.isSaved]);\n\n useEffect(() => {\n if (isOpen && observedHydration.current && !state.isSaved) setOpen(false);\n }, [isOpen, setOpen, state.isSaved]);\n\n const currentItem = state.item as KeepItem<TMeta> | undefined;\n return (\n <div {...props} data-keepkit=\"save-popover\" data-open={isOpen ? \"true\" : \"false\"}>\n <KeepButton\n {...resolvedButtonProps}\n item={item}\n asChild={false}\n ref={triggerRef}\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n aria-controls={panelId}\n />\n {isOpen && currentItem ? (\n <KeepSavePopoverPanel\n id={panelId}\n titleId={titleId}\n dialogLabel={dialogLabel ?? editSavedItemLabel}\n item={currentItem}\n editorProps={editorProps}\n triggerRef={triggerRef}\n onClose={() => setOpen(false)}\n >\n {children}\n </KeepSavePopoverPanel>\n ) : null}\n </div>\n );\n}\n\ntype KeepSavePopoverPanelProps<TMeta> = {\n id: string;\n titleId: string;\n dialogLabel: string;\n item: KeepItem<TMeta>;\n editorProps?: KeepSavePopoverProps<TMeta>[\"editorProps\"];\n triggerRef: RefObject<HTMLElement | null>;\n onClose: () => void;\n children?: ReactNode;\n};\n\nfunction KeepSavePopoverPanel<TMeta>({\n id,\n titleId,\n dialogLabel,\n item,\n editorProps,\n triggerRef,\n onClose,\n children,\n}: KeepSavePopoverPanelProps<TMeta>) {\n const { debounceMs, onSaved, onSaveError, ...editorViewProps } = editorProps ?? {};\n const { state } = useKeepQuickEditor(item, { debounceMs, onSaved, onSaveError });\n const panelRef = useRef<HTMLDivElement>(null);\n const closingRef = useRef<Promise<void> | null>(null);\n const closeLabel = useUiLabel(\"close\");\n const requestClose = useCallback(() => {\n if (closingRef.current) return closingRef.current;\n const promise = state\n .flush()\n .then(onClose)\n .catch(() => {\n window.setTimeout(() => panelRef.current?.querySelector<HTMLElement>('[role=\"alert\"]')?.focus(), 0);\n })\n .finally(() => {\n closingRef.current = null;\n });\n closingRef.current = promise;\n return promise;\n }, [onClose, state]);\n\n useEffect(() => {\n const frame = window.requestAnimationFrame(() => {\n panelRef.current\n ?.querySelector<HTMLElement>('[data-keepkit=\"quick-editor\"] :is(textarea, input, select, button)')\n ?.focus();\n });\n return () => window.cancelAnimationFrame(frame);\n }, []);\n\n useEffect(() => {\n const closeFromOutside = (event: PointerEvent) => {\n const target = event.target;\n if (!(target instanceof Node) || panelRef.current?.contains(target) || triggerRef.current?.contains(target))\n return;\n void requestClose();\n };\n document.addEventListener(\"pointerdown\", closeFromOutside);\n return () => document.removeEventListener(\"pointerdown\", closeFromOutside);\n }, [requestClose, triggerRef]);\n\n return (\n <div\n ref={panelRef}\n id={id}\n role=\"dialog\"\n aria-labelledby={titleId}\n data-keep-popover-panel=\"true\"\n data-save-status={state.saveStatus}\n onKeyDownCapture={(event) => {\n if (event.key !== \"Escape\") return;\n event.preventDefault();\n event.stopPropagation();\n void requestClose();\n }}\n >\n <h2 id={titleId} data-keep-popover-title=\"true\">\n {dialogLabel}\n </h2>\n {children}\n <KeepQuickEditorView {...editorViewProps} state={state} focusScopeRef={panelRef} />\n <button\n type=\"button\"\n onClick={() => void requestClose()}\n disabled={state.isSaving}\n data-keep-action=\"close-save-popover\"\n >\n {closeLabel}\n </button>\n </div>\n );\n}\n","\"use client\";\n\nimport type { KeepItem } from \"@keepkit/core/core\";\nimport { useKeepContext, useKeepItem } from \"@keepkit/core/react\";\nimport {\n type FormEvent,\n type FormHTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n type RefObject,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { useUiLabel } from \"../../foundation/ui-context\";\n\nexport type KeepQuickEditorState<TMeta = Record<string, unknown>> = {\n item: KeepItem<TMeta>;\n note: string;\n tags: string[];\n collectionId?: string;\n setNote: (value: string) => void;\n setTags: (value: string[]) => void;\n setCollectionId: (value?: string) => void;\n isDirty: boolean;\n isSaving: boolean;\n saveStatus: \"idle\" | \"dirty\" | \"saving\" | \"saved\" | \"error\";\n error: unknown | null;\n flush: () => Promise<void>;\n};\n\nexport function useKeepQuickEditor<TMeta = Record<string, unknown>>(\n item: KeepItem<TMeta>,\n options: {\n debounceMs?: number;\n onSaved?: (item: KeepItem<TMeta>) => void;\n onSaveError?: (error: unknown) => void;\n } = {},\n) {\n const { debounceMs = 300, onSaved, onSaveError } = options;\n const itemState = useKeepItem<TMeta>(item);\n const { error, isMutating, moveToCollection, updateNote, updateTags } = itemState;\n const baseline = itemState.item ?? item;\n const [note, setNote] = useState(baseline.note ?? \"\");\n const [tags, setTags] = useState(baseline.tags ?? []);\n const [collectionId, setCollectionId] = useState(baseline.collectionId);\n const [saveStatus, setSaveStatus] = useState<KeepQuickEditorState<TMeta>[\"saveStatus\"]>(\"idle\");\n const [saveError, setSaveError] = useState<unknown | null>(null);\n const baselineRef = useRef({\n note: baseline.note ?? \"\",\n tags: baseline.tags ?? [],\n collectionId: baseline.collectionId,\n });\n const draftRef = useRef({ note, tags, collectionId });\n const flushRequestedRef = useRef(false);\n const flushPromiseRef = useRef<Promise<void> | null>(null);\n draftRef.current = { note, tags, collectionId };\n useEffect(() => {\n if (\n draftRef.current.note === baselineRef.current.note &&\n sameTags(draftRef.current.tags, baselineRef.current.tags) &&\n draftRef.current.collectionId === baselineRef.current.collectionId\n ) {\n setNote(baseline.note ?? \"\");\n setTags(baseline.tags ?? []);\n setCollectionId(baseline.collectionId);\n baselineRef.current = {\n note: baseline.note ?? \"\",\n tags: baseline.tags ?? [],\n collectionId: baseline.collectionId,\n };\n }\n }, [baseline]);\n const isDirty =\n note !== baselineRef.current.note ||\n !sameTags(tags, baselineRef.current.tags) ||\n collectionId !== baselineRef.current.collectionId;\n useEffect(() => {\n if (!isDirty && saveStatus === \"dirty\" && !flushPromiseRef.current) setSaveStatus(\"idle\");\n }, [isDirty, saveStatus]);\n const flush = useCallback((): Promise<void> => {\n flushRequestedRef.current = true;\n if (flushPromiseRef.current) return flushPromiseRef.current;\n\n const run = async () => {\n let saved = false;\n while (flushRequestedRef.current || !sameDraft(draftRef.current, baselineRef.current)) {\n flushRequestedRef.current = false;\n const draft = { ...draftRef.current, tags: [...draftRef.current.tags] };\n const previous = baselineRef.current;\n if (sameDraft(draft, previous)) continue;\n\n setSaveError(null);\n setSaveStatus(\"saving\");\n try {\n if (draft.note !== previous.note) await updateNote(draft.note.trim() || undefined);\n if (!sameTags(draft.tags, previous.tags)) await updateTags(draft.tags);\n if (draft.collectionId !== previous.collectionId) await moveToCollection(draft.collectionId);\n } catch (error) {\n setSaveError(error);\n setSaveStatus(\"error\");\n onSaveError?.(error);\n throw error;\n }\n\n baselineRef.current = draft;\n saved = true;\n const { collectionId: _oldCollectionId, ...withoutCollection } = baseline;\n onSaved?.({\n ...withoutCollection,\n note: draft.note.trim() || undefined,\n tags: draft.tags,\n ...(draft.collectionId ? { collectionId: draft.collectionId } : {}),\n });\n if (!sameDraft(draftRef.current, baselineRef.current)) flushRequestedRef.current = true;\n }\n if (saved) setSaveStatus(\"saved\");\n };\n\n const promise = run().finally(() => {\n flushPromiseRef.current = null;\n });\n flushPromiseRef.current = promise;\n return promise;\n }, [baseline, moveToCollection, onSaveError, onSaved, updateNote, updateTags]);\n useEffect(() => {\n if (!isDirty || debounceMs <= 0) return;\n const timer = window.setTimeout(() => void flush().catch(() => undefined), debounceMs);\n return () => window.clearTimeout(timer);\n }, [debounceMs, flush, isDirty]);\n return {\n state: {\n item,\n note,\n tags,\n collectionId,\n setNote: (value) => {\n setSaveError(null);\n setSaveStatus(\"dirty\");\n setNote(value);\n },\n setTags: (value) => {\n setSaveError(null);\n setSaveStatus(\"dirty\");\n setTags(value);\n },\n setCollectionId: (value) => {\n setSaveError(null);\n setSaveStatus(\"dirty\");\n setCollectionId(value);\n },\n isDirty,\n isSaving: isMutating || saveStatus === \"saving\",\n saveStatus,\n error: saveError ?? error,\n flush,\n } satisfies KeepQuickEditorState<TMeta>,\n };\n}\n\nexport type KeepQuickEditorProps<TMeta = Record<string, unknown>> = Omit<\n FormHTMLAttributes<HTMLFormElement>,\n \"children\" | \"onSubmit\"\n> & {\n item: KeepItem<TMeta>;\n debounceMs?: number;\n collectionIds?: string[];\n collectionLabels?: Record<string, string>;\n showSaveButton?: boolean;\n children?: ReactNode | ((state: KeepQuickEditorState<TMeta>) => ReactNode);\n onClose?: () => void;\n onSaved?: (item: KeepItem<TMeta>) => void;\n onSaveError?: (error: unknown) => void;\n};\n\n/** A compact, temporary-state editor for note, tags, and collection metadata. */\nexport function KeepQuickEditor<TMeta = Record<string, unknown>>({\n item,\n debounceMs = 300,\n onSaved,\n onSaveError,\n ...props\n}: KeepQuickEditorProps<TMeta>) {\n const view = useKeepQuickEditor(item, { debounceMs, onSaved, onSaveError });\n return <KeepQuickEditorView {...props} state={view.state} />;\n}\n\ntype KeepQuickEditorViewProps<TMeta> = Omit<\n KeepQuickEditorProps<TMeta>,\n \"item\" | \"debounceMs\" | \"onSaved\" | \"onSaveError\"\n> & {\n state: KeepQuickEditorState<TMeta>;\n focusScopeRef?: RefObject<HTMLElement | null>;\n};\n\n/** Internal view used by KeepSavePopover so close requests can await the same editor state. */\nexport function KeepQuickEditorView<TMeta = Record<string, unknown>>({\n state,\n collectionIds,\n collectionLabels,\n showSaveButton = true,\n children,\n onClose,\n focusScopeRef,\n ...props\n}: KeepQuickEditorViewProps<TMeta>) {\n const context = useKeepContext<TMeta>();\n const rootRef = useRef<HTMLFormElement>(null);\n const noteLabel = useUiLabel(\"note\");\n const tagsLabel = useUiLabel(\"tags\");\n const collectionLabel = useUiLabel(\"collection\");\n const uncategorizedLabel = useUiLabel(\"uncategorized\");\n const saveLabel = useUiLabel(\"saveWithNote\");\n const closeLabel = useUiLabel(\"close\");\n const unsavedChangesLabel = useUiLabel(\"unsavedChanges\");\n const savingLabel = useUiLabel(\"saving\");\n const savedLabel = useUiLabel(\"saved\");\n const errorLabel = useUiLabel(\"error\");\n const submit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n void state.flush().catch(() => undefined);\n };\n const onKeyDown = (event: KeyboardEvent<HTMLFormElement>) => {\n props.onKeyDown?.(event);\n if (event.defaultPrevented) return;\n if (event.key === \"Escape\") {\n event.preventDefault();\n void state\n .flush()\n .then(() => onClose?.())\n .catch(() => undefined);\n }\n if (event.key === \"Tab\") trapFocus(event, focusScopeRef?.current ?? rootRef.current);\n };\n const statusMessage =\n state.saveStatus === \"dirty\"\n ? unsavedChangesLabel\n : state.saveStatus === \"saving\"\n ? savingLabel\n : state.saveStatus === \"saved\"\n ? savedLabel\n : state.saveStatus === \"error\"\n ? getErrorMessage(state.error, errorLabel)\n : null;\n const body =\n typeof children === \"function\"\n ? children(state)\n : (children ?? (\n <>\n <label>\n {noteLabel}\n <textarea value={state.note} onChange={(event) => state.setNote(event.currentTarget.value)} />\n </label>\n <label>\n {tagsLabel}\n <input\n value={state.tags.join(\", \")}\n onChange={(event) =>\n state.setTags(\n event.currentTarget.value\n .split(\",\")\n .map((tag) => tag.trim())\n .filter(Boolean),\n )\n }\n />\n </label>\n <label>\n {collectionLabel}\n <select\n value={state.collectionId ?? \"\"}\n onChange={(event) => state.setCollectionId(event.currentTarget.value || undefined)}\n >\n <option value=\"\">{uncategorizedLabel}</option>\n {(\n collectionIds ??\n [\n ...new Set(\n context.items.map((entry) => entry.collectionId).filter((id): id is string => Boolean(id)),\n ),\n ].sort()\n ).map((id) => (\n <option key={id} value={id}>\n {collectionLabels?.[id] ?? id}\n </option>\n ))}\n </select>\n </label>\n {statusMessage ? (\n <p\n role={state.saveStatus === \"error\" ? \"alert\" : \"status\"}\n aria-live={state.saveStatus === \"error\" ? \"assertive\" : \"polite\"}\n tabIndex={state.saveStatus === \"error\" ? -1 : undefined}\n data-keep-editor-status=\"true\"\n data-state={state.saveStatus}\n >\n {statusMessage}\n </p>\n ) : null}\n {showSaveButton ? (\n <button type=\"submit\" disabled={state.isSaving} data-keep-action=\"save-quick-edit\">\n {saveLabel}\n </button>\n ) : null}\n {onClose ? (\n <button\n type=\"button\"\n onClick={() =>\n void state\n .flush()\n .then(onClose)\n .catch(() => undefined)\n }\n disabled={state.isSaving}\n data-keep-action=\"close-quick-edit\"\n >\n {closeLabel}\n </button>\n ) : null}\n </>\n ));\n return (\n <form\n {...props}\n ref={rootRef}\n onSubmit={submit}\n onKeyDown={onKeyDown}\n data-keepkit=\"quick-editor\"\n data-state={state.isDirty ? \"dirty\" : \"clean\"}\n data-save-status={state.saveStatus}\n aria-busy={state.isSaving || props[\"aria-busy\"]}\n >\n {body}\n </form>\n );\n}\n\nfunction sameDraft(\n left: { note: string; tags: string[]; collectionId?: string },\n right: { note: string; tags: string[]; collectionId?: string },\n): boolean {\n return left.note === right.note && sameTags(left.tags, right.tags) && left.collectionId === right.collectionId;\n}\n\nfunction getErrorMessage(error: unknown, fallback: string): string {\n return error instanceof Error ? error.message : fallback;\n}\n\nfunction sameTags(left: string[], right: string[]): boolean {\n return left.length === right.length && left.every((tag, index) => tag === right[index]);\n}\n\nfunction trapFocus(event: KeyboardEvent<HTMLElement>, root: HTMLElement | null): void {\n if (!root) return;\n const elements = [\n ...root.querySelectorAll<HTMLElement>('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'),\n ].filter((element) => !element.hasAttribute(\"disabled\"));\n if (elements.length === 0) return;\n const first = elements[0];\n const last = elements[elements.length - 1];\n if (event.shiftKey && document.activeElement === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault();\n first.focus();\n }\n}\n","import { useKeepContext } from \"@keepkit/core/react\";\nimport { useEffect, useState } from \"react\";\nimport { useKeepUiFeedback, useUiLabel } from \"../../../foundation/ui-context\";\n\nexport function useKeepUndo() {\n const context = useKeepContext();\n const emitFeedback = useKeepUiFeedback();\n const restoredMessage = useUiLabel(\"restoredMessage\");\n const { canUndo, startedAt, expiresAt } = context.undo;\n const [now, setNow] = useState(() => Date.now());\n\n useEffect(() => {\n if (!canUndo || expiresAt === undefined) return;\n setNow(Date.now());\n const timer = setInterval(() => setNow(Date.now()), 250);\n return () => clearInterval(timer);\n }, [canUndo, expiresAt]);\n\n const duration = Math.max(1, (expiresAt ?? now) - (startedAt ?? now));\n const remainingMs = Math.max(0, (expiresAt ?? now) - now);\n const remainingSeconds = Math.max(0, Math.ceil(remainingMs / 1000));\n const progress = Math.min(1, Math.max(0, remainingMs / duration));\n return {\n canUndo,\n expiresAt,\n remainingMs,\n remainingSeconds,\n progress,\n undo: async () => {\n const items = context.lastChange?.items ?? (context.lastChange?.item ? [context.lastChange.item] : []);\n await context.undoLastRemoval();\n if (items.length > 0) {\n emitFeedback({ type: \"item-restored\", item: items[0], items, message: restoredMessage });\n }\n },\n message: useUiLabel(\"undoAvailable\"),\n label: useUiLabel(\"undo\"),\n };\n}\n","\"use client\";\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { useKeepUndo } from \"./hooks/useKeepUndo\";\n\nexport type KeepUndoProps = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n children?: ReactNode;\n label?: ReactNode;\n};\n\n/** Presents the short-lived undo action created by removeWithUndo/removeBatchWithUndo. */\nexport function KeepUndo({ children, label, ...props }: KeepUndoProps) {\n const view = useKeepUndo();\n if (!view.canUndo) return null;\n return (\n <div {...props} role=\"status\" aria-live=\"polite\" data-keepkit=\"undo\" data-state=\"available\">\n <span data-keepkit=\"undo-message\">{children ?? view.message}</span>\n <span data-keepkit=\"undo-countdown\" aria-hidden=\"true\">\n {view.remainingSeconds}s\n </span>\n <progress\n data-keepkit=\"undo-progress\"\n max={1}\n value={view.progress}\n aria-label={String(view.label)}\n aria-valuetext={`${view.remainingSeconds}s`}\n />\n <button type=\"button\" data-keep-action=\"undo\" onClick={() => void view.undo()}>\n {label ?? view.label}\n </button>\n </div>\n );\n}\n","\"use client\";\n\nimport type { KeepItem, KeepListQuery, KeepUrlSyncOptions } from \"@keepkit/core/core\";\nimport { KeepErrorBoundary, type KeepErrorBoundaryProps } from \"@keepkit/core/react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport type { KeepUrlAdapter } from \"../../adapters/url-sync\";\nimport { type RenderProp, resolveContent } from \"../../foundation/shared\";\nimport { KeepBulkActions } from \"../actions/KeepBulkActions\";\nimport type { KeepItemCardProps } from \"../item/KeepItemCard\";\nimport { KeepActiveFiltersSummary } from \"../query/KeepActiveFiltersSummary\";\nimport { KeepCollectionFilter } from \"../query/KeepCollectionFilter\";\nimport { KeepTagFilter } from \"../query/KeepTagFilter\";\nimport { KeepPagination, KeepSearchInput, KeepSortSelect } from \"../query/query-controls\";\nimport { useKeepCollection } from \"./hooks/useKeepCollection\";\nimport { KeepList, type KeepListState } from \"./KeepList\";\n\nexport type KeepCollectionFeature =\n | \"search\"\n | \"sort\"\n | \"pagination\"\n | \"tagFilter\"\n | \"collectionFilter\"\n | \"bulkActions\"\n | \"tags\"\n | \"pin\"\n | \"archive\";\nexport type KeepLayoutPreset = \"list\" | \"grid\" | \"compact\" | \"auto\";\n\nexport type KeepCollectionProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n query?: KeepListQuery<TMeta>;\n pageSize?: number;\n layout?: KeepLayoutPreset;\n urlSync?: boolean | KeepUrlSyncOptions;\n urlAdapter?: KeepUrlAdapter;\n features?: Partial<Record<KeepCollectionFeature, boolean>>;\n collectionLabels?: Record<string, string>;\n renderItem?: (item: KeepItem<TMeta>, state: KeepListState<TMeta>) => ReactNode;\n itemCardProps?: Omit<KeepItemCardProps<TMeta>, \"item\" | \"children\" | \"render\">;\n loading?: ReactNode | RenderProp<KeepListState<TMeta>>;\n /** Alias for `loading`. When neither is provided, KeepList renders skeleton cards. */\n renderLoading?: ReactNode | RenderProp<KeepListState<TMeta>>;\n loadingCount?: number;\n activeFilters?: ReactNode | RenderProp<KeepListState<TMeta>>;\n empty?: ReactNode | RenderProp<KeepListState<TMeta>>;\n error?: ReactNode | RenderProp<KeepListState<TMeta>>;\n fallback?: KeepErrorBoundaryProps[\"fallback\"];\n onBoundaryError?: KeepErrorBoundaryProps[\"onError\"];\n boundaryResetKey?: unknown;\n};\n\n/** A batteries-included collection with query controls and accessible status feedback. */\nexport function KeepCollection<TMeta = Record<string, unknown>>(props: KeepCollectionProps<TMeta>) {\n const { fallback, onBoundaryError, boundaryResetKey, ...collectionProps } = props;\n const content = <KeepCollectionContent<TMeta> {...collectionProps} />;\n if (fallback === undefined && onBoundaryError === undefined) return content;\n return (\n <KeepErrorBoundary fallback={fallback} onError={onBoundaryError} resetKey={boundaryResetKey}>\n {content}\n </KeepErrorBoundary>\n );\n}\n\nfunction KeepCollectionContent<TMeta = Record<string, unknown>>({\n query = {},\n pageSize = 20,\n layout = \"list\",\n urlSync = false,\n urlAdapter,\n features,\n collectionLabels,\n renderItem,\n itemCardProps,\n loading,\n renderLoading,\n loadingCount,\n activeFilters,\n empty,\n error,\n className,\n ...rootProps\n}: Omit<KeepCollectionProps<TMeta>, \"fallback\" | \"onBoundaryError\" | \"boundaryResetKey\">) {\n const view = useKeepCollection<TMeta>({ query, pageSize, urlSync, urlAdapter, features });\n const resolvedItemCardProps = {\n ...itemCardProps,\n showTags: itemCardProps?.showTags ?? view.enabled.tags,\n showPinButton: itemCardProps?.showPinButton ?? view.enabled.pin,\n showArchiveButton: itemCardProps?.showArchiveButton ?? view.enabled.archive,\n };\n\n return (\n <section\n {...rootProps}\n className={className}\n data-keepkit=\"collection\"\n data-layout={layout}\n aria-busy={view.list.isLoading || view.list.isMutating || rootProps[\"aria-busy\"]}\n data-state={getCollectionState(view.list)}\n data-loading={view.list.isLoading || view.list.isMutating ? \"true\" : undefined}\n >\n <div>\n {view.enabled.search ? <KeepSearchInput value={view.searchValue} onValueChange={view.setSearchValue} /> : null}\n {view.enabled.sort ? <KeepSortSelect value={view.sortValue} onValueChange={view.setSortValue} /> : null}\n {view.enabled.tagFilter ? (\n <KeepTagFilter<TMeta> query={query} value={view.activeTags[0]} onValueChange={view.setTag} />\n ) : null}\n {view.enabled.collectionFilter ? (\n <KeepCollectionFilter\n value={view.activeCollection}\n onValueChange={view.setCollection}\n collectionLabels={collectionLabels}\n />\n ) : null}\n </div>\n {activeFilters === undefined ? (\n <KeepActiveFiltersSummary<TMeta>\n search={view.searchValue}\n tags={view.activeTags}\n onSearchChange={view.setSearchValue}\n onTagChange={view.removeTag}\n onClear={view.clearFilters}\n />\n ) : (\n resolveContent(activeFilters, view.list)\n )}\n <KeepList<TMeta>\n query={view.resolvedQuery}\n renderItem={renderItem}\n itemCardProps={resolvedItemCardProps}\n layout={layout}\n loading={loading}\n renderLoading={renderLoading}\n loadingCount={loadingCount}\n onClearFilters={view.clearFilters}\n empty={view.list.totalCount === 0 && view.allState.totalCount > 0 ? undefined : empty}\n error={error}\n />\n {view.enabled.pagination ? (\n <KeepPagination\n totalCount={view.list.totalCount}\n pageSize={view.resolvedPageSize}\n page={view.list.page}\n onPageChange={view.setPage}\n />\n ) : null}\n {view.enabled.bulkActions ? <KeepBulkActions<TMeta> query={view.resolvedQuery} /> : null}\n </section>\n );\n}\n\nfunction getCollectionState<TMeta>(list: KeepListState<TMeta>): \"loading\" | \"error\" | \"empty\" | \"ready\" {\n if (list.error && list.items.length === 0) return \"error\";\n if (list.isLoading && !list.isHydrated) return \"loading\";\n if (list.isHydrated && list.items.length === 0) return \"empty\";\n return \"ready\";\n}\n","\"use client\";\n\nimport type { KeepListQuery } from \"@keepkit/core/core\";\nimport {\n type HTMLAttributes,\n isValidElement,\n type KeyboardEvent,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n type Ref,\n useRef,\n} from \"react\";\nimport { type RenderProp, renderRoot } from \"../../foundation/shared\";\nimport { useUiLabel } from \"../../foundation/ui-context\";\n\nexport type KeepActiveFiltersSummaryProps<TMeta = Record<string, unknown>> = Omit<\n HTMLAttributes<HTMLElement>,\n \"children\"\n> & {\n ref?: Ref<HTMLElement> | { readonly current: unknown };\n query?: KeepListQuery<TMeta>;\n search?: string;\n tags?: readonly string[];\n onSearchChange?: (value: string) => void;\n onTagChange?: (tag: string) => void;\n onClear?: () => void;\n children?: ReactNode | RenderProp<KeepActiveFiltersSummaryState>;\n asChild?: boolean;\n};\n\nexport type KeepActiveFiltersSummaryState = {\n search: string;\n tags: string[];\n hasFilters: boolean;\n clear: () => void;\n removeSearch: () => void;\n removeTag: (tag: string) => void;\n};\n\n/** Lists active search and tag filters with one-tap recovery actions. */\nexport function KeepActiveFiltersSummary<TMeta = Record<string, unknown>>({\n query,\n search: providedSearch,\n tags: providedTags,\n onSearchChange,\n onTagChange,\n onClear,\n children,\n asChild = false,\n className,\n ...rootProps\n}: KeepActiveFiltersSummaryProps<TMeta>) {\n const search = (providedSearch ?? query?.search?.query ?? \"\").trim();\n const tags = normalizeTags(providedTags ?? query?.tags ?? []);\n const hasFilters = Boolean(search) || tags.length > 0;\n const activeFiltersLabel = useUiLabel(\"activeFilters\");\n const clearAllLabel = useUiLabel(\"clearAllFilters\");\n const clearLabel = useUiLabel(\"clearFilters\");\n const removeLabel = useUiLabel(\"removeFilter\");\n const chipRefs = useRef<Array<HTMLButtonElement | null>>([]);\n const filterCount = Number(Boolean(search)) + tags.length;\n\n function focusChip(index: number): void {\n chipRefs.current[index]?.focus();\n }\n\n function focusAfterRemoval(index: number, source: HTMLElement): void {\n const summaryRoot = source.closest<HTMLElement>('[data-keepkit=\"active-filters\"]');\n const fallbackScope =\n source.closest<HTMLElement>('[data-keepkit=\"collection\"]') ?? summaryRoot?.parentElement ?? source.parentElement;\n queueMicrotask(() => {\n const nextIndex = index < filterCount - 1 ? index : index - 1;\n const nextChip = nextIndex >= 0 ? chipRefs.current[nextIndex] : null;\n if (nextChip?.isConnected) {\n nextChip.focus();\n return;\n }\n focusFilterFallback(fallbackScope);\n });\n }\n\n function handleChipKeyDown(event: KeyboardEvent<HTMLButtonElement>, index: number): void {\n const nextIndex = event.key === \"ArrowRight\" ? index + 1 : event.key === \"ArrowLeft\" ? index - 1 : -1;\n if (nextIndex < 0 || nextIndex >= filterCount || !chipRefs.current[nextIndex]) return;\n event.preventDefault();\n focusChip(nextIndex);\n }\n\n function removeSearch(event: MouseEvent<HTMLButtonElement>): void {\n focusAfterRemoval(0, event.currentTarget);\n onSearchChange?.(\"\");\n }\n\n function removeTag(tag: string, index: number, event: MouseEvent<HTMLButtonElement>): void {\n focusAfterRemoval(index, event.currentTarget);\n onTagChange?.(tag);\n }\n const state: KeepActiveFiltersSummaryState = {\n search,\n tags,\n hasFilters,\n clear: () => onClear?.(),\n removeSearch: () => onSearchChange?.(\"\"),\n removeTag: (tag) => onTagChange?.(tag),\n };\n const contentChildren = asChild && isElement(children) ? undefined : children;\n const body =\n typeof contentChildren === \"function\"\n ? contentChildren(state)\n : (contentChildren ??\n (hasFilters ? (\n <>\n <span data-active-filters-label=\"true\">{activeFiltersLabel}</span>\n <ul data-active-filters-list=\"true\">\n {search ? (\n <li data-filter-kind=\"search\">\n <span data-filter-value=\"true\">{search}</span>\n <button\n type=\"button\"\n data-keep-action=\"remove-search-filter\"\n aria-label={`${search} ${removeLabel}`}\n ref={(element) => {\n chipRefs.current[0] = element;\n }}\n onKeyDown={(event) => handleChipKeyDown(event, 0)}\n onClick={removeSearch}\n >\n ×\n </button>\n </li>\n ) : null}\n {tags.map((tag, tagIndex) => (\n <li key={tag} data-filter-kind=\"tag\">\n <span data-filter-value=\"true\">{tag}</span>\n <button\n type=\"button\"\n data-keep-action=\"remove-tag-filter\"\n aria-label={`${tag} ${removeLabel}`}\n ref={(element) => {\n chipRefs.current[tagIndex + Number(Boolean(search))] = element;\n }}\n onKeyDown={(event) => handleChipKeyDown(event, tagIndex + Number(Boolean(search)))}\n onClick={(event) => removeTag(tag, tagIndex + Number(Boolean(search)), event)}\n >\n ×\n </button>\n </li>\n ))}\n </ul>\n <button type=\"button\" data-keep-action=\"clear-filters\" onClick={state.clear}>\n {clearAllLabel || clearLabel}\n </button>\n </>\n ) : null));\n\n if (!hasFilters && !asChild && contentChildren === undefined) return null;\n return renderRoot(\n asChild,\n isElement(children) ? children : undefined,\n {\n ...rootProps,\n className,\n \"data-keepkit\": \"active-filters\",\n \"data-state\": hasFilters ? \"active\" : \"idle\",\n \"aria-label\": rootProps[\"aria-label\"] ?? activeFiltersLabel,\n },\n body,\n \"KeepActiveFiltersSummary\",\n );\n}\n\nfunction normalizeTags(tags: readonly string[]): string[] {\n return [...new Set(tags.map((tag) => tag.trim()).filter(Boolean))];\n}\n\nfunction isElement(value: unknown): value is ReactElement {\n return isValidElement(value);\n}\n\nfunction focusFilterFallback(scope: HTMLElement | null): void {\n const searchInput = scope?.querySelector<HTMLElement>('[data-keep-action=\"search\"]');\n if (searchInput) {\n searchInput.focus();\n return;\n }\n\n const listCard = scope?.querySelector<HTMLElement>('[data-keepkit=\"card\"][tabindex=\"0\"]');\n if (listCard) {\n listCard.focus();\n return;\n }\n\n const list = scope?.querySelector<HTMLElement>('[data-keepkit=\"list\"]');\n if (list) {\n if (!list.hasAttribute(\"tabindex\")) list.tabIndex = -1;\n list.focus();\n }\n}\n","\"use client\";\n\nimport type { KeepItem } from \"@keepkit/core/core\";\nimport { useKeepContext } from \"@keepkit/core/react\";\nimport { type SelectHTMLAttributes, useMemo, useState } from \"react\";\nimport { useUiLabel } from \"../../foundation/ui-context\";\n\nexport type KeepCollectionOption = { id?: string; label: string };\n\nexport type KeepCollectionControlProps = Omit<\n SelectHTMLAttributes<HTMLSelectElement>,\n \"value\" | \"defaultValue\" | \"onChange\"\n> & {\n value?: string;\n defaultValue?: string;\n onValueChange?: (collectionId?: string) => void;\n onChange?: (collectionId?: string) => void;\n collectionLabels?: Record<string, string>;\n allLabel?: string;\n uncategorizedLabel?: string;\n};\n\nfunction useCollectionOptions<TMeta>(collectionLabels?: Record<string, string>, items?: KeepItem<TMeta>[]) {\n const ids = useMemo(\n () => [...new Set((items ?? []).map((item) => item.collectionId).filter((id): id is string => Boolean(id)))].sort(),\n [items],\n );\n return ids.map((id) => ({ id, label: collectionLabels?.[id] ?? id }));\n}\n\n/** A select that moves one item between derived collections. */\nexport function KeepCollectionSelect<TMeta = Record<string, unknown>>({\n item,\n value,\n defaultValue,\n onValueChange,\n onChange,\n collectionLabels,\n uncategorizedLabel,\n ...props\n}: KeepCollectionControlProps & { item: KeepItem<TMeta> }) {\n const context = useKeepContext<TMeta>();\n const state = useState(value ?? defaultValue ?? item.collectionId ?? \"\");\n const selected = value ?? state[0];\n const options = useCollectionOptions(collectionLabels, context.items);\n const defaultUncategorizedLabel = useUiLabel(\"uncategorized\");\n const uncategorized = uncategorizedLabel ?? defaultUncategorizedLabel;\n const handleChange = (next: string) => {\n const resolved = next || undefined;\n if (value === undefined) state[1](next);\n onValueChange?.(resolved);\n onChange?.(resolved);\n void context.moveToCollection(item.id, resolved);\n };\n return (\n <select\n {...props}\n value={selected}\n onChange={(event) => handleChange(event.currentTarget.value)}\n data-keep-action=\"move-collection\"\n >\n <option value=\"\">{uncategorized}</option>\n {options.map((option) => (\n <option key={option.id} value={option.id}>\n {option.label}\n </option>\n ))}\n </select>\n );\n}\n\n/** A select filter for the collections derived from current items. */\nexport function KeepCollectionFilter<TMeta = Record<string, unknown>>({\n value,\n defaultValue,\n onValueChange,\n onChange,\n collectionLabels,\n allLabel,\n uncategorizedLabel,\n ...props\n}: KeepCollectionControlProps) {\n const context = useKeepContext<TMeta>();\n const [internalValue, setInternalValue] = useState(value ?? defaultValue ?? \"\");\n const selected = value ?? internalValue;\n const options = useCollectionOptions(collectionLabels, context.items);\n const collectionLabel = useUiLabel(\"collection\");\n const defaultAllLabel = useUiLabel(\"allCollections\");\n const defaultUncategorizedLabel = useUiLabel(\"uncategorized\");\n const all = allLabel ?? defaultAllLabel;\n const uncategorized = uncategorizedLabel ?? defaultUncategorizedLabel;\n const handleChange = (next: string) => {\n if (value === undefined) setInternalValue(next);\n const resolved = next || undefined;\n onValueChange?.(resolved);\n onChange?.(resolved);\n };\n return (\n <label data-keepkit=\"collection-filter\">\n <span>{collectionLabel}</span>\n <select\n {...props}\n value={selected}\n onChange={(event) => handleChange(event.currentTarget.value)}\n data-keep-action=\"filter-collection\"\n >\n <option value=\"\">{all}</option>\n <option value=\"__uncategorized__\">{uncategorized}</option>\n {options.map((option) => (\n <option key={option.id} value={option.id}>\n {option.label}\n </option>\n ))}\n </select>\n </label>\n );\n}\n","\"use client\";\n\nimport type { KeepListQuery } from \"@keepkit/core/core\";\nimport { type HTMLAttributes, isValidElement, type ReactNode } from \"react\";\nimport { type RenderProp, renderRoot } from \"../../foundation/shared\";\nimport { useKeepTagFilter } from \"./hooks/useKeepTagFilter\";\n\nexport type KeepTagFilterState = {\n tags: string[];\n tagCounts: Record<string, number>;\n value?: string;\n select: (tag?: string) => void;\n};\n\nexport type KeepTagFilterProps<TMeta = Record<string, unknown>> = Omit<\n HTMLAttributes<HTMLElement>,\n \"children\" | \"onChange\"\n> & {\n query?: KeepListQuery<TMeta>;\n value?: string;\n defaultValue?: string;\n onChange?: (tag?: string) => void;\n onValueChange?: (tag?: string) => void;\n allLabel?: ReactNode;\n ariaLabel?: string;\n renderTag?: (tag: string, count: number, selected: boolean) => ReactNode;\n render?: RenderProp<KeepTagFilterState>;\n children?: ReactNode | RenderProp<KeepTagFilterState>;\n asChild?: boolean;\n};\n\n/** An ARIA button group for tag filtering; consumers can connect value to a collection query. */\nexport function KeepTagFilter<TMeta = Record<string, unknown>>({\n query,\n value: controlledValue,\n defaultValue,\n onChange,\n onValueChange,\n allLabel,\n ariaLabel,\n renderTag,\n render,\n children,\n asChild = false,\n className,\n ...rootProps\n}: KeepTagFilterProps<TMeta>) {\n const view = useKeepTagFilter<TMeta>({ query, controlledValue, defaultValue, onChange, onValueChange });\n const contentChildren = asChild && isValidElement(children) ? undefined : children;\n const body = render\n ? render(view.state)\n : typeof contentChildren === \"function\"\n ? contentChildren(view.state)\n : (contentChildren ?? (\n <fieldset>\n <legend>{ariaLabel ?? view.labels.aria}</legend>\n <button\n type=\"button\"\n data-keep-action=\"filter-all-tags\"\n aria-pressed={view.state.value === undefined}\n onClick={() => view.state.select()}\n >\n {allLabel ?? view.labels.all}\n </button>\n {view.state.tags.map((tag) => (\n <button\n key={tag}\n type=\"button\"\n data-keep-action=\"filter-tag\"\n aria-pressed={view.state.value === tag}\n onClick={() => view.state.select(tag)}\n >\n {renderTag ? renderTag(tag, view.state.tagCounts[tag] ?? 0, view.state.value === tag) : tag}\n <span> ({view.state.tagCounts[tag] ?? 0})</span>\n </button>\n ))}\n </fieldset>\n ));\n return renderRoot(\n asChild,\n isValidElement(children) ? children : undefined,\n {\n ...rootProps,\n className,\n \"data-keepkit\": \"tag-filter\",\n \"data-state\": view.state.value === undefined ? \"all\" : \"filtered\",\n \"data-loading\": view.isLoading ? \"true\" : undefined,\n },\n body,\n \"KeepTagFilter\",\n );\n}\n","import type { KeepListQuery } from \"@keepkit/core/core\";\nimport { useKeepList } from \"@keepkit/core/react\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { useUiLabel } from \"../../../foundation/ui-context\";\nimport type { KeepTagFilterState } from \"../KeepTagFilter\";\n\ntype KeepTagFilterOptions<TMeta> = {\n query: KeepListQuery<TMeta> | undefined;\n controlledValue: string | undefined;\n defaultValue: string | undefined;\n onChange: ((tag?: string) => void) | undefined;\n onValueChange: ((tag?: string) => void) | undefined;\n};\n\nexport function useKeepTagFilter<TMeta>(options: KeepTagFilterOptions<TMeta>) {\n const { query, controlledValue, defaultValue, onChange, onValueChange } = options;\n const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue);\n const resolvedValue = controlledValue ?? uncontrolledValue;\n const list = useKeepList<TMeta>({\n ...query,\n tags: resolvedValue ? [...(query?.tags ?? []), resolvedValue] : query?.tags,\n });\n const select = useCallback(\n (tag?: string) => {\n if (controlledValue === undefined) setUncontrolledValue(tag);\n onChange?.(tag);\n onValueChange?.(tag);\n },\n [controlledValue, onChange, onValueChange],\n );\n const state = useMemo<KeepTagFilterState>(\n () => ({ tags: list.tags, tagCounts: list.tagCounts, value: resolvedValue, select }),\n [list.tagCounts, list.tags, resolvedValue, select],\n );\n\n return {\n state,\n isLoading: list.isLoading,\n labels: { all: useUiLabel(\"allTags\"), aria: useUiLabel(\"filterTags\") },\n };\n}\n","import type { KeepListQuery } from \"@keepkit/core/core\";\nimport type { ChangeEvent } from \"react\";\nimport { useEffect, useState } from \"react\";\nimport { useUiLabel } from \"../../../foundation/ui-context\";\nimport type { KeepSortValue } from \"../query-controls\";\n\ntype KeepSearchInputOptions = {\n controlledValue: string | undefined;\n defaultValue: string;\n debounceMs: number;\n onValueChange: ((value: string) => void) | undefined;\n};\n\nexport function useKeepSearchInput(options: KeepSearchInputOptions) {\n const { controlledValue, defaultValue, debounceMs, onValueChange } = options;\n const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue);\n const value = controlledValue ?? uncontrolledValue;\n useEffect(() => {\n if (!onValueChange) return;\n if (debounceMs <= 0) {\n onValueChange(value);\n return;\n }\n const timer = window.setTimeout(() => onValueChange(value), debounceMs);\n return () => window.clearTimeout(timer);\n }, [debounceMs, onValueChange, value]);\n\n return {\n value,\n label: useUiLabel(\"search\"),\n change: (event: ChangeEvent<HTMLInputElement>) => {\n if (controlledValue === undefined) setUncontrolledValue(event.currentTarget.value);\n },\n };\n}\n\ntype KeepSortSelectOptions = {\n controlledValue: KeepSortValue | undefined;\n defaultValue: KeepSortValue;\n onValueChange: ((value: KeepSortValue, sort: NonNullable<KeepListQuery[\"sort\"]>) => void) | undefined;\n};\n\nexport function useKeepSortSelect(options: KeepSortSelectOptions) {\n const { controlledValue, defaultValue, onValueChange } = options;\n const [uncontrolledValue, setUncontrolledValue] = useState<KeepSortValue>(defaultValue);\n const value = controlledValue ?? uncontrolledValue;\n\n return {\n value,\n change: (event: ChangeEvent<HTMLSelectElement>) => {\n const nextValue = event.currentTarget.value as KeepSortValue;\n if (controlledValue === undefined) setUncontrolledValue(nextValue);\n const [by, direction] = nextValue.split(\":\") as [\"savedAt\" | \"updatedAt\", \"asc\" | \"desc\"];\n onValueChange?.(nextValue, { by, direction });\n },\n labels: {\n sort: useUiLabel(\"sort\"),\n updatedNewest: useUiLabel(\"updatedNewest\"),\n updatedOldest: useUiLabel(\"updatedOldest\"),\n savedNewest: useUiLabel(\"savedNewest\"),\n savedOldest: useUiLabel(\"savedOldest\"),\n },\n };\n}\n\ntype KeepPaginationOptions = {\n totalCount: number;\n pageSize: number;\n page: number;\n maxPageButtons: number;\n onPageChange: ((page: number, offset: number) => void) | undefined;\n};\n\nexport function useKeepPagination(options: KeepPaginationOptions) {\n const { totalCount, pageSize, page, maxPageButtons, onPageChange } = options;\n const pageCount = Math.max(1, Math.ceil(totalCount / Math.max(1, pageSize)));\n const currentPage = Math.min(Math.max(1, page), pageCount);\n const goToPage = (nextPage: number) => {\n const next = Math.min(Math.max(1, nextPage), pageCount);\n onPageChange?.(next, (next - 1) * pageSize);\n };\n\n return {\n pageCount,\n currentPage,\n goToPage,\n visiblePages: getVisiblePages(currentPage, pageCount, Math.max(1, maxPageButtons)),\n labels: {\n previous: useUiLabel(\"previousPage\"),\n next: useUiLabel(\"nextPage\"),\n page: useUiLabel(\"page\"),\n pagination: useUiLabel(\"pagination\"),\n },\n };\n}\n\nfunction getVisiblePages(currentPage: number, pageCount: number, maxPageButtons: number): number[] {\n if (pageCount <= maxPageButtons) return Array.from({ length: pageCount }, (_, index) => index + 1);\n const half = Math.floor(maxPageButtons / 2);\n const start = Math.min(Math.max(1, currentPage - half), pageCount - maxPageButtons + 1);\n return Array.from({ length: maxPageButtons }, (_, index) => start + index);\n}\n","\"use client\";\n\nimport type { KeepListQuery } from \"@keepkit/core/core\";\nimport type { InputHTMLAttributes, ReactNode, SelectHTMLAttributes } from \"react\";\nimport { useKeepPagination, useKeepSearchInput, useKeepSortSelect } from \"./hooks/useQueryControls\";\n\nexport type KeepSearchInputProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"value\" | \"defaultValue\" | \"onChange\"\n> & {\n value?: string;\n defaultValue?: string;\n /** Delay before notifying consumers; set to 0 to disable debouncing. */\n debounceMs?: number;\n onValueChange?: (value: string) => void;\n};\n\n/** A controlled/uncontrolled search field with a small built-in debounce. */\nexport function KeepSearchInput({\n value: controlledValue,\n defaultValue = \"\",\n debounceMs = 300,\n onValueChange,\n \"aria-label\": ariaLabel,\n placeholder,\n ...props\n}: KeepSearchInputProps) {\n const view = useKeepSearchInput({ controlledValue, defaultValue, debounceMs, onValueChange });\n\n return (\n <input\n {...props}\n data-keepkit=\"search-input\"\n data-keep-action=\"search\"\n type=\"search\"\n value={view.value}\n data-state={view.value ? \"active\" : \"idle\"}\n data-disabled={props.disabled ? \"true\" : undefined}\n aria-label={ariaLabel ?? view.label}\n placeholder={placeholder ?? view.label}\n onChange={view.change}\n />\n );\n}\n\nexport type KeepSortValue = \"savedAt:desc\" | \"savedAt:asc\" | \"updatedAt:desc\" | \"updatedAt:asc\";\n\nexport type KeepSortSelectProps = Omit<\n SelectHTMLAttributes<HTMLSelectElement>,\n \"value\" | \"defaultValue\" | \"onChange\"\n> & {\n value?: KeepSortValue;\n defaultValue?: KeepSortValue;\n onValueChange?: (value: KeepSortValue, sort: NonNullable<KeepListQuery[\"sort\"]>) => void;\n};\n\n/** Emits a normalized sort descriptor that can be passed directly to useKeepList. */\nexport function KeepSortSelect({\n value: controlledValue,\n defaultValue = \"updatedAt:desc\",\n onValueChange,\n \"aria-label\": ariaLabel,\n children,\n ...props\n}: KeepSortSelectProps) {\n const view = useKeepSortSelect({ controlledValue, defaultValue, onValueChange });\n const options = children ?? (\n <>\n <option value=\"updatedAt:desc\">{view.labels.updatedNewest}</option>\n <option value=\"updatedAt:asc\">{view.labels.updatedOldest}</option>\n <option value=\"savedAt:desc\">{view.labels.savedNewest}</option>\n <option value=\"savedAt:asc\">{view.labels.savedOldest}</option>\n </>\n );\n return (\n <select\n {...props}\n data-keepkit=\"sort-select\"\n data-keep-action=\"sort\"\n value={view.value}\n data-state=\"selected\"\n data-disabled={props.disabled ? \"true\" : undefined}\n aria-label={ariaLabel ?? view.labels.sort}\n onChange={view.change}\n >\n {options}\n </select>\n );\n}\n\nexport type KeepPaginationState = { page: number; pageCount: number; goToPage: (page: number) => void };\n\nexport type KeepPaginationProps = Omit<React.HTMLAttributes<HTMLElement>, \"children\"> & {\n totalCount: number;\n pageSize: number;\n page?: number;\n maxPageButtons?: number;\n onPageChange?: (page: number, offset: number) => void;\n render?: (state: KeepPaginationState) => ReactNode;\n};\n\n/** Accessible pagination with previous/next controls and numbered page buttons. */\nexport function KeepPagination({\n totalCount,\n pageSize,\n page = 1,\n maxPageButtons = 7,\n onPageChange,\n render,\n ...props\n}: KeepPaginationProps) {\n const view = useKeepPagination({ totalCount, pageSize, page, maxPageButtons, onPageChange });\n const navProps = {\n ...props,\n \"data-keepkit\": \"pagination\",\n \"aria-label\": props[\"aria-label\"] ?? view.labels.pagination,\n \"data-state\": view.pageCount > 1 ? \"active\" : \"idle\",\n };\n if (render)\n return (\n <nav {...navProps}>{render({ page: view.currentPage, pageCount: view.pageCount, goToPage: view.goToPage })}</nav>\n );\n return (\n <nav {...navProps}>\n <button\n type=\"button\"\n data-keep-action=\"previous-page\"\n onClick={() => view.goToPage(view.currentPage - 1)}\n disabled={view.currentPage <= 1}\n >\n {view.labels.previous}\n </button>\n {view.visiblePages.map((nextPage) => (\n <button\n key={nextPage}\n type=\"button\"\n data-keep-action=\"select-page\"\n aria-current={nextPage === view.currentPage ? \"page\" : undefined}\n aria-label={`${view.labels.page} ${nextPage}`}\n onClick={() => view.goToPage(nextPage)}\n >\n {nextPage}\n </button>\n ))}\n <button\n type=\"button\"\n data-keep-action=\"next-page\"\n onClick={() => view.goToPage(view.currentPage + 1)}\n disabled={view.currentPage >= view.pageCount}\n >\n {view.labels.next}\n </button>\n </nav>\n );\n}\n","import type { KeepListQuery, KeepUrlSyncOptions } from \"@keepkit/core/core\";\nimport { useKeepList } from \"@keepkit/core/react\";\nimport { useMemo, useState } from \"react\";\nimport { type KeepUrlAdapter, useKeepUrlSync } from \"../../../adapters/url-sync\";\nimport { sortToValue } from \"../../../foundation/shared\";\nimport type { KeepSortValue } from \"../../query/query-controls\";\nimport type { KeepCollectionFeature } from \"../KeepCollection\";\n\ntype KeepCollectionOptions<TMeta> = {\n query: KeepListQuery<TMeta>;\n pageSize: number;\n urlSync: boolean | KeepUrlSyncOptions;\n urlAdapter: KeepUrlAdapter | undefined;\n features: Partial<Record<KeepCollectionFeature, boolean>> | undefined;\n};\n\nexport function useKeepCollection<TMeta>({\n query,\n pageSize,\n urlSync,\n urlAdapter,\n features,\n}: KeepCollectionOptions<TMeta>) {\n const enabled = {\n search: true,\n sort: true,\n pagination: true,\n tagFilter: false,\n collectionFilter: false,\n bulkActions: false,\n tags: true,\n pin: false,\n archive: false,\n ...features,\n };\n const [searchValue, setSearchValue] = useState(query.search?.query ?? \"\");\n const [sort, setSort] = useState(query.sort ?? { by: \"updatedAt\" as const, direction: \"desc\" as const });\n const [activeTags, setActiveTags] = useState<string[]>(query.tags ?? []);\n const [activeCollection, setActiveCollection] = useState<string | undefined>(query.collectionId);\n const [page, setPage] = useState(query.pagination?.page ?? 1);\n const resolvedPageSize = query.pagination?.pageSize ?? pageSize;\n const resolvedQuery = useMemo<KeepListQuery<TMeta>>(\n () => ({\n ...query,\n search: enabled.search ? { ...query.search, query: searchValue } : query.search,\n sort: enabled.sort ? sort : query.sort,\n tags: activeTags.length > 0 ? activeTags : undefined,\n collectionId: activeCollection && activeCollection !== \"__uncategorized__\" ? activeCollection : undefined,\n filter:\n activeCollection === \"__uncategorized__\"\n ? (item) => item.collectionId === undefined && (query.filter?.(item) ?? true)\n : query.filter,\n pagination: enabled.pagination ? { ...query.pagination, page, pageSize: resolvedPageSize } : query.pagination,\n }),\n [\n activeCollection,\n activeTags,\n enabled.pagination,\n enabled.search,\n enabled.sort,\n page,\n query,\n resolvedPageSize,\n searchValue,\n sort,\n ],\n );\n useKeepUrlSync({\n enabled: Boolean(urlSync),\n query: resolvedQuery,\n onQueryChange: (nextOrUpdater) => {\n const next = typeof nextOrUpdater === \"function\" ? nextOrUpdater(resolvedQuery) : nextOrUpdater;\n setSearchValue(next.search?.query ?? \"\");\n setSort(next.sort ?? { by: \"updatedAt\", direction: \"desc\" });\n setActiveTags(next.tags ?? []);\n setActiveCollection(next.collectionId);\n setPage(next.pagination?.page ?? 1);\n },\n options: typeof urlSync === \"object\" ? urlSync : {},\n adapter: urlAdapter,\n });\n const list = useKeepList<TMeta>(resolvedQuery);\n const allState = useKeepList<TMeta>({});\n\n return {\n enabled,\n searchValue,\n sortValue: sortToValue(sort),\n activeTags,\n activeCollection,\n resolvedPageSize,\n resolvedQuery,\n list,\n allState,\n setSearchValue: (value: string) => {\n setSearchValue(value);\n setPage(1);\n },\n setSortValue: (_value: KeepSortValue, nextSort: NonNullable<KeepListQuery[\"sort\"]>) => {\n setSort(nextSort);\n setPage(1);\n },\n setTag: (value?: string) => {\n setActiveTags(value ? [value] : []);\n setPage(1);\n },\n setCollection: (value?: string) => {\n setActiveCollection(value);\n setPage(1);\n },\n removeTag: (tagToRemove: string) => {\n setActiveTags((current) => current.filter((tag) => tag !== tagToRemove));\n setPage(1);\n },\n clearFilters: () => {\n setSearchValue(\"\");\n setActiveTags([]);\n setActiveCollection(undefined);\n setPage(1);\n },\n setPage,\n };\n}\n","\"use client\";\n\nimport type { KeepItem, KeepListQuery } from \"@keepkit/core/core\";\nimport { KeepErrorBoundary, type KeepErrorBoundaryProps, type UseKeepListResult } from \"@keepkit/core/react\";\nimport { type HTMLAttributes, isValidElement, type ReactNode, type Ref } from \"react\";\nimport {\n composeRefs,\n KeepSearchQueryProvider,\n type RenderProp,\n renderRoot,\n resolveContent,\n} from \"../../foundation/shared\";\nimport { KeepItemCard, type KeepItemCardProps, KeepItemCardSkeleton } from \"../item/KeepItemCard\";\nimport { KeepEmptyState } from \"../status/KeepEmptyState\";\nimport { useKeepListView } from \"./hooks/useKeepListView\";\nimport { useRovingTabIndex } from \"./hooks/useRovingTabIndex\";\nimport type { KeepLayoutPreset } from \"./KeepCollection\";\n\nexport type KeepListState<TMeta = Record<string, unknown>> = UseKeepListResult<TMeta>;\n\nexport type KeepListProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n ref?: Ref<HTMLElement> | { readonly current: unknown };\n query?: KeepListQuery<TMeta>;\n children?: ReactNode | RenderProp<KeepListState<TMeta>>;\n renderItem?: (item: KeepItem<TMeta>, state: KeepListState<TMeta>) => ReactNode;\n loading?: ReactNode | RenderProp<KeepListState<TMeta>>;\n /** Alias for `loading`. When neither is provided, layout-matched skeletons are rendered. */\n renderLoading?: ReactNode | RenderProp<KeepListState<TMeta>>;\n loadingCount?: number;\n empty?: ReactNode | RenderProp<KeepListState<TMeta>>;\n error?: ReactNode | RenderProp<KeepListState<TMeta>>;\n onClearFilters?: () => void;\n itemCardProps?: Omit<KeepItemCardProps<TMeta>, \"item\" | \"children\" | \"render\">;\n layout?: KeepLayoutPreset;\n asChild?: boolean;\n fallback?: KeepErrorBoundaryProps[\"fallback\"];\n onBoundaryError?: KeepErrorBoundaryProps[\"onError\"];\n boundaryResetKey?: unknown;\n};\n\n/** A list primitive with built-in loading, empty, error, and removal states. */\nexport function KeepList<TMeta = Record<string, unknown>>(props: KeepListProps<TMeta>) {\n const { fallback, onBoundaryError, boundaryResetKey, ...listProps } = props;\n const content = <KeepListContent<TMeta> {...listProps} />;\n if (fallback === undefined && onBoundaryError === undefined) return content;\n return (\n <KeepErrorBoundary fallback={fallback} onError={onBoundaryError} resetKey={boundaryResetKey}>\n {content}\n </KeepErrorBoundary>\n );\n}\n\nfunction KeepListContent<TMeta = Record<string, unknown>>({\n query,\n children,\n renderItem,\n loading,\n renderLoading,\n loadingCount = 6,\n empty,\n error: errorContent,\n onClearFilters,\n itemCardProps,\n layout = \"list\",\n asChild = false,\n onKeyDown,\n onFocusCapture,\n className,\n ...rootProps\n}: KeepListProps<TMeta>) {\n const view = useKeepListView<TMeta>(query);\n const roving = useRovingTabIndex<HTMLDivElement>();\n const { state } = view;\n const body = getListBody(state, {\n children,\n renderItem,\n loading: renderLoading !== undefined ? renderLoading : loading,\n loadingCount,\n loadingLabel: view.labels.loading,\n empty,\n error: errorContent ?? view.labels.error,\n onClearFilters,\n allItemCount: view.allState.totalCount,\n query,\n itemCardProps,\n layout,\n });\n return renderRoot(\n asChild,\n asChild && isValidElement(children) ? children : undefined,\n {\n ...rootProps,\n className,\n \"data-keepkit\": \"list\",\n \"data-layout\": layout,\n \"aria-busy\": state.isLoading || rootProps[\"aria-busy\"],\n \"data-state\": getListState(state),\n \"data-loading\": state.isLoading ? \"true\" : undefined,\n \"data-roving-tabindex\": \"true\",\n role: rootProps.role ?? \"group\",\n ref: composeRefs(roving.ref as Ref<HTMLElement>, rootProps.ref as Ref<HTMLElement>),\n onKeyDown: (event) => {\n onKeyDown?.(event);\n if (!event.defaultPrevented) roving.onKeyDown(event);\n },\n onFocusCapture: (event) => {\n onFocusCapture?.(event);\n if (!event.defaultPrevented) roving.onFocusCapture(event);\n },\n },\n <KeepSearchQueryProvider query={query?.search?.query}>{body}</KeepSearchQueryProvider>,\n \"KeepList\",\n );\n}\n\nfunction getListState<TMeta>(state: KeepListState<TMeta>): \"loading\" | \"error\" | \"empty\" | \"ready\" {\n if (state.error && state.items.length === 0) return \"error\";\n if (state.isLoading && !state.isHydrated) return \"loading\";\n if (state.isHydrated && state.items.length === 0) return \"empty\";\n return \"ready\";\n}\n\nfunction getListBody<TMeta>(\n state: KeepListState<TMeta>,\n options: {\n children?: ReactNode | RenderProp<KeepListState<TMeta>>;\n renderItem?: (item: KeepItem<TMeta>, state: KeepListState<TMeta>) => ReactNode;\n loading: ReactNode | RenderProp<KeepListState<TMeta>> | undefined;\n loadingCount: number;\n loadingLabel: string;\n empty: ReactNode | RenderProp<KeepListState<TMeta>> | undefined;\n error: ReactNode | RenderProp<KeepListState<TMeta>>;\n onClearFilters?: () => void;\n allItemCount: number;\n query: KeepListQuery<TMeta> | undefined;\n itemCardProps?: Omit<KeepItemCardProps<TMeta>, \"item\" | \"children\" | \"render\">;\n layout: KeepLayoutPreset;\n },\n): ReactNode {\n if (state.error && state.items.length === 0) return resolveContent(options.error, state);\n if (state.isLoading && !state.isHydrated) {\n if (options.loading !== undefined) return resolveContent(options.loading, state);\n const count = Number.isFinite(options.loadingCount) ? Math.max(0, Math.floor(options.loadingCount)) : 6;\n return (\n <>\n <span role=\"status\" data-keepkit=\"loading-label\">\n {options.loadingLabel}\n </span>\n <ul data-keepkit=\"skeleton-list\" data-layout={options.layout}>\n {Array.from({ length: count }, (_, index) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: Static loading placeholders never reorder.\n <li key={index}>\n <KeepItemCardSkeleton layout={options.layout} />\n </li>\n ))}\n </ul>\n </>\n );\n }\n if (state.isHydrated && state.items.length === 0) {\n if (options.empty !== undefined) return resolveContent(options.empty, state);\n return (\n <KeepEmptyState\n variant={options.allItemCount > 0 && hasActiveQueryFilters(options.query) ? \"empty-filtered\" : \"empty-storage\"}\n onClearFilters={options.onClearFilters}\n />\n );\n }\n if (typeof options.children === \"function\") return options.children(state);\n if (options.children !== undefined && !isValidElement(options.children)) return options.children;\n return (\n <ul data-layout={options.layout}>\n {state.items.map((item) =>\n options.renderItem ? (\n options.renderItem(item, state)\n ) : (\n <li key={item.id}>\n <KeepItemCard item={item} {...options.itemCardProps} />\n </li>\n ),\n )}\n </ul>\n );\n}\n\nfunction hasActiveQueryFilters<TMeta>(query: KeepListQuery<TMeta> | undefined): boolean {\n if (!query) return false;\n return Boolean(\n query.search?.query?.trim() ||\n query.tags?.some((tag) => tag.trim()) ||\n query.targetType ||\n query.savedBetween ||\n query.archived !== undefined ||\n query.collectionId ||\n query.filter,\n );\n}\n","\"use client\";\n\nimport type { KeepItem } from \"@keepkit/core/core\";\nimport {\n type ButtonHTMLAttributes,\n type ComponentType,\n createContext,\n createElement,\n type HTMLAttributeAnchorTarget,\n type HTMLAttributes,\n type ImgHTMLAttributes,\n isValidElement,\n type MouseEvent,\n type ReactNode,\n type Ref,\n type SyntheticEvent,\n useContext,\n useEffect,\n useState,\n} from \"react\";\nimport {\n KeepHighlight,\n type RenderProp,\n renderRoot,\n toKeepButtonItem,\n useKeepSearchQuery,\n} from \"../../foundation/shared\";\nimport {\n KeepArchiveButton,\n type KeepArchiveButtonProps,\n KeepPinButton,\n type KeepPinButtonProps,\n} from \"../actions/KeepArchiveButton\";\nimport { KeepButton, type KeepButtonLabels, type KeepButtonProps } from \"../actions/KeepButton\";\nimport type { KeepLayoutPreset } from \"../collection/KeepCollection\";\nimport { KeepStaleNotice } from \"../status/KeepStaleNotice\";\nimport { useKeepItemCard } from \"./hooks/useKeepItemCard\";\n\nexport type KeepItemCardState<TMeta = Record<string, unknown>> = {\n item: KeepItem<TMeta>;\n isSaved: boolean;\n isMutating: boolean;\n error: unknown | null;\n remove: () => Promise<void>;\n status: KeepItem[\"status\"];\n};\n\nexport type KeepItemCardLinkProps = {\n href: string;\n children?: ReactNode;\n target?: HTMLAttributeAnchorTarget;\n rel?: string;\n onClick?: (event: MouseEvent<HTMLElement>) => void;\n};\n\nexport type KeepImageProps = ImgHTMLAttributes<HTMLImageElement> & { src: string; alt: string };\n\nexport type KeepItemCardProps<TMeta = Record<string, unknown>> = Omit<\n HTMLAttributes<HTMLElement>,\n \"children\" | \"title\"\n> & {\n ref?: Ref<HTMLElement> | { readonly current: unknown };\n item: KeepItem<TMeta>;\n title?: ReactNode | ((item: KeepItem<TMeta>) => ReactNode);\n getTitle?: (item: KeepItem<TMeta>) => ReactNode;\n getImageProps?: (item: KeepItem<TMeta>, title: ReactNode) => KeepImageProps | undefined;\n imageComponent?: ComponentType<KeepImageProps>;\n renderImage?: (props: KeepImageProps, item: KeepItem<TMeta>) => ReactNode;\n renderTags?: (tags: string[], item: KeepItem<TMeta>) => ReactNode;\n showTags?: boolean;\n showSavedAt?: boolean;\n collectionLabels?: Record<string, string>;\n imageAlt?: string;\n render?: RenderProp<KeepItemCardState<TMeta>>;\n children?: ReactNode | RenderProp<KeepItemCardState<TMeta>>;\n removeLabel?: string;\n onRemoveError?: (error: unknown) => void;\n onRemoved?: (item: KeepItem<TMeta>) => void;\n onRetry?: (item: KeepItem<TMeta>) => void | Promise<void>;\n showSaveButton?: boolean;\n showPinButton?: boolean;\n showArchiveButton?: boolean;\n saveButtonLabels?: KeepButtonLabels;\n asChild?: boolean;\n href?: string | ((item: KeepItem<TMeta>) => string | undefined);\n onOpen?: (item: KeepItem<TMeta>, event: MouseEvent<HTMLElement>) => void;\n linkTarget?: \"title\" | \"card\";\n linkComponent?: ComponentType<KeepItemCardLinkProps>;\n linkTargetAttribute?: HTMLAttributeAnchorTarget;\n linkRel?: string;\n highlightQuery?: string;\n};\n\nexport type KeepItemCardMediaProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> & {\n children?: ReactNode;\n fallback?: ReactNode;\n};\nexport type KeepItemCardContentProps = HTMLAttributes<HTMLDivElement>;\nexport type KeepItemCardTitleProps = Omit<HTMLAttributes<HTMLHeadingElement>, \"title\"> & {\n as?: \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n};\nexport type KeepItemCardTagsProps = HTMLAttributes<HTMLUListElement>;\nexport type KeepItemCardActionsProps = HTMLAttributes<HTMLDivElement>;\nexport type KeepItemCardSkeletonProps = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n layout?: KeepLayoutPreset;\n};\n\ntype KeepItemCardCompoundContext = {\n item: KeepItem<unknown>;\n collectionLabel?: string;\n resolvedTitle: ReactNode;\n renderTitle: (content: ReactNode) => ReactNode;\n image: ReactNode | null;\n imageStatus: \"loaded\" | \"error\" | \"loading\";\n fallbackLabel: string;\n tags: string[];\n tagsLabel: string;\n renderedTags: ReactNode | null;\n meta: ReactNode | null;\n error: ReactNode | null;\n actions: ReactNode;\n saveButtonLabels?: KeepButtonLabels;\n removeLabel: string;\n remove: () => Promise<void>;\n isMutating: boolean;\n saveAriaLabel: string;\n renderText: (content: ReactNode) => ReactNode;\n};\n\nconst KeepItemCardContext = createContext<KeepItemCardCompoundContext | null>(null);\n\nfunction useKeepItemCardCompound(part: string): KeepItemCardCompoundContext {\n const context = useContext(KeepItemCardContext);\n if (!context) throw new Error(`KeepItemCard.${part} must be rendered inside KeepItemCard.`);\n return context;\n}\n\n/** A low-dependency item presentation primitive with composable card parts. */\nfunction KeepItemCardRoot<TMeta = Record<string, unknown>>({\n item,\n title,\n getTitle,\n getImageProps,\n imageComponent: ImageComponent,\n renderImage,\n renderTags,\n showTags = true,\n showSavedAt = true,\n collectionLabels,\n imageAlt,\n render,\n children,\n removeLabel,\n onRemoveError,\n onRemoved,\n onRetry,\n showSaveButton = true,\n showPinButton = false,\n showArchiveButton = false,\n saveButtonLabels,\n asChild = false,\n href: hrefOption,\n onOpen,\n linkTarget = \"title\",\n linkComponent: LinkComponent,\n linkTargetAttribute,\n linkRel,\n highlightQuery,\n className,\n ...rootProps\n}: KeepItemCardProps<TMeta>) {\n const view = useKeepItemCard<TMeta>({\n item,\n title,\n getTitle,\n getImageProps,\n href: hrefOption,\n linkTargetAttribute,\n linkRel,\n onRemoveError,\n onRemoved,\n });\n const contextQuery = useKeepSearchQuery();\n const searchQuery = highlightQuery ?? contextQuery;\n const contentChildren = asChild && isValidElement(children) ? undefined : children;\n\n function renderLink(content: ReactNode): ReactNode {\n if (!view.href || !view.isAvailable) return content;\n const linkProps: KeepItemCardLinkProps = {\n href: view.href,\n target: view.resolvedLinkTarget,\n rel: view.resolvedLinkRel,\n onClick: (event) => onOpen?.(item, event),\n children: content,\n };\n return LinkComponent ? <LinkComponent {...linkProps} /> : <a {...linkProps} />;\n }\n\n function renderTitle(content: ReactNode): ReactNode {\n if (linkTarget !== \"title\") return content;\n if (view.isAvailable) return renderLink(content);\n return view.href ? (\n <span aria-disabled=\"true\" data-link-disabled=\"true\">\n {content}\n </span>\n ) : (\n content\n );\n }\n\n const resolvedImageProps = view.imageProps ? { ...view.imageProps, alt: imageAlt ?? view.imageProps.alt } : undefined;\n const imageSource = resolvedImageProps?.src;\n const [imageStatus, setImageStatus] = useState<\"loaded\" | \"error\" | \"loading\">(imageSource ? \"loading\" : \"error\");\n useEffect(() => {\n setImageStatus(imageSource ? \"loading\" : \"error\");\n }, [imageSource]);\n let image: ReactNode = null;\n if (resolvedImageProps) {\n const imagePropsWithHandlers: KeepImageProps = {\n ...resolvedImageProps,\n src: resolvedImageProps.src,\n alt: imageAlt ?? resolvedImageProps.alt,\n onLoad: (event: SyntheticEvent<HTMLImageElement, Event>) => {\n resolvedImageProps.onLoad?.(event);\n setImageStatus(\"loaded\");\n },\n onError: (event: SyntheticEvent<HTMLImageElement, Event>) => {\n resolvedImageProps.onError?.(event);\n setImageStatus(\"error\");\n },\n };\n image =\n renderImage?.(imagePropsWithHandlers, item) ??\n (ImageComponent ? (\n <ImageComponent {...imagePropsWithHandlers} />\n ) : (\n <img {...imagePropsWithHandlers} alt={imagePropsWithHandlers.alt} />\n ));\n }\n const tags = showTags ? (item.tags ?? []) : [];\n const renderedTags = showTags && tags.length > 0 ? (renderTags?.(tags, item) ?? null) : null;\n const meta = showSavedAt ? (\n <div data-card-meta>\n <span>{view.labels.savedAt}:</span>{\" \"}\n <time dateTime={new Date(item.savedAt).toISOString()}>{formatSavedAt(item.savedAt)}</time>\n </div>\n ) : null;\n const error = view.itemState.error ? (\n <p role=\"alert\">{getErrorMessage(view.itemState.error, view.labels.error)}</p>\n ) : null;\n const actions = view.statusLabel ? (\n <KeepStaleNotice item={item} onRetry={onRetry} onRemoved={onRemoved} />\n ) : (\n <>\n {showSaveButton ? <KeepItemCardSave /> : null}\n {showPinButton ? <KeepItemCardPin /> : null}\n {showArchiveButton ? <KeepItemCardArchive /> : null}\n <KeepItemCardRemove />\n </>\n );\n const compoundValue: KeepItemCardCompoundContext = {\n item,\n collectionLabel: item.collectionId ? (collectionLabels?.[item.collectionId] ?? item.collectionId) : undefined,\n resolvedTitle: view.resolvedTitle,\n renderTitle,\n image: imageStatus === \"error\" ? null : image,\n imageStatus,\n fallbackLabel: String(view.resolvedTitle),\n tags,\n tagsLabel: view.labels.tags,\n renderedTags,\n meta,\n error,\n actions,\n saveButtonLabels,\n removeLabel: removeLabel ?? view.labels.remove,\n remove: view.remove,\n isMutating: view.itemState.isMutating,\n saveAriaLabel: `${view.labels.remove} ${String(view.resolvedTitle)}`,\n renderText: (content) => <KeepHighlight query={searchQuery}>{content}</KeepHighlight>,\n };\n const defaultBody = (\n <>\n <KeepItemCardMedia />\n <KeepItemCardContent />\n <KeepItemCardActions />\n </>\n );\n const body = render\n ? render(view.state)\n : typeof contentChildren === \"function\"\n ? contentChildren(view.state)\n : (contentChildren ?? defaultBody);\n const linkedBody = linkTarget === \"card\" && view.isAvailable ? renderLink(body) : body;\n const root = renderRoot(\n asChild,\n isValidElement(children) ? children : undefined,\n {\n ...rootProps,\n className,\n \"data-keepkit\": \"card\",\n \"aria-busy\": view.itemState.isMutating || rootProps[\"aria-busy\"],\n \"aria-disabled\": rootProps[\"aria-disabled\"] ?? (!view.isAvailable ? \"true\" : undefined),\n \"data-state\": view.itemState.error ? \"error\" : view.itemState.isSaved ? \"saved\" : \"unsaved\",\n \"data-status\": item.status ?? \"available\",\n \"data-item-status\": view.displayStatus,\n \"data-loading\": view.itemState.isMutating ? \"true\" : undefined,\n },\n linkedBody,\n \"KeepItemCard\",\n );\n return <KeepItemCardContext.Provider value={compoundValue}>{root}</KeepItemCardContext.Provider>;\n}\n\nfunction KeepItemCardMedia({ children, fallback, ...props }: KeepItemCardMediaProps) {\n const context = useKeepItemCardCompound(\"Media\");\n return (\n <div {...props} data-keep-card-part=\"media\" data-media-status={context.imageStatus} data-aspect-ratio=\"1/1\">\n {children ?? context.image ?? (\n <span role=\"img\" aria-label={context.fallbackLabel} data-keep-card-fallback=\"true\">\n {fallback ?? <KeepMediaPlaceholderIcon />}\n </span>\n )}\n </div>\n );\n}\n\nfunction KeepItemCardContent({ children, ...props }: KeepItemCardContentProps) {\n const context = useKeepItemCardCompound(\"Content\");\n return (\n <div {...props} data-keep-card-part=\"content\">\n {children === undefined ? (\n <>\n <KeepItemCardTitle />\n {context.meta}\n <KeepItemCardTags />\n {context.error}\n </>\n ) : (\n context.renderText(children)\n )}\n </div>\n );\n}\n\nfunction KeepItemCardTitle({ as = \"h3\", children, ...props }: KeepItemCardTitleProps) {\n const context = useKeepItemCardCompound(\"Title\");\n return createElement(\n as,\n { ...props, \"data-keep-card-part\": \"title\", \"data-line-clamp\": \"2\" },\n context.renderTitle(context.renderText(children ?? context.resolvedTitle)),\n );\n}\n\nfunction KeepMediaPlaceholderIcon() {\n return (\n <svg data-media-fallback-icon=\"true\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path\n d=\"M4 5.5A1.5 1.5 0 0 1 5.5 4h13A1.5 1.5 0 0 1 20 5.5v13a1.5 1.5 0 0 1-1.5 1.5h-13A1.5 1.5 0 0 1 4 18.5v-13Z\"\n fill=\"none\"\n stroke=\"currentColor\"\n />\n <circle cx=\"9\" cy=\"9\" r=\"1.5\" fill=\"currentColor\" />\n <path d=\"m5.5 18 4.5-4.5 3 3 2-2L19 18\" fill=\"none\" stroke=\"currentColor\" />\n </svg>\n );\n}\n\nfunction KeepItemCardTags({ children, ...props }: KeepItemCardTagsProps) {\n const context = useKeepItemCardCompound(\"Tags\");\n if (children === undefined && context.renderedTags) return context.renderedTags;\n if (children === undefined && context.tags.length === 0) return null;\n return (\n <ul {...props} aria-label={props[\"aria-label\"] ?? context.tagsLabel} data-keep-card-part=\"tags\">\n {children ?? context.tags.map((tag) => <li key={tag}>{tag}</li>)}\n </ul>\n );\n}\n\nfunction KeepItemCardActions({ children, ...props }: KeepItemCardActionsProps) {\n const context = useKeepItemCardCompound(\"Actions\");\n return (\n <div {...props} data-keep-card-part=\"actions\">\n {children ?? context.actions}\n </div>\n );\n}\n\nexport type KeepItemCardActionSlotProps = Omit<KeepPinButtonProps<unknown>, \"item\" | \"children\"> & {\n children?: ReactNode;\n};\nexport type KeepItemCardSaveProps = Omit<KeepButtonProps<unknown>, \"item\" | \"asChild\"> & { asChild?: false };\nexport type KeepItemCardRemoveProps = Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"children\"> & {\n children?: ReactNode;\n};\nexport type KeepItemCardBadgeProps = HTMLAttributes<HTMLSpanElement>;\n\nfunction KeepItemCardSave({ labels, getAriaLabel, ...props }: KeepItemCardSaveProps) {\n const context = useKeepItemCardCompound(\"Save\");\n return (\n <KeepButton<unknown>\n {...props}\n item={toKeepButtonItem(context.item)}\n asChild={false}\n labels={labels ?? context.saveButtonLabels}\n getAriaLabel={getAriaLabel ?? (() => context.saveAriaLabel)}\n />\n );\n}\n\nfunction KeepItemCardRemove({ children, disabled, onClick, ...props }: KeepItemCardRemoveProps) {\n const context = useKeepItemCardCompound(\"Remove\");\n return (\n <button\n {...props}\n type={props.type ?? \"button\"}\n data-keep-action=\"remove-item\"\n disabled={disabled ?? context.isMutating}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) void context.remove();\n }}\n >\n {children ?? context.removeLabel}\n </button>\n );\n}\n\nfunction KeepItemCardPin({ children, ...props }: KeepItemCardActionSlotProps) {\n const context = useKeepItemCardCompound(\"Pin\");\n return (\n <KeepPinButton<unknown> {...props} item={context.item}>\n {children}\n </KeepPinButton>\n );\n}\n\nfunction KeepItemCardArchive({\n children,\n ...props\n}: Omit<KeepArchiveButtonProps<unknown>, \"item\" | \"children\"> & { children?: ReactNode }) {\n const context = useKeepItemCardCompound(\"Archive\");\n return (\n <KeepArchiveButton<unknown> {...props} item={context.item}>\n {children}\n </KeepArchiveButton>\n );\n}\n\nfunction KeepItemCardCollectionBadge({ children, ...props }: KeepItemCardBadgeProps) {\n const context = useKeepItemCardCompound(\"CollectionBadge\");\n if (!context.item.collectionId) return null;\n return (\n <span {...props} data-keep-card-part=\"collection-badge\">\n {children ?? context.collectionLabel}\n </span>\n );\n}\n\nexport const KeepItemCard = Object.assign(KeepItemCardRoot, {\n Media: KeepItemCardMedia,\n Content: KeepItemCardContent,\n Title: KeepItemCardTitle,\n Tags: KeepItemCardTags,\n Actions: KeepItemCardActions,\n Save: KeepItemCardSave,\n Remove: KeepItemCardRemove,\n Pin: KeepItemCardPin,\n Archive: KeepItemCardArchive,\n CollectionBadge: KeepItemCardCollectionBadge,\n});\n\n/** A non-interactive placeholder that preserves the selected card layout while data loads. */\nexport function KeepItemCardSkeleton({ layout = \"list\", ...props }: KeepItemCardSkeletonProps) {\n return (\n <article {...props} aria-hidden=\"true\" data-keepkit=\"card-skeleton\" data-layout={layout} data-state=\"loading\">\n <span data-skeleton-part=\"media\" />\n <span data-skeleton-part=\"title\" />\n <span data-skeleton-part=\"meta\" />\n <span data-skeleton-part=\"tag\" />\n <span data-skeleton-part=\"tag\" />\n </article>\n );\n}\n\nfunction formatSavedAt(timestamp: number): string {\n return new Date(timestamp).toISOString().slice(0, 10);\n}\n\nfunction getErrorMessage(error: unknown, fallback: string): string {\n return error instanceof Error ? error.message : fallback;\n}\n","import type { KeepItemStatus } from \"@keepkit/core/core\";\nimport { type KeepUiLabelKey, useUiLabel } from \"../../../foundation/ui-context\";\nimport type { KeepDisplayStatus } from \"../KeepItemStatusBadge\";\n\nexport function useKeepItemStatusBadge(status: KeepItemStatus | \"restricted\") {\n return {\n resolvedStatus: getDisplayStatus(status),\n statusLabel: useUiLabel(getStatusLabelKey(status)),\n icon: getStatusIcon(status),\n };\n}\n\nexport type KeepStatusIconName = \"check\" | \"clock\" | \"ban\" | \"lock\";\n\nfunction getStatusIcon(status: KeepItemStatus | \"restricted\"): KeepStatusIconName {\n if (status === \"available\") return \"check\";\n if (status === \"expired\") return \"clock\";\n if (status === \"removed\" || status === \"deleted\") return \"ban\";\n return \"lock\";\n}\n\nfunction getStatusLabelKey(status: KeepItemStatus | \"restricted\"): KeepUiLabelKey {\n switch (status) {\n case \"available\":\n return \"statusAvailable\";\n case \"expired\":\n return \"statusExpired\";\n case \"removed\":\n return \"statusRemoved\";\n case \"deleted\":\n return \"statusDeleted\";\n case \"private\":\n return \"statusPrivate\";\n case \"unknown\":\n return \"statusUnknown\";\n case \"restricted\":\n return \"statusPrivate\";\n }\n}\n\nfunction getDisplayStatus(status: KeepItemStatus | \"restricted\"): KeepDisplayStatus {\n if (status === \"available\") return \"available\";\n if (status === \"expired\") return \"expired\";\n if (status === \"removed\" || status === \"deleted\") return \"removed\";\n return \"restricted\";\n}\n","\"use client\";\n\nimport type { KeepItemStatus } from \"@keepkit/core/core\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { useKeepItemStatusBadge } from \"./hooks/useKeepItemStatusBadge\";\n\nexport type KeepItemStatusBadgeProps = Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> & {\n status?: KeepItemStatus | \"restricted\";\n label?: ReactNode;\n};\n\nexport type KeepDisplayStatus = \"available\" | \"expired\" | \"removed\" | \"restricted\";\n\n/** Displays the normalized availability state of a saved item. */\nexport function KeepItemStatusBadge({ status = \"available\", label, className, ...props }: KeepItemStatusBadgeProps) {\n const view = useKeepItemStatusBadge(status);\n return (\n <span\n {...props}\n className={className}\n role=\"img\"\n aria-label={props[\"aria-label\"] ?? view.statusLabel}\n data-keepkit=\"status-badge\"\n data-status={status}\n data-item-status={view.resolvedStatus}\n >\n <StatusIcon name={view.icon} />\n <span data-status-label=\"true\">{label ?? view.statusLabel}</span>\n </span>\n );\n}\n\nfunction StatusIcon({ name }: { name: \"check\" | \"clock\" | \"ban\" | \"lock\" }) {\n return (\n <svg\n data-status-icon={name}\n viewBox=\"0 0 24 24\"\n width=\"1em\"\n height=\"1em\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n {name === \"check\" ? <path d=\"m5 12 4 4L19 6\" /> : null}\n {name === \"clock\" ? (\n <>\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n <path d=\"M12 7v5l3 2\" />\n </>\n ) : null}\n {name === \"ban\" ? (\n <>\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n <path d=\"m6.5 6.5 11 11\" />\n </>\n ) : null}\n {name === \"lock\" ? (\n <>\n <rect x=\"5\" y=\"10\" width=\"14\" height=\"10\" rx=\"2\" />\n <path d=\"M8 10V7a4 4 0 0 1 8 0v3\" />\n </>\n ) : null}\n </svg>\n );\n}\n","import type { KeepItem, KeepItemStatus } from \"@keepkit/core/core\";\nimport { useKeepContext } from \"@keepkit/core/react\";\nimport { useState } from \"react\";\nimport { useKeepUiFeedback, useUiLabel } from \"../../../foundation/ui-context\";\n\ntype KeepStaleNoticeOptions<TMeta> = {\n item: KeepItem<TMeta>;\n onRetry: ((item: KeepItem<TMeta>) => void | Promise<void>) | undefined;\n onRemoved: ((item: KeepItem<TMeta>) => void) | undefined;\n};\n\nexport function useKeepStaleNotice<TMeta>({ item, onRetry, onRemoved }: KeepStaleNoticeOptions<TMeta>) {\n const context = useKeepContext<TMeta>();\n const emitFeedback = useKeepUiFeedback<TMeta>();\n const removedMessage = useUiLabel(\"removedMessage\");\n const restoredMessage = useUiLabel(\"restoredMessage\");\n const undoLabel = useUiLabel(\"undo\");\n const [isRetrying, setIsRetrying] = useState(false);\n const [error, setError] = useState<unknown | null>(null);\n\n async function retry() {\n setError(null);\n setIsRetrying(true);\n try {\n if (onRetry) await onRetry(item);\n else await context.revalidateItems();\n } catch (cause) {\n setError(cause);\n } finally {\n setIsRetrying(false);\n }\n }\n\n async function remove() {\n try {\n await context.removeItemWithUndo(item.id);\n onRemoved?.(item);\n emitFeedback({\n type: \"item-removed\",\n item,\n message: removedMessage,\n undoLabel,\n undo: async () => {\n await context.undoLastRemoval();\n emitFeedback({ type: \"item-restored\", item, items: [item], message: restoredMessage });\n },\n });\n } catch (cause) {\n setError(cause);\n }\n }\n\n return {\n status: item.status && item.status !== \"available\" ? item.status : \"unknown\",\n error,\n isRetrying,\n isMutating: context.isMutating,\n retry,\n remove,\n labels: {\n retry: useUiLabel(\"retry\"),\n remove: useUiLabel(\"removeFromList\"),\n error: useUiLabel(\"error\"),\n },\n };\n}\n\ntype KeepPruneStaleOptions = {\n statuses: KeepItemStatus[];\n onPruned: ((ids: string[]) => void) | undefined;\n};\n\nexport function useKeepPruneStale<TMeta>({ statuses, onPruned }: KeepPruneStaleOptions) {\n const context = useKeepContext<TMeta>();\n const emitFeedback = useKeepUiFeedback<TMeta>();\n const staleItems = context.items.filter((item) => item.status && statuses.includes(item.status));\n const staleIds = staleItems.map((item) => item.id);\n const restoredMessage = useUiLabel(\"restoredMessage\");\n const prunedMessage = useUiLabel(\"stalePrunedMessage\");\n const undoLabel = useUiLabel(\"undo\");\n\n return {\n staleIds,\n isMutating: context.isMutating,\n label: useUiLabel(\"pruneStale\"),\n prune: async () => {\n const ids = [...staleIds];\n const items = [...staleItems];\n await context.removeItemsWithUndo(ids);\n onPruned?.(ids);\n if (items.length > 0) {\n emitFeedback({\n type: \"stale-pruned\",\n item: items[0],\n items,\n message: prunedMessage,\n undoLabel,\n undo: async () => {\n await context.undoLastRemoval();\n emitFeedback({ type: \"item-restored\", item: items[0], items, message: restoredMessage });\n },\n });\n }\n },\n };\n}\n","\"use client\";\n\nimport type { KeepItem, KeepItemStatus } from \"@keepkit/core/core\";\nimport type { ButtonHTMLAttributes, HTMLAttributes, ReactNode } from \"react\";\nimport { KeepItemStatusBadge } from \"../item/KeepItemStatusBadge\";\nimport { useKeepPruneStale, useKeepStaleNotice } from \"./hooks/useKeepStaleNotice\";\n\nexport type KeepStaleNoticeProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n item: KeepItem<TMeta>;\n onRetry?: (item: KeepItem<TMeta>) => void | Promise<void>;\n onRemoved?: (item: KeepItem<TMeta>) => void;\n retryLabel?: ReactNode;\n removeLabel?: ReactNode;\n children?: ReactNode;\n};\n\n/** Provides retry and remove actions for an item whose source is no longer available. */\nexport function KeepStaleNotice<TMeta = Record<string, unknown>>({\n item,\n onRetry,\n onRemoved,\n retryLabel,\n removeLabel,\n children,\n className,\n ...props\n}: KeepStaleNoticeProps<TMeta>) {\n const view = useKeepStaleNotice<TMeta>({ item, onRetry, onRemoved });\n\n return (\n <aside {...props} className={className} data-keepkit=\"stale-notice\" data-state={view.error ? \"error\" : \"stale\"}>\n <KeepItemStatusBadge status={view.status} />\n {children ?? (item.statusReason ? <p>{item.statusReason}</p> : null)}\n <div>\n <button\n type=\"button\"\n data-keep-action=\"retry-item\"\n onClick={() => void view.retry()}\n disabled={view.isRetrying || view.isMutating}\n >\n {retryLabel ?? view.labels.retry}\n </button>\n <button\n type=\"button\"\n data-keep-action=\"remove-item\"\n onClick={() => void view.remove()}\n disabled={view.isMutating}\n >\n {removeLabel ?? view.labels.remove}\n </button>\n </div>\n {view.error ? <p role=\"alert\">{view.error instanceof Error ? view.error.message : view.labels.error}</p> : null}\n </aside>\n );\n}\n\nexport type KeepPruneStaleButtonProps = Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"children\"> & {\n statuses?: KeepItemStatus[];\n label?: ReactNode;\n onPruned?: (ids: string[]) => void;\n children?: ReactNode;\n};\n\n/** Removes all unavailable items through the provider's undo-capable batch action. */\nexport function KeepPruneStaleButton<TMeta = Record<string, unknown>>({\n statuses = [\"expired\", \"removed\", \"deleted\", \"private\", \"unknown\"],\n label,\n onPruned,\n children,\n disabled,\n ...props\n}: KeepPruneStaleButtonProps) {\n const view = useKeepPruneStale<TMeta>({ statuses, onPruned });\n\n return (\n <button\n {...props}\n type=\"button\"\n className={props.className}\n data-keepkit=\"prune-stale\"\n data-keep-action=\"prune-stale\"\n data-state={view.staleIds.length > 0 ? \"available\" : \"empty\"}\n disabled={view.staleIds.length === 0 || view.isMutating || disabled}\n onClick={() => void view.prune()}\n >\n {children ?? label ?? `${view.label} (${view.staleIds.length})`}\n </button>\n );\n}\n","import type { KeepItem } from \"@keepkit/core/core\";\nimport { useKeepItem } from \"@keepkit/core/react\";\nimport type { ReactNode } from \"react\";\nimport { getMetaTitle } from \"../../../foundation/shared\";\nimport { useKeepUiFeedback, useUiLabel } from \"../../../foundation/ui-context\";\nimport type { KeepImageProps, KeepItemCardState } from \"../KeepItemCard\";\n\ntype KeepItemCardOptions<TMeta> = {\n item: KeepItem<TMeta>;\n title: ReactNode | ((item: KeepItem<TMeta>) => ReactNode);\n getTitle: ((item: KeepItem<TMeta>) => ReactNode) | undefined;\n getImageProps: ((item: KeepItem<TMeta>, title: ReactNode) => KeepImageProps | undefined) | undefined;\n href: string | ((item: KeepItem<TMeta>) => string | undefined) | undefined;\n linkTargetAttribute: React.HTMLAttributeAnchorTarget | undefined;\n linkRel: string | undefined;\n onRemoveError: ((error: unknown) => void) | undefined;\n onRemoved: ((item: KeepItem<TMeta>) => void) | undefined;\n};\n\nexport function useKeepItemCard<TMeta>(options: KeepItemCardOptions<TMeta>) {\n const {\n item,\n title,\n getTitle,\n getImageProps,\n href: hrefOption,\n linkTargetAttribute,\n linkRel,\n onRemoveError,\n onRemoved,\n } = options;\n const itemState = useKeepItem<TMeta>(item);\n const emitFeedback = useKeepUiFeedback<TMeta>();\n const removedMessage = useUiLabel(\"removedMessage\");\n const restoredMessage = useUiLabel(\"restoredMessage\");\n const undoLabel = useUiLabel(\"undo\");\n const resolvedTitle =\n typeof title === \"function\" ? title(item) : (title ?? getTitle?.(item) ?? getMetaTitle(item.meta) ?? item.id);\n const imageProps = getImageProps?.(item, resolvedTitle);\n const href = typeof hrefOption === \"function\" ? hrefOption(item) : hrefOption;\n const isAvailable = item.status === undefined || item.status === \"available\";\n const isExternalLink = href ? /^(?:[a-z][a-z\\d+.-]*:|\\/\\/)/i.test(href) : false;\n const statusLabelKey = item.status && item.status !== \"available\" ? getStatusLabelKey(item.status) : \"statusUnknown\";\n const unavailableLabel = useUiLabel(statusLabelKey);\n const remove = async () => {\n const wasSaved = itemState.isSaved;\n try {\n await itemState.removeWithUndo();\n onRemoved?.(item);\n if (!wasSaved) return;\n emitFeedback({\n type: \"item-removed\",\n item,\n message: removedMessage,\n undoLabel,\n undo: async () => {\n await itemState.undo();\n emitFeedback({ type: \"item-restored\", item, items: [item], message: restoredMessage });\n },\n });\n } catch (cause) {\n onRemoveError?.(cause);\n }\n };\n const state: KeepItemCardState<TMeta> = {\n item,\n isSaved: itemState.isSaved,\n isMutating: itemState.isMutating,\n error: itemState.error,\n remove,\n status: item.status,\n };\n\n return {\n itemState,\n state,\n resolvedTitle,\n imageProps,\n href,\n isAvailable,\n displayStatus: getDisplayStatus(item.status),\n resolvedLinkTarget: linkTargetAttribute ?? (isExternalLink ? \"_blank\" : undefined),\n resolvedLinkRel: linkRel ?? (isExternalLink ? \"noreferrer\" : undefined),\n statusLabel: item.status && item.status !== \"available\" ? unavailableLabel : undefined,\n remove,\n labels: {\n save: useUiLabel(\"save\"),\n savedAt: useUiLabel(\"saved\"),\n error: useUiLabel(\"error\"),\n remove: useUiLabel(\"remove\"),\n tags: useUiLabel(\"tags\"),\n },\n };\n}\n\nfunction getStatusLabelKey(\n status: NonNullable<KeepItem[\"status\"]>,\n): \"statusExpired\" | \"statusRemoved\" | \"statusDeleted\" | \"statusPrivate\" | \"statusUnknown\" {\n switch (status) {\n case \"expired\":\n return \"statusExpired\";\n case \"removed\":\n return \"statusRemoved\";\n case \"deleted\":\n return \"statusDeleted\";\n case \"private\":\n return \"statusPrivate\";\n default:\n return \"statusUnknown\";\n }\n}\n\nfunction getDisplayStatus(status: KeepItem[\"status\"]): \"available\" | \"expired\" | \"removed\" | \"restricted\" {\n if (status === undefined || status === \"available\") return \"available\";\n if (status === \"expired\") return \"expired\";\n if (status === \"removed\") return \"removed\";\n return \"restricted\";\n}\n","\"use client\";\n\nimport { type HTMLAttributes, isValidElement, type ReactNode } from \"react\";\nimport { renderRoot } from \"../../foundation/shared\";\nimport { useUiLabel } from \"../../foundation/ui-context\";\n\nexport type KeepEmptyStateVariant = \"empty-storage\" | \"empty-filtered\";\n\nexport type KeepEmptyStateProps = Omit<HTMLAttributes<HTMLElement>, \"children\" | \"title\"> & {\n title?: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n children?: ReactNode;\n variant?: KeepEmptyStateVariant;\n onClearFilters?: () => void;\n asChild?: boolean;\n};\n\n/** An accessible empty state that distinguishes an empty store from an empty filter result. */\nexport function KeepEmptyState({\n title,\n description,\n action,\n children,\n variant,\n onClearFilters,\n asChild = false,\n className,\n ...rootProps\n}: KeepEmptyStateProps) {\n const resolvedVariant = variant ?? \"empty-storage\";\n const defaultTitle = useUiLabel(resolvedVariant === \"empty-filtered\" ? \"noFilteredItems\" : \"noItems\");\n const defaultDescription = useUiLabel(\n resolvedVariant === \"empty-filtered\" ? \"noFilteredItemsDescription\" : \"emptyStorageDescription\",\n );\n const clearLabel = useUiLabel(\"clearFilters\");\n const contentChildren = asChild && isValidElement(children) ? undefined : children;\n const body = contentChildren ?? (\n <>\n <h2>{title ?? defaultTitle}</h2>\n {description ?? <p>{defaultDescription}</p>}\n {action ??\n (resolvedVariant === \"empty-filtered\" && onClearFilters ? (\n <button type=\"button\" data-keep-action=\"clear-filters\" onClick={onClearFilters}>\n {clearLabel}\n </button>\n ) : null)}\n </>\n );\n return renderRoot(\n asChild,\n children,\n { ...rootProps, className, \"data-keepkit\": \"empty-state\", \"data-state\": variant ?? \"empty\" },\n body,\n \"KeepEmptyState\",\n );\n}\n","import type { KeepListQuery } from \"@keepkit/core/core\";\nimport { useKeepList } from \"@keepkit/core/react\";\nimport { useUiLabel } from \"../../../foundation/ui-context\";\n\nexport function useKeepListView<TMeta>(query: KeepListQuery<TMeta> | undefined) {\n return {\n state: useKeepList<TMeta>(query),\n allState: useKeepList<TMeta>({}),\n labels: {\n loading: useUiLabel(\"loadingItems\"),\n empty: useUiLabel(\"noItems\"),\n error: useUiLabel(\"errorItems\"),\n },\n };\n}\n","import type { FocusEvent, KeyboardEvent, RefObject } from \"react\";\nimport { useCallback, useEffect, useRef } from \"react\";\n\ntype RovingHandlers<TElement extends HTMLElement> = {\n ref: RefObject<TElement | null>;\n onKeyDown: (event: KeyboardEvent<HTMLElement>) => void;\n onFocusCapture: (event: FocusEvent<HTMLElement>) => void;\n};\n\n/** Keeps cards in a group reachable through one tab stop and arrow-key movement. */\nexport function useRovingTabIndex<TElement extends HTMLElement>(): RovingHandlers<TElement> {\n const ref = useRef<TElement | null>(null);\n\n const getItems = useCallback((): HTMLElement[] => {\n const root = ref.current;\n if (!root) return [];\n return Array.from(root.querySelectorAll<HTMLElement>('[data-keepkit=\"card\"]')).filter(\n (item) => item.getAttribute(\"aria-hidden\") !== \"true\" && item.getAttribute(\"data-roving-disabled\") !== \"true\",\n );\n }, []);\n\n const syncTabIndices = useCallback(() => {\n const items = getItems();\n if (items.length === 0) return;\n const activeElement = document.activeElement;\n const activeItem = items.find((item) => item === activeElement || item.contains(activeElement));\n const activeIndex = activeItem ? items.indexOf(activeItem) : 0;\n items.forEach((item, index) => {\n item.tabIndex = index === activeIndex ? 0 : -1;\n });\n }, [getItems]);\n\n useEffect(() => {\n const root = ref.current;\n if (!root) return;\n syncTabIndices();\n const observer = new MutationObserver(syncTabIndices);\n observer.observe(root, { childList: true, subtree: true });\n return () => observer.disconnect();\n }, [syncTabIndices]);\n\n const onFocusCapture = useCallback(\n (event: FocusEvent<HTMLElement>) => {\n if (!(event.target instanceof HTMLElement)) return;\n const item = event.target.closest<HTMLElement>('[data-keepkit=\"card\"]');\n if (!item || !ref.current?.contains(item)) return;\n getItems().forEach((candidate) => {\n candidate.tabIndex = candidate === item ? 0 : -1;\n });\n },\n [getItems],\n );\n\n const onKeyDown = useCallback(\n (event: KeyboardEvent<HTMLElement>) => {\n if (event.defaultPrevented) return;\n const items = getItems();\n if (!(event.target instanceof HTMLElement)) return;\n const current = event.target.closest<HTMLElement>('[data-keepkit=\"card\"]');\n if (!current || current !== event.target || !ref.current?.contains(current)) return;\n const currentIndex = items.indexOf(current);\n if (currentIndex < 0) return;\n\n let nextIndex: number | undefined;\n if (event.key === \"Home\") nextIndex = 0;\n if (event.key === \"End\") nextIndex = items.length - 1;\n if (event.key === \"ArrowRight\" || event.key === \"ArrowDown\")\n nextIndex = Math.min(currentIndex + 1, items.length - 1);\n if (event.key === \"ArrowLeft\" || event.key === \"ArrowUp\") nextIndex = Math.max(currentIndex - 1, 0);\n if (nextIndex === undefined) return;\n\n event.preventDefault();\n if (nextIndex === currentIndex) return;\n items[nextIndex]?.focus();\n },\n [getItems],\n );\n\n return { ref, onKeyDown, onFocusCapture };\n}\n","\"use client\";\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { useRovingTabIndex } from \"./hooks/useRovingTabIndex\";\nimport type { KeepLayoutPreset } from \"./KeepCollection\";\n\nexport type KeepLayoutProps = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n layout?: KeepLayoutPreset;\n children?: ReactNode;\n};\n\n/** A container-aware layout wrapper with a stable preset attribute for host or theme CSS. */\nexport function KeepLayout({ layout = \"list\", children, onKeyDown, onFocusCapture, ...props }: KeepLayoutProps) {\n const roving = useRovingTabIndex<HTMLDivElement>();\n return (\n // biome-ignore lint/a11y/noStaticElementInteractions: The group manages keyboard focus for descendant cards.\n <div\n {...props}\n ref={roving.ref}\n data-keepkit=\"layout\"\n data-layout={layout}\n data-roving-tabindex=\"true\"\n role={props.role ?? \"group\"}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n if (!event.defaultPrevented) roving.onKeyDown(event);\n }}\n onFocusCapture={(event) => {\n onFocusCapture?.(event);\n if (!event.defaultPrevented) roving.onFocusCapture(event);\n }}\n >\n {children}\n </div>\n );\n}\n","\"use client\";\n\nimport type { KeepItem } from \"@keepkit/core/core\";\nimport type { HTMLAttributes, KeyboardEvent, ReactNode } from \"react\";\nimport { useState } from \"react\";\n\nexport type KeepReorderableItemState = {\n index: number;\n isDragging: boolean;\n dragHandleProps: {\n role: \"button\";\n tabIndex: 0;\n draggable: true;\n \"data-drag-handle\": \"true\";\n \"aria-label\": string;\n \"aria-grabbed\": boolean;\n onDragStart: () => void;\n onDragEnd: () => void;\n onKeyDown: (event: KeyboardEvent<HTMLElement>) => void;\n };\n moveUp: () => void;\n moveDown: () => void;\n};\n\nexport type KeepReorderableListProps<TItem extends { id: string } = KeepItem> = Omit<\n HTMLAttributes<HTMLUListElement>,\n \"children\" | \"onChange\"\n> & {\n items: readonly TItem[];\n onReorder: (orderedIds: string[]) => void | Promise<void>;\n renderItem: (item: TItem, state: KeepReorderableItemState) => ReactNode;\n itemLabel?: (item: TItem, index: number) => string;\n};\n\n/** Accessible drag-and-drop list with keyboard up/down fallback and no styling assumptions. */\nexport function KeepReorderableList<TItem extends { id: string } = KeepItem>({\n items,\n onReorder,\n renderItem,\n itemLabel = (_item, index) => `Move item ${index + 1}`,\n ...props\n}: KeepReorderableListProps<TItem>) {\n const [draggedId, setDraggedId] = useState<string | null>(null);\n const [dropTargetIndex, setDropTargetIndex] = useState<number | null>(null);\n const ids = items.map((item) => item.id);\n\n function commit(nextIds: string[]) {\n void onReorder(nextIds);\n }\n\n function move(index: number, targetIndex: number) {\n if (targetIndex < 0 || targetIndex >= ids.length || targetIndex === index) return;\n const next = [...ids];\n const [id] = next.splice(index, 1);\n if (id === undefined) return;\n next.splice(targetIndex, 0, id);\n commit(next);\n }\n\n function moveToInsertion(index: number, insertionIndex: number) {\n const next = [...ids];\n const [id] = next.splice(index, 1);\n if (id === undefined) return;\n const targetIndex = Math.min(\n Math.max(0, insertionIndex > index ? insertionIndex - 1 : insertionIndex),\n next.length,\n );\n next.splice(targetIndex, 0, id);\n if (next[index] === id) return;\n commit(next);\n }\n\n return (\n <ul {...props} data-keepkit=\"reorderable-list\">\n {items.map((item, index) => {\n const moveUp = () => move(index, index - 1);\n const moveDown = () => move(index, index + 1);\n const onHandleKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n moveUp();\n } else if (event.key === \"ArrowDown\") {\n event.preventDefault();\n moveDown();\n }\n };\n const state: KeepReorderableItemState = {\n index,\n isDragging: draggedId === item.id,\n moveUp,\n moveDown,\n dragHandleProps: {\n role: \"button\",\n tabIndex: 0,\n draggable: true,\n \"data-drag-handle\": \"true\",\n \"aria-label\": itemLabel(item, index),\n \"aria-grabbed\": draggedId === item.id,\n onDragStart: () => {\n setDraggedId(item.id);\n setDropTargetIndex(index);\n },\n onDragEnd: () => {\n setDraggedId(null);\n setDropTargetIndex(null);\n },\n onKeyDown: onHandleKeyDown,\n },\n };\n return (\n <li\n key={item.id}\n data-reorder-index={index}\n data-dragging={draggedId === item.id ? \"true\" : undefined}\n data-drop-target={\n draggedId && draggedId !== item.id\n ? dropTargetIndex === index\n ? \"before\"\n : dropTargetIndex === index + 1\n ? \"after\"\n : undefined\n : undefined\n }\n onDragOver={(event) => {\n if (!draggedId || draggedId === item.id) return;\n event.preventDefault();\n const bounds = event.currentTarget.getBoundingClientRect();\n const insertionIndex = event.clientY > bounds.top + bounds.height / 2 ? index + 1 : index;\n setDropTargetIndex(insertionIndex);\n }}\n onDragLeave={(event) => {\n if (event.currentTarget === event.target) setDropTargetIndex(null);\n }}\n onDrop={(event) => {\n event.preventDefault();\n if (!draggedId || draggedId === item.id) return;\n const sourceIndex = ids.indexOf(draggedId);\n setDraggedId(null);\n setDropTargetIndex(null);\n moveToInsertion(sourceIndex, dropTargetIndex ?? index);\n }}\n >\n {renderItem(item, state)}\n </li>\n );\n })}\n </ul>\n );\n}\n","\"use client\";\n\nimport type { KeepItem } from \"@keepkit/core/core\";\nimport { type FormHTMLAttributes, isValidElement, type ReactNode } from \"react\";\nimport { type RenderProp, renderRoot } from \"../../foundation/shared\";\nimport { KeepShortcutHint } from \"../navigation/KeepShortcutHint\";\nimport { useKeepNoteEditor } from \"./hooks/useKeepNoteEditor\";\n\nexport type KeepNoteEditorState<TMeta = Record<string, unknown>> = {\n item: KeepItem<TMeta>;\n note: string;\n setNote: (note: string) => void;\n isDirty: boolean;\n isSaving: boolean;\n error: unknown | null;\n save: () => Promise<void>;\n};\n\nexport type KeepNoteEditorProps<TMeta = Record<string, unknown>> = Omit<\n FormHTMLAttributes<HTMLFormElement>,\n \"children\" | \"onSubmit\"\n> & {\n item: KeepItem<TMeta>;\n label?: ReactNode;\n saveLabel?: ReactNode;\n placeholder?: string;\n /** Automatically save dirty notes after this delay; set to 0 to disable auto-save. */\n debounceMs?: number;\n showShortcutHint?: boolean;\n onSaved?: (note?: string) => void;\n onSaveError?: (error: unknown) => void;\n render?: RenderProp<KeepNoteEditorState<TMeta>>;\n children?: ReactNode | RenderProp<KeepNoteEditorState<TMeta>>;\n asChild?: boolean;\n};\n\n/** A controlled-by-default note editor that persists through useKeepItem. */\nexport function KeepNoteEditor<TMeta = Record<string, unknown>>({\n item,\n label,\n saveLabel,\n placeholder,\n debounceMs = 300,\n showShortcutHint = false,\n onSaved,\n onSaveError,\n render,\n children,\n asChild = false,\n className,\n ...formProps\n}: KeepNoteEditorProps<TMeta>) {\n const view = useKeepNoteEditor<TMeta>({ item, debounceMs, onSaved, onSaveError });\n const { error, isDirty, isSaving, note, setNote } = view.state;\n const contentChildren = asChild && isValidElement(children) ? undefined : children;\n const body = render\n ? render(view.state)\n : typeof contentChildren === \"function\"\n ? contentChildren(view.state)\n : (contentChildren ?? (\n <>\n <label>\n {label ?? view.labels.note}\n <textarea\n data-keep-action=\"edit-note\"\n value={note}\n onChange={(event) => setNote(event.currentTarget.value)}\n placeholder={placeholder}\n disabled={isSaving}\n onKeyDown={view.handleKeyDown}\n />\n </label>\n <button type=\"submit\" data-keep-action=\"save-note\" disabled={isSaving} aria-busy={isSaving}>\n {saveLabel ?? view.labels.save}\n {showShortcutHint ? <KeepShortcutHint shortcut=\"Ctrl+Enter\" /> : null}\n </button>\n </>\n ));\n if (!asChild) {\n return (\n <form\n {...formProps}\n className={className}\n data-keepkit=\"note-editor\"\n onSubmit={view.submit}\n aria-busy={isSaving || formProps[\"aria-busy\"]}\n data-state={error ? \"error\" : isDirty ? \"dirty\" : \"clean\"}\n data-loading={isSaving ? \"true\" : undefined}\n data-disabled={isSaving ? \"true\" : undefined}\n >\n {body}\n {error ? <p role=\"alert\">{getErrorMessage(error, view.labels.error)}</p> : null}\n </form>\n );\n }\n return renderRoot(\n true,\n isValidElement(children) ? children : undefined,\n {\n ...formProps,\n className,\n \"data-keepkit\": \"note-editor\",\n onSubmit: view.submit,\n \"aria-busy\": isSaving || formProps[\"aria-busy\"],\n \"data-state\": error ? \"error\" : isDirty ? \"dirty\" : \"clean\",\n \"data-loading\": isSaving ? \"true\" : undefined,\n \"data-disabled\": isSaving ? \"true\" : undefined,\n },\n body,\n \"KeepNoteEditor\",\n );\n}\n\nfunction getErrorMessage(error: unknown, fallback: string): string {\n return error instanceof Error ? error.message : fallback;\n}\n","\"use client\";\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\n\nexport type KeepShortcutHintProps = Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> & {\n shortcut: string | readonly string[];\n separator?: ReactNode;\n};\n\n/** Displays a keyboard shortcut using semantic kbd elements. */\nexport function KeepShortcutHint({ shortcut, separator = \"+\", ...props }: KeepShortcutHintProps) {\n const keys: readonly string[] = typeof shortcut === \"string\" ? shortcut.split(\"+\") : [...shortcut];\n const occurrences = new Map<string, number>();\n const keyedKeys = keys.map((key) => {\n const occurrence = occurrences.get(key) ?? 0;\n occurrences.set(key, occurrence + 1);\n return { id: `${key}-${occurrence}`, value: key };\n });\n return (\n <span {...props} data-keepkit=\"shortcut-hint\" aria-hidden={props[\"aria-hidden\"] ?? true}>\n {keyedKeys.map((key, index) => (\n <span key={key.id}>\n {index > 0 ? <span data-shortcut-separator=\"true\">{separator}</span> : null}\n <kbd>{key.value.trim()}</kbd>\n </span>\n ))}\n </span>\n );\n}\n","import type { KeepItem } from \"@keepkit/core/core\";\nimport { useKeepItem } from \"@keepkit/core/react\";\nimport type { FormHTMLAttributes, KeyboardEvent } from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useUiLabel } from \"../../../foundation/ui-context\";\nimport type { KeepNoteEditorState } from \"../KeepNoteEditor\";\n\ntype KeepNoteEditorOptions<TMeta> = {\n item: KeepItem<TMeta>;\n debounceMs: number;\n onSaved: ((note?: string) => void) | undefined;\n onSaveError: ((error: unknown) => void) | undefined;\n};\n\nexport function useKeepNoteEditor<TMeta>({ item, debounceMs, onSaved, onSaveError }: KeepNoteEditorOptions<TMeta>) {\n const itemState = useKeepItem<TMeta>(item);\n const { error, isMutating, item: savedItem, updateNote } = itemState;\n const [note, setNote] = useState(item.note ?? \"\");\n const baselineNote = savedItem?.note ?? item.note ?? \"\";\n const isDirty = note !== baselineNote;\n const lastSavedNoteRef = useRef<string | undefined>(undefined);\n\n useEffect(() => setNote(baselineNote), [baselineNote]);\n const save = useCallback(async () => {\n const nextNote = note.trim() || undefined;\n try {\n await updateNote(nextNote);\n lastSavedNoteRef.current = note;\n onSaved?.(nextNote);\n } catch (cause) {\n onSaveError?.(cause);\n throw cause;\n }\n }, [note, onSaveError, onSaved, updateNote]);\n useEffect(() => {\n if (!isDirty || debounceMs <= 0 || lastSavedNoteRef.current === note) return;\n const timer = window.setTimeout(() => void save().catch(() => undefined), debounceMs);\n return () => window.clearTimeout(timer);\n }, [debounceMs, isDirty, note, save]);\n\n const state: KeepNoteEditorState<TMeta> = {\n item,\n note,\n setNote,\n isDirty,\n isSaving: isMutating,\n error,\n save,\n };\n const submit: FormHTMLAttributes<HTMLFormElement>[\"onSubmit\"] = (event) => {\n event.preventDefault();\n void save().catch(() => undefined);\n };\n\n return {\n state,\n submit,\n handleKeyDown: (event: KeyboardEvent<HTMLTextAreaElement>) => {\n if (event.key !== \"Enter\" || (!event.ctrlKey && !event.metaKey)) return;\n event.preventDefault();\n void save().catch(() => undefined);\n },\n labels: {\n note: useUiLabel(\"note\"),\n save: useUiLabel(\"saveNote\"),\n error: useUiLabel(\"error\"),\n },\n };\n}\n","import type { KeepItem } from \"@keepkit/core/core\";\nimport { useKeepItem } from \"@keepkit/core/react\";\nimport type { FormEvent, KeyboardEvent } from \"react\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport { normalizeUiTags } from \"../../../foundation/shared\";\nimport { useUiLabel } from \"../../../foundation/ui-context\";\nimport type { KeepTagEditorState } from \"../KeepTagEditor\";\n\ntype KeepTagEditorOptions<TMeta> = {\n item: KeepItem<TMeta>;\n onSaved: ((tags?: string[]) => void) | undefined;\n onSaveError: ((error: unknown) => void) | undefined;\n};\n\nexport function useKeepTagEditor<TMeta>({ item, onSaved, onSaveError }: KeepTagEditorOptions<TMeta>) {\n const itemState = useKeepItem<TMeta>(item);\n const [tags, setTags] = useState(item.tags ?? []);\n const [input, setInput] = useState(\"\");\n useEffect(() => setTags(itemState.item?.tags ?? item.tags ?? []), [item.tags, itemState.item?.tags]);\n const save = useCallback(async () => {\n const nextTags = normalizeUiTags(tags);\n try {\n await itemState.updateTags(nextTags);\n setTags(nextTags);\n onSaved?.(nextTags);\n } catch (cause) {\n onSaveError?.(cause);\n throw cause;\n }\n }, [itemState, onSaveError, onSaved, tags]);\n const addTag = (tag: string) => {\n setTags(normalizeUiTags([...tags, tag]));\n setInput(\"\");\n };\n const state: KeepTagEditorState = { tags, setTags, save, isSaving: itemState.isMutating };\n\n return {\n state,\n input,\n setInput,\n error: itemState.error,\n handleInputKeyDown: (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Enter\") {\n if (event.nativeEvent.isComposing) return;\n event.preventDefault();\n if (input.trim()) addTag(input);\n } else if (event.key === \"Backspace\" && input.length === 0 && tags.length > 0) {\n event.preventDefault();\n setTags(tags.slice(0, -1));\n }\n },\n removeTag: (tag: string) => setTags(tags.filter((current) => current !== tag)),\n submit: (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n void save().catch(() => undefined);\n },\n labels: {\n tags: useUiLabel(\"tagsToApply\"),\n remove: useUiLabel(\"remove\"),\n apply: useUiLabel(\"applyTags\"),\n error: useUiLabel(\"error\"),\n },\n };\n}\n","\"use client\";\n\nimport type { KeepItem } from \"@keepkit/core/core\";\nimport type { FormHTMLAttributes } from \"react\";\nimport type { RenderProp } from \"../../foundation/shared\";\nimport { useKeepTagEditor } from \"./hooks/useKeepTagEditor\";\n\nexport type KeepTagEditorState = {\n tags: string[];\n setTags: (tags: string[]) => void;\n save: () => Promise<void>;\n isSaving: boolean;\n};\n\nexport type KeepTagEditorProps<TMeta = Record<string, unknown>> = Omit<\n FormHTMLAttributes<HTMLFormElement>,\n \"children\" | \"onSubmit\"\n> & {\n item: KeepItem<TMeta>;\n availableTags?: string[];\n onSaved?: (tags?: string[]) => void;\n onSaveError?: (error: unknown) => void;\n render?: RenderProp<KeepTagEditorState>;\n};\n\n/** Edits one item's normalized tag set; Enter adds and Backspace removes the last tag. */\nexport function KeepTagEditor<TMeta = Record<string, unknown>>({\n item,\n availableTags = [],\n onSaved,\n onSaveError,\n render,\n ...props\n}: KeepTagEditorProps<TMeta>) {\n const view = useKeepTagEditor<TMeta>({ item, onSaved, onSaveError });\n const { isSaving, tags } = view.state;\n const body = render ? (\n render(view.state)\n ) : (\n <>\n <label>\n {view.labels.tags}\n <input\n data-keep-action=\"edit-tags\"\n value={view.input}\n list={availableTags.length > 0 ? `keep-tags-${item.id}` : undefined}\n onChange={(event) => view.setInput(event.currentTarget.value)}\n onKeyDown={view.handleInputKeyDown}\n />\n </label>\n {availableTags.length > 0 ? (\n <datalist id={`keep-tags-${item.id}`}>\n {availableTags.map((tag) => (\n <option key={tag} value={tag} />\n ))}\n </datalist>\n ) : null}\n <ul aria-label={view.labels.tags}>\n {tags.map((tag) => (\n <li key={tag}>\n {tag}\n <button type=\"button\" data-keep-action=\"remove-tag\" onClick={() => view.removeTag(tag)}>\n {view.labels.remove}\n </button>\n </li>\n ))}\n </ul>\n <button type=\"submit\" data-keep-action=\"apply-tags\" disabled={isSaving} aria-busy={isSaving}>\n {view.labels.apply}\n </button>\n </>\n );\n return (\n <form\n {...props}\n onSubmit={view.submit}\n aria-busy={isSaving || props[\"aria-busy\"]}\n data-keepkit=\"tag-editor\"\n data-state={view.error ? \"error\" : isSaving ? \"saving\" : \"idle\"}\n data-loading={isSaving ? \"true\" : undefined}\n data-disabled={isSaving ? \"true\" : undefined}\n >\n {body}\n {view.error ? <p role=\"alert\">{getErrorMessage(view.error, view.labels.error)}</p> : null}\n </form>\n );\n}\n\nfunction getErrorMessage(error: unknown, fallback: string): string {\n return error instanceof Error ? error.message : fallback;\n}\n","import { useCallback } from \"react\";\nimport type { KeepUiFeedbackEvent } from \"../../foundation/ui-context\";\n\nexport type KeepToastFeedbackOptions = {\n action?: { label: string; onClick: () => void };\n};\n\nexport type KeepToastHandler = (message: string, options?: KeepToastFeedbackOptions) => unknown;\n\n/** Adapts KeepKit feedback to Sonner-like toast functions without adding a toast dependency. */\nexport function useKeepToastFeedback<TMeta = Record<string, unknown>>(showToast: KeepToastHandler) {\n return useCallback(\n (event: KeepUiFeedbackEvent<TMeta>) => {\n if (!(\"undo\" in event)) {\n showToast(event.message);\n return;\n }\n showToast(event.message, {\n action: {\n label: event.undoLabel,\n onClick: () => void event.undo(),\n },\n });\n },\n [showToast],\n );\n}\n","\"use client\";\n\nimport type { KeepItem } from \"@keepkit/core/core\";\nimport { type UseKeepNavigatorResult, useKeepNavigator } from \"@keepkit/core/react\";\nimport { type HTMLAttributes, type ReactNode, type Ref, useId } from \"react\";\nimport { getMetaTitle, renderRoot } from \"../../foundation/shared\";\nimport { useKeepUiLabels, useUiLabel } from \"../../foundation/ui-context\";\nimport { type KeepTourShortcutsOptions, useKeepTourShortcuts } from \"./hooks/useKeepTourShortcuts\";\nimport { KeepShortcutHint } from \"./KeepShortcutHint\";\n\nexport type KeepTourBarProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n ref?: Ref<HTMLElement> | { readonly current: unknown };\n navigation?: UseKeepNavigatorResult<TMeta>;\n currentId?: string;\n initialIndex?: number;\n showProgress?: boolean;\n prevHref?: string;\n nextHref?: string;\n backHref?: string;\n onPrev?: () => void | Promise<void>;\n onNext?: () => void | Promise<void>;\n onBack?: () => void | Promise<void>;\n prevLabel?: string;\n nextLabel?: string;\n backLabel?: string;\n keyboardShortcuts?: boolean;\n showShortcutHint?: boolean;\n shortcutOptions?: Omit<KeepTourShortcutsOptions, \"onNext\" | \"onPrev\">;\n progress?: ReactNode;\n getItemTitle?: (item: KeepItem<TMeta>) => ReactNode;\n children?: ReactNode;\n asChild?: boolean;\n};\n\n/** Headless previous/current/next navigation with optional URL links and keyboard shortcuts. */\nexport function KeepTourBar<TMeta = Record<string, unknown>>({\n navigation: providedNavigation,\n currentId,\n initialIndex,\n showProgress = true,\n prevHref,\n nextHref,\n backHref,\n onPrev,\n onNext,\n onBack,\n prevLabel,\n nextLabel,\n backLabel,\n keyboardShortcuts = false,\n showShortcutHint = false,\n shortcutOptions,\n progress,\n getItemTitle = (item) => getMetaTitle(item.meta) ?? item.id,\n children,\n asChild = false,\n ...props\n}: KeepTourBarProps<TMeta>) {\n const ownNavigation = useKeepNavigator<TMeta>({ currentId, initialIndex });\n const navigation = providedNavigation ?? ownNavigation;\n const previousLabel = useUiLabel(\"previousPage\", prevLabel);\n const nextItemLabel = useUiLabel(\"nextPage\", nextLabel);\n const listLabel = useUiLabel(\"allItems\", backLabel);\n const { labels } = useKeepUiLabels();\n const resolvedPrev = onPrev ?? (() => navigateTo(navigation.goToPrev(), prevHref));\n const resolvedNext = onNext ?? (() => navigateTo(navigation.goToNext(), nextHref));\n useKeepTourShortcuts({\n ...shortcutOptions,\n enabled: keyboardShortcuts && (shortcutOptions?.enabled ?? true),\n onNext: () => {\n return resolvedNext();\n },\n onPrev: () => {\n return resolvedPrev();\n },\n });\n\n const body = (\n <>\n {showProgress ? (\n <span data-keepkit=\"tour-progress\" aria-live=\"polite\">\n {progress ?? `${navigation.currentPosition ?? 0} / ${navigation.items.length}`}\n </span>\n ) : null}\n <TourAction\n href={prevHref}\n disabled={!navigation.hasPrev}\n onClick={prevHref ? onPrev : resolvedPrev}\n data-keep-action=\"tour-prev\"\n shortcut={showShortcutHint ? (shortcutOptions?.prevKeys?.[0] ?? \"K\") : undefined}\n preview={\n navigation.prevItem ? (\n <>\n {previousLabel}: {getItemTitle(navigation.prevItem)}\n </>\n ) : undefined\n }\n >\n {previousLabel}\n </TourAction>\n <TourAction\n href={nextHref}\n disabled={!navigation.hasNext}\n onClick={nextHref ? onNext : resolvedNext}\n data-keep-action=\"tour-next\"\n shortcut={showShortcutHint ? (shortcutOptions?.nextKeys?.[0] ?? \"J\") : undefined}\n preview={\n navigation.nextItem ? (\n <>\n {nextItemLabel}: {getItemTitle(navigation.nextItem)}\n </>\n ) : undefined\n }\n >\n {nextItemLabel}\n </TourAction>\n {backHref || onBack ? (\n <TourAction href={backHref} onClick={onBack} data-keep-action=\"tour-back\">\n {listLabel}\n </TourAction>\n ) : null}\n </>\n );\n return renderRoot(\n asChild,\n children,\n { ...props, \"data-keepkit\": \"tour-bar\", \"aria-label\": props[\"aria-label\"] ?? labels.pagination },\n body,\n \"KeepTourBar\",\n );\n}\n\ntype TourActionProps = {\n href?: string;\n disabled?: boolean;\n onClick?: () => void | Promise<void>;\n children?: ReactNode;\n \"data-keep-action\": string;\n preview?: ReactNode;\n shortcut?: string;\n};\n\nfunction TourAction({ href, disabled = false, onClick, children, preview, shortcut, ...props }: TourActionProps) {\n const previewId = useId();\n const content = (\n <>\n <span data-tour-label=\"true\">{children}</span>\n {shortcut ? <KeepShortcutHint shortcut={shortcut} /> : null}\n {preview ? (\n <small id={previewId} data-tour-preview=\"true\">\n {preview}\n </small>\n ) : null}\n </>\n );\n if (href && !disabled) {\n return (\n <a\n {...props}\n href={href}\n onClick={() => void onClick?.()}\n aria-label={String(children)}\n aria-describedby={preview ? previewId : undefined}\n >\n {content}\n </a>\n );\n }\n return (\n <button\n {...props}\n type=\"button\"\n disabled={disabled}\n onClick={() => void onClick?.()}\n aria-label={String(children)}\n aria-describedby={preview ? previewId : undefined}\n >\n {content}\n </button>\n );\n}\n\nexport const KeepNavigator = KeepTourBar;\n\nfunction navigateTo(item: unknown, href?: string): void {\n if (!item || !href || typeof window === \"undefined\") return;\n window.location.assign(href);\n}\n","import { useEffect } from \"react\";\n\nexport type KeepTourShortcutsOptions = {\n onNext: () => void | Promise<void>;\n onPrev: () => void | Promise<void>;\n enabled?: boolean;\n allowInEditable?: boolean;\n preventDefault?: boolean;\n nextKeys?: readonly string[];\n prevKeys?: readonly string[];\n onError?: (error: unknown) => void;\n};\n\n/** Bind J/]/K/[ (or custom keys) to previous/next tour actions. */\nexport function useKeepTourShortcuts({\n onNext,\n onPrev,\n enabled = true,\n allowInEditable = false,\n preventDefault = true,\n nextKeys = [\"j\", \"]\"],\n prevKeys = [\"k\", \"[\"],\n onError,\n}: KeepTourShortcutsOptions): void {\n useEffect(() => {\n if (!enabled) return;\n const handleKeyDown = (event: KeyboardEvent) => {\n if (!allowInEditable && isEditableTarget(event.target)) return;\n if (event.metaKey || event.ctrlKey || event.altKey || event.shiftKey) return;\n const key = event.key.toLocaleLowerCase();\n const action = nextKeys.some((candidate) => candidate.toLocaleLowerCase() === key)\n ? onNext\n : prevKeys.some((candidate) => candidate.toLocaleLowerCase() === key)\n ? onPrev\n : undefined;\n if (!action) return;\n if (preventDefault) event.preventDefault();\n void Promise.resolve(action()).catch((error) => onError?.(error));\n };\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [allowInEditable, enabled, nextKeys, onError, onNext, onPrev, preventDefault, prevKeys]);\n}\n\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n return (\n target.isContentEditable ||\n target.tagName === \"INPUT\" ||\n target.tagName === \"TEXTAREA\" ||\n target.tagName === \"SELECT\"\n );\n}\n","\"use client\";\n\nimport type { KeepItem } from \"@keepkit/core/core\";\nimport { type HTMLAttributes, isValidElement, type ReactNode } from \"react\";\nimport { type RenderProp, renderRoot } from \"../../foundation/shared\";\nimport { useKeepAnnouncements, useKeepStatus } from \"./hooks/useStatusViews\";\n\nexport type { KeepEmptyStateProps, KeepEmptyStateVariant } from \"./KeepEmptyState\";\nexport { KeepEmptyState } from \"./KeepEmptyState\";\n\nexport type KeepStatusValue = \"idle\" | \"empty\" | \"loading\" | \"saving\" | \"syncing\" | \"error\";\nexport type KeepStatusLabels = Partial<Record<KeepStatusValue, ReactNode>>;\n\nexport type KeepStatusState<TMeta = Record<string, unknown>> = {\n status: KeepStatusValue;\n error: unknown | null;\n pendingCount: number;\n items: KeepItem<TMeta>[];\n};\n\nexport type KeepStatusProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n status?: KeepStatusValue;\n labels?: KeepStatusLabels;\n children?: ReactNode | RenderProp<KeepStatusState<TMeta>>;\n render?: RenderProp<KeepStatusState<TMeta>>;\n asChild?: boolean;\n};\n\n/** Presents provider loading, mutation, synchronization, empty, and error states accessibly. */\nexport function KeepStatus<TMeta = Record<string, unknown>>({\n status,\n labels,\n children,\n render,\n asChild = false,\n className,\n ...rootProps\n}: KeepStatusProps<TMeta>) {\n const view = useKeepStatus<TMeta>(status);\n const contentChildren = asChild && isValidElement(children) ? undefined : children;\n const body = render\n ? render(view.state)\n : typeof contentChildren === \"function\"\n ? contentChildren(view.state)\n : (contentChildren ?? labels?.[view.state.status] ?? view.defaultLabel);\n const role = rootProps.role ?? (view.state.status === \"error\" ? \"alert\" : \"status\");\n return renderRoot(\n asChild,\n isValidElement(children) ? children : undefined,\n {\n ...rootProps,\n className,\n \"data-keepkit\": \"status\",\n role,\n \"aria-live\": rootProps[\"aria-live\"] ?? \"polite\",\n \"data-state\": view.state.status,\n \"data-loading\":\n view.state.status === \"loading\" || view.state.status === \"saving\" || view.state.status === \"syncing\"\n ? \"true\"\n : undefined,\n },\n body,\n \"KeepStatus\",\n );\n}\n\nexport type KeepAnnouncementsProps = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n messages?: Partial<Record<\"save\" | \"remove\" | \"note\", string>>;\n};\n\n/** Announces successful save, remove, and note operations in a polite live region. */\nexport function KeepAnnouncements<TMeta = Record<string, unknown>>({ messages, ...props }: KeepAnnouncementsProps) {\n const message = useKeepAnnouncements<TMeta>(messages);\n return (\n <div\n {...props}\n role={props.role ?? \"status\"}\n aria-live={props[\"aria-live\"] ?? \"polite\"}\n aria-atomic=\"true\"\n data-keepkit=\"announcements\"\n data-state=\"announcing\"\n >\n {message}\n </div>\n );\n}\n\n/** Singular alias for applications that mount one announcer explicitly. */\nexport const KeepAnnouncer = KeepAnnouncements;\n","import type { KeepChangeContext } from \"@keepkit/core/core\";\nimport { useKeepContext } from \"@keepkit/core/react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { type KeepUiLabelKey, useUiLabel } from \"../../../foundation/ui-context\";\nimport type { KeepAnnouncementsProps, KeepStatusState, KeepStatusValue } from \"../status\";\n\nexport function useKeepEmptyState() {\n return useUiLabel(\"noItems\").replace(/\\.$/, \"\");\n}\n\nexport function useKeepStatus<TMeta>(status: KeepStatusValue | undefined) {\n const context = useKeepContext<TMeta>();\n const resolvedStatus = status ?? getDerivedStatus(context);\n const state: KeepStatusState<TMeta> = {\n status: resolvedStatus,\n error: context.error,\n pendingCount: context.syncState.pendingCount,\n items: context.items,\n };\n return { state, defaultLabel: useUiLabel(getStatusLabelKey(resolvedStatus)) };\n}\n\nexport function useKeepAnnouncements<TMeta>(messages: KeepAnnouncementsProps[\"messages\"]) {\n const context = useKeepContext<TMeta>();\n const savedMessage = useUiLabel(\"savedMessage\", messages?.save);\n const removedMessage = useUiLabel(\"removedMessage\", messages?.remove);\n const noteSavedMessage = useUiLabel(\"noteSavedMessage\", messages?.note);\n const [message, setMessage] = useState(\"\");\n const lastChangeRef = useRef<KeepChangeContext<TMeta> | undefined>(undefined);\n useEffect(() => {\n const change = context.lastChange;\n if (!change || change === lastChangeRef.current) return;\n lastChangeRef.current = change;\n if (change.action === \"save\") setMessage(savedMessage);\n else if (change.action === \"remove\" || change.action === \"removeBatch\") setMessage(removedMessage);\n else if (change.action === \"updateNote\") setMessage(noteSavedMessage);\n }, [context.lastChange, noteSavedMessage, removedMessage, savedMessage]);\n return message;\n}\n\nfunction getDerivedStatus<TMeta>(context: ReturnType<typeof useKeepContext<TMeta>>): KeepStatusValue {\n if (context.error) return \"error\";\n if (context.syncState.status === \"pending\" || context.syncState.status === \"syncing\") return \"syncing\";\n if (context.isMutating) return \"saving\";\n if (context.isLoading && !context.isHydrated) return \"loading\";\n if (context.isHydrated && context.items.length === 0) return \"empty\";\n return \"idle\";\n}\n\nfunction getStatusLabelKey(status: KeepStatusValue): KeepUiLabelKey {\n if (status === \"empty\") return \"noItems\";\n if (status === \"loading\") return \"loadingItems\";\n if (status === \"error\") return \"error\";\n if (status === \"saving\") return \"saving\";\n if (status === \"syncing\") return \"syncing\";\n return \"saved\";\n}\n","import type { KeepSyncStatus } from \"@keepkit/core/core\";\nimport { useKeepContext } from \"@keepkit/core/react\";\nimport { useEffect, useRef } from \"react\";\nimport { useKeepUiFeedback, useUiLabel } from \"../../../foundation/ui-context\";\n\n/** Observes provider-level synchronization transitions for the feedback event bus. */\nexport function useKeepSyncFeedback() {\n const { syncState } = useKeepContext();\n const emitFeedback = useKeepUiFeedback();\n const completedMessage = useUiLabel(\"syncSynced\");\n const failedMessage = useUiLabel(\"syncFailedMessage\");\n const previousStatus = useRef<KeepSyncStatus>(\"idle\");\n\n useEffect(() => {\n const previous = previousStatus.current;\n previousStatus.current = syncState.status;\n if (syncState.status === \"error\" && previous !== \"error\") {\n emitFeedback({ type: \"sync-failed\", error: syncState.error, message: failedMessage });\n return;\n }\n if (\n syncState.status === \"synced\" &&\n (previous === \"pending\" || previous === \"syncing\" || previous === \"conflict\" || previous === \"error\")\n ) {\n emitFeedback({ type: \"sync-completed\", message: completedMessage });\n }\n }, [completedMessage, emitFeedback, failedMessage, syncState.error, syncState.status]);\n}\n","\"use client\";\n\nimport { useKeepSyncFeedback } from \"./hooks/useKeepSyncFeedback\";\n\nexport function KeepSyncFeedbackObserver() {\n useKeepSyncFeedback();\n return null;\n}\n","import type { KeepItem, KeepSyncConflict } from \"@keepkit/core/core\";\nimport { useKeepContext } from \"@keepkit/core/react\";\nimport { useEffect, useState } from \"react\";\nimport { useUiLabel } from \"../../../foundation/ui-context\";\n\ntype KeepSyncRecoveryDialogOptions<TMeta> = {\n open: boolean | undefined;\n onOpenChange: ((open: boolean) => void) | undefined;\n conflicts: KeepSyncConflict<TMeta>[] | undefined;\n onManualMerge: ((conflict: KeepSyncConflict<TMeta>) => KeepItem<TMeta> | Promise<KeepItem<TMeta>>) | undefined;\n};\n\nexport function useKeepSyncRecoveryDialog<TMeta>(options: KeepSyncRecoveryDialogOptions<TMeta>) {\n const { open, onOpenChange, conflicts, onManualMerge } = options;\n const context = useKeepContext<TMeta>();\n const conflictList = conflicts ?? context.syncState.conflicts ?? [];\n const hasRecovery = conflictList.length > 0 || context.syncState.status === \"error\" || Boolean(context.error);\n const [dismissed, setDismissed] = useState(false);\n const [busyId, setBusyId] = useState<string>();\n const [error, setError] = useState<unknown>();\n useEffect(() => {\n if (hasRecovery) setDismissed(false);\n }, [hasRecovery]);\n\n return {\n conflictList,\n isOpen: open ?? (hasRecovery && !dismissed),\n busyId,\n error,\n showBackupRecovery: context.syncState.status === \"error\" || Boolean(context.error),\n close: () => {\n setDismissed(true);\n onOpenChange?.(false);\n },\n resolve: async (conflict: KeepSyncConflict<TMeta>, resolution: \"local\" | \"remote\" | \"manual\") => {\n setError(undefined);\n setBusyId(conflict.id);\n try {\n const merged = resolution === \"manual\" ? await onManualMerge?.(conflict) : undefined;\n if (resolution === \"manual\" && !merged) throw new Error(\"A manual merge result is required.\");\n await context.resolveSyncConflict(conflict.id, resolution, merged);\n } catch (cause) {\n setError(cause);\n } finally {\n setBusyId(undefined);\n }\n },\n labels: {\n close: useUiLabel(\"close\"),\n title: useUiLabel(\"resolveSync\"),\n conflict: useUiLabel(\"syncConflict\"),\n keepLocal: useUiLabel(\"keepLocal\"),\n useServer: useUiLabel(\"useServer\"),\n manualMerge: useUiLabel(\"manualMerge\"),\n localVersion: useUiLabel(\"localVersion\"),\n remoteVersion: useUiLabel(\"remoteVersion\"),\n updatedAt: useUiLabel(\"updatedAt\"),\n note: useUiLabel(\"note\"),\n backupRecovery: useUiLabel(\"backupRecovery\"),\n backupRecoveryDescription: useUiLabel(\"backupRecoveryDescription\"),\n error: useUiLabel(\"error\"),\n },\n };\n}\n","\"use client\";\n\nimport type { KeepItem, KeepSyncConflict } from \"@keepkit/core/core\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { getMetaTitle } from \"../../foundation/shared\";\nimport { KeepBackup } from \"../actions/KeepBackup\";\nimport { useKeepSyncRecoveryDialog } from \"./hooks/useKeepSyncRecoveryDialog\";\n\nexport type KeepSyncRecoveryDialogProps<TMeta = Record<string, unknown>> = Omit<\n HTMLAttributes<HTMLElement>,\n \"children\" | \"title\"\n> & {\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n conflicts?: KeepSyncConflict<TMeta>[];\n onManualMerge?: (conflict: KeepSyncConflict<TMeta>) => KeepItem<TMeta> | Promise<KeepItem<TMeta>>;\n backup?: ReactNode;\n showBackupControls?: boolean;\n title?: ReactNode;\n children?: ReactNode;\n};\n\n/** Resolves queued sync conflicts and guides users to restore a backup after data corruption. */\nexport function KeepSyncRecoveryDialog<TMeta = Record<string, unknown>>({\n open,\n onOpenChange,\n conflicts,\n onManualMerge,\n backup,\n showBackupControls = true,\n title,\n children,\n className,\n ...props\n}: KeepSyncRecoveryDialogProps<TMeta>) {\n const view = useKeepSyncRecoveryDialog<TMeta>({ open, onOpenChange, conflicts, onManualMerge });\n if (!view.isOpen) return null;\n\n return (\n <section\n {...props}\n className={className}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"keepkit-sync-recovery-title\"\n aria-describedby={view.error ? \"keepkit-sync-recovery-error\" : undefined}\n aria-busy={view.busyId !== undefined}\n data-keepkit=\"sync-recovery\"\n data-state={view.conflictList.length > 0 ? \"conflict\" : \"error\"}\n data-loading={view.busyId !== undefined ? \"true\" : undefined}\n >\n <header>\n <h2 id=\"keepkit-sync-recovery-title\">{title ?? view.labels.title}</h2>\n <button type=\"button\" data-keep-action=\"close-dialog\" onClick={view.close} aria-label={view.labels.close}>\n {view.labels.close}\n </button>\n </header>\n {children}\n {view.conflictList.length > 0 ? (\n <div>\n <p>{view.labels.conflict}</p>\n {view.conflictList.map((conflict) => (\n <article key={conflict.id} data-conflict-id={conflict.id}>\n <h3>{getMetaTitle(conflict.operation.item?.meta) ?? conflict.id}</h3>\n <div data-conflict-preview>\n <ConflictPreview\n item={conflict.operation.item}\n heading={view.labels.localVersion}\n updatedAtLabel={view.labels.updatedAt}\n noteLabel={view.labels.note}\n side=\"local\"\n />\n <ConflictPreview\n item={conflict.remote}\n heading={view.labels.remoteVersion}\n updatedAtLabel={view.labels.updatedAt}\n noteLabel={view.labels.note}\n side=\"remote\"\n />\n </div>\n <div>\n <button\n type=\"button\"\n data-keep-action=\"keep-local\"\n onClick={() => void view.resolve(conflict, \"local\")}\n disabled={view.busyId !== undefined}\n >\n {view.labels.keepLocal}\n </button>\n <button\n type=\"button\"\n data-keep-action=\"use-server\"\n onClick={() => void view.resolve(conflict, \"remote\")}\n disabled={view.busyId !== undefined}\n >\n {view.labels.useServer}\n </button>\n <button\n type=\"button\"\n data-keep-action=\"manual-merge\"\n onClick={() => void view.resolve(conflict, \"manual\")}\n disabled={view.busyId !== undefined || !onManualMerge}\n >\n {view.labels.manualMerge}\n </button>\n </div>\n </article>\n ))}\n </div>\n ) : null}\n {view.showBackupRecovery ? (\n <section data-recovery=\"backup\">\n <h3>{view.labels.backupRecovery}</h3>\n <p>{view.labels.backupRecoveryDescription}</p>\n {backup ?? (showBackupControls ? <KeepBackup /> : null)}\n </section>\n ) : null}\n {view.error ? (\n <p id=\"keepkit-sync-recovery-error\" role=\"alert\" aria-live=\"assertive\">\n {view.error instanceof Error ? view.error.message : view.labels.error}\n </p>\n ) : null}\n </section>\n );\n}\n\nfunction ConflictPreview<TMeta>({\n item,\n heading,\n updatedAtLabel,\n noteLabel,\n side,\n}: {\n item?: KeepItem<TMeta>;\n heading: string;\n updatedAtLabel: string;\n noteLabel: string;\n side: \"local\" | \"remote\";\n}) {\n return (\n <article data-conflict-version={side} aria-label={heading}>\n <h4>{heading}</h4>\n <dl>\n <div>\n <dt>{updatedAtLabel}</dt>\n <dd>\n {item ? (\n <time dateTime={new Date(item.updatedAt).toISOString()}>{formatConflictDate(item.updatedAt)}</time>\n ) : (\n \"—\"\n )}\n </dd>\n </div>\n <div>\n <dt>{noteLabel}</dt>\n <dd>{item?.note || \"—\"}</dd>\n </div>\n </dl>\n </article>\n );\n}\n\nfunction formatConflictDate(timestamp: number): string {\n return new Date(timestamp).toISOString().slice(0, 10);\n}\n","import { useKeepContext } from \"@keepkit/core/react\";\nimport type { ReactNode } from \"react\";\nimport { useUiLabel } from \"../../../foundation/ui-context\";\n\ntype KeepSyncStatusBannerOptions = {\n onRetry: (() => void | Promise<void>) | undefined;\n children: ReactNode;\n};\n\nexport function useKeepSyncStatusBanner({ onRetry, children }: KeepSyncStatusBannerOptions) {\n const context = useKeepContext();\n const retryLabel = useUiLabel(\"retrySync\");\n const resolveLabel = useUiLabel(\"resolveSync\");\n const conflictLabel = useUiLabel(\"syncConflict\");\n const pendingLabel = useUiLabel(\"syncPending\");\n const syncedLabel = useUiLabel(\"syncSynced\");\n const status = context.syncState.status;\n const hasConflicts = (context.syncState.conflicts?.length ?? 0) > 0 || context.syncState.conflictIds.length > 0;\n const message =\n children ??\n (status === \"error\"\n ? getErrorMessage(context.syncState.error)\n : status === \"conflict\" || hasConflicts\n ? conflictLabel\n : status === \"pending\" || status === \"syncing\"\n ? pendingLabel\n : syncedLabel);\n\n return {\n status,\n hasConflicts,\n message,\n isMutating: context.isMutating,\n role: status === \"error\" || status === \"conflict\" || hasConflicts ? \"alert\" : \"status\",\n showRetry: status === \"error\" || status === \"pending\" || status === \"syncing\",\n retryLabel,\n resolveLabel,\n retry: async () => {\n if (onRetry) {\n await onRetry();\n return;\n }\n await context.flushSync();\n },\n };\n}\n\nfunction getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : \"Sync failed.\";\n}\n","\"use client\";\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { useKeepSyncStatusBanner } from \"./hooks/useKeepSyncStatusBanner\";\n\nexport type KeepSyncStatusBannerProps = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n onRetry?: () => void | Promise<void>;\n onResolveConflicts?: () => void;\n children?: ReactNode;\n};\n\n/** Announces synchronization failures and exposes retry or conflict-recovery entry points. */\nexport function KeepSyncStatusBanner({\n onRetry,\n onResolveConflicts,\n children,\n className,\n ...props\n}: KeepSyncStatusBannerProps) {\n const view = useKeepSyncStatusBanner({ onRetry, children });\n if (view.status === \"idle\" && !view.hasConflicts) return null;\n\n return (\n <aside\n {...props}\n className={className}\n role={props.role ?? view.role}\n aria-live={props[\"aria-live\"] ?? \"polite\"}\n data-keepkit=\"sync-status\"\n data-state={view.status}\n >\n <p>{view.message}</p>\n {view.showRetry ? (\n <button\n type=\"button\"\n data-keep-action=\"retry-sync\"\n onClick={() => void view.retry()}\n disabled={view.isMutating}\n >\n {view.retryLabel}\n </button>\n ) : null}\n {view.hasConflicts ? (\n <button\n type=\"button\"\n data-keep-action=\"resolve-conflicts\"\n onClick={onResolveConflicts}\n disabled={!onResolveConflicts}\n >\n {view.resolveLabel}\n </button>\n ) : null}\n </aside>\n );\n}\n","import { useCallback, useState } from \"react\";\nimport type { KeepCollectionFeature } from \"../../collection/KeepCollection\";\nimport type { KeepWorkspaceModule, KeepWorkspacePreset } from \"../KeepWorkspace\";\n\ntype KeepWorkspaceOptions = {\n preset: KeepWorkspacePreset;\n modules: Partial<Record<KeepWorkspaceModule, boolean>> | undefined;\n recoveryOpen: boolean | undefined;\n onRecoveryOpenChange: ((open: boolean) => void) | undefined;\n onResolveConflicts: (() => void) | undefined;\n};\n\nconst PRESET_MODULES: Record<KeepWorkspacePreset, Record<KeepWorkspaceModule, boolean>> = {\n basic: { syncStatus: false, undo: false, recovery: false, backup: false, stalePrune: false },\n standard: { syncStatus: false, undo: true, recovery: false, backup: false, stalePrune: false },\n management: { syncStatus: false, undo: true, recovery: false, backup: true, stalePrune: true },\n sync: { syncStatus: true, undo: true, recovery: true, backup: false, stalePrune: false },\n};\n\nconst PRESET_COLLECTION_FEATURES: Record<KeepWorkspacePreset, Partial<Record<KeepCollectionFeature, boolean>>> = {\n basic: { search: false, sort: false, pagination: false },\n standard: {},\n management: { tagFilter: true, collectionFilter: true, bulkActions: true, pin: true, archive: true },\n sync: {},\n};\n\nexport function useKeepWorkspace({\n preset,\n modules,\n recoveryOpen,\n onRecoveryOpenChange,\n onResolveConflicts,\n}: KeepWorkspaceOptions) {\n const [internalRecoveryOpen, setInternalRecoveryOpen] = useState(false);\n const resolvedModules = { ...PRESET_MODULES[preset], ...modules };\n const setRecoveryOpen = useCallback(\n (open: boolean) => {\n if (recoveryOpen === undefined) setInternalRecoveryOpen(open);\n onRecoveryOpenChange?.(open);\n },\n [onRecoveryOpenChange, recoveryOpen],\n );\n const openRecovery = useCallback(() => {\n onResolveConflicts?.();\n setRecoveryOpen(true);\n }, [onResolveConflicts, setRecoveryOpen]);\n\n return {\n preset,\n modules: resolvedModules,\n collectionFeatures: PRESET_COLLECTION_FEATURES[preset],\n recoveryOpen: recoveryOpen ?? internalRecoveryOpen,\n setRecoveryOpen,\n openRecovery,\n };\n}\n","\"use client\";\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { type RenderProp, resolveContent } from \"../../foundation/shared\";\nimport { KeepBackup, type KeepBackupProps } from \"../actions/KeepBackup\";\nimport { KeepUndo, type KeepUndoProps } from \"../actions/KeepUndo\";\nimport { KeepCollection, type KeepCollectionProps } from \"../collection/KeepCollection\";\nimport { KeepPruneStaleButton, type KeepPruneStaleButtonProps } from \"../status/KeepStaleNotice\";\nimport { KeepSyncRecoveryDialog, type KeepSyncRecoveryDialogProps } from \"../sync/KeepSyncRecoveryDialog\";\nimport { KeepSyncStatusBanner, type KeepSyncStatusBannerProps } from \"../sync/KeepSyncStatusBanner\";\nimport { useKeepWorkspace } from \"./hooks/useKeepWorkspace\";\n\nexport type KeepWorkspacePreset = \"basic\" | \"standard\" | \"management\" | \"sync\";\nexport type KeepWorkspaceModule = \"syncStatus\" | \"undo\" | \"recovery\" | \"backup\" | \"stalePrune\";\n\nexport type KeepWorkspaceState = {\n preset: KeepWorkspacePreset;\n modules: Readonly<Record<KeepWorkspaceModule, boolean>>;\n recoveryOpen: boolean;\n setRecoveryOpen: (open: boolean) => void;\n};\n\ntype KeepWorkspaceContent = ReactNode | RenderProp<KeepWorkspaceState>;\n\nexport type KeepWorkspaceSlots = {\n before?: KeepWorkspaceContent;\n syncStatus?: KeepWorkspaceContent;\n collection?: KeepWorkspaceContent;\n actions?: KeepWorkspaceContent;\n undo?: KeepWorkspaceContent;\n recovery?: KeepWorkspaceContent;\n after?: KeepWorkspaceContent;\n};\n\nexport type KeepWorkspaceProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n preset?: KeepWorkspacePreset;\n modules?: Partial<Record<KeepWorkspaceModule, boolean>>;\n collectionProps?: KeepCollectionProps<TMeta>;\n syncStatusProps?: KeepSyncStatusBannerProps;\n recoveryProps?: KeepSyncRecoveryDialogProps<TMeta>;\n backupProps?: KeepBackupProps<TMeta>;\n undoProps?: KeepUndoProps;\n stalePruneProps?: KeepPruneStaleButtonProps;\n slots?: KeepWorkspaceSlots;\n children?: KeepWorkspaceContent;\n};\n\n/** Composes the standard collection, management, and sync primitives into one customizable workspace. */\nexport function KeepWorkspace<TMeta = Record<string, unknown>>({\n preset = \"standard\",\n modules,\n collectionProps,\n syncStatusProps,\n recoveryProps,\n backupProps,\n undoProps,\n stalePruneProps,\n slots,\n children,\n className,\n ...props\n}: KeepWorkspaceProps<TMeta>) {\n const view = useKeepWorkspace({\n preset,\n modules,\n recoveryOpen: recoveryProps?.open,\n onRecoveryOpenChange: recoveryProps?.onOpenChange,\n onResolveConflicts: syncStatusProps?.onResolveConflicts,\n });\n const state: KeepWorkspaceState = {\n preset: view.preset,\n modules: view.modules,\n recoveryOpen: view.recoveryOpen,\n setRecoveryOpen: view.setRecoveryOpen,\n };\n const resolvedCollectionProps = {\n ...collectionProps,\n features: { ...view.collectionFeatures, ...collectionProps?.features },\n };\n\n return (\n <section {...props} className={className} data-keepkit=\"workspace\" data-preset={preset}>\n {resolveOptionalSlot(slots?.before, state)}\n {view.modules.syncStatus\n ? resolveSlot(\n slots?.syncStatus,\n <KeepSyncStatusBanner {...syncStatusProps} onResolveConflicts={view.openRecovery} />,\n state,\n )\n : null}\n {resolveSlot(slots?.collection, <KeepCollection<TMeta> {...resolvedCollectionProps} />, state)}\n {view.modules.backup || view.modules.stalePrune\n ? resolveSlot(\n slots?.actions,\n <div data-keepkit=\"workspace-actions\">\n {view.modules.stalePrune ? <KeepPruneStaleButton {...stalePruneProps} /> : null}\n {view.modules.backup ? <KeepBackup<TMeta> {...backupProps} /> : null}\n </div>,\n state,\n )\n : null}\n {view.modules.undo ? resolveSlot(slots?.undo, <KeepUndo {...undoProps} />, state) : null}\n {view.modules.recovery\n ? resolveSlot(\n slots?.recovery,\n <KeepSyncRecoveryDialog<TMeta>\n {...recoveryProps}\n open={view.recoveryOpen}\n onOpenChange={view.setRecoveryOpen}\n />,\n state,\n )\n : null}\n {resolveOptionalSlot(children, state)}\n {resolveOptionalSlot(slots?.after, state)}\n </section>\n );\n}\n\nfunction resolveSlot(\n slot: KeepWorkspaceContent | undefined,\n fallback: ReactNode,\n state: KeepWorkspaceState,\n): ReactNode {\n if (slot === undefined) return fallback;\n return resolveContent(slot, state);\n}\n\nfunction resolveOptionalSlot(slot: KeepWorkspaceContent | undefined, state: KeepWorkspaceState): ReactNode {\n if (slot === undefined) return null;\n return resolveContent(slot, state);\n}\n","\"use client\";\n\nimport { type CSSProperties, isValidElement, type ReactElement, type ReactNode } from \"react\";\nimport { createSlot } from \"./shared\";\n\nexport const keepThemeNames = [\n \"default\",\n \"ocean\",\n \"forest\",\n \"sunset\",\n \"lavender\",\n \"compact\",\n \"minimal\",\n \"rounded\",\n \"high-contrast\",\n \"dark\",\n] as const;\n\nexport type KeepThemeName = (typeof keepThemeNames)[number];\nexport type KeepThemeMode = \"light\" | \"dark\" | \"system\";\nexport type KeepThemeDensity = \"compact\" | \"comfortable\" | \"spacious\";\nexport type KeepThemeRadius = \"none\" | \"small\" | \"medium\" | \"large\" | \"full\";\n\nexport type KeepThemeVariables = Record<`--keep-${string}`, string | number>;\n\nexport type KeepThemeProviderProps = {\n children?: ReactNode;\n className?: string;\n id?: string;\n title?: string;\n role?: string;\n tabIndex?: number;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n \"aria-describedby\"?: string;\n \"data-testid\"?: string;\n [key: `data-${string}`]: string | undefined;\n theme?: KeepThemeName;\n mode?: KeepThemeMode;\n density?: KeepThemeDensity;\n radius?: KeepThemeRadius;\n accentColor?: \"blue\" | \"green\" | \"violet\" | \"orange\" | \"rose\" | (string & {});\n highContrast?: boolean;\n reducedMotion?: boolean;\n variables?: KeepThemeVariables;\n style?: CSSProperties & KeepThemeVariables;\n asChild?: boolean;\n};\n\n/** Scopes KeepKit tokens and opt-in component styles to one subtree. */\nexport function KeepThemeProvider({\n children,\n theme = \"default\",\n mode = \"system\",\n density = \"comfortable\",\n radius = \"medium\",\n accentColor,\n highContrast = false,\n reducedMotion = false,\n variables,\n style,\n className,\n asChild = false,\n ...props\n}: KeepThemeProviderProps) {\n const themeClassName = [\n \"keep-theme\",\n `keep-theme--${theme}`,\n `keep-theme--${mode}`,\n `keep-theme--density-${density}`,\n `keep-theme--radius-${radius}`,\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n const themeStyle = {\n ...style,\n ...(accentColor && !highContrast ? { \"--keep-accent\": accentColor, \"--keep-primary\": accentColor } : {}),\n ...variables,\n } as CSSProperties & KeepThemeVariables;\n const rootProps = {\n ...props,\n className: themeClassName,\n style: themeStyle,\n \"data-keep-theme\": theme,\n \"data-theme\": theme,\n \"data-mode\": mode,\n \"data-density\": density,\n \"data-radius\": radius,\n \"data-accent-color\": accentColor,\n \"data-high-contrast\": highContrast ? \"true\" : undefined,\n \"data-reduced-motion\": reducedMotion ? \"true\" : undefined,\n };\n\n if (asChild) {\n if (!isValidElement(children))\n throw new Error(\"KeepThemeProvider with asChild requires a single React element child.\");\n return createSlot(children as ReactElement<Record<string, unknown>>, rootProps);\n }\n return <div {...rootProps}>{children}</div>;\n}\n"],"mappings":"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","names":["useRef","useRef","jsx","jsxs","createContext","useContext","useMemo","jsx","useState","useState","jsx","Fragment","jsx","jsxs","useEffect","useRef","useKeepItem","useKeepItem","Fragment","jsx","jsxs","useRef","useEffect","useKeepItem","useCallback","useEffect","useRef","useState","useKeepContext","useKeepItem","useCallback","useEffect","useRef","useState","Fragment","jsx","jsxs","useKeepItem","useState","useRef","useEffect","useCallback","error","useKeepContext","getErrorMessage","jsx","jsxs","useKeepItem","useState","useRef","useCallback","useEffect","useKeepContext","useEffect","useState","useKeepContext","useState","useEffect","jsx","jsxs","KeepErrorBoundary","isValidElement","useRef","Fragment","jsx","jsxs","useRef","isValidElement","useKeepContext","useMemo","useState","jsx","jsxs","useMemo","useKeepContext","useState","isValidElement","useKeepList","useCallback","useMemo","useState","useState","useKeepList","useCallback","useMemo","jsx","jsxs","isValidElement","useEffect","useState","useState","useEffect","Fragment","jsx","jsxs","useKeepList","useMemo","useState","useState","useMemo","useKeepList","isValidElement","createContext","createElement","isValidElement","useContext","useEffect","useState","Fragment","jsx","jsxs","useKeepContext","useState","useKeepContext","useState","jsx","jsxs","useKeepItem","useKeepItem","getStatusLabelKey","getDisplayStatus","Fragment","jsx","jsxs","createContext","useContext","isValidElement","useState","useEffect","getErrorMessage","createElement","isValidElement","Fragment","jsx","jsxs","isValidElement","useKeepList","useKeepList","useCallback","useEffect","useRef","Fragment","jsx","jsxs","isValidElement","jsx","jsxs","KeepErrorBoundary","jsx","useState","jsx","isValidElement","jsx","jsxs","useKeepItem","useCallback","useEffect","useRef","useState","useKeepItem","useState","useRef","useEffect","useCallback","Fragment","jsx","jsxs","isValidElement","getErrorMessage","useKeepItem","useCallback","useEffect","useState","useKeepItem","useState","useEffect","useCallback","Fragment","jsx","jsxs","getErrorMessage","useCallback","useId","useEffect","Fragment","jsx","jsxs","useId","isValidElement","useKeepContext","useEffect","useRef","useState","useKeepContext","getStatusLabelKey","useState","useRef","useEffect","jsx","isValidElement","useKeepContext","useEffect","useRef","useKeepContext","useRef","useEffect","useKeepContext","useEffect","useState","useKeepContext","useState","useEffect","jsx","jsxs","useKeepContext","useKeepContext","getErrorMessage","jsx","jsxs","useCallback","useState","jsx","jsxs","isValidElement","jsx","isValidElement","KeepErrorBoundary","useKeepContext","useKeepItem","useKeepList","useKeepNavigator","jsx","jsxs","jsx"]}
1
+ {"version":3,"sources":["../src/index.tsx","../src/adapters/url-sync.tsx","../src/features/actions/KeepArchiveButton.tsx","../src/foundation/ui-context.tsx","../src/locales/de.ts","../src/locales/en.ts","../src/locales/es.ts","../src/locales/fil.ts","../src/locales/fr.ts","../src/locales/id.ts","../src/locales/it.ts","../src/locales/ja.ts","../src/locales/ko.ts","../src/locales/ms.ts","../src/locales/pt-BR.ts","../src/locales/ru.ts","../src/locales/th.ts","../src/locales/vi.ts","../src/locales/zh-Hans.ts","../src/locales/zh-Hant.ts","../src/locales/index.ts","../src/features/actions/hooks/useKeepBackup.ts","../src/features/actions/KeepBackup.tsx","../src/foundation/shared.tsx","../src/features/actions/hooks/useKeepBulkActions.ts","../src/features/actions/KeepItemCheckbox.tsx","../src/features/actions/KeepBulkActions.tsx","../src/features/actions/KeepButton.tsx","../src/features/actions/hooks/useKeepButton.ts","../src/features/actions/KeepSavePopover.tsx","../src/features/editor/KeepQuickEditor.tsx","../src/features/actions/hooks/useKeepUndo.ts","../src/features/actions/KeepUndo.tsx","../src/features/collection/KeepCollection.tsx","../src/features/query/KeepActiveFiltersSummary.tsx","../src/features/query/KeepArchiveScopeSelect.tsx","../src/features/query/KeepCollectionFilter.tsx","../src/features/query/KeepTagFilter.tsx","../src/features/query/hooks/useKeepTagFilter.ts","../src/features/query/hooks/useQueryControls.ts","../src/features/query/query-controls.tsx","../src/features/collection/hooks/useKeepCollection.ts","../src/features/collection/KeepList.tsx","../src/features/item/KeepItemCard.tsx","../src/features/item/hooks/useKeepItemStatusBadge.ts","../src/features/item/KeepItemStatusBadge.tsx","../src/features/status/hooks/useKeepStaleNotice.ts","../src/features/status/KeepStaleNotice.tsx","../src/features/item/hooks/useKeepItemCard.ts","../src/features/status/KeepEmptyState.tsx","../src/features/collection/hooks/useKeepListView.ts","../src/features/collection/hooks/useRovingTabIndex.ts","../src/features/collection/KeepReorderableList.tsx","../src/features/collection/KeepLayout.tsx","../src/features/editor/KeepNoteEditor.tsx","../src/features/navigation/KeepShortcutHint.tsx","../src/features/editor/hooks/useKeepNoteEditor.ts","../src/features/editor/hooks/useKeepTagEditor.ts","../src/features/editor/KeepTagEditor.tsx","../src/features/feedback/useKeepToastFeedback.ts","../src/features/navigation/KeepTourBar.tsx","../src/features/navigation/hooks/useKeepTourShortcuts.ts","../src/features/status/status.tsx","../src/features/status/hooks/useStatusViews.ts","../src/features/sync/hooks/useKeepSyncFeedback.ts","../src/features/sync/KeepSyncFeedbackObserver.tsx","../src/features/sync/hooks/useKeepSyncRecoveryDialog.ts","../src/features/sync/KeepSyncRecoveryDialog.tsx","../src/features/sync/hooks/useKeepSyncStatusBanner.ts","../src/features/sync/KeepSyncStatusBanner.tsx","../src/features/workspace/hooks/useKeepWorkspace.ts","../src/features/workspace/KeepWorkspace.tsx","../src/foundation/theme.tsx"],"sourcesContent":["\"use client\";\n\nimport type {\n KeepItem,\n KeepItemInput,\n KeepListQuery,\n KeepScope,\n KeepUndoState,\n KeepUrlSyncOptions,\n} from \"@keepkit/core/core\";\nimport {\n type CreateKeepKitOptions as CoreCreateKeepKitOptions,\n KeepProvider as CoreKeepProvider,\n createKeepKit as createCoreKeepKit,\n type KeepProviderProps,\n type KeepShortcutOptions,\n type UseKeepCollectionsResult,\n type UseKeepNavigatorOptions,\n type UseKeepNavigatorResult,\n type useKeepContext,\n type useKeepItem,\n type useKeepList,\n} from \"@keepkit/core/react\";\nimport type { ComponentType, ReactNode } from \"react\";\nimport {\n createNextPagesRouterAdapter,\n type KeepPagesRouterLike,\n type KeepUrlAdapter,\n useKeepUrlSync,\n} from \"./adapters/url-sync\";\nimport {\n KeepArchiveButton,\n type KeepArchiveButtonProps,\n type KeepArchiveButtonState,\n KeepPinButton,\n type KeepPinButtonProps,\n type KeepPinButtonState,\n} from \"./features/actions/KeepArchiveButton\";\nimport { KeepBackup, type KeepBackupProps } from \"./features/actions/KeepBackup\";\nimport {\n KeepBulkActions,\n type KeepBulkActionsProps,\n type KeepBulkActionsState,\n} from \"./features/actions/KeepBulkActions\";\nimport {\n KeepButton,\n type KeepButtonIcon,\n type KeepButtonIconProps,\n type KeepButtonIcons,\n type KeepButtonLabels,\n type KeepButtonProps,\n} from \"./features/actions/KeepButton\";\nimport { KeepItemCheckbox, type KeepItemCheckboxProps } from \"./features/actions/KeepItemCheckbox\";\nimport { KeepSavePopover, type KeepSavePopoverProps } from \"./features/actions/KeepSavePopover\";\nimport { KeepUndo, type KeepUndoProps } from \"./features/actions/KeepUndo\";\nimport {\n KeepCollection,\n type KeepCollectionFeature,\n type KeepCollectionProps,\n type KeepLayoutPreset,\n} from \"./features/collection/KeepCollection\";\nimport { KeepLayout, type KeepLayoutProps } from \"./features/collection/KeepLayout\";\nimport { KeepList, type KeepListProps, type KeepListState } from \"./features/collection/KeepList\";\nimport {\n type KeepReorderableItemState,\n KeepReorderableList,\n type KeepReorderableListProps,\n} from \"./features/collection/KeepReorderableList\";\nimport { KeepNoteEditor, type KeepNoteEditorProps, type KeepNoteEditorState } from \"./features/editor/KeepNoteEditor\";\nimport {\n KeepQuickEditor,\n type KeepQuickEditorProps,\n type KeepQuickEditorState,\n useKeepQuickEditor,\n} from \"./features/editor/KeepQuickEditor\";\nimport { KeepTagEditor, type KeepTagEditorProps, type KeepTagEditorState } from \"./features/editor/KeepTagEditor\";\nimport {\n type KeepToastFeedbackOptions,\n type KeepToastHandler,\n useKeepToastFeedback,\n} from \"./features/feedback/useKeepToastFeedback\";\nimport {\n type KeepImageProps,\n KeepItemCard,\n type KeepItemCardActionSlotProps,\n type KeepItemCardActionsProps,\n type KeepItemCardBadgeProps,\n type KeepItemCardContentProps,\n type KeepItemCardLinkProps,\n type KeepItemCardMediaProps,\n type KeepItemCardProps,\n type KeepItemCardRemoveProps,\n type KeepItemCardSaveProps,\n KeepItemCardSkeleton,\n type KeepItemCardSkeletonProps,\n type KeepItemCardState,\n type KeepItemCardTagsProps,\n type KeepItemCardTitleProps,\n} from \"./features/item/KeepItemCard\";\nimport {\n type KeepDisplayStatus,\n KeepItemStatusBadge,\n type KeepItemStatusBadgeProps,\n} from \"./features/item/KeepItemStatusBadge\";\nimport { KeepShortcutHint, type KeepShortcutHintProps } from \"./features/navigation/KeepShortcutHint\";\nimport { KeepNavigator, KeepTourBar, type KeepTourBarProps } from \"./features/navigation/KeepTourBar\";\nimport {\n KeepActiveFiltersSummary,\n type KeepActiveFiltersSummaryProps,\n type KeepActiveFiltersSummaryState,\n} from \"./features/query/KeepActiveFiltersSummary\";\nimport {\n type KeepArchiveScope,\n KeepArchiveScopeSelect,\n type KeepArchiveScopeSelectProps,\n} from \"./features/query/KeepArchiveScopeSelect\";\nimport {\n type KeepCollectionControlProps,\n KeepCollectionFilter,\n type KeepCollectionOption,\n KeepCollectionSelect,\n} from \"./features/query/KeepCollectionFilter\";\nimport { KeepTagFilter, type KeepTagFilterProps, type KeepTagFilterState } from \"./features/query/KeepTagFilter\";\nimport {\n KeepPagination,\n type KeepPaginationProps,\n type KeepPaginationState,\n KeepSearchInput,\n type KeepSearchInputProps,\n KeepSortSelect,\n type KeepSortSelectProps,\n type KeepSortValue,\n} from \"./features/query/query-controls\";\nimport {\n KeepPruneStaleButton,\n type KeepPruneStaleButtonProps,\n KeepStaleNotice,\n type KeepStaleNoticeProps,\n} from \"./features/status/KeepStaleNotice\";\nimport {\n KeepAnnouncements,\n type KeepAnnouncementsProps,\n KeepAnnouncer,\n KeepEmptyState,\n type KeepEmptyStateProps,\n KeepStatus,\n type KeepStatusLabels,\n type KeepStatusProps,\n type KeepStatusState,\n type KeepStatusValue,\n} from \"./features/status/status\";\nimport { KeepSyncFeedbackObserver } from \"./features/sync/KeepSyncFeedbackObserver\";\nimport { KeepSyncRecoveryDialog, type KeepSyncRecoveryDialogProps } from \"./features/sync/KeepSyncRecoveryDialog\";\nimport { KeepSyncStatusBanner, type KeepSyncStatusBannerProps } from \"./features/sync/KeepSyncStatusBanner\";\nimport {\n KeepWorkspace,\n type KeepWorkspaceModule,\n type KeepWorkspacePreset,\n type KeepWorkspaceProps,\n type KeepWorkspaceSlots,\n type KeepWorkspaceState,\n} from \"./features/workspace/KeepWorkspace\";\nimport {\n type KeepThemeDensity,\n type KeepThemeMode,\n type KeepThemeName,\n KeepThemeProvider,\n type KeepThemeProviderProps,\n type KeepThemeRadius,\n type KeepThemeVariables,\n keepThemeNames,\n} from \"./foundation/theme\";\nimport {\n getKeepLocaleLabels,\n type KeepUiFeedbackEvent,\n type KeepUiLabelContext,\n type KeepUiLabelKey,\n type KeepUiLabels,\n type KeepUiLocale,\n type KeepUiLocaleLabels,\n KeepUiProvider,\n type KeepUiProviderProps,\n useKeepUiLabels,\n} from \"./foundation/ui-context\";\n\nexport type { KeepTourShortcutsOptions } from \"./features/navigation/hooks/useKeepTourShortcuts\";\nexport { useKeepTourShortcuts } from \"./features/navigation/hooks/useKeepTourShortcuts\";\n\nexport type KeepKitProviderProps<TMeta = Record<string, unknown>> = Omit<KeepProviderProps<TMeta>, \"children\"> &\n Omit<KeepUiProviderProps<TMeta>, \"children\"> &\n Omit<KeepThemeProviderProps, \"children\"> & { children?: ReactNode };\n\n/** Combines the core store, UI labels, and the global live announcer. */\nexport function KeepKitProvider<TMeta = Record<string, unknown>>({\n labels,\n locale,\n labelResolver,\n onFeedback,\n theme,\n mode,\n density,\n radius,\n accentColor,\n highContrast,\n reducedMotion,\n variables,\n className: themeClassName,\n style: themeStyle,\n asChild: themeAsChild,\n children,\n ...providerProps\n}: KeepKitProviderProps<TMeta>) {\n return (\n <KeepUiProvider<TMeta> labels={labels} locale={locale} labelResolver={labelResolver} onFeedback={onFeedback}>\n <KeepThemeProvider\n theme={theme}\n mode={mode}\n density={density}\n radius={radius}\n accentColor={accentColor}\n highContrast={highContrast}\n reducedMotion={reducedMotion}\n variables={variables}\n className={themeClassName}\n style={themeStyle}\n asChild={themeAsChild}\n >\n <CoreKeepProvider<TMeta> {...providerProps}>\n <KeepSyncFeedbackObserver />\n {children}\n <KeepAnnouncements />\n </CoreKeepProvider>\n </KeepThemeProvider>\n </KeepUiProvider>\n );\n}\n\nexport type {\n AuthenticatedSyncAuthContext,\n AuthenticatedSyncKit,\n AuthenticatedSyncKitOptions,\n AuthenticatedSyncRequestContext,\n AuthenticatedSyncTransport,\n KeepItem,\n KeepItemInput,\n KeepListQuery,\n KeepSyncConflict,\n KeepSyncResolution,\n KeepSyncState,\n KeepSyncStatus,\n} from \"@keepkit/core/core\";\nexport { createAuthenticatedSyncKit } from \"@keepkit/core/core\";\nexport type {\n KeepButtonState,\n KeepContextValue,\n KeepErrorBoundaryProps,\n KeepProviderProps,\n KeepShortcutOptions,\n} from \"@keepkit/core/react\";\nexport {\n KeepErrorBoundary,\n KeepProvider,\n useKeepCollections,\n useKeepContext,\n useKeepItem,\n useKeepList,\n useKeepNavigator,\n useKeepShortcut,\n} from \"@keepkit/core/react\";\nexport {\n createBrowserStorageAdapter,\n createStorageAdapter,\n FallbackStorageAdapter,\n IndexedDBAdapter,\n IndexedDBSyncQueueAdapter,\n LocalStorageAdapter,\n LocalStorageSyncQueueAdapter,\n SyncStorageAdapter,\n} from \"@keepkit/core/storage\";\nexport type { KeepSelectionScope } from \"./features/actions/KeepBulkActions\";\nexport { isAllSelected, toggleSelectAll } from \"./features/actions/KeepBulkActions\";\nexport type { KeepEmptyStateVariant } from \"./features/status/KeepEmptyState\";\nexport type { KeepHighlightProps, RenderProp } from \"./foundation/shared\";\nexport {\n chainedFunction,\n composeRefs,\n createSlot,\n highlightText,\n KeepHighlight,\n mergeProps,\n} from \"./foundation/shared\";\nexport type {\n KeepActiveFiltersSummaryProps,\n KeepActiveFiltersSummaryState,\n KeepAnnouncementsProps,\n KeepArchiveButtonProps,\n KeepArchiveButtonState,\n KeepArchiveScope,\n KeepArchiveScopeSelectProps,\n KeepBackupProps,\n KeepBulkActionsProps,\n KeepBulkActionsState,\n KeepButtonIcon,\n KeepButtonIconProps,\n KeepButtonIcons,\n KeepButtonLabels,\n KeepButtonProps,\n KeepCollectionControlProps,\n KeepCollectionFeature,\n KeepCollectionOption,\n KeepCollectionProps,\n KeepDisplayStatus,\n KeepEmptyStateProps,\n KeepImageProps,\n KeepItemCardActionSlotProps,\n KeepItemCardActionsProps,\n KeepItemCardBadgeProps,\n KeepItemCardContentProps,\n KeepItemCardLinkProps,\n KeepItemCardMediaProps,\n KeepItemCardProps,\n KeepItemCardRemoveProps,\n KeepItemCardSaveProps,\n KeepItemCardSkeletonProps,\n KeepItemCardState,\n KeepItemCardTagsProps,\n KeepItemCardTitleProps,\n KeepItemCheckboxProps,\n KeepItemStatusBadgeProps,\n KeepLayoutPreset,\n KeepLayoutProps,\n KeepListProps,\n KeepListState,\n KeepNoteEditorProps,\n KeepNoteEditorState,\n KeepPagesRouterLike,\n KeepPaginationProps,\n KeepPaginationState,\n KeepPinButtonProps,\n KeepPinButtonState,\n KeepPruneStaleButtonProps,\n KeepQuickEditorProps,\n KeepQuickEditorState,\n KeepReorderableItemState,\n KeepReorderableListProps,\n KeepSavePopoverProps,\n KeepScope,\n KeepSearchInputProps,\n KeepShortcutHintProps,\n KeepSortSelectProps,\n KeepSortValue,\n KeepStaleNoticeProps,\n KeepStatusLabels,\n KeepStatusProps,\n KeepStatusState,\n KeepStatusValue,\n KeepSyncRecoveryDialogProps,\n KeepSyncStatusBannerProps,\n KeepTagEditorProps,\n KeepTagEditorState,\n KeepTagFilterProps,\n KeepTagFilterState,\n KeepThemeDensity,\n KeepThemeMode,\n KeepThemeName,\n KeepThemeProviderProps,\n KeepThemeRadius,\n KeepThemeVariables,\n KeepToastFeedbackOptions,\n KeepToastHandler,\n KeepTourBarProps,\n KeepUiFeedbackEvent,\n KeepUiLabelContext,\n KeepUiLabelKey,\n KeepUiLabels,\n KeepUiLocale,\n KeepUiLocaleLabels,\n KeepUiProviderProps,\n KeepUndoProps,\n KeepUndoState,\n KeepUrlAdapter,\n KeepUrlSyncOptions,\n KeepWorkspaceModule,\n KeepWorkspacePreset,\n KeepWorkspaceProps,\n KeepWorkspaceSlots,\n KeepWorkspaceState,\n};\nexport {\n createNextPagesRouterAdapter,\n getKeepLocaleLabels,\n KeepActiveFiltersSummary,\n KeepAnnouncements,\n KeepAnnouncer,\n KeepArchiveButton,\n KeepArchiveScopeSelect,\n KeepBackup,\n KeepBulkActions,\n KeepButton,\n KeepCollection,\n KeepCollectionFilter,\n KeepCollectionSelect,\n KeepEmptyState,\n KeepItemCard,\n KeepItemCardSkeleton,\n KeepItemCheckbox,\n KeepItemStatusBadge,\n KeepLayout,\n KeepList,\n KeepNavigator,\n KeepNoteEditor,\n KeepPagination,\n KeepPinButton,\n KeepPruneStaleButton,\n KeepQuickEditor,\n KeepReorderableList,\n KeepSavePopover,\n KeepSearchInput,\n KeepShortcutHint,\n KeepSortSelect,\n KeepStaleNotice,\n KeepStatus,\n KeepSyncRecoveryDialog,\n KeepSyncStatusBanner,\n KeepTagEditor,\n KeepTagFilter,\n KeepThemeProvider,\n KeepTourBar,\n KeepUiProvider,\n KeepUndo,\n KeepWorkspace,\n keepThemeNames,\n useKeepQuickEditor,\n useKeepToastFeedback,\n useKeepUiLabels,\n useKeepUrlSync,\n};\n\nexport type CreateKeepKitOptions<TMeta = Record<string, unknown>> = CoreCreateKeepKitOptions<TMeta> &\n Omit<KeepUiProviderProps<TMeta>, \"children\"> & {\n theme?: KeepThemeName;\n mode?: KeepThemeMode;\n density?: KeepThemeDensity;\n radius?: KeepThemeRadius;\n accentColor?: KeepThemeProviderProps[\"accentColor\"];\n highContrast?: boolean;\n reducedMotion?: boolean;\n variables?: KeepThemeVariables;\n themeClassName?: string;\n themeStyle?: KeepThemeProviderProps[\"style\"];\n getTitle?: (item: KeepItem<TMeta>) => ReactNode;\n getImageProps?: (item: KeepItem<TMeta>, title: ReactNode) => KeepImageProps | undefined;\n };\n\nexport type KeepKit<TMeta = Record<string, unknown>> = {\n Provider: ComponentType<KeepKitProviderProps<TMeta>>;\n Button: ComponentType<KeepButtonProps<TMeta>>;\n Backup: ComponentType<KeepBackupProps<TMeta>>;\n Collection: ComponentType<KeepCollectionProps<TMeta>>;\n Workspace: ComponentType<KeepWorkspaceProps<TMeta>>;\n useContext: () => ReturnType<typeof useKeepContext<TMeta>>;\n useItem: (item?: KeepItemInput<TMeta>) => ReturnType<typeof useKeepItem<TMeta>>;\n useList: (query?: KeepListQuery<TMeta>) => ReturnType<typeof useKeepList<TMeta>>;\n useCollections: (options?: { targetType?: string; orderBy?: \"name\" | \"count\" }) => UseKeepCollectionsResult;\n useNavigator: (options?: UseKeepNavigatorOptions<TMeta>) => UseKeepNavigatorResult<TMeta>;\n useShortcut: (options: KeepShortcutOptions<TMeta>) => void;\n};\n\n/** Create one typed application API for the core and standard UI layer. */\nexport function createKeepKit<TMeta = Record<string, unknown>>(\n options: CreateKeepKitOptions<TMeta> = {},\n): KeepKit<TMeta> {\n const {\n labels,\n locale,\n labelResolver,\n onFeedback,\n theme,\n mode,\n density,\n radius,\n accentColor,\n highContrast,\n reducedMotion,\n variables,\n themeClassName,\n themeStyle,\n getTitle,\n getImageProps,\n ...coreOptions\n } = options;\n const coreKit = createCoreKeepKit<TMeta>(coreOptions);\n return {\n Provider: (props) => (\n <KeepKitProvider<TMeta>\n {...coreOptions}\n labels={labels}\n locale={locale}\n labelResolver={labelResolver}\n onFeedback={onFeedback}\n theme={theme}\n mode={mode}\n density={density}\n radius={radius}\n accentColor={accentColor}\n highContrast={highContrast}\n reducedMotion={reducedMotion}\n variables={variables}\n className={themeClassName}\n style={themeStyle}\n {...props}\n />\n ),\n Button: (props) => <KeepButton<TMeta> {...props} />,\n Backup: (props) => <KeepBackup<TMeta> {...props} />,\n Collection: (props) => (\n <KeepCollection<TMeta>\n {...props}\n itemCardProps={{\n ...(getTitle ? { getTitle } : {}),\n ...(getImageProps ? { getImageProps } : {}),\n ...props.itemCardProps,\n }}\n />\n ),\n Workspace: (props) => (\n <KeepWorkspace<TMeta>\n {...props}\n collectionProps={{\n ...props.collectionProps,\n itemCardProps: {\n ...(getTitle ? { getTitle } : {}),\n ...(getImageProps ? { getImageProps } : {}),\n ...props.collectionProps?.itemCardProps,\n },\n }}\n />\n ),\n useContext: () => coreKit.useContext(),\n useItem: (item) => coreKit.useItem(item),\n useList: (query) => coreKit.useList(query),\n useCollections: (collectionsOptions) => coreKit.useCollections(collectionsOptions),\n useNavigator: (navigatorOptions) => coreKit.useNavigator(navigatorOptions),\n useShortcut: (shortcutOptions) => coreKit.useShortcut(shortcutOptions),\n };\n}\n","\"use client\";\n\nimport type { KeepListQuery } from \"@keepkit/core/core\";\nimport {\n DEFAULT_KEEP_URL_PARAMS,\n decodeKeepListQuery,\n encodeKeepListQuery,\n type KeepUrlSyncOptions,\n} from \"@keepkit/core/core\";\nimport { useEffect, useRef } from \"react\";\n\nexport type KeepUrlAdapter = {\n getUrl: () => string;\n subscribe?: (listener: () => void) => () => void;\n navigate: (url: string, mode: \"replace\" | \"push\") => void;\n};\n\nexport type KeepPagesRouterLike = {\n asPath?: string;\n push: (url: string, as?: string, options?: { shallow?: boolean }) => Promise<boolean> | boolean;\n replace: (url: string, as?: string, options?: { shallow?: boolean }) => Promise<boolean> | boolean;\n events?: { on: (event: string, listener: () => void) => void; off: (event: string, listener: () => void) => void };\n};\n\nexport type KeepUrlSyncProps<TMeta = Record<string, unknown>> = {\n enabled?: boolean;\n query: KeepListQuery<TMeta>;\n onQueryChange: (query: KeepListQuery<TMeta> | ((previous: KeepListQuery<TMeta>) => KeepListQuery<TMeta>)) => void;\n options?: KeepUrlSyncOptions;\n adapter?: KeepUrlAdapter;\n};\n\n/** Adapter for Next.js Pages Router. It intentionally uses structural typing and has no Next dependency. */\nexport function createNextPagesRouterAdapter(router: KeepPagesRouterLike): KeepUrlAdapter {\n const getUrl = () => router.asPath ?? (typeof window === \"undefined\" ? \"/\" : window.location.href);\n return {\n getUrl,\n subscribe: router.events\n ? (listener) => {\n router.events?.on(\"routeChangeComplete\", listener);\n return () => router.events?.off(\"routeChangeComplete\", listener);\n }\n : undefined,\n navigate: (url, mode) => {\n void router[mode](url, undefined, { shallow: true });\n },\n };\n}\n\n/** Synchronizes collection filters with browser history and supports back/forward restoration. */\nexport function useKeepUrlSync<TMeta = Record<string, unknown>>({\n enabled = true,\n query,\n onQueryChange,\n options = {},\n adapter: providedAdapter,\n}: KeepUrlSyncProps<TMeta>): void {\n const browserAdapterRef = useRef<KeepUrlAdapter>(getBrowserAdapter());\n const adapter = providedAdapter ?? browserAdapterRef.current;\n const onQueryChangeRef = useRef(onQueryChange);\n onQueryChangeRef.current = onQueryChange;\n const skipWriteRef = useRef(true);\n const params = options.params;\n\n useEffect(() => {\n if (!enabled) return;\n const read = () => {\n const url = adapter.getUrl();\n const decoded = decodeKeepListQuery(url, { params });\n skipWriteRef.current = true;\n onQueryChangeRef.current((previousQuery) => ({\n ...previousQuery,\n ...(decoded.search ? { search: decoded.search } : { search: undefined }),\n ...(decoded.tags ? { tags: decoded.tags } : { tags: undefined }),\n ...(decoded.sort ? { sort: decoded.sort } : {}),\n ...(decoded.pagination ? { pagination: { ...previousQuery.pagination, ...decoded.pagination } } : {}),\n ...(decoded.archiveScope !== undefined\n ? { archived: decoded.archived, archiveScope: decoded.archiveScope }\n : decoded.archived !== undefined\n ? { archived: decoded.archived, archiveScope: undefined }\n : { archived: undefined, archiveScope: undefined }),\n }));\n };\n read();\n return adapter.subscribe?.(read);\n }, [adapter, enabled, params]);\n\n useEffect(() => {\n if (!enabled) return;\n if (skipWriteRef.current) {\n skipWriteRef.current = false;\n return;\n }\n const currentUrl = new URL(adapter.getUrl(), \"http://keepkit.invalid\");\n const urlParams = { ...DEFAULT_KEEP_URL_PARAMS, ...params };\n for (const key of Object.values(urlParams)) currentUrl.searchParams.delete(key);\n const nextParams = encodeKeepListQuery(query, { params });\n nextParams.forEach((value, key) => {\n currentUrl.searchParams.append(key, value);\n });\n const nextUrl = `${currentUrl.pathname}${currentUrl.search}${currentUrl.hash}`;\n adapter.navigate(nextUrl, options.history ?? \"push\");\n }, [adapter, enabled, options.history, params, query]);\n}\n\nfunction getBrowserAdapter(): KeepUrlAdapter {\n return {\n getUrl: () => (typeof window === \"undefined\" ? \"/\" : window.location.href),\n subscribe: (listener) => {\n if (typeof window === \"undefined\") return () => undefined;\n window.addEventListener(\"popstate\", listener);\n return () => window.removeEventListener(\"popstate\", listener);\n },\n navigate: (url, mode) => {\n if (typeof window === \"undefined\") return;\n window.history[mode === \"push\" ? \"pushState\" : \"replaceState\"]({}, \"\", url);\n },\n };\n}\n","\"use client\";\n\nimport type { KeepItemInput } from \"@keepkit/core/core\";\nimport { useKeepItem } from \"@keepkit/core/react\";\nimport type { ButtonHTMLAttributes, ReactNode } from \"react\";\nimport { useUiLabel } from \"../../foundation/ui-context\";\n\nexport type KeepArchiveButtonState<TMeta = Record<string, unknown>> = ReturnType<typeof useKeepItem<TMeta>>;\n\nexport type KeepArchiveButtonProps<TMeta = Record<string, unknown>> = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"children\" | \"onClick\" | \"aria-pressed\"\n> & {\n item: KeepItemInput<TMeta>;\n children?: ReactNode | ((state: KeepArchiveButtonState<TMeta>) => ReactNode);\n archiveLabel?: ReactNode;\n unarchiveLabel?: ReactNode;\n onToggleError?: (error: unknown) => void;\n};\n\n/** A style-free accessible archive toggle. */\nexport function KeepArchiveButton<TMeta = Record<string, unknown>>({\n item,\n children,\n archiveLabel,\n unarchiveLabel,\n onToggleError,\n disabled,\n ...props\n}: KeepArchiveButtonProps<TMeta>) {\n const state = useKeepItem(item);\n const archive = useUiLabel(\"archive\");\n const unarchive = useUiLabel(\"unarchive\");\n const archivedLabel = useUiLabel(\"archived\");\n const isArchived = state.item?.archived === true;\n const isDisabled = disabled ?? state.isMutating;\n return (\n <button\n {...props}\n type={props.type ?? \"button\"}\n disabled={isDisabled}\n aria-pressed={isArchived}\n data-archived={isArchived ? \"true\" : \"false\"}\n data-keep-action=\"toggle-archive\"\n onClick={() => void state.toggleArchive().catch((error) => onToggleError?.(error))}\n >\n {typeof children === \"function\"\n ? children(state)\n : (children ?? (isArchived ? (unarchiveLabel ?? unarchive) : (archiveLabel ?? archive)))}\n {isArchived && children === undefined ? <span aria-hidden=\"true\"> ({archivedLabel})</span> : null}\n </button>\n );\n}\n\nexport type KeepPinButtonState<TMeta = Record<string, unknown>> = ReturnType<typeof useKeepItem<TMeta>>;\n\nexport type KeepPinButtonProps<TMeta = Record<string, unknown>> = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"children\" | \"onClick\" | \"aria-pressed\"\n> & {\n item: KeepItemInput<TMeta>;\n children?: ReactNode | ((state: KeepPinButtonState<TMeta>) => ReactNode);\n pinLabel?: ReactNode;\n unpinLabel?: ReactNode;\n onToggleError?: (error: unknown) => void;\n};\n\n/** A style-free accessible pin toggle. */\nexport function KeepPinButton<TMeta = Record<string, unknown>>({\n item,\n children,\n pinLabel,\n unpinLabel,\n onToggleError,\n disabled,\n ...props\n}: KeepPinButtonProps<TMeta>) {\n const state = useKeepItem(item);\n const pin = useUiLabel(\"pin\");\n const unpin = useUiLabel(\"unpin\");\n const pinnedLabel = useUiLabel(\"pinned\");\n const isPinned = state.item?.pinned === true;\n const isDisabled = disabled ?? state.isMutating;\n return (\n <button\n {...props}\n type={props.type ?? \"button\"}\n disabled={isDisabled}\n aria-pressed={isPinned}\n data-pinned={isPinned ? \"true\" : \"false\"}\n data-keep-action=\"toggle-pin\"\n onClick={() => void state.togglePin().catch((error) => onToggleError?.(error))}\n >\n {typeof children === \"function\"\n ? children(state)\n : (children ?? (isPinned ? (unpinLabel ?? unpin) : (pinLabel ?? pin)))}\n {isPinned && children === undefined ? <span aria-hidden=\"true\"> ({pinnedLabel})</span> : null}\n </button>\n );\n}\n","\"use client\";\n\nimport type { KeepItem } from \"@keepkit/core/core\";\nimport { createContext, type ReactNode, useCallback, useContext, useMemo } from \"react\";\nimport { getKeepLocaleLabels, KEEP_LOCALE_LABELS, normalizeKeepLocale } from \"../locales\";\nimport type { KeepUiLabelKey, KeepUiLabels, KeepUiLocaleLabels } from \"../locales/types\";\n\nexport type { KeepUiLocale } from \"../locales\";\nexport type { KeepUiLabelKey, KeepUiLabels, KeepUiLocaleLabels } from \"../locales/types\";\n\nexport type KeepUiLabelContext = {\n locale?: string;\n labels: Readonly<Record<KeepUiLabelKey, string>>;\n customLabels?: KeepUiLabels;\n labelResolver?: (key: KeepUiLabelKey, context: { locale?: string }) => string | undefined;\n emitFeedback: <TMeta>(event: KeepUiFeedbackEvent<TMeta>) => void;\n};\n\ntype KeepUiFeedbackBase<TType extends string> = { type: TType; message: string };\n\nexport type KeepUiFeedbackEvent<TMeta = Record<string, unknown>> =\n | (KeepUiFeedbackBase<\"item-saved\"> & { item: KeepItem<TMeta> })\n | (KeepUiFeedbackBase<\"item-removed\"> & {\n item: KeepItem<TMeta>;\n undo: () => void | Promise<void>;\n undoLabel: string;\n })\n | (KeepUiFeedbackBase<\"item-restored\"> & { item?: KeepItem<TMeta>; items: KeepItem<TMeta>[] })\n | KeepUiFeedbackBase<\"sync-completed\">\n | (KeepUiFeedbackBase<\"sync-failed\"> & { error: unknown })\n | (KeepUiFeedbackBase<\"stale-pruned\"> & {\n item?: KeepItem<TMeta>;\n items: KeepItem<TMeta>[];\n undo: () => void | Promise<void>;\n undoLabel: string;\n });\n\nexport const DEFAULT_LABELS: KeepUiLocaleLabels = KEEP_LOCALE_LABELS.en;\n\nconst KeepUiLabelsContext = createContext<KeepUiLabelContext>({\n labels: DEFAULT_LABELS,\n emitFeedback: () => undefined,\n});\n\nexport type KeepUiProviderProps<TMeta = Record<string, unknown>> = {\n labels?: KeepUiLabels;\n locale?: string;\n labelResolver?: KeepUiLabelContext[\"labelResolver\"];\n onFeedback?: (event: KeepUiFeedbackEvent<TMeta>) => void;\n children?: ReactNode;\n};\n\n/** Provides one complete locale-aware label source to every UI primitive. */\nexport function KeepUiProvider<TMeta = Record<string, unknown>>({\n labels,\n locale,\n labelResolver,\n onFeedback,\n children,\n}: KeepUiProviderProps<TMeta>) {\n const emitFeedback = useCallback(\n <TEventMeta,>(event: KeepUiFeedbackEvent<TEventMeta>) => {\n onFeedback?.(event as KeepUiFeedbackEvent<TMeta>);\n },\n [onFeedback],\n );\n const value = useMemo<KeepUiLabelContext>(() => {\n const resolvedLocale = normalizeKeepLocale(locale);\n const dictionary = getKeepLocaleLabels(resolvedLocale);\n const resolved = { ...DEFAULT_LABELS, ...dictionary, ...labels };\n return { locale: locale ?? resolvedLocale, labels: resolved, customLabels: labels, labelResolver, emitFeedback };\n }, [emitFeedback, labelResolver, labels, locale]);\n return <KeepUiLabelsContext.Provider value={value}>{children}</KeepUiLabelsContext.Provider>;\n}\n\nexport function useKeepUiLabels(): KeepUiLabelContext {\n return useContext(KeepUiLabelsContext);\n}\n\nexport function useUiLabel(key: KeepUiLabelKey, override?: string): string {\n const context = useKeepUiLabels();\n return (\n override ??\n context.customLabels?.[key] ??\n context.labelResolver?.(key, { locale: context.locale }) ??\n context.labels[key]\n );\n}\n\nexport function useKeepUiFeedback<TMeta = Record<string, unknown>>() {\n const { emitFeedback } = useKeepUiLabels();\n return useCallback((event: KeepUiFeedbackEvent<TMeta>) => emitFeedback(event), [emitFeedback]);\n}\n\nexport { getKeepLocaleLabels };\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const DE_LABELS: KeepUiLocaleLabels = {\n archive: \"Archivieren\",\n unarchive: \"Archivierung aufheben\",\n archived: \"Archiviert\",\n pin: \"Anheften\",\n unpin: \"Anheften lösen\",\n pinned: \"Angeheftet\",\n collection: \"Sammlung\",\n allCollections: \"Alle Sammlungen\",\n filterCollections: \"Nach Sammlung filtern\",\n uncategorized: \"Nicht kategorisiert\",\n saveWithNote: \"Mit Notiz speichern\",\n editSavedItem: \"Gespeichertes Element bearbeiten\",\n unsavedChanges: \"Nicht gespeicherte Änderungen\",\n save: \"Speichern\",\n saved: \"Gespeichert\",\n remove: \"Entfernen\",\n loading: \"Wird geladen…\",\n saving: \"Wird gespeichert…\",\n syncing: \"Wird synchronisiert…\",\n error: \"Ein Fehler ist aufgetreten.\",\n allTags: \"Alle\",\n tags: \"Tags\",\n filterTags: \"Gespeicherte Elemente nach Tag filtern\",\n activeFilters: \"Aktive Filter\",\n clearFilters: \"Filter löschen\",\n clearAllFilters: \"Alle Filter löschen\",\n removeFilter: \"entfernen\",\n noFilteredItems: \"Keine passenden Elemente gefunden.\",\n noFilteredItemsDescription: \"Passe die Suche an oder entferne einen Tag-Filter.\",\n emptyStorageDescription: \"Speichere ein Element, damit es hier angezeigt wird.\",\n note: \"Notiz\",\n saveNote: \"Notiz speichern\",\n noItems: \"Keine gespeicherten Elemente.\",\n loadingItems: \"Gespeicherte Elemente werden geladen…\",\n errorItems: \"Gespeicherte Elemente konnten nicht geladen werden.\",\n search: \"Gespeicherte Elemente durchsuchen\",\n sort: \"Gespeicherte Elemente sortieren\",\n newest: \"Neueste zuerst\",\n oldest: \"Älteste zuerst\",\n savedNewest: \"Zuletzt gespeichert zuerst\",\n savedOldest: \"Am längsten gespeichert zuerst\",\n updatedNewest: \"Zuletzt aktualisiert zuerst\",\n updatedOldest: \"Am längsten nicht aktualisiert zuerst\",\n previousPage: \"Vorherige Seite\",\n nextPage: \"Nächste Seite\",\n pagination: \"Seitennavigation\",\n page: \"Seite\",\n selectItems: \"Gespeicherte Elemente auswählen\",\n selectedCount: \"ausgewählt\",\n deleteSelected: \"Auswahl löschen\",\n tagsToApply: \"Anzuwendende Tags\",\n applyTags: \"Tags anwenden\",\n savedMessage: \"Element gespeichert.\",\n removedMessage: \"Element entfernt.\",\n restoredMessage: \"Element wiederhergestellt.\",\n syncFailedMessage: \"Synchronisierung fehlgeschlagen.\",\n stalePrunedMessage: \"Nicht verfügbare Elemente entfernt.\",\n undo: \"Rückgängig\",\n undoAvailable: \"Element entfernt. Rückgängig machen?\",\n selectionScope: \"Auswahlbereich\",\n currentPage: \"Aktuelle Seite\",\n searchResults: \"Aktuelle Suchergebnisse\",\n allItems: \"Alle gespeicherten Elemente\",\n localVersion: \"Lokal\",\n remoteVersion: \"Server\",\n updatedAt: \"Aktualisiert\",\n statusAvailable: \"Verfügbar\",\n noteSavedMessage: \"Notiz gespeichert.\",\n exportData: \"JSON exportieren\",\n importData: \"JSON importieren\",\n importMode: \"Importmodus\",\n merge: \"Zusammenführen\",\n replace: \"Ersetzen\",\n importedCount: \"Elemente importiert\",\n failedCount: \"Elemente fehlgeschlagen\",\n storageQuotaError: \"Der Speicher ist voll. Schaffen Sie Speicherplatz und versuchen Sie es erneut.\",\n statusExpired: \"Abgelaufen\",\n statusRemoved: \"Entfernt\",\n statusDeleted: \"Gelöscht\",\n statusPrivate: \"Privat\",\n statusUnknown: \"Nicht verfügbar\",\n retry: \"Erneut versuchen\",\n removeFromList: \"Aus Liste entfernen\",\n pruneStale: \"Nicht verfügbare Elemente entfernen\",\n retrySync: \"Synchronisierung erneut versuchen\",\n resolveSync: \"Konflikte lösen\",\n keepLocal: \"Lokale Version behalten\",\n useServer: \"Serverversion verwenden\",\n manualMerge: \"Manuell zusammenführen\",\n close: \"Schließen\",\n backupRecovery: \"Aus Backup wiederherstellen\",\n backupRecoveryDescription:\n \"Wenn lokale Synchronisierungsdaten beschädigt sind, stellen Sie ein gültiges JSON-Backup wieder her.\",\n syncPending: \"Änderungen warten auf die Synchronisierung.\",\n syncSynced: \"Alle Änderungen sind synchronisiert.\",\n syncConflict: \"Einige Änderungen benötigen eine Konfliktlösung.\",\n archiveScope: \"Archivbereich\",\n archiveScopeActive: \"Aktiv\",\n archiveScopeArchived: \"Archiviert\",\n archiveScopeAll: \"Alle Elemente\",\n undoReorder: \"Sortierung rückgängig machen\",\n};\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const EN_LABELS: KeepUiLocaleLabels = {\n archive: \"Archive\",\n unarchive: \"Unarchive\",\n archived: \"Archived\",\n pin: \"Pin\",\n unpin: \"Unpin\",\n pinned: \"Pinned\",\n collection: \"Collection\",\n allCollections: \"All collections\",\n filterCollections: \"Filter collections\",\n uncategorized: \"Uncategorized\",\n saveWithNote: \"Save with note\",\n editSavedItem: \"Edit saved item\",\n unsavedChanges: \"Unsaved changes\",\n save: \"Save\",\n saved: \"Saved\",\n remove: \"Remove\",\n loading: \"Loading…\",\n saving: \"Saving…\",\n syncing: \"Syncing…\",\n error: \"Something went wrong.\",\n allTags: \"All\",\n tags: \"Tags\",\n filterTags: \"Filter saved items by tag\",\n activeFilters: \"Active filters\",\n clearFilters: \"Clear filters\",\n clearAllFilters: \"Clear all filters\",\n removeFilter: \"Remove\",\n noFilteredItems: \"No matching items found.\",\n noFilteredItemsDescription: \"Try adjusting your search or removing a tag filter.\",\n emptyStorageDescription: \"Save an item to see it here.\",\n note: \"Note\",\n saveNote: \"Save note\",\n noItems: \"No saved items.\",\n loadingItems: \"Loading saved items…\",\n errorItems: \"Could not load saved items.\",\n search: \"Search saved items\",\n sort: \"Sort saved items\",\n newest: \"Newest first\",\n oldest: \"Oldest first\",\n savedNewest: \"Saved newest first\",\n savedOldest: \"Saved oldest first\",\n updatedNewest: \"Updated newest first\",\n updatedOldest: \"Updated oldest first\",\n previousPage: \"Previous page\",\n nextPage: \"Next page\",\n pagination: \"Pagination\",\n page: \"Page\",\n selectItems: \"Select saved items\",\n selectedCount: \"selected\",\n deleteSelected: \"Delete selected\",\n tagsToApply: \"Tags to apply\",\n applyTags: \"Apply tags\",\n savedMessage: \"Item saved.\",\n removedMessage: \"Item removed.\",\n restoredMessage: \"Item restored.\",\n syncFailedMessage: \"Sync failed.\",\n stalePrunedMessage: \"Unavailable items removed.\",\n undo: \"Undo\",\n undoAvailable: \"Item removed. Undo?\",\n selectionScope: \"Selection scope\",\n currentPage: \"Current page\",\n searchResults: \"Current search results\",\n allItems: \"All saved items\",\n localVersion: \"Local\",\n remoteVersion: \"Remote\",\n updatedAt: \"Updated\",\n statusAvailable: \"Available\",\n noteSavedMessage: \"Note saved.\",\n exportData: \"Export JSON\",\n importData: \"Import JSON\",\n importMode: \"Import mode\",\n merge: \"Merge\",\n replace: \"Replace\",\n importedCount: \"items imported\",\n failedCount: \"items failed\",\n storageQuotaError: \"Storage is full. Free space and try again.\",\n statusExpired: \"Expired\",\n statusRemoved: \"Removed\",\n statusDeleted: \"Deleted\",\n statusPrivate: \"Private\",\n statusUnknown: \"Unavailable\",\n retry: \"Retry\",\n removeFromList: \"Remove from list\",\n pruneStale: \"Remove unavailable items\",\n retrySync: \"Retry sync\",\n resolveSync: \"Resolve conflicts\",\n keepLocal: \"Keep local\",\n useServer: \"Use server\",\n manualMerge: \"Manual merge\",\n close: \"Close\",\n backupRecovery: \"Restore from backup\",\n backupRecoveryDescription: \"If local sync data is damaged, restore a known-good JSON backup.\",\n syncPending: \"Changes are waiting to sync.\",\n syncSynced: \"All changes are synced.\",\n syncConflict: \"Some changes need conflict resolution.\",\n archiveScope: \"Archive scope\",\n archiveScopeActive: \"Active\",\n archiveScopeArchived: \"Archived\",\n archiveScopeAll: \"All items\",\n undoReorder: \"Undo reorder\",\n};\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const ES_LABELS: KeepUiLocaleLabels = {\n archive: \"Archivar\",\n unarchive: \"Desarchivar\",\n archived: \"Archivado\",\n pin: \"Fijar\",\n unpin: \"Desfijar\",\n pinned: \"Fijado\",\n collection: \"Colección\",\n allCollections: \"Todas las colecciones\",\n filterCollections: \"Filtrar por colección\",\n uncategorized: \"Sin categoría\",\n saveWithNote: \"Guardar con nota\",\n editSavedItem: \"Editar elemento guardado\",\n unsavedChanges: \"Cambios sin guardar\",\n save: \"Guardar\",\n saved: \"Guardado\",\n remove: \"Eliminar\",\n loading: \"Cargando…\",\n saving: \"Guardando…\",\n syncing: \"Sincronizando…\",\n error: \"Se produjo un error.\",\n allTags: \"Todos\",\n tags: \"Etiquetas\",\n filterTags: \"Filtrar elementos guardados por etiqueta\",\n activeFilters: \"Filtros activos\",\n clearFilters: \"Borrar filtros\",\n clearAllFilters: \"Borrar todos los filtros\",\n removeFilter: \"quitar\",\n noFilteredItems: \"No se encontraron elementos coincidentes.\",\n noFilteredItemsDescription: \"Ajusta la búsqueda o quita un filtro de etiqueta.\",\n emptyStorageDescription: \"Guarda un elemento para verlo aquí.\",\n note: \"Nota\",\n saveNote: \"Guardar nota\",\n noItems: \"No hay elementos guardados.\",\n loadingItems: \"Cargando elementos guardados…\",\n errorItems: \"No se pudieron cargar los elementos guardados.\",\n search: \"Buscar elementos guardados\",\n sort: \"Ordenar elementos guardados\",\n newest: \"Más recientes primero\",\n oldest: \"Más antiguos primero\",\n savedNewest: \"Guardados más recientemente primero\",\n savedOldest: \"Guardados más antiguos primero\",\n updatedNewest: \"Actualizados más recientemente primero\",\n updatedOldest: \"Actualizados más antiguos primero\",\n previousPage: \"Página anterior\",\n nextPage: \"Página siguiente\",\n pagination: \"Paginación\",\n page: \"Página\",\n selectItems: \"Seleccionar elementos guardados\",\n selectedCount: \"seleccionados\",\n deleteSelected: \"Eliminar seleccionados\",\n tagsToApply: \"Etiquetas que aplicar\",\n applyTags: \"Aplicar etiquetas\",\n savedMessage: \"Elemento guardado.\",\n removedMessage: \"Elemento eliminado.\",\n restoredMessage: \"Elemento restaurado.\",\n syncFailedMessage: \"Error de sincronización.\",\n stalePrunedMessage: \"Elementos no disponibles eliminados.\",\n undo: \"Deshacer\",\n undoAvailable: \"Elemento eliminado. ¿Deshacer?\",\n selectionScope: \"Ámbito de selección\",\n currentPage: \"Página actual\",\n searchResults: \"Resultados de búsqueda actuales\",\n allItems: \"Todos los elementos guardados\",\n localVersion: \"Local\",\n remoteVersion: \"Servidor\",\n updatedAt: \"Actualizado\",\n statusAvailable: \"Disponible\",\n noteSavedMessage: \"Nota guardada.\",\n exportData: \"Exportar JSON\",\n importData: \"Importar JSON\",\n importMode: \"Modo de importación\",\n merge: \"Combinar\",\n replace: \"Reemplazar\",\n importedCount: \"elementos importados\",\n failedCount: \"elementos fallidos\",\n storageQuotaError: \"El almacenamiento está lleno. Libere espacio y vuelva a intentarlo.\",\n statusExpired: \"Caducado\",\n statusRemoved: \"Eliminado\",\n statusDeleted: \"Borrado\",\n statusPrivate: \"Privado\",\n statusUnknown: \"No disponible\",\n retry: \"Reintentar\",\n removeFromList: \"Quitar de la lista\",\n pruneStale: \"Quitar elementos no disponibles\",\n retrySync: \"Reintentar sincronización\",\n resolveSync: \"Resolver conflictos\",\n keepLocal: \"Conservar versión local\",\n useServer: \"Usar versión del servidor\",\n manualMerge: \"Combinar manualmente\",\n close: \"Cerrar\",\n backupRecovery: \"Restaurar desde copia de seguridad\",\n backupRecoveryDescription: \"Si los datos locales están dañados, restaura una copia JSON válida.\",\n syncPending: \"Hay cambios pendientes de sincronización.\",\n syncSynced: \"Todos los cambios están sincronizados.\",\n syncConflict: \"Algunos cambios necesitan resolver un conflicto.\",\n archiveScope: \"Ámbito del archivo\",\n archiveScopeActive: \"Activos\",\n archiveScopeArchived: \"Archivados\",\n archiveScopeAll: \"Todos los elementos\",\n undoReorder: \"Deshacer ordenación\",\n};\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const FIL_LABELS: KeepUiLocaleLabels = {\n archive: \"I-archive\",\n unarchive: \"Alisin sa archive\",\n archived: \"Naka-archive\",\n pin: \"I-pin\",\n unpin: \"Alisin ang pin\",\n pinned: \"Naka-pin\",\n collection: \"Koleksyon\",\n allCollections: \"Lahat ng koleksyon\",\n filterCollections: \"I-filter ayon sa koleksyon\",\n uncategorized: \"Walang kategorya\",\n saveWithNote: \"I-save na may tala\",\n editSavedItem: \"I-edit ang naka-save na item\",\n unsavedChanges: \"Mga hindi pa nai-save na pagbabago\",\n save: \"I-save\",\n saved: \"Nai-save\",\n remove: \"Alisin\",\n loading: \"Naglo-load…\",\n saving: \"Sini-save…\",\n syncing: \"Sini-sync…\",\n error: \"May naganap na error.\",\n allTags: \"Lahat\",\n tags: \"Mga tag\",\n filterTags: \"I-filter ang mga naka-save na item ayon sa tag\",\n activeFilters: \"Mga aktibong filter\",\n clearFilters: \"I-clear ang mga filter\",\n clearAllFilters: \"I-clear ang lahat ng filter\",\n removeFilter: \"alisin\",\n noFilteredItems: \"Walang nakitang tumutugmang item.\",\n noFilteredItemsDescription: \"Baguhin ang paghahanap o alisin ang filter ng tag.\",\n emptyStorageDescription: \"Mag-save ng item para makita ito rito.\",\n note: \"Tala\",\n saveNote: \"I-save ang tala\",\n noItems: \"Walang naka-save na item.\",\n loadingItems: \"Nilo-load ang mga naka-save na item…\",\n errorItems: \"Hindi ma-load ang mga naka-save na item.\",\n search: \"Maghanap ng naka-save na item\",\n sort: \"Ayusin ang mga naka-save na item\",\n newest: \"Pinakabago muna\",\n oldest: \"Pinakaluma muna\",\n savedNewest: \"Pinakabagong na-save muna\",\n savedOldest: \"Pinakamatagal na naka-save muna\",\n updatedNewest: \"Pinakabagong na-update muna\",\n updatedOldest: \"Pinakamatagal na hindi na-update muna\",\n previousPage: \"Nakaraang pahina\",\n nextPage: \"Susunod na pahina\",\n pagination: \"Pagpapa-pahina\",\n page: \"Pahina\",\n selectItems: \"Pumili ng naka-save na item\",\n selectedCount: \"napili\",\n deleteSelected: \"Tanggalin ang napili\",\n tagsToApply: \"Mga tag na ilalapat\",\n applyTags: \"Ilapat ang mga tag\",\n savedMessage: \"Na-save ang item.\",\n removedMessage: \"Inalis ang item.\",\n restoredMessage: \"Naibalik ang item.\",\n syncFailedMessage: \"Hindi nagtagumpay ang pag-sync.\",\n stalePrunedMessage: \"Inalis ang mga hindi available na item.\",\n undo: \"I-undo\",\n undoAvailable: \"Inalis ang item. I-undo?\",\n selectionScope: \"Saklaw ng pagpili\",\n currentPage: \"Kasalukuyang pahina\",\n searchResults: \"Kasalukuyang resulta ng paghahanap\",\n allItems: \"Lahat ng naka-save na item\",\n localVersion: \"Lokal\",\n remoteVersion: \"Remote\",\n updatedAt: \"Na-update\",\n statusAvailable: \"Available\",\n noteSavedMessage: \"Na-save ang tala.\",\n exportData: \"I-export ang JSON\",\n importData: \"I-import ang JSON\",\n importMode: \"Mode ng pag-import\",\n merge: \"Pagsamahin\",\n replace: \"Palitan\",\n importedCount: \"item ang na-import\",\n failedCount: \"item ang nabigo\",\n storageQuotaError: \"Puno na ang storage. Magbakante ng espasyo at subukan muli.\",\n statusExpired: \"Nag-expire\",\n statusRemoved: \"Inalis\",\n statusDeleted: \"Tinanggal\",\n statusPrivate: \"Pribado\",\n statusUnknown: \"Hindi available\",\n retry: \"Subukan muli\",\n removeFromList: \"Alisin sa listahan\",\n pruneStale: \"Alisin ang hindi available na item\",\n retrySync: \"Subukan muli ang sync\",\n resolveSync: \"Ayusin ang mga conflict\",\n keepLocal: \"Panatilihin ang lokal\",\n useServer: \"Gamitin ang server\",\n manualMerge: \"Manwal na pagsamahin\",\n close: \"Isara\",\n backupRecovery: \"I-restore mula sa backup\",\n backupRecoveryDescription: \"Kung sira ang lokal na sync data, mag-restore ng gumaganang JSON backup.\",\n syncPending: \"May mga pagbabagong naghihintay ng sync.\",\n syncSynced: \"Naka-sync na ang lahat ng pagbabago.\",\n syncConflict: \"May mga pagbabagong kailangang ayusin ang conflict.\",\n archiveScope: \"Saklaw ng archive\",\n archiveScopeActive: \"Aktibo\",\n archiveScopeArchived: \"Naka-archive\",\n archiveScopeAll: \"Lahat ng item\",\n undoReorder: \"I-undo ang pag-aayos\",\n};\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const FR_LABELS: KeepUiLocaleLabels = {\n archive: \"Archiver\",\n unarchive: \"Désarchiver\",\n archived: \"Archivé\",\n pin: \"Épingler\",\n unpin: \"Désépingler\",\n pinned: \"Épinglé\",\n collection: \"Collection\",\n allCollections: \"Toutes les collections\",\n filterCollections: \"Filtrer par collection\",\n uncategorized: \"Non classé\",\n saveWithNote: \"Enregistrer avec une note\",\n editSavedItem: \"Modifier l’élément enregistré\",\n unsavedChanges: \"Modifications non enregistrées\",\n save: \"Enregistrer\",\n saved: \"Enregistré\",\n remove: \"Supprimer\",\n loading: \"Chargement…\",\n saving: \"Enregistrement…\",\n syncing: \"Synchronisation…\",\n error: \"Une erreur s’est produite.\",\n allTags: \"Tous\",\n tags: \"Étiquettes\",\n filterTags: \"Filtrer les éléments enregistrés par étiquette\",\n activeFilters: \"Filtres actifs\",\n clearFilters: \"Effacer les filtres\",\n clearAllFilters: \"Effacer tous les filtres\",\n removeFilter: \"supprimer\",\n noFilteredItems: \"Aucun élément correspondant trouvé.\",\n noFilteredItemsDescription: \"Modifiez votre recherche ou supprimez un filtre de tag.\",\n emptyStorageDescription: \"Enregistrez un élément pour le voir ici.\",\n note: \"Note\",\n saveNote: \"Enregistrer la note\",\n noItems: \"Aucun élément enregistré.\",\n loadingItems: \"Chargement des éléments enregistrés…\",\n errorItems: \"Impossible de charger les éléments enregistrés.\",\n search: \"Rechercher des éléments enregistrés\",\n sort: \"Trier les éléments enregistrés\",\n newest: \"Plus récent d’abord\",\n oldest: \"Plus ancien d’abord\",\n savedNewest: \"Enregistrement le plus récent d’abord\",\n savedOldest: \"Enregistrement le plus ancien d’abord\",\n updatedNewest: \"Mise à jour la plus récente d’abord\",\n updatedOldest: \"Mise à jour la plus ancienne d’abord\",\n previousPage: \"Page précédente\",\n nextPage: \"Page suivante\",\n pagination: \"Pagination\",\n page: \"Page\",\n selectItems: \"Sélectionner les éléments enregistrés\",\n selectedCount: \"sélectionnés\",\n deleteSelected: \"Supprimer la sélection\",\n tagsToApply: \"Étiquettes à appliquer\",\n applyTags: \"Appliquer les étiquettes\",\n savedMessage: \"Élément enregistré.\",\n removedMessage: \"Élément supprimé.\",\n restoredMessage: \"Élément restauré.\",\n syncFailedMessage: \"Échec de la synchronisation.\",\n stalePrunedMessage: \"Éléments indisponibles supprimés.\",\n undo: \"Annuler\",\n undoAvailable: \"Élément supprimé. Annuler ?\",\n selectionScope: \"Portée de la sélection\",\n currentPage: \"Page actuelle\",\n searchResults: \"Résultats de recherche actuels\",\n allItems: \"Tous les éléments enregistrés\",\n localVersion: \"Local\",\n remoteVersion: \"Distant\",\n updatedAt: \"Mis à jour\",\n statusAvailable: \"Disponible\",\n noteSavedMessage: \"Note enregistrée.\",\n exportData: \"Exporter JSON\",\n importData: \"Importer JSON\",\n importMode: \"Mode d’importation\",\n merge: \"Fusionner\",\n replace: \"Remplacer\",\n importedCount: \"éléments importés\",\n failedCount: \"éléments en échec\",\n storageQuotaError: \"Le stockage est plein. Libérez de l’espace et réessayez.\",\n statusExpired: \"Expiré\",\n statusRemoved: \"Supprimé\",\n statusDeleted: \"Effacé\",\n statusPrivate: \"Privé\",\n statusUnknown: \"Indisponible\",\n retry: \"Réessayer\",\n removeFromList: \"Retirer de la liste\",\n pruneStale: \"Retirer les éléments indisponibles\",\n retrySync: \"Réessayer la synchronisation\",\n resolveSync: \"Résoudre les conflits\",\n keepLocal: \"Garder la version locale\",\n useServer: \"Utiliser la version serveur\",\n manualMerge: \"Fusion manuelle\",\n close: \"Fermer\",\n backupRecovery: \"Restaurer depuis une sauvegarde\",\n backupRecoveryDescription: \"Si les données locales sont endommagées, restaurez une sauvegarde JSON valide.\",\n syncPending: \"Des modifications attendent la synchronisation.\",\n syncSynced: \"Toutes les modifications sont synchronisées.\",\n syncConflict: \"Certaines modifications nécessitent une résolution de conflit.\",\n archiveScope: \"Périmètre des archives\",\n archiveScopeActive: \"Actifs\",\n archiveScopeArchived: \"Archivés\",\n archiveScopeAll: \"Tous les éléments\",\n undoReorder: \"Annuler le réordonnancement\",\n};\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const ID_LABELS: KeepUiLocaleLabels = {\n archive: \"Arsipkan\",\n unarchive: \"Batalkan arsip\",\n archived: \"Diarsipkan\",\n pin: \"Sematkan\",\n unpin: \"Lepas sematan\",\n pinned: \"Disematkan\",\n collection: \"Koleksi\",\n allCollections: \"Semua koleksi\",\n filterCollections: \"Filter koleksi\",\n uncategorized: \"Tanpa kategori\",\n saveWithNote: \"Simpan dengan catatan\",\n editSavedItem: \"Edit item tersimpan\",\n unsavedChanges: \"Perubahan belum disimpan\",\n save: \"Simpan\",\n saved: \"Tersimpan\",\n remove: \"Hapus\",\n loading: \"Memuat…\",\n saving: \"Menyimpan…\",\n syncing: \"Menyinkronkan…\",\n error: \"Terjadi kesalahan.\",\n allTags: \"Semua\",\n tags: \"Tag\",\n filterTags: \"Filter item tersimpan berdasarkan tag\",\n activeFilters: \"Filter aktif\",\n clearFilters: \"Hapus filter\",\n clearAllFilters: \"Hapus semua filter\",\n removeFilter: \"hapus\",\n noFilteredItems: \"Tidak ada item yang cocok.\",\n noFilteredItemsDescription: \"Ubah pencarian atau hapus filter tag.\",\n emptyStorageDescription: \"Simpan item untuk melihatnya di sini.\",\n note: \"Catatan\",\n saveNote: \"Simpan catatan\",\n noItems: \"Belum ada item tersimpan.\",\n loadingItems: \"Memuat item tersimpan…\",\n errorItems: \"Tidak dapat memuat item tersimpan.\",\n search: \"Cari item tersimpan\",\n sort: \"Urutkan item tersimpan\",\n newest: \"Terbaru dahulu\",\n oldest: \"Terlama dahulu\",\n savedNewest: \"Paling baru disimpan dahulu\",\n savedOldest: \"Paling lama disimpan dahulu\",\n updatedNewest: \"Paling baru diperbarui dahulu\",\n updatedOldest: \"Paling lama diperbarui dahulu\",\n previousPage: \"Halaman sebelumnya\",\n nextPage: \"Halaman berikutnya\",\n pagination: \"Paginasi\",\n page: \"Halaman\",\n selectItems: \"Pilih item tersimpan\",\n selectedCount: \"dipilih\",\n deleteSelected: \"Hapus yang dipilih\",\n tagsToApply: \"Tag yang akan diterapkan\",\n applyTags: \"Terapkan tag\",\n savedMessage: \"Item tersimpan.\",\n removedMessage: \"Item dihapus.\",\n restoredMessage: \"Item dipulihkan.\",\n syncFailedMessage: \"Sinkronisasi gagal.\",\n stalePrunedMessage: \"Item yang tidak tersedia dihapus.\",\n undo: \"Urungkan\",\n undoAvailable: \"Item dihapus. Urungkan?\",\n selectionScope: \"Cakupan pilihan\",\n currentPage: \"Halaman saat ini\",\n searchResults: \"Hasil pencarian saat ini\",\n allItems: \"Semua item tersimpan\",\n localVersion: \"Lokal\",\n remoteVersion: \"Server\",\n updatedAt: \"Diperbarui\",\n statusAvailable: \"Tersedia\",\n noteSavedMessage: \"Catatan tersimpan.\",\n exportData: \"Ekspor JSON\",\n importData: \"Impor JSON\",\n importMode: \"Mode impor\",\n merge: \"Gabungkan\",\n replace: \"Ganti\",\n importedCount: \"item diimpor\",\n failedCount: \"item gagal\",\n storageQuotaError: \"Penyimpanan penuh. Kosongkan ruang lalu coba lagi.\",\n statusExpired: \"Kedaluwarsa\",\n statusRemoved: \"Dihapus\",\n statusDeleted: \"Terhapus\",\n statusPrivate: \"Pribadi\",\n statusUnknown: \"Tidak tersedia\",\n retry: \"Coba lagi\",\n removeFromList: \"Hapus dari daftar\",\n pruneStale: \"Hapus item yang tidak tersedia\",\n retrySync: \"Coba sinkronisasi lagi\",\n resolveSync: \"Selesaikan konflik\",\n keepLocal: \"Pertahankan versi lokal\",\n useServer: \"Gunakan versi server\",\n manualMerge: \"Gabungkan manual\",\n close: \"Tutup\",\n backupRecovery: \"Pulihkan dari cadangan\",\n backupRecoveryDescription: \"Jika data sinkronisasi lokal rusak, pulihkan cadangan JSON yang valid.\",\n syncPending: \"Ada perubahan yang menunggu sinkronisasi.\",\n syncSynced: \"Semua perubahan telah disinkronkan.\",\n syncConflict: \"Beberapa perubahan memerlukan penyelesaian konflik.\",\n archiveScope: \"Cakupan arsip\",\n archiveScopeActive: \"Aktif\",\n archiveScopeArchived: \"Diarsipkan\",\n archiveScopeAll: \"Semua item\",\n undoReorder: \"Batalkan pengurutan\",\n};\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const IT_LABELS: KeepUiLocaleLabels = {\n archive: \"Archivia\",\n unarchive: \"Rimuovi dall'archivio\",\n archived: \"Archiviato\",\n pin: \"Fissa\",\n unpin: \"Rimuovi fissaggio\",\n pinned: \"Fissato\",\n collection: \"Raccolta\",\n allCollections: \"Tutte le raccolte\",\n filterCollections: \"Filtra per raccolta\",\n uncategorized: \"Senza categoria\",\n saveWithNote: \"Salva con nota\",\n editSavedItem: \"Modifica elemento salvato\",\n unsavedChanges: \"Modifiche non salvate\",\n save: \"Salva\",\n saved: \"Salvato\",\n remove: \"Rimuovi\",\n loading: \"Caricamento…\",\n saving: \"Salvataggio…\",\n syncing: \"Sincronizzazione…\",\n error: \"Si è verificato un errore.\",\n allTags: \"Tutti\",\n tags: \"Tag\",\n filterTags: \"Filtra gli elementi salvati per tag\",\n activeFilters: \"Filtri attivi\",\n clearFilters: \"Cancella filtri\",\n clearAllFilters: \"Cancella tutti i filtri\",\n removeFilter: \"rimuovi\",\n noFilteredItems: \"Nessun elemento corrispondente trovato.\",\n noFilteredItemsDescription: \"Modifica la ricerca o rimuovi un filtro tag.\",\n emptyStorageDescription: \"Salva un elemento per visualizzarlo qui.\",\n note: \"Nota\",\n saveNote: \"Salva nota\",\n noItems: \"Nessun elemento salvato.\",\n loadingItems: \"Caricamento degli elementi salvati…\",\n errorItems: \"Impossibile caricare gli elementi salvati.\",\n search: \"Cerca elementi salvati\",\n sort: \"Ordina elementi salvati\",\n newest: \"Più recenti prima\",\n oldest: \"Più vecchi prima\",\n savedNewest: \"Salvati più di recente prima\",\n savedOldest: \"Salvati meno di recente prima\",\n updatedNewest: \"Aggiornati più di recente prima\",\n updatedOldest: \"Aggiornati meno di recente prima\",\n previousPage: \"Pagina precedente\",\n nextPage: \"Pagina successiva\",\n pagination: \"Paginazione\",\n page: \"Pagina\",\n selectItems: \"Seleziona elementi salvati\",\n selectedCount: \"selezionati\",\n deleteSelected: \"Elimina selezionati\",\n tagsToApply: \"Tag da applicare\",\n applyTags: \"Applica tag\",\n savedMessage: \"Elemento salvato.\",\n removedMessage: \"Elemento rimosso.\",\n restoredMessage: \"Elemento ripristinato.\",\n syncFailedMessage: \"Sincronizzazione non riuscita.\",\n stalePrunedMessage: \"Elementi non disponibili rimossi.\",\n undo: \"Annulla\",\n undoAvailable: \"Elemento rimosso. Annullare?\",\n selectionScope: \"Ambito della selezione\",\n currentPage: \"Pagina corrente\",\n searchResults: \"Risultati di ricerca correnti\",\n allItems: \"Tutti gli elementi salvati\",\n localVersion: \"Locale\",\n remoteVersion: \"Server\",\n updatedAt: \"Aggiornato\",\n statusAvailable: \"Disponibile\",\n noteSavedMessage: \"Nota salvata.\",\n exportData: \"Esporta JSON\",\n importData: \"Importa JSON\",\n importMode: \"Modalità di importazione\",\n merge: \"Unisci\",\n replace: \"Sostituisci\",\n importedCount: \"elementi importati\",\n failedCount: \"elementi non riusciti\",\n storageQuotaError: \"Lo spazio di archiviazione è pieno. Libera spazio e riprova.\",\n statusExpired: \"Scaduto\",\n statusRemoved: \"Rimosso\",\n statusDeleted: \"Eliminato\",\n statusPrivate: \"Privato\",\n statusUnknown: \"Non disponibile\",\n retry: \"Riprova\",\n removeFromList: \"Rimuovi dall'elenco\",\n pruneStale: \"Rimuovi elementi non disponibili\",\n retrySync: \"Riprova sincronizzazione\",\n resolveSync: \"Risolvi conflitti\",\n keepLocal: \"Mantieni versione locale\",\n useServer: \"Usa versione del server\",\n manualMerge: \"Unione manuale\",\n close: \"Chiudi\",\n backupRecovery: \"Ripristina dal backup\",\n backupRecoveryDescription: \"Se i dati locali sono danneggiati, ripristina un backup JSON valido.\",\n syncPending: \"Ci sono modifiche in attesa di sincronizzazione.\",\n syncSynced: \"Tutte le modifiche sono sincronizzate.\",\n syncConflict: \"Alcune modifiche richiedono la risoluzione di un conflitto.\",\n archiveScope: \"Ambito archivio\",\n archiveScopeActive: \"Attivi\",\n archiveScopeArchived: \"Archiviati\",\n archiveScopeAll: \"Tutti gli elementi\",\n undoReorder: \"Annulla riordinamento\",\n};\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const JA_LABELS: KeepUiLocaleLabels = {\n archive: \"アーカイブ\",\n unarchive: \"アーカイブを解除\",\n archived: \"アーカイブ済み\",\n pin: \"ピン留め\",\n unpin: \"ピン留めを解除\",\n pinned: \"ピン留め済み\",\n collection: \"コレクション\",\n allCollections: \"すべてのコレクション\",\n filterCollections: \"コレクションで絞り込む\",\n uncategorized: \"未分類\",\n saveWithNote: \"メモ付きで保存\",\n editSavedItem: \"保存したアイテムを編集\",\n unsavedChanges: \"未保存の変更があります\",\n save: \"保存\",\n saved: \"保存済み\",\n remove: \"削除\",\n loading: \"読み込み中…\",\n saving: \"保存中…\",\n syncing: \"同期中…\",\n error: \"問題が発生しました。\",\n allTags: \"すべて\",\n tags: \"タグ\",\n filterTags: \"保存アイテムをタグで絞り込む\",\n activeFilters: \"適用中の条件\",\n clearFilters: \"フィルターをクリア\",\n clearAllFilters: \"すべての条件をクリア\",\n removeFilter: \"を解除\",\n noFilteredItems: \"一致するアイテムが見つかりませんでした\",\n noFilteredItemsDescription: \"検索語を変更するか、タグの絞り込みを解除してください。\",\n emptyStorageDescription: \"アイテムを保存すると、ここに表示されます。\",\n note: \"メモ\",\n saveNote: \"メモを保存\",\n noItems: \"保存されたアイテムはありません。\",\n loadingItems: \"保存アイテムを読み込み中…\",\n errorItems: \"保存アイテムを読み込めませんでした。\",\n search: \"保存アイテムを検索\",\n sort: \"保存アイテムを並べ替え\",\n newest: \"新しい順\",\n oldest: \"古い順\",\n savedNewest: \"保存日時の新しい順\",\n savedOldest: \"保存日時の古い順\",\n updatedNewest: \"更新日時の新しい順\",\n updatedOldest: \"更新日時の古い順\",\n previousPage: \"前のページ\",\n nextPage: \"次のページ\",\n pagination: \"ページネーション\",\n page: \"ページ\",\n selectItems: \"保存アイテムを選択\",\n selectedCount: \"件を選択中\",\n deleteSelected: \"選択項目を削除\",\n tagsToApply: \"適用するタグ\",\n applyTags: \"タグを適用\",\n savedMessage: \"アイテムを保存しました。\",\n removedMessage: \"アイテムを削除しました。\",\n restoredMessage: \"アイテムを復元しました。\",\n syncFailedMessage: \"同期に失敗しました。\",\n stalePrunedMessage: \"利用できないアイテムを削除しました。\",\n undo: \"元に戻す\",\n undoAvailable: \"アイテムを削除しました。元に戻しますか?\",\n selectionScope: \"選択範囲\",\n currentPage: \"表示中のページ\",\n searchResults: \"現在の検索結果全体\",\n allItems: \"すべての保存アイテム\",\n localVersion: \"ローカル\",\n remoteVersion: \"リモート\",\n updatedAt: \"更新日時\",\n statusAvailable: \"利用可能\",\n noteSavedMessage: \"メモを保存しました。\",\n exportData: \"JSONをエクスポート\",\n importData: \"JSONをインポート\",\n importMode: \"インポート方法\",\n merge: \"統合\",\n replace: \"置き換え\",\n importedCount: \"件をインポートしました\",\n failedCount: \"件に失敗しました\",\n storageQuotaError: \"保存容量が不足しています。空き容量を確保して再試行してください。\",\n statusExpired: \"期限切れ\",\n statusRemoved: \"削除済み\",\n statusDeleted: \"削除済み\",\n statusPrivate: \"非公開\",\n statusUnknown: \"利用不可\",\n retry: \"再取得\",\n removeFromList: \"一覧から削除\",\n pruneStale: \"利用できない項目を削除\",\n retrySync: \"同期を再試行\",\n resolveSync: \"競合を解決\",\n keepLocal: \"ローカルを優先\",\n useServer: \"サーバーを優先\",\n manualMerge: \"手動で統合\",\n close: \"閉じる\",\n backupRecovery: \"バックアップから復元\",\n backupRecoveryDescription: \"ローカルの同期データが破損した場合は、正常なJSONバックアップから復元してください。\",\n syncPending: \"同期待ちの変更があります。\",\n syncSynced: \"すべての変更を同期しました。\",\n syncConflict: \"競合している変更があります。解決してください。\",\n archiveScope: \"アーカイブの範囲\",\n archiveScopeActive: \"保存中\",\n archiveScopeArchived: \"アーカイブ済み\",\n archiveScopeAll: \"すべて\",\n undoReorder: \"並び替えを元に戻す\",\n};\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const KO_LABELS: KeepUiLocaleLabels = {\n archive: \"보관\",\n unarchive: \"보관 해제\",\n archived: \"보관됨\",\n pin: \"고정\",\n unpin: \"고정 해제\",\n pinned: \"고정됨\",\n collection: \"컬렉션\",\n allCollections: \"모든 컬렉션\",\n filterCollections: \"컬렉션 필터\",\n uncategorized: \"미분류\",\n saveWithNote: \"메모와 함께 저장\",\n editSavedItem: \"저장된 항목 편집\",\n unsavedChanges: \"저장되지 않은 변경 사항\",\n save: \"저장\",\n saved: \"저장됨\",\n remove: \"삭제\",\n loading: \"로드 중…\",\n saving: \"저장 중…\",\n syncing: \"동기화 중…\",\n error: \"문제가 발생했습니다.\",\n allTags: \"모두\",\n tags: \"태그\",\n filterTags: \"태그로 저장 항목 필터링\",\n activeFilters: \"활성 필터\",\n clearFilters: \"필터 지우기\",\n clearAllFilters: \"모든 필터 지우기\",\n removeFilter: \"제거\",\n noFilteredItems: \"일치하는 항목이 없습니다.\",\n noFilteredItemsDescription: \"검색어를 바꾸거나 태그 필터를 제거해 보세요.\",\n emptyStorageDescription: \"항목을 저장하면 여기에 표시됩니다.\",\n note: \"메모\",\n saveNote: \"메모 저장\",\n noItems: \"저장된 항목이 없습니다.\",\n loadingItems: \"저장 항목을 불러오는 중…\",\n errorItems: \"저장 항목을 불러오지 못했습니다.\",\n search: \"저장 항목 검색\",\n sort: \"저장 항목 정렬\",\n newest: \"최신순\",\n oldest: \"오래된순\",\n savedNewest: \"저장일 최신순\",\n savedOldest: \"저장일 오래된순\",\n updatedNewest: \"수정일 최신순\",\n updatedOldest: \"수정일 오래된순\",\n previousPage: \"이전 페이지\",\n nextPage: \"다음 페이지\",\n pagination: \"페이지 매김\",\n page: \"페이지\",\n selectItems: \"저장 항목 선택\",\n selectedCount: \"개 선택됨\",\n deleteSelected: \"선택 항목 삭제\",\n tagsToApply: \"적용할 태그\",\n applyTags: \"태그 적용\",\n savedMessage: \"항목을 저장했습니다.\",\n removedMessage: \"항목을 삭제했습니다.\",\n restoredMessage: \"항목을 복원했습니다.\",\n syncFailedMessage: \"동기화에 실패했습니다.\",\n stalePrunedMessage: \"사용할 수 없는 항목을 삭제했습니다.\",\n undo: \"실행 취소\",\n undoAvailable: \"항목을 삭제했습니다. 실행 취소할까요?\",\n selectionScope: \"선택 범위\",\n currentPage: \"현재 페이지\",\n searchResults: \"현재 검색 결과 전체\",\n allItems: \"모든 저장 항목\",\n localVersion: \"로컬\",\n remoteVersion: \"원격\",\n updatedAt: \"업데이트 시간\",\n statusAvailable: \"사용 가능\",\n noteSavedMessage: \"메모를 저장했습니다.\",\n exportData: \"JSON 내보내기\",\n importData: \"JSON 가져오기\",\n importMode: \"가져오기 방식\",\n merge: \"병합\",\n replace: \"교체\",\n importedCount: \"개 가져옴\",\n failedCount: \"개 실패\",\n storageQuotaError: \"저장 공간이 부족합니다. 공간을 확보한 후 다시 시도하세요.\",\n statusExpired: \"만료됨\",\n statusRemoved: \"제거됨\",\n statusDeleted: \"삭제됨\",\n statusPrivate: \"비공개\",\n statusUnknown: \"사용할 수 없음\",\n retry: \"다시 시도\",\n removeFromList: \"목록에서 삭제\",\n pruneStale: \"사용할 수 없는 항목 삭제\",\n retrySync: \"동기화 다시 시도\",\n resolveSync: \"충돌 해결\",\n keepLocal: \"로컬 버전 유지\",\n useServer: \"서버 버전 사용\",\n manualMerge: \"수동 병합\",\n close: \"닫기\",\n backupRecovery: \"백업에서 복원\",\n backupRecoveryDescription: \"로컬 동기화 데이터가 손상된 경우 정상적인 JSON 백업을 복원하세요.\",\n syncPending: \"동기화 대기 중인 변경 사항이 있습니다.\",\n syncSynced: \"모든 변경 사항이 동기화되었습니다.\",\n syncConflict: \"충돌을 해결해야 하는 변경 사항이 있습니다.\",\n archiveScope: \"보관 범위\",\n archiveScopeActive: \"활성\",\n archiveScopeArchived: \"보관됨\",\n archiveScopeAll: \"모든 항목\",\n undoReorder: \"정렬 실행 취소\",\n};\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const MS_LABELS: KeepUiLocaleLabels = {\n archive: \"Arkibkan\",\n unarchive: \"Nyaharkib\",\n archived: \"Diarkibkan\",\n pin: \"Pin\",\n unpin: \"Nyahpin\",\n pinned: \"Dipinkan\",\n collection: \"Koleksi\",\n allCollections: \"Semua koleksi\",\n filterCollections: \"Tapis koleksi\",\n uncategorized: \"Tiada kategori\",\n saveWithNote: \"Simpan dengan nota\",\n editSavedItem: \"Edit item yang disimpan\",\n unsavedChanges: \"Perubahan belum disimpan\",\n save: \"Simpan\",\n saved: \"Disimpan\",\n remove: \"Buang\",\n loading: \"Memuatkan…\",\n saving: \"Menyimpan…\",\n syncing: \"Menyegerakkan…\",\n error: \"Ralat telah berlaku.\",\n allTags: \"Semua\",\n tags: \"Tag\",\n filterTags: \"Tapis item yang disimpan mengikut tag\",\n activeFilters: \"Penapis aktif\",\n clearFilters: \"Kosongkan penapis\",\n clearAllFilters: \"Kosongkan semua penapis\",\n removeFilter: \"alih keluar\",\n noFilteredItems: \"Tiada item yang sepadan ditemui.\",\n noFilteredItemsDescription: \"Laraskan carian atau alih keluar penapis tag.\",\n emptyStorageDescription: \"Simpan item untuk melihatnya di sini.\",\n note: \"Nota\",\n saveNote: \"Simpan nota\",\n noItems: \"Tiada item disimpan.\",\n loadingItems: \"Memuatkan item yang disimpan…\",\n errorItems: \"Tidak dapat memuatkan item yang disimpan.\",\n search: \"Cari item yang disimpan\",\n sort: \"Isih item yang disimpan\",\n newest: \"Terbaharu dahulu\",\n oldest: \"Terlama dahulu\",\n savedNewest: \"Disimpan paling baharu dahulu\",\n savedOldest: \"Disimpan paling lama dahulu\",\n updatedNewest: \"Dikemas kini paling baharu dahulu\",\n updatedOldest: \"Dikemas kini paling lama dahulu\",\n previousPage: \"Halaman sebelumnya\",\n nextPage: \"Halaman seterusnya\",\n pagination: \"Penomboran halaman\",\n page: \"Halaman\",\n selectItems: \"Pilih item yang disimpan\",\n selectedCount: \"dipilih\",\n deleteSelected: \"Padam pilihan\",\n tagsToApply: \"Tag untuk digunakan\",\n applyTags: \"Gunakan tag\",\n savedMessage: \"Item disimpan.\",\n removedMessage: \"Item dibuang.\",\n restoredMessage: \"Item dipulihkan.\",\n syncFailedMessage: \"Penyegerakan gagal.\",\n stalePrunedMessage: \"Item yang tidak tersedia dibuang.\",\n undo: \"Buat asal\",\n undoAvailable: \"Item dibuang. Buat asal?\",\n selectionScope: \"Skop pilihan\",\n currentPage: \"Halaman semasa\",\n searchResults: \"Hasil carian semasa\",\n allItems: \"Semua item yang disimpan\",\n localVersion: \"Tempatan\",\n remoteVersion: \"Pelayan\",\n updatedAt: \"Dikemas kini\",\n statusAvailable: \"Tersedia\",\n noteSavedMessage: \"Nota disimpan.\",\n exportData: \"Eksport JSON\",\n importData: \"Import JSON\",\n importMode: \"Mod import\",\n merge: \"Gabung\",\n replace: \"Ganti\",\n importedCount: \"item diimport\",\n failedCount: \"item gagal\",\n storageQuotaError: \"Storan penuh. Kosongkan ruang dan cuba lagi.\",\n statusExpired: \"Tamat tempoh\",\n statusRemoved: \"Dibuang\",\n statusDeleted: \"Dipadam\",\n statusPrivate: \"Peribadi\",\n statusUnknown: \"Tidak tersedia\",\n retry: \"Cuba lagi\",\n removeFromList: \"Buang daripada senarai\",\n pruneStale: \"Buang item yang tidak tersedia\",\n retrySync: \"Cuba penyegerakan lagi\",\n resolveSync: \"Selesaikan konflik\",\n keepLocal: \"Kekalkan versi setempat\",\n useServer: \"Gunakan versi pelayan\",\n manualMerge: \"Gabung secara manual\",\n close: \"Tutup\",\n backupRecovery: \"Pulihkan daripada sandaran\",\n backupRecoveryDescription: \"Jika data penyegerakan setempat rosak, pulihkan sandaran JSON yang sah.\",\n syncPending: \"Terdapat perubahan yang menunggu penyegerakan.\",\n syncSynced: \"Semua perubahan telah disegerakkan.\",\n syncConflict: \"Sesetengah perubahan memerlukan penyelesaian konflik.\",\n archiveScope: \"Skop arkib\",\n archiveScopeActive: \"Aktif\",\n archiveScopeArchived: \"Diarkibkan\",\n archiveScopeAll: \"Semua item\",\n undoReorder: \"Buat asal susunan\",\n};\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const PT_BR_LABELS: KeepUiLocaleLabels = {\n archive: \"Arquivar\",\n unarchive: \"Desarquivar\",\n archived: \"Arquivado\",\n pin: \"Fixar\",\n unpin: \"Desafixar\",\n pinned: \"Fixado\",\n collection: \"Coleção\",\n allCollections: \"Todas as coleções\",\n filterCollections: \"Filtrar por coleção\",\n uncategorized: \"Sem categoria\",\n saveWithNote: \"Salvar com nota\",\n editSavedItem: \"Editar item salvo\",\n unsavedChanges: \"Alterações não salvas\",\n save: \"Salvar\",\n saved: \"Salvo\",\n remove: \"Remover\",\n loading: \"Carregando…\",\n saving: \"Salvando…\",\n syncing: \"Sincronizando…\",\n error: \"Ocorreu um erro.\",\n allTags: \"Todos\",\n tags: \"Tags\",\n filterTags: \"Filtrar itens salvos por tag\",\n activeFilters: \"Filtros ativos\",\n clearFilters: \"Limpar filtros\",\n clearAllFilters: \"Limpar todos os filtros\",\n removeFilter: \"remover\",\n noFilteredItems: \"Nenhum item correspondente encontrado.\",\n noFilteredItemsDescription: \"Ajuste sua busca ou remova um filtro de tag.\",\n emptyStorageDescription: \"Salve um item para vê-lo aqui.\",\n note: \"Nota\",\n saveNote: \"Salvar nota\",\n noItems: \"Nenhum item salvo.\",\n loadingItems: \"Carregando itens salvos…\",\n errorItems: \"Não foi possível carregar os itens salvos.\",\n search: \"Pesquisar itens salvos\",\n sort: \"Ordenar itens salvos\",\n newest: \"Mais recentes primeiro\",\n oldest: \"Mais antigos primeiro\",\n savedNewest: \"Salvos mais recentemente primeiro\",\n savedOldest: \"Salvos há mais tempo primeiro\",\n updatedNewest: \"Atualizados mais recentemente primeiro\",\n updatedOldest: \"Atualizados há mais tempo primeiro\",\n previousPage: \"Página anterior\",\n nextPage: \"Próxima página\",\n pagination: \"Paginação\",\n page: \"Página\",\n selectItems: \"Selecionar itens salvos\",\n selectedCount: \"selecionados\",\n deleteSelected: \"Excluir selecionados\",\n tagsToApply: \"Tags a aplicar\",\n applyTags: \"Aplicar tags\",\n savedMessage: \"Item salvo.\",\n removedMessage: \"Item removido.\",\n restoredMessage: \"Item restaurado.\",\n syncFailedMessage: \"Falha na sincronização.\",\n stalePrunedMessage: \"Itens indisponíveis removidos.\",\n undo: \"Desfazer\",\n undoAvailable: \"Item removido. Desfazer?\",\n selectionScope: \"Escopo da seleção\",\n currentPage: \"Página atual\",\n searchResults: \"Resultados da pesquisa atual\",\n allItems: \"Todos os itens salvos\",\n localVersion: \"Local\",\n remoteVersion: \"Servidor\",\n updatedAt: \"Atualizado\",\n statusAvailable: \"Disponível\",\n noteSavedMessage: \"Nota salva.\",\n exportData: \"Exportar JSON\",\n importData: \"Importar JSON\",\n importMode: \"Modo de importação\",\n merge: \"Mesclar\",\n replace: \"Substituir\",\n importedCount: \"itens importados\",\n failedCount: \"itens com falha\",\n storageQuotaError: \"O armazenamento está cheio. Libere espaço e tente novamente.\",\n statusExpired: \"Expirado\",\n statusRemoved: \"Removido\",\n statusDeleted: \"Excluído\",\n statusPrivate: \"Privado\",\n statusUnknown: \"Indisponível\",\n retry: \"Tentar novamente\",\n removeFromList: \"Remover da lista\",\n pruneStale: \"Remover itens indisponíveis\",\n retrySync: \"Tentar sincronizar novamente\",\n resolveSync: \"Resolver conflitos\",\n keepLocal: \"Manter versão local\",\n useServer: \"Usar versão do servidor\",\n manualMerge: \"Mesclagem manual\",\n close: \"Fechar\",\n backupRecovery: \"Restaurar do backup\",\n backupRecoveryDescription: \"Se os dados locais estiverem corrompidos, restaure um backup JSON válido.\",\n syncPending: \"Há alterações aguardando sincronização.\",\n syncSynced: \"Todas as alterações foram sincronizadas.\",\n syncConflict: \"Algumas alterações precisam de resolução de conflito.\",\n archiveScope: \"Escopo do arquivo\",\n archiveScopeActive: \"Ativos\",\n archiveScopeArchived: \"Arquivados\",\n archiveScopeAll: \"Todos os itens\",\n undoReorder: \"Desfazer reordenação\",\n};\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const RU_LABELS: KeepUiLocaleLabels = {\n archive: \"Архивировать\",\n unarchive: \"Разархивировать\",\n archived: \"В архиве\",\n pin: \"Закрепить\",\n unpin: \"Открепить\",\n pinned: \"Закреплено\",\n collection: \"Коллекция\",\n allCollections: \"Все коллекции\",\n filterCollections: \"Фильтр коллекций\",\n uncategorized: \"Без категории\",\n saveWithNote: \"Сохранить с заметкой\",\n editSavedItem: \"Редактировать сохранённый элемент\",\n unsavedChanges: \"Несохранённые изменения\",\n save: \"Сохранить\",\n saved: \"Сохранено\",\n remove: \"Удалить\",\n loading: \"Загрузка…\",\n saving: \"Сохранение…\",\n syncing: \"Синхронизация…\",\n error: \"Произошла ошибка.\",\n allTags: \"Все\",\n tags: \"Теги\",\n filterTags: \"Фильтровать сохранённые элементы по тегу\",\n activeFilters: \"Активные фильтры\",\n clearFilters: \"Очистить фильтры\",\n clearAllFilters: \"Очистить все фильтры\",\n removeFilter: \"удалить\",\n noFilteredItems: \"Подходящие элементы не найдены.\",\n noFilteredItemsDescription: \"Измените поиск или удалите фильтр тега.\",\n emptyStorageDescription: \"Сохраните элемент, чтобы увидеть его здесь.\",\n note: \"Заметка\",\n saveNote: \"Сохранить заметку\",\n noItems: \"Нет сохранённых элементов.\",\n loadingItems: \"Загрузка сохранённых элементов…\",\n errorItems: \"Не удалось загрузить сохранённые элементы.\",\n search: \"Поиск сохранённых элементов\",\n sort: \"Сортировка сохранённых элементов\",\n newest: \"Сначала новые\",\n oldest: \"Сначала старые\",\n savedNewest: \"Сначала недавно сохранённые\",\n savedOldest: \"Сначала давно сохранённые\",\n updatedNewest: \"Сначала недавно обновлённые\",\n updatedOldest: \"Сначала давно обновлённые\",\n previousPage: \"Предыдущая страница\",\n nextPage: \"Следующая страница\",\n pagination: \"Пагинация\",\n page: \"Страница\",\n selectItems: \"Выбрать сохранённые элементы\",\n selectedCount: \"выбрано\",\n deleteSelected: \"Удалить выбранные\",\n tagsToApply: \"Теги для применения\",\n applyTags: \"Применить теги\",\n savedMessage: \"Элемент сохранён.\",\n removedMessage: \"Элемент удалён.\",\n restoredMessage: \"Элемент восстановлен.\",\n syncFailedMessage: \"Синхронизация не выполнена.\",\n stalePrunedMessage: \"Недоступные элементы удалены.\",\n undo: \"Отменить\",\n undoAvailable: \"Элемент удалён. Отменить?\",\n selectionScope: \"Область выбора\",\n currentPage: \"Текущая страница\",\n searchResults: \"Текущие результаты поиска\",\n allItems: \"Все сохранённые элементы\",\n localVersion: \"Локальная версия\",\n remoteVersion: \"Серверная версия\",\n updatedAt: \"Обновлено\",\n statusAvailable: \"Доступен\",\n noteSavedMessage: \"Заметка сохранена.\",\n exportData: \"Экспортировать JSON\",\n importData: \"Импортировать JSON\",\n importMode: \"Режим импорта\",\n merge: \"Объединить\",\n replace: \"Заменить\",\n importedCount: \"элементов импортировано\",\n failedCount: \"элементов не удалось импортировать\",\n storageQuotaError: \"Хранилище заполнено. Освободите место и повторите попытку.\",\n statusExpired: \"Истёк срок\",\n statusRemoved: \"Удалён\",\n statusDeleted: \"Удалён навсегда\",\n statusPrivate: \"Приватный\",\n statusUnknown: \"Недоступен\",\n retry: \"Повторить\",\n removeFromList: \"Удалить из списка\",\n pruneStale: \"Удалить недоступные элементы\",\n retrySync: \"Повторить синхронизацию\",\n resolveSync: \"Разрешить конфликты\",\n keepLocal: \"Оставить локальную версию\",\n useServer: \"Использовать версию сервера\",\n manualMerge: \"Объединить вручную\",\n close: \"Закрыть\",\n backupRecovery: \"Восстановить из резервной копии\",\n backupRecoveryDescription: \"Если локальные данные синхронизации повреждены, восстановите рабочую JSON-копию.\",\n syncPending: \"Есть изменения, ожидающие синхронизации.\",\n syncSynced: \"Все изменения синхронизированы.\",\n syncConflict: \"Некоторые изменения требуют разрешения конфликта.\",\n archiveScope: \"Область архива\",\n archiveScopeActive: \"Активные\",\n archiveScopeArchived: \"В архиве\",\n archiveScopeAll: \"Все элементы\",\n undoReorder: \"Отменить сортировку\",\n};\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const TH_LABELS: KeepUiLocaleLabels = {\n archive: \"เก็บถาวร\",\n unarchive: \"ยกเลิกการเก็บถาวร\",\n archived: \"เก็บถาวรแล้ว\",\n pin: \"ปักหมุด\",\n unpin: \"เลิกปักหมุด\",\n pinned: \"ปักหมุดแล้ว\",\n collection: \"คอลเลกชัน\",\n allCollections: \"คอลเลกชันทั้งหมด\",\n filterCollections: \"กรองคอลเลกชัน\",\n uncategorized: \"ไม่มีหมวดหมู่\",\n saveWithNote: \"บันทึกพร้อมโน้ต\",\n editSavedItem: \"แก้ไขรายการที่บันทึกไว้\",\n unsavedChanges: \"มีการเปลี่ยนแปลงที่ยังไม่ได้บันทึก\",\n save: \"บันทึก\",\n saved: \"บันทึกแล้ว\",\n remove: \"ลบ\",\n loading: \"กำลังโหลด…\",\n saving: \"กำลังบันทึก…\",\n syncing: \"กำลังซิงค์…\",\n error: \"เกิดข้อผิดพลาด\",\n allTags: \"ทั้งหมด\",\n tags: \"แท็ก\",\n filterTags: \"กรองรายการที่บันทึกด้วยแท็ก\",\n activeFilters: \"ตัวกรองที่ใช้งานอยู่\",\n clearFilters: \"ล้างตัวกรอง\",\n clearAllFilters: \"ล้างตัวกรองทั้งหมด\",\n removeFilter: \"นำออก\",\n noFilteredItems: \"ไม่พบรายการที่ตรงกัน\",\n noFilteredItemsDescription: \"ลองปรับการค้นหาหรือนำตัวกรองแท็กออก\",\n emptyStorageDescription: \"บันทึกรายการเพื่อดูที่นี่\",\n note: \"บันทึกย่อ\",\n saveNote: \"บันทึกบันทึกย่อ\",\n noItems: \"ไม่มีรายการที่บันทึกไว้\",\n loadingItems: \"กำลังโหลดรายการที่บันทึก…\",\n errorItems: \"โหลดรายการที่บันทึกไม่ได้\",\n search: \"ค้นหารายการที่บันทึก\",\n sort: \"เรียงรายการที่บันทึก\",\n newest: \"ใหม่สุดก่อน\",\n oldest: \"เก่าสุดก่อน\",\n savedNewest: \"บันทึกใหม่สุดก่อน\",\n savedOldest: \"บันทึกเก่าสุดก่อน\",\n updatedNewest: \"อัปเดตใหม่สุดก่อน\",\n updatedOldest: \"อัปเดตเก่าสุดก่อน\",\n previousPage: \"หน้าก่อนหน้า\",\n nextPage: \"หน้าถัดไป\",\n pagination: \"การแบ่งหน้า\",\n page: \"หน้า\",\n selectItems: \"เลือกรายการที่บันทึก\",\n selectedCount: \"รายการที่เลือก\",\n deleteSelected: \"ลบรายการที่เลือก\",\n tagsToApply: \"แท็กที่จะใช้\",\n applyTags: \"ใช้แท็ก\",\n savedMessage: \"บันทึกรายการแล้ว\",\n removedMessage: \"ลบรายการแล้ว\",\n restoredMessage: \"กู้คืนรายการแล้ว\",\n syncFailedMessage: \"ซิงค์ไม่สำเร็จ\",\n stalePrunedMessage: \"ลบรายการที่ใช้ไม่ได้แล้ว\",\n undo: \"เลิกทำ\",\n undoAvailable: \"ลบรายการแล้ว ต้องการเลิกทำหรือไม่\",\n selectionScope: \"ขอบเขตการเลือก\",\n currentPage: \"หน้าปัจจุบัน\",\n searchResults: \"ผลการค้นหาปัจจุบัน\",\n allItems: \"รายการที่บันทึกทั้งหมด\",\n localVersion: \"ในเครื่อง\",\n remoteVersion: \"ระยะไกล\",\n updatedAt: \"อัปเดตเมื่อ\",\n statusAvailable: \"พร้อมใช้งาน\",\n noteSavedMessage: \"บันทึกย่อแล้ว\",\n exportData: \"ส่งออก JSON\",\n importData: \"นำเข้า JSON\",\n importMode: \"โหมดนำเข้า\",\n merge: \"รวม\",\n replace: \"แทนที่\",\n importedCount: \"รายการนำเข้าแล้ว\",\n failedCount: \"รายการล้มเหลว\",\n storageQuotaError: \"พื้นที่จัดเก็บเต็ม โปรดเพิ่มพื้นที่แล้วลองอีกครั้ง\",\n statusExpired: \"หมดอายุ\",\n statusRemoved: \"นำออกแล้ว\",\n statusDeleted: \"ลบแล้ว\",\n statusPrivate: \"เป็นส่วนตัว\",\n statusUnknown: \"ไม่พร้อมใช้งาน\",\n retry: \"ลองใหม่\",\n removeFromList: \"ลบออกจากรายการ\",\n pruneStale: \"ลบรายการที่ใช้งานไม่ได้\",\n retrySync: \"ลองซิงค์ใหม่\",\n resolveSync: \"แก้ไขข้อขัดแย้ง\",\n keepLocal: \"ใช้เวอร์ชันในเครื่อง\",\n useServer: \"ใช้เวอร์ชันเซิร์ฟเวอร์\",\n manualMerge: \"รวมด้วยตนเอง\",\n close: \"ปิด\",\n backupRecovery: \"กู้คืนจากข้อมูลสำรอง\",\n backupRecoveryDescription: \"หากข้อมูลซิงค์ในเครื่องเสียหาย ให้กู้คืนจากข้อมูลสำรอง JSON ที่ใช้งานได้\",\n syncPending: \"มีการเปลี่ยนแปลงที่รอการซิงค์\",\n syncSynced: \"ซิงค์การเปลี่ยนแปลงทั้งหมดแล้ว\",\n syncConflict: \"มีการเปลี่ยนแปลงที่ต้องแก้ไขข้อขัดแย้ง\",\n archiveScope: \"ขอบเขตการเก็บถาวร\",\n archiveScopeActive: \"ใช้งานอยู่\",\n archiveScopeArchived: \"เก็บถาวรแล้ว\",\n archiveScopeAll: \"รายการทั้งหมด\",\n undoReorder: \"เลิกทำการจัดเรียง\",\n};\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const VI_LABELS: KeepUiLocaleLabels = {\n archive: \"Lưu trữ\",\n unarchive: \"Bỏ lưu trữ\",\n archived: \"Đã lưu trữ\",\n pin: \"Ghim\",\n unpin: \"Bỏ ghim\",\n pinned: \"Đã ghim\",\n collection: \"Bộ sưu tập\",\n allCollections: \"Tất cả bộ sưu tập\",\n filterCollections: \"Lọc theo bộ sưu tập\",\n uncategorized: \"Chưa phân loại\",\n saveWithNote: \"Lưu kèm ghi chú\",\n editSavedItem: \"Chỉnh sửa mục đã lưu\",\n unsavedChanges: \"Thay đổi chưa được lưu\",\n save: \"Lưu\",\n saved: \"Đã lưu\",\n remove: \"Xóa\",\n loading: \"Đang tải…\",\n saving: \"Đang lưu…\",\n syncing: \"Đang đồng bộ…\",\n error: \"Đã xảy ra lỗi.\",\n allTags: \"Tất cả\",\n tags: \"Thẻ\",\n filterTags: \"Lọc mục đã lưu theo thẻ\",\n activeFilters: \"Bộ lọc đang dùng\",\n clearFilters: \"Xóa bộ lọc\",\n clearAllFilters: \"Xóa tất cả bộ lọc\",\n removeFilter: \"xóa\",\n noFilteredItems: \"Không tìm thấy mục phù hợp.\",\n noFilteredItemsDescription: \"Hãy điều chỉnh tìm kiếm hoặc xóa bộ lọc thẻ.\",\n emptyStorageDescription: \"Lưu một mục để xem mục đó tại đây.\",\n note: \"Ghi chú\",\n saveNote: \"Lưu ghi chú\",\n noItems: \"Chưa có mục nào được lưu.\",\n loadingItems: \"Đang tải các mục đã lưu…\",\n errorItems: \"Không thể tải các mục đã lưu.\",\n search: \"Tìm kiếm mục đã lưu\",\n sort: \"Sắp xếp mục đã lưu\",\n newest: \"Mới nhất trước\",\n oldest: \"Cũ nhất trước\",\n savedNewest: \"Lưu gần đây nhất trước\",\n savedOldest: \"Lưu lâu nhất trước\",\n updatedNewest: \"Cập nhật gần đây nhất trước\",\n updatedOldest: \"Cập nhật lâu nhất trước\",\n previousPage: \"Trang trước\",\n nextPage: \"Trang sau\",\n pagination: \"Phân trang\",\n page: \"Trang\",\n selectItems: \"Chọn mục đã lưu\",\n selectedCount: \"đã chọn\",\n deleteSelected: \"Xóa mục đã chọn\",\n tagsToApply: \"Thẻ cần áp dụng\",\n applyTags: \"Áp dụng thẻ\",\n savedMessage: \"Đã lưu mục.\",\n removedMessage: \"Đã xóa mục.\",\n restoredMessage: \"Đã khôi phục mục.\",\n syncFailedMessage: \"Đồng bộ không thành công.\",\n stalePrunedMessage: \"Đã xóa các mục không khả dụng.\",\n undo: \"Hoàn tác\",\n undoAvailable: \"Đã xóa mục. Hoàn tác?\",\n selectionScope: \"Phạm vi lựa chọn\",\n currentPage: \"Trang hiện tại\",\n searchResults: \"Kết quả tìm kiếm hiện tại\",\n allItems: \"Tất cả mục đã lưu\",\n localVersion: \"Cục bộ\",\n remoteVersion: \"Máy chủ\",\n updatedAt: \"Đã cập nhật\",\n statusAvailable: \"Khả dụng\",\n noteSavedMessage: \"Đã lưu ghi chú.\",\n exportData: \"Xuất JSON\",\n importData: \"Nhập JSON\",\n importMode: \"Chế độ nhập\",\n merge: \"Hợp nhất\",\n replace: \"Thay thế\",\n importedCount: \"mục đã nhập\",\n failedCount: \"mục bị lỗi\",\n storageQuotaError: \"Bộ nhớ đã đầy. Hãy giải phóng dung lượng rồi thử lại.\",\n statusExpired: \"Đã hết hạn\",\n statusRemoved: \"Đã gỡ\",\n statusDeleted: \"Đã xóa\",\n statusPrivate: \"Riêng tư\",\n statusUnknown: \"Không khả dụng\",\n retry: \"Thử lại\",\n removeFromList: \"Xóa khỏi danh sách\",\n pruneStale: \"Xóa các mục không khả dụng\",\n retrySync: \"Thử đồng bộ lại\",\n resolveSync: \"Giải quyết xung đột\",\n keepLocal: \"Giữ bản cục bộ\",\n useServer: \"Dùng bản máy chủ\",\n manualMerge: \"Gộp thủ công\",\n close: \"Đóng\",\n backupRecovery: \"Khôi phục từ bản sao lưu\",\n backupRecoveryDescription: \"Nếu dữ liệu đồng bộ cục bộ bị hỏng, hãy khôi phục bản sao lưu JSON hợp lệ.\",\n syncPending: \"Có thay đổi đang chờ đồng bộ.\",\n syncSynced: \"Tất cả thay đổi đã được đồng bộ.\",\n syncConflict: \"Một số thay đổi cần giải quyết xung đột.\",\n archiveScope: \"Phạm vi lưu trữ\",\n archiveScopeActive: \"Đang hoạt động\",\n archiveScopeArchived: \"Đã lưu trữ\",\n archiveScopeAll: \"Tất cả mục\",\n undoReorder: \"Hoàn tác sắp xếp\",\n};\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const ZH_HANS_LABELS: KeepUiLocaleLabels = {\n archive: \"归档\",\n unarchive: \"取消归档\",\n archived: \"已归档\",\n pin: \"置顶\",\n unpin: \"取消置顶\",\n pinned: \"已置顶\",\n collection: \"集合\",\n allCollections: \"所有集合\",\n filterCollections: \"按集合筛选\",\n uncategorized: \"未分类\",\n saveWithNote: \"保存并添加备注\",\n editSavedItem: \"编辑已保存项目\",\n unsavedChanges: \"有未保存的更改\",\n save: \"保存\",\n saved: \"已保存\",\n remove: \"删除\",\n loading: \"加载中…\",\n saving: \"保存中…\",\n syncing: \"同步中…\",\n error: \"发生错误。\",\n allTags: \"全部\",\n tags: \"标签\",\n filterTags: \"按标签筛选已保存项目\",\n activeFilters: \"当前筛选条件\",\n clearFilters: \"清除筛选\",\n clearAllFilters: \"清除所有筛选条件\",\n removeFilter: \"移除\",\n noFilteredItems: \"未找到匹配项目。\",\n noFilteredItemsDescription: \"请调整搜索条件或移除标签筛选。\",\n emptyStorageDescription: \"保存项目后会显示在这里。\",\n note: \"备注\",\n saveNote: \"保存备注\",\n noItems: \"没有已保存的项目。\",\n loadingItems: \"正在加载已保存项目…\",\n errorItems: \"无法加载已保存项目。\",\n search: \"搜索已保存项目\",\n sort: \"排序已保存项目\",\n newest: \"最新优先\",\n oldest: \"最早优先\",\n savedNewest: \"保存时间最新优先\",\n savedOldest: \"保存时间最早优先\",\n updatedNewest: \"更新时间最新优先\",\n updatedOldest: \"更新时间最早优先\",\n previousPage: \"上一页\",\n nextPage: \"下一页\",\n pagination: \"分页\",\n page: \"页\",\n selectItems: \"选择已保存项目\",\n selectedCount: \"项已选择\",\n deleteSelected: \"删除所选项目\",\n tagsToApply: \"要应用的标签\",\n applyTags: \"应用标签\",\n savedMessage: \"项目已保存。\",\n removedMessage: \"项目已删除。\",\n restoredMessage: \"项目已恢复。\",\n syncFailedMessage: \"同步失败。\",\n stalePrunedMessage: \"不可用项目已删除。\",\n undo: \"撤销\",\n undoAvailable: \"项目已删除。要撤销吗?\",\n selectionScope: \"选择范围\",\n currentPage: \"当前页\",\n searchResults: \"当前全部搜索结果\",\n allItems: \"全部已保存项目\",\n localVersion: \"本地\",\n remoteVersion: \"远程\",\n updatedAt: \"更新时间\",\n statusAvailable: \"可用\",\n noteSavedMessage: \"备注已保存。\",\n exportData: \"导出JSON\",\n importData: \"导入JSON\",\n importMode: \"导入方式\",\n merge: \"合并\",\n replace: \"替换\",\n importedCount: \"项已导入\",\n failedCount: \"项失败\",\n storageQuotaError: \"存储空间已满。请释放空间后重试。\",\n statusExpired: \"已过期\",\n statusRemoved: \"已移除\",\n statusDeleted: \"已删除\",\n statusPrivate: \"不公开\",\n statusUnknown: \"不可用\",\n retry: \"重试\",\n removeFromList: \"从列表中删除\",\n pruneStale: \"删除不可用项目\",\n retrySync: \"重试同步\",\n resolveSync: \"解决冲突\",\n keepLocal: \"保留本地版本\",\n useServer: \"使用服务器版本\",\n manualMerge: \"手动合并\",\n close: \"关闭\",\n backupRecovery: \"从备份恢复\",\n backupRecoveryDescription: \"如果本地同步数据损坏,请恢复可用的 JSON 备份。\",\n syncPending: \"有更改等待同步。\",\n syncSynced: \"所有更改均已同步。\",\n syncConflict: \"有些更改需要解决冲突。\",\n archiveScope: \"归档范围\",\n archiveScopeActive: \"保存中\",\n archiveScopeArchived: \"已归档\",\n archiveScopeAll: \"全部项目\",\n undoReorder: \"撤销排序\",\n};\n","import type { KeepUiLocaleLabels } from \"./types\";\n\nexport const ZH_HANT_LABELS: KeepUiLocaleLabels = {\n archive: \"封存\",\n unarchive: \"取消封存\",\n archived: \"已封存\",\n pin: \"釘選\",\n unpin: \"取消釘選\",\n pinned: \"已釘選\",\n collection: \"收藏集\",\n allCollections: \"所有收藏集\",\n filterCollections: \"依收藏集篩選\",\n uncategorized: \"未分類\",\n saveWithNote: \"儲存並加備註\",\n editSavedItem: \"編輯已儲存項目\",\n unsavedChanges: \"有未儲存的變更\",\n save: \"儲存\",\n saved: \"已儲存\",\n remove: \"刪除\",\n loading: \"載入中…\",\n saving: \"儲存中…\",\n syncing: \"同步中…\",\n error: \"發生錯誤。\",\n allTags: \"全部\",\n tags: \"標籤\",\n filterTags: \"依標籤篩選已儲存項目\",\n activeFilters: \"目前篩選條件\",\n clearFilters: \"清除篩選\",\n clearAllFilters: \"清除所有篩選條件\",\n removeFilter: \"移除\",\n noFilteredItems: \"找不到相符項目。\",\n noFilteredItemsDescription: \"請調整搜尋條件或移除標籤篩選。\",\n emptyStorageDescription: \"儲存項目後會顯示在這裡。\",\n note: \"備註\",\n saveNote: \"儲存備註\",\n noItems: \"沒有已儲存的項目。\",\n loadingItems: \"正在載入已儲存項目…\",\n errorItems: \"無法載入已儲存項目。\",\n search: \"搜尋已儲存項目\",\n sort: \"排序已儲存項目\",\n newest: \"最新優先\",\n oldest: \"最早優先\",\n savedNewest: \"儲存時間最新優先\",\n savedOldest: \"儲存時間最早優先\",\n updatedNewest: \"更新時間最新優先\",\n updatedOldest: \"更新時間最早優先\",\n previousPage: \"上一頁\",\n nextPage: \"下一頁\",\n pagination: \"分頁\",\n page: \"頁\",\n selectItems: \"選取已儲存項目\",\n selectedCount: \"項已選取\",\n deleteSelected: \"刪除所選項目\",\n tagsToApply: \"要套用的標籤\",\n applyTags: \"套用標籤\",\n savedMessage: \"項目已儲存。\",\n removedMessage: \"項目已刪除。\",\n restoredMessage: \"項目已還原。\",\n syncFailedMessage: \"同步失敗。\",\n stalePrunedMessage: \"無法使用的項目已刪除。\",\n undo: \"復原\",\n undoAvailable: \"項目已刪除。要復原嗎?\",\n selectionScope: \"選取範圍\",\n currentPage: \"目前頁面\",\n searchResults: \"目前全部搜尋結果\",\n allItems: \"所有已儲存項目\",\n localVersion: \"本機\",\n remoteVersion: \"遠端\",\n updatedAt: \"更新時間\",\n statusAvailable: \"可用\",\n noteSavedMessage: \"備註已儲存。\",\n exportData: \"匯出JSON\",\n importData: \"匯入JSON\",\n importMode: \"匯入方式\",\n merge: \"合併\",\n replace: \"取代\",\n importedCount: \"項已匯入\",\n failedCount: \"項失敗\",\n storageQuotaError: \"儲存空間已滿。請釋放空間後重試。\",\n statusExpired: \"已過期\",\n statusRemoved: \"已移除\",\n statusDeleted: \"已刪除\",\n statusPrivate: \"不公開\",\n statusUnknown: \"無法使用\",\n retry: \"重試\",\n removeFromList: \"從清單中刪除\",\n pruneStale: \"刪除無法使用的項目\",\n retrySync: \"重試同步\",\n resolveSync: \"解決衝突\",\n keepLocal: \"保留本機版本\",\n useServer: \"使用伺服器版本\",\n manualMerge: \"手動合併\",\n close: \"關閉\",\n backupRecovery: \"從備份還原\",\n backupRecoveryDescription: \"如果本機同步資料損毀,請還原可用的 JSON 備份。\",\n syncPending: \"有變更等待同步。\",\n syncSynced: \"所有變更都已同步。\",\n syncConflict: \"有些變更需要解決衝突。\",\n archiveScope: \"封存範圍\",\n archiveScopeActive: \"保存中\",\n archiveScopeArchived: \"已封存\",\n archiveScopeAll: \"所有項目\",\n undoReorder: \"復原排序\",\n};\n","import { DE_LABELS } from \"./de\";\nimport { EN_LABELS } from \"./en\";\nimport { ES_LABELS } from \"./es\";\nimport { FIL_LABELS } from \"./fil\";\nimport { FR_LABELS } from \"./fr\";\nimport { ID_LABELS } from \"./id\";\nimport { IT_LABELS } from \"./it\";\nimport { JA_LABELS } from \"./ja\";\nimport { KO_LABELS } from \"./ko\";\nimport { MS_LABELS } from \"./ms\";\nimport { PT_BR_LABELS } from \"./pt-BR\";\nimport { RU_LABELS } from \"./ru\";\nimport { TH_LABELS } from \"./th\";\nimport type { KeepUiLocaleLabels } from \"./types\";\nimport { VI_LABELS } from \"./vi\";\nimport { ZH_HANS_LABELS } from \"./zh-Hans\";\nimport { ZH_HANT_LABELS } from \"./zh-Hant\";\n\nexport const KEEP_BUILT_IN_LOCALES = [\n \"en\",\n \"ja\",\n \"ko\",\n \"zh-Hans\",\n \"zh-Hant\",\n \"th\",\n \"fr\",\n \"es\",\n \"pt-BR\",\n \"it\",\n \"de\",\n \"ru\",\n \"fil\",\n \"vi\",\n \"id\",\n \"ms\",\n] as const;\n\nexport type KeepUiLocale = (typeof KEEP_BUILT_IN_LOCALES)[number];\n\nexport const KEEP_LOCALE_LABELS: Record<KeepUiLocale, KeepUiLocaleLabels> = {\n en: EN_LABELS,\n ja: JA_LABELS,\n ko: KO_LABELS,\n \"zh-Hans\": ZH_HANS_LABELS,\n \"zh-Hant\": ZH_HANT_LABELS,\n th: TH_LABELS,\n fr: FR_LABELS,\n es: ES_LABELS,\n \"pt-BR\": PT_BR_LABELS,\n it: IT_LABELS,\n de: DE_LABELS,\n ru: RU_LABELS,\n fil: FIL_LABELS,\n vi: VI_LABELS,\n id: ID_LABELS,\n ms: MS_LABELS,\n};\n\nconst LOCALE_ALIASES: Record<string, KeepUiLocale> = {\n \"zh-cn\": \"zh-Hans\",\n \"zh-sg\": \"zh-Hans\",\n zh: \"zh-Hans\",\n \"zh-tw\": \"zh-Hant\",\n \"zh-hk\": \"zh-Hant\",\n \"zh-mo\": \"zh-Hant\",\n \"pt-pt\": \"pt-BR\",\n};\n\nexport function normalizeKeepLocale(locale?: string): KeepUiLocale {\n const normalized = locale?.trim().replace(/_/g, \"-\").toLowerCase() ?? \"en\";\n const exact = KEEP_BUILT_IN_LOCALES.find((candidate) => candidate.toLowerCase() === normalized);\n if (exact) return exact;\n if (LOCALE_ALIASES[normalized]) return LOCALE_ALIASES[normalized];\n const language = normalized.split(\"-\")[0];\n const languageMatch = KEEP_BUILT_IN_LOCALES.find((candidate) => candidate.toLowerCase() === language);\n return languageMatch ?? \"en\";\n}\n\nexport function getKeepLocaleLabels(locale?: string): KeepUiLocaleLabels {\n return { ...KEEP_LOCALE_LABELS[normalizeKeepLocale(locale)] };\n}\n","import type { ImportItemsResult } from \"@keepkit/core/core\";\nimport { useKeepContext } from \"@keepkit/core/react\";\nimport type { ChangeEvent } from \"react\";\nimport { useRef, useState } from \"react\";\nimport { useUiLabel } from \"../../../foundation/ui-context\";\n\ntype KeepBackupOptions<TMeta> = {\n filename: string;\n onExport: ((data: string) => void) | undefined;\n onImported: ((result: ImportItemsResult<TMeta>) => void) | undefined;\n};\n\nexport function useKeepBackup<TMeta>({ filename, onExport, onImported }: KeepBackupOptions<TMeta>) {\n const context = useKeepContext<TMeta>();\n const inputRef = useRef<HTMLInputElement>(null);\n const [mode, setMode] = useState<\"merge\" | \"replace\">(\"merge\");\n const [result, setResult] = useState<ImportItemsResult<TMeta>>();\n const [error, setError] = useState<unknown>();\n\n async function exportBackup() {\n setError(undefined);\n try {\n const data = await context.exportBackup();\n onExport?.(data);\n if (typeof document === \"undefined\") return;\n const url = URL.createObjectURL(new Blob([data], { type: \"application/json\" }));\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = filename;\n anchor.click();\n URL.revokeObjectURL(url);\n } catch (cause) {\n setError(cause);\n }\n }\n\n async function importBackup(event: ChangeEvent<HTMLInputElement>) {\n const file = event.currentTarget.files?.[0];\n event.currentTarget.value = \"\";\n if (!file) return;\n setError(undefined);\n setResult(undefined);\n try {\n const imported = await context.importBackup(await file.text(), { mode });\n setResult(imported);\n onImported?.(imported);\n } catch (cause) {\n setError(cause);\n }\n }\n\n return {\n inputRef,\n mode,\n setMode,\n result,\n error,\n isMutating: context.isMutating,\n exportBackup,\n importBackup,\n openFilePicker: () => inputRef.current?.click(),\n labels: {\n export: useUiLabel(\"exportData\"),\n import: useUiLabel(\"importData\"),\n importMode: useUiLabel(\"importMode\"),\n merge: useUiLabel(\"merge\"),\n replace: useUiLabel(\"replace\"),\n importedCount: useUiLabel(\"importedCount\"),\n failedCount: useUiLabel(\"failedCount\"),\n quotaError: useUiLabel(\"storageQuotaError\"),\n },\n };\n}\n","\"use client\";\n\nimport type { ImportItemsResult } from \"@keepkit/core/core\";\nimport type { HTMLAttributes } from \"react\";\nimport { useKeepBackup } from \"./hooks/useKeepBackup\";\n\nexport type KeepBackupProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n filename?: string;\n onExport?: (data: string) => void;\n onImported?: (result: ImportItemsResult<TMeta>) => void;\n};\n\n/** Accessible JSON backup controls backed by the current KeepProvider storage. */\nexport function KeepBackup<TMeta = Record<string, unknown>>({\n filename = \"keepkit-backup.json\",\n onExport,\n onImported,\n ...props\n}: KeepBackupProps<TMeta>) {\n const view = useKeepBackup<TMeta>({ filename, onExport, onImported });\n\n return (\n <section\n {...props}\n data-keepkit=\"backup\"\n data-state={view.error ? \"error\" : view.result ? \"complete\" : \"idle\"}\n data-loading={view.isMutating ? \"true\" : undefined}\n >\n <button\n type=\"button\"\n data-keep-action=\"export-backup\"\n onClick={() => void view.exportBackup()}\n disabled={view.isMutating}\n >\n {view.labels.export}\n </button>\n <label>\n {view.labels.importMode}\n <select\n data-keep-action=\"select-import-mode\"\n value={view.mode}\n onChange={(event) => view.setMode(event.currentTarget.value as \"merge\" | \"replace\")}\n >\n <option value=\"merge\">{view.labels.merge}</option>\n <option value=\"replace\">{view.labels.replace}</option>\n </select>\n </label>\n <button type=\"button\" data-keep-action=\"import-backup\" onClick={view.openFilePicker} disabled={view.isMutating}>\n {view.labels.import}\n </button>\n <input\n ref={view.inputRef}\n type=\"file\"\n data-keep-action=\"select-backup-file\"\n accept=\"application/json,.json\"\n aria-label={view.labels.import}\n onChange={(event) => void view.importBackup(event)}\n />\n {view.result ? (\n <p role=\"status\">\n {view.result.imported} {view.labels.importedCount}; {view.result.failed} {view.labels.failedCount}\n </p>\n ) : null}\n {view.error ? (\n <p role=\"alert\">{isQuotaError(view.error) ? view.labels.quotaError : getErrorMessage(view.error)}</p>\n ) : null}\n </section>\n );\n}\n\nfunction isQuotaError(error: unknown): boolean {\n if (error instanceof Error && error.name === \"KeepStorageQuotaError\") return true;\n if (error && typeof error === \"object\" && \"cause\" in error) return isQuotaError(error.cause);\n return false;\n}\n\nfunction getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : \"Something went wrong.\";\n}\n","\"use client\";\n\nimport type { KeepItem, KeepItemInput, KeepListQuery } from \"@keepkit/core/core\";\nimport {\n type ComponentType,\n cloneElement,\n createContext,\n type HTMLAttributes,\n type ImgHTMLAttributes,\n isValidElement,\n type ReactElement,\n type ReactNode,\n type Ref,\n type RefCallback,\n useContext,\n useMemo,\n} from \"react\";\n\nexport type RenderProp<TState> = (state: TState) => ReactNode;\n\nconst KeepSearchQueryContext = createContext<string | undefined>(undefined);\n\ntype KeepSearchQueryProviderProps = {\n query: string | undefined;\n children: ReactNode;\n};\n\nexport function KeepSearchQueryProvider({ query, children }: KeepSearchQueryProviderProps) {\n return <KeepSearchQueryContext.Provider value={query}>{children}</KeepSearchQueryContext.Provider>;\n}\n\nexport function useKeepSearchQuery(): string | undefined {\n return useContext(KeepSearchQueryContext);\n}\n\nexport type KeepHighlightProps = {\n children?: ReactNode;\n query?: string;\n};\n\n/** Wraps case-insensitive, literal query matches in a style-free mark element. */\nexport function KeepHighlight({ children, query }: KeepHighlightProps): ReactNode {\n const contextQuery = useKeepSearchQuery();\n const resolvedQuery = query ?? contextQuery;\n const normalizedQuery = resolvedQuery?.trim() ?? \"\";\n return useMemo(() => {\n if (typeof children !== \"string\" || !normalizedQuery) return children ?? null;\n return highlightText(children, normalizedQuery);\n }, [children, normalizedQuery]);\n}\n\nexport function highlightText(text: string, query: string): ReactNode {\n const normalizedQuery = query.trim();\n if (!normalizedQuery) return text;\n const matcher = new RegExp(escapeRegExp(normalizedQuery), \"gi\");\n const parts: ReactNode[] = [];\n let lastIndex = 0;\n let matchIndex = 0;\n\n while (true) {\n const match = matcher.exec(text);\n if (match === null) break;\n const index = match.index;\n if (index > lastIndex) parts.push(text.slice(lastIndex, index));\n parts.push(\n <mark key={`highlight-${matchIndex}`} className=\"keep-highlight\" data-highlight=\"true\">\n {match[0]}\n </mark>,\n );\n lastIndex = index + match[0].length;\n matchIndex += 1;\n }\n if (lastIndex === 0) return text;\n if (lastIndex < text.length) parts.push(text.slice(lastIndex));\n return <>{parts}</>;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nexport type KeepButtonLabels = {\n saved?: ReactNode;\n unsaved?: ReactNode;\n loading?: ReactNode;\n error?: ReactNode;\n savedAriaLabel?: string;\n unsavedAriaLabel?: string;\n};\n\nexport type KeepButtonIconProps = { \"aria-hidden\"?: boolean; className?: string };\nexport type KeepButtonIcon = ReactNode | ComponentType<KeepButtonIconProps>;\nexport type KeepButtonIcons = {\n save?: KeepButtonIcon;\n saved?: KeepButtonIcon;\n remove?: KeepButtonIcon;\n loading?: KeepButtonIcon;\n error?: KeepButtonIcon;\n};\n\nexport type KeepImageProps = ImgHTMLAttributes<HTMLImageElement> & {\n src: string;\n alt: string;\n};\n\nexport function toKeepButtonItem<TMeta>(item: KeepItem<TMeta>): KeepItemInput<TMeta> {\n return {\n id: item.id,\n meta: item.meta,\n targetType: item.targetType,\n note: item.note,\n tags: item.tags,\n archived: item.archived,\n pinned: item.pinned,\n collectionId: item.collectionId,\n };\n}\n\nexport function getMetaTitle<TMeta>(meta: TMeta): string | undefined {\n if (typeof meta !== \"object\" || meta === null || !(\"title\" in meta)) return undefined;\n const title = (meta as { title?: unknown }).title;\n return typeof title === \"string\" && title.trim() ? title.trim() : undefined;\n}\n\nexport function normalizeUiTags(tags: string[]): string[] {\n return [...new Set(tags.map((tag) => tag.trim()).filter(Boolean))];\n}\n\nexport function sortToValue(sort: KeepListQuery[\"sort\"]): `${\"savedAt\" | \"updatedAt\"}:${\"asc\" | \"desc\"}` {\n return `${sort?.by ?? \"updatedAt\"}:${sort?.direction ?? \"desc\"}`;\n}\n\nexport function resolveContent<TState>(content: ReactNode | RenderProp<TState>, state: TState): ReactNode {\n return typeof content === \"function\" ? content(state) : content;\n}\n\ntype MergeableProps = Record<string, unknown>;\n\n/** Combines callback and object refs while preserving every ref target. */\nexport function composeRefs<T>(...refs: Array<Ref<T> | null | undefined>): RefCallback<T> {\n return (value) => {\n for (const ref of refs) {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref !== null && ref !== undefined) {\n ref.current = value;\n }\n }\n };\n}\n\n/** Chains child and component event handlers while preserving both handlers' event order. */\nexport function chainedFunction<T extends (...args: never[]) => unknown>(\n childHandler: T | undefined,\n parentHandler: T | undefined,\n): T | undefined {\n if (!childHandler) return parentHandler;\n if (!parentHandler) return childHandler;\n return ((...args: never[]) => {\n childHandler(...args);\n parentHandler(...args);\n }) as T;\n}\n\n/** Merges slot props without dropping child classes, styles, ARIA attributes, or events. */\nexport function mergeProps<T extends MergeableProps>(childProps: T, parentProps: Partial<T> & MergeableProps): T {\n const merged: MergeableProps = { ...parentProps, ...childProps };\n if (\"ref\" in childProps || \"ref\" in parentProps) {\n merged.ref = composeRefs(\n childProps.ref as Ref<never> | null | undefined,\n parentProps.ref as Ref<never> | null | undefined,\n );\n }\n const className = mergeClassNames(childProps.className, parentProps.className);\n if (className) merged.className = className;\n const style = mergeStyles(childProps.style, parentProps.style);\n if (style) merged.style = style;\n\n for (const key of Object.keys(parentProps)) {\n if (!isEventProp(key)) continue;\n const chained = chainedFunction(getHandler(childProps[key]), getHandler(parentProps[key]));\n if (chained) merged[key] = chained;\n }\n\n for (const [key, value] of Object.entries(merged)) {\n if (value === undefined && key.startsWith(\"aria-\") && childProps[key] !== undefined) {\n merged[key] = childProps[key];\n }\n }\n return merged as T;\n}\n\nfunction getHandler(value: unknown): ((...args: never[]) => unknown) | undefined {\n return typeof value === \"function\" ? (value as (...args: never[]) => unknown) : undefined;\n}\n\nfunction isEventProp(key: string): boolean {\n return key.startsWith(\"on\") && key.length > 2 && key[2] === key[2]?.toUpperCase();\n}\n\nfunction mergeClassNames(childClassName: unknown, parentClassName: unknown): string | undefined {\n const values = [childClassName, parentClassName].filter(\n (value): value is string => typeof value === \"string\" && Boolean(value),\n );\n return values.length > 0 ? values.join(\" \") : undefined;\n}\n\nfunction mergeStyles(childStyle: unknown, parentStyle: unknown): Record<string, unknown> | undefined {\n if (!childStyle && !parentStyle) return undefined;\n return {\n ...(isObject(childStyle) ? childStyle : {}),\n ...(isObject(parentStyle) ? parentStyle : {}),\n };\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nexport function createSlot(\n child: ReactElement<MergeableProps>,\n props: MergeableProps,\n body?: ReactNode,\n): ReactElement<MergeableProps> {\n const nextProps = body === undefined ? props : { ...props, children: body };\n return cloneElement(child, mergeProps(child.props, nextProps));\n}\n\nexport function renderRoot(\n asChild: boolean,\n child: ReactNode,\n props: HTMLAttributes<HTMLElement> & Record<string, unknown>,\n body: ReactNode,\n componentName: string,\n): ReactElement {\n if (asChild) {\n if (!isValidElement(child)) throw new Error(`${componentName} with asChild requires a single React element child.`);\n return createSlot(child as ReactElement<MergeableProps>, props, body);\n }\n return <div {...props}>{body}</div>;\n}\n","import type { KeepItem, KeepListQuery } from \"@keepkit/core/core\";\nimport { useKeepList } from \"@keepkit/core/react\";\nimport { useState } from \"react\";\nimport { normalizeUiTags } from \"../../../foundation/shared\";\nimport { useUiLabel } from \"../../../foundation/ui-context\";\nimport type { KeepBulkActionsState, KeepSelectionScope } from \"../KeepBulkActions\";\n\ntype KeepBulkActionsOptions<TMeta> = {\n query: KeepListQuery<TMeta> | undefined;\n controlledSelectedIds: string[] | undefined;\n defaultSelectedIds: string[];\n onSelectedIdsChange: ((ids: string[]) => void) | undefined;\n onCompleted: ((action: \"remove\" | \"tags\", ids: string[]) => void) | undefined;\n controlledScope: KeepSelectionScope | undefined;\n onSelectionScopeChange: ((scope: KeepSelectionScope) => void) | undefined;\n};\n\n/** Returns whether every visible item is selected. Empty lists are never all selected. */\nexport function isAllSelected<TMeta>(\n items: readonly Pick<KeepItem<TMeta>, \"id\">[],\n selectedIds: readonly string[],\n): boolean {\n if (items.length === 0) return false;\n const selected = new Set(selectedIds);\n return items.every((item) => selected.has(item.id));\n}\n\n/** Toggles only the visible items, preserving selections outside the current query or page. */\nexport function toggleSelectAll<TMeta>(\n items: readonly Pick<KeepItem<TMeta>, \"id\">[],\n selectedIds: readonly string[],\n): string[] {\n const visibleIds = new Set(items.map((item) => item.id));\n if (isAllSelected(items, selectedIds)) return selectedIds.filter((id) => !visibleIds.has(id));\n const nextIds = [...selectedIds];\n for (const item of items) {\n if (!nextIds.includes(item.id)) nextIds.push(item.id);\n }\n return nextIds;\n}\n\nexport function useKeepBulkActions<TMeta>(options: KeepBulkActionsOptions<TMeta>) {\n const {\n query,\n controlledSelectedIds,\n defaultSelectedIds,\n onSelectedIdsChange,\n onCompleted,\n controlledScope,\n onSelectionScopeChange,\n } = options;\n const list = useKeepList<TMeta>(query);\n const queryList = useKeepList<TMeta>(query ? { ...query, pagination: undefined } : { pagination: undefined });\n const allList = useKeepList<TMeta>({ pagination: undefined });\n const [uncontrolledScope, setUncontrolledScope] = useState<KeepSelectionScope>(controlledScope ?? \"page\");\n const selectionScope = controlledScope ?? uncontrolledScope;\n const targetItems =\n selectionScope === \"page\" ? list.items : selectionScope === \"query\" ? queryList.items : allList.items;\n const [uncontrolledSelectedIds, setUncontrolledSelectedIds] = useState(defaultSelectedIds);\n const selectedIds = controlledSelectedIds ?? uncontrolledSelectedIds;\n const selected = new Set(selectedIds);\n const [tagsInput, setTagsInput] = useState(\"\");\n\n const setSelectionScope = (scope: KeepSelectionScope) => {\n if (controlledScope === undefined) setUncontrolledScope(scope);\n onSelectionScopeChange?.(scope);\n };\n const setSelectedIds = (ids: string[]) => {\n if (controlledSelectedIds === undefined) setUncontrolledSelectedIds(ids);\n onSelectedIdsChange?.(ids);\n };\n const toggle = (id: string) =>\n setSelectedIds(selected.has(id) ? selectedIds.filter((current) => current !== id) : [...selectedIds, id]);\n const allSelected = isAllSelected(targetItems, selectedIds);\n const toggleAll = () => setSelectedIds(toggleSelectAll(targetItems, selectedIds));\n const remove = async () => {\n const ids = [...selectedIds];\n await list.removeBatchWithUndo(ids);\n onCompleted?.(\"remove\", ids);\n setSelectedIds([]);\n };\n const updateTags = async () => {\n const ids = [...selectedIds];\n await list.updateTagsBatch(ids, normalizeUiTags(tagsInput.split(\",\")));\n onCompleted?.(\"tags\", ids);\n setSelectedIds([]);\n };\n const state: KeepBulkActionsState<TMeta> = {\n items: targetItems,\n selectedIds,\n selectedCount: selectedIds.length,\n isAllSelected: allSelected,\n allSelected,\n tagsInput,\n setTagsInput,\n toggle,\n toggleSelectAll: toggleAll,\n toggleAll,\n remove,\n updateTags,\n isMutating: list.isMutating,\n selectionScope,\n setSelectionScope,\n };\n\n return {\n state,\n selected,\n isLoading: list.isLoading,\n labels: {\n selectItems: useUiLabel(\"selectItems\"),\n selectedCount: useUiLabel(\"selectedCount\"),\n deleteSelected: useUiLabel(\"deleteSelected\"),\n tags: useUiLabel(\"tagsToApply\"),\n applyTags: useUiLabel(\"applyTags\"),\n selectionScope: useUiLabel(\"selectionScope\"),\n currentPage: useUiLabel(\"currentPage\"),\n searchResults: useUiLabel(\"searchResults\"),\n allItems: useUiLabel(\"allItems\"),\n },\n };\n}\n","\"use client\";\n\nimport type { KeepItem } from \"@keepkit/core/core\";\nimport type { InputHTMLAttributes, ReactNode } from \"react\";\n\nexport type KeepItemCheckboxProps<TMeta = Record<string, unknown>> = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"type\" | \"checked\" | \"defaultChecked\" | \"onChange\"\n> & {\n item: KeepItem<TMeta>;\n checked?: boolean;\n label?: ReactNode;\n onCheckedChange?: (checked: boolean) => void;\n};\n\n/** A reusable accessible selection checkbox for a saved item. */\nexport function KeepItemCheckbox<TMeta = Record<string, unknown>>({\n item,\n checked = false,\n label,\n onCheckedChange,\n \"aria-label\": ariaLabel,\n ...props\n}: KeepItemCheckboxProps<TMeta>) {\n const itemLabel = getItemLabel(item) ?? item.id;\n const accessibleLabel = ariaLabel ?? (typeof label === \"string\" ? label : itemLabel);\n return (\n <input\n {...props}\n type=\"checkbox\"\n checked={checked}\n data-keepkit=\"item-checkbox\"\n data-keep-action=\"select-item\"\n data-state={checked ? \"checked\" : \"unchecked\"}\n data-disabled={props.disabled ? \"true\" : undefined}\n aria-label={accessibleLabel}\n onChange={(event) => onCheckedChange?.(event.currentTarget.checked)}\n />\n );\n}\n\nfunction getItemLabel<TMeta>(item: KeepItem<TMeta>): string | undefined {\n if (typeof item.meta !== \"object\" || item.meta === null || !(\"title\" in item.meta)) return undefined;\n const title = (item.meta as { title?: unknown }).title;\n return typeof title === \"string\" && title.trim() ? title.trim() : undefined;\n}\n","\"use client\";\n\nimport type { KeepItem, KeepListQuery } from \"@keepkit/core/core\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { getMetaTitle, type RenderProp } from \"../../foundation/shared\";\nimport { useKeepBulkActions } from \"./hooks/useKeepBulkActions\";\nimport { KeepItemCheckbox } from \"./KeepItemCheckbox\";\n\nexport { isAllSelected, toggleSelectAll } from \"./hooks/useKeepBulkActions\";\n\nexport type KeepBulkActionsState<TMeta = Record<string, unknown>> = {\n items: KeepItem<TMeta>[];\n selectedIds: string[];\n selectedCount: number;\n isAllSelected: boolean;\n allSelected: boolean;\n tagsInput: string;\n setTagsInput: (value: string) => void;\n toggle: (id: string) => void;\n toggleSelectAll: () => void;\n toggleAll: () => void;\n remove: () => Promise<void>;\n updateTags: () => Promise<void>;\n isMutating: boolean;\n selectionScope: KeepSelectionScope;\n setSelectionScope: (scope: KeepSelectionScope) => void;\n};\n\nexport type KeepSelectionScope = \"page\" | \"query\" | \"all\";\n\nexport type KeepBulkActionsProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n query?: KeepListQuery<TMeta>;\n selectedIds?: string[];\n defaultSelectedIds?: string[];\n onSelectedIdsChange?: (ids: string[]) => void;\n renderItem?: (item: KeepItem<TMeta>, selected: boolean) => ReactNode;\n onCompleted?: (action: \"remove\" | \"tags\", ids: string[]) => void;\n selectionScope?: KeepSelectionScope;\n onSelectionScopeChange?: (scope: KeepSelectionScope) => void;\n render?: RenderProp<KeepBulkActionsState<TMeta>>;\n children?: ReactNode | RenderProp<KeepBulkActionsState<TMeta>>;\n};\n\n/** Selects visible items and performs one storage operation for the whole selection. */\nexport function KeepBulkActions<TMeta = Record<string, unknown>>({\n query,\n selectedIds: controlledSelectedIds,\n defaultSelectedIds = [],\n onSelectedIdsChange,\n renderItem,\n onCompleted,\n selectionScope: controlledScope,\n onSelectionScopeChange,\n render,\n children,\n ...props\n}: KeepBulkActionsProps<TMeta>) {\n const { state, selected, isLoading, labels } = useKeepBulkActions<TMeta>({\n query,\n controlledSelectedIds,\n defaultSelectedIds,\n onSelectedIdsChange,\n onCompleted,\n controlledScope,\n onSelectionScopeChange,\n });\n const body = render\n ? render(state)\n : typeof children === \"function\"\n ? children(state)\n : (children ?? (\n <>\n <fieldset>\n <legend>{labels.selectItems}</legend>\n <label>\n {labels.selectionScope}\n <select\n data-keep-action=\"select-scope\"\n value={state.selectionScope}\n onChange={(event) => state.setSelectionScope(event.currentTarget.value as KeepSelectionScope)}\n >\n <option value=\"page\">{labels.currentPage}</option>\n <option value=\"query\">{labels.searchResults}</option>\n <option value=\"all\">{labels.allItems}</option>\n </select>\n </label>\n <label>\n <input\n type=\"checkbox\"\n data-keep-action=\"select-all\"\n checked={state.allSelected}\n onChange={state.toggleAll}\n aria-label={labels.selectItems}\n />\n {state.selectedIds.length} {labels.selectedCount}\n </label>\n {state.items.map((item) => (\n <span key={item.id}>\n <KeepItemCheckbox\n item={item}\n checked={selected.has(item.id)}\n onCheckedChange={() => state.toggle(item.id)}\n />\n {renderItem ? renderItem(item, selected.has(item.id)) : (getMetaTitle(item.meta) ?? item.id)}\n </span>\n ))}\n </fieldset>\n <button\n type=\"button\"\n data-keep-action=\"delete-selected\"\n onClick={() => void state.remove()}\n disabled={state.selectedIds.length === 0 || state.isMutating}\n >\n {labels.deleteSelected}\n </button>\n <label>\n {labels.tags}\n <input\n data-keep-action=\"edit-tags\"\n value={state.tagsInput}\n onChange={(event) => state.setTagsInput(event.currentTarget.value)}\n />\n </label>\n <button\n type=\"button\"\n data-keep-action=\"apply-tags\"\n onClick={() => void state.updateTags()}\n disabled={state.selectedIds.length === 0 || state.isMutating}\n >\n {labels.applyTags}\n </button>\n </>\n ));\n return (\n <section\n {...props}\n data-keepkit=\"bulk-actions\"\n aria-busy={state.isMutating || props[\"aria-busy\"]}\n data-state={state.selectedIds.length > 0 ? \"selected\" : \"idle\"}\n data-loading={isLoading || state.isMutating ? \"true\" : undefined}\n >\n {body}\n </section>\n );\n}\n","\"use client\";\n\nimport {\n KeepButton as CoreKeepButton,\n type KeepButtonProps as CoreKeepButtonProps,\n type KeepButtonState,\n} from \"@keepkit/core/react\";\nimport { createElement, type MouseEvent, type ReactNode, type Ref, useEffect, useRef } from \"react\";\nimport type { KeepButtonIcon, KeepButtonIcons, KeepButtonLabels } from \"../../foundation/shared\";\nimport { useKeepButton } from \"./hooks/useKeepButton\";\n\nexport type { KeepButtonIcon, KeepButtonIconProps, KeepButtonIcons, KeepButtonLabels } from \"../../foundation/shared\";\n\nexport type KeepButtonProps<TMeta = Record<string, unknown>> = CoreKeepButtonProps<TMeta> & {\n ref?: Ref<HTMLElement> | { readonly current: unknown };\n labels?: KeepButtonLabels;\n icons?: KeepButtonIcons;\n iconOnly?: boolean;\n showLabel?: boolean;\n iconClassName?: string;\n};\n\n/** A style-free save toggle with localized labels and the core button's ARIA/asChild behavior. */\nexport function KeepButton<TMeta = Record<string, unknown>>({\n labels,\n icons,\n iconOnly = false,\n showLabel = true,\n iconClassName,\n onClick,\n onToggleError,\n ...props\n}: KeepButtonProps<TMeta>) {\n const view = useKeepButton<TMeta>({ item: props.item, labels, icons, children: props.children });\n const pendingToggle = useRef<{ wasSaved: boolean; item: KeepButtonState<TMeta>[\"item\"] } | null>(null);\n useEffect(() => {\n const pending = pendingToggle.current;\n if (!pending || view.buttonState.isMutating || pending.wasSaved === view.buttonState.isSaved) return;\n pendingToggle.current = null;\n if (view.buttonState.isSaved && view.buttonState.item) {\n view.emitFeedback({ type: \"item-saved\", item: view.buttonState.item, message: view.labels.savedMessage });\n return;\n }\n if (!pending.item) return;\n const removedItem = pending.item;\n view.emitFeedback({\n type: \"item-removed\",\n item: removedItem,\n message: view.labels.removedMessage,\n undoLabel: view.labels.undo,\n undo: async () => {\n await view.buttonState.save();\n view.emitFeedback({\n type: \"item-restored\",\n item: removedItem,\n items: [removedItem],\n message: view.labels.restoredMessage,\n });\n },\n });\n }, [view]);\n const getStateContent = (state: KeepButtonState<TMeta>): ReactNode => {\n if (typeof props.children === \"function\") return props.children(state);\n if (props.children !== undefined) return props.children;\n const label = state.error\n ? (labels?.error ?? view.labels.error)\n : state.isMutating\n ? (labels?.loading ?? view.labels.loading)\n : state.isSaved\n ? (labels?.saved ?? view.labels.saved)\n : (labels?.unsaved ?? view.labels.save);\n if (!icons) return label;\n const icon = state.error\n ? icons.error\n : state.isMutating\n ? icons.loading\n : state.isSaved\n ? (icons.remove ?? icons.saved)\n : icons.save;\n return (\n <>\n {renderIcon(icon, iconClassName)}\n {showLabel && !iconOnly ? label : null}\n </>\n );\n };\n const sharedProps = {\n ...props,\n onClick: (event: MouseEvent<HTMLElement>) => {\n onClick?.(event as MouseEvent<HTMLButtonElement> & MouseEvent<HTMLElement>);\n if (!event.defaultPrevented) {\n pendingToggle.current = { wasSaved: view.buttonState.isSaved, item: view.buttonState.item };\n }\n },\n onToggleError: (error: unknown) => {\n pendingToggle.current = null;\n onToggleError?.(error);\n },\n \"data-keepkit\": \"button\",\n \"data-keep-action\": \"toggle-save\",\n \"data-has-custom-icon\": icons ? \"true\" : undefined,\n \"data-icon-only\": iconOnly ? \"true\" : undefined,\n \"aria-busy\": props[\"aria-busy\"] ?? (view.buttonState.isLoading || view.buttonState.isMutating),\n savedLabel: labels?.saved ?? props.savedLabel ?? view.labels.saved,\n unsavedLabel: labels?.unsaved ?? props.unsavedLabel ?? view.labels.save,\n savedAriaLabel: labels?.savedAriaLabel ?? props.savedAriaLabel,\n unsavedAriaLabel: labels?.unsavedAriaLabel ?? props.unsavedAriaLabel,\n };\n if (!view.customStateLabel) return <CoreKeepButton<TMeta> {...sharedProps} />;\n return (\n <CoreKeepButton<TMeta> {...sharedProps}>\n {(state: KeepButtonState<TMeta>) => <>{getStateContent(state)}</>}\n </CoreKeepButton>\n );\n}\n\nfunction renderIcon(icon: KeepButtonIcon | undefined, className?: string): ReactNode {\n if (typeof icon === \"function\") return createElement(icon, { \"aria-hidden\": true, className });\n return icon ?? null;\n}\n","import type { KeepButtonState } from \"@keepkit/core/react\";\nimport { useKeepItem } from \"@keepkit/core/react\";\nimport type { ReactNode } from \"react\";\nimport type { KeepButtonIcons, KeepButtonLabels } from \"../../../foundation/shared\";\nimport { useKeepUiFeedback, useUiLabel } from \"../../../foundation/ui-context\";\n\ntype KeepButtonOptions<TMeta> = {\n item: Parameters<typeof useKeepItem<TMeta>>[0];\n labels: KeepButtonLabels | undefined;\n icons: KeepButtonIcons | undefined;\n children: ReactNode | ((state: KeepButtonState<TMeta>) => ReactNode);\n};\n\nexport function useKeepButton<TMeta>({ item, labels, icons, children }: KeepButtonOptions<TMeta>) {\n return {\n buttonState: useKeepItem<TMeta>(item),\n emitFeedback: useKeepUiFeedback<TMeta>(),\n customStateLabel:\n labels?.loading !== undefined || labels?.error !== undefined || (icons !== undefined && children === undefined),\n labels: {\n save: useUiLabel(\"save\", typeof labels?.unsaved === \"string\" ? labels.unsaved : undefined),\n saved: useUiLabel(\"saved\", typeof labels?.saved === \"string\" ? labels.saved : undefined),\n loading: useUiLabel(\"loading\", typeof labels?.loading === \"string\" ? labels.loading : undefined),\n error: useUiLabel(\"error\", typeof labels?.error === \"string\" ? labels.error : undefined),\n savedMessage: useUiLabel(\"savedMessage\"),\n removedMessage: useUiLabel(\"removedMessage\"),\n restoredMessage: useUiLabel(\"restoredMessage\"),\n undo: useUiLabel(\"undo\"),\n },\n };\n}\n","\"use client\";\n\nimport type { KeepItem, KeepItemInput } from \"@keepkit/core/core\";\nimport { useKeepItem } from \"@keepkit/core/react\";\nimport {\n type HTMLAttributes,\n type ReactNode,\n type RefObject,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n} from \"react\";\nimport { useUiLabel } from \"../../foundation/ui-context\";\nimport { type KeepQuickEditorProps, KeepQuickEditorView, useKeepQuickEditor } from \"../editor/KeepQuickEditor\";\nimport { KeepButton, type KeepButtonProps } from \"./KeepButton\";\n\nexport type KeepSavePopoverProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> & {\n item: KeepItemInput<TMeta>;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n dialogLabel?: string;\n buttonProps?: Omit<KeepButtonProps<TMeta>, \"item\" | \"asChild\"> & { asChild?: false };\n editorProps?: Omit<KeepQuickEditorProps<TMeta>, \"item\" | \"onClose\">;\n children?: ReactNode;\n};\n\n/** Opens a quick editor only after this trigger changes from unsaved to saved. */\nexport function KeepSavePopover<TMeta = Record<string, unknown>>({\n item,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n dialogLabel,\n buttonProps,\n editorProps,\n children,\n ...props\n}: KeepSavePopoverProps<TMeta>) {\n const state = useKeepItem(item);\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const isOpen = controlledOpen ?? internalOpen;\n const triggerRef = useRef<HTMLElement>(null);\n const wasOpenRef = useRef(isOpen);\n const previousSaved = useRef(state.isSaved);\n const observedHydration = useRef(!state.isLoading);\n const panelId = useId();\n const titleId = `${panelId}-title`;\n const editSavedItemLabel = useUiLabel(\"editSavedItem\");\n const { ref: _buttonRef, ...resolvedButtonProps } = buttonProps ?? {};\n const setOpen = useCallback(\n (next: boolean) => {\n if (controlledOpen === undefined) setInternalOpen(next);\n onOpenChange?.(next);\n },\n [controlledOpen, onOpenChange],\n );\n\n useEffect(() => {\n if (wasOpenRef.current && !isOpen) window.setTimeout(() => triggerRef.current?.focus(), 0);\n wasOpenRef.current = isOpen;\n }, [isOpen]);\n\n useEffect(() => {\n if (!observedHydration.current) {\n if (state.isLoading) return;\n observedHydration.current = true;\n previousSaved.current = state.isSaved;\n return;\n }\n if (!previousSaved.current && state.isSaved) setOpen(true);\n previousSaved.current = state.isSaved;\n }, [setOpen, state.isLoading, state.isSaved]);\n\n useEffect(() => {\n if (isOpen && observedHydration.current && !state.isSaved) setOpen(false);\n }, [isOpen, setOpen, state.isSaved]);\n\n const currentItem = state.item as KeepItem<TMeta> | undefined;\n return (\n <div {...props} data-keepkit=\"save-popover\" data-open={isOpen ? \"true\" : \"false\"}>\n <KeepButton\n {...resolvedButtonProps}\n item={item}\n asChild={false}\n ref={triggerRef}\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n aria-controls={panelId}\n />\n {isOpen && currentItem ? (\n <KeepSavePopoverPanel\n id={panelId}\n titleId={titleId}\n dialogLabel={dialogLabel ?? editSavedItemLabel}\n item={currentItem}\n editorProps={editorProps}\n triggerRef={triggerRef}\n onClose={() => setOpen(false)}\n >\n {children}\n </KeepSavePopoverPanel>\n ) : null}\n </div>\n );\n}\n\ntype KeepSavePopoverPanelProps<TMeta> = {\n id: string;\n titleId: string;\n dialogLabel: string;\n item: KeepItem<TMeta>;\n editorProps?: KeepSavePopoverProps<TMeta>[\"editorProps\"];\n triggerRef: RefObject<HTMLElement | null>;\n onClose: () => void;\n children?: ReactNode;\n};\n\nfunction KeepSavePopoverPanel<TMeta>({\n id,\n titleId,\n dialogLabel,\n item,\n editorProps,\n triggerRef,\n onClose,\n children,\n}: KeepSavePopoverPanelProps<TMeta>) {\n const { debounceMs, onSaved, onSaveError, ...editorViewProps } = editorProps ?? {};\n const { state } = useKeepQuickEditor(item, { debounceMs, onSaved, onSaveError });\n const panelRef = useRef<HTMLDivElement>(null);\n const closingRef = useRef<Promise<void> | null>(null);\n const closeLabel = useUiLabel(\"close\");\n const requestClose = useCallback(() => {\n if (closingRef.current) return closingRef.current;\n const promise = state\n .flush()\n .then(onClose)\n .catch(() => {\n window.setTimeout(() => panelRef.current?.querySelector<HTMLElement>('[role=\"alert\"]')?.focus(), 0);\n })\n .finally(() => {\n closingRef.current = null;\n });\n closingRef.current = promise;\n return promise;\n }, [onClose, state]);\n\n useEffect(() => {\n const frame = window.requestAnimationFrame(() => {\n panelRef.current\n ?.querySelector<HTMLElement>('[data-keepkit=\"quick-editor\"] :is(textarea, input, select, button)')\n ?.focus();\n });\n return () => window.cancelAnimationFrame(frame);\n }, []);\n\n useEffect(() => {\n const closeFromOutside = (event: PointerEvent) => {\n const target = event.target;\n if (!(target instanceof Node) || panelRef.current?.contains(target) || triggerRef.current?.contains(target))\n return;\n void requestClose();\n };\n document.addEventListener(\"pointerdown\", closeFromOutside);\n return () => document.removeEventListener(\"pointerdown\", closeFromOutside);\n }, [requestClose, triggerRef]);\n\n return (\n <div\n ref={panelRef}\n id={id}\n role=\"dialog\"\n aria-labelledby={titleId}\n data-keep-popover-panel=\"true\"\n data-save-status={state.saveStatus}\n onKeyDownCapture={(event) => {\n if (event.key !== \"Escape\") return;\n event.preventDefault();\n event.stopPropagation();\n void requestClose();\n }}\n >\n <h2 id={titleId} data-keep-popover-title=\"true\">\n {dialogLabel}\n </h2>\n {children}\n <KeepQuickEditorView {...editorViewProps} state={state} focusScopeRef={panelRef} />\n <button\n type=\"button\"\n onClick={() => void requestClose()}\n disabled={state.isSaving}\n data-keep-action=\"close-save-popover\"\n >\n {closeLabel}\n </button>\n </div>\n );\n}\n","\"use client\";\n\nimport type { KeepItem } from \"@keepkit/core/core\";\nimport { useKeepCollections, useKeepItem } from \"@keepkit/core/react\";\nimport {\n type FormEvent,\n type FormHTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n type RefObject,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { useUiLabel } from \"../../foundation/ui-context\";\n\nexport type KeepQuickEditorState<TMeta = Record<string, unknown>> = {\n item: KeepItem<TMeta>;\n note: string;\n tags: string[];\n collectionId?: string;\n setNote: (value: string) => void;\n setTags: (value: string[]) => void;\n setCollectionId: (value?: string) => void;\n isDirty: boolean;\n isSaving: boolean;\n saveStatus: \"idle\" | \"dirty\" | \"saving\" | \"saved\" | \"error\";\n error: unknown | null;\n flush: () => Promise<void>;\n};\n\nexport function useKeepQuickEditor<TMeta = Record<string, unknown>>(\n item: KeepItem<TMeta>,\n options: {\n debounceMs?: number;\n onSaved?: (item: KeepItem<TMeta>) => void;\n onSaveError?: (error: unknown) => void;\n } = {},\n) {\n const { debounceMs = 300, onSaved, onSaveError } = options;\n const itemState = useKeepItem<TMeta>(item);\n const { error, isMutating, moveToCollection, updateNote, updateTags } = itemState;\n const baseline = itemState.item ?? item;\n const [note, setNote] = useState(baseline.note ?? \"\");\n const [tags, setTags] = useState(baseline.tags ?? []);\n const [collectionId, setCollectionId] = useState(baseline.collectionId);\n const [saveStatus, setSaveStatus] = useState<KeepQuickEditorState<TMeta>[\"saveStatus\"]>(\"idle\");\n const [saveError, setSaveError] = useState<unknown | null>(null);\n const baselineRef = useRef({\n note: baseline.note ?? \"\",\n tags: baseline.tags ?? [],\n collectionId: baseline.collectionId,\n });\n const draftRef = useRef({ note, tags, collectionId });\n const flushRequestedRef = useRef(false);\n const flushPromiseRef = useRef<Promise<void> | null>(null);\n draftRef.current = { note, tags, collectionId };\n useEffect(() => {\n if (\n draftRef.current.note === baselineRef.current.note &&\n sameTags(draftRef.current.tags, baselineRef.current.tags) &&\n draftRef.current.collectionId === baselineRef.current.collectionId\n ) {\n setNote(baseline.note ?? \"\");\n setTags(baseline.tags ?? []);\n setCollectionId(baseline.collectionId);\n baselineRef.current = {\n note: baseline.note ?? \"\",\n tags: baseline.tags ?? [],\n collectionId: baseline.collectionId,\n };\n }\n }, [baseline]);\n const isDirty =\n note !== baselineRef.current.note ||\n !sameTags(tags, baselineRef.current.tags) ||\n collectionId !== baselineRef.current.collectionId;\n useEffect(() => {\n if (!isDirty && saveStatus === \"dirty\" && !flushPromiseRef.current) setSaveStatus(\"idle\");\n }, [isDirty, saveStatus]);\n const flush = useCallback((): Promise<void> => {\n flushRequestedRef.current = true;\n if (flushPromiseRef.current) return flushPromiseRef.current;\n\n const run = async () => {\n let saved = false;\n while (flushRequestedRef.current || !sameDraft(draftRef.current, baselineRef.current)) {\n flushRequestedRef.current = false;\n const draft = { ...draftRef.current, tags: [...draftRef.current.tags] };\n const previous = baselineRef.current;\n if (sameDraft(draft, previous)) continue;\n\n setSaveError(null);\n setSaveStatus(\"saving\");\n try {\n if (draft.note !== previous.note) await updateNote(draft.note.trim() || undefined);\n if (!sameTags(draft.tags, previous.tags)) await updateTags(draft.tags);\n if (draft.collectionId !== previous.collectionId) await moveToCollection(draft.collectionId);\n } catch (error) {\n setSaveError(error);\n setSaveStatus(\"error\");\n onSaveError?.(error);\n throw error;\n }\n\n baselineRef.current = draft;\n saved = true;\n const { collectionId: _oldCollectionId, ...withoutCollection } = baseline;\n onSaved?.({\n ...withoutCollection,\n note: draft.note.trim() || undefined,\n tags: draft.tags,\n ...(draft.collectionId ? { collectionId: draft.collectionId } : {}),\n });\n if (!sameDraft(draftRef.current, baselineRef.current)) flushRequestedRef.current = true;\n }\n if (saved) setSaveStatus(\"saved\");\n };\n\n const promise = run().finally(() => {\n flushPromiseRef.current = null;\n });\n flushPromiseRef.current = promise;\n return promise;\n }, [baseline, moveToCollection, onSaveError, onSaved, updateNote, updateTags]);\n useEffect(() => {\n if (!isDirty || debounceMs <= 0) return;\n const timer = window.setTimeout(() => void flush().catch(() => undefined), debounceMs);\n return () => window.clearTimeout(timer);\n }, [debounceMs, flush, isDirty]);\n return {\n state: {\n item,\n note,\n tags,\n collectionId,\n setNote: (value) => {\n setSaveError(null);\n setSaveStatus(\"dirty\");\n setNote(value);\n },\n setTags: (value) => {\n setSaveError(null);\n setSaveStatus(\"dirty\");\n setTags(value);\n },\n setCollectionId: (value) => {\n setSaveError(null);\n setSaveStatus(\"dirty\");\n setCollectionId(value);\n },\n isDirty,\n isSaving: isMutating || saveStatus === \"saving\",\n saveStatus,\n error: saveError ?? error,\n flush,\n } satisfies KeepQuickEditorState<TMeta>,\n };\n}\n\nexport type KeepQuickEditorProps<TMeta = Record<string, unknown>> = Omit<\n FormHTMLAttributes<HTMLFormElement>,\n \"children\" | \"onSubmit\"\n> & {\n item: KeepItem<TMeta>;\n debounceMs?: number;\n collectionIds?: string[];\n collectionLabels?: Record<string, string>;\n showSaveButton?: boolean;\n children?: ReactNode | ((state: KeepQuickEditorState<TMeta>) => ReactNode);\n onClose?: () => void;\n onSaved?: (item: KeepItem<TMeta>) => void;\n onSaveError?: (error: unknown) => void;\n};\n\n/** A compact, temporary-state editor for note, tags, and collection metadata. */\nexport function KeepQuickEditor<TMeta = Record<string, unknown>>({\n item,\n debounceMs = 300,\n onSaved,\n onSaveError,\n ...props\n}: KeepQuickEditorProps<TMeta>) {\n const view = useKeepQuickEditor(item, { debounceMs, onSaved, onSaveError });\n return <KeepQuickEditorView {...props} state={view.state} />;\n}\n\ntype KeepQuickEditorViewProps<TMeta> = Omit<\n KeepQuickEditorProps<TMeta>,\n \"item\" | \"debounceMs\" | \"onSaved\" | \"onSaveError\"\n> & {\n state: KeepQuickEditorState<TMeta>;\n focusScopeRef?: RefObject<HTMLElement | null>;\n};\n\n/** Internal view used by KeepSavePopover so close requests can await the same editor state. */\nexport function KeepQuickEditorView<TMeta = Record<string, unknown>>({\n state,\n collectionIds,\n collectionLabels,\n showSaveButton = true,\n children,\n onClose,\n focusScopeRef,\n ...props\n}: KeepQuickEditorViewProps<TMeta>) {\n const collections = useKeepCollections<TMeta>({ targetType: state.item.targetType, orderBy: \"name\" });\n const rootRef = useRef<HTMLFormElement>(null);\n const noteLabel = useUiLabel(\"note\");\n const tagsLabel = useUiLabel(\"tags\");\n const collectionLabel = useUiLabel(\"collection\");\n const uncategorizedLabel = useUiLabel(\"uncategorized\");\n const saveLabel = useUiLabel(\"saveWithNote\");\n const closeLabel = useUiLabel(\"close\");\n const unsavedChangesLabel = useUiLabel(\"unsavedChanges\");\n const savingLabel = useUiLabel(\"saving\");\n const savedLabel = useUiLabel(\"saved\");\n const errorLabel = useUiLabel(\"error\");\n const submit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n void state.flush().catch(() => undefined);\n };\n const onKeyDown = (event: KeyboardEvent<HTMLFormElement>) => {\n props.onKeyDown?.(event);\n if (event.defaultPrevented) return;\n if (event.key === \"Escape\") {\n event.preventDefault();\n void state\n .flush()\n .then(() => onClose?.())\n .catch(() => undefined);\n }\n if (event.key === \"Tab\") trapFocus(event, focusScopeRef?.current ?? rootRef.current);\n };\n const statusMessage =\n state.saveStatus === \"dirty\"\n ? unsavedChangesLabel\n : state.saveStatus === \"saving\"\n ? savingLabel\n : state.saveStatus === \"saved\"\n ? savedLabel\n : state.saveStatus === \"error\"\n ? getErrorMessage(state.error, errorLabel)\n : null;\n const body =\n typeof children === \"function\"\n ? children(state)\n : (children ?? (\n <>\n <label>\n {noteLabel}\n <textarea value={state.note} onChange={(event) => state.setNote(event.currentTarget.value)} />\n </label>\n <label>\n {tagsLabel}\n <input\n value={state.tags.join(\", \")}\n onChange={(event) =>\n state.setTags(\n event.currentTarget.value\n .split(\",\")\n .map((tag) => tag.trim())\n .filter(Boolean),\n )\n }\n />\n </label>\n <label>\n {collectionLabel}\n <select\n value={state.collectionId ?? \"\"}\n onChange={(event) => state.setCollectionId(event.currentTarget.value || undefined)}\n >\n <option value=\"\">{uncategorizedLabel}</option>\n {(collectionIds ?? collections.map((collection) => collection.id)).map((id) => (\n <option key={id} value={id}>\n {collectionLabels?.[id] ?? id}\n </option>\n ))}\n </select>\n </label>\n {statusMessage ? (\n <p\n role={state.saveStatus === \"error\" ? \"alert\" : \"status\"}\n aria-live={state.saveStatus === \"error\" ? \"assertive\" : \"polite\"}\n tabIndex={state.saveStatus === \"error\" ? -1 : undefined}\n data-keep-editor-status=\"true\"\n data-state={state.saveStatus}\n >\n {statusMessage}\n </p>\n ) : null}\n {showSaveButton ? (\n <button type=\"submit\" disabled={state.isSaving} data-keep-action=\"save-quick-edit\">\n {saveLabel}\n </button>\n ) : null}\n {onClose ? (\n <button\n type=\"button\"\n onClick={() =>\n void state\n .flush()\n .then(onClose)\n .catch(() => undefined)\n }\n disabled={state.isSaving}\n data-keep-action=\"close-quick-edit\"\n >\n {closeLabel}\n </button>\n ) : null}\n </>\n ));\n return (\n <form\n {...props}\n ref={rootRef}\n onSubmit={submit}\n onKeyDown={onKeyDown}\n data-keepkit=\"quick-editor\"\n data-state={state.isDirty ? \"dirty\" : \"clean\"}\n data-save-status={state.saveStatus}\n aria-busy={state.isSaving || props[\"aria-busy\"]}\n >\n {body}\n </form>\n );\n}\n\nfunction sameDraft(\n left: { note: string; tags: string[]; collectionId?: string },\n right: { note: string; tags: string[]; collectionId?: string },\n): boolean {\n return left.note === right.note && sameTags(left.tags, right.tags) && left.collectionId === right.collectionId;\n}\n\nfunction getErrorMessage(error: unknown, fallback: string): string {\n return error instanceof Error ? error.message : fallback;\n}\n\nfunction sameTags(left: string[], right: string[]): boolean {\n return left.length === right.length && left.every((tag, index) => tag === right[index]);\n}\n\nfunction trapFocus(event: KeyboardEvent<HTMLElement>, root: HTMLElement | null): void {\n if (!root) return;\n const elements = [\n ...root.querySelectorAll<HTMLElement>('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'),\n ].filter((element) => !element.hasAttribute(\"disabled\"));\n if (elements.length === 0) return;\n const first = elements[0];\n const last = elements[elements.length - 1];\n if (event.shiftKey && document.activeElement === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault();\n first.focus();\n }\n}\n","import { useKeepContext } from \"@keepkit/core/react\";\nimport { useEffect, useState } from \"react\";\nimport { useKeepUiFeedback, useUiLabel } from \"../../../foundation/ui-context\";\n\nexport function useKeepUndo() {\n const context = useKeepContext();\n const emitFeedback = useKeepUiFeedback();\n const restoredMessage = useUiLabel(\"restoredMessage\");\n const { canUndo, startedAt, expiresAt } = context.undo;\n const [now, setNow] = useState(() => Date.now());\n\n useEffect(() => {\n if (!canUndo || expiresAt === undefined) return;\n setNow(Date.now());\n const timer = setInterval(() => setNow(Date.now()), 250);\n return () => clearInterval(timer);\n }, [canUndo, expiresAt]);\n\n const duration = Math.max(1, (expiresAt ?? now) - (startedAt ?? now));\n const remainingMs = Math.max(0, (expiresAt ?? now) - now);\n const remainingSeconds = Math.max(0, Math.ceil(remainingMs / 1000));\n const progress = Math.min(1, Math.max(0, remainingMs / duration));\n return {\n canUndo,\n expiresAt,\n remainingMs,\n remainingSeconds,\n progress,\n undo: async () => {\n const items = context.lastChange?.items ?? (context.lastChange?.item ? [context.lastChange.item] : []);\n await context.undoLastRemoval();\n if (items.length > 0) {\n emitFeedback({ type: \"item-restored\", item: items[0], items, message: restoredMessage });\n }\n },\n message: useUiLabel(\"undoAvailable\"),\n label: useUiLabel(\"undo\"),\n };\n}\n","\"use client\";\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { useKeepUndo } from \"./hooks/useKeepUndo\";\n\nexport type KeepUndoProps = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n children?: ReactNode;\n label?: ReactNode;\n};\n\n/** Presents the short-lived undo action created by removeWithUndo/removeBatchWithUndo. */\nexport function KeepUndo({ children, label, ...props }: KeepUndoProps) {\n const view = useKeepUndo();\n if (!view.canUndo) return null;\n return (\n <div {...props} role=\"status\" aria-live=\"polite\" data-keepkit=\"undo\" data-state=\"available\">\n <span data-keepkit=\"undo-message\">{children ?? view.message}</span>\n <span data-keepkit=\"undo-countdown\" aria-hidden=\"true\">\n {view.remainingSeconds}s\n </span>\n <progress\n data-keepkit=\"undo-progress\"\n max={1}\n value={view.progress}\n aria-label={String(view.label)}\n aria-valuetext={`${view.remainingSeconds}s`}\n />\n <button type=\"button\" data-keep-action=\"undo\" onClick={() => void view.undo()}>\n {label ?? view.label}\n </button>\n </div>\n );\n}\n","\"use client\";\n\nimport type { KeepItem, KeepListQuery, KeepUrlSyncOptions } from \"@keepkit/core/core\";\nimport { KeepErrorBoundary, type KeepErrorBoundaryProps } from \"@keepkit/core/react\";\nimport { type HTMLAttributes, type ReactNode, useEffect, useState } from \"react\";\nimport type { KeepUrlAdapter } from \"../../adapters/url-sync\";\nimport { type RenderProp, resolveContent } from \"../../foundation/shared\";\nimport { useUiLabel } from \"../../foundation/ui-context\";\nimport { KeepBulkActions } from \"../actions/KeepBulkActions\";\nimport type { KeepItemCardProps } from \"../item/KeepItemCard\";\nimport { KeepActiveFiltersSummary } from \"../query/KeepActiveFiltersSummary\";\nimport { type KeepArchiveScope, KeepArchiveScopeSelect } from \"../query/KeepArchiveScopeSelect\";\nimport { KeepCollectionFilter } from \"../query/KeepCollectionFilter\";\nimport { KeepTagFilter } from \"../query/KeepTagFilter\";\nimport { KeepPagination, KeepSearchInput, KeepSortSelect } from \"../query/query-controls\";\nimport { useKeepCollection } from \"./hooks/useKeepCollection\";\nimport { KeepList, type KeepListState } from \"./KeepList\";\n\nexport type KeepCollectionFeature =\n | \"search\"\n | \"sort\"\n | \"pagination\"\n | \"tagFilter\"\n | \"collectionFilter\"\n | \"bulkActions\"\n | \"tags\"\n | \"pin\"\n | \"archive\";\nexport type KeepLayoutPreset = \"list\" | \"grid\" | \"compact\" | \"auto\";\n\nexport type KeepCollectionProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n query?: KeepListQuery<TMeta>;\n pageSize?: number;\n layout?: KeepLayoutPreset;\n urlSync?: boolean | KeepUrlSyncOptions;\n urlAdapter?: KeepUrlAdapter;\n /** Enables the built-in active/archived/all scope selector and query state. */\n archiveScope?: KeepArchiveScope;\n onArchiveScopeChange?: (scope: KeepArchiveScope) => void;\n /** Enables the built-in drag and keyboard reorder list. */\n reorderable?: boolean;\n onReorder?: (items: KeepItem<TMeta>[]) => void | Promise<void>;\n features?: Partial<Record<KeepCollectionFeature, boolean>>;\n collectionLabels?: Record<string, string>;\n renderItem?: (item: KeepItem<TMeta>, state: KeepListState<TMeta>) => ReactNode;\n itemCardProps?: Omit<KeepItemCardProps<TMeta>, \"item\" | \"children\" | \"render\">;\n loading?: ReactNode | RenderProp<KeepListState<TMeta>>;\n /** Alias for `loading`. When neither is provided, KeepList renders skeleton cards. */\n renderLoading?: ReactNode | RenderProp<KeepListState<TMeta>>;\n loadingCount?: number;\n activeFilters?: ReactNode | RenderProp<KeepListState<TMeta>>;\n empty?: ReactNode | RenderProp<KeepListState<TMeta>>;\n error?: ReactNode | RenderProp<KeepListState<TMeta>>;\n fallback?: KeepErrorBoundaryProps[\"fallback\"];\n onBoundaryError?: KeepErrorBoundaryProps[\"onError\"];\n boundaryResetKey?: unknown;\n};\n\n/** A batteries-included collection with query controls and accessible status feedback. */\nexport function KeepCollection<TMeta = Record<string, unknown>>(props: KeepCollectionProps<TMeta>) {\n const { fallback, onBoundaryError, boundaryResetKey, ...collectionProps } = props;\n const content = <KeepCollectionContent<TMeta> {...collectionProps} />;\n if (fallback === undefined && onBoundaryError === undefined) return content;\n return (\n <KeepErrorBoundary fallback={fallback} onError={onBoundaryError} resetKey={boundaryResetKey}>\n {content}\n </KeepErrorBoundary>\n );\n}\n\nfunction KeepCollectionContent<TMeta = Record<string, unknown>>({\n query = {},\n pageSize = 20,\n layout = \"list\",\n urlSync = false,\n urlAdapter,\n archiveScope,\n onArchiveScopeChange,\n reorderable = false,\n onReorder,\n features,\n collectionLabels,\n renderItem,\n itemCardProps,\n loading,\n renderLoading,\n loadingCount,\n activeFilters,\n empty,\n error,\n className,\n ...rootProps\n}: Omit<KeepCollectionProps<TMeta>, \"fallback\" | \"onBoundaryError\" | \"boundaryResetKey\">) {\n const view = useKeepCollection<TMeta>({ query, pageSize, urlSync, urlAdapter, features, archiveScope });\n const [reorderUndoIds, setReorderUndoIds] = useState<string[] | null>(null);\n const reorderUndoLabel = useUiLabel(\"undoReorder\");\n const handleReorder = async (orderedIds: string[]) => {\n const previousIds = view.list.items.map((item) => item.id);\n await view.list.reorder(orderedIds);\n const itemsById = new Map(view.list.items.map((item) => [item.id, item]));\n const orderedItems = orderedIds.flatMap((id) => {\n const item = itemsById.get(id);\n return item ? [item] : [];\n });\n setReorderUndoIds(previousIds);\n await onReorder?.(orderedItems);\n };\n useEffect(() => {\n if (!reorderUndoIds) return;\n const timer = window.setTimeout(() => setReorderUndoIds(null), 5000);\n return () => window.clearTimeout(timer);\n }, [reorderUndoIds]);\n const undoReorder = async () => {\n if (!reorderUndoIds) return;\n const previous = reorderUndoIds;\n setReorderUndoIds(null);\n await view.list.reorder(previous);\n };\n const resolvedItemCardProps = {\n ...itemCardProps,\n showTags: itemCardProps?.showTags ?? view.enabled.tags,\n showPinButton: itemCardProps?.showPinButton ?? view.enabled.pin,\n showArchiveButton: itemCardProps?.showArchiveButton ?? view.enabled.archive,\n };\n\n return (\n <section\n {...rootProps}\n className={className}\n data-keepkit=\"collection\"\n data-layout={layout}\n aria-busy={view.list.isLoading || view.list.isMutating || rootProps[\"aria-busy\"]}\n data-state={getCollectionState(view.list)}\n data-loading={view.list.isLoading || view.list.isMutating ? \"true\" : undefined}\n >\n <div>\n {view.enabled.search ? <KeepSearchInput value={view.searchValue} onValueChange={view.setSearchValue} /> : null}\n {view.enabled.sort ? <KeepSortSelect value={view.sortValue} onValueChange={view.setSortValue} /> : null}\n {view.enabled.tagFilter ? (\n <KeepTagFilter<TMeta> query={query} value={view.activeTags[0]} onValueChange={view.setTag} />\n ) : null}\n {view.enabled.collectionFilter ? (\n <KeepCollectionFilter\n value={view.activeCollection}\n onValueChange={view.setCollection}\n collectionLabels={collectionLabels}\n />\n ) : null}\n {archiveScope !== undefined ? (\n <KeepArchiveScopeSelect\n value={view.archiveScope}\n onValueChange={(next) => {\n view.setArchiveScope(next);\n onArchiveScopeChange?.(next);\n }}\n />\n ) : null}\n </div>\n {activeFilters === undefined ? (\n <KeepActiveFiltersSummary<TMeta>\n search={view.searchValue}\n tags={view.activeTags}\n onSearchChange={view.setSearchValue}\n onTagChange={view.removeTag}\n onClear={view.clearFilters}\n />\n ) : (\n resolveContent(activeFilters, view.list)\n )}\n <KeepList<TMeta>\n query={view.resolvedQuery}\n renderItem={renderItem}\n itemCardProps={resolvedItemCardProps}\n layout={layout}\n loading={loading}\n renderLoading={renderLoading}\n loadingCount={loadingCount}\n onClearFilters={view.clearFilters}\n reorderable={reorderable}\n onReorder={reorderable ? handleReorder : undefined}\n empty={view.list.totalCount === 0 && view.allState.totalCount > 0 ? undefined : empty}\n error={error}\n />\n {view.enabled.pagination ? (\n <KeepPagination\n totalCount={view.list.totalCount}\n pageSize={view.resolvedPageSize}\n page={view.list.page}\n onPageChange={view.setPage}\n />\n ) : null}\n {view.enabled.bulkActions ? <KeepBulkActions<TMeta> query={view.resolvedQuery} /> : null}\n {reorderable && reorderUndoIds ? (\n <div data-keepkit=\"reorder-feedback\" role=\"status\" aria-live=\"polite\">\n <button type=\"button\" data-keep-action=\"undo-reorder\" onClick={() => void undoReorder()}>\n {reorderUndoLabel}\n </button>\n </div>\n ) : null}\n </section>\n );\n}\n\nfunction getCollectionState<TMeta>(list: KeepListState<TMeta>): \"loading\" | \"error\" | \"empty\" | \"ready\" {\n if (list.error && list.items.length === 0) return \"error\";\n if (list.isLoading && !list.isHydrated) return \"loading\";\n if (list.isHydrated && list.items.length === 0) return \"empty\";\n return \"ready\";\n}\n","\"use client\";\n\nimport type { KeepListQuery } from \"@keepkit/core/core\";\nimport {\n type HTMLAttributes,\n isValidElement,\n type KeyboardEvent,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n type Ref,\n useRef,\n} from \"react\";\nimport { type RenderProp, renderRoot } from \"../../foundation/shared\";\nimport { useUiLabel } from \"../../foundation/ui-context\";\n\nexport type KeepActiveFiltersSummaryProps<TMeta = Record<string, unknown>> = Omit<\n HTMLAttributes<HTMLElement>,\n \"children\"\n> & {\n ref?: Ref<HTMLElement> | { readonly current: unknown };\n query?: KeepListQuery<TMeta>;\n search?: string;\n tags?: readonly string[];\n onSearchChange?: (value: string) => void;\n onTagChange?: (tag: string) => void;\n onClear?: () => void;\n children?: ReactNode | RenderProp<KeepActiveFiltersSummaryState>;\n asChild?: boolean;\n};\n\nexport type KeepActiveFiltersSummaryState = {\n search: string;\n tags: string[];\n hasFilters: boolean;\n clear: () => void;\n removeSearch: () => void;\n removeTag: (tag: string) => void;\n};\n\n/** Lists active search and tag filters with one-tap recovery actions. */\nexport function KeepActiveFiltersSummary<TMeta = Record<string, unknown>>({\n query,\n search: providedSearch,\n tags: providedTags,\n onSearchChange,\n onTagChange,\n onClear,\n children,\n asChild = false,\n className,\n ...rootProps\n}: KeepActiveFiltersSummaryProps<TMeta>) {\n const search = (providedSearch ?? query?.search?.query ?? \"\").trim();\n const tags = normalizeTags(providedTags ?? query?.tags ?? []);\n const hasFilters = Boolean(search) || tags.length > 0;\n const activeFiltersLabel = useUiLabel(\"activeFilters\");\n const clearAllLabel = useUiLabel(\"clearAllFilters\");\n const clearLabel = useUiLabel(\"clearFilters\");\n const removeLabel = useUiLabel(\"removeFilter\");\n const chipRefs = useRef<Array<HTMLButtonElement | null>>([]);\n const filterCount = Number(Boolean(search)) + tags.length;\n\n function focusChip(index: number): void {\n chipRefs.current[index]?.focus();\n }\n\n function focusAfterRemoval(index: number, source: HTMLElement): void {\n const summaryRoot = source.closest<HTMLElement>('[data-keepkit=\"active-filters\"]');\n const fallbackScope =\n source.closest<HTMLElement>('[data-keepkit=\"collection\"]') ?? summaryRoot?.parentElement ?? source.parentElement;\n queueMicrotask(() => {\n const nextIndex = index < filterCount - 1 ? index : index - 1;\n const nextChip = nextIndex >= 0 ? chipRefs.current[nextIndex] : null;\n if (nextChip?.isConnected) {\n nextChip.focus();\n return;\n }\n focusFilterFallback(fallbackScope);\n });\n }\n\n function handleChipKeyDown(event: KeyboardEvent<HTMLButtonElement>, index: number): void {\n const nextIndex = event.key === \"ArrowRight\" ? index + 1 : event.key === \"ArrowLeft\" ? index - 1 : -1;\n if (nextIndex < 0 || nextIndex >= filterCount || !chipRefs.current[nextIndex]) return;\n event.preventDefault();\n focusChip(nextIndex);\n }\n\n function removeSearch(event: MouseEvent<HTMLButtonElement>): void {\n focusAfterRemoval(0, event.currentTarget);\n onSearchChange?.(\"\");\n }\n\n function removeTag(tag: string, index: number, event: MouseEvent<HTMLButtonElement>): void {\n focusAfterRemoval(index, event.currentTarget);\n onTagChange?.(tag);\n }\n const state: KeepActiveFiltersSummaryState = {\n search,\n tags,\n hasFilters,\n clear: () => onClear?.(),\n removeSearch: () => onSearchChange?.(\"\"),\n removeTag: (tag) => onTagChange?.(tag),\n };\n const contentChildren = asChild && isElement(children) ? undefined : children;\n const body =\n typeof contentChildren === \"function\"\n ? contentChildren(state)\n : (contentChildren ??\n (hasFilters ? (\n <>\n <span data-active-filters-label=\"true\">{activeFiltersLabel}</span>\n <ul data-active-filters-list=\"true\">\n {search ? (\n <li data-filter-kind=\"search\">\n <span data-filter-value=\"true\">{search}</span>\n <button\n type=\"button\"\n data-keep-action=\"remove-search-filter\"\n aria-label={`${search} ${removeLabel}`}\n ref={(element) => {\n chipRefs.current[0] = element;\n }}\n onKeyDown={(event) => handleChipKeyDown(event, 0)}\n onClick={removeSearch}\n >\n ×\n </button>\n </li>\n ) : null}\n {tags.map((tag, tagIndex) => (\n <li key={tag} data-filter-kind=\"tag\">\n <span data-filter-value=\"true\">{tag}</span>\n <button\n type=\"button\"\n data-keep-action=\"remove-tag-filter\"\n aria-label={`${tag} ${removeLabel}`}\n ref={(element) => {\n chipRefs.current[tagIndex + Number(Boolean(search))] = element;\n }}\n onKeyDown={(event) => handleChipKeyDown(event, tagIndex + Number(Boolean(search)))}\n onClick={(event) => removeTag(tag, tagIndex + Number(Boolean(search)), event)}\n >\n ×\n </button>\n </li>\n ))}\n </ul>\n <button type=\"button\" data-keep-action=\"clear-filters\" onClick={state.clear}>\n {clearAllLabel || clearLabel}\n </button>\n </>\n ) : null));\n\n if (!hasFilters && !asChild && contentChildren === undefined) return null;\n return renderRoot(\n asChild,\n isElement(children) ? children : undefined,\n {\n ...rootProps,\n className,\n \"data-keepkit\": \"active-filters\",\n \"data-state\": hasFilters ? \"active\" : \"idle\",\n \"aria-label\": rootProps[\"aria-label\"] ?? activeFiltersLabel,\n },\n body,\n \"KeepActiveFiltersSummary\",\n );\n}\n\nfunction normalizeTags(tags: readonly string[]): string[] {\n return [...new Set(tags.map((tag) => tag.trim()).filter(Boolean))];\n}\n\nfunction isElement(value: unknown): value is ReactElement {\n return isValidElement(value);\n}\n\nfunction focusFilterFallback(scope: HTMLElement | null): void {\n const searchInput = scope?.querySelector<HTMLElement>('[data-keep-action=\"search\"]');\n if (searchInput) {\n searchInput.focus();\n return;\n }\n\n const listCard = scope?.querySelector<HTMLElement>('[data-keepkit=\"card\"][tabindex=\"0\"]');\n if (listCard) {\n listCard.focus();\n return;\n }\n\n const list = scope?.querySelector<HTMLElement>('[data-keepkit=\"list\"]');\n if (list) {\n if (!list.hasAttribute(\"tabindex\")) list.tabIndex = -1;\n list.focus();\n }\n}\n","\"use client\";\n\nimport type { SelectHTMLAttributes } from \"react\";\nimport { useState } from \"react\";\nimport { useUiLabel } from \"../../foundation/ui-context\";\n\nexport type KeepArchiveScope = \"active\" | \"archived\" | \"all\";\n\nexport type KeepArchiveScopeSelectProps = Omit<\n SelectHTMLAttributes<HTMLSelectElement>,\n \"value\" | \"defaultValue\" | \"onChange\"\n> & {\n value?: KeepArchiveScope;\n defaultValue?: KeepArchiveScope;\n onValueChange?: (value: KeepArchiveScope) => void;\n};\n\n/** A localized active/archived/all selector for a KeepCollection query. */\nexport function KeepArchiveScopeSelect({\n value: controlledValue,\n defaultValue = \"active\",\n onValueChange,\n \"aria-label\": ariaLabel,\n ...props\n}: KeepArchiveScopeSelectProps) {\n const [internalValue, setInternalValue] = useState<KeepArchiveScope>(controlledValue ?? defaultValue);\n const value = controlledValue ?? internalValue;\n const label = useUiLabel(\"archiveScope\");\n const activeLabel = useUiLabel(\"archiveScopeActive\");\n const archivedLabel = useUiLabel(\"archiveScopeArchived\");\n const allLabel = useUiLabel(\"archiveScopeAll\");\n const handleChange = (next: string) => {\n if (next !== \"active\" && next !== \"archived\" && next !== \"all\") return;\n if (controlledValue === undefined) setInternalValue(next);\n onValueChange?.(next);\n };\n return (\n <label data-keepkit=\"archive-scope\">\n <span>{label}</span>\n <select\n {...props}\n value={value}\n aria-label={ariaLabel ?? label}\n data-keep-action=\"archive-scope\"\n onChange={(event) => handleChange(event.currentTarget.value)}\n >\n <option value=\"active\">{activeLabel}</option>\n <option value=\"archived\">{archivedLabel}</option>\n <option value=\"all\">{allLabel}</option>\n </select>\n </label>\n );\n}\n","\"use client\";\n\nimport type { KeepItem } from \"@keepkit/core/core\";\nimport { useKeepCollections, useKeepContext } from \"@keepkit/core/react\";\nimport { type SelectHTMLAttributes, useState } from \"react\";\nimport { useUiLabel } from \"../../foundation/ui-context\";\n\nexport type KeepCollectionOption = { id?: string; label: string };\n\nexport type KeepCollectionControlProps = Omit<\n SelectHTMLAttributes<HTMLSelectElement>,\n \"value\" | \"defaultValue\" | \"onChange\"\n> & {\n value?: string;\n defaultValue?: string;\n onValueChange?: (collectionId?: string) => void;\n onChange?: (collectionId?: string) => void;\n collectionLabels?: Record<string, string>;\n allLabel?: string;\n uncategorizedLabel?: string;\n};\n\nfunction useCollectionOptions(\n collectionLabels: Record<string, string> | undefined,\n collections: ReturnType<typeof useKeepCollections>,\n) {\n return collections.map((collection) => ({\n id: collection.id,\n label: collectionLabels?.[collection.id] ?? collection.name,\n }));\n}\n\n/** A select that moves one item between derived collections. */\nexport function KeepCollectionSelect<TMeta = Record<string, unknown>>({\n item,\n value,\n defaultValue,\n onValueChange,\n onChange,\n collectionLabels,\n uncategorizedLabel,\n ...props\n}: KeepCollectionControlProps & { item: KeepItem<TMeta> }) {\n const context = useKeepContext<TMeta>();\n const state = useState(value ?? defaultValue ?? item.collectionId ?? \"\");\n const selected = value ?? state[0];\n const collections = useKeepCollections<TMeta>({ targetType: item.targetType, orderBy: \"name\" });\n const options = useCollectionOptions(collectionLabels, collections);\n const defaultUncategorizedLabel = useUiLabel(\"uncategorized\");\n const uncategorized = uncategorizedLabel ?? defaultUncategorizedLabel;\n const handleChange = (next: string) => {\n const resolved = next || undefined;\n if (value === undefined) state[1](next);\n onValueChange?.(resolved);\n onChange?.(resolved);\n void context.moveToCollection(item.id, resolved);\n };\n return (\n <select\n {...props}\n value={selected}\n onChange={(event) => handleChange(event.currentTarget.value)}\n data-keep-action=\"move-collection\"\n >\n <option value=\"\">{uncategorized}</option>\n {options.map((option) => (\n <option key={option.id} value={option.id}>\n {option.label}\n </option>\n ))}\n </select>\n );\n}\n\n/** A select filter for the collections derived from current items. */\nexport function KeepCollectionFilter<TMeta = Record<string, unknown>>({\n value,\n defaultValue,\n onValueChange,\n onChange,\n collectionLabels,\n allLabel,\n uncategorizedLabel,\n ...props\n}: KeepCollectionControlProps) {\n const [internalValue, setInternalValue] = useState(value ?? defaultValue ?? \"\");\n const selected = value ?? internalValue;\n const collections = useKeepCollections<TMeta>({ orderBy: \"name\" });\n const options = useCollectionOptions(collectionLabels, collections);\n const collectionLabel = useUiLabel(\"collection\");\n const defaultAllLabel = useUiLabel(\"allCollections\");\n const defaultUncategorizedLabel = useUiLabel(\"uncategorized\");\n const all = allLabel ?? defaultAllLabel;\n const uncategorized = uncategorizedLabel ?? defaultUncategorizedLabel;\n const handleChange = (next: string) => {\n if (value === undefined) setInternalValue(next);\n const resolved = next || undefined;\n onValueChange?.(resolved);\n onChange?.(resolved);\n };\n return (\n <label data-keepkit=\"collection-filter\">\n <span>{collectionLabel}</span>\n <select\n {...props}\n value={selected}\n onChange={(event) => handleChange(event.currentTarget.value)}\n data-keep-action=\"filter-collection\"\n >\n <option value=\"\">{all}</option>\n <option value=\"__uncategorized__\">{uncategorized}</option>\n {options.map((option) => (\n <option key={option.id} value={option.id}>\n {option.label}\n </option>\n ))}\n </select>\n </label>\n );\n}\n","\"use client\";\n\nimport type { KeepListQuery } from \"@keepkit/core/core\";\nimport { type HTMLAttributes, isValidElement, type ReactNode } from \"react\";\nimport { type RenderProp, renderRoot } from \"../../foundation/shared\";\nimport { useKeepTagFilter } from \"./hooks/useKeepTagFilter\";\n\nexport type KeepTagFilterState = {\n tags: string[];\n tagCounts: Record<string, number>;\n value?: string;\n select: (tag?: string) => void;\n};\n\nexport type KeepTagFilterProps<TMeta = Record<string, unknown>> = Omit<\n HTMLAttributes<HTMLElement>,\n \"children\" | \"onChange\"\n> & {\n query?: KeepListQuery<TMeta>;\n value?: string;\n defaultValue?: string;\n onChange?: (tag?: string) => void;\n onValueChange?: (tag?: string) => void;\n allLabel?: ReactNode;\n ariaLabel?: string;\n renderTag?: (tag: string, count: number, selected: boolean) => ReactNode;\n render?: RenderProp<KeepTagFilterState>;\n children?: ReactNode | RenderProp<KeepTagFilterState>;\n asChild?: boolean;\n};\n\n/** An ARIA button group for tag filtering; consumers can connect value to a collection query. */\nexport function KeepTagFilter<TMeta = Record<string, unknown>>({\n query,\n value: controlledValue,\n defaultValue,\n onChange,\n onValueChange,\n allLabel,\n ariaLabel,\n renderTag,\n render,\n children,\n asChild = false,\n className,\n ...rootProps\n}: KeepTagFilterProps<TMeta>) {\n const view = useKeepTagFilter<TMeta>({ query, controlledValue, defaultValue, onChange, onValueChange });\n const contentChildren = asChild && isValidElement(children) ? undefined : children;\n const body = render\n ? render(view.state)\n : typeof contentChildren === \"function\"\n ? contentChildren(view.state)\n : (contentChildren ?? (\n <fieldset>\n <legend>{ariaLabel ?? view.labels.aria}</legend>\n <button\n type=\"button\"\n data-keep-action=\"filter-all-tags\"\n aria-pressed={view.state.value === undefined}\n onClick={() => view.state.select()}\n >\n {allLabel ?? view.labels.all}\n </button>\n {view.state.tags.map((tag) => (\n <button\n key={tag}\n type=\"button\"\n data-keep-action=\"filter-tag\"\n aria-pressed={view.state.value === tag}\n onClick={() => view.state.select(tag)}\n >\n {renderTag ? renderTag(tag, view.state.tagCounts[tag] ?? 0, view.state.value === tag) : tag}\n <span> ({view.state.tagCounts[tag] ?? 0})</span>\n </button>\n ))}\n </fieldset>\n ));\n return renderRoot(\n asChild,\n isValidElement(children) ? children : undefined,\n {\n ...rootProps,\n className,\n \"data-keepkit\": \"tag-filter\",\n \"data-state\": view.state.value === undefined ? \"all\" : \"filtered\",\n \"data-loading\": view.isLoading ? \"true\" : undefined,\n },\n body,\n \"KeepTagFilter\",\n );\n}\n","import type { KeepListQuery } from \"@keepkit/core/core\";\nimport { useKeepList } from \"@keepkit/core/react\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { useUiLabel } from \"../../../foundation/ui-context\";\nimport type { KeepTagFilterState } from \"../KeepTagFilter\";\n\ntype KeepTagFilterOptions<TMeta> = {\n query: KeepListQuery<TMeta> | undefined;\n controlledValue: string | undefined;\n defaultValue: string | undefined;\n onChange: ((tag?: string) => void) | undefined;\n onValueChange: ((tag?: string) => void) | undefined;\n};\n\nexport function useKeepTagFilter<TMeta>(options: KeepTagFilterOptions<TMeta>) {\n const { query, controlledValue, defaultValue, onChange, onValueChange } = options;\n const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue);\n const resolvedValue = controlledValue ?? uncontrolledValue;\n const list = useKeepList<TMeta>({\n ...query,\n tags: resolvedValue ? [...(query?.tags ?? []), resolvedValue] : query?.tags,\n });\n const select = useCallback(\n (tag?: string) => {\n if (controlledValue === undefined) setUncontrolledValue(tag);\n onChange?.(tag);\n onValueChange?.(tag);\n },\n [controlledValue, onChange, onValueChange],\n );\n const state = useMemo<KeepTagFilterState>(\n () => ({ tags: list.tags, tagCounts: list.tagCounts, value: resolvedValue, select }),\n [list.tagCounts, list.tags, resolvedValue, select],\n );\n\n return {\n state,\n isLoading: list.isLoading,\n labels: { all: useUiLabel(\"allTags\"), aria: useUiLabel(\"filterTags\") },\n };\n}\n","import type { KeepListQuery } from \"@keepkit/core/core\";\nimport type { ChangeEvent } from \"react\";\nimport { useEffect, useState } from \"react\";\nimport { useUiLabel } from \"../../../foundation/ui-context\";\nimport type { KeepSortValue } from \"../query-controls\";\n\ntype KeepSearchInputOptions = {\n controlledValue: string | undefined;\n defaultValue: string;\n debounceMs: number;\n onValueChange: ((value: string) => void) | undefined;\n};\n\nexport function useKeepSearchInput(options: KeepSearchInputOptions) {\n const { controlledValue, defaultValue, debounceMs, onValueChange } = options;\n const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue);\n const value = controlledValue ?? uncontrolledValue;\n useEffect(() => {\n if (!onValueChange) return;\n if (debounceMs <= 0) {\n onValueChange(value);\n return;\n }\n const timer = window.setTimeout(() => onValueChange(value), debounceMs);\n return () => window.clearTimeout(timer);\n }, [debounceMs, onValueChange, value]);\n\n return {\n value,\n label: useUiLabel(\"search\"),\n change: (event: ChangeEvent<HTMLInputElement>) => {\n if (controlledValue === undefined) setUncontrolledValue(event.currentTarget.value);\n },\n };\n}\n\ntype KeepSortSelectOptions = {\n controlledValue: KeepSortValue | undefined;\n defaultValue: KeepSortValue;\n onValueChange: ((value: KeepSortValue, sort: NonNullable<KeepListQuery[\"sort\"]>) => void) | undefined;\n};\n\nexport function useKeepSortSelect(options: KeepSortSelectOptions) {\n const { controlledValue, defaultValue, onValueChange } = options;\n const [uncontrolledValue, setUncontrolledValue] = useState<KeepSortValue>(defaultValue);\n const value = controlledValue ?? uncontrolledValue;\n\n return {\n value,\n change: (event: ChangeEvent<HTMLSelectElement>) => {\n const nextValue = event.currentTarget.value as KeepSortValue;\n if (controlledValue === undefined) setUncontrolledValue(nextValue);\n const [by, direction] = nextValue.split(\":\") as [\"savedAt\" | \"updatedAt\", \"asc\" | \"desc\"];\n onValueChange?.(nextValue, { by, direction });\n },\n labels: {\n sort: useUiLabel(\"sort\"),\n updatedNewest: useUiLabel(\"updatedNewest\"),\n updatedOldest: useUiLabel(\"updatedOldest\"),\n savedNewest: useUiLabel(\"savedNewest\"),\n savedOldest: useUiLabel(\"savedOldest\"),\n },\n };\n}\n\ntype KeepPaginationOptions = {\n totalCount: number;\n pageSize: number;\n page: number;\n maxPageButtons: number;\n onPageChange: ((page: number, offset: number) => void) | undefined;\n};\n\nexport function useKeepPagination(options: KeepPaginationOptions) {\n const { totalCount, pageSize, page, maxPageButtons, onPageChange } = options;\n const pageCount = Math.max(1, Math.ceil(totalCount / Math.max(1, pageSize)));\n const currentPage = Math.min(Math.max(1, page), pageCount);\n const goToPage = (nextPage: number) => {\n const next = Math.min(Math.max(1, nextPage), pageCount);\n onPageChange?.(next, (next - 1) * pageSize);\n };\n\n return {\n pageCount,\n currentPage,\n goToPage,\n visiblePages: getVisiblePages(currentPage, pageCount, Math.max(1, maxPageButtons)),\n labels: {\n previous: useUiLabel(\"previousPage\"),\n next: useUiLabel(\"nextPage\"),\n page: useUiLabel(\"page\"),\n pagination: useUiLabel(\"pagination\"),\n },\n };\n}\n\nfunction getVisiblePages(currentPage: number, pageCount: number, maxPageButtons: number): number[] {\n if (pageCount <= maxPageButtons) return Array.from({ length: pageCount }, (_, index) => index + 1);\n const half = Math.floor(maxPageButtons / 2);\n const start = Math.min(Math.max(1, currentPage - half), pageCount - maxPageButtons + 1);\n return Array.from({ length: maxPageButtons }, (_, index) => start + index);\n}\n","\"use client\";\n\nimport type { KeepListQuery } from \"@keepkit/core/core\";\nimport type { InputHTMLAttributes, ReactNode, SelectHTMLAttributes } from \"react\";\nimport { useKeepPagination, useKeepSearchInput, useKeepSortSelect } from \"./hooks/useQueryControls\";\n\nexport type KeepSearchInputProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"value\" | \"defaultValue\" | \"onChange\"\n> & {\n value?: string;\n defaultValue?: string;\n /** Delay before notifying consumers; set to 0 to disable debouncing. */\n debounceMs?: number;\n onValueChange?: (value: string) => void;\n};\n\n/** A controlled/uncontrolled search field with a small built-in debounce. */\nexport function KeepSearchInput({\n value: controlledValue,\n defaultValue = \"\",\n debounceMs = 300,\n onValueChange,\n \"aria-label\": ariaLabel,\n placeholder,\n ...props\n}: KeepSearchInputProps) {\n const view = useKeepSearchInput({ controlledValue, defaultValue, debounceMs, onValueChange });\n\n return (\n <input\n {...props}\n data-keepkit=\"search-input\"\n data-keep-action=\"search\"\n type=\"search\"\n value={view.value}\n data-state={view.value ? \"active\" : \"idle\"}\n data-disabled={props.disabled ? \"true\" : undefined}\n aria-label={ariaLabel ?? view.label}\n placeholder={placeholder ?? view.label}\n onChange={view.change}\n />\n );\n}\n\nexport type KeepSortValue = \"savedAt:desc\" | \"savedAt:asc\" | \"updatedAt:desc\" | \"updatedAt:asc\";\n\nexport type KeepSortSelectProps = Omit<\n SelectHTMLAttributes<HTMLSelectElement>,\n \"value\" | \"defaultValue\" | \"onChange\"\n> & {\n value?: KeepSortValue;\n defaultValue?: KeepSortValue;\n onValueChange?: (value: KeepSortValue, sort: NonNullable<KeepListQuery[\"sort\"]>) => void;\n};\n\n/** Emits a normalized sort descriptor that can be passed directly to useKeepList. */\nexport function KeepSortSelect({\n value: controlledValue,\n defaultValue = \"updatedAt:desc\",\n onValueChange,\n \"aria-label\": ariaLabel,\n children,\n ...props\n}: KeepSortSelectProps) {\n const view = useKeepSortSelect({ controlledValue, defaultValue, onValueChange });\n const options = children ?? (\n <>\n <option value=\"updatedAt:desc\">{view.labels.updatedNewest}</option>\n <option value=\"updatedAt:asc\">{view.labels.updatedOldest}</option>\n <option value=\"savedAt:desc\">{view.labels.savedNewest}</option>\n <option value=\"savedAt:asc\">{view.labels.savedOldest}</option>\n </>\n );\n return (\n <select\n {...props}\n data-keepkit=\"sort-select\"\n data-keep-action=\"sort\"\n value={view.value}\n data-state=\"selected\"\n data-disabled={props.disabled ? \"true\" : undefined}\n aria-label={ariaLabel ?? view.labels.sort}\n onChange={view.change}\n >\n {options}\n </select>\n );\n}\n\nexport type KeepPaginationState = { page: number; pageCount: number; goToPage: (page: number) => void };\n\nexport type KeepPaginationProps = Omit<React.HTMLAttributes<HTMLElement>, \"children\"> & {\n totalCount: number;\n pageSize: number;\n page?: number;\n maxPageButtons?: number;\n onPageChange?: (page: number, offset: number) => void;\n render?: (state: KeepPaginationState) => ReactNode;\n};\n\n/** Accessible pagination with previous/next controls and numbered page buttons. */\nexport function KeepPagination({\n totalCount,\n pageSize,\n page = 1,\n maxPageButtons = 7,\n onPageChange,\n render,\n ...props\n}: KeepPaginationProps) {\n const view = useKeepPagination({ totalCount, pageSize, page, maxPageButtons, onPageChange });\n const navProps = {\n ...props,\n \"data-keepkit\": \"pagination\",\n \"aria-label\": props[\"aria-label\"] ?? view.labels.pagination,\n \"data-state\": view.pageCount > 1 ? \"active\" : \"idle\",\n };\n if (render)\n return (\n <nav {...navProps}>{render({ page: view.currentPage, pageCount: view.pageCount, goToPage: view.goToPage })}</nav>\n );\n return (\n <nav {...navProps}>\n <button\n type=\"button\"\n data-keep-action=\"previous-page\"\n onClick={() => view.goToPage(view.currentPage - 1)}\n disabled={view.currentPage <= 1}\n >\n {view.labels.previous}\n </button>\n {view.visiblePages.map((nextPage) => (\n <button\n key={nextPage}\n type=\"button\"\n data-keep-action=\"select-page\"\n aria-current={nextPage === view.currentPage ? \"page\" : undefined}\n aria-label={`${view.labels.page} ${nextPage}`}\n onClick={() => view.goToPage(nextPage)}\n >\n {nextPage}\n </button>\n ))}\n <button\n type=\"button\"\n data-keep-action=\"next-page\"\n onClick={() => view.goToPage(view.currentPage + 1)}\n disabled={view.currentPage >= view.pageCount}\n >\n {view.labels.next}\n </button>\n </nav>\n );\n}\n","import type { KeepListQuery, KeepUrlSyncOptions } from \"@keepkit/core/core\";\nimport { useKeepList } from \"@keepkit/core/react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { type KeepUrlAdapter, useKeepUrlSync } from \"../../../adapters/url-sync\";\nimport { sortToValue } from \"../../../foundation/shared\";\nimport type { KeepArchiveScope } from \"../../query/KeepArchiveScopeSelect\";\nimport type { KeepSortValue } from \"../../query/query-controls\";\nimport type { KeepCollectionFeature } from \"../KeepCollection\";\n\ntype KeepCollectionOptions<TMeta> = {\n query: KeepListQuery<TMeta>;\n pageSize: number;\n urlSync: boolean | KeepUrlSyncOptions;\n urlAdapter: KeepUrlAdapter | undefined;\n features: Partial<Record<KeepCollectionFeature, boolean>> | undefined;\n archiveScope: KeepArchiveScope | undefined;\n};\n\nexport function useKeepCollection<TMeta>({\n query,\n pageSize,\n urlSync,\n urlAdapter,\n features,\n archiveScope,\n}: KeepCollectionOptions<TMeta>) {\n const enabled = {\n search: true,\n sort: true,\n pagination: true,\n tagFilter: false,\n collectionFilter: false,\n bulkActions: false,\n tags: true,\n pin: false,\n archive: false,\n ...features,\n };\n const [searchValue, setSearchValue] = useState(query.search?.query ?? \"\");\n const [sort, setSort] = useState(query.sort ?? { by: \"updatedAt\" as const, direction: \"desc\" as const });\n const [activeTags, setActiveTags] = useState<string[]>(query.tags ?? []);\n const [activeCollection, setActiveCollection] = useState<string | undefined>(query.collectionId);\n const [page, setPage] = useState(query.pagination?.page ?? 1);\n const [activeArchiveScope, setActiveArchiveScope] = useState<KeepArchiveScope>(\n archiveScope ?? query.archiveScope ?? scopeFromArchived(query.archived),\n );\n useEffect(() => {\n if (archiveScope !== undefined) setActiveArchiveScope(archiveScope);\n }, [archiveScope]);\n const resolvedPageSize = query.pagination?.pageSize ?? pageSize;\n const resolvedQuery = useMemo<KeepListQuery<TMeta>>(\n () => ({\n ...query,\n archiveScope: activeArchiveScope,\n archived: activeArchiveScope === \"active\" ? false : activeArchiveScope === \"archived\" ? true : undefined,\n search: enabled.search ? { ...query.search, query: searchValue } : query.search,\n sort: enabled.sort ? sort : query.sort,\n tags: activeTags.length > 0 ? activeTags : undefined,\n collectionId: activeCollection && activeCollection !== \"__uncategorized__\" ? activeCollection : undefined,\n filter:\n activeCollection === \"__uncategorized__\"\n ? (item) => item.collectionId === undefined && (query.filter?.(item) ?? true)\n : query.filter,\n pagination: enabled.pagination ? { ...query.pagination, page, pageSize: resolvedPageSize } : query.pagination,\n }),\n [\n activeCollection,\n activeTags,\n enabled.pagination,\n enabled.search,\n enabled.sort,\n page,\n query,\n resolvedPageSize,\n searchValue,\n sort,\n activeArchiveScope,\n ],\n );\n useKeepUrlSync({\n enabled: Boolean(urlSync),\n query: resolvedQuery,\n onQueryChange: (nextOrUpdater) => {\n const next = typeof nextOrUpdater === \"function\" ? nextOrUpdater(resolvedQuery) : nextOrUpdater;\n setSearchValue(next.search?.query ?? \"\");\n setSort(next.sort ?? { by: \"updatedAt\", direction: \"desc\" });\n setActiveTags(next.tags ?? []);\n setActiveCollection(next.collectionId);\n setActiveArchiveScope(next.archiveScope ?? scopeFromArchived(next.archived));\n setPage(next.pagination?.page ?? 1);\n },\n options: typeof urlSync === \"object\" ? urlSync : {},\n adapter: urlAdapter,\n });\n const list = useKeepList<TMeta>(resolvedQuery);\n const allState = useKeepList<TMeta>({ archiveScope: \"all\" });\n\n return {\n enabled,\n searchValue,\n sortValue: sortToValue(sort),\n activeTags,\n activeCollection,\n archiveScope: activeArchiveScope,\n resolvedPageSize,\n resolvedQuery,\n list,\n allState,\n setSearchValue: (value: string) => {\n setSearchValue(value);\n setPage(1);\n },\n setSortValue: (_value: KeepSortValue, nextSort: NonNullable<KeepListQuery[\"sort\"]>) => {\n setSort(nextSort);\n setPage(1);\n },\n setTag: (value?: string) => {\n setActiveTags(value ? [value] : []);\n setPage(1);\n },\n setCollection: (value?: string) => {\n setActiveCollection(value);\n setPage(1);\n },\n setArchiveScope: (value: KeepArchiveScope) => {\n setActiveArchiveScope(value);\n setPage(1);\n },\n removeTag: (tagToRemove: string) => {\n setActiveTags((current) => current.filter((tag) => tag !== tagToRemove));\n setPage(1);\n },\n clearFilters: () => {\n setSearchValue(\"\");\n setActiveTags([]);\n setActiveCollection(undefined);\n setPage(1);\n },\n setPage,\n };\n}\n\nfunction scopeFromArchived(archived?: boolean): KeepArchiveScope {\n return archived === true ? \"archived\" : \"active\";\n}\n","\"use client\";\n\nimport type { KeepItem, KeepListQuery } from \"@keepkit/core/core\";\nimport { KeepErrorBoundary, type KeepErrorBoundaryProps, type UseKeepListResult } from \"@keepkit/core/react\";\nimport { type HTMLAttributes, isValidElement, type ReactNode, type Ref } from \"react\";\nimport {\n composeRefs,\n KeepSearchQueryProvider,\n type RenderProp,\n renderRoot,\n resolveContent,\n} from \"../../foundation/shared\";\nimport { KeepItemCard, type KeepItemCardProps, KeepItemCardSkeleton } from \"../item/KeepItemCard\";\nimport { KeepEmptyState } from \"../status/KeepEmptyState\";\nimport { useKeepListView } from \"./hooks/useKeepListView\";\nimport { useRovingTabIndex } from \"./hooks/useRovingTabIndex\";\nimport type { KeepLayoutPreset } from \"./KeepCollection\";\nimport { KeepReorderableList } from \"./KeepReorderableList\";\n\nexport type KeepListState<TMeta = Record<string, unknown>> = UseKeepListResult<TMeta>;\n\nexport type KeepListProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n ref?: Ref<HTMLElement> | { readonly current: unknown };\n query?: KeepListQuery<TMeta>;\n children?: ReactNode | RenderProp<KeepListState<TMeta>>;\n renderItem?: (item: KeepItem<TMeta>, state: KeepListState<TMeta>) => ReactNode;\n loading?: ReactNode | RenderProp<KeepListState<TMeta>>;\n /** Alias for `loading`. When neither is provided, layout-matched skeletons are rendered. */\n renderLoading?: ReactNode | RenderProp<KeepListState<TMeta>>;\n loadingCount?: number;\n empty?: ReactNode | RenderProp<KeepListState<TMeta>>;\n error?: ReactNode | RenderProp<KeepListState<TMeta>>;\n onClearFilters?: () => void;\n itemCardProps?: Omit<KeepItemCardProps<TMeta>, \"item\" | \"children\" | \"render\">;\n layout?: KeepLayoutPreset;\n reorderable?: boolean;\n onReorder?: (orderedIds: string[]) => void | Promise<void>;\n asChild?: boolean;\n fallback?: KeepErrorBoundaryProps[\"fallback\"];\n onBoundaryError?: KeepErrorBoundaryProps[\"onError\"];\n boundaryResetKey?: unknown;\n};\n\n/** A list primitive with built-in loading, empty, error, and removal states. */\nexport function KeepList<TMeta = Record<string, unknown>>(props: KeepListProps<TMeta>) {\n const { fallback, onBoundaryError, boundaryResetKey, ...listProps } = props;\n const content = <KeepListContent<TMeta> {...listProps} />;\n if (fallback === undefined && onBoundaryError === undefined) return content;\n return (\n <KeepErrorBoundary fallback={fallback} onError={onBoundaryError} resetKey={boundaryResetKey}>\n {content}\n </KeepErrorBoundary>\n );\n}\n\nfunction KeepListContent<TMeta = Record<string, unknown>>({\n query,\n children,\n renderItem,\n loading,\n renderLoading,\n loadingCount = 6,\n empty,\n error: errorContent,\n onClearFilters,\n itemCardProps,\n layout = \"list\",\n reorderable = false,\n onReorder,\n asChild = false,\n onKeyDown,\n onFocusCapture,\n className,\n ...rootProps\n}: KeepListProps<TMeta>) {\n const view = useKeepListView<TMeta>(query);\n const roving = useRovingTabIndex<HTMLDivElement>();\n const { state } = view;\n const body = getListBody(state, {\n children,\n renderItem,\n loading: renderLoading !== undefined ? renderLoading : loading,\n loadingCount,\n loadingLabel: view.labels.loading,\n empty,\n error: errorContent ?? view.labels.error,\n onClearFilters,\n allItemCount: view.allState.totalCount,\n query,\n itemCardProps,\n layout,\n reorderable,\n onReorder,\n reorder: state.reorder,\n });\n return renderRoot(\n asChild,\n asChild && isValidElement(children) ? children : undefined,\n {\n ...rootProps,\n className,\n \"data-keepkit\": \"list\",\n \"data-layout\": layout,\n \"aria-busy\": state.isLoading || rootProps[\"aria-busy\"],\n \"data-state\": getListState(state),\n \"data-loading\": state.isLoading ? \"true\" : undefined,\n \"data-roving-tabindex\": \"true\",\n role: rootProps.role ?? \"group\",\n ref: composeRefs(roving.ref as Ref<HTMLElement>, rootProps.ref as Ref<HTMLElement>),\n onKeyDown: (event) => {\n onKeyDown?.(event);\n if (!event.defaultPrevented) roving.onKeyDown(event);\n },\n onFocusCapture: (event) => {\n onFocusCapture?.(event);\n if (!event.defaultPrevented) roving.onFocusCapture(event);\n },\n },\n <KeepSearchQueryProvider query={query?.search?.query}>{body}</KeepSearchQueryProvider>,\n \"KeepList\",\n );\n}\n\nfunction getListState<TMeta>(state: KeepListState<TMeta>): \"loading\" | \"error\" | \"empty\" | \"ready\" {\n if (state.error && state.items.length === 0) return \"error\";\n if (state.isLoading && !state.isHydrated) return \"loading\";\n if (state.isHydrated && state.items.length === 0) return \"empty\";\n return \"ready\";\n}\n\nfunction getListBody<TMeta>(\n state: KeepListState<TMeta>,\n options: {\n children?: ReactNode | RenderProp<KeepListState<TMeta>>;\n renderItem?: (item: KeepItem<TMeta>, state: KeepListState<TMeta>) => ReactNode;\n loading: ReactNode | RenderProp<KeepListState<TMeta>> | undefined;\n loadingCount: number;\n loadingLabel: string;\n empty: ReactNode | RenderProp<KeepListState<TMeta>> | undefined;\n error: ReactNode | RenderProp<KeepListState<TMeta>>;\n onClearFilters?: () => void;\n allItemCount: number;\n query: KeepListQuery<TMeta> | undefined;\n itemCardProps?: Omit<KeepItemCardProps<TMeta>, \"item\" | \"children\" | \"render\">;\n layout: KeepLayoutPreset;\n reorderable: boolean;\n onReorder?: (orderedIds: string[]) => void | Promise<void>;\n reorder: (orderedIds: string[]) => Promise<void>;\n },\n): ReactNode {\n if (state.error && state.items.length === 0) return resolveContent(options.error, state);\n if (state.isLoading && !state.isHydrated) {\n if (options.loading !== undefined) return resolveContent(options.loading, state);\n const count = Number.isFinite(options.loadingCount) ? Math.max(0, Math.floor(options.loadingCount)) : 6;\n return (\n <>\n <span role=\"status\" data-keepkit=\"loading-label\">\n {options.loadingLabel}\n </span>\n <ul data-keepkit=\"skeleton-list\" data-layout={options.layout}>\n {Array.from({ length: count }, (_, index) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: Static loading placeholders never reorder.\n <li key={index}>\n <KeepItemCardSkeleton layout={options.layout} />\n </li>\n ))}\n </ul>\n </>\n );\n }\n if (state.isHydrated && state.items.length === 0) {\n if (options.empty !== undefined) return resolveContent(options.empty, state);\n return (\n <KeepEmptyState\n variant={options.allItemCount > 0 && hasActiveQueryFilters(options.query) ? \"empty-filtered\" : \"empty-storage\"}\n onClearFilters={options.onClearFilters}\n />\n );\n }\n if (typeof options.children === \"function\") return options.children(state);\n if (options.children !== undefined && !isValidElement(options.children)) return options.children;\n if (options.reorderable) {\n return (\n <KeepReorderableList\n items={state.items}\n onReorder={async (orderedIds) => {\n await options.reorder(orderedIds);\n await options.onReorder?.(orderedIds);\n }}\n renderItem={(item, reorderState) => (\n <>\n <button type=\"button\" {...reorderState.dragHandleProps}>\n ↕\n </button>\n {options.renderItem ? (\n options.renderItem(item, state)\n ) : (\n <KeepItemCard item={item} {...options.itemCardProps} />\n )}\n </>\n )}\n data-layout={options.layout}\n />\n );\n }\n return (\n <ul data-layout={options.layout}>\n {state.items.map((item) =>\n options.renderItem ? (\n options.renderItem(item, state)\n ) : (\n <li key={item.id}>\n <KeepItemCard item={item} {...options.itemCardProps} />\n </li>\n ),\n )}\n </ul>\n );\n}\n\nfunction hasActiveQueryFilters<TMeta>(query: KeepListQuery<TMeta> | undefined): boolean {\n if (!query) return false;\n return Boolean(\n query.search?.query?.trim() ||\n query.tags?.some((tag) => tag.trim()) ||\n query.targetType ||\n query.savedBetween ||\n (query.archiveScope !== undefined && query.archiveScope !== \"active\") ||\n query.collectionId ||\n query.filter,\n );\n}\n","\"use client\";\n\nimport type { KeepItem } from \"@keepkit/core/core\";\nimport {\n type ButtonHTMLAttributes,\n type ComponentType,\n createContext,\n createElement,\n type HTMLAttributeAnchorTarget,\n type HTMLAttributes,\n type ImgHTMLAttributes,\n isValidElement,\n type MouseEvent,\n type ReactNode,\n type Ref,\n type SyntheticEvent,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n} from \"react\";\nimport {\n KeepHighlight,\n type RenderProp,\n renderRoot,\n toKeepButtonItem,\n useKeepSearchQuery,\n} from \"../../foundation/shared\";\nimport { useUiLabel } from \"../../foundation/ui-context\";\nimport {\n KeepArchiveButton,\n type KeepArchiveButtonProps,\n KeepPinButton,\n type KeepPinButtonProps,\n} from \"../actions/KeepArchiveButton\";\nimport { KeepButton, type KeepButtonLabels, type KeepButtonProps } from \"../actions/KeepButton\";\nimport type { KeepLayoutPreset } from \"../collection/KeepCollection\";\nimport { KeepQuickEditor } from \"../editor/KeepQuickEditor\";\nimport { KeepStaleNotice } from \"../status/KeepStaleNotice\";\nimport { useKeepItemCard } from \"./hooks/useKeepItemCard\";\n\nexport type KeepItemCardState<TMeta = Record<string, unknown>> = {\n item: KeepItem<TMeta>;\n isSaved: boolean;\n isMutating: boolean;\n error: unknown | null;\n remove: () => Promise<void>;\n status: KeepItem[\"status\"];\n};\n\nexport type KeepItemCardLinkProps = {\n href: string;\n children?: ReactNode;\n target?: HTMLAttributeAnchorTarget;\n rel?: string;\n onClick?: (event: MouseEvent<HTMLElement>) => void;\n};\n\nexport type KeepImageProps = ImgHTMLAttributes<HTMLImageElement> & { src: string; alt: string };\n\nexport type KeepItemCardProps<TMeta = Record<string, unknown>> = Omit<\n HTMLAttributes<HTMLElement>,\n \"children\" | \"title\"\n> & {\n ref?: Ref<HTMLElement> | { readonly current: unknown };\n item: KeepItem<TMeta>;\n title?: ReactNode | ((item: KeepItem<TMeta>) => ReactNode);\n getTitle?: (item: KeepItem<TMeta>) => ReactNode;\n getImageProps?: (item: KeepItem<TMeta>, title: ReactNode) => KeepImageProps | undefined;\n imageComponent?: ComponentType<KeepImageProps>;\n renderImage?: (props: KeepImageProps, item: KeepItem<TMeta>) => ReactNode;\n renderTags?: (tags: string[], item: KeepItem<TMeta>) => ReactNode;\n showTags?: boolean;\n showSavedAt?: boolean;\n collectionLabels?: Record<string, string>;\n imageAlt?: string;\n render?: RenderProp<KeepItemCardState<TMeta>>;\n children?: ReactNode | RenderProp<KeepItemCardState<TMeta>>;\n removeLabel?: string;\n onRemoveError?: (error: unknown) => void;\n onRemoved?: (item: KeepItem<TMeta>) => void;\n onRetry?: (item: KeepItem<TMeta>) => void | Promise<void>;\n showSaveButton?: boolean;\n showPinButton?: boolean;\n showArchiveButton?: boolean;\n showEditButton?: boolean;\n onEdit?: (item: KeepItem<TMeta>) => void;\n editSlot?: (item: KeepItem<TMeta>, close: () => void) => ReactNode;\n saveButtonLabels?: KeepButtonLabels;\n asChild?: boolean;\n href?: string | ((item: KeepItem<TMeta>) => string | undefined);\n onOpen?: (item: KeepItem<TMeta>, event: MouseEvent<HTMLElement>) => void;\n linkTarget?: \"title\" | \"card\";\n linkComponent?: ComponentType<KeepItemCardLinkProps>;\n linkTargetAttribute?: HTMLAttributeAnchorTarget;\n linkRel?: string;\n highlightQuery?: string;\n};\n\nexport type KeepItemCardMediaProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> & {\n children?: ReactNode;\n fallback?: ReactNode;\n};\nexport type KeepItemCardContentProps = HTMLAttributes<HTMLDivElement>;\nexport type KeepItemCardTitleProps = Omit<HTMLAttributes<HTMLHeadingElement>, \"title\"> & {\n as?: \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n};\nexport type KeepItemCardTagsProps = HTMLAttributes<HTMLUListElement>;\nexport type KeepItemCardActionsProps = HTMLAttributes<HTMLDivElement>;\nexport type KeepItemCardSkeletonProps = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n layout?: KeepLayoutPreset;\n};\n\ntype KeepItemCardCompoundContext = {\n item: KeepItem<unknown>;\n collectionLabel?: string;\n resolvedTitle: ReactNode;\n renderTitle: (content: ReactNode) => ReactNode;\n image: ReactNode | null;\n imageStatus: \"loaded\" | \"error\" | \"loading\";\n fallbackLabel: string;\n tags: string[];\n tagsLabel: string;\n renderedTags: ReactNode | null;\n meta: ReactNode | null;\n error: ReactNode | null;\n actions: ReactNode;\n saveButtonLabels?: KeepButtonLabels;\n removeLabel: string;\n remove: () => Promise<void>;\n isMutating: boolean;\n saveAriaLabel: string;\n renderText: (content: ReactNode) => ReactNode;\n};\n\nconst KeepItemCardContext = createContext<KeepItemCardCompoundContext | null>(null);\n\nfunction useKeepItemCardCompound(part: string): KeepItemCardCompoundContext {\n const context = useContext(KeepItemCardContext);\n if (!context) throw new Error(`KeepItemCard.${part} must be rendered inside KeepItemCard.`);\n return context;\n}\n\n/** A low-dependency item presentation primitive with composable card parts. */\nfunction KeepItemCardRoot<TMeta = Record<string, unknown>>({\n item,\n title,\n getTitle,\n getImageProps,\n imageComponent: ImageComponent,\n renderImage,\n renderTags,\n showTags = true,\n showSavedAt = true,\n collectionLabels,\n imageAlt,\n render,\n children,\n removeLabel,\n onRemoveError,\n onRemoved,\n onRetry,\n showSaveButton = true,\n showPinButton = false,\n showArchiveButton = false,\n showEditButton = false,\n onEdit,\n editSlot,\n saveButtonLabels,\n asChild = false,\n href: hrefOption,\n onOpen,\n linkTarget = \"title\",\n linkComponent: LinkComponent,\n linkTargetAttribute,\n linkRel,\n highlightQuery,\n className,\n ...rootProps\n}: KeepItemCardProps<TMeta>) {\n const view = useKeepItemCard<TMeta>({\n item,\n title,\n getTitle,\n getImageProps,\n href: hrefOption,\n linkTargetAttribute,\n linkRel,\n onRemoveError,\n onRemoved,\n });\n const contextQuery = useKeepSearchQuery();\n const searchQuery = highlightQuery ?? contextQuery;\n const contentChildren = asChild && isValidElement(children) ? undefined : children;\n const [isEditOpen, setEditOpen] = useState(false);\n const editTriggerRef = useRef<HTMLButtonElement>(null);\n const editPanelId = useId();\n const editLabel = useUiLabel(\"editSavedItem\");\n const closeEdit = () => setEditOpen(false);\n useEffect(() => {\n if (!isEditOpen) editTriggerRef.current?.focus();\n }, [isEditOpen]);\n\n function renderLink(content: ReactNode): ReactNode {\n if (!view.href || !view.isAvailable) return content;\n const linkProps: KeepItemCardLinkProps = {\n href: view.href,\n target: view.resolvedLinkTarget,\n rel: view.resolvedLinkRel,\n onClick: (event) => onOpen?.(item, event),\n children: content,\n };\n return LinkComponent ? <LinkComponent {...linkProps} /> : <a {...linkProps} />;\n }\n\n function renderTitle(content: ReactNode): ReactNode {\n if (linkTarget !== \"title\") return content;\n if (view.isAvailable) return renderLink(content);\n return view.href ? (\n <span aria-disabled=\"true\" data-link-disabled=\"true\">\n {content}\n </span>\n ) : (\n content\n );\n }\n\n const resolvedImageProps = view.imageProps ? { ...view.imageProps, alt: imageAlt ?? view.imageProps.alt } : undefined;\n const imageSource = resolvedImageProps?.src;\n const [imageStatus, setImageStatus] = useState<\"loaded\" | \"error\" | \"loading\">(imageSource ? \"loading\" : \"error\");\n useEffect(() => {\n setImageStatus(imageSource ? \"loading\" : \"error\");\n }, [imageSource]);\n let image: ReactNode = null;\n if (resolvedImageProps) {\n const imagePropsWithHandlers: KeepImageProps = {\n ...resolvedImageProps,\n src: resolvedImageProps.src,\n alt: imageAlt ?? resolvedImageProps.alt,\n onLoad: (event: SyntheticEvent<HTMLImageElement, Event>) => {\n resolvedImageProps.onLoad?.(event);\n setImageStatus(\"loaded\");\n },\n onError: (event: SyntheticEvent<HTMLImageElement, Event>) => {\n resolvedImageProps.onError?.(event);\n setImageStatus(\"error\");\n },\n };\n image =\n renderImage?.(imagePropsWithHandlers, item) ??\n (ImageComponent ? (\n <ImageComponent {...imagePropsWithHandlers} />\n ) : (\n <img {...imagePropsWithHandlers} alt={imagePropsWithHandlers.alt} />\n ));\n }\n const tags = showTags ? (item.tags ?? []) : [];\n const renderedTags = showTags && tags.length > 0 ? (renderTags?.(tags, item) ?? null) : null;\n const meta = showSavedAt ? (\n <div data-card-meta>\n <span>{view.labels.savedAt}:</span>{\" \"}\n <time dateTime={new Date(item.savedAt).toISOString()}>{formatSavedAt(item.savedAt)}</time>\n </div>\n ) : null;\n const error = view.itemState.error ? (\n <p role=\"alert\">{getErrorMessage(view.itemState.error, view.labels.error)}</p>\n ) : null;\n const actions = view.statusLabel ? (\n <KeepStaleNotice item={item} onRetry={onRetry} onRemoved={onRemoved} />\n ) : (\n <>\n {showEditButton ? (\n <>\n <button\n ref={editTriggerRef}\n type=\"button\"\n data-keep-action=\"edit\"\n aria-label={editLabel}\n aria-haspopup=\"dialog\"\n aria-expanded={isEditOpen}\n aria-controls={editPanelId}\n onClick={() => {\n onEdit?.(item);\n setEditOpen(true);\n }}\n >\n {editLabel}\n </button>\n {isEditOpen ? (\n <div id={editPanelId} role=\"dialog\" aria-label={editLabel} data-keepkit=\"item-edit-dialog\">\n {editSlot ? (\n editSlot(item, closeEdit)\n ) : (\n <KeepQuickEditor item={view.itemState.item ?? item} onClose={closeEdit} />\n )}\n </div>\n ) : null}\n </>\n ) : null}\n {showSaveButton ? <KeepItemCardSave /> : null}\n {showPinButton ? <KeepItemCardPin /> : null}\n {showArchiveButton ? <KeepItemCardArchive /> : null}\n <KeepItemCardRemove />\n </>\n );\n const compoundValue: KeepItemCardCompoundContext = {\n item,\n collectionLabel: item.collectionId ? (collectionLabels?.[item.collectionId] ?? item.collectionId) : undefined,\n resolvedTitle: view.resolvedTitle,\n renderTitle,\n image: imageStatus === \"error\" ? null : image,\n imageStatus,\n fallbackLabel: String(view.resolvedTitle),\n tags,\n tagsLabel: view.labels.tags,\n renderedTags,\n meta,\n error,\n actions,\n saveButtonLabels,\n removeLabel: removeLabel ?? view.labels.remove,\n remove: view.remove,\n isMutating: view.itemState.isMutating,\n saveAriaLabel: `${view.labels.remove} ${String(view.resolvedTitle)}`,\n renderText: (content) => <KeepHighlight query={searchQuery}>{content}</KeepHighlight>,\n };\n const defaultBody = (\n <>\n <KeepItemCardMedia />\n <KeepItemCardContent />\n <KeepItemCardActions />\n </>\n );\n const body = render\n ? render(view.state)\n : typeof contentChildren === \"function\"\n ? contentChildren(view.state)\n : (contentChildren ?? defaultBody);\n const linkedBody = linkTarget === \"card\" && view.isAvailable ? renderLink(body) : body;\n const root = renderRoot(\n asChild,\n isValidElement(children) ? children : undefined,\n {\n ...rootProps,\n className,\n \"data-keepkit\": \"card\",\n \"aria-busy\": view.itemState.isMutating || rootProps[\"aria-busy\"],\n \"aria-disabled\": rootProps[\"aria-disabled\"] ?? (!view.isAvailable ? \"true\" : undefined),\n \"data-state\": view.itemState.error ? \"error\" : view.itemState.isSaved ? \"saved\" : \"unsaved\",\n \"data-status\": item.status ?? \"available\",\n \"data-item-status\": view.displayStatus,\n \"data-loading\": view.itemState.isMutating ? \"true\" : undefined,\n },\n linkedBody,\n \"KeepItemCard\",\n );\n return <KeepItemCardContext.Provider value={compoundValue}>{root}</KeepItemCardContext.Provider>;\n}\n\nfunction KeepItemCardMedia({ children, fallback, ...props }: KeepItemCardMediaProps) {\n const context = useKeepItemCardCompound(\"Media\");\n return (\n <div {...props} data-keep-card-part=\"media\" data-media-status={context.imageStatus} data-aspect-ratio=\"1/1\">\n {children ?? context.image ?? (\n <span role=\"img\" aria-label={context.fallbackLabel} data-keep-card-fallback=\"true\">\n {fallback ?? <KeepMediaPlaceholderIcon />}\n </span>\n )}\n </div>\n );\n}\n\nfunction KeepItemCardContent({ children, ...props }: KeepItemCardContentProps) {\n const context = useKeepItemCardCompound(\"Content\");\n return (\n <div {...props} data-keep-card-part=\"content\">\n {children === undefined ? (\n <>\n <KeepItemCardTitle />\n {context.meta}\n <KeepItemCardTags />\n {context.error}\n </>\n ) : (\n context.renderText(children)\n )}\n </div>\n );\n}\n\nfunction KeepItemCardTitle({ as = \"h3\", children, ...props }: KeepItemCardTitleProps) {\n const context = useKeepItemCardCompound(\"Title\");\n return createElement(\n as,\n { ...props, \"data-keep-card-part\": \"title\", \"data-line-clamp\": \"2\" },\n context.renderTitle(context.renderText(children ?? context.resolvedTitle)),\n );\n}\n\nfunction KeepMediaPlaceholderIcon() {\n return (\n <svg data-media-fallback-icon=\"true\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path\n d=\"M4 5.5A1.5 1.5 0 0 1 5.5 4h13A1.5 1.5 0 0 1 20 5.5v13a1.5 1.5 0 0 1-1.5 1.5h-13A1.5 1.5 0 0 1 4 18.5v-13Z\"\n fill=\"none\"\n stroke=\"currentColor\"\n />\n <circle cx=\"9\" cy=\"9\" r=\"1.5\" fill=\"currentColor\" />\n <path d=\"m5.5 18 4.5-4.5 3 3 2-2L19 18\" fill=\"none\" stroke=\"currentColor\" />\n </svg>\n );\n}\n\nfunction KeepItemCardTags({ children, ...props }: KeepItemCardTagsProps) {\n const context = useKeepItemCardCompound(\"Tags\");\n if (children === undefined && context.renderedTags) return context.renderedTags;\n if (children === undefined && context.tags.length === 0) return null;\n return (\n <ul {...props} aria-label={props[\"aria-label\"] ?? context.tagsLabel} data-keep-card-part=\"tags\">\n {children ?? context.tags.map((tag) => <li key={tag}>{tag}</li>)}\n </ul>\n );\n}\n\nfunction KeepItemCardActions({ children, ...props }: KeepItemCardActionsProps) {\n const context = useKeepItemCardCompound(\"Actions\");\n return (\n <div {...props} data-keep-card-part=\"actions\">\n {children ?? context.actions}\n </div>\n );\n}\n\nexport type KeepItemCardActionSlotProps = Omit<KeepPinButtonProps<unknown>, \"item\" | \"children\"> & {\n children?: ReactNode;\n};\nexport type KeepItemCardSaveProps = Omit<KeepButtonProps<unknown>, \"item\" | \"asChild\"> & { asChild?: false };\nexport type KeepItemCardRemoveProps = Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"children\"> & {\n children?: ReactNode;\n};\nexport type KeepItemCardBadgeProps = HTMLAttributes<HTMLSpanElement>;\n\nfunction KeepItemCardSave({ labels, getAriaLabel, ...props }: KeepItemCardSaveProps) {\n const context = useKeepItemCardCompound(\"Save\");\n return (\n <KeepButton<unknown>\n {...props}\n item={toKeepButtonItem(context.item)}\n asChild={false}\n labels={labels ?? context.saveButtonLabels}\n getAriaLabel={getAriaLabel ?? (() => context.saveAriaLabel)}\n />\n );\n}\n\nfunction KeepItemCardRemove({ children, disabled, onClick, ...props }: KeepItemCardRemoveProps) {\n const context = useKeepItemCardCompound(\"Remove\");\n return (\n <button\n {...props}\n type={props.type ?? \"button\"}\n data-keep-action=\"remove-item\"\n disabled={disabled ?? context.isMutating}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) void context.remove();\n }}\n >\n {children ?? context.removeLabel}\n </button>\n );\n}\n\nfunction KeepItemCardPin({ children, ...props }: KeepItemCardActionSlotProps) {\n const context = useKeepItemCardCompound(\"Pin\");\n return (\n <KeepPinButton<unknown> {...props} item={context.item}>\n {children}\n </KeepPinButton>\n );\n}\n\nfunction KeepItemCardArchive({\n children,\n ...props\n}: Omit<KeepArchiveButtonProps<unknown>, \"item\" | \"children\"> & { children?: ReactNode }) {\n const context = useKeepItemCardCompound(\"Archive\");\n return (\n <KeepArchiveButton<unknown> {...props} item={context.item}>\n {children}\n </KeepArchiveButton>\n );\n}\n\nfunction KeepItemCardCollectionBadge({ children, ...props }: KeepItemCardBadgeProps) {\n const context = useKeepItemCardCompound(\"CollectionBadge\");\n if (!context.item.collectionId) return null;\n return (\n <span {...props} data-keep-card-part=\"collection-badge\">\n {children ?? context.collectionLabel}\n </span>\n );\n}\n\nexport const KeepItemCard = Object.assign(KeepItemCardRoot, {\n Media: KeepItemCardMedia,\n Content: KeepItemCardContent,\n Title: KeepItemCardTitle,\n Tags: KeepItemCardTags,\n Actions: KeepItemCardActions,\n Save: KeepItemCardSave,\n Remove: KeepItemCardRemove,\n Pin: KeepItemCardPin,\n Archive: KeepItemCardArchive,\n CollectionBadge: KeepItemCardCollectionBadge,\n});\n\n/** A non-interactive placeholder that preserves the selected card layout while data loads. */\nexport function KeepItemCardSkeleton({ layout = \"list\", ...props }: KeepItemCardSkeletonProps) {\n return (\n <article {...props} aria-hidden=\"true\" data-keepkit=\"card-skeleton\" data-layout={layout} data-state=\"loading\">\n <span data-skeleton-part=\"media\" />\n <span data-skeleton-part=\"title\" />\n <span data-skeleton-part=\"meta\" />\n <span data-skeleton-part=\"tag\" />\n <span data-skeleton-part=\"tag\" />\n </article>\n );\n}\n\nfunction formatSavedAt(timestamp: number): string {\n return new Date(timestamp).toISOString().slice(0, 10);\n}\n\nfunction getErrorMessage(error: unknown, fallback: string): string {\n return error instanceof Error ? error.message : fallback;\n}\n","import type { KeepItemStatus } from \"@keepkit/core/core\";\nimport { type KeepUiLabelKey, useUiLabel } from \"../../../foundation/ui-context\";\nimport type { KeepDisplayStatus } from \"../KeepItemStatusBadge\";\n\nexport function useKeepItemStatusBadge(status: KeepItemStatus | \"restricted\") {\n return {\n resolvedStatus: getDisplayStatus(status),\n statusLabel: useUiLabel(getStatusLabelKey(status)),\n icon: getStatusIcon(status),\n };\n}\n\nexport type KeepStatusIconName = \"check\" | \"clock\" | \"ban\" | \"lock\";\n\nfunction getStatusIcon(status: KeepItemStatus | \"restricted\"): KeepStatusIconName {\n if (status === \"available\") return \"check\";\n if (status === \"expired\") return \"clock\";\n if (status === \"removed\" || status === \"deleted\") return \"ban\";\n return \"lock\";\n}\n\nfunction getStatusLabelKey(status: KeepItemStatus | \"restricted\"): KeepUiLabelKey {\n switch (status) {\n case \"available\":\n return \"statusAvailable\";\n case \"expired\":\n return \"statusExpired\";\n case \"removed\":\n return \"statusRemoved\";\n case \"deleted\":\n return \"statusDeleted\";\n case \"private\":\n return \"statusPrivate\";\n case \"unknown\":\n return \"statusUnknown\";\n case \"restricted\":\n return \"statusPrivate\";\n }\n}\n\nfunction getDisplayStatus(status: KeepItemStatus | \"restricted\"): KeepDisplayStatus {\n if (status === \"available\") return \"available\";\n if (status === \"expired\") return \"expired\";\n if (status === \"removed\" || status === \"deleted\") return \"removed\";\n return \"restricted\";\n}\n","\"use client\";\n\nimport type { KeepItemStatus } from \"@keepkit/core/core\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { useKeepItemStatusBadge } from \"./hooks/useKeepItemStatusBadge\";\n\nexport type KeepItemStatusBadgeProps = Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> & {\n status?: KeepItemStatus | \"restricted\";\n label?: ReactNode;\n};\n\nexport type KeepDisplayStatus = \"available\" | \"expired\" | \"removed\" | \"restricted\";\n\n/** Displays the normalized availability state of a saved item. */\nexport function KeepItemStatusBadge({ status = \"available\", label, className, ...props }: KeepItemStatusBadgeProps) {\n const view = useKeepItemStatusBadge(status);\n return (\n <span\n {...props}\n className={className}\n role=\"img\"\n aria-label={props[\"aria-label\"] ?? view.statusLabel}\n data-keepkit=\"status-badge\"\n data-status={status}\n data-item-status={view.resolvedStatus}\n >\n <StatusIcon name={view.icon} />\n <span data-status-label=\"true\">{label ?? view.statusLabel}</span>\n </span>\n );\n}\n\nfunction StatusIcon({ name }: { name: \"check\" | \"clock\" | \"ban\" | \"lock\" }) {\n return (\n <svg\n data-status-icon={name}\n viewBox=\"0 0 24 24\"\n width=\"1em\"\n height=\"1em\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n {name === \"check\" ? <path d=\"m5 12 4 4L19 6\" /> : null}\n {name === \"clock\" ? (\n <>\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n <path d=\"M12 7v5l3 2\" />\n </>\n ) : null}\n {name === \"ban\" ? (\n <>\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n <path d=\"m6.5 6.5 11 11\" />\n </>\n ) : null}\n {name === \"lock\" ? (\n <>\n <rect x=\"5\" y=\"10\" width=\"14\" height=\"10\" rx=\"2\" />\n <path d=\"M8 10V7a4 4 0 0 1 8 0v3\" />\n </>\n ) : null}\n </svg>\n );\n}\n","import type { KeepItem, KeepItemStatus } from \"@keepkit/core/core\";\nimport { useKeepContext } from \"@keepkit/core/react\";\nimport { useState } from \"react\";\nimport { useKeepUiFeedback, useUiLabel } from \"../../../foundation/ui-context\";\n\ntype KeepStaleNoticeOptions<TMeta> = {\n item: KeepItem<TMeta>;\n onRetry: ((item: KeepItem<TMeta>) => void | Promise<void>) | undefined;\n onRemoved: ((item: KeepItem<TMeta>) => void) | undefined;\n};\n\nexport function useKeepStaleNotice<TMeta>({ item, onRetry, onRemoved }: KeepStaleNoticeOptions<TMeta>) {\n const context = useKeepContext<TMeta>();\n const emitFeedback = useKeepUiFeedback<TMeta>();\n const removedMessage = useUiLabel(\"removedMessage\");\n const restoredMessage = useUiLabel(\"restoredMessage\");\n const undoLabel = useUiLabel(\"undo\");\n const [isRetrying, setIsRetrying] = useState(false);\n const [error, setError] = useState<unknown | null>(null);\n\n async function retry() {\n setError(null);\n setIsRetrying(true);\n try {\n if (onRetry) await onRetry(item);\n else await context.revalidateItems();\n } catch (cause) {\n setError(cause);\n } finally {\n setIsRetrying(false);\n }\n }\n\n async function remove() {\n try {\n await context.removeItemWithUndo(item.id);\n onRemoved?.(item);\n emitFeedback({\n type: \"item-removed\",\n item,\n message: removedMessage,\n undoLabel,\n undo: async () => {\n await context.undoLastRemoval();\n emitFeedback({ type: \"item-restored\", item, items: [item], message: restoredMessage });\n },\n });\n } catch (cause) {\n setError(cause);\n }\n }\n\n return {\n status: item.status && item.status !== \"available\" ? item.status : \"unknown\",\n error,\n isRetrying,\n isMutating: context.isMutating,\n retry,\n remove,\n labels: {\n retry: useUiLabel(\"retry\"),\n remove: useUiLabel(\"removeFromList\"),\n error: useUiLabel(\"error\"),\n },\n };\n}\n\ntype KeepPruneStaleOptions = {\n statuses: KeepItemStatus[];\n onPruned: ((ids: string[]) => void) | undefined;\n};\n\nexport function useKeepPruneStale<TMeta>({ statuses, onPruned }: KeepPruneStaleOptions) {\n const context = useKeepContext<TMeta>();\n const emitFeedback = useKeepUiFeedback<TMeta>();\n const staleItems = context.items.filter((item) => item.status && statuses.includes(item.status));\n const staleIds = staleItems.map((item) => item.id);\n const restoredMessage = useUiLabel(\"restoredMessage\");\n const prunedMessage = useUiLabel(\"stalePrunedMessage\");\n const undoLabel = useUiLabel(\"undo\");\n\n return {\n staleIds,\n isMutating: context.isMutating,\n label: useUiLabel(\"pruneStale\"),\n prune: async () => {\n const ids = [...staleIds];\n const items = [...staleItems];\n await context.removeItemsWithUndo(ids);\n onPruned?.(ids);\n if (items.length > 0) {\n emitFeedback({\n type: \"stale-pruned\",\n item: items[0],\n items,\n message: prunedMessage,\n undoLabel,\n undo: async () => {\n await context.undoLastRemoval();\n emitFeedback({ type: \"item-restored\", item: items[0], items, message: restoredMessage });\n },\n });\n }\n },\n };\n}\n","\"use client\";\n\nimport type { KeepItem, KeepItemStatus } from \"@keepkit/core/core\";\nimport type { ButtonHTMLAttributes, HTMLAttributes, ReactNode } from \"react\";\nimport { KeepItemStatusBadge } from \"../item/KeepItemStatusBadge\";\nimport { useKeepPruneStale, useKeepStaleNotice } from \"./hooks/useKeepStaleNotice\";\n\nexport type KeepStaleNoticeProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n item: KeepItem<TMeta>;\n onRetry?: (item: KeepItem<TMeta>) => void | Promise<void>;\n onRemoved?: (item: KeepItem<TMeta>) => void;\n retryLabel?: ReactNode;\n removeLabel?: ReactNode;\n children?: ReactNode;\n};\n\n/** Provides retry and remove actions for an item whose source is no longer available. */\nexport function KeepStaleNotice<TMeta = Record<string, unknown>>({\n item,\n onRetry,\n onRemoved,\n retryLabel,\n removeLabel,\n children,\n className,\n ...props\n}: KeepStaleNoticeProps<TMeta>) {\n const view = useKeepStaleNotice<TMeta>({ item, onRetry, onRemoved });\n\n return (\n <aside {...props} className={className} data-keepkit=\"stale-notice\" data-state={view.error ? \"error\" : \"stale\"}>\n <KeepItemStatusBadge status={view.status} />\n {children ?? (item.statusReason ? <p>{item.statusReason}</p> : null)}\n <div>\n <button\n type=\"button\"\n data-keep-action=\"retry-item\"\n onClick={() => void view.retry()}\n disabled={view.isRetrying || view.isMutating}\n >\n {retryLabel ?? view.labels.retry}\n </button>\n <button\n type=\"button\"\n data-keep-action=\"remove-item\"\n onClick={() => void view.remove()}\n disabled={view.isMutating}\n >\n {removeLabel ?? view.labels.remove}\n </button>\n </div>\n {view.error ? <p role=\"alert\">{view.error instanceof Error ? view.error.message : view.labels.error}</p> : null}\n </aside>\n );\n}\n\nexport type KeepPruneStaleButtonProps = Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"children\"> & {\n statuses?: KeepItemStatus[];\n label?: ReactNode;\n onPruned?: (ids: string[]) => void;\n children?: ReactNode;\n};\n\n/** Removes all unavailable items through the provider's undo-capable batch action. */\nexport function KeepPruneStaleButton<TMeta = Record<string, unknown>>({\n statuses = [\"expired\", \"removed\", \"deleted\", \"private\", \"unknown\"],\n label,\n onPruned,\n children,\n disabled,\n ...props\n}: KeepPruneStaleButtonProps) {\n const view = useKeepPruneStale<TMeta>({ statuses, onPruned });\n\n return (\n <button\n {...props}\n type=\"button\"\n className={props.className}\n data-keepkit=\"prune-stale\"\n data-keep-action=\"prune-stale\"\n data-state={view.staleIds.length > 0 ? \"available\" : \"empty\"}\n disabled={view.staleIds.length === 0 || view.isMutating || disabled}\n onClick={() => void view.prune()}\n >\n {children ?? label ?? `${view.label} (${view.staleIds.length})`}\n </button>\n );\n}\n","import type { KeepItem } from \"@keepkit/core/core\";\nimport { useKeepItem } from \"@keepkit/core/react\";\nimport type { ReactNode } from \"react\";\nimport { getMetaTitle } from \"../../../foundation/shared\";\nimport { useKeepUiFeedback, useUiLabel } from \"../../../foundation/ui-context\";\nimport type { KeepImageProps, KeepItemCardState } from \"../KeepItemCard\";\n\ntype KeepItemCardOptions<TMeta> = {\n item: KeepItem<TMeta>;\n title: ReactNode | ((item: KeepItem<TMeta>) => ReactNode);\n getTitle: ((item: KeepItem<TMeta>) => ReactNode) | undefined;\n getImageProps: ((item: KeepItem<TMeta>, title: ReactNode) => KeepImageProps | undefined) | undefined;\n href: string | ((item: KeepItem<TMeta>) => string | undefined) | undefined;\n linkTargetAttribute: React.HTMLAttributeAnchorTarget | undefined;\n linkRel: string | undefined;\n onRemoveError: ((error: unknown) => void) | undefined;\n onRemoved: ((item: KeepItem<TMeta>) => void) | undefined;\n};\n\nexport function useKeepItemCard<TMeta>(options: KeepItemCardOptions<TMeta>) {\n const {\n item,\n title,\n getTitle,\n getImageProps,\n href: hrefOption,\n linkTargetAttribute,\n linkRel,\n onRemoveError,\n onRemoved,\n } = options;\n const itemState = useKeepItem<TMeta>(item);\n const emitFeedback = useKeepUiFeedback<TMeta>();\n const removedMessage = useUiLabel(\"removedMessage\");\n const restoredMessage = useUiLabel(\"restoredMessage\");\n const undoLabel = useUiLabel(\"undo\");\n const resolvedTitle =\n typeof title === \"function\" ? title(item) : (title ?? getTitle?.(item) ?? getMetaTitle(item.meta) ?? item.id);\n const imageProps = getImageProps?.(item, resolvedTitle);\n const href = typeof hrefOption === \"function\" ? hrefOption(item) : hrefOption;\n const isAvailable = item.status === undefined || item.status === \"available\";\n const isExternalLink = href ? /^(?:[a-z][a-z\\d+.-]*:|\\/\\/)/i.test(href) : false;\n const statusLabelKey = item.status && item.status !== \"available\" ? getStatusLabelKey(item.status) : \"statusUnknown\";\n const unavailableLabel = useUiLabel(statusLabelKey);\n const remove = async () => {\n const wasSaved = itemState.isSaved;\n try {\n await itemState.removeWithUndo();\n onRemoved?.(item);\n if (!wasSaved) return;\n emitFeedback({\n type: \"item-removed\",\n item,\n message: removedMessage,\n undoLabel,\n undo: async () => {\n await itemState.undo();\n emitFeedback({ type: \"item-restored\", item, items: [item], message: restoredMessage });\n },\n });\n } catch (cause) {\n onRemoveError?.(cause);\n }\n };\n const state: KeepItemCardState<TMeta> = {\n item,\n isSaved: itemState.isSaved,\n isMutating: itemState.isMutating,\n error: itemState.error,\n remove,\n status: item.status,\n };\n\n return {\n itemState,\n state,\n resolvedTitle,\n imageProps,\n href,\n isAvailable,\n displayStatus: getDisplayStatus(item.status),\n resolvedLinkTarget: linkTargetAttribute ?? (isExternalLink ? \"_blank\" : undefined),\n resolvedLinkRel: linkRel ?? (isExternalLink ? \"noreferrer\" : undefined),\n statusLabel: item.status && item.status !== \"available\" ? unavailableLabel : undefined,\n remove,\n labels: {\n save: useUiLabel(\"save\"),\n savedAt: useUiLabel(\"saved\"),\n error: useUiLabel(\"error\"),\n remove: useUiLabel(\"remove\"),\n tags: useUiLabel(\"tags\"),\n },\n };\n}\n\nfunction getStatusLabelKey(\n status: NonNullable<KeepItem[\"status\"]>,\n): \"statusExpired\" | \"statusRemoved\" | \"statusDeleted\" | \"statusPrivate\" | \"statusUnknown\" {\n switch (status) {\n case \"expired\":\n return \"statusExpired\";\n case \"removed\":\n return \"statusRemoved\";\n case \"deleted\":\n return \"statusDeleted\";\n case \"private\":\n return \"statusPrivate\";\n default:\n return \"statusUnknown\";\n }\n}\n\nfunction getDisplayStatus(status: KeepItem[\"status\"]): \"available\" | \"expired\" | \"removed\" | \"restricted\" {\n if (status === undefined || status === \"available\") return \"available\";\n if (status === \"expired\") return \"expired\";\n if (status === \"removed\") return \"removed\";\n return \"restricted\";\n}\n","\"use client\";\n\nimport { type HTMLAttributes, isValidElement, type ReactNode } from \"react\";\nimport { renderRoot } from \"../../foundation/shared\";\nimport { useUiLabel } from \"../../foundation/ui-context\";\n\nexport type KeepEmptyStateVariant = \"empty-storage\" | \"empty-filtered\";\n\nexport type KeepEmptyStateProps = Omit<HTMLAttributes<HTMLElement>, \"children\" | \"title\"> & {\n title?: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n children?: ReactNode;\n variant?: KeepEmptyStateVariant;\n onClearFilters?: () => void;\n asChild?: boolean;\n};\n\n/** An accessible empty state that distinguishes an empty store from an empty filter result. */\nexport function KeepEmptyState({\n title,\n description,\n action,\n children,\n variant,\n onClearFilters,\n asChild = false,\n className,\n ...rootProps\n}: KeepEmptyStateProps) {\n const resolvedVariant = variant ?? \"empty-storage\";\n const defaultTitle = useUiLabel(resolvedVariant === \"empty-filtered\" ? \"noFilteredItems\" : \"noItems\");\n const defaultDescription = useUiLabel(\n resolvedVariant === \"empty-filtered\" ? \"noFilteredItemsDescription\" : \"emptyStorageDescription\",\n );\n const clearLabel = useUiLabel(\"clearFilters\");\n const contentChildren = asChild && isValidElement(children) ? undefined : children;\n const body = contentChildren ?? (\n <>\n <h2>{title ?? defaultTitle}</h2>\n {description ?? <p>{defaultDescription}</p>}\n {action ??\n (resolvedVariant === \"empty-filtered\" && onClearFilters ? (\n <button type=\"button\" data-keep-action=\"clear-filters\" onClick={onClearFilters}>\n {clearLabel}\n </button>\n ) : null)}\n </>\n );\n return renderRoot(\n asChild,\n children,\n { ...rootProps, className, \"data-keepkit\": \"empty-state\", \"data-state\": variant ?? \"empty\" },\n body,\n \"KeepEmptyState\",\n );\n}\n","import type { KeepListQuery } from \"@keepkit/core/core\";\nimport { useKeepList } from \"@keepkit/core/react\";\nimport { useUiLabel } from \"../../../foundation/ui-context\";\n\nexport function useKeepListView<TMeta>(query: KeepListQuery<TMeta> | undefined) {\n return {\n state: useKeepList<TMeta>(query),\n allState: useKeepList<TMeta>({}),\n labels: {\n loading: useUiLabel(\"loadingItems\"),\n empty: useUiLabel(\"noItems\"),\n error: useUiLabel(\"errorItems\"),\n },\n };\n}\n","import type { FocusEvent, KeyboardEvent, RefObject } from \"react\";\nimport { useCallback, useEffect, useRef } from \"react\";\n\ntype RovingHandlers<TElement extends HTMLElement> = {\n ref: RefObject<TElement | null>;\n onKeyDown: (event: KeyboardEvent<HTMLElement>) => void;\n onFocusCapture: (event: FocusEvent<HTMLElement>) => void;\n};\n\n/** Keeps cards in a group reachable through one tab stop and arrow-key movement. */\nexport function useRovingTabIndex<TElement extends HTMLElement>(): RovingHandlers<TElement> {\n const ref = useRef<TElement | null>(null);\n\n const getItems = useCallback((): HTMLElement[] => {\n const root = ref.current;\n if (!root) return [];\n return Array.from(root.querySelectorAll<HTMLElement>('[data-keepkit=\"card\"]')).filter(\n (item) => item.getAttribute(\"aria-hidden\") !== \"true\" && item.getAttribute(\"data-roving-disabled\") !== \"true\",\n );\n }, []);\n\n const syncTabIndices = useCallback(() => {\n const items = getItems();\n if (items.length === 0) return;\n const activeElement = document.activeElement;\n const activeItem = items.find((item) => item === activeElement || item.contains(activeElement));\n const activeIndex = activeItem ? items.indexOf(activeItem) : 0;\n items.forEach((item, index) => {\n item.tabIndex = index === activeIndex ? 0 : -1;\n });\n }, [getItems]);\n\n useEffect(() => {\n const root = ref.current;\n if (!root) return;\n syncTabIndices();\n const observer = new MutationObserver(syncTabIndices);\n observer.observe(root, { childList: true, subtree: true });\n return () => observer.disconnect();\n }, [syncTabIndices]);\n\n const onFocusCapture = useCallback(\n (event: FocusEvent<HTMLElement>) => {\n if (!(event.target instanceof HTMLElement)) return;\n const item = event.target.closest<HTMLElement>('[data-keepkit=\"card\"]');\n if (!item || !ref.current?.contains(item)) return;\n getItems().forEach((candidate) => {\n candidate.tabIndex = candidate === item ? 0 : -1;\n });\n },\n [getItems],\n );\n\n const onKeyDown = useCallback(\n (event: KeyboardEvent<HTMLElement>) => {\n if (event.defaultPrevented) return;\n const items = getItems();\n if (!(event.target instanceof HTMLElement)) return;\n const current = event.target.closest<HTMLElement>('[data-keepkit=\"card\"]');\n if (!current || current !== event.target || !ref.current?.contains(current)) return;\n const currentIndex = items.indexOf(current);\n if (currentIndex < 0) return;\n\n let nextIndex: number | undefined;\n if (event.key === \"Home\") nextIndex = 0;\n if (event.key === \"End\") nextIndex = items.length - 1;\n if (event.key === \"ArrowRight\" || event.key === \"ArrowDown\")\n nextIndex = Math.min(currentIndex + 1, items.length - 1);\n if (event.key === \"ArrowLeft\" || event.key === \"ArrowUp\") nextIndex = Math.max(currentIndex - 1, 0);\n if (nextIndex === undefined) return;\n\n event.preventDefault();\n if (nextIndex === currentIndex) return;\n items[nextIndex]?.focus();\n },\n [getItems],\n );\n\n return { ref, onKeyDown, onFocusCapture };\n}\n","\"use client\";\n\nimport type { KeepItem } from \"@keepkit/core/core\";\nimport type { HTMLAttributes, KeyboardEvent, ReactNode } from \"react\";\nimport { useState } from \"react\";\n\nexport type KeepReorderableItemState = {\n index: number;\n isDragging: boolean;\n dragHandleProps: {\n role: \"button\";\n tabIndex: 0;\n draggable: true;\n \"data-drag-handle\": \"true\";\n \"aria-label\": string;\n \"aria-grabbed\": boolean;\n onDragStart: () => void;\n onDragEnd: () => void;\n onKeyDown: (event: KeyboardEvent<HTMLElement>) => void;\n };\n moveUp: () => void;\n moveDown: () => void;\n};\n\nexport type KeepReorderableListProps<TItem extends { id: string } = KeepItem> = Omit<\n HTMLAttributes<HTMLUListElement>,\n \"children\" | \"onChange\"\n> & {\n items: readonly TItem[];\n onReorder: (orderedIds: string[]) => void | Promise<void>;\n renderItem: (item: TItem, state: KeepReorderableItemState) => ReactNode;\n itemLabel?: (item: TItem, index: number) => string;\n};\n\n/** Accessible drag-and-drop list with keyboard up/down fallback and no styling assumptions. */\nexport function KeepReorderableList<TItem extends { id: string } = KeepItem>({\n items,\n onReorder,\n renderItem,\n itemLabel = (_item, index) => `Move item ${index + 1}`,\n ...props\n}: KeepReorderableListProps<TItem>) {\n const [draggedId, setDraggedId] = useState<string | null>(null);\n const [dropTargetIndex, setDropTargetIndex] = useState<number | null>(null);\n const ids = items.map((item) => item.id);\n\n function commit(nextIds: string[]) {\n void onReorder(nextIds);\n }\n\n function move(index: number, targetIndex: number) {\n if (targetIndex < 0 || targetIndex >= ids.length || targetIndex === index) return;\n const next = [...ids];\n const [id] = next.splice(index, 1);\n if (id === undefined) return;\n next.splice(targetIndex, 0, id);\n commit(next);\n }\n\n function moveToInsertion(index: number, insertionIndex: number) {\n const next = [...ids];\n const [id] = next.splice(index, 1);\n if (id === undefined) return;\n const targetIndex = Math.min(\n Math.max(0, insertionIndex > index ? insertionIndex - 1 : insertionIndex),\n next.length,\n );\n next.splice(targetIndex, 0, id);\n if (next[index] === id) return;\n commit(next);\n }\n\n return (\n <ul {...props} data-keepkit=\"reorderable-list\">\n {items.map((item, index) => {\n const moveUp = () => move(index, index - 1);\n const moveDown = () => move(index, index + 1);\n const onHandleKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n if (event.key === \" \") {\n event.preventDefault();\n if (draggedId === item.id) {\n setDraggedId(null);\n setDropTargetIndex(null);\n } else {\n setDraggedId(item.id);\n setDropTargetIndex(index);\n }\n } else if (event.key === \"ArrowUp\") {\n event.preventDefault();\n moveUp();\n } else if (event.key === \"ArrowDown\") {\n event.preventDefault();\n moveDown();\n }\n };\n const state: KeepReorderableItemState = {\n index,\n isDragging: draggedId === item.id,\n moveUp,\n moveDown,\n dragHandleProps: {\n role: \"button\",\n tabIndex: 0,\n draggable: true,\n \"data-drag-handle\": \"true\",\n \"aria-label\": itemLabel(item, index),\n \"aria-grabbed\": draggedId === item.id,\n onDragStart: () => {\n setDraggedId(item.id);\n setDropTargetIndex(index);\n },\n onDragEnd: () => {\n setDraggedId(null);\n setDropTargetIndex(null);\n },\n onKeyDown: onHandleKeyDown,\n },\n };\n return (\n <li\n key={item.id}\n data-reorder-index={index}\n data-dragging={draggedId === item.id ? \"true\" : undefined}\n data-drop-target={\n draggedId && draggedId !== item.id\n ? dropTargetIndex === index\n ? \"before\"\n : dropTargetIndex === index + 1\n ? \"after\"\n : undefined\n : undefined\n }\n onDragOver={(event) => {\n if (!draggedId || draggedId === item.id) return;\n event.preventDefault();\n const bounds = event.currentTarget.getBoundingClientRect();\n const insertionIndex = event.clientY > bounds.top + bounds.height / 2 ? index + 1 : index;\n setDropTargetIndex(insertionIndex);\n }}\n onDragLeave={(event) => {\n if (event.currentTarget === event.target) setDropTargetIndex(null);\n }}\n onDrop={(event) => {\n event.preventDefault();\n if (!draggedId || draggedId === item.id) return;\n const sourceIndex = ids.indexOf(draggedId);\n setDraggedId(null);\n setDropTargetIndex(null);\n moveToInsertion(sourceIndex, dropTargetIndex ?? index);\n }}\n >\n {renderItem(item, state)}\n </li>\n );\n })}\n </ul>\n );\n}\n","\"use client\";\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { useRovingTabIndex } from \"./hooks/useRovingTabIndex\";\nimport type { KeepLayoutPreset } from \"./KeepCollection\";\n\nexport type KeepLayoutProps = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n layout?: KeepLayoutPreset;\n children?: ReactNode;\n};\n\n/** A container-aware layout wrapper with a stable preset attribute for host or theme CSS. */\nexport function KeepLayout({ layout = \"list\", children, onKeyDown, onFocusCapture, ...props }: KeepLayoutProps) {\n const roving = useRovingTabIndex<HTMLDivElement>();\n return (\n // biome-ignore lint/a11y/noStaticElementInteractions: The group manages keyboard focus for descendant cards.\n <div\n {...props}\n ref={roving.ref}\n data-keepkit=\"layout\"\n data-layout={layout}\n data-roving-tabindex=\"true\"\n role={props.role ?? \"group\"}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n if (!event.defaultPrevented) roving.onKeyDown(event);\n }}\n onFocusCapture={(event) => {\n onFocusCapture?.(event);\n if (!event.defaultPrevented) roving.onFocusCapture(event);\n }}\n >\n {children}\n </div>\n );\n}\n","\"use client\";\n\nimport type { KeepItem } from \"@keepkit/core/core\";\nimport { type FormHTMLAttributes, isValidElement, type ReactNode } from \"react\";\nimport { type RenderProp, renderRoot } from \"../../foundation/shared\";\nimport { KeepShortcutHint } from \"../navigation/KeepShortcutHint\";\nimport { useKeepNoteEditor } from \"./hooks/useKeepNoteEditor\";\n\nexport type KeepNoteEditorState<TMeta = Record<string, unknown>> = {\n item: KeepItem<TMeta>;\n note: string;\n setNote: (note: string) => void;\n isDirty: boolean;\n isSaving: boolean;\n error: unknown | null;\n save: () => Promise<void>;\n};\n\nexport type KeepNoteEditorProps<TMeta = Record<string, unknown>> = Omit<\n FormHTMLAttributes<HTMLFormElement>,\n \"children\" | \"onSubmit\"\n> & {\n item: KeepItem<TMeta>;\n label?: ReactNode;\n saveLabel?: ReactNode;\n placeholder?: string;\n /** Automatically save dirty notes after this delay; set to 0 to disable auto-save. */\n debounceMs?: number;\n showShortcutHint?: boolean;\n onSaved?: (note?: string) => void;\n onSaveError?: (error: unknown) => void;\n render?: RenderProp<KeepNoteEditorState<TMeta>>;\n children?: ReactNode | RenderProp<KeepNoteEditorState<TMeta>>;\n asChild?: boolean;\n};\n\n/** A controlled-by-default note editor that persists through useKeepItem. */\nexport function KeepNoteEditor<TMeta = Record<string, unknown>>({\n item,\n label,\n saveLabel,\n placeholder,\n debounceMs = 300,\n showShortcutHint = false,\n onSaved,\n onSaveError,\n render,\n children,\n asChild = false,\n className,\n ...formProps\n}: KeepNoteEditorProps<TMeta>) {\n const view = useKeepNoteEditor<TMeta>({ item, debounceMs, onSaved, onSaveError });\n const { error, isDirty, isSaving, note, setNote } = view.state;\n const contentChildren = asChild && isValidElement(children) ? undefined : children;\n const body = render\n ? render(view.state)\n : typeof contentChildren === \"function\"\n ? contentChildren(view.state)\n : (contentChildren ?? (\n <>\n <label>\n {label ?? view.labels.note}\n <textarea\n data-keep-action=\"edit-note\"\n value={note}\n onChange={(event) => setNote(event.currentTarget.value)}\n placeholder={placeholder}\n disabled={isSaving}\n onKeyDown={view.handleKeyDown}\n />\n </label>\n <button type=\"submit\" data-keep-action=\"save-note\" disabled={isSaving} aria-busy={isSaving}>\n {saveLabel ?? view.labels.save}\n {showShortcutHint ? <KeepShortcutHint shortcut=\"Ctrl+Enter\" /> : null}\n </button>\n </>\n ));\n if (!asChild) {\n return (\n <form\n {...formProps}\n className={className}\n data-keepkit=\"note-editor\"\n onSubmit={view.submit}\n aria-busy={isSaving || formProps[\"aria-busy\"]}\n data-state={error ? \"error\" : isDirty ? \"dirty\" : \"clean\"}\n data-loading={isSaving ? \"true\" : undefined}\n data-disabled={isSaving ? \"true\" : undefined}\n >\n {body}\n {error ? <p role=\"alert\">{getErrorMessage(error, view.labels.error)}</p> : null}\n </form>\n );\n }\n return renderRoot(\n true,\n isValidElement(children) ? children : undefined,\n {\n ...formProps,\n className,\n \"data-keepkit\": \"note-editor\",\n onSubmit: view.submit,\n \"aria-busy\": isSaving || formProps[\"aria-busy\"],\n \"data-state\": error ? \"error\" : isDirty ? \"dirty\" : \"clean\",\n \"data-loading\": isSaving ? \"true\" : undefined,\n \"data-disabled\": isSaving ? \"true\" : undefined,\n },\n body,\n \"KeepNoteEditor\",\n );\n}\n\nfunction getErrorMessage(error: unknown, fallback: string): string {\n return error instanceof Error ? error.message : fallback;\n}\n","\"use client\";\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\n\nexport type KeepShortcutHintProps = Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> & {\n shortcut: string | readonly string[];\n separator?: ReactNode;\n};\n\n/** Displays a keyboard shortcut using semantic kbd elements. */\nexport function KeepShortcutHint({ shortcut, separator = \"+\", ...props }: KeepShortcutHintProps) {\n const keys: readonly string[] = typeof shortcut === \"string\" ? shortcut.split(\"+\") : [...shortcut];\n const occurrences = new Map<string, number>();\n const keyedKeys = keys.map((key) => {\n const occurrence = occurrences.get(key) ?? 0;\n occurrences.set(key, occurrence + 1);\n return { id: `${key}-${occurrence}`, value: key };\n });\n return (\n <span {...props} data-keepkit=\"shortcut-hint\" aria-hidden={props[\"aria-hidden\"] ?? true}>\n {keyedKeys.map((key, index) => (\n <span key={key.id}>\n {index > 0 ? <span data-shortcut-separator=\"true\">{separator}</span> : null}\n <kbd>{key.value.trim()}</kbd>\n </span>\n ))}\n </span>\n );\n}\n","import type { KeepItem } from \"@keepkit/core/core\";\nimport { useKeepItem } from \"@keepkit/core/react\";\nimport type { FormHTMLAttributes, KeyboardEvent } from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useUiLabel } from \"../../../foundation/ui-context\";\nimport type { KeepNoteEditorState } from \"../KeepNoteEditor\";\n\ntype KeepNoteEditorOptions<TMeta> = {\n item: KeepItem<TMeta>;\n debounceMs: number;\n onSaved: ((note?: string) => void) | undefined;\n onSaveError: ((error: unknown) => void) | undefined;\n};\n\nexport function useKeepNoteEditor<TMeta>({ item, debounceMs, onSaved, onSaveError }: KeepNoteEditorOptions<TMeta>) {\n const itemState = useKeepItem<TMeta>(item);\n const { error, isMutating, item: savedItem, updateNote } = itemState;\n const [note, setNote] = useState(item.note ?? \"\");\n const baselineNote = savedItem?.note ?? item.note ?? \"\";\n const isDirty = note !== baselineNote;\n const lastSavedNoteRef = useRef<string | undefined>(undefined);\n\n useEffect(() => setNote(baselineNote), [baselineNote]);\n const save = useCallback(async () => {\n const nextNote = note.trim() || undefined;\n try {\n await updateNote(nextNote);\n lastSavedNoteRef.current = note;\n onSaved?.(nextNote);\n } catch (cause) {\n onSaveError?.(cause);\n throw cause;\n }\n }, [note, onSaveError, onSaved, updateNote]);\n useEffect(() => {\n if (!isDirty || debounceMs <= 0 || lastSavedNoteRef.current === note) return;\n const timer = window.setTimeout(() => void save().catch(() => undefined), debounceMs);\n return () => window.clearTimeout(timer);\n }, [debounceMs, isDirty, note, save]);\n\n const state: KeepNoteEditorState<TMeta> = {\n item,\n note,\n setNote,\n isDirty,\n isSaving: isMutating,\n error,\n save,\n };\n const submit: FormHTMLAttributes<HTMLFormElement>[\"onSubmit\"] = (event) => {\n event.preventDefault();\n void save().catch(() => undefined);\n };\n\n return {\n state,\n submit,\n handleKeyDown: (event: KeyboardEvent<HTMLTextAreaElement>) => {\n if (event.key !== \"Enter\" || (!event.ctrlKey && !event.metaKey)) return;\n event.preventDefault();\n void save().catch(() => undefined);\n },\n labels: {\n note: useUiLabel(\"note\"),\n save: useUiLabel(\"saveNote\"),\n error: useUiLabel(\"error\"),\n },\n };\n}\n","import type { KeepItem } from \"@keepkit/core/core\";\nimport { useKeepItem } from \"@keepkit/core/react\";\nimport type { FormEvent, KeyboardEvent } from \"react\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport { normalizeUiTags } from \"../../../foundation/shared\";\nimport { useUiLabel } from \"../../../foundation/ui-context\";\nimport type { KeepTagEditorState } from \"../KeepTagEditor\";\n\ntype KeepTagEditorOptions<TMeta> = {\n item: KeepItem<TMeta>;\n onSaved: ((tags?: string[]) => void) | undefined;\n onSaveError: ((error: unknown) => void) | undefined;\n};\n\nexport function useKeepTagEditor<TMeta>({ item, onSaved, onSaveError }: KeepTagEditorOptions<TMeta>) {\n const itemState = useKeepItem<TMeta>(item);\n const [tags, setTags] = useState(item.tags ?? []);\n const [input, setInput] = useState(\"\");\n useEffect(() => setTags(itemState.item?.tags ?? item.tags ?? []), [item.tags, itemState.item?.tags]);\n const save = useCallback(async () => {\n const nextTags = normalizeUiTags(tags);\n try {\n await itemState.updateTags(nextTags);\n setTags(nextTags);\n onSaved?.(nextTags);\n } catch (cause) {\n onSaveError?.(cause);\n throw cause;\n }\n }, [itemState, onSaveError, onSaved, tags]);\n const addTag = (tag: string) => {\n setTags(normalizeUiTags([...tags, tag]));\n setInput(\"\");\n };\n const state: KeepTagEditorState = { tags, setTags, save, isSaving: itemState.isMutating };\n\n return {\n state,\n input,\n setInput,\n error: itemState.error,\n handleInputKeyDown: (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Enter\") {\n if (event.nativeEvent.isComposing) return;\n event.preventDefault();\n if (input.trim()) addTag(input);\n } else if (event.key === \"Backspace\" && input.length === 0 && tags.length > 0) {\n event.preventDefault();\n setTags(tags.slice(0, -1));\n }\n },\n removeTag: (tag: string) => setTags(tags.filter((current) => current !== tag)),\n submit: (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n void save().catch(() => undefined);\n },\n labels: {\n tags: useUiLabel(\"tagsToApply\"),\n remove: useUiLabel(\"remove\"),\n apply: useUiLabel(\"applyTags\"),\n error: useUiLabel(\"error\"),\n },\n };\n}\n","\"use client\";\n\nimport type { KeepItem } from \"@keepkit/core/core\";\nimport type { FormHTMLAttributes } from \"react\";\nimport type { RenderProp } from \"../../foundation/shared\";\nimport { useKeepTagEditor } from \"./hooks/useKeepTagEditor\";\n\nexport type KeepTagEditorState = {\n tags: string[];\n setTags: (tags: string[]) => void;\n save: () => Promise<void>;\n isSaving: boolean;\n};\n\nexport type KeepTagEditorProps<TMeta = Record<string, unknown>> = Omit<\n FormHTMLAttributes<HTMLFormElement>,\n \"children\" | \"onSubmit\"\n> & {\n item: KeepItem<TMeta>;\n availableTags?: string[];\n onSaved?: (tags?: string[]) => void;\n onSaveError?: (error: unknown) => void;\n render?: RenderProp<KeepTagEditorState>;\n};\n\n/** Edits one item's normalized tag set; Enter adds and Backspace removes the last tag. */\nexport function KeepTagEditor<TMeta = Record<string, unknown>>({\n item,\n availableTags = [],\n onSaved,\n onSaveError,\n render,\n ...props\n}: KeepTagEditorProps<TMeta>) {\n const view = useKeepTagEditor<TMeta>({ item, onSaved, onSaveError });\n const { isSaving, tags } = view.state;\n const body = render ? (\n render(view.state)\n ) : (\n <>\n <label>\n {view.labels.tags}\n <input\n data-keep-action=\"edit-tags\"\n value={view.input}\n list={availableTags.length > 0 ? `keep-tags-${item.id}` : undefined}\n onChange={(event) => view.setInput(event.currentTarget.value)}\n onKeyDown={view.handleInputKeyDown}\n />\n </label>\n {availableTags.length > 0 ? (\n <datalist id={`keep-tags-${item.id}`}>\n {availableTags.map((tag) => (\n <option key={tag} value={tag} />\n ))}\n </datalist>\n ) : null}\n <ul aria-label={view.labels.tags}>\n {tags.map((tag) => (\n <li key={tag}>\n {tag}\n <button type=\"button\" data-keep-action=\"remove-tag\" onClick={() => view.removeTag(tag)}>\n {view.labels.remove}\n </button>\n </li>\n ))}\n </ul>\n <button type=\"submit\" data-keep-action=\"apply-tags\" disabled={isSaving} aria-busy={isSaving}>\n {view.labels.apply}\n </button>\n </>\n );\n return (\n <form\n {...props}\n onSubmit={view.submit}\n aria-busy={isSaving || props[\"aria-busy\"]}\n data-keepkit=\"tag-editor\"\n data-state={view.error ? \"error\" : isSaving ? \"saving\" : \"idle\"}\n data-loading={isSaving ? \"true\" : undefined}\n data-disabled={isSaving ? \"true\" : undefined}\n >\n {body}\n {view.error ? <p role=\"alert\">{getErrorMessage(view.error, view.labels.error)}</p> : null}\n </form>\n );\n}\n\nfunction getErrorMessage(error: unknown, fallback: string): string {\n return error instanceof Error ? error.message : fallback;\n}\n","import { useCallback } from \"react\";\nimport type { KeepUiFeedbackEvent } from \"../../foundation/ui-context\";\n\nexport type KeepToastFeedbackOptions = {\n action?: { label: string; onClick: () => void };\n};\n\nexport type KeepToastHandler = (message: string, options?: KeepToastFeedbackOptions) => unknown;\n\n/** Adapts KeepKit feedback to Sonner-like toast functions without adding a toast dependency. */\nexport function useKeepToastFeedback<TMeta = Record<string, unknown>>(showToast: KeepToastHandler) {\n return useCallback(\n (event: KeepUiFeedbackEvent<TMeta>) => {\n if (!(\"undo\" in event)) {\n showToast(event.message);\n return;\n }\n showToast(event.message, {\n action: {\n label: event.undoLabel,\n onClick: () => void event.undo(),\n },\n });\n },\n [showToast],\n );\n}\n","\"use client\";\n\nimport type { KeepItem } from \"@keepkit/core/core\";\nimport { type UseKeepNavigatorResult, useKeepNavigator } from \"@keepkit/core/react\";\nimport { type HTMLAttributes, type ReactNode, type Ref, useId } from \"react\";\nimport { getMetaTitle, renderRoot } from \"../../foundation/shared\";\nimport { useKeepUiLabels, useUiLabel } from \"../../foundation/ui-context\";\nimport { type KeepTourShortcutsOptions, useKeepTourShortcuts } from \"./hooks/useKeepTourShortcuts\";\nimport { KeepShortcutHint } from \"./KeepShortcutHint\";\n\nexport type KeepTourBarProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n ref?: Ref<HTMLElement> | { readonly current: unknown };\n navigation?: UseKeepNavigatorResult<TMeta>;\n currentId?: string;\n initialIndex?: number;\n showProgress?: boolean;\n prevHref?: string;\n nextHref?: string;\n backHref?: string;\n getItemHref?: (item: KeepItem<TMeta>) => string;\n getBackHref?: () => string;\n onNavigate?: (direction: \"prev\" | \"next\", item: KeepItem<TMeta>) => void;\n onPrev?: () => void | Promise<void>;\n onNext?: () => void | Promise<void>;\n onBack?: () => void | Promise<void>;\n prevLabel?: string;\n nextLabel?: string;\n backLabel?: string;\n keyboardShortcuts?: boolean;\n showShortcutHint?: boolean;\n shortcutOptions?: Omit<KeepTourShortcutsOptions, \"onNext\" | \"onPrev\">;\n progress?: ReactNode;\n getItemTitle?: (item: KeepItem<TMeta>) => ReactNode;\n children?: ReactNode;\n asChild?: boolean;\n};\n\n/** Headless previous/current/next navigation with optional URL links and keyboard shortcuts. */\nexport function KeepTourBar<TMeta = Record<string, unknown>>({\n navigation: providedNavigation,\n currentId,\n initialIndex,\n showProgress = true,\n prevHref,\n nextHref,\n backHref,\n getItemHref,\n getBackHref,\n onNavigate,\n onPrev,\n onNext,\n onBack,\n prevLabel,\n nextLabel,\n backLabel,\n keyboardShortcuts = false,\n showShortcutHint = false,\n shortcutOptions,\n progress,\n getItemTitle = (item) => getMetaTitle(item.meta) ?? item.id,\n children,\n asChild = false,\n ...props\n}: KeepTourBarProps<TMeta>) {\n const ownNavigation = useKeepNavigator<TMeta>({ currentId, initialIndex });\n const navigation = providedNavigation ?? ownNavigation;\n const previousLabel = useUiLabel(\"previousPage\", prevLabel);\n const nextItemLabel = useUiLabel(\"nextPage\", nextLabel);\n const listLabel = useUiLabel(\"allItems\", backLabel);\n const { labels } = useKeepUiLabels();\n const resolvedPrevHref = prevHref ?? (navigation.prevItem ? getItemHref?.(navigation.prevItem) : undefined);\n const resolvedNextHref = nextHref ?? (navigation.nextItem ? getItemHref?.(navigation.nextItem) : undefined);\n const resolvedBackHref = backHref ?? getBackHref?.();\n const navigateByKeyboard = (direction: \"prev\" | \"next\") => {\n const item = direction === \"prev\" ? navigation.goToPrev() : navigation.goToNext();\n if (!item) return;\n onNavigate?.(direction, item);\n const handler = direction === \"prev\" ? onPrev : onNext;\n if (handler) return handler();\n navigateTo(item, direction === \"prev\" ? resolvedPrevHref : resolvedNextHref);\n };\n const resolvedPrev = () => navigateByKeyboard(\"prev\");\n const resolvedNext = () => navigateByKeyboard(\"next\");\n const notifyPrevNavigation = () => {\n const item = navigation.prevItem;\n if (!item) return;\n navigation.goToPrev();\n onNavigate?.(\"prev\", item);\n void onPrev?.();\n };\n const notifyNextNavigation = () => {\n const item = navigation.nextItem;\n if (!item) return;\n navigation.goToNext();\n onNavigate?.(\"next\", item);\n void onNext?.();\n };\n useKeepTourShortcuts({\n ...shortcutOptions,\n enabled: keyboardShortcuts && (shortcutOptions?.enabled ?? true),\n onNext: () => {\n return resolvedNext();\n },\n onPrev: () => {\n return resolvedPrev();\n },\n });\n\n const body = (\n <>\n {showProgress ? (\n <span data-keepkit=\"tour-progress\" aria-live=\"polite\">\n {progress ?? `${navigation.currentPosition ?? 0} / ${navigation.items.length}`}\n </span>\n ) : null}\n <TourAction\n href={resolvedPrevHref}\n disabled={!navigation.hasPrev}\n onClick={resolvedPrevHref ? notifyPrevNavigation : resolvedPrev}\n data-keep-action=\"tour-prev\"\n shortcut={showShortcutHint ? (shortcutOptions?.prevKeys?.[0] ?? \"K\") : undefined}\n preview={\n navigation.prevItem ? (\n <>\n {previousLabel}: {getItemTitle(navigation.prevItem)}\n </>\n ) : undefined\n }\n >\n {previousLabel}\n </TourAction>\n <TourAction\n href={resolvedNextHref}\n disabled={!navigation.hasNext}\n onClick={resolvedNextHref ? notifyNextNavigation : resolvedNext}\n data-keep-action=\"tour-next\"\n shortcut={showShortcutHint ? (shortcutOptions?.nextKeys?.[0] ?? \"J\") : undefined}\n preview={\n navigation.nextItem ? (\n <>\n {nextItemLabel}: {getItemTitle(navigation.nextItem)}\n </>\n ) : undefined\n }\n >\n {nextItemLabel}\n </TourAction>\n {resolvedBackHref || onBack ? (\n <TourAction href={resolvedBackHref} onClick={onBack} data-keep-action=\"tour-back\">\n {listLabel}\n </TourAction>\n ) : null}\n </>\n );\n return renderRoot(\n asChild,\n children,\n { ...props, \"data-keepkit\": \"tour-bar\", \"aria-label\": props[\"aria-label\"] ?? labels.pagination },\n body,\n \"KeepTourBar\",\n );\n}\n\ntype TourActionProps = {\n href?: string;\n disabled?: boolean;\n onClick?: () => void | Promise<void>;\n children?: ReactNode;\n \"data-keep-action\": string;\n preview?: ReactNode;\n shortcut?: string;\n};\n\nfunction TourAction({ href, disabled = false, onClick, children, preview, shortcut, ...props }: TourActionProps) {\n const previewId = useId();\n const content = (\n <>\n <span data-tour-label=\"true\">{children}</span>\n {shortcut ? <KeepShortcutHint shortcut={shortcut} /> : null}\n {preview ? (\n <small id={previewId} data-tour-preview=\"true\">\n {preview}\n </small>\n ) : null}\n </>\n );\n if (href && !disabled) {\n return (\n <a\n {...props}\n href={href}\n onClick={() => void onClick?.()}\n aria-label={String(children)}\n aria-describedby={preview ? previewId : undefined}\n >\n {content}\n </a>\n );\n }\n return (\n <button\n {...props}\n type=\"button\"\n disabled={disabled}\n onClick={() => void onClick?.()}\n aria-label={String(children)}\n aria-describedby={preview ? previewId : undefined}\n >\n {content}\n </button>\n );\n}\n\nexport const KeepNavigator = KeepTourBar;\n\nfunction navigateTo(item: unknown, href?: string): void {\n if (!item || !href || typeof window === \"undefined\") return;\n window.location.assign(href);\n}\n","import { useEffect } from \"react\";\n\nexport type KeepTourShortcutsOptions = {\n onNext: () => void | Promise<void>;\n onPrev: () => void | Promise<void>;\n enabled?: boolean;\n allowInEditable?: boolean;\n preventDefault?: boolean;\n nextKeys?: readonly string[];\n prevKeys?: readonly string[];\n onError?: (error: unknown) => void;\n};\n\n/** Bind J/]/K/[ (or custom keys) to previous/next tour actions. */\nexport function useKeepTourShortcuts({\n onNext,\n onPrev,\n enabled = true,\n allowInEditable = false,\n preventDefault = true,\n nextKeys = [\"j\", \"]\"],\n prevKeys = [\"k\", \"[\"],\n onError,\n}: KeepTourShortcutsOptions): void {\n useEffect(() => {\n if (!enabled) return;\n const handleKeyDown = (event: KeyboardEvent) => {\n if (!allowInEditable && isEditableTarget(event.target)) return;\n if (event.metaKey || event.ctrlKey || event.altKey || event.shiftKey) return;\n const key = event.key.toLocaleLowerCase();\n const action = nextKeys.some((candidate) => candidate.toLocaleLowerCase() === key)\n ? onNext\n : prevKeys.some((candidate) => candidate.toLocaleLowerCase() === key)\n ? onPrev\n : undefined;\n if (!action) return;\n if (preventDefault) event.preventDefault();\n void Promise.resolve(action()).catch((error) => onError?.(error));\n };\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [allowInEditable, enabled, nextKeys, onError, onNext, onPrev, preventDefault, prevKeys]);\n}\n\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n return (\n target.isContentEditable ||\n target.tagName === \"INPUT\" ||\n target.tagName === \"TEXTAREA\" ||\n target.tagName === \"SELECT\"\n );\n}\n","\"use client\";\n\nimport type { KeepItem } from \"@keepkit/core/core\";\nimport { type HTMLAttributes, isValidElement, type ReactNode } from \"react\";\nimport { type RenderProp, renderRoot } from \"../../foundation/shared\";\nimport { useKeepAnnouncements, useKeepStatus } from \"./hooks/useStatusViews\";\n\nexport type { KeepEmptyStateProps, KeepEmptyStateVariant } from \"./KeepEmptyState\";\nexport { KeepEmptyState } from \"./KeepEmptyState\";\n\nexport type KeepStatusValue = \"idle\" | \"empty\" | \"loading\" | \"saving\" | \"syncing\" | \"error\";\nexport type KeepStatusLabels = Partial<Record<KeepStatusValue, ReactNode>>;\n\nexport type KeepStatusState<TMeta = Record<string, unknown>> = {\n status: KeepStatusValue;\n error: unknown | null;\n pendingCount: number;\n items: KeepItem<TMeta>[];\n};\n\nexport type KeepStatusProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n status?: KeepStatusValue;\n labels?: KeepStatusLabels;\n children?: ReactNode | RenderProp<KeepStatusState<TMeta>>;\n render?: RenderProp<KeepStatusState<TMeta>>;\n asChild?: boolean;\n};\n\n/** Presents provider loading, mutation, synchronization, empty, and error states accessibly. */\nexport function KeepStatus<TMeta = Record<string, unknown>>({\n status,\n labels,\n children,\n render,\n asChild = false,\n className,\n ...rootProps\n}: KeepStatusProps<TMeta>) {\n const view = useKeepStatus<TMeta>(status);\n const contentChildren = asChild && isValidElement(children) ? undefined : children;\n const body = render\n ? render(view.state)\n : typeof contentChildren === \"function\"\n ? contentChildren(view.state)\n : (contentChildren ?? labels?.[view.state.status] ?? view.defaultLabel);\n const role = rootProps.role ?? (view.state.status === \"error\" ? \"alert\" : \"status\");\n return renderRoot(\n asChild,\n isValidElement(children) ? children : undefined,\n {\n ...rootProps,\n className,\n \"data-keepkit\": \"status\",\n role,\n \"aria-live\": rootProps[\"aria-live\"] ?? \"polite\",\n \"data-state\": view.state.status,\n \"data-loading\":\n view.state.status === \"loading\" || view.state.status === \"saving\" || view.state.status === \"syncing\"\n ? \"true\"\n : undefined,\n },\n body,\n \"KeepStatus\",\n );\n}\n\nexport type KeepAnnouncementsProps = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n messages?: Partial<Record<\"save\" | \"remove\" | \"note\", string>>;\n};\n\n/** Announces successful save, remove, and note operations in a polite live region. */\nexport function KeepAnnouncements<TMeta = Record<string, unknown>>({ messages, ...props }: KeepAnnouncementsProps) {\n const message = useKeepAnnouncements<TMeta>(messages);\n return (\n <div\n {...props}\n role={props.role ?? \"status\"}\n aria-live={props[\"aria-live\"] ?? \"polite\"}\n aria-atomic=\"true\"\n data-keepkit=\"announcements\"\n data-state=\"announcing\"\n >\n {message}\n </div>\n );\n}\n\n/** Singular alias for applications that mount one announcer explicitly. */\nexport const KeepAnnouncer = KeepAnnouncements;\n","import type { KeepChangeContext } from \"@keepkit/core/core\";\nimport { useKeepContext } from \"@keepkit/core/react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { type KeepUiLabelKey, useUiLabel } from \"../../../foundation/ui-context\";\nimport type { KeepAnnouncementsProps, KeepStatusState, KeepStatusValue } from \"../status\";\n\nexport function useKeepEmptyState() {\n return useUiLabel(\"noItems\").replace(/\\.$/, \"\");\n}\n\nexport function useKeepStatus<TMeta>(status: KeepStatusValue | undefined) {\n const context = useKeepContext<TMeta>();\n const resolvedStatus = status ?? getDerivedStatus(context);\n const state: KeepStatusState<TMeta> = {\n status: resolvedStatus,\n error: context.error,\n pendingCount: context.syncState.pendingCount,\n items: context.items,\n };\n return { state, defaultLabel: useUiLabel(getStatusLabelKey(resolvedStatus)) };\n}\n\nexport function useKeepAnnouncements<TMeta>(messages: KeepAnnouncementsProps[\"messages\"]) {\n const context = useKeepContext<TMeta>();\n const savedMessage = useUiLabel(\"savedMessage\", messages?.save);\n const removedMessage = useUiLabel(\"removedMessage\", messages?.remove);\n const noteSavedMessage = useUiLabel(\"noteSavedMessage\", messages?.note);\n const [message, setMessage] = useState(\"\");\n const lastChangeRef = useRef<KeepChangeContext<TMeta> | undefined>(undefined);\n useEffect(() => {\n const change = context.lastChange;\n if (!change || change === lastChangeRef.current) return;\n lastChangeRef.current = change;\n if (change.action === \"save\") setMessage(savedMessage);\n else if (change.action === \"remove\" || change.action === \"removeBatch\") setMessage(removedMessage);\n else if (change.action === \"updateNote\") setMessage(noteSavedMessage);\n }, [context.lastChange, noteSavedMessage, removedMessage, savedMessage]);\n return message;\n}\n\nfunction getDerivedStatus<TMeta>(context: ReturnType<typeof useKeepContext<TMeta>>): KeepStatusValue {\n if (context.error) return \"error\";\n if (context.syncState.status === \"pending\" || context.syncState.status === \"syncing\") return \"syncing\";\n if (context.isMutating) return \"saving\";\n if (context.isLoading && !context.isHydrated) return \"loading\";\n if (context.isHydrated && context.items.length === 0) return \"empty\";\n return \"idle\";\n}\n\nfunction getStatusLabelKey(status: KeepStatusValue): KeepUiLabelKey {\n if (status === \"empty\") return \"noItems\";\n if (status === \"loading\") return \"loadingItems\";\n if (status === \"error\") return \"error\";\n if (status === \"saving\") return \"saving\";\n if (status === \"syncing\") return \"syncing\";\n return \"saved\";\n}\n","import type { KeepSyncStatus } from \"@keepkit/core/core\";\nimport { useKeepContext } from \"@keepkit/core/react\";\nimport { useEffect, useRef } from \"react\";\nimport { useKeepUiFeedback, useUiLabel } from \"../../../foundation/ui-context\";\n\n/** Observes provider-level synchronization transitions for the feedback event bus. */\nexport function useKeepSyncFeedback() {\n const { syncState } = useKeepContext();\n const emitFeedback = useKeepUiFeedback();\n const completedMessage = useUiLabel(\"syncSynced\");\n const failedMessage = useUiLabel(\"syncFailedMessage\");\n const previousStatus = useRef<KeepSyncStatus>(\"idle\");\n\n useEffect(() => {\n const previous = previousStatus.current;\n previousStatus.current = syncState.status;\n if (syncState.status === \"error\" && previous !== \"error\") {\n emitFeedback({ type: \"sync-failed\", error: syncState.error, message: failedMessage });\n return;\n }\n if (\n syncState.status === \"synced\" &&\n (previous === \"pending\" || previous === \"syncing\" || previous === \"conflict\" || previous === \"error\")\n ) {\n emitFeedback({ type: \"sync-completed\", message: completedMessage });\n }\n }, [completedMessage, emitFeedback, failedMessage, syncState.error, syncState.status]);\n}\n","\"use client\";\n\nimport { useKeepSyncFeedback } from \"./hooks/useKeepSyncFeedback\";\n\nexport function KeepSyncFeedbackObserver() {\n useKeepSyncFeedback();\n return null;\n}\n","import type { KeepItem, KeepSyncConflict } from \"@keepkit/core/core\";\nimport { useKeepContext } from \"@keepkit/core/react\";\nimport { useEffect, useState } from \"react\";\nimport { useUiLabel } from \"../../../foundation/ui-context\";\n\ntype KeepSyncRecoveryDialogOptions<TMeta> = {\n open: boolean | undefined;\n onOpenChange: ((open: boolean) => void) | undefined;\n conflicts: KeepSyncConflict<TMeta>[] | undefined;\n onManualMerge: ((conflict: KeepSyncConflict<TMeta>) => KeepItem<TMeta> | Promise<KeepItem<TMeta>>) | undefined;\n};\n\nexport function useKeepSyncRecoveryDialog<TMeta>(options: KeepSyncRecoveryDialogOptions<TMeta>) {\n const { open, onOpenChange, conflicts, onManualMerge } = options;\n const context = useKeepContext<TMeta>();\n const conflictList = conflicts ?? context.syncState.conflicts ?? [];\n const hasRecovery = conflictList.length > 0 || context.syncState.status === \"error\" || Boolean(context.error);\n const [dismissed, setDismissed] = useState(false);\n const [busyId, setBusyId] = useState<string>();\n const [error, setError] = useState<unknown>();\n useEffect(() => {\n if (hasRecovery) setDismissed(false);\n }, [hasRecovery]);\n\n return {\n conflictList,\n isOpen: open ?? (hasRecovery && !dismissed),\n busyId,\n error,\n showBackupRecovery: context.syncState.status === \"error\" || Boolean(context.error),\n close: () => {\n setDismissed(true);\n onOpenChange?.(false);\n },\n resolve: async (conflict: KeepSyncConflict<TMeta>, resolution: \"local\" | \"remote\" | \"manual\") => {\n setError(undefined);\n setBusyId(conflict.id);\n try {\n const merged = resolution === \"manual\" ? await onManualMerge?.(conflict) : undefined;\n if (resolution === \"manual\" && !merged) throw new Error(\"A manual merge result is required.\");\n await context.resolveSyncConflict(conflict.id, resolution, merged);\n } catch (cause) {\n setError(cause);\n } finally {\n setBusyId(undefined);\n }\n },\n labels: {\n close: useUiLabel(\"close\"),\n title: useUiLabel(\"resolveSync\"),\n conflict: useUiLabel(\"syncConflict\"),\n keepLocal: useUiLabel(\"keepLocal\"),\n useServer: useUiLabel(\"useServer\"),\n manualMerge: useUiLabel(\"manualMerge\"),\n localVersion: useUiLabel(\"localVersion\"),\n remoteVersion: useUiLabel(\"remoteVersion\"),\n updatedAt: useUiLabel(\"updatedAt\"),\n note: useUiLabel(\"note\"),\n backupRecovery: useUiLabel(\"backupRecovery\"),\n backupRecoveryDescription: useUiLabel(\"backupRecoveryDescription\"),\n error: useUiLabel(\"error\"),\n },\n };\n}\n","\"use client\";\n\nimport type { KeepItem, KeepSyncConflict } from \"@keepkit/core/core\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { getMetaTitle } from \"../../foundation/shared\";\nimport { KeepBackup } from \"../actions/KeepBackup\";\nimport { useKeepSyncRecoveryDialog } from \"./hooks/useKeepSyncRecoveryDialog\";\n\nexport type KeepSyncRecoveryDialogProps<TMeta = Record<string, unknown>> = Omit<\n HTMLAttributes<HTMLElement>,\n \"children\" | \"title\"\n> & {\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n conflicts?: KeepSyncConflict<TMeta>[];\n onManualMerge?: (conflict: KeepSyncConflict<TMeta>) => KeepItem<TMeta> | Promise<KeepItem<TMeta>>;\n backup?: ReactNode;\n showBackupControls?: boolean;\n title?: ReactNode;\n children?: ReactNode;\n};\n\n/** Resolves queued sync conflicts and guides users to restore a backup after data corruption. */\nexport function KeepSyncRecoveryDialog<TMeta = Record<string, unknown>>({\n open,\n onOpenChange,\n conflicts,\n onManualMerge,\n backup,\n showBackupControls = true,\n title,\n children,\n className,\n ...props\n}: KeepSyncRecoveryDialogProps<TMeta>) {\n const view = useKeepSyncRecoveryDialog<TMeta>({ open, onOpenChange, conflicts, onManualMerge });\n if (!view.isOpen) return null;\n\n return (\n <section\n {...props}\n className={className}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"keepkit-sync-recovery-title\"\n aria-describedby={view.error ? \"keepkit-sync-recovery-error\" : undefined}\n aria-busy={view.busyId !== undefined}\n data-keepkit=\"sync-recovery\"\n data-state={view.conflictList.length > 0 ? \"conflict\" : \"error\"}\n data-loading={view.busyId !== undefined ? \"true\" : undefined}\n >\n <header>\n <h2 id=\"keepkit-sync-recovery-title\">{title ?? view.labels.title}</h2>\n <button type=\"button\" data-keep-action=\"close-dialog\" onClick={view.close} aria-label={view.labels.close}>\n {view.labels.close}\n </button>\n </header>\n {children}\n {view.conflictList.length > 0 ? (\n <div>\n <p>{view.labels.conflict}</p>\n {view.conflictList.map((conflict) => (\n <article key={conflict.id} data-conflict-id={conflict.id}>\n <h3>{getMetaTitle(conflict.operation.item?.meta) ?? conflict.id}</h3>\n <div data-conflict-preview>\n <ConflictPreview\n item={conflict.operation.item}\n heading={view.labels.localVersion}\n updatedAtLabel={view.labels.updatedAt}\n noteLabel={view.labels.note}\n side=\"local\"\n />\n <ConflictPreview\n item={conflict.remote}\n heading={view.labels.remoteVersion}\n updatedAtLabel={view.labels.updatedAt}\n noteLabel={view.labels.note}\n side=\"remote\"\n />\n </div>\n <div>\n <button\n type=\"button\"\n data-keep-action=\"keep-local\"\n onClick={() => void view.resolve(conflict, \"local\")}\n disabled={view.busyId !== undefined}\n >\n {view.labels.keepLocal}\n </button>\n <button\n type=\"button\"\n data-keep-action=\"use-server\"\n onClick={() => void view.resolve(conflict, \"remote\")}\n disabled={view.busyId !== undefined}\n >\n {view.labels.useServer}\n </button>\n <button\n type=\"button\"\n data-keep-action=\"manual-merge\"\n onClick={() => void view.resolve(conflict, \"manual\")}\n disabled={view.busyId !== undefined || !onManualMerge}\n >\n {view.labels.manualMerge}\n </button>\n </div>\n </article>\n ))}\n </div>\n ) : null}\n {view.showBackupRecovery ? (\n <section data-recovery=\"backup\">\n <h3>{view.labels.backupRecovery}</h3>\n <p>{view.labels.backupRecoveryDescription}</p>\n {backup ?? (showBackupControls ? <KeepBackup /> : null)}\n </section>\n ) : null}\n {view.error ? (\n <p id=\"keepkit-sync-recovery-error\" role=\"alert\" aria-live=\"assertive\">\n {view.error instanceof Error ? view.error.message : view.labels.error}\n </p>\n ) : null}\n </section>\n );\n}\n\nfunction ConflictPreview<TMeta>({\n item,\n heading,\n updatedAtLabel,\n noteLabel,\n side,\n}: {\n item?: KeepItem<TMeta>;\n heading: string;\n updatedAtLabel: string;\n noteLabel: string;\n side: \"local\" | \"remote\";\n}) {\n return (\n <article data-conflict-version={side} aria-label={heading}>\n <h4>{heading}</h4>\n <dl>\n <div>\n <dt>{updatedAtLabel}</dt>\n <dd>\n {item ? (\n <time dateTime={new Date(item.updatedAt).toISOString()}>{formatConflictDate(item.updatedAt)}</time>\n ) : (\n \"—\"\n )}\n </dd>\n </div>\n <div>\n <dt>{noteLabel}</dt>\n <dd>{item?.note || \"—\"}</dd>\n </div>\n </dl>\n </article>\n );\n}\n\nfunction formatConflictDate(timestamp: number): string {\n return new Date(timestamp).toISOString().slice(0, 10);\n}\n","import { useKeepContext } from \"@keepkit/core/react\";\nimport type { ReactNode } from \"react\";\nimport { useUiLabel } from \"../../../foundation/ui-context\";\n\ntype KeepSyncStatusBannerOptions = {\n onRetry: (() => void | Promise<void>) | undefined;\n children: ReactNode;\n};\n\nexport function useKeepSyncStatusBanner({ onRetry, children }: KeepSyncStatusBannerOptions) {\n const context = useKeepContext();\n const retryLabel = useUiLabel(\"retrySync\");\n const resolveLabel = useUiLabel(\"resolveSync\");\n const conflictLabel = useUiLabel(\"syncConflict\");\n const pendingLabel = useUiLabel(\"syncPending\");\n const syncedLabel = useUiLabel(\"syncSynced\");\n const status = context.syncState.status;\n const hasConflicts = (context.syncState.conflicts?.length ?? 0) > 0 || context.syncState.conflictIds.length > 0;\n const message =\n children ??\n (status === \"error\"\n ? getErrorMessage(context.syncState.error)\n : status === \"conflict\" || hasConflicts\n ? conflictLabel\n : status === \"pending\" || status === \"syncing\"\n ? pendingLabel\n : syncedLabel);\n\n return {\n status,\n hasConflicts,\n message,\n isMutating: context.isMutating,\n role: status === \"error\" || status === \"conflict\" || hasConflicts ? \"alert\" : \"status\",\n showRetry: status === \"error\" || status === \"pending\" || status === \"syncing\",\n retryLabel,\n resolveLabel,\n retry: async () => {\n if (onRetry) {\n await onRetry();\n return;\n }\n await context.flushSync();\n },\n };\n}\n\nfunction getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : \"Sync failed.\";\n}\n","\"use client\";\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { useKeepSyncStatusBanner } from \"./hooks/useKeepSyncStatusBanner\";\n\nexport type KeepSyncStatusBannerProps = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n onRetry?: () => void | Promise<void>;\n onResolveConflicts?: () => void;\n children?: ReactNode;\n};\n\n/** Announces synchronization failures and exposes retry or conflict-recovery entry points. */\nexport function KeepSyncStatusBanner({\n onRetry,\n onResolveConflicts,\n children,\n className,\n ...props\n}: KeepSyncStatusBannerProps) {\n const view = useKeepSyncStatusBanner({ onRetry, children });\n if (view.status === \"idle\" && !view.hasConflicts) return null;\n\n return (\n <aside\n {...props}\n className={className}\n role={props.role ?? view.role}\n aria-live={props[\"aria-live\"] ?? \"polite\"}\n data-keepkit=\"sync-status\"\n data-state={view.status}\n >\n <p>{view.message}</p>\n {view.showRetry ? (\n <button\n type=\"button\"\n data-keep-action=\"retry-sync\"\n onClick={() => void view.retry()}\n disabled={view.isMutating}\n >\n {view.retryLabel}\n </button>\n ) : null}\n {view.hasConflicts ? (\n <button\n type=\"button\"\n data-keep-action=\"resolve-conflicts\"\n onClick={onResolveConflicts}\n disabled={!onResolveConflicts}\n >\n {view.resolveLabel}\n </button>\n ) : null}\n </aside>\n );\n}\n","import { useCallback, useState } from \"react\";\nimport type { KeepCollectionFeature } from \"../../collection/KeepCollection\";\nimport type { KeepWorkspaceModule, KeepWorkspacePreset } from \"../KeepWorkspace\";\n\ntype KeepWorkspaceOptions = {\n preset: KeepWorkspacePreset;\n modules: Partial<Record<KeepWorkspaceModule, boolean>> | undefined;\n recoveryOpen: boolean | undefined;\n onRecoveryOpenChange: ((open: boolean) => void) | undefined;\n onResolveConflicts: (() => void) | undefined;\n};\n\nconst PRESET_MODULES: Record<KeepWorkspacePreset, Record<KeepWorkspaceModule, boolean>> = {\n basic: { syncStatus: false, undo: false, recovery: false, backup: false, stalePrune: false },\n standard: { syncStatus: false, undo: true, recovery: false, backup: false, stalePrune: false },\n management: { syncStatus: false, undo: true, recovery: false, backup: true, stalePrune: true },\n sync: { syncStatus: true, undo: true, recovery: true, backup: false, stalePrune: false },\n};\n\nconst PRESET_COLLECTION_FEATURES: Record<KeepWorkspacePreset, Partial<Record<KeepCollectionFeature, boolean>>> = {\n basic: { search: false, sort: false, pagination: false },\n standard: {},\n management: { tagFilter: true, collectionFilter: true, bulkActions: true, pin: true, archive: true },\n sync: {},\n};\n\nexport function useKeepWorkspace({\n preset,\n modules,\n recoveryOpen,\n onRecoveryOpenChange,\n onResolveConflicts,\n}: KeepWorkspaceOptions) {\n const [internalRecoveryOpen, setInternalRecoveryOpen] = useState(false);\n const resolvedModules = { ...PRESET_MODULES[preset], ...modules };\n const setRecoveryOpen = useCallback(\n (open: boolean) => {\n if (recoveryOpen === undefined) setInternalRecoveryOpen(open);\n onRecoveryOpenChange?.(open);\n },\n [onRecoveryOpenChange, recoveryOpen],\n );\n const openRecovery = useCallback(() => {\n onResolveConflicts?.();\n setRecoveryOpen(true);\n }, [onResolveConflicts, setRecoveryOpen]);\n\n return {\n preset,\n modules: resolvedModules,\n collectionFeatures: PRESET_COLLECTION_FEATURES[preset],\n recoveryOpen: recoveryOpen ?? internalRecoveryOpen,\n setRecoveryOpen,\n openRecovery,\n };\n}\n","\"use client\";\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { type RenderProp, resolveContent } from \"../../foundation/shared\";\nimport { KeepBackup, type KeepBackupProps } from \"../actions/KeepBackup\";\nimport { KeepUndo, type KeepUndoProps } from \"../actions/KeepUndo\";\nimport { KeepCollection, type KeepCollectionProps } from \"../collection/KeepCollection\";\nimport { KeepPruneStaleButton, type KeepPruneStaleButtonProps } from \"../status/KeepStaleNotice\";\nimport { KeepSyncRecoveryDialog, type KeepSyncRecoveryDialogProps } from \"../sync/KeepSyncRecoveryDialog\";\nimport { KeepSyncStatusBanner, type KeepSyncStatusBannerProps } from \"../sync/KeepSyncStatusBanner\";\nimport { useKeepWorkspace } from \"./hooks/useKeepWorkspace\";\n\nexport type KeepWorkspacePreset = \"basic\" | \"standard\" | \"management\" | \"sync\";\nexport type KeepWorkspaceModule = \"syncStatus\" | \"undo\" | \"recovery\" | \"backup\" | \"stalePrune\";\n\nexport type KeepWorkspaceState = {\n preset: KeepWorkspacePreset;\n modules: Readonly<Record<KeepWorkspaceModule, boolean>>;\n recoveryOpen: boolean;\n setRecoveryOpen: (open: boolean) => void;\n};\n\ntype KeepWorkspaceContent = ReactNode | RenderProp<KeepWorkspaceState>;\n\nexport type KeepWorkspaceSlots = {\n before?: KeepWorkspaceContent;\n syncStatus?: KeepWorkspaceContent;\n collection?: KeepWorkspaceContent;\n actions?: KeepWorkspaceContent;\n undo?: KeepWorkspaceContent;\n recovery?: KeepWorkspaceContent;\n after?: KeepWorkspaceContent;\n};\n\nexport type KeepWorkspaceProps<TMeta = Record<string, unknown>> = Omit<HTMLAttributes<HTMLElement>, \"children\"> & {\n preset?: KeepWorkspacePreset;\n modules?: Partial<Record<KeepWorkspaceModule, boolean>>;\n collectionProps?: KeepCollectionProps<TMeta>;\n syncStatusProps?: KeepSyncStatusBannerProps;\n recoveryProps?: KeepSyncRecoveryDialogProps<TMeta>;\n backupProps?: KeepBackupProps<TMeta>;\n undoProps?: KeepUndoProps;\n stalePruneProps?: KeepPruneStaleButtonProps;\n slots?: KeepWorkspaceSlots;\n children?: KeepWorkspaceContent;\n};\n\n/** Composes the standard collection, management, and sync primitives into one customizable workspace. */\nexport function KeepWorkspace<TMeta = Record<string, unknown>>({\n preset = \"standard\",\n modules,\n collectionProps,\n syncStatusProps,\n recoveryProps,\n backupProps,\n undoProps,\n stalePruneProps,\n slots,\n children,\n className,\n ...props\n}: KeepWorkspaceProps<TMeta>) {\n const view = useKeepWorkspace({\n preset,\n modules,\n recoveryOpen: recoveryProps?.open,\n onRecoveryOpenChange: recoveryProps?.onOpenChange,\n onResolveConflicts: syncStatusProps?.onResolveConflicts,\n });\n const state: KeepWorkspaceState = {\n preset: view.preset,\n modules: view.modules,\n recoveryOpen: view.recoveryOpen,\n setRecoveryOpen: view.setRecoveryOpen,\n };\n const resolvedCollectionProps = {\n ...collectionProps,\n features: { ...view.collectionFeatures, ...collectionProps?.features },\n };\n\n return (\n <section {...props} className={className} data-keepkit=\"workspace\" data-preset={preset}>\n {resolveOptionalSlot(slots?.before, state)}\n {view.modules.syncStatus\n ? resolveSlot(\n slots?.syncStatus,\n <KeepSyncStatusBanner {...syncStatusProps} onResolveConflicts={view.openRecovery} />,\n state,\n )\n : null}\n {resolveSlot(slots?.collection, <KeepCollection<TMeta> {...resolvedCollectionProps} />, state)}\n {view.modules.backup || view.modules.stalePrune\n ? resolveSlot(\n slots?.actions,\n <div data-keepkit=\"workspace-actions\">\n {view.modules.stalePrune ? <KeepPruneStaleButton {...stalePruneProps} /> : null}\n {view.modules.backup ? <KeepBackup<TMeta> {...backupProps} /> : null}\n </div>,\n state,\n )\n : null}\n {view.modules.undo ? resolveSlot(slots?.undo, <KeepUndo {...undoProps} />, state) : null}\n {view.modules.recovery\n ? resolveSlot(\n slots?.recovery,\n <KeepSyncRecoveryDialog<TMeta>\n {...recoveryProps}\n open={view.recoveryOpen}\n onOpenChange={view.setRecoveryOpen}\n />,\n state,\n )\n : null}\n {resolveOptionalSlot(children, state)}\n {resolveOptionalSlot(slots?.after, state)}\n </section>\n );\n}\n\nfunction resolveSlot(\n slot: KeepWorkspaceContent | undefined,\n fallback: ReactNode,\n state: KeepWorkspaceState,\n): ReactNode {\n if (slot === undefined) return fallback;\n return resolveContent(slot, state);\n}\n\nfunction resolveOptionalSlot(slot: KeepWorkspaceContent | undefined, state: KeepWorkspaceState): ReactNode {\n if (slot === undefined) return null;\n return resolveContent(slot, state);\n}\n","\"use client\";\n\nimport { type CSSProperties, isValidElement, type ReactElement, type ReactNode } from \"react\";\nimport { createSlot } from \"./shared\";\n\nexport const keepThemeNames = [\n \"default\",\n \"ocean\",\n \"forest\",\n \"sunset\",\n \"lavender\",\n \"compact\",\n \"minimal\",\n \"rounded\",\n \"high-contrast\",\n \"dark\",\n] as const;\n\nexport type KeepThemeName = (typeof keepThemeNames)[number];\nexport type KeepThemeMode = \"light\" | \"dark\" | \"system\";\nexport type KeepThemeDensity = \"compact\" | \"comfortable\" | \"spacious\";\nexport type KeepThemeRadius = \"none\" | \"small\" | \"medium\" | \"large\" | \"full\";\n\nexport type KeepThemeVariables = Record<`--keep-${string}`, string | number>;\n\nexport type KeepThemeProviderProps = {\n children?: ReactNode;\n className?: string;\n id?: string;\n title?: string;\n role?: string;\n tabIndex?: number;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n \"aria-describedby\"?: string;\n \"data-testid\"?: string;\n [key: `data-${string}`]: string | undefined;\n theme?: KeepThemeName;\n mode?: KeepThemeMode;\n density?: KeepThemeDensity;\n radius?: KeepThemeRadius;\n accentColor?: \"blue\" | \"green\" | \"violet\" | \"orange\" | \"rose\" | (string & {});\n highContrast?: boolean;\n reducedMotion?: boolean;\n variables?: KeepThemeVariables;\n style?: CSSProperties & KeepThemeVariables;\n asChild?: boolean;\n};\n\n/** Scopes KeepKit tokens and opt-in component styles to one subtree. */\nexport function KeepThemeProvider({\n children,\n theme = \"default\",\n mode = \"system\",\n density = \"comfortable\",\n radius = \"medium\",\n accentColor,\n highContrast = false,\n reducedMotion = false,\n variables,\n style,\n className,\n asChild = false,\n ...props\n}: KeepThemeProviderProps) {\n const themeClassName = [\n \"keep-theme\",\n `keep-theme--${theme}`,\n `keep-theme--${mode}`,\n `keep-theme--density-${density}`,\n `keep-theme--radius-${radius}`,\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n const themeStyle = {\n ...style,\n ...(accentColor && !highContrast ? { \"--keep-accent\": accentColor, \"--keep-primary\": accentColor } : {}),\n ...variables,\n } as CSSProperties & KeepThemeVariables;\n const rootProps = {\n ...props,\n className: themeClassName,\n style: themeStyle,\n \"data-keep-theme\": theme,\n \"data-theme\": theme,\n \"data-mode\": mode,\n \"data-density\": density,\n \"data-radius\": radius,\n \"data-accent-color\": accentColor,\n \"data-high-contrast\": highContrast ? \"true\" : undefined,\n \"data-reduced-motion\": reducedMotion ? \"true\" : undefined,\n };\n\n if (asChild) {\n if (!isValidElement(children))\n throw new Error(\"KeepThemeProvider with asChild requires a single React element child.\");\n return createSlot(children as ReactElement<Record<string, unknown>>, rootProps);\n }\n return <div {...rootProps}>{children}</div>;\n}\n"],"mappings":"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","names":["useRef","useRef","jsx","jsxs","createContext","useContext","useMemo","jsx","useState","useState","jsx","Fragment","jsx","jsxs","useEffect","useRef","useKeepItem","useKeepItem","Fragment","jsx","jsxs","useRef","useEffect","useKeepItem","useCallback","useEffect","useRef","useState","useKeepItem","useCallback","useEffect","useRef","useState","Fragment","jsx","jsxs","useKeepItem","useState","useRef","useEffect","useCallback","error","getErrorMessage","jsx","jsxs","useKeepItem","useState","useRef","useCallback","useEffect","useKeepContext","useEffect","useState","useKeepContext","useState","useEffect","jsx","jsxs","KeepErrorBoundary","useEffect","useState","isValidElement","useRef","Fragment","jsx","jsxs","useRef","isValidElement","useState","jsx","jsxs","useState","useKeepCollections","useKeepContext","useState","jsx","jsxs","useKeepContext","useState","useKeepCollections","isValidElement","useKeepList","useCallback","useMemo","useState","useState","useKeepList","useCallback","useMemo","jsx","jsxs","isValidElement","useEffect","useState","useState","useEffect","Fragment","jsx","jsxs","useKeepList","useEffect","useMemo","useState","useState","useEffect","useMemo","useKeepList","isValidElement","createContext","createElement","isValidElement","useContext","useEffect","useId","useRef","useState","Fragment","jsx","jsxs","useKeepContext","useState","useKeepContext","useState","jsx","jsxs","useKeepItem","useKeepItem","getStatusLabelKey","getDisplayStatus","Fragment","jsx","jsxs","createContext","useContext","isValidElement","useState","useRef","useId","useEffect","getErrorMessage","createElement","isValidElement","Fragment","jsx","jsxs","isValidElement","useKeepList","useKeepList","useCallback","useEffect","useRef","useState","jsx","Fragment","jsx","jsxs","isValidElement","jsx","jsxs","KeepErrorBoundary","useState","useEffect","jsx","isValidElement","jsx","jsxs","useKeepItem","useCallback","useEffect","useRef","useState","useKeepItem","useState","useRef","useEffect","useCallback","Fragment","jsx","jsxs","isValidElement","getErrorMessage","useKeepItem","useCallback","useEffect","useState","useKeepItem","useState","useEffect","useCallback","Fragment","jsx","jsxs","getErrorMessage","useCallback","useId","useEffect","Fragment","jsx","jsxs","useId","isValidElement","useKeepContext","useEffect","useRef","useState","useKeepContext","getStatusLabelKey","useState","useRef","useEffect","jsx","isValidElement","useKeepContext","useEffect","useRef","useKeepContext","useRef","useEffect","useKeepContext","useEffect","useState","useKeepContext","useState","useEffect","jsx","jsxs","useKeepContext","useKeepContext","getErrorMessage","jsx","jsxs","useCallback","useState","jsx","jsxs","isValidElement","jsx","isValidElement","KeepErrorBoundary","useKeepCollections","useKeepContext","useKeepItem","useKeepList","useKeepNavigator","jsx","jsxs","jsx"]}