@moldable-ai/ui 0.2.31 → 0.2.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/app-error-boundary.d.ts +1 -1
- package/dist/components/chat/chat-image-lightbox.d.ts +8 -0
- package/dist/components/chat/chat-image-lightbox.d.ts.map +1 -1
- package/dist/components/chat/chat-image-lightbox.js +24 -2
- package/dist/components/chat/chat-input.d.ts +3 -2
- package/dist/components/chat/chat-input.d.ts.map +1 -1
- package/dist/components/chat/chat-input.js +3 -3
- package/dist/components/chat/chat-message.d.ts.map +1 -1
- package/dist/components/chat/chat-message.js +3 -1
- package/dist/components/chat/chat-panel.d.ts +3 -1
- package/dist/components/chat/chat-panel.d.ts.map +1 -1
- package/dist/components/chat/chat-panel.js +53 -39
- package/dist/components/chat/conversation-history.d.ts +4 -2
- package/dist/components/chat/conversation-history.d.ts.map +1 -1
- package/dist/components/chat/conversation-history.js +20 -15
- package/dist/components/ui/alert.d.ts +1 -1
- package/dist/components/ui/button.d.ts +2 -2
- package/dist/components/ui/button.js +1 -1
- package/dist/components/ui/context-menu.d.ts.map +1 -1
- package/dist/components/ui/context-menu.js +1 -0
- package/dist/components/ui/date-field.d.ts +1 -1
- package/dist/components/ui/dropdown-menu.d.ts +1 -0
- package/dist/components/ui/dropdown-menu.d.ts.map +1 -1
- package/dist/components/ui/dropdown-menu.js +3 -2
- package/dist/components/ui/material.d.ts +1 -1
- package/dist/components/ui/material.d.ts.map +1 -1
- package/dist/components/ui/menu-items.d.ts +2 -1
- package/dist/components/ui/menu-items.d.ts.map +1 -1
- package/dist/components/ui/menu-items.js +3 -2
- package/dist/components/ui/message-scroller-controller.d.ts +15 -17
- package/dist/components/ui/message-scroller-controller.d.ts.map +1 -1
- package/dist/components/ui/message-scroller-controller.js +106 -91
- package/dist/components/ui/message-scroller-primitive.d.ts +2 -0
- package/dist/components/ui/message-scroller-primitive.d.ts.map +1 -1
- package/dist/components/ui/message-scroller-primitive.js +2 -0
- package/dist/components/ui/message-scroller.d.ts.map +1 -1
- package/dist/components/ui/message-scroller.js +2 -2
- package/dist/components/ui/number-input.d.ts +1 -1
- package/dist/components/ui/popover.js +1 -1
- package/dist/components/ui/search-field.d.ts +1 -1
- package/dist/components/ui/sidebar.d.ts +6 -2
- package/dist/components/ui/sidebar.d.ts.map +1 -1
- package/dist/components/ui/sidebar.js +26 -7
- package/dist/components/ui/toolbar-controls.d.ts +10 -2
- package/dist/components/ui/toolbar-controls.d.ts.map +1 -1
- package/dist/components/ui/toolbar-controls.js +25 -7
- package/package.json +1 -1
- package/src/components/ui/button.md +3 -2
- package/src/components/ui/dropdown-menu.md +16 -14
- package/src/components/ui/menu-items.md +2 -0
- package/src/components/ui/message-scroller.md +6 -3
- package/src/components/ui/sidebar.md +11 -5
- package/src/components/ui/toolbar-controls.md +11 -7
- package/src/styles/index.css +132 -1
- package/src/tokens/moldable/brand.css +124 -7
- package/src/tokens/platform-contract.test.ts +5 -1
|
@@ -69,18 +69,28 @@ function AppScopeIcon({ icon, isChats, }) {
|
|
|
69
69
|
if (isChats)
|
|
70
70
|
return _jsx(MessageCircle, { className: "size-4" });
|
|
71
71
|
if (isConversationIconImageSource(icon)) {
|
|
72
|
-
return
|
|
72
|
+
return _jsx("img", { src: icon, alt: "", className: "size-4 rounded object-cover" });
|
|
73
73
|
}
|
|
74
74
|
if (icon)
|
|
75
|
-
return _jsx("span", { className: "text-
|
|
75
|
+
return _jsx("span", { className: "text-sm leading-none", children: icon });
|
|
76
76
|
return _jsx(Folder, { className: "size-4" });
|
|
77
77
|
}
|
|
78
|
-
function
|
|
78
|
+
function ConversationRows({ conversations, currentConversationId, onSelect, onArchive, disabled, }) {
|
|
79
|
+
return conversations.map((conversation) => (_jsxs("li", { "data-conversation-id": conversation.id, className: cn('group/conversation relative flex min-w-0 items-center rounded-lg', conversation.id === currentConversationId && 'bg-accent'), children: [_jsx("button", { type: "button", disabled: disabled, onClick: () => onSelect(conversation.id), "aria-current": conversation.id === currentConversationId ? 'page' : undefined, className: "min-w-0 flex-1 cursor-pointer truncate rounded-lg py-1.5 pl-3 pr-8 text-left text-sm disabled:cursor-default", children: conversation.title }), conversation.isActive && (_jsx(LoaderCircle, { className: "text-muted-foreground absolute right-2 size-3.5 animate-spin", "aria-label": "Conversation is working" })), onArchive && !conversation.isActive && (_jsx("button", { type: "button", onClick: (event) => {
|
|
80
|
+
event.stopPropagation();
|
|
81
|
+
onArchive(conversation.id);
|
|
82
|
+
}, disabled: disabled, className: "text-muted-foreground hover:text-foreground focus-visible:ring-ring absolute right-1 flex size-7 cursor-pointer items-center justify-center rounded-md opacity-0 transition-opacity focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 disabled:cursor-default group-focus-within/conversation:opacity-100 group-hover/conversation:opacity-100", "aria-label": `Archive ${conversation.title}`, children: _jsx(Archive, { className: "size-3.5" }) }))] }, conversation.id)));
|
|
83
|
+
}
|
|
84
|
+
function ConversationList({ conversations, currentConversationId, currentAppId, groupByScope = false, onSelect, onArchive, onArchiveGroup, disabled = false, className, }) {
|
|
79
85
|
const groups = useMemo(() => groupConversations(conversations, currentAppId), [conversations, currentAppId]);
|
|
80
86
|
const [collapsedGroups, setCollapsedGroups] = useState(() => new Set());
|
|
81
87
|
const [expandedGroups, setExpandedGroups] = useState(() => new Set());
|
|
82
88
|
const [groupPendingArchive, setGroupPendingArchive] = useState(null);
|
|
83
89
|
const listIdPrefix = useId();
|
|
90
|
+
const flatConversations = useMemo(() => [...conversations].sort((a, b) => b.updatedAt.localeCompare(a.updatedAt)), [conversations]);
|
|
91
|
+
if (!groupByScope) {
|
|
92
|
+
return (_jsx("nav", { "aria-label": "Conversations", className: className, children: _jsx("ul", { className: "space-y-0.5", children: _jsx(ConversationRows, { conversations: flatConversations, currentConversationId: currentConversationId, onSelect: onSelect, onArchive: onArchive, disabled: disabled }) }) }));
|
|
93
|
+
}
|
|
84
94
|
return (_jsxs("nav", { "aria-label": "Conversations", className: cn('space-y-1', className), children: [groups.map((group) => {
|
|
85
95
|
const isCollapsed = collapsedGroups.has(group.id);
|
|
86
96
|
const isShowingAll = expandedGroups.has(group.id);
|
|
@@ -96,19 +106,14 @@ function ConversationList({ conversations, currentConversationId, currentAppId,
|
|
|
96
106
|
else
|
|
97
107
|
next.add(group.id);
|
|
98
108
|
return next;
|
|
99
|
-
}), className: "text-foreground hover:bg-accent/60
|
|
100
|
-
? 'page'
|
|
101
|
-
: undefined, className: "rounded-container text-ui-body min-w-0 flex-1 cursor-pointer truncate py-1.5 pl-3 pr-8 text-left disabled:cursor-default", children: conversation.title }), conversation.isActive && (_jsx(LoaderCircle, { className: "text-muted-foreground absolute right-2 size-3.5 animate-spin", "aria-label": "Conversation is working" })), onArchive && !conversation.isActive && (_jsx("button", { type: "button", onClick: (event) => {
|
|
102
|
-
event.stopPropagation();
|
|
103
|
-
onArchive(conversation.id);
|
|
104
|
-
}, disabled: disabled, className: "text-muted-foreground hover:text-foreground focus-visible:ring-ring rounded-control absolute right-1 flex size-7 cursor-pointer items-center justify-center opacity-0 transition-opacity focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 disabled:cursor-default group-focus-within/conversation:opacity-100 group-hover/conversation:opacity-100", "aria-label": `Archive ${conversation.title}`, children: _jsx(Archive, { className: "size-3.5" }) }))] }, conversation.id))), hasMoreConversations && (_jsx("li", { children: _jsx("button", { type: "button", onClick: () => setExpandedGroups((current) => {
|
|
109
|
+
}), className: "text-foreground hover:bg-accent/60 flex h-9 min-w-0 flex-1 cursor-pointer items-center gap-2 rounded-lg px-2 pr-9 text-left text-sm font-medium transition-colors", children: [_jsx(ChevronDown, { className: cn('text-muted-foreground size-3.5 shrink-0 transition-transform', isCollapsed && '-rotate-90') }), _jsx("span", { className: "text-muted-foreground flex size-4 shrink-0 items-center justify-center", children: _jsx(AppScopeIcon, { icon: group.icon, isChats: group.id === CHATS_GROUP_ID }) }), _jsx("span", { className: "truncate", children: group.label })] }), onArchiveGroup && (_jsx("button", { type: "button", onClick: () => setGroupPendingArchive(group), className: "text-muted-foreground hover:text-foreground focus-visible:ring-ring absolute right-1 flex size-7 cursor-pointer items-center justify-center rounded-md opacity-0 transition-opacity focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 group-focus-within/conversation-scope:opacity-100 group-hover/conversation-scope:opacity-100", "aria-label": `Archive all chats in ${group.label}`, children: _jsx(Archive, { className: "size-3.5" }) }))] }), !isCollapsed && (_jsxs("ul", { id: listId, className: "ml-5 space-y-0.5 py-0.5", children: [_jsx(ConversationRows, { conversations: visibleConversations, currentConversationId: currentConversationId, onSelect: onSelect, onArchive: onArchive, disabled: disabled }), hasMoreConversations && (_jsx("li", { children: _jsx("button", { type: "button", onClick: () => setExpandedGroups((current) => {
|
|
105
110
|
const next = new Set(current);
|
|
106
111
|
if (next.has(group.id))
|
|
107
112
|
next.delete(group.id);
|
|
108
113
|
else
|
|
109
114
|
next.add(group.id);
|
|
110
115
|
return next;
|
|
111
|
-
}), className: "text-muted-foreground hover:bg-accent/60 hover:text-foreground
|
|
116
|
+
}), className: "text-muted-foreground hover:bg-accent/60 hover:text-foreground flex h-7 w-full cursor-pointer items-center rounded-lg px-3 text-left text-xs transition-colors", "aria-label": `${isShowingAll ? 'Show fewer' : 'Show all'} ${group.label} conversations`, children: isShowingAll ? 'Show less' : 'Show all' }) }))] }))] }, group.id));
|
|
112
117
|
}), _jsx(AlertDialog, { open: groupPendingArchive !== null, onOpenChange: (open) => {
|
|
113
118
|
if (!open)
|
|
114
119
|
setGroupPendingArchive(null);
|
|
@@ -119,7 +124,7 @@ function ConversationList({ conversations, currentConversationId, currentAppId,
|
|
|
119
124
|
setGroupPendingArchive(null);
|
|
120
125
|
}, children: "Archive all" })] })] }) })] }));
|
|
121
126
|
}
|
|
122
|
-
export function ConversationSidebar({ conversations, currentConversationId, currentAppId, onSelect, onArchive, onArchiveGroup, onNewChat, newChatDisabled = false, hideScrollbar = false, hasMoreConversations = false, isLoadingMoreConversations = false, onLoadMoreConversations, disabled = false, className, }) {
|
|
127
|
+
export function ConversationSidebar({ conversations, currentConversationId, currentAppId, groupByScope = false, onSelect, onArchive, onArchiveGroup, onNewChat, newChatDisabled = false, hideScrollbar = false, hasMoreConversations = false, isLoadingMoreConversations = false, onLoadMoreConversations, disabled = false, className, }) {
|
|
123
128
|
const scrollContainerRef = useRef(null);
|
|
124
129
|
const [scrollFadeEdges, setScrollFadeEdges] = useState({
|
|
125
130
|
top: false,
|
|
@@ -172,16 +177,16 @@ export function ConversationSidebar({ conversations, currentConversationId, curr
|
|
|
172
177
|
'[scrollbar-width:none] [&::-webkit-scrollbar]:hidden'), "data-conversation-scroll-fade": true, "data-scroll-fade-top": scrollFadeEdges.top || undefined, "data-scroll-fade-bottom": scrollFadeEdges.bottom || undefined, onScroll: (event) => handleScroll(event.currentTarget), style: {
|
|
173
178
|
maskImage: scrollMask,
|
|
174
179
|
WebkitMaskImage: scrollMask,
|
|
175
|
-
}, children: [_jsx(ConversationList, { conversations: conversations, currentConversationId: currentConversationId, currentAppId: currentAppId, onSelect: onSelect, onArchive: onArchive, onArchiveGroup: hasMoreConversations ? undefined : onArchiveGroup, disabled: disabled }), hasMoreConversations && (_jsxs(Button, { type: "button", variant: "ghost", size: "sm", disabled: isLoadingMoreConversations, onClick: () => void onLoadMoreConversations?.(), className: "text-muted-foreground mt-1 w-full cursor-pointer", children: [isLoadingMoreConversations && (_jsx(LoaderCircle, { className: "size-3.5 animate-spin" })), "Load older conversations"] }))] })] }));
|
|
180
|
+
}, children: [_jsx(ConversationList, { conversations: conversations, currentConversationId: currentConversationId, currentAppId: currentAppId, groupByScope: groupByScope, onSelect: onSelect, onArchive: onArchive, onArchiveGroup: hasMoreConversations ? undefined : onArchiveGroup, disabled: disabled }), hasMoreConversations && (_jsxs(Button, { type: "button", variant: "ghost", size: "sm", disabled: isLoadingMoreConversations, onClick: () => void onLoadMoreConversations?.(), className: "text-muted-foreground mt-1 w-full cursor-pointer", children: [isLoadingMoreConversations && (_jsx(LoaderCircle, { className: "size-3.5 animate-spin" })), "Load older conversations"] }))] })] }));
|
|
176
181
|
}
|
|
177
|
-
export function ConversationHistory({ conversations, currentConversationId, currentAppId, onSelect, onArchive, onArchiveGroup, onNewChat, newChatDisabled = false, disabled = false, className, dropdownAlign = 'start', dropdownSide = 'bottom', tooltipSide = 'bottom', hasMoreConversations = false, isLoadingMoreConversations = false, onLoadMoreConversations, }) {
|
|
182
|
+
export function ConversationHistory({ conversations, currentConversationId, currentAppId, groupByScope = false, onSelect, onArchive, onArchiveGroup, onNewChat, newChatDisabled = false, disabled = false, className, dropdownAlign = 'start', dropdownSide = 'bottom', tooltipSide = 'bottom', hasMoreConversations = false, isLoadingMoreConversations = false, onLoadMoreConversations, }) {
|
|
178
183
|
const [isOpen, setIsOpen] = useState(false);
|
|
179
184
|
if (conversations.length === 0 && !onNewChat)
|
|
180
185
|
return null;
|
|
181
186
|
return (_jsx(TooltipProvider, { children: _jsxs(Popover, { open: isOpen, onOpenChange: setIsOpen, children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(PopoverTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon-sm", disabled: disabled, className: cn('text-muted-foreground hover:text-foreground cursor-pointer', className), "aria-label": "Conversations", children: _jsx(MessageCircle, { className: "size-4" }) }) }) }), _jsx(TooltipContent, { side: tooltipSide, children: "Conversations" })] }), _jsxs(PopoverContent, { align: dropdownAlign, side: dropdownSide, className: "w-72 p-2", children: [onNewChat && (_jsxs(Button, { type: "button", variant: "ghost", onClick: () => {
|
|
182
187
|
onNewChat();
|
|
183
188
|
setIsOpen(false);
|
|
184
|
-
}, disabled: newChatDisabled, title: "New conversation (Cmd+Shift+O)", className: "mb-1 flex w-full cursor-pointer items-center justify-start gap-2", children: [_jsx(Plus, { className: "size-4" }), _jsx("span", { children: "New conversation" }), _jsx("span", { className: "text-muted-foreground
|
|
189
|
+
}, disabled: newChatDisabled, title: "New conversation (Cmd+Shift+O)", className: "mb-1 flex w-full cursor-pointer items-center justify-start gap-2 rounded-lg text-sm [&_[data-slot=button-content]]:w-full", children: [_jsx(Plus, { className: "size-4" }), _jsx("span", { children: "New conversation" }), _jsx("span", { className: "text-muted-foreground ml-auto text-xs", children: "\u2318\u21E7O" })] })), _jsxs("div", { className: "max-h-80 overflow-y-auto", onScroll: (event) => {
|
|
185
190
|
const element = event.currentTarget;
|
|
186
191
|
if (hasMoreConversations &&
|
|
187
192
|
!isLoadingMoreConversations &&
|
|
@@ -191,7 +196,7 @@ export function ConversationHistory({ conversations, currentConversationId, curr
|
|
|
191
196
|
120) {
|
|
192
197
|
void onLoadMoreConversations?.();
|
|
193
198
|
}
|
|
194
|
-
}, children: [_jsx(ConversationList, { conversations: conversations, currentConversationId: currentConversationId, currentAppId: currentAppId, onSelect: (id) => {
|
|
199
|
+
}, children: [_jsx(ConversationList, { conversations: conversations, currentConversationId: currentConversationId, currentAppId: currentAppId, groupByScope: groupByScope, onSelect: (id) => {
|
|
195
200
|
onSelect(id);
|
|
196
201
|
setIsOpen(false);
|
|
197
202
|
}, onArchive: onArchive, onArchiveGroup: hasMoreConversations ? undefined : onArchiveGroup, disabled: disabled }), hasMoreConversations && (_jsxs(Button, { type: "button", variant: "ghost", size: "sm", disabled: isLoadingMoreConversations, onClick: () => void onLoadMoreConversations?.(), className: "text-muted-foreground mt-1 w-full cursor-pointer", children: [isLoadingMoreConversations && (_jsx(LoaderCircle, { className: "size-3.5 animate-spin" })), "Load older conversations"] }))] })] })] }) }));
|
|
@@ -3,7 +3,7 @@ import { type IconButtonProps } from './icon-button.js';
|
|
|
3
3
|
import { type VariantProps } from 'class-variance-authority';
|
|
4
4
|
declare const alertVariants: (props?: ({
|
|
5
5
|
tone?: "neutral" | "info" | "success" | "warning" | "danger" | null | undefined;
|
|
6
|
-
density?: "
|
|
6
|
+
density?: "default" | "compact" | null | undefined;
|
|
7
7
|
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
8
8
|
type AlertTone = NonNullable<VariantProps<typeof alertVariants>['tone']>;
|
|
9
9
|
type AlertDensity = NonNullable<VariantProps<typeof alertVariants>['density']>;
|
|
@@ -2,8 +2,8 @@ import * as React from 'react';
|
|
|
2
2
|
import type { ControlSize } from '../../tokens/contracts.js';
|
|
3
3
|
import { type VariantProps } from 'class-variance-authority';
|
|
4
4
|
declare const buttonVariants: (props?: ({
|
|
5
|
-
variant?: "link" | "toolbar" | "
|
|
6
|
-
size?: "small" | "
|
|
5
|
+
variant?: "link" | "toolbar" | "outline" | "default" | "prominent" | "bordered" | "borderless" | "tinted" | "destructive" | "destructive-tinted" | "secondary" | "ghost" | null | undefined;
|
|
6
|
+
size?: "small" | "sm" | "default" | "lg" | "xs" | "xl" | "mini" | "medium" | "large" | "icon" | "icon-xs" | "icon-sm" | "icon-lg" | "icon-xl" | null | undefined;
|
|
7
7
|
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
8
8
|
type ButtonProps = React.ComponentProps<'button'> & VariantProps<typeof buttonVariants> & {
|
|
9
9
|
asChild?: boolean;
|
|
@@ -10,7 +10,7 @@ const buttonVariants = cva("relative inline-flex shrink-0 cursor-pointer items-c
|
|
|
10
10
|
default: 'bg-[var(--m-ui-button-prominent-fill)] text-[var(--m-ui-button-prominent-label)] active:bg-[var(--m-ui-button-prominent-fill-pressed)] disabled:bg-[var(--m-ui-button-prominent-fill-disabled)] disabled:!text-[var(--m-ui-button-prominent-label-disabled)]',
|
|
11
11
|
prominent: 'bg-[var(--m-ui-button-prominent-fill)] text-[var(--m-ui-button-prominent-label)] active:bg-[var(--m-ui-button-prominent-fill-pressed)] disabled:bg-[var(--m-ui-button-prominent-fill-disabled)] disabled:!text-[var(--m-ui-button-prominent-label-disabled)]',
|
|
12
12
|
bordered: 'bg-[var(--m-ui-button-bordered-fill)] text-[var(--m-ui-button-bordered-label)] active:bg-[var(--m-ui-button-bordered-fill-pressed)] disabled:bg-[var(--m-ui-button-bordered-fill-disabled)] disabled:!text-[var(--m-ui-button-bordered-label-disabled)]',
|
|
13
|
-
borderless: 'bg-transparent text-
|
|
13
|
+
borderless: 'bg-transparent text-foreground hover:text-foreground/80 active:text-foreground/60 disabled:!text-muted-foreground',
|
|
14
14
|
tinted: 'bg-[var(--m-ui-button-tinted-fill)] text-[var(--m-ui-button-tinted-label)] active:bg-[var(--m-ui-button-tinted-fill-pressed)] disabled:bg-[var(--m-ui-button-tinted-fill-disabled)] disabled:!text-[var(--m-ui-button-tinted-label-disabled)]',
|
|
15
15
|
toolbar: 'rounded-pill border-[var(--toolbar-control-border)] bg-[var(--toolbar-control-background)] text-foreground shadow-[var(--toolbar-control-shadow)] border hover:bg-[var(--toolbar-control-hover)] active:bg-[var(--toolbar-control-pressed)]',
|
|
16
16
|
destructive: 'bg-[var(--m-ui-button-destructive-fill)] text-[var(--m-ui-button-destructive-label)] active:bg-[var(--m-ui-button-destructive-fill-pressed)] disabled:bg-[var(--m-ui-button-destructive-fill-disabled)] disabled:!text-[var(--m-ui-button-destructive-label-disabled)]',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-menu.d.ts","sourceRoot":"","sources":["../../../src/components/ui/context-menu.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,oBAAoB,MAAM,8BAA8B,CAAA;AAEpE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAmB3D,KAAK,gBAAgB,GAAG,KAAK,CAAC,cAAc,CAC1C,OAAO,oBAAoB,CAAC,IAAI,CACjC,GAAG;IACF,KAAK,CAAC,EAAE,SAAS,EAAE,CAAA;IACnB,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;CACpC,CAAA;
|
|
1
|
+
{"version":3,"file":"context-menu.d.ts","sourceRoot":"","sources":["../../../src/components/ui/context-menu.tsx"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import * as React from 'react';
|
|
|
2
2
|
import { type VariantProps } from 'class-variance-authority';
|
|
3
3
|
declare const dateFieldVariants: (props?: ({
|
|
4
4
|
variant?: "default" | "filled" | null | undefined;
|
|
5
|
-
density?: "
|
|
5
|
+
density?: "default" | "compact" | "comfortable" | null | undefined;
|
|
6
6
|
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
7
7
|
interface DateFieldProps extends Omit<React.ComponentProps<'input'>, 'defaultValue' | 'size' | 'type' | 'value'>, VariantProps<typeof dateFieldVariants> {
|
|
8
8
|
/** ISO calendar date in YYYY-MM-DD form. No timezone conversion is applied. */
|
|
@@ -3,6 +3,7 @@ import * as React from 'react';
|
|
|
3
3
|
import type { MenuItems } from '../../lib/host-native-menu.js';
|
|
4
4
|
type DropdownMenuProps = React.ComponentProps<typeof DropdownMenuPrimitive.Root> & {
|
|
5
5
|
items?: MenuItems[];
|
|
6
|
+
nativeMenu?: boolean;
|
|
6
7
|
onSelectItem?: (id: string) => void;
|
|
7
8
|
};
|
|
8
9
|
declare function DropdownMenu(props: DropdownMenuProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dropdown-menu.d.ts","sourceRoot":"","sources":["../../../src/components/ui/dropdown-menu.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,qBAAqB,MAAM,+BAA+B,CAAA;AAEtE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAgB3D,KAAK,iBAAiB,GAAG,KAAK,CAAC,cAAc,CAC3C,OAAO,qBAAqB,CAAC,IAAI,CAClC,GAAG;IACF,KAAK,CAAC,EAAE,SAAS,EAAE,CAAA;IACnB,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;CACpC,CAAA;
|
|
1
|
+
{"version":3,"file":"dropdown-menu.d.ts","sourceRoot":"","sources":["../../../src/components/ui/dropdown-menu.tsx"],"names":[],"mappings":"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"}
|
|
@@ -6,10 +6,11 @@ import * as React from 'react';
|
|
|
6
6
|
import { cn } from '../../lib/utils.js';
|
|
7
7
|
import { MenuItemContents, hasMenuContentChild, useDeclarativeMenuState, withoutMenuContentChild, } from './menu-items.js';
|
|
8
8
|
const DropdownMenuItemsContext = React.createContext(null);
|
|
9
|
-
function DeclarativeDropdownMenu({ items, onSelectItem, children, open, defaultOpen, onOpenChange, ...props }) {
|
|
9
|
+
function DeclarativeDropdownMenu({ items, onSelectItem, children, nativeMenu = false, open, defaultOpen, onOpenChange, ...props }) {
|
|
10
10
|
const hasContent = hasMenuContentChild(children, DropdownMenuContent);
|
|
11
11
|
const menu = useDeclarativeMenuState({
|
|
12
12
|
items,
|
|
13
|
+
nativeMenu,
|
|
13
14
|
onSelectItem,
|
|
14
15
|
open,
|
|
15
16
|
defaultOpen,
|
|
@@ -30,7 +31,7 @@ function DropdownMenu(props) {
|
|
|
30
31
|
if (props.items) {
|
|
31
32
|
return _jsx(DeclarativeDropdownMenu, { ...props, items: props.items });
|
|
32
33
|
}
|
|
33
|
-
const { items: _items, onSelectItem: _onSelectItem, ...rootProps } = props;
|
|
34
|
+
const { items: _items, nativeMenu: _nativeMenu, onSelectItem: _onSelectItem, ...rootProps } = props;
|
|
34
35
|
return _jsx(DropdownMenuPrimitive.Root, { "data-slot": "dropdown-menu", ...rootProps });
|
|
35
36
|
}
|
|
36
37
|
function DropdownMenuPortal({ ...props }) {
|
|
@@ -5,7 +5,7 @@ declare const materialVariants: (props?: ({
|
|
|
5
5
|
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
6
6
|
export type MaterialVariant = 'regular' | 'clear' | 'ultra-thick' | 'thick' | 'medium' | 'thin' | 'ultra-thin';
|
|
7
7
|
export type MaterialShape = NonNullable<VariantProps<typeof materialVariants>['shape']>;
|
|
8
|
-
export type MaterialElevation = 'none' | 'panel' | 'overlay';
|
|
8
|
+
export type MaterialElevation = 'none' | 'control' | 'panel' | 'overlay';
|
|
9
9
|
export interface MaterialProps extends React.ComponentPropsWithoutRef<'div'>, VariantProps<typeof materialVariants> {
|
|
10
10
|
/**
|
|
11
11
|
* `regular` aliases the medium standard material and `clear` aliases the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"material.d.ts","sourceRoot":"","sources":["../../../src/components/ui/material.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,KAAK,YAAY,EAAO,MAAM,0BAA0B,CAAA;AAEjE,QAAA,MAAM,gBAAgB;;8EAWpB,CAAA;AAEF,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,OAAO,GACP,aAAa,GACb,OAAO,GACP,QAAQ,GACR,MAAM,GACN,YAAY,CAAA;AAChB,MAAM,MAAM,aAAa,GAAG,WAAW,CACrC,YAAY,CAAC,OAAO,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAC/C,CAAA;AACD,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"material.d.ts","sourceRoot":"","sources":["../../../src/components/ui/material.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,KAAK,YAAY,EAAO,MAAM,0BAA0B,CAAA;AAEjE,QAAA,MAAM,gBAAgB;;8EAWpB,CAAA;AAEF,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,OAAO,GACP,aAAa,GACb,OAAO,GACP,QAAQ,GACR,MAAM,GACN,YAAY,CAAA;AAChB,MAAM,MAAM,aAAa,GAAG,WAAW,CACrC,YAAY,CAAC,OAAO,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAC/C,CAAA;AACD,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAA;AAExE,MAAM,WAAW,aACf,SAAQ,KAAK,CAAC,wBAAwB,CAAC,KAAK,CAAC,EAC3C,YAAY,CAAC,OAAO,gBAAgB,CAAC;IACvC;;;;OAIG;IACH,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB;;;OAGG;IACH,SAAS,CAAC,EAAE,iBAAiB,CAAA;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,iBAAS,QAAQ,CAAC,EAChB,OAAe,EACf,SAAS,EACT,SAAkB,EAClB,WAAmB,EACnB,KAAK,EACL,OAAmB,EACnB,GAAG,KAAK,EACT,EAAE,aAAa,2CAcf;AAED,QAAA,MAAM,oBAAoB;;;;CAIhB,CAAA;AAEV,MAAM,WAAW,kBACf,SAAQ,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,aAAa,CAAC;IACtD,OAAO,CAAC,EAAE,MAAM,OAAO,oBAAoB,CAAA;CAC5C;AAED;;;GAGG;AACH,iBAAS,aAAa,CAAC,EACrB,SAAS,EACT,OAAmB,EACnB,GAAG,KAAK,EACT,EAAE,kBAAkB,2CAYpB;AAED,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,gBAAgB,EAAE,CAAA"}
|
|
@@ -2,6 +2,7 @@ import * as React from 'react';
|
|
|
2
2
|
import { type HostNativeMenuOptions, type MenuItems } from '../../lib/host-native-menu.js';
|
|
3
3
|
interface DeclarativeMenuStateOptions {
|
|
4
4
|
items?: MenuItems[];
|
|
5
|
+
nativeMenu: boolean;
|
|
5
6
|
onSelectItem?: (id: string) => void;
|
|
6
7
|
open?: boolean;
|
|
7
8
|
defaultOpen?: boolean;
|
|
@@ -14,7 +15,7 @@ interface DeclarativeMenuState {
|
|
|
14
15
|
onPortableOpenChange: (open: boolean) => void;
|
|
15
16
|
requestNativeMenu: (options: HostNativeMenuOptions) => boolean;
|
|
16
17
|
}
|
|
17
|
-
export declare function useDeclarativeMenuState({ items, onSelectItem, open, defaultOpen, onOpenChange, onFallback, }: DeclarativeMenuStateOptions): DeclarativeMenuState;
|
|
18
|
+
export declare function useDeclarativeMenuState({ items, nativeMenu, onSelectItem, open, defaultOpen, onOpenChange, onFallback, }: DeclarativeMenuStateOptions): DeclarativeMenuState;
|
|
18
19
|
export declare function formatMenuShortcut(shortcut: MenuItems['shortcut']): string | null;
|
|
19
20
|
export declare function MenuItemContents({ item, shortcutSlot, }: {
|
|
20
21
|
item: Exclude<MenuItems, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu-items.d.ts","sourceRoot":"","sources":["../../../src/components/ui/menu-items.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,SAAS,EAGf,MAAM,4BAA4B,CAAA;AAUnC,UAAU,2BAA2B;IACnC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAA;IACnB,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC,UAAU,CAAC,EAAE,MAAM,IAAI,CAAA;CACxB;AAED,UAAU,oBAAoB;IAC5B,UAAU,EAAE,OAAO,CAAA;IACnB,YAAY,EAAE,OAAO,GAAG,SAAS,CAAA;IACjC,oBAAoB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IAC7C,iBAAiB,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,OAAO,CAAA;CAC/D;AAED,wBAAgB,uBAAuB,CAAC,EACtC,KAAK,EACL,YAAY,EACZ,IAAI,EACJ,WAAW,EACX,YAAY,EACZ,UAAU,GACX,EAAE,2BAA2B,GAAG,oBAAoB,
|
|
1
|
+
{"version":3,"file":"menu-items.d.ts","sourceRoot":"","sources":["../../../src/components/ui/menu-items.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,SAAS,EAGf,MAAM,4BAA4B,CAAA;AAUnC,UAAU,2BAA2B;IACnC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAA;IACnB,UAAU,EAAE,OAAO,CAAA;IACnB,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC,UAAU,CAAC,EAAE,MAAM,IAAI,CAAA;CACxB;AAED,UAAU,oBAAoB;IAC5B,UAAU,EAAE,OAAO,CAAA;IACnB,YAAY,EAAE,OAAO,GAAG,SAAS,CAAA;IACjC,oBAAoB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IAC7C,iBAAiB,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,OAAO,CAAA;CAC/D;AAED,wBAAgB,uBAAuB,CAAC,EACtC,KAAK,EACL,UAAU,EACV,YAAY,EACZ,IAAI,EACJ,WAAW,EACX,YAAY,EACZ,UAAU,GACX,EAAE,2BAA2B,GAAG,oBAAoB,CAsEpD;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC,GAC9B,MAAM,GAAG,IAAI,CAQf;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,YAAY,GACb,EAAE;IACD,IAAI,EAAE,OAAO,CAAC,SAAS,EAAE;QAAE,IAAI,EAAE,WAAW,CAAA;KAAE,CAAC,CAAA;IAC/C,YAAY,EAAE,MAAM,CAAA;CACrB,2CAiBA;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,KAAK,CAAC,SAAS,EACzB,WAAW,EAAE,KAAK,CAAC,WAAW,GAC7B,OAAO,CAUT;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,KAAK,CAAC,SAAS,EACzB,WAAW,EAAE,KAAK,CAAC,WAAW,GAC7B,KAAK,CAAC,SAAS,CAajB"}
|
|
@@ -9,7 +9,7 @@ const SHORTCUT_MODIFIER_LABELS = {
|
|
|
9
9
|
alt: '⌥',
|
|
10
10
|
ctrl: '⌃',
|
|
11
11
|
};
|
|
12
|
-
export function useDeclarativeMenuState({ items, onSelectItem, open, defaultOpen, onOpenChange, onFallback, }) {
|
|
12
|
+
export function useDeclarativeMenuState({ items, nativeMenu, onSelectItem, open, defaultOpen, onOpenChange, onFallback, }) {
|
|
13
13
|
const { available: nativeAvailable, open: openNativeMenu } = useHostNativeMenu();
|
|
14
14
|
const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen ?? false);
|
|
15
15
|
const [nativeOpen, setNativeOpen] = React.useState(false);
|
|
@@ -20,7 +20,7 @@ export function useDeclarativeMenuState({ items, onSelectItem, open, defaultOpen
|
|
|
20
20
|
onOpenChange?.(nextOpen);
|
|
21
21
|
}, [onOpenChange, open]);
|
|
22
22
|
const requestNativeMenu = React.useCallback((options) => {
|
|
23
|
-
if (!items || !nativeAvailable)
|
|
23
|
+
if (!nativeMenu || !items || !nativeAvailable)
|
|
24
24
|
return false;
|
|
25
25
|
if (nativeOpenRef.current)
|
|
26
26
|
return true;
|
|
@@ -56,6 +56,7 @@ export function useDeclarativeMenuState({ items, onSelectItem, open, defaultOpen
|
|
|
56
56
|
return true;
|
|
57
57
|
}, [
|
|
58
58
|
items,
|
|
59
|
+
nativeMenu,
|
|
59
60
|
nativeAvailable,
|
|
60
61
|
onOpenChange,
|
|
61
62
|
onFallback,
|
|
@@ -66,22 +66,21 @@ export declare class MessageScrollerController {
|
|
|
66
66
|
private readonly messageElements;
|
|
67
67
|
private readonly handledTurnAnchors;
|
|
68
68
|
private readonly visibleMessageIds;
|
|
69
|
-
private readonly warmedItems;
|
|
70
69
|
private lastScrollTop;
|
|
71
|
-
private
|
|
70
|
+
private previousItems;
|
|
72
71
|
private previousItemCount;
|
|
73
72
|
private anchoredElement;
|
|
74
73
|
private trackedFirstVisible;
|
|
75
74
|
private readingLeaves;
|
|
76
75
|
private pendingScrollToMessage;
|
|
76
|
+
private pendingHistoryLoad;
|
|
77
77
|
private defaultPositionApplied;
|
|
78
78
|
private spacerHeight;
|
|
79
79
|
private spacerGap;
|
|
80
80
|
private programmaticDeadline;
|
|
81
81
|
private stateFrame;
|
|
82
82
|
private visibilityFrame;
|
|
83
|
-
private
|
|
84
|
-
private warmupUsesIdleCallback;
|
|
83
|
+
private historyLoadFrame;
|
|
85
84
|
private intersectionObserver;
|
|
86
85
|
constructor(options: MessageScrollerControllerOptions);
|
|
87
86
|
get viewportElement(): HTMLElement | null;
|
|
@@ -96,14 +95,22 @@ export declare class MessageScrollerController {
|
|
|
96
95
|
scrollToElement(element: HTMLElement, options?: MessageScrollerScrollOptions, { keepPreviousPeek }?: {
|
|
97
96
|
keepPreviousPeek?: boolean;
|
|
98
97
|
}): boolean;
|
|
98
|
+
/**
|
|
99
|
+
* Capture history position before an asynchronous older-page request.
|
|
100
|
+
* Distance from the bottom remains invariant when rows are inserted above
|
|
101
|
+
* the reader and is also safe when stale history is replaced by a shorter
|
|
102
|
+
* authoritative page.
|
|
103
|
+
*/
|
|
104
|
+
beginHistoryLoad: () => void;
|
|
105
|
+
finishHistoryLoad: (changed: boolean) => void;
|
|
99
106
|
handleScroll(): void;
|
|
100
107
|
handleWheel(deltaY: number): void;
|
|
101
108
|
handleTouchMove(): void;
|
|
102
109
|
handleScrollKey(): void;
|
|
103
110
|
/**
|
|
104
111
|
* Content box resized (streaming growth, images decoding, disclosures
|
|
105
|
-
* collapsing
|
|
106
|
-
*
|
|
112
|
+
* collapsing). Which way the viewport moves — if at all — is entirely the
|
|
113
|
+
* policy's call.
|
|
107
114
|
*/
|
|
108
115
|
handleResize(): void;
|
|
109
116
|
/** Children of the content element changed. Runs before the next paint. */
|
|
@@ -130,6 +137,8 @@ export declare class MessageScrollerController {
|
|
|
130
137
|
*/
|
|
131
138
|
private snapshotReadingLeaves;
|
|
132
139
|
private restoreReadingPosition;
|
|
140
|
+
private restorePendingHistoryLoad;
|
|
141
|
+
private firstVisibleItem;
|
|
133
142
|
private trackFirstVisibleItem;
|
|
134
143
|
private scheduleStateCommit;
|
|
135
144
|
/**
|
|
@@ -143,17 +152,6 @@ export declare class MessageScrollerController {
|
|
|
143
152
|
private applyStateAttributes;
|
|
144
153
|
private scheduleVisibilitySync;
|
|
145
154
|
private computeVisibility;
|
|
146
|
-
/**
|
|
147
|
-
* Rows outside the viewport skip rendering via `content-visibility: auto`
|
|
148
|
-
* and a placeholder intrinsic size. Their first reveal during an upward
|
|
149
|
-
* scroll pays first-time layout of complex markdown — felt as hitches on
|
|
150
|
-
* the first pass through history. Rendering each row once at idle records
|
|
151
|
-
* its real size (the `auto` keyword keeps last-remembered sizes), so the
|
|
152
|
-
* first real scroll finds everything measured and warm.
|
|
153
|
-
*/
|
|
154
|
-
private scheduleWarmup;
|
|
155
|
-
private warmupBatch;
|
|
156
|
-
private cancelWarmup;
|
|
157
155
|
private flushPendingScrollToMessage;
|
|
158
156
|
private setSpacerHeight;
|
|
159
157
|
private itemChildren;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-scroller-controller.d.ts","sourceRoot":"","sources":["../../../src/components/ui/message-scroller-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAEjE,MAAM,MAAM,oCAAoC,GAC5C,OAAO,GACP,KAAK,GACL,aAAa,CAAA;AACjB,MAAM,MAAM,0BAA0B,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAA;AAE/E,MAAM,MAAM,4BAA4B,GAAG;IACzC,KAAK,CAAC,EAAE,0BAA0B,CAAA;IAClC,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,CAAA;AAExE,MAAM,MAAM,8BAA8B,GAAG;IAC3C,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,iBAAiB,EAAE,MAAM,EAAE,CAAA;CAC5B,CAAA;AAED,MAAM,WAAW,gCAAgC;IAC/C,UAAU,EAAE,OAAO,CAAA;IACnB,qBAAqB,EAAE,oCAAoC,CAAA;IAC3D,mBAAmB,EAAE,MAAM,CAAA;IAC3B,sBAAsB,EAAE,MAAM,CAAA;IAC9B,YAAY,EAAE,MAAM,CAAA;CACrB;
|
|
1
|
+
{"version":3,"file":"message-scroller-controller.d.ts","sourceRoot":"","sources":["../../../src/components/ui/message-scroller-controller.ts"],"names":[],"mappings":"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"}
|