@openwarelabs/ui 0.3.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -7
- package/dist/components/Calendar/Calendar.d.cts +58 -0
- package/dist/components/Calendar/Calendar.d.ts +58 -0
- package/dist/components/Calendar/DateRangePicker.d.cts +39 -0
- package/dist/components/Calendar/DateRangePicker.d.ts +39 -0
- package/dist/components/Calendar/RangeCalendar.d.cts +38 -0
- package/dist/components/Calendar/RangeCalendar.d.ts +38 -0
- package/dist/components/Calendar/dates.d.cts +13 -0
- package/dist/components/Calendar/dates.d.ts +13 -0
- package/dist/components/ChainOfThought/ChainOfThought.d.cts +44 -0
- package/dist/components/ChainOfThought/ChainOfThought.d.ts +44 -0
- package/dist/components/Chat/ChatConversation.d.cts +48 -0
- package/dist/components/Chat/ChatConversation.d.ts +48 -0
- package/dist/components/Chat/ChatLoader.d.cts +21 -0
- package/dist/components/Chat/ChatLoader.d.ts +21 -0
- package/dist/components/Chat/ChatMessage.d.cts +93 -0
- package/dist/components/Chat/ChatMessage.d.ts +93 -0
- package/dist/components/ChatSource/ChatSource.d.cts +58 -0
- package/dist/components/ChatSource/ChatSource.d.ts +58 -0
- package/dist/components/ChatTool/ChatTool.d.cts +89 -0
- package/dist/components/ChatTool/ChatTool.d.ts +89 -0
- package/dist/components/ColorPicker/ColorArea.d.cts +44 -0
- package/dist/components/ColorPicker/ColorArea.d.ts +44 -0
- package/dist/components/ColorPicker/ColorSlider.d.cts +53 -0
- package/dist/components/ColorPicker/ColorSlider.d.ts +53 -0
- package/dist/components/ColorPicker/ColorSwatchPicker.d.cts +43 -0
- package/dist/components/ColorPicker/ColorSwatchPicker.d.ts +43 -0
- package/dist/components/ColorPicker/color.d.cts +91 -0
- package/dist/components/ColorPicker/color.d.ts +91 -0
- package/dist/components/DateField/DateField.d.cts +47 -0
- package/dist/components/DateField/DateField.d.ts +47 -0
- package/dist/components/DateField/SegmentedField.d.cts +63 -0
- package/dist/components/DateField/SegmentedField.d.ts +63 -0
- package/dist/components/DateField/TimeField.d.cts +52 -0
- package/dist/components/DateField/TimeField.d.ts +52 -0
- package/dist/components/Field/Field.d.cts +17 -5
- package/dist/components/Field/Field.d.ts +17 -5
- package/dist/components/FileDropZone/FileDropZone.d.cts +1 -1
- package/dist/components/FileDropZone/FileDropZone.d.ts +1 -1
- package/dist/components/Form/Form.d.cts +63 -0
- package/dist/components/Form/Form.d.ts +63 -0
- package/dist/components/InputOTP/InputOTP.d.cts +7 -1
- package/dist/components/InputOTP/InputOTP.d.ts +7 -1
- package/dist/components/ListBox/ListBox.d.cts +65 -0
- package/dist/components/ListBox/ListBox.d.ts +65 -0
- package/dist/components/Meter/Meter.d.cts +62 -0
- package/dist/components/Meter/Meter.d.ts +62 -0
- package/dist/components/PromptInput/PromptInput.d.cts +95 -0
- package/dist/components/PromptInput/PromptInput.d.ts +95 -0
- package/dist/components/PromptInput/PromptSuggestion.d.cts +36 -0
- package/dist/components/PromptInput/PromptSuggestion.d.ts +36 -0
- package/dist/components/Prose/Prose.d.cts +22 -0
- package/dist/components/Prose/Prose.d.ts +22 -0
- package/dist/components/Slider/Slider.d.cts +7 -1
- package/dist/components/Slider/Slider.d.ts +7 -1
- package/dist/components/TextShimmer/TextShimmer.d.cts +20 -0
- package/dist/components/TextShimmer/TextShimmer.d.ts +20 -0
- package/dist/components/ToggleButtonGroup/ToggleButtonGroup.d.cts +74 -0
- package/dist/components/ToggleButtonGroup/ToggleButtonGroup.d.ts +74 -0
- package/dist/components/Toolbar/Toolbar.d.cts +36 -0
- package/dist/components/Toolbar/Toolbar.d.ts +36 -0
- package/dist/components.css +3557 -38
- package/dist/index.cjs +7391 -3179
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.cts +45 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.js +7478 -3214
- package/dist/index.js.map +4 -4
- package/dist/openware-ui.iife.js +7 -6
- package/dist/styles.css +3557 -38
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -50,19 +50,20 @@ import { Button, Field, Input, Toaster, toast } from "@openwarelabs/ui";
|
|
|
50
50
|
|
|
51
51
|
## Components
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
93 components, each with a page in the docs.
|
|
54
54
|
|
|
55
55
|
| Group | Components |
|
|
56
56
|
| --- | --- |
|
|
57
|
-
| Typography | `Text` (each style on the Typography page as a variant: hero to caption, code and kbd; tones, `truncate`, `as`), `Link`, `Kbd`, `Code`, `CodeBlock`, `Snippet` |
|
|
58
|
-
| Actions | `Button` (primary, secondary, ghost, danger; sm, md, lg; `loading`; `shape="pill"`), `buttonClassName()` for links, `ButtonGroup`, `CloseButton`, `CopyButton`, `ToggleButton`, `SegmentedControl` |
|
|
59
|
-
| Inputs | `Field`, `Fieldset`, `Input` (start and end content), `Textarea` (`autoGrow`), `NumberField`, `SearchField`, `InputOTP`, `ColorField` |
|
|
60
|
-
| Choices | `Checkbox`, `CheckboxGroup`, `RadioGroup` (plain or cards), `Switch`, `Select`, `Combobox`, `Slider` (one value or a range), `ChoiceCard` |
|
|
61
|
-
| Pickers | `Calendar`, `DatePicker`, `ColorPicker`, `FileDropZone` |
|
|
62
|
-
| Feedback | `Alert`, `Badge`, `ProgressBar`, `ProgressCircle`, `Spinner`, `Skeleton`, `SkeletonRows`, `Toaster` + `toast()` (sonner: stacked, swipeable, with actions and promises), `Tooltip` |
|
|
57
|
+
| Typography | `Text` (each style on the Typography page as a variant: hero to caption, code and kbd; tones, `truncate`, `as`), `Link`, `Kbd`, `Code`, `CodeBlock`, `Snippet`, `Prose` (styles rendered Markdown or HTML, at chat or article size) |
|
|
58
|
+
| Actions | `Button` (primary, secondary, ghost, danger; sm, md, lg; `loading`; `shape="pill"`), `buttonClassName()` for links, `ButtonGroup`, `CloseButton`, `CopyButton`, `ToggleButton`, `SegmentedControl`, `ToggleButtonGroup` (one or several on), `Toolbar` + `ToolbarSeparator` (arrow keys across its controls) |
|
|
59
|
+
| Inputs | `Form` (the browser's checks, your own and the server's errors, under each field; `useFormStatus`), `Field`, `Fieldset`, `Input` (start and end content), `Textarea` (`autoGrow`), `NumberField`, `SearchField`, `InputOTP`, `ColorField`, `DateField` and `TimeField` (typed in segments, in the locale's order) |
|
|
60
|
+
| Choices | `Checkbox`, `CheckboxGroup`, `RadioGroup` (plain or cards), `Switch`, `Select`, `Combobox`, `Slider` (one value or a range), `ChoiceCard`, `ListBox` (one or many, on the page) |
|
|
61
|
+
| Pickers | `Calendar`, `DatePicker`, `RangeCalendar`, `DateRangePicker` (with presets), `ColorPicker`, `ColorArea`, `ColorSlider`, `ColorSwatchPicker`, `FileDropZone` |
|
|
62
|
+
| Feedback | `Alert`, `Badge`, `ProgressBar`, `ProgressCircle`, `Meter` (an amount in a range, toned by thresholds), `Spinner`, `Skeleton`, `SkeletonRows`, `Toaster` + `toast()` (sonner: stacked, swipeable, with actions and promises), `Tooltip` |
|
|
63
63
|
| Overlays | `Dialog`, `ConfirmDialog`, `Drawer`, `Popover`, `Menu` + `MenuItem`, `CommandPalette` |
|
|
64
64
|
| Navigation | `Tabs`, `Accordion`, `Disclosure`, `Breadcrumbs`, `Pagination`, `Steps`, `NavList` + `NavItem` |
|
|
65
65
|
| Data display | `Table` (sorting, selection), `Stat`, `FileTree`, `EmptyState`, `Tag`, `ColorSwatch`, `Avatar`, `AvatarGroup`, `User` |
|
|
66
|
+
| AI | `PromptInput` (attachments, stop while streaming) + `PromptSuggestion`, `ChatConversation` (follows the newest message, jump to latest), `ChatMessage` + `ChatMessageActions`, `ChatLoader`, `ChatTool` (a tool call with its status, input, output and approval), `ChainOfThought`, `ChatSource` + `ChatSources`, `TextShimmer` |
|
|
66
67
|
| Layout | `Card`, `SettingsRow`, `Stack`, `Separator`, `ScrollShadow`, `VisuallyHidden` |
|
|
67
68
|
| Marketing | `SiteHeader`, `SectionHeading`, `Chip`, `DotGrid` |
|
|
68
69
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type KeyboardEvent, type Ref } from "react";
|
|
1
2
|
import { type ISODate } from "./dates.cjs";
|
|
2
3
|
export interface CalendarProps {
|
|
3
4
|
/** The chosen date as "YYYY-MM-DD", or "" for none. */
|
|
@@ -29,3 +30,60 @@ export interface CalendarHandle {
|
|
|
29
30
|
* (with Shift, by year), Home and End to the week's ends. Today is marked with a brass dot.
|
|
30
31
|
*/
|
|
31
32
|
export declare const Calendar: import("react").ForwardRefExoticComponent<CalendarProps & import("react").RefAttributes<CalendarHandle>>;
|
|
33
|
+
/** Whether the month before `first` has a day on or after `min`. */
|
|
34
|
+
export declare function canShowBefore(first: ISODate, min: ISODate | undefined): boolean;
|
|
35
|
+
/** Whether the month after `last` (the first of the last month shown) has a day on or before `max`. */
|
|
36
|
+
export declare function canShowAfter(last: ISODate, max: ISODate | undefined): boolean;
|
|
37
|
+
/** Where a key moves the focus from `date`: a day, a week, the week's ends, a month (with Shift, a year). */
|
|
38
|
+
export declare function dateForKey(event: KeyboardEvent<HTMLElement>, date: ISODate, weekStartsOn: 0 | 1): ISODate | undefined;
|
|
39
|
+
/** Which way the month changed since the last render, so the new one slides in from that side. */
|
|
40
|
+
export declare function useSlide(month: number): "next" | "previous" | undefined;
|
|
41
|
+
interface MonthNavButton {
|
|
42
|
+
disabled: boolean;
|
|
43
|
+
onClick(): void;
|
|
44
|
+
}
|
|
45
|
+
export interface MonthHeaderProps {
|
|
46
|
+
/** The first day of the month shown. */
|
|
47
|
+
month: ISODate;
|
|
48
|
+
locale?: string;
|
|
49
|
+
slide?: "next" | "previous";
|
|
50
|
+
/** The previous-month button, or null for an empty space of the same size. */
|
|
51
|
+
previous: MonthNavButton | null;
|
|
52
|
+
/** The next-month button, or null for an empty space of the same size. */
|
|
53
|
+
next: MonthNavButton | null;
|
|
54
|
+
}
|
|
55
|
+
/** The month's name between the previous- and next-month buttons. */
|
|
56
|
+
export declare function MonthHeader({ month, locale, slide, previous, next }: MonthHeaderProps): import("react").JSX.Element;
|
|
57
|
+
export interface MonthGridProps {
|
|
58
|
+
/** The first day of the month shown. */
|
|
59
|
+
month: ISODate;
|
|
60
|
+
/** The day that takes Tab focus (roving tabindex). */
|
|
61
|
+
focused: ISODate;
|
|
62
|
+
today: ISODate;
|
|
63
|
+
locale?: string;
|
|
64
|
+
weekStartsOn: 0 | 1;
|
|
65
|
+
slide?: "next" | "previous";
|
|
66
|
+
/** Leaves the days of the months either side empty, for months shown side by side. */
|
|
67
|
+
hideOutsideDays?: boolean;
|
|
68
|
+
isDisabled(date: ISODate): boolean;
|
|
69
|
+
/** aria-selected on the day's cell. */
|
|
70
|
+
isSelected(date: ISODate): boolean;
|
|
71
|
+
/** Fills the day with the primary colour. */
|
|
72
|
+
isFilled(date: ISODate): boolean;
|
|
73
|
+
/** Extra classes for a day's cell; `column` is 0 to 6 across the week. */
|
|
74
|
+
cellClassName?(date: ISODate, column: number): string | undefined;
|
|
75
|
+
/** Extra classes for a day's button. */
|
|
76
|
+
dayClassName?(date: ISODate): string | undefined;
|
|
77
|
+
/** Extra attributes for a day's button. */
|
|
78
|
+
dayProps?(date: ISODate): {
|
|
79
|
+
"aria-describedby"?: string;
|
|
80
|
+
};
|
|
81
|
+
onChoose(date: ISODate): void;
|
|
82
|
+
onDayKeyDown(event: KeyboardEvent<HTMLButtonElement>, date: ISODate): void;
|
|
83
|
+
onDayFocus(date: ISODate): void;
|
|
84
|
+
onDayPointerEnter?(date: ISODate): void;
|
|
85
|
+
gridRef?: Ref<HTMLTableElement>;
|
|
86
|
+
}
|
|
87
|
+
/** One month as a grid of day buttons: six weeks, weekday names above, each day read out in full. */
|
|
88
|
+
export declare function MonthGrid({ month, focused, today, locale, weekStartsOn, slide, hideOutsideDays, isDisabled, isSelected, isFilled, cellClassName, dayClassName, dayProps, onChoose, onDayKeyDown, onDayFocus, onDayPointerEnter, gridRef, }: MonthGridProps): import("react").JSX.Element;
|
|
89
|
+
export {};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type KeyboardEvent, type Ref } from "react";
|
|
1
2
|
import { type ISODate } from "./dates.js";
|
|
2
3
|
export interface CalendarProps {
|
|
3
4
|
/** The chosen date as "YYYY-MM-DD", or "" for none. */
|
|
@@ -29,3 +30,60 @@ export interface CalendarHandle {
|
|
|
29
30
|
* (with Shift, by year), Home and End to the week's ends. Today is marked with a brass dot.
|
|
30
31
|
*/
|
|
31
32
|
export declare const Calendar: import("react").ForwardRefExoticComponent<CalendarProps & import("react").RefAttributes<CalendarHandle>>;
|
|
33
|
+
/** Whether the month before `first` has a day on or after `min`. */
|
|
34
|
+
export declare function canShowBefore(first: ISODate, min: ISODate | undefined): boolean;
|
|
35
|
+
/** Whether the month after `last` (the first of the last month shown) has a day on or before `max`. */
|
|
36
|
+
export declare function canShowAfter(last: ISODate, max: ISODate | undefined): boolean;
|
|
37
|
+
/** Where a key moves the focus from `date`: a day, a week, the week's ends, a month (with Shift, a year). */
|
|
38
|
+
export declare function dateForKey(event: KeyboardEvent<HTMLElement>, date: ISODate, weekStartsOn: 0 | 1): ISODate | undefined;
|
|
39
|
+
/** Which way the month changed since the last render, so the new one slides in from that side. */
|
|
40
|
+
export declare function useSlide(month: number): "next" | "previous" | undefined;
|
|
41
|
+
interface MonthNavButton {
|
|
42
|
+
disabled: boolean;
|
|
43
|
+
onClick(): void;
|
|
44
|
+
}
|
|
45
|
+
export interface MonthHeaderProps {
|
|
46
|
+
/** The first day of the month shown. */
|
|
47
|
+
month: ISODate;
|
|
48
|
+
locale?: string;
|
|
49
|
+
slide?: "next" | "previous";
|
|
50
|
+
/** The previous-month button, or null for an empty space of the same size. */
|
|
51
|
+
previous: MonthNavButton | null;
|
|
52
|
+
/** The next-month button, or null for an empty space of the same size. */
|
|
53
|
+
next: MonthNavButton | null;
|
|
54
|
+
}
|
|
55
|
+
/** The month's name between the previous- and next-month buttons. */
|
|
56
|
+
export declare function MonthHeader({ month, locale, slide, previous, next }: MonthHeaderProps): import("react").JSX.Element;
|
|
57
|
+
export interface MonthGridProps {
|
|
58
|
+
/** The first day of the month shown. */
|
|
59
|
+
month: ISODate;
|
|
60
|
+
/** The day that takes Tab focus (roving tabindex). */
|
|
61
|
+
focused: ISODate;
|
|
62
|
+
today: ISODate;
|
|
63
|
+
locale?: string;
|
|
64
|
+
weekStartsOn: 0 | 1;
|
|
65
|
+
slide?: "next" | "previous";
|
|
66
|
+
/** Leaves the days of the months either side empty, for months shown side by side. */
|
|
67
|
+
hideOutsideDays?: boolean;
|
|
68
|
+
isDisabled(date: ISODate): boolean;
|
|
69
|
+
/** aria-selected on the day's cell. */
|
|
70
|
+
isSelected(date: ISODate): boolean;
|
|
71
|
+
/** Fills the day with the primary colour. */
|
|
72
|
+
isFilled(date: ISODate): boolean;
|
|
73
|
+
/** Extra classes for a day's cell; `column` is 0 to 6 across the week. */
|
|
74
|
+
cellClassName?(date: ISODate, column: number): string | undefined;
|
|
75
|
+
/** Extra classes for a day's button. */
|
|
76
|
+
dayClassName?(date: ISODate): string | undefined;
|
|
77
|
+
/** Extra attributes for a day's button. */
|
|
78
|
+
dayProps?(date: ISODate): {
|
|
79
|
+
"aria-describedby"?: string;
|
|
80
|
+
};
|
|
81
|
+
onChoose(date: ISODate): void;
|
|
82
|
+
onDayKeyDown(event: KeyboardEvent<HTMLButtonElement>, date: ISODate): void;
|
|
83
|
+
onDayFocus(date: ISODate): void;
|
|
84
|
+
onDayPointerEnter?(date: ISODate): void;
|
|
85
|
+
gridRef?: Ref<HTMLTableElement>;
|
|
86
|
+
}
|
|
87
|
+
/** One month as a grid of day buttons: six weeks, weekday names above, each day read out in full. */
|
|
88
|
+
export declare function MonthGrid({ month, focused, today, locale, weekStartsOn, slide, hideOutsideDays, isDisabled, isSelected, isFilled, cellClassName, dayClassName, dayProps, onChoose, onDayKeyDown, onDayFocus, onDayPointerEnter, gridRef, }: MonthGridProps): import("react").JSX.Element;
|
|
89
|
+
export {};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type DateRange, type RangeCalendarProps } from "./RangeCalendar.cjs";
|
|
2
|
+
/** A named range to pick in one go, such as "Last 7 days". */
|
|
3
|
+
export interface DateRangePreset {
|
|
4
|
+
/** What the list shows, in sentence case. */
|
|
5
|
+
label: string;
|
|
6
|
+
range: DateRange;
|
|
7
|
+
}
|
|
8
|
+
export interface DateRangePickerProps extends Omit<RangeCalendarProps, "autoFocus" | "className" | "visibleMonths"> {
|
|
9
|
+
/** Ranges to pick in one go, listed beside the calendar: "Last 7 days", "This month". */
|
|
10
|
+
presets?: DateRangePreset[];
|
|
11
|
+
/** How many months the calendar shows side by side. Phones always get one.
|
|
12
|
+
* @default 2 */
|
|
13
|
+
visibleMonths?: 1 | 2;
|
|
14
|
+
/** Shown when no range is chosen.
|
|
15
|
+
* @default "Pick dates" */
|
|
16
|
+
placeholder?: string;
|
|
17
|
+
/** How each date is written in the field; dates the two ends share are written once, as in "3 – 9 Oct 2026".
|
|
18
|
+
* @default { dateStyle: "medium" } */
|
|
19
|
+
formatOptions?: Intl.DateTimeFormatOptions;
|
|
20
|
+
/** md is 40px tall, sm 32px.
|
|
21
|
+
* @default "md" */
|
|
22
|
+
size?: "sm" | "md";
|
|
23
|
+
/** @default false */
|
|
24
|
+
isInvalid?: boolean;
|
|
25
|
+
/** @default false */
|
|
26
|
+
disabled?: boolean;
|
|
27
|
+
/** For the field's button, so a label can point at it. */
|
|
28
|
+
id?: string;
|
|
29
|
+
"aria-label"?: string;
|
|
30
|
+
"aria-labelledby"?: string;
|
|
31
|
+
"aria-describedby"?: string;
|
|
32
|
+
/** Classes for the field, e.g. a width. */
|
|
33
|
+
className?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* A field that opens a two-month RangeCalendar, with optional presets beside it. Picking the second day, or a preset,
|
|
37
|
+
* closes it; Escape closes it without changing anything. Once there's a range, a clear button empties it.
|
|
38
|
+
*/
|
|
39
|
+
export declare const DateRangePicker: import("react").ForwardRefExoticComponent<DateRangePickerProps & import("react").RefAttributes<HTMLButtonElement>>;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type DateRange, type RangeCalendarProps } from "./RangeCalendar.js";
|
|
2
|
+
/** A named range to pick in one go, such as "Last 7 days". */
|
|
3
|
+
export interface DateRangePreset {
|
|
4
|
+
/** What the list shows, in sentence case. */
|
|
5
|
+
label: string;
|
|
6
|
+
range: DateRange;
|
|
7
|
+
}
|
|
8
|
+
export interface DateRangePickerProps extends Omit<RangeCalendarProps, "autoFocus" | "className" | "visibleMonths"> {
|
|
9
|
+
/** Ranges to pick in one go, listed beside the calendar: "Last 7 days", "This month". */
|
|
10
|
+
presets?: DateRangePreset[];
|
|
11
|
+
/** How many months the calendar shows side by side. Phones always get one.
|
|
12
|
+
* @default 2 */
|
|
13
|
+
visibleMonths?: 1 | 2;
|
|
14
|
+
/** Shown when no range is chosen.
|
|
15
|
+
* @default "Pick dates" */
|
|
16
|
+
placeholder?: string;
|
|
17
|
+
/** How each date is written in the field; dates the two ends share are written once, as in "3 – 9 Oct 2026".
|
|
18
|
+
* @default { dateStyle: "medium" } */
|
|
19
|
+
formatOptions?: Intl.DateTimeFormatOptions;
|
|
20
|
+
/** md is 40px tall, sm 32px.
|
|
21
|
+
* @default "md" */
|
|
22
|
+
size?: "sm" | "md";
|
|
23
|
+
/** @default false */
|
|
24
|
+
isInvalid?: boolean;
|
|
25
|
+
/** @default false */
|
|
26
|
+
disabled?: boolean;
|
|
27
|
+
/** For the field's button, so a label can point at it. */
|
|
28
|
+
id?: string;
|
|
29
|
+
"aria-label"?: string;
|
|
30
|
+
"aria-labelledby"?: string;
|
|
31
|
+
"aria-describedby"?: string;
|
|
32
|
+
/** Classes for the field, e.g. a width. */
|
|
33
|
+
className?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* A field that opens a two-month RangeCalendar, with optional presets beside it. Picking the second day, or a preset,
|
|
37
|
+
* closes it; Escape closes it without changing anything. Once there's a range, a clear button empties it.
|
|
38
|
+
*/
|
|
39
|
+
export declare const DateRangePicker: import("react").ForwardRefExoticComponent<DateRangePickerProps & import("react").RefAttributes<HTMLButtonElement>>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type CalendarHandle } from "./Calendar.cjs";
|
|
2
|
+
import { type ISODate } from "./dates.cjs";
|
|
3
|
+
/** A range of days, both ends included, as "YYYY-MM-DD". */
|
|
4
|
+
export interface DateRange {
|
|
5
|
+
start: ISODate;
|
|
6
|
+
end: ISODate;
|
|
7
|
+
}
|
|
8
|
+
export interface RangeCalendarProps {
|
|
9
|
+
/** The chosen range, or null for none. */
|
|
10
|
+
value?: DateRange | null;
|
|
11
|
+
/** @default null */
|
|
12
|
+
defaultValue?: DateRange | null;
|
|
13
|
+
/** Called once both ends are picked, with the earlier day as the start. */
|
|
14
|
+
onChange?(range: DateRange | null): void;
|
|
15
|
+
/** The earliest day either end can be, "YYYY-MM-DD". */
|
|
16
|
+
min?: ISODate;
|
|
17
|
+
/** The latest day either end can be. */
|
|
18
|
+
max?: ISODate;
|
|
19
|
+
/** Return true for days that can't be an end of the range, such as weekends. A range can still run across them. */
|
|
20
|
+
isDateDisabled?(date: ISODate): boolean;
|
|
21
|
+
/** Month and day names follow this locale, e.g. "en-IE", "de-CH". Defaults to the browser's. */
|
|
22
|
+
locale?: string;
|
|
23
|
+
/** 1 starts weeks on Monday, 0 on Sunday.
|
|
24
|
+
* @default 1 */
|
|
25
|
+
weekStartsOn?: 0 | 1;
|
|
26
|
+
/** How many months show side by side. Two stack when there isn't room for both.
|
|
27
|
+
* @default 1 */
|
|
28
|
+
visibleMonths?: 1 | 2;
|
|
29
|
+
/** Focus the range's start (or today) on mount, for use in a popover.
|
|
30
|
+
* @default false */
|
|
31
|
+
autoFocus?: boolean;
|
|
32
|
+
className?: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Month grids for picking a range of days. The first pick sets the start and the range follows the pointer or the
|
|
36
|
+
* focus until the second pick sets the end; Escape drops a half-picked range. The keys move as in Calendar.
|
|
37
|
+
*/
|
|
38
|
+
export declare const RangeCalendar: import("react").ForwardRefExoticComponent<RangeCalendarProps & import("react").RefAttributes<CalendarHandle>>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type CalendarHandle } from "./Calendar.js";
|
|
2
|
+
import { type ISODate } from "./dates.js";
|
|
3
|
+
/** A range of days, both ends included, as "YYYY-MM-DD". */
|
|
4
|
+
export interface DateRange {
|
|
5
|
+
start: ISODate;
|
|
6
|
+
end: ISODate;
|
|
7
|
+
}
|
|
8
|
+
export interface RangeCalendarProps {
|
|
9
|
+
/** The chosen range, or null for none. */
|
|
10
|
+
value?: DateRange | null;
|
|
11
|
+
/** @default null */
|
|
12
|
+
defaultValue?: DateRange | null;
|
|
13
|
+
/** Called once both ends are picked, with the earlier day as the start. */
|
|
14
|
+
onChange?(range: DateRange | null): void;
|
|
15
|
+
/** The earliest day either end can be, "YYYY-MM-DD". */
|
|
16
|
+
min?: ISODate;
|
|
17
|
+
/** The latest day either end can be. */
|
|
18
|
+
max?: ISODate;
|
|
19
|
+
/** Return true for days that can't be an end of the range, such as weekends. A range can still run across them. */
|
|
20
|
+
isDateDisabled?(date: ISODate): boolean;
|
|
21
|
+
/** Month and day names follow this locale, e.g. "en-IE", "de-CH". Defaults to the browser's. */
|
|
22
|
+
locale?: string;
|
|
23
|
+
/** 1 starts weeks on Monday, 0 on Sunday.
|
|
24
|
+
* @default 1 */
|
|
25
|
+
weekStartsOn?: 0 | 1;
|
|
26
|
+
/** How many months show side by side. Two stack when there isn't room for both.
|
|
27
|
+
* @default 1 */
|
|
28
|
+
visibleMonths?: 1 | 2;
|
|
29
|
+
/** Focus the range's start (or today) on mount, for use in a popover.
|
|
30
|
+
* @default false */
|
|
31
|
+
autoFocus?: boolean;
|
|
32
|
+
className?: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Month grids for picking a range of days. The first pick sets the start and the range follows the pointer or the
|
|
36
|
+
* focus until the second pick sets the end; Escape drops a half-picked range. The keys move as in Calendar.
|
|
37
|
+
*/
|
|
38
|
+
export declare const RangeCalendar: import("react").ForwardRefExoticComponent<RangeCalendarProps & import("react").RefAttributes<CalendarHandle>>;
|
|
@@ -13,3 +13,16 @@ export declare function addMonths(iso: ISODate, months: number): ISODate;
|
|
|
13
13
|
export declare function weekday(iso: ISODate): number;
|
|
14
14
|
export declare function toDate(iso: ISODate): Date;
|
|
15
15
|
export declare function formatDate(iso: ISODate, locale: string | undefined, options: Intl.DateTimeFormatOptions): string;
|
|
16
|
+
/**
|
|
17
|
+
* Two dates as one range in the locale, sharing what they have in common: "3 – 9 Oct 2026", "28 Sept – 4 Oct 2026".
|
|
18
|
+
* The same day twice is written once.
|
|
19
|
+
*/
|
|
20
|
+
export declare function formatDateRange(start: ISODate, end: ISODate, locale: string | undefined, options: Intl.DateTimeFormatOptions): string;
|
|
21
|
+
/** Keeps a date between min and max, when they're given. */
|
|
22
|
+
export declare function clampDate(date: ISODate, min: ISODate | undefined, max: ISODate | undefined): ISODate;
|
|
23
|
+
/** The first day of the month a date falls in. */
|
|
24
|
+
export declare function startOfMonth(iso: ISODate): ISODate;
|
|
25
|
+
/** Months counted from year 0, so two months can be compared and subtracted. */
|
|
26
|
+
export declare function monthIndex(iso: ISODate): number;
|
|
27
|
+
/** The six weeks a month grid shows for the month starting on `first`, each starting on `weekStartsOn`. */
|
|
28
|
+
export declare function monthWeeks(first: ISODate, weekStartsOn: 0 | 1): ISODate[][];
|
|
@@ -13,3 +13,16 @@ export declare function addMonths(iso: ISODate, months: number): ISODate;
|
|
|
13
13
|
export declare function weekday(iso: ISODate): number;
|
|
14
14
|
export declare function toDate(iso: ISODate): Date;
|
|
15
15
|
export declare function formatDate(iso: ISODate, locale: string | undefined, options: Intl.DateTimeFormatOptions): string;
|
|
16
|
+
/**
|
|
17
|
+
* Two dates as one range in the locale, sharing what they have in common: "3 – 9 Oct 2026", "28 Sept – 4 Oct 2026".
|
|
18
|
+
* The same day twice is written once.
|
|
19
|
+
*/
|
|
20
|
+
export declare function formatDateRange(start: ISODate, end: ISODate, locale: string | undefined, options: Intl.DateTimeFormatOptions): string;
|
|
21
|
+
/** Keeps a date between min and max, when they're given. */
|
|
22
|
+
export declare function clampDate(date: ISODate, min: ISODate | undefined, max: ISODate | undefined): ISODate;
|
|
23
|
+
/** The first day of the month a date falls in. */
|
|
24
|
+
export declare function startOfMonth(iso: ISODate): ISODate;
|
|
25
|
+
/** Months counted from year 0, so two months can be compared and subtracted. */
|
|
26
|
+
export declare function monthIndex(iso: ISODate): number;
|
|
27
|
+
/** The six weeks a month grid shows for the month starting on `first`, each starting on `weekStartsOn`. */
|
|
28
|
+
export declare function monthWeeks(first: ISODate, weekStartsOn: 0 | 1): ISODate[][];
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type HTMLAttributes, type ReactNode } from "react";
|
|
2
|
+
/** Where the reasoning, or one step of it, has got to. */
|
|
3
|
+
export type ChainOfThoughtStatus = "pending" | "running" | "success" | "error";
|
|
4
|
+
export interface ChainOfThoughtStep {
|
|
5
|
+
/** A stable key for the step, so it keeps its place as steps are added. */
|
|
6
|
+
id: string;
|
|
7
|
+
/** The step in words: "Find where invoice dates are formatted". */
|
|
8
|
+
title: ReactNode;
|
|
9
|
+
/** Where the step has got to: a hollow ring, a spinner, a check or a cross. */
|
|
10
|
+
status: ChainOfThoughtStatus;
|
|
11
|
+
/** More about the step under its title: what it found, a file path, a short list. */
|
|
12
|
+
detail?: ReactNode;
|
|
13
|
+
/** A 12px icon in place of the check or the hollow ring, e.g. a search icon. Running and failed steps keep their own mark. */
|
|
14
|
+
icon?: ReactNode;
|
|
15
|
+
}
|
|
16
|
+
export interface ChainOfThoughtProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
|
|
17
|
+
/** The plan, in order, each with its status. */
|
|
18
|
+
steps?: ChainOfThoughtStep[];
|
|
19
|
+
/** "running" shows "Thinking…" with a shimmer and keeps it open; anything else is finished.
|
|
20
|
+
* @default "success" */
|
|
21
|
+
status?: ChainOfThoughtStatus;
|
|
22
|
+
/** How long it thought, in milliseconds: "Thought for 12 s". */
|
|
23
|
+
duration?: number;
|
|
24
|
+
/** The header's words. Defaults to "Thinking…" while running and "Thought for 12 s" once done. */
|
|
25
|
+
label?: ReactNode;
|
|
26
|
+
/** The reasoning itself, as text, shown above the steps. It can grow while it streams in. */
|
|
27
|
+
children?: ReactNode;
|
|
28
|
+
/** Whether the reasoning shows. Leave out to let it follow `status`. */
|
|
29
|
+
expanded?: boolean;
|
|
30
|
+
/** Whether it starts open. Defaults to open while running and closed once done. */
|
|
31
|
+
defaultExpanded?: boolean;
|
|
32
|
+
/** Called with the new state when it opens or closes, by the person or by a change of status. */
|
|
33
|
+
onExpandedChange?(expanded: boolean): void;
|
|
34
|
+
/** Folds the reasoning away when `status` turns from "running" to done, unless the person has opened or closed it.
|
|
35
|
+
* @default true */
|
|
36
|
+
collapseWhenDone?: boolean;
|
|
37
|
+
/** The locale for the duration's digits, e.g. "de-CH". Defaults to the browser's. */
|
|
38
|
+
locale?: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* An agent's reasoning and plan: a "Thinking…" header that opens to the reasoning and a list of steps on a thin line,
|
|
42
|
+
* each with its status. It stays open while the agent works and folds to "Thought for 12 s" when it's done.
|
|
43
|
+
*/
|
|
44
|
+
export declare const ChainOfThought: import("react").ForwardRefExoticComponent<ChainOfThoughtProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type HTMLAttributes, type ReactNode } from "react";
|
|
2
|
+
/** Where the reasoning, or one step of it, has got to. */
|
|
3
|
+
export type ChainOfThoughtStatus = "pending" | "running" | "success" | "error";
|
|
4
|
+
export interface ChainOfThoughtStep {
|
|
5
|
+
/** A stable key for the step, so it keeps its place as steps are added. */
|
|
6
|
+
id: string;
|
|
7
|
+
/** The step in words: "Find where invoice dates are formatted". */
|
|
8
|
+
title: ReactNode;
|
|
9
|
+
/** Where the step has got to: a hollow ring, a spinner, a check or a cross. */
|
|
10
|
+
status: ChainOfThoughtStatus;
|
|
11
|
+
/** More about the step under its title: what it found, a file path, a short list. */
|
|
12
|
+
detail?: ReactNode;
|
|
13
|
+
/** A 12px icon in place of the check or the hollow ring, e.g. a search icon. Running and failed steps keep their own mark. */
|
|
14
|
+
icon?: ReactNode;
|
|
15
|
+
}
|
|
16
|
+
export interface ChainOfThoughtProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
|
|
17
|
+
/** The plan, in order, each with its status. */
|
|
18
|
+
steps?: ChainOfThoughtStep[];
|
|
19
|
+
/** "running" shows "Thinking…" with a shimmer and keeps it open; anything else is finished.
|
|
20
|
+
* @default "success" */
|
|
21
|
+
status?: ChainOfThoughtStatus;
|
|
22
|
+
/** How long it thought, in milliseconds: "Thought for 12 s". */
|
|
23
|
+
duration?: number;
|
|
24
|
+
/** The header's words. Defaults to "Thinking…" while running and "Thought for 12 s" once done. */
|
|
25
|
+
label?: ReactNode;
|
|
26
|
+
/** The reasoning itself, as text, shown above the steps. It can grow while it streams in. */
|
|
27
|
+
children?: ReactNode;
|
|
28
|
+
/** Whether the reasoning shows. Leave out to let it follow `status`. */
|
|
29
|
+
expanded?: boolean;
|
|
30
|
+
/** Whether it starts open. Defaults to open while running and closed once done. */
|
|
31
|
+
defaultExpanded?: boolean;
|
|
32
|
+
/** Called with the new state when it opens or closes, by the person or by a change of status. */
|
|
33
|
+
onExpandedChange?(expanded: boolean): void;
|
|
34
|
+
/** Folds the reasoning away when `status` turns from "running" to done, unless the person has opened or closed it.
|
|
35
|
+
* @default true */
|
|
36
|
+
collapseWhenDone?: boolean;
|
|
37
|
+
/** The locale for the duration's digits, e.g. "de-CH". Defaults to the browser's. */
|
|
38
|
+
locale?: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* An agent's reasoning and plan: a "Thinking…" header that opens to the reasoning and a list of steps on a thin line,
|
|
42
|
+
* each with its status. It stays open while the agent works and folds to "Thought for 12 s" when it's done.
|
|
43
|
+
*/
|
|
44
|
+
export declare const ChainOfThought: import("react").ForwardRefExoticComponent<ChainOfThoughtProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { type HTMLAttributes, type MutableRefObject, type ReactNode } from "react";
|
|
2
|
+
export interface ChatConversationProps extends HTMLAttributes<HTMLDivElement> {
|
|
3
|
+
/** The messages: ChatMessages, a ChatLoader, anything else in the column. */
|
|
4
|
+
children?: ReactNode;
|
|
5
|
+
/** Shown in place of the messages while there are none: a greeting, suggestions, an EmptyState. */
|
|
6
|
+
empty?: ReactNode;
|
|
7
|
+
/** Docked under the messages and lined up with them, outside the log: usually a PromptInput. It stays in view while
|
|
8
|
+
* the messages scroll, and Jump to latest floats above it. */
|
|
9
|
+
footer?: ReactNode;
|
|
10
|
+
/** Names the conversation for screen readers.
|
|
11
|
+
* @default "Conversation" */
|
|
12
|
+
"aria-label"?: string;
|
|
13
|
+
/** The id of a visible heading that names the conversation, in place of aria-label. */
|
|
14
|
+
"aria-labelledby"?: string;
|
|
15
|
+
/** `comfortable` keeps the messages in a 720px column in the middle, for reading; `full` lets them use the whole
|
|
16
|
+
* width, for a narrow side panel.
|
|
17
|
+
* @default "comfortable" */
|
|
18
|
+
width?: "comfortable" | "full";
|
|
19
|
+
/** The words on the button that appears once the reader scrolls up.
|
|
20
|
+
* @default "Jump to latest" */
|
|
21
|
+
jumpLabel?: string;
|
|
22
|
+
/** How that button counts the messages that arrived while the reader was scrolled up.
|
|
23
|
+
* @default (count) => `${count} new` */
|
|
24
|
+
formatNewCount?(count: number): string;
|
|
25
|
+
}
|
|
26
|
+
export interface ChatConversationHandle {
|
|
27
|
+
/** Scrolls to the newest message and follows new content again: smoothly, or at once under reduced motion. Call it
|
|
28
|
+
* when the person sends a message, so they see their own words and the answer. */
|
|
29
|
+
scrollToBottom(options?: {
|
|
30
|
+
behavior?: ScrollBehavior;
|
|
31
|
+
}): void;
|
|
32
|
+
}
|
|
33
|
+
/** What messages inside a conversation need from it. */
|
|
34
|
+
interface ChatConversationContextValue {
|
|
35
|
+
/** True once the first messages have painted: messages that mount after that animate in. */
|
|
36
|
+
ready: MutableRefObject<boolean>;
|
|
37
|
+
/** A message mounted; it counts as new while the reader is scrolled up. Returns the cleanup for when it goes. */
|
|
38
|
+
register(id: string): () => void;
|
|
39
|
+
}
|
|
40
|
+
/** @internal */
|
|
41
|
+
export declare const ChatConversationContext: import("react").Context<ChatConversationContextValue | null>;
|
|
42
|
+
/**
|
|
43
|
+
* The scrolling column of a chat. It follows the newest content while the reader is at the bottom (new messages, an
|
|
44
|
+
* answer that's still streaming), stops as soon as they scroll up to read, and offers a "Jump to latest" button to
|
|
45
|
+
* come back. It's a polite live region (role="log"), so screen readers hear messages as they're added.
|
|
46
|
+
*/
|
|
47
|
+
export declare const ChatConversation: import("react").ForwardRefExoticComponent<ChatConversationProps & import("react").RefAttributes<ChatConversationHandle>>;
|
|
48
|
+
export {};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { type HTMLAttributes, type MutableRefObject, type ReactNode } from "react";
|
|
2
|
+
export interface ChatConversationProps extends HTMLAttributes<HTMLDivElement> {
|
|
3
|
+
/** The messages: ChatMessages, a ChatLoader, anything else in the column. */
|
|
4
|
+
children?: ReactNode;
|
|
5
|
+
/** Shown in place of the messages while there are none: a greeting, suggestions, an EmptyState. */
|
|
6
|
+
empty?: ReactNode;
|
|
7
|
+
/** Docked under the messages and lined up with them, outside the log: usually a PromptInput. It stays in view while
|
|
8
|
+
* the messages scroll, and Jump to latest floats above it. */
|
|
9
|
+
footer?: ReactNode;
|
|
10
|
+
/** Names the conversation for screen readers.
|
|
11
|
+
* @default "Conversation" */
|
|
12
|
+
"aria-label"?: string;
|
|
13
|
+
/** The id of a visible heading that names the conversation, in place of aria-label. */
|
|
14
|
+
"aria-labelledby"?: string;
|
|
15
|
+
/** `comfortable` keeps the messages in a 720px column in the middle, for reading; `full` lets them use the whole
|
|
16
|
+
* width, for a narrow side panel.
|
|
17
|
+
* @default "comfortable" */
|
|
18
|
+
width?: "comfortable" | "full";
|
|
19
|
+
/** The words on the button that appears once the reader scrolls up.
|
|
20
|
+
* @default "Jump to latest" */
|
|
21
|
+
jumpLabel?: string;
|
|
22
|
+
/** How that button counts the messages that arrived while the reader was scrolled up.
|
|
23
|
+
* @default (count) => `${count} new` */
|
|
24
|
+
formatNewCount?(count: number): string;
|
|
25
|
+
}
|
|
26
|
+
export interface ChatConversationHandle {
|
|
27
|
+
/** Scrolls to the newest message and follows new content again: smoothly, or at once under reduced motion. Call it
|
|
28
|
+
* when the person sends a message, so they see their own words and the answer. */
|
|
29
|
+
scrollToBottom(options?: {
|
|
30
|
+
behavior?: ScrollBehavior;
|
|
31
|
+
}): void;
|
|
32
|
+
}
|
|
33
|
+
/** What messages inside a conversation need from it. */
|
|
34
|
+
interface ChatConversationContextValue {
|
|
35
|
+
/** True once the first messages have painted: messages that mount after that animate in. */
|
|
36
|
+
ready: MutableRefObject<boolean>;
|
|
37
|
+
/** A message mounted; it counts as new while the reader is scrolled up. Returns the cleanup for when it goes. */
|
|
38
|
+
register(id: string): () => void;
|
|
39
|
+
}
|
|
40
|
+
/** @internal */
|
|
41
|
+
export declare const ChatConversationContext: import("react").Context<ChatConversationContextValue | null>;
|
|
42
|
+
/**
|
|
43
|
+
* The scrolling column of a chat. It follows the newest content while the reader is at the bottom (new messages, an
|
|
44
|
+
* answer that's still streaming), stops as soon as they scroll up to read, and offers a "Jump to latest" button to
|
|
45
|
+
* come back. It's a polite live region (role="log"), so screen readers hear messages as they're added.
|
|
46
|
+
*/
|
|
47
|
+
export declare const ChatConversation: import("react").ForwardRefExoticComponent<ChatConversationProps & import("react").RefAttributes<ChatConversationHandle>>;
|
|
48
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
export interface ChatLoaderProps {
|
|
3
|
+
/** Words in place of the dots, with a shimmer across them: "Thinking…", "Reading the codebase…". */
|
|
4
|
+
label?: ReactNode;
|
|
5
|
+
/** Just the dots or the label, without a message's avatar and spacing: for inside a message, a step or a status bar.
|
|
6
|
+
* @default false */
|
|
7
|
+
inline?: boolean;
|
|
8
|
+
/** The agent's name above, as on its messages: "Acme agent". */
|
|
9
|
+
name?: ReactNode;
|
|
10
|
+
/** The agent's bot tile by default; any node in its place, or null for none. */
|
|
11
|
+
avatar?: ReactNode;
|
|
12
|
+
/** What screen readers hear while the dots show. With a `label`, they hear the label.
|
|
13
|
+
* @default "Working…" */
|
|
14
|
+
srLabel?: string;
|
|
15
|
+
className?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The agent is working and nothing has arrived yet: three dots that pulse in turn, or a shimmering label such as
|
|
19
|
+
* "Thinking…". It sits in the conversation like the agent's next message, so the answer takes its place without a jump.
|
|
20
|
+
*/
|
|
21
|
+
export declare function ChatLoader({ label, inline, name, avatar, srLabel, className }: ChatLoaderProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
export interface ChatLoaderProps {
|
|
3
|
+
/** Words in place of the dots, with a shimmer across them: "Thinking…", "Reading the codebase…". */
|
|
4
|
+
label?: ReactNode;
|
|
5
|
+
/** Just the dots or the label, without a message's avatar and spacing: for inside a message, a step or a status bar.
|
|
6
|
+
* @default false */
|
|
7
|
+
inline?: boolean;
|
|
8
|
+
/** The agent's name above, as on its messages: "Acme agent". */
|
|
9
|
+
name?: ReactNode;
|
|
10
|
+
/** The agent's bot tile by default; any node in its place, or null for none. */
|
|
11
|
+
avatar?: ReactNode;
|
|
12
|
+
/** What screen readers hear while the dots show. With a `label`, they hear the label.
|
|
13
|
+
* @default "Working…" */
|
|
14
|
+
srLabel?: string;
|
|
15
|
+
className?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The agent is working and nothing has arrived yet: three dots that pulse in turn, or a shimmering label such as
|
|
19
|
+
* "Thinking…". It sits in the conversation like the agent's next message, so the answer takes its place without a jump.
|
|
20
|
+
*/
|
|
21
|
+
export declare function ChatLoader({ label, inline, name, avatar, srLabel, className }: ChatLoaderProps): import("react").JSX.Element;
|