From d90ab32ce6758f83fcfbba97b441c066f1b2190f Mon Sep 17 00:00:00 2001 From: woksin Date: Tue, 29 Sep 2026 07:15:13 +0200 Subject: [PATCH 1/5] Snapshot the public API and report changes against the latest release Source/api-surface.json records every export of every typed subpath with its declaration text; yarn ci fails when the built declarations differ, so a pull request shows exactly which exports it adds, removes, or changes. A CI step reports removals, changes, and additions against the latest published release in the job summary. Closes #216. --- .github/workflows/javascript-build.yml | 8 +- README.md | 8 + Source/api-surface.json | 649 ++++++++++++++++++ Source/package.json | 5 +- .../when_computing_the_api_surface.ts | 44 ++ Source/scripts/lib/api-surface.mjs | 121 ++++ Source/scripts/report-api-compatibility.mjs | 75 ++ Source/scripts/verify-api-surface.mjs | 70 ++ 8 files changed, 978 insertions(+), 2 deletions(-) create mode 100644 Source/api-surface.json create mode 100644 Source/scripts/for_api_surface/when_computing_the_api_surface.ts create mode 100644 Source/scripts/lib/api-surface.mjs create mode 100644 Source/scripts/report-api-compatibility.mjs create mode 100644 Source/scripts/verify-api-surface.mjs diff --git a/.github/workflows/javascript-build.yml b/.github/workflows/javascript-build.yml index 74a52764..b8638c4b 100644 --- a/.github/workflows/javascript-build.yml +++ b/.github/workflows/javascript-build.yml @@ -108,7 +108,13 @@ jobs: export NODE_OPTIONS="--max-old-space-size=4096" yarn workspace @cratis/components run ci - # Source's ci script also checks public API TSDoc and the packed CSS budgets. + # Source's ci script also checks public API TSDoc, the packed CSS budgets, and that the + # built declarations match the committed api-surface.json snapshot. + + # Informational: which exports this change removes, changes, or adds compared with the + # latest published release. Release intent stays with the semver label and the reviewer. + - name: Report public API changes against the latest release + run: yarn workspace @cratis/components run report-api-compatibility # Matrix over the renderer-adapter workspaces that today run one after another inside # `run-task-on-workspaces.js ci`: Conformance, MUI, PrimeReact 11, PrimeReact 10. In that diff --git a/README.md b/README.md index b519312d..542b3d28 100644 --- a/README.md +++ b/README.md @@ -172,6 +172,14 @@ This is a framework-library repository. [Component source](https://github.com/Cr keeps public types, stories, and specifications near each component; export and package verification lives under `Source/scripts/`. +The public API of every typed subpath is kept in a reviewable snapshot, `Source/api-surface.json`. +`yarn ci` fails when the built declarations differ from it; after an intentional API change, run +`cd Source && yarn generate-api-surface` and commit the snapshot, so the pull request shows exactly +which exports it adds, removes, or changes. `yarn report-api-compatibility [version]` compares the +built API with a published release (default: the latest); CI adds that report to the job summary. +It lists removals and changes as breaking-change candidates, but release intent is still decided +by a person, and DOM, parts, and behavior need their own review. + Before pushing Source changes, run `cd Source && yarn ci` after `yarn install` at the repository root. It includes public API TSDoc coverage and packs the built package to check aggregate and per-area CSS budgets (`yarn verify-packed-css` runs that check alone after a diff --git a/Source/api-surface.json b/Source/api-surface.json new file mode 100644 index 00000000..3c73b9ec --- /dev/null +++ b/Source/api-surface.json @@ -0,0 +1,649 @@ +{ + ".": { + "CratisColumnFilterMessages": "export interface CratisColumnFilterMessages { filterTriggerAriaLabel?: (field: string) => string; valueAriaLabel?: (field: string) => string; matchModeAriaLabel?: string; matchModeLabel?: (mode: string, defaultLabel: string) => string; clear?: string; apply?: string; true?: string; false?: string; }", + "CratisComponentsConfig": "export interface CratisComponentsConfig { locale?: string; messages?: CratisComponentsMessages; icons?: CratisComponentsIcons; locales?: Record; }", + "CratisComponentsIcons": "export interface CratisComponentsIcons { close?: ReactNode; remove?: ReactNode; expand?: ReactNode; sortAscending?: ReactNode; sortDescending?: ReactNode; previous?: ReactNode; next?: ReactNode; clear?: ReactNode; }", + "CratisComponentsMessages": "export interface CratisComponentsMessages { paginator?: CratisPaginatorMessages; datePicker?: CratisDatePickerMessages; dropdown?: CratisDropdownMessages; dialog?: CratisDialogMessages; stepper?: CratisStepperMessages; notifications?: CratisNotificationsMessages; dataTable?: CratisDataTableMessages; filter?: CratisFilterMessages; columnFilter?: CratisColumnFilterMessages; toolbar?: CratisToolbarMessages; }", + "CratisComponentsProvider": "CratisComponentsProvider: (props: CratisComponentsProviderProps) => import(\"react\").JSX.Element", + "CratisComponentsProviderProps": "export interface CratisComponentsProviderProps { value?: CratisComponentsConfig; toaster?: boolean | ToasterProps; library?: unstable_UiLibrary | readonly unstable_UiLibrary[]; libraryMode?: 'strict' | 'degrade'; rendererFallback?: 'core' | 'throw'; overlayEnvironment?: CratisOverlayEnvironment; rendererSetup?: CratisRendererSetup; children: ReactNode; }", + "CratisDataTableMessages": "export interface CratisDataTableMessages { selectRow?: string; selectAllRows?: string; search?: string; searchAriaLabel?: string; loading?: string; failed?: string; unauthorized?: string; }", + "CratisDatePickerMessages": "export interface CratisDatePickerMessages { today?: string; clear?: string; openCalendar?: string; previousMonth?: string; nextMonth?: string; label?: string; }", + "cratisDefaults": "cratisDefaults: CratisComponentsConfig", + "CratisDialogMessages": "export interface CratisDialogMessages { ok?: string; cancel?: string; yes?: string; no?: string; close?: string; }", + "CratisDropdownMessages": "export interface CratisDropdownMessages { showOptions?: string; clearSelection?: string; }", + "CratisFilterMessages": "export interface CratisFilterMessages { label?: string; searchAriaLabel?: string; }", + "CratisIconResolver": "export type CratisIconResolver = (name: keyof CratisComponentsIcons, builtIn: ReactNode, override?: ReactNode) => ReactNode;", + "CratisNotificationsMessages": "export interface CratisNotificationsMessages { dismiss?: string; region?: string; }", + "CratisPaginatorMessages": "export interface CratisPaginatorMessages { navigation?: string; first?: string; previous?: string; next?: string; last?: string; }", + "CratisStepperMessages": "export interface CratisStepperMessages { next?: string; previous?: string; submit?: string; }", + "mergeCratisComponentsConfig": "mergeCratisComponentsConfig: (value: CratisComponentsConfig | undefined) => CratisComponentsConfig", + "useCratisComponentsConfig": "useCratisComponentsConfig: () => CratisComponentsConfig", + "useCratisIcon": "useCratisIcon: () => CratisIconResolver" + }, + "./Canvas": { + "AnchoredOverlay": "AnchoredOverlay: React.FC", + "AnchoredOverlayAlign": "export type AnchoredOverlayAlign = 'left' | 'right' | 'center';", + "AnchoredOverlayProps": "export interface AnchoredOverlayProps { anchorRef: RefObject; open: boolean; side?: AnchoredOverlaySide; align?: AnchoredOverlayAlign; gap?: number; children: ReactNode; }", + "AnchoredOverlaySide": "export type AnchoredOverlaySide = 'above' | 'below' | 'left' | 'right';", + "BuildAvatarUrlParams": "export interface BuildAvatarUrlParams { userId: string; ownerType: 'Users' | 'Personas' | 'Agents'; avatarSize: 'Small' | 'Medium'; version?: number | string; }", + "Canvas": "declare function Canvas(props: CanvasProps): React.ReactElement;", + "CanvasCaptureAttributes": "export interface CanvasCaptureAttributes { layer?: string; content?: string; transformHost?: string; }", + "CanvasContext": "export interface CanvasContext { app: PIXI.Application; world: PIXI.Container; }", + "CanvasControls": "CanvasControls: React.FC", + "CanvasControlsIcons": "export interface CanvasControlsIcons { toggleMinimap?: React.ReactNode; zoomOut?: React.ReactNode; zoomIn?: React.ReactNode; help?: React.ReactNode; }", + "CanvasControlsLabels": "export interface CanvasControlsLabels { toggleMinimap?: string; zoomOut?: string; resetZoom?: string; zoomIn?: string; help?: string; }", + "CanvasControlsProps": "export interface CanvasControlsProps { getZoom: () => number; onZoomIn: () => void; onZoomOut: () => void; onZoomReset: () => void; showMinimapToggle?: boolean; minimapRef?: React.RefObject; minimapWorldWidth?: number; minimapWorldHeight?: number; minimapItems?: MinimapItem[]; onMinimapPan?: (pan: { x: number; y: number; }) => void; placement?: 'bottom-left' | 'bottom-right'; onHelp?: () => void; helpTitle?: string; labels?: CanvasControlsLabels; icons?: CanvasControlsIcons; followViewportInsets?: boolean; glassSurface?: React.ReactNode; contentCaptureAttribute?: string; disableGlass?: boolean; }", + "canvasGesture": "canvasGesture: { readonly isActive: boolean; set(activeNow: boolean): void; subscribe(listener: GestureListener): () => void; }", + "CanvasHandle": "export interface CanvasHandle { smoothPanToWorld(worldX: number, worldY: number, durationMs?: number): void; smoothPanZoomToWorld(worldX: number, worldY: number, targetZoom?: number, durationMs?: number): void; getContainerRect(): DOMRect | null; getItemBounds(): MinimapItem[]; }", + "CanvasItem": "CanvasItem: React.FC", + "CanvasItemData": "export interface CanvasItemData { id: string; x: number; y: number; }", + "CanvasItemProps": "export interface CanvasItemProps { id?: string; x: number; y: number; zIndex?: number; onSize?: (width: number, height: number) => void; children: React.ReactNode; }", + "CanvasItemRegistryContext": "CanvasItemRegistryContext: React.Context", + "CanvasItemRegistryContextValue": "export interface CanvasItemRegistryContextValue { register: (id: string, entry: CanvasItemRegistryEntry) => void; unregister: (id: string) => void; getSnapshot?: () => ReadonlyMap; subscribe?: (listener: () => void) => () => void; }", + "CanvasItemRegistryEntry": "export interface CanvasItemRegistryEntry { x: number; y: number; width: number; height: number; anonymous?: boolean; }", + "CanvasMinimap": "CanvasMinimap: React.ForwardRefExoticComponent>", + "CanvasMinimapHandle": "export interface CanvasMinimapHandle { update: (pan: { x: number; y: number; }, zoom: number, canvasWidth: number, canvasHeight: number) => void; }", + "CanvasMinimapProps": "export interface CanvasMinimapProps { worldWidth?: number; worldHeight?: number; items?: MinimapItem[]; onRequestPan?: (pan: { x: number; y: number; }) => void; }", + "CanvasOverlay": "CanvasOverlay: (props: CanvasOverlayProps) => import(\"react\").ReactPortal | null", + "CanvasOverlayProps": "export interface CanvasOverlayProps { children: ReactNode; }", + "CanvasProps": "export interface CanvasProps { children?: React.ReactNode; items?: T[]; renderItem?: (item: T) => PIXI.Container; onItemPointerDown?: (item: T, event: PIXI.FederatedPointerEvent) => void; onReady?: (context: CanvasContext) => void; onTransformChange?: (zoom: number, pan: { x: number; y: number; }) => void; initialZoom?: number; initialPan?: { x: number; y: number; }; minZoom?: number; maxZoom?: number; showControls?: boolean; showMinimap?: boolean; minimapWorldWidth?: number; minimapWorldHeight?: number; minimapItems?: MinimapItem[]; controlsPlacement?: 'bottom-left' | 'bottom-right'; className?: string; style?: React.CSSProperties; onHelp?: () => void; helpTitle?: string; controlsLabels?: CanvasControlsLabels; controlsIcons?: CanvasControlsIcons; controlsFollowViewportInsets?: boolean; controlsGlassSurface?: React.ReactNode; disableControlsGlass?: boolean; captureAttributes?: CanvasCaptureAttributes; onHandleReady?: (handle: CanvasHandle) => void; readOnly?: boolean; backgroundDragPans?: boolean; }", + "canvasTransformActivity": "canvasTransformActivity: { notify(): void; subscribe(listener: TransformListener): () => void; }", + "Chat": "Chat: React.FC", + "ChatAuthorKind": "export declare enum ChatAuthorKind { User = \"user\", Agent = \"agent\" }", + "ChatBubble": "ChatBubble: React.FC", + "ChatBubbleProps": "export interface ChatBubbleProps { authorId: Guid | string; authorName: string; hasAvatar: boolean; size?: number; suppressPreview?: boolean; previewMessage?: string; previewTimestamp?: Date; replyCount?: number; showThinkingBubbles?: boolean; selected?: boolean; buildAvatarUrl?: (params: BuildAvatarUrlParams) => string; }", + "ChatComposer": "ChatComposer: React.ForwardRefExoticComponent>", + "ChatComposerHandle": "export interface ChatComposerHandle { prefill: (text: string) => void; }", + "ChatComposerLabels": "export interface ChatComposerLabels { placeholder?: string; insertEmoji?: string; send?: string; sendMessage?: string; reactionPicker?: ReactionPickerLabels; }", + "ChatComposerProps": "export interface ChatComposerProps { mentionCandidates?: MentionCandidate[]; resolveMentionCandidates?: (query: string) => MentionCandidate[] | Promise; onSend: (text: string, mentions: MentionCandidate[]) => void; autoFocus?: boolean; disabled?: boolean; buildAvatarUrl?: (params: BuildAvatarUrlParams) => string; labels?: ChatComposerLabels; }", + "ChatLabels": "export interface ChatLabels { title?: string; close?: string; closePanel?: string; noComments?: string; typing?: string; typingTwo?: string; typingSeveral?: string; composer?: ChatComposerLabels; messageBubble?: ChatMessageBubbleLabels; failedReply?: FailedReplyLabels; }", + "ChatMessage": "export interface ChatMessage { id: Guid; authorId: Guid; authorName: string; authorInitials: string; hasAvatar: boolean; authorKind: ChatAuthorKind; text: string; timestamp: Date; failureDetail?: string; didAct?: boolean; reactions?: ChatMessageReaction[]; }", + "ChatMessageAdded": "export declare class ChatMessageAdded { readonly chatId: string; readonly text: string; constructor(chatId: string, text: string); }", + "ChatMessageBubble": "ChatMessageBubble: (props: ChatMessageBubbleProps) => import(\"react\").JSX.Element", + "ChatMessageBubbleLabels": "export interface ChatMessageBubbleLabels { yourReaction?: string; addReaction?: string; quickReplyTo?: string; convertToAction?: string; reactionPicker?: ReactionPickerLabels; }", + "ChatMessageBubbleProps": "export interface ChatMessageBubbleProps { message: ChatMessage; showAuthor: boolean; showTimestamp: boolean; formattedTimestamp: string; currentUserId?: Guid; onReact?: (messageId: Guid, emoji: string) => void; onQuickReply?: (authorName: string) => void; onAct?: (messageId: Guid) => void; buildAvatarUrl?: (params: BuildAvatarUrlParams) => string; labels?: ChatMessageBubbleLabels; }", + "ChatMessageReaction": "export interface ChatMessageReaction { emoji: string; users: ChatMessageReactionUser[]; }", + "ChatMessageReactionUser": "export interface ChatMessageReactionUser { id: Guid; name: string; reactionId: Guid; }", + "ChatOwnReaction": "export interface ChatOwnReaction { reactionId: Guid; emoji: string; }", + "ChatProps": "export interface ChatProps { id?: string; messages: ChatMessage[]; onSend: (text: string) => void; onClose: () => void; title?: string; autoFocus?: boolean; variant?: ChatVariant; mentionCandidates?: MentionCandidate[]; resolveMentionCandidates?: (query: string) => MentionCandidate[] | Promise; typingAuthors?: ChatTypingAuthor[]; currentUserId?: Guid; onReact?: (messageId: Guid, emoji: string) => void; onAct?: (messageId: Guid) => void; canAct?: (message: ChatMessage) => boolean; buildAvatarUrl?: (params: BuildAvatarUrlParams) => string; buildReportUrl?: (details: FailedReplyReportDetails) => string; labels?: ChatLabels; }", + "ChatTypingAuthor": "export interface ChatTypingAuthor { id: string; name: string; hasAvatar: boolean; kind: ChatAuthorKind; }", + "ChatVariant": "export declare enum ChatVariant { Floating = \"floating\", Docked = \"docked\" }", + "createSelfSuspendingFrameLoop": "createSelfSuspendingFrameLoop: (step: (now: number) => boolean, schedule?: FrameScheduler, cancel?: FrameCanceler) => SelfSuspendingFrameLoop", + "EmojiCategory": "export interface EmojiCategory { key: EmojiCategoryKey; emojis: readonly string[]; }", + "EmojiMemory": "export interface EmojiMemory { getItem(key: string): string | null; setItem(key: string, value: string): void; }", + "EmojiPicker": "EmojiPicker: (props: EmojiPickerProps) => import(\"react\").JSX.Element", + "EmojiPickerLabels": "export interface EmojiPickerLabels { allEmojis?: string; pickEmoji?: string; emojiCategories?: string; categories?: Partial>; }", + "EmojiPickerProps": "export interface EmojiPickerProps { ownEmoji?: string; onPick: (emoji: string) => void; labels?: EmojiPickerLabels; }", + "extractMentions": "extractMentions: (text: string, candidates: TCandidate[]) => TCandidate[]", + "FailedReply": "FailedReply: (props: FailedReplyProps) => import(\"react\").JSX.Element", + "FailedReplyLabels": "export interface FailedReplyLabels { replyFailed?: string; seeError?: string; report?: string; errorTitle?: string; reportTitle?: string; reportSummary?: string; close?: string; }", + "FailedReplyProps": "export interface FailedReplyProps { message: ChatMessage; buildReportUrl?: (details: FailedReplyReportDetails) => string; labels?: FailedReplyLabels; }", + "FailedReplyReportDetails": "export interface FailedReplyReportDetails { title: string; summary: string; detail: string; commentId: string; }", + "findMentionRanges": "findMentionRanges: (text: string, candidates: TCandidate[]) => MentionRange[]", + "findOwnReaction": "findOwnReaction: (reactions: ChatMessageReaction[] | undefined, userId: Guid) => ChatOwnReaction | undefined", + "getAvatarColor": "getAvatarColor: (seed: string) => string", + "ItemAddedToRegion": "export declare class ItemAddedToRegion { readonly regionId: string; readonly itemId: string; constructor(regionId: string, itemId: string); }", + "ItemRemovedFromRegion": "export declare class ItemRemovedFromRegion { readonly regionId: string; readonly itemId: string; constructor(regionId: string, itemId: string); }", + "itemsWithinRegion": "export declare function itemsWithinRegion(regionBounds: RegionContainmentBounds, items: Iterable<[ string, RegionContainmentBounds ]>, excludeId?: string): string[];", + "MentionCandidate": "export interface MentionCandidate { id: string; name: string; hasAvatar: boolean; kind: ChatAuthorKind; avatarVersion?: number; }", + "MentionQuery": "export interface MentionQuery { start: number; text: string; }", + "MentionRange": "export interface MentionRange { start: number; end: number; candidate: TCandidate; }", + "MentionSegment": "export interface MentionSegment { text: string; mention?: TCandidate; }", + "mentionSegments": "mentionSegments: (text: string, candidates: TCandidate[]) => MentionSegment[]", + "MentionSuggestions": "MentionSuggestions: (props: MentionSuggestionsProps) => import(\"react\").JSX.Element", + "MentionSuggestionsProps": "export interface MentionSuggestionsProps { candidates: MentionCandidate[]; highlightedIndex: number; onSelect: (candidate: MentionCandidate) => void; onHighlight: (index: number) => void; 'aria-label'?: string; buildAvatarUrl?: (params: BuildAvatarUrlParams) => string; }", + "MessageReactions": "MessageReactions: (props: MessageReactionsProps) => import(\"react\").JSX.Element | null", + "MessageReactionsProps": "export interface MessageReactionsProps { reactions: ChatMessageReaction[]; }", + "MinimapItem": "export interface MinimapItem { x: number; y: number; width: number; height: number; color?: string; }", + "Note": "Note: React.FC", + "NoteData": "export interface NoteData { id: string; x: number; y: number; width: number; height: number; text: string; }", + "NoteProps": "export interface NoteProps { note: NoteData; selected: boolean; onSelect: (id: string, additive: boolean) => void; onMove: (id: string, x: number, y: number) => void; onMoveEnd?: (id: string) => void; onResize: (id: string, x: number, y: number, width: number, height: number) => void; onResizeEnd?: (id: string) => void; onTextChange: (id: string, text: string) => void; onExpandedChange?: (id: string, isExpanded: boolean) => void; }", + "NoteTextChanged": "export declare class NoteTextChanged { readonly noteId: string; readonly text: string; constructor(noteId: string, text: string); }", + "PersonAvatarCircle": "PersonAvatarCircle: (props: PersonAvatarCircleProps) => import(\"react\").JSX.Element", + "PersonAvatarCircleProps": "export interface PersonAvatarCircleProps { userId: Guid | string; name: string; hasAvatar: boolean; size: number; ownerType?: 'Users' | 'Personas' | 'Agents'; avatarSize?: 'Small' | 'Medium'; version?: number | string; buildAvatarUrl?: (params: BuildAvatarUrlParams) => string; className?: string; }", + "ReactionPicker": "ReactionPicker: (props: ReactionPickerProps) => import(\"react\").JSX.Element", + "ReactionPickerLabels": "export interface ReactionPickerLabels { pickEmoji?: string; allEmojis?: string; emojiPicker?: EmojiPickerLabels; }", + "ReactionPickerProps": "export interface ReactionPickerProps { ownEmoji?: string; reactions?: readonly ChatMessageReaction[]; memory?: EmojiMemory; anchorRef?: RefObject; onPick: (emoji: string) => void; onDismiss: () => void; labels?: ReactionPickerLabels; }", + "recentEmojis": "export declare function recentEmojis(memory: EmojiMemory): string[];", + "Region": "Region: (props: RegionProps) => React.JSX.Element", + "RegionContainmentBounds": "export interface RegionContainmentBounds { x: number; y: number; width: number; height: number; anonymous?: boolean; }", + "RegionData": "export interface RegionData { id: string; x: number; y: number; width: number; height: number; name: string; }", + "RegionProps": "export interface RegionProps { region: RegionData; selected: boolean; onSelect: (id: string, additive: boolean) => void; onMove: (id: string, x: number, y: number) => void; onMoveEnd?: (id: string) => void; onResize: (id: string, x: number, y: number, width: number, height: number) => void; onResizeEnd?: (id: string) => void; onNameChange: (id: string, name: string) => void; children?: React.ReactNode; }", + "rememberEmoji": "export declare function rememberEmoji(memory: EmojiMemory, emoji: string): string[];", + "SelfSuspendingFrameLoop": "export interface SelfSuspendingFrameLoop { readonly isRunning: boolean; wake(): void; stop(): void; }", + "TypingIndicator": "TypingIndicator: (props: TypingIndicatorProps) => import(\"react\").JSX.Element | null", + "TypingIndicatorProps": "export interface TypingIndicatorProps { authors: ChatTypingAuthor[]; label: string; buildAvatarUrl?: (params: BuildAvatarUrlParams) => string; }" + }, + "./Chat": { + "BuildAvatarUrlParams": "export interface BuildAvatarUrlParams { userId: string; ownerType: 'Users' | 'Personas' | 'Agents'; avatarSize: 'Small' | 'Medium'; version?: number | string; }", + "ChatAuthor": "export interface ChatAuthor { name: string; initials?: string; hasAvatar?: boolean; kind: ChatAuthorKind; avatarVersion?: number; }", + "ChatAuthorKind": "export declare enum ChatAuthorKind { User = \"user\", Agent = \"agent\" }", + "ChatComposerLabels": "export interface ChatComposerLabels { placeholder?: string; insertEmoji?: string; send?: string; sendMessage?: string; reactionPicker?: ReactionPickerLabels; }", + "ChatConversation": "ChatConversation: (props: ChatConversationProps) => import(\"react\").JSX.Element", + "ChatConversationLabels": "export interface ChatConversationLabels { loading?: string; failed?: string; unauthorized?: string; empty?: string; typing?: string; typingTwo?: string; typingSeveral?: string; quickReplyTo?: string; timestamps?: RelativeTimestampLabels; composer?: ChatComposerLabels; }", + "ChatConversationProps": "export interface ChatConversationProps { messages: TMessage[]; status?: ChatStatus; onSendMessage: (body: string, mentions: ChatMention[]) => void; authorOf?: (authorId: ChatIdentifier) => ChatAuthor; renderAvatar?: (authorId: ChatIdentifier, author: ChatAuthor) => ReactNode; renderAuthorName?: (authorId: ChatIdentifier, author: ChatAuthor) => ReactNode; actions?: ChatMessageAction[]; mentionCandidates?: MentionCandidate[]; resolveMentionCandidates?: (query: string) => MentionCandidate[] | Promise; typingAuthors?: ChatTypingAuthor[]; quickReply?: boolean; buildAvatarUrl?: (params: BuildAvatarUrlParams) => string; autoFocus?: boolean; labels?: ChatConversationLabels; className?: string; }", + "ChatIdentifier": "export type ChatIdentifier = string | { toString(): string; };", + "chatIdentifierString": "chatIdentifierString: (identifier: ChatIdentifier) => string", + "ChatMention": "export interface ChatMention { id: ChatIdentifier; name: string; kind: ChatAuthorKind; }", + "ChatMessage": "export interface ChatMessage { id: ChatIdentifier; topicId: ChatIdentifier; authorId: ChatIdentifier; body: string; timestamp: Date; mentions?: ChatMention[]; metadata?: Record; }", + "ChatMessageAction": "export interface ChatMessageAction { id: string; label: string; icon: string | ReactNode; isAvailable?: (message: TMessage) => boolean; onInvoke: (message: TMessage) => void; }", + "ChatMessageBody": "ChatMessageBody: (props: ChatMessageBodyProps) => React.JSX.Element", + "ChatMessageBodyProps": "export interface ChatMessageBodyProps { body: string; mentions?: ChatMention[]; }", + "ChatSidebar": "ChatSidebar: (props: ChatSidebarProps) => false | import(\"react\").JSX.Element | null", + "ChatSidebarForObservableQueries": "ChatSidebarForObservableQueries: , TMessagesQuery extends IObservableQueryFor, TTopicsArguments extends object = object, TMessagesArguments extends object = object>(props: ChatSidebarForObservableQueriesProps) => React.JSX.Element", + "ChatSidebarForObservableQueriesProps": "export interface ChatSidebarForObservableQueriesProps, TMessagesQuery extends IObservableQueryFor, TTopicsArguments extends object = object, TMessagesArguments extends object = object> extends Omit, 'topics' | 'messages' | 'selectedTopicId' | 'topicsStatus' | 'messagesStatus'> { topicsQuery: Constructor; topicsArguments?: TTopicsArguments; messagesQuery: Constructor; messagesArguments: (topicId: ChatIdentifier | undefined) => TMessagesArguments | undefined; }", + "ChatSidebarLabels": "export interface ChatSidebarLabels { topics?: string; unnamedTopic?: string; back?: string; close?: string; topicList?: ChatTopicListLabels; conversation?: ChatConversationLabels; }", + "ChatSidebarParts": "export interface ChatSidebarParts { backdrop?: ChatSidebarPartAttributes; root?: ChatSidebarPartAttributes; header?: ChatSidebarPartAttributes; title?: ChatSidebarPartAttributes; back?: ChatSidebarButtonAttributes; close?: ChatSidebarButtonAttributes; content?: ChatSidebarPartAttributes; }", + "ChatSidebarProps": "export interface ChatSidebarProps extends Omit, 'messages' | 'onSendMessage' | 'labels' | 'className' | 'status'> { open: boolean; onClose: () => void; topics: TTopic[]; messages: TMessage[]; topicActions?: ChatTopicAction[]; topicsStatus?: ChatStatus; messagesStatus?: ChatStatus; selectedTopicId?: ChatIdentifier | null; onTopicSelected?: (topicId: ChatIdentifier | undefined, topic?: TTopic) => void; onStartTopic?: () => ChatIdentifier | undefined | Promise; onSendMessage: (topicId: ChatIdentifier, body: string, mentions: ChatMention[]) => void; onRequestTopicName?: (topic: TTopic, firstMessageBody: string) => void; isTopicUnnamed?: (topic: TTopic) => boolean; position?: 'left' | 'right'; width?: string; modal?: boolean; labels?: ChatSidebarLabels; className?: string; pt?: ChatSidebarParts; }", + "ChatStatus": "export declare enum ChatStatus { Ready = \"ready\", Loading = \"loading\", Failed = \"failed\", Unauthorized = \"unauthorized\" }", + "ChatTopic": "export interface ChatTopic { id: ChatIdentifier; name?: string; startedBy?: ChatIdentifier; started?: Date; lastActivity?: Date; metadata?: Record; }", + "ChatTopicAction": "export interface ChatTopicAction { id: string; label: string; icon?: string | ReactNode; isAvailable?: (topic: TTopic) => boolean; onInvoke: (topic: TTopic) => void; }", + "ChatTopicList": "ChatTopicList: (props: ChatTopicListProps) => import(\"react\").JSX.Element", + "ChatTopicListLabels": "export interface ChatTopicListLabels { newTopic?: string; unnamedTopic?: string; startedBy?: string; loading?: string; failed?: string; unauthorized?: string; empty?: string; timestamps?: RelativeTimestampLabels; }", + "ChatTopicListProps": "export interface ChatTopicListProps { topics: TTopic[]; status?: ChatStatus; onOpen: (topic: TTopic) => void; onStart?: () => void; authorOf?: (authorId: ChatIdentifier) => ChatAuthor; renderAvatar?: (authorId: ChatIdentifier, author: ChatAuthor) => ReactNode; isTopicUnnamed?: (topic: TTopic) => boolean; buildAvatarUrl?: (params: BuildAvatarUrlParams) => string; labels?: ChatTopicListLabels; topicActions?: ChatTopicAction[]; className?: string; }", + "ChatTypingAuthor": "export interface ChatTypingAuthor { id: string; name: string; hasAvatar: boolean; kind: ChatAuthorKind; }", + "extractMentions": "extractMentions: (text: string, candidates: TCandidate[]) => TCandidate[]", + "findMentionRanges": "findMentionRanges: (text: string, candidates: TCandidate[]) => MentionRange[]", + "isTopicUnnamed": "isTopicUnnamed: (topic: ChatTopic) => boolean", + "MentionCandidate": "export interface MentionCandidate { id: string; name: string; hasAvatar: boolean; kind: ChatAuthorKind; avatarVersion?: number; }", + "MentionRange": "export interface MentionRange { start: number; end: number; candidate: TCandidate; }", + "MentionSegment": "export interface MentionSegment { text: string; mention?: TCandidate; }", + "mentionSegments": "mentionSegments: (text: string, candidates: TCandidate[]) => MentionSegment[]", + "relativeTimestamp": "relativeTimestamp: (moment: Date, now?: Date, labels?: RelativeTimestampLabels) => string", + "RelativeTimestampLabels": "export interface RelativeTimestampLabels { justNow?: string; minutesAgo?: string; hoursAgo?: string; }", + "sameChatIdentifier": "sameChatIdentifier: (left?: ChatIdentifier, right?: ChatIdentifier) => boolean", + "shouldRequestTopicName": "shouldRequestTopicName: (topicIsUnnamed: boolean, existingMessageCount: number) => boolean", + "topicsByActivity": "topicsByActivity: (topics: TTopic[]) => TTopic[]" + }, + "./CommandDialog": { + "applyBeforeExecute": "export declare function applyBeforeExecute(onBeforeExecute: BeforeExecuteCallback, currentValues: TCommand): TCommand | Promise;", + "BeforeExecuteCallback": "export type BeforeExecuteCallback = (values: TCommand) => TCommand | Promise;", + "CommandDialog": "CommandDialog: typeof CommandDialogComponent", + "CommandDialogProps": "export interface CommandDialogProps extends Omit, 'children' | 'onBeforeExecute'>, Omit { onBeforeExecute?: BeforeExecuteCallback; confirmBeforeExecute?: ConfirmBeforeExecute; children?: React.ReactNode; }", + "CommandStepper": "CommandStepper: (props: CommandStepperProps) => React.JSX.Element", + "CommandStepperProps": "export interface CommandStepperProps extends Omit, 'children' | 'onBeforeExecute'>, Omit { onBeforeExecute?: BeforeExecuteCallback; confirmBeforeExecute?: ConfirmBeforeExecute; children?: React.ReactNode; }", + "ConfirmBeforeExecute": "export type ConfirmBeforeExecute = (values: TCommand) => boolean | Promise;", + "StepperChangeEvent": "export interface StepperChangeEvent { index: number; }", + "StepperCommandDialog": "StepperCommandDialog: typeof StepperCommandDialogComponent", + "StepperCommandDialogProps": "export interface StepperCommandDialogProps extends Omit, 'children' | 'onBeforeExecute'>, StepperCustomizationProps { onBeforeExecute?: BeforeExecuteCallback; confirmBeforeExecute?: ConfirmBeforeExecute; title: string; visible?: boolean; width?: string; style?: CSSProperties; contentStyle?: CSSProperties; resizable?: boolean; isValid?: boolean; onClose?: CloseDialog; onConfirm?: ConfirmCallback; onCancel?: CancelCallback; okLabel?: string; nextLabel?: string; previousLabel?: string; showCancel?: boolean; cancelLabel?: string; dialogClassName?: string; dialogPt?: DialogProps['pt']; dialogPtOptions?: DialogProps['ptOptions']; dialogUnstyled?: boolean; children?: React.ReactNode; }", + "StepperCustomizationProps": "export interface StepperCustomizationProps { linear?: boolean; orientation?: StepperOrientation; headerPosition?: StepperHeaderPosition; start?: React.ReactNode; end?: React.ReactNode; onChangeStep?: (event: StepperChangeEvent) => void; pt?: StepperParts; ptOptions?: object; unstyled?: boolean; }", + "StepperHeaderPosition": "export type StepperHeaderPosition = 'top' | 'bottom';", + "StepperOrientation": "export type StepperOrientation = 'horizontal' | 'vertical';", + "StepperPanel": "export declare function StepperPanel(_props: StepperPanelProps): React.ReactElement | null; | export declare namespace StepperPanel { var displayName: string; }", + "StepperPanelProps": "export interface StepperPanelProps { header?: React.ReactNode; children?: React.ReactNode; }", + "StepperParts": "export interface StepperParts { root?: HTMLAttributes; list?: HTMLAttributes; step?: HTMLAttributes; header?: ButtonHTMLAttributes; number?: HTMLAttributes; title?: HTMLAttributes; separator?: HTMLAttributes; panels?: HTMLAttributes; panel?: HTMLAttributes; }" + }, + "./CommandForm": { + "AutoCommandForm": "export declare function AutoCommandForm(props: AutoCommandFormProps): React.ReactElement;", + "AutoCommandFormProps": "export interface AutoCommandFormProps extends Omit, 'children'> { exclude?: (keyof TCommand)[]; footer?: React.ReactNode; }", + "CalendarField": "CalendarField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "CheckboxField": "CheckboxField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "CheckboxParts": "export interface CheckboxParts { root?: HTMLAttributes; input?: InputHTMLAttributes; box?: HTMLAttributes; indicator?: HTMLAttributes; }", + "ChipsField": "ChipsField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "ChipsParts": "export interface ChipsParts { root?: HTMLAttributes; item?: HTMLAttributes; remove?: React.ButtonHTMLAttributes; input?: InputHTMLAttributes; }", + "clearFieldTypeProviders": "export declare function clearFieldTypeProviders(): void;", + "ColorPickerField": "ColorPickerField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "ColorPickerParts": "export interface ColorPickerParts { root?: HTMLAttributes; input?: InputHTMLAttributes; value?: HTMLAttributes; }", + "CommandFormColumnDisplayName": "CommandFormColumnDisplayName = \"CommandFormColumn\"", + "CommandFormFieldDisplayName": "CommandFormFieldDisplayName = \"CommandFormField\"", + "CommandFormMarked": "export type CommandFormMarked = { isCommandFormField?: boolean; isCommandFormColumn?: boolean; displayName?: string; };", + "DropdownField": "DropdownField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "FieldTypeProvider": "export interface FieldTypeProvider { canHandle(propertyDescriptor: PropertyDescriptor): boolean; component: ComponentType; }", + "InputTextField": "InputTextField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "InputTextParts": "export interface InputTextParts { root?: InputHTMLAttributes; }", + "isCommandFormColumn": "export declare function isCommandFormColumn(component: unknown): boolean;", + "isCommandFormField": "export declare function isCommandFormField(component: unknown): boolean;", + "markAsCommandFormColumn": "export declare function markAsCommandFormColumn(component: T): T & CommandFormMarked;", + "markAsCommandFormField": "export declare function markAsCommandFormField(component: T): T & CommandFormMarked;", + "MultiSelectField": "MultiSelectField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "NumberField": "NumberField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "NumberFieldParts": "export interface NumberFieldParts { root?: HTMLAttributes; input?: InputHTMLAttributes; }", + "NumberInputField": "NumberInputField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "PasswordField": "PasswordField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "PasswordParts": "export interface PasswordParts { root?: HTMLAttributes; input?: InputHTMLAttributes; toggle?: ButtonHTMLAttributes; }", + "RadioButtonField": "RadioButtonField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "RadioGroupField": "RadioGroupField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "RadioGroupParts": "export interface RadioGroupParts { root?: HTMLAttributes; option?: HTMLAttributes; input?: InputHTMLAttributes; box?: HTMLAttributes; indicator?: HTMLAttributes; }", + "RadioParts": "export interface RadioParts { root?: HTMLAttributes; input?: InputHTMLAttributes; box?: HTMLAttributes; indicator?: HTMLAttributes; }", + "RatingField": "RatingField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "RatingParts": "export interface RatingParts { root?: HTMLAttributes; option?: HTMLAttributes; input?: InputHTMLAttributes; star?: HTMLAttributes; }", + "registerFieldTypeProvider": "export declare function registerFieldTypeProvider(provider: FieldTypeProvider): void;", + "resolveFieldTypeProvider": "export declare function resolveFieldTypeProvider(propertyDescriptor: PropertyDescriptor): FieldTypeProvider | undefined;", + "SliderField": "SliderField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "SliderParts": "export interface SliderParts { root?: HTMLAttributes; input?: InputHTMLAttributes; value?: HTMLAttributes; }", + "TextAreaField": "TextAreaField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "TextAreaParts": "export interface TextAreaParts { root?: TextareaHTMLAttributes; }", + "ToggleSwitchField": "ToggleSwitchField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "ToggleSwitchParts": "export interface ToggleSwitchParts { root?: HTMLAttributes; input?: InputHTMLAttributes; control?: HTMLAttributes; handle?: HTMLAttributes; }" + }, + "./CommandForm/fields": { + "AutoCommandForm": "export declare function AutoCommandForm(props: AutoCommandFormProps): React.ReactElement;", + "AutoCommandFormProps": "export interface AutoCommandFormProps extends Omit, 'children'> { exclude?: (keyof TCommand)[]; footer?: React.ReactNode; }", + "CalendarField": "CalendarField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "CheckboxField": "CheckboxField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "CheckboxParts": "export interface CheckboxParts { root?: HTMLAttributes; input?: InputHTMLAttributes; box?: HTMLAttributes; indicator?: HTMLAttributes; }", + "ChipsField": "ChipsField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "ChipsParts": "export interface ChipsParts { root?: HTMLAttributes; item?: HTMLAttributes; remove?: React.ButtonHTMLAttributes; input?: InputHTMLAttributes; }", + "clearFieldTypeProviders": "export declare function clearFieldTypeProviders(): void;", + "ColorPickerField": "ColorPickerField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "ColorPickerParts": "export interface ColorPickerParts { root?: HTMLAttributes; input?: InputHTMLAttributes; value?: HTMLAttributes; }", + "CommandFormColumnDisplayName": "CommandFormColumnDisplayName = \"CommandFormColumn\"", + "CommandFormFieldDisplayName": "CommandFormFieldDisplayName = \"CommandFormField\"", + "CommandFormMarked": "export type CommandFormMarked = { isCommandFormField?: boolean; isCommandFormColumn?: boolean; displayName?: string; };", + "DropdownField": "DropdownField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "FieldTypeProvider": "export interface FieldTypeProvider { canHandle(propertyDescriptor: PropertyDescriptor): boolean; component: ComponentType; }", + "InputTextField": "InputTextField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "InputTextParts": "export interface InputTextParts { root?: InputHTMLAttributes; }", + "isCommandFormColumn": "export declare function isCommandFormColumn(component: unknown): boolean;", + "isCommandFormField": "export declare function isCommandFormField(component: unknown): boolean;", + "markAsCommandFormColumn": "export declare function markAsCommandFormColumn(component: T): T & CommandFormMarked;", + "markAsCommandFormField": "export declare function markAsCommandFormField(component: T): T & CommandFormMarked;", + "MultiSelectField": "MultiSelectField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "NumberField": "NumberField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "NumberFieldParts": "export interface NumberFieldParts { root?: HTMLAttributes; input?: InputHTMLAttributes; }", + "NumberInputField": "NumberInputField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "PasswordField": "PasswordField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "PasswordParts": "export interface PasswordParts { root?: HTMLAttributes; input?: InputHTMLAttributes; toggle?: ButtonHTMLAttributes; }", + "RadioButtonField": "RadioButtonField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "RadioGroupField": "RadioGroupField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "RadioGroupParts": "export interface RadioGroupParts { root?: HTMLAttributes; option?: HTMLAttributes; input?: InputHTMLAttributes; box?: HTMLAttributes; indicator?: HTMLAttributes; }", + "RadioParts": "export interface RadioParts { root?: HTMLAttributes; input?: InputHTMLAttributes; box?: HTMLAttributes; indicator?: HTMLAttributes; }", + "RatingField": "RatingField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "RatingParts": "export interface RatingParts { root?: HTMLAttributes; option?: HTMLAttributes; input?: InputHTMLAttributes; star?: HTMLAttributes; }", + "registerFieldTypeProvider": "export declare function registerFieldTypeProvider(provider: FieldTypeProvider): void;", + "resolveFieldTypeProvider": "export declare function resolveFieldTypeProvider(propertyDescriptor: PropertyDescriptor): FieldTypeProvider | undefined;", + "SliderField": "SliderField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "SliderParts": "export interface SliderParts { root?: HTMLAttributes; input?: InputHTMLAttributes; value?: HTMLAttributes; }", + "TextAreaField": "TextAreaField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "TextAreaParts": "export interface TextAreaParts { root?: TextareaHTMLAttributes; }", + "ToggleSwitchField": "ToggleSwitchField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", + "ToggleSwitchParts": "export interface ToggleSwitchParts { root?: HTMLAttributes; input?: InputHTMLAttributes; control?: HTMLAttributes; handle?: HTMLAttributes; }" + }, + "./CommandStepper": { + "CommandStepper": "CommandStepper: (props: CommandStepperProps) => React.JSX.Element", + "CommandStepperProps": "export interface CommandStepperProps extends Omit, 'children' | 'onBeforeExecute'>, Omit { onBeforeExecute?: BeforeExecuteCallback; confirmBeforeExecute?: ConfirmBeforeExecute; children?: React.ReactNode; }", + "StepperChangeEvent": "export interface StepperChangeEvent { index: number; }", + "StepperCustomizationProps": "export interface StepperCustomizationProps { linear?: boolean; orientation?: StepperOrientation; headerPosition?: StepperHeaderPosition; start?: React.ReactNode; end?: React.ReactNode; onChangeStep?: (event: StepperChangeEvent) => void; pt?: StepperParts; ptOptions?: object; unstyled?: boolean; }", + "StepperHeaderPosition": "export type StepperHeaderPosition = 'top' | 'bottom';", + "StepperOrientation": "export type StepperOrientation = 'horizontal' | 'vertical';", + "StepperParts": "export interface StepperParts { root?: HTMLAttributes; list?: HTMLAttributes; step?: HTMLAttributes; header?: ButtonHTMLAttributes; number?: HTMLAttributes; title?: HTMLAttributes; separator?: HTMLAttributes; panels?: HTMLAttributes; panel?: HTMLAttributes; }" + }, + "./Common": { + "ActionMenubar": "ActionMenubar: (props: ActionMenubarProps) => import(\"react\").JSX.Element", + "ActionMenubarProps": "export interface ActionMenubarProps { focusMode?: ToolbarFocusMode; model: ActionMenuItem[]; className?: string; 'aria-label'?: string; pt?: ButtonParts; ptOptions?: object; unstyled?: boolean; }", + "ActionMenuItem": "export interface ActionMenuItem { label?: string; icon?: ReactNode; command?: () => void; disabled?: boolean; className?: string; severity?: ButtonSeverity; template?: (item: ActionMenuItem) => ReactNode; }", + "BreadcrumbItem": "export interface BreadcrumbItem { label: ReactNode; href?: string; onNavigate?: () => void; }", + "Breadcrumbs": "Breadcrumbs: (props: BreadcrumbsProps) => import(\"react\").JSX.Element", + "BreadcrumbsPartAttributes": "export type BreadcrumbsPartAttributes = Pick, 'className' | 'style' | 'title'> & { [dataAttribute: `data-${string}`]: string | number | boolean | undefined; };", + "BreadcrumbsParts": "export interface BreadcrumbsParts { root?: BreadcrumbsPartAttributes; item?: BreadcrumbsPartAttributes; link?: BreadcrumbsPartAttributes; separator?: BreadcrumbsPartAttributes; }", + "BreadcrumbsProps": "export interface BreadcrumbsProps { items: BreadcrumbItem[]; separator?: ReactNode; 'aria-label'?: string; className?: string; pt?: BreadcrumbsParts; }", + "Button": "Button: import(\"react\").ForwardRefExoticComponent>", + "ButtonParts": "export interface ButtonParts { root?: ButtonHTMLAttributes; icon?: HTMLAttributes; label?: HTMLAttributes; spinner?: HTMLAttributes; }", + "ButtonProps": "export interface ButtonProps extends Omit, 'children' | 'className' | 'disabled' | 'size' | 'style' | 'type'> { label?: ReactNode; icon?: ReactNode; loading?: boolean; tooltip?: string; tooltipOptions?: { position?: TooltipPosition; className?: string; }; pt?: ButtonParts; variant?: ButtonVariant; tone?: ButtonTone; shape?: ButtonShape; text?: boolean; link?: boolean; outlined?: boolean; rounded?: boolean; severity?: ButtonSeverity; size?: 'small' | 'normal' | 'large'; disabled?: boolean; type?: 'button' | 'submit' | 'reset'; title?: string; autoFocus?: boolean; className?: string; style?: CSSProperties; 'aria-label'?: string; children?: ReactNode; }", + "ButtonSeverity": "export type ButtonSeverity = 'secondary' | 'info' | 'success' | 'warn' | 'help' | 'danger' | 'contrast';", + "ButtonShape": "export type ButtonShape = 'default' | 'pill';", + "ButtonTone": "export type ButtonTone = 'neutral' | 'accent' | 'positive' | 'caution' | 'critical';", + "ButtonVariant": "export type ButtonVariant = 'solid' | 'outline' | 'ghost' | 'link';", + "Checkbox": "Checkbox: import(\"react\").ForwardRefExoticComponent>", + "CheckboxParts": "export interface CheckboxParts { root?: LabelHTMLAttributes; input?: InputHTMLAttributes; box?: HTMLAttributes; indicator?: HTMLAttributes; label?: HTMLAttributes; }", + "CheckboxProps": "export interface CheckboxProps extends Omit, 'children' | 'className' | 'onChange' | 'readOnly' | 'style' | 'type'> { label?: ReactNode; readOnly?: boolean; invalid?: boolean; onChange?: ChangeHandler; className?: string; style?: CSSProperties; pt?: CheckboxParts; }", + "ComboBox": "export declare function ComboBox(props: ComboBoxProps): import(\"react\").JSX.Element; | export declare namespace ComboBox { var displayName: string; }", + "ComboBoxAction": "export interface ComboBoxAction { label: string; onAction: (inputValue: string) => void | Promise; }", + "ComboBoxFilter": "export type ComboBoxFilter = 'contains' | 'startsWith' | 'none';", + "ComboBoxOption": "export interface ComboBoxOption { key: string; label: string; description?: ReactNode; disabled?: boolean; }", + "ComboBoxPartAttributes": "export type ComboBoxPartAttributes = Pick, 'className' | 'style' | 'title'> & { [dataAttribute: `data-${string}`]: string | number | boolean | undefined; };", + "ComboBoxParts": "export interface ComboBoxParts { root?: ComboBoxPartAttributes; input?: ComboBoxPartAttributes; trigger?: ComboBoxPartAttributes; popover?: ComboBoxPartAttributes; listbox?: ComboBoxPartAttributes; option?: ComboBoxPartAttributes; optionLabel?: ComboBoxPartAttributes; optionDescription?: ComboBoxPartAttributes; loading?: ComboBoxPartAttributes; empty?: ComboBoxPartAttributes; failure?: ComboBoxPartAttributes; action?: ComboBoxPartAttributes; description?: ComboBoxPartAttributes; error?: ComboBoxPartAttributes; }", + "ComboBoxProps": "export interface ComboBoxProps { options: ComboBoxOption[]; value: string | null; onChange: (key: string | null) => void; inputValue?: string; onInputChange?: (inputValue: string) => void; filter?: ComboBoxFilter; openOnFocus?: boolean; loading?: boolean; loadingMessage?: ReactNode; emptyMessage?: ReactNode; failure?: ReactNode; action?: ComboBoxAction; optionLayout?: 'inline' | 'stacked'; placeholder?: string; disabled?: boolean; readOnly?: boolean; invalid?: boolean; required?: boolean; id?: string; name?: string; 'aria-label'?: string; 'aria-labelledby'?: string; 'aria-describedby'?: string; description?: ReactNode; errorMessage?: ReactNode; className?: string; pt?: ComboBoxParts; }", + "CratisColumnFilterMessages": "export interface CratisColumnFilterMessages { filterTriggerAriaLabel?: (field: string) => string; valueAriaLabel?: (field: string) => string; matchModeAriaLabel?: string; matchModeLabel?: (mode: string, defaultLabel: string) => string; clear?: string; apply?: string; true?: string; false?: string; }", + "CratisComponentsConfig": "export interface CratisComponentsConfig { locale?: string; messages?: CratisComponentsMessages; icons?: CratisComponentsIcons; locales?: Record; }", + "CratisComponentsIcons": "export interface CratisComponentsIcons { close?: ReactNode; remove?: ReactNode; expand?: ReactNode; sortAscending?: ReactNode; sortDescending?: ReactNode; previous?: ReactNode; next?: ReactNode; clear?: ReactNode; }", + "CratisComponentsMessages": "export interface CratisComponentsMessages { paginator?: CratisPaginatorMessages; datePicker?: CratisDatePickerMessages; dropdown?: CratisDropdownMessages; dialog?: CratisDialogMessages; stepper?: CratisStepperMessages; notifications?: CratisNotificationsMessages; dataTable?: CratisDataTableMessages; filter?: CratisFilterMessages; columnFilter?: CratisColumnFilterMessages; toolbar?: CratisToolbarMessages; }", + "CratisComponentsProvider": "CratisComponentsProvider: (props: CratisComponentsProviderProps) => import(\"react\").JSX.Element", + "CratisComponentsProviderProps": "export interface CratisComponentsProviderProps { value?: CratisComponentsConfig; toaster?: boolean | ToasterProps; library?: unstable_UiLibrary | readonly unstable_UiLibrary[]; libraryMode?: 'strict' | 'degrade'; rendererFallback?: 'core' | 'throw'; overlayEnvironment?: CratisOverlayEnvironment; rendererSetup?: CratisRendererSetup; children: ReactNode; }", + "CratisDataTableMessages": "export interface CratisDataTableMessages { selectRow?: string; selectAllRows?: string; search?: string; searchAriaLabel?: string; loading?: string; failed?: string; unauthorized?: string; }", + "CratisDatePickerMessages": "export interface CratisDatePickerMessages { today?: string; clear?: string; openCalendar?: string; previousMonth?: string; nextMonth?: string; label?: string; }", + "cratisDefaults": "cratisDefaults: CratisComponentsConfig", + "CratisDialogMessages": "export interface CratisDialogMessages { ok?: string; cancel?: string; yes?: string; no?: string; close?: string; }", + "CratisDropdownMessages": "export interface CratisDropdownMessages { showOptions?: string; clearSelection?: string; }", + "CratisFilterMessages": "export interface CratisFilterMessages { label?: string; searchAriaLabel?: string; }", + "CratisNotificationsMessages": "export interface CratisNotificationsMessages { dismiss?: string; region?: string; }", + "CratisPaginatorMessages": "export interface CratisPaginatorMessages { navigation?: string; first?: string; previous?: string; next?: string; last?: string; }", + "CratisStepperMessages": "export interface CratisStepperMessages { next?: string; previous?: string; submit?: string; }", + "CratisToolbarMessages": "export interface CratisToolbarMessages { label?: string; }", + "DatePickerInput": "DatePickerInput: (props: DatePickerInputProps) => import(\"react\").ReactElement>", + "DatePickerInputPassThrough": "export interface DatePickerInputPassThrough { root?: DatePickerPartAttributes; group?: DatePickerPartAttributes; input?: DatePickerPartAttributes; placeholder?: DatePickerPartAttributes; segment?: DatePickerPartAttributes; trigger?: DatePickerButtonAttributes; popover?: DatePickerPartAttributes; dialog?: DatePickerPartAttributes; calendar?: DatePickerPartAttributes; header?: DatePickerPartAttributes; heading?: DatePickerPartAttributes; previous?: DatePickerButtonAttributes; next?: DatePickerButtonAttributes; grid?: DatePickerPartAttributes; cell?: DatePickerPartAttributes; buttonBar?: DatePickerPartAttributes; today?: DatePickerButtonAttributes; clear?: DatePickerButtonAttributes; }", + "DatePickerInputProps": "export interface DatePickerInputProps { value: Date | null; onChange: ChangeHandler; onBlur?: FocusEventHandler; invalid?: boolean; disabled?: boolean; readOnly?: boolean; id?: string; showButtonBar?: boolean; placeholder?: string; dateFormat?: string; showIcon?: boolean; showTime?: boolean; hourFormat?: '12' | '24'; minDate?: Date; maxDate?: Date; className?: string; style?: CSSProperties; pt?: DatePickerInputPassThrough; ptOptions?: object; unstyled?: boolean; todayLabel?: string; clearLabel?: string; 'aria-label'?: string; 'aria-labelledby'?: string; 'aria-describedby'?: string; }", + "ErrorBoundary": "export declare class ErrorBoundary extends Component { state: State; static getDerivedStateFromError(_error: unknown): State; componentDidCatch(error: unknown, errorInfo: ErrorInfo): void; private reset; render(): string | number | bigint | boolean | import(\"react\").JSX.Element | Iterable | Promise | import(\"react\").ReactElement> | import(\"react\").ReactPortal | null | undefined> | null | undefined; }", + "ErrorBoundaryProps": "export interface ErrorBoundaryProps { children: ReactNode; fallback?: ReactNode | ((reset: () => void) => ReactNode); onError?: (error: unknown, errorInfo: ErrorInfo) => void; onReset?: () => void; }", + "FormElement": "FormElement: (props: FormElementProps) => import(\"react\").JSX.Element", + "FormElementProps": "export interface FormElementProps { children: React.ReactNode; icon: React.ReactNode; }", + "Icon": "export type Icon = string | ReactNode;", + "IconButton": "IconButton: import(\"react\").ForwardRefExoticComponent>", + "IconButtonParts": "export type IconButtonParts = ButtonParts;", + "IconButtonProps": "export interface IconButtonProps extends Omit { icon: ReactNode; 'aria-label': string; pt?: IconButtonParts; }", + "IconDisplay": "IconDisplay: (props: IconDisplayProps) => import(\"react\").JSX.Element", + "IconDisplayProps": "export interface IconDisplayProps { icon: Icon; className?: string; }", + "mergeCratisComponentsConfig": "mergeCratisComponentsConfig: (value: CratisComponentsConfig | undefined) => CratisComponentsConfig", + "NormalizedIconClass": "export interface NormalizedIconClass { className: string; }", + "normalizeIconClass": "export declare function normalizeIconClass(icon: string): NormalizedIconClass;", + "NumberInput": "NumberInput: (props: NumberInputProps) => import(\"react\").JSX.Element", + "NumberInputCommitReason": "export declare enum NumberInputCommitReason { Blur = \"blur\", Enter = \"enter\", Paste = \"paste\", Step = \"step\" }", + "NumberInputPartAttributes": "export interface NumberInputPartAttributes { className?: string; style?: Readonly>; title?: string; [attribute: `data-${string}`]: string | number | boolean | undefined; }", + "NumberInputParts": "export interface NumberInputParts { root?: NumberInputPartAttributes; group?: NumberInputPartAttributes; input?: NumberInputPartAttributes; prefix?: NumberInputPartAttributes; suffix?: NumberInputPartAttributes; step?: NumberInputPartAttributes; description?: NumberInputPartAttributes; error?: NumberInputPartAttributes; }", + "NumberInputProps": "export interface NumberInputProps { value: number | null; onChange: (value: number | null) => void; onCommit?: (value: number | null, reason: NumberInputCommitReason) => void; locale?: string; useGrouping?: boolean; minimumFractionDigits?: number; maximumFractionDigits?: number; required?: boolean; min?: number; max?: number; step?: number; prefix?: ReactNode; suffix?: ReactNode; placeholder?: string; disabled?: boolean; readOnly?: boolean; showSteppers?: boolean; invalid?: boolean; id?: string; name?: string; 'aria-label'?: string; 'aria-labelledby'?: string; 'aria-describedby'?: string; description?: ReactNode; errorMessage?: ReactNode; className?: string; pt?: NumberInputParts; }", + "Page": "Page: (props: PageProps) => import(\"react\").JSX.Element", + "PageProps": "export interface PageProps extends HTMLAttributes { title: string; showTitle?: boolean; children?: ReactNode; panel?: boolean; }", + "Radio": "Radio: import(\"react\").ForwardRefExoticComponent>", + "RadioParts": "export interface RadioParts { root?: LabelHTMLAttributes; input?: InputHTMLAttributes; box?: HTMLAttributes; indicator?: HTMLAttributes; label?: HTMLAttributes; }", + "RadioProps": "export interface RadioProps extends Omit, 'children' | 'className' | 'name' | 'onChange' | 'readOnly' | 'style' | 'type' | 'value'> { name: string; value: string | number; label?: ReactNode; readOnly?: boolean; invalid?: boolean; onChange?: ChangeHandler; className?: string; style?: CSSProperties; pt?: RadioParts; }", + "Surface": "Surface: import(\"react\").ForwardRefExoticComponent>", + "SurfaceElement": "export type SurfaceElement = 'article' | 'div' | 'section';", + "SurfaceParts": "export interface SurfaceParts { root?: HTMLAttributes; }", + "SurfaceProps": "export interface SurfaceProps extends HTMLAttributes { as?: SurfaceElement; pt?: SurfaceParts; }", + "Switch": "Switch: import(\"react\").ForwardRefExoticComponent>", + "SwitchParts": "export interface SwitchParts { root?: LabelHTMLAttributes; input?: InputHTMLAttributes; control?: HTMLAttributes; handle?: HTMLAttributes; label?: HTMLAttributes; }", + "SwitchProps": "export interface SwitchProps extends Omit, 'children' | 'className' | 'onChange' | 'readOnly' | 'style' | 'type'> { label?: ReactNode; readOnly?: boolean; invalid?: boolean; onChange?: ChangeHandler; className?: string; style?: CSSProperties; pt?: SwitchParts; }", + "TabItem": "export interface TabItem { id: string; label: ReactNode; content: ReactNode; disabled?: boolean; }", + "Tabs": "Tabs: (props: TabsProps) => import(\"react\").JSX.Element", + "TabsPartAttributes": "export type TabsPartAttributes = Pick, 'className' | 'style' | 'title'> & { [dataAttribute: `data-${string}`]: string | number | boolean | undefined; };", + "TabsParts": "export interface TabsParts { root?: TabsPartAttributes; list?: TabsPartAttributes; tab?: TabsPartAttributes; panel?: TabsPartAttributes; }", + "TabsProps": "export interface TabsProps { tabs: TabItem[]; value: string; onChange: (value: string) => void; disabled?: boolean; 'aria-label'?: string; 'aria-labelledby'?: string; className?: string; pt?: TabsParts; }", + "TagGroup": "TagGroup: (props: TagGroupProps) => import(\"react\").JSX.Element", + "TagGroupPartAttributes": "export type TagGroupPartAttributes = Pick, 'className' | 'style' | 'title'> & { [dataAttribute: `data-${string}`]: string | number | boolean | undefined; };", + "TagGroupParts": "export interface TagGroupParts { root?: TagGroupPartAttributes; list?: TagGroupPartAttributes; tag?: TagGroupPartAttributes; remove?: TagGroupPartAttributes; input?: InputHTMLAttributes; }", + "TagGroupProps": "export interface TagGroupProps { value: string[]; onChange: (value: string[]) => void; editable?: boolean; placeholder?: string; separators?: string[]; allowDuplicates?: boolean; disabled?: boolean; 'aria-label'?: string; 'aria-labelledby'?: string; 'aria-describedby'?: string; invalid?: boolean; id?: string; removeLabel?: (value: string) => string; removeIcon?: ReactNode; className?: string; pt?: TagGroupParts; }", + "TextArea": "TextArea: import(\"react\").ForwardRefExoticComponent>", + "TextAreaParts": "export interface TextAreaParts { root?: TextareaHTMLAttributes; }", + "TextAreaProps": "export interface TextAreaProps extends Omit, 'onChange'> { invalid?: boolean; onChange?: ChangeHandler; pt?: TextAreaParts; }", + "TextInput": "TextInput: import(\"react\").ForwardRefExoticComponent>", + "TextInputParts": "export interface TextInputParts { root?: InputHTMLAttributes; }", + "TextInputProps": "export interface TextInputProps extends Omit, 'onChange' | 'type'> { type?: TextInputType; invalid?: boolean; onChange?: ChangeHandler; pt?: TextInputParts; }", + "TextInputType": "export type TextInputType = 'text' | 'email' | 'password' | 'search' | 'tel' | 'url';", + "ToggleGroup": "ToggleGroup: (props: ToggleGroupProps) => import(\"react\").JSX.Element", + "ToggleGroupOption": "export interface ToggleGroupOption { value: string; label: ReactNode; icon?: ReactNode; disabled?: boolean; }", + "ToggleGroupPartAttributes": "export type ToggleGroupPartAttributes = Pick, 'className' | 'style' | 'title'> & { [dataAttribute: `data-${string}`]: string | number | boolean | undefined; };", + "ToggleGroupParts": "export interface ToggleGroupParts { root?: ToggleGroupPartAttributes; option?: ToggleGroupPartAttributes; icon?: ToggleGroupPartAttributes; label?: ToggleGroupPartAttributes; }", + "ToggleGroupProps": "export interface ToggleGroupProps { options: ToggleGroupOption[]; value: string; onChange: (value: string) => void; disabled?: boolean; 'aria-labelledby'?: string; 'aria-label'?: string; 'aria-describedby'?: string; invalid?: boolean; className?: string; pt?: ToggleGroupParts; }", + "ToolbarFocusMode": "export declare enum ToolbarFocusMode { Arrows = \"arrows\", None = \"none\" }", + "Tooltip": "Tooltip: (props: TooltipProps) => ReactElement>", + "TooltipPosition": "export type TooltipPosition = 'top' | 'right' | 'bottom' | 'left';", + "TooltipProps": "export interface TooltipProps { content?: ReactNode; position?: TooltipPosition; disabled?: boolean; className?: string; children: ReactElement; }", + "useCratisComponentsConfig": "useCratisComponentsConfig: () => CratisComponentsConfig" + }, + "./DataPage": { + "Column": "export declare function Column(_props: ColumnProps): React.ReactElement | null; | export declare namespace Column { var displayName: string; }", + "ColumnProps": "export interface ColumnProps { field?: string; header?: React.ReactNode; body?: (rowData: TData) => React.ReactNode; sortable?: boolean; filter?: boolean; filterField?: string; filterPlaceholder?: string; dataType?: ColumnFilterDataType; showFilterMatchModes?: boolean; filterElement?: ColumnFilterElement; filterOptions?: ColumnFilterOption[]; filterLabels?: Partial; filterPt?: ColumnFilterMenuParts; selectionMode?: 'single' | 'multiple'; style?: React.CSSProperties; className?: string; headerStyle?: React.CSSProperties; headerClassName?: string; bodyStyle?: React.CSSProperties; bodyClassName?: string; }", + "Columns": "Columns: (props: ColumnsProps) => React.JSX.Element", + "ColumnsProps": "export interface ColumnsProps { children: ReactNode; }", + "DataPage": "declare function DataPage | IQueryFor | IObservableQueryFor | IObservableQueryFor, TDataType extends object, TArguments extends object>(props: DataPageProps): React.JSX.Element; | declare namespace DataPage { export { MenuItem }; export { MenuItems }; export { Columns }; }", + "DataPageProps": "export interface DataPageProps | IQueryFor | IObservableQueryFor | IObservableQueryFor, TDataType extends object, TArguments extends object> { title: string; children: ReactNode; detailsComponent?: React.FC>; query: Constructor; queryArguments?: TArguments; emptyMessage: string; loadingMessage?: ReactNode; failureMessage?: ReactNode; unauthorizedMessage?: ReactNode; dataKey?: string | undefined; selection?: TDataType | undefined | null; onSelectionChange?(event: DataTableSelectionChangeEvent): void; selectionMode?: 'single' | 'multiple'; selectedItems?: TDataType[]; onSelectedItemsChange?(items: TDataType[]): void; globalFilterFields?: string[] | undefined; globalSearchPlaceholder?: string; globalSearchAriaLabel?: string; defaultFilters?: DataTableFilterMeta; clientFiltering?: boolean; onRefresh?(): void; tableClassName?: string; tablePt?: DataTableParts; tablePtOptions?: object; tableUnstyled?: boolean; paginatorClassName?: string; paginatorPt?: TablePaginatorParts; paginatorPtOptions?: object; paginatorAriaLabels?: TablePaginatorProps['ariaLabels']; menubarClassName?: string; menubarPt?: ButtonParts; menubarPtOptions?: object; menubarUnstyled?: boolean; actionsAriaLabel?: string; }", + "IDetailsComponentProps": "export interface IDetailsComponentProps { item: TDataType; onRefresh?: () => void; }", + "MenuItem": "MenuItem: (_props: MenuItemProps) => null", + "MenuItemProps": "export interface MenuItemProps { icon?: React.ComponentType<{ className?: string; }>; label?: string; command?: () => void; disabled?: boolean; disableOnUnselected?: boolean; }", + "MenuItems": "MenuItems: (props: MenuItemsProps) => React.JSX.Element", + "MenuItemsProps": "export interface MenuItemsProps { children: ReactNode; }" + }, + "./DataTables": { + "Column": "export declare function Column(_props: ColumnProps): React.ReactElement | null; | export declare namespace Column { var displayName: string; }", + "ColumnFilterDataType": "export type ColumnFilterDataType = 'text' | 'numeric' | 'date' | 'boolean';", + "ColumnFilterElement": "export type ColumnFilterElement = (options: ColumnFilterElementOptions) => ReactNode;", + "ColumnFilterElementOptions": "export interface ColumnFilterElementOptions { field: string; value: unknown; matchMode: FilterMatchMode; onChange: ChangeHandler; onMatchModeChange: (matchMode: FilterMatchMode) => void; onApply: (event: SyntheticEvent) => void; onClear: (event: SyntheticEvent) => void; }", + "ColumnFilterMenu": "ColumnFilterMenu: (props: ColumnFilterMenuProps) => import(\"react\").JSX.Element", + "ColumnFilterMenuLabels": "export interface ColumnFilterMenuLabels { filterTriggerAriaLabel: (field: string) => string; valueAriaLabel: (field: string) => string; matchModeAriaLabel: string; matchModeLabel: (mode: FilterMatchMode, defaultLabel: string) => string; clear: string; apply: string; true: string; false: string; }", + "ColumnFilterMenuParts": "export interface ColumnFilterMenuParts { trigger?: Omit, 'value'>; popover?: ColumnFilterOverlayAttributes; menu?: ColumnFilterOverlayAttributes; matchMode?: DropdownParts; input?: InputHTMLAttributes; actions?: HTMLAttributes; clear?: ButtonParts; apply?: ButtonParts; }", + "ColumnFilterMenuProps": "export interface ColumnFilterMenuProps { field: string; dataType?: ColumnFilterDataType; placeholder?: string; showMatchModes?: boolean; filterElement?: ColumnFilterElement; filterOptions?: ColumnFilterOption[]; labels?: Partial; pt?: ColumnFilterMenuParts; constraint?: DataTableFilterConstraint; onApply: (constraint: DataTableFilterConstraint) => void; onClear: () => void; }", + "ColumnFilterOption": "export interface ColumnFilterOption { label: string; value: unknown; }", + "ColumnProps": "export interface ColumnProps { field?: string; header?: React.ReactNode; body?: (rowData: TData) => React.ReactNode; sortable?: boolean; filter?: boolean; filterField?: string; filterPlaceholder?: string; dataType?: ColumnFilterDataType; showFilterMatchModes?: boolean; filterElement?: ColumnFilterElement; filterOptions?: ColumnFilterOption[]; filterLabels?: Partial; filterPt?: ColumnFilterMenuParts; selectionMode?: 'single' | 'multiple'; style?: React.CSSProperties; className?: string; headerStyle?: React.CSSProperties; headerClassName?: string; bodyStyle?: React.CSSProperties; bodyClassName?: string; }", + "DataTableCore": "DataTableCore: (props: DataTableCoreProps) => React.JSX.Element", + "DataTableCoreProps": "export interface DataTableCoreProps { data: TData[]; children?: ReactNode; dataKey?: string; emptyMessage: ReactNode; status?: DataTableStatus; loadingMessage?: ReactNode; failureMessage?: ReactNode; unauthorizedMessage?: ReactNode; selectionMode?: 'single' | 'multiple'; selectionAriaLabel?: string; selectAllAriaLabel?: string; selection?: TData | null; onSelectionChange?: (event: DataTableSelectionChangeEvent) => void; selectedItems?: TData[]; onSelectedItemsChange?: (items: TData[]) => void; onRowClick?: (event: DataTableRowClickEvent) => void; rowClassName?: (rowData: TData) => string; globalFilterFields?: string[]; globalSearchPlaceholder?: string; globalSearchAriaLabel?: string; defaultFilters?: DataTableFilterMeta; onFilter?: (filters: DataTableFilterMeta) => void; scrollable?: boolean; scrollHeight?: string; className?: string; style?: CSSProperties; pt?: DataTableParts; ptOptions?: object; unstyled?: boolean; }", + "DataTableCustomFilterMatchMode": "export type DataTableCustomFilterMatchMode = string & { readonly [customFilterMatchMode]: true; };", + "DataTableFilterConstraint": "export interface DataTableFilterConstraint { value: unknown; matchMode?: DataTableFilterMatchMode; }", + "DataTableFilterEntry": "export type DataTableFilterEntry = DataTableFilterConstraint | DataTableOperatorFilterConstraint;", + "DataTableFilterMatcher": "export type DataTableFilterMatcher = (value: unknown, filter: unknown, locale?: string) => boolean;", + "DataTableFilterMatcherRegistration": "export interface DataTableFilterMatcherRegistration { matchMode: DataTableCustomFilterMatchMode; unregister(): void; }", + "DataTableFilterMatchMode": "DataTableFilterMatchMode: { readonly StartsWith: 'startsWith'; readonly Contains: 'contains'; readonly NotContains: 'notContains'; readonly EndsWith: 'endsWith'; readonly Equals: 'equals'; readonly NotEquals: 'notEquals'; readonly In: 'in'; readonly Between: 'between'; readonly LessThan: 'lt'; readonly LessThanOrEqual: 'lte'; readonly GreaterThan: 'gt'; readonly GreaterThanOrEqual: 'gte'; readonly DateIs: 'dateIs'; readonly DateIsNot: 'dateIsNot'; readonly DateBefore: 'dateBefore'; readonly DateAfter: 'dateAfter'; } | export type DataTableFilterMatchMode = (typeof DataTableFilterMatchMode)[keyof typeof DataTableFilterMatchMode] | DataTableCustomFilterMatchMode | (string & Record);", + "DataTableFilterMeta": "export type DataTableFilterMeta = Record;", + "DataTableForObservableQuery": "DataTableForObservableQuery: | IObservableQueryFor, TDataType extends object, TArguments extends object>(props: DataTableForObservableQueryProps) => import(\"react\").JSX.Element", + "DataTableForObservableQueryProps": "export interface DataTableForObservableQueryProps | IObservableQueryFor, TDataType extends object, TArguments extends object> { children?: ReactNode; query: Constructor; queryArguments?: TArguments; emptyMessage: string; loadingMessage?: ReactNode; failureMessage?: ReactNode; unauthorizedMessage?: ReactNode; dataKey?: string | undefined; selection?: TDataType | undefined | null; onSelectionChange?(event: DataTableSelectionChangeEvent): void; selectionMode?: 'single' | 'multiple'; selectedItems?: TDataType[]; onSelectedItemsChange?(items: TDataType[]): void; globalFilterFields?: string[] | undefined; globalSearchPlaceholder?: string; globalSearchAriaLabel?: string; defaultFilters?: DataTableFilterMeta; clientFiltering?: boolean; className?: string; pt?: DataTableParts; ptOptions?: object; unstyled?: boolean; paginatorClassName?: string; paginatorPt?: TablePaginatorParts; paginatorPtOptions?: object; paginatorAriaLabels?: TablePaginatorProps['ariaLabels']; }", + "DataTableForQuery": "DataTableForQuery: | IQueryFor, TDataType extends object, TArguments extends object>(props: DataTableForQueryProps) => import(\"react\").JSX.Element", + "DataTableForQueryProps": "export interface DataTableForQueryProps | IQueryFor, TDataType extends object, TArguments extends object> { children?: ReactNode; query: Constructor; queryArguments?: TArguments; emptyMessage: string; loadingMessage?: ReactNode; failureMessage?: ReactNode; unauthorizedMessage?: ReactNode; dataKey?: string | undefined; selection?: TDataType | undefined | null; onSelectionChange?(event: DataTableSelectionChangeEvent): void; selectionMode?: 'single' | 'multiple'; selectedItems?: TDataType[]; onSelectedItemsChange?(items: TDataType[]): void; globalFilterFields?: string[] | undefined; globalSearchPlaceholder?: string; globalSearchAriaLabel?: string; defaultFilters?: DataTableFilterMeta; clientFiltering?: boolean; className?: string; pt?: DataTableParts; ptOptions?: object; unstyled?: boolean; paginatorClassName?: string; paginatorPt?: TablePaginatorParts; paginatorPtOptions?: object; paginatorAriaLabels?: TablePaginatorProps['ariaLabels']; }", + "DataTableOperatorFilterConstraint": "export interface DataTableOperatorFilterConstraint { operator?: string; constraints: DataTableFilterConstraint[]; }", + "DataTableParts": "export interface DataTableParts { root?: HTMLAttributes; search?: HTMLAttributes; searchInput?: React.InputHTMLAttributes; tableContainer?: HTMLAttributes; table?: TableHTMLAttributes; head?: HTMLAttributes; headerRow?: HTMLAttributes; headerCell?: ThHTMLAttributes; body?: HTMLAttributes; row?: HTMLAttributes; cell?: TdHTMLAttributes; emptyRow?: HTMLAttributes; emptyCell?: TdHTMLAttributes; loadingRow?: HTMLAttributes; loadingCell?: TdHTMLAttributes; failureRow?: HTMLAttributes; failureCell?: TdHTMLAttributes; }", + "DataTableRowClickEvent": "export interface DataTableRowClickEvent { data: TData; index: number; }", + "DataTableSelectionChangeEvent": "export interface DataTableSelectionChangeEvent { value: TData | null; originalEvent?: SyntheticEvent; }", + "DataTableStatus": "export declare enum DataTableStatus { Ready = \"ready\", Loading = \"loading\", Failed = \"failed\", Unauthorized = \"unauthorized\" }", + "defaultColumnFilterMenuLabels": "defaultColumnFilterMenuLabels: ColumnFilterMenuLabels", + "registerDataTableFilterMatcher": "registerDataTableFilterMatcher: (name: string, matcher: DataTableFilterMatcher) => DataTableFilterMatcherRegistration", + "resolveDataTableFilterMatcher": "resolveDataTableFilterMatcher: (name: string) => DataTableFilterMatcher | undefined", + "TablePaginator": "TablePaginator: (props: TablePaginatorProps) => import(\"react\").ReactElement>", + "TablePaginatorParts": "export interface TablePaginatorParts { root?: HTMLAttributes; range?: HTMLAttributes; info?: HTMLAttributes; first?: ButtonParts; previous?: ButtonParts; next?: ButtonParts; last?: ButtonParts; }", + "TablePaginatorProps": "export interface TablePaginatorProps { page: number; pageCount: number; onPageChange: (page: number) => void; totalItems?: number; pageSize?: number; ariaLabels?: { navigation?: string; first?: string; previous?: string; next?: string; last?: string; }; className?: string; pt?: TablePaginatorParts; ptOptions?: object; }", + "unregisterDataTableFilterMatcher": "unregisterDataTableFilterMatcher: (registration: DataTableFilterMatcherRegistration) => void" + }, + "./Dialogs": { + "BusyIndicatorDialog": "BusyIndicatorDialog: (props: BusyIndicatorDialogRequest) => import(\"react\").JSX.Element", + "CancelCallback": "export type CancelCallback = () => boolean | void | Promise | Promise;", + "CloseDialog": "export type CloseDialog = (result: DialogResult) => boolean | void | Promise | Promise;", + "ConfirmationDialog": "ConfirmationDialog: () => import(\"react\").JSX.Element", + "ConfirmCallback": "export type ConfirmCallback = () => boolean | void | Promise | Promise;", + "Dialog": "Dialog: (props: DialogProps) => import(\"react\").ReactElement>", + "DialogInitialFocus": "export declare enum DialogInitialFocus { Confirm = 1, Cancel = 2, Content = 3 }", + "DialogParts": "export interface DialogParts { backdrop?: DialogPartAttributes; positioner?: DialogPartAttributes; root?: DialogPartAttributes; header?: DialogPartAttributes; title?: DialogPartAttributes; subtitle?: DialogPartAttributes; close?: DialogButtonAttributes; content?: DialogPartAttributes; footer?: DialogPartAttributes; confirm?: DialogButtonAttributes; cancel?: DialogButtonAttributes; }", + "DialogPlacement": "export type DialogPlacement = 'center' | 'start' | 'end';", + "DialogProps": "export interface DialogProps { title: string; subtitle?: ReactNode; placement?: DialogPlacement; closeIcon?: ReactNode; visible?: boolean; onClose?: CloseDialog; onConfirm?: ConfirmCallback; onCancel?: CancelCallback; buttons?: DialogButtons | ReactNode; initialFocus?: DialogInitialFocus; children: ReactNode; width?: string; style?: CSSProperties; contentStyle?: CSSProperties; resizable?: boolean; isValid?: boolean; isBusy?: boolean; okLabel?: string; cancelLabel?: string; yesLabel?: string; noLabel?: string; closeAriaLabel?: string; dismissable?: boolean; className?: string; pt?: DialogParts; ptOptions?: object; unstyled?: boolean; }" + }, + "./Display": { + "Avatar": "Avatar: (props: AvatarProps) => import(\"react\").JSX.Element", + "AvatarProps": "export interface AvatarProps { image?: string; label?: string; icon?: ReactNode; alt?: string; size?: 'normal' | 'large' | 'xlarge'; className?: string; }", + "Badge": "Badge: (props: BadgeProps) => import(\"react\").JSX.Element", + "BadgeProps": "export interface BadgeProps { value?: ReactNode; severity?: BadgeSeverity; size?: 'small' | 'large' | 'xlarge'; shape?: 'circle'; className?: string; children?: ReactNode; }", + "BadgeSeverity": "export type BadgeSeverity = 'secondary' | 'info' | 'success' | 'warn' | 'danger' | 'contrast';", + "Chip": "Chip: (props: ChipProps) => import(\"react\").JSX.Element", + "ChipProps": "export interface ChipProps { label?: string; icon?: ReactNode; removable?: boolean; onRemove?: () => void; removeAriaLabel?: string; className?: string; }", + "Message": "Message: (props: MessageProps) => import(\"react\").JSX.Element", + "MessageProps": "export interface MessageProps { severity?: MessageSeverity; text?: ReactNode; children?: ReactNode; className?: string; icon?: ReactNode | false; }", + "MessageSeverity": "export type MessageSeverity = 'info' | 'success' | 'warn' | 'error' | 'secondary' | 'contrast';", + "ProgressBar": "ProgressBar: (props: ProgressBarProps) => import(\"react\").ReactElement>", + "ProgressBarProps": "export interface ProgressBarProps { value?: number; mode?: 'determinate' | 'indeterminate'; showValue?: boolean; 'aria-label'?: string; 'aria-labelledby'?: string; className?: string; }", + "ProgressSpinner": "ProgressSpinner: (props: ProgressSpinnerProps) => import(\"react\").JSX.Element", + "ProgressSpinnerProps": "export interface ProgressSpinnerProps { style?: CSSProperties; className?: string; 'aria-label'?: string; }", + "Skeleton": "Skeleton: (props: SkeletonProps) => import(\"react\").JSX.Element", + "SkeletonProps": "export interface SkeletonProps { width?: string; height?: string; borderRadius?: string; circle?: boolean; className?: string; }", + "Tag": "Tag: (props: TagProps) => import(\"react\").JSX.Element", + "TagProps": "export interface TagProps { value?: ReactNode; severity?: TagSeverity; rounded?: boolean; icon?: ReactNode; className?: string; children?: ReactNode; }", + "TagSeverity": "export type TagSeverity = 'secondary' | 'success' | 'info' | 'warn' | 'danger' | 'contrast';" + }, + "./Dropdown": { + "Dropdown": "export declare function Dropdown(props: DropdownProps): import(\"react\").ReactElement>; | export declare namespace Dropdown { var displayName: string; }", + "DropdownParts": "export interface DropdownParts { root?: HTMLAttributes; input?: DropdownLegacyControlAttributes; select?: DropdownLegacyControlAttributes; trigger?: DropdownTriggerAttributes; value?: HTMLAttributes; clear?: ButtonHTMLAttributes; indicator?: HTMLAttributes; popover?: HTMLAttributes; listbox?: HTMLAttributes; option?: HTMLAttributes; filter?: InputHTMLAttributes; multiple?: SelectHTMLAttributes; }", + "DropdownProps": "export interface DropdownProps { value?: T; options?: unknown[]; optionLabel?: string; optionValue?: string; placeholder?: string; filter?: boolean; filterPlaceholder?: string; multiple?: boolean; showClear?: boolean; invalid?: boolean; disabled?: boolean; className?: string; style?: CSSProperties; id?: string; inputId?: string; panelClassName?: string; name?: string; tabIndex?: number; 'aria-label'?: string; 'aria-labelledby'?: string; 'aria-describedby'?: string; ariaLabel?: string; ariaLabelledBy?: string; ariaDescribedBy?: string; ariaInvalid?: boolean; onChange?: ChangeHandler; onBlur?: FocusEventHandler; pt?: DropdownParts; ptOptions?: object; unstyled?: boolean; }" + }, + "./Filter": { + "buildHistogram": "export declare function buildHistogram(values: number[], min: number, max: number, bucketCount: number, provided?: HistogramBucket[]): RenderedHistogramBucket[];", + "CheckboxListFilter": "export declare function CheckboxListFilter(props: CheckboxListFilterProps): import(\"react\").JSX.Element;", + "CheckboxListFilterProps": "export interface CheckboxListFilterProps { options: FilterOption[]; selected: Set; multi?: boolean; onToggle: (optionKey: string) => void; searchable?: boolean; searchPlaceholder?: string; searchAriaLabel?: string; autoFocusSearch?: boolean; emptyMessage?: string; noMatchesMessage?: string; name?: string; }", + "CustomFilterValues": "export type CustomFilterValues = Record;", + "FilterDefinition": "export interface FilterDefinition { key: string; label: string; type?: 'string' | 'number' | 'date' | 'custom'; multi?: boolean; options?: FilterOption[]; numericRange?: { min: number; max: number; values?: FilterValue[]; histogram?: HistogramBucket[]; }; buckets?: number; searchable?: boolean; searchPlaceholder?: string; searchAriaLabel?: string; autoFocus?: boolean; }", + "FilterEditor": "export declare function FilterEditor(_props: FilterEditorSlotProps): null;", + "FilterEditorProps": "export interface FilterEditorProps { value: unknown; onChange: ChangeHandler; }", + "FilterEditorSlotProps": "export interface FilterEditorSlotProps { filterKey: string; children: (props: FilterEditorProps) => ReactNode; }", + "FilterOption": "export interface FilterOption { key: string; label: string; value: FilterValue; count?: number; }", + "FilterPanel": "export declare function FilterPanel(props: FilterPanelProps): import(\"react\").ReactPortal | null;", + "FilterPanelProps": "export interface FilterPanelProps { isOpen: boolean; filters: FilterDefinition[]; filterValues: FilterValues; rangeValues: RangeValues; customValues?: CustomFilterValues; search?: string; searchPlaceholder?: string; 'aria-label'?: string; searchAriaLabel?: string; clearFilterAriaLabel?: string; clearRangeAriaLabel?: string; expandedFilterKey?: string | null; anchorRef: React.RefObject; onClose: () => void; onSearchChange?: (value: string) => void; onFilterToggle: (filterKey: string, optionKey: string, multi: boolean) => void; onFilterClear: (filterKey: string) => void; onRangeChange: (filterKey: string, range: [ number, number ] | null) => void; onExpandedFilterChange: (key: string | null) => void; onCustomValueChange?: (filterKey: string, value: unknown) => void; children?: ReactNode; }", + "FilterValue": "export type FilterValue = string | number | boolean | Date | null | undefined;", + "FilterValues": "export type FilterValues = Record>;", + "HistogramBucket": "export interface HistogramBucket { start: number; end: number; count: number; }", + "RangeHistogramFilter": "export declare function RangeHistogramFilter(props: RangeHistogramFilterProps): import(\"react\").JSX.Element;", + "RangeHistogramFilterProps": "export interface RangeHistogramFilterProps { values?: FilterValue[]; histogram?: HistogramBucket[]; min: number; max: number; buckets?: number; selectedRange: [ number, number ] | null; onChange: ChangeHandler<[ number, number ] | null>; formatValue?: (value: number) => string; itemsLabel?: string; minimumAriaLabel?: string; maximumAriaLabel?: string; }", + "RangeValues": "export type RangeValues = Record;", + "useFilterState": "export declare function useFilterState(filters: FilterDefinition[] | undefined): UseFilterStateResult;", + "UseFilterStateResult": "export interface UseFilterStateResult { filterValues: FilterValues; rangeValues: RangeValues; customValues: CustomFilterValues; expandedFilterKey: string | null; setExpandedFilterKey: (key: string | null) => void; handleToggleFilter: (filterKey: string, optionKey: string, multi: boolean) => void; handleClearFilter: (filterKey: string) => void; handleRangeChange: (filterKey: string, range: [ number, number ] | null) => void; handleCustomValueChange: (filterKey: string, value: unknown) => void; }" + }, + "./Notifications": { + "getToastSnapshot": "getToastSnapshot: () => ToastRecord[]", + "setToastDispatch": "setToastDispatch: (dispatch: ToastDispatch) => (() => void)", + "subscribeToToasts": "subscribeToToasts: (listener: () => void) => (() => void)", + "toast": "toast: ToastFunction", + "toastCommandResult": "export declare function toastCommandResult(result: ICommandResult, options?: ToastCommandResultOptions): boolean;", + "ToastCommandResultOptions": "export interface ToastCommandResultOptions { successTitle?: string; successDescription?: string; unauthorizedTitle?: string; validationTitle?: string; exceptionTitle?: string; showSuccess?: boolean; }", + "ToastDispatch": "export interface ToastDispatch { show(options: ToastOptions): ToastId; update(id: ToastId, updates: Partial): ToastId; dismiss(id?: ToastId): void; promise(promise: Promise, options: ToastPromiseOptions): Promise; success(options: ToastOptions): ToastId; info(options: ToastOptions): ToastId; warn(options: ToastOptions): ToastId; error(options: ToastOptions): ToastId; secondary(options: ToastOptions): ToastId; contrast(options: ToastOptions): ToastId; }", + "Toaster": "Toaster: (props: ToasterProps) => import(\"react\").ReactPortal | null", + "ToasterPassThrough": "export interface ToasterPassThrough { region?: HTMLAttributes; toast?: HTMLAttributes; icon?: HTMLAttributes; content?: HTMLAttributes; title?: HTMLAttributes; description?: HTMLAttributes; close?: ButtonHTMLAttributes; action?: ButtonHTMLAttributes; }", + "ToasterPosition": "export type ToasterPosition = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';", + "ToasterProps": "export interface ToasterProps { position?: ToasterPosition; limit?: number; timeout?: number; dismissAriaLabel?: string; regionAriaLabel?: string; pt?: ToasterPassThrough; }", + "ToastFunction": "export interface ToastFunction { (options: ToastOptions): ToastId; update(id: ToastId, updates: Partial): ToastId; dismiss(id?: ToastId): void; promise(promise: Promise, options: ToastPromiseOptions): Promise; success(options: ToastOptions): ToastId; info(options: ToastOptions): ToastId; warn(options: ToastOptions): ToastId; error(options: ToastOptions): ToastId; secondary(options: ToastOptions): ToastId; contrast(options: ToastOptions): ToastId; }", + "ToastId": "export type ToastId = string | number;", + "ToastOptions": "export interface ToastOptions { id?: ToastId; title?: ReactNode | string; description?: ReactNode | string; action?: ButtonHTMLAttributes; dismissible?: boolean; severity?: ToastSeverity; loading?: boolean; icon?: ReactNode; render?: ReactElement; duration?: number; group?: string; promise?: unknown; data?: Record; onDismiss?: (toast: ToastOptions) => void; onTimeout?: (toast: ToastOptions) => void; }", + "ToastPromiseOptions": "export interface ToastPromiseOptions { loading: ToastOptions; success?: ToastOptions | ((data: T) => ToastOptions | void); error?: ToastOptions | ((error: unknown) => ToastOptions | void); }", + "ToastRecord": "export interface ToastRecord extends ToastOptions { id: ToastId; }", + "ToastSeverity": "export type ToastSeverity = 'normal' | 'success' | 'info' | 'warn' | 'error' | 'secondary' | 'contrast';", + "ToastType": "export type ToastType = ToastOptions;" + }, + "./ObjectContentEditor": { + "ObjectContentEditor": "ObjectContentEditor: (props: ObjectContentEditorProps) => React.JSX.Element", + "ObjectContentEditorProps": "export interface ObjectContentEditorProps { object: Json; timestamp?: Date; schema: JsonSchema; editMode?: boolean; onChange?: ChangeHandler; onValidationChange?: (hasErrors: boolean) => void; className?: string; }" + }, + "./ObjectNavigationalBar": { + "ObjectNavigationalBar": "export declare function ObjectNavigationalBar(props: ObjectNavigationalBarProps): import(\"react\").JSX.Element;", + "ObjectNavigationalBarProps": "export interface ObjectNavigationalBarProps { navigationPath: string[]; onNavigate: (index: number) => void; backLabel?: string; className?: string; }" + }, + "./PivotViewer": { + "getPropertyPath": "export declare function getPropertyPath(accessor: PropertyAccessor): string;", + "getValueByPath": "export declare function getValueByPath(item: TItem, path: string): PivotPropertyValue;", + "PivotDimension": "export interface PivotDimension { key: string; label: string; getValue: (item: TItem) => PivotPrimitive; formatValue?: (value: PivotPrimitive) => string; sort?: (a: PivotGroup, b: PivotGroup) => number; }", + "PivotFilter": "export interface PivotFilter { key: string; label: string; getValue: (item: TItem) => PivotPrimitive; multi?: boolean; options?: PivotFilterOption[]; sort?: (a: PivotFilterOption, b: PivotFilterOption) => number; type?: 'string' | 'number' | 'date' | 'custom'; buckets?: number; renderEditor?: (props: FilterEditorProps) => ReactNode; }", + "PivotFilterOption": "export interface PivotFilterOption { key: string; label: string; value: PivotPrimitive; count: number; }", + "PivotGroup": "export interface PivotGroup { key: string; label: string; value: PivotPrimitive; items: TItem[]; count?: number; }", + "PivotPrimitive": "export type PivotPrimitive = string | number | boolean | Date | null | undefined;", + "PivotPropertyValue": "export type PivotPropertyValue = PivotPrimitive | object;", + "PivotViewer": "export declare function PivotViewer(props: PivotViewerProps): import(\"react\").JSX.Element;", + "PivotViewerColors": "export interface PivotViewerColors { primaryColor: string; primaryColorText: string; primary500: string; surfaceGround: string; surfaceCard: string; surfaceSection: string; surfaceOverlay: string; surfaceBorder: string; textColor: string; textColorSecondary: string; highlightBg: string; maskbg: string; focusRing: string; }", + "PivotViewerLabels": "export interface PivotViewerLabels { filters?: string; search?: string; searchGroup?: (groupLabel: string) => string; sortBy?: string; collection?: string; grouped?: string; zoomOut?: string; zoomLevel?: string; zoom?: (percent: number) => string; editZoomLevel?: string; resetZoom?: string; zoomIn?: string; itemCount?: (count: number) => string; loading?: string; viewport?: string; }", + "PivotViewerProps": "export interface PivotViewerProps { data: TItem[]; dimensions: PivotDimension[]; filters?: PivotFilter[]; defaultDimensionKey?: string; cardRenderer: (item: TItem) => { title: string; labels?: string[]; values?: string[]; }; detailRenderer?: (item: TItem, onClose: () => void) => ReactNode; getItemId?: (item: TItem, index: number) => string | number; searchFields?: PropertyAccessor[]; title?: string; className?: string; emptyContent?: ReactNode; isLoading?: boolean; loadingLabel?: string; labels?: PivotViewerLabels; colors?: Partial; }", + "PropertyAccessor": "export type PropertyAccessor = (item: TItem) => PivotPropertyValue;" + }, + "./renderer": { + "CRATIS_PRESENTATION_ABI_VERSION": "CRATIS_PRESENTATION_ABI_VERSION: 1", + "CRATIS_PRESENTATION_PROFILE": "CRATIS_PRESENTATION_PROFILE: 'stable-presentation/v1'", + "CratisOverlayEnvironment": "export interface CratisOverlayEnvironment { getContainer(): HTMLElement | null; }", + "CratisPresentationCapabilities": "export type CratisPresentationCapabilities = readonly [ 'slot.render', 'parts.passthrough', 'ssr.staticRender', ...CratisPresentationOptionalCapabilityId[] ];", + "CratisPresentationCapabilityId": "export type CratisPresentationCapabilityId = 'slot.render' | 'parts.passthrough' | 'ssr.staticRender' | 'rtl' | 'forcedColors' | 'motion.reduced';", + "CratisPresentationSlotDeclaration": "export interface CratisPresentationSlotDeclaration { readonly mode: 'presentation'; readonly fidelity: 'native' | 'emulated'; readonly render: ComponentType; }", + "CratisPresentationSlotId": "export type CratisPresentationSlotId = (typeof cratisPresentationSlotIds)[number];", + "cratisPresentationSlotIds": "cratisPresentationSlotIds: readonly [ \"common.button\", \"common.iconButton\", \"common.textInput\", \"common.textArea\", \"common.checkbox\", \"common.radio\", \"common.switch\", \"common.progress\", \"common.surface\" ]", + "CratisPresentationSlotMap": "export type CratisPresentationSlotMap = { readonly [SlotId in CratisPresentationSlotId]: CratisPresentationSlotDeclaration; };", + "CratisPresentationSlots": "export interface CratisPresentationSlots { readonly 'common.button': ButtonProps; readonly 'common.iconButton': IconButtonProps; readonly 'common.textInput': TextInputProps; readonly 'common.textArea': TextAreaProps; readonly 'common.checkbox': CheckboxProps; readonly 'common.radio': RadioProps; readonly 'common.switch': SwitchProps; readonly 'common.progress': ProgressBarProps; readonly 'common.surface': SurfaceProps; }", + "CratisPresentationUiLibrary": "export interface CratisPresentationUiLibrary { readonly id: string; readonly displayName: string; readonly abi: typeof CRATIS_PRESENTATION_ABI_VERSION; readonly level: 'primitive'; readonly profile: typeof CRATIS_PRESENTATION_PROFILE; readonly profileSlots: typeof cratisPresentationSlotIds; readonly capabilities: CratisPresentationCapabilities; readonly slots: CratisPresentationSlotMap; readonly Provider?: ComponentType; }", + "CratisPresentationUiLibraryProviderProps": "export interface CratisPresentationUiLibraryProviderProps { readonly setup: CratisRendererSetup; readonly children: ReactNode; }", + "CratisRendererSetup": "export type CratisRendererSetup = Readonly<{ [Key in keyof CratisRendererSetupExtensions | keyof unstable_RendererSetupExtensions]?: boolean; }>;", + "CratisRendererSetupExtensions": "export interface CratisRendererSetupExtensions extends Record { }", + "definePresentationUiLibrary": "definePresentationUiLibrary: (library: CratisPresentationUiLibrary) => CratisPresentationUiLibrary", + "unstable_AdapterDiagnostic": "export interface unstable_AdapterDiagnostic { readonly code: unstable_AdapterErrorCode; readonly adapterId: string; readonly slotId?: unstable_SlotId; readonly message: string; readonly remedy: string; }", + "unstable_AdapterError": "export declare class unstable_AdapterError extends Error { readonly diagnostic: unstable_AdapterDiagnostic; readonly code: unstable_AdapterErrorCode; constructor(diagnostic: unstable_AdapterDiagnostic); }", + "unstable_AdapterErrorCode": "export type unstable_AdapterErrorCode = (typeof unstable_adapterErrorCodes)[keyof typeof unstable_adapterErrorCodes];", + "unstable_adapterErrorCodes": "unstable_adapterErrorCodes: Readonly<{ readonly abiMismatch: 'CRATIS-UI-1001'; readonly missingRequirement: 'CRATIS-UI-1002'; readonly strictProfileFallback: 'CRATIS-UI-1003'; readonly missingUpstreamPeer: 'CRATIS-UI-1004'; readonly missingLicenseKey: 'CRATIS-UI-1005'; readonly nestedLibraries: 'CRATIS-UI-1006'; readonly ssrContractViolation: 'CRATIS-UI-1007'; readonly duplicateResolution: 'CRATIS-UI-1008'; readonly deprecatedSlot: 'CRATIS-UI-1009'; }>", + "unstable_BehaviorMode": "export type unstable_BehaviorMode = 'presentation' | 'atomic';", + "unstable_CapabilityId": "export type unstable_CapabilityId = 'slot.render' | 'parts.passthrough' | 'focus.trap' | 'focus.restore' | 'overlay.portal' | 'collection.virtualize' | 'selection.multi' | 'datetime.i18n' | 'form.validationMessage' | 'theme.tokens' | 'ssr.staticRender' | 'rtl' | 'forcedColors' | 'motion.reduced' | 'machine.binding' | 'paging.server';", + "unstable_composeUiLibraries": "unstable_composeUiLibraries: (...libraries: readonly unstable_UiLibrary[]) => unstable_UiLibrary", + "unstable_CRATIS_UI_ABI_VERSION": "unstable_CRATIS_UI_ABI_VERSION = 1", + "unstable_CratisOverlayEnvironment": "export type unstable_CratisOverlayEnvironment = CratisOverlayEnvironment;", + "unstable_CratisSlots": "export interface unstable_CratisSlots extends Record { } | interface unstable_CratisSlots { 'common.button': ButtonProps; 'common.iconButton': IconButtonProps; 'common.textInput': TextInputProps; 'common.textArea': TextAreaProps; 'common.checkbox': CheckboxProps; 'common.radio': RadioProps; 'common.switch': SwitchProps; 'common.progress': ProgressBarProps; 'common.surface': SurfaceProps; 'common.tooltip': TooltipProps; 'dropdown.select': DropdownProps; 'dialogs.dialog': DialogProps; 'display.datePicker': DatePickerInputProps; 'datatables.paginator': TablePaginatorProps; }", + "unstable_defaultOverlayEnvironment": "unstable_defaultOverlayEnvironment: unstable_CratisOverlayEnvironment", + "unstable_defineUiLibrary": "unstable_defineUiLibrary: (library: T) => T", + "unstable_Fidelity": "export type unstable_Fidelity = 'native' | 'emulated' | 'unsupported';", + "unstable_RendererScope": "unstable_RendererScope: (props: unstable_RendererScopeProps) => string | number | bigint | boolean | import(\"react\").JSX.Element | Iterable | Promise | import(\"react\").ReactElement> | import(\"react\").ReactPortal | null | undefined> | null | undefined", + "unstable_RendererScopeProps": "export interface unstable_RendererScopeProps { readonly use: unstable_UiLibrary | readonly unstable_UiLibrary[]; readonly only?: readonly unstable_SlotId[]; readonly children: ReactNode; }", + "unstable_RendererSetup": "export type unstable_RendererSetup = CratisRendererSetup;", + "unstable_RendererSetupExtensions": "export interface unstable_RendererSetupExtensions extends CratisRendererSetupExtensions { }", + "unstable_SlotDeclaration": "export interface unstable_SlotDeclaration { readonly mode: unstable_BehaviorMode; readonly fidelity: unstable_Fidelity; readonly render: ComponentType; }", + "unstable_SlotId": "export type unstable_SlotId = keyof unstable_CratisSlots;", + "unstable_SlotMap": "export type unstable_SlotMap = { readonly [K in unstable_SlotId]?: unstable_SlotDeclaration; };", + "unstable_UiLibrary": "export interface unstable_UiLibrary { readonly id: string; readonly displayName: string; readonly abi: number; readonly level: 'full' | 'primitive' | 'behavior' | 'portal' | 'theme'; readonly profile: string; readonly profileSlots?: readonly unstable_SlotId[]; readonly capabilities: readonly unstable_CapabilityId[]; readonly slots: unstable_SlotMap; readonly Provider?: ComponentType; readonly preflight?: () => readonly unstable_AdapterDiagnostic[]; }", + "unstable_UiLibraryProviderProps": "export type unstable_UiLibraryProviderProps = CratisPresentationUiLibraryProviderProps;", + "unstable_useCapability": "unstable_useCapability: (capability: unstable_CapabilityId) => boolean", + "unstable_useOverlayEnvironment": "unstable_useOverlayEnvironment: () => unstable_CratisOverlayEnvironment", + "unstable_useRendererId": "unstable_useRendererId: () => string" + }, + "./renderer/builtin": { + "unstable_cratisBuiltIn": "unstable_cratisBuiltIn: unstable_UiLibrary" + }, + "./SchemaEditor": { + "DEFAULT_TYPE_FORMATS": "DEFAULT_TYPE_FORMATS: TypeFormat[]", + "defaultSchemaEditorLabels": "defaultSchemaEditorLabels: SchemaEditorLabels", + "Json": "export type Json = string | number | boolean | null | Json[] | { [key: string]: Json; };", + "JsonSchema": "export interface JsonSchema { title?: string; name?: string; $id?: string; $ref?: string; type?: string; format?: string; description?: string; properties?: Record; items?: JsonSchema; required?: string[]; definitions?: Record; }", + "JsonSchemaProperty": "export interface JsonSchemaProperty { id?: string; name?: string; type?: string; format?: string; description?: string; items?: JsonSchema; properties?: Record; required?: string[]; $ref?: string; }", + "NavigationItem": "export interface NavigationItem { name: string; path: string[]; }", + "SchemaEditor": "SchemaEditor: (props: SchemaEditorProps) => import(\"react\").JSX.Element", + "SchemaEditorLabels": "export interface SchemaEditorLabels { edit: string; save: string; cancel: string; addProperty: string; actions: string; navigateBack: string; emptyMessage: string; navigateToItemDefinition: string; navigateToProperties: string; propertyName: string; propertyType: string; arrayItemType: string; deleteProperty: string; invalidJson: string; }", + "SchemaEditorProps": "export interface SchemaEditorProps { schema: JsonSchema; eventTypeName?: string; canEdit?: boolean; canNotEditReason?: string; onChange?: ChangeHandler; onSave?: () => void; onCancel?: () => void; editMode?: boolean; saveDisabled?: boolean; cancelDisabled?: boolean; typeFormats?: TypeFormat[]; className?: string; labels?: Partial; }", + "TypeFormat": "export interface TypeFormat { jsonType: string; format: string; }" + }, + "./TimeMachine": { + "defaultTimeMachineLabels": "defaultTimeMachineLabels: TimeMachineLabels", + "Event": "export interface Event { sequenceNumber: number; type: string; occurred: Date; content: Record; }", + "EventsView": "EventsView: (props: EventsViewProps) => import(\"react\").JSX.Element", + "EventsViewParts": "export interface EventsViewParts { timeline?: HTMLAttributes; event?: HTMLAttributes; separator?: HTMLAttributes; marker?: HTMLAttributes; connector?: HTMLAttributes; content?: HTMLAttributes; }", + "EventsViewProps": "export interface EventsViewProps { events: Event[]; className?: string; pt?: EventsViewParts; ptOptions?: object; unstyled?: boolean; labels?: TimeMachineLabels; }", + "Properties": "Properties: React.FC", + "ReadModelView": "ReadModelView: React.FC", + "TimelineEntry": "export interface TimelineEntry { id: string; timestamp: Date; label: string; }", + "TimeMachine": "TimeMachine: React.FC", + "TimeMachineLabels": "export interface TimeMachineLabels { readModelView: string; eventsView: string; previousVersion: string; nextVersion: string; showRelatedEvents: string; showReadModelSnapshot: string; scrollToTop: string; scrollToBottom: string; eventTimelineRegion: string; readModelSnapshotRegion: string; relatedEventsRegion: string; }", + "TimeMachineProps": "export interface TimeMachineProps { versions: Version[]; currentVersionIndex?: number; onVersionChange?: (index: number) => void; scrollSensitivity?: number; labels?: Partial; }", + "Version": "export interface Version { id: string; timestamp: Date; label: string; content: React.ReactNode; events?: Event[]; }" + }, + "./Toolbar": { + "Toolbar": "Toolbar: (props: ToolbarProps) => import(\"react\").JSX.Element", + "ToolbarButton": "ToolbarButton: (props: ToolbarButtonProps) => import(\"react\").JSX.Element", + "ToolbarButtonParts": "export interface ToolbarButtonParts { root?: ButtonHTMLAttributes; icon?: HTMLAttributes; label?: HTMLAttributes; }", + "ToolbarButtonProps": "export interface ToolbarButtonProps { icon?: Icon; text?: string; title: string; active?: boolean; onClick?: () => void; tooltipPosition?: TooltipPosition; className?: string; pt?: ToolbarButtonParts; draggable?: boolean; data?: unknown; onDragStart?: (data: unknown, event: React.DragEvent) => void; }", + "ToolbarContext": "ToolbarContext: FC", + "ToolbarContextProps": "export interface ToolbarContextProps { name: string; children: ReactNode; slotName?: string; }", + "ToolbarFanOutItem": "ToolbarFanOutItem: (props: ToolbarFanOutItemProps) => React.JSX.Element", + "ToolbarFanOutItemProps": "export interface ToolbarFanOutItemProps { icon: Icon; tooltip: string; tooltipPosition?: TooltipPosition; fanOutDirection?: 'right' | 'left' | 'up' | 'down'; className?: string; pt?: ToolbarFanOutParts; children: ReactNode; }", + "ToolbarFanOutParts": "export interface ToolbarFanOutParts { root?: HTMLAttributes; trigger?: ButtonHTMLAttributes; panel?: HTMLAttributes; }", + "ToolbarFocusMode": "export declare enum ToolbarFocusMode { Arrows = \"arrows\", None = \"none\" }", + "ToolbarFolder": "ToolbarFolder: (props: ToolbarFolderProps) => import(\"react\").JSX.Element", + "ToolbarFolderMode": "export type ToolbarFolderMode = 'grid' | 'list';", + "ToolbarFolderParts": "export interface ToolbarFolderParts { root?: HTMLAttributes; trigger?: ButtonHTMLAttributes; panel?: HTMLAttributes; }", + "ToolbarFolderProps": "export interface ToolbarFolderProps { icon: Icon; title: string; tooltipPosition?: TooltipPosition; folderDirection?: 'right' | 'left'; mode?: ToolbarFolderMode; maxColumns?: number; className?: string; pt?: ToolbarFolderParts; children: ReactNode; }", + "ToolbarGroup": "ToolbarGroup: (props: ToolbarGroupProps) => import(\"react\").JSX.Element", + "ToolbarGroupParts": "export interface ToolbarGroupParts { root?: HTMLAttributes; slot?: HTMLAttributes; incoming?: HTMLAttributes; outgoing?: HTMLAttributes; }", + "ToolbarGroupProps": "export interface ToolbarGroupProps { children?: ReactNode; slotName?: string; orientation?: 'vertical' | 'horizontal'; pt?: ToolbarGroupParts; }", + "ToolbarLayout": "ToolbarLayout: (props: ToolbarLayoutProps) => import(\"react\").JSX.Element | null", + "ToolbarLayoutParts": "export interface ToolbarLayoutParts { root?: HTMLAttributes; slot?: HTMLAttributes; incoming?: HTMLAttributes; outgoing?: HTMLAttributes; }", + "ToolbarLayoutProps": "export interface ToolbarLayoutProps { name: string; children?: ReactNode; orientation?: 'vertical' | 'horizontal'; pt?: ToolbarLayoutParts; }", + "ToolbarParts": "export interface ToolbarParts { root?: HTMLAttributes; }", + "ToolbarProps": "export interface ToolbarProps { children: ReactNode; focusMode?: ToolbarFocusMode; orientation?: 'vertical' | 'horizontal'; className?: string; 'aria-label'?: string; 'aria-labelledby'?: string; pt?: ToolbarParts; draggable?: boolean; onItemDragStart?: (data: unknown, event: React.DragEvent) => void; }", + "ToolbarSection": "ToolbarSection: (props: ToolbarSectionProps) => import(\"react\").JSX.Element", + "ToolbarSectionParts": "export interface ToolbarSectionParts { root?: HTMLAttributes; context?: HTMLAttributes; }", + "ToolbarSectionProps": "export interface ToolbarSectionProps { activeContext?: string; children: ReactNode; orientation?: 'vertical' | 'horizontal'; pt?: ToolbarSectionParts; }", + "ToolbarSeparator": "ToolbarSeparator: (props: ToolbarSeparatorProps) => import(\"react\").JSX.Element", + "ToolbarSeparatorParts": "export interface ToolbarSeparatorParts { root?: HTMLAttributes; }", + "ToolbarSeparatorProps": "export interface ToolbarSeparatorProps { orientation?: 'vertical' | 'horizontal'; pt?: ToolbarSeparatorParts; }", + "ToolbarSlot": "ToolbarSlot: (props: ToolbarSlotProps) => null", + "ToolbarSlotProps": "export interface ToolbarSlotProps { slotName: string; order?: number; children: ReactNode; }", + "ToolbarSlotProvider": "ToolbarSlotProvider: (props: ToolbarSlotProviderProps) => import(\"react\").JSX.Element", + "ToolbarSlotProviderProps": "export interface ToolbarSlotProviderProps { children: ReactNode; }", + "useToolbarSlot": "useToolbarSlot: (slotName: string) => ReactNode[]" + }, + "./types": { + "ChangeHandler": "export type ChangeHandler = (value: T, meta?: ChangeMeta) => void;", + "ChangeMeta": "export interface ChangeMeta { readonly source: 'user' | 'programmatic' | 'reset'; readonly nativeEvent?: Event; }", + "CratisCanonicalPartState": "export type CratisCanonicalPartState = (typeof cratisCanonicalPartStates)[number];", + "cratisCanonicalPartStates": "cratisCanonicalPartStates: readonly [ 'disabled', 'loading', 'selected', 'open', 'invalid', 'readonly', 'busy', 'focused', 'pressed' ]", + "cratisParts": "cratisParts: { readonly CheckboxField: readonly [ 'root', 'input', 'box', 'indicator' ]; readonly RatingField: readonly [ 'root', 'option', 'input', 'star' ]; readonly RadioButtonField: readonly [ 'root', 'input', 'box', 'indicator' ]; readonly RadioGroupField: readonly [ 'root', 'option', 'input', 'box', 'indicator' ]; readonly ChipsField: readonly [ 'root', 'item', 'remove', 'input' ]; readonly ToggleSwitchField: readonly [ 'root', 'input', 'control', 'handle' ]; readonly SliderField: readonly [ 'root', 'input', 'value' ]; readonly NumberField: readonly [ 'root', 'input' ]; readonly ComboBox: readonly [ 'root', 'input', 'trigger', 'popover', 'listbox', 'option', 'optionLabel', 'optionDescription', 'loading', 'empty', 'failure', 'action', 'description', 'error' ]; readonly NumberInput: readonly [ 'root', 'group', 'input', 'prefix', 'suffix', 'step', 'description', 'error' ]; readonly NumberInputField: readonly [ 'root', 'group', 'input', 'prefix', 'suffix', 'step', 'description', 'error' ]; readonly ColorPickerField: readonly [ 'root', 'input', 'value' ]; readonly PasswordField: readonly [ 'root', 'input', 'toggle' ]; readonly InputTextField: readonly [ 'input' ]; readonly TextAreaField: readonly [ 'textarea' ]; readonly Dropdown: readonly [ 'root', 'value', 'filter', 'trigger', 'clear', 'popover', 'listbox', 'option', 'multiple', 'indicator' ]; readonly DropdownField: readonly [ 'root', 'value', 'filter', 'trigger', 'clear', 'popover', 'listbox', 'option', 'multiple', 'indicator' ]; readonly MultiSelectField: readonly [ 'root', 'value', 'filter', 'trigger', 'clear', 'popover', 'listbox', 'option', 'multiple', 'indicator' ]; readonly DatePickerInput: readonly [ 'root', 'group', 'input', 'segment', 'placeholder', 'trigger', 'popover', 'dialog', 'calendar', 'header', 'previous', 'heading', 'next', 'grid', 'cell', 'button-bar', 'today', 'clear' ]; readonly CalendarField: readonly [ 'root', 'group', 'input', 'segment', 'placeholder', 'trigger', 'popover', 'dialog', 'calendar', 'header', 'previous', 'heading', 'next', 'grid', 'cell', 'button-bar', 'today', 'clear' ]; readonly Button: readonly [ 'root', 'spinner', 'icon', 'label' ]; readonly ActionMenubar: readonly [ 'root', 'spinner', 'icon', 'label' ]; readonly IconButton: readonly [ 'root', 'spinner', 'icon', 'label' ]; readonly TextInput: readonly [ 'root' ]; readonly TextArea: readonly [ 'root' ]; readonly Checkbox: readonly [ 'root', 'input', 'box', 'indicator', 'label' ]; readonly Radio: readonly [ 'root', 'input', 'box', 'indicator', 'label' ]; readonly Switch: readonly [ 'root', 'input', 'control', 'handle', 'label' ]; readonly Surface: readonly [ 'root' ]; readonly Tooltip: readonly [ 'trigger', 'popup' ]; readonly ToggleGroup: readonly [ 'root', 'option', 'icon', 'label' ]; readonly Tabs: readonly [ 'root', 'list', 'tab', 'panel' ]; readonly TagGroup: readonly [ 'root', 'list', 'tag', 'remove', 'input' ]; readonly Breadcrumbs: readonly [ 'root', 'item', 'link', 'separator' ]; readonly Dialog: readonly [ 'backdrop', 'positioner', 'root', 'header', 'title', 'subtitle', 'close', 'content', 'busy-scope', 'footer', 'confirm', 'cancel' ]; readonly CommandDialog: readonly [ 'backdrop', 'positioner', 'root', 'header', 'title', 'subtitle', 'close', 'content', 'busy-scope', 'footer', 'confirm', 'cancel' ]; readonly CommandStepper: readonly [ 'root', 'list', 'step', 'header', 'number', 'title', 'separator', 'panels', 'panel' ]; readonly DataTableCore: readonly [ 'root', 'search', 'search-input', 'table-container', 'table', 'head', 'header-row', 'header-cell', 'header-content', 'sort', 'select-all', 'body', 'empty-row', 'empty-cell', 'loading-row', 'loading-cell', 'failure-row', 'failure-cell', 'row', 'cell' ]; readonly DataTableForObservableQuery: readonly [ 'root', 'search', 'search-input', 'table-container', 'table', 'head', 'header-row', 'header-cell', 'header-content', 'sort', 'select-all', 'body', 'empty-row', 'empty-cell', 'loading-row', 'loading-cell', 'failure-row', 'failure-cell', 'row', 'cell' ]; readonly DataTableForQuery: readonly [ 'root', 'search', 'search-input', 'table-container', 'table', 'head', 'header-row', 'header-cell', 'header-content', 'sort', 'select-all', 'body', 'empty-row', 'empty-cell', 'loading-row', 'loading-cell', 'failure-row', 'failure-cell', 'row', 'cell' ]; readonly ColumnFilterMenu: readonly [ 'filter-trigger', 'filter-popover', 'filter-menu', 'filter-actions' ]; readonly TablePaginator: readonly [ 'root', 'range', 'info' ]; readonly Toaster: readonly [ 'region', 'toast', 'icon', 'content', 'title', 'description', 'close', 'action' ]; readonly EventsView: readonly [ 'timeline', 'event', 'separator', 'marker', 'connector', 'content' ]; readonly ChatSidebar: readonly [ 'backdrop', 'root', 'header', 'back', 'title', 'close', 'content' ]; readonly Toolbar: readonly [ 'root' ]; readonly ToolbarButton: readonly [ 'button', 'icon', 'label' ]; readonly ToolbarFolder: readonly [ 'toolbar-folder', 'toolbar-folder-trigger', 'toolbar-folder-panel' ]; readonly ToolbarFanOutItem: readonly [ 'fanout-root', 'fanout-trigger', 'fanout-panel' ]; readonly ToolbarSeparator: readonly [ 'toolbar-separator' ]; readonly ToolbarSection: readonly [ 'toolbar-section', 'toolbar-context' ]; readonly ToolbarGroup: readonly [ 'toolbar-group', 'toolbar-slot', 'toolbar-slot-incoming', 'toolbar-slot-outgoing' ]; readonly ToolbarLayout: readonly [ 'toolbar-layout', 'toolbar-slot', 'toolbar-slot-incoming', 'toolbar-slot-outgoing' ]; readonly Skeleton: readonly [ 'root' ]; readonly Message: readonly [ 'root', 'icon', 'text' ]; readonly Badge: readonly [ 'root' ]; readonly ProgressSpinner: readonly [ 'root', 'svg', 'track', 'range' ]; readonly Avatar: readonly [ 'root', 'image', 'fallback' ]; readonly Tag: readonly [ 'root', 'icon', 'label' ]; readonly ProgressBar: readonly [ 'root', 'indicator', 'label' ]; readonly Chip: readonly [ 'root', 'icon', 'label', 'remove' ]; }", + "CratisPartsManifest": "export type CratisPartsManifest = typeof cratisParts;", + "cratisPartStates": "cratisPartStates: { readonly CheckboxField: { readonly root: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly input: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly box: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly indicator: readonly [ \"disabled\", \"selected\", \"invalid\" ]; }; readonly RatingField: { readonly root: readonly [ \"disabled\", \"invalid\" ]; readonly option: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly input: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly star: readonly [ \"disabled\", \"selected\", \"invalid\" ]; }; readonly RadioButtonField: { readonly root: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly input: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly box: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly indicator: readonly [ \"disabled\", \"selected\", \"invalid\" ]; }; readonly RadioGroupField: { readonly root: readonly [ \"disabled\", \"invalid\" ]; readonly option: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly input: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly box: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly indicator: readonly [ \"disabled\", \"selected\", \"invalid\" ]; }; readonly ChipsField: { readonly root: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly item: readonly [ \"selected\" ]; readonly remove: readonly [ \"disabled\", \"selected\" ]; readonly input: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; }; readonly ToggleSwitchField: { readonly root: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly input: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly control: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly handle: readonly [ \"disabled\", \"selected\", \"invalid\" ]; }; readonly SliderField: { readonly root: readonly [ \"disabled\", \"invalid\" ]; readonly input: readonly [ \"disabled\", \"invalid\" ]; readonly value: readonly [ \"invalid\" ]; }; readonly NumberField: { readonly root: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly input: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; }; readonly ComboBox: { readonly root: readonly [ \"disabled\", \"invalid\", \"readonly\", \"loading\" ]; readonly input: readonly [ \"disabled\", \"invalid\", \"readonly\", \"open\" ]; readonly trigger: readonly [ \"disabled\", \"open\" ]; readonly popover: readonly [ \"open\" ]; readonly listbox: readonly [ ]; readonly option: readonly [ \"disabled\", \"selected\" ]; readonly optionLabel: readonly [ ]; readonly optionDescription: readonly [ ]; readonly loading: readonly [ ]; readonly empty: readonly [ ]; readonly failure: readonly [ ]; readonly action: readonly [ ]; readonly description: readonly [ ]; readonly error: readonly [ \"invalid\" ]; }; readonly NumberInput: { readonly root: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly group: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly input: readonly [ \"disabled\", \"invalid\", \"readonly\", \"focused\" ]; readonly prefix: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly suffix: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly step: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly description: readonly [ ]; readonly error: readonly [ \"invalid\" ]; }; readonly NumberInputField: { readonly root: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly group: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly input: readonly [ \"disabled\", \"invalid\", \"readonly\", \"focused\" ]; readonly prefix: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly suffix: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly step: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly description: readonly [ ]; readonly error: readonly [ \"invalid\" ]; }; readonly ColorPickerField: { readonly root: readonly [ \"disabled\", \"invalid\" ]; readonly input: readonly [ \"disabled\", \"invalid\" ]; readonly value: readonly [ \"invalid\" ]; }; readonly PasswordField: { readonly root: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly input: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly toggle: readonly [ \"disabled\" ]; }; readonly InputTextField: { readonly input: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; }; readonly TextAreaField: { readonly textarea: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; }; readonly Dropdown: { readonly root: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\" ]; readonly value: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\" ]; readonly filter: readonly [ \"disabled\", \"open\", \"invalid\" ]; readonly trigger: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\" ]; readonly clear: readonly [ \"disabled\" ]; readonly popover: readonly [ \"open\" ]; readonly listbox: readonly [ \"open\" ]; readonly option: readonly [ \"disabled\", \"selected\" ]; readonly multiple: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly indicator: readonly [ \"disabled\", \"open\", \"invalid\" ]; }; readonly DropdownField: { readonly root: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\" ]; readonly value: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\" ]; readonly filter: readonly [ \"disabled\", \"open\", \"invalid\" ]; readonly trigger: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\" ]; readonly clear: readonly [ \"disabled\" ]; readonly popover: readonly [ \"open\" ]; readonly listbox: readonly [ \"open\" ]; readonly option: readonly [ \"disabled\", \"selected\" ]; readonly multiple: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly indicator: readonly [ \"disabled\", \"open\", \"invalid\" ]; }; readonly MultiSelectField: { readonly root: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\" ]; readonly value: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\" ]; readonly filter: readonly [ \"disabled\", \"open\", \"invalid\" ]; readonly trigger: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\" ]; readonly clear: readonly [ \"disabled\" ]; readonly popover: readonly [ \"open\" ]; readonly listbox: readonly [ \"open\" ]; readonly option: readonly [ \"disabled\", \"selected\" ]; readonly multiple: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly indicator: readonly [ \"disabled\", \"open\", \"invalid\" ]; }; readonly DatePickerInput: { readonly root: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\", \"readonly\" ]; readonly group: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\", \"readonly\" ]; readonly input: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\", \"readonly\" ]; readonly segment: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly placeholder: readonly [ ]; readonly trigger: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\", \"readonly\" ]; readonly popover: readonly [ \"open\" ]; readonly dialog: readonly [ \"open\" ]; readonly calendar: readonly [ \"open\" ]; readonly header: readonly [ ]; readonly previous: readonly [ ]; readonly heading: readonly [ ]; readonly next: readonly [ ]; readonly grid: readonly [ ]; readonly cell: readonly [ \"selected\" ]; readonly 'button-bar': readonly [ ]; readonly today: readonly [ \"disabled\" ]; readonly clear: readonly [ \"disabled\" ]; }; readonly CalendarField: { readonly root: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\", \"readonly\" ]; readonly group: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\", \"readonly\" ]; readonly input: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\", \"readonly\" ]; readonly segment: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly placeholder: readonly [ ]; readonly trigger: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\", \"readonly\" ]; readonly popover: readonly [ \"open\" ]; readonly dialog: readonly [ \"open\" ]; readonly calendar: readonly [ \"open\" ]; readonly header: readonly [ ]; readonly previous: readonly [ ]; readonly heading: readonly [ ]; readonly next: readonly [ ]; readonly grid: readonly [ ]; readonly cell: readonly [ \"selected\" ]; readonly 'button-bar': readonly [ ]; readonly today: readonly [ \"disabled\" ]; readonly clear: readonly [ \"disabled\" ]; }; readonly Button: { readonly root: readonly [ \"disabled\", \"loading\" ]; readonly spinner: readonly [ ]; readonly icon: readonly [ ]; readonly label: readonly [ ]; }; readonly ActionMenubar: { readonly root: readonly [ \"disabled\", \"loading\" ]; readonly spinner: readonly [ ]; readonly icon: readonly [ ]; readonly label: readonly [ ]; }; readonly IconButton: { readonly root: readonly [ \"disabled\", \"loading\" ]; readonly spinner: readonly [ ]; readonly icon: readonly [ ]; readonly label: readonly [ ]; }; readonly TextInput: { readonly root: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; }; readonly TextArea: { readonly root: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; }; readonly Checkbox: { readonly root: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly input: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly box: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly indicator: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly label: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; }; readonly Radio: { readonly root: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly input: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly box: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly indicator: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly label: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; }; readonly Switch: { readonly root: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly input: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly control: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly handle: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly label: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; }; readonly Surface: { readonly root: readonly [ ]; }; readonly Tooltip: { readonly trigger: readonly [ ]; readonly popup: readonly [ \"open\" ]; }; readonly ToggleGroup: { readonly root: readonly [ \"disabled\", \"invalid\" ]; readonly option: readonly [ \"selected\", \"disabled\", \"invalid\" ]; readonly icon: readonly [ ]; readonly label: readonly [ ]; }; readonly Tabs: { readonly root: readonly [ \"disabled\" ]; readonly list: readonly [ ]; readonly tab: readonly [ \"selected\", \"disabled\" ]; readonly panel: readonly [ \"selected\" ]; }; readonly TagGroup: { readonly root: readonly [ \"disabled\", \"invalid\" ]; readonly list: readonly [ ]; readonly tag: readonly [ \"disabled\" ]; readonly remove: readonly [ ]; readonly input: readonly [ \"invalid\" ]; }; readonly Breadcrumbs: { readonly root: readonly [ ]; readonly item: readonly [ \"selected\" ]; readonly link: readonly [ \"selected\" ]; readonly separator: readonly [ ]; }; readonly Dialog: { readonly backdrop: readonly [ \"open\", \"busy\" ]; readonly positioner: readonly [ \"open\", \"busy\" ]; readonly root: readonly [ \"open\", \"busy\" ]; readonly header: readonly [ ]; readonly title: readonly [ ]; readonly subtitle: readonly [ ]; readonly close: readonly [ \"disabled\", \"busy\" ]; readonly content: readonly [ \"open\", \"busy\" ]; readonly 'busy-scope': readonly [ \"busy\" ]; readonly footer: readonly [ ]; readonly confirm: readonly [ \"disabled\", \"busy\" ]; readonly cancel: readonly [ \"disabled\", \"busy\" ]; }; readonly CommandDialog: { readonly backdrop: readonly [ \"open\", \"busy\" ]; readonly positioner: readonly [ \"open\", \"busy\" ]; readonly root: readonly [ \"open\", \"busy\" ]; readonly header: readonly [ ]; readonly title: readonly [ ]; readonly subtitle: readonly [ ]; readonly close: readonly [ \"disabled\", \"busy\" ]; readonly content: readonly [ \"open\", \"busy\" ]; readonly 'busy-scope': readonly [ \"busy\" ]; readonly footer: readonly [ ]; readonly confirm: readonly [ \"disabled\", \"busy\" ]; readonly cancel: readonly [ \"disabled\", \"busy\" ]; }; readonly CommandStepper: { readonly root: readonly [ \"invalid\", \"busy\" ]; readonly list: readonly [ \"invalid\", \"busy\" ]; readonly step: readonly [ \"selected\", \"invalid\", \"busy\" ]; readonly header: readonly [ \"disabled\", \"selected\", \"invalid\", \"busy\" ]; readonly number: readonly [ \"selected\", \"invalid\", \"busy\" ]; readonly title: readonly [ \"selected\", \"invalid\", \"busy\" ]; readonly separator: readonly [ \"invalid\", \"busy\" ]; readonly panels: readonly [ \"invalid\", \"busy\" ]; readonly panel: readonly [ \"selected\", \"invalid\", \"busy\" ]; }; readonly DataTableCore: { readonly root: readonly [ \"busy\" ]; readonly search: readonly [ ]; readonly 'search-input': readonly [ ]; readonly 'table-container': readonly [ ]; readonly table: readonly [ ]; readonly head: readonly [ ]; readonly 'header-row': readonly [ ]; readonly 'header-cell': readonly [ \"selected\" ]; readonly 'header-content': readonly [ \"selected\" ]; readonly sort: readonly [ \"pressed\" ]; readonly 'select-all': readonly [ ]; readonly body: readonly [ ]; readonly 'empty-row': readonly [ ]; readonly 'empty-cell': readonly [ ]; readonly 'loading-row': readonly [ ]; readonly 'loading-cell': readonly [ ]; readonly 'failure-row': readonly [ ]; readonly 'failure-cell': readonly [ ]; readonly row: readonly [ \"selected\" ]; readonly cell: readonly [ \"selected\" ]; }; readonly DataTableForObservableQuery: { readonly root: readonly [ \"busy\" ]; readonly search: readonly [ ]; readonly 'search-input': readonly [ ]; readonly 'table-container': readonly [ ]; readonly table: readonly [ ]; readonly head: readonly [ ]; readonly 'header-row': readonly [ ]; readonly 'header-cell': readonly [ \"selected\" ]; readonly 'header-content': readonly [ \"selected\" ]; readonly sort: readonly [ \"pressed\" ]; readonly 'select-all': readonly [ ]; readonly body: readonly [ ]; readonly 'empty-row': readonly [ ]; readonly 'empty-cell': readonly [ ]; readonly 'loading-row': readonly [ ]; readonly 'loading-cell': readonly [ ]; readonly 'failure-row': readonly [ ]; readonly 'failure-cell': readonly [ ]; readonly row: readonly [ \"selected\" ]; readonly cell: readonly [ \"selected\" ]; }; readonly DataTableForQuery: { readonly root: readonly [ \"busy\" ]; readonly search: readonly [ ]; readonly 'search-input': readonly [ ]; readonly 'table-container': readonly [ ]; readonly table: readonly [ ]; readonly head: readonly [ ]; readonly 'header-row': readonly [ ]; readonly 'header-cell': readonly [ \"selected\" ]; readonly 'header-content': readonly [ \"selected\" ]; readonly sort: readonly [ \"pressed\" ]; readonly 'select-all': readonly [ ]; readonly body: readonly [ ]; readonly 'empty-row': readonly [ ]; readonly 'empty-cell': readonly [ ]; readonly 'loading-row': readonly [ ]; readonly 'loading-cell': readonly [ ]; readonly 'failure-row': readonly [ ]; readonly 'failure-cell': readonly [ ]; readonly row: readonly [ \"selected\" ]; readonly cell: readonly [ \"selected\" ]; }; readonly ColumnFilterMenu: { readonly 'filter-trigger': readonly [ \"selected\", \"open\", \"pressed\" ]; readonly 'filter-popover': readonly [ \"open\" ]; readonly 'filter-menu': readonly [ \"open\" ]; readonly 'filter-actions': readonly [ ]; }; readonly TablePaginator: { readonly root: readonly [ ]; readonly range: readonly [ ]; readonly info: readonly [ ]; }; readonly Toaster: { readonly region: readonly [ ]; readonly toast: readonly [ \"loading\", \"busy\" ]; readonly icon: readonly [ ]; readonly content: readonly [ \"loading\", \"busy\" ]; readonly title: readonly [ ]; readonly description: readonly [ ]; readonly close: readonly [ ]; readonly action: readonly [ ]; }; readonly EventsView: { readonly timeline: readonly [ ]; readonly event: readonly [ \"selected\" ]; readonly separator: readonly [ ]; readonly marker: readonly [ \"selected\" ]; readonly connector: readonly [ ]; readonly content: readonly [ ]; }; readonly ChatSidebar: { readonly backdrop: readonly [ \"selected\", \"open\" ]; readonly root: readonly [ \"selected\", \"open\" ]; readonly header: readonly [ ]; readonly back: readonly [ ]; readonly title: readonly [ ]; readonly close: readonly [ ]; readonly content: readonly [ ]; }; readonly Toolbar: { readonly root: readonly [ ]; }; readonly ToolbarButton: { readonly button: readonly [ \"selected\" ]; readonly icon: readonly [ ]; readonly label: readonly [ ]; }; readonly ToolbarFolder: { readonly 'toolbar-folder': readonly [ \"open\" ]; readonly 'toolbar-folder-trigger': readonly [ \"open\" ]; readonly 'toolbar-folder-panel': readonly [ \"open\" ]; }; readonly ToolbarFanOutItem: { readonly 'fanout-root': readonly [ \"open\" ]; readonly 'fanout-trigger': readonly [ \"open\" ]; readonly 'fanout-panel': readonly [ \"open\" ]; }; readonly ToolbarSeparator: { readonly 'toolbar-separator': readonly [ ]; }; readonly ToolbarSection: { readonly 'toolbar-section': readonly [ ]; readonly 'toolbar-context': readonly [ \"selected\" ]; }; readonly ToolbarGroup: { readonly 'toolbar-group': readonly [ ]; readonly 'toolbar-slot': readonly [ ]; readonly 'toolbar-slot-incoming': readonly [ ]; readonly 'toolbar-slot-outgoing': readonly [ ]; }; readonly ToolbarLayout: { readonly 'toolbar-layout': readonly [ ]; readonly 'toolbar-slot': readonly [ ]; readonly 'toolbar-slot-incoming': readonly [ ]; readonly 'toolbar-slot-outgoing': readonly [ ]; }; readonly Skeleton: { readonly root: readonly [ ]; }; readonly Message: { readonly root: readonly [ ]; readonly icon: readonly [ ]; readonly text: readonly [ ]; }; readonly Badge: { readonly root: readonly [ ]; }; readonly ProgressSpinner: { readonly root: readonly [ \"loading\", \"busy\" ]; readonly svg: readonly [ ]; readonly track: readonly [ ]; readonly range: readonly [ ]; }; readonly Avatar: { readonly root: readonly [ ]; readonly image: readonly [ ]; readonly fallback: readonly [ ]; }; readonly Tag: { readonly root: readonly [ ]; readonly icon: readonly [ ]; readonly label: readonly [ ]; }; readonly ProgressBar: { readonly root: readonly [ \"loading\", \"busy\" ]; readonly indicator: readonly [ ]; readonly label: readonly [ ]; }; readonly Chip: { readonly root: readonly [ ]; readonly icon: readonly [ ]; readonly label: readonly [ ]; readonly remove: readonly [ ]; }; }", + "CratisPartStatesManifest": "export type CratisPartStatesManifest = typeof cratisPartStates;", + "DEFAULT_TYPE_FORMATS": "DEFAULT_TYPE_FORMATS: TypeFormat[]", + "Json": "export type Json = string | number | boolean | null | Json[] | { [key: string]: Json; };", + "JsonSchema": "export interface JsonSchema { title?: string; name?: string; $id?: string; $ref?: string; type?: string; format?: string; description?: string; properties?: Record; items?: JsonSchema; required?: string[]; definitions?: Record; }", + "JsonSchemaProperty": "export interface JsonSchemaProperty { id?: string; name?: string; type?: string; format?: string; description?: string; items?: JsonSchema; properties?: Record; required?: string[]; $ref?: string; }", + "NavigationItem": "export interface NavigationItem { name: string; path: string[]; }", + "PartsOf": "export type PartsOf = CratisPartsManifest[K][number];", + "PartStatesOf": "export type PartStatesOf = CratisPartStatesManifest[Component][Part] extends readonly (infer State)[] ? State : never;", + "TypeFormat": "export interface TypeFormat { jsonType: string; format: string; }" + } +} diff --git a/Source/package.json b/Source/package.json index be4b67f0..22192f09 100644 --- a/Source/package.json +++ b/Source/package.json @@ -258,6 +258,9 @@ "compile": "yarn generate-parts && node ../scripts/run-typescript.mjs -p tsconfig.json -noEmit && yarn g:lint", "copy-css": "./scripts/copy-css.sh", "verify-exports": "node ./scripts/verify-exports.mjs", + "verify-api-surface": "node ./scripts/verify-api-surface.mjs", + "generate-api-surface": "node ./scripts/verify-api-surface.mjs --update", + "report-api-compatibility": "node ./scripts/report-api-compatibility.mjs", "verify-source-maps": "node ./scripts/verify-source-maps.mjs", "verify-package-archive": "node ./scripts/verify-package-archive.mjs", "verify-packed-css": "node ./scripts/verify-packed-css.mjs", @@ -278,7 +281,7 @@ "lint": "yarn g:lint", "lint:ci": "yarn g:lint:ci", "test": "yarn g:test", - "ci": "yarn generate-parts && yarn verify-parts-manifest && yarn verify-api-docs && yarn g:ci && yarn typecheck-stories && yarn g:build && yarn verify-renderer-contracts && yarn verify-package-graph-report && yarn verify-packed-css && yarn verify-source-maps", + "ci": "yarn generate-parts && yarn verify-parts-manifest && yarn verify-api-docs && yarn g:ci && yarn typecheck-stories && yarn g:build && yarn verify-renderer-contracts && yarn verify-package-graph-report && yarn verify-packed-css && yarn verify-source-maps && yarn verify-api-surface", "up": "yarn g:up", "dev": "yarn workspace @cratis/components.storybook dev", "build-storybook": "yarn workspace @cratis/components.storybook build" diff --git a/Source/scripts/for_api_surface/when_computing_the_api_surface.ts b/Source/scripts/for_api_surface/when_computing_the_api_surface.ts new file mode 100644 index 00000000..b30eb973 --- /dev/null +++ b/Source/scripts/for_api_surface/when_computing_the_api_surface.ts @@ -0,0 +1,44 @@ +// Copyright (c) Cratis. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from 'node:fs'; +import os from 'node:os'; +import path from 'node:path'; +import { afterEach, beforeEach, describe, expect, it } from 'vitest'; +import { compareApiSurfaces, computeApiSurface } from '../lib/api-surface.mjs'; + +let packageDir: string; + +const writePackage = (declarations: string) => { + writeFileSync(path.join(packageDir, 'package.json'), JSON.stringify({ + name: 'example', exports: { './Example': { types: './dist/Example.d.ts', import: './dist/Example.js' } }, + })); + writeFileSync(path.join(packageDir, 'dist', 'Example.d.ts'), declarations); +}; + +describe('when computing the API surface', () => { + beforeEach(() => { + packageDir = mkdtempSync(path.join(os.tmpdir(), 'api-surface-spec-')); + mkdirSync(path.join(packageDir, 'dist')); + }); + afterEach(() => rmSync(packageDir, { recursive: true, force: true })); + + it('should describe a destructured component parameter by its type alone', () => { + writePackage( + '/** A documented example. */\n' + + 'export interface ExampleProps { label: string; }\n' + + 'export declare const Example: ({ label, }: ExampleProps) => void;\n', + ); + const surface = computeApiSurface(packageDir); + expect(surface['./Example'].Example).toBe('Example: (props: ExampleProps) => void'); + expect(surface['./Example'].ExampleProps).toBe('export interface ExampleProps { label: string; }'); + }); + + it('should report a new prop only as a change to the props type', () => { + writePackage('export interface ExampleProps { label: string; }\nexport declare const Example: ({ label, }: ExampleProps) => void;\n'); + const before = computeApiSurface(packageDir); + writePackage('export interface ExampleProps { label: string; icon?: string; }\nexport declare const Example: ({ label, icon, }: ExampleProps) => void;\n'); + const after = computeApiSurface(packageDir); + expect(compareApiSurfaces(before, after)).toEqual({ removed: [], changed: ['./Example#ExampleProps'], added: [] }); + }); +}); diff --git a/Source/scripts/lib/api-surface.mjs b/Source/scripts/lib/api-surface.mjs new file mode 100644 index 00000000..3757e12a --- /dev/null +++ b/Source/scripts/lib/api-surface.mjs @@ -0,0 +1,121 @@ +// Copyright (c) Cratis. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +import { readFileSync } from 'node:fs'; +import path from 'node:path'; +import ts from 'typescript'; + +/** + * The typed JavaScript subpaths a package publishes, with the declaration entry each resolves to. + * @param {string} packageDir A directory containing package.json and its built declarations. + * @returns {{ subpath: string, entry: string }[]} Sorted by subpath. + */ +export const typedSubpaths = (packageDir) => { + const manifest = JSON.parse(readFileSync(path.join(packageDir, 'package.json'), 'utf8')); + return Object.entries(manifest.exports ?? {}) + .filter(([subpath, target]) => typeof target === 'object' && target !== null && + typeof target.types === 'string' && typeof target.import === 'string' && !subpath.endsWith('.json')) + .map(([subpath, target]) => ({ subpath, entry: path.join(packageDir, target.types) })) + .sort((left, right) => left.subpath.localeCompare(right.subpath)); +}; + +const printer = ts.createPrinter({ removeComments: true, newLine: ts.NewLineKind.LineFeed }); + +// A destructured parameter's binding names are an implementation detail of the component; its +// type already describes the contract. Print such parameters as `props` so adding a prop changes +// only the props type, not every component signature that destructures it. +const withoutBindingNames = (context) => (root) => { + const visit = (node) => { + if (ts.isParameter(node) && (ts.isObjectBindingPattern(node.name) || ts.isArrayBindingPattern(node.name))) { + return ts.factory.updateParameterDeclaration( + node, node.modifiers, node.dotDotDotToken, ts.factory.createIdentifier('props'), + node.questionToken, node.type, node.initializer, + ); + } + return ts.visitEachChild(node, visit, context); + }; + return ts.visitNode(root, visit); +}; + +// Declarations are printed from the declaration files, so the text is what consumers compile +// against. Whitespace is normalized so formatting-only emit changes do not show up as API changes. +const declarationText = (declaration) => { + const result = ts.transform(declaration, [withoutBindingNames]); + try { + return printer.printNode(ts.EmitHint.Unspecified, result.transformed[0], declaration.getSourceFile()) + .replace(/\s+/gu, ' ') + .trim(); + } finally { + result.dispose(); + } +}; + +/** + * Computes the exported API surface of every typed subpath: each export's name and the text of + * the declarations it resolves to, with comments removed. + * @param {string} packageDir A directory containing package.json and its built declarations. + * @returns {Record>} Subpath to export name to declaration text, sorted. + */ +export const computeApiSurface = (packageDir) => { + const subpaths = typedSubpaths(packageDir); + const program = ts.createProgram(subpaths.map(({ entry }) => entry), { + noEmit: true, + skipLibCheck: true, + target: ts.ScriptTarget.ESNext, + module: ts.ModuleKind.NodeNext, + moduleResolution: ts.ModuleResolutionKind.NodeNext, + jsx: ts.JsxEmit.ReactJSX, + }); + const checker = program.getTypeChecker(); + const surface = {}; + for (const { subpath, entry } of subpaths) { + const sourceFile = program.getSourceFile(entry); + if (!sourceFile) throw new Error(`The declaration entry for '${subpath}' was not found: ${entry}`); + const moduleSymbol = checker.getSymbolAtLocation(sourceFile); + const exports = moduleSymbol ? checker.getExportsOfModule(moduleSymbol) : []; + const entries = exports.map((exported) => { + const target = exported.flags & ts.SymbolFlags.Alias ? checker.getAliasedSymbol(exported) : exported; + const declarations = target.declarations ?? []; + const text = declarations.length === 0 + ? '' + : declarations.map(declarationText).join(' | '); + return [exported.getName(), text]; + }).sort(([left], [right]) => left.localeCompare(right)); + surface[subpath] = Object.fromEntries(entries); + } + return surface; +}; + +/** + * Compares two API surfaces. + * @param {Record>} baseline The earlier surface. + * @param {Record>} current The surface to compare. + * @returns {{ removed: string[], changed: string[], added: string[] }} Qualified `subpath#export` names. + */ +export const compareApiSurfaces = (baseline, current) => { + const removed = []; + const changed = []; + const added = []; + const subpaths = [...new Set([...Object.keys(baseline), ...Object.keys(current)])].sort(); + for (const subpath of subpaths) { + const before = baseline[subpath]; + const after = current[subpath]; + if (!before) { added.push(`${subpath} (new subpath)`); continue; } + if (!after) { removed.push(`${subpath} (subpath removed)`); continue; } + for (const name of Object.keys(before)) { + if (!(name in after)) removed.push(`${subpath}#${name}`); + else if (before[name] !== after[name]) changed.push(`${subpath}#${name}`); + } + for (const name of Object.keys(after)) { + if (!(name in before)) added.push(`${subpath}#${name}`); + } + } + return { removed, changed, added }; +}; + +/** + * Serializes a surface deterministically. + * @param {Record>} surface The surface. + * @returns {string} JSON with a trailing newline. + */ +export const serializeApiSurface = (surface) => `${JSON.stringify(surface, null, 2)}\n`; diff --git a/Source/scripts/report-api-compatibility.mjs b/Source/scripts/report-api-compatibility.mjs new file mode 100644 index 00000000..0e2487ae --- /dev/null +++ b/Source/scripts/report-api-compatibility.mjs @@ -0,0 +1,75 @@ +// Copyright (c) Cratis. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +/** + * Compares the built public API with a published release of @cratis/components and reports which + * exports were removed, changed or added. Removals and changes are candidates for a breaking + * change; a person still decides the release intent, and DOM, parts and behavior need their own + * review (ADR 0001). The report goes to stdout and, in GitHub Actions, to the job summary. + * + * Usage: node scripts/report-api-compatibility.mjs [version] (default: latest) + * add --fail-on-breaking to exit 1 when anything was removed or changed. + * + * Exit codes: 0 when the report was produced (or nothing is breaking with --fail-on-breaking), + * 1 with --fail-on-breaking when something was removed or changed, 2 when it could not run. + */ +import { spawnSync } from 'node:child_process'; +import { appendFileSync, mkdtempSync, readdirSync, rmSync } from 'node:fs'; +import os from 'node:os'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { compareApiSurfaces, computeApiSurface } from './lib/api-surface.mjs'; + +const packageDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); +const version = process.argv.slice(2).find((argument) => !argument.startsWith('--')) ?? 'latest'; +const failOnBreaking = process.argv.includes('--fail-on-breaking'); +const packageName = '@cratis/components'; + +const scratch = mkdtempSync(path.join(os.tmpdir(), 'cratis-api-baseline-')); +try { + const pack = spawnSync('npm', ['pack', `${packageName}@${version}`, '--silent', '--pack-destination', scratch], + { encoding: 'utf8' }); + const archive = readdirSync(scratch).find((file) => file.endsWith('.tgz')); + if (pack.status !== 0 || !archive) { + console.error(`Could not download ${packageName}@${version}: ${(pack.stderr || pack.stdout || '').trim()}`); + process.exit(2); + } + const extract = spawnSync('tar', ['-xzf', path.join(scratch, archive), '-C', scratch], { encoding: 'utf8' }); + if (extract.status !== 0) { + console.error(`Could not extract ${archive}: ${extract.stderr.trim()}`); + process.exit(2); + } + const baselineVersion = archive.replace(/^cratis-components-/u, '').replace(/\.tgz$/u, ''); + + let baseline; + let current; + try { + baseline = computeApiSurface(path.join(scratch, 'package')); + current = computeApiSurface(packageDir); + } catch (error) { + console.error(`Could not compute an API surface: ${error instanceof Error ? error.message : String(error)}`); + process.exit(2); + } + const { removed, changed, added } = compareApiSurfaces(baseline, current); + const list = (items) => items.length ? items.map((item) => `- \`${item}\``).join('\n') : '- none'; + const report = [ + `## Public API compared with ${packageName} ${baselineVersion}`, + '', + `### Removed (${removed.length}) — breaking unless deliberately deprecated first`, + list(removed), + '', + `### Changed (${changed.length}) — review whether each change is compatible`, + list(changed), + '', + `### Added (${added.length})`, + list(added), + '', + 'This compares exported declarations only. DOM, parts and behavior need their own review (ADR 0001).', + '', + ].join('\n'); + console.log(report); + if (process.env.GITHUB_STEP_SUMMARY) appendFileSync(process.env.GITHUB_STEP_SUMMARY, `${report}\n`); + if (failOnBreaking && removed.length + changed.length > 0) process.exit(1); +} finally { + rmSync(scratch, { recursive: true, force: true }); +} diff --git a/Source/scripts/verify-api-surface.mjs b/Source/scripts/verify-api-surface.mjs new file mode 100644 index 00000000..b0a4fc6d --- /dev/null +++ b/Source/scripts/verify-api-surface.mjs @@ -0,0 +1,70 @@ +// Copyright (c) Cratis. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +/** + * Keeps a reviewable snapshot of the published API: every export of every typed subpath, with the + * text of its declaration. Any change to the public surface shows up in the snapshot's diff, so a + * pull request states exactly which exports it adds, removes or changes. + * + * Usage: node scripts/verify-api-surface.mjs (check the built declarations) + * node scripts/verify-api-surface.mjs --update (rewrite api-surface.json) + * + * Exit codes: 0 when the snapshot matches, 1 when it differs, 2 when it could not run. + */ +import { existsSync, readFileSync, writeFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { compareApiSurfaces, computeApiSurface, serializeApiSurface } from './lib/api-surface.mjs'; + +const packageDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); +const snapshotPath = path.join(packageDir, 'api-surface.json'); + +// The comparison must name every kind of difference; plant one of each. +const planted = compareApiSurfaces( + { './A': { kept: 'kept', removed: 'removed', changed: 'before' }, './Gone': { x: 'x' } }, + { './A': { kept: 'kept', changed: 'after', added: 'added' }, './New': { y: 'y' } }, +); +if (planted.removed.join() !== './A#removed,./Gone (subpath removed)' || + planted.changed.join() !== './A#changed' || + planted.added.join() !== './A#added,./New (new subpath)') { + console.error(`The API surface comparison missed a planted difference: ${JSON.stringify(planted)}`); + process.exit(2); +} + +let surface; +try { + surface = computeApiSurface(packageDir); +} catch (error) { + console.error(`Could not compute the API surface: ${error instanceof Error ? error.message : String(error)}`); + console.error('Build the declarations first: yarn g:build'); + process.exit(2); +} +const subpathCount = Object.keys(surface).length; +const exportCount = Object.values(surface).reduce((total, exports) => total + Object.keys(exports).length, 0); +if (subpathCount === 0 || exportCount === 0) { + console.error('No typed subpaths or exports were found; the check would pass vacuously.'); + process.exit(2); +} + +if (process.argv.includes('--update')) { + writeFileSync(snapshotPath, serializeApiSurface(surface)); + console.log(`Wrote ${path.relative(process.cwd(), snapshotPath)} (${subpathCount} subpaths, ${exportCount} exports).`); + process.exit(0); +} + +if (!existsSync(snapshotPath)) { + console.error(`${snapshotPath} is missing. Run yarn generate-api-surface and commit it.`); + process.exit(1); +} +const committed = JSON.parse(readFileSync(snapshotPath, 'utf8')); +const { removed, changed, added } = compareApiSurfaces(committed, surface); +if (removed.length + changed.length + added.length > 0) { + const section = (title, items) => items.length ? `${title}:\n- ${items.join('\n- ')}\n` : ''; + console.error( + 'The public API differs from the committed api-surface.json.\n' + + section('Removed', removed) + section('Changed', changed) + section('Added', added) + + 'Review the change, then run yarn generate-api-surface and commit the snapshot.', + ); + process.exit(1); +} +console.log(`The public API matches api-surface.json (${subpathCount} subpaths, ${exportCount} exports checked).`); From b0d08b7e9037d518d2ca137ba80af95304184103 Mon Sep 17 00:00:00 2001 From: woksin Date: Tue, 29 Sep 2026 07:39:55 +0200 Subject: [PATCH 2/5] Degrade the API report without a baseline and harden the surface snapshot A missing or unreachable baseline is stated in the report instead of failing the build. Unknown export shapes and unresolved exports now fail, re-exports of other packages are recorded by name, and ordering is locale-independent. --- README.md | 3 +- Source/scripts/lib/api-surface.mjs | 39 ++++++++++++++++----- Source/scripts/report-api-compatibility.mjs | 28 +++++++++++---- 3 files changed, 54 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 542b3d28..37549cff 100644 --- a/README.md +++ b/README.md @@ -178,7 +178,8 @@ The public API of every typed subpath is kept in a reviewable snapshot, `Source/ which exports it adds, removes, or changes. `yarn report-api-compatibility [version]` compares the built API with a published release (default: the latest); CI adds that report to the job summary. It lists removals and changes as breaking-change candidates, but release intent is still decided -by a person, and DOM, parts, and behavior need their own review. +by a person, and DOM, parts, and behavior need their own review. Only exported declarations are +compared: a change to a type that is reachable only through an unexported name does not show up. Before pushing Source changes, run `cd Source && yarn ci` after `yarn install` at the repository root. It includes public API TSDoc coverage and packs the built package to check diff --git a/Source/scripts/lib/api-surface.mjs b/Source/scripts/lib/api-surface.mjs index 3757e12a..2941e563 100644 --- a/Source/scripts/lib/api-surface.mjs +++ b/Source/scripts/lib/api-surface.mjs @@ -12,13 +12,25 @@ import ts from 'typescript'; */ export const typedSubpaths = (packageDir) => { const manifest = JSON.parse(readFileSync(path.join(packageDir, 'package.json'), 'utf8')); - return Object.entries(manifest.exports ?? {}) - .filter(([subpath, target]) => typeof target === 'object' && target !== null && - typeof target.types === 'string' && typeof target.import === 'string' && !subpath.endsWith('.json')) - .map(([subpath, target]) => ({ subpath, entry: path.join(packageDir, target.types) })) - .sort((left, right) => left.subpath.localeCompare(right.subpath)); + const subpaths = []; + for (const [subpath, target] of Object.entries(manifest.exports ?? {})) { + // Stylesheets and JSON assets are not part of the typed API. + const asset = typeof target === 'string' || subpath.endsWith('.json') || subpath.endsWith('.css') || + subpath.endsWith('/styles') || (typeof target === 'object' && target !== null && target.style !== undefined); + if (asset) continue; + if (typeof target !== 'object' || target === null || + typeof target.types !== 'string' || typeof target.import !== 'string') { + // A new export shape must not silently drop out of the snapshot. + throw new Error(`The export '${subpath}' has a shape this check does not understand: ${JSON.stringify(target)}`); + } + subpaths.push({ subpath, entry: path.join(packageDir, target.types) }); + } + return subpaths.sort((left, right) => ordinal(left.subpath, right.subpath)); }; +// Ordinal comparison keeps the snapshot byte-identical across locales and ICU builds. +const ordinal = (left, right) => (left < right ? -1 : left > right ? 1 : 0); + const printer = ts.createPrinter({ removeComments: true, newLine: ts.NewLineKind.LineFeed }); // A destructured parameter's binding names are an implementation detail of the component; its @@ -67,6 +79,7 @@ export const computeApiSurface = (packageDir) => { jsx: ts.JsxEmit.ReactJSX, }); const checker = program.getTypeChecker(); + const packageRoot = `${path.resolve(packageDir)}${path.sep}`; const surface = {}; for (const { subpath, entry } of subpaths) { const sourceFile = program.getSourceFile(entry); @@ -76,11 +89,19 @@ export const computeApiSurface = (packageDir) => { const entries = exports.map((exported) => { const target = exported.flags & ts.SymbolFlags.Alias ? checker.getAliasedSymbol(exported) : exported; const declarations = target.declarations ?? []; - const text = declarations.length === 0 - ? '' + if (declarations.length === 0) { + throw new Error(`The export '${subpath}#${exported.getName()}' does not resolve to a declaration.`); + } + // A re-export of another package's type is recorded by where it comes from; its text + // depends on that package's installed version, not on this package. + const external = declarations.every((declaration) => + !path.resolve(declaration.getSourceFile().fileName).startsWith(packageRoot) || + declaration.getSourceFile().fileName.includes(`${path.sep}node_modules${path.sep}`)); + const text = external + ? `re-export of ${checker.getFullyQualifiedName(target)}` : declarations.map(declarationText).join(' | '); return [exported.getName(), text]; - }).sort(([left], [right]) => left.localeCompare(right)); + }).sort(([left], [right]) => ordinal(left, right)); surface[subpath] = Object.fromEntries(entries); } return surface; @@ -96,7 +117,7 @@ export const compareApiSurfaces = (baseline, current) => { const removed = []; const changed = []; const added = []; - const subpaths = [...new Set([...Object.keys(baseline), ...Object.keys(current)])].sort(); + const subpaths = [...new Set([...Object.keys(baseline), ...Object.keys(current)])].sort(ordinal); for (const subpath of subpaths) { const before = baseline[subpath]; const after = current[subpath]; diff --git a/Source/scripts/report-api-compatibility.mjs b/Source/scripts/report-api-compatibility.mjs index 0e2487ae..672239f9 100644 --- a/Source/scripts/report-api-compatibility.mjs +++ b/Source/scripts/report-api-compatibility.mjs @@ -10,8 +10,9 @@ * Usage: node scripts/report-api-compatibility.mjs [version] (default: latest) * add --fail-on-breaking to exit 1 when anything was removed or changed. * - * Exit codes: 0 when the report was produced (or nothing is breaking with --fail-on-breaking), - * 1 with --fail-on-breaking when something was removed or changed, 2 when it could not run. + * Exit codes: 0 when the report was produced, including a report that no baseline could be + * downloaded; 1 with --fail-on-breaking when something was removed or changed; 2 when this + * package's own API surface could not be computed. */ import { spawnSync } from 'node:child_process'; import { appendFileSync, mkdtempSync, readdirSync, rmSync } from 'node:fs'; @@ -27,12 +28,27 @@ const packageName = '@cratis/components'; const scratch = mkdtempSync(path.join(os.tmpdir(), 'cratis-api-baseline-')); try { - const pack = spawnSync('npm', ['pack', `${packageName}@${version}`, '--silent', '--pack-destination', scratch], - { encoding: 'utf8' }); + const pack = spawnSync('npm', ['pack', `${packageName}@${version}`, '--silent', '--fetch-retries=3', + '--pack-destination', scratch], { encoding: 'utf8' }); const archive = readdirSync(scratch).find((file) => file.endsWith('.tgz')); if (pack.status !== 0 || !archive) { - console.error(`Could not download ${packageName}@${version}: ${(pack.stderr || pack.stdout || '').trim()}`); - process.exit(2); + // The report is informational: a missing baseline (first publish, registry outage) is + // stated in the report rather than failing the build. Computing this package's own API + // surface failing is still an error below. + const output = (pack.stderr || pack.stdout || '').trim(); + const reason = /E404|404 Not Found/u.test(output) + ? `${packageName}@${version} is not published yet, so there is no release to compare with.` + : `The baseline ${packageName}@${version} could not be downloaded: ${output.split('\n')[0] || 'no output'}`; + const report = `## Public API compared with the latest release\n\nNo baseline. ${reason}\n`; + console.log(report); + if (process.env.GITHUB_STEP_SUMMARY) appendFileSync(process.env.GITHUB_STEP_SUMMARY, `${report}\n`); + try { + computeApiSurface(packageDir); + } catch (error) { + console.error(`Could not compute the API surface: ${error instanceof Error ? error.message : String(error)}`); + process.exit(2); + } + process.exit(0); } const extract = spawnSync('tar', ['-xzf', path.join(scratch, archive), '-C', scratch], { encoding: 'utf8' }); if (extract.status !== 0) { From 1bac1880490ad06b0c69ac7fa2c0f55dc24421cc Mon Sep 17 00:00:00 2001 From: woksin Date: Tue, 29 Sep 2026 08:13:41 +0200 Subject: [PATCH 3/5] Record external re-exports portably and detect type-only exports External re-exports are recorded as package#name from the export syntax, so the snapshot holds no machine paths and the baseline does not need its dependencies installed; it is still unpacked below node_modules so they resolve. Exporting a value with export type now changes the entry. Plain export targets other than CSS and JSON fail, and typed JSON subpaths are included. --- README.md | 2 + Source/api-surface.json | 237 +++++++++--------- .../when_computing_the_api_surface.ts | 65 ++++- Source/scripts/lib/api-surface.mjs | 85 +++++-- Source/scripts/report-api-compatibility.mjs | 9 +- 5 files changed, 259 insertions(+), 139 deletions(-) diff --git a/README.md b/README.md index 37549cff..88cff02a 100644 --- a/README.md +++ b/README.md @@ -180,6 +180,8 @@ built API with a published release (default: the latest); CI adds that report to It lists removals and changes as breaking-change candidates, but release intent is still decided by a person, and DOM, parts, and behavior need their own review. Only exported declarations are compared: a change to a type that is reachable only through an unexported name does not show up. +A re-export of another package is recorded as `re-export of #`, so a change inside +that package does not show up either. Before pushing Source changes, run `cd Source && yarn ci` after `yarn install` at the repository root. It includes public API TSDoc coverage and packs the built package to check diff --git a/Source/api-surface.json b/Source/api-surface.json index 3c73b9ec..768a6e53 100644 --- a/Source/api-surface.json +++ b/Source/api-surface.json @@ -8,7 +8,6 @@ "CratisComponentsProviderProps": "export interface CratisComponentsProviderProps { value?: CratisComponentsConfig; toaster?: boolean | ToasterProps; library?: unstable_UiLibrary | readonly unstable_UiLibrary[]; libraryMode?: 'strict' | 'degrade'; rendererFallback?: 'core' | 'throw'; overlayEnvironment?: CratisOverlayEnvironment; rendererSetup?: CratisRendererSetup; children: ReactNode; }", "CratisDataTableMessages": "export interface CratisDataTableMessages { selectRow?: string; selectAllRows?: string; search?: string; searchAriaLabel?: string; loading?: string; failed?: string; unauthorized?: string; }", "CratisDatePickerMessages": "export interface CratisDatePickerMessages { today?: string; clear?: string; openCalendar?: string; previousMonth?: string; nextMonth?: string; label?: string; }", - "cratisDefaults": "cratisDefaults: CratisComponentsConfig", "CratisDialogMessages": "export interface CratisDialogMessages { ok?: string; cancel?: string; yes?: string; no?: string; close?: string; }", "CratisDropdownMessages": "export interface CratisDropdownMessages { showOptions?: string; clearSelection?: string; }", "CratisFilterMessages": "export interface CratisFilterMessages { label?: string; searchAriaLabel?: string; }", @@ -16,6 +15,7 @@ "CratisNotificationsMessages": "export interface CratisNotificationsMessages { dismiss?: string; region?: string; }", "CratisPaginatorMessages": "export interface CratisPaginatorMessages { navigation?: string; first?: string; previous?: string; next?: string; last?: string; }", "CratisStepperMessages": "export interface CratisStepperMessages { next?: string; previous?: string; submit?: string; }", + "cratisDefaults": "cratisDefaults: CratisComponentsConfig", "mergeCratisComponentsConfig": "mergeCratisComponentsConfig: (value: CratisComponentsConfig | undefined) => CratisComponentsConfig", "useCratisComponentsConfig": "useCratisComponentsConfig: () => CratisComponentsConfig", "useCratisIcon": "useCratisIcon: () => CratisIconResolver" @@ -33,7 +33,6 @@ "CanvasControlsIcons": "export interface CanvasControlsIcons { toggleMinimap?: React.ReactNode; zoomOut?: React.ReactNode; zoomIn?: React.ReactNode; help?: React.ReactNode; }", "CanvasControlsLabels": "export interface CanvasControlsLabels { toggleMinimap?: string; zoomOut?: string; resetZoom?: string; zoomIn?: string; help?: string; }", "CanvasControlsProps": "export interface CanvasControlsProps { getZoom: () => number; onZoomIn: () => void; onZoomOut: () => void; onZoomReset: () => void; showMinimapToggle?: boolean; minimapRef?: React.RefObject; minimapWorldWidth?: number; minimapWorldHeight?: number; minimapItems?: MinimapItem[]; onMinimapPan?: (pan: { x: number; y: number; }) => void; placement?: 'bottom-left' | 'bottom-right'; onHelp?: () => void; helpTitle?: string; labels?: CanvasControlsLabels; icons?: CanvasControlsIcons; followViewportInsets?: boolean; glassSurface?: React.ReactNode; contentCaptureAttribute?: string; disableGlass?: boolean; }", - "canvasGesture": "canvasGesture: { readonly isActive: boolean; set(activeNow: boolean): void; subscribe(listener: GestureListener): () => void; }", "CanvasHandle": "export interface CanvasHandle { smoothPanToWorld(worldX: number, worldY: number, durationMs?: number): void; smoothPanZoomToWorld(worldX: number, worldY: number, targetZoom?: number, durationMs?: number): void; getContainerRect(): DOMRect | null; getItemBounds(): MinimapItem[]; }", "CanvasItem": "CanvasItem: React.FC", "CanvasItemData": "export interface CanvasItemData { id: string; x: number; y: number; }", @@ -47,7 +46,6 @@ "CanvasOverlay": "CanvasOverlay: (props: CanvasOverlayProps) => import(\"react\").ReactPortal | null", "CanvasOverlayProps": "export interface CanvasOverlayProps { children: ReactNode; }", "CanvasProps": "export interface CanvasProps { children?: React.ReactNode; items?: T[]; renderItem?: (item: T) => PIXI.Container; onItemPointerDown?: (item: T, event: PIXI.FederatedPointerEvent) => void; onReady?: (context: CanvasContext) => void; onTransformChange?: (zoom: number, pan: { x: number; y: number; }) => void; initialZoom?: number; initialPan?: { x: number; y: number; }; minZoom?: number; maxZoom?: number; showControls?: boolean; showMinimap?: boolean; minimapWorldWidth?: number; minimapWorldHeight?: number; minimapItems?: MinimapItem[]; controlsPlacement?: 'bottom-left' | 'bottom-right'; className?: string; style?: React.CSSProperties; onHelp?: () => void; helpTitle?: string; controlsLabels?: CanvasControlsLabels; controlsIcons?: CanvasControlsIcons; controlsFollowViewportInsets?: boolean; controlsGlassSurface?: React.ReactNode; disableControlsGlass?: boolean; captureAttributes?: CanvasCaptureAttributes; onHandleReady?: (handle: CanvasHandle) => void; readOnly?: boolean; backgroundDragPans?: boolean; }", - "canvasTransformActivity": "canvasTransformActivity: { notify(): void; subscribe(listener: TransformListener): () => void; }", "Chat": "Chat: React.FC", "ChatAuthorKind": "export declare enum ChatAuthorKind { User = \"user\", Agent = \"agent\" }", "ChatBubble": "ChatBubble: React.FC", @@ -68,28 +66,21 @@ "ChatProps": "export interface ChatProps { id?: string; messages: ChatMessage[]; onSend: (text: string) => void; onClose: () => void; title?: string; autoFocus?: boolean; variant?: ChatVariant; mentionCandidates?: MentionCandidate[]; resolveMentionCandidates?: (query: string) => MentionCandidate[] | Promise; typingAuthors?: ChatTypingAuthor[]; currentUserId?: Guid; onReact?: (messageId: Guid, emoji: string) => void; onAct?: (messageId: Guid) => void; canAct?: (message: ChatMessage) => boolean; buildAvatarUrl?: (params: BuildAvatarUrlParams) => string; buildReportUrl?: (details: FailedReplyReportDetails) => string; labels?: ChatLabels; }", "ChatTypingAuthor": "export interface ChatTypingAuthor { id: string; name: string; hasAvatar: boolean; kind: ChatAuthorKind; }", "ChatVariant": "export declare enum ChatVariant { Floating = \"floating\", Docked = \"docked\" }", - "createSelfSuspendingFrameLoop": "createSelfSuspendingFrameLoop: (step: (now: number) => boolean, schedule?: FrameScheduler, cancel?: FrameCanceler) => SelfSuspendingFrameLoop", "EmojiCategory": "export interface EmojiCategory { key: EmojiCategoryKey; emojis: readonly string[]; }", "EmojiMemory": "export interface EmojiMemory { getItem(key: string): string | null; setItem(key: string, value: string): void; }", "EmojiPicker": "EmojiPicker: (props: EmojiPickerProps) => import(\"react\").JSX.Element", "EmojiPickerLabels": "export interface EmojiPickerLabels { allEmojis?: string; pickEmoji?: string; emojiCategories?: string; categories?: Partial>; }", "EmojiPickerProps": "export interface EmojiPickerProps { ownEmoji?: string; onPick: (emoji: string) => void; labels?: EmojiPickerLabels; }", - "extractMentions": "extractMentions: (text: string, candidates: TCandidate[]) => TCandidate[]", "FailedReply": "FailedReply: (props: FailedReplyProps) => import(\"react\").JSX.Element", "FailedReplyLabels": "export interface FailedReplyLabels { replyFailed?: string; seeError?: string; report?: string; errorTitle?: string; reportTitle?: string; reportSummary?: string; close?: string; }", "FailedReplyProps": "export interface FailedReplyProps { message: ChatMessage; buildReportUrl?: (details: FailedReplyReportDetails) => string; labels?: FailedReplyLabels; }", "FailedReplyReportDetails": "export interface FailedReplyReportDetails { title: string; summary: string; detail: string; commentId: string; }", - "findMentionRanges": "findMentionRanges: (text: string, candidates: TCandidate[]) => MentionRange[]", - "findOwnReaction": "findOwnReaction: (reactions: ChatMessageReaction[] | undefined, userId: Guid) => ChatOwnReaction | undefined", - "getAvatarColor": "getAvatarColor: (seed: string) => string", "ItemAddedToRegion": "export declare class ItemAddedToRegion { readonly regionId: string; readonly itemId: string; constructor(regionId: string, itemId: string); }", "ItemRemovedFromRegion": "export declare class ItemRemovedFromRegion { readonly regionId: string; readonly itemId: string; constructor(regionId: string, itemId: string); }", - "itemsWithinRegion": "export declare function itemsWithinRegion(regionBounds: RegionContainmentBounds, items: Iterable<[ string, RegionContainmentBounds ]>, excludeId?: string): string[];", "MentionCandidate": "export interface MentionCandidate { id: string; name: string; hasAvatar: boolean; kind: ChatAuthorKind; avatarVersion?: number; }", "MentionQuery": "export interface MentionQuery { start: number; text: string; }", "MentionRange": "export interface MentionRange { start: number; end: number; candidate: TCandidate; }", "MentionSegment": "export interface MentionSegment { text: string; mention?: TCandidate; }", - "mentionSegments": "mentionSegments: (text: string, candidates: TCandidate[]) => MentionSegment[]", "MentionSuggestions": "MentionSuggestions: (props: MentionSuggestionsProps) => import(\"react\").JSX.Element", "MentionSuggestionsProps": "export interface MentionSuggestionsProps { candidates: MentionCandidate[]; highlightedIndex: number; onSelect: (candidate: MentionCandidate) => void; onHighlight: (index: number) => void; 'aria-label'?: string; buildAvatarUrl?: (params: BuildAvatarUrlParams) => string; }", "MessageReactions": "MessageReactions: (props: MessageReactionsProps) => import(\"react\").JSX.Element | null", @@ -104,15 +95,24 @@ "ReactionPicker": "ReactionPicker: (props: ReactionPickerProps) => import(\"react\").JSX.Element", "ReactionPickerLabels": "export interface ReactionPickerLabels { pickEmoji?: string; allEmojis?: string; emojiPicker?: EmojiPickerLabels; }", "ReactionPickerProps": "export interface ReactionPickerProps { ownEmoji?: string; reactions?: readonly ChatMessageReaction[]; memory?: EmojiMemory; anchorRef?: RefObject; onPick: (emoji: string) => void; onDismiss: () => void; labels?: ReactionPickerLabels; }", - "recentEmojis": "export declare function recentEmojis(memory: EmojiMemory): string[];", "Region": "Region: (props: RegionProps) => React.JSX.Element", "RegionContainmentBounds": "export interface RegionContainmentBounds { x: number; y: number; width: number; height: number; anonymous?: boolean; }", "RegionData": "export interface RegionData { id: string; x: number; y: number; width: number; height: number; name: string; }", "RegionProps": "export interface RegionProps { region: RegionData; selected: boolean; onSelect: (id: string, additive: boolean) => void; onMove: (id: string, x: number, y: number) => void; onMoveEnd?: (id: string) => void; onResize: (id: string, x: number, y: number, width: number, height: number) => void; onResizeEnd?: (id: string) => void; onNameChange: (id: string, name: string) => void; children?: React.ReactNode; }", - "rememberEmoji": "export declare function rememberEmoji(memory: EmojiMemory, emoji: string): string[];", "SelfSuspendingFrameLoop": "export interface SelfSuspendingFrameLoop { readonly isRunning: boolean; wake(): void; stop(): void; }", "TypingIndicator": "TypingIndicator: (props: TypingIndicatorProps) => import(\"react\").JSX.Element | null", - "TypingIndicatorProps": "export interface TypingIndicatorProps { authors: ChatTypingAuthor[]; label: string; buildAvatarUrl?: (params: BuildAvatarUrlParams) => string; }" + "TypingIndicatorProps": "export interface TypingIndicatorProps { authors: ChatTypingAuthor[]; label: string; buildAvatarUrl?: (params: BuildAvatarUrlParams) => string; }", + "canvasGesture": "canvasGesture: { readonly isActive: boolean; set(activeNow: boolean): void; subscribe(listener: GestureListener): () => void; }", + "canvasTransformActivity": "canvasTransformActivity: { notify(): void; subscribe(listener: TransformListener): () => void; }", + "createSelfSuspendingFrameLoop": "createSelfSuspendingFrameLoop: (step: (now: number) => boolean, schedule?: FrameScheduler, cancel?: FrameCanceler) => SelfSuspendingFrameLoop", + "extractMentions": "extractMentions: (text: string, candidates: TCandidate[]) => TCandidate[]", + "findMentionRanges": "findMentionRanges: (text: string, candidates: TCandidate[]) => MentionRange[]", + "findOwnReaction": "findOwnReaction: (reactions: ChatMessageReaction[] | undefined, userId: Guid) => ChatOwnReaction | undefined", + "getAvatarColor": "getAvatarColor: (seed: string) => string", + "itemsWithinRegion": "export declare function itemsWithinRegion(regionBounds: RegionContainmentBounds, items: Iterable<[ string, RegionContainmentBounds ]>, excludeId?: string): string[];", + "mentionSegments": "mentionSegments: (text: string, candidates: TCandidate[]) => MentionSegment[]", + "recentEmojis": "export declare function recentEmojis(memory: EmojiMemory): string[];", + "rememberEmoji": "export declare function rememberEmoji(memory: EmojiMemory, emoji: string): string[];" }, "./Chat": { "BuildAvatarUrlParams": "export interface BuildAvatarUrlParams { userId: string; ownerType: 'Users' | 'Personas' | 'Agents'; avatarSize: 'Small' | 'Medium'; version?: number | string; }", @@ -123,7 +123,6 @@ "ChatConversationLabels": "export interface ChatConversationLabels { loading?: string; failed?: string; unauthorized?: string; empty?: string; typing?: string; typingTwo?: string; typingSeveral?: string; quickReplyTo?: string; timestamps?: RelativeTimestampLabels; composer?: ChatComposerLabels; }", "ChatConversationProps": "export interface ChatConversationProps { messages: TMessage[]; status?: ChatStatus; onSendMessage: (body: string, mentions: ChatMention[]) => void; authorOf?: (authorId: ChatIdentifier) => ChatAuthor; renderAvatar?: (authorId: ChatIdentifier, author: ChatAuthor) => ReactNode; renderAuthorName?: (authorId: ChatIdentifier, author: ChatAuthor) => ReactNode; actions?: ChatMessageAction[]; mentionCandidates?: MentionCandidate[]; resolveMentionCandidates?: (query: string) => MentionCandidate[] | Promise; typingAuthors?: ChatTypingAuthor[]; quickReply?: boolean; buildAvatarUrl?: (params: BuildAvatarUrlParams) => string; autoFocus?: boolean; labels?: ChatConversationLabels; className?: string; }", "ChatIdentifier": "export type ChatIdentifier = string | { toString(): string; };", - "chatIdentifierString": "chatIdentifierString: (identifier: ChatIdentifier) => string", "ChatMention": "export interface ChatMention { id: ChatIdentifier; name: string; kind: ChatAuthorKind; }", "ChatMessage": "export interface ChatMessage { id: ChatIdentifier; topicId: ChatIdentifier; authorId: ChatIdentifier; body: string; timestamp: Date; mentions?: ChatMention[]; metadata?: Record; }", "ChatMessageAction": "export interface ChatMessageAction { id: string; label: string; icon: string | ReactNode; isAvailable?: (message: TMessage) => boolean; onInvoke: (message: TMessage) => void; }", @@ -142,21 +141,21 @@ "ChatTopicListLabels": "export interface ChatTopicListLabels { newTopic?: string; unnamedTopic?: string; startedBy?: string; loading?: string; failed?: string; unauthorized?: string; empty?: string; timestamps?: RelativeTimestampLabels; }", "ChatTopicListProps": "export interface ChatTopicListProps { topics: TTopic[]; status?: ChatStatus; onOpen: (topic: TTopic) => void; onStart?: () => void; authorOf?: (authorId: ChatIdentifier) => ChatAuthor; renderAvatar?: (authorId: ChatIdentifier, author: ChatAuthor) => ReactNode; isTopicUnnamed?: (topic: TTopic) => boolean; buildAvatarUrl?: (params: BuildAvatarUrlParams) => string; labels?: ChatTopicListLabels; topicActions?: ChatTopicAction[]; className?: string; }", "ChatTypingAuthor": "export interface ChatTypingAuthor { id: string; name: string; hasAvatar: boolean; kind: ChatAuthorKind; }", - "extractMentions": "extractMentions: (text: string, candidates: TCandidate[]) => TCandidate[]", - "findMentionRanges": "findMentionRanges: (text: string, candidates: TCandidate[]) => MentionRange[]", - "isTopicUnnamed": "isTopicUnnamed: (topic: ChatTopic) => boolean", "MentionCandidate": "export interface MentionCandidate { id: string; name: string; hasAvatar: boolean; kind: ChatAuthorKind; avatarVersion?: number; }", "MentionRange": "export interface MentionRange { start: number; end: number; candidate: TCandidate; }", "MentionSegment": "export interface MentionSegment { text: string; mention?: TCandidate; }", + "RelativeTimestampLabels": "export interface RelativeTimestampLabels { justNow?: string; minutesAgo?: string; hoursAgo?: string; }", + "chatIdentifierString": "chatIdentifierString: (identifier: ChatIdentifier) => string", + "extractMentions": "extractMentions: (text: string, candidates: TCandidate[]) => TCandidate[]", + "findMentionRanges": "findMentionRanges: (text: string, candidates: TCandidate[]) => MentionRange[]", + "isTopicUnnamed": "isTopicUnnamed: (topic: ChatTopic) => boolean", "mentionSegments": "mentionSegments: (text: string, candidates: TCandidate[]) => MentionSegment[]", "relativeTimestamp": "relativeTimestamp: (moment: Date, now?: Date, labels?: RelativeTimestampLabels) => string", - "RelativeTimestampLabels": "export interface RelativeTimestampLabels { justNow?: string; minutesAgo?: string; hoursAgo?: string; }", "sameChatIdentifier": "sameChatIdentifier: (left?: ChatIdentifier, right?: ChatIdentifier) => boolean", "shouldRequestTopicName": "shouldRequestTopicName: (topicIsUnnamed: boolean, existingMessageCount: number) => boolean", "topicsByActivity": "topicsByActivity: (topics: TTopic[]) => TTopic[]" }, "./CommandDialog": { - "applyBeforeExecute": "export declare function applyBeforeExecute(onBeforeExecute: BeforeExecuteCallback, currentValues: TCommand): TCommand | Promise;", "BeforeExecuteCallback": "export type BeforeExecuteCallback = (values: TCommand) => TCommand | Promise;", "CommandDialog": "CommandDialog: typeof CommandDialogComponent", "CommandDialogProps": "export interface CommandDialogProps extends Omit, 'children' | 'onBeforeExecute'>, Omit { onBeforeExecute?: BeforeExecuteCallback; confirmBeforeExecute?: ConfirmBeforeExecute; children?: React.ReactNode; }", @@ -171,7 +170,8 @@ "StepperOrientation": "export type StepperOrientation = 'horizontal' | 'vertical';", "StepperPanel": "export declare function StepperPanel(_props: StepperPanelProps): React.ReactElement | null; | export declare namespace StepperPanel { var displayName: string; }", "StepperPanelProps": "export interface StepperPanelProps { header?: React.ReactNode; children?: React.ReactNode; }", - "StepperParts": "export interface StepperParts { root?: HTMLAttributes; list?: HTMLAttributes; step?: HTMLAttributes; header?: ButtonHTMLAttributes; number?: HTMLAttributes; title?: HTMLAttributes; separator?: HTMLAttributes; panels?: HTMLAttributes; panel?: HTMLAttributes; }" + "StepperParts": "export interface StepperParts { root?: HTMLAttributes; list?: HTMLAttributes; step?: HTMLAttributes; header?: ButtonHTMLAttributes; number?: HTMLAttributes; title?: HTMLAttributes; separator?: HTMLAttributes; panels?: HTMLAttributes; panel?: HTMLAttributes; }", + "applyBeforeExecute": "export declare function applyBeforeExecute(onBeforeExecute: BeforeExecuteCallback, currentValues: TCommand): TCommand | Promise;" }, "./CommandForm": { "AutoCommandForm": "export declare function AutoCommandForm(props: AutoCommandFormProps): React.ReactElement;", @@ -181,7 +181,6 @@ "CheckboxParts": "export interface CheckboxParts { root?: HTMLAttributes; input?: InputHTMLAttributes; box?: HTMLAttributes; indicator?: HTMLAttributes; }", "ChipsField": "ChipsField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", "ChipsParts": "export interface ChipsParts { root?: HTMLAttributes; item?: HTMLAttributes; remove?: React.ButtonHTMLAttributes; input?: InputHTMLAttributes; }", - "clearFieldTypeProviders": "export declare function clearFieldTypeProviders(): void;", "ColorPickerField": "ColorPickerField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", "ColorPickerParts": "export interface ColorPickerParts { root?: HTMLAttributes; input?: InputHTMLAttributes; value?: HTMLAttributes; }", "CommandFormColumnDisplayName": "CommandFormColumnDisplayName = \"CommandFormColumn\"", @@ -191,10 +190,6 @@ "FieldTypeProvider": "export interface FieldTypeProvider { canHandle(propertyDescriptor: PropertyDescriptor): boolean; component: ComponentType; }", "InputTextField": "InputTextField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", "InputTextParts": "export interface InputTextParts { root?: InputHTMLAttributes; }", - "isCommandFormColumn": "export declare function isCommandFormColumn(component: unknown): boolean;", - "isCommandFormField": "export declare function isCommandFormField(component: unknown): boolean;", - "markAsCommandFormColumn": "export declare function markAsCommandFormColumn(component: T): T & CommandFormMarked;", - "markAsCommandFormField": "export declare function markAsCommandFormField(component: T): T & CommandFormMarked;", "MultiSelectField": "MultiSelectField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", "NumberField": "NumberField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", "NumberFieldParts": "export interface NumberFieldParts { root?: HTMLAttributes; input?: InputHTMLAttributes; }", @@ -207,14 +202,19 @@ "RadioParts": "export interface RadioParts { root?: HTMLAttributes; input?: InputHTMLAttributes; box?: HTMLAttributes; indicator?: HTMLAttributes; }", "RatingField": "RatingField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", "RatingParts": "export interface RatingParts { root?: HTMLAttributes; option?: HTMLAttributes; input?: InputHTMLAttributes; star?: HTMLAttributes; }", - "registerFieldTypeProvider": "export declare function registerFieldTypeProvider(provider: FieldTypeProvider): void;", - "resolveFieldTypeProvider": "export declare function resolveFieldTypeProvider(propertyDescriptor: PropertyDescriptor): FieldTypeProvider | undefined;", "SliderField": "SliderField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", "SliderParts": "export interface SliderParts { root?: HTMLAttributes; input?: InputHTMLAttributes; value?: HTMLAttributes; }", "TextAreaField": "TextAreaField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", "TextAreaParts": "export interface TextAreaParts { root?: TextareaHTMLAttributes; }", "ToggleSwitchField": "ToggleSwitchField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", - "ToggleSwitchParts": "export interface ToggleSwitchParts { root?: HTMLAttributes; input?: InputHTMLAttributes; control?: HTMLAttributes; handle?: HTMLAttributes; }" + "ToggleSwitchParts": "export interface ToggleSwitchParts { root?: HTMLAttributes; input?: InputHTMLAttributes; control?: HTMLAttributes; handle?: HTMLAttributes; }", + "clearFieldTypeProviders": "export declare function clearFieldTypeProviders(): void;", + "isCommandFormColumn": "export declare function isCommandFormColumn(component: unknown): boolean;", + "isCommandFormField": "export declare function isCommandFormField(component: unknown): boolean;", + "markAsCommandFormColumn": "export declare function markAsCommandFormColumn(component: T): T & CommandFormMarked;", + "markAsCommandFormField": "export declare function markAsCommandFormField(component: T): T & CommandFormMarked;", + "registerFieldTypeProvider": "export declare function registerFieldTypeProvider(provider: FieldTypeProvider): void;", + "resolveFieldTypeProvider": "export declare function resolveFieldTypeProvider(propertyDescriptor: PropertyDescriptor): FieldTypeProvider | undefined;" }, "./CommandForm/fields": { "AutoCommandForm": "export declare function AutoCommandForm(props: AutoCommandFormProps): React.ReactElement;", @@ -224,7 +224,6 @@ "CheckboxParts": "export interface CheckboxParts { root?: HTMLAttributes; input?: InputHTMLAttributes; box?: HTMLAttributes; indicator?: HTMLAttributes; }", "ChipsField": "ChipsField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", "ChipsParts": "export interface ChipsParts { root?: HTMLAttributes; item?: HTMLAttributes; remove?: React.ButtonHTMLAttributes; input?: InputHTMLAttributes; }", - "clearFieldTypeProviders": "export declare function clearFieldTypeProviders(): void;", "ColorPickerField": "ColorPickerField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", "ColorPickerParts": "export interface ColorPickerParts { root?: HTMLAttributes; input?: InputHTMLAttributes; value?: HTMLAttributes; }", "CommandFormColumnDisplayName": "CommandFormColumnDisplayName = \"CommandFormColumn\"", @@ -234,10 +233,6 @@ "FieldTypeProvider": "export interface FieldTypeProvider { canHandle(propertyDescriptor: PropertyDescriptor): boolean; component: ComponentType; }", "InputTextField": "InputTextField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", "InputTextParts": "export interface InputTextParts { root?: InputHTMLAttributes; }", - "isCommandFormColumn": "export declare function isCommandFormColumn(component: unknown): boolean;", - "isCommandFormField": "export declare function isCommandFormField(component: unknown): boolean;", - "markAsCommandFormColumn": "export declare function markAsCommandFormColumn(component: T): T & CommandFormMarked;", - "markAsCommandFormField": "export declare function markAsCommandFormField(component: T): T & CommandFormMarked;", "MultiSelectField": "MultiSelectField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", "NumberField": "NumberField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", "NumberFieldParts": "export interface NumberFieldParts { root?: HTMLAttributes; input?: InputHTMLAttributes; }", @@ -250,14 +245,19 @@ "RadioParts": "export interface RadioParts { root?: HTMLAttributes; input?: InputHTMLAttributes; box?: HTMLAttributes; indicator?: HTMLAttributes; }", "RatingField": "RatingField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", "RatingParts": "export interface RatingParts { root?: HTMLAttributes; option?: HTMLAttributes; input?: InputHTMLAttributes; star?: HTMLAttributes; }", - "registerFieldTypeProvider": "export declare function registerFieldTypeProvider(provider: FieldTypeProvider): void;", - "resolveFieldTypeProvider": "export declare function resolveFieldTypeProvider(propertyDescriptor: PropertyDescriptor): FieldTypeProvider | undefined;", "SliderField": "SliderField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", "SliderParts": "export interface SliderParts { root?: HTMLAttributes; input?: InputHTMLAttributes; value?: HTMLAttributes; }", "TextAreaField": "TextAreaField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", "TextAreaParts": "export interface TextAreaParts { root?: TextareaHTMLAttributes; }", "ToggleSwitchField": "ToggleSwitchField: ((props: import(\"@cratis/arc.react/commands\").CommandFormFieldComponentProps) => React.ReactElement) & import(\"@cratis/arc.react/commands\").CommandFormMarked", - "ToggleSwitchParts": "export interface ToggleSwitchParts { root?: HTMLAttributes; input?: InputHTMLAttributes; control?: HTMLAttributes; handle?: HTMLAttributes; }" + "ToggleSwitchParts": "export interface ToggleSwitchParts { root?: HTMLAttributes; input?: InputHTMLAttributes; control?: HTMLAttributes; handle?: HTMLAttributes; }", + "clearFieldTypeProviders": "export declare function clearFieldTypeProviders(): void;", + "isCommandFormColumn": "export declare function isCommandFormColumn(component: unknown): boolean;", + "isCommandFormField": "export declare function isCommandFormField(component: unknown): boolean;", + "markAsCommandFormColumn": "export declare function markAsCommandFormColumn(component: T): T & CommandFormMarked;", + "markAsCommandFormField": "export declare function markAsCommandFormField(component: T): T & CommandFormMarked;", + "registerFieldTypeProvider": "export declare function registerFieldTypeProvider(provider: FieldTypeProvider): void;", + "resolveFieldTypeProvider": "export declare function resolveFieldTypeProvider(propertyDescriptor: PropertyDescriptor): FieldTypeProvider | undefined;" }, "./CommandStepper": { "CommandStepper": "CommandStepper: (props: CommandStepperProps) => React.JSX.Element", @@ -269,9 +269,9 @@ "StepperParts": "export interface StepperParts { root?: HTMLAttributes; list?: HTMLAttributes; step?: HTMLAttributes; header?: ButtonHTMLAttributes; number?: HTMLAttributes; title?: HTMLAttributes; separator?: HTMLAttributes; panels?: HTMLAttributes; panel?: HTMLAttributes; }" }, "./Common": { + "ActionMenuItem": "export interface ActionMenuItem { label?: string; icon?: ReactNode; command?: () => void; disabled?: boolean; className?: string; severity?: ButtonSeverity; template?: (item: ActionMenuItem) => ReactNode; }", "ActionMenubar": "ActionMenubar: (props: ActionMenubarProps) => import(\"react\").JSX.Element", "ActionMenubarProps": "export interface ActionMenubarProps { focusMode?: ToolbarFocusMode; model: ActionMenuItem[]; className?: string; 'aria-label'?: string; pt?: ButtonParts; ptOptions?: object; unstyled?: boolean; }", - "ActionMenuItem": "export interface ActionMenuItem { label?: string; icon?: ReactNode; command?: () => void; disabled?: boolean; className?: string; severity?: ButtonSeverity; template?: (item: ActionMenuItem) => ReactNode; }", "BreadcrumbItem": "export interface BreadcrumbItem { label: ReactNode; href?: string; onNavigate?: () => void; }", "Breadcrumbs": "Breadcrumbs: (props: BreadcrumbsProps) => import(\"react\").JSX.Element", "BreadcrumbsPartAttributes": "export type BreadcrumbsPartAttributes = Pick, 'className' | 'style' | 'title'> & { [dataAttribute: `data-${string}`]: string | number | boolean | undefined; };", @@ -302,7 +302,6 @@ "CratisComponentsProviderProps": "export interface CratisComponentsProviderProps { value?: CratisComponentsConfig; toaster?: boolean | ToasterProps; library?: unstable_UiLibrary | readonly unstable_UiLibrary[]; libraryMode?: 'strict' | 'degrade'; rendererFallback?: 'core' | 'throw'; overlayEnvironment?: CratisOverlayEnvironment; rendererSetup?: CratisRendererSetup; children: ReactNode; }", "CratisDataTableMessages": "export interface CratisDataTableMessages { selectRow?: string; selectAllRows?: string; search?: string; searchAriaLabel?: string; loading?: string; failed?: string; unauthorized?: string; }", "CratisDatePickerMessages": "export interface CratisDatePickerMessages { today?: string; clear?: string; openCalendar?: string; previousMonth?: string; nextMonth?: string; label?: string; }", - "cratisDefaults": "cratisDefaults: CratisComponentsConfig", "CratisDialogMessages": "export interface CratisDialogMessages { ok?: string; cancel?: string; yes?: string; no?: string; close?: string; }", "CratisDropdownMessages": "export interface CratisDropdownMessages { showOptions?: string; clearSelection?: string; }", "CratisFilterMessages": "export interface CratisFilterMessages { label?: string; searchAriaLabel?: string; }", @@ -323,9 +322,7 @@ "IconButtonProps": "export interface IconButtonProps extends Omit { icon: ReactNode; 'aria-label': string; pt?: IconButtonParts; }", "IconDisplay": "IconDisplay: (props: IconDisplayProps) => import(\"react\").JSX.Element", "IconDisplayProps": "export interface IconDisplayProps { icon: Icon; className?: string; }", - "mergeCratisComponentsConfig": "mergeCratisComponentsConfig: (value: CratisComponentsConfig | undefined) => CratisComponentsConfig", "NormalizedIconClass": "export interface NormalizedIconClass { className: string; }", - "normalizeIconClass": "export declare function normalizeIconClass(icon: string): NormalizedIconClass;", "NumberInput": "NumberInput: (props: NumberInputProps) => import(\"react\").JSX.Element", "NumberInputCommitReason": "export declare enum NumberInputCommitReason { Blur = \"blur\", Enter = \"enter\", Paste = \"paste\", Step = \"step\" }", "NumberInputPartAttributes": "export interface NumberInputPartAttributes { className?: string; style?: Readonly>; title?: string; [attribute: `data-${string}`]: string | number | boolean | undefined; }", @@ -368,6 +365,9 @@ "Tooltip": "Tooltip: (props: TooltipProps) => ReactElement>", "TooltipPosition": "export type TooltipPosition = 'top' | 'right' | 'bottom' | 'left';", "TooltipProps": "export interface TooltipProps { content?: ReactNode; position?: TooltipPosition; disabled?: boolean; className?: string; children: ReactElement; }", + "cratisDefaults": "cratisDefaults: CratisComponentsConfig", + "mergeCratisComponentsConfig": "mergeCratisComponentsConfig: (value: CratisComponentsConfig | undefined) => CratisComponentsConfig", + "normalizeIconClass": "export declare function normalizeIconClass(icon: string): NormalizedIconClass;", "useCratisComponentsConfig": "useCratisComponentsConfig: () => CratisComponentsConfig" }, "./DataPage": { @@ -399,9 +399,9 @@ "DataTableCustomFilterMatchMode": "export type DataTableCustomFilterMatchMode = string & { readonly [customFilterMatchMode]: true; };", "DataTableFilterConstraint": "export interface DataTableFilterConstraint { value: unknown; matchMode?: DataTableFilterMatchMode; }", "DataTableFilterEntry": "export type DataTableFilterEntry = DataTableFilterConstraint | DataTableOperatorFilterConstraint;", + "DataTableFilterMatchMode": "DataTableFilterMatchMode: { readonly StartsWith: 'startsWith'; readonly Contains: 'contains'; readonly NotContains: 'notContains'; readonly EndsWith: 'endsWith'; readonly Equals: 'equals'; readonly NotEquals: 'notEquals'; readonly In: 'in'; readonly Between: 'between'; readonly LessThan: 'lt'; readonly LessThanOrEqual: 'lte'; readonly GreaterThan: 'gt'; readonly GreaterThanOrEqual: 'gte'; readonly DateIs: 'dateIs'; readonly DateIsNot: 'dateIsNot'; readonly DateBefore: 'dateBefore'; readonly DateAfter: 'dateAfter'; } | export type DataTableFilterMatchMode = (typeof DataTableFilterMatchMode)[keyof typeof DataTableFilterMatchMode] | DataTableCustomFilterMatchMode | (string & Record);", "DataTableFilterMatcher": "export type DataTableFilterMatcher = (value: unknown, filter: unknown, locale?: string) => boolean;", "DataTableFilterMatcherRegistration": "export interface DataTableFilterMatcherRegistration { matchMode: DataTableCustomFilterMatchMode; unregister(): void; }", - "DataTableFilterMatchMode": "DataTableFilterMatchMode: { readonly StartsWith: 'startsWith'; readonly Contains: 'contains'; readonly NotContains: 'notContains'; readonly EndsWith: 'endsWith'; readonly Equals: 'equals'; readonly NotEquals: 'notEquals'; readonly In: 'in'; readonly Between: 'between'; readonly LessThan: 'lt'; readonly LessThanOrEqual: 'lte'; readonly GreaterThan: 'gt'; readonly GreaterThanOrEqual: 'gte'; readonly DateIs: 'dateIs'; readonly DateIsNot: 'dateIsNot'; readonly DateBefore: 'dateBefore'; readonly DateAfter: 'dateAfter'; } | export type DataTableFilterMatchMode = (typeof DataTableFilterMatchMode)[keyof typeof DataTableFilterMatchMode] | DataTableCustomFilterMatchMode | (string & Record);", "DataTableFilterMeta": "export type DataTableFilterMeta = Record;", "DataTableForObservableQuery": "DataTableForObservableQuery: | IObservableQueryFor, TDataType extends object, TArguments extends object>(props: DataTableForObservableQueryProps) => import(\"react\").JSX.Element", "DataTableForObservableQueryProps": "export interface DataTableForObservableQueryProps | IObservableQueryFor, TDataType extends object, TArguments extends object> { children?: ReactNode; query: Constructor; queryArguments?: TArguments; emptyMessage: string; loadingMessage?: ReactNode; failureMessage?: ReactNode; unauthorizedMessage?: ReactNode; dataKey?: string | undefined; selection?: TDataType | undefined | null; onSelectionChange?(event: DataTableSelectionChangeEvent): void; selectionMode?: 'single' | 'multiple'; selectedItems?: TDataType[]; onSelectedItemsChange?(items: TDataType[]): void; globalFilterFields?: string[] | undefined; globalSearchPlaceholder?: string; globalSearchAriaLabel?: string; defaultFilters?: DataTableFilterMeta; clientFiltering?: boolean; className?: string; pt?: DataTableParts; ptOptions?: object; unstyled?: boolean; paginatorClassName?: string; paginatorPt?: TablePaginatorParts; paginatorPtOptions?: object; paginatorAriaLabels?: TablePaginatorProps['ariaLabels']; }", @@ -412,20 +412,20 @@ "DataTableRowClickEvent": "export interface DataTableRowClickEvent { data: TData; index: number; }", "DataTableSelectionChangeEvent": "export interface DataTableSelectionChangeEvent { value: TData | null; originalEvent?: SyntheticEvent; }", "DataTableStatus": "export declare enum DataTableStatus { Ready = \"ready\", Loading = \"loading\", Failed = \"failed\", Unauthorized = \"unauthorized\" }", - "defaultColumnFilterMenuLabels": "defaultColumnFilterMenuLabels: ColumnFilterMenuLabels", - "registerDataTableFilterMatcher": "registerDataTableFilterMatcher: (name: string, matcher: DataTableFilterMatcher) => DataTableFilterMatcherRegistration", - "resolveDataTableFilterMatcher": "resolveDataTableFilterMatcher: (name: string) => DataTableFilterMatcher | undefined", "TablePaginator": "TablePaginator: (props: TablePaginatorProps) => import(\"react\").ReactElement>", "TablePaginatorParts": "export interface TablePaginatorParts { root?: HTMLAttributes; range?: HTMLAttributes; info?: HTMLAttributes; first?: ButtonParts; previous?: ButtonParts; next?: ButtonParts; last?: ButtonParts; }", "TablePaginatorProps": "export interface TablePaginatorProps { page: number; pageCount: number; onPageChange: (page: number) => void; totalItems?: number; pageSize?: number; ariaLabels?: { navigation?: string; first?: string; previous?: string; next?: string; last?: string; }; className?: string; pt?: TablePaginatorParts; ptOptions?: object; }", + "defaultColumnFilterMenuLabels": "defaultColumnFilterMenuLabels: ColumnFilterMenuLabels", + "registerDataTableFilterMatcher": "registerDataTableFilterMatcher: (name: string, matcher: DataTableFilterMatcher) => DataTableFilterMatcherRegistration", + "resolveDataTableFilterMatcher": "resolveDataTableFilterMatcher: (name: string) => DataTableFilterMatcher | undefined", "unregisterDataTableFilterMatcher": "unregisterDataTableFilterMatcher: (registration: DataTableFilterMatcherRegistration) => void" }, "./Dialogs": { "BusyIndicatorDialog": "BusyIndicatorDialog: (props: BusyIndicatorDialogRequest) => import(\"react\").JSX.Element", "CancelCallback": "export type CancelCallback = () => boolean | void | Promise | Promise;", "CloseDialog": "export type CloseDialog = (result: DialogResult) => boolean | void | Promise | Promise;", - "ConfirmationDialog": "ConfirmationDialog: () => import(\"react\").JSX.Element", "ConfirmCallback": "export type ConfirmCallback = () => boolean | void | Promise | Promise;", + "ConfirmationDialog": "ConfirmationDialog: () => import(\"react\").JSX.Element", "Dialog": "Dialog: (props: DialogProps) => import(\"react\").ReactElement>", "DialogInitialFocus": "export declare enum DialogInitialFocus { Confirm = 1, Cancel = 2, Content = 3 }", "DialogParts": "export interface DialogParts { backdrop?: DialogPartAttributes; positioner?: DialogPartAttributes; root?: DialogPartAttributes; header?: DialogPartAttributes; title?: DialogPartAttributes; subtitle?: DialogPartAttributes; close?: DialogButtonAttributes; content?: DialogPartAttributes; footer?: DialogPartAttributes; confirm?: DialogButtonAttributes; cancel?: DialogButtonAttributes; }", @@ -459,7 +459,6 @@ "DropdownProps": "export interface DropdownProps { value?: T; options?: unknown[]; optionLabel?: string; optionValue?: string; placeholder?: string; filter?: boolean; filterPlaceholder?: string; multiple?: boolean; showClear?: boolean; invalid?: boolean; disabled?: boolean; className?: string; style?: CSSProperties; id?: string; inputId?: string; panelClassName?: string; name?: string; tabIndex?: number; 'aria-label'?: string; 'aria-labelledby'?: string; 'aria-describedby'?: string; ariaLabel?: string; ariaLabelledBy?: string; ariaDescribedBy?: string; ariaInvalid?: boolean; onChange?: ChangeHandler; onBlur?: FocusEventHandler; pt?: DropdownParts; ptOptions?: object; unstyled?: boolean; }" }, "./Filter": { - "buildHistogram": "export declare function buildHistogram(values: number[], min: number, max: number, bucketCount: number, provided?: HistogramBucket[]): RenderedHistogramBucket[];", "CheckboxListFilter": "export declare function CheckboxListFilter(props: CheckboxListFilterProps): import(\"react\").JSX.Element;", "CheckboxListFilterProps": "export interface CheckboxListFilterProps { options: FilterOption[]; selected: Set; multi?: boolean; onToggle: (optionKey: string) => void; searchable?: boolean; searchPlaceholder?: string; searchAriaLabel?: string; autoFocusSearch?: boolean; emptyMessage?: string; noMatchesMessage?: string; name?: string; }", "CustomFilterValues": "export type CustomFilterValues = Record;", @@ -476,28 +475,29 @@ "RangeHistogramFilter": "export declare function RangeHistogramFilter(props: RangeHistogramFilterProps): import(\"react\").JSX.Element;", "RangeHistogramFilterProps": "export interface RangeHistogramFilterProps { values?: FilterValue[]; histogram?: HistogramBucket[]; min: number; max: number; buckets?: number; selectedRange: [ number, number ] | null; onChange: ChangeHandler<[ number, number ] | null>; formatValue?: (value: number) => string; itemsLabel?: string; minimumAriaLabel?: string; maximumAriaLabel?: string; }", "RangeValues": "export type RangeValues = Record;", - "useFilterState": "export declare function useFilterState(filters: FilterDefinition[] | undefined): UseFilterStateResult;", - "UseFilterStateResult": "export interface UseFilterStateResult { filterValues: FilterValues; rangeValues: RangeValues; customValues: CustomFilterValues; expandedFilterKey: string | null; setExpandedFilterKey: (key: string | null) => void; handleToggleFilter: (filterKey: string, optionKey: string, multi: boolean) => void; handleClearFilter: (filterKey: string) => void; handleRangeChange: (filterKey: string, range: [ number, number ] | null) => void; handleCustomValueChange: (filterKey: string, value: unknown) => void; }" + "UseFilterStateResult": "export interface UseFilterStateResult { filterValues: FilterValues; rangeValues: RangeValues; customValues: CustomFilterValues; expandedFilterKey: string | null; setExpandedFilterKey: (key: string | null) => void; handleToggleFilter: (filterKey: string, optionKey: string, multi: boolean) => void; handleClearFilter: (filterKey: string) => void; handleRangeChange: (filterKey: string, range: [ number, number ] | null) => void; handleCustomValueChange: (filterKey: string, value: unknown) => void; }", + "buildHistogram": "export declare function buildHistogram(values: number[], min: number, max: number, bucketCount: number, provided?: HistogramBucket[]): RenderedHistogramBucket[];", + "useFilterState": "export declare function useFilterState(filters: FilterDefinition[] | undefined): UseFilterStateResult;" }, "./Notifications": { - "getToastSnapshot": "getToastSnapshot: () => ToastRecord[]", - "setToastDispatch": "setToastDispatch: (dispatch: ToastDispatch) => (() => void)", - "subscribeToToasts": "subscribeToToasts: (listener: () => void) => (() => void)", - "toast": "toast: ToastFunction", - "toastCommandResult": "export declare function toastCommandResult(result: ICommandResult, options?: ToastCommandResultOptions): boolean;", "ToastCommandResultOptions": "export interface ToastCommandResultOptions { successTitle?: string; successDescription?: string; unauthorizedTitle?: string; validationTitle?: string; exceptionTitle?: string; showSuccess?: boolean; }", "ToastDispatch": "export interface ToastDispatch { show(options: ToastOptions): ToastId; update(id: ToastId, updates: Partial): ToastId; dismiss(id?: ToastId): void; promise(promise: Promise, options: ToastPromiseOptions): Promise; success(options: ToastOptions): ToastId; info(options: ToastOptions): ToastId; warn(options: ToastOptions): ToastId; error(options: ToastOptions): ToastId; secondary(options: ToastOptions): ToastId; contrast(options: ToastOptions): ToastId; }", - "Toaster": "Toaster: (props: ToasterProps) => import(\"react\").ReactPortal | null", - "ToasterPassThrough": "export interface ToasterPassThrough { region?: HTMLAttributes; toast?: HTMLAttributes; icon?: HTMLAttributes; content?: HTMLAttributes; title?: HTMLAttributes; description?: HTMLAttributes; close?: ButtonHTMLAttributes; action?: ButtonHTMLAttributes; }", - "ToasterPosition": "export type ToasterPosition = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';", - "ToasterProps": "export interface ToasterProps { position?: ToasterPosition; limit?: number; timeout?: number; dismissAriaLabel?: string; regionAriaLabel?: string; pt?: ToasterPassThrough; }", "ToastFunction": "export interface ToastFunction { (options: ToastOptions): ToastId; update(id: ToastId, updates: Partial): ToastId; dismiss(id?: ToastId): void; promise(promise: Promise, options: ToastPromiseOptions): Promise; success(options: ToastOptions): ToastId; info(options: ToastOptions): ToastId; warn(options: ToastOptions): ToastId; error(options: ToastOptions): ToastId; secondary(options: ToastOptions): ToastId; contrast(options: ToastOptions): ToastId; }", "ToastId": "export type ToastId = string | number;", "ToastOptions": "export interface ToastOptions { id?: ToastId; title?: ReactNode | string; description?: ReactNode | string; action?: ButtonHTMLAttributes; dismissible?: boolean; severity?: ToastSeverity; loading?: boolean; icon?: ReactNode; render?: ReactElement; duration?: number; group?: string; promise?: unknown; data?: Record; onDismiss?: (toast: ToastOptions) => void; onTimeout?: (toast: ToastOptions) => void; }", "ToastPromiseOptions": "export interface ToastPromiseOptions { loading: ToastOptions; success?: ToastOptions | ((data: T) => ToastOptions | void); error?: ToastOptions | ((error: unknown) => ToastOptions | void); }", "ToastRecord": "export interface ToastRecord extends ToastOptions { id: ToastId; }", "ToastSeverity": "export type ToastSeverity = 'normal' | 'success' | 'info' | 'warn' | 'error' | 'secondary' | 'contrast';", - "ToastType": "export type ToastType = ToastOptions;" + "ToastType": "export type ToastType = ToastOptions;", + "Toaster": "Toaster: (props: ToasterProps) => import(\"react\").ReactPortal | null", + "ToasterPassThrough": "export interface ToasterPassThrough { region?: HTMLAttributes; toast?: HTMLAttributes; icon?: HTMLAttributes; content?: HTMLAttributes; title?: HTMLAttributes; description?: HTMLAttributes; close?: ButtonHTMLAttributes; action?: ButtonHTMLAttributes; }", + "ToasterPosition": "export type ToasterPosition = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';", + "ToasterProps": "export interface ToasterProps { position?: ToasterPosition; limit?: number; timeout?: number; dismissAriaLabel?: string; regionAriaLabel?: string; pt?: ToasterPassThrough; }", + "getToastSnapshot": "getToastSnapshot: () => ToastRecord[]", + "setToastDispatch": "setToastDispatch: (dispatch: ToastDispatch) => (() => void)", + "subscribeToToasts": "subscribeToToasts: (listener: () => void) => (() => void)", + "toast": "toast: ToastFunction", + "toastCommandResult": "export declare function toastCommandResult(result: ICommandResult, options?: ToastCommandResultOptions): boolean;" }, "./ObjectContentEditor": { "ObjectContentEditor": "ObjectContentEditor: (props: ObjectContentEditorProps) => React.JSX.Element", @@ -508,8 +508,6 @@ "ObjectNavigationalBarProps": "export interface ObjectNavigationalBarProps { navigationPath: string[]; onNavigate: (index: number) => void; backLabel?: string; className?: string; }" }, "./PivotViewer": { - "getPropertyPath": "export declare function getPropertyPath(accessor: PropertyAccessor): string;", - "getValueByPath": "export declare function getValueByPath(item: TItem, path: string): PivotPropertyValue;", "PivotDimension": "export interface PivotDimension { key: string; label: string; getValue: (item: TItem) => PivotPrimitive; formatValue?: (value: PivotPrimitive) => string; sort?: (a: PivotGroup, b: PivotGroup) => number; }", "PivotFilter": "export interface PivotFilter { key: string; label: string; getValue: (item: TItem) => PivotPrimitive; multi?: boolean; options?: PivotFilterOption[]; sort?: (a: PivotFilterOption, b: PivotFilterOption) => number; type?: 'string' | 'number' | 'date' | 'custom'; buckets?: number; renderEditor?: (props: FilterEditorProps) => ReactNode; }", "PivotFilterOption": "export interface PivotFilterOption { key: string; label: string; value: PivotPrimitive; count: number; }", @@ -520,56 +518,12 @@ "PivotViewerColors": "export interface PivotViewerColors { primaryColor: string; primaryColorText: string; primary500: string; surfaceGround: string; surfaceCard: string; surfaceSection: string; surfaceOverlay: string; surfaceBorder: string; textColor: string; textColorSecondary: string; highlightBg: string; maskbg: string; focusRing: string; }", "PivotViewerLabels": "export interface PivotViewerLabels { filters?: string; search?: string; searchGroup?: (groupLabel: string) => string; sortBy?: string; collection?: string; grouped?: string; zoomOut?: string; zoomLevel?: string; zoom?: (percent: number) => string; editZoomLevel?: string; resetZoom?: string; zoomIn?: string; itemCount?: (count: number) => string; loading?: string; viewport?: string; }", "PivotViewerProps": "export interface PivotViewerProps { data: TItem[]; dimensions: PivotDimension[]; filters?: PivotFilter[]; defaultDimensionKey?: string; cardRenderer: (item: TItem) => { title: string; labels?: string[]; values?: string[]; }; detailRenderer?: (item: TItem, onClose: () => void) => ReactNode; getItemId?: (item: TItem, index: number) => string | number; searchFields?: PropertyAccessor[]; title?: string; className?: string; emptyContent?: ReactNode; isLoading?: boolean; loadingLabel?: string; labels?: PivotViewerLabels; colors?: Partial; }", - "PropertyAccessor": "export type PropertyAccessor = (item: TItem) => PivotPropertyValue;" - }, - "./renderer": { - "CRATIS_PRESENTATION_ABI_VERSION": "CRATIS_PRESENTATION_ABI_VERSION: 1", - "CRATIS_PRESENTATION_PROFILE": "CRATIS_PRESENTATION_PROFILE: 'stable-presentation/v1'", - "CratisOverlayEnvironment": "export interface CratisOverlayEnvironment { getContainer(): HTMLElement | null; }", - "CratisPresentationCapabilities": "export type CratisPresentationCapabilities = readonly [ 'slot.render', 'parts.passthrough', 'ssr.staticRender', ...CratisPresentationOptionalCapabilityId[] ];", - "CratisPresentationCapabilityId": "export type CratisPresentationCapabilityId = 'slot.render' | 'parts.passthrough' | 'ssr.staticRender' | 'rtl' | 'forcedColors' | 'motion.reduced';", - "CratisPresentationSlotDeclaration": "export interface CratisPresentationSlotDeclaration { readonly mode: 'presentation'; readonly fidelity: 'native' | 'emulated'; readonly render: ComponentType; }", - "CratisPresentationSlotId": "export type CratisPresentationSlotId = (typeof cratisPresentationSlotIds)[number];", - "cratisPresentationSlotIds": "cratisPresentationSlotIds: readonly [ \"common.button\", \"common.iconButton\", \"common.textInput\", \"common.textArea\", \"common.checkbox\", \"common.radio\", \"common.switch\", \"common.progress\", \"common.surface\" ]", - "CratisPresentationSlotMap": "export type CratisPresentationSlotMap = { readonly [SlotId in CratisPresentationSlotId]: CratisPresentationSlotDeclaration; };", - "CratisPresentationSlots": "export interface CratisPresentationSlots { readonly 'common.button': ButtonProps; readonly 'common.iconButton': IconButtonProps; readonly 'common.textInput': TextInputProps; readonly 'common.textArea': TextAreaProps; readonly 'common.checkbox': CheckboxProps; readonly 'common.radio': RadioProps; readonly 'common.switch': SwitchProps; readonly 'common.progress': ProgressBarProps; readonly 'common.surface': SurfaceProps; }", - "CratisPresentationUiLibrary": "export interface CratisPresentationUiLibrary { readonly id: string; readonly displayName: string; readonly abi: typeof CRATIS_PRESENTATION_ABI_VERSION; readonly level: 'primitive'; readonly profile: typeof CRATIS_PRESENTATION_PROFILE; readonly profileSlots: typeof cratisPresentationSlotIds; readonly capabilities: CratisPresentationCapabilities; readonly slots: CratisPresentationSlotMap; readonly Provider?: ComponentType; }", - "CratisPresentationUiLibraryProviderProps": "export interface CratisPresentationUiLibraryProviderProps { readonly setup: CratisRendererSetup; readonly children: ReactNode; }", - "CratisRendererSetup": "export type CratisRendererSetup = Readonly<{ [Key in keyof CratisRendererSetupExtensions | keyof unstable_RendererSetupExtensions]?: boolean; }>;", - "CratisRendererSetupExtensions": "export interface CratisRendererSetupExtensions extends Record { }", - "definePresentationUiLibrary": "definePresentationUiLibrary: (library: CratisPresentationUiLibrary) => CratisPresentationUiLibrary", - "unstable_AdapterDiagnostic": "export interface unstable_AdapterDiagnostic { readonly code: unstable_AdapterErrorCode; readonly adapterId: string; readonly slotId?: unstable_SlotId; readonly message: string; readonly remedy: string; }", - "unstable_AdapterError": "export declare class unstable_AdapterError extends Error { readonly diagnostic: unstable_AdapterDiagnostic; readonly code: unstable_AdapterErrorCode; constructor(diagnostic: unstable_AdapterDiagnostic); }", - "unstable_AdapterErrorCode": "export type unstable_AdapterErrorCode = (typeof unstable_adapterErrorCodes)[keyof typeof unstable_adapterErrorCodes];", - "unstable_adapterErrorCodes": "unstable_adapterErrorCodes: Readonly<{ readonly abiMismatch: 'CRATIS-UI-1001'; readonly missingRequirement: 'CRATIS-UI-1002'; readonly strictProfileFallback: 'CRATIS-UI-1003'; readonly missingUpstreamPeer: 'CRATIS-UI-1004'; readonly missingLicenseKey: 'CRATIS-UI-1005'; readonly nestedLibraries: 'CRATIS-UI-1006'; readonly ssrContractViolation: 'CRATIS-UI-1007'; readonly duplicateResolution: 'CRATIS-UI-1008'; readonly deprecatedSlot: 'CRATIS-UI-1009'; }>", - "unstable_BehaviorMode": "export type unstable_BehaviorMode = 'presentation' | 'atomic';", - "unstable_CapabilityId": "export type unstable_CapabilityId = 'slot.render' | 'parts.passthrough' | 'focus.trap' | 'focus.restore' | 'overlay.portal' | 'collection.virtualize' | 'selection.multi' | 'datetime.i18n' | 'form.validationMessage' | 'theme.tokens' | 'ssr.staticRender' | 'rtl' | 'forcedColors' | 'motion.reduced' | 'machine.binding' | 'paging.server';", - "unstable_composeUiLibraries": "unstable_composeUiLibraries: (...libraries: readonly unstable_UiLibrary[]) => unstable_UiLibrary", - "unstable_CRATIS_UI_ABI_VERSION": "unstable_CRATIS_UI_ABI_VERSION = 1", - "unstable_CratisOverlayEnvironment": "export type unstable_CratisOverlayEnvironment = CratisOverlayEnvironment;", - "unstable_CratisSlots": "export interface unstable_CratisSlots extends Record { } | interface unstable_CratisSlots { 'common.button': ButtonProps; 'common.iconButton': IconButtonProps; 'common.textInput': TextInputProps; 'common.textArea': TextAreaProps; 'common.checkbox': CheckboxProps; 'common.radio': RadioProps; 'common.switch': SwitchProps; 'common.progress': ProgressBarProps; 'common.surface': SurfaceProps; 'common.tooltip': TooltipProps; 'dropdown.select': DropdownProps; 'dialogs.dialog': DialogProps; 'display.datePicker': DatePickerInputProps; 'datatables.paginator': TablePaginatorProps; }", - "unstable_defaultOverlayEnvironment": "unstable_defaultOverlayEnvironment: unstable_CratisOverlayEnvironment", - "unstable_defineUiLibrary": "unstable_defineUiLibrary: (library: T) => T", - "unstable_Fidelity": "export type unstable_Fidelity = 'native' | 'emulated' | 'unsupported';", - "unstable_RendererScope": "unstable_RendererScope: (props: unstable_RendererScopeProps) => string | number | bigint | boolean | import(\"react\").JSX.Element | Iterable | Promise | import(\"react\").ReactElement> | import(\"react\").ReactPortal | null | undefined> | null | undefined", - "unstable_RendererScopeProps": "export interface unstable_RendererScopeProps { readonly use: unstable_UiLibrary | readonly unstable_UiLibrary[]; readonly only?: readonly unstable_SlotId[]; readonly children: ReactNode; }", - "unstable_RendererSetup": "export type unstable_RendererSetup = CratisRendererSetup;", - "unstable_RendererSetupExtensions": "export interface unstable_RendererSetupExtensions extends CratisRendererSetupExtensions { }", - "unstable_SlotDeclaration": "export interface unstable_SlotDeclaration { readonly mode: unstable_BehaviorMode; readonly fidelity: unstable_Fidelity; readonly render: ComponentType; }", - "unstable_SlotId": "export type unstable_SlotId = keyof unstable_CratisSlots;", - "unstable_SlotMap": "export type unstable_SlotMap = { readonly [K in unstable_SlotId]?: unstable_SlotDeclaration; };", - "unstable_UiLibrary": "export interface unstable_UiLibrary { readonly id: string; readonly displayName: string; readonly abi: number; readonly level: 'full' | 'primitive' | 'behavior' | 'portal' | 'theme'; readonly profile: string; readonly profileSlots?: readonly unstable_SlotId[]; readonly capabilities: readonly unstable_CapabilityId[]; readonly slots: unstable_SlotMap; readonly Provider?: ComponentType; readonly preflight?: () => readonly unstable_AdapterDiagnostic[]; }", - "unstable_UiLibraryProviderProps": "export type unstable_UiLibraryProviderProps = CratisPresentationUiLibraryProviderProps;", - "unstable_useCapability": "unstable_useCapability: (capability: unstable_CapabilityId) => boolean", - "unstable_useOverlayEnvironment": "unstable_useOverlayEnvironment: () => unstable_CratisOverlayEnvironment", - "unstable_useRendererId": "unstable_useRendererId: () => string" - }, - "./renderer/builtin": { - "unstable_cratisBuiltIn": "unstable_cratisBuiltIn: unstable_UiLibrary" + "PropertyAccessor": "export type PropertyAccessor = (item: TItem) => PivotPropertyValue;", + "getPropertyPath": "export declare function getPropertyPath(accessor: PropertyAccessor): string;", + "getValueByPath": "export declare function getValueByPath(item: TItem, path: string): PivotPropertyValue;" }, "./SchemaEditor": { "DEFAULT_TYPE_FORMATS": "DEFAULT_TYPE_FORMATS: TypeFormat[]", - "defaultSchemaEditorLabels": "defaultSchemaEditorLabels: SchemaEditorLabels", "Json": "export type Json = string | number | boolean | null | Json[] | { [key: string]: Json; };", "JsonSchema": "export interface JsonSchema { title?: string; name?: string; $id?: string; $ref?: string; type?: string; format?: string; description?: string; properties?: Record; items?: JsonSchema; required?: string[]; definitions?: Record; }", "JsonSchemaProperty": "export interface JsonSchemaProperty { id?: string; name?: string; type?: string; format?: string; description?: string; items?: JsonSchema; properties?: Record; required?: string[]; $ref?: string; }", @@ -577,21 +531,22 @@ "SchemaEditor": "SchemaEditor: (props: SchemaEditorProps) => import(\"react\").JSX.Element", "SchemaEditorLabels": "export interface SchemaEditorLabels { edit: string; save: string; cancel: string; addProperty: string; actions: string; navigateBack: string; emptyMessage: string; navigateToItemDefinition: string; navigateToProperties: string; propertyName: string; propertyType: string; arrayItemType: string; deleteProperty: string; invalidJson: string; }", "SchemaEditorProps": "export interface SchemaEditorProps { schema: JsonSchema; eventTypeName?: string; canEdit?: boolean; canNotEditReason?: string; onChange?: ChangeHandler; onSave?: () => void; onCancel?: () => void; editMode?: boolean; saveDisabled?: boolean; cancelDisabled?: boolean; typeFormats?: TypeFormat[]; className?: string; labels?: Partial; }", - "TypeFormat": "export interface TypeFormat { jsonType: string; format: string; }" + "TypeFormat": "export interface TypeFormat { jsonType: string; format: string; }", + "defaultSchemaEditorLabels": "defaultSchemaEditorLabels: SchemaEditorLabels" }, "./TimeMachine": { - "defaultTimeMachineLabels": "defaultTimeMachineLabels: TimeMachineLabels", "Event": "export interface Event { sequenceNumber: number; type: string; occurred: Date; content: Record; }", "EventsView": "EventsView: (props: EventsViewProps) => import(\"react\").JSX.Element", "EventsViewParts": "export interface EventsViewParts { timeline?: HTMLAttributes; event?: HTMLAttributes; separator?: HTMLAttributes; marker?: HTMLAttributes; connector?: HTMLAttributes; content?: HTMLAttributes; }", "EventsViewProps": "export interface EventsViewProps { events: Event[]; className?: string; pt?: EventsViewParts; ptOptions?: object; unstyled?: boolean; labels?: TimeMachineLabels; }", "Properties": "Properties: React.FC", "ReadModelView": "ReadModelView: React.FC", - "TimelineEntry": "export interface TimelineEntry { id: string; timestamp: Date; label: string; }", "TimeMachine": "TimeMachine: React.FC", "TimeMachineLabels": "export interface TimeMachineLabels { readModelView: string; eventsView: string; previousVersion: string; nextVersion: string; showRelatedEvents: string; showReadModelSnapshot: string; scrollToTop: string; scrollToBottom: string; eventTimelineRegion: string; readModelSnapshotRegion: string; relatedEventsRegion: string; }", "TimeMachineProps": "export interface TimeMachineProps { versions: Version[]; currentVersionIndex?: number; onVersionChange?: (index: number) => void; scrollSensitivity?: number; labels?: Partial; }", - "Version": "export interface Version { id: string; timestamp: Date; label: string; content: React.ReactNode; events?: Event[]; }" + "TimelineEntry": "export interface TimelineEntry { id: string; timestamp: Date; label: string; }", + "Version": "export interface Version { id: string; timestamp: Date; label: string; content: React.ReactNode; events?: Event[]; }", + "defaultTimeMachineLabels": "defaultTimeMachineLabels: TimeMachineLabels" }, "./Toolbar": { "Toolbar": "Toolbar: (props: ToolbarProps) => import(\"react\").JSX.Element", @@ -628,22 +583,70 @@ "ToolbarSlotProviderProps": "export interface ToolbarSlotProviderProps { children: ReactNode; }", "useToolbarSlot": "useToolbarSlot: (slotName: string) => ReactNode[]" }, + "./renderer": { + "CRATIS_PRESENTATION_ABI_VERSION": "CRATIS_PRESENTATION_ABI_VERSION: 1", + "CRATIS_PRESENTATION_PROFILE": "CRATIS_PRESENTATION_PROFILE: 'stable-presentation/v1'", + "CratisOverlayEnvironment": "export interface CratisOverlayEnvironment { getContainer(): HTMLElement | null; }", + "CratisPresentationCapabilities": "export type CratisPresentationCapabilities = readonly [ 'slot.render', 'parts.passthrough', 'ssr.staticRender', ...CratisPresentationOptionalCapabilityId[] ];", + "CratisPresentationCapabilityId": "export type CratisPresentationCapabilityId = 'slot.render' | 'parts.passthrough' | 'ssr.staticRender' | 'rtl' | 'forcedColors' | 'motion.reduced';", + "CratisPresentationSlotDeclaration": "export interface CratisPresentationSlotDeclaration { readonly mode: 'presentation'; readonly fidelity: 'native' | 'emulated'; readonly render: ComponentType; }", + "CratisPresentationSlotId": "export type CratisPresentationSlotId = (typeof cratisPresentationSlotIds)[number];", + "CratisPresentationSlotMap": "export type CratisPresentationSlotMap = { readonly [SlotId in CratisPresentationSlotId]: CratisPresentationSlotDeclaration; };", + "CratisPresentationSlots": "export interface CratisPresentationSlots { readonly 'common.button': ButtonProps; readonly 'common.iconButton': IconButtonProps; readonly 'common.textInput': TextInputProps; readonly 'common.textArea': TextAreaProps; readonly 'common.checkbox': CheckboxProps; readonly 'common.radio': RadioProps; readonly 'common.switch': SwitchProps; readonly 'common.progress': ProgressBarProps; readonly 'common.surface': SurfaceProps; }", + "CratisPresentationUiLibrary": "export interface CratisPresentationUiLibrary { readonly id: string; readonly displayName: string; readonly abi: typeof CRATIS_PRESENTATION_ABI_VERSION; readonly level: 'primitive'; readonly profile: typeof CRATIS_PRESENTATION_PROFILE; readonly profileSlots: typeof cratisPresentationSlotIds; readonly capabilities: CratisPresentationCapabilities; readonly slots: CratisPresentationSlotMap; readonly Provider?: ComponentType; }", + "CratisPresentationUiLibraryProviderProps": "export interface CratisPresentationUiLibraryProviderProps { readonly setup: CratisRendererSetup; readonly children: ReactNode; }", + "CratisRendererSetup": "export type CratisRendererSetup = Readonly<{ [Key in keyof CratisRendererSetupExtensions | keyof unstable_RendererSetupExtensions]?: boolean; }>;", + "CratisRendererSetupExtensions": "export interface CratisRendererSetupExtensions extends Record { }", + "cratisPresentationSlotIds": "cratisPresentationSlotIds: readonly [ \"common.button\", \"common.iconButton\", \"common.textInput\", \"common.textArea\", \"common.checkbox\", \"common.radio\", \"common.switch\", \"common.progress\", \"common.surface\" ]", + "definePresentationUiLibrary": "definePresentationUiLibrary: (library: CratisPresentationUiLibrary) => CratisPresentationUiLibrary", + "unstable_AdapterDiagnostic": "export interface unstable_AdapterDiagnostic { readonly code: unstable_AdapterErrorCode; readonly adapterId: string; readonly slotId?: unstable_SlotId; readonly message: string; readonly remedy: string; }", + "unstable_AdapterError": "export declare class unstable_AdapterError extends Error { readonly diagnostic: unstable_AdapterDiagnostic; readonly code: unstable_AdapterErrorCode; constructor(diagnostic: unstable_AdapterDiagnostic); }", + "unstable_AdapterErrorCode": "export type unstable_AdapterErrorCode = (typeof unstable_adapterErrorCodes)[keyof typeof unstable_adapterErrorCodes];", + "unstable_BehaviorMode": "export type unstable_BehaviorMode = 'presentation' | 'atomic';", + "unstable_CRATIS_UI_ABI_VERSION": "unstable_CRATIS_UI_ABI_VERSION = 1", + "unstable_CapabilityId": "export type unstable_CapabilityId = 'slot.render' | 'parts.passthrough' | 'focus.trap' | 'focus.restore' | 'overlay.portal' | 'collection.virtualize' | 'selection.multi' | 'datetime.i18n' | 'form.validationMessage' | 'theme.tokens' | 'ssr.staticRender' | 'rtl' | 'forcedColors' | 'motion.reduced' | 'machine.binding' | 'paging.server';", + "unstable_CratisOverlayEnvironment": "export type unstable_CratisOverlayEnvironment = CratisOverlayEnvironment;", + "unstable_CratisSlots": "export interface unstable_CratisSlots extends Record { } | interface unstable_CratisSlots { 'common.button': ButtonProps; 'common.iconButton': IconButtonProps; 'common.textInput': TextInputProps; 'common.textArea': TextAreaProps; 'common.checkbox': CheckboxProps; 'common.radio': RadioProps; 'common.switch': SwitchProps; 'common.progress': ProgressBarProps; 'common.surface': SurfaceProps; 'common.tooltip': TooltipProps; 'dropdown.select': DropdownProps; 'dialogs.dialog': DialogProps; 'display.datePicker': DatePickerInputProps; 'datatables.paginator': TablePaginatorProps; }", + "unstable_Fidelity": "export type unstable_Fidelity = 'native' | 'emulated' | 'unsupported';", + "unstable_RendererScope": "unstable_RendererScope: (props: unstable_RendererScopeProps) => string | number | bigint | boolean | import(\"react\").JSX.Element | Iterable | Promise | import(\"react\").ReactElement> | import(\"react\").ReactPortal | null | undefined> | null | undefined", + "unstable_RendererScopeProps": "export interface unstable_RendererScopeProps { readonly use: unstable_UiLibrary | readonly unstable_UiLibrary[]; readonly only?: readonly unstable_SlotId[]; readonly children: ReactNode; }", + "unstable_RendererSetup": "export type unstable_RendererSetup = CratisRendererSetup;", + "unstable_RendererSetupExtensions": "export interface unstable_RendererSetupExtensions extends CratisRendererSetupExtensions { }", + "unstable_SlotDeclaration": "export interface unstable_SlotDeclaration { readonly mode: unstable_BehaviorMode; readonly fidelity: unstable_Fidelity; readonly render: ComponentType; }", + "unstable_SlotId": "export type unstable_SlotId = keyof unstable_CratisSlots;", + "unstable_SlotMap": "export type unstable_SlotMap = { readonly [K in unstable_SlotId]?: unstable_SlotDeclaration; };", + "unstable_UiLibrary": "export interface unstable_UiLibrary { readonly id: string; readonly displayName: string; readonly abi: number; readonly level: 'full' | 'primitive' | 'behavior' | 'portal' | 'theme'; readonly profile: string; readonly profileSlots?: readonly unstable_SlotId[]; readonly capabilities: readonly unstable_CapabilityId[]; readonly slots: unstable_SlotMap; readonly Provider?: ComponentType; readonly preflight?: () => readonly unstable_AdapterDiagnostic[]; }", + "unstable_UiLibraryProviderProps": "export type unstable_UiLibraryProviderProps = CratisPresentationUiLibraryProviderProps;", + "unstable_adapterErrorCodes": "unstable_adapterErrorCodes: Readonly<{ readonly abiMismatch: 'CRATIS-UI-1001'; readonly missingRequirement: 'CRATIS-UI-1002'; readonly strictProfileFallback: 'CRATIS-UI-1003'; readonly missingUpstreamPeer: 'CRATIS-UI-1004'; readonly missingLicenseKey: 'CRATIS-UI-1005'; readonly nestedLibraries: 'CRATIS-UI-1006'; readonly ssrContractViolation: 'CRATIS-UI-1007'; readonly duplicateResolution: 'CRATIS-UI-1008'; readonly deprecatedSlot: 'CRATIS-UI-1009'; }>", + "unstable_composeUiLibraries": "unstable_composeUiLibraries: (...libraries: readonly unstable_UiLibrary[]) => unstable_UiLibrary", + "unstable_defaultOverlayEnvironment": "unstable_defaultOverlayEnvironment: unstable_CratisOverlayEnvironment", + "unstable_defineUiLibrary": "unstable_defineUiLibrary: (library: T) => T", + "unstable_useCapability": "unstable_useCapability: (capability: unstable_CapabilityId) => boolean", + "unstable_useOverlayEnvironment": "unstable_useOverlayEnvironment: () => unstable_CratisOverlayEnvironment", + "unstable_useRendererId": "unstable_useRendererId: () => string" + }, + "./renderer/builtin": { + "unstable_cratisBuiltIn": "unstable_cratisBuiltIn: unstable_UiLibrary" + }, + "./schemas/ui-adapter.schema.json": { + "default": "schema: unknown" + }, "./types": { "ChangeHandler": "export type ChangeHandler = (value: T, meta?: ChangeMeta) => void;", "ChangeMeta": "export interface ChangeMeta { readonly source: 'user' | 'programmatic' | 'reset'; readonly nativeEvent?: Event; }", "CratisCanonicalPartState": "export type CratisCanonicalPartState = (typeof cratisCanonicalPartStates)[number];", - "cratisCanonicalPartStates": "cratisCanonicalPartStates: readonly [ 'disabled', 'loading', 'selected', 'open', 'invalid', 'readonly', 'busy', 'focused', 'pressed' ]", - "cratisParts": "cratisParts: { readonly CheckboxField: readonly [ 'root', 'input', 'box', 'indicator' ]; readonly RatingField: readonly [ 'root', 'option', 'input', 'star' ]; readonly RadioButtonField: readonly [ 'root', 'input', 'box', 'indicator' ]; readonly RadioGroupField: readonly [ 'root', 'option', 'input', 'box', 'indicator' ]; readonly ChipsField: readonly [ 'root', 'item', 'remove', 'input' ]; readonly ToggleSwitchField: readonly [ 'root', 'input', 'control', 'handle' ]; readonly SliderField: readonly [ 'root', 'input', 'value' ]; readonly NumberField: readonly [ 'root', 'input' ]; readonly ComboBox: readonly [ 'root', 'input', 'trigger', 'popover', 'listbox', 'option', 'optionLabel', 'optionDescription', 'loading', 'empty', 'failure', 'action', 'description', 'error' ]; readonly NumberInput: readonly [ 'root', 'group', 'input', 'prefix', 'suffix', 'step', 'description', 'error' ]; readonly NumberInputField: readonly [ 'root', 'group', 'input', 'prefix', 'suffix', 'step', 'description', 'error' ]; readonly ColorPickerField: readonly [ 'root', 'input', 'value' ]; readonly PasswordField: readonly [ 'root', 'input', 'toggle' ]; readonly InputTextField: readonly [ 'input' ]; readonly TextAreaField: readonly [ 'textarea' ]; readonly Dropdown: readonly [ 'root', 'value', 'filter', 'trigger', 'clear', 'popover', 'listbox', 'option', 'multiple', 'indicator' ]; readonly DropdownField: readonly [ 'root', 'value', 'filter', 'trigger', 'clear', 'popover', 'listbox', 'option', 'multiple', 'indicator' ]; readonly MultiSelectField: readonly [ 'root', 'value', 'filter', 'trigger', 'clear', 'popover', 'listbox', 'option', 'multiple', 'indicator' ]; readonly DatePickerInput: readonly [ 'root', 'group', 'input', 'segment', 'placeholder', 'trigger', 'popover', 'dialog', 'calendar', 'header', 'previous', 'heading', 'next', 'grid', 'cell', 'button-bar', 'today', 'clear' ]; readonly CalendarField: readonly [ 'root', 'group', 'input', 'segment', 'placeholder', 'trigger', 'popover', 'dialog', 'calendar', 'header', 'previous', 'heading', 'next', 'grid', 'cell', 'button-bar', 'today', 'clear' ]; readonly Button: readonly [ 'root', 'spinner', 'icon', 'label' ]; readonly ActionMenubar: readonly [ 'root', 'spinner', 'icon', 'label' ]; readonly IconButton: readonly [ 'root', 'spinner', 'icon', 'label' ]; readonly TextInput: readonly [ 'root' ]; readonly TextArea: readonly [ 'root' ]; readonly Checkbox: readonly [ 'root', 'input', 'box', 'indicator', 'label' ]; readonly Radio: readonly [ 'root', 'input', 'box', 'indicator', 'label' ]; readonly Switch: readonly [ 'root', 'input', 'control', 'handle', 'label' ]; readonly Surface: readonly [ 'root' ]; readonly Tooltip: readonly [ 'trigger', 'popup' ]; readonly ToggleGroup: readonly [ 'root', 'option', 'icon', 'label' ]; readonly Tabs: readonly [ 'root', 'list', 'tab', 'panel' ]; readonly TagGroup: readonly [ 'root', 'list', 'tag', 'remove', 'input' ]; readonly Breadcrumbs: readonly [ 'root', 'item', 'link', 'separator' ]; readonly Dialog: readonly [ 'backdrop', 'positioner', 'root', 'header', 'title', 'subtitle', 'close', 'content', 'busy-scope', 'footer', 'confirm', 'cancel' ]; readonly CommandDialog: readonly [ 'backdrop', 'positioner', 'root', 'header', 'title', 'subtitle', 'close', 'content', 'busy-scope', 'footer', 'confirm', 'cancel' ]; readonly CommandStepper: readonly [ 'root', 'list', 'step', 'header', 'number', 'title', 'separator', 'panels', 'panel' ]; readonly DataTableCore: readonly [ 'root', 'search', 'search-input', 'table-container', 'table', 'head', 'header-row', 'header-cell', 'header-content', 'sort', 'select-all', 'body', 'empty-row', 'empty-cell', 'loading-row', 'loading-cell', 'failure-row', 'failure-cell', 'row', 'cell' ]; readonly DataTableForObservableQuery: readonly [ 'root', 'search', 'search-input', 'table-container', 'table', 'head', 'header-row', 'header-cell', 'header-content', 'sort', 'select-all', 'body', 'empty-row', 'empty-cell', 'loading-row', 'loading-cell', 'failure-row', 'failure-cell', 'row', 'cell' ]; readonly DataTableForQuery: readonly [ 'root', 'search', 'search-input', 'table-container', 'table', 'head', 'header-row', 'header-cell', 'header-content', 'sort', 'select-all', 'body', 'empty-row', 'empty-cell', 'loading-row', 'loading-cell', 'failure-row', 'failure-cell', 'row', 'cell' ]; readonly ColumnFilterMenu: readonly [ 'filter-trigger', 'filter-popover', 'filter-menu', 'filter-actions' ]; readonly TablePaginator: readonly [ 'root', 'range', 'info' ]; readonly Toaster: readonly [ 'region', 'toast', 'icon', 'content', 'title', 'description', 'close', 'action' ]; readonly EventsView: readonly [ 'timeline', 'event', 'separator', 'marker', 'connector', 'content' ]; readonly ChatSidebar: readonly [ 'backdrop', 'root', 'header', 'back', 'title', 'close', 'content' ]; readonly Toolbar: readonly [ 'root' ]; readonly ToolbarButton: readonly [ 'button', 'icon', 'label' ]; readonly ToolbarFolder: readonly [ 'toolbar-folder', 'toolbar-folder-trigger', 'toolbar-folder-panel' ]; readonly ToolbarFanOutItem: readonly [ 'fanout-root', 'fanout-trigger', 'fanout-panel' ]; readonly ToolbarSeparator: readonly [ 'toolbar-separator' ]; readonly ToolbarSection: readonly [ 'toolbar-section', 'toolbar-context' ]; readonly ToolbarGroup: readonly [ 'toolbar-group', 'toolbar-slot', 'toolbar-slot-incoming', 'toolbar-slot-outgoing' ]; readonly ToolbarLayout: readonly [ 'toolbar-layout', 'toolbar-slot', 'toolbar-slot-incoming', 'toolbar-slot-outgoing' ]; readonly Skeleton: readonly [ 'root' ]; readonly Message: readonly [ 'root', 'icon', 'text' ]; readonly Badge: readonly [ 'root' ]; readonly ProgressSpinner: readonly [ 'root', 'svg', 'track', 'range' ]; readonly Avatar: readonly [ 'root', 'image', 'fallback' ]; readonly Tag: readonly [ 'root', 'icon', 'label' ]; readonly ProgressBar: readonly [ 'root', 'indicator', 'label' ]; readonly Chip: readonly [ 'root', 'icon', 'label', 'remove' ]; }", - "CratisPartsManifest": "export type CratisPartsManifest = typeof cratisParts;", - "cratisPartStates": "cratisPartStates: { readonly CheckboxField: { readonly root: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly input: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly box: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly indicator: readonly [ \"disabled\", \"selected\", \"invalid\" ]; }; readonly RatingField: { readonly root: readonly [ \"disabled\", \"invalid\" ]; readonly option: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly input: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly star: readonly [ \"disabled\", \"selected\", \"invalid\" ]; }; readonly RadioButtonField: { readonly root: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly input: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly box: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly indicator: readonly [ \"disabled\", \"selected\", \"invalid\" ]; }; readonly RadioGroupField: { readonly root: readonly [ \"disabled\", \"invalid\" ]; readonly option: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly input: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly box: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly indicator: readonly [ \"disabled\", \"selected\", \"invalid\" ]; }; readonly ChipsField: { readonly root: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly item: readonly [ \"selected\" ]; readonly remove: readonly [ \"disabled\", \"selected\" ]; readonly input: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; }; readonly ToggleSwitchField: { readonly root: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly input: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly control: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly handle: readonly [ \"disabled\", \"selected\", \"invalid\" ]; }; readonly SliderField: { readonly root: readonly [ \"disabled\", \"invalid\" ]; readonly input: readonly [ \"disabled\", \"invalid\" ]; readonly value: readonly [ \"invalid\" ]; }; readonly NumberField: { readonly root: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly input: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; }; readonly ComboBox: { readonly root: readonly [ \"disabled\", \"invalid\", \"readonly\", \"loading\" ]; readonly input: readonly [ \"disabled\", \"invalid\", \"readonly\", \"open\" ]; readonly trigger: readonly [ \"disabled\", \"open\" ]; readonly popover: readonly [ \"open\" ]; readonly listbox: readonly [ ]; readonly option: readonly [ \"disabled\", \"selected\" ]; readonly optionLabel: readonly [ ]; readonly optionDescription: readonly [ ]; readonly loading: readonly [ ]; readonly empty: readonly [ ]; readonly failure: readonly [ ]; readonly action: readonly [ ]; readonly description: readonly [ ]; readonly error: readonly [ \"invalid\" ]; }; readonly NumberInput: { readonly root: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly group: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly input: readonly [ \"disabled\", \"invalid\", \"readonly\", \"focused\" ]; readonly prefix: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly suffix: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly step: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly description: readonly [ ]; readonly error: readonly [ \"invalid\" ]; }; readonly NumberInputField: { readonly root: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly group: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly input: readonly [ \"disabled\", \"invalid\", \"readonly\", \"focused\" ]; readonly prefix: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly suffix: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly step: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly description: readonly [ ]; readonly error: readonly [ \"invalid\" ]; }; readonly ColorPickerField: { readonly root: readonly [ \"disabled\", \"invalid\" ]; readonly input: readonly [ \"disabled\", \"invalid\" ]; readonly value: readonly [ \"invalid\" ]; }; readonly PasswordField: { readonly root: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly input: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly toggle: readonly [ \"disabled\" ]; }; readonly InputTextField: { readonly input: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; }; readonly TextAreaField: { readonly textarea: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; }; readonly Dropdown: { readonly root: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\" ]; readonly value: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\" ]; readonly filter: readonly [ \"disabled\", \"open\", \"invalid\" ]; readonly trigger: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\" ]; readonly clear: readonly [ \"disabled\" ]; readonly popover: readonly [ \"open\" ]; readonly listbox: readonly [ \"open\" ]; readonly option: readonly [ \"disabled\", \"selected\" ]; readonly multiple: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly indicator: readonly [ \"disabled\", \"open\", \"invalid\" ]; }; readonly DropdownField: { readonly root: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\" ]; readonly value: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\" ]; readonly filter: readonly [ \"disabled\", \"open\", \"invalid\" ]; readonly trigger: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\" ]; readonly clear: readonly [ \"disabled\" ]; readonly popover: readonly [ \"open\" ]; readonly listbox: readonly [ \"open\" ]; readonly option: readonly [ \"disabled\", \"selected\" ]; readonly multiple: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly indicator: readonly [ \"disabled\", \"open\", \"invalid\" ]; }; readonly MultiSelectField: { readonly root: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\" ]; readonly value: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\" ]; readonly filter: readonly [ \"disabled\", \"open\", \"invalid\" ]; readonly trigger: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\" ]; readonly clear: readonly [ \"disabled\" ]; readonly popover: readonly [ \"open\" ]; readonly listbox: readonly [ \"open\" ]; readonly option: readonly [ \"disabled\", \"selected\" ]; readonly multiple: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly indicator: readonly [ \"disabled\", \"open\", \"invalid\" ]; }; readonly DatePickerInput: { readonly root: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\", \"readonly\" ]; readonly group: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\", \"readonly\" ]; readonly input: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\", \"readonly\" ]; readonly segment: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly placeholder: readonly [ ]; readonly trigger: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\", \"readonly\" ]; readonly popover: readonly [ \"open\" ]; readonly dialog: readonly [ \"open\" ]; readonly calendar: readonly [ \"open\" ]; readonly header: readonly [ ]; readonly previous: readonly [ ]; readonly heading: readonly [ ]; readonly next: readonly [ ]; readonly grid: readonly [ ]; readonly cell: readonly [ \"selected\" ]; readonly 'button-bar': readonly [ ]; readonly today: readonly [ \"disabled\" ]; readonly clear: readonly [ \"disabled\" ]; }; readonly CalendarField: { readonly root: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\", \"readonly\" ]; readonly group: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\", \"readonly\" ]; readonly input: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\", \"readonly\" ]; readonly segment: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly placeholder: readonly [ ]; readonly trigger: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\", \"readonly\" ]; readonly popover: readonly [ \"open\" ]; readonly dialog: readonly [ \"open\" ]; readonly calendar: readonly [ \"open\" ]; readonly header: readonly [ ]; readonly previous: readonly [ ]; readonly heading: readonly [ ]; readonly next: readonly [ ]; readonly grid: readonly [ ]; readonly cell: readonly [ \"selected\" ]; readonly 'button-bar': readonly [ ]; readonly today: readonly [ \"disabled\" ]; readonly clear: readonly [ \"disabled\" ]; }; readonly Button: { readonly root: readonly [ \"disabled\", \"loading\" ]; readonly spinner: readonly [ ]; readonly icon: readonly [ ]; readonly label: readonly [ ]; }; readonly ActionMenubar: { readonly root: readonly [ \"disabled\", \"loading\" ]; readonly spinner: readonly [ ]; readonly icon: readonly [ ]; readonly label: readonly [ ]; }; readonly IconButton: { readonly root: readonly [ \"disabled\", \"loading\" ]; readonly spinner: readonly [ ]; readonly icon: readonly [ ]; readonly label: readonly [ ]; }; readonly TextInput: { readonly root: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; }; readonly TextArea: { readonly root: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; }; readonly Checkbox: { readonly root: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly input: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly box: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly indicator: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly label: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; }; readonly Radio: { readonly root: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly input: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly box: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly indicator: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly label: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; }; readonly Switch: { readonly root: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly input: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly control: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly handle: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly label: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; }; readonly Surface: { readonly root: readonly [ ]; }; readonly Tooltip: { readonly trigger: readonly [ ]; readonly popup: readonly [ \"open\" ]; }; readonly ToggleGroup: { readonly root: readonly [ \"disabled\", \"invalid\" ]; readonly option: readonly [ \"selected\", \"disabled\", \"invalid\" ]; readonly icon: readonly [ ]; readonly label: readonly [ ]; }; readonly Tabs: { readonly root: readonly [ \"disabled\" ]; readonly list: readonly [ ]; readonly tab: readonly [ \"selected\", \"disabled\" ]; readonly panel: readonly [ \"selected\" ]; }; readonly TagGroup: { readonly root: readonly [ \"disabled\", \"invalid\" ]; readonly list: readonly [ ]; readonly tag: readonly [ \"disabled\" ]; readonly remove: readonly [ ]; readonly input: readonly [ \"invalid\" ]; }; readonly Breadcrumbs: { readonly root: readonly [ ]; readonly item: readonly [ \"selected\" ]; readonly link: readonly [ \"selected\" ]; readonly separator: readonly [ ]; }; readonly Dialog: { readonly backdrop: readonly [ \"open\", \"busy\" ]; readonly positioner: readonly [ \"open\", \"busy\" ]; readonly root: readonly [ \"open\", \"busy\" ]; readonly header: readonly [ ]; readonly title: readonly [ ]; readonly subtitle: readonly [ ]; readonly close: readonly [ \"disabled\", \"busy\" ]; readonly content: readonly [ \"open\", \"busy\" ]; readonly 'busy-scope': readonly [ \"busy\" ]; readonly footer: readonly [ ]; readonly confirm: readonly [ \"disabled\", \"busy\" ]; readonly cancel: readonly [ \"disabled\", \"busy\" ]; }; readonly CommandDialog: { readonly backdrop: readonly [ \"open\", \"busy\" ]; readonly positioner: readonly [ \"open\", \"busy\" ]; readonly root: readonly [ \"open\", \"busy\" ]; readonly header: readonly [ ]; readonly title: readonly [ ]; readonly subtitle: readonly [ ]; readonly close: readonly [ \"disabled\", \"busy\" ]; readonly content: readonly [ \"open\", \"busy\" ]; readonly 'busy-scope': readonly [ \"busy\" ]; readonly footer: readonly [ ]; readonly confirm: readonly [ \"disabled\", \"busy\" ]; readonly cancel: readonly [ \"disabled\", \"busy\" ]; }; readonly CommandStepper: { readonly root: readonly [ \"invalid\", \"busy\" ]; readonly list: readonly [ \"invalid\", \"busy\" ]; readonly step: readonly [ \"selected\", \"invalid\", \"busy\" ]; readonly header: readonly [ \"disabled\", \"selected\", \"invalid\", \"busy\" ]; readonly number: readonly [ \"selected\", \"invalid\", \"busy\" ]; readonly title: readonly [ \"selected\", \"invalid\", \"busy\" ]; readonly separator: readonly [ \"invalid\", \"busy\" ]; readonly panels: readonly [ \"invalid\", \"busy\" ]; readonly panel: readonly [ \"selected\", \"invalid\", \"busy\" ]; }; readonly DataTableCore: { readonly root: readonly [ \"busy\" ]; readonly search: readonly [ ]; readonly 'search-input': readonly [ ]; readonly 'table-container': readonly [ ]; readonly table: readonly [ ]; readonly head: readonly [ ]; readonly 'header-row': readonly [ ]; readonly 'header-cell': readonly [ \"selected\" ]; readonly 'header-content': readonly [ \"selected\" ]; readonly sort: readonly [ \"pressed\" ]; readonly 'select-all': readonly [ ]; readonly body: readonly [ ]; readonly 'empty-row': readonly [ ]; readonly 'empty-cell': readonly [ ]; readonly 'loading-row': readonly [ ]; readonly 'loading-cell': readonly [ ]; readonly 'failure-row': readonly [ ]; readonly 'failure-cell': readonly [ ]; readonly row: readonly [ \"selected\" ]; readonly cell: readonly [ \"selected\" ]; }; readonly DataTableForObservableQuery: { readonly root: readonly [ \"busy\" ]; readonly search: readonly [ ]; readonly 'search-input': readonly [ ]; readonly 'table-container': readonly [ ]; readonly table: readonly [ ]; readonly head: readonly [ ]; readonly 'header-row': readonly [ ]; readonly 'header-cell': readonly [ \"selected\" ]; readonly 'header-content': readonly [ \"selected\" ]; readonly sort: readonly [ \"pressed\" ]; readonly 'select-all': readonly [ ]; readonly body: readonly [ ]; readonly 'empty-row': readonly [ ]; readonly 'empty-cell': readonly [ ]; readonly 'loading-row': readonly [ ]; readonly 'loading-cell': readonly [ ]; readonly 'failure-row': readonly [ ]; readonly 'failure-cell': readonly [ ]; readonly row: readonly [ \"selected\" ]; readonly cell: readonly [ \"selected\" ]; }; readonly DataTableForQuery: { readonly root: readonly [ \"busy\" ]; readonly search: readonly [ ]; readonly 'search-input': readonly [ ]; readonly 'table-container': readonly [ ]; readonly table: readonly [ ]; readonly head: readonly [ ]; readonly 'header-row': readonly [ ]; readonly 'header-cell': readonly [ \"selected\" ]; readonly 'header-content': readonly [ \"selected\" ]; readonly sort: readonly [ \"pressed\" ]; readonly 'select-all': readonly [ ]; readonly body: readonly [ ]; readonly 'empty-row': readonly [ ]; readonly 'empty-cell': readonly [ ]; readonly 'loading-row': readonly [ ]; readonly 'loading-cell': readonly [ ]; readonly 'failure-row': readonly [ ]; readonly 'failure-cell': readonly [ ]; readonly row: readonly [ \"selected\" ]; readonly cell: readonly [ \"selected\" ]; }; readonly ColumnFilterMenu: { readonly 'filter-trigger': readonly [ \"selected\", \"open\", \"pressed\" ]; readonly 'filter-popover': readonly [ \"open\" ]; readonly 'filter-menu': readonly [ \"open\" ]; readonly 'filter-actions': readonly [ ]; }; readonly TablePaginator: { readonly root: readonly [ ]; readonly range: readonly [ ]; readonly info: readonly [ ]; }; readonly Toaster: { readonly region: readonly [ ]; readonly toast: readonly [ \"loading\", \"busy\" ]; readonly icon: readonly [ ]; readonly content: readonly [ \"loading\", \"busy\" ]; readonly title: readonly [ ]; readonly description: readonly [ ]; readonly close: readonly [ ]; readonly action: readonly [ ]; }; readonly EventsView: { readonly timeline: readonly [ ]; readonly event: readonly [ \"selected\" ]; readonly separator: readonly [ ]; readonly marker: readonly [ \"selected\" ]; readonly connector: readonly [ ]; readonly content: readonly [ ]; }; readonly ChatSidebar: { readonly backdrop: readonly [ \"selected\", \"open\" ]; readonly root: readonly [ \"selected\", \"open\" ]; readonly header: readonly [ ]; readonly back: readonly [ ]; readonly title: readonly [ ]; readonly close: readonly [ ]; readonly content: readonly [ ]; }; readonly Toolbar: { readonly root: readonly [ ]; }; readonly ToolbarButton: { readonly button: readonly [ \"selected\" ]; readonly icon: readonly [ ]; readonly label: readonly [ ]; }; readonly ToolbarFolder: { readonly 'toolbar-folder': readonly [ \"open\" ]; readonly 'toolbar-folder-trigger': readonly [ \"open\" ]; readonly 'toolbar-folder-panel': readonly [ \"open\" ]; }; readonly ToolbarFanOutItem: { readonly 'fanout-root': readonly [ \"open\" ]; readonly 'fanout-trigger': readonly [ \"open\" ]; readonly 'fanout-panel': readonly [ \"open\" ]; }; readonly ToolbarSeparator: { readonly 'toolbar-separator': readonly [ ]; }; readonly ToolbarSection: { readonly 'toolbar-section': readonly [ ]; readonly 'toolbar-context': readonly [ \"selected\" ]; }; readonly ToolbarGroup: { readonly 'toolbar-group': readonly [ ]; readonly 'toolbar-slot': readonly [ ]; readonly 'toolbar-slot-incoming': readonly [ ]; readonly 'toolbar-slot-outgoing': readonly [ ]; }; readonly ToolbarLayout: { readonly 'toolbar-layout': readonly [ ]; readonly 'toolbar-slot': readonly [ ]; readonly 'toolbar-slot-incoming': readonly [ ]; readonly 'toolbar-slot-outgoing': readonly [ ]; }; readonly Skeleton: { readonly root: readonly [ ]; }; readonly Message: { readonly root: readonly [ ]; readonly icon: readonly [ ]; readonly text: readonly [ ]; }; readonly Badge: { readonly root: readonly [ ]; }; readonly ProgressSpinner: { readonly root: readonly [ \"loading\", \"busy\" ]; readonly svg: readonly [ ]; readonly track: readonly [ ]; readonly range: readonly [ ]; }; readonly Avatar: { readonly root: readonly [ ]; readonly image: readonly [ ]; readonly fallback: readonly [ ]; }; readonly Tag: { readonly root: readonly [ ]; readonly icon: readonly [ ]; readonly label: readonly [ ]; }; readonly ProgressBar: { readonly root: readonly [ \"loading\", \"busy\" ]; readonly indicator: readonly [ ]; readonly label: readonly [ ]; }; readonly Chip: { readonly root: readonly [ ]; readonly icon: readonly [ ]; readonly label: readonly [ ]; readonly remove: readonly [ ]; }; }", "CratisPartStatesManifest": "export type CratisPartStatesManifest = typeof cratisPartStates;", + "CratisPartsManifest": "export type CratisPartsManifest = typeof cratisParts;", "DEFAULT_TYPE_FORMATS": "DEFAULT_TYPE_FORMATS: TypeFormat[]", "Json": "export type Json = string | number | boolean | null | Json[] | { [key: string]: Json; };", "JsonSchema": "export interface JsonSchema { title?: string; name?: string; $id?: string; $ref?: string; type?: string; format?: string; description?: string; properties?: Record; items?: JsonSchema; required?: string[]; definitions?: Record; }", "JsonSchemaProperty": "export interface JsonSchemaProperty { id?: string; name?: string; type?: string; format?: string; description?: string; items?: JsonSchema; properties?: Record; required?: string[]; $ref?: string; }", "NavigationItem": "export interface NavigationItem { name: string; path: string[]; }", - "PartsOf": "export type PartsOf = CratisPartsManifest[K][number];", "PartStatesOf": "export type PartStatesOf = CratisPartStatesManifest[Component][Part] extends readonly (infer State)[] ? State : never;", - "TypeFormat": "export interface TypeFormat { jsonType: string; format: string; }" + "PartsOf": "export type PartsOf = CratisPartsManifest[K][number];", + "TypeFormat": "export interface TypeFormat { jsonType: string; format: string; }", + "cratisCanonicalPartStates": "cratisCanonicalPartStates: readonly [ 'disabled', 'loading', 'selected', 'open', 'invalid', 'readonly', 'busy', 'focused', 'pressed' ]", + "cratisPartStates": "cratisPartStates: { readonly CheckboxField: { readonly root: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly input: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly box: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly indicator: readonly [ \"disabled\", \"selected\", \"invalid\" ]; }; readonly RatingField: { readonly root: readonly [ \"disabled\", \"invalid\" ]; readonly option: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly input: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly star: readonly [ \"disabled\", \"selected\", \"invalid\" ]; }; readonly RadioButtonField: { readonly root: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly input: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly box: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly indicator: readonly [ \"disabled\", \"selected\", \"invalid\" ]; }; readonly RadioGroupField: { readonly root: readonly [ \"disabled\", \"invalid\" ]; readonly option: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly input: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly box: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly indicator: readonly [ \"disabled\", \"selected\", \"invalid\" ]; }; readonly ChipsField: { readonly root: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly item: readonly [ \"selected\" ]; readonly remove: readonly [ \"disabled\", \"selected\" ]; readonly input: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; }; readonly ToggleSwitchField: { readonly root: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly input: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly control: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly handle: readonly [ \"disabled\", \"selected\", \"invalid\" ]; }; readonly SliderField: { readonly root: readonly [ \"disabled\", \"invalid\" ]; readonly input: readonly [ \"disabled\", \"invalid\" ]; readonly value: readonly [ \"invalid\" ]; }; readonly NumberField: { readonly root: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly input: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; }; readonly ComboBox: { readonly root: readonly [ \"disabled\", \"invalid\", \"readonly\", \"loading\" ]; readonly input: readonly [ \"disabled\", \"invalid\", \"readonly\", \"open\" ]; readonly trigger: readonly [ \"disabled\", \"open\" ]; readonly popover: readonly [ \"open\" ]; readonly listbox: readonly [ ]; readonly option: readonly [ \"disabled\", \"selected\" ]; readonly optionLabel: readonly [ ]; readonly optionDescription: readonly [ ]; readonly loading: readonly [ ]; readonly empty: readonly [ ]; readonly failure: readonly [ ]; readonly action: readonly [ ]; readonly description: readonly [ ]; readonly error: readonly [ \"invalid\" ]; }; readonly NumberInput: { readonly root: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly group: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly input: readonly [ \"disabled\", \"invalid\", \"readonly\", \"focused\" ]; readonly prefix: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly suffix: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly step: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly description: readonly [ ]; readonly error: readonly [ \"invalid\" ]; }; readonly NumberInputField: { readonly root: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly group: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly input: readonly [ \"disabled\", \"invalid\", \"readonly\", \"focused\" ]; readonly prefix: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly suffix: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly step: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly description: readonly [ ]; readonly error: readonly [ \"invalid\" ]; }; readonly ColorPickerField: { readonly root: readonly [ \"disabled\", \"invalid\" ]; readonly input: readonly [ \"disabled\", \"invalid\" ]; readonly value: readonly [ \"invalid\" ]; }; readonly PasswordField: { readonly root: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly input: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly toggle: readonly [ \"disabled\" ]; }; readonly InputTextField: { readonly input: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; }; readonly TextAreaField: { readonly textarea: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; }; readonly Dropdown: { readonly root: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\" ]; readonly value: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\" ]; readonly filter: readonly [ \"disabled\", \"open\", \"invalid\" ]; readonly trigger: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\" ]; readonly clear: readonly [ \"disabled\" ]; readonly popover: readonly [ \"open\" ]; readonly listbox: readonly [ \"open\" ]; readonly option: readonly [ \"disabled\", \"selected\" ]; readonly multiple: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly indicator: readonly [ \"disabled\", \"open\", \"invalid\" ]; }; readonly DropdownField: { readonly root: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\" ]; readonly value: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\" ]; readonly filter: readonly [ \"disabled\", \"open\", \"invalid\" ]; readonly trigger: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\" ]; readonly clear: readonly [ \"disabled\" ]; readonly popover: readonly [ \"open\" ]; readonly listbox: readonly [ \"open\" ]; readonly option: readonly [ \"disabled\", \"selected\" ]; readonly multiple: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly indicator: readonly [ \"disabled\", \"open\", \"invalid\" ]; }; readonly MultiSelectField: { readonly root: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\" ]; readonly value: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\" ]; readonly filter: readonly [ \"disabled\", \"open\", \"invalid\" ]; readonly trigger: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\" ]; readonly clear: readonly [ \"disabled\" ]; readonly popover: readonly [ \"open\" ]; readonly listbox: readonly [ \"open\" ]; readonly option: readonly [ \"disabled\", \"selected\" ]; readonly multiple: readonly [ \"disabled\", \"selected\", \"invalid\" ]; readonly indicator: readonly [ \"disabled\", \"open\", \"invalid\" ]; }; readonly DatePickerInput: { readonly root: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\", \"readonly\" ]; readonly group: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\", \"readonly\" ]; readonly input: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\", \"readonly\" ]; readonly segment: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly placeholder: readonly [ ]; readonly trigger: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\", \"readonly\" ]; readonly popover: readonly [ \"open\" ]; readonly dialog: readonly [ \"open\" ]; readonly calendar: readonly [ \"open\" ]; readonly header: readonly [ ]; readonly previous: readonly [ ]; readonly heading: readonly [ ]; readonly next: readonly [ ]; readonly grid: readonly [ ]; readonly cell: readonly [ \"selected\" ]; readonly 'button-bar': readonly [ ]; readonly today: readonly [ \"disabled\" ]; readonly clear: readonly [ \"disabled\" ]; }; readonly CalendarField: { readonly root: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\", \"readonly\" ]; readonly group: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\", \"readonly\" ]; readonly input: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\", \"readonly\" ]; readonly segment: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; readonly placeholder: readonly [ ]; readonly trigger: readonly [ \"disabled\", \"selected\", \"open\", \"invalid\", \"readonly\" ]; readonly popover: readonly [ \"open\" ]; readonly dialog: readonly [ \"open\" ]; readonly calendar: readonly [ \"open\" ]; readonly header: readonly [ ]; readonly previous: readonly [ ]; readonly heading: readonly [ ]; readonly next: readonly [ ]; readonly grid: readonly [ ]; readonly cell: readonly [ \"selected\" ]; readonly 'button-bar': readonly [ ]; readonly today: readonly [ \"disabled\" ]; readonly clear: readonly [ \"disabled\" ]; }; readonly Button: { readonly root: readonly [ \"disabled\", \"loading\" ]; readonly spinner: readonly [ ]; readonly icon: readonly [ ]; readonly label: readonly [ ]; }; readonly ActionMenubar: { readonly root: readonly [ \"disabled\", \"loading\" ]; readonly spinner: readonly [ ]; readonly icon: readonly [ ]; readonly label: readonly [ ]; }; readonly IconButton: { readonly root: readonly [ \"disabled\", \"loading\" ]; readonly spinner: readonly [ ]; readonly icon: readonly [ ]; readonly label: readonly [ ]; }; readonly TextInput: { readonly root: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; }; readonly TextArea: { readonly root: readonly [ \"disabled\", \"invalid\", \"readonly\" ]; }; readonly Checkbox: { readonly root: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly input: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly box: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly indicator: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly label: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; }; readonly Radio: { readonly root: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly input: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly box: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly indicator: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly label: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; }; readonly Switch: { readonly root: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly input: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly control: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly handle: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; readonly label: readonly [ \"disabled\", \"selected\", \"invalid\", \"readonly\" ]; }; readonly Surface: { readonly root: readonly [ ]; }; readonly Tooltip: { readonly trigger: readonly [ ]; readonly popup: readonly [ \"open\" ]; }; readonly ToggleGroup: { readonly root: readonly [ \"disabled\", \"invalid\" ]; readonly option: readonly [ \"selected\", \"disabled\", \"invalid\" ]; readonly icon: readonly [ ]; readonly label: readonly [ ]; }; readonly Tabs: { readonly root: readonly [ \"disabled\" ]; readonly list: readonly [ ]; readonly tab: readonly [ \"selected\", \"disabled\" ]; readonly panel: readonly [ \"selected\" ]; }; readonly TagGroup: { readonly root: readonly [ \"disabled\", \"invalid\" ]; readonly list: readonly [ ]; readonly tag: readonly [ \"disabled\" ]; readonly remove: readonly [ ]; readonly input: readonly [ \"invalid\" ]; }; readonly Breadcrumbs: { readonly root: readonly [ ]; readonly item: readonly [ \"selected\" ]; readonly link: readonly [ \"selected\" ]; readonly separator: readonly [ ]; }; readonly Dialog: { readonly backdrop: readonly [ \"open\", \"busy\" ]; readonly positioner: readonly [ \"open\", \"busy\" ]; readonly root: readonly [ \"open\", \"busy\" ]; readonly header: readonly [ ]; readonly title: readonly [ ]; readonly subtitle: readonly [ ]; readonly close: readonly [ \"disabled\", \"busy\" ]; readonly content: readonly [ \"open\", \"busy\" ]; readonly 'busy-scope': readonly [ \"busy\" ]; readonly footer: readonly [ ]; readonly confirm: readonly [ \"disabled\", \"busy\" ]; readonly cancel: readonly [ \"disabled\", \"busy\" ]; }; readonly CommandDialog: { readonly backdrop: readonly [ \"open\", \"busy\" ]; readonly positioner: readonly [ \"open\", \"busy\" ]; readonly root: readonly [ \"open\", \"busy\" ]; readonly header: readonly [ ]; readonly title: readonly [ ]; readonly subtitle: readonly [ ]; readonly close: readonly [ \"disabled\", \"busy\" ]; readonly content: readonly [ \"open\", \"busy\" ]; readonly 'busy-scope': readonly [ \"busy\" ]; readonly footer: readonly [ ]; readonly confirm: readonly [ \"disabled\", \"busy\" ]; readonly cancel: readonly [ \"disabled\", \"busy\" ]; }; readonly CommandStepper: { readonly root: readonly [ \"invalid\", \"busy\" ]; readonly list: readonly [ \"invalid\", \"busy\" ]; readonly step: readonly [ \"selected\", \"invalid\", \"busy\" ]; readonly header: readonly [ \"disabled\", \"selected\", \"invalid\", \"busy\" ]; readonly number: readonly [ \"selected\", \"invalid\", \"busy\" ]; readonly title: readonly [ \"selected\", \"invalid\", \"busy\" ]; readonly separator: readonly [ \"invalid\", \"busy\" ]; readonly panels: readonly [ \"invalid\", \"busy\" ]; readonly panel: readonly [ \"selected\", \"invalid\", \"busy\" ]; }; readonly DataTableCore: { readonly root: readonly [ \"busy\" ]; readonly search: readonly [ ]; readonly 'search-input': readonly [ ]; readonly 'table-container': readonly [ ]; readonly table: readonly [ ]; readonly head: readonly [ ]; readonly 'header-row': readonly [ ]; readonly 'header-cell': readonly [ \"selected\" ]; readonly 'header-content': readonly [ \"selected\" ]; readonly sort: readonly [ \"pressed\" ]; readonly 'select-all': readonly [ ]; readonly body: readonly [ ]; readonly 'empty-row': readonly [ ]; readonly 'empty-cell': readonly [ ]; readonly 'loading-row': readonly [ ]; readonly 'loading-cell': readonly [ ]; readonly 'failure-row': readonly [ ]; readonly 'failure-cell': readonly [ ]; readonly row: readonly [ \"selected\" ]; readonly cell: readonly [ \"selected\" ]; }; readonly DataTableForObservableQuery: { readonly root: readonly [ \"busy\" ]; readonly search: readonly [ ]; readonly 'search-input': readonly [ ]; readonly 'table-container': readonly [ ]; readonly table: readonly [ ]; readonly head: readonly [ ]; readonly 'header-row': readonly [ ]; readonly 'header-cell': readonly [ \"selected\" ]; readonly 'header-content': readonly [ \"selected\" ]; readonly sort: readonly [ \"pressed\" ]; readonly 'select-all': readonly [ ]; readonly body: readonly [ ]; readonly 'empty-row': readonly [ ]; readonly 'empty-cell': readonly [ ]; readonly 'loading-row': readonly [ ]; readonly 'loading-cell': readonly [ ]; readonly 'failure-row': readonly [ ]; readonly 'failure-cell': readonly [ ]; readonly row: readonly [ \"selected\" ]; readonly cell: readonly [ \"selected\" ]; }; readonly DataTableForQuery: { readonly root: readonly [ \"busy\" ]; readonly search: readonly [ ]; readonly 'search-input': readonly [ ]; readonly 'table-container': readonly [ ]; readonly table: readonly [ ]; readonly head: readonly [ ]; readonly 'header-row': readonly [ ]; readonly 'header-cell': readonly [ \"selected\" ]; readonly 'header-content': readonly [ \"selected\" ]; readonly sort: readonly [ \"pressed\" ]; readonly 'select-all': readonly [ ]; readonly body: readonly [ ]; readonly 'empty-row': readonly [ ]; readonly 'empty-cell': readonly [ ]; readonly 'loading-row': readonly [ ]; readonly 'loading-cell': readonly [ ]; readonly 'failure-row': readonly [ ]; readonly 'failure-cell': readonly [ ]; readonly row: readonly [ \"selected\" ]; readonly cell: readonly [ \"selected\" ]; }; readonly ColumnFilterMenu: { readonly 'filter-trigger': readonly [ \"selected\", \"open\", \"pressed\" ]; readonly 'filter-popover': readonly [ \"open\" ]; readonly 'filter-menu': readonly [ \"open\" ]; readonly 'filter-actions': readonly [ ]; }; readonly TablePaginator: { readonly root: readonly [ ]; readonly range: readonly [ ]; readonly info: readonly [ ]; }; readonly Toaster: { readonly region: readonly [ ]; readonly toast: readonly [ \"loading\", \"busy\" ]; readonly icon: readonly [ ]; readonly content: readonly [ \"loading\", \"busy\" ]; readonly title: readonly [ ]; readonly description: readonly [ ]; readonly close: readonly [ ]; readonly action: readonly [ ]; }; readonly EventsView: { readonly timeline: readonly [ ]; readonly event: readonly [ \"selected\" ]; readonly separator: readonly [ ]; readonly marker: readonly [ \"selected\" ]; readonly connector: readonly [ ]; readonly content: readonly [ ]; }; readonly ChatSidebar: { readonly backdrop: readonly [ \"selected\", \"open\" ]; readonly root: readonly [ \"selected\", \"open\" ]; readonly header: readonly [ ]; readonly back: readonly [ ]; readonly title: readonly [ ]; readonly close: readonly [ ]; readonly content: readonly [ ]; }; readonly Toolbar: { readonly root: readonly [ ]; }; readonly ToolbarButton: { readonly button: readonly [ \"selected\" ]; readonly icon: readonly [ ]; readonly label: readonly [ ]; }; readonly ToolbarFolder: { readonly 'toolbar-folder': readonly [ \"open\" ]; readonly 'toolbar-folder-trigger': readonly [ \"open\" ]; readonly 'toolbar-folder-panel': readonly [ \"open\" ]; }; readonly ToolbarFanOutItem: { readonly 'fanout-root': readonly [ \"open\" ]; readonly 'fanout-trigger': readonly [ \"open\" ]; readonly 'fanout-panel': readonly [ \"open\" ]; }; readonly ToolbarSeparator: { readonly 'toolbar-separator': readonly [ ]; }; readonly ToolbarSection: { readonly 'toolbar-section': readonly [ ]; readonly 'toolbar-context': readonly [ \"selected\" ]; }; readonly ToolbarGroup: { readonly 'toolbar-group': readonly [ ]; readonly 'toolbar-slot': readonly [ ]; readonly 'toolbar-slot-incoming': readonly [ ]; readonly 'toolbar-slot-outgoing': readonly [ ]; }; readonly ToolbarLayout: { readonly 'toolbar-layout': readonly [ ]; readonly 'toolbar-slot': readonly [ ]; readonly 'toolbar-slot-incoming': readonly [ ]; readonly 'toolbar-slot-outgoing': readonly [ ]; }; readonly Skeleton: { readonly root: readonly [ ]; }; readonly Message: { readonly root: readonly [ ]; readonly icon: readonly [ ]; readonly text: readonly [ ]; }; readonly Badge: { readonly root: readonly [ ]; }; readonly ProgressSpinner: { readonly root: readonly [ \"loading\", \"busy\" ]; readonly svg: readonly [ ]; readonly track: readonly [ ]; readonly range: readonly [ ]; }; readonly Avatar: { readonly root: readonly [ ]; readonly image: readonly [ ]; readonly fallback: readonly [ ]; }; readonly Tag: { readonly root: readonly [ ]; readonly icon: readonly [ ]; readonly label: readonly [ ]; }; readonly ProgressBar: { readonly root: readonly [ \"loading\", \"busy\" ]; readonly indicator: readonly [ ]; readonly label: readonly [ ]; }; readonly Chip: { readonly root: readonly [ ]; readonly icon: readonly [ ]; readonly label: readonly [ ]; readonly remove: readonly [ ]; }; }", + "cratisParts": "cratisParts: { readonly CheckboxField: readonly [ 'root', 'input', 'box', 'indicator' ]; readonly RatingField: readonly [ 'root', 'option', 'input', 'star' ]; readonly RadioButtonField: readonly [ 'root', 'input', 'box', 'indicator' ]; readonly RadioGroupField: readonly [ 'root', 'option', 'input', 'box', 'indicator' ]; readonly ChipsField: readonly [ 'root', 'item', 'remove', 'input' ]; readonly ToggleSwitchField: readonly [ 'root', 'input', 'control', 'handle' ]; readonly SliderField: readonly [ 'root', 'input', 'value' ]; readonly NumberField: readonly [ 'root', 'input' ]; readonly ComboBox: readonly [ 'root', 'input', 'trigger', 'popover', 'listbox', 'option', 'optionLabel', 'optionDescription', 'loading', 'empty', 'failure', 'action', 'description', 'error' ]; readonly NumberInput: readonly [ 'root', 'group', 'input', 'prefix', 'suffix', 'step', 'description', 'error' ]; readonly NumberInputField: readonly [ 'root', 'group', 'input', 'prefix', 'suffix', 'step', 'description', 'error' ]; readonly ColorPickerField: readonly [ 'root', 'input', 'value' ]; readonly PasswordField: readonly [ 'root', 'input', 'toggle' ]; readonly InputTextField: readonly [ 'input' ]; readonly TextAreaField: readonly [ 'textarea' ]; readonly Dropdown: readonly [ 'root', 'value', 'filter', 'trigger', 'clear', 'popover', 'listbox', 'option', 'multiple', 'indicator' ]; readonly DropdownField: readonly [ 'root', 'value', 'filter', 'trigger', 'clear', 'popover', 'listbox', 'option', 'multiple', 'indicator' ]; readonly MultiSelectField: readonly [ 'root', 'value', 'filter', 'trigger', 'clear', 'popover', 'listbox', 'option', 'multiple', 'indicator' ]; readonly DatePickerInput: readonly [ 'root', 'group', 'input', 'segment', 'placeholder', 'trigger', 'popover', 'dialog', 'calendar', 'header', 'previous', 'heading', 'next', 'grid', 'cell', 'button-bar', 'today', 'clear' ]; readonly CalendarField: readonly [ 'root', 'group', 'input', 'segment', 'placeholder', 'trigger', 'popover', 'dialog', 'calendar', 'header', 'previous', 'heading', 'next', 'grid', 'cell', 'button-bar', 'today', 'clear' ]; readonly Button: readonly [ 'root', 'spinner', 'icon', 'label' ]; readonly ActionMenubar: readonly [ 'root', 'spinner', 'icon', 'label' ]; readonly IconButton: readonly [ 'root', 'spinner', 'icon', 'label' ]; readonly TextInput: readonly [ 'root' ]; readonly TextArea: readonly [ 'root' ]; readonly Checkbox: readonly [ 'root', 'input', 'box', 'indicator', 'label' ]; readonly Radio: readonly [ 'root', 'input', 'box', 'indicator', 'label' ]; readonly Switch: readonly [ 'root', 'input', 'control', 'handle', 'label' ]; readonly Surface: readonly [ 'root' ]; readonly Tooltip: readonly [ 'trigger', 'popup' ]; readonly ToggleGroup: readonly [ 'root', 'option', 'icon', 'label' ]; readonly Tabs: readonly [ 'root', 'list', 'tab', 'panel' ]; readonly TagGroup: readonly [ 'root', 'list', 'tag', 'remove', 'input' ]; readonly Breadcrumbs: readonly [ 'root', 'item', 'link', 'separator' ]; readonly Dialog: readonly [ 'backdrop', 'positioner', 'root', 'header', 'title', 'subtitle', 'close', 'content', 'busy-scope', 'footer', 'confirm', 'cancel' ]; readonly CommandDialog: readonly [ 'backdrop', 'positioner', 'root', 'header', 'title', 'subtitle', 'close', 'content', 'busy-scope', 'footer', 'confirm', 'cancel' ]; readonly CommandStepper: readonly [ 'root', 'list', 'step', 'header', 'number', 'title', 'separator', 'panels', 'panel' ]; readonly DataTableCore: readonly [ 'root', 'search', 'search-input', 'table-container', 'table', 'head', 'header-row', 'header-cell', 'header-content', 'sort', 'select-all', 'body', 'empty-row', 'empty-cell', 'loading-row', 'loading-cell', 'failure-row', 'failure-cell', 'row', 'cell' ]; readonly DataTableForObservableQuery: readonly [ 'root', 'search', 'search-input', 'table-container', 'table', 'head', 'header-row', 'header-cell', 'header-content', 'sort', 'select-all', 'body', 'empty-row', 'empty-cell', 'loading-row', 'loading-cell', 'failure-row', 'failure-cell', 'row', 'cell' ]; readonly DataTableForQuery: readonly [ 'root', 'search', 'search-input', 'table-container', 'table', 'head', 'header-row', 'header-cell', 'header-content', 'sort', 'select-all', 'body', 'empty-row', 'empty-cell', 'loading-row', 'loading-cell', 'failure-row', 'failure-cell', 'row', 'cell' ]; readonly ColumnFilterMenu: readonly [ 'filter-trigger', 'filter-popover', 'filter-menu', 'filter-actions' ]; readonly TablePaginator: readonly [ 'root', 'range', 'info' ]; readonly Toaster: readonly [ 'region', 'toast', 'icon', 'content', 'title', 'description', 'close', 'action' ]; readonly EventsView: readonly [ 'timeline', 'event', 'separator', 'marker', 'connector', 'content' ]; readonly ChatSidebar: readonly [ 'backdrop', 'root', 'header', 'back', 'title', 'close', 'content' ]; readonly Toolbar: readonly [ 'root' ]; readonly ToolbarButton: readonly [ 'button', 'icon', 'label' ]; readonly ToolbarFolder: readonly [ 'toolbar-folder', 'toolbar-folder-trigger', 'toolbar-folder-panel' ]; readonly ToolbarFanOutItem: readonly [ 'fanout-root', 'fanout-trigger', 'fanout-panel' ]; readonly ToolbarSeparator: readonly [ 'toolbar-separator' ]; readonly ToolbarSection: readonly [ 'toolbar-section', 'toolbar-context' ]; readonly ToolbarGroup: readonly [ 'toolbar-group', 'toolbar-slot', 'toolbar-slot-incoming', 'toolbar-slot-outgoing' ]; readonly ToolbarLayout: readonly [ 'toolbar-layout', 'toolbar-slot', 'toolbar-slot-incoming', 'toolbar-slot-outgoing' ]; readonly Skeleton: readonly [ 'root' ]; readonly Message: readonly [ 'root', 'icon', 'text' ]; readonly Badge: readonly [ 'root' ]; readonly ProgressSpinner: readonly [ 'root', 'svg', 'track', 'range' ]; readonly Avatar: readonly [ 'root', 'image', 'fallback' ]; readonly Tag: readonly [ 'root', 'icon', 'label' ]; readonly ProgressBar: readonly [ 'root', 'indicator', 'label' ]; readonly Chip: readonly [ 'root', 'icon', 'label', 'remove' ]; }" } } diff --git a/Source/scripts/for_api_surface/when_computing_the_api_surface.ts b/Source/scripts/for_api_surface/when_computing_the_api_surface.ts index b30eb973..3abc0e94 100644 --- a/Source/scripts/for_api_surface/when_computing_the_api_surface.ts +++ b/Source/scripts/for_api_surface/when_computing_the_api_surface.ts @@ -9,17 +9,24 @@ import { compareApiSurfaces, computeApiSurface } from '../lib/api-surface.mjs'; let packageDir: string; -const writePackage = (declarations: string) => { - writeFileSync(path.join(packageDir, 'package.json'), JSON.stringify({ - name: 'example', exports: { './Example': { types: './dist/Example.d.ts', import: './dist/Example.js' } }, +const writePackage = (declarations: string, directory = packageDir, exports: Record = {}) => { + mkdirSync(path.join(directory, 'dist'), { recursive: true }); + writeFileSync(path.join(directory, 'package.json'), JSON.stringify({ + name: 'example', exports: { './Example': { types: './dist/Example.d.ts', import: './dist/Example.js' }, ...exports }, })); - writeFileSync(path.join(packageDir, 'dist', 'Example.d.ts'), declarations); + writeFileSync(path.join(directory, 'dist', 'Example.d.ts'), declarations); +}; + +const installExternalPackage = (directory: string) => { + const external = path.join(directory, 'node_modules', '@example', 'external'); + mkdirSync(external, { recursive: true }); + writeFileSync(path.join(external, 'package.json'), JSON.stringify({ name: '@example/external', types: './index.d.ts' })); + writeFileSync(path.join(external, 'index.d.ts'), 'export interface Shared { id: string; }\n'); }; describe('when computing the API surface', () => { beforeEach(() => { packageDir = mkdtempSync(path.join(os.tmpdir(), 'api-surface-spec-')); - mkdirSync(path.join(packageDir, 'dist')); }); afterEach(() => rmSync(packageDir, { recursive: true, force: true })); @@ -41,4 +48,52 @@ describe('when computing the API surface', () => { const after = computeApiSurface(packageDir); expect(compareApiSurfaces(before, after)).toEqual({ removed: [], changed: ['./Example#ExampleProps'], added: [] }); }); + + it('should record a re-export of another package by package and name, whether or not it resolves', () => { + const declarations = "export { Shared } from '@example/external';\n"; + writePackage(declarations); + installExternalPackage(packageDir); + const resolved = computeApiSurface(packageDir); + const unresolvedDir = mkdtempSync(path.join(os.tmpdir(), 'api-surface-spec-unresolved-')); + let unresolved: ReturnType; + try { + writePackage(declarations, unresolvedDir); + unresolved = computeApiSurface(unresolvedDir); + } finally { + rmSync(unresolvedDir, { recursive: true, force: true }); + } + expect(resolved['./Example'].Shared).toBe('re-export of @example/external#Shared'); + expect(unresolved['./Example'].Shared).toBe(resolved['./Example'].Shared); + }); + + it('should record a star re-export of another package by package and name', () => { + writePackage("export * from '@example/external';\n"); + installExternalPackage(packageDir); + expect(computeApiSurface(packageDir)['./Example'].Shared).toBe('re-export of @example/external#Shared'); + }); + + it('should report exporting a class only as a type as a change', () => { + mkdirSync(path.join(packageDir, 'dist'), { recursive: true }); + writeFileSync(path.join(packageDir, 'dist', 'Widget.d.ts'), 'export declare class Widget { }\n'); + writePackage("export { Widget } from './Widget';\n"); + const before = computeApiSurface(packageDir); + writePackage("export type { Widget } from './Widget';\n"); + const after = computeApiSurface(packageDir); + expect(compareApiSurfaces(before, after)).toEqual({ removed: [], changed: ['./Example#Widget'], added: [] }); + }); + + it('should include a typed JSON subpath and skip plain stylesheets', () => { + mkdirSync(path.join(packageDir, 'dist'), { recursive: true }); + writeFileSync(path.join(packageDir, 'dist', 'schema.d.ts'), 'declare const schema: unknown;\nexport default schema;\n'); + writePackage('export declare const value: string;\n', packageDir, { + './schema.json': { types: './dist/schema.d.ts', import: './dist/schema.json' }, + './styles': './dist/styles.css', + }); + expect(Object.keys(computeApiSurface(packageDir))).toEqual(['./Example', './schema.json']); + }); + + it('should fail on a plain export target that is not a stylesheet or JSON', () => { + writePackage('export declare const value: string;\n', packageDir, { './Plain': './dist/Plain.js' }); + expect(() => computeApiSurface(packageDir)).toThrow(/does not understand/u); + }); }); diff --git a/Source/scripts/lib/api-surface.mjs b/Source/scripts/lib/api-surface.mjs index 2941e563..2af3c028 100644 --- a/Source/scripts/lib/api-surface.mjs +++ b/Source/scripts/lib/api-surface.mjs @@ -14,10 +14,8 @@ export const typedSubpaths = (packageDir) => { const manifest = JSON.parse(readFileSync(path.join(packageDir, 'package.json'), 'utf8')); const subpaths = []; for (const [subpath, target] of Object.entries(manifest.exports ?? {})) { - // Stylesheets and JSON assets are not part of the typed API. - const asset = typeof target === 'string' || subpath.endsWith('.json') || subpath.endsWith('.css') || - subpath.endsWith('/styles') || (typeof target === 'object' && target !== null && target.style !== undefined); - if (asset) continue; + // Stylesheets and JSON files published as they are carry no declarations. + if (typeof target === 'string' && /\.(css|json)$/u.test(target)) continue; if (typeof target !== 'object' || target === null || typeof target.types !== 'string' || typeof target.import !== 'string') { // A new export shape must not silently drop out of the snapshot. @@ -62,6 +60,62 @@ const declarationText = (declaration) => { } }; +// The alias declarations an export passes through before reaching its declaration. +const aliasChain = (checker, exported) => { + const chain = []; + const seen = new Set(); + for (let symbol = exported; symbol && symbol.flags & ts.SymbolFlags.Alias && !seen.has(symbol);) { + seen.add(symbol); + chain.push(...(symbol.declarations ?? [])); + symbol = checker.getImmediateAliasedSymbol(symbol); + } + return chain; +}; + +const moduleSpecifierOf = (declaration) => { + if (ts.isExportSpecifier(declaration)) return declaration.parent.parent.moduleSpecifier; + if (ts.isImportSpecifier(declaration)) return declaration.parent.parent.parent.moduleSpecifier; + if (ts.isImportClause(declaration)) return declaration.parent.moduleSpecifier; + if (ts.isNamespaceImport(declaration)) return declaration.parent.parent.moduleSpecifier; + if (ts.isNamespaceExport(declaration)) return declaration.parent.moduleSpecifier; + return undefined; +}; + +const importedNameOf = (declaration) => { + if (ts.isExportSpecifier(declaration) || ts.isImportSpecifier(declaration)) { + return (declaration.propertyName ?? declaration.name).text; + } + return ts.isImportClause(declaration) ? 'default' : '*'; +}; + +// The first alias in the chain that names a bare package specifier, as `package#name`. +const externalSource = (chain) => { + for (const declaration of chain) { + const specifier = moduleSpecifierOf(declaration); + if (specifier && ts.isStringLiteral(specifier) && !specifier.text.startsWith('.') && !path.isAbsolute(specifier.text)) { + return `${specifier.text}#${importedNameOf(declaration)}`; + } + } + return undefined; +}; + +// The installed package whose files declare an export, for declarations reached without an alias, +// such as through `export *`. +const installedPackageOf = (packageRoot, declarations) => { + const names = declarations.map((declaration) => { + const file = path.resolve(declaration.getSourceFile().fileName); + const relative = path.relative(packageRoot, file).split(path.sep); + const inside = relative[0] !== '..' && !path.isAbsolute(relative.join(path.sep)); + if (inside && !relative.includes('node_modules')) return undefined; + const segments = file.split(path.sep); + const index = segments.lastIndexOf('node_modules'); + if (index < 0) throw new Error(`An export is declared outside the package and outside node_modules: ${file}`); + const scoped = segments[index + 1]?.startsWith('@'); + return segments.slice(index + 1, index + (scoped ? 3 : 2)).join('/'); + }); + return names.every((name) => name !== undefined) ? names[0] : undefined; +}; + /** * Computes the exported API surface of every typed subpath: each export's name and the text of * the declarations it resolves to, with comments removed. @@ -79,7 +133,7 @@ export const computeApiSurface = (packageDir) => { jsx: ts.JsxEmit.ReactJSX, }); const checker = program.getTypeChecker(); - const packageRoot = `${path.resolve(packageDir)}${path.sep}`; + const packageRoot = path.resolve(packageDir); const surface = {}; for (const { subpath, entry } of subpaths) { const sourceFile = program.getSourceFile(entry); @@ -87,20 +141,23 @@ export const computeApiSurface = (packageDir) => { const moduleSymbol = checker.getSymbolAtLocation(sourceFile); const exports = moduleSymbol ? checker.getExportsOfModule(moduleSymbol) : []; const entries = exports.map((exported) => { + const chain = aliasChain(checker, exported); + const typeOnly = chain.some((declaration) => ts.isTypeOnlyImportOrExportDeclaration(declaration)); + // A re-export of another package is recorded by the package and name it comes from: + // its text depends on that package's installed version, and it is recorded the same + // way whether or not that package can be resolved here. + const external = externalSource(chain); + if (external) return [exported.getName(), `re-export of ${typeOnly ? 'type ' : ''}${external}`]; const target = exported.flags & ts.SymbolFlags.Alias ? checker.getAliasedSymbol(exported) : exported; const declarations = target.declarations ?? []; if (declarations.length === 0) { throw new Error(`The export '${subpath}#${exported.getName()}' does not resolve to a declaration.`); } - // A re-export of another package's type is recorded by where it comes from; its text - // depends on that package's installed version, not on this package. - const external = declarations.every((declaration) => - !path.resolve(declaration.getSourceFile().fileName).startsWith(packageRoot) || - declaration.getSourceFile().fileName.includes(`${path.sep}node_modules${path.sep}`)); - const text = external - ? `re-export of ${checker.getFullyQualifiedName(target)}` - : declarations.map(declarationText).join(' | '); - return [exported.getName(), text]; + const installed = installedPackageOf(packageRoot, declarations); + if (installed) return [exported.getName(), `re-export of ${typeOnly ? 'type ' : ''}${installed}#${target.getName()}`]; + // Exporting a value with `export type` removes the value for consumers. + const text = declarations.map(declarationText).join(' | '); + return [exported.getName(), typeOnly && target.flags & ts.SymbolFlags.Value ? `(type-only) ${text}` : text]; }).sort(([left], [right]) => ordinal(left, right)); surface[subpath] = Object.fromEntries(entries); } diff --git a/Source/scripts/report-api-compatibility.mjs b/Source/scripts/report-api-compatibility.mjs index 672239f9..8fac20ca 100644 --- a/Source/scripts/report-api-compatibility.mjs +++ b/Source/scripts/report-api-compatibility.mjs @@ -15,8 +15,7 @@ * package's own API surface could not be computed. */ import { spawnSync } from 'node:child_process'; -import { appendFileSync, mkdtempSync, readdirSync, rmSync } from 'node:fs'; -import os from 'node:os'; +import { appendFileSync, mkdirSync, mkdtempSync, readdirSync, rmSync } from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; import { compareApiSurfaces, computeApiSurface } from './lib/api-surface.mjs'; @@ -26,7 +25,11 @@ const version = process.argv.slice(2).find((argument) => !argument.startsWith('- const failOnBreaking = process.argv.includes('--fail-on-breaking'); const packageName = '@cratis/components'; -const scratch = mkdtempSync(path.join(os.tmpdir(), 'cratis-api-baseline-')); +// The baseline is unpacked below this package's node_modules, so its imports of other packages +// resolve to the installed dependencies as they do for the current build. +const cacheDir = path.join(packageDir, 'node_modules', '.cache'); +mkdirSync(cacheDir, { recursive: true }); +const scratch = mkdtempSync(path.join(cacheDir, 'cratis-api-baseline-')); try { const pack = spawnSync('npm', ['pack', `${packageName}@${version}`, '--silent', '--fetch-retries=3', '--pack-destination', scratch], { encoding: 'utf8' }); From 09e2801a2679934b2d32a4bba14152efb5f2a92e Mon Sep 17 00:00:00 2001 From: woksin Date: Tue, 29 Sep 2026 08:23:56 +0200 Subject: [PATCH 4/5] Detect type-only star exports and keep package re-exports stable export type * now marks the values it withholds. A package re-export is judged only by this package's aliases, so it reads the same whatever the package does internally. A namespace re-export of an internal module lists its export names, and the report removes the unpacked baseline on every exit. --- .../when_computing_the_api_surface.ts | 27 ++++++++++++ Source/scripts/lib/api-surface.mjs | 41 +++++++++++++------ Source/scripts/lib/star-exports.mjs | 40 ++++++++++++++++++ Source/scripts/report-api-compatibility.mjs | 17 +++++--- 4 files changed, 107 insertions(+), 18 deletions(-) create mode 100644 Source/scripts/lib/star-exports.mjs diff --git a/Source/scripts/for_api_surface/when_computing_the_api_surface.ts b/Source/scripts/for_api_surface/when_computing_the_api_surface.ts index 3abc0e94..4c118ff7 100644 --- a/Source/scripts/for_api_surface/when_computing_the_api_surface.ts +++ b/Source/scripts/for_api_surface/when_computing_the_api_surface.ts @@ -96,4 +96,31 @@ describe('when computing the API surface', () => { writePackage('export declare const value: string;\n', packageDir, { './Plain': './dist/Plain.js' }); expect(() => computeApiSurface(packageDir)).toThrow(/does not understand/u); }); + + it('should report switching a star export to a type-only star export as a change', () => { + mkdirSync(path.join(packageDir, 'dist'), { recursive: true }); + writeFileSync(path.join(packageDir, 'dist', 'Widget.d.ts'), 'export declare class Widget { }\n'); + writeFileSync(path.join(packageDir, 'dist', 'inner.d.ts'), "export * from './Widget';\n"); + writePackage("export * from './inner';\n"); + const before = computeApiSurface(packageDir); + writeFileSync(path.join(packageDir, 'dist', 'inner.d.ts'), "export type * from './Widget';\n"); + const after = computeApiSurface(packageDir); + expect(compareApiSurfaces(before, after)).toEqual({ removed: [], changed: ['./Example#Widget'], added: [] }); + }); + + it('should record a package re-export the same way whatever the package does internally', () => { + writePackage("export { Shared } from '@example/external';\n"); + installExternalPackage(packageDir); + const external = path.join(packageDir, 'node_modules', '@example', 'external'); + writeFileSync(path.join(external, 'shared.d.ts'), 'export declare class Shared { }\n'); + writeFileSync(path.join(external, 'index.d.ts'), "export type { Shared } from './shared';\n"); + expect(computeApiSurface(packageDir)['./Example'].Shared).toBe('re-export of @example/external#Shared'); + }); + + it('should describe a namespace re-export of an internal module by its export names', () => { + mkdirSync(path.join(packageDir, 'dist'), { recursive: true }); + writeFileSync(path.join(packageDir, 'dist', 'inner.d.ts'), 'declare const hidden: number;\nexport declare const second: typeof hidden;\nexport declare class First { }\nexport {};\n'); + writePackage("export * as Inner from './inner';\n"); + expect(computeApiSurface(packageDir)['./Example'].Inner).toBe('namespace { First, second }'); + }); }); diff --git a/Source/scripts/lib/api-surface.mjs b/Source/scripts/lib/api-surface.mjs index 2af3c028..0a8c462b 100644 --- a/Source/scripts/lib/api-surface.mjs +++ b/Source/scripts/lib/api-surface.mjs @@ -4,6 +4,7 @@ import { readFileSync } from 'node:fs'; import path from 'node:path'; import ts from 'typescript'; +import { typeOnlyStarExports } from './star-exports.mjs'; /** * The typed JavaScript subpaths a package publishes, with the declaration entry each resolves to. @@ -88,17 +89,23 @@ const importedNameOf = (declaration) => { return ts.isImportClause(declaration) ? 'default' : '*'; }; -// The first alias in the chain that names a bare package specifier, as `package#name`. +// The first alias in the chain that names a bare package specifier: `package#name` and its index. const externalSource = (chain) => { - for (const declaration of chain) { + for (const [index, declaration] of chain.entries()) { const specifier = moduleSpecifierOf(declaration); if (specifier && ts.isStringLiteral(specifier) && !specifier.text.startsWith('.') && !path.isAbsolute(specifier.text)) { - return `${specifier.text}#${importedNameOf(declaration)}`; + return { source: `${specifier.text}#${importedNameOf(declaration)}`, index }; } } return undefined; }; +const isTypeOnlyAlias = (declaration) => ts.isTypeOnlyImportOrExportDeclaration(declaration); + +// A namespace re-export of a module is described by the names it exports, not the module's text. +const namespaceText = (checker, target) => + `namespace { ${checker.getExportsOfModule(target).map((symbol) => symbol.getName()).sort(ordinal).join(', ')} }`; + // The installed package whose files declare an export, for declarations reached without an alias, // such as through `export *`. const installedPackageOf = (packageRoot, declarations) => { @@ -140,24 +147,34 @@ export const computeApiSurface = (packageDir) => { if (!sourceFile) throw new Error(`The declaration entry for '${subpath}' was not found: ${entry}`); const moduleSymbol = checker.getSymbolAtLocation(sourceFile); const exports = moduleSymbol ? checker.getExportsOfModule(moduleSymbol) : []; + const starTypeOnly = typeOnlyStarExports(checker, sourceFile); const entries = exports.map((exported) => { + const name = exported.getName(); const chain = aliasChain(checker, exported); - const typeOnly = chain.some((declaration) => ts.isTypeOnlyImportOrExportDeclaration(declaration)); - // A re-export of another package is recorded by the package and name it comes from: - // its text depends on that package's installed version, and it is recorded the same - // way whether or not that package can be resolved here. + // A name this module does not export itself arrives through `export *`. + const throughStar = !(exported.declarations ?? []).some((declaration) => declaration.getSourceFile() === sourceFile); + const starOnlyAsType = throughStar && starTypeOnly.get(name) === true; + // A re-export of another package is recorded by the package and name it comes from, + // judged only by this package's own aliases, so it reads the same whether or not that + // package resolves here and whatever that package does internally. const external = externalSource(chain); - if (external) return [exported.getName(), `re-export of ${typeOnly ? 'type ' : ''}${external}`]; + if (external) { + const typeOnly = starOnlyAsType || chain.slice(0, external.index + 1).some(isTypeOnlyAlias); + return [name, `re-export of ${typeOnly ? 'type ' : ''}${external.source}`]; + } + const typeOnly = starOnlyAsType || chain.some(isTypeOnlyAlias); const target = exported.flags & ts.SymbolFlags.Alias ? checker.getAliasedSymbol(exported) : exported; const declarations = target.declarations ?? []; if (declarations.length === 0) { - throw new Error(`The export '${subpath}#${exported.getName()}' does not resolve to a declaration.`); + throw new Error(`The export '${subpath}#${name}' does not resolve to a declaration.`); } const installed = installedPackageOf(packageRoot, declarations); - if (installed) return [exported.getName(), `re-export of ${typeOnly ? 'type ' : ''}${installed}#${target.getName()}`]; + if (installed) return [name, `re-export of ${typeOnly ? 'type ' : ''}${installed}#${target.getName()}`]; + const text = declarations.some(ts.isSourceFile) + ? namespaceText(checker, target) + : declarations.map(declarationText).join(' | '); // Exporting a value with `export type` removes the value for consumers. - const text = declarations.map(declarationText).join(' | '); - return [exported.getName(), typeOnly && target.flags & ts.SymbolFlags.Value ? `(type-only) ${text}` : text]; + return [name, typeOnly && target.flags & ts.SymbolFlags.Value ? `(type-only) ${text}` : text]; }).sort(([left], [right]) => ordinal(left, right)); surface[subpath] = Object.fromEntries(entries); } diff --git a/Source/scripts/lib/star-exports.mjs b/Source/scripts/lib/star-exports.mjs new file mode 100644 index 00000000..386d2d8b --- /dev/null +++ b/Source/scripts/lib/star-exports.mjs @@ -0,0 +1,40 @@ +// Copyright (c) Cratis. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +import ts from 'typescript'; + +const isRelative = (specifier) => specifier.startsWith('.'); + +/** + * Finds which names a module re-exports through `export *` only as types, because every + * `export *` path that reaches them passes an `export type *`. Star exports create no alias + * symbols, so the alias chain of such a name does not show that its value was withheld. + * @param {ts.TypeChecker} checker The type checker. + * @param {ts.SourceFile} sourceFile The module to inspect. + * @returns {Map} Name to whether it is reachable only as a type. + */ +export const typeOnlyStarExports = (checker, sourceFile) => collect(checker, sourceFile, false, new Set()); + +const collect = (checker, sourceFile, typeOnly, visiting) => { + const result = new Map(); + if (visiting.has(sourceFile)) return result; + visiting.add(sourceFile); + const merge = (name, onlyAsType) => result.set(name, result.has(name) ? result.get(name) && onlyAsType : onlyAsType); + for (const statement of sourceFile.statements) { + if (!ts.isExportDeclaration(statement) || statement.exportClause || !statement.moduleSpecifier) continue; + const moduleSymbol = checker.getSymbolAtLocation(statement.moduleSpecifier); + if (!moduleSymbol) continue; + const onlyAsType = typeOnly || statement.isTypeOnly; + const target = moduleSymbol.declarations?.find(ts.isSourceFile); + // Names from deeper star exports of an internal module carry their own path's marking. + const deeper = target && ts.isStringLiteral(statement.moduleSpecifier) && isRelative(statement.moduleSpecifier.text) + ? collect(checker, target, onlyAsType, visiting) + : new Map(); + for (const exported of checker.getExportsOfModule(moduleSymbol)) { + const name = exported.getName(); + merge(name, deeper.has(name) ? deeper.get(name) : onlyAsType); + } + } + visiting.delete(sourceFile); + return result; +}; diff --git a/Source/scripts/report-api-compatibility.mjs b/Source/scripts/report-api-compatibility.mjs index 8fac20ca..475d27cd 100644 --- a/Source/scripts/report-api-compatibility.mjs +++ b/Source/scripts/report-api-compatibility.mjs @@ -30,6 +30,11 @@ const packageName = '@cratis/components'; const cacheDir = path.join(packageDir, 'node_modules', '.cache'); mkdirSync(cacheDir, { recursive: true }); const scratch = mkdtempSync(path.join(cacheDir, 'cratis-api-baseline-')); +// process.exit skips finally blocks, so every exit removes the unpacked baseline first. +const finish = (code) => { + rmSync(scratch, { recursive: true, force: true }); + process.exit(code); +}; try { const pack = spawnSync('npm', ['pack', `${packageName}@${version}`, '--silent', '--fetch-retries=3', '--pack-destination', scratch], { encoding: 'utf8' }); @@ -42,21 +47,21 @@ try { const reason = /E404|404 Not Found/u.test(output) ? `${packageName}@${version} is not published yet, so there is no release to compare with.` : `The baseline ${packageName}@${version} could not be downloaded: ${output.split('\n')[0] || 'no output'}`; - const report = `## Public API compared with the latest release\n\nNo baseline. ${reason}\n`; + const report = `## Public API compared with ${packageName}@${version}\n\nNo baseline. ${reason}\n`; console.log(report); if (process.env.GITHUB_STEP_SUMMARY) appendFileSync(process.env.GITHUB_STEP_SUMMARY, `${report}\n`); try { computeApiSurface(packageDir); } catch (error) { console.error(`Could not compute the API surface: ${error instanceof Error ? error.message : String(error)}`); - process.exit(2); + finish(2); } - process.exit(0); + finish(0); } const extract = spawnSync('tar', ['-xzf', path.join(scratch, archive), '-C', scratch], { encoding: 'utf8' }); if (extract.status !== 0) { console.error(`Could not extract ${archive}: ${extract.stderr.trim()}`); - process.exit(2); + finish(2); } const baselineVersion = archive.replace(/^cratis-components-/u, '').replace(/\.tgz$/u, ''); @@ -67,7 +72,7 @@ try { current = computeApiSurface(packageDir); } catch (error) { console.error(`Could not compute an API surface: ${error instanceof Error ? error.message : String(error)}`); - process.exit(2); + finish(2); } const { removed, changed, added } = compareApiSurfaces(baseline, current); const list = (items) => items.length ? items.map((item) => `- \`${item}\``).join('\n') : '- none'; @@ -88,7 +93,7 @@ try { ].join('\n'); console.log(report); if (process.env.GITHUB_STEP_SUMMARY) appendFileSync(process.env.GITHUB_STEP_SUMMARY, `${report}\n`); - if (failOnBreaking && removed.length + changed.length > 0) process.exit(1); + if (failOnBreaking && removed.length + changed.length > 0) finish(1); } finally { rmSync(scratch, { recursive: true, force: true }); } From a494da5518a18dff29243aabc61bf4c7ff6befc5 Mon Sep 17 00:00:00 2001 From: woksin Date: Tue, 29 Sep 2026 08:32:06 +0200 Subject: [PATCH 5/5] Describe namespace members and honor shadowing and cycles in star exports A namespace re-export of an internal module lists each member with its declaration, so a member's change shows up. A barrel's own export shadows its type-only star export, and a star-export cycle no longer clears the type-only mark. --- .../when_computing_the_api_surface.ts | 26 +++++- Source/scripts/lib/api-surface.mjs | 81 +++++++++++-------- Source/scripts/lib/star-exports.mjs | 11 ++- 3 files changed, 77 insertions(+), 41 deletions(-) diff --git a/Source/scripts/for_api_surface/when_computing_the_api_surface.ts b/Source/scripts/for_api_surface/when_computing_the_api_surface.ts index 4c118ff7..5af46a96 100644 --- a/Source/scripts/for_api_surface/when_computing_the_api_surface.ts +++ b/Source/scripts/for_api_surface/when_computing_the_api_surface.ts @@ -117,10 +117,32 @@ describe('when computing the API surface', () => { expect(computeApiSurface(packageDir)['./Example'].Shared).toBe('re-export of @example/external#Shared'); }); - it('should describe a namespace re-export of an internal module by its export names', () => { + it('should describe a namespace re-export of an internal module member by member', () => { mkdirSync(path.join(packageDir, 'dist'), { recursive: true }); writeFileSync(path.join(packageDir, 'dist', 'inner.d.ts'), 'declare const hidden: number;\nexport declare const second: typeof hidden;\nexport declare class First { }\nexport {};\n'); writePackage("export * as Inner from './inner';\n"); - expect(computeApiSurface(packageDir)['./Example'].Inner).toBe('namespace { First, second }'); + const before = computeApiSurface(packageDir); + expect(before['./Example'].Inner).toBe('namespace { First: export declare class First { }; second: second: typeof hidden; }'); + writeFileSync(path.join(packageDir, 'dist', 'inner.d.ts'), 'declare const hidden: string;\nexport declare const second: number;\nexport declare class First { }\nexport {};\n'); + expect(compareApiSurfaces(before, computeApiSurface(packageDir)).changed).toEqual(['./Example#Inner']); + }); + + it("should let a barrel's own value export shadow a type-only star export", () => { + mkdirSync(path.join(packageDir, 'dist'), { recursive: true }); + writeFileSync(path.join(packageDir, 'dist', 'w.d.ts'), 'export declare class W { }\n'); + writeFileSync(path.join(packageDir, 'dist', 'middle.d.ts'), "export { W } from './w';\nexport type * from './w';\n"); + writePackage("export * from './middle';\n"); + const before = computeApiSurface(packageDir); + expect(before['./Example'].W).toBe('export declare class W { }'); + writeFileSync(path.join(packageDir, 'dist', 'middle.d.ts'), "export type { W } from './w';\nexport type * from './w';\n"); + expect(compareApiSurfaces(before, computeApiSurface(packageDir)).changed).toEqual(['./Example#W']); + }); + + it('should mark a name reached only through a type-only star export inside a cycle', () => { + mkdirSync(path.join(packageDir, 'dist'), { recursive: true }); + writeFileSync(path.join(packageDir, 'dist', 'w.d.ts'), 'export declare class W { }\n'); + writeFileSync(path.join(packageDir, 'dist', 'cycle.d.ts'), "export * from './Example';\nexport type * from './w';\n"); + writePackage("export * from './cycle';\n"); + expect(computeApiSurface(packageDir)['./Example'].W).toBe('(type-only) export declare class W { }'); }); }); diff --git a/Source/scripts/lib/api-surface.mjs b/Source/scripts/lib/api-surface.mjs index 0a8c462b..9e978887 100644 --- a/Source/scripts/lib/api-surface.mjs +++ b/Source/scripts/lib/api-surface.mjs @@ -102,10 +102,6 @@ const externalSource = (chain) => { const isTypeOnlyAlias = (declaration) => ts.isTypeOnlyImportOrExportDeclaration(declaration); -// A namespace re-export of a module is described by the names it exports, not the module's text. -const namespaceText = (checker, target) => - `namespace { ${checker.getExportsOfModule(target).map((symbol) => symbol.getName()).sort(ordinal).join(', ')} }`; - // The installed package whose files declare an export, for declarations reached without an alias, // such as through `export *`. const installedPackageOf = (packageRoot, declarations) => { @@ -123,6 +119,51 @@ const installedPackageOf = (packageRoot, declarations) => { return names.every((name) => name !== undefined) ? names[0] : undefined; }; +// Each export of a module with the text that describes it, sorted by name. A namespace re-export +// of an internal module is described member by member, so a member's change shows up too. +const describeModule = (checker, packageRoot, subpath, moduleSymbol, sourceFile, visiting) => { + if (!moduleSymbol) return []; + visiting.add(sourceFile); + const starTypeOnly = typeOnlyStarExports(checker, sourceFile); + const entries = checker.getExportsOfModule(moduleSymbol).map((exported) => { + const name = exported.getName(); + const chain = aliasChain(checker, exported); + // A name this module does not export itself arrives through `export *`. + const throughStar = !(exported.declarations ?? []).some((declaration) => declaration.getSourceFile() === sourceFile); + const starOnlyAsType = throughStar && starTypeOnly.get(name) === true; + // A re-export of another package is recorded by the package and name it comes from, + // judged only by this package's own aliases, so it reads the same whether or not that + // package resolves here and whatever that package does internally. + const external = externalSource(chain); + if (external) { + const typeOnly = starOnlyAsType || chain.slice(0, external.index + 1).some(isTypeOnlyAlias); + return [name, `re-export of ${typeOnly ? 'type ' : ''}${external.source}`]; + } + const typeOnly = starOnlyAsType || chain.some(isTypeOnlyAlias); + const target = exported.flags & ts.SymbolFlags.Alias ? checker.getAliasedSymbol(exported) : exported; + const declarations = target.declarations ?? []; + if (declarations.length === 0) { + throw new Error(`The export '${subpath}#${name}' does not resolve to a declaration.`); + } + const installed = installedPackageOf(packageRoot, declarations); + if (installed) return [name, `re-export of ${typeOnly ? 'type ' : ''}${installed}#${target.getName()}`]; + const moduleFile = declarations.find(ts.isSourceFile); + let text; + if (moduleFile) { + const members = visiting.has(moduleFile) + ? [['(cycle)', '']] + : describeModule(checker, packageRoot, subpath, target, moduleFile, visiting); + text = `namespace { ${members.map(([member, memberText]) => `${member}: ${memberText};`).join(' ')} }`; + } else { + text = declarations.map(declarationText).join(' | '); + } + // Exporting a value with `export type` removes the value for consumers. + return [name, typeOnly && target.flags & ts.SymbolFlags.Value ? `(type-only) ${text}` : text]; + }).sort(([left], [right]) => ordinal(left, right)); + visiting.delete(sourceFile); + return entries; +}; + /** * Computes the exported API surface of every typed subpath: each export's name and the text of * the declarations it resolves to, with comments removed. @@ -146,37 +187,7 @@ export const computeApiSurface = (packageDir) => { const sourceFile = program.getSourceFile(entry); if (!sourceFile) throw new Error(`The declaration entry for '${subpath}' was not found: ${entry}`); const moduleSymbol = checker.getSymbolAtLocation(sourceFile); - const exports = moduleSymbol ? checker.getExportsOfModule(moduleSymbol) : []; - const starTypeOnly = typeOnlyStarExports(checker, sourceFile); - const entries = exports.map((exported) => { - const name = exported.getName(); - const chain = aliasChain(checker, exported); - // A name this module does not export itself arrives through `export *`. - const throughStar = !(exported.declarations ?? []).some((declaration) => declaration.getSourceFile() === sourceFile); - const starOnlyAsType = throughStar && starTypeOnly.get(name) === true; - // A re-export of another package is recorded by the package and name it comes from, - // judged only by this package's own aliases, so it reads the same whether or not that - // package resolves here and whatever that package does internally. - const external = externalSource(chain); - if (external) { - const typeOnly = starOnlyAsType || chain.slice(0, external.index + 1).some(isTypeOnlyAlias); - return [name, `re-export of ${typeOnly ? 'type ' : ''}${external.source}`]; - } - const typeOnly = starOnlyAsType || chain.some(isTypeOnlyAlias); - const target = exported.flags & ts.SymbolFlags.Alias ? checker.getAliasedSymbol(exported) : exported; - const declarations = target.declarations ?? []; - if (declarations.length === 0) { - throw new Error(`The export '${subpath}#${name}' does not resolve to a declaration.`); - } - const installed = installedPackageOf(packageRoot, declarations); - if (installed) return [name, `re-export of ${typeOnly ? 'type ' : ''}${installed}#${target.getName()}`]; - const text = declarations.some(ts.isSourceFile) - ? namespaceText(checker, target) - : declarations.map(declarationText).join(' | '); - // Exporting a value with `export type` removes the value for consumers. - return [name, typeOnly && target.flags & ts.SymbolFlags.Value ? `(type-only) ${text}` : text]; - }).sort(([left], [right]) => ordinal(left, right)); - surface[subpath] = Object.fromEntries(entries); + surface[subpath] = Object.fromEntries(describeModule(checker, packageRoot, subpath, moduleSymbol, sourceFile, new Set())); } return surface; }; diff --git a/Source/scripts/lib/star-exports.mjs b/Source/scripts/lib/star-exports.mjs index 386d2d8b..12c166c1 100644 --- a/Source/scripts/lib/star-exports.mjs +++ b/Source/scripts/lib/star-exports.mjs @@ -26,13 +26,16 @@ const collect = (checker, sourceFile, typeOnly, visiting) => { if (!moduleSymbol) continue; const onlyAsType = typeOnly || statement.isTypeOnly; const target = moduleSymbol.declarations?.find(ts.isSourceFile); + // A cycle adds no names that are not already reached another way. + if (target && visiting.has(target)) continue; + const internal = target && ts.isStringLiteral(statement.moduleSpecifier) && isRelative(statement.moduleSpecifier.text); // Names from deeper star exports of an internal module carry their own path's marking. - const deeper = target && ts.isStringLiteral(statement.moduleSpecifier) && isRelative(statement.moduleSpecifier.text) - ? collect(checker, target, onlyAsType, visiting) - : new Map(); + const deeper = internal ? collect(checker, target, onlyAsType, visiting) : new Map(); for (const exported of checker.getExportsOfModule(moduleSymbol)) { const name = exported.getName(); - merge(name, deeper.has(name) ? deeper.get(name) : onlyAsType); + // A name the target exports or declares itself shadows its own star exports. + const ownExport = (exported.declarations ?? []).some((declaration) => declaration.getSourceFile() === target); + merge(name, deeper.has(name) && !ownExport ? deeper.get(name) : onlyAsType); } } visiting.delete(sourceFile);