@tulipfarm/sprout 0.3.0 → 0.4.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 +45 -40
- package/dist/components/accordion.d.ts +2 -2
- package/dist/components/accordion.js +9 -9
- package/dist/components/agent-fanout.d.ts +2 -2
- package/dist/components/agent-fanout.js +65 -87
- package/dist/components/alert-dialog.d.ts +6 -6
- package/dist/components/alert-dialog.js +20 -20
- package/dist/components/alert.d.ts +6 -6
- package/dist/components/alert.js +13 -13
- package/dist/components/aspect-ratio.d.ts +2 -2
- package/dist/components/aspect-ratio.js +2 -2
- package/dist/components/attachment.d.ts +17 -17
- package/dist/components/attachment.js +82 -115
- package/dist/components/avatar.d.ts +10 -10
- package/dist/components/avatar.js +14 -14
- package/dist/components/badge.d.ts +4 -4
- package/dist/components/badge.js +18 -18
- package/dist/components/board.d.ts +107 -0
- package/dist/components/board.js +640 -0
- package/dist/components/brand-icon.d.ts +6 -6
- package/dist/components/brand-icon.js +55 -63
- package/dist/components/breadcrumb.d.ts +11 -11
- package/dist/components/breadcrumb.js +16 -18
- package/dist/components/button-group.d.ts +6 -6
- package/dist/components/button-group.js +14 -14
- package/dist/components/button.d.ts +11 -11
- package/dist/components/button.js +46 -56
- package/dist/components/calendar.d.ts +5 -5
- package/dist/components/calendar.js +44 -53
- package/dist/components/canvas.d.ts +4 -4
- package/dist/components/canvas.js +39 -46
- package/dist/components/card.d.ts +6 -6
- package/dist/components/card.js +17 -17
- package/dist/components/carousel.d.ts +7 -7
- package/dist/components/carousel.js +57 -75
- package/dist/components/chart.d.ts +5 -112
- package/dist/components/chart.js +5 -172
- package/dist/components/chat-confirmation.d.ts +13 -11
- package/dist/components/chat-confirmation.js +32 -38
- package/dist/components/chat-input.d.ts +4 -4
- package/dist/components/chat-input.js +74 -81
- package/dist/components/chat-plan.d.ts +2 -2
- package/dist/components/chat-plan.js +15 -20
- package/dist/components/chat-sources.d.ts +8 -8
- package/dist/components/chat-sources.js +18 -27
- package/dist/components/checkbox.d.ts +1 -1
- package/dist/components/checkbox.js +9 -9
- package/dist/components/choice-list.d.ts +2 -2
- package/dist/components/choice-list.js +16 -18
- package/dist/components/code-block.d.ts +5 -5
- package/dist/components/code-block.js +26 -26
- package/dist/components/collapsible.d.ts +1 -1
- package/dist/components/collapsible.js +7 -11
- package/dist/components/combobox.d.ts +3 -3
- package/dist/components/combobox.js +24 -24
- package/dist/components/command.d.ts +13 -13
- package/dist/components/command.js +61 -73
- package/dist/components/context-menu.d.ts +5 -5
- package/dist/components/context-menu.js +22 -22
- package/dist/components/dialog.d.ts +6 -6
- package/dist/components/dialog.js +23 -28
- package/dist/components/direction.d.ts +1 -1
- package/dist/components/direction.js +1 -1
- package/dist/components/dropdown-menu.d.ts +5 -5
- package/dist/components/dropdown-menu.js +20 -20
- package/dist/components/field.d.ts +11 -11
- package/dist/components/field.js +41 -61
- package/dist/components/file-explorer.d.ts +2 -2
- package/dist/components/file-explorer.js +89 -105
- package/dist/components/file-viewer.d.ts +10 -10
- package/dist/components/file-viewer.js +112 -140
- package/dist/components/form.d.ts +7 -7
- package/dist/components/form.js +24 -28
- package/dist/components/glass-banner.d.ts +3 -3
- package/dist/components/glass-banner.js +21 -24
- package/dist/components/gradient-banner.d.ts +5 -5
- package/dist/components/gradient-banner.js +13 -22
- package/dist/components/hover-card.d.ts +4 -4
- package/dist/components/hover-card.js +6 -6
- package/dist/components/input-group.d.ts +11 -11
- package/dist/components/input-group.js +22 -36
- package/dist/components/input-otp.d.ts +10 -10
- package/dist/components/input-otp.js +13 -15
- package/dist/components/input.d.ts +1 -1
- package/dist/components/input.js +7 -7
- package/dist/components/kbd.d.ts +3 -3
- package/dist/components/kbd.js +5 -5
- package/dist/components/label.d.ts +2 -2
- package/dist/components/label.js +2 -2
- package/dist/components/mention-list.d.ts +3 -3
- package/dist/components/mention-list.js +10 -10
- package/dist/components/menubar.d.ts +6 -6
- package/dist/components/menubar.js +22 -22
- package/dist/components/message-actions.d.ts +2 -2
- package/dist/components/message-actions.js +29 -31
- package/dist/components/message-response.d.ts +3 -3
- package/dist/components/message-response.js +18 -18
- package/dist/components/message-scroller.d.ts +12 -12
- package/dist/components/message-scroller.js +44 -56
- package/dist/components/message.d.ts +11 -11
- package/dist/components/message.js +25 -25
- package/dist/components/navigation-menu.d.ts +2 -2
- package/dist/components/navigation-menu.js +15 -15
- package/dist/components/notice-banner.d.ts +2 -2
- package/dist/components/notice-banner.js +2 -2
- package/dist/components/page-content.d.ts +2 -2
- package/dist/components/page-content.js +2 -2
- package/dist/components/page-header.d.ts +1 -1
- package/dist/components/page-header.js +16 -16
- package/dist/components/pagination.d.ts +9 -9
- package/dist/components/pagination.js +17 -17
- package/dist/components/plan-outline.d.ts +2 -2
- package/dist/components/plan-outline.js +43 -60
- package/dist/components/popover.d.ts +6 -6
- package/dist/components/popover.js +15 -15
- package/dist/components/presence-cursor.d.ts +2 -2
- package/dist/components/presence-cursor.js +3 -3
- package/dist/components/progress.d.ts +1 -1
- package/dist/components/progress.js +8 -8
- package/dist/components/prompt-list.d.ts +3 -3
- package/dist/components/prompt-list.js +6 -6
- package/dist/components/questionnaire.d.ts +19 -19
- package/dist/components/questionnaire.js +183 -242
- package/dist/components/radio-group.d.ts +2 -2
- package/dist/components/radio-group.js +6 -6
- package/dist/components/reasoning-effort.d.ts +3 -3
- package/dist/components/reasoning-effort.js +9 -12
- package/dist/components/record-list.d.ts +66 -0
- package/dist/components/record-list.js +151 -0
- package/dist/components/resizable.d.ts +5 -5
- package/dist/components/resizable.js +76 -102
- package/dist/components/result-card.d.ts +10 -5
- package/dist/components/result-card.js +42 -53
- package/dist/components/result-notice.d.ts +18 -0
- package/dist/components/result-notice.js +29 -0
- package/dist/components/review-card.d.ts +6 -6
- package/dist/components/review-card.js +18 -18
- package/dist/components/rich-text-editor.d.ts +2 -2
- package/dist/components/rich-text-editor.js +56 -72
- package/dist/components/schema-diagram.d.ts +3 -3
- package/dist/components/schema-diagram.js +39 -53
- package/dist/components/scroll-area.d.ts +1 -1
- package/dist/components/scroll-area.js +10 -14
- package/dist/components/search-dialog.d.ts +6 -6
- package/dist/components/search-dialog.js +16 -16
- package/dist/components/search-field.d.ts +1 -1
- package/dist/components/search-field.js +11 -11
- package/dist/components/select.d.ts +3 -3
- package/dist/components/select.js +20 -20
- package/dist/components/selection-slot.d.ts +2 -2
- package/dist/components/selection-slot.js +6 -9
- package/dist/components/separator.d.ts +15 -15
- package/dist/components/separator.js +22 -27
- package/dist/components/settings-list.d.ts +3 -3
- package/dist/components/settings-list.js +5 -5
- package/dist/components/sheet.d.ts +6 -6
- package/dist/components/sheet.js +27 -27
- package/dist/components/sidebar.d.ts +22 -22
- package/dist/components/sidebar.js +57 -58
- package/dist/components/skeleton.d.ts +5 -5
- package/dist/components/skeleton.js +14 -21
- package/dist/components/slider.d.ts +2 -2
- package/dist/components/slider.js +6 -6
- package/dist/components/spinner.d.ts +5 -5
- package/dist/components/spinner.js +22 -26
- package/dist/components/sql-viewer.d.ts +14 -14
- package/dist/components/sql-viewer.js +99 -128
- package/dist/components/state-panel-samples.d.ts +2 -2
- package/dist/components/state-panel-samples.js +209 -245
- package/dist/components/state-panel.d.ts +2 -35
- package/dist/components/state-panel.js +2 -29
- package/dist/components/state-sample.d.ts +7 -7
- package/dist/components/state-sample.js +18 -31
- package/dist/components/switch.d.ts +1 -1
- package/dist/components/switch.js +7 -7
- package/dist/components/table-nuqs.d.ts +2 -2
- package/dist/components/table-nuqs.js +11 -12
- package/dist/components/table.d.ts +4 -4
- package/dist/components/table.js +166 -235
- package/dist/components/tabs.d.ts +2 -2
- package/dist/components/tabs.js +12 -12
- package/dist/components/textarea.d.ts +2 -2
- package/dist/components/textarea.js +6 -8
- package/dist/components/timeline.d.ts +3 -0
- package/dist/components/timeline.js +3 -0
- package/dist/components/toast.d.ts +2 -2
- package/dist/components/toast.js +19 -25
- package/dist/components/toggle-group.d.ts +2 -2
- package/dist/components/toggle-group.js +18 -20
- package/dist/components/toggle.d.ts +2 -2
- package/dist/components/toggle.js +8 -8
- package/dist/components/tool-activity.d.ts +1 -1
- package/dist/components/tool-activity.js +83 -110
- package/dist/components/toolbar-status.d.ts +2 -2
- package/dist/components/toolbar-status.js +7 -7
- package/dist/components/tooltip.d.ts +5 -5
- package/dist/components/tooltip.js +12 -11
- package/dist/components/typed-text.d.ts +2 -2
- package/dist/components/typed-text.js +10 -12
- package/dist/components/view-switcher.d.ts +51 -0
- package/dist/components/view-switcher.js +114 -0
- package/dist/index.d.ts +98 -93
- package/dist/index.js +98 -93
- package/dist/internal/chart-kit.d.ts +142 -0
- package/dist/internal/chart-kit.js +200 -0
- package/dist/internal/charts/bars.d.ts +61 -0
- package/dist/internal/charts/bars.js +86 -0
- package/dist/internal/charts/lines.d.ts +67 -0
- package/dist/internal/charts/lines.js +70 -0
- package/dist/internal/charts/more.d.ts +77 -0
- package/dist/internal/charts/more.js +68 -0
- package/dist/internal/charts/parts.d.ts +54 -0
- package/dist/internal/charts/parts.js +82 -0
- package/dist/internal/charts/timeline-dates.d.ts +38 -0
- package/dist/internal/charts/timeline-dates.js +113 -0
- package/dist/internal/charts/timeline-window.d.ts +31 -0
- package/dist/internal/charts/timeline-window.js +26 -0
- package/dist/internal/charts/timeline.d.ts +72 -0
- package/dist/internal/charts/timeline.js +287 -0
- package/dist/internal/classes.d.ts +1 -1
- package/dist/internal/classes.js +7 -9
- package/dist/internal/code-tokens.d.ts +2 -2
- package/dist/internal/code-tokens.js +12 -12
- package/dist/internal/fieldset.d.ts +1 -1
- package/dist/internal/fieldset.js +6 -6
- package/dist/internal/file-kind.d.ts +1 -1
- package/dist/internal/file-kind.js +43 -51
- package/dist/internal/flow.d.ts +4 -4
- package/dist/internal/flow.js +20 -23
- package/dist/internal/languages.js +999 -999
- package/dist/internal/message-scroller.d.ts +3 -3
- package/dist/internal/message-scroller.js +64 -112
- package/dist/internal/pressable.d.ts +1 -1
- package/dist/internal/pressable.js +7 -7
- package/dist/internal/state-panel.d.ts +35 -0
- package/dist/internal/state-panel.js +22 -0
- package/dist/internal/syntax.d.ts +2 -2
- package/dist/internal/syntax.js +36 -47
- package/dist/styles/accordion.css +3 -5
- package/dist/styles/agent-fanout.css +64 -60
- package/dist/styles/alert-dialog.css +12 -26
- package/dist/styles/alert.css +10 -15
- package/dist/styles/attachment.css +51 -93
- package/dist/styles/avatar.css +17 -24
- package/dist/styles/badge.css +11 -36
- package/dist/styles/board.css +571 -0
- package/dist/styles/brand-icon.css +7 -8
- package/dist/styles/breadcrumb.css +4 -7
- package/dist/styles/button-group.css +8 -14
- package/dist/styles/button.css +22 -27
- package/dist/styles/calendar.css +24 -36
- package/dist/styles/canvas.css +2 -3
- package/dist/styles/card.css +7 -23
- package/dist/styles/carousel.css +11 -12
- package/dist/styles/chart.css +215 -31
- package/dist/styles/chat-input.css +15 -39
- package/dist/styles/chat-plan.css +3 -4
- package/dist/styles/chat-sources.css +3 -6
- package/dist/styles/checkbox.css +11 -25
- package/dist/styles/choice-list.css +17 -31
- package/dist/styles/code-block.css +11 -25
- package/dist/styles/collapsible.css +10 -15
- package/dist/styles/combobox.css +11 -15
- package/dist/styles/command.css +5 -8
- package/dist/styles/context-menu.css +2 -2
- package/dist/styles/dialog.css +5 -16
- package/dist/styles/dropdown-menu.css +2 -2
- package/dist/styles/field.css +15 -21
- package/dist/styles/file-explorer.css +19 -33
- package/dist/styles/file-viewer.css +13 -17
- package/dist/styles/form.css +3 -3
- package/dist/styles/glass-banner.css +12 -47
- package/dist/styles/gradient-banner.css +17 -35
- package/dist/styles/hover-card.css +9 -15
- package/dist/styles/index.css +116 -108
- package/dist/styles/input-group.css +25 -41
- package/dist/styles/input-otp.css +5 -6
- package/dist/styles/input.css +5 -5
- package/dist/styles/kbd.css +1 -1
- package/dist/styles/label.css +9 -30
- package/dist/styles/mention-list.css +6 -8
- package/dist/styles/menubar.css +5 -6
- package/dist/styles/message-actions.css +1 -1
- package/dist/styles/message-response.css +3 -5
- package/dist/styles/message-scroller.css +14 -21
- package/dist/styles/message.css +23 -60
- package/dist/styles/navigation-menu.css +14 -29
- package/dist/styles/notice-banner.css +1 -2
- package/dist/styles/page-header.css +7 -10
- package/dist/styles/pagination.css +1 -4
- package/dist/styles/plan-outline.css +20 -37
- package/dist/styles/popover.css +10 -19
- package/dist/styles/presence-cursor.css +1 -2
- package/dist/styles/progress.css +2 -4
- package/dist/styles/prompt-list.css +6 -17
- package/dist/styles/questionnaire.css +16 -40
- package/dist/styles/radio-group.css +12 -23
- package/dist/styles/reasoning-effort.css +8 -15
- package/dist/styles/record-list.css +243 -0
- package/dist/styles/resizable.css +10 -11
- package/dist/styles/result-card.css +17 -3
- package/dist/styles/result-notice.css +80 -0
- package/dist/styles/review-card.css +2 -3
- package/dist/styles/rich-text-editor.css +1 -2
- package/dist/styles/schema-diagram.css +12 -17
- package/dist/styles/scroll-area.css +8 -10
- package/dist/styles/search-dialog.css +1 -5
- package/dist/styles/search-field.css +1 -2
- package/dist/styles/select.css +7 -7
- package/dist/styles/selection-slot.css +1 -2
- package/dist/styles/separator.css +7 -8
- package/dist/styles/settings-list.css +1 -2
- package/dist/styles/sheet.css +40 -73
- package/dist/styles/sidebar.css +17 -21
- package/dist/styles/skeleton.css +9 -11
- package/dist/styles/slider.css +11 -21
- package/dist/styles/spinner.css +2 -2
- package/dist/styles/sql-viewer.css +29 -29
- package/dist/styles/state-panel.css +8 -9
- package/dist/styles/state-sample.css +20 -33
- package/dist/styles/switch.css +11 -18
- package/dist/styles/table.css +51 -77
- package/dist/styles/tabs.css +12 -16
- package/dist/styles/textarea.css +3 -3
- package/dist/styles/themes/chatgpt.css +11 -23
- package/dist/styles/themes/claude.css +12 -24
- package/dist/styles/themes/cloudflare.css +11 -23
- package/dist/styles/themes/discord.css +11 -23
- package/dist/styles/themes/github.css +11 -23
- package/dist/styles/themes/grok.css +11 -23
- package/dist/styles/themes/linear.css +12 -25
- package/dist/styles/themes/neutral.css +11 -23
- package/dist/styles/themes/notion.css +11 -23
- package/dist/styles/themes/perplexity.css +11 -23
- package/dist/styles/themes/raycast.css +11 -23
- package/dist/styles/themes/spotify.css +11 -23
- package/dist/styles/themes/stripe.css +11 -23
- package/dist/styles/themes/supabase.css +11 -23
- package/dist/styles/themes/tulipfarm.css +9 -10
- package/dist/styles/themes/vercel.css +12 -25
- package/dist/styles/timeline.css +276 -0
- package/dist/styles/toast.css +13 -20
- package/dist/styles/toggle-group.css +17 -23
- package/dist/styles/toggle.css +8 -8
- package/dist/styles/tool-activity.css +7 -13
- package/dist/styles/toolbar-status.css +2 -7
- package/dist/styles/tooltip.css +15 -21
- package/dist/styles/view-switcher.css +279 -0
- package/package.json +21 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { type ComponentProps, type ReactNode } from
|
|
2
|
-
import { useRender } from
|
|
3
|
-
import { type MessageScrollerDefaultScrollPosition, type MessageScrollerScrollable, type MessageScrollerScrollOptions, type MessageScrollerVisibilityState } from
|
|
4
|
-
import { type ButtonSize, type ButtonVariant } from
|
|
5
|
-
export type { MessageScrollerDefaultScrollPosition, MessageScrollerScrollAlign, MessageScrollerScrollable, MessageScrollerScrollOptions, MessageScrollerVisibilityState, } from
|
|
1
|
+
import { type ComponentProps, type ReactNode } from 'react';
|
|
2
|
+
import { useRender } from '@base-ui/react/use-render';
|
|
3
|
+
import { type MessageScrollerDefaultScrollPosition, type MessageScrollerScrollable, type MessageScrollerScrollOptions, type MessageScrollerVisibilityState } from '../internal/message-scroller.js';
|
|
4
|
+
import { type ButtonSize, type ButtonVariant } from './button.js';
|
|
5
|
+
export type { MessageScrollerDefaultScrollPosition, MessageScrollerScrollAlign, MessageScrollerScrollable, MessageScrollerScrollOptions, MessageScrollerVisibilityState, } from '../internal/message-scroller.js';
|
|
6
6
|
export declare const messageScrollerDefaultScrollPositionNames: readonly ["end", "start", "last-anchor"];
|
|
7
7
|
export declare const messageScrollerButtonDirectionNames: readonly ["end", "start"];
|
|
8
8
|
export declare const messageScrollerScrollAlignNames: readonly ["start", "center", "end", "nearest"];
|
|
@@ -22,22 +22,22 @@ export interface MessageScrollerProviderProps {
|
|
|
22
22
|
}
|
|
23
23
|
/** Owns the scroll state. Wrap the scroller and anything that calls the hooks, such as a composer. */
|
|
24
24
|
export declare function MessageScrollerProvider({ children, autoScroll, defaultScrollPosition, scrollEdgeThreshold, scrollPreviousItemPeek, scrollMargin, }: MessageScrollerProviderProps): import("react").JSX.Element;
|
|
25
|
-
export type MessageScrollerProps = ComponentProps<
|
|
25
|
+
export type MessageScrollerProps = ComponentProps<'div'>;
|
|
26
26
|
/** The positioned frame. Holds the viewport and the jump buttons, and fills its parent. */
|
|
27
27
|
export declare function MessageScroller({ className, ref, ...props }: MessageScrollerProps): import("react").JSX.Element;
|
|
28
|
-
export interface MessageScrollerViewportProps extends ComponentProps<
|
|
28
|
+
export interface MessageScrollerViewportProps extends ComponentProps<'div'> {
|
|
29
29
|
/** Keep the message you are reading still when older messages load above it. */
|
|
30
30
|
preserveScrollOnPrepend?: boolean | undefined;
|
|
31
31
|
}
|
|
32
32
|
/** The scrolling region. Focusable, named “Messages” unless you pass `aria-label`. */
|
|
33
|
-
export declare function MessageScrollerViewport({ className, ref, role, tabIndex, preserveScrollOnPrepend, onKeyDown, onScroll, onTouchMove, onWheel,
|
|
34
|
-
export interface MessageScrollerContentProps extends ComponentProps<
|
|
33
|
+
export declare function MessageScrollerViewport({ className, ref, role, tabIndex, preserveScrollOnPrepend, onKeyDown, onScroll, onTouchMove, onWheel, 'aria-label': ariaLabel, ...props }: MessageScrollerViewportProps): import("react").JSX.Element;
|
|
34
|
+
export interface MessageScrollerContentProps extends ComponentProps<'div'> {
|
|
35
35
|
/** Class for the hidden spacer that lets a pinned turn reach the top edge. */
|
|
36
36
|
spacerClassName?: string | undefined;
|
|
37
37
|
}
|
|
38
38
|
/** The message column, a polite `log` that announces additions. Items sit 24px apart. */
|
|
39
|
-
export declare function MessageScrollerContent({ className, children, ref, role, spacerClassName,
|
|
40
|
-
export interface MessageScrollerItemProps extends ComponentProps<
|
|
39
|
+
export declare function MessageScrollerContent({ className, children, ref, role, spacerClassName, 'aria-relevant': ariaRelevant, ...props }: MessageScrollerContentProps): import("react").JSX.Element;
|
|
40
|
+
export interface MessageScrollerItemProps extends ComponentProps<'div'> {
|
|
41
41
|
/** Stable id used by `scrollToMessage` and visibility. */
|
|
42
42
|
messageId?: string | undefined;
|
|
43
43
|
/** Pin this item under the top edge when it is added, such as the newest user turn. */
|
|
@@ -49,7 +49,7 @@ export interface MessageScrollerButtonState extends Record<string, unknown> {
|
|
|
49
49
|
active: boolean;
|
|
50
50
|
direction: MessageScrollerButtonDirection;
|
|
51
51
|
}
|
|
52
|
-
export type MessageScrollerButtonProps = useRender.ComponentProps<
|
|
52
|
+
export type MessageScrollerButtonProps = useRender.ComponentProps<'button', MessageScrollerButtonState> & {
|
|
53
53
|
/** Which edge the button scrolls to. `"start"` sits at the top with the arrow turned up. */
|
|
54
54
|
direction?: MessageScrollerButtonDirection | undefined;
|
|
55
55
|
/** `"smooth"` by default; becomes `"auto"` when reduced motion is set. */
|
|
@@ -1,24 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
-
import { createContext, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore, } from
|
|
4
|
-
import { useRender } from
|
|
5
|
-
import { mergeProps } from
|
|
6
|
-
import { ArrowDown } from
|
|
7
|
-
import { cn } from
|
|
8
|
-
import { MessageScrollerController, scrollIntentKeys, } from
|
|
9
|
-
import { Button } from
|
|
10
|
-
export const messageScrollerDefaultScrollPositionNames = [
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
"last-anchor",
|
|
14
|
-
];
|
|
15
|
-
export const messageScrollerButtonDirectionNames = ["end", "start"];
|
|
16
|
-
export const messageScrollerScrollAlignNames = [
|
|
17
|
-
"start",
|
|
18
|
-
"center",
|
|
19
|
-
"end",
|
|
20
|
-
"nearest",
|
|
21
|
-
];
|
|
3
|
+
import { createContext, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore, } from 'react';
|
|
4
|
+
import { useRender } from '@base-ui/react/use-render';
|
|
5
|
+
import { mergeProps } from '@base-ui/react/merge-props';
|
|
6
|
+
import { ArrowDown } from 'reicon-react/icons/ArrowDown';
|
|
7
|
+
import { cn } from '../internal/classes.js';
|
|
8
|
+
import { MessageScrollerController, scrollIntentKeys, } from '../internal/message-scroller.js';
|
|
9
|
+
import { Button } from './button.js';
|
|
10
|
+
export const messageScrollerDefaultScrollPositionNames = ['end', 'start', 'last-anchor'];
|
|
11
|
+
export const messageScrollerButtonDirectionNames = ['end', 'start'];
|
|
12
|
+
export const messageScrollerScrollAlignNames = ['start', 'center', 'end', 'nearest'];
|
|
22
13
|
const ScrollerContext = createContext(null);
|
|
23
14
|
function useController(part) {
|
|
24
15
|
const controller = useContext(ScrollerContext);
|
|
@@ -27,7 +18,7 @@ function useController(part) {
|
|
|
27
18
|
return controller;
|
|
28
19
|
}
|
|
29
20
|
function assignRef(ref, value) {
|
|
30
|
-
if (typeof ref ===
|
|
21
|
+
if (typeof ref === 'function')
|
|
31
22
|
ref(value);
|
|
32
23
|
else if (ref)
|
|
33
24
|
ref.current = value;
|
|
@@ -37,7 +28,7 @@ function usePendingDefaultScroll(controller) {
|
|
|
37
28
|
return useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot);
|
|
38
29
|
}
|
|
39
30
|
/** Owns the scroll state. Wrap the scroller and anything that calls the hooks, such as a composer. */
|
|
40
|
-
export function MessageScrollerProvider({ children, autoScroll = false, defaultScrollPosition =
|
|
31
|
+
export function MessageScrollerProvider({ children, autoScroll = false, defaultScrollPosition = 'end', scrollEdgeThreshold = 8, scrollPreviousItemPeek = 64, scrollMargin = 0, }) {
|
|
41
32
|
const options = {
|
|
42
33
|
autoScroll,
|
|
43
34
|
defaultScrollPosition,
|
|
@@ -50,21 +41,21 @@ export function MessageScrollerProvider({ children, autoScroll = false, defaultS
|
|
|
50
41
|
useLayoutEffect(() => controller.applyDefaultOrSettle(), [controller, defaultScrollPosition]);
|
|
51
42
|
useLayoutEffect(() => controller.followOnAutoScroll(), [controller, autoScroll]);
|
|
52
43
|
useEffect(() => controller.dispose, [controller]);
|
|
53
|
-
return
|
|
44
|
+
return _jsx(ScrollerContext.Provider, { value: controller, children: children });
|
|
54
45
|
}
|
|
55
46
|
/** The positioned frame. Holds the viewport and the jump buttons, and fills its parent. */
|
|
56
47
|
export function MessageScroller({ className, ref, ...props }) {
|
|
57
|
-
const controller = useController(
|
|
48
|
+
const controller = useController('MessageScroller');
|
|
58
49
|
const pending = usePendingDefaultScroll(controller);
|
|
59
50
|
const setRef = useCallback((element) => {
|
|
60
51
|
controller.setRoot(element);
|
|
61
52
|
assignRef(ref, element);
|
|
62
53
|
}, [controller, ref]);
|
|
63
|
-
return (_jsx("div", { "data-slot": "message-scroller", ref: setRef, className: cn(
|
|
54
|
+
return (_jsx("div", { "data-slot": "message-scroller", ref: setRef, className: cn('sprout-message-scroller', className), ...props, ...(pending ? { 'data-pending-scroll': '' } : null) }));
|
|
64
55
|
}
|
|
65
56
|
/** The scrolling region. Focusable, named “Messages” unless you pass `aria-label`. */
|
|
66
|
-
export function MessageScrollerViewport({ className, ref, role, tabIndex, preserveScrollOnPrepend = true, onKeyDown, onScroll, onTouchMove, onWheel,
|
|
67
|
-
const controller = useController(
|
|
57
|
+
export function MessageScrollerViewport({ className, ref, role, tabIndex, preserveScrollOnPrepend = true, onKeyDown, onScroll, onTouchMove, onWheel, 'aria-label': ariaLabel, ...props }) {
|
|
58
|
+
const controller = useController('MessageScrollerViewport');
|
|
68
59
|
const pending = usePendingDefaultScroll(controller);
|
|
69
60
|
controller.preserveScrollOnPrepend = preserveScrollOnPrepend;
|
|
70
61
|
const setRef = useCallback((element) => {
|
|
@@ -73,7 +64,7 @@ export function MessageScrollerViewport({ className, ref, role, tabIndex, preser
|
|
|
73
64
|
}, [controller, ref]);
|
|
74
65
|
useEffect(() => {
|
|
75
66
|
const viewport = controller.getViewport();
|
|
76
|
-
if (!viewport || typeof ResizeObserver ===
|
|
67
|
+
if (!viewport || typeof ResizeObserver === 'undefined')
|
|
77
68
|
return;
|
|
78
69
|
let frame = 0;
|
|
79
70
|
const observer = new ResizeObserver(() => {
|
|
@@ -86,7 +77,7 @@ export function MessageScrollerViewport({ className, ref, role, tabIndex, preser
|
|
|
86
77
|
observer.disconnect();
|
|
87
78
|
};
|
|
88
79
|
}, [controller]);
|
|
89
|
-
return (_jsx("div", { "data-slot": "message-scroller-viewport", ref: setRef, role: role ??
|
|
80
|
+
return (_jsx("div", { "data-slot": "message-scroller-viewport", ref: setRef, role: role ?? 'region', "aria-label": ariaLabel ?? 'Messages', tabIndex: tabIndex ?? 0, className: cn('sprout-message-scroller-viewport', className), onKeyDown: (event) => {
|
|
90
81
|
if (scrollIntentKeys.has(event.key))
|
|
91
82
|
controller.userScrollIntent();
|
|
92
83
|
onKeyDown?.(event);
|
|
@@ -99,11 +90,11 @@ export function MessageScrollerViewport({ className, ref, role, tabIndex, preser
|
|
|
99
90
|
}, onWheel: (event) => {
|
|
100
91
|
controller.userScrollIntent();
|
|
101
92
|
onWheel?.(event);
|
|
102
|
-
}, ...props, ...(pending ? {
|
|
93
|
+
}, ...props, ...(pending ? { 'data-pending-scroll': '' } : null) }));
|
|
103
94
|
}
|
|
104
95
|
/** The message column, a polite `log` that announces additions. Items sit 24px apart. */
|
|
105
|
-
export function MessageScrollerContent({ className, children, ref, role, spacerClassName,
|
|
106
|
-
const controller = useController(
|
|
96
|
+
export function MessageScrollerContent({ className, children, ref, role, spacerClassName, 'aria-relevant': ariaRelevant, ...props }) {
|
|
97
|
+
const controller = useController('MessageScrollerContent');
|
|
107
98
|
const element = useRef(null);
|
|
108
99
|
const setRef = useCallback((node) => {
|
|
109
100
|
element.current = node;
|
|
@@ -115,7 +106,7 @@ export function MessageScrollerContent({ className, children, ref, role, spacerC
|
|
|
115
106
|
if (!node)
|
|
116
107
|
return;
|
|
117
108
|
controller.handleContentChange();
|
|
118
|
-
if (typeof MutationObserver ===
|
|
109
|
+
if (typeof MutationObserver === 'undefined')
|
|
119
110
|
return;
|
|
120
111
|
const observer = new MutationObserver(controller.handleContentChange);
|
|
121
112
|
observer.observe(node, { childList: true });
|
|
@@ -123,7 +114,7 @@ export function MessageScrollerContent({ className, children, ref, role, spacerC
|
|
|
123
114
|
}, [controller]);
|
|
124
115
|
useEffect(() => {
|
|
125
116
|
const node = element.current;
|
|
126
|
-
if (!node || typeof ResizeObserver ===
|
|
117
|
+
if (!node || typeof ResizeObserver === 'undefined')
|
|
127
118
|
return;
|
|
128
119
|
let frame = 0;
|
|
129
120
|
const observer = new ResizeObserver(() => {
|
|
@@ -136,11 +127,11 @@ export function MessageScrollerContent({ className, children, ref, role, spacerC
|
|
|
136
127
|
observer.disconnect();
|
|
137
128
|
};
|
|
138
129
|
}, [controller]);
|
|
139
|
-
return (_jsxs("div", { "data-slot": "message-scroller-content", ref: setRef, role: role ??
|
|
130
|
+
return (_jsxs("div", { "data-slot": "message-scroller-content", ref: setRef, role: role ?? 'log', "aria-relevant": ariaRelevant ?? 'additions', className: cn('sprout-message-scroller-content', className), ...props, children: [children, _jsx("div", { ref: controller.setSpacer, "aria-hidden": "true", "data-message-scroller-spacer": "", hidden: true, className: spacerClassName })] }));
|
|
140
131
|
}
|
|
141
132
|
/** One message or turn in the column. Off-screen items skip rendering work. */
|
|
142
133
|
export function MessageScrollerItem({ className, ref, messageId, scrollAnchor = false, ...props }) {
|
|
143
|
-
const controller = useController(
|
|
134
|
+
const controller = useController('MessageScrollerItem');
|
|
144
135
|
const previous = useRef(null);
|
|
145
136
|
const setRef = useCallback((node) => {
|
|
146
137
|
const before = previous.current;
|
|
@@ -149,33 +140,30 @@ export function MessageScrollerItem({ className, ref, messageId, scrollAnchor =
|
|
|
149
140
|
controller.registerMessage(messageId, node, before);
|
|
150
141
|
assignRef(ref, node);
|
|
151
142
|
}, [controller, messageId, ref]);
|
|
152
|
-
return (_jsx("div", { "data-slot": "message-scroller-item", ref: setRef, "data-message-id": messageId, "data-scroll-anchor": scrollAnchor ?
|
|
143
|
+
return (_jsx("div", { "data-slot": "message-scroller-item", ref: setRef, "data-message-id": messageId, "data-scroll-anchor": scrollAnchor ? 'true' : 'false', className: cn('sprout-message-scroller-item', className), ...props }));
|
|
153
144
|
}
|
|
154
|
-
const prefersReducedMotion = () => typeof matchMedia ===
|
|
155
|
-
matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
145
|
+
const prefersReducedMotion = () => typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches;
|
|
156
146
|
/** A floating jump button that shows only while there is more history in its direction. */
|
|
157
|
-
export function MessageScrollerButton({ className, children, render, ref, direction =
|
|
158
|
-
const controller = useController(
|
|
147
|
+
export function MessageScrollerButton({ className, children, render, ref, direction = 'end', behavior = 'smooth', variant = 'secondary', size = 'icon-sm', tabIndex, onClick, ...props }) {
|
|
148
|
+
const controller = useController('MessageScrollerButton');
|
|
159
149
|
const store = controller.stateStore;
|
|
160
|
-
const read = useCallback(() => direction ===
|
|
161
|
-
? store.getSnapshot().start
|
|
162
|
-
: store.getSnapshot().end, [direction, store]);
|
|
150
|
+
const read = useCallback(() => (direction === 'start' ? store.getSnapshot().start : store.getSnapshot().end), [direction, store]);
|
|
163
151
|
const active = useSyncExternalStore(store.subscribe, read, read);
|
|
164
152
|
const state = useMemo(() => ({ active, direction }), [active, direction]);
|
|
165
153
|
return useRender({
|
|
166
|
-
defaultTagName:
|
|
154
|
+
defaultTagName: 'button',
|
|
167
155
|
render: render ?? _jsx(Button, { variant: variant, size: size }),
|
|
168
156
|
ref,
|
|
169
157
|
state,
|
|
170
158
|
stateAttributesMapping: { active: () => null },
|
|
171
159
|
props: mergeProps({
|
|
172
|
-
type:
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
className: cn(
|
|
160
|
+
type: 'button',
|
|
161
|
+
'data-slot': 'message-scroller-button',
|
|
162
|
+
'data-active': active ? 'true' : 'false',
|
|
163
|
+
className: cn('sprout-message-scroller-button', className),
|
|
176
164
|
inert: !active,
|
|
177
165
|
tabIndex: active ? tabIndex : -1,
|
|
178
|
-
onClick:
|
|
166
|
+
onClick: event => {
|
|
179
167
|
if (!active)
|
|
180
168
|
return;
|
|
181
169
|
onClick?.(event);
|
|
@@ -183,20 +171,20 @@ export function MessageScrollerButton({ className, children, render, ref, direct
|
|
|
183
171
|
return;
|
|
184
172
|
event.currentTarget.blur();
|
|
185
173
|
const scroll = {
|
|
186
|
-
behavior: prefersReducedMotion() ?
|
|
174
|
+
behavior: prefersReducedMotion() ? 'auto' : behavior,
|
|
187
175
|
};
|
|
188
|
-
if (direction ===
|
|
176
|
+
if (direction === 'start')
|
|
189
177
|
controller.scrollToStart(scroll);
|
|
190
178
|
else
|
|
191
179
|
controller.scrollToEnd(scroll);
|
|
192
180
|
},
|
|
193
|
-
children: children ?? (_jsxs(_Fragment, { children: [_jsx(ArrowDown, { "aria-hidden": "true" }), _jsx("span", { className: "sprout-message-scroller-sr-only", children: direction ===
|
|
181
|
+
children: children ?? (_jsxs(_Fragment, { children: [_jsx(ArrowDown, { "aria-hidden": "true" }), _jsx("span", { className: "sprout-message-scroller-sr-only", children: direction === 'end' ? 'Scroll to end' : 'Scroll to start' })] })),
|
|
194
182
|
}, props),
|
|
195
183
|
});
|
|
196
184
|
}
|
|
197
185
|
/** Scroll the history from outside it, such as after sending or from a “jump to” link. */
|
|
198
186
|
export function useMessageScroller() {
|
|
199
|
-
const controller = useController(
|
|
187
|
+
const controller = useController('useMessageScroller');
|
|
200
188
|
return useMemo(() => ({
|
|
201
189
|
scrollToEnd: controller.scrollToEnd,
|
|
202
190
|
scrollToMessage: controller.scrollToMessage,
|
|
@@ -205,12 +193,12 @@ export function useMessageScroller() {
|
|
|
205
193
|
}
|
|
206
194
|
/** Whether there is more history above (`start`) or below (`end`) the current view. */
|
|
207
195
|
export function useMessageScrollerScrollable() {
|
|
208
|
-
const store = useController(
|
|
196
|
+
const store = useController('useMessageScrollerScrollable').stateStore;
|
|
209
197
|
return useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot);
|
|
210
198
|
}
|
|
211
199
|
/** The ids of items in view and the pinned turn under the top edge. Observes only while used. */
|
|
212
200
|
export function useMessageScrollerVisibility() {
|
|
213
|
-
const controller = useController(
|
|
201
|
+
const controller = useController('useMessageScrollerVisibility');
|
|
214
202
|
const store = controller.visibilityStore;
|
|
215
203
|
const subscribe = useCallback((listener) => store.subscribe(listener, controller.observeVisibility, controller.unobserveVisibility), [controller, store]);
|
|
216
204
|
return useSyncExternalStore(subscribe, store.getSnapshot, store.getSnapshot);
|
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
import type { ComponentProps, ReactNode } from
|
|
2
|
-
import { useRender } from
|
|
1
|
+
import type { ComponentProps, ReactNode } from 'react';
|
|
2
|
+
import { useRender } from '@base-ui/react/use-render';
|
|
3
3
|
export declare const messageAlignNames: readonly ["start", "end"];
|
|
4
4
|
export declare const messageBubbleVariantNames: readonly ["default", "secondary", "muted", "tinted", "outline", "ghost", "destructive"];
|
|
5
5
|
export declare const messageReactionsSideNames: readonly ["top", "bottom"];
|
|
6
6
|
export type MessageAlign = (typeof messageAlignNames)[number];
|
|
7
7
|
export type MessageBubbleVariant = (typeof messageBubbleVariantNames)[number];
|
|
8
8
|
export type MessageReactionsSide = (typeof messageReactionsSideNames)[number];
|
|
9
|
-
export type MessageGroupProps = ComponentProps<
|
|
9
|
+
export type MessageGroupProps = ComponentProps<'div'>;
|
|
10
10
|
/** Stacks messages 8px apart. */
|
|
11
11
|
export declare function MessageGroup({ className, ...props }: MessageGroupProps): import("react").JSX.Element;
|
|
12
|
-
export interface MessageProps extends ComponentProps<
|
|
12
|
+
export interface MessageProps extends ComponentProps<'div'> {
|
|
13
13
|
/** `"end"` puts the message on the trailing side, for your own messages. */
|
|
14
14
|
align?: MessageAlign;
|
|
15
15
|
}
|
|
16
16
|
/** One chat message: an optional avatar beside its content. */
|
|
17
17
|
export declare function Message({ align, className, ...props }: MessageProps): import("react").JSX.Element;
|
|
18
|
-
export type MessageAvatarProps = ComponentProps<
|
|
18
|
+
export type MessageAvatarProps = ComponentProps<'div'>;
|
|
19
19
|
/** Holds an avatar at the bottom of the message, beside the last bubble. */
|
|
20
20
|
export declare function MessageAvatar({ className, ...props }: MessageAvatarProps): import("react").JSX.Element;
|
|
21
|
-
export type MessageContentProps = ComponentProps<
|
|
21
|
+
export type MessageContentProps = ComponentProps<'div'>;
|
|
22
22
|
/** The column of header, bubbles, cards, and footer. Slotted children follow `align`. */
|
|
23
23
|
export declare function MessageContent({ className, ...props }: MessageContentProps): import("react").JSX.Element;
|
|
24
|
-
export type MessageHeaderProps = ComponentProps<
|
|
24
|
+
export type MessageHeaderProps = ComponentProps<'div'>;
|
|
25
25
|
/** A small muted line above the content, such as a name and time. */
|
|
26
26
|
export declare function MessageHeader({ className, ...props }: MessageHeaderProps): import("react").JSX.Element;
|
|
27
|
-
export type MessageFooterProps = ComponentProps<
|
|
27
|
+
export type MessageFooterProps = ComponentProps<'div'>;
|
|
28
28
|
/** A small muted line below the content, such as delivery or reply status. */
|
|
29
29
|
export declare function MessageFooter({ className, ...props }: MessageFooterProps): import("react").JSX.Element;
|
|
30
30
|
export interface MessageBubbleState extends Record<string, unknown> {
|
|
31
|
-
slot:
|
|
31
|
+
slot: 'message-bubble';
|
|
32
32
|
variant: MessageBubbleVariant;
|
|
33
33
|
}
|
|
34
|
-
export type MessageBubbleProps = useRender.ComponentProps<
|
|
34
|
+
export type MessageBubbleProps = useRender.ComponentProps<'div', MessageBubbleState> & {
|
|
35
35
|
/** Fill. `"ghost"` drops the fill and padding and may span the full width. */
|
|
36
36
|
variant?: MessageBubbleVariant | undefined;
|
|
37
37
|
/** A `MessageReactions` pill pinned over the bubble's edge. */
|
|
@@ -39,7 +39,7 @@ export type MessageBubbleProps = useRender.ComponentProps<"div", MessageBubbleSt
|
|
|
39
39
|
};
|
|
40
40
|
/** A filled chat bubble. Use `render` for a `button` or `a` to make the whole bubble act. */
|
|
41
41
|
export declare function MessageBubble({ variant, reactions, className, render, ref, ...props }: MessageBubbleProps): import("react").JSX.Element;
|
|
42
|
-
export interface MessageReactionsProps extends ComponentProps<
|
|
42
|
+
export interface MessageReactionsProps extends ComponentProps<'div'> {
|
|
43
43
|
/** Edge of the bubble the pill overlaps. */
|
|
44
44
|
side?: MessageReactionsSide | undefined;
|
|
45
45
|
/** Corner of that edge, 12px in from the bubble's side. */
|
|
@@ -1,52 +1,52 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { mergeProps } from
|
|
3
|
-
import { useRender } from
|
|
4
|
-
import { cn } from
|
|
5
|
-
export const messageAlignNames = [
|
|
2
|
+
import { mergeProps } from '@base-ui/react/merge-props';
|
|
3
|
+
import { useRender } from '@base-ui/react/use-render';
|
|
4
|
+
import { cn } from '../internal/classes.js';
|
|
5
|
+
export const messageAlignNames = ['start', 'end'];
|
|
6
6
|
export const messageBubbleVariantNames = [
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
7
|
+
'default',
|
|
8
|
+
'secondary',
|
|
9
|
+
'muted',
|
|
10
|
+
'tinted',
|
|
11
|
+
'outline',
|
|
12
|
+
'ghost',
|
|
13
|
+
'destructive',
|
|
14
14
|
];
|
|
15
|
-
export const messageReactionsSideNames = [
|
|
15
|
+
export const messageReactionsSideNames = ['top', 'bottom'];
|
|
16
16
|
/** Stacks messages 8px apart. */
|
|
17
17
|
export function MessageGroup({ className, ...props }) {
|
|
18
|
-
return
|
|
18
|
+
return _jsx("div", { "data-slot": "message-group", className: cn('sprout-message-group', className), ...props });
|
|
19
19
|
}
|
|
20
20
|
/** One chat message: an optional avatar beside its content. */
|
|
21
|
-
export function Message({ align =
|
|
22
|
-
return
|
|
21
|
+
export function Message({ align = 'start', className, ...props }) {
|
|
22
|
+
return _jsx("div", { "data-slot": "message", "data-align": align, className: cn('sprout-message', className), ...props });
|
|
23
23
|
}
|
|
24
24
|
/** Holds an avatar at the bottom of the message, beside the last bubble. */
|
|
25
25
|
export function MessageAvatar({ className, ...props }) {
|
|
26
|
-
return
|
|
26
|
+
return _jsx("div", { "data-slot": "message-avatar", className: cn('sprout-message-avatar', className), ...props });
|
|
27
27
|
}
|
|
28
28
|
/** The column of header, bubbles, cards, and footer. Slotted children follow `align`. */
|
|
29
29
|
export function MessageContent({ className, ...props }) {
|
|
30
|
-
return
|
|
30
|
+
return _jsx("div", { "data-slot": "message-content", className: cn('sprout-message-content', className), ...props });
|
|
31
31
|
}
|
|
32
32
|
/** A small muted line above the content, such as a name and time. */
|
|
33
33
|
export function MessageHeader({ className, ...props }) {
|
|
34
|
-
return
|
|
34
|
+
return _jsx("div", { "data-slot": "message-header", className: cn('sprout-message-header', className), ...props });
|
|
35
35
|
}
|
|
36
36
|
/** A small muted line below the content, such as delivery or reply status. */
|
|
37
37
|
export function MessageFooter({ className, ...props }) {
|
|
38
|
-
return
|
|
38
|
+
return _jsx("div", { "data-slot": "message-footer", className: cn('sprout-message-footer', className), ...props });
|
|
39
39
|
}
|
|
40
40
|
/** A filled chat bubble. Use `render` for a `button` or `a` to make the whole bubble act. */
|
|
41
|
-
export function MessageBubble({ variant =
|
|
41
|
+
export function MessageBubble({ variant = 'default', reactions, className, render, ref, ...props }) {
|
|
42
42
|
const bubble = useRender({
|
|
43
|
-
defaultTagName:
|
|
43
|
+
defaultTagName: 'div',
|
|
44
44
|
ref,
|
|
45
45
|
render,
|
|
46
46
|
props: mergeProps({
|
|
47
|
-
className: cn(
|
|
47
|
+
className: cn('sprout-message-bubble', `sprout-message-bubble-${variant}`, className),
|
|
48
48
|
}, props),
|
|
49
|
-
state: { slot:
|
|
49
|
+
state: { slot: 'message-bubble', variant },
|
|
50
50
|
});
|
|
51
51
|
if (reactions == null || reactions === false)
|
|
52
52
|
return bubble;
|
|
@@ -54,6 +54,6 @@ export function MessageBubble({ variant = "default", reactions, className, rende
|
|
|
54
54
|
return (_jsxs("div", { "data-slot": "message-bubble-frame", "data-variant": variant, className: "sprout-message-bubble-frame", children: [bubble, reactions] }));
|
|
55
55
|
}
|
|
56
56
|
/** A small pill of reactions for the `reactions` prop of `MessageBubble`. */
|
|
57
|
-
export function MessageReactions({ side =
|
|
58
|
-
return (_jsx("div", { "data-slot": "message-reactions", "data-align": align, "data-side": side, className: cn(
|
|
57
|
+
export function MessageReactions({ side = 'bottom', align = 'end', className, ...props }) {
|
|
58
|
+
return (_jsx("div", { "data-slot": "message-reactions", "data-align": align, "data-side": side, className: cn('sprout-message-reactions', className), ...props }));
|
|
59
59
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { NavigationMenu as NavigationMenuPrimitive } from
|
|
2
|
-
type Align = NonNullable<NavigationMenuPrimitive.Positioner.Props[
|
|
1
|
+
import { NavigationMenu as NavigationMenuPrimitive } from '@base-ui/react/navigation-menu';
|
|
2
|
+
type Align = NonNullable<NavigationMenuPrimitive.Positioner.Props['align']>;
|
|
3
3
|
export interface NavigationMenuProps extends NavigationMenuPrimitive.Root.Props {
|
|
4
4
|
/** Where the shared panel lines up with the open trigger. Defaults to `"start"`. */
|
|
5
5
|
align?: Align;
|
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
|
|
1
|
+
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { NavigationMenu as NavigationMenuPrimitive } from
|
|
4
|
-
import { ChevronDown } from
|
|
5
|
-
import { cn, stateClassName } from
|
|
3
|
+
import { NavigationMenu as NavigationMenuPrimitive } from '@base-ui/react/navigation-menu';
|
|
4
|
+
import { ChevronDown } from 'reicon-react/icons/ChevronDown';
|
|
5
|
+
import { cn, stateClassName } from '../internal/classes.js';
|
|
6
6
|
/**
|
|
7
7
|
* A row of site links where some items open a panel of more links. It
|
|
8
8
|
* renders the shared panel itself, so put `NavigationMenuList` directly inside.
|
|
9
9
|
*/
|
|
10
|
-
export function NavigationMenu({ align =
|
|
11
|
-
return (_jsxs(NavigationMenuPrimitive.Root, { "data-slot": "navigation-menu", ...props, className: stateClassName(
|
|
10
|
+
export function NavigationMenu({ align = 'start', className, children, ...props }) {
|
|
11
|
+
return (_jsxs(NavigationMenuPrimitive.Root, { "data-slot": "navigation-menu", ...props, className: stateClassName('sprout-navigation-menu', className), children: [children, _jsx(NavigationMenuPositioner, { align: align })] }));
|
|
12
12
|
}
|
|
13
13
|
export function NavigationMenuList({ className, ...props }) {
|
|
14
|
-
return (_jsx(NavigationMenuPrimitive.List, { "data-slot": "navigation-menu-list", ...props, className: stateClassName(
|
|
14
|
+
return (_jsx(NavigationMenuPrimitive.List, { "data-slot": "navigation-menu-list", ...props, className: stateClassName('sprout-navigation-menu-list', className) }));
|
|
15
15
|
}
|
|
16
16
|
export function NavigationMenuItem({ className, ...props }) {
|
|
17
|
-
return (_jsx(NavigationMenuPrimitive.Item, { "data-slot": "navigation-menu-item", ...props, className: stateClassName(
|
|
17
|
+
return (_jsx(NavigationMenuPrimitive.Item, { "data-slot": "navigation-menu-item", ...props, className: stateClassName('sprout-navigation-menu-item', className) }));
|
|
18
18
|
}
|
|
19
19
|
/**
|
|
20
20
|
* Returns the trigger class string. Add it to a top-level `NavigationMenuLink`
|
|
21
21
|
* (or any link) so it matches the triggers beside it.
|
|
22
22
|
*/
|
|
23
23
|
export function navigationMenuTriggerStyle(className) {
|
|
24
|
-
return cn(
|
|
24
|
+
return cn('sprout-navigation-menu-trigger', className);
|
|
25
25
|
}
|
|
26
26
|
/** Opens its item's `NavigationMenuContent`. A chevron turns while open. */
|
|
27
27
|
export function NavigationMenuTrigger({ className, children, ...props }) {
|
|
28
|
-
return (_jsxs(NavigationMenuPrimitive.Trigger, { "data-slot": "navigation-menu-trigger", ...props, className: stateClassName(
|
|
28
|
+
return (_jsxs(NavigationMenuPrimitive.Trigger, { "data-slot": "navigation-menu-trigger", ...props, className: stateClassName('sprout-navigation-menu-trigger', className), children: [children, _jsx(NavigationMenuPrimitive.Icon, { "data-slot": "navigation-menu-chevron", className: "sprout-navigation-menu-chevron", children: _jsx(ChevronDown, {}) })] }));
|
|
29
29
|
}
|
|
30
30
|
/** The panel for one item. It is moved into the shared popup while open. */
|
|
31
31
|
export function NavigationMenuContent({ className, ...props }) {
|
|
32
|
-
return (_jsx(NavigationMenuPrimitive.Content, { "data-slot": "navigation-menu-content", ...props, className: stateClassName(
|
|
32
|
+
return (_jsx(NavigationMenuPrimitive.Content, { "data-slot": "navigation-menu-content", ...props, className: stateClassName('sprout-navigation-menu-content', className) }));
|
|
33
33
|
}
|
|
34
34
|
/**
|
|
35
35
|
* The portal, positioner, popup, and viewport that show the open panel.
|
|
36
36
|
* `NavigationMenu` already renders one; use this only to build a root by hand.
|
|
37
37
|
*/
|
|
38
|
-
export function NavigationMenuPositioner({ className, side =
|
|
39
|
-
return (_jsx(NavigationMenuPrimitive.Portal, { "data-slot": "navigation-menu-portal", children: _jsx(NavigationMenuPrimitive.Positioner, { "data-slot": "navigation-menu-positioner", side: side, sideOffset: sideOffset, align: align, alignOffset: alignOffset, collisionPadding: collisionPadding, ...props, className: stateClassName(
|
|
38
|
+
export function NavigationMenuPositioner({ className, side = 'bottom', sideOffset = 8, align = 'start', alignOffset = 0, collisionPadding = 8, ...props }) {
|
|
39
|
+
return (_jsx(NavigationMenuPrimitive.Portal, { "data-slot": "navigation-menu-portal", children: _jsx(NavigationMenuPrimitive.Positioner, { "data-slot": "navigation-menu-positioner", side: side, sideOffset: sideOffset, align: align, alignOffset: alignOffset, collisionPadding: collisionPadding, ...props, className: stateClassName('sprout-navigation-menu-positioner', className), children: _jsx(NavigationMenuPrimitive.Popup, { "data-slot": "navigation-menu-popup", className: "sprout-navigation-menu-popup", children: _jsx(NavigationMenuPrimitive.Viewport, { "data-slot": "navigation-menu-viewport", className: "sprout-navigation-menu-viewport" }) }) }) }));
|
|
40
40
|
}
|
|
41
41
|
/**
|
|
42
42
|
* A link in the list or inside a panel. Pass `active` for the current page
|
|
43
43
|
* (sets `aria-current="page"`) and your router link through `render`.
|
|
44
44
|
*/
|
|
45
45
|
export function NavigationMenuLink({ className, ...props }) {
|
|
46
|
-
return (_jsx(NavigationMenuPrimitive.Link, { "data-slot": "navigation-menu-link", ...props, className: stateClassName(
|
|
46
|
+
return (_jsx(NavigationMenuPrimitive.Link, { "data-slot": "navigation-menu-link", ...props, className: stateClassName('sprout-navigation-menu-link', className) }));
|
|
47
47
|
}
|
|
48
48
|
/**
|
|
49
49
|
* A small pointer under an item's trigger that shows while its panel is open.
|
|
50
50
|
* Place it inside `NavigationMenuItem`, after the trigger.
|
|
51
51
|
*/
|
|
52
52
|
export function NavigationMenuIndicator({ className, children, ...props }) {
|
|
53
|
-
return (_jsx(NavigationMenuPrimitive.Icon, { "data-slot": "navigation-menu-indicator", ...props, className: stateClassName(
|
|
53
|
+
return (_jsx(NavigationMenuPrimitive.Icon, { "data-slot": "navigation-menu-indicator", ...props, className: stateClassName('sprout-navigation-menu-indicator', className), children: children ?? _jsx("span", { className: "sprout-navigation-menu-indicator-arrow" }) }));
|
|
54
54
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { ComponentProps, ReactNode } from
|
|
2
|
-
export interface NoticeBannerProps extends Omit<ComponentProps<
|
|
1
|
+
import type { ComponentProps, ReactNode } from 'react';
|
|
2
|
+
export interface NoticeBannerProps extends Omit<ComponentProps<'section'>, 'children'> {
|
|
3
3
|
/** The message. Put `role="status"` or `role="alert"` on it when it changes. */
|
|
4
4
|
children: ReactNode;
|
|
5
5
|
/** Controls for the notice, such as buttons or a select. They wrap. */
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { cn } from
|
|
2
|
+
import { cn } from '../internal/classes.js';
|
|
3
3
|
/**
|
|
4
4
|
* A full-width strip at the top of a page for something that needs action,
|
|
5
5
|
* such as an integration that needs authorization. The message and actions
|
|
@@ -7,5 +7,5 @@ import { cn } from "../internal/classes.js";
|
|
|
7
7
|
* with `aria-label`.
|
|
8
8
|
*/
|
|
9
9
|
export function NoticeBanner({ children, actions, className, ...props }) {
|
|
10
|
-
return (_jsxs("section", { "data-slot": "notice-banner", className: cn(
|
|
10
|
+
return (_jsxs("section", { "data-slot": "notice-banner", className: cn('sprout-notice-banner', className), ...props, children: [_jsx("div", { "data-slot": "notice-banner-content", className: "sprout-notice-banner-content", children: children }), actions != null && actions !== false && (_jsx("div", { "data-slot": "notice-banner-actions", className: "sprout-notice-banner-actions", children: actions }))] }));
|
|
11
11
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { ComponentProps } from
|
|
2
|
-
export type PageContentProps = ComponentProps<
|
|
1
|
+
import type { ComponentProps } from 'react';
|
|
2
|
+
export type PageContentProps = ComponentProps<'div'>;
|
|
3
3
|
/**
|
|
4
4
|
* The padded column that holds a page's header and sections. Direct children
|
|
5
5
|
* are stacked 16px apart. Put it inside your own scroll region.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { cn } from
|
|
2
|
+
import { cn } from '../internal/classes.js';
|
|
3
3
|
/**
|
|
4
4
|
* The padded column that holds a page's header and sections. Direct children
|
|
5
5
|
* are stacked 16px apart. Put it inside your own scroll region.
|
|
6
6
|
*/
|
|
7
7
|
export function PageContent({ className, ...props }) {
|
|
8
|
-
return
|
|
8
|
+
return _jsx("div", { "data-slot": "page-content", className: cn('sprout-page-content', className), ...props });
|
|
9
9
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type ReactElement, type ReactNode, type Ref } from
|
|
1
|
+
import { type ReactElement, type ReactNode, type Ref } from 'react';
|
|
2
2
|
export interface PageChrome {
|
|
3
3
|
/** App header element that receives the back link and page title. */
|
|
4
4
|
title: HTMLElement | null;
|