@tutti-os/ui-rich-text 0.0.35 → 0.0.37
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 +5 -0
- package/dist/at-panel/index.css +4 -0
- package/dist/at-panel/index.css.map +1 -1
- package/dist/at-panel/index.js +2 -2
- package/dist/at-panel/index.js.map +1 -1
- package/dist/at-panel/model.d.ts +1 -1
- package/dist/at-panel/model.js +1 -1
- package/dist/{chunk-DWBETNOQ.js → chunk-HMAUQU6Q.js} +7 -1
- package/dist/{chunk-DWBETNOQ.js.map → chunk-HMAUQU6Q.js.map} +1 -1
- package/dist/editor/index.d.ts +8 -2
- package/dist/editor/index.js +172 -33
- package/dist/editor/index.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/at-panel/MentionPalette.tsx","../../src/at-panel/mentionPaletteScrollbar.tsx","../../src/at-panel/mentionPaletteStateAdapter.ts","../../src/at-panel/MentionPaletteFromState.tsx","../../src/at-panel/MentionPaletteControls.tsx","../../src/at-panel/MentionRow.tsx","../../src/at-panel/mentionRowDataAttributes.ts","../../src/at-panel/mentionReferenceIcon.ts","../../src/at-panel/mentionTriggerRowItem.ts","../../src/at-panel/useAtPanelKeyboard.ts"],"sourcesContent":["import {\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type JSX,\n type MutableRefObject,\n type ReactNode\n} from \"react\";\nimport {\n FolderFailedFilledIcon,\n KeyboardFilledIcon\n} from \"@tutti-os/ui-system/icons\";\nimport { UnderlineTabs } from \"@tutti-os/ui-system/components\";\nimport { cn } from \"@tutti-os/ui-system/utils\";\nimport { flattenMentionPaletteEntries } from \"./mentionPaletteEntries.ts\";\nimport { MentionPaletteScrollbar } from \"./mentionPaletteScrollbar.tsx\";\nimport type {\n MentionPaletteGroup,\n MentionPaletteProps,\n MentionPaletteState,\n MentionPaletteTheme\n} from \"./mentionPaletteTypes.ts\";\nimport \"./mentionPalette.css\";\n\nconst DEFAULT_THEME = {\n classNames: {\n palette: \"rich-text-at-mention-palette\",\n header: \"rich-text-at-mention-palette-header\",\n footer: \"rich-text-at-mention-palette-footer\",\n tabs: \"rich-text-at-mention-palette-tabs\",\n scrollRegion: \"rich-text-at-mention-palette-scroll-region\",\n scrollbar: \"rich-text-at-mention-palette-scrollbar\",\n scrollbarThumb: \"rich-text-at-mention-palette-scrollbar-thumb\",\n hint: \"rich-text-at-mention-palette-hint\",\n hintItem: \"rich-text-at-mention-palette-hint-item\",\n hintButton: \"rich-text-at-mention-palette-hint-button\",\n hintSeparator: \"rich-text-at-mention-palette-hint-separator\",\n shortcut: \"rich-text-at-mention-palette-shortcut\",\n shortcutArrow: \"rich-text-at-mention-palette-shortcut--arrow\",\n shortcutButton: \"rich-text-at-mention-palette-shortcut-button\",\n shortcutGroup: \"rich-text-at-mention-palette-shortcut-group\"\n },\n testIds: {\n emptyState: \"rich-text-at-mention-palette-empty-state\",\n hint: \"rich-text-at-mention-palette-hint\",\n scrollbar: \"rich-text-at-mention-palette-scrollbar\",\n loadingSpinner: \"rich-text-at-mention-loading-spinner\"\n },\n groupDividerAttribute: \"data-rich-text-at-mention-group-divider\"\n} as const;\n\ninterface ResolvedMentionPaletteTheme {\n classNames: Required<NonNullable<MentionPaletteTheme[\"classNames\"]>>;\n testIds: Required<NonNullable<MentionPaletteTheme[\"testIds\"]>>;\n groupDividerAttribute: string;\n}\n\nfunction resolveMentionPaletteTheme(\n theme: MentionPaletteTheme | undefined\n): ResolvedMentionPaletteTheme {\n return {\n classNames: { ...DEFAULT_THEME.classNames, ...theme?.classNames },\n testIds: { ...DEFAULT_THEME.testIds, ...theme?.testIds },\n groupDividerAttribute:\n theme?.groupDividerAttribute ?? DEFAULT_THEME.groupDividerAttribute\n };\n}\n\nfunction mentionPaletteRootClassName(\n theme: ResolvedMentionPaletteTheme\n): string {\n return cn(\n DEFAULT_THEME.classNames.palette,\n theme.classNames.palette,\n paletteStyles.palette\n );\n}\n\nconst paletteStyles = {\n palette: \"rich-text-at-mention-palette__shell\",\n header: \"rich-text-at-mention-palette__header\",\n footer: \"rich-text-at-mention-palette__footer\",\n scrollShell: \"rich-text-at-mention-palette__scroll-shell\",\n scrollBody: \"rich-text-at-mention-palette__scroll-body\",\n groups: \"rich-text-at-mention-palette__groups\",\n group: \"rich-text-at-mention-palette__group\",\n groupDivider: \"rich-text-at-mention-palette__group-divider\",\n groupLabel: \"rich-text-at-mention-palette__group-label\",\n groupItems: \"rich-text-at-mention-palette__group-items\",\n groupEmpty: \"rich-text-at-mention-palette__group-empty\",\n rowButton: \"rich-text-at-mention-palette__row-button\",\n expandButton: \"rich-text-at-mention-palette__expand-button\",\n emptyState: \"rich-text-at-mention-palette__empty-state\",\n emptyStateInner: \"rich-text-at-mention-palette__empty-state-inner\",\n emptyStateIcon: \"rich-text-at-mention-palette__empty-state-icon\",\n emptyStateText: \"rich-text-at-mention-palette__empty-state-text\",\n loading: \"rich-text-at-mention-palette__loading\",\n loadingSpinner: \"rich-text-at-mention-palette__loading-spinner\"\n} as const;\n\nconst MENTION_PALETTE_LOADING_MIN_VISIBLE_MS = 320;\n\nexport function MentionPalette<TItem>(\n props: MentionPaletteProps<TItem>\n): JSX.Element {\n \"use memo\";\n const {\n state,\n highlightedKey,\n getItemKey,\n renderItem,\n labels,\n hintLabels,\n maxHeightPx,\n onHighlightChange,\n onSelectItem,\n onSelectCategory,\n onSelectFilter,\n onExpandGroup,\n onCycleFilter,\n onMoveSelection,\n onNavigateHierarchy,\n renderListFooter,\n loadingBanner,\n scrollHighlightedIntoViewCentered = false,\n theme: themeProp\n } = props;\n const theme = resolveMentionPaletteTheme(themeProp);\n\n const highlightedOptionRef = useRef<HTMLButtonElement | null>(null);\n const scrollBodyRef = useRef<HTMLDivElement | null>(null);\n const loadingVisibleUntilRef = useRef(0);\n const loadingHideTimerRef = useRef<ReturnType<typeof setTimeout> | null>(\n null\n );\n const [loadingIndicatorVisible, setLoadingIndicatorVisible] = useState(\n state.status === \"loading\"\n );\n\n const interactiveEntries = flattenMentionPaletteEntries(\n state,\n (item, groupId) => getItemKey(item, findGroup(state.groups, groupId))\n );\n const hasInteractiveEntries = interactiveEntries.some(\n (entry) => entry.type === \"item\" || entry.type === \"expand\"\n );\n\n const showLoadingState =\n loadingIndicatorVisible &&\n (!hasInteractiveEntries || state.mode === \"browse\");\n const showLoadingBanner =\n Boolean(loadingBanner) &&\n loadingIndicatorVisible &&\n hasInteractiveEntries &&\n state.mode === \"results\";\n\n useEffect(() => {\n const highlightedElement = highlightedOptionRef.current;\n if (!highlightedElement) {\n return;\n }\n const scrollContainer = scrollBodyRef.current;\n if (!scrollContainer || !scrollContainer.contains(highlightedElement)) {\n highlightedElement.scrollIntoView({ block: \"nearest\" });\n return;\n }\n if (scrollHighlightedIntoViewCentered) {\n centerElementInScrollContainer(scrollContainer, highlightedElement);\n return;\n }\n scrollElementIntoScrollContainerNearest(\n scrollContainer,\n highlightedElement\n );\n }, [highlightedKey, scrollHighlightedIntoViewCentered]);\n\n useEffect(() => {\n if (loadingHideTimerRef.current !== null) {\n clearTimeout(loadingHideTimerRef.current);\n loadingHideTimerRef.current = null;\n }\n\n if (state.status === \"loading\") {\n loadingVisibleUntilRef.current =\n Date.now() + MENTION_PALETTE_LOADING_MIN_VISIBLE_MS;\n setLoadingIndicatorVisible(true);\n return;\n }\n\n const remainingMs = loadingVisibleUntilRef.current - Date.now();\n if (remainingMs <= 0) {\n setLoadingIndicatorVisible(false);\n return;\n }\n\n loadingHideTimerRef.current = setTimeout(() => {\n loadingHideTimerRef.current = null;\n setLoadingIndicatorVisible(false);\n }, remainingMs);\n\n return () => {\n if (loadingHideTimerRef.current !== null) {\n clearTimeout(loadingHideTimerRef.current);\n loadingHideTimerRef.current = null;\n }\n };\n }, [state.status]);\n\n const paletteMaxHeightStyle: CSSProperties | undefined =\n maxHeightPx > 0 ? { maxHeight: `${maxHeightPx}px` } : undefined;\n\n if (state.status === \"error\") {\n return (\n <div\n className={mentionPaletteRootClassName(theme)}\n style={paletteMaxHeightStyle}\n role=\"listbox\"\n aria-label={labels.listbox ?? labels.tabHint}\n >\n <MentionPaletteEmptyState\n icon=\"folder-failed\"\n label={labels.error}\n testId={theme.testIds.emptyState}\n />\n </div>\n );\n }\n\n const isBrowse = state.mode === \"browse\";\n\n let body: ReactNode;\n if (showLoadingState) {\n body = (\n <MentionPaletteLoading\n label={labels.loading}\n spinnerTestId={theme.testIds.loadingSpinner}\n />\n );\n } else if (state.groups.length === 0) {\n body = (\n <MentionPaletteEmptyState\n icon={isBrowse ? \"keyboard\" : \"folder-failed\"}\n label={labels.empty}\n testId={theme.testIds.emptyState}\n />\n );\n } else {\n body = (\n <MentionPaletteGroups\n state={state}\n highlightedKey={highlightedKey}\n highlightedOptionRef={highlightedOptionRef}\n getItemKey={getItemKey}\n renderItem={renderItem}\n onHighlightChange={onHighlightChange}\n onSelectItem={onSelectItem}\n onExpandGroup={onExpandGroup}\n renderListFooter={renderListFooter}\n groupDividerAttribute={theme.groupDividerAttribute}\n />\n );\n }\n\n return (\n <div\n className={mentionPaletteRootClassName(theme)}\n style={paletteMaxHeightStyle}\n role=\"listbox\"\n aria-label={labels.listbox ?? labels.tabHint}\n >\n <div className={cn(theme.classNames.header, paletteStyles.header)}>\n <UnderlineTabs\n tabs={state.categories.map((category) => ({\n value: category.id,\n label: category.label\n }))}\n value={state.filter}\n onValueChange={isBrowse ? onSelectCategory : onSelectFilter}\n className={theme.classNames.tabs}\n preventMouseDownDefault\n />\n {showLoadingBanner ? loadingBanner : null}\n </div>\n <div className={paletteStyles.scrollShell}>\n <div\n ref={scrollBodyRef}\n className={cn(\n theme.classNames.scrollRegion,\n paletteStyles.scrollBody\n )}\n >\n {body}\n </div>\n <MentionPaletteScrollbar\n scrollBodyRef={scrollBodyRef}\n className={theme.classNames.scrollbar}\n thumbClassName={theme.classNames.scrollbarThumb}\n testId={theme.testIds.scrollbar}\n />\n </div>\n <div className={cn(theme.classNames.footer, paletteStyles.footer)}>\n <MentionPaletteHint\n ariaLabel={labels.tabHint}\n cycleFilterLabel={hintLabels.cycleFilter}\n moveSelectionLabel={hintLabels.moveSelection}\n navigateHierarchyLabel={hintLabels.navigateHierarchy}\n onCycleFilter={onCycleFilter}\n onMoveSelection={onMoveSelection}\n onNavigateHierarchy={onNavigateHierarchy}\n classNames={theme.classNames}\n testId={theme.testIds.hint}\n />\n </div>\n </div>\n );\n}\n\nfunction centerElementInScrollContainer(\n container: HTMLElement,\n element: HTMLElement\n): void {\n const containerRect = container.getBoundingClientRect();\n const elementRect = element.getBoundingClientRect();\n const currentScrollTop = container.scrollTop;\n const elementTop = elementRect.top - containerRect.top + currentScrollTop;\n const centeredScrollTop =\n elementTop - (container.clientHeight - elementRect.height) / 2;\n const maxScrollTop = Math.max(\n 0,\n container.scrollHeight - container.clientHeight\n );\n const nextScrollTop = Math.min(Math.max(0, centeredScrollTop), maxScrollTop);\n container.scrollTo({ top: nextScrollTop, behavior: \"auto\" });\n}\n\nfunction scrollElementIntoScrollContainerNearest(\n container: HTMLElement,\n element: HTMLElement\n): void {\n const containerRect = container.getBoundingClientRect();\n const elementRect = element.getBoundingClientRect();\n let nextScrollTop = container.scrollTop;\n\n if (elementRect.top < containerRect.top) {\n nextScrollTop -= containerRect.top - elementRect.top;\n } else if (elementRect.bottom > containerRect.bottom) {\n nextScrollTop += elementRect.bottom - containerRect.bottom;\n } else {\n return;\n }\n\n const maxScrollTop = Math.max(\n 0,\n container.scrollHeight - container.clientHeight\n );\n container.scrollTo({\n top: Math.min(Math.max(0, nextScrollTop), maxScrollTop),\n behavior: \"auto\"\n });\n}\n\nfunction findGroup<TItem>(\n groups: MentionPaletteState<TItem>[\"groups\"],\n groupId: string\n): MentionPaletteGroup<TItem> {\n const group = groups.find((candidate) => candidate.id === groupId);\n if (!group) {\n throw new Error(`MentionPalette: unknown group id \"${groupId}\"`);\n }\n return group;\n}\n\nfunction MentionPaletteGroups<TItem>({\n state,\n highlightedKey,\n highlightedOptionRef,\n getItemKey,\n renderItem,\n onHighlightChange,\n onSelectItem,\n onExpandGroup,\n renderListFooter,\n groupDividerAttribute\n}: {\n state: MentionPaletteState<TItem>;\n highlightedKey: string | null;\n highlightedOptionRef: MutableRefObject<HTMLButtonElement | null>;\n getItemKey: (item: TItem, group: MentionPaletteGroup<TItem>) => string;\n renderItem: (item: TItem, ctx: { active: boolean }) => ReactNode;\n onHighlightChange: (key: string) => void;\n onSelectItem: (item: TItem, group: MentionPaletteGroup<TItem>) => void;\n onExpandGroup: (groupId: string) => void;\n renderListFooter?: () => ReactNode;\n groupDividerAttribute: string;\n}): JSX.Element {\n return (\n <div className={paletteStyles.groups}>\n {state.groups.map((group, index) => {\n const showGroupDivider = index > 0 && !group.hideTopDivider;\n return (\n <section\n key={group.id}\n className={cn(paletteStyles.group, group.sectionClassName)}\n >\n {showGroupDivider ? (\n <div\n className={paletteStyles.groupDivider}\n {...{ [groupDividerAttribute]: \"true\" }}\n aria-hidden=\"true\"\n />\n ) : null}\n {group.label ? (\n <div className={paletteStyles.groupLabel}>{group.label}</div>\n ) : null}\n <div className={paletteStyles.groupItems}>\n {group.items.length === 0 && group.emptyLabel ? (\n <div className={paletteStyles.groupEmpty}>\n {group.emptyLabel}\n </div>\n ) : null}\n {group.items.map((item) => {\n const entryKey = `${group.id}:${getItemKey(item, group)}`;\n const isHighlighted = entryKey === highlightedKey;\n return (\n <button\n key={entryKey}\n ref={isHighlighted ? highlightedOptionRef : null}\n type=\"button\"\n className={paletteStyles.rowButton}\n role=\"option\"\n aria-selected={isHighlighted}\n data-highlighted={isHighlighted ? \"\" : undefined}\n onPointerMove={() => {\n if (!isHighlighted) {\n onHighlightChange(entryKey);\n }\n }}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => onSelectItem(item, group)}\n >\n {renderItem(item, { active: isHighlighted })}\n </button>\n );\n })}\n {group.hasMore ? (\n <button\n key={`expand:${group.id}`}\n ref={\n `expand:${group.id}` === highlightedKey\n ? highlightedOptionRef\n : null\n }\n type=\"button\"\n className={paletteStyles.expandButton}\n data-highlighted={\n `expand:${group.id}` === highlightedKey ? \"\" : undefined\n }\n onPointerMove={() => {\n if (`expand:${group.id}` !== highlightedKey) {\n onHighlightChange(`expand:${group.id}`);\n }\n }}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => onExpandGroup(group.id)}\n >\n {group.expandLabel ??\n `+${Math.max(0, group.totalCount - group.visibleCount)}`}\n </button>\n ) : null}\n </div>\n </section>\n );\n })}\n {renderListFooter?.()}\n </div>\n );\n}\n\nfunction MentionPaletteEmptyState({\n icon = \"folder-failed\",\n label,\n testId\n}: {\n icon?: \"folder-failed\" | \"keyboard\";\n label: string;\n testId: string;\n}): JSX.Element {\n \"use memo\";\n const EmptyStateIcon =\n icon === \"keyboard\" ? KeyboardFilledIcon : FolderFailedFilledIcon;\n\n return (\n <div\n className={paletteStyles.emptyState}\n data-empty-state-icon={icon}\n data-testid={testId}\n >\n <div className={paletteStyles.emptyStateInner}>\n <EmptyStateIcon\n className={paletteStyles.emptyStateIcon}\n aria-hidden=\"true\"\n />\n <span className={paletteStyles.emptyStateText}>{label}</span>\n </div>\n </div>\n );\n}\n\nfunction MentionPaletteLoading({\n label,\n spinnerTestId\n}: {\n label: string;\n spinnerTestId: string;\n}): JSX.Element {\n \"use memo\";\n return (\n <div className={paletteStyles.loading}>\n <span\n aria-hidden=\"true\"\n className={paletteStyles.loadingSpinner}\n data-testid={spinnerTestId}\n />\n <span>{label}</span>\n </div>\n );\n}\n\nfunction MentionPaletteHint({\n ariaLabel,\n cycleFilterLabel,\n moveSelectionLabel,\n navigateHierarchyLabel,\n onCycleFilter,\n onMoveSelection,\n onNavigateHierarchy,\n classNames,\n testId\n}: {\n ariaLabel: string;\n cycleFilterLabel: string;\n moveSelectionLabel: string;\n navigateHierarchyLabel?: string;\n onCycleFilter: (delta: 1 | -1) => void;\n onMoveSelection: (delta: 1 | -1) => void;\n onNavigateHierarchy?: (delta: 1 | -1) => void;\n classNames: ResolvedMentionPaletteTheme[\"classNames\"];\n testId: string;\n}): JSX.Element {\n \"use memo\";\n const showHierarchyHints = Boolean(\n navigateHierarchyLabel && onNavigateHierarchy\n );\n return (\n <div\n className={classNames.hint}\n aria-label={ariaLabel}\n data-testid={testId}\n >\n <span className={classNames.hintItem}>\n <span className={classNames.shortcutGroup}>\n <button\n className={cn(classNames.shortcut, classNames.shortcutButton)}\n type=\"button\"\n aria-label={`Tab ${cycleFilterLabel}`}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => onCycleFilter(1)}\n >\n {/* i18n-check-ignore: Keyboard key label. */}\n Tab\n </button>\n {!showHierarchyHints ? (\n <>\n <button\n className={cn(\n classNames.shortcut,\n classNames.shortcutArrow,\n classNames.shortcutButton\n )}\n type=\"button\"\n aria-label={`← ${cycleFilterLabel}`}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => onCycleFilter(-1)}\n >\n ←\n </button>\n <button\n className={cn(\n classNames.shortcut,\n classNames.shortcutArrow,\n classNames.shortcutButton\n )}\n type=\"button\"\n aria-label={`→ ${cycleFilterLabel}`}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => onCycleFilter(1)}\n >\n →\n </button>\n </>\n ) : null}\n </span>\n <span>{cycleFilterLabel}</span>\n </span>\n {showHierarchyHints ? (\n <>\n <span className={classNames.hintSeparator} aria-hidden=\"true\">\n |\n </span>\n <span className={classNames.hintItem}>\n <span className={classNames.shortcutGroup}>\n <button\n className={cn(\n classNames.shortcut,\n classNames.shortcutArrow,\n classNames.shortcutButton\n )}\n type=\"button\"\n aria-label={`← ${navigateHierarchyLabel}`}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => onNavigateHierarchy?.(-1)}\n >\n ←\n </button>\n <button\n className={cn(\n classNames.shortcut,\n classNames.shortcutArrow,\n classNames.shortcutButton\n )}\n type=\"button\"\n aria-label={`→ ${navigateHierarchyLabel}`}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => onNavigateHierarchy?.(1)}\n >\n →\n </button>\n </span>\n <span>{navigateHierarchyLabel}</span>\n </span>\n </>\n ) : null}\n <span className={classNames.hintSeparator} aria-hidden=\"true\">\n |\n </span>\n <span className={classNames.hintItem}>\n <span className={classNames.shortcutGroup}>\n <button\n className={cn(\n classNames.shortcut,\n classNames.shortcutArrow,\n classNames.shortcutButton\n )}\n type=\"button\"\n aria-label={`↑ ${moveSelectionLabel}`}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => onMoveSelection(-1)}\n >\n ↑\n </button>\n <button\n className={cn(\n classNames.shortcut,\n classNames.shortcutArrow,\n classNames.shortcutButton\n )}\n type=\"button\"\n aria-label={`↓ ${moveSelectionLabel}`}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => onMoveSelection(1)}\n >\n ↓\n </button>\n </span>\n <span>{moveSelectionLabel}</span>\n </span>\n </div>\n );\n}\n","import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type JSX,\n type MouseEvent as ReactMouseEvent,\n type RefObject\n} from \"react\";\nimport { cn } from \"@tutti-os/ui-system/utils\";\n\ninterface MentionPaletteScrollbarState {\n scrollable: boolean;\n thumbHeight: number;\n thumbTop: number;\n}\n\ninterface MentionPaletteScrollbarDragState {\n maxScrollTop: number;\n maxThumbTop: number;\n startClientY: number;\n startScrollTop: number;\n}\n\nconst MENTION_PALETTE_SCROLLBAR_MIN_THUMB_HEIGHT = 24;\nconst MENTION_PALETTE_SCROLLBAR_HIDDEN_STATE: MentionPaletteScrollbarState = {\n scrollable: false,\n thumbHeight: 0,\n thumbTop: 0\n};\n\nexport function MentionPaletteScrollbar({\n scrollBodyRef,\n className,\n thumbClassName,\n testId\n}: {\n scrollBodyRef: RefObject<HTMLDivElement | null>;\n className: string;\n thumbClassName: string;\n testId: string;\n}): JSX.Element {\n \"use memo\";\n const trackRef = useRef<HTMLDivElement | null>(null);\n const dragStateRef = useRef<MentionPaletteScrollbarDragState | null>(null);\n const [scrollbarState, setScrollbarState] =\n useState<MentionPaletteScrollbarState>({\n scrollable: false,\n thumbHeight: 0,\n thumbTop: 0\n });\n const [dragging, setDragging] = useState(false);\n\n const hideScrollbar = useCallback((): void => {\n setScrollbarState((previous) =>\n previous.scrollable ||\n previous.thumbHeight !== 0 ||\n previous.thumbTop !== 0\n ? MENTION_PALETTE_SCROLLBAR_HIDDEN_STATE\n : previous\n );\n }, []);\n\n const syncScrollbarState = useCallback((): void => {\n const contentElement = scrollBodyRef.current;\n if (!contentElement) {\n hideScrollbar();\n return;\n }\n\n const { scrollHeight, scrollTop, clientHeight } = contentElement;\n const measuredTrackHeight = trackRef.current?.clientHeight ?? 0;\n const trackHeight =\n measuredTrackHeight > 0 ? measuredTrackHeight : clientHeight;\n const maxScrollTop = Math.max(0, scrollHeight - clientHeight);\n\n if (clientHeight <= 0 || trackHeight <= 0 || maxScrollTop <= 0) {\n hideScrollbar();\n return;\n }\n\n const thumbHeight = Math.max(\n MENTION_PALETTE_SCROLLBAR_MIN_THUMB_HEIGHT,\n Math.round((clientHeight / scrollHeight) * trackHeight)\n );\n const maxThumbTop = Math.max(0, trackHeight - thumbHeight);\n const thumbTop = Math.round((scrollTop / maxScrollTop) * maxThumbTop);\n setScrollbarState((previous) =>\n previous.scrollable &&\n previous.thumbHeight === thumbHeight &&\n previous.thumbTop === thumbTop\n ? previous\n : { scrollable: true, thumbHeight, thumbTop }\n );\n }, [hideScrollbar, scrollBodyRef]);\n\n useEffect(() => {\n const contentElement = scrollBodyRef.current;\n if (!contentElement) {\n hideScrollbar();\n return;\n }\n\n syncScrollbarState();\n contentElement.addEventListener(\"scroll\", syncScrollbarState, {\n passive: true\n });\n const resizeObserver =\n typeof ResizeObserver !== \"undefined\"\n ? new ResizeObserver(syncScrollbarState)\n : null;\n resizeObserver?.observe(contentElement);\n if (trackRef.current) {\n resizeObserver?.observe(trackRef.current);\n }\n const animationFrameId = window.requestAnimationFrame(syncScrollbarState);\n return () => {\n contentElement.removeEventListener(\"scroll\", syncScrollbarState);\n resizeObserver?.disconnect();\n window.cancelAnimationFrame(animationFrameId);\n };\n }, [hideScrollbar, scrollBodyRef, syncScrollbarState]);\n\n useEffect(() => {\n if (!dragging) {\n return;\n }\n\n const handleMouseMove = (event: MouseEvent): void => {\n const contentElement = scrollBodyRef.current;\n const dragState = dragStateRef.current;\n if (!contentElement || !dragState || dragState.maxThumbTop <= 0) {\n return;\n }\n const delta = event.clientY - dragState.startClientY;\n const nextThumbTop =\n (dragState.startScrollTop / dragState.maxScrollTop) *\n dragState.maxThumbTop +\n delta;\n contentElement.scrollTop =\n (Math.min(Math.max(0, nextThumbTop), dragState.maxThumbTop) /\n dragState.maxThumbTop) *\n dragState.maxScrollTop;\n syncScrollbarState();\n };\n\n const handleMouseUp = (): void => {\n dragStateRef.current = null;\n setDragging(false);\n };\n\n window.addEventListener(\"mousemove\", handleMouseMove);\n window.addEventListener(\"mouseup\", handleMouseUp);\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove);\n window.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, [dragging, scrollBodyRef, syncScrollbarState]);\n\n const scrollContentToThumbTop = (thumbTop: number): void => {\n const contentElement = scrollBodyRef.current;\n const trackElement = trackRef.current;\n if (!contentElement || !trackElement) {\n return;\n }\n const maxScrollTop = Math.max(\n 0,\n contentElement.scrollHeight - contentElement.clientHeight\n );\n const maxThumbTop = Math.max(\n 0,\n trackElement.clientHeight - scrollbarState.thumbHeight\n );\n if (maxScrollTop <= 0 || maxThumbTop <= 0) {\n return;\n }\n contentElement.scrollTop =\n (Math.min(Math.max(0, thumbTop), maxThumbTop) / maxThumbTop) *\n maxScrollTop;\n syncScrollbarState();\n };\n\n const handleTrackMouseDown = (\n event: ReactMouseEvent<HTMLDivElement>\n ): void => {\n if (\n event.button !== 0 ||\n !scrollbarState.scrollable ||\n event.target !== event.currentTarget\n ) {\n return;\n }\n event.preventDefault();\n const trackRect = event.currentTarget.getBoundingClientRect();\n scrollContentToThumbTop(\n event.clientY - trackRect.top - scrollbarState.thumbHeight / 2\n );\n };\n\n const handleThumbMouseDown = (\n event: ReactMouseEvent<HTMLDivElement>\n ): void => {\n if (event.button !== 0 || !scrollbarState.scrollable) {\n return;\n }\n const contentElement = scrollBodyRef.current;\n const trackElement = trackRef.current;\n if (!contentElement || !trackElement) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n dragStateRef.current = {\n maxScrollTop: Math.max(\n 0,\n contentElement.scrollHeight - contentElement.clientHeight\n ),\n maxThumbTop: Math.max(\n 0,\n trackElement.clientHeight - scrollbarState.thumbHeight\n ),\n startClientY: event.clientY,\n startScrollTop: contentElement.scrollTop\n };\n setDragging(true);\n };\n\n if (!scrollbarState.scrollable && !dragging) {\n return <div ref={trackRef} className=\"hidden\" aria-hidden=\"true\" />;\n }\n\n return (\n <div\n ref={trackRef}\n className={cn(\"group/status-scrollbar\", className)}\n data-scrollable={scrollbarState.scrollable ? \"true\" : \"false\"}\n data-dragging={dragging ? \"true\" : \"false\"}\n data-testid={testId}\n aria-hidden=\"true\"\n onMouseDown={handleTrackMouseDown}\n >\n <div\n className={thumbClassName}\n onMouseDown={handleThumbMouseDown}\n style={{\n height: `${scrollbarState.thumbHeight}px`,\n transform: `translateY(${scrollbarState.thumbTop}px)`\n }}\n />\n </div>\n );\n}\n","import type {\n MentionPaletteGroup,\n MentionPaletteProps,\n MentionPaletteState\n} from \"./mentionPaletteTypes.ts\";\nimport {\n findMentionPaletteEntry,\n moveMentionPaletteHighlight,\n nextMentionPaletteCategory,\n selectedMentionPaletteItem\n} from \"./mentionPaletteModel.ts\";\n\ntype MentionPaletteCycleCategory =\n | string\n | {\n id: string;\n };\n\nexport interface MentionPaletteStateCallbacks<TItem> {\n onHighlightChange?: (key: string) => void;\n onActiveCategoryIdChange?: (categoryId: string) => void;\n onSelectItem?: (item: TItem) => void;\n onExpandGroup?: (groupId: string) => void;\n}\n\nexport interface MentionPaletteStateAdapterInput<TItem> {\n state: MentionPaletteState<TItem>;\n highlightedKey: string | null;\n /**\n * Optional order used by Tab/Shift+Tab. Defaults to the rendered category\n * order; callers with a surface-specific results-mode tab order can pass it\n * here and keep that policy outside the shell.\n */\n categoryCycleOrder?: readonly MentionPaletteCycleCategory[];\n getItemKey: (item: TItem, groupId: string) => string;\n callbacks?: MentionPaletteStateCallbacks<TItem>;\n}\n\nexport type MentionPaletteStateCommitResult<TItem> =\n | { type: \"none\" }\n | { type: \"category\"; categoryId: string }\n | { type: \"expand\"; groupId: string }\n | { type: \"item\"; item: TItem };\n\nexport interface MentionPaletteStateAdapter<TItem> {\n selectedItem: TItem | null;\n paletteProps: Pick<\n MentionPaletteProps<TItem>,\n | \"state\"\n | \"highlightedKey\"\n | \"getItemKey\"\n | \"onHighlightChange\"\n | \"onSelectItem\"\n | \"onSelectCategory\"\n | \"onSelectFilter\"\n | \"onExpandGroup\"\n | \"onCycleFilter\"\n | \"onMoveSelection\"\n >;\n moveSelection: (delta: 1 | -1) => string | null;\n selectCategory: (categoryId: string) => void;\n expandGroup: (groupId: string) => void;\n cycleCategory: (delta: 1 | -1) => string | null;\n commitHighlighted: () => MentionPaletteStateCommitResult<TItem>;\n}\n\nexport function createMentionPaletteStateAdapter<TItem>(\n input: MentionPaletteStateAdapterInput<TItem>\n): MentionPaletteStateAdapter<TItem> {\n const getPaletteItemKey = (\n item: TItem,\n group: MentionPaletteGroup<TItem>\n ): string => input.getItemKey(item, group.id);\n\n const selectCategory = (categoryId: string): void => {\n input.callbacks?.onActiveCategoryIdChange?.(categoryId);\n };\n\n const expandGroup = (groupId: string): void => {\n input.callbacks?.onExpandGroup?.(groupId);\n };\n\n const moveSelection = (delta: 1 | -1): string | null => {\n const nextKey = moveMentionPaletteHighlight({\n state: input.state,\n currentKey: input.highlightedKey,\n delta,\n getItemKey: input.getItemKey\n });\n if (nextKey !== null) {\n input.callbacks?.onHighlightChange?.(nextKey);\n }\n return nextKey;\n };\n\n const cycleCategory = (delta: 1 | -1): string | null => {\n const cycleCategories = resolveCycleCategories(input.categoryCycleOrder);\n const categories = cycleCategories.length\n ? cycleCategories\n : input.state.categories;\n if (categories.length === 0) {\n return null;\n }\n const nextCategoryId = nextMentionPaletteCategory(\n categories,\n input.state.filter,\n delta\n );\n selectCategory(nextCategoryId);\n return nextCategoryId;\n };\n\n const selectedItem = selectedMentionPaletteItem({\n state: input.state,\n key: input.highlightedKey,\n getItemKey: input.getItemKey\n });\n\n const commitHighlighted = (): MentionPaletteStateCommitResult<TItem> => {\n const activeEntry = findMentionPaletteEntry({\n state: input.state,\n key: input.highlightedKey,\n getItemKey: input.getItemKey\n });\n const fallbackCategoryId = categoryIdFromKey(input.highlightedKey);\n\n if (!activeEntry) {\n if (\n fallbackCategoryId !== null &&\n input.state.categories.some(\n (category) => category.id === fallbackCategoryId\n )\n ) {\n selectCategory(fallbackCategoryId);\n return { type: \"category\", categoryId: fallbackCategoryId };\n }\n return { type: \"none\" };\n }\n\n if (activeEntry.type === \"category\" && activeEntry.categoryId) {\n selectCategory(activeEntry.categoryId);\n return { type: \"category\", categoryId: activeEntry.categoryId };\n }\n\n if (activeEntry.type === \"expand\" && activeEntry.groupId) {\n expandGroup(activeEntry.groupId);\n return { type: \"expand\", groupId: activeEntry.groupId };\n }\n\n if (activeEntry.type === \"item\") {\n const item = selectedMentionPaletteItem({\n state: input.state,\n key: activeEntry.key,\n getItemKey: input.getItemKey\n });\n if (item !== null) {\n input.callbacks?.onSelectItem?.(item);\n return { type: \"item\", item };\n }\n }\n\n return { type: \"none\" };\n };\n\n return {\n selectedItem,\n paletteProps: {\n state: input.state,\n highlightedKey: input.highlightedKey,\n getItemKey: getPaletteItemKey,\n onHighlightChange: (key) => {\n input.callbacks?.onHighlightChange?.(key);\n },\n onSelectItem: (item) => {\n input.callbacks?.onSelectItem?.(item);\n },\n onSelectCategory: selectCategory,\n onSelectFilter: selectCategory,\n onExpandGroup: expandGroup,\n onCycleFilter: cycleCategory,\n onMoveSelection: moveSelection\n },\n moveSelection,\n selectCategory,\n expandGroup,\n cycleCategory,\n commitHighlighted\n };\n}\n\nfunction resolveCycleCategories(\n categories: readonly MentionPaletteCycleCategory[] | undefined\n): readonly { id: string }[] {\n return (\n categories?.map((category) =>\n typeof category === \"string\" ? { id: category } : category\n ) ?? []\n );\n}\n\nfunction categoryIdFromKey(key: string | null): string | null {\n const prefix = \"category:\";\n return key?.startsWith(prefix) ? key.slice(prefix.length) : null;\n}\n","import type { JSX, ReactNode } from \"react\";\nimport { MentionPalette } from \"./MentionPalette.tsx\";\nimport {\n createMentionPaletteStateAdapter,\n type MentionPaletteStateAdapterInput\n} from \"./mentionPaletteStateAdapter.ts\";\nimport type {\n MentionPaletteProps,\n MentionPaletteTheme\n} from \"./mentionPaletteTypes.ts\";\n\nexport interface MentionPaletteFromStateProps<\n TItem\n> extends MentionPaletteStateAdapterInput<TItem> {\n labels: MentionPaletteProps<TItem>[\"labels\"];\n hintLabels: MentionPaletteProps<TItem>[\"hintLabels\"];\n maxHeightPx: number;\n renderItem: (item: TItem, ctx: { active: boolean }) => ReactNode;\n renderListFooter?: () => ReactNode;\n loadingBanner?: ReactNode;\n scrollHighlightedIntoViewCentered?: boolean;\n theme?: MentionPaletteTheme;\n onNavigateHierarchy?: MentionPaletteProps<TItem>[\"onNavigateHierarchy\"];\n}\n\nexport function MentionPaletteFromState<TItem>(\n props: MentionPaletteFromStateProps<TItem>\n): JSX.Element {\n \"use memo\";\n const {\n labels,\n hintLabels,\n maxHeightPx,\n renderItem,\n renderListFooter,\n loadingBanner,\n scrollHighlightedIntoViewCentered,\n theme,\n onNavigateHierarchy,\n ...adapterInput\n } = props;\n const adapter = createMentionPaletteStateAdapter(adapterInput);\n\n return (\n <MentionPalette\n {...adapter.paletteProps}\n labels={labels}\n hintLabels={hintLabels}\n maxHeightPx={maxHeightPx}\n renderItem={renderItem}\n renderListFooter={renderListFooter}\n loadingBanner={loadingBanner}\n scrollHighlightedIntoViewCentered={scrollHighlightedIntoViewCentered}\n theme={theme}\n onNavigateHierarchy={onNavigateHierarchy}\n />\n );\n}\n","import { CheckIcon } from \"@tutti-os/ui-system/icons\";\n\nexport function MentionPaletteSelectIndicator(props: { selected: boolean }) {\n return (\n <span\n aria-hidden=\"true\"\n className=\"rich-text-at-mention-select-indicator\"\n data-selected={props.selected ? \"true\" : \"false\"}\n >\n <CheckIcon size={13} />\n </span>\n );\n}\n\nexport function MentionPaletteMultiSelectFooter(props: {\n count: number;\n countLabel: string;\n cancelLabel: string;\n confirmLabel: string;\n onCancel: () => void;\n onConfirm: () => void;\n}) {\n return (\n <div className=\"rich-text-at-mention-multiselect-footer\">\n <span className=\"rich-text-at-mention-multiselect-footer__count\">\n {props.countLabel}\n </span>\n <div className=\"rich-text-at-mention-multiselect-footer__actions\">\n <button\n type=\"button\"\n className=\"rich-text-at-mention-multiselect-footer__button rich-text-at-mention-multiselect-footer__button--secondary\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={props.onCancel}\n >\n {props.cancelLabel}\n </button>\n <button\n type=\"button\"\n disabled={props.count === 0}\n className=\"rich-text-at-mention-multiselect-footer__button rich-text-at-mention-multiselect-footer__button--primary\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={props.onConfirm}\n >\n {props.confirmLabel}\n </button>\n </div>\n </div>\n );\n}\n","import {\n ArrowLeftIcon,\n Badge,\n FileCodeIcon,\n FileTextIcon,\n FolderIcon,\n ImageFileIcon,\n LocateFolderIcon,\n ProductIcon,\n StatusDot,\n VideoFileIcon,\n cn,\n type IconProps\n} from \"@tutti-os/ui-system\";\nimport type { MentionFileVisualKind } from \"./mentionFileVisualKind.ts\";\nimport {\n mentionRowDataAttribute,\n mentionRowRootDataAttributes,\n type MentionRowDataAttributeMode\n} from \"./mentionRowDataAttributes.ts\";\nimport type {\n MentionRowFileItem,\n MentionRowItem,\n MentionRowSessionItem,\n MentionRowStatusTag\n} from \"./mentionRowTypes.ts\";\nimport { mentionStatusBadgeClassName } from \"./mentionStatusTone.ts\";\n\n/**\n * Default file kind-icon shapes for surfaces that do NOT ship the agent's\n * CSS-masked glyph stylesheet. These mirror the agent's mask glyph shapes\n * (`agentactivity.css`: folder-filled / doc-filled / code-filled / image-filled\n * / video-filled / arrow-left-filled) using ui-system icon components, so a\n * file row renders a real glyph without `agentactivity.css`. The agent composer\n * passes its own `fileIcon` class and keeps rendering masked `<span>` glyphs,\n * except `back` rows which always use {@link ArrowLeftIcon}.\n */\nconst MENTION_FILE_VISUAL_KIND_ICON: Record<\n MentionFileVisualKind,\n (props: IconProps) => React.JSX.Element\n> = {\n back: ArrowLeftIcon,\n folder: FolderIcon,\n document: FileTextIcon,\n // The agent maps markdown to `product-filled.svg`; ProductIcon is the\n // matching boundary-safe ui-system glyph.\n markdown: ProductIcon,\n code: FileCodeIcon,\n image: ImageFileIcon,\n video: VideoFileIcon\n};\n\n/**\n * Structural class-name hooks for the elements a {@link MentionRow} renders that\n * rely on a stylesheet (file icon/thumb, the app fallback kind-icon, and the\n * session avatar placeholder modifier). Every key is optional and defaults to a\n * PACKAGE-OWNED `rich-text-at-mention-*` class whose CSS ships with\n * `mentionPalette.css`, so any consumer renders styled rows out of the box.\n *\n * Surfaces with their own stylesheet (e.g. the agent composer) pass their exact\n * existing class names here so their rendered DOM stays byte-identical.\n */\nexport interface MentionRowClassNames {\n /** The masked file kind-icon `<span>`. */\n fileIcon?: string;\n /** The image-thumbnail wrapper `<span>` (rendered for image files). */\n fileThumb?: string;\n /** The fallback app icon glyph rendered when no `iconUrl` is present. */\n kindIcon?: string;\n /**\n * Modifier class added to the session user avatar `<img>` when the user has no\n * avatar URL and the placeholder asset is shown.\n */\n avatarImgUserPlaceholder?: string;\n}\n\nexport interface MentionRowRenderOptions {\n classNames?: MentionRowClassNames;\n dataAttributeMode?: MentionRowDataAttributeMode;\n /**\n * 当提供时,issue / app 行末尾渲染一个「查看产物文件」入口图标(独立点击热区,\n * 不触发整行选中)。点击回调由调用方注入(如打开引用文件 picker 并定位到该实体)。\n */\n onOpenReferences?: () => void;\n /** 入口图标的无障碍标签 / tooltip 文案。 */\n openReferencesLabel?: string;\n}\n\ninterface ResolvedMentionRowRenderOptions {\n classNames?: MentionRowClassNames;\n dataAttributeMode: MentionRowDataAttributeMode;\n onOpenReferences?: () => void;\n openReferencesLabel?: string;\n}\n\nconst DEFAULT_MENTION_ROW_CLASS_NAMES = {\n fileIcon: \"rich-text-at-mention-file-icon\",\n fileThumb: \"rich-text-at-mention-file-thumb\",\n kindIcon: \"rich-text-at-mention-kind-icon\",\n avatarImgUserPlaceholder: \"rich-text-at-mention-avatar-img--user-placeholder\"\n} as const satisfies Required<MentionRowClassNames>;\n\nfunction resolveMentionRowClassNames(\n classNames?: MentionRowClassNames\n): Required<MentionRowClassNames> {\n return {\n fileIcon: classNames?.fileIcon ?? DEFAULT_MENTION_ROW_CLASS_NAMES.fileIcon,\n fileThumb:\n classNames?.fileThumb ?? DEFAULT_MENTION_ROW_CLASS_NAMES.fileThumb,\n kindIcon: classNames?.kindIcon ?? DEFAULT_MENTION_ROW_CLASS_NAMES.kindIcon,\n avatarImgUserPlaceholder:\n classNames?.avatarImgUserPlaceholder ??\n DEFAULT_MENTION_ROW_CLASS_NAMES.avatarImgUserPlaceholder\n };\n}\n\nfunction resolveMentionRowRenderOptions(\n options?: MentionRowClassNames | MentionRowRenderOptions\n): ResolvedMentionRowRenderOptions {\n if (isMentionRowRenderOptions(options)) {\n return {\n classNames: options.classNames,\n dataAttributeMode: options.dataAttributeMode ?? \"shared\",\n onOpenReferences: options.onOpenReferences,\n openReferencesLabel: options.openReferencesLabel\n };\n }\n return {\n classNames: options,\n dataAttributeMode: \"shared\"\n };\n}\n\nfunction isMentionRowRenderOptions(\n options: MentionRowClassNames | MentionRowRenderOptions | undefined\n): options is MentionRowRenderOptions {\n return (\n options !== undefined &&\n (\"classNames\" in options || \"dataAttributeMode\" in options)\n );\n}\n\n/**\n * Render the inner content of a single `@`-mention palette row from a\n * fully-resolved {@link MentionRowItem}. The surrounding option button / active\n * state is provided by the shared `MentionPalette` shell; this renders only the\n * row body.\n *\n * Pass {@link classNames} to override the package-owned structural class hooks\n * (e.g. so the agent composer keeps emitting its own stylesheet's class names).\n */\nexport function renderMentionRow(\n item: MentionRowItem,\n options?: MentionRowClassNames | MentionRowRenderOptions\n): React.ReactNode {\n const {\n classNames,\n dataAttributeMode,\n onOpenReferences,\n openReferencesLabel\n } = resolveMentionRowRenderOptions(options);\n const resolved = resolveMentionRowClassNames(classNames);\n const referencesButton = onOpenReferences ? (\n <MentionOpenReferencesButton\n label={openReferencesLabel}\n onOpenReferences={onOpenReferences}\n dataAttributeMode={dataAttributeMode}\n />\n ) : null;\n if (item.kind === \"file\") {\n return (\n <MentionFileRow\n item={item}\n classNames={resolved}\n dataAttributeMode={dataAttributeMode}\n />\n );\n }\n\n if (item.kind === \"plain\") {\n return (\n <span className=\"rich-text-at-mention-row rich-text-at-mention-row--plain\">\n {item.leading}\n <span className=\"rich-text-at-mention-row__text-stack\">\n <span className=\"rich-text-at-mention-row__title\">{item.label}</span>\n {item.description ? (\n <span className=\"rich-text-at-mention-row__description\">\n {item.description}\n </span>\n ) : null}\n </span>\n </span>\n );\n }\n\n if (item.kind === \"session\") {\n return (\n <span className=\"rich-text-at-mention-row rich-text-at-mention-row--session\">\n <span className=\"rich-text-at-mention-row__leading\">\n <MentionSessionAvatarStack\n item={item}\n classNames={resolved}\n dataAttributeMode={dataAttributeMode}\n />\n <span className=\"rich-text-at-mention-row__session-title\">\n <MentionSessionTitle item={item} />\n </span>\n </span>\n {item.statusTag ? (\n <MentionStatusBadge\n statusTag={item.statusTag}\n dataAttributeMode={dataAttributeMode}\n />\n ) : null}\n </span>\n );\n }\n\n if (item.kind === \"app\") {\n return (\n <span className=\"rich-text-at-mention-row rich-text-at-mention-row--app\">\n <MentionWorkspaceAppIcon\n iconUrl={item.iconUrl}\n kindIconClassName={resolved.kindIcon}\n dataAttributeMode={dataAttributeMode}\n />\n <span className=\"rich-text-at-mention-row__app-text\">\n <span className=\"rich-text-at-mention-row__app-name\">\n {item.name}\n </span>\n {item.description ? (\n <span className=\"rich-text-at-mention-row__app-description\">\n {item.description}\n </span>\n ) : null}\n </span>\n {referencesButton}\n </span>\n );\n }\n\n if (item.kind === \"app-factory\") {\n return (\n <span className=\"rich-text-at-mention-row__text-stack\">\n <span className=\"rich-text-at-mention-row__title\">{item.name}</span>\n </span>\n );\n }\n\n return (\n <span className=\"rich-text-at-mention-row rich-text-at-mention-row--issue\">\n <span className=\"rich-text-at-mention-row__text-stack rich-text-at-mention-row__text-stack--fill\">\n <span className=\"rich-text-at-mention-row__inline\">\n <span className=\"rich-text-at-mention-row__title\">{item.title}</span>\n {item.statusTag ? (\n <MentionStatusBadge\n statusTag={item.statusTag}\n dataAttributeMode={dataAttributeMode}\n />\n ) : null}\n </span>\n {item.creatorName ? (\n <span className=\"rich-text-at-mention-row__description\">\n {item.creatorName}\n </span>\n ) : null}\n </span>\n {referencesButton}\n </span>\n );\n}\n\n/**\n * 「查看产物文件」入口图标。issue / app 行末尾的独立点击热区:点击只触发\n * {@link onOpenReferences}(如打开引用文件 picker 并定位),阻断冒泡以免触发整行选中。\n * 行外层按钮的 `[&_svg]:pointer-events-none` 使图标本身不吃事件,点击落在此 `<span>` 上。\n */\nfunction MentionOpenReferencesButton({\n label,\n onOpenReferences,\n dataAttributeMode\n}: {\n label?: string;\n onOpenReferences: () => void;\n dataAttributeMode: MentionRowDataAttributeMode;\n}): React.JSX.Element {\n return (\n <span\n role=\"button\"\n tabIndex={-1}\n aria-label={label}\n title={label}\n className=\"rich-text-at-mention-row__open-references\"\n {...mentionRowDataAttribute(dataAttributeMode, \"openReferences\", \"true\")}\n onMouseDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onOpenReferences();\n }}\n >\n <LocateFolderIcon size={16} />\n </span>\n );\n}\n\nfunction MentionFileRow({\n item,\n classNames,\n dataAttributeMode\n}: {\n item: MentionRowFileItem;\n classNames: Required<MentionRowClassNames>;\n dataAttributeMode: MentionRowDataAttributeMode;\n}): React.JSX.Element {\n return (\n <span\n className=\"rich-text-at-mention-row rich-text-at-mention-row--file\"\n {...mentionRowRootDataAttributes(dataAttributeMode, \"file\")}\n {...(item.entryKind\n ? mentionRowDataAttribute(\n dataAttributeMode,\n \"fileEntryKind\",\n item.entryKind\n )\n : {})}\n {...mentionRowDataAttribute(\n dataAttributeMode,\n \"fileVisualKind\",\n item.visualKind\n )}\n {...(item.mentionNavigation\n ? mentionRowDataAttribute(\n dataAttributeMode,\n \"navigation\",\n item.mentionNavigation\n )\n : {})}\n >\n <MentionFileIcon\n item={item}\n classNames={classNames}\n dataAttributeMode={dataAttributeMode}\n />\n <span className=\"rich-text-at-mention-row__file-text\">\n <span className=\"rich-text-at-mention-row__title\">{item.name}</span>\n {item.childCountLabel ? (\n <span className=\"rich-text-at-mention-row__file-count\">\n {item.childCountLabel}\n </span>\n ) : null}\n </span>\n </span>\n );\n}\n\nfunction MentionFileIcon({\n item,\n classNames,\n dataAttributeMode\n}: {\n item: MentionRowFileItem;\n classNames: Required<MentionRowClassNames>;\n dataAttributeMode: MentionRowDataAttributeMode;\n}): React.JSX.Element {\n const thumbnailUrl =\n item.visualKind === \"image\" ? item.thumbnailUrl?.trim() || \"\" : \"\";\n if (thumbnailUrl) {\n return (\n <span\n className={classNames.fileThumb}\n {...mentionRowDataAttribute(dataAttributeMode, \"fileThumb\", \"true\")}\n aria-hidden=\"true\"\n >\n <img\n src={thumbnailUrl}\n alt=\"\"\n className=\"rich-text-at-mention-row__media\"\n decoding=\"async\"\n loading=\"lazy\"\n draggable={false}\n />\n </span>\n );\n }\n\n // Back navigation always renders the ui-system back glyph so every surface\n // (including the agent composer's CSS-masked file icons) shares one source.\n if (item.visualKind === \"back\") {\n return (\n <span\n className={cn(\n classNames.fileIcon,\n \"rich-text-at-mention-file-icon--glyph\"\n )}\n {...mentionRowDataAttribute(\n dataAttributeMode,\n \"fileVisualKind\",\n item.visualKind\n )}\n aria-hidden=\"true\"\n >\n <ArrowLeftIcon size={16} />\n </span>\n );\n }\n\n // Surfaces that ship a custom file-icon stylesheet (e.g. the agent composer\n // via `agentactivity.css`) render the empty CSS-masked `<span>` so their DOM\n // stays byte-identical. Surfaces using the package default class have no such\n // stylesheet, so render a real ui-system kind glyph instead of an empty box.\n const usesDefaultFileIcon =\n classNames.fileIcon === DEFAULT_MENTION_ROW_CLASS_NAMES.fileIcon;\n if (usesDefaultFileIcon) {\n const Icon = MENTION_FILE_VISUAL_KIND_ICON[item.visualKind];\n return (\n <span\n className={cn(\n classNames.fileIcon,\n \"rich-text-at-mention-file-icon--glyph\"\n )}\n {...mentionRowDataAttribute(\n dataAttributeMode,\n \"fileVisualKind\",\n item.visualKind\n )}\n aria-hidden=\"true\"\n >\n <Icon size={16} />\n </span>\n );\n }\n\n return (\n <span\n className={classNames.fileIcon}\n {...mentionRowDataAttribute(\n dataAttributeMode,\n \"fileVisualKind\",\n item.visualKind\n )}\n aria-hidden=\"true\"\n />\n );\n}\n\nfunction MentionWorkspaceAppIcon({\n iconUrl,\n kindIconClassName,\n dataAttributeMode\n}: {\n iconUrl?: string | null;\n kindIconClassName: string;\n dataAttributeMode: MentionRowDataAttributeMode;\n}): React.JSX.Element {\n const normalizedIconUrl = iconUrl?.trim() ?? \"\";\n return (\n <span\n className=\"rich-text-at-mention-app-icon\"\n {...mentionRowDataAttribute(dataAttributeMode, \"appIcon\", \"true\")}\n data-workspace-app-icon=\"true\"\n aria-hidden=\"true\"\n >\n {normalizedIconUrl ? (\n <img\n src={normalizedIconUrl}\n alt=\"\"\n className=\"rich-text-at-mention-row__media\"\n decoding=\"async\"\n loading=\"lazy\"\n draggable={false}\n />\n ) : (\n <span\n className={cn(\n kindIconClassName,\n \"rich-text-at-mention-kind-icon--app\"\n )}\n />\n )}\n </span>\n );\n}\n\nfunction MentionSessionAvatarStack({\n item,\n classNames,\n dataAttributeMode\n}: {\n item: MentionRowSessionItem;\n classNames: Required<MentionRowClassNames>;\n dataAttributeMode: MentionRowDataAttributeMode;\n}): React.JSX.Element {\n const showUserAvatar = item.showUserAvatar !== false;\n if (!showUserAvatar) {\n return (\n <span\n className={cn(\n \"rich-text-at-mention-avatar-stack\",\n \"rich-text-at-mention-avatar-stack--agent-only\"\n )}\n aria-hidden=\"true\"\n >\n <span\n className=\"rich-text-at-mention-avatar rich-text-at-mention-avatar--agent\"\n {...mentionRowDataAttribute(dataAttributeMode, \"agentAvatar\", \"true\")}\n >\n <img\n src={item.agentIconUrl}\n alt=\"\"\n className=\"rich-text-at-mention-row__media\"\n decoding=\"async\"\n loading=\"lazy\"\n draggable={false}\n />\n </span>\n </span>\n );\n }\n\n const userAvatarUrl = item.userAvatarUrl?.trim() ?? \"\";\n const placeholderUrl = item.userAvatarPlaceholderUrl;\n const userImageUrl = userAvatarUrl || placeholderUrl;\n return (\n <span className=\"rich-text-at-mention-avatar-stack\" aria-hidden=\"true\">\n <span\n className=\"rich-text-at-mention-avatar rich-text-at-mention-avatar--user\"\n {...mentionRowDataAttribute(dataAttributeMode, \"userAvatar\", \"true\")}\n >\n <img\n src={userImageUrl}\n alt=\"\"\n className={cn(\n \"rich-text-at-mention-row__media\",\n !userAvatarUrl && classNames.avatarImgUserPlaceholder\n )}\n decoding=\"async\"\n loading=\"lazy\"\n referrerPolicy=\"no-referrer\"\n draggable={false}\n onError={(event) => {\n if (event.currentTarget.dataset.fallbackAvatarApplied === \"true\") {\n return;\n }\n event.currentTarget.dataset.fallbackAvatarApplied = \"true\";\n event.currentTarget.src = placeholderUrl;\n event.currentTarget.classList.add(\n classNames.avatarImgUserPlaceholder\n );\n }}\n />\n </span>\n <span\n className=\"rich-text-at-mention-avatar rich-text-at-mention-avatar--agent\"\n {...mentionRowDataAttribute(dataAttributeMode, \"agentAvatar\", \"true\")}\n >\n <img\n src={item.agentIconUrl}\n alt=\"\"\n className=\"rich-text-at-mention-row__media\"\n decoding=\"async\"\n loading=\"lazy\"\n draggable={false}\n />\n </span>\n </span>\n );\n}\n\nfunction MentionSessionTitle({\n item\n}: {\n item: MentionRowSessionItem;\n}): React.JSX.Element {\n return (\n <>\n <span className=\"rich-text-at-mention-row__session-participant\">\n {item.participant}\n </span>\n <span className=\"rich-text-at-mention-row__session-summary\">\n {\" \"}\n {item.summary ?? \"\"}\n </span>\n </>\n );\n}\n\nfunction MentionStatusBadge({\n statusTag,\n dataAttributeMode\n}: {\n statusTag: MentionRowStatusTag;\n dataAttributeMode: MentionRowDataAttributeMode;\n}): React.JSX.Element {\n if (statusTag.variant === \"issue\") {\n return (\n <Badge\n variant=\"secondary\"\n size=\"sm\"\n className={cn(\n \"rich-text-at-mention-status rich-text-at-mention-status--issue\",\n mentionStatusBadgeClassName({\n tone: statusTag.tone,\n variant: \"issue\"\n })\n )}\n {...mentionRowDataAttribute(dataAttributeMode, \"statusTag\", \"true\")}\n {...(statusTag.dataStatus\n ? { \"data-status\": statusTag.dataStatus }\n : {})}\n data-tone={statusTag.tone}\n >\n {statusTag.label}\n </Badge>\n );\n }\n\n return (\n <Badge\n variant=\"secondary\"\n size=\"sm\"\n className={cn(\n \"rich-text-at-mention-status rich-text-at-mention-status--activity\",\n mentionStatusBadgeClassName({\n tone: statusTag.tone,\n variant: \"activity\"\n })\n )}\n {...mentionRowDataAttribute(dataAttributeMode, \"statusTag\", \"true\")}\n {...(statusTag.dataStatus ? { \"data-status\": statusTag.dataStatus } : {})}\n data-tone={statusTag.tone}\n title={statusTag.label}\n >\n <StatusDot\n tone={statusTag.tone}\n pulse={statusTag.pulse ?? false}\n size=\"xs\"\n title={statusTag.label}\n />\n <span>{statusTag.label}</span>\n </Badge>\n );\n}\n","import type { MentionRowItem } from \"./mentionRowTypes.ts\";\n\nexport type MentionRowDataAttributeMode = \"shared\" | \"agent\";\n\nexport type MentionRowDataAttributeKey =\n | \"agentAvatar\"\n | \"appIcon\"\n | \"fileEntryKind\"\n | \"fileThumb\"\n | \"fileVisualKind\"\n | \"navigation\"\n | \"openReferences\"\n | \"statusTag\"\n | \"userAvatar\";\n\nconst MENTION_ROW_DATA_ATTRIBUTES: Record<\n MentionRowDataAttributeMode,\n Record<MentionRowDataAttributeKey, string>\n> = {\n shared: {\n agentAvatar: \"data-rich-text-at-mention-agent-avatar\",\n appIcon: \"data-rich-text-at-mention-app-icon\",\n fileEntryKind: \"data-rich-text-at-mention-file-entry-kind\",\n fileThumb: \"data-rich-text-at-mention-file-thumb\",\n fileVisualKind: \"data-rich-text-at-mention-file-visual-kind\",\n navigation: \"data-rich-text-at-mention-navigation\",\n openReferences: \"data-rich-text-at-mention-open-references\",\n statusTag: \"data-rich-text-at-mention-status-tag\",\n userAvatar: \"data-rich-text-at-mention-user-avatar\"\n },\n agent: {\n agentAvatar: \"data-agent-mention-agent-avatar\",\n appIcon: \"data-agent-mention-app-icon\",\n fileEntryKind: \"data-agent-file-entry-kind\",\n fileThumb: \"data-agent-mention-file-thumb\",\n fileVisualKind: \"data-agent-file-visual-kind\",\n navigation: \"data-agent-mention-navigation\",\n openReferences: \"data-agent-mention-open-references\",\n statusTag: \"data-agent-mention-status-tag\",\n userAvatar: \"data-agent-mention-user-avatar\"\n }\n};\n\nexport function mentionRowRootDataAttributes(\n mode: MentionRowDataAttributeMode,\n kind: MentionRowItem[\"kind\"]\n): Record<string, string> {\n return mode === \"agent\"\n ? {\n \"data-agent-file-mention\": \"true\",\n \"data-agent-mention-kind\": kind\n }\n : {\n \"data-rich-text-at-mention-row\": \"true\",\n \"data-rich-text-at-mention-kind\": kind\n };\n}\n\nexport function mentionRowDataAttribute(\n mode: MentionRowDataAttributeMode,\n key: MentionRowDataAttributeKey,\n value: string\n): Record<string, string> {\n return {\n [MENTION_ROW_DATA_ATTRIBUTES[mode][key]]: value\n };\n}\n","import React, { type CSSProperties } from \"react\";\nimport type { MentionFileVisualKind } from \"./mentionFileVisualKind.ts\";\n\nexport type MentionReferenceProviderKind =\n | \"agent-generated-file\"\n | \"agent-session\"\n | \"file\"\n | \"workspace-app\"\n | \"workspace-issue\"\n | \"generic\";\n\nexport interface MentionReferenceLeadingInput {\n className?: string;\n fileVisualKind?: MentionFileVisualKind;\n iconUrl?: string | null;\n imageClassName?: string;\n kind: MentionReferenceProviderKind;\n label?: string | null;\n thumbnailUrl?: string | null;\n}\n\nconst REFERENCE_LEADING_STYLE = {\n alignItems: \"center\",\n background: \"var(--bg-block, var(--block, #0000000a))\",\n borderRadius: \"8px\",\n color: \"var(--rich-text-at-mention-text-secondary, currentColor)\",\n display: \"inline-grid\",\n flex: \"0 0 32px\",\n height: \"32px\",\n justifyItems: \"center\",\n overflow: \"hidden\",\n width: \"32px\"\n} as const satisfies CSSProperties;\n\nconst REFERENCE_IMAGE_STYLE = {\n display: \"block\",\n height: \"100%\",\n objectFit: \"cover\",\n width: \"100%\"\n} as const satisfies CSSProperties;\n\nconst REFERENCE_ICON_STYLE = {\n display: \"block\",\n height: \"18px\",\n width: \"18px\"\n} as const satisfies CSSProperties;\n\nexport function resolveMentionReferenceImageUrl(input: {\n iconUrl?: string | null;\n thumbnailUrl?: string | null;\n}): string | undefined {\n return input.thumbnailUrl?.trim() || input.iconUrl?.trim() || undefined;\n}\n\nexport function renderMentionReferenceLeading(\n input: MentionReferenceLeadingInput\n): React.JSX.Element {\n const imageUrl = resolveMentionReferenceImageUrl(input);\n return React.createElement(\n \"span\",\n {\n \"aria-hidden\": \"true\",\n className: input.className,\n \"data-rich-text-at-mention-reference-kind\": input.kind,\n \"data-rich-text-at-mention-reference-leading\": \"true\",\n style: REFERENCE_LEADING_STYLE\n },\n imageUrl\n ? React.createElement(\"img\", {\n alt: \"\",\n className: input.imageClassName,\n decoding: \"async\",\n draggable: false,\n loading: \"lazy\",\n src: imageUrl,\n style: REFERENCE_IMAGE_STYLE\n })\n : renderMentionReferenceFallbackIcon(input)\n );\n}\n\nfunction renderMentionReferenceFallbackIcon(\n input: Pick<MentionReferenceLeadingInput, \"fileVisualKind\" | \"kind\">\n): React.JSX.Element {\n return React.createElement(\n \"svg\",\n {\n \"aria-hidden\": \"true\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 1.8,\n style: REFERENCE_ICON_STYLE,\n viewBox: \"0 0 24 24\"\n },\n ...referenceIconPaths(input)\n );\n}\n\nfunction referenceIconPaths(\n input: Pick<MentionReferenceLeadingInput, \"fileVisualKind\" | \"kind\">\n): React.ReactNode[] {\n if (input.kind === \"workspace-app\") {\n return [\n React.createElement(\"rect\", {\n height: 7,\n key: \"a\",\n rx: 1.5,\n width: 7,\n x: 4,\n y: 4\n }),\n React.createElement(\"rect\", {\n height: 7,\n key: \"b\",\n rx: 1.5,\n width: 7,\n x: 13,\n y: 4\n }),\n React.createElement(\"rect\", {\n height: 7,\n key: \"c\",\n rx: 1.5,\n width: 7,\n x: 4,\n y: 13\n }),\n React.createElement(\"rect\", {\n height: 7,\n key: \"d\",\n rx: 1.5,\n width: 7,\n x: 13,\n y: 13\n })\n ];\n }\n if (input.kind === \"workspace-issue\") {\n return [\n React.createElement(\"circle\", { cx: 12, cy: 12, key: \"a\", r: 8 }),\n React.createElement(\"path\", { d: \"M8.5 12.5 11 15l4.5-5\", key: \"b\" })\n ];\n }\n if (input.kind === \"agent-session\") {\n return [\n React.createElement(\"path\", {\n d: \"M6 9.5a5 5 0 0 1 5-5h2a5 5 0 0 1 5 5v2.5a5 5 0 0 1-5 5h-1.5L8 19v-2.4A5 5 0 0 1 6 12z\",\n key: \"a\"\n })\n ];\n }\n if (\n input.kind === \"file\" ||\n input.kind === \"agent-generated-file\" ||\n input.fileVisualKind != null\n ) {\n if (input.fileVisualKind === \"folder\" || input.fileVisualKind === \"back\") {\n return [\n React.createElement(\"path\", {\n d: \"M3.5 7.5h6l2 2h9v8a2 2 0 0 1-2 2h-13a2 2 0 0 1-2-2z\",\n key: \"a\"\n })\n ];\n }\n if (input.fileVisualKind === \"image\") {\n return [\n React.createElement(\"rect\", {\n height: 14,\n key: \"a\",\n rx: 2,\n width: 16,\n x: 4,\n y: 5\n }),\n React.createElement(\"path\", {\n d: \"m7 16 3.5-3.5 2.5 2.5 2-2 2 3\",\n key: \"b\"\n }),\n React.createElement(\"circle\", { cx: 9, cy: 9, key: \"c\", r: 1 })\n ];\n }\n if (input.fileVisualKind === \"video\") {\n return [\n React.createElement(\"rect\", {\n height: 14,\n key: \"a\",\n rx: 2,\n width: 16,\n x: 4,\n y: 5\n }),\n React.createElement(\"path\", {\n d: \"m10 9 5 3-5 3z\",\n key: \"b\"\n })\n ];\n }\n return [\n React.createElement(\"path\", {\n d: \"M7 3.5h7l4 4V20a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V4.5a1 1 0 0 1 1-1z\",\n key: \"a\"\n }),\n React.createElement(\"path\", { d: \"M14 3.5v4h4\", key: \"b\" })\n ];\n }\n return [\n React.createElement(\"path\", {\n d: \"M9.5 14.5 14.5 9.5\",\n key: \"a\"\n }),\n React.createElement(\"path\", {\n d: \"M8.5 10.5 7 12a3.5 3.5 0 0 0 5 5l1.5-1.5\",\n key: \"b\"\n }),\n React.createElement(\"path\", {\n d: \"M15.5 13.5 17 12a3.5 3.5 0 0 0-5-5l-1.5 1.5\",\n key: \"c\"\n })\n ];\n}\n","import type { ReactNode } from \"react\";\nimport {\n resolveMentionFileThumbnailUrl,\n resolveMentionFileVisualKind,\n type MentionFileVisualKind\n} from \"./mentionFileVisualKind.ts\";\nimport {\n renderMentionReferenceLeading,\n type MentionReferenceProviderKind\n} from \"./mentionReferenceIcon.ts\";\nimport type {\n MentionRowItem,\n MentionRowPlainItem,\n MentionRowStatusTag\n} from \"./mentionRowTypes.ts\";\nimport type {\n MentionRowStatusTone,\n MentionRowStatusVariant\n} from \"./mentionStatusTone.ts\";\nimport type {\n RichTextMentionPresentation,\n RichTextTriggerQueryMatch\n} from \"../types/index.ts\";\n\nexport type MentionTriggerRowProviderId =\n | \"agent-generated-file\"\n | \"agent-session\"\n | \"file\"\n | \"workspace-app\"\n | \"workspace-issue\";\n\nexport interface MentionTriggerRowLeadingContext<\n TMatch extends RichTextTriggerQueryMatch = RichTextTriggerQueryMatch\n> {\n description: string | null;\n fileVisualKind?: MentionFileVisualKind;\n iconUrl: string | null;\n label: string;\n match: TMatch;\n providerKind: MentionReferenceProviderKind;\n thumbnailUrl: string | null;\n}\n\nexport interface MentionTriggerRowItemOptions<\n TMatch extends RichTextTriggerQueryMatch = RichTextTriggerQueryMatch\n> {\n getAgentIconUrl?: (match: TMatch) => string | null | undefined;\n getChildCountLabel?: (match: TMatch) => string | null | undefined;\n getDescription?: (match: TMatch) => string | null | undefined;\n getFileEntryKind?: (match: TMatch) => string | null | undefined;\n getFileMentionNavigation?: (match: TMatch) => string | null | undefined;\n getFileThumbnailUrl?: (match: TMatch) => string | null | undefined;\n getFileVisualKind?: (\n match: TMatch\n ) => MentionFileVisualKind | null | undefined;\n getStatusTag?: (\n match: TMatch,\n variant: MentionRowStatusVariant\n ) => MentionRowStatusTag | null | undefined;\n getUserAvatarPlaceholderUrl?: (match: TMatch) => string | null | undefined;\n getUserAvatarUrl?: (match: TMatch) => string | null | undefined;\n getWorkspaceAppIconFallbackUrl?: (match: TMatch) => string | null | undefined;\n renderLeading?: (\n context: MentionTriggerRowLeadingContext<TMatch>\n ) => ReactNode | undefined;\n}\n\nconst SUPPORTED_MENTION_TRIGGER_ROW_PROVIDER_IDS = new Set<string>([\n \"agent-generated-file\",\n \"agent-session\",\n \"file\",\n \"workspace-app\",\n \"workspace-issue\"\n]);\n\nexport function richTextTriggerQueryMatchToMentionRowItem<\n TMatch extends RichTextTriggerQueryMatch = RichTextTriggerQueryMatch\n>(\n match: TMatch,\n options: MentionTriggerRowItemOptions<TMatch> = {}\n): MentionRowItem {\n const presentation = mentionPresentation(match);\n const label = resolveMentionRowLabel(match);\n const description = resolveMentionRowDescription(match, options);\n const providerKind = mentionReferenceProviderKind(match.providerId);\n const iconUrl = resolveMentionRowIconUrl(match, presentation, options);\n const thumbnailUrl = resolveMentionRowThumbnailUrl(\n match,\n presentation,\n options\n );\n const fileVisualKind = isFileMentionProvider(match.providerId)\n ? resolveMentionRowFileVisualKind(match, options)\n : undefined;\n const customLeading = options.renderLeading?.({\n description,\n fileVisualKind,\n iconUrl,\n label,\n match,\n providerKind,\n thumbnailUrl\n });\n\n if (customLeading !== undefined) {\n return mentionRowPlainItem({\n description,\n label,\n leading: customLeading\n });\n }\n\n if (match.providerId === \"workspace-app\") {\n return {\n kind: \"app\",\n description,\n iconUrl,\n name: label\n };\n }\n\n if (match.providerId === \"workspace-issue\") {\n return {\n kind: \"issue\",\n creatorName: description,\n statusTag: resolveMentionRowStatusTag(match, \"issue\", options),\n title: label\n };\n }\n\n if (isFileMentionProvider(match.providerId)) {\n const entryKind = resolveFileEntryKind(match, options);\n const mentionNavigation = resolveFileMentionNavigation(match, options);\n const visualKind = fileVisualKind ?? \"document\";\n return {\n kind: \"file\",\n childCountLabel: normalizedText(options.getChildCountLabel?.(match)),\n entryKind,\n mentionNavigation,\n name: label,\n thumbnailUrl:\n resolveMentionFileThumbnailUrl({\n thumbnailUrl,\n visualKind\n }) ?? null,\n visualKind\n };\n }\n\n if (match.providerId === \"agent-session\") {\n const session = agentSessionMentionRowItem(match, {\n description,\n iconUrl,\n options,\n presentation\n });\n if (session) {\n return session;\n }\n }\n\n return mentionRowPlainItem({\n description,\n label,\n leading: renderMentionReferenceLeading({\n fileVisualKind,\n iconUrl,\n kind: providerKind,\n label,\n thumbnailUrl\n })\n });\n}\n\nexport function isMentionTriggerRowProviderId(\n providerId: string\n): providerId is MentionTriggerRowProviderId {\n return SUPPORTED_MENTION_TRIGGER_ROW_PROVIDER_IDS.has(providerId);\n}\n\nexport function workspaceAppIconFallbackUrlFromTriggerMatch(\n match: RichTextTriggerQueryMatch\n): string | null {\n const appId = mentionEntityId(match) || match.key.trim();\n if (!appId) {\n return null;\n }\n return `tutti://workspace-apps/${encodeURIComponent(appId)}/icon.png`;\n}\n\nexport function mentionRowStatusTagFromPresentation(\n match: RichTextTriggerQueryMatch,\n input: {\n tone?: MentionRowStatusTone;\n variant: MentionRowStatusVariant;\n }\n): MentionRowStatusTag | null {\n const presentation = mentionPresentation(match);\n const label = normalizedText(presentation?.statusLabel);\n if (!label) {\n return null;\n }\n const dataStatus =\n normalizedText(presentation?.statusDataStatus) ??\n normalizedText(presentation?.status);\n return {\n dataStatus: dataStatus ?? undefined,\n label,\n pulse: presentation?.statusPulse === \"true\",\n tone: input.tone ?? \"neutral\",\n variant: input.variant\n };\n}\n\nfunction agentSessionMentionRowItem<TMatch extends RichTextTriggerQueryMatch>(\n match: TMatch,\n input: {\n description: string | null;\n iconUrl: string | null;\n options: MentionTriggerRowItemOptions<TMatch>;\n presentation: RichTextMentionPresentation | null;\n }\n): MentionRowItem | null {\n const agentIconUrl =\n normalizedText(input.options.getAgentIconUrl?.(match)) ??\n normalizedText(input.presentation?.agentIconUrl) ??\n input.iconUrl;\n const userAvatarPlaceholderUrl =\n normalizedText(input.options.getUserAvatarPlaceholderUrl?.(match)) ??\n normalizedText(input.presentation?.userAvatarPlaceholderUrl);\n if (!agentIconUrl || !userAvatarPlaceholderUrl) {\n return null;\n }\n return {\n kind: \"session\",\n agentIconUrl,\n participant:\n normalizedText(input.presentation?.participant) ??\n resolveMentionRowLabel(match),\n statusTag: resolveMentionRowStatusTag(match, \"activity\", input.options),\n summary: input.description,\n userAvatarPlaceholderUrl,\n userAvatarUrl:\n normalizedText(input.options.getUserAvatarUrl?.(match)) ?? null\n };\n}\n\nfunction mentionRowPlainItem(input: {\n description: string | null;\n label: string;\n leading?: ReactNode;\n}): MentionRowPlainItem {\n return {\n kind: \"plain\",\n description: input.description,\n label: input.label,\n leading: input.leading\n };\n}\n\nfunction resolveMentionRowLabel(match: RichTextTriggerQueryMatch): string {\n return (\n normalizedText(\n match.insertResult.kind === \"mention\"\n ? match.insertResult.mention.label\n : match.insertResult.kind === \"markdown-link\"\n ? match.insertResult.label\n : undefined\n ) ??\n normalizedText(match.label) ??\n match.key\n );\n}\n\nfunction resolveMentionRowDescription<TMatch extends RichTextTriggerQueryMatch>(\n match: TMatch,\n options: Pick<MentionTriggerRowItemOptions<TMatch>, \"getDescription\">\n): string | null {\n const presentation = mentionPresentation(match);\n return (\n normalizedText(options.getDescription?.(match)) ??\n normalizedText(presentation?.description) ??\n normalizedText(presentation?.subtitle) ??\n normalizedText(match.subtitle) ??\n null\n );\n}\n\nfunction resolveMentionRowIconUrl<TMatch extends RichTextTriggerQueryMatch>(\n match: TMatch,\n presentation: RichTextMentionPresentation | null,\n options: Pick<\n MentionTriggerRowItemOptions<TMatch>,\n \"getWorkspaceAppIconFallbackUrl\"\n >\n): string | null {\n return (\n normalizedText(presentation?.iconUrl) ??\n normalizedText(match.iconUrl) ??\n (match.providerId === \"workspace-app\"\n ? (normalizedText(options.getWorkspaceAppIconFallbackUrl?.(match)) ??\n workspaceAppIconFallbackUrlFromTriggerMatch(match))\n : null) ??\n null\n );\n}\n\nfunction resolveMentionRowThumbnailUrl<\n TMatch extends RichTextTriggerQueryMatch\n>(\n match: TMatch,\n presentation: RichTextMentionPresentation | null,\n options: Pick<MentionTriggerRowItemOptions<TMatch>, \"getFileThumbnailUrl\">\n): string | null {\n return (\n normalizedText(options.getFileThumbnailUrl?.(match)) ??\n normalizedText(presentation?.thumbnailUrl) ??\n normalizedText(readStringProperty(match.item, \"thumbnailUrl\")) ??\n (isFileMentionProvider(match.providerId)\n ? normalizedText(match.iconUrl)\n : null) ??\n null\n );\n}\n\nfunction resolveMentionRowFileVisualKind<\n TMatch extends RichTextTriggerQueryMatch\n>(\n match: TMatch,\n options: Pick<\n MentionTriggerRowItemOptions<TMatch>,\n \"getFileEntryKind\" | \"getFileMentionNavigation\" | \"getFileVisualKind\"\n >\n): MentionFileVisualKind {\n const override = options.getFileVisualKind?.(match);\n if (override) {\n return override;\n }\n return resolveMentionFileVisualKind({\n baseVisualKind: inferMentionFileVisualKind(\n markdownLinkHref(match) ??\n normalizedText(match.subtitle) ??\n normalizedText(match.label) ??\n match.key\n ),\n entryKind: resolveFileEntryKind(match, options),\n mentionNavigation: resolveFileMentionNavigation(match, options)\n });\n}\n\nfunction resolveMentionRowStatusTag<TMatch extends RichTextTriggerQueryMatch>(\n match: TMatch,\n variant: MentionRowStatusVariant,\n options: Pick<MentionTriggerRowItemOptions<TMatch>, \"getStatusTag\">\n): MentionRowStatusTag | null {\n return (\n options.getStatusTag?.(match, variant) ??\n mentionRowStatusTagFromPresentation(match, { variant })\n );\n}\n\nfunction resolveFileEntryKind<TMatch extends RichTextTriggerQueryMatch>(\n match: TMatch,\n options: Pick<MentionTriggerRowItemOptions<TMatch>, \"getFileEntryKind\">\n): string | null {\n return (\n normalizedText(options.getFileEntryKind?.(match)) ??\n normalizedText(readStringProperty(match.item, \"entryKind\")) ??\n normalizedText(readStringProperty(match.item, \"kind\")) ??\n null\n );\n}\n\nfunction resolveFileMentionNavigation<TMatch extends RichTextTriggerQueryMatch>(\n match: TMatch,\n options: Pick<\n MentionTriggerRowItemOptions<TMatch>,\n \"getFileMentionNavigation\"\n >\n): string | null {\n return (\n normalizedText(options.getFileMentionNavigation?.(match)) ??\n normalizedText(readStringProperty(match.item, \"mentionNavigation\")) ??\n null\n );\n}\n\nfunction mentionReferenceProviderKind(\n providerId: string\n): MentionReferenceProviderKind {\n if (providerId === \"workspace-app\") {\n return \"workspace-app\";\n }\n if (providerId === \"workspace-issue\") {\n return \"workspace-issue\";\n }\n if (providerId === \"agent-session\") {\n return \"agent-session\";\n }\n if (providerId === \"agent-generated-file\") {\n return \"agent-generated-file\";\n }\n if (providerId === \"file\") {\n return \"file\";\n }\n return \"generic\";\n}\n\nfunction isFileMentionProvider(providerId: string): boolean {\n return providerId === \"file\" || providerId === \"agent-generated-file\";\n}\n\nfunction mentionPresentation(\n match: RichTextTriggerQueryMatch\n): RichTextMentionPresentation | null {\n return match.insertResult.kind === \"mention\"\n ? (match.insertResult.mention.presentation ?? null)\n : null;\n}\n\nfunction mentionEntityId(match: RichTextTriggerQueryMatch): string | null {\n return match.insertResult.kind === \"mention\"\n ? (normalizedText(match.insertResult.mention.entityId) ?? null)\n : null;\n}\n\nfunction markdownLinkHref(match: RichTextTriggerQueryMatch): string | null {\n return match.insertResult.kind === \"markdown-link\"\n ? (normalizedText(match.insertResult.href) ?? null)\n : null;\n}\n\nfunction inferMentionFileVisualKind(pathOrName: string): MentionFileVisualKind {\n const normalized = pathOrName.trim().toLowerCase();\n if (!normalized) {\n return \"document\";\n }\n if (normalized.endsWith(\"/\")) {\n return \"folder\";\n }\n const extension = normalized.match(/\\.([a-z0-9]+)(?:[?#].*)?$/)?.[1] ?? \"\";\n if (\n [\"apng\", \"avif\", \"gif\", \"jpeg\", \"jpg\", \"png\", \"svg\", \"webp\"].includes(\n extension\n )\n ) {\n return \"image\";\n }\n if ([\"avi\", \"m4v\", \"mkv\", \"mov\", \"mp4\", \"webm\"].includes(extension)) {\n return \"video\";\n }\n if ([\"markdown\", \"md\", \"mdx\"].includes(extension)) {\n return \"markdown\";\n }\n if (\n [\n \"c\",\n \"cpp\",\n \"css\",\n \"go\",\n \"h\",\n \"hpp\",\n \"html\",\n \"java\",\n \"js\",\n \"jsx\",\n \"json\",\n \"kt\",\n \"php\",\n \"py\",\n \"rb\",\n \"rs\",\n \"sh\",\n \"sql\",\n \"swift\",\n \"toml\",\n \"ts\",\n \"tsx\",\n \"xml\",\n \"yaml\",\n \"yml\"\n ].includes(extension)\n ) {\n return \"code\";\n }\n return \"document\";\n}\n\nfunction readStringProperty(value: unknown, key: string): string | undefined {\n if (value === null || typeof value !== \"object\") {\n return undefined;\n }\n const record = value as Readonly<Record<string, unknown>>;\n return typeof record[key] === \"string\" ? record[key] : undefined;\n}\n\nfunction normalizedText(value: string | null | undefined): string | null {\n const normalized = value?.trim() ?? \"\";\n return normalized || null;\n}\n","export interface AtPanelKeyboardActions {\n moveSelection: (delta: 1 | -1) => void;\n commitSelection: () => void;\n close: () => void;\n cycleFilter?: (delta: 1 | -1) => void;\n navigateHierarchy?: (delta: 1 | -1) => boolean;\n}\n\nexport interface AtPanelKeyboardEventLike {\n key: string;\n shiftKey?: boolean;\n preventDefault: () => void;\n}\n\nexport function makeAtPanelKeyDown(actions: AtPanelKeyboardActions) {\n return (event: AtPanelKeyboardEventLike): boolean => {\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n actions.moveSelection(1);\n return true;\n }\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n actions.moveSelection(-1);\n return true;\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n actions.close();\n return true;\n }\n if (event.key === \"Tab\" && actions.cycleFilter) {\n event.preventDefault();\n actions.cycleFilter(event.shiftKey ? -1 : 1);\n return true;\n }\n if (event.key === \"ArrowRight\" && actions.navigateHierarchy) {\n if (actions.navigateHierarchy(1)) {\n event.preventDefault();\n return true;\n }\n return false;\n }\n if (event.key === \"ArrowLeft\" && actions.navigateHierarchy) {\n if (actions.navigateHierarchy(-1)) {\n event.preventDefault();\n return true;\n }\n return false;\n }\n if (event.key === \"Enter\") {\n event.preventDefault();\n actions.commitSelection();\n return true;\n }\n return false;\n };\n}\n\nexport function useAtPanelKeyboard(actions: AtPanelKeyboardActions) {\n return makeAtPanelKeyDown(actions);\n}\n"],"mappings":"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","names":["useEffect","useRef","useState","cn","jsx","cn","useRef","useState","useEffect","jsx","jsx","jsxs","cn","Fragment","jsx","jsxs","cn"]}
|
|
1
|
+
{"version":3,"sources":["../../src/at-panel/MentionPalette.tsx","../../src/at-panel/mentionPaletteScrollbar.tsx","../../src/at-panel/mentionPaletteStateAdapter.ts","../../src/at-panel/MentionPaletteFromState.tsx","../../src/at-panel/MentionPaletteControls.tsx","../../src/at-panel/MentionRow.tsx","../../src/at-panel/mentionRowDataAttributes.ts","../../src/at-panel/mentionReferenceIcon.ts","../../src/at-panel/mentionTriggerRowItem.ts","../../src/at-panel/useAtPanelKeyboard.ts"],"sourcesContent":["import {\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type JSX,\n type MutableRefObject,\n type ReactNode\n} from \"react\";\nimport {\n FolderFailedFilledIcon,\n KeyboardFilledIcon\n} from \"@tutti-os/ui-system/icons\";\nimport { UnderlineTabs } from \"@tutti-os/ui-system/components\";\nimport { cn } from \"@tutti-os/ui-system/utils\";\nimport { flattenMentionPaletteEntries } from \"./mentionPaletteEntries.ts\";\nimport { MentionPaletteScrollbar } from \"./mentionPaletteScrollbar.tsx\";\nimport type {\n MentionPaletteGroup,\n MentionPaletteProps,\n MentionPaletteState,\n MentionPaletteTheme\n} from \"./mentionPaletteTypes.ts\";\nimport \"./mentionPalette.css\";\n\nconst DEFAULT_THEME = {\n classNames: {\n palette: \"rich-text-at-mention-palette\",\n header: \"rich-text-at-mention-palette-header\",\n footer: \"rich-text-at-mention-palette-footer\",\n tabs: \"rich-text-at-mention-palette-tabs\",\n scrollRegion: \"rich-text-at-mention-palette-scroll-region\",\n scrollbar: \"rich-text-at-mention-palette-scrollbar\",\n scrollbarThumb: \"rich-text-at-mention-palette-scrollbar-thumb\",\n hint: \"rich-text-at-mention-palette-hint\",\n hintItem: \"rich-text-at-mention-palette-hint-item\",\n hintButton: \"rich-text-at-mention-palette-hint-button\",\n hintSeparator: \"rich-text-at-mention-palette-hint-separator\",\n shortcut: \"rich-text-at-mention-palette-shortcut\",\n shortcutArrow: \"rich-text-at-mention-palette-shortcut--arrow\",\n shortcutButton: \"rich-text-at-mention-palette-shortcut-button\",\n shortcutGroup: \"rich-text-at-mention-palette-shortcut-group\"\n },\n testIds: {\n emptyState: \"rich-text-at-mention-palette-empty-state\",\n hint: \"rich-text-at-mention-palette-hint\",\n scrollbar: \"rich-text-at-mention-palette-scrollbar\",\n loadingSpinner: \"rich-text-at-mention-loading-spinner\"\n },\n groupDividerAttribute: \"data-rich-text-at-mention-group-divider\"\n} as const;\n\ninterface ResolvedMentionPaletteTheme {\n classNames: Required<NonNullable<MentionPaletteTheme[\"classNames\"]>>;\n testIds: Required<NonNullable<MentionPaletteTheme[\"testIds\"]>>;\n groupDividerAttribute: string;\n}\n\nfunction resolveMentionPaletteTheme(\n theme: MentionPaletteTheme | undefined\n): ResolvedMentionPaletteTheme {\n return {\n classNames: { ...DEFAULT_THEME.classNames, ...theme?.classNames },\n testIds: { ...DEFAULT_THEME.testIds, ...theme?.testIds },\n groupDividerAttribute:\n theme?.groupDividerAttribute ?? DEFAULT_THEME.groupDividerAttribute\n };\n}\n\nfunction mentionPaletteRootClassName(\n theme: ResolvedMentionPaletteTheme\n): string {\n return cn(\n DEFAULT_THEME.classNames.palette,\n theme.classNames.palette,\n paletteStyles.palette\n );\n}\n\nconst paletteStyles = {\n palette: \"rich-text-at-mention-palette__shell\",\n header: \"rich-text-at-mention-palette__header\",\n footer: \"rich-text-at-mention-palette__footer\",\n scrollShell: \"rich-text-at-mention-palette__scroll-shell\",\n scrollBody: \"rich-text-at-mention-palette__scroll-body\",\n groups: \"rich-text-at-mention-palette__groups\",\n group: \"rich-text-at-mention-palette__group\",\n groupDivider: \"rich-text-at-mention-palette__group-divider\",\n groupLabel: \"rich-text-at-mention-palette__group-label\",\n groupItems: \"rich-text-at-mention-palette__group-items\",\n groupEmpty: \"rich-text-at-mention-palette__group-empty\",\n rowButton: \"rich-text-at-mention-palette__row-button\",\n expandButton: \"rich-text-at-mention-palette__expand-button\",\n emptyState: \"rich-text-at-mention-palette__empty-state\",\n emptyStateInner: \"rich-text-at-mention-palette__empty-state-inner\",\n emptyStateIcon: \"rich-text-at-mention-palette__empty-state-icon\",\n emptyStateText: \"rich-text-at-mention-palette__empty-state-text\",\n loading: \"rich-text-at-mention-palette__loading\",\n loadingSpinner: \"rich-text-at-mention-palette__loading-spinner\"\n} as const;\n\nconst MENTION_PALETTE_LOADING_MIN_VISIBLE_MS = 320;\n\nexport function MentionPalette<TItem>(\n props: MentionPaletteProps<TItem>\n): JSX.Element {\n \"use memo\";\n const {\n state,\n highlightedKey,\n getItemKey,\n renderItem,\n labels,\n hintLabels,\n maxHeightPx,\n onHighlightChange,\n onSelectItem,\n onSelectCategory,\n onSelectFilter,\n onExpandGroup,\n onCycleFilter,\n onMoveSelection,\n onNavigateHierarchy,\n renderListFooter,\n loadingBanner,\n scrollHighlightedIntoViewCentered = false,\n theme: themeProp\n } = props;\n const theme = resolveMentionPaletteTheme(themeProp);\n\n const highlightedOptionRef = useRef<HTMLButtonElement | null>(null);\n const scrollBodyRef = useRef<HTMLDivElement | null>(null);\n const loadingVisibleUntilRef = useRef(0);\n const loadingHideTimerRef = useRef<ReturnType<typeof setTimeout> | null>(\n null\n );\n const [loadingIndicatorVisible, setLoadingIndicatorVisible] = useState(\n state.status === \"loading\"\n );\n\n const interactiveEntries = flattenMentionPaletteEntries(\n state,\n (item, groupId) => getItemKey(item, findGroup(state.groups, groupId))\n );\n const hasInteractiveEntries = interactiveEntries.some(\n (entry) => entry.type === \"item\" || entry.type === \"expand\"\n );\n\n const showLoadingState =\n loadingIndicatorVisible &&\n (!hasInteractiveEntries || state.mode === \"browse\");\n const showLoadingBanner =\n Boolean(loadingBanner) &&\n loadingIndicatorVisible &&\n hasInteractiveEntries &&\n state.mode === \"results\";\n\n useEffect(() => {\n const highlightedElement = highlightedOptionRef.current;\n if (!highlightedElement) {\n return;\n }\n const scrollContainer = scrollBodyRef.current;\n if (!scrollContainer || !scrollContainer.contains(highlightedElement)) {\n highlightedElement.scrollIntoView({ block: \"nearest\" });\n return;\n }\n if (scrollHighlightedIntoViewCentered) {\n centerElementInScrollContainer(scrollContainer, highlightedElement);\n return;\n }\n scrollElementIntoScrollContainerNearest(\n scrollContainer,\n highlightedElement\n );\n }, [highlightedKey, scrollHighlightedIntoViewCentered]);\n\n useEffect(() => {\n if (loadingHideTimerRef.current !== null) {\n clearTimeout(loadingHideTimerRef.current);\n loadingHideTimerRef.current = null;\n }\n\n if (state.status === \"loading\") {\n loadingVisibleUntilRef.current =\n Date.now() + MENTION_PALETTE_LOADING_MIN_VISIBLE_MS;\n setLoadingIndicatorVisible(true);\n return;\n }\n\n const remainingMs = loadingVisibleUntilRef.current - Date.now();\n if (remainingMs <= 0) {\n setLoadingIndicatorVisible(false);\n return;\n }\n\n loadingHideTimerRef.current = setTimeout(() => {\n loadingHideTimerRef.current = null;\n setLoadingIndicatorVisible(false);\n }, remainingMs);\n\n return () => {\n if (loadingHideTimerRef.current !== null) {\n clearTimeout(loadingHideTimerRef.current);\n loadingHideTimerRef.current = null;\n }\n };\n }, [state.status]);\n\n const paletteMaxHeightStyle: CSSProperties | undefined =\n maxHeightPx > 0 ? { maxHeight: `${maxHeightPx}px` } : undefined;\n\n if (state.status === \"error\") {\n return (\n <div\n className={mentionPaletteRootClassName(theme)}\n style={paletteMaxHeightStyle}\n role=\"listbox\"\n aria-label={labels.listbox ?? labels.tabHint}\n >\n <MentionPaletteEmptyState\n icon=\"folder-failed\"\n label={labels.error}\n testId={theme.testIds.emptyState}\n />\n </div>\n );\n }\n\n const isBrowse = state.mode === \"browse\";\n\n let body: ReactNode;\n if (showLoadingState) {\n body = (\n <MentionPaletteLoading\n label={labels.loading}\n spinnerTestId={theme.testIds.loadingSpinner}\n />\n );\n } else if (state.groups.length === 0) {\n body = (\n <MentionPaletteEmptyState\n icon={isBrowse ? \"keyboard\" : \"folder-failed\"}\n label={labels.empty}\n testId={theme.testIds.emptyState}\n />\n );\n } else {\n body = (\n <MentionPaletteGroups\n state={state}\n highlightedKey={highlightedKey}\n highlightedOptionRef={highlightedOptionRef}\n getItemKey={getItemKey}\n renderItem={renderItem}\n onHighlightChange={onHighlightChange}\n onSelectItem={onSelectItem}\n onExpandGroup={onExpandGroup}\n renderListFooter={renderListFooter}\n groupDividerAttribute={theme.groupDividerAttribute}\n />\n );\n }\n\n return (\n <div\n className={mentionPaletteRootClassName(theme)}\n style={paletteMaxHeightStyle}\n role=\"listbox\"\n aria-label={labels.listbox ?? labels.tabHint}\n >\n <div className={cn(theme.classNames.header, paletteStyles.header)}>\n <UnderlineTabs\n tabs={state.categories.map((category) => ({\n value: category.id,\n label: category.label\n }))}\n value={state.filter}\n onValueChange={isBrowse ? onSelectCategory : onSelectFilter}\n className={theme.classNames.tabs}\n preventMouseDownDefault\n />\n {showLoadingBanner ? loadingBanner : null}\n </div>\n <div className={paletteStyles.scrollShell}>\n <div\n ref={scrollBodyRef}\n className={cn(\n theme.classNames.scrollRegion,\n paletteStyles.scrollBody\n )}\n >\n {body}\n </div>\n <MentionPaletteScrollbar\n scrollBodyRef={scrollBodyRef}\n className={theme.classNames.scrollbar}\n thumbClassName={theme.classNames.scrollbarThumb}\n testId={theme.testIds.scrollbar}\n />\n </div>\n <div className={cn(theme.classNames.footer, paletteStyles.footer)}>\n <MentionPaletteHint\n ariaLabel={labels.tabHint}\n cycleFilterLabel={hintLabels.cycleFilter}\n moveSelectionLabel={hintLabels.moveSelection}\n navigateHierarchyLabel={hintLabels.navigateHierarchy}\n onCycleFilter={onCycleFilter}\n onMoveSelection={onMoveSelection}\n onNavigateHierarchy={onNavigateHierarchy}\n classNames={theme.classNames}\n testId={theme.testIds.hint}\n />\n </div>\n </div>\n );\n}\n\nfunction centerElementInScrollContainer(\n container: HTMLElement,\n element: HTMLElement\n): void {\n const containerRect = container.getBoundingClientRect();\n const elementRect = element.getBoundingClientRect();\n const currentScrollTop = container.scrollTop;\n const elementTop = elementRect.top - containerRect.top + currentScrollTop;\n const centeredScrollTop =\n elementTop - (container.clientHeight - elementRect.height) / 2;\n const maxScrollTop = Math.max(\n 0,\n container.scrollHeight - container.clientHeight\n );\n const nextScrollTop = Math.min(Math.max(0, centeredScrollTop), maxScrollTop);\n container.scrollTo({ top: nextScrollTop, behavior: \"auto\" });\n}\n\nfunction scrollElementIntoScrollContainerNearest(\n container: HTMLElement,\n element: HTMLElement\n): void {\n const containerRect = container.getBoundingClientRect();\n const elementRect = element.getBoundingClientRect();\n let nextScrollTop = container.scrollTop;\n\n if (elementRect.top < containerRect.top) {\n nextScrollTop -= containerRect.top - elementRect.top;\n } else if (elementRect.bottom > containerRect.bottom) {\n nextScrollTop += elementRect.bottom - containerRect.bottom;\n } else {\n return;\n }\n\n const maxScrollTop = Math.max(\n 0,\n container.scrollHeight - container.clientHeight\n );\n container.scrollTo({\n top: Math.min(Math.max(0, nextScrollTop), maxScrollTop),\n behavior: \"auto\"\n });\n}\n\nfunction findGroup<TItem>(\n groups: MentionPaletteState<TItem>[\"groups\"],\n groupId: string\n): MentionPaletteGroup<TItem> {\n const group = groups.find((candidate) => candidate.id === groupId);\n if (!group) {\n throw new Error(`MentionPalette: unknown group id \"${groupId}\"`);\n }\n return group;\n}\n\nfunction MentionPaletteGroups<TItem>({\n state,\n highlightedKey,\n highlightedOptionRef,\n getItemKey,\n renderItem,\n onHighlightChange,\n onSelectItem,\n onExpandGroup,\n renderListFooter,\n groupDividerAttribute\n}: {\n state: MentionPaletteState<TItem>;\n highlightedKey: string | null;\n highlightedOptionRef: MutableRefObject<HTMLButtonElement | null>;\n getItemKey: (item: TItem, group: MentionPaletteGroup<TItem>) => string;\n renderItem: (item: TItem, ctx: { active: boolean }) => ReactNode;\n onHighlightChange: (key: string) => void;\n onSelectItem: (item: TItem, group: MentionPaletteGroup<TItem>) => void;\n onExpandGroup: (groupId: string) => void;\n renderListFooter?: () => ReactNode;\n groupDividerAttribute: string;\n}): JSX.Element {\n return (\n <div className={paletteStyles.groups}>\n {state.groups.map((group, index) => {\n const showGroupDivider = index > 0 && !group.hideTopDivider;\n return (\n <section\n key={group.id}\n className={cn(paletteStyles.group, group.sectionClassName)}\n >\n {showGroupDivider ? (\n <div\n className={paletteStyles.groupDivider}\n {...{ [groupDividerAttribute]: \"true\" }}\n aria-hidden=\"true\"\n />\n ) : null}\n {group.label ? (\n <div className={paletteStyles.groupLabel}>{group.label}</div>\n ) : null}\n <div className={paletteStyles.groupItems}>\n {group.items.length === 0 && group.emptyLabel ? (\n <div className={paletteStyles.groupEmpty}>\n {group.emptyLabel}\n </div>\n ) : null}\n {group.items.map((item) => {\n const entryKey = `${group.id}:${getItemKey(item, group)}`;\n const isHighlighted = entryKey === highlightedKey;\n return (\n <button\n key={entryKey}\n ref={isHighlighted ? highlightedOptionRef : null}\n type=\"button\"\n className={paletteStyles.rowButton}\n role=\"option\"\n aria-selected={isHighlighted}\n data-highlighted={isHighlighted ? \"\" : undefined}\n onPointerMove={() => {\n if (!isHighlighted) {\n onHighlightChange(entryKey);\n }\n }}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => onSelectItem(item, group)}\n >\n {renderItem(item, { active: isHighlighted })}\n </button>\n );\n })}\n {group.hasMore ? (\n <button\n key={`expand:${group.id}`}\n ref={\n `expand:${group.id}` === highlightedKey\n ? highlightedOptionRef\n : null\n }\n type=\"button\"\n className={paletteStyles.expandButton}\n data-highlighted={\n `expand:${group.id}` === highlightedKey ? \"\" : undefined\n }\n onPointerMove={() => {\n if (`expand:${group.id}` !== highlightedKey) {\n onHighlightChange(`expand:${group.id}`);\n }\n }}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => onExpandGroup(group.id)}\n >\n {group.expandLabel ??\n `+${Math.max(0, group.totalCount - group.visibleCount)}`}\n </button>\n ) : null}\n </div>\n </section>\n );\n })}\n {renderListFooter?.()}\n </div>\n );\n}\n\nfunction MentionPaletteEmptyState({\n icon = \"folder-failed\",\n label,\n testId\n}: {\n icon?: \"folder-failed\" | \"keyboard\";\n label: string;\n testId: string;\n}): JSX.Element {\n \"use memo\";\n const EmptyStateIcon =\n icon === \"keyboard\" ? KeyboardFilledIcon : FolderFailedFilledIcon;\n\n return (\n <div\n className={paletteStyles.emptyState}\n data-empty-state-icon={icon}\n data-testid={testId}\n >\n <div className={paletteStyles.emptyStateInner}>\n <EmptyStateIcon\n className={paletteStyles.emptyStateIcon}\n aria-hidden=\"true\"\n />\n <span className={paletteStyles.emptyStateText}>{label}</span>\n </div>\n </div>\n );\n}\n\nfunction MentionPaletteLoading({\n label,\n spinnerTestId\n}: {\n label: string;\n spinnerTestId: string;\n}): JSX.Element {\n \"use memo\";\n return (\n <div className={paletteStyles.loading}>\n <span\n aria-hidden=\"true\"\n className={paletteStyles.loadingSpinner}\n data-testid={spinnerTestId}\n />\n <span>{label}</span>\n </div>\n );\n}\n\nfunction MentionPaletteHint({\n ariaLabel,\n cycleFilterLabel,\n moveSelectionLabel,\n navigateHierarchyLabel,\n onCycleFilter,\n onMoveSelection,\n onNavigateHierarchy,\n classNames,\n testId\n}: {\n ariaLabel: string;\n cycleFilterLabel: string;\n moveSelectionLabel: string;\n navigateHierarchyLabel?: string;\n onCycleFilter: (delta: 1 | -1) => void;\n onMoveSelection: (delta: 1 | -1) => void;\n onNavigateHierarchy?: (delta: 1 | -1) => void;\n classNames: ResolvedMentionPaletteTheme[\"classNames\"];\n testId: string;\n}): JSX.Element {\n \"use memo\";\n const showHierarchyHints = Boolean(\n navigateHierarchyLabel && onNavigateHierarchy\n );\n return (\n <div\n className={classNames.hint}\n aria-label={ariaLabel}\n data-testid={testId}\n >\n <span className={classNames.hintItem}>\n <span className={classNames.shortcutGroup}>\n <button\n className={cn(classNames.shortcut, classNames.shortcutButton)}\n type=\"button\"\n aria-label={`Tab ${cycleFilterLabel}`}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => onCycleFilter(1)}\n >\n {/* i18n-check-ignore: Keyboard key label. */}\n Tab\n </button>\n {!showHierarchyHints ? (\n <>\n <button\n className={cn(\n classNames.shortcut,\n classNames.shortcutArrow,\n classNames.shortcutButton\n )}\n type=\"button\"\n aria-label={`← ${cycleFilterLabel}`}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => onCycleFilter(-1)}\n >\n ←\n </button>\n <button\n className={cn(\n classNames.shortcut,\n classNames.shortcutArrow,\n classNames.shortcutButton\n )}\n type=\"button\"\n aria-label={`→ ${cycleFilterLabel}`}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => onCycleFilter(1)}\n >\n →\n </button>\n </>\n ) : null}\n </span>\n <span>{cycleFilterLabel}</span>\n </span>\n {showHierarchyHints ? (\n <>\n <span className={classNames.hintSeparator} aria-hidden=\"true\">\n |\n </span>\n <span className={classNames.hintItem}>\n <span className={classNames.shortcutGroup}>\n <button\n className={cn(\n classNames.shortcut,\n classNames.shortcutArrow,\n classNames.shortcutButton\n )}\n type=\"button\"\n aria-label={`← ${navigateHierarchyLabel}`}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => onNavigateHierarchy?.(-1)}\n >\n ←\n </button>\n <button\n className={cn(\n classNames.shortcut,\n classNames.shortcutArrow,\n classNames.shortcutButton\n )}\n type=\"button\"\n aria-label={`→ ${navigateHierarchyLabel}`}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => onNavigateHierarchy?.(1)}\n >\n →\n </button>\n </span>\n <span>{navigateHierarchyLabel}</span>\n </span>\n </>\n ) : null}\n <span className={classNames.hintSeparator} aria-hidden=\"true\">\n |\n </span>\n <span className={classNames.hintItem}>\n <span className={classNames.shortcutGroup}>\n <button\n className={cn(\n classNames.shortcut,\n classNames.shortcutArrow,\n classNames.shortcutButton\n )}\n type=\"button\"\n aria-label={`↑ ${moveSelectionLabel}`}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => onMoveSelection(-1)}\n >\n ↑\n </button>\n <button\n className={cn(\n classNames.shortcut,\n classNames.shortcutArrow,\n classNames.shortcutButton\n )}\n type=\"button\"\n aria-label={`↓ ${moveSelectionLabel}`}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => onMoveSelection(1)}\n >\n ↓\n </button>\n </span>\n <span>{moveSelectionLabel}</span>\n </span>\n </div>\n );\n}\n","import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type JSX,\n type MouseEvent as ReactMouseEvent,\n type RefObject\n} from \"react\";\nimport { cn } from \"@tutti-os/ui-system/utils\";\n\ninterface MentionPaletteScrollbarState {\n scrollable: boolean;\n thumbHeight: number;\n thumbTop: number;\n}\n\ninterface MentionPaletteScrollbarDragState {\n maxScrollTop: number;\n maxThumbTop: number;\n startClientY: number;\n startScrollTop: number;\n}\n\nconst MENTION_PALETTE_SCROLLBAR_MIN_THUMB_HEIGHT = 24;\nconst MENTION_PALETTE_SCROLLBAR_HIDDEN_STATE: MentionPaletteScrollbarState = {\n scrollable: false,\n thumbHeight: 0,\n thumbTop: 0\n};\n\nexport function MentionPaletteScrollbar({\n scrollBodyRef,\n className,\n thumbClassName,\n testId\n}: {\n scrollBodyRef: RefObject<HTMLDivElement | null>;\n className: string;\n thumbClassName: string;\n testId: string;\n}): JSX.Element {\n \"use memo\";\n const trackRef = useRef<HTMLDivElement | null>(null);\n const dragStateRef = useRef<MentionPaletteScrollbarDragState | null>(null);\n const [scrollbarState, setScrollbarState] =\n useState<MentionPaletteScrollbarState>({\n scrollable: false,\n thumbHeight: 0,\n thumbTop: 0\n });\n const [dragging, setDragging] = useState(false);\n\n const hideScrollbar = useCallback((): void => {\n setScrollbarState((previous) =>\n previous.scrollable ||\n previous.thumbHeight !== 0 ||\n previous.thumbTop !== 0\n ? MENTION_PALETTE_SCROLLBAR_HIDDEN_STATE\n : previous\n );\n }, []);\n\n const syncScrollbarState = useCallback((): void => {\n const contentElement = scrollBodyRef.current;\n if (!contentElement) {\n hideScrollbar();\n return;\n }\n\n const { scrollHeight, scrollTop, clientHeight } = contentElement;\n const measuredTrackHeight = trackRef.current?.clientHeight ?? 0;\n const trackHeight =\n measuredTrackHeight > 0 ? measuredTrackHeight : clientHeight;\n const maxScrollTop = Math.max(0, scrollHeight - clientHeight);\n\n if (clientHeight <= 0 || trackHeight <= 0 || maxScrollTop <= 0) {\n hideScrollbar();\n return;\n }\n\n const thumbHeight = Math.max(\n MENTION_PALETTE_SCROLLBAR_MIN_THUMB_HEIGHT,\n Math.round((clientHeight / scrollHeight) * trackHeight)\n );\n const maxThumbTop = Math.max(0, trackHeight - thumbHeight);\n const thumbTop = Math.round((scrollTop / maxScrollTop) * maxThumbTop);\n setScrollbarState((previous) =>\n previous.scrollable &&\n previous.thumbHeight === thumbHeight &&\n previous.thumbTop === thumbTop\n ? previous\n : { scrollable: true, thumbHeight, thumbTop }\n );\n }, [hideScrollbar, scrollBodyRef]);\n\n useEffect(() => {\n const contentElement = scrollBodyRef.current;\n if (!contentElement) {\n hideScrollbar();\n return;\n }\n\n syncScrollbarState();\n contentElement.addEventListener(\"scroll\", syncScrollbarState, {\n passive: true\n });\n const resizeObserver =\n typeof ResizeObserver !== \"undefined\"\n ? new ResizeObserver(syncScrollbarState)\n : null;\n resizeObserver?.observe(contentElement);\n if (trackRef.current) {\n resizeObserver?.observe(trackRef.current);\n }\n const animationFrameId = window.requestAnimationFrame(syncScrollbarState);\n return () => {\n contentElement.removeEventListener(\"scroll\", syncScrollbarState);\n resizeObserver?.disconnect();\n window.cancelAnimationFrame(animationFrameId);\n };\n }, [hideScrollbar, scrollBodyRef, syncScrollbarState]);\n\n useEffect(() => {\n if (!dragging) {\n return;\n }\n\n const handleMouseMove = (event: MouseEvent): void => {\n const contentElement = scrollBodyRef.current;\n const dragState = dragStateRef.current;\n if (!contentElement || !dragState || dragState.maxThumbTop <= 0) {\n return;\n }\n const delta = event.clientY - dragState.startClientY;\n const nextThumbTop =\n (dragState.startScrollTop / dragState.maxScrollTop) *\n dragState.maxThumbTop +\n delta;\n contentElement.scrollTop =\n (Math.min(Math.max(0, nextThumbTop), dragState.maxThumbTop) /\n dragState.maxThumbTop) *\n dragState.maxScrollTop;\n syncScrollbarState();\n };\n\n const handleMouseUp = (): void => {\n dragStateRef.current = null;\n setDragging(false);\n };\n\n window.addEventListener(\"mousemove\", handleMouseMove);\n window.addEventListener(\"mouseup\", handleMouseUp);\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove);\n window.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, [dragging, scrollBodyRef, syncScrollbarState]);\n\n const scrollContentToThumbTop = (thumbTop: number): void => {\n const contentElement = scrollBodyRef.current;\n const trackElement = trackRef.current;\n if (!contentElement || !trackElement) {\n return;\n }\n const maxScrollTop = Math.max(\n 0,\n contentElement.scrollHeight - contentElement.clientHeight\n );\n const maxThumbTop = Math.max(\n 0,\n trackElement.clientHeight - scrollbarState.thumbHeight\n );\n if (maxScrollTop <= 0 || maxThumbTop <= 0) {\n return;\n }\n contentElement.scrollTop =\n (Math.min(Math.max(0, thumbTop), maxThumbTop) / maxThumbTop) *\n maxScrollTop;\n syncScrollbarState();\n };\n\n const handleTrackMouseDown = (\n event: ReactMouseEvent<HTMLDivElement>\n ): void => {\n if (\n event.button !== 0 ||\n !scrollbarState.scrollable ||\n event.target !== event.currentTarget\n ) {\n return;\n }\n event.preventDefault();\n const trackRect = event.currentTarget.getBoundingClientRect();\n scrollContentToThumbTop(\n event.clientY - trackRect.top - scrollbarState.thumbHeight / 2\n );\n };\n\n const handleThumbMouseDown = (\n event: ReactMouseEvent<HTMLDivElement>\n ): void => {\n if (event.button !== 0 || !scrollbarState.scrollable) {\n return;\n }\n const contentElement = scrollBodyRef.current;\n const trackElement = trackRef.current;\n if (!contentElement || !trackElement) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n dragStateRef.current = {\n maxScrollTop: Math.max(\n 0,\n contentElement.scrollHeight - contentElement.clientHeight\n ),\n maxThumbTop: Math.max(\n 0,\n trackElement.clientHeight - scrollbarState.thumbHeight\n ),\n startClientY: event.clientY,\n startScrollTop: contentElement.scrollTop\n };\n setDragging(true);\n };\n\n if (!scrollbarState.scrollable && !dragging) {\n return <div ref={trackRef} className=\"hidden\" aria-hidden=\"true\" />;\n }\n\n return (\n <div\n ref={trackRef}\n className={cn(\"group/status-scrollbar\", className)}\n data-scrollable={scrollbarState.scrollable ? \"true\" : \"false\"}\n data-dragging={dragging ? \"true\" : \"false\"}\n data-testid={testId}\n aria-hidden=\"true\"\n onMouseDown={handleTrackMouseDown}\n >\n <div\n className={thumbClassName}\n onMouseDown={handleThumbMouseDown}\n style={{\n height: `${scrollbarState.thumbHeight}px`,\n transform: `translateY(${scrollbarState.thumbTop}px)`\n }}\n />\n </div>\n );\n}\n","import type {\n MentionPaletteGroup,\n MentionPaletteProps,\n MentionPaletteState\n} from \"./mentionPaletteTypes.ts\";\nimport {\n findMentionPaletteEntry,\n moveMentionPaletteHighlight,\n nextMentionPaletteCategory,\n selectedMentionPaletteItem\n} from \"./mentionPaletteModel.ts\";\n\ntype MentionPaletteCycleCategory =\n | string\n | {\n id: string;\n };\n\nexport interface MentionPaletteStateCallbacks<TItem> {\n onHighlightChange?: (key: string) => void;\n onActiveCategoryIdChange?: (categoryId: string) => void;\n onSelectItem?: (item: TItem) => void;\n onExpandGroup?: (groupId: string) => void;\n}\n\nexport interface MentionPaletteStateAdapterInput<TItem> {\n state: MentionPaletteState<TItem>;\n highlightedKey: string | null;\n /**\n * Optional order used by Tab/Shift+Tab. Defaults to the rendered category\n * order; callers with a surface-specific results-mode tab order can pass it\n * here and keep that policy outside the shell.\n */\n categoryCycleOrder?: readonly MentionPaletteCycleCategory[];\n getItemKey: (item: TItem, groupId: string) => string;\n callbacks?: MentionPaletteStateCallbacks<TItem>;\n}\n\nexport type MentionPaletteStateCommitResult<TItem> =\n | { type: \"none\" }\n | { type: \"category\"; categoryId: string }\n | { type: \"expand\"; groupId: string }\n | { type: \"item\"; item: TItem };\n\nexport interface MentionPaletteStateAdapter<TItem> {\n selectedItem: TItem | null;\n paletteProps: Pick<\n MentionPaletteProps<TItem>,\n | \"state\"\n | \"highlightedKey\"\n | \"getItemKey\"\n | \"onHighlightChange\"\n | \"onSelectItem\"\n | \"onSelectCategory\"\n | \"onSelectFilter\"\n | \"onExpandGroup\"\n | \"onCycleFilter\"\n | \"onMoveSelection\"\n >;\n moveSelection: (delta: 1 | -1) => string | null;\n selectCategory: (categoryId: string) => void;\n expandGroup: (groupId: string) => void;\n cycleCategory: (delta: 1 | -1) => string | null;\n commitHighlighted: () => MentionPaletteStateCommitResult<TItem>;\n}\n\nexport function createMentionPaletteStateAdapter<TItem>(\n input: MentionPaletteStateAdapterInput<TItem>\n): MentionPaletteStateAdapter<TItem> {\n const getPaletteItemKey = (\n item: TItem,\n group: MentionPaletteGroup<TItem>\n ): string => input.getItemKey(item, group.id);\n\n const selectCategory = (categoryId: string): void => {\n input.callbacks?.onActiveCategoryIdChange?.(categoryId);\n };\n\n const expandGroup = (groupId: string): void => {\n input.callbacks?.onExpandGroup?.(groupId);\n };\n\n const moveSelection = (delta: 1 | -1): string | null => {\n const nextKey = moveMentionPaletteHighlight({\n state: input.state,\n currentKey: input.highlightedKey,\n delta,\n getItemKey: input.getItemKey\n });\n if (nextKey !== null) {\n input.callbacks?.onHighlightChange?.(nextKey);\n }\n return nextKey;\n };\n\n const cycleCategory = (delta: 1 | -1): string | null => {\n const cycleCategories = resolveCycleCategories(input.categoryCycleOrder);\n const categories = cycleCategories.length\n ? cycleCategories\n : input.state.categories;\n if (categories.length === 0) {\n return null;\n }\n const nextCategoryId = nextMentionPaletteCategory(\n categories,\n input.state.filter,\n delta\n );\n selectCategory(nextCategoryId);\n return nextCategoryId;\n };\n\n const selectedItem = selectedMentionPaletteItem({\n state: input.state,\n key: input.highlightedKey,\n getItemKey: input.getItemKey\n });\n\n const commitHighlighted = (): MentionPaletteStateCommitResult<TItem> => {\n const activeEntry = findMentionPaletteEntry({\n state: input.state,\n key: input.highlightedKey,\n getItemKey: input.getItemKey\n });\n const fallbackCategoryId = categoryIdFromKey(input.highlightedKey);\n\n if (!activeEntry) {\n if (\n fallbackCategoryId !== null &&\n input.state.categories.some(\n (category) => category.id === fallbackCategoryId\n )\n ) {\n selectCategory(fallbackCategoryId);\n return { type: \"category\", categoryId: fallbackCategoryId };\n }\n return { type: \"none\" };\n }\n\n if (activeEntry.type === \"category\" && activeEntry.categoryId) {\n selectCategory(activeEntry.categoryId);\n return { type: \"category\", categoryId: activeEntry.categoryId };\n }\n\n if (activeEntry.type === \"expand\" && activeEntry.groupId) {\n expandGroup(activeEntry.groupId);\n return { type: \"expand\", groupId: activeEntry.groupId };\n }\n\n if (activeEntry.type === \"item\") {\n const item = selectedMentionPaletteItem({\n state: input.state,\n key: activeEntry.key,\n getItemKey: input.getItemKey\n });\n if (item !== null) {\n input.callbacks?.onSelectItem?.(item);\n return { type: \"item\", item };\n }\n }\n\n return { type: \"none\" };\n };\n\n return {\n selectedItem,\n paletteProps: {\n state: input.state,\n highlightedKey: input.highlightedKey,\n getItemKey: getPaletteItemKey,\n onHighlightChange: (key) => {\n input.callbacks?.onHighlightChange?.(key);\n },\n onSelectItem: (item) => {\n input.callbacks?.onSelectItem?.(item);\n },\n onSelectCategory: selectCategory,\n onSelectFilter: selectCategory,\n onExpandGroup: expandGroup,\n onCycleFilter: cycleCategory,\n onMoveSelection: moveSelection\n },\n moveSelection,\n selectCategory,\n expandGroup,\n cycleCategory,\n commitHighlighted\n };\n}\n\nfunction resolveCycleCategories(\n categories: readonly MentionPaletteCycleCategory[] | undefined\n): readonly { id: string }[] {\n return (\n categories?.map((category) =>\n typeof category === \"string\" ? { id: category } : category\n ) ?? []\n );\n}\n\nfunction categoryIdFromKey(key: string | null): string | null {\n const prefix = \"category:\";\n return key?.startsWith(prefix) ? key.slice(prefix.length) : null;\n}\n","import type { JSX, ReactNode } from \"react\";\nimport { MentionPalette } from \"./MentionPalette.tsx\";\nimport {\n createMentionPaletteStateAdapter,\n type MentionPaletteStateAdapterInput\n} from \"./mentionPaletteStateAdapter.ts\";\nimport type {\n MentionPaletteProps,\n MentionPaletteTheme\n} from \"./mentionPaletteTypes.ts\";\n\nexport interface MentionPaletteFromStateProps<\n TItem\n> extends MentionPaletteStateAdapterInput<TItem> {\n labels: MentionPaletteProps<TItem>[\"labels\"];\n hintLabels: MentionPaletteProps<TItem>[\"hintLabels\"];\n maxHeightPx: number;\n renderItem: (item: TItem, ctx: { active: boolean }) => ReactNode;\n renderListFooter?: () => ReactNode;\n loadingBanner?: ReactNode;\n scrollHighlightedIntoViewCentered?: boolean;\n theme?: MentionPaletteTheme;\n onNavigateHierarchy?: MentionPaletteProps<TItem>[\"onNavigateHierarchy\"];\n}\n\nexport function MentionPaletteFromState<TItem>(\n props: MentionPaletteFromStateProps<TItem>\n): JSX.Element {\n \"use memo\";\n const {\n labels,\n hintLabels,\n maxHeightPx,\n renderItem,\n renderListFooter,\n loadingBanner,\n scrollHighlightedIntoViewCentered,\n theme,\n onNavigateHierarchy,\n ...adapterInput\n } = props;\n const adapter = createMentionPaletteStateAdapter(adapterInput);\n\n return (\n <MentionPalette\n {...adapter.paletteProps}\n labels={labels}\n hintLabels={hintLabels}\n maxHeightPx={maxHeightPx}\n renderItem={renderItem}\n renderListFooter={renderListFooter}\n loadingBanner={loadingBanner}\n scrollHighlightedIntoViewCentered={scrollHighlightedIntoViewCentered}\n theme={theme}\n onNavigateHierarchy={onNavigateHierarchy}\n />\n );\n}\n","import { CheckIcon } from \"@tutti-os/ui-system/icons\";\n\nexport function MentionPaletteSelectIndicator(props: { selected: boolean }) {\n return (\n <span\n aria-hidden=\"true\"\n className=\"rich-text-at-mention-select-indicator\"\n data-selected={props.selected ? \"true\" : \"false\"}\n >\n <CheckIcon size={13} />\n </span>\n );\n}\n\nexport function MentionPaletteMultiSelectFooter(props: {\n count: number;\n countLabel: string;\n cancelLabel: string;\n confirmLabel: string;\n onCancel: () => void;\n onConfirm: () => void;\n}) {\n return (\n <div className=\"rich-text-at-mention-multiselect-footer\">\n <span className=\"rich-text-at-mention-multiselect-footer__count\">\n {props.countLabel}\n </span>\n <div className=\"rich-text-at-mention-multiselect-footer__actions\">\n <button\n type=\"button\"\n className=\"rich-text-at-mention-multiselect-footer__button rich-text-at-mention-multiselect-footer__button--secondary\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={props.onCancel}\n >\n {props.cancelLabel}\n </button>\n <button\n type=\"button\"\n disabled={props.count === 0}\n className=\"rich-text-at-mention-multiselect-footer__button rich-text-at-mention-multiselect-footer__button--primary\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={props.onConfirm}\n >\n {props.confirmLabel}\n </button>\n </div>\n </div>\n );\n}\n","import {\n ArrowLeftIcon,\n Badge,\n FileCodeIcon,\n FileTextIcon,\n FolderIcon,\n ImageFileIcon,\n LocateFolderIcon,\n ProductIcon,\n StatusDot,\n VideoFileIcon,\n cn,\n type IconProps\n} from \"@tutti-os/ui-system\";\nimport type { MentionFileVisualKind } from \"./mentionFileVisualKind.ts\";\nimport {\n mentionRowDataAttribute,\n mentionRowRootDataAttributes,\n type MentionRowDataAttributeMode\n} from \"./mentionRowDataAttributes.ts\";\nimport type {\n MentionRowFileItem,\n MentionRowItem,\n MentionRowSessionItem,\n MentionRowStatusTag\n} from \"./mentionRowTypes.ts\";\nimport { mentionStatusBadgeClassName } from \"./mentionStatusTone.ts\";\n\n/**\n * Default file kind-icon shapes for surfaces that do NOT ship the agent's\n * CSS-masked glyph stylesheet. These mirror the agent's mask glyph shapes\n * (`agentactivity.css`: folder-filled / doc-filled / code-filled / image-filled\n * / video-filled / arrow-left-filled) using ui-system icon components, so a\n * file row renders a real glyph without `agentactivity.css`. The agent composer\n * passes its own `fileIcon` class and keeps rendering masked `<span>` glyphs,\n * except `back` rows which always use {@link ArrowLeftIcon}.\n */\nconst MENTION_FILE_VISUAL_KIND_ICON: Record<\n MentionFileVisualKind,\n (props: IconProps) => React.JSX.Element\n> = {\n back: ArrowLeftIcon,\n folder: FolderIcon,\n document: FileTextIcon,\n // The agent maps markdown to `product-filled.svg`; ProductIcon is the\n // matching boundary-safe ui-system glyph.\n markdown: ProductIcon,\n code: FileCodeIcon,\n image: ImageFileIcon,\n video: VideoFileIcon\n};\n\n/**\n * Structural class-name hooks for the elements a {@link MentionRow} renders that\n * rely on a stylesheet (file icon/thumb, the app fallback kind-icon, and the\n * session avatar placeholder modifier). Every key is optional and defaults to a\n * PACKAGE-OWNED `rich-text-at-mention-*` class whose CSS ships with\n * `mentionPalette.css`, so any consumer renders styled rows out of the box.\n *\n * Surfaces with their own stylesheet (e.g. the agent composer) pass their exact\n * existing class names here so their rendered DOM stays byte-identical.\n */\nexport interface MentionRowClassNames {\n /** The masked file kind-icon `<span>`. */\n fileIcon?: string;\n /** The image-thumbnail wrapper `<span>` (rendered for image files). */\n fileThumb?: string;\n /** The fallback app icon glyph rendered when no `iconUrl` is present. */\n kindIcon?: string;\n /**\n * Modifier class added to the session user avatar `<img>` when the user has no\n * avatar URL and the placeholder asset is shown.\n */\n avatarImgUserPlaceholder?: string;\n}\n\nexport interface MentionRowRenderOptions {\n classNames?: MentionRowClassNames;\n dataAttributeMode?: MentionRowDataAttributeMode;\n /**\n * 当提供时,issue / app 行末尾渲染一个「查看产物文件」入口图标(独立点击热区,\n * 不触发整行选中)。点击回调由调用方注入(如打开引用文件 picker 并定位到该实体)。\n */\n onOpenReferences?: () => void;\n /** 入口图标的无障碍标签 / tooltip 文案。 */\n openReferencesLabel?: string;\n}\n\ninterface ResolvedMentionRowRenderOptions {\n classNames?: MentionRowClassNames;\n dataAttributeMode: MentionRowDataAttributeMode;\n onOpenReferences?: () => void;\n openReferencesLabel?: string;\n}\n\nconst DEFAULT_MENTION_ROW_CLASS_NAMES = {\n fileIcon: \"rich-text-at-mention-file-icon\",\n fileThumb: \"rich-text-at-mention-file-thumb\",\n kindIcon: \"rich-text-at-mention-kind-icon\",\n avatarImgUserPlaceholder: \"rich-text-at-mention-avatar-img--user-placeholder\"\n} as const satisfies Required<MentionRowClassNames>;\n\nfunction resolveMentionRowClassNames(\n classNames?: MentionRowClassNames\n): Required<MentionRowClassNames> {\n return {\n fileIcon: classNames?.fileIcon ?? DEFAULT_MENTION_ROW_CLASS_NAMES.fileIcon,\n fileThumb:\n classNames?.fileThumb ?? DEFAULT_MENTION_ROW_CLASS_NAMES.fileThumb,\n kindIcon: classNames?.kindIcon ?? DEFAULT_MENTION_ROW_CLASS_NAMES.kindIcon,\n avatarImgUserPlaceholder:\n classNames?.avatarImgUserPlaceholder ??\n DEFAULT_MENTION_ROW_CLASS_NAMES.avatarImgUserPlaceholder\n };\n}\n\nfunction resolveMentionRowRenderOptions(\n options?: MentionRowClassNames | MentionRowRenderOptions\n): ResolvedMentionRowRenderOptions {\n if (isMentionRowRenderOptions(options)) {\n return {\n classNames: options.classNames,\n dataAttributeMode: options.dataAttributeMode ?? \"shared\",\n onOpenReferences: options.onOpenReferences,\n openReferencesLabel: options.openReferencesLabel\n };\n }\n return {\n classNames: options,\n dataAttributeMode: \"shared\"\n };\n}\n\nfunction isMentionRowRenderOptions(\n options: MentionRowClassNames | MentionRowRenderOptions | undefined\n): options is MentionRowRenderOptions {\n return (\n options !== undefined &&\n (\"classNames\" in options || \"dataAttributeMode\" in options)\n );\n}\n\n/**\n * Render the inner content of a single `@`-mention palette row from a\n * fully-resolved {@link MentionRowItem}. The surrounding option button / active\n * state is provided by the shared `MentionPalette` shell; this renders only the\n * row body.\n *\n * Pass {@link classNames} to override the package-owned structural class hooks\n * (e.g. so the agent composer keeps emitting its own stylesheet's class names).\n */\nexport function renderMentionRow(\n item: MentionRowItem,\n options?: MentionRowClassNames | MentionRowRenderOptions\n): React.ReactNode {\n const {\n classNames,\n dataAttributeMode,\n onOpenReferences,\n openReferencesLabel\n } = resolveMentionRowRenderOptions(options);\n const resolved = resolveMentionRowClassNames(classNames);\n const referencesButton = onOpenReferences ? (\n <MentionOpenReferencesButton\n label={openReferencesLabel}\n onOpenReferences={onOpenReferences}\n dataAttributeMode={dataAttributeMode}\n />\n ) : null;\n if (item.kind === \"file\") {\n return (\n <MentionFileRow\n item={item}\n classNames={resolved}\n dataAttributeMode={dataAttributeMode}\n />\n );\n }\n\n if (item.kind === \"plain\") {\n return (\n <span className=\"rich-text-at-mention-row rich-text-at-mention-row--plain\">\n {item.leading}\n <span className=\"rich-text-at-mention-row__text-stack\">\n <span className=\"rich-text-at-mention-row__title\">{item.label}</span>\n {item.description ? (\n <span className=\"rich-text-at-mention-row__description\">\n {item.description}\n </span>\n ) : null}\n </span>\n </span>\n );\n }\n\n if (item.kind === \"session\") {\n return (\n <span className=\"rich-text-at-mention-row rich-text-at-mention-row--session\">\n <span className=\"rich-text-at-mention-row__leading\">\n <MentionSessionAvatarStack\n item={item}\n classNames={resolved}\n dataAttributeMode={dataAttributeMode}\n />\n <span className=\"rich-text-at-mention-row__session-title\">\n <MentionSessionTitle item={item} />\n </span>\n </span>\n {item.statusTag ? (\n <MentionStatusBadge\n statusTag={item.statusTag}\n dataAttributeMode={dataAttributeMode}\n />\n ) : null}\n </span>\n );\n }\n\n if (item.kind === \"app\") {\n return (\n <span className=\"rich-text-at-mention-row rich-text-at-mention-row--app\">\n <MentionWorkspaceAppIcon\n iconUrl={item.iconUrl}\n kindIconClassName={resolved.kindIcon}\n dataAttributeMode={dataAttributeMode}\n />\n <span className=\"rich-text-at-mention-row__app-text\">\n <span className=\"rich-text-at-mention-row__app-name\">\n {item.name}\n </span>\n {item.description ? (\n <span className=\"rich-text-at-mention-row__app-description\">\n {item.description}\n </span>\n ) : null}\n </span>\n {referencesButton}\n </span>\n );\n }\n\n if (item.kind === \"app-factory\") {\n return (\n <span className=\"rich-text-at-mention-row__text-stack\">\n <span className=\"rich-text-at-mention-row__title\">{item.name}</span>\n </span>\n );\n }\n\n return (\n <span className=\"rich-text-at-mention-row rich-text-at-mention-row--issue\">\n <span className=\"rich-text-at-mention-row__text-stack rich-text-at-mention-row__text-stack--fill\">\n <span className=\"rich-text-at-mention-row__inline\">\n <span className=\"rich-text-at-mention-row__title\">{item.title}</span>\n {item.statusTag ? (\n <MentionStatusBadge\n statusTag={item.statusTag}\n dataAttributeMode={dataAttributeMode}\n />\n ) : null}\n </span>\n {item.creatorName ? (\n <span className=\"rich-text-at-mention-row__description\">\n {item.creatorName}\n </span>\n ) : null}\n </span>\n {referencesButton}\n </span>\n );\n}\n\n/**\n * 「查看产物文件」入口图标。issue / app 行末尾的独立点击热区:点击只触发\n * {@link onOpenReferences}(如打开引用文件 picker 并定位),阻断冒泡以免触发整行选中。\n * 行外层按钮的 `[&_svg]:pointer-events-none` 使图标本身不吃事件,点击落在此 `<span>` 上。\n */\nfunction MentionOpenReferencesButton({\n label,\n onOpenReferences,\n dataAttributeMode\n}: {\n label?: string;\n onOpenReferences: () => void;\n dataAttributeMode: MentionRowDataAttributeMode;\n}): React.JSX.Element {\n return (\n <span\n role=\"button\"\n tabIndex={-1}\n aria-label={label}\n title={label}\n className=\"rich-text-at-mention-row__open-references\"\n {...mentionRowDataAttribute(dataAttributeMode, \"openReferences\", \"true\")}\n onMouseDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onOpenReferences();\n }}\n >\n <LocateFolderIcon size={16} />\n </span>\n );\n}\n\nfunction MentionFileRow({\n item,\n classNames,\n dataAttributeMode\n}: {\n item: MentionRowFileItem;\n classNames: Required<MentionRowClassNames>;\n dataAttributeMode: MentionRowDataAttributeMode;\n}): React.JSX.Element {\n return (\n <span\n className=\"rich-text-at-mention-row rich-text-at-mention-row--file\"\n {...mentionRowRootDataAttributes(dataAttributeMode, \"file\")}\n {...(item.entryKind\n ? mentionRowDataAttribute(\n dataAttributeMode,\n \"fileEntryKind\",\n item.entryKind\n )\n : {})}\n {...mentionRowDataAttribute(\n dataAttributeMode,\n \"fileVisualKind\",\n item.visualKind\n )}\n {...(item.mentionNavigation\n ? mentionRowDataAttribute(\n dataAttributeMode,\n \"navigation\",\n item.mentionNavigation\n )\n : {})}\n >\n <MentionFileIcon\n item={item}\n classNames={classNames}\n dataAttributeMode={dataAttributeMode}\n />\n <span className=\"rich-text-at-mention-row__file-text\">\n <span className=\"rich-text-at-mention-row__title\">{item.name}</span>\n {item.childCountLabel ? (\n <span className=\"rich-text-at-mention-row__file-count\">\n {item.childCountLabel}\n </span>\n ) : null}\n </span>\n </span>\n );\n}\n\nfunction MentionFileIcon({\n item,\n classNames,\n dataAttributeMode\n}: {\n item: MentionRowFileItem;\n classNames: Required<MentionRowClassNames>;\n dataAttributeMode: MentionRowDataAttributeMode;\n}): React.JSX.Element {\n const thumbnailUrl =\n item.visualKind === \"image\" ? item.thumbnailUrl?.trim() || \"\" : \"\";\n if (thumbnailUrl) {\n return (\n <span\n className={classNames.fileThumb}\n {...mentionRowDataAttribute(dataAttributeMode, \"fileThumb\", \"true\")}\n aria-hidden=\"true\"\n >\n <img\n src={thumbnailUrl}\n alt=\"\"\n className=\"rich-text-at-mention-row__media\"\n decoding=\"async\"\n loading=\"lazy\"\n draggable={false}\n />\n </span>\n );\n }\n\n // Back navigation always renders the ui-system back glyph so every surface\n // (including the agent composer's CSS-masked file icons) shares one source.\n if (item.visualKind === \"back\") {\n return (\n <span\n className={cn(\n classNames.fileIcon,\n \"rich-text-at-mention-file-icon--glyph\"\n )}\n {...mentionRowDataAttribute(\n dataAttributeMode,\n \"fileVisualKind\",\n item.visualKind\n )}\n aria-hidden=\"true\"\n >\n <ArrowLeftIcon size={16} />\n </span>\n );\n }\n\n // Surfaces that ship a custom file-icon stylesheet (e.g. the agent composer\n // via `agentactivity.css`) render the empty CSS-masked `<span>` so their DOM\n // stays byte-identical. Surfaces using the package default class have no such\n // stylesheet, so render a real ui-system kind glyph instead of an empty box.\n const usesDefaultFileIcon =\n classNames.fileIcon === DEFAULT_MENTION_ROW_CLASS_NAMES.fileIcon;\n if (usesDefaultFileIcon) {\n const Icon = MENTION_FILE_VISUAL_KIND_ICON[item.visualKind];\n return (\n <span\n className={cn(\n classNames.fileIcon,\n \"rich-text-at-mention-file-icon--glyph\"\n )}\n {...mentionRowDataAttribute(\n dataAttributeMode,\n \"fileVisualKind\",\n item.visualKind\n )}\n aria-hidden=\"true\"\n >\n <Icon size={16} />\n </span>\n );\n }\n\n return (\n <span\n className={classNames.fileIcon}\n {...mentionRowDataAttribute(\n dataAttributeMode,\n \"fileVisualKind\",\n item.visualKind\n )}\n aria-hidden=\"true\"\n />\n );\n}\n\nfunction MentionWorkspaceAppIcon({\n iconUrl,\n kindIconClassName,\n dataAttributeMode\n}: {\n iconUrl?: string | null;\n kindIconClassName: string;\n dataAttributeMode: MentionRowDataAttributeMode;\n}): React.JSX.Element {\n const normalizedIconUrl = iconUrl?.trim() ?? \"\";\n return (\n <span\n className=\"rich-text-at-mention-app-icon\"\n {...mentionRowDataAttribute(dataAttributeMode, \"appIcon\", \"true\")}\n data-workspace-app-icon=\"true\"\n aria-hidden=\"true\"\n >\n {normalizedIconUrl ? (\n <img\n src={normalizedIconUrl}\n alt=\"\"\n className=\"rich-text-at-mention-row__media\"\n decoding=\"async\"\n loading=\"lazy\"\n draggable={false}\n />\n ) : (\n <span\n className={cn(\n kindIconClassName,\n \"rich-text-at-mention-kind-icon--app\"\n )}\n />\n )}\n </span>\n );\n}\n\nfunction MentionSessionAvatarStack({\n item,\n classNames,\n dataAttributeMode\n}: {\n item: MentionRowSessionItem;\n classNames: Required<MentionRowClassNames>;\n dataAttributeMode: MentionRowDataAttributeMode;\n}): React.JSX.Element {\n const showUserAvatar = item.showUserAvatar !== false;\n if (!showUserAvatar) {\n return (\n <span\n className={cn(\n \"rich-text-at-mention-avatar-stack\",\n \"rich-text-at-mention-avatar-stack--agent-only\"\n )}\n aria-hidden=\"true\"\n >\n <span\n className=\"rich-text-at-mention-avatar rich-text-at-mention-avatar--agent\"\n {...mentionRowDataAttribute(dataAttributeMode, \"agentAvatar\", \"true\")}\n >\n <img\n src={item.agentIconUrl}\n alt=\"\"\n className=\"rich-text-at-mention-row__media\"\n decoding=\"async\"\n loading=\"lazy\"\n draggable={false}\n />\n </span>\n </span>\n );\n }\n\n const userAvatarUrl = item.userAvatarUrl?.trim() ?? \"\";\n const placeholderUrl = item.userAvatarPlaceholderUrl;\n const userImageUrl = userAvatarUrl || placeholderUrl;\n return (\n <span className=\"rich-text-at-mention-avatar-stack\" aria-hidden=\"true\">\n <span\n className=\"rich-text-at-mention-avatar rich-text-at-mention-avatar--user\"\n {...mentionRowDataAttribute(dataAttributeMode, \"userAvatar\", \"true\")}\n >\n <img\n src={userImageUrl}\n alt=\"\"\n className={cn(\n \"rich-text-at-mention-row__media\",\n !userAvatarUrl && classNames.avatarImgUserPlaceholder\n )}\n decoding=\"async\"\n loading=\"lazy\"\n referrerPolicy=\"no-referrer\"\n draggable={false}\n onError={(event) => {\n if (event.currentTarget.dataset.fallbackAvatarApplied === \"true\") {\n return;\n }\n event.currentTarget.dataset.fallbackAvatarApplied = \"true\";\n event.currentTarget.src = placeholderUrl;\n event.currentTarget.classList.add(\n classNames.avatarImgUserPlaceholder\n );\n }}\n />\n </span>\n <span\n className=\"rich-text-at-mention-avatar rich-text-at-mention-avatar--agent\"\n {...mentionRowDataAttribute(dataAttributeMode, \"agentAvatar\", \"true\")}\n >\n <img\n src={item.agentIconUrl}\n alt=\"\"\n className=\"rich-text-at-mention-row__media\"\n decoding=\"async\"\n loading=\"lazy\"\n draggable={false}\n />\n </span>\n </span>\n );\n}\n\nfunction MentionSessionTitle({\n item\n}: {\n item: MentionRowSessionItem;\n}): React.JSX.Element {\n return (\n <>\n <span className=\"rich-text-at-mention-row__session-participant\">\n {item.participant}\n </span>\n <span className=\"rich-text-at-mention-row__session-summary\">\n {\" \"}\n {item.summary ?? \"\"}\n </span>\n </>\n );\n}\n\nfunction MentionStatusBadge({\n statusTag,\n dataAttributeMode\n}: {\n statusTag: MentionRowStatusTag;\n dataAttributeMode: MentionRowDataAttributeMode;\n}): React.JSX.Element {\n if (statusTag.variant === \"issue\") {\n return (\n <Badge\n variant=\"secondary\"\n size=\"sm\"\n className={cn(\n \"rich-text-at-mention-status rich-text-at-mention-status--issue\",\n mentionStatusBadgeClassName({\n tone: statusTag.tone,\n variant: \"issue\"\n })\n )}\n {...mentionRowDataAttribute(dataAttributeMode, \"statusTag\", \"true\")}\n {...(statusTag.dataStatus\n ? { \"data-status\": statusTag.dataStatus }\n : {})}\n data-tone={statusTag.tone}\n >\n {statusTag.label}\n </Badge>\n );\n }\n\n return (\n <Badge\n variant=\"secondary\"\n size=\"sm\"\n className={cn(\n \"rich-text-at-mention-status rich-text-at-mention-status--activity\",\n mentionStatusBadgeClassName({\n tone: statusTag.tone,\n variant: \"activity\"\n })\n )}\n {...mentionRowDataAttribute(dataAttributeMode, \"statusTag\", \"true\")}\n {...(statusTag.dataStatus ? { \"data-status\": statusTag.dataStatus } : {})}\n data-tone={statusTag.tone}\n title={statusTag.label}\n >\n <StatusDot\n tone={statusTag.tone === \"purple\" ? \"neutral\" : statusTag.tone}\n pulse={statusTag.pulse ?? false}\n size=\"xs\"\n title={statusTag.label}\n />\n <span>{statusTag.label}</span>\n </Badge>\n );\n}\n","import type { MentionRowItem } from \"./mentionRowTypes.ts\";\n\nexport type MentionRowDataAttributeMode = \"shared\" | \"agent\";\n\nexport type MentionRowDataAttributeKey =\n | \"agentAvatar\"\n | \"appIcon\"\n | \"fileEntryKind\"\n | \"fileThumb\"\n | \"fileVisualKind\"\n | \"navigation\"\n | \"openReferences\"\n | \"statusTag\"\n | \"userAvatar\";\n\nconst MENTION_ROW_DATA_ATTRIBUTES: Record<\n MentionRowDataAttributeMode,\n Record<MentionRowDataAttributeKey, string>\n> = {\n shared: {\n agentAvatar: \"data-rich-text-at-mention-agent-avatar\",\n appIcon: \"data-rich-text-at-mention-app-icon\",\n fileEntryKind: \"data-rich-text-at-mention-file-entry-kind\",\n fileThumb: \"data-rich-text-at-mention-file-thumb\",\n fileVisualKind: \"data-rich-text-at-mention-file-visual-kind\",\n navigation: \"data-rich-text-at-mention-navigation\",\n openReferences: \"data-rich-text-at-mention-open-references\",\n statusTag: \"data-rich-text-at-mention-status-tag\",\n userAvatar: \"data-rich-text-at-mention-user-avatar\"\n },\n agent: {\n agentAvatar: \"data-agent-mention-agent-avatar\",\n appIcon: \"data-agent-mention-app-icon\",\n fileEntryKind: \"data-agent-file-entry-kind\",\n fileThumb: \"data-agent-mention-file-thumb\",\n fileVisualKind: \"data-agent-file-visual-kind\",\n navigation: \"data-agent-mention-navigation\",\n openReferences: \"data-agent-mention-open-references\",\n statusTag: \"data-agent-mention-status-tag\",\n userAvatar: \"data-agent-mention-user-avatar\"\n }\n};\n\nexport function mentionRowRootDataAttributes(\n mode: MentionRowDataAttributeMode,\n kind: MentionRowItem[\"kind\"]\n): Record<string, string> {\n return mode === \"agent\"\n ? {\n \"data-agent-file-mention\": \"true\",\n \"data-agent-mention-kind\": kind\n }\n : {\n \"data-rich-text-at-mention-row\": \"true\",\n \"data-rich-text-at-mention-kind\": kind\n };\n}\n\nexport function mentionRowDataAttribute(\n mode: MentionRowDataAttributeMode,\n key: MentionRowDataAttributeKey,\n value: string\n): Record<string, string> {\n return {\n [MENTION_ROW_DATA_ATTRIBUTES[mode][key]]: value\n };\n}\n","import React, { type CSSProperties } from \"react\";\nimport type { MentionFileVisualKind } from \"./mentionFileVisualKind.ts\";\n\nexport type MentionReferenceProviderKind =\n | \"agent-generated-file\"\n | \"agent-session\"\n | \"file\"\n | \"workspace-app\"\n | \"workspace-issue\"\n | \"generic\";\n\nexport interface MentionReferenceLeadingInput {\n className?: string;\n fileVisualKind?: MentionFileVisualKind;\n iconUrl?: string | null;\n imageClassName?: string;\n kind: MentionReferenceProviderKind;\n label?: string | null;\n thumbnailUrl?: string | null;\n}\n\nconst REFERENCE_LEADING_STYLE = {\n alignItems: \"center\",\n background: \"var(--bg-block, var(--block, #0000000a))\",\n borderRadius: \"8px\",\n color: \"var(--rich-text-at-mention-text-secondary, currentColor)\",\n display: \"inline-grid\",\n flex: \"0 0 32px\",\n height: \"32px\",\n justifyItems: \"center\",\n overflow: \"hidden\",\n width: \"32px\"\n} as const satisfies CSSProperties;\n\nconst REFERENCE_IMAGE_STYLE = {\n display: \"block\",\n height: \"100%\",\n objectFit: \"cover\",\n width: \"100%\"\n} as const satisfies CSSProperties;\n\nconst REFERENCE_ICON_STYLE = {\n display: \"block\",\n height: \"18px\",\n width: \"18px\"\n} as const satisfies CSSProperties;\n\nexport function resolveMentionReferenceImageUrl(input: {\n iconUrl?: string | null;\n thumbnailUrl?: string | null;\n}): string | undefined {\n return input.thumbnailUrl?.trim() || input.iconUrl?.trim() || undefined;\n}\n\nexport function renderMentionReferenceLeading(\n input: MentionReferenceLeadingInput\n): React.JSX.Element {\n const imageUrl = resolveMentionReferenceImageUrl(input);\n return React.createElement(\n \"span\",\n {\n \"aria-hidden\": \"true\",\n className: input.className,\n \"data-rich-text-at-mention-reference-kind\": input.kind,\n \"data-rich-text-at-mention-reference-leading\": \"true\",\n style: REFERENCE_LEADING_STYLE\n },\n imageUrl\n ? React.createElement(\"img\", {\n alt: \"\",\n className: input.imageClassName,\n decoding: \"async\",\n draggable: false,\n loading: \"lazy\",\n src: imageUrl,\n style: REFERENCE_IMAGE_STYLE\n })\n : renderMentionReferenceFallbackIcon(input)\n );\n}\n\nfunction renderMentionReferenceFallbackIcon(\n input: Pick<MentionReferenceLeadingInput, \"fileVisualKind\" | \"kind\">\n): React.JSX.Element {\n return React.createElement(\n \"svg\",\n {\n \"aria-hidden\": \"true\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 1.8,\n style: REFERENCE_ICON_STYLE,\n viewBox: \"0 0 24 24\"\n },\n ...referenceIconPaths(input)\n );\n}\n\nfunction referenceIconPaths(\n input: Pick<MentionReferenceLeadingInput, \"fileVisualKind\" | \"kind\">\n): React.ReactNode[] {\n if (input.kind === \"workspace-app\") {\n return [\n React.createElement(\"rect\", {\n height: 7,\n key: \"a\",\n rx: 1.5,\n width: 7,\n x: 4,\n y: 4\n }),\n React.createElement(\"rect\", {\n height: 7,\n key: \"b\",\n rx: 1.5,\n width: 7,\n x: 13,\n y: 4\n }),\n React.createElement(\"rect\", {\n height: 7,\n key: \"c\",\n rx: 1.5,\n width: 7,\n x: 4,\n y: 13\n }),\n React.createElement(\"rect\", {\n height: 7,\n key: \"d\",\n rx: 1.5,\n width: 7,\n x: 13,\n y: 13\n })\n ];\n }\n if (input.kind === \"workspace-issue\") {\n return [\n React.createElement(\"circle\", { cx: 12, cy: 12, key: \"a\", r: 8 }),\n React.createElement(\"path\", { d: \"M8.5 12.5 11 15l4.5-5\", key: \"b\" })\n ];\n }\n if (input.kind === \"agent-session\") {\n return [\n React.createElement(\"path\", {\n d: \"M6 9.5a5 5 0 0 1 5-5h2a5 5 0 0 1 5 5v2.5a5 5 0 0 1-5 5h-1.5L8 19v-2.4A5 5 0 0 1 6 12z\",\n key: \"a\"\n })\n ];\n }\n if (\n input.kind === \"file\" ||\n input.kind === \"agent-generated-file\" ||\n input.fileVisualKind != null\n ) {\n if (input.fileVisualKind === \"folder\" || input.fileVisualKind === \"back\") {\n return [\n React.createElement(\"path\", {\n d: \"M3.5 7.5h6l2 2h9v8a2 2 0 0 1-2 2h-13a2 2 0 0 1-2-2z\",\n key: \"a\"\n })\n ];\n }\n if (input.fileVisualKind === \"image\") {\n return [\n React.createElement(\"rect\", {\n height: 14,\n key: \"a\",\n rx: 2,\n width: 16,\n x: 4,\n y: 5\n }),\n React.createElement(\"path\", {\n d: \"m7 16 3.5-3.5 2.5 2.5 2-2 2 3\",\n key: \"b\"\n }),\n React.createElement(\"circle\", { cx: 9, cy: 9, key: \"c\", r: 1 })\n ];\n }\n if (input.fileVisualKind === \"video\") {\n return [\n React.createElement(\"rect\", {\n height: 14,\n key: \"a\",\n rx: 2,\n width: 16,\n x: 4,\n y: 5\n }),\n React.createElement(\"path\", {\n d: \"m10 9 5 3-5 3z\",\n key: \"b\"\n })\n ];\n }\n return [\n React.createElement(\"path\", {\n d: \"M7 3.5h7l4 4V20a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V4.5a1 1 0 0 1 1-1z\",\n key: \"a\"\n }),\n React.createElement(\"path\", { d: \"M14 3.5v4h4\", key: \"b\" })\n ];\n }\n return [\n React.createElement(\"path\", {\n d: \"M9.5 14.5 14.5 9.5\",\n key: \"a\"\n }),\n React.createElement(\"path\", {\n d: \"M8.5 10.5 7 12a3.5 3.5 0 0 0 5 5l1.5-1.5\",\n key: \"b\"\n }),\n React.createElement(\"path\", {\n d: \"M15.5 13.5 17 12a3.5 3.5 0 0 0-5-5l-1.5 1.5\",\n key: \"c\"\n })\n ];\n}\n","import type { ReactNode } from \"react\";\nimport {\n resolveMentionFileThumbnailUrl,\n resolveMentionFileVisualKind,\n type MentionFileVisualKind\n} from \"./mentionFileVisualKind.ts\";\nimport {\n renderMentionReferenceLeading,\n type MentionReferenceProviderKind\n} from \"./mentionReferenceIcon.ts\";\nimport type {\n MentionRowItem,\n MentionRowPlainItem,\n MentionRowStatusTag\n} from \"./mentionRowTypes.ts\";\nimport type {\n MentionRowStatusTone,\n MentionRowStatusVariant\n} from \"./mentionStatusTone.ts\";\nimport type {\n RichTextMentionPresentation,\n RichTextTriggerQueryMatch\n} from \"../types/index.ts\";\n\nexport type MentionTriggerRowProviderId =\n | \"agent-generated-file\"\n | \"agent-session\"\n | \"file\"\n | \"workspace-app\"\n | \"workspace-issue\";\n\nexport interface MentionTriggerRowLeadingContext<\n TMatch extends RichTextTriggerQueryMatch = RichTextTriggerQueryMatch\n> {\n description: string | null;\n fileVisualKind?: MentionFileVisualKind;\n iconUrl: string | null;\n label: string;\n match: TMatch;\n providerKind: MentionReferenceProviderKind;\n thumbnailUrl: string | null;\n}\n\nexport interface MentionTriggerRowItemOptions<\n TMatch extends RichTextTriggerQueryMatch = RichTextTriggerQueryMatch\n> {\n getAgentIconUrl?: (match: TMatch) => string | null | undefined;\n getChildCountLabel?: (match: TMatch) => string | null | undefined;\n getDescription?: (match: TMatch) => string | null | undefined;\n getFileEntryKind?: (match: TMatch) => string | null | undefined;\n getFileMentionNavigation?: (match: TMatch) => string | null | undefined;\n getFileThumbnailUrl?: (match: TMatch) => string | null | undefined;\n getFileVisualKind?: (\n match: TMatch\n ) => MentionFileVisualKind | null | undefined;\n getStatusTag?: (\n match: TMatch,\n variant: MentionRowStatusVariant\n ) => MentionRowStatusTag | null | undefined;\n getUserAvatarPlaceholderUrl?: (match: TMatch) => string | null | undefined;\n getUserAvatarUrl?: (match: TMatch) => string | null | undefined;\n getWorkspaceAppIconFallbackUrl?: (match: TMatch) => string | null | undefined;\n renderLeading?: (\n context: MentionTriggerRowLeadingContext<TMatch>\n ) => ReactNode | undefined;\n}\n\nconst SUPPORTED_MENTION_TRIGGER_ROW_PROVIDER_IDS = new Set<string>([\n \"agent-generated-file\",\n \"agent-session\",\n \"file\",\n \"workspace-app\",\n \"workspace-issue\"\n]);\n\nexport function richTextTriggerQueryMatchToMentionRowItem<\n TMatch extends RichTextTriggerQueryMatch = RichTextTriggerQueryMatch\n>(\n match: TMatch,\n options: MentionTriggerRowItemOptions<TMatch> = {}\n): MentionRowItem {\n const presentation = mentionPresentation(match);\n const label = resolveMentionRowLabel(match);\n const description = resolveMentionRowDescription(match, options);\n const providerKind = mentionReferenceProviderKind(match.providerId);\n const iconUrl = resolveMentionRowIconUrl(match, presentation, options);\n const thumbnailUrl = resolveMentionRowThumbnailUrl(\n match,\n presentation,\n options\n );\n const fileVisualKind = isFileMentionProvider(match.providerId)\n ? resolveMentionRowFileVisualKind(match, options)\n : undefined;\n const customLeading = options.renderLeading?.({\n description,\n fileVisualKind,\n iconUrl,\n label,\n match,\n providerKind,\n thumbnailUrl\n });\n\n if (customLeading !== undefined) {\n return mentionRowPlainItem({\n description,\n label,\n leading: customLeading\n });\n }\n\n if (match.providerId === \"workspace-app\") {\n return {\n kind: \"app\",\n description,\n iconUrl,\n name: label\n };\n }\n\n if (match.providerId === \"workspace-issue\") {\n return {\n kind: \"issue\",\n creatorName: description,\n statusTag: resolveMentionRowStatusTag(match, \"issue\", options),\n title: label\n };\n }\n\n if (isFileMentionProvider(match.providerId)) {\n const entryKind = resolveFileEntryKind(match, options);\n const mentionNavigation = resolveFileMentionNavigation(match, options);\n const visualKind = fileVisualKind ?? \"document\";\n return {\n kind: \"file\",\n childCountLabel: normalizedText(options.getChildCountLabel?.(match)),\n entryKind,\n mentionNavigation,\n name: label,\n thumbnailUrl:\n resolveMentionFileThumbnailUrl({\n thumbnailUrl,\n visualKind\n }) ?? null,\n visualKind\n };\n }\n\n if (match.providerId === \"agent-session\") {\n const session = agentSessionMentionRowItem(match, {\n description,\n iconUrl,\n options,\n presentation\n });\n if (session) {\n return session;\n }\n }\n\n return mentionRowPlainItem({\n description,\n label,\n leading: renderMentionReferenceLeading({\n fileVisualKind,\n iconUrl,\n kind: providerKind,\n label,\n thumbnailUrl\n })\n });\n}\n\nexport function isMentionTriggerRowProviderId(\n providerId: string\n): providerId is MentionTriggerRowProviderId {\n return SUPPORTED_MENTION_TRIGGER_ROW_PROVIDER_IDS.has(providerId);\n}\n\nexport function workspaceAppIconFallbackUrlFromTriggerMatch(\n match: RichTextTriggerQueryMatch\n): string | null {\n const appId = mentionEntityId(match) || match.key.trim();\n if (!appId) {\n return null;\n }\n return `tutti://workspace-apps/${encodeURIComponent(appId)}/icon.png`;\n}\n\nexport function mentionRowStatusTagFromPresentation(\n match: RichTextTriggerQueryMatch,\n input: {\n tone?: MentionRowStatusTone;\n variant: MentionRowStatusVariant;\n }\n): MentionRowStatusTag | null {\n const presentation = mentionPresentation(match);\n const label = normalizedText(presentation?.statusLabel);\n if (!label) {\n return null;\n }\n const dataStatus =\n normalizedText(presentation?.statusDataStatus) ??\n normalizedText(presentation?.status);\n return {\n dataStatus: dataStatus ?? undefined,\n label,\n pulse: presentation?.statusPulse === \"true\",\n tone: input.tone ?? \"neutral\",\n variant: input.variant\n };\n}\n\nfunction agentSessionMentionRowItem<TMatch extends RichTextTriggerQueryMatch>(\n match: TMatch,\n input: {\n description: string | null;\n iconUrl: string | null;\n options: MentionTriggerRowItemOptions<TMatch>;\n presentation: RichTextMentionPresentation | null;\n }\n): MentionRowItem | null {\n const agentIconUrl =\n normalizedText(input.options.getAgentIconUrl?.(match)) ??\n normalizedText(input.presentation?.agentIconUrl) ??\n input.iconUrl;\n const userAvatarPlaceholderUrl =\n normalizedText(input.options.getUserAvatarPlaceholderUrl?.(match)) ??\n normalizedText(input.presentation?.userAvatarPlaceholderUrl);\n if (!agentIconUrl || !userAvatarPlaceholderUrl) {\n return null;\n }\n return {\n kind: \"session\",\n agentIconUrl,\n participant:\n normalizedText(input.presentation?.participant) ??\n resolveMentionRowLabel(match),\n statusTag: resolveMentionRowStatusTag(match, \"activity\", input.options),\n summary: input.description,\n userAvatarPlaceholderUrl,\n userAvatarUrl:\n normalizedText(input.options.getUserAvatarUrl?.(match)) ?? null\n };\n}\n\nfunction mentionRowPlainItem(input: {\n description: string | null;\n label: string;\n leading?: ReactNode;\n}): MentionRowPlainItem {\n return {\n kind: \"plain\",\n description: input.description,\n label: input.label,\n leading: input.leading\n };\n}\n\nfunction resolveMentionRowLabel(match: RichTextTriggerQueryMatch): string {\n return (\n normalizedText(\n match.insertResult.kind === \"mention\"\n ? match.insertResult.mention.label\n : match.insertResult.kind === \"markdown-link\"\n ? match.insertResult.label\n : undefined\n ) ??\n normalizedText(match.label) ??\n match.key\n );\n}\n\nfunction resolveMentionRowDescription<TMatch extends RichTextTriggerQueryMatch>(\n match: TMatch,\n options: Pick<MentionTriggerRowItemOptions<TMatch>, \"getDescription\">\n): string | null {\n const presentation = mentionPresentation(match);\n return (\n normalizedText(options.getDescription?.(match)) ??\n normalizedText(presentation?.description) ??\n normalizedText(presentation?.subtitle) ??\n normalizedText(match.subtitle) ??\n null\n );\n}\n\nfunction resolveMentionRowIconUrl<TMatch extends RichTextTriggerQueryMatch>(\n match: TMatch,\n presentation: RichTextMentionPresentation | null,\n options: Pick<\n MentionTriggerRowItemOptions<TMatch>,\n \"getWorkspaceAppIconFallbackUrl\"\n >\n): string | null {\n return (\n normalizedText(presentation?.iconUrl) ??\n normalizedText(match.iconUrl) ??\n (match.providerId === \"workspace-app\"\n ? (normalizedText(options.getWorkspaceAppIconFallbackUrl?.(match)) ??\n workspaceAppIconFallbackUrlFromTriggerMatch(match))\n : null) ??\n null\n );\n}\n\nfunction resolveMentionRowThumbnailUrl<\n TMatch extends RichTextTriggerQueryMatch\n>(\n match: TMatch,\n presentation: RichTextMentionPresentation | null,\n options: Pick<MentionTriggerRowItemOptions<TMatch>, \"getFileThumbnailUrl\">\n): string | null {\n return (\n normalizedText(options.getFileThumbnailUrl?.(match)) ??\n normalizedText(presentation?.thumbnailUrl) ??\n normalizedText(readStringProperty(match.item, \"thumbnailUrl\")) ??\n (isFileMentionProvider(match.providerId)\n ? normalizedText(match.iconUrl)\n : null) ??\n null\n );\n}\n\nfunction resolveMentionRowFileVisualKind<\n TMatch extends RichTextTriggerQueryMatch\n>(\n match: TMatch,\n options: Pick<\n MentionTriggerRowItemOptions<TMatch>,\n \"getFileEntryKind\" | \"getFileMentionNavigation\" | \"getFileVisualKind\"\n >\n): MentionFileVisualKind {\n const override = options.getFileVisualKind?.(match);\n if (override) {\n return override;\n }\n return resolveMentionFileVisualKind({\n baseVisualKind: inferMentionFileVisualKind(\n markdownLinkHref(match) ??\n normalizedText(match.subtitle) ??\n normalizedText(match.label) ??\n match.key\n ),\n entryKind: resolveFileEntryKind(match, options),\n mentionNavigation: resolveFileMentionNavigation(match, options)\n });\n}\n\nfunction resolveMentionRowStatusTag<TMatch extends RichTextTriggerQueryMatch>(\n match: TMatch,\n variant: MentionRowStatusVariant,\n options: Pick<MentionTriggerRowItemOptions<TMatch>, \"getStatusTag\">\n): MentionRowStatusTag | null {\n return (\n options.getStatusTag?.(match, variant) ??\n mentionRowStatusTagFromPresentation(match, { variant })\n );\n}\n\nfunction resolveFileEntryKind<TMatch extends RichTextTriggerQueryMatch>(\n match: TMatch,\n options: Pick<MentionTriggerRowItemOptions<TMatch>, \"getFileEntryKind\">\n): string | null {\n return (\n normalizedText(options.getFileEntryKind?.(match)) ??\n normalizedText(readStringProperty(match.item, \"entryKind\")) ??\n normalizedText(readStringProperty(match.item, \"kind\")) ??\n null\n );\n}\n\nfunction resolveFileMentionNavigation<TMatch extends RichTextTriggerQueryMatch>(\n match: TMatch,\n options: Pick<\n MentionTriggerRowItemOptions<TMatch>,\n \"getFileMentionNavigation\"\n >\n): string | null {\n return (\n normalizedText(options.getFileMentionNavigation?.(match)) ??\n normalizedText(readStringProperty(match.item, \"mentionNavigation\")) ??\n null\n );\n}\n\nfunction mentionReferenceProviderKind(\n providerId: string\n): MentionReferenceProviderKind {\n if (providerId === \"workspace-app\") {\n return \"workspace-app\";\n }\n if (providerId === \"workspace-issue\") {\n return \"workspace-issue\";\n }\n if (providerId === \"agent-session\") {\n return \"agent-session\";\n }\n if (providerId === \"agent-generated-file\") {\n return \"agent-generated-file\";\n }\n if (providerId === \"file\") {\n return \"file\";\n }\n return \"generic\";\n}\n\nfunction isFileMentionProvider(providerId: string): boolean {\n return providerId === \"file\" || providerId === \"agent-generated-file\";\n}\n\nfunction mentionPresentation(\n match: RichTextTriggerQueryMatch\n): RichTextMentionPresentation | null {\n return match.insertResult.kind === \"mention\"\n ? (match.insertResult.mention.presentation ?? null)\n : null;\n}\n\nfunction mentionEntityId(match: RichTextTriggerQueryMatch): string | null {\n return match.insertResult.kind === \"mention\"\n ? (normalizedText(match.insertResult.mention.entityId) ?? null)\n : null;\n}\n\nfunction markdownLinkHref(match: RichTextTriggerQueryMatch): string | null {\n return match.insertResult.kind === \"markdown-link\"\n ? (normalizedText(match.insertResult.href) ?? null)\n : null;\n}\n\nfunction inferMentionFileVisualKind(pathOrName: string): MentionFileVisualKind {\n const normalized = pathOrName.trim().toLowerCase();\n if (!normalized) {\n return \"document\";\n }\n if (normalized.endsWith(\"/\")) {\n return \"folder\";\n }\n const extension = normalized.match(/\\.([a-z0-9]+)(?:[?#].*)?$/)?.[1] ?? \"\";\n if (\n [\"apng\", \"avif\", \"gif\", \"jpeg\", \"jpg\", \"png\", \"svg\", \"webp\"].includes(\n extension\n )\n ) {\n return \"image\";\n }\n if ([\"avi\", \"m4v\", \"mkv\", \"mov\", \"mp4\", \"webm\"].includes(extension)) {\n return \"video\";\n }\n if ([\"markdown\", \"md\", \"mdx\"].includes(extension)) {\n return \"markdown\";\n }\n if (\n [\n \"c\",\n \"cpp\",\n \"css\",\n \"go\",\n \"h\",\n \"hpp\",\n \"html\",\n \"java\",\n \"js\",\n \"jsx\",\n \"json\",\n \"kt\",\n \"php\",\n \"py\",\n \"rb\",\n \"rs\",\n \"sh\",\n \"sql\",\n \"swift\",\n \"toml\",\n \"ts\",\n \"tsx\",\n \"xml\",\n \"yaml\",\n \"yml\"\n ].includes(extension)\n ) {\n return \"code\";\n }\n return \"document\";\n}\n\nfunction readStringProperty(value: unknown, key: string): string | undefined {\n if (value === null || typeof value !== \"object\") {\n return undefined;\n }\n const record = value as Readonly<Record<string, unknown>>;\n return typeof record[key] === \"string\" ? record[key] : undefined;\n}\n\nfunction normalizedText(value: string | null | undefined): string | null {\n const normalized = value?.trim() ?? \"\";\n return normalized || null;\n}\n","export interface AtPanelKeyboardActions {\n moveSelection: (delta: 1 | -1) => void;\n commitSelection: () => void;\n close: () => void;\n cycleFilter?: (delta: 1 | -1) => void;\n navigateHierarchy?: (delta: 1 | -1) => boolean;\n}\n\nexport interface AtPanelKeyboardEventLike {\n key: string;\n shiftKey?: boolean;\n preventDefault: () => void;\n}\n\nexport function makeAtPanelKeyDown(actions: AtPanelKeyboardActions) {\n return (event: AtPanelKeyboardEventLike): boolean => {\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n actions.moveSelection(1);\n return true;\n }\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n actions.moveSelection(-1);\n return true;\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n actions.close();\n return true;\n }\n if (event.key === \"Tab\" && actions.cycleFilter) {\n event.preventDefault();\n actions.cycleFilter(event.shiftKey ? -1 : 1);\n return true;\n }\n if (event.key === \"ArrowRight\" && actions.navigateHierarchy) {\n if (actions.navigateHierarchy(1)) {\n event.preventDefault();\n return true;\n }\n return false;\n }\n if (event.key === \"ArrowLeft\" && actions.navigateHierarchy) {\n if (actions.navigateHierarchy(-1)) {\n event.preventDefault();\n return true;\n }\n return false;\n }\n if (event.key === \"Enter\") {\n event.preventDefault();\n actions.commitSelection();\n return true;\n }\n return false;\n };\n}\n\nexport function useAtPanelKeyboard(actions: AtPanelKeyboardActions) {\n return makeAtPanelKeyDown(actions);\n}\n"],"mappings":"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","names":["useEffect","useRef","useState","cn","jsx","cn","useRef","useState","useEffect","jsx","jsx","jsxs","cn","Fragment","jsx","jsxs","cn"]}
|