@red-hat-developer-hub/backstage-plugin-intelligent-assistant 5.2.0 → 5.3.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.
Files changed (106) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +14 -2
  3. package/dist/alpha.d.ts +24 -0
  4. package/dist/components/AttachmentContext.esm.js +1 -1
  5. package/dist/components/ChatLoadingFallback.esm.js +37 -0
  6. package/dist/components/ChatLoadingFallback.esm.js.map +1 -0
  7. package/dist/components/CollapsedHistoryStrip.esm.js +1 -1
  8. package/dist/components/LightSpeedChat.esm.js +76 -29
  9. package/dist/components/LightSpeedChat.esm.js.map +1 -1
  10. package/dist/components/LightspeedChatBox.esm.js +2 -2
  11. package/dist/components/LightspeedChatBoxHeader.esm.js +30 -2
  12. package/dist/components/LightspeedChatBoxHeader.esm.js.map +1 -1
  13. package/dist/components/LightspeedChatContainer.esm.js +20 -4
  14. package/dist/components/LightspeedChatContainer.esm.js.map +1 -1
  15. package/dist/components/LightspeedDrawerContext.esm.js.map +1 -1
  16. package/dist/components/LightspeedDrawerProvider.esm.js +11 -25
  17. package/dist/components/LightspeedDrawerProvider.esm.js.map +1 -1
  18. package/dist/components/LightspeedFABContent.esm.js +14 -2
  19. package/dist/components/LightspeedFABContent.esm.js.map +1 -1
  20. package/dist/components/LightspeedOverlayChat.esm.js +39 -0
  21. package/dist/components/LightspeedOverlayChat.esm.js.map +1 -0
  22. package/dist/components/McpConfigureServerModal.esm.js +2 -2
  23. package/dist/components/MessageBarModelSelector.esm.js +105 -13
  24. package/dist/components/MessageBarModelSelector.esm.js.map +1 -1
  25. package/dist/components/ScreenContextChip.esm.js +172 -0
  26. package/dist/components/ScreenContextChip.esm.js.map +1 -0
  27. package/dist/components/ToastAlertGroup.esm.js +1 -1
  28. package/dist/components/criticalFabBundle.esm.js +3 -0
  29. package/dist/components/criticalFabBundle.esm.js.map +1 -0
  30. package/dist/components/loaders.esm.js +11 -0
  31. package/dist/components/loaders.esm.js.map +1 -0
  32. package/dist/components/notebooks/AddDocumentModal.esm.js +2 -2
  33. package/dist/components/notebooks/DocumentSidebar.esm.js +1 -1
  34. package/dist/components/notebooks/NotebookCard.esm.js +1 -1
  35. package/dist/components/notebooks/NotebookStreamProvider.esm.js +1 -1
  36. package/dist/components/notebooks/NotebookView.esm.js +3 -3
  37. package/dist/components/notebooks/OverwriteConfirmModal.esm.js +1 -1
  38. package/dist/components/notebooks/UploadResourceScreen.esm.js +1 -1
  39. package/dist/components/notebooks/notebookStreamStore.esm.js +1 -1
  40. package/dist/components/notebooks/notebookStreamStore.esm.js.map +1 -1
  41. package/dist/const.esm.js +9 -1
  42. package/dist/const.esm.js.map +1 -1
  43. package/dist/fabModule.esm.js +51 -0
  44. package/dist/fabModule.esm.js.map +1 -0
  45. package/dist/hooks/screenContextLabelSubscription.esm.js +113 -0
  46. package/dist/hooks/screenContextLabelSubscription.esm.js.map +1 -0
  47. package/dist/hooks/useConversationMessages.esm.js +2 -1
  48. package/dist/hooks/useConversationMessages.esm.js.map +1 -1
  49. package/dist/hooks/useDisplayModeSettings.esm.js +1 -1
  50. package/dist/hooks/useDisplayModeSettings.esm.js.map +1 -1
  51. package/dist/hooks/useLightspeedProviderState.esm.js +1 -2
  52. package/dist/hooks/useLightspeedProviderState.esm.js.map +1 -1
  53. package/dist/hooks/useScreenContextLabelRevision.esm.js +13 -0
  54. package/dist/hooks/useScreenContextLabelRevision.esm.js.map +1 -0
  55. package/dist/hooks/useScreenContextSettings.esm.js +110 -0
  56. package/dist/hooks/useScreenContextSettings.esm.js.map +1 -0
  57. package/dist/hooks/useWindowLocation.esm.js +28 -0
  58. package/dist/hooks/useWindowLocation.esm.js.map +1 -0
  59. package/dist/index.d.ts +1 -15
  60. package/dist/index.esm.js +7 -69
  61. package/dist/index.esm.js.map +1 -1
  62. package/dist/intelligent-assistant-fab-module.d.ts +12 -4
  63. package/dist/intelligent-assistant-fab-module.esm.js +1 -1
  64. package/dist/intelligent-assistant-translations-module.d.ts +10 -4
  65. package/dist/intelligent-assistant-translations-module.esm.js +1 -1
  66. package/dist/lazy/LazyLightspeedChatDrawerContent.esm.js +13 -0
  67. package/dist/lazy/LazyLightspeedChatDrawerContent.esm.js.map +1 -0
  68. package/dist/lazy/LazyLightspeedFabRootWrapper.esm.js +17 -0
  69. package/dist/lazy/LazyLightspeedFabRootWrapper.esm.js.map +1 -0
  70. package/dist/legacy.d.ts +14 -16
  71. package/dist/legacy.esm.js +2 -9
  72. package/dist/legacy.esm.js.map +1 -1
  73. package/dist/loadChatPatternflyStyles.esm.js +14 -0
  74. package/dist/loadChatPatternflyStyles.esm.js.map +1 -0
  75. package/dist/muiClassNameConfig.esm.js +6 -0
  76. package/dist/muiClassNameConfig.esm.js.map +1 -0
  77. package/dist/plugin.esm.js +4 -4
  78. package/dist/plugin.esm.js.map +1 -1
  79. package/dist/translations/de.esm.js +24 -0
  80. package/dist/translations/de.esm.js.map +1 -1
  81. package/dist/translations/es.esm.js +24 -0
  82. package/dist/translations/es.esm.js.map +1 -1
  83. package/dist/translations/fr.esm.js +24 -0
  84. package/dist/translations/fr.esm.js.map +1 -1
  85. package/dist/translations/it.esm.js +24 -0
  86. package/dist/translations/it.esm.js.map +1 -1
  87. package/dist/translations/ja.esm.js +24 -0
  88. package/dist/translations/ja.esm.js.map +1 -1
  89. package/dist/translations/ref.esm.js +24 -0
  90. package/dist/translations/ref.esm.js.map +1 -1
  91. package/dist/translationsModule.esm.js +18 -0
  92. package/dist/translationsModule.esm.js.map +1 -0
  93. package/dist/types.esm.js.map +1 -1
  94. package/dist/utils/dom-selectors.esm.js +22 -2
  95. package/dist/utils/dom-selectors.esm.js.map +1 -1
  96. package/dist/utils/lightspeed-chatbox-message-utils.esm.js +145 -0
  97. package/dist/utils/lightspeed-chatbox-message-utils.esm.js.map +1 -0
  98. package/dist/utils/lightspeed-chatbox-utils.esm.js +20 -144
  99. package/dist/utils/lightspeed-chatbox-utils.esm.js.map +1 -1
  100. package/dist/utils/screen-capture.esm.js +116 -0
  101. package/dist/utils/screen-capture.esm.js.map +1 -0
  102. package/dist/utils/screen-context-utils.esm.js +343 -0
  103. package/dist/utils/screen-context-utils.esm.js.map +1 -0
  104. package/dist/utils/sensitive-data-redactor.esm.js +39 -1
  105. package/dist/utils/sensitive-data-redactor.esm.js.map +1 -1
  106. package/package.json +3 -3
@@ -1,7 +1,7 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
2
  import { forwardRef, useRef, useImperativeHandle, useEffect } from 'react';
3
- import { keyframes, styled } from '@mui/material/styles';
4
- import { MessageBox, ChatbotDisplayMode, ChatbotWelcomePrompt, ToolCall, DeepThinking, Message } from '@patternfly/chatbot';
3
+ import { styled, keyframes } from '@mui/material/styles';
4
+ import { ChatbotDisplayMode, ChatbotWelcomePrompt, ToolCall, DeepThinking, Message, MessageBox } from '@patternfly/chatbot';
5
5
  import { Alert } from '@patternfly/react-core';
6
6
  import { useAutoScroll } from '../hooks/useAutoScroll.esm.js';
7
7
  import { useBufferedMessages } from '../hooks/useBufferedMessages.esm.js';
@@ -4,8 +4,8 @@ import ToggleOffOutlinedIcon from '@mui/icons-material/ToggleOffOutlined';
4
4
  import ToggleOnOutlinedIcon from '@mui/icons-material/ToggleOnOutlined';
5
5
  import Divider from '@mui/material/Divider';
6
6
  import { styled } from '@mui/material/styles';
7
- import { ChatbotHeaderOptionsDropdown, ChatbotDisplayMode, ChatbotHeaderActions } from '@patternfly/chatbot';
8
- import { Dropdown, MenuToggle, DropdownGroup, DropdownList, DropdownItem, Label, Icon } from '@patternfly/react-core';
7
+ import { ChatbotDisplayMode, ChatbotHeaderActions, ChatbotHeaderOptionsDropdown } from '@patternfly/chatbot';
8
+ import { DropdownList, DropdownItem, DropdownGroup, Label, Icon, Dropdown, MenuToggle } from '@patternfly/react-core';
9
9
  import { OutlinedWindowRestoreIcon, OpenDrawerRightIcon, ExpandIcon, RhUiEllipsisVerticalFillIcon } from '@patternfly/react-icons';
10
10
  import { useTranslation } from '../hooks/useTranslation.esm.js';
11
11
  import { McpSettingsIcon } from './McpSettingsIcon.esm.js';
