@iblai/iblai-js 2.38.0 → 2.39.1

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.
@@ -285443,6 +285443,7 @@ const OutsideButtons = ({
285443
285443
  const UploadMenu = ({ onFileInputTrigger, onCameraTrigger, disabled = false, mentorId, tenantKey, isPublicRoute, }) => {
285444
285444
  const t = useChatT();
285445
285445
  const host = useChatHost();
285446
+ const cameraPickedRef = useRef(false);
285446
285447
  const showAttachment = useShowAttachment({
285447
285448
  mentorId: mentorId || host.mentorId,
285448
285449
  tenantKey: tenantKey || host.tenantKey,
@@ -285458,7 +285459,9 @@ const UploadMenu = ({ onFileInputTrigger, onCameraTrigger, disabled = false, men
285458
285459
  {
285459
285460
  labelKey: 'camera',
285460
285461
  icon: jsx(Camera, { className: "h-5 w-5 text-gray-600" }),
285461
- action: onCameraTrigger,
285462
+ action: () => {
285463
+ cameraPickedRef.current = true;
285464
+ },
285462
285465
  isEnabled: host.features.camera,
285463
285466
  },
285464
285467
  // {
@@ -285488,7 +285491,16 @@ const UploadMenu = ({ onFileInputTrigger, onCameraTrigger, disabled = false, men
285488
285491
  if (!showAttachment || uploadMenuItems.length === 0) {
285489
285492
  return null;
285490
285493
  }
285491
- return (jsxs(DropdownMenu, { children: [jsx(DropdownMenuTrigger, { asChild: true, disabled: disabled, children: jsxs(Button$1, { variant: "ghost", size: "icon", disabled: disabled, "aria-label": t('chat.chatInputFormUploadMenu.attachFile'), className: "h-8 w-8 rounded-lg text-gray-600 transition-all duration-200 hover:border hover:border-[#38A1E5] hover:bg-[#F5F8FF] disabled:cursor-not-allowed disabled:opacity-50", children: [jsx(Plus, { className: "h-4 w-4" }), jsx("span", { className: "sr-only", children: t('chat.chatInputFormUploadMenu.attachFile') })] }) }), jsx(DropdownMenuContent, { align: "start", className: "z-50 w-56 p-2", children: uploadMenuItems.map((item) => (jsxs(DropdownMenuItem, { onClick: item.action, className: "flex cursor-pointer items-center gap-3 rounded-lg p-3 hover:border-[#38A1E5] hover:bg-gray-50", children: [item.icon, jsx("span", { className: "text-gray-700", children: t(`chat.chatInputFormUploadMenu.${item.labelKey}`) })] }, item.labelKey))) })] }));
285494
+ return (jsxs(DropdownMenu, { children: [jsx(DropdownMenuTrigger, { asChild: true, disabled: disabled, children: jsxs(Button$1, { variant: "ghost", size: "icon", disabled: disabled, "aria-label": t('chat.chatInputFormUploadMenu.attachFile'), className: "h-8 w-8 rounded-lg text-gray-600 transition-all duration-200 hover:border hover:border-[#38A1E5] hover:bg-[#F5F8FF] disabled:cursor-not-allowed disabled:opacity-50", children: [jsx(Plus, { className: "h-4 w-4" }), jsx("span", { className: "sr-only", children: t('chat.chatInputFormUploadMenu.attachFile') })] }) }), jsx(DropdownMenuContent, { align: "start", className: "z-50 w-56 p-2",
285495
+ // Opening the camera dialog (a separate Radix copy) while this menu is
285496
+ // mounted leaves <body> stuck at `pointer-events: none`; this fires after
285497
+ // the menu has unmounted.
285498
+ onCloseAutoFocus: () => {
285499
+ if (!cameraPickedRef.current)
285500
+ return;
285501
+ cameraPickedRef.current = false;
285502
+ onCameraTrigger();
285503
+ }, children: uploadMenuItems.map((item) => (jsxs(DropdownMenuItem, { onClick: item.action, className: "flex cursor-pointer items-center gap-3 rounded-lg p-3 hover:border-[#38A1E5] hover:bg-gray-50", children: [item.icon, jsx("span", { className: "text-gray-700", children: t(`chat.chatInputFormUploadMenu.${item.labelKey}`) })] }, item.labelKey))) })] }));
285492
285504
  };
285493
285505
 
285494
285506
  const CameraCaptureDialog = ({ open, onOpenChange, onCapture, facingMode = 'user', }) => {
@@ -286524,6 +286536,7 @@ function ComposerPlusMenu({ isMobile, disabled = false, attachDisabled = false,
286524
286536
  const [memoryOpen, setMemoryOpen] = useState(false);
286525
286537
  const [sheetPage, setSheetPage] = useState(null);
286526
286538
  const [sheetProvider, setSheetProvider] = useState(null);
286539
+ const cameraPickedRef = useRef(false);
286527
286540
  const showAttach = showUpload || showCamera;
286528
286541
  const showTools = tools.length > 0;
286529
286542
  const showSkills = skills.length > 0;
@@ -286583,7 +286596,19 @@ function ComposerPlusMenu({ isMobile, disabled = false, attachDisabled = false,
286583
286596
  }
286584
286597
  // --------------------------------------------------------------- desktop
286585
286598
  const hasListAfterAttach = showTools || showSkills || showModel || showPrompts || showMemory;
286586
- return (jsxs(Popover, { open: memoryOpen, onOpenChange: setMemoryOpen, children: [jsx(PopoverAnchor, { asChild: true, children: jsx("div", { className: "flex shrink-0", children: jsxs(DropdownMenu, { open: menuOpen, onOpenChange: setMenuOpen, children: [jsx(DropdownMenuTrigger, { asChild: true, disabled: disabled, children: trigger }), jsxs(DropdownMenuContent, { align: "start", sideOffset: 8, collisionPadding: 8, "data-testid": "composer-plus-menu", className: cn(POP_CLASS, 'flex w-[248px] flex-col gap-0.5'), children: [showUpload && (jsxs(DropdownMenuItem, { className: ROW_CLASS, disabled: attachDisabled, onSelect: onUploadFile, children: [jsx(Paperclip, { className: "h-4 w-4 text-gray-600", "aria-hidden": "true" }), jsx("span", { className: "flex-1", children: t('chat.chatInputFormUploadMenu.uploadFile') })] })), showCamera && (jsxs(DropdownMenuItem, { className: ROW_CLASS, disabled: attachDisabled, onSelect: onCamera, children: [jsx(Camera, { className: "h-4 w-4 text-gray-600", "aria-hidden": "true" }), jsx("span", { className: "flex-1", children: t('chat.chatInputFormUploadMenu.camera') })] })), showAttach && hasListAfterAttach && (jsx(DropdownMenuSeparator, { className: "mx-1.5 my-1 bg-gray-200" })), showTools && (jsxs(DropdownMenuSub, { children: [jsx(SubTrigger, { icon: jsx(SlidersHorizontal, { className: "h-4 w-4 text-gray-600", "aria-hidden": "true" }), label: t('chat.chatComposer.tools'), count: activeToolCount, countLabel: t('chat.chatComposer.activeCount', { count: activeToolCount }), testId: "composer-tools-trigger" }), jsx(Portal2$1, { container: portalContainer !== null && portalContainer !== void 0 ? portalContainer : undefined, children: jsxs(DropdownMenuSubContent, { sideOffset: 6, alignOffset: -7, collisionPadding: 8, "data-testid": "composer-tools-menu", "aria-label": t('chat.chatComposer.tools'), className: cn(POP_CLASS, 'flex max-h-[min(70vh,30rem)] w-56 flex-col gap-0.5 overflow-y-auto'), children: [modes.map((tool) => (jsx(ToolCheckboxItem, { tool: tool, label: toolLabel(tool) }, tool.key))), modes.length > 0 && plainTools.length > 0 && (jsx(DropdownMenuSeparator, { className: "mx-1.5 my-1 bg-gray-200" })), plainTools.map((tool) => (jsx(ToolCheckboxItem, { tool: tool, label: toolLabel(tool) }, tool.key)))] }) })] })), showSkills && (jsxs(DropdownMenuSub, { children: [jsx(SubTrigger, { icon: jsx(Zap, { className: "h-4 w-4 text-gray-600", "aria-hidden": "true" }), label: t('chat.chatInputFormInsideButtons.skills'), count: activeSkillCount, countLabel: t('chat.chatComposer.activeCount', { count: activeSkillCount }), testId: "skills-menu-trigger" }), jsx(Portal2$1, { container: portalContainer !== null && portalContainer !== void 0 ? portalContainer : undefined, children: jsxs(DropdownMenuSubContent, { sideOffset: 6, alignOffset: -7, collisionPadding: 8, "data-testid": "skills-menu-content", "aria-label": t('chat.chatInputFormInsideButtons.skills'), onScroll: handleSkillsScroll, className: cn(POP_CLASS, 'flex max-h-[min(60vh,20rem)] w-56 flex-col gap-0.5 overflow-y-auto'), children: [skills.map((skill) => {
286599
+ return (jsxs(Popover, { open: memoryOpen, onOpenChange: setMemoryOpen, children: [jsx(PopoverAnchor, { asChild: true, children: jsx("div", { className: "flex shrink-0", children: jsxs(DropdownMenu, { open: menuOpen, onOpenChange: setMenuOpen, children: [jsx(DropdownMenuTrigger, { asChild: true, disabled: disabled, children: trigger }), jsxs(DropdownMenuContent, { align: "start", sideOffset: 8, collisionPadding: 8, "data-testid": "composer-plus-menu", className: cn(POP_CLASS, 'flex w-[248px] flex-col gap-0.5'),
286600
+ // The camera dialog's DismissableLayer is a separate Radix copy from
286601
+ // this menu's: opened while the menu is mounted it records the menu's
286602
+ // `pointer-events: none` on <body> as the original and restores it on
286603
+ // close, freezing the page. This fires after the menu has unmounted.
286604
+ onCloseAutoFocus: () => {
286605
+ if (!cameraPickedRef.current)
286606
+ return;
286607
+ cameraPickedRef.current = false;
286608
+ onCamera();
286609
+ }, children: [showUpload && (jsxs(DropdownMenuItem, { className: ROW_CLASS, disabled: attachDisabled, onSelect: onUploadFile, children: [jsx(Paperclip, { className: "h-4 w-4 text-gray-600", "aria-hidden": "true" }), jsx("span", { className: "flex-1", children: t('chat.chatInputFormUploadMenu.uploadFile') })] })), showCamera && (jsxs(DropdownMenuItem, { className: ROW_CLASS, disabled: attachDisabled, onSelect: () => {
286610
+ cameraPickedRef.current = true;
286611
+ }, children: [jsx(Camera, { className: "h-4 w-4 text-gray-600", "aria-hidden": "true" }), jsx("span", { className: "flex-1", children: t('chat.chatInputFormUploadMenu.camera') })] })), showAttach && hasListAfterAttach && (jsx(DropdownMenuSeparator, { className: "mx-1.5 my-1 bg-gray-200" })), showTools && (jsxs(DropdownMenuSub, { children: [jsx(SubTrigger, { icon: jsx(SlidersHorizontal, { className: "h-4 w-4 text-gray-600", "aria-hidden": "true" }), label: t('chat.chatComposer.tools'), count: activeToolCount, countLabel: t('chat.chatComposer.activeCount', { count: activeToolCount }), testId: "composer-tools-trigger" }), jsx(Portal2$1, { container: portalContainer !== null && portalContainer !== void 0 ? portalContainer : undefined, children: jsxs(DropdownMenuSubContent, { sideOffset: 6, alignOffset: -7, collisionPadding: 8, "data-testid": "composer-tools-menu", "aria-label": t('chat.chatComposer.tools'), className: cn(POP_CLASS, 'flex max-h-[min(70vh,30rem)] w-56 flex-col gap-0.5 overflow-y-auto'), children: [modes.map((tool) => (jsx(ToolCheckboxItem, { tool: tool, label: toolLabel(tool) }, tool.key))), modes.length > 0 && plainTools.length > 0 && (jsx(DropdownMenuSeparator, { className: "mx-1.5 my-1 bg-gray-200" })), plainTools.map((tool) => (jsx(ToolCheckboxItem, { tool: tool, label: toolLabel(tool) }, tool.key)))] }) })] })), showSkills && (jsxs(DropdownMenuSub, { children: [jsx(SubTrigger, { icon: jsx(Zap, { className: "h-4 w-4 text-gray-600", "aria-hidden": "true" }), label: t('chat.chatInputFormInsideButtons.skills'), count: activeSkillCount, countLabel: t('chat.chatComposer.activeCount', { count: activeSkillCount }), testId: "skills-menu-trigger" }), jsx(Portal2$1, { container: portalContainer !== null && portalContainer !== void 0 ? portalContainer : undefined, children: jsxs(DropdownMenuSubContent, { sideOffset: 6, alignOffset: -7, collisionPadding: 8, "data-testid": "skills-menu-content", "aria-label": t('chat.chatInputFormInsideButtons.skills'), onScroll: handleSkillsScroll, className: cn(POP_CLASS, 'flex max-h-[min(60vh,20rem)] w-56 flex-col gap-0.5 overflow-y-auto'), children: [skills.map((skill) => {
286587
286612
  const armed = activeSkillSlugs.has(skill.slug);
286588
286613
  return (jsxs(CheckboxItem2, { checked: armed, "data-testid": `skills-menu-item-${skill.slug}`, title: `/${skill.slug}`, className: cn(ROW_CLASS, 'h-auto min-h-9 py-1.5'), onSelect: () => onToggleSkill(skill), children: [jsxs("span", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [jsx("span", { "data-testid": "skills-menu-item-name", className: "break-words", children: skill.name }), jsxs("span", { "data-testid": "skills-menu-item-slug", className: "text-xs break-all text-gray-500", children: ["/", skill.slug] })] }), armed && (jsx(Check, { className: "h-4 w-4 text-[#2563eb]", "aria-hidden": "true" }))] }, skill.unique_id));
286589
286614
  }), loadingMoreRow] }) })] })), models && (jsxs(DropdownMenuSub, { children: [jsxs(DropdownMenuSubTrigger, { "data-testid": "composer-model-trigger", className: cn(ROW_CLASS, '[&>svg:last-child]:h-3.5 [&>svg:last-child]:w-3.5 [&>svg:last-child]:text-gray-500'), children: [jsx(Cpu, { className: "h-4 w-4 text-gray-600", "aria-hidden": "true" }), jsx("span", { className: "flex-1", children: t('chat.chatComposer.model') }), jsx("span", { className: "max-w-[96px] truncate text-[13px] text-gray-500", children: models.current.label })] }), jsx(Portal2$1, { container: portalContainer !== null && portalContainer !== void 0 ? portalContainer : undefined, children: jsxs(DropdownMenuSubContent, { sideOffset: 6, alignOffset: -7, collisionPadding: 8, "data-testid": "composer-model-providers", "aria-label": t('chat.chatComposer.modelForThisChat'), className: cn(POP_CLASS, 'flex max-h-[min(70vh,30rem)] w-[272px] flex-col gap-0.5 overflow-y-auto'), children: [jsxs("div", { className: "shrink-0 px-2.5 pt-2 pb-1.5", children: [jsx("div", { className: "text-sm font-semibold text-gray-900", children: t('chat.chatComposer.modelForThisChat') }), jsx("div", { className: "text-xs text-gray-600", children: t('chat.chatComposer.newChatsUseDefault', {
@@ -304920,6 +304920,7 @@ const OutsideButtons = ({
304920
304920
  const UploadMenu = ({ onFileInputTrigger, onCameraTrigger, disabled = false, mentorId, tenantKey, isPublicRoute, }) => {
304921
304921
  const t = useChatT();
304922
304922
  const host = useChatHost();
304923
+ const cameraPickedRef = useRef(false);
304923
304924
  const showAttachment = useShowAttachment({
304924
304925
  mentorId: mentorId || host.mentorId,
304925
304926
  tenantKey: tenantKey || host.tenantKey,
@@ -304935,7 +304936,9 @@ const UploadMenu = ({ onFileInputTrigger, onCameraTrigger, disabled = false, men
304935
304936
  {
304936
304937
  labelKey: 'camera',
304937
304938
  icon: jsx(Camera, { className: "h-5 w-5 text-gray-600" }),
304938
- action: onCameraTrigger,
304939
+ action: () => {
304940
+ cameraPickedRef.current = true;
304941
+ },
304939
304942
  isEnabled: host.features.camera,
304940
304943
  },
304941
304944
  // {
@@ -304965,7 +304968,16 @@ const UploadMenu = ({ onFileInputTrigger, onCameraTrigger, disabled = false, men
304965
304968
  if (!showAttachment || uploadMenuItems.length === 0) {
304966
304969
  return null;
304967
304970
  }
304968
- return (jsxs(DropdownMenu, { children: [jsx(DropdownMenuTrigger, { asChild: true, disabled: disabled, children: jsxs(Button$1, { variant: "ghost", size: "icon", disabled: disabled, "aria-label": t('chat.chatInputFormUploadMenu.attachFile'), className: "h-8 w-8 rounded-lg text-gray-600 transition-all duration-200 hover:border hover:border-[#38A1E5] hover:bg-[#F5F8FF] disabled:cursor-not-allowed disabled:opacity-50", children: [jsx(Plus, { className: "h-4 w-4" }), jsx("span", { className: "sr-only", children: t('chat.chatInputFormUploadMenu.attachFile') })] }) }), jsx(DropdownMenuContent, { align: "start", className: "z-50 w-56 p-2", children: uploadMenuItems.map((item) => (jsxs(DropdownMenuItem, { onClick: item.action, className: "flex cursor-pointer items-center gap-3 rounded-lg p-3 hover:border-[#38A1E5] hover:bg-gray-50", children: [item.icon, jsx("span", { className: "text-gray-700", children: t(`chat.chatInputFormUploadMenu.${item.labelKey}`) })] }, item.labelKey))) })] }));
304971
+ return (jsxs(DropdownMenu, { children: [jsx(DropdownMenuTrigger, { asChild: true, disabled: disabled, children: jsxs(Button$1, { variant: "ghost", size: "icon", disabled: disabled, "aria-label": t('chat.chatInputFormUploadMenu.attachFile'), className: "h-8 w-8 rounded-lg text-gray-600 transition-all duration-200 hover:border hover:border-[#38A1E5] hover:bg-[#F5F8FF] disabled:cursor-not-allowed disabled:opacity-50", children: [jsx(Plus, { className: "h-4 w-4" }), jsx("span", { className: "sr-only", children: t('chat.chatInputFormUploadMenu.attachFile') })] }) }), jsx(DropdownMenuContent, { align: "start", className: "z-50 w-56 p-2",
304972
+ // Opening the camera dialog (a separate Radix copy) while this menu is
304973
+ // mounted leaves <body> stuck at `pointer-events: none`; this fires after
304974
+ // the menu has unmounted.
304975
+ onCloseAutoFocus: () => {
304976
+ if (!cameraPickedRef.current)
304977
+ return;
304978
+ cameraPickedRef.current = false;
304979
+ onCameraTrigger();
304980
+ }, children: uploadMenuItems.map((item) => (jsxs(DropdownMenuItem, { onClick: item.action, className: "flex cursor-pointer items-center gap-3 rounded-lg p-3 hover:border-[#38A1E5] hover:bg-gray-50", children: [item.icon, jsx("span", { className: "text-gray-700", children: t(`chat.chatInputFormUploadMenu.${item.labelKey}`) })] }, item.labelKey))) })] }));
304969
304981
  };
304970
304982
 
304971
304983
  const CameraCaptureDialog = ({ open, onOpenChange, onCapture, facingMode = 'user', }) => {
@@ -306597,6 +306609,7 @@ function ComposerPlusMenu({ isMobile, disabled = false, attachDisabled = false,
306597
306609
  const [memoryOpen, setMemoryOpen] = useState(false);
306598
306610
  const [sheetPage, setSheetPage] = useState(null);
306599
306611
  const [sheetProvider, setSheetProvider] = useState(null);
306612
+ const cameraPickedRef = useRef(false);
306600
306613
  const showAttach = showUpload || showCamera;
306601
306614
  const showTools = tools.length > 0;
306602
306615
  const showSkills = skills.length > 0;
@@ -306656,7 +306669,19 @@ function ComposerPlusMenu({ isMobile, disabled = false, attachDisabled = false,
306656
306669
  }
306657
306670
  // --------------------------------------------------------------- desktop
306658
306671
  const hasListAfterAttach = showTools || showSkills || showModel || showPrompts || showMemory;
306659
- return (jsxs(Popover, { open: memoryOpen, onOpenChange: setMemoryOpen, children: [jsx(PopoverAnchor, { asChild: true, children: jsx("div", { className: "flex shrink-0", children: jsxs(DropdownMenu, { open: menuOpen, onOpenChange: setMenuOpen, children: [jsx(DropdownMenuTrigger, { asChild: true, disabled: disabled, children: trigger }), jsxs(DropdownMenuContent, { align: "start", sideOffset: 8, collisionPadding: 8, "data-testid": "composer-plus-menu", className: cn(POP_CLASS, 'flex w-[248px] flex-col gap-0.5'), children: [showUpload && (jsxs(DropdownMenuItem, { className: ROW_CLASS, disabled: attachDisabled, onSelect: onUploadFile, children: [jsx(Paperclip, { className: "h-4 w-4 text-gray-600", "aria-hidden": "true" }), jsx("span", { className: "flex-1", children: t('chat.chatInputFormUploadMenu.uploadFile') })] })), showCamera && (jsxs(DropdownMenuItem, { className: ROW_CLASS, disabled: attachDisabled, onSelect: onCamera, children: [jsx(Camera, { className: "h-4 w-4 text-gray-600", "aria-hidden": "true" }), jsx("span", { className: "flex-1", children: t('chat.chatInputFormUploadMenu.camera') })] })), showAttach && hasListAfterAttach && (jsx(DropdownMenuSeparator, { className: "mx-1.5 my-1 bg-gray-200" })), showTools && (jsxs(DropdownMenuSub, { children: [jsx(SubTrigger, { icon: jsx(SlidersHorizontal, { className: "h-4 w-4 text-gray-600", "aria-hidden": "true" }), label: t('chat.chatComposer.tools'), count: activeToolCount, countLabel: t('chat.chatComposer.activeCount', { count: activeToolCount }), testId: "composer-tools-trigger" }), jsx(Portal2$1, { container: portalContainer !== null && portalContainer !== void 0 ? portalContainer : undefined, children: jsxs(DropdownMenuSubContent, { sideOffset: 6, alignOffset: -7, collisionPadding: 8, "data-testid": "composer-tools-menu", "aria-label": t('chat.chatComposer.tools'), className: cn(POP_CLASS, 'flex max-h-[min(70vh,30rem)] w-56 flex-col gap-0.5 overflow-y-auto'), children: [modes.map((tool) => (jsx(ToolCheckboxItem, { tool: tool, label: toolLabel(tool) }, tool.key))), modes.length > 0 && plainTools.length > 0 && (jsx(DropdownMenuSeparator, { className: "mx-1.5 my-1 bg-gray-200" })), plainTools.map((tool) => (jsx(ToolCheckboxItem, { tool: tool, label: toolLabel(tool) }, tool.key)))] }) })] })), showSkills && (jsxs(DropdownMenuSub, { children: [jsx(SubTrigger, { icon: jsx(Zap, { className: "h-4 w-4 text-gray-600", "aria-hidden": "true" }), label: t('chat.chatInputFormInsideButtons.skills'), count: activeSkillCount, countLabel: t('chat.chatComposer.activeCount', { count: activeSkillCount }), testId: "skills-menu-trigger" }), jsx(Portal2$1, { container: portalContainer !== null && portalContainer !== void 0 ? portalContainer : undefined, children: jsxs(DropdownMenuSubContent, { sideOffset: 6, alignOffset: -7, collisionPadding: 8, "data-testid": "skills-menu-content", "aria-label": t('chat.chatInputFormInsideButtons.skills'), onScroll: handleSkillsScroll, className: cn(POP_CLASS, 'flex max-h-[min(60vh,20rem)] w-56 flex-col gap-0.5 overflow-y-auto'), children: [skills.map((skill) => {
306672
+ return (jsxs(Popover, { open: memoryOpen, onOpenChange: setMemoryOpen, children: [jsx(PopoverAnchor, { asChild: true, children: jsx("div", { className: "flex shrink-0", children: jsxs(DropdownMenu, { open: menuOpen, onOpenChange: setMenuOpen, children: [jsx(DropdownMenuTrigger, { asChild: true, disabled: disabled, children: trigger }), jsxs(DropdownMenuContent, { align: "start", sideOffset: 8, collisionPadding: 8, "data-testid": "composer-plus-menu", className: cn(POP_CLASS, 'flex w-[248px] flex-col gap-0.5'),
306673
+ // The camera dialog's DismissableLayer is a separate Radix copy from
306674
+ // this menu's: opened while the menu is mounted it records the menu's
306675
+ // `pointer-events: none` on <body> as the original and restores it on
306676
+ // close, freezing the page. This fires after the menu has unmounted.
306677
+ onCloseAutoFocus: () => {
306678
+ if (!cameraPickedRef.current)
306679
+ return;
306680
+ cameraPickedRef.current = false;
306681
+ onCamera();
306682
+ }, children: [showUpload && (jsxs(DropdownMenuItem, { className: ROW_CLASS, disabled: attachDisabled, onSelect: onUploadFile, children: [jsx(Paperclip, { className: "h-4 w-4 text-gray-600", "aria-hidden": "true" }), jsx("span", { className: "flex-1", children: t('chat.chatInputFormUploadMenu.uploadFile') })] })), showCamera && (jsxs(DropdownMenuItem, { className: ROW_CLASS, disabled: attachDisabled, onSelect: () => {
306683
+ cameraPickedRef.current = true;
306684
+ }, children: [jsx(Camera, { className: "h-4 w-4 text-gray-600", "aria-hidden": "true" }), jsx("span", { className: "flex-1", children: t('chat.chatInputFormUploadMenu.camera') })] })), showAttach && hasListAfterAttach && (jsx(DropdownMenuSeparator, { className: "mx-1.5 my-1 bg-gray-200" })), showTools && (jsxs(DropdownMenuSub, { children: [jsx(SubTrigger, { icon: jsx(SlidersHorizontal, { className: "h-4 w-4 text-gray-600", "aria-hidden": "true" }), label: t('chat.chatComposer.tools'), count: activeToolCount, countLabel: t('chat.chatComposer.activeCount', { count: activeToolCount }), testId: "composer-tools-trigger" }), jsx(Portal2$1, { container: portalContainer !== null && portalContainer !== void 0 ? portalContainer : undefined, children: jsxs(DropdownMenuSubContent, { sideOffset: 6, alignOffset: -7, collisionPadding: 8, "data-testid": "composer-tools-menu", "aria-label": t('chat.chatComposer.tools'), className: cn(POP_CLASS, 'flex max-h-[min(70vh,30rem)] w-56 flex-col gap-0.5 overflow-y-auto'), children: [modes.map((tool) => (jsx(ToolCheckboxItem, { tool: tool, label: toolLabel(tool) }, tool.key))), modes.length > 0 && plainTools.length > 0 && (jsx(DropdownMenuSeparator, { className: "mx-1.5 my-1 bg-gray-200" })), plainTools.map((tool) => (jsx(ToolCheckboxItem, { tool: tool, label: toolLabel(tool) }, tool.key)))] }) })] })), showSkills && (jsxs(DropdownMenuSub, { children: [jsx(SubTrigger, { icon: jsx(Zap, { className: "h-4 w-4 text-gray-600", "aria-hidden": "true" }), label: t('chat.chatInputFormInsideButtons.skills'), count: activeSkillCount, countLabel: t('chat.chatComposer.activeCount', { count: activeSkillCount }), testId: "skills-menu-trigger" }), jsx(Portal2$1, { container: portalContainer !== null && portalContainer !== void 0 ? portalContainer : undefined, children: jsxs(DropdownMenuSubContent, { sideOffset: 6, alignOffset: -7, collisionPadding: 8, "data-testid": "skills-menu-content", "aria-label": t('chat.chatInputFormInsideButtons.skills'), onScroll: handleSkillsScroll, className: cn(POP_CLASS, 'flex max-h-[min(60vh,20rem)] w-56 flex-col gap-0.5 overflow-y-auto'), children: [skills.map((skill) => {
306660
306685
  const armed = activeSkillSlugs.has(skill.slug);
306661
306686
  return (jsxs(CheckboxItem2, { checked: armed, "data-testid": `skills-menu-item-${skill.slug}`, title: `/${skill.slug}`, className: cn(ROW_CLASS, 'h-auto min-h-9 py-1.5'), onSelect: () => onToggleSkill(skill), children: [jsxs("span", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [jsx("span", { "data-testid": "skills-menu-item-name", className: "break-words", children: skill.name }), jsxs("span", { "data-testid": "skills-menu-item-slug", className: "text-xs break-all text-gray-500", children: ["/", skill.slug] })] }), armed && (jsx(Check, { className: "h-4 w-4 text-[#2563eb]", "aria-hidden": "true" }))] }, skill.unique_id));
306662
306687
  }), loadingMoreRow] }) })] })), models && (jsxs(DropdownMenuSub, { children: [jsxs(DropdownMenuSubTrigger, { "data-testid": "composer-model-trigger", className: cn(ROW_CLASS, '[&>svg:last-child]:h-3.5 [&>svg:last-child]:w-3.5 [&>svg:last-child]:text-gray-500'), children: [jsx(Cpu, { className: "h-4 w-4 text-gray-600", "aria-hidden": "true" }), jsx("span", { className: "flex-1", children: t('chat.chatComposer.model') }), jsx("span", { className: "max-w-[96px] truncate text-[13px] text-gray-500", children: models.current.label })] }), jsx(Portal2$1, { container: portalContainer !== null && portalContainer !== void 0 ? portalContainer : undefined, children: jsxs(DropdownMenuSubContent, { sideOffset: 6, alignOffset: -7, collisionPadding: 8, "data-testid": "composer-model-providers", "aria-label": t('chat.chatComposer.modelForThisChat'), className: cn(POP_CLASS, 'flex max-h-[min(70vh,30rem)] w-[272px] flex-col gap-0.5 overflow-y-auto'), children: [jsxs("div", { className: "shrink-0 px-2.5 pt-2 pb-1.5", children: [jsx("div", { className: "text-sm font-semibold text-gray-900", children: t('chat.chatComposer.modelForThisChat') }), jsx("div", { className: "text-xs text-gray-600", children: t('chat.chatComposer.newChatsUseDefault', {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iblai/iblai-js",
3
- "version": "2.38.0",
3
+ "version": "2.39.1",
4
4
  "description": "Unified JavaScript SDK for IBL.ai — re-exports data-layer, web-containers, and web-utils under a single package",
5
5
  "type": "module",
6
6
  "engines": {
@@ -76,10 +76,10 @@
76
76
  "axios": "1.13.6",
77
77
  "dotenv": "16.6.1",
78
78
  "winston": "3.19.0",
79
- "@iblai/data-layer": "1.30.1",
80
79
  "@iblai/mcp": "1.30.0",
81
- "@iblai/web-containers": "1.43.0",
82
- "@iblai/web-utils": "2.8.0"
80
+ "@iblai/web-containers": "1.43.1",
81
+ "@iblai/data-layer": "1.30.1",
82
+ "@iblai/web-utils": "2.9.0"
83
83
  },
84
84
  "peerDependencies": {
85
85
  "@iblai/iblai-api": "4.166.0-ai",