@@ -41,6 +41,9 @@ const LightspeedChatBoxHeader = ({
41
41
  onPinnedChatsToggle,
42
42
  isSavedPromptsEnabled,
43
43
  onSavedPromptsToggle,
44
+ screenContextAdminEnabled = false,
45
+ isScreenContextSharingEnabled = false,
46
+ onScreenContextSharingToggle,
44
47
  onMcpSettingsClick,
45
48
  isModelSelectorDisabled = false,
46
49
  hideModelSelector = false,
@@ -215,6 +218,31 @@ const LightspeedChatBoxHeader = ({
215
218
  },
216
219
  "enableSavedPrompts"
217
220
  ),
221
+ screenContextAdminEnabled && (isScreenContextSharingEnabled ? /* @__PURE__ */ jsx(
222
+ DropdownItem,
223
+ {
224
+ value: "disableScreenContext",
225
+ icon: /* @__PURE__ */ jsx(ToggleOnOutlinedIcon, { sx: { marginTop: "8px" } }),
226
+ description: t(
227
+ "settings.screenContext.enabled.description"
228
+ ),
229
+ onClick: () => onScreenContextSharingToggle?.(false),
230
+ children: t("settings.screenContext.disable")
231
+ },
232
+ "disableScreenContext"
233
+ ) : /* @__PURE__ */ jsx(
234
+ DropdownItem,
235
+ {
236
+ value: "enableScreenContext",
237
+ icon: /* @__PURE__ */ jsx(ToggleOffOutlinedIcon, { sx: { marginTop: "8px" } }),
238
+ description: t(
239
+ "settings.screenContext.disabled.description"
240
+ ),
241
+ onClick: () => onScreenContextSharingToggle?.(true),
242
+ children: t("settings.screenContext.enable")
243
+ },
244
+ "enableScreenContext"
245
+ )),
218
246
  /* @__PURE__ */ jsxs(
219
247
  DropdownItem,
220
248
  {
@@ -1 +1 @@
1
- {"version":3,"file":"LightspeedChatBoxHeader.esm.js","sources":["../../src/components/LightspeedChatBoxHeader.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Ref, useState } from 'react';\n\nimport ToggleOffOutlinedIcon from '@mui/icons-material/ToggleOffOutlined';\nimport ToggleOnOutlinedIcon from '@mui/icons-material/ToggleOnOutlined';\nimport Divider from '@mui/material/Divider';\nimport { styled } from '@mui/material/styles';\nimport {\n ChatbotDisplayMode,\n ChatbotHeaderActions,\n ChatbotHeaderOptionsDropdown,\n} from '@patternfly/chatbot';\nimport {\n Dropdown,\n DropdownGroup,\n DropdownItem,\n DropdownList,\n Icon,\n Label,\n MenuToggle,\n MenuToggleElement,\n} from '@patternfly/react-core';\nimport {\n ExpandIcon,\n OpenDrawerRightIcon,\n OutlinedWindowRestoreIcon,\n RhUiEllipsisVerticalFillIcon,\n} from '@patternfly/react-icons';\n\nimport { useTranslation } from '../hooks/useTranslation';\nimport { McpSettingsIcon } from './McpSettingsIcon';\n\ntype LightspeedChatBoxHeaderProps = {\n displayMode: ChatbotDisplayMode;\n selectedModel: string;\n handleSelectedModel: (item: string) => void;\n models: { label: string; value: string; provider: string }[];\n isPinningChatsEnabled: boolean;\n onPinnedChatsToggle: (state: boolean) => void;\n isSavedPromptsEnabled: boolean;\n onSavedPromptsToggle: (state: boolean) => void;\n onMcpSettingsClick: () => void;\n isModelSelectorDisabled?: boolean;\n hideModelSelector?: boolean;\n /** When false, omits pinned-chats and MCP entries (Chat tab only). */\n showChatTabOptions?: boolean;\n /** When false, shows prompt-only settings label and opens saved-prompts tab. */\n showMcpSettings?: boolean;\n setDisplayMode: (mode: ChatbotDisplayMode) => void;\n};\n\nconst StyledDropdown = styled(Dropdown)({\n '& ul, & li': {\n padding: 0,\n margin: 0,\n },\n});\n\nconst StyledOptionsDropdown = styled(ChatbotHeaderOptionsDropdown)({\n '& ul, & li': {\n padding: 0,\n margin: 0,\n },\n});\n\nconst SelectorToggle = styled(MenuToggle, {\n shouldForwardProp: prop => prop !== 'dimmed',\n})<{ dimmed?: boolean }>(({ theme, dimmed }) => ({\n ...(dimmed && {\n backgroundColor: theme.palette.action.disabled,\n }),\n}));\n\nconst StyledDropdownGroup = styled(DropdownGroup)({\n fontWeight: 'bold',\n});\n\nexport const LightspeedChatBoxHeader = ({\n selectedModel,\n displayMode,\n handleSelectedModel,\n models,\n isPinningChatsEnabled,\n onPinnedChatsToggle,\n isSavedPromptsEnabled,\n onSavedPromptsToggle,\n onMcpSettingsClick,\n isModelSelectorDisabled = false,\n hideModelSelector = false,\n showChatTabOptions = true,\n showMcpSettings = false,\n setDisplayMode,\n}: LightspeedChatBoxHeaderProps) => {\n const [isOptionsMenuOpen, setIsOptionsMenuOpen] = useState(false);\n const { t } = useTranslation();\n\n const maxLabelLength = Math.max(\n ...models.map(m => m.label.length),\n selectedModel.length,\n 1,\n );\n const toggleMinWidth = `${maxLabelLength + 4}ch`;\n\n const toggle = (toggleRef: Ref<MenuToggleElement>) => (\n <SelectorToggle\n dimmed={isModelSelectorDisabled}\n variant=\"secondary\"\n aria-label={t('aria.chatbotSelector')}\n ref={toggleRef}\n isExpanded={isOptionsMenuOpen}\n isDisabled={isModelSelectorDisabled}\n onClick={() => setIsOptionsMenuOpen(!isOptionsMenuOpen)}\n style={{ minWidth: toggleMinWidth }}\n >\n {selectedModel}\n </SelectorToggle>\n );\n\n const handlePinningChatsToggle = (state: boolean) => {\n onPinnedChatsToggle(state);\n };\n\n const handleDockedToWindow = () => {\n setDisplayMode(ChatbotDisplayMode.docked);\n };\n\n const handleFullscreen = () => {\n setDisplayMode(ChatbotDisplayMode.embedded);\n };\n\n const handleOverlay = () => {\n setDisplayMode(ChatbotDisplayMode.default);\n };\n\n const isOverlayMode = displayMode === ChatbotDisplayMode.default;\n const scrollThreshold = isOverlayMode ? 8 : 10;\n const isModelDropdownScrollable = models.length > scrollThreshold;\n\n return (\n <ChatbotHeaderActions>\n {!hideModelSelector && (\n <StyledDropdown\n isOpen={isOptionsMenuOpen}\n onSelect={(_e, value) => {\n handleSelectedModel(value as string);\n setIsOptionsMenuOpen(false);\n }}\n onOpenChange={isOpen => setIsOptionsMenuOpen(isOpen)}\n popperProps={{ position: 'right' }}\n shouldFocusToggleOnSelect\n shouldFocusFirstItemOnOpen={false}\n toggle={toggle}\n isScrollable={isModelDropdownScrollable}\n maxMenuHeight={isModelDropdownScrollable ? '240px' : undefined}\n >\n <DropdownList>\n {models.map(model => (\n <StyledDropdownGroup key={model.label}>\n <DropdownItem\n value={model.value}\n key={model.value}\n isSelected={selectedModel === model.value}\n >\n {model.label}\n </DropdownItem>\n </StyledDropdownGroup>\n ))}\n </DropdownList>\n </StyledDropdown>\n )}\n <StyledOptionsDropdown\n isCompact\n shouldFocusFirstItemOnOpen={false}\n popperProps={{\n position: 'right',\n preventOverflow: true,\n appendTo: () => document.body,\n }}\n toggleProps={{\n 'aria-label': t('aria.options.label'),\n className: 'pf-chatbot__button--toggle-options pf-m-compact',\n icon: (\n <Icon size=\"lg\" isInline>\n <RhUiEllipsisVerticalFillIcon />\n </Icon>\n ),\n }}\n tooltipProps={{\n trigger: 'manual',\n content: '',\n }}\n >\n <DropdownGroup>\n <DropdownList>\n <DropdownItem key=\"displayModeLabel\" isDisabled>\n {t('settings.displayMode.label')}\n </DropdownItem>\n <DropdownItem\n value={ChatbotDisplayMode.default}\n key=\"switchDisplayOverlay\"\n icon={<OutlinedWindowRestoreIcon />}\n onClick={handleOverlay}\n isSelected={displayMode === ChatbotDisplayMode.default}\n >\n {t('settings.displayMode.overlay')}\n </DropdownItem>\n <DropdownItem\n value={ChatbotDisplayMode.docked}\n key=\"switchDisplayDock\"\n icon={<OpenDrawerRightIcon />}\n onClick={handleDockedToWindow}\n isSelected={displayMode === ChatbotDisplayMode.docked}\n >\n {t('settings.displayMode.docked')}\n </DropdownItem>\n <DropdownItem\n value={ChatbotDisplayMode.embedded}\n key=\"switchDisplayFullscreen\"\n icon={<ExpandIcon />}\n onClick={handleFullscreen}\n isSelected={displayMode === ChatbotDisplayMode.embedded}\n >\n {t('settings.displayMode.fullscreen')}\n </DropdownItem>\n </DropdownList>\n </DropdownGroup>\n {showChatTabOptions && (\n <>\n <Divider />\n <DropdownGroup>\n <DropdownList>\n {isPinningChatsEnabled ? (\n <DropdownItem\n value=\"disablePinningChats\"\n key=\"disablePinningChat\"\n icon={<ToggleOnOutlinedIcon sx={{ marginTop: '8px' }} />}\n description={t('settings.pinned.enabled.description')}\n onClick={() => handlePinningChatsToggle(false)}\n >\n {t('settings.pinned.disable')}\n </DropdownItem>\n ) : (\n <DropdownItem\n value=\"enablePinningChats\"\n key=\"enablePinningChats\"\n icon={<ToggleOffOutlinedIcon sx={{ marginTop: '8px' }} />}\n description={t('settings.pinned.disabled.description')}\n onClick={() => handlePinningChatsToggle(true)}\n >\n {t('settings.pinned.enable')}\n </DropdownItem>\n )}\n {isSavedPromptsEnabled ? (\n <DropdownItem\n value=\"disableSavedPrompts\"\n key=\"disableSavedPrompts\"\n icon={<ToggleOnOutlinedIcon sx={{ marginTop: '8px' }} />}\n description={t('settings.savedPrompts.enabled.description')}\n onClick={() => onSavedPromptsToggle(false)}\n >\n {t('settings.savedPrompts.disable')}\n </DropdownItem>\n ) : (\n <DropdownItem\n value=\"enableSavedPrompts\"\n key=\"enableSavedPrompts\"\n icon={<ToggleOffOutlinedIcon sx={{ marginTop: '8px' }} />}\n description={t(\n 'settings.savedPrompts.disabled.description',\n )}\n onClick={() => onSavedPromptsToggle(true)}\n >\n {t('settings.savedPrompts.enable')}\n </DropdownItem>\n )}\n <DropdownItem\n value=\"mcpSettings\"\n key=\"mcpSettings\"\n icon={<McpSettingsIcon />}\n onClick={onMcpSettingsClick}\n >\n {t(\n showMcpSettings\n ? 'settings.mcp.label'\n : 'settings.prompt.label',\n )}\n <Label color=\"purple\" isCompact style={{ marginLeft: 8 }}>\n {t('settings.mcp.badge')}\n </Label>\n </DropdownItem>\n </DropdownList>\n </DropdownGroup>\n </>\n )}\n </StyledOptionsDropdown>\n </ChatbotHeaderActions>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LightspeedChatBoxHeader.esm.js","sources":["../../src/components/LightspeedChatBoxHeader.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Ref, useState } from 'react';\n\nimport ToggleOffOutlinedIcon from '@mui/icons-material/ToggleOffOutlined';\nimport ToggleOnOutlinedIcon from '@mui/icons-material/ToggleOnOutlined';\nimport Divider from '@mui/material/Divider';\nimport { styled } from '@mui/material/styles';\nimport {\n ChatbotDisplayMode,\n ChatbotHeaderActions,\n ChatbotHeaderOptionsDropdown,\n} from '@patternfly/chatbot';\nimport {\n Dropdown,\n DropdownGroup,\n DropdownItem,\n DropdownList,\n Icon,\n Label,\n MenuToggle,\n MenuToggleElement,\n} from '@patternfly/react-core';\nimport {\n ExpandIcon,\n OpenDrawerRightIcon,\n OutlinedWindowRestoreIcon,\n RhUiEllipsisVerticalFillIcon,\n} from '@patternfly/react-icons';\n\nimport { useTranslation } from '../hooks/useTranslation';\nimport { McpSettingsIcon } from './McpSettingsIcon';\n\ntype LightspeedChatBoxHeaderProps = {\n displayMode: ChatbotDisplayMode;\n selectedModel: string;\n handleSelectedModel: (item: string) => void;\n models: { label: string; value: string; provider: string }[];\n isPinningChatsEnabled: boolean;\n onPinnedChatsToggle: (state: boolean) => void;\n isSavedPromptsEnabled: boolean;\n onSavedPromptsToggle: (state: boolean) => void;\n screenContextAdminEnabled?: boolean;\n isScreenContextSharingEnabled?: boolean;\n onScreenContextSharingToggle?: (state: boolean) => void;\n onMcpSettingsClick: () => void;\n isModelSelectorDisabled?: boolean;\n hideModelSelector?: boolean;\n /** When false, omits pinned-chats and MCP entries (Chat tab only). */\n showChatTabOptions?: boolean;\n /** When false, shows prompt-only settings label and opens saved-prompts tab. */\n showMcpSettings?: boolean;\n setDisplayMode: (mode: ChatbotDisplayMode) => void;\n};\n\nconst StyledDropdown = styled(Dropdown)({\n '& ul, & li': {\n padding: 0,\n margin: 0,\n },\n});\n\nconst StyledOptionsDropdown = styled(ChatbotHeaderOptionsDropdown)({\n '& ul, & li': {\n padding: 0,\n margin: 0,\n },\n});\n\nconst SelectorToggle = styled(MenuToggle, {\n shouldForwardProp: prop => prop !== 'dimmed',\n})<{ dimmed?: boolean }>(({ theme, dimmed }) => ({\n ...(dimmed && {\n backgroundColor: theme.palette.action.disabled,\n }),\n}));\n\nconst StyledDropdownGroup = styled(DropdownGroup)({\n fontWeight: 'bold',\n});\n\nexport const LightspeedChatBoxHeader = ({\n selectedModel,\n displayMode,\n handleSelectedModel,\n models,\n isPinningChatsEnabled,\n onPinnedChatsToggle,\n isSavedPromptsEnabled,\n onSavedPromptsToggle,\n screenContextAdminEnabled = false,\n isScreenContextSharingEnabled = false,\n onScreenContextSharingToggle,\n onMcpSettingsClick,\n isModelSelectorDisabled = false,\n hideModelSelector = false,\n showChatTabOptions = true,\n showMcpSettings = false,\n setDisplayMode,\n}: LightspeedChatBoxHeaderProps) => {\n const [isOptionsMenuOpen, setIsOptionsMenuOpen] = useState(false);\n const { t } = useTranslation();\n\n const maxLabelLength = Math.max(\n ...models.map(m => m.label.length),\n selectedModel.length,\n 1,\n );\n const toggleMinWidth = `${maxLabelLength + 4}ch`;\n\n const toggle = (toggleRef: Ref<MenuToggleElement>) => (\n <SelectorToggle\n dimmed={isModelSelectorDisabled}\n variant=\"secondary\"\n aria-label={t('aria.chatbotSelector')}\n ref={toggleRef}\n isExpanded={isOptionsMenuOpen}\n isDisabled={isModelSelectorDisabled}\n onClick={() => setIsOptionsMenuOpen(!isOptionsMenuOpen)}\n style={{ minWidth: toggleMinWidth }}\n >\n {selectedModel}\n </SelectorToggle>\n );\n\n const handlePinningChatsToggle = (state: boolean) => {\n onPinnedChatsToggle(state);\n };\n\n const handleDockedToWindow = () => {\n setDisplayMode(ChatbotDisplayMode.docked);\n };\n\n const handleFullscreen = () => {\n setDisplayMode(ChatbotDisplayMode.embedded);\n };\n\n const handleOverlay = () => {\n setDisplayMode(ChatbotDisplayMode.default);\n };\n\n const isOverlayMode = displayMode === ChatbotDisplayMode.default;\n const scrollThreshold = isOverlayMode ? 8 : 10;\n const isModelDropdownScrollable = models.length > scrollThreshold;\n\n return (\n <ChatbotHeaderActions>\n {!hideModelSelector && (\n <StyledDropdown\n isOpen={isOptionsMenuOpen}\n onSelect={(_e, value) => {\n handleSelectedModel(value as string);\n setIsOptionsMenuOpen(false);\n }}\n onOpenChange={isOpen => setIsOptionsMenuOpen(isOpen)}\n popperProps={{ position: 'right' }}\n shouldFocusToggleOnSelect\n shouldFocusFirstItemOnOpen={false}\n toggle={toggle}\n isScrollable={isModelDropdownScrollable}\n maxMenuHeight={isModelDropdownScrollable ? '240px' : undefined}\n >\n <DropdownList>\n {models.map(model => (\n <StyledDropdownGroup key={model.label}>\n <DropdownItem\n value={model.value}\n key={model.value}\n isSelected={selectedModel === model.value}\n >\n {model.label}\n </DropdownItem>\n </StyledDropdownGroup>\n ))}\n </DropdownList>\n </StyledDropdown>\n )}\n <StyledOptionsDropdown\n isCompact\n shouldFocusFirstItemOnOpen={false}\n popperProps={{\n position: 'right',\n preventOverflow: true,\n appendTo: () => document.body,\n }}\n toggleProps={{\n 'aria-label': t('aria.options.label'),\n className: 'pf-chatbot__button--toggle-options pf-m-compact',\n icon: (\n <Icon size=\"lg\" isInline>\n <RhUiEllipsisVerticalFillIcon />\n </Icon>\n ),\n }}\n tooltipProps={{\n trigger: 'manual',\n content: '',\n }}\n >\n <DropdownGroup>\n <DropdownList>\n <DropdownItem key=\"displayModeLabel\" isDisabled>\n {t('settings.displayMode.label')}\n </DropdownItem>\n <DropdownItem\n value={ChatbotDisplayMode.default}\n key=\"switchDisplayOverlay\"\n icon={<OutlinedWindowRestoreIcon />}\n onClick={handleOverlay}\n isSelected={displayMode === ChatbotDisplayMode.default}\n >\n {t('settings.displayMode.overlay')}\n </DropdownItem>\n <DropdownItem\n value={ChatbotDisplayMode.docked}\n key=\"switchDisplayDock\"\n icon={<OpenDrawerRightIcon />}\n onClick={handleDockedToWindow}\n isSelected={displayMode === ChatbotDisplayMode.docked}\n >\n {t('settings.displayMode.docked')}\n </DropdownItem>\n <DropdownItem\n value={ChatbotDisplayMode.embedded}\n key=\"switchDisplayFullscreen\"\n icon={<ExpandIcon />}\n onClick={handleFullscreen}\n isSelected={displayMode === ChatbotDisplayMode.embedded}\n >\n {t('settings.displayMode.fullscreen')}\n </DropdownItem>\n </DropdownList>\n </DropdownGroup>\n {showChatTabOptions && (\n <>\n <Divider />\n <DropdownGroup>\n <DropdownList>\n {isPinningChatsEnabled ? (\n <DropdownItem\n value=\"disablePinningChats\"\n key=\"disablePinningChat\"\n icon={<ToggleOnOutlinedIcon sx={{ marginTop: '8px' }} />}\n description={t('settings.pinned.enabled.description')}\n onClick={() => handlePinningChatsToggle(false)}\n >\n {t('settings.pinned.disable')}\n </DropdownItem>\n ) : (\n <DropdownItem\n value=\"enablePinningChats\"\n key=\"enablePinningChats\"\n icon={<ToggleOffOutlinedIcon sx={{ marginTop: '8px' }} />}\n description={t('settings.pinned.disabled.description')}\n onClick={() => handlePinningChatsToggle(true)}\n >\n {t('settings.pinned.enable')}\n </DropdownItem>\n )}\n {isSavedPromptsEnabled ? (\n <DropdownItem\n value=\"disableSavedPrompts\"\n key=\"disableSavedPrompts\"\n icon={<ToggleOnOutlinedIcon sx={{ marginTop: '8px' }} />}\n description={t('settings.savedPrompts.enabled.description')}\n onClick={() => onSavedPromptsToggle(false)}\n >\n {t('settings.savedPrompts.disable')}\n </DropdownItem>\n ) : (\n <DropdownItem\n value=\"enableSavedPrompts\"\n key=\"enableSavedPrompts\"\n icon={<ToggleOffOutlinedIcon sx={{ marginTop: '8px' }} />}\n description={t(\n 'settings.savedPrompts.disabled.description',\n )}\n onClick={() => onSavedPromptsToggle(true)}\n >\n {t('settings.savedPrompts.enable')}\n </DropdownItem>\n )}\n {screenContextAdminEnabled &&\n (isScreenContextSharingEnabled ? (\n <DropdownItem\n value=\"disableScreenContext\"\n key=\"disableScreenContext\"\n icon={<ToggleOnOutlinedIcon sx={{ marginTop: '8px' }} />}\n description={t(\n 'settings.screenContext.enabled.description',\n )}\n onClick={() => onScreenContextSharingToggle?.(false)}\n >\n {t('settings.screenContext.disable')}\n </DropdownItem>\n ) : (\n <DropdownItem\n value=\"enableScreenContext\"\n key=\"enableScreenContext\"\n icon={<ToggleOffOutlinedIcon sx={{ marginTop: '8px' }} />}\n description={t(\n 'settings.screenContext.disabled.description',\n )}\n onClick={() => onScreenContextSharingToggle?.(true)}\n >\n {t('settings.screenContext.enable')}\n </DropdownItem>\n ))}\n <DropdownItem\n value=\"mcpSettings\"\n key=\"mcpSettings\"\n icon={<McpSettingsIcon />}\n onClick={onMcpSettingsClick}\n >\n {t(\n showMcpSettings\n ? 'settings.mcp.label'\n : 'settings.prompt.label',\n )}\n <Label color=\"purple\" isCompact style={{ marginLeft: 8 }}>\n {t('settings.mcp.badge')}\n </Label>\n </DropdownItem>\n </DropdownList>\n </DropdownGroup>\n </>\n )}\n </StyledOptionsDropdown>\n </ChatbotHeaderActions>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,5 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
- import '@patternfly/react-core/dist/styles/base-no-reset.css';
3
- import '@patternfly/chatbot/dist/css/main.css';
4
- import { useState, useMemo, useLayoutEffect, useEffect } from 'react';
2
+ import { useState, useEffect, useMemo, useLayoutEffect } from 'react';
5
3
  import { useAsync } from 'react-use';
6
4
  import { useApi, identityApiRef } from '@backstage/core-plugin-api';
7
5
  import { useTheme } from '@mui/material/styles';
@@ -10,8 +8,10 @@ import { useAllModels } from '../hooks/useAllModels.esm.js';
10
8
  import { useIaChatPermission } from '../hooks/useIaChatPermission.esm.js';
11
9
  import { useIaNotebooksPermission } from '../hooks/useIaNotebooksPermission.esm.js';
12
10
  import { useTopicRestrictionStatus } from '../hooks/useQuestionValidation.esm.js';
11
+ import { loadChatPatternflyStyles } from '../loadChatPatternflyStyles.esm.js';
13
12
  import queryClient from '../utils/queryClient.esm.js';
14
13
  import FileAttachmentContextProvider from './AttachmentContext.esm.js';
14
+ import { ChatLoadingFallback } from './ChatLoadingFallback.esm.js';
15
15
  import { LightspeedChat } from './LightSpeedChat.esm.js';
16
16
  import { LightspeedChatModelsLoading, ModelsLoadErrorEmptyState, LcoreNotConfiguredEmptyState } from './LightspeedChatModelsState.esm.js';
17
17
 
@@ -43,7 +43,8 @@ const LightspeedChatContainerInner = () => {
43
43
  () => models ? models.filter((model) => model.model_type === "llm").map((m) => ({
44
44
  label: m.provider_resource_id,
45
45
  value: m.provider_resource_id,
46
- provider: m.provider_id
46
+ provider: m.provider_id,
47
+ supportsVision: m.supportsVision
47
48
  })) : [],
48
49
  [models]
49
50
  );
@@ -134,6 +135,21 @@ const LightspeedChatContainerInner = () => {
134
135
  ) });
135
136
  };
136
137
  const LightspeedChatContainer = () => {
138
+ const [stylesReady, setStylesReady] = useState(false);
139
+ useEffect(() => {
140
+ let cancelled = false;
141
+ loadChatPatternflyStyles().then(() => {
142
+ if (!cancelled) {
143
+ setStylesReady(true);
144
+ }
145
+ });
146
+ return () => {
147
+ cancelled = true;
148
+ };
149
+ }, []);
150
+ if (!stylesReady) {
151
+ return /* @__PURE__ */ jsx(ChatLoadingFallback, {});
152
+ }
137
153
  return /* @__PURE__ */ jsx(QueryClientProvider, { client: queryClient, children: /* @__PURE__ */ jsx(LightspeedChatContainerInner, {}) });
138
154
  };
139
155
 
@@ -1 +1 @@
1
- {"version":3,"file":"LightspeedChatContainer.esm.js","sources":["../../src/components/LightspeedChatContainer.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport '@patternfly/react-core/dist/styles/base-no-reset.css';\nimport '@patternfly/chatbot/dist/css/main.css';\n\nimport { useEffect, useLayoutEffect, useMemo, useState } from 'react';\nimport { useAsync } from 'react-use';\n\nimport { identityApiRef, useApi } from '@backstage/core-plugin-api';\n\nimport { useTheme } from '@mui/material/styles';\nimport { QueryClientProvider } from '@tanstack/react-query';\n\nimport { useAllModels } from '../hooks/useAllModels';\nimport { useIaChatPermission } from '../hooks/useIaChatPermission';\nimport { useIaNotebooksPermission } from '../hooks/useIaNotebooksPermission';\nimport { useTopicRestrictionStatus } from '../hooks/useQuestionValidation';\nimport queryClient from '../utils/queryClient';\nimport FileAttachmentContextProvider from './AttachmentContext';\nimport { LightspeedChat } from './LightSpeedChat';\nimport {\n LcoreNotConfiguredEmptyState,\n LightspeedChatModelsLoading,\n ModelsLoadErrorEmptyState,\n} from './LightspeedChatModelsState';\n\nconst THEME_DARK = 'dark';\nconst THEME_DARK_CLASS = 'pf-v6-theme-dark';\nconst LAST_SELECTED_MODEL_KEY = 'lastSelectedModel';\n\n/**\n * Inner component that contains all the Lightspeed chat rendering logic\n */\nconst LightspeedChatContainerInner = () => {\n const {\n palette: { mode },\n } = useTheme();\n\n const identityApi = useApi(identityApiRef);\n\n const { allowed: hasChatAccess, loading: chatPermissionLoading } =\n useIaChatPermission();\n\n const { allowed: hasNotebooksAccess, loading: notebooksPermissionLoading } =\n useIaNotebooksPermission();\n\n const permissionsLoading =\n chatPermissionLoading || notebooksPermissionLoading;\n const hasPluginAccess = hasChatAccess || hasNotebooksAccess;\n\n const {\n data: models,\n isLoading: modelsLoading,\n isError: modelsError,\n refetch: refetchModels,\n } = useAllModels(hasChatAccess);\n\n const { value: profile, loading: profileLoading } = useAsync(\n async () => await identityApi.getProfileInfo(),\n );\n\n const [selectedModel, setSelectedModel] = useState('');\n const [selectedProvider, setSelectedProvider] = useState('');\n\n const { data: topicRestrictionEnabled } =\n useTopicRestrictionStatus(hasChatAccess);\n\n const modelsItems = useMemo(\n () =>\n models\n ? models\n .filter(model => model.model_type === 'llm')\n .map(m => ({\n label: m.provider_resource_id,\n value: m.provider_resource_id,\n provider: m.provider_id,\n }))\n : [],\n [models],\n );\n\n useLayoutEffect(() => {\n const htmlTagElement = document.documentElement;\n if (mode === THEME_DARK) {\n htmlTagElement.classList.add(THEME_DARK_CLASS);\n } else {\n htmlTagElement.classList.remove(THEME_DARK_CLASS);\n }\n }, [mode]);\n\n // Load last selected model from localStorage\n useEffect(() => {\n if (!hasChatAccess || modelsItems.length === 0) {\n return;\n }\n\n try {\n const storedData = localStorage.getItem(LAST_SELECTED_MODEL_KEY);\n const parsedData = storedData ? JSON.parse(storedData) : null;\n\n const storedModel = parsedData?.model\n ? modelsItems.find(m => m.value === parsedData.model)\n : null;\n\n if (storedModel) {\n setSelectedModel(storedModel.value);\n setSelectedProvider(storedModel.provider);\n } else {\n setSelectedModel(modelsItems[0].value);\n setSelectedProvider(modelsItems[0].provider);\n }\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(\n 'Error loading last selected model from localStorage:',\n error,\n );\n setSelectedModel(modelsItems[0].value);\n setSelectedProvider(modelsItems[0].provider);\n }\n }, [hasChatAccess, modelsItems]);\n\n // Save selected model to localStorage\n useEffect(() => {\n if (selectedModel && selectedProvider) {\n try {\n localStorage.setItem(\n LAST_SELECTED_MODEL_KEY,\n JSON.stringify({\n model: selectedModel,\n provider: selectedProvider,\n }),\n );\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(\n 'Error saving last selected model to localStorage:',\n error,\n );\n }\n }\n }, [selectedModel, selectedProvider]);\n\n if (permissionsLoading) {\n // Never return null inside the overlay modal: PatternFly's focus-trap requires at least\n // one tabbable node (e.g. after removing the modal close button). Locale switches can\n // briefly re-enter this loading state.\n return <LightspeedChatModelsLoading />;\n }\n\n if (!hasPluginAccess) {\n return null;\n }\n\n if (hasChatAccess && modelsLoading) {\n return <LightspeedChatModelsLoading />;\n }\n\n // TanStack Query can keep the last successful `data` while `isError` is true after a\n // failed refetch. Prefer showing chat when we still have LLM rows; only use the full-page\n // error state when there is nothing usable to render.\n if (hasChatAccess && modelsError && modelsItems.length === 0) {\n return <ModelsLoadErrorEmptyState onRetry={() => refetchModels()} />;\n }\n\n if (hasChatAccess && modelsItems.length === 0) {\n return <LcoreNotConfiguredEmptyState />;\n }\n\n const resolvedSelectedModel = selectedModel || modelsItems[0]?.value || '';\n const resolvedSelectedProvider =\n selectedProvider || modelsItems[0]?.provider || '';\n\n return (\n <FileAttachmentContextProvider>\n <LightspeedChat\n selectedModel={resolvedSelectedModel}\n selectedProvider={resolvedSelectedProvider}\n topicRestrictionEnabled={topicRestrictionEnabled ?? false}\n handleSelectedModel={item => {\n setSelectedModel(item);\n setSelectedProvider(\n modelsItems.find((m: any) => m.value === item)?.provider || '',\n );\n }}\n models={modelsItems}\n userName={profile?.displayName}\n avatar={profile?.picture}\n profileLoading={profileLoading}\n />\n </FileAttachmentContextProvider>\n );\n};\n\n/**\n * @public\n */\nexport const LightspeedChatContainer = () => {\n return (\n <QueryClientProvider client={queryClient}>\n <LightspeedChatContainerInner />\n </QueryClientProvider>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LightspeedChatContainer.esm.js","sources":["../../src/components/LightspeedChatContainer.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useEffect, useLayoutEffect, useMemo, useState } from 'react';\nimport { useAsync } from 'react-use';\n\nimport { identityApiRef, useApi } from '@backstage/core-plugin-api';\n\nimport { useTheme } from '@mui/material/styles';\nimport { QueryClientProvider } from '@tanstack/react-query';\n\nimport { useAllModels } from '../hooks/useAllModels';\nimport { useIaChatPermission } from '../hooks/useIaChatPermission';\nimport { useIaNotebooksPermission } from '../hooks/useIaNotebooksPermission';\nimport { useTopicRestrictionStatus } from '../hooks/useQuestionValidation';\nimport { loadChatPatternflyStyles } from '../loadChatPatternflyStyles';\nimport queryClient from '../utils/queryClient';\nimport FileAttachmentContextProvider from './AttachmentContext';\nimport { ChatLoadingFallback } from './ChatLoadingFallback';\nimport { LightspeedChat } from './LightSpeedChat';\nimport {\n LcoreNotConfiguredEmptyState,\n LightspeedChatModelsLoading,\n ModelsLoadErrorEmptyState,\n} from './LightspeedChatModelsState';\n\nconst THEME_DARK = 'dark';\nconst THEME_DARK_CLASS = 'pf-v6-theme-dark';\nconst LAST_SELECTED_MODEL_KEY = 'lastSelectedModel';\n\n/**\n * Inner component that contains all the Lightspeed chat rendering logic\n */\nconst LightspeedChatContainerInner = () => {\n const {\n palette: { mode },\n } = useTheme();\n\n const identityApi = useApi(identityApiRef);\n\n const { allowed: hasChatAccess, loading: chatPermissionLoading } =\n useIaChatPermission();\n\n const { allowed: hasNotebooksAccess, loading: notebooksPermissionLoading } =\n useIaNotebooksPermission();\n\n const permissionsLoading =\n chatPermissionLoading || notebooksPermissionLoading;\n const hasPluginAccess = hasChatAccess || hasNotebooksAccess;\n\n const {\n data: models,\n isLoading: modelsLoading,\n isError: modelsError,\n refetch: refetchModels,\n } = useAllModels(hasChatAccess);\n\n const { value: profile, loading: profileLoading } = useAsync(\n async () => await identityApi.getProfileInfo(),\n );\n\n const [selectedModel, setSelectedModel] = useState('');\n const [selectedProvider, setSelectedProvider] = useState('');\n\n const { data: topicRestrictionEnabled } =\n useTopicRestrictionStatus(hasChatAccess);\n\n const modelsItems = useMemo(\n () =>\n models\n ? models\n .filter(model => model.model_type === 'llm')\n .map(m => ({\n label: m.provider_resource_id,\n value: m.provider_resource_id,\n provider: m.provider_id,\n supportsVision: m.supportsVision,\n }))\n : [],\n [models],\n );\n\n useLayoutEffect(() => {\n const htmlTagElement = document.documentElement;\n if (mode === THEME_DARK) {\n htmlTagElement.classList.add(THEME_DARK_CLASS);\n } else {\n htmlTagElement.classList.remove(THEME_DARK_CLASS);\n }\n }, [mode]);\n\n // Load last selected model from localStorage\n useEffect(() => {\n if (!hasChatAccess || modelsItems.length === 0) {\n return;\n }\n\n try {\n const storedData = localStorage.getItem(LAST_SELECTED_MODEL_KEY);\n const parsedData = storedData ? JSON.parse(storedData) : null;\n\n const storedModel = parsedData?.model\n ? modelsItems.find(m => m.value === parsedData.model)\n : null;\n\n if (storedModel) {\n setSelectedModel(storedModel.value);\n setSelectedProvider(storedModel.provider);\n } else {\n setSelectedModel(modelsItems[0].value);\n setSelectedProvider(modelsItems[0].provider);\n }\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(\n 'Error loading last selected model from localStorage:',\n error,\n );\n setSelectedModel(modelsItems[0].value);\n setSelectedProvider(modelsItems[0].provider);\n }\n }, [hasChatAccess, modelsItems]);\n\n // Save selected model to localStorage\n useEffect(() => {\n if (selectedModel && selectedProvider) {\n try {\n localStorage.setItem(\n LAST_SELECTED_MODEL_KEY,\n JSON.stringify({\n model: selectedModel,\n provider: selectedProvider,\n }),\n );\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(\n 'Error saving last selected model to localStorage:',\n error,\n );\n }\n }\n }, [selectedModel, selectedProvider]);\n\n if (permissionsLoading) {\n // Never return null inside the overlay modal: PatternFly's focus-trap requires at least\n // one tabbable node (e.g. after removing the modal close button). Locale switches can\n // briefly re-enter this loading state.\n return <LightspeedChatModelsLoading />;\n }\n\n if (!hasPluginAccess) {\n return null;\n }\n\n if (hasChatAccess && modelsLoading) {\n return <LightspeedChatModelsLoading />;\n }\n\n // TanStack Query can keep the last successful `data` while `isError` is true after a\n // failed refetch. Prefer showing chat when we still have LLM rows; only use the full-page\n // error state when there is nothing usable to render.\n if (hasChatAccess && modelsError && modelsItems.length === 0) {\n return <ModelsLoadErrorEmptyState onRetry={() => refetchModels()} />;\n }\n\n if (hasChatAccess && modelsItems.length === 0) {\n return <LcoreNotConfiguredEmptyState />;\n }\n\n const resolvedSelectedModel = selectedModel || modelsItems[0]?.value || '';\n const resolvedSelectedProvider =\n selectedProvider || modelsItems[0]?.provider || '';\n\n return (\n <FileAttachmentContextProvider>\n <LightspeedChat\n selectedModel={resolvedSelectedModel}\n selectedProvider={resolvedSelectedProvider}\n topicRestrictionEnabled={topicRestrictionEnabled ?? false}\n handleSelectedModel={item => {\n setSelectedModel(item);\n setSelectedProvider(\n modelsItems.find((m: any) => m.value === item)?.provider || '',\n );\n }}\n models={modelsItems}\n userName={profile?.displayName}\n avatar={profile?.picture}\n profileLoading={profileLoading}\n />\n </FileAttachmentContextProvider>\n );\n};\n\n/**\n * @public\n */\nexport const LightspeedChatContainer = () => {\n const [stylesReady, setStylesReady] = useState(false);\n\n useEffect(() => {\n let cancelled = false;\n loadChatPatternflyStyles().then(() => {\n if (!cancelled) {\n setStylesReady(true);\n }\n });\n return () => {\n cancelled = true;\n };\n }, []);\n\n if (!stylesReady) {\n return <ChatLoadingFallback />;\n }\n\n return (\n <QueryClientProvider client={queryClient}>\n <LightspeedChatContainerInner />\n </QueryClientProvider>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"LightspeedDrawerContext.esm.js","sources":["../../src/components/LightspeedDrawerContext.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createContext } from 'react';\n\nimport { ChatbotDisplayMode } from '@patternfly/chatbot';\n\nimport type { SettingsTab } from '../hooks/useSettingsPanelUrlState';\nimport { FileContent } from '../types';\n\n/**\n * When switching to fullscreen (embedded), open the notebooks list or a specific session.\n *\n * @public\n */\nexport type LightspeedEmbeddedNotebooksTarget =\n 'notebooks' | { notebookSessionId: string };\n\n/**\n * Type for LightspeedDrawerContext\n *\n * @public\n */\nexport interface LightspeedDrawerContextType {\n /**\n * Whether the chatbot is active\n */\n isChatbotActive: boolean;\n /**\n * Toggle the chatbot open/closed\n */\n toggleChatbot: () => void;\n /**\n * The current display mode\n */\n displayMode: ChatbotDisplayMode;\n /**\n * Set the display mode (overlay, docked, or fullscreen/embedded).\n * When entering embedded mode, optional `embeddedNotebooks` navigates to\n * `/lightspeed/notebooks` (or a session URL) instead of the chat route.\n * Notebooks are available in all display modes; the shell tab and active\n * notebook are preserved across mode switches.\n */\n setDisplayMode: (\n mode: ChatbotDisplayMode,\n conversationIdParam?: string,\n embeddedNotebooks?: LightspeedEmbeddedNotebooksTarget,\n ) => void;\n /**\n * The drawer width (for docked mode)\n */\n drawerWidth: number;\n /**\n * The function for setting the drawer width\n */\n setDrawerWidth: React.Dispatch<React.SetStateAction<number>>;\n /**\n * The current conversation ID\n */\n currentConversationId?: string;\n /**\n * Set the current conversation ID and update the route if in embedded mode\n * Pass undefined to clear the conversation (example: for new chat)\n */\n setCurrentConversationId: (id: string | undefined) => void;\n /**\n * The message in the chat input box\n * Used to preserve input content when switching between display modes\n */\n draftMessage: string;\n /**\n * To save the input message as a draft when switching modes\n */\n setDraftMessage: (message: string) => void;\n /**\n * The file attachments in the chat input\n * Used to preserve file attachments when switching between display modes\n */\n draftFileContents: FileContent[];\n /**\n * To save file attachments as a draft when switching modes\n */\n setDraftFileContents: (files: FileContent[]) => void;\n /**\n * @internal After leaving fullscreen for overlay/docked, the next overlay/docked chat\n * mount should seed the thread from currentConversationId (or TEMP) instead of storage\n * lastOpened. Returns true at most once per handoff.\n */\n consumePendingOverlayThreadHandoff?: () => boolean;\n /**\n * Chat tab is 0, Notebooks tab is 1. Persisted across overlay/docked/fullscreen remounts\n * (each display mode mounts its own `LightspeedChat` tree).\n */\n shellViewTab: number;\n setShellViewTab: (tab: number) => void;\n /**\n * ID of the currently active notebook session, persisted across\n * overlay/docked/fullscreen remounts so display-mode switches preserve\n * the open notebook.\n */\n activeNotebookId: string | undefined;\n setActiveNotebookId: (id: string | undefined) => void;\n /**\n * Active settings tab when the settings panel is open; null when closed.\n * Persisted across overlay/docked/fullscreen remounts.\n */\n settingsTab: SettingsTab | null;\n setSettingsTab: (tab: SettingsTab | null) => void;\n}\n\nconst CONTEXT_KEY = '__lightspeed_drawer_context__' as keyof typeof globalThis;\n\nfunction getOrCreateContext() {\n const existing = (globalThis as any)[CONTEXT_KEY];\n if (existing)\n return existing as React.Context<LightspeedDrawerContextType | undefined>;\n const ctx = createContext<LightspeedDrawerContextType | undefined>(undefined);\n (globalThis as any)[CONTEXT_KEY] = ctx;\n return ctx;\n}\n\n/**\n * @public\n */\nexport const LightspeedDrawerContext = getOrCreateContext();\n"],"names":[],"mappings":";;AA2HA,MAAM,WAAA,GAAc,+BAAA;AAEpB,SAAS,kBAAA,GAAqB;AAC5B,EAAA,MAAM,QAAA,GAAY,WAAmB,WAAW,CAAA;AAChD,EAAA,IAAI,QAAA;AACF,IAAA,OAAO,QAAA;AACT,EAAA,MAAM,GAAA,GAAM,cAAuD,MAAS,CAAA;AAC5E,EAAC,UAAA,CAAmB,WAAW,CAAA,GAAI,GAAA;AACnC,EAAA,OAAO,GAAA;AACT;AAKO,MAAM,0BAA0B,kBAAA;;;;"}
1
+ {"version":3,"file":"LightspeedDrawerContext.esm.js","sources":["../../src/components/LightspeedDrawerContext.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createContext } from 'react';\n\nimport type { ChatbotDisplayMode } from '../const';\nimport type { SettingsTab } from '../hooks/useSettingsPanelUrlState';\nimport { FileContent } from '../types';\n\n/**\n * When switching to fullscreen (embedded), open the notebooks list or a specific session.\n *\n * @public\n */\nexport type LightspeedEmbeddedNotebooksTarget =\n 'notebooks' | { notebookSessionId: string };\n\n/**\n * Type for LightspeedDrawerContext\n *\n * @public\n */\nexport interface LightspeedDrawerContextType {\n /**\n * Whether the chatbot is active\n */\n isChatbotActive: boolean;\n /**\n * Toggle the chatbot open/closed\n */\n toggleChatbot: () => void;\n /**\n * The current display mode\n */\n displayMode: ChatbotDisplayMode;\n /**\n * Set the display mode (overlay, docked, or fullscreen/embedded).\n * When entering embedded mode, optional `embeddedNotebooks` navigates to\n * `/lightspeed/notebooks` (or a session URL) instead of the chat route.\n * Notebooks are available in all display modes; the shell tab and active\n * notebook are preserved across mode switches.\n */\n setDisplayMode: (\n mode: ChatbotDisplayMode,\n conversationIdParam?: string,\n embeddedNotebooks?: LightspeedEmbeddedNotebooksTarget,\n ) => void;\n /**\n * The drawer width (for docked mode)\n */\n drawerWidth: number;\n /**\n * The function for setting the drawer width\n */\n setDrawerWidth: React.Dispatch<React.SetStateAction<number>>;\n /**\n * The current conversation ID\n */\n currentConversationId?: string;\n /**\n * Set the current conversation ID and update the route if in embedded mode\n * Pass undefined to clear the conversation (example: for new chat)\n */\n setCurrentConversationId: (id: string | undefined) => void;\n /**\n * The message in the chat input box\n * Used to preserve input content when switching between display modes\n */\n draftMessage: string;\n /**\n * To save the input message as a draft when switching modes\n */\n setDraftMessage: (message: string) => void;\n /**\n * The file attachments in the chat input\n * Used to preserve file attachments when switching between display modes\n */\n draftFileContents: FileContent[];\n /**\n * To save file attachments as a draft when switching modes\n */\n setDraftFileContents: (files: FileContent[]) => void;\n /**\n * @internal After leaving fullscreen for overlay/docked, the next overlay/docked chat\n * mount should seed the thread from currentConversationId (or TEMP) instead of storage\n * lastOpened. Returns true at most once per handoff.\n */\n consumePendingOverlayThreadHandoff?: () => boolean;\n /**\n * Chat tab is 0, Notebooks tab is 1. Persisted across overlay/docked/fullscreen remounts\n * (each display mode mounts its own `LightspeedChat` tree).\n */\n shellViewTab: number;\n setShellViewTab: (tab: number) => void;\n /**\n * ID of the currently active notebook session, persisted across\n * overlay/docked/fullscreen remounts so display-mode switches preserve\n * the open notebook.\n */\n activeNotebookId: string | undefined;\n setActiveNotebookId: (id: string | undefined) => void;\n /**\n * Active settings tab when the settings panel is open; null when closed.\n * Persisted across overlay/docked/fullscreen remounts.\n */\n settingsTab: SettingsTab | null;\n setSettingsTab: (tab: SettingsTab | null) => void;\n}\n\nconst CONTEXT_KEY = '__lightspeed_drawer_context__' as keyof typeof globalThis;\n\nfunction getOrCreateContext() {\n const existing = (globalThis as any)[CONTEXT_KEY];\n if (existing)\n return existing as React.Context<LightspeedDrawerContextType | undefined>;\n const ctx = createContext<LightspeedDrawerContextType | undefined>(undefined);\n (globalThis as any)[CONTEXT_KEY] = ctx;\n return ctx;\n}\n\n/**\n * @public\n */\nexport const LightspeedDrawerContext = getOrCreateContext();\n"],"names":[],"mappings":";;AA0HA,MAAM,WAAA,GAAc,+BAAA;AAEpB,SAAS,kBAAA,GAAqB;AAC5B,EAAA,MAAM,QAAA,GAAY,WAAmB,WAAW,CAAA;AAChD,EAAA,IAAI,QAAA;AACF,IAAA,OAAO,QAAA;AACT,EAAA,MAAM,GAAA,GAAM,cAAuD,MAAS,CAAA;AAC5E,EAAC,UAAA,CAAmB,WAAW,CAAA,GAAI,GAAA;AACnC,EAAA,OAAO,GAAA;AACT;AAKO,MAAM,0BAA0B,kBAAA;;;;"}
@@ -1,40 +1,26 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
- import { styled } from '@mui/material/styles';
3
- import { ChatbotModal } from '@patternfly/chatbot';
4
- import { DOCKED_CONTENT_OFFSET, LIGHTSPEED_OVERLAY_MAX_WIDTH, LIGHTSPEED_OVERLAY_RIGHT, LIGHTSPEED_OVERLAY_BOTTOM, LIGHTSPEED_OVERLAY_CHATBOT_MODAL_CLASS } from '../const.esm.js';
2
+ import { Suspense, lazy } from 'react';
5
3
  import { useLightspeedProviderState } from '../hooks/useLightspeedProviderState.esm.js';
6
- import { LightspeedChatContainer } from './LightspeedChatContainer.esm.js';
4
+ import { ChatLoadingFallback } from './ChatLoadingFallback.esm.js';
7
5
  import { LightspeedDrawerContext } from './LightspeedDrawerContext.esm.js';
8
6
  import { NotebookStreamProvider } from './notebooks/NotebookStreamProvider.esm.js';
9
7
 
10
- const StyledChatbotModal = styled(ChatbotModal)(() => ({
11
- boxShadow: "0 14px 20px -7px rgba(0, 0, 0, 0.22), 0 32px 50px 6px rgba(0, 0, 0, 0.16), 0 12px 60px 12px rgba(0, 0, 0, 0.14) !important",
12
- bottom: `${LIGHTSPEED_OVERLAY_BOTTOM} !important`,
13
- right: `${LIGHTSPEED_OVERLAY_RIGHT} !important`,
14
- maxWidth: `${LIGHTSPEED_OVERLAY_MAX_WIDTH} !important`,
15
- overflow: "hidden",
16
- transition: "margin-right 0.3s ease, bottom 0.3s ease, right 0.3s ease, inset-block-end 0.3s ease, inset-inline-end 0.3s ease",
17
- "body.docked-drawer-open &": {
18
- marginRight: DOCKED_CONTENT_OFFSET
19
- }
20
- }));
8
+ const LazyLightspeedOverlayChat = lazy(
9
+ () => import('./LightspeedOverlayChat.esm.js').then((m) => ({
10
+ default: m.LightspeedOverlayChat
11
+ }))
12
+ );
21
13
  const LightspeedDrawerProvider = ({ children }) => {
22
14
  const { contextValue, shouldRenderOverlayModal, closeChatbot } = useLightspeedProviderState();
23
15
  return /* @__PURE__ */ jsx(LightspeedDrawerContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsxs(NotebookStreamProvider, { children: [
24
16
  children,
25
- shouldRenderOverlayModal && /* @__PURE__ */ jsx(
26
- StyledChatbotModal,
17
+ shouldRenderOverlayModal && /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(ChatLoadingFallback, { variant: "overlay" }), children: /* @__PURE__ */ jsx(
18
+ LazyLightspeedOverlayChat,
27
19
  {
28
- isOpen: true,
29
- className: LIGHTSPEED_OVERLAY_CHATBOT_MODAL_CLASS,
30
20
  displayMode: contextValue.displayMode,
31
- disableFocusTrap: true,
32
- onEscapePress: () => closeChatbot(),
33
- ouiaId: "LightspeedChatbotModal",
34
- "aria-labelledby": "lightspeed-chatpopup-modal",
35
- children: /* @__PURE__ */ jsx(LightspeedChatContainer, {})
21
+ onEscapePress: () => closeChatbot()
36
22
  }
37
- )
23
+ ) })
38
24
  ] }) });
39
25
  };
40
26
 
@@ -1 +1 @@
1
- {"version":3,"file":"LightspeedDrawerProvider.esm.js","sources":["../../src/components/LightspeedDrawerProvider.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { PropsWithChildren } from 'react';\n\nimport { styled } from '@mui/material/styles';\nimport { ChatbotModal } from '@patternfly/chatbot';\n\nimport {\n DOCKED_CONTENT_OFFSET,\n LIGHTSPEED_OVERLAY_BOTTOM,\n LIGHTSPEED_OVERLAY_CHATBOT_MODAL_CLASS,\n LIGHTSPEED_OVERLAY_MAX_WIDTH,\n LIGHTSPEED_OVERLAY_RIGHT,\n} from '../const';\nimport { useLightspeedProviderState } from '../hooks/useLightspeedProviderState';\nimport { LightspeedChatContainer } from './LightspeedChatContainer';\nimport { LightspeedDrawerContext } from './LightspeedDrawerContext';\nimport { NotebookStreamProvider } from './notebooks/NotebookStreamProvider';\n\nconst StyledChatbotModal = styled(ChatbotModal)(() => ({\n boxShadow:\n '0 14px 20px -7px rgba(0, 0, 0, 0.22), 0 32px 50px 6px rgba(0, 0, 0, 0.16), 0 12px 60px 12px rgba(0, 0, 0, 0.14) !important',\n bottom: `${LIGHTSPEED_OVERLAY_BOTTOM} !important`,\n right: `${LIGHTSPEED_OVERLAY_RIGHT} !important`,\n maxWidth: `${LIGHTSPEED_OVERLAY_MAX_WIDTH} !important`,\n overflow: 'hidden',\n transition:\n 'margin-right 0.3s ease, bottom 0.3s ease, right 0.3s ease, inset-block-end 0.3s ease, inset-inline-end 0.3s ease',\n 'body.docked-drawer-open &': {\n marginRight: DOCKED_CONTENT_OFFSET,\n },\n}));\n\n/**\n * @public\n */\nexport const LightspeedDrawerProvider = ({ children }: PropsWithChildren) => {\n const { contextValue, shouldRenderOverlayModal, closeChatbot } =\n useLightspeedProviderState();\n\n return (\n <LightspeedDrawerContext.Provider value={contextValue}>\n <NotebookStreamProvider>\n {children}\n {shouldRenderOverlayModal && (\n <StyledChatbotModal\n isOpen\n className={LIGHTSPEED_OVERLAY_CHATBOT_MODAL_CLASS}\n displayMode={contextValue.displayMode}\n disableFocusTrap\n onEscapePress={() => closeChatbot()}\n ouiaId=\"LightspeedChatbotModal\"\n aria-labelledby=\"lightspeed-chatpopup-modal\"\n >\n <LightspeedChatContainer />\n </StyledChatbotModal>\n )}\n </NotebookStreamProvider>\n </LightspeedDrawerContext.Provider>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AAiCA,MAAM,kBAAA,GAAqB,MAAA,CAAO,YAAY,CAAA,CAAE,OAAO;AAAA,EACrD,SAAA,EACE,4HAAA;AAAA,EACF,MAAA,EAAQ,GAAG,yBAAyB,CAAA,WAAA,CAAA;AAAA,EACpC,KAAA,EAAO,GAAG,wBAAwB,CAAA,WAAA,CAAA;AAAA,EAClC,QAAA,EAAU,GAAG,4BAA4B,CAAA,WAAA,CAAA;AAAA,EACzC,QAAA,EAAU,QAAA;AAAA,EACV,UAAA,EACE,kHAAA;AAAA,EACF,2BAAA,EAA6B;AAAA,IAC3B,WAAA,EAAa;AAAA;AAEjB,CAAA,CAAE,CAAA;AAKK,MAAM,wBAAA,GAA2B,CAAC,EAAE,QAAA,EAAS,KAAyB;AAC3E,EAAA,MAAM,EAAE,YAAA,EAAc,wBAAA,EAA0B,YAAA,KAC9C,0BAAA,EAA2B;AAE7B,EAAA,2BACG,uBAAA,CAAwB,QAAA,EAAxB,EAAiC,KAAA,EAAO,YAAA,EACvC,+BAAC,sBAAA,EAAA,EACE,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,IACA,wBAAA,oBACC,GAAA;AAAA,MAAC,kBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAM,IAAA;AAAA,QACN,SAAA,EAAW,sCAAA;AAAA,QACX,aAAa,YAAA,CAAa,WAAA;AAAA,QAC1B,gBAAA,EAAgB,IAAA;AAAA,QAChB,aAAA,EAAe,MAAM,YAAA,EAAa;AAAA,QAClC,MAAA,EAAO,wBAAA;AAAA,QACP,iBAAA,EAAgB,4BAAA;AAAA,QAEhB,8BAAC,uBAAA,EAAA,EAAwB;AAAA;AAAA;AAC3B,GAAA,EAEJ,CAAA,EACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"LightspeedDrawerProvider.esm.js","sources":["../../src/components/LightspeedDrawerProvider.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { lazy, PropsWithChildren, Suspense } from 'react';\n\nimport { useLightspeedProviderState } from '../hooks/useLightspeedProviderState';\nimport { ChatLoadingFallback } from './ChatLoadingFallback';\nimport { LightspeedDrawerContext } from './LightspeedDrawerContext';\nimport { NotebookStreamProvider } from './notebooks/NotebookStreamProvider';\n\nconst LazyLightspeedOverlayChat = lazy(() =>\n import('./LightspeedOverlayChat').then(m => ({\n default: m.LightspeedOverlayChat,\n })),\n);\n\n/**\n * @public\n */\nexport const LightspeedDrawerProvider = ({ children }: PropsWithChildren) => {\n const { contextValue, shouldRenderOverlayModal, closeChatbot } =\n useLightspeedProviderState();\n\n return (\n <LightspeedDrawerContext.Provider value={contextValue}>\n <NotebookStreamProvider>\n {children}\n {shouldRenderOverlayModal && (\n <Suspense fallback={<ChatLoadingFallback variant=\"overlay\" />}>\n <LazyLightspeedOverlayChat\n displayMode={contextValue.displayMode}\n onEscapePress={() => closeChatbot()}\n />\n </Suspense>\n )}\n </NotebookStreamProvider>\n </LightspeedDrawerContext.Provider>\n );\n};\n"],"names":[],"mappings":";;;;;;;AAuBA,MAAM,yBAAA,GAA4B,IAAA;AAAA,EAAK,MACrC,OAAO,gCAAyB,CAAA,CAAE,KAAK,CAAA,CAAA,MAAM;AAAA,IAC3C,SAAS,CAAA,CAAE;AAAA,GACb,CAAE;AACJ,CAAA;AAKO,MAAM,wBAAA,GAA2B,CAAC,EAAE,QAAA,EAAS,KAAyB;AAC3E,EAAA,MAAM,EAAE,YAAA,EAAc,wBAAA,EAA0B,YAAA,KAC9C,0BAAA,EAA2B;AAE7B,EAAA,2BACG,uBAAA,CAAwB,QAAA,EAAxB,EAAiC,KAAA,EAAO,YAAA,EACvC,+BAAC,sBAAA,EAAA,EACE,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,IACA,wBAAA,wBACE,QAAA,EAAA,EAAS,QAAA,sBAAW,mBAAA,EAAA,EAAoB,OAAA,EAAQ,WAAU,CAAA,EACzD,QAAA,kBAAA,GAAA;AAAA,MAAC,yBAAA;AAAA,MAAA;AAAA,QACC,aAAa,YAAA,CAAa,WAAA;AAAA,QAC1B,aAAA,EAAe,MAAM,YAAA;AAAa;AAAA,KACpC,EACF;AAAA,GAAA,EAEJ,CAAA,EACF,CAAA;AAEJ;;;;"}
@@ -4,8 +4,7 @@ import Box from '@mui/material/Box';
4
4
  import Fab from '@mui/material/Fab';
5
5
  import { useTheme } from '@mui/material/styles';
6
6
  import Tooltip from '@mui/material/Tooltip';
7
- import { ChatbotDisplayMode } from '@patternfly/chatbot';
8
- import { LIGHTSPEED_FAB_ELEMENT_ID, DOCKED_CONTENT_OFFSET } from '../const.esm.js';
7
+ import { ChatbotDisplayMode, LIGHTSPEED_FAB_ELEMENT_ID, DOCKED_CONTENT_OFFSET } from '../const.esm.js';
9
8
  import { useIaChatPermission } from '../hooks/useIaChatPermission.esm.js';
10
9
  import { useIaNotebooksPermission } from '../hooks/useIaNotebooksPermission.esm.js';
11
10
  import { useLightspeedDrawerContext } from '../hooks/useLightspeedDrawerContext.esm.js';
@@ -47,6 +46,19 @@ const LightspeedFABContent = () => {
47
46
  clearLightspeedFabAnchorVars();
48
47
  };
49
48
  }, [displayMode, theme]);
49
+ useLayoutEffect(() => {
50
+ if (!isChatbotActive) {
51
+ return void 0;
52
+ }
53
+ const fab = fabRef.current;
54
+ if (!fab) {
55
+ return void 0;
56
+ }
57
+ const syncAnchor = () => publishLightspeedFabAnchorVars({ fabElement: fab, theme });
58
+ syncAnchor();
59
+ const frame = requestAnimationFrame(syncAnchor);
60
+ return () => cancelAnimationFrame(frame);
61
+ }, [isChatbotActive, theme]);
50
62
  if (displayMode === ChatbotDisplayMode.embedded) {
51
63
  return null;
52
64
  }
@@ -1 +1 @@
1
- {"version":3,"file":"LightspeedFABContent.esm.js","sources":["../../src/components/LightspeedFABContent.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useLayoutEffect, useRef } from 'react';\n\nimport Box from '@mui/material/Box';\nimport Fab from '@mui/material/Fab';\nimport { useTheme } from '@mui/material/styles';\nimport Tooltip from '@mui/material/Tooltip';\nimport { ChatbotDisplayMode } from '@patternfly/chatbot';\n\nimport { DOCKED_CONTENT_OFFSET, LIGHTSPEED_FAB_ELEMENT_ID } from '../const';\nimport { useIaChatPermission } from '../hooks/useIaChatPermission';\nimport { useIaNotebooksPermission } from '../hooks/useIaNotebooksPermission';\nimport { useLightspeedDrawerContext } from '../hooks/useLightspeedDrawerContext';\nimport { useTranslation } from '../hooks/useTranslation';\nimport {\n clearLightspeedFabAnchorVars,\n getLightspeedFabEdgeInset,\n publishLightspeedFabAnchorVars,\n} from '../utils/fab-anchor-utils';\nimport { LightspeedFABIcon, LightspeedFABOpenIcon } from './LightspeedIcon';\n\nexport const LightspeedFABContent = () => {\n const { t } = useTranslation();\n const theme = useTheme();\n const { isChatbotActive, toggleChatbot, displayMode } =\n useLightspeedDrawerContext();\n const { allowed: hasChatAccess, loading: chatPermissionLoading } =\n useIaChatPermission();\n const { allowed: hasNotebooksAccess, loading: notebooksPermissionLoading } =\n useIaNotebooksPermission();\n\n const permissionsLoading =\n chatPermissionLoading || notebooksPermissionLoading;\n const hasPluginAccess = hasChatAccess || hasNotebooksAccess;\n const fabRef = useRef<HTMLDivElement>(null);\n const fabEdgeInset = getLightspeedFabEdgeInset(theme);\n\n useLayoutEffect(() => {\n const fab = fabRef.current;\n if (!fab) {\n return undefined;\n }\n\n const syncAnchor = () =>\n publishLightspeedFabAnchorVars({ fabElement: fab, theme });\n syncAnchor();\n\n const resizeObserver =\n typeof ResizeObserver === 'function'\n ? new ResizeObserver(syncAnchor)\n : undefined;\n resizeObserver?.observe(fab);\n\n window.addEventListener('resize', syncAnchor);\n fab.addEventListener('transitionend', syncAnchor);\n const mutationObserver = new MutationObserver(syncAnchor);\n mutationObserver.observe(document.body, {\n attributes: true,\n attributeFilter: ['class'],\n });\n\n return () => {\n resizeObserver?.disconnect();\n window.removeEventListener('resize', syncAnchor);\n fab.removeEventListener('transitionend', syncAnchor);\n mutationObserver.disconnect();\n clearLightspeedFabAnchorVars();\n };\n }, [displayMode, theme]);\n\n if (displayMode === ChatbotDisplayMode.embedded) {\n return null;\n }\n\n if (permissionsLoading || !hasPluginAccess) {\n return null;\n }\n\n return (\n <Box\n ref={fabRef}\n sx={{\n bottom: fabEdgeInset,\n right: fabEdgeInset,\n alignItems: 'end',\n zIndex: theme.zIndex.tooltip,\n display: 'flex',\n position: 'fixed',\n 'body.docked-drawer-open &': {\n transition: 'margin-right 0.3s ease',\n marginRight: DOCKED_CONTENT_OFFSET,\n },\n }}\n id={LIGHTSPEED_FAB_ELEMENT_ID}\n data-testid=\"lightspeed-fab\"\n >\n <Tooltip\n title={isChatbotActive ? t('tooltip.fab.close') : t('tooltip.fab.open')}\n placement=\"left\"\n >\n <Fab\n color=\"inherit\"\n variant=\"circular\"\n size=\"large\"\n onClick={toggleChatbot}\n aria-label={\n isChatbotActive ? t('tooltip.fab.close') : t('tooltip.fab.open')\n }\n sx={{\n backgroundColor: theme.palette.background.default,\n color: theme.palette.text.primary,\n border: `1px solid ${theme.palette.divider}`,\n '&:hover': {\n backgroundColor: theme.palette.background.paper,\n },\n }}\n >\n {isChatbotActive ? <LightspeedFABOpenIcon /> : <LightspeedFABIcon />}\n </Fab>\n </Tooltip>\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LightspeedFABContent.esm.js","sources":["../../src/components/LightspeedFABContent.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useLayoutEffect, useRef } from 'react';\n\nimport Box from '@mui/material/Box';\nimport Fab from '@mui/material/Fab';\nimport { useTheme } from '@mui/material/styles';\nimport Tooltip from '@mui/material/Tooltip';\n\nimport {\n ChatbotDisplayMode,\n DOCKED_CONTENT_OFFSET,\n LIGHTSPEED_FAB_ELEMENT_ID,\n} from '../const';\nimport { useIaChatPermission } from '../hooks/useIaChatPermission';\nimport { useIaNotebooksPermission } from '../hooks/useIaNotebooksPermission';\nimport { useLightspeedDrawerContext } from '../hooks/useLightspeedDrawerContext';\nimport { useTranslation } from '../hooks/useTranslation';\nimport {\n clearLightspeedFabAnchorVars,\n getLightspeedFabEdgeInset,\n publishLightspeedFabAnchorVars,\n} from '../utils/fab-anchor-utils';\nimport { LightspeedFABIcon, LightspeedFABOpenIcon } from './LightspeedIcon';\n\nexport const LightspeedFABContent = () => {\n const { t } = useTranslation();\n const theme = useTheme();\n const { isChatbotActive, toggleChatbot, displayMode } =\n useLightspeedDrawerContext();\n const { allowed: hasChatAccess, loading: chatPermissionLoading } =\n useIaChatPermission();\n const { allowed: hasNotebooksAccess, loading: notebooksPermissionLoading } =\n useIaNotebooksPermission();\n\n const permissionsLoading =\n chatPermissionLoading || notebooksPermissionLoading;\n const hasPluginAccess = hasChatAccess || hasNotebooksAccess;\n const fabRef = useRef<HTMLDivElement>(null);\n const fabEdgeInset = getLightspeedFabEdgeInset(theme);\n\n useLayoutEffect(() => {\n const fab = fabRef.current;\n if (!fab) {\n return undefined;\n }\n\n const syncAnchor = () =>\n publishLightspeedFabAnchorVars({ fabElement: fab, theme });\n syncAnchor();\n\n const resizeObserver =\n typeof ResizeObserver === 'function'\n ? new ResizeObserver(syncAnchor)\n : undefined;\n resizeObserver?.observe(fab);\n\n window.addEventListener('resize', syncAnchor);\n fab.addEventListener('transitionend', syncAnchor);\n const mutationObserver = new MutationObserver(syncAnchor);\n mutationObserver.observe(document.body, {\n attributes: true,\n attributeFilter: ['class'],\n });\n\n return () => {\n resizeObserver?.disconnect();\n window.removeEventListener('resize', syncAnchor);\n fab.removeEventListener('transitionend', syncAnchor);\n mutationObserver.disconnect();\n clearLightspeedFabAnchorVars();\n };\n }, [displayMode, theme]);\n\n // Re-measure when the overlay opens so bottom/right track the FAB (see LIGHTSPEED_OVERLAY_*).\n useLayoutEffect(() => {\n if (!isChatbotActive) {\n return undefined;\n }\n const fab = fabRef.current;\n if (!fab) {\n return undefined;\n }\n const syncAnchor = () =>\n publishLightspeedFabAnchorVars({ fabElement: fab, theme });\n syncAnchor();\n const frame = requestAnimationFrame(syncAnchor);\n return () => cancelAnimationFrame(frame);\n }, [isChatbotActive, theme]);\n\n if (displayMode === ChatbotDisplayMode.embedded) {\n return null;\n }\n\n if (permissionsLoading || !hasPluginAccess) {\n return null;\n }\n\n return (\n <Box\n ref={fabRef}\n sx={{\n bottom: fabEdgeInset,\n right: fabEdgeInset,\n alignItems: 'end',\n zIndex: theme.zIndex.tooltip,\n display: 'flex',\n position: 'fixed',\n 'body.docked-drawer-open &': {\n transition: 'margin-right 0.3s ease',\n marginRight: DOCKED_CONTENT_OFFSET,\n },\n }}\n id={LIGHTSPEED_FAB_ELEMENT_ID}\n data-testid=\"lightspeed-fab\"\n >\n <Tooltip\n title={isChatbotActive ? t('tooltip.fab.close') : t('tooltip.fab.open')}\n placement=\"left\"\n >\n <Fab\n color=\"inherit\"\n variant=\"circular\"\n size=\"large\"\n onClick={toggleChatbot}\n aria-label={\n isChatbotActive ? t('tooltip.fab.close') : t('tooltip.fab.open')\n }\n sx={{\n backgroundColor: theme.palette.background.default,\n color: theme.palette.text.primary,\n border: `1px solid ${theme.palette.divider}`,\n '&:hover': {\n backgroundColor: theme.palette.background.paper,\n },\n }}\n >\n {isChatbotActive ? <LightspeedFABOpenIcon /> : <LightspeedFABIcon />}\n </Fab>\n </Tooltip>\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { styled } from '@mui/material/styles';
3
+ import { ChatbotModal } from '@patternfly/chatbot';
4
+ import { LIGHTSPEED_OVERLAY_CHATBOT_MODAL_CLASS, DOCKED_CONTENT_OFFSET, LIGHTSPEED_OVERLAY_MAX_WIDTH, LIGHTSPEED_OVERLAY_RIGHT, LIGHTSPEED_OVERLAY_BOTTOM } from '../const.esm.js';
5
+ import { LightspeedChatContainer } from './LightspeedChatContainer.esm.js';
6
+
7
+ const LIGHTSPEED_OVERLAY_CHAT_Z_INDEX = 300;
8
+ const StyledChatbotModal = styled(ChatbotModal)(() => ({
9
+ zIndex: LIGHTSPEED_OVERLAY_CHAT_Z_INDEX,
10
+ boxShadow: "0 14px 20px -7px rgba(0, 0, 0, 0.22), 0 32px 50px 6px rgba(0, 0, 0, 0.16), 0 12px 60px 12px rgba(0, 0, 0, 0.14) !important",
11
+ bottom: `${LIGHTSPEED_OVERLAY_BOTTOM} !important`,
12
+ right: `${LIGHTSPEED_OVERLAY_RIGHT} !important`,
13
+ maxWidth: `${LIGHTSPEED_OVERLAY_MAX_WIDTH} !important`,
14
+ overflow: "hidden",
15
+ transition: "margin-right 0.3s ease, bottom 0.3s ease, right 0.3s ease, inset-block-end 0.3s ease, inset-inline-end 0.3s ease",
16
+ "body.docked-drawer-open &": {
17
+ marginRight: DOCKED_CONTENT_OFFSET
18
+ }
19
+ }));
20
+ const LightspeedOverlayChat = ({
21
+ displayMode,
22
+ onEscapePress
23
+ }) => /* @__PURE__ */ jsx(
24
+ StyledChatbotModal,
25
+ {
26
+ isOpen: true,
27
+ className: LIGHTSPEED_OVERLAY_CHATBOT_MODAL_CLASS,
28
+ displayMode,
29
+ disableFocusTrap: true,
30
+ onEscapePress,
31
+ ouiaId: "LightspeedChatbotModal",
32
+ "aria-labelledby": "lightspeed-chatpopup-modal",
33
+ "data-screen-capture-exclude": true,
34
+ children: /* @__PURE__ */ jsx(LightspeedChatContainer, {})
35
+ }
36
+ );
37
+
38
+ export { LightspeedOverlayChat };
39
+ //# sourceMappingURL=LightspeedOverlayChat.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LightspeedOverlayChat.esm.js","sources":["../../src/components/LightspeedOverlayChat.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { styled } from '@mui/material/styles';\nimport {\n ChatbotModal,\n type ChatbotDisplayMode as PfChatbotDisplayMode,\n} from '@patternfly/chatbot';\n\nimport {\n DOCKED_CONTENT_OFFSET,\n LIGHTSPEED_OVERLAY_BOTTOM,\n LIGHTSPEED_OVERLAY_CHATBOT_MODAL_CLASS,\n LIGHTSPEED_OVERLAY_MAX_WIDTH,\n LIGHTSPEED_OVERLAY_RIGHT,\n type ChatbotDisplayMode,\n} from '../const';\nimport { LightspeedChatContainer } from './LightspeedChatContainer';\n\nconst LIGHTSPEED_OVERLAY_CHAT_Z_INDEX = 300;\n\nconst StyledChatbotModal = styled(ChatbotModal)(() => ({\n zIndex: LIGHTSPEED_OVERLAY_CHAT_Z_INDEX,\n boxShadow:\n '0 14px 20px -7px rgba(0, 0, 0, 0.22), 0 32px 50px 6px rgba(0, 0, 0, 0.16), 0 12px 60px 12px rgba(0, 0, 0, 0.14) !important',\n bottom: `${LIGHTSPEED_OVERLAY_BOTTOM} !important`,\n right: `${LIGHTSPEED_OVERLAY_RIGHT} !important`,\n maxWidth: `${LIGHTSPEED_OVERLAY_MAX_WIDTH} !important`,\n overflow: 'hidden',\n transition:\n 'margin-right 0.3s ease, bottom 0.3s ease, right 0.3s ease, inset-block-end 0.3s ease, inset-inline-end 0.3s ease',\n 'body.docked-drawer-open &': {\n marginRight: DOCKED_CONTENT_OFFSET,\n },\n}));\n\ntype Props = {\n displayMode: ChatbotDisplayMode;\n onEscapePress: () => void;\n};\n\n/**\n * Overlay chat modal — lazy-loaded from LightspeedDrawerProvider when needed.\n * ChatContainer is imported statically so ChatbotModal and chat PatternFly CSS\n * share one chunk order (avoids css-extract-rspack-plugin CI failures).\n */\nexport const LightspeedOverlayChat = ({\n displayMode,\n onEscapePress,\n}: Props) => (\n <StyledChatbotModal\n isOpen\n className={LIGHTSPEED_OVERLAY_CHATBOT_MODAL_CLASS}\n displayMode={displayMode as PfChatbotDisplayMode}\n disableFocusTrap\n onEscapePress={onEscapePress}\n ouiaId=\"LightspeedChatbotModal\"\n aria-labelledby=\"lightspeed-chatpopup-modal\"\n data-screen-capture-exclude\n >\n <LightspeedChatContainer />\n </StyledChatbotModal>\n);\n"],"names":[],"mappings":";;;;;;AAgCA,MAAM,+BAAA,GAAkC,GAAA;AAExC,MAAM,kBAAA,GAAqB,MAAA,CAAO,YAAY,CAAA,CAAE,OAAO;AAAA,EACrD,MAAA,EAAQ,+BAAA;AAAA,EACR,SAAA,EACE,4HAAA;AAAA,EACF,MAAA,EAAQ,GAAG,yBAAyB,CAAA,WAAA,CAAA;AAAA,EACpC,KAAA,EAAO,GAAG,wBAAwB,CAAA,WAAA,CAAA;AAAA,EAClC,QAAA,EAAU,GAAG,4BAA4B,CAAA,WAAA,CAAA;AAAA,EACzC,QAAA,EAAU,QAAA;AAAA,EACV,UAAA,EACE,kHAAA;AAAA,EACF,2BAAA,EAA6B;AAAA,IAC3B,WAAA,EAAa;AAAA;AAEjB,CAAA,CAAE,CAAA;AAYK,MAAM,wBAAwB,CAAC;AAAA,EACpC,WAAA;AAAA,EACA;AACF,CAAA,qBACE,GAAA;AAAA,EAAC,kBAAA;AAAA,EAAA;AAAA,IACC,MAAA,EAAM,IAAA;AAAA,IACN,SAAA,EAAW,sCAAA;AAAA,IACX,WAAA;AAAA,IACA,gBAAA,EAAgB,IAAA;AAAA,IAChB,aAAA;AAAA,IACA,MAAA,EAAO,wBAAA;AAAA,IACP,iBAAA,EAAgB,4BAAA;AAAA,IAChB,6BAAA,EAA2B,IAAA;AAAA,IAE3B,8BAAC,uBAAA,EAAA,EAAwB;AAAA;AAC3B;;;;"}
@@ -1,8 +1,8 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { styled } from '@mui/material/styles';
3
3
  import Typography from '@mui/material/Typography';
4
- import { Modal, Alert, Button, Switch, ModalHeader, ModalBody, Stack, StackItem, Flex, FlexItem, Tooltip, Form, FormGroup, Radio, TextInputGroup, TextInputGroupMain, TextInputGroupUtilities, FormHelperText, HelperText, HelperTextItem, ModalFooter, Spinner, List, ListItem } from '@patternfly/react-core';
5
- import { CheckCircleIcon, ExclamationCircleIcon, InfoCircleIcon, KeyIcon, TimesIcon } from '@patternfly/react-icons';
4
+ import { Switch, ModalHeader, Button, ModalBody, Stack, StackItem, Flex, FlexItem, Tooltip, Form, FormGroup, Radio, TextInputGroup, TextInputGroupMain, TextInputGroupUtilities, FormHelperText, HelperText, HelperTextItem, ModalFooter, Modal, Alert, Spinner, List, ListItem } from '@patternfly/react-core';
5
+ import { TimesIcon, InfoCircleIcon, KeyIcon, CheckCircleIcon, ExclamationCircleIcon } from '@patternfly/react-icons';
6
6
  import { useTranslation } from '../hooks/useTranslation.esm.js';
7
7
 
8
8
  const StyledModal = styled(Modal)({