@genexus/genexus-ide-ui 1.0.36 → 1.0.38

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 (80) hide show
  1. package/dist/cjs/genexus-ide-ui.cjs.js +1 -1
  2. package/dist/cjs/gx-ide-ai-assistant.cjs.entry.js +3 -1
  3. package/dist/cjs/gx-ide-ai-assistant.cjs.entry.js.map +1 -1
  4. package/dist/cjs/gx-ide-ai-message.cjs.entry.js +26 -8
  5. package/dist/cjs/gx-ide-ai-message.cjs.entry.js.map +1 -1
  6. package/dist/cjs/gx-ide-design-import.cjs.entry.js +12 -13
  7. package/dist/cjs/gx-ide-design-import.cjs.entry.js.map +1 -1
  8. package/dist/cjs/gx-ide-select-user-team.cjs.entry.js +35 -20
  9. package/dist/cjs/gx-ide-select-user-team.cjs.entry.js.map +1 -1
  10. package/dist/cjs/gx-ide-sign-in-team.cjs.entry.js +22 -22
  11. package/dist/cjs/gx-ide-sign-in-team.cjs.entry.js.map +1 -1
  12. package/dist/cjs/loader.cjs.js +1 -1
  13. package/dist/collection/components/ai-assistant/ai-assistant.js +2 -1
  14. package/dist/collection/components/ai-assistant/ai-assistant.js.map +1 -1
  15. package/dist/collection/components/ai-assistant/ai-message.css +32 -2
  16. package/dist/collection/components/ai-assistant/ai-message.js +25 -8
  17. package/dist/collection/components/ai-assistant/ai-message.js.map +1 -1
  18. package/dist/collection/components/design-import/design-import.js +12 -13
  19. package/dist/collection/components/design-import/design-import.js.map +1 -1
  20. package/dist/collection/components/design-import/gx-ide-assets/design-import/langs/design-import.lang.en.json +1 -0
  21. package/dist/collection/components/design-import/gx-ide-assets/design-import/langs/design-import.lang.ja.json +1 -0
  22. package/dist/collection/components/design-import/gx-ide-assets/design-import/langs/design-import.lang.zh.json +1 -0
  23. package/dist/collection/components/select-user-team/gx-ide-assets/select-user-team/langs/select-user-team.lang.en.json +4 -8
  24. package/dist/collection/components/select-user-team/gx-ide-assets/select-user-team/langs/select-user-team.lang.ja.json +2 -6
  25. package/dist/collection/components/select-user-team/gx-ide-assets/select-user-team/langs/select-user-team.lang.zh.json +2 -6
  26. package/dist/collection/components/select-user-team/select-user-team.css +47 -19
  27. package/dist/collection/components/select-user-team/select-user-team.js +64 -26
  28. package/dist/collection/components/select-user-team/select-user-team.js.map +1 -1
  29. package/dist/collection/components/sign-in-team/sign-in-team.js +20 -20
  30. package/dist/collection/components/sign-in-team/sign-in-team.js.map +1 -1
  31. package/dist/components/ai-message.js +27 -10
  32. package/dist/components/ai-message.js.map +1 -1
  33. package/dist/components/gx-ide-ai-assistant.js +3 -1
  34. package/dist/components/gx-ide-ai-assistant.js.map +1 -1
  35. package/dist/components/gx-ide-design-import.js +12 -13
  36. package/dist/components/gx-ide-design-import.js.map +1 -1
  37. package/dist/components/gx-ide-select-user-team.js +40 -22
  38. package/dist/components/gx-ide-select-user-team.js.map +1 -1
  39. package/dist/components/gx-ide-sign-in-team.js +22 -22
  40. package/dist/components/gx-ide-sign-in-team.js.map +1 -1
  41. package/dist/esm/genexus-ide-ui.js +1 -1
  42. package/dist/esm/gx-ide-ai-assistant.entry.js +3 -1
  43. package/dist/esm/gx-ide-ai-assistant.entry.js.map +1 -1
  44. package/dist/esm/gx-ide-ai-message.entry.js +26 -8
  45. package/dist/esm/gx-ide-ai-message.entry.js.map +1 -1
  46. package/dist/esm/gx-ide-design-import.entry.js +12 -13
  47. package/dist/esm/gx-ide-design-import.entry.js.map +1 -1
  48. package/dist/esm/gx-ide-select-user-team.entry.js +35 -20
  49. package/dist/esm/gx-ide-select-user-team.entry.js.map +1 -1
  50. package/dist/esm/gx-ide-sign-in-team.entry.js +22 -22
  51. package/dist/esm/gx-ide-sign-in-team.entry.js.map +1 -1
  52. package/dist/esm/loader.js +1 -1
  53. package/dist/genexus-ide-ui/genexus-ide-ui.esm.js +1 -1
  54. package/dist/genexus-ide-ui/genexus-ide-ui.esm.js.map +1 -1
  55. package/dist/genexus-ide-ui/gx-ide-assets/design-import/langs/design-import.lang.en.json +1 -0
  56. package/dist/genexus-ide-ui/gx-ide-assets/design-import/langs/design-import.lang.ja.json +1 -0
  57. package/dist/genexus-ide-ui/gx-ide-assets/design-import/langs/design-import.lang.zh.json +1 -0
  58. package/dist/genexus-ide-ui/gx-ide-assets/select-user-team/langs/select-user-team.lang.en.json +4 -8
  59. package/dist/genexus-ide-ui/gx-ide-assets/select-user-team/langs/select-user-team.lang.ja.json +2 -6
  60. package/dist/genexus-ide-ui/gx-ide-assets/select-user-team/langs/select-user-team.lang.zh.json +2 -6
  61. package/dist/genexus-ide-ui/p-0b33d2f9.entry.js.map +1 -1
  62. package/dist/genexus-ide-ui/{p-32bd11fa.entry.js → p-5fc133b2.entry.js} +118 -121
  63. package/dist/genexus-ide-ui/p-5fc133b2.entry.js.map +1 -0
  64. package/dist/genexus-ide-ui/p-798eb91a.entry.js +121 -0
  65. package/dist/genexus-ide-ui/p-798eb91a.entry.js.map +1 -0
  66. package/dist/genexus-ide-ui/{p-040bd0c5.entry.js → p-a7dcfedd.entry.js} +9 -5
  67. package/dist/genexus-ide-ui/p-a7dcfedd.entry.js.map +1 -0
  68. package/dist/genexus-ide-ui/p-c9b0fd13.entry.js +130 -0
  69. package/dist/genexus-ide-ui/p-c9b0fd13.entry.js.map +1 -0
  70. package/dist/types/components/ai-assistant/ai-message.d.ts +2 -0
  71. package/dist/types/components/select-user-team/select-user-team.d.ts +10 -5
  72. package/dist/types/components/sign-in-team/sign-in-team.d.ts +1 -1
  73. package/dist/types/components.d.ts +12 -4
  74. package/package.json +1 -1
  75. package/dist/genexus-ide-ui/p-040bd0c5.entry.js.map +0 -1
  76. package/dist/genexus-ide-ui/p-32bd11fa.entry.js.map +0 -1
  77. package/dist/genexus-ide-ui/p-7cdfbdba.entry.js +0 -88
  78. package/dist/genexus-ide-ui/p-7cdfbdba.entry.js.map +0 -1
  79. package/dist/genexus-ide-ui/p-b189e45d.entry.js +0 -113
  80. package/dist/genexus-ide-ui/p-b189e45d.entry.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"names":["mapStylesToComboBoxItemModel","styles","map","style","value","id","caption","label","name","TAB_DATA","layout","slot","code","tokens","composition","TAB_MODEL","panels","stencils","images","fonts","designSystem","DESIGN_TYPE_TO_TAB_MODEL_MAP","Map","designImportCss","DESIGN_DATA_TYPE_PANELS","DESIGN_DATA_TYPE_STENCILS","DESIGN_DATA_TYPE_IMAGES","DESIGN_DATA_TYPE_DESIGN_SYSTEM","DESIGN_DATA_TYPE_FONTS","ITEM_COMPOSE_ID_SEPARATOR","CHECKED_VALUE","MENU_DELETE","getIconPath","category","colorType","DESIGN","FILE_UPLOAD","WEBPANEL_ICON","PANEL_FOR_SD_ICON","CSS_BUNDLES","GxIdeImportFromDesign","_GxIdeImportFromDesign_componentLocale","set","this","_GxIdeImportFromDesign_loadedItems","_GxIdeImportFromDesign_emptyStateAnimated","_GxIdeImportFromDesign_formattedExtensions","_GxIdeImportFromDesign_accessTokenEl","_GxIdeImportFromDesign_importAsWebPanelsEl","_GxIdeImportFromDesign_moduleEl","_GxIdeImportFromDesign_messagesList","_GxIdeImportFromDesign_panelsSelected","_GxIdeImportFromDesign_stencilsSelected","_GxIdeImportFromDesign_imagesSelected","_GxIdeImportFromDesign_fontsSelected","_GxIdeImportFromDesign_fileInputHiddenEl","_GxIdeImportFromDesign_pathEl","_GxIdeImportFromDesign_initializeActiveTabs","activeTabs","_GxIdeImportFromDesign_evaluateAccessTokenRender","async","requiresAccessToken","requiresAccessTokenCallback","path","accessToken","length","accessTokenHasError","_GxIdeImportFromDesign_pathURLBlurHandler","loadDataCondition1","isLoaded","reactiveSettings","pathIsValid","lastLoadCallbackSettingValues","loadDataCondition2","__classPrivateFieldGet","_GxIdeImportFromDesign_loadData","call","_GxIdeImportFromDesign_objectsTreeSelectedItemsChangedHandler","event","detail","item","_a","itemComposedId","idList","split","itemId","itemDesignType","isChildNode","isDesignSystem","tabsModel","get","selectedDesignType","loadedItem","_GxIdeImportFromDesign_getLoadedItem","designDataDetail","_GxIdeImportFromDesign_getDesignDataDetail","designType","selectedDesignItem","_GxIdeImportFromDesign_instances","_GxIdeImportFromDesign_getCodeFactory","_GxIdeImportFromDesign_renderDetailDataTree","renderedTabs","clear","add","_GxIdeImportFromDesign_validatePath","validPathRegex","figmaURLRegex","urlWithExtensionRegex","test","_GxIdeImportFromDesign_objectsTreeCheckedItemsChangedHandler","items","Array","from","values","currentParentId","result","startsWith","checked","parentId","push","__classPrivateFieldSet","_GxIdeImportFromDesign_selectFileHandler","click","_GxIdeImportFromDesign_styleComboBoxInputHandler","styleValue","target","_GxIdeImportFromDesign_moduleInputHandler","module","defaultModule","isLoading","source","selectedFile","token","undefined","importAsWebPanels","designData","loadCallback","_GxIdeImportFromDesign_messageCallback","messages","success","firstDesignSystemName","_b","moduleId","message","loadFn","loadImageCallback","loadDesignSystemCallback","loadFontCallback","loadPanelDataCallback","returnedData","then","data","_GxIdeImportFromDesign_confirm","confirmCallback","styleName","_GxIdeImportFromDesign_cancel","cancelCallback","_GxIdeImportFromDesign_fitImagesHandler","fitImages","_GxIdeImportFromDesign_getPanelsSelectedItem","reduce","minIndex","index","_GxIdeImportFromDesign_importAsWebPanelsChangedHandler","loadData","_GxIdeImportFromDesign_removeFileSelection","_GxIdeImportFromDesign_selectFileInputChangedHandler","files","_GxIdeImportFromDesign_accessFocusHandler","element","type","_GxIdeImportFromDesign_accessBlurHandler","accessTokenChanged","_GxIdeImportFromDesign_pathUrlInputHandler","_GxIdeImportFromDesign_renderHeader","primaryButtonDisabled","clearFileButtonDisabled","stylesComboDisabled","moduleDisabled","pathWithErrorStyles","displayPathErrorTooltip","fitImagesIsDisabled","designDataTreeDataModel","primaryButtonCaption","header","btnReload","btnLoad","selectFileButton","h","class","input","debounce","config","inputDebounce","part","onInput","onBlur","disabled","placeholder","pathPlaceholder","startImgSrc","ref","el","actionElement","blockAlign","tooltipSettings","inlineAlign","delay","pathErrorMessage","hidden","accept","onChange","removeFileSelection","title","onClick","src","accessTokenPlaceholder","onFocus","accessTokenErrorMessage","suggest","suggestOptions","alreadyProcessed","model","stylesAsComboBoxModel","labelPosition","defaultValue","selectEntityCallback","selectModuleCallback","onValueChanged","importAs","checkedValue","_GxIdeImportFromDesign_renderMessages","text","_GxIdeImportFromDesign_renderMain","_GxIdeImportFromDesign_renderDesignTree","_GxIdeImportFromDesign_renderDesignTabsCh","stateIconSrc","isAnimated","stateTitle","noDesignSelected","key","selectDesign","showLines","dragDisabled","dropDisabled","expandableButton","expandOnClick","toggleCheckboxes","checkbox","onCheckedItemsChange","onSelectedItemsChange","_GxIdeImportFromDesign_renderFooter","buttonOkDisabled","footer","btnCancel","btnOk","_GxIdeImportFromDesign_evaluatePanelPreview","preview","alt","noPanelPreviewAvailable","_GxIdeImportFromDesign_renderPanelTab","renderControlsTree","detailTreeModel","_GxIdeImportFromDesign_renderImageTab","height","_GxIdeImportFromDesign_tabSelectionChangedHandler","newSelectedId","reRenderCounter","tab","scrollable","tabListPosition","selectedId","overflow","contain","onSelectedItemChange","display","has","Set","pathIsValidChanged","designDataChanged","newDesignData","panelsSelectedItem","isForWeb","panelsIconSrc","imagesIconSrc","order","leaf","tree","webPanels","expanded","_GxIdeImportFromDesign_recursiveDesignTreeItems","pathChanged","newPath","fileIsLoaded","size","validatePathResult","newAccessToken","trim","stylesChanged","newStyles","componentWillLoad","Locale","getComponentStrings","extensions","ext","join","watchMessagesHandler","newValue","oldValue","scrollTop","scrollHeight","render","Host","iconSrc","selectedIndex","i","hasVariants","variants","selected","_GxIdeImportFromDesign_loadTreeItemCompositionModel","controls","modelList","control","Object","assign","textEditorFactoryCallback"],"sources":["src/components/design-import/helpers.ts","src/components/design-import/models.ts","src/components/design-import/design-import.scss?tag=gx-ide-design-import&encapsulation=shadow","src/components/design-import/design-import.tsx"],"sourcesContent":["import { ComboBoxModel } from \"@genexus/chameleon-controls-library\";\nimport { GxOption } from \"../../common/types\";\n\nexport const mapStylesToComboBoxItemModel = (\n styles: GxOption[]\n): ComboBoxModel =>\n styles?.map(style => ({\n value: style.id,\n caption: style.label || style.name\n }));\n","import { TabModel } from \"@genexus/chameleon-controls-library\";\nimport { DesignType } from \"./design-import\";\n\nexport const TAB_DATA: { [key in TAB_SELECTOR]: TabData } = {\n layout: { id: \"layout\", caption: \"Layout\", slot: \"layout\" },\n code: { id: \"code\", caption: \"Code\", slot: \"code\" },\n tokens: { id: \"tokens\", caption: \"Tokens\", slot: \"tokens\" },\n styles: { id: \"styles\", caption: \"Styles\", slot: \"styles\" },\n composition: {\n id: \"composition\",\n caption: \"Composition\",\n slot: \"composition\"\n }\n};\n\nexport const TAB_MODEL: TabDataModel = {\n panels: [\n {\n id: TAB_DATA.composition.id,\n name: TAB_DATA.composition.caption\n },\n {\n id: TAB_DATA.layout.id,\n name: TAB_DATA.layout.caption\n },\n {\n id: TAB_DATA.code.id,\n name: TAB_DATA.code.caption\n }\n ],\n stencils: [\n {\n id: TAB_DATA.composition.id,\n name: TAB_DATA.composition.caption\n },\n {\n id: TAB_DATA.layout.id,\n name: TAB_DATA.layout.caption\n },\n {\n id: TAB_DATA.code.id,\n name: TAB_DATA.code.caption\n }\n ],\n images: [\n {\n id: TAB_DATA.composition.id,\n name: TAB_DATA.composition.caption\n }\n ],\n fonts: [\n {\n id: TAB_DATA.composition.id,\n name: TAB_DATA.composition.caption\n }\n ],\n designSystem: [\n {\n id: TAB_DATA.tokens.id,\n name: TAB_DATA.tokens.caption\n },\n {\n id: TAB_DATA.styles.id,\n name: TAB_DATA.styles.caption\n }\n ]\n};\n\nexport type TabDataModel = {\n panels: TabModel;\n stencils: TabModel;\n images: TabModel;\n fonts: TabModel;\n designSystem: TabModel;\n};\n\ntype TabData = {\n id: TAB_SELECTOR;\n caption: string;\n slot: TAB_SELECTOR;\n};\n\nexport type TAB_SELECTOR =\n | \"layout\"\n | \"code\"\n | \"tokens\"\n | \"styles\"\n | \"composition\";\n\nexport const DESIGN_TYPE_TO_TAB_MODEL_MAP = new Map<DesignType, TabModel>([\n [\"panels\", TAB_MODEL.panels],\n [\"stencils\", TAB_MODEL.stencils],\n [\"images\", TAB_MODEL.images],\n [\"design_system\", TAB_MODEL.designSystem],\n [\"fonts\", TAB_MODEL.fonts]\n]);\n","@import \"../../global/gx-ide-mixins.scss\";\n@import \"../../../node_modules/@genexus/mercury/dist/mercury.scss\";\n\n:host {\n display: grid;\n block-size: 100%;\n overflow: auto;\n grid-template-rows: max-content 1fr max-content;\n}\n\n.section {\n display: contents;\n}\n\n// - - - - - - - - - - - - -\n// Header\n// - - - - - - - - - - - - -\n\n.header {\n display: grid;\n grid-auto-rows: max-content;\n // 88px is the inline-size of the largest label (Access Token) that is not always visible.\n // Setting 88px as the minimum inline size prevents an undesired difference when Access Token\n // is visible. This fix has been made for english only. The value should work with .ja and .zh also.\n grid-template-columns: minmax(88px, max-content) 1fr !important;\n\n &--show-access-token {\n grid-template-areas:\n \"path-url-label path-url-wrapper\"\n \"access-token-label access-token\"\n \"style-label style\"\n \"module-label module\"\n \"checkboxes-options checkboxes-options\";\n }\n &--hide-access-token {\n grid-template-areas:\n \"path-url-label path-url-wrapper\"\n \"style-label style\"\n \"module-label module\"\n \"checkboxes-options checkboxes-options\";\n }\n}\n// path url\n.path-url-wrapper {\n grid-template-columns: 1fr max-content;\n}\n.path-url-label {\n grid-area: path-url-label;\n}\n.path-url-control {\n flex-grow: 1;\n}\n.select-load-button {\n min-inline-size: 80px;\n}\n// access token\n.access-token-label {\n grid-area: access-token-label;\n}\n.access-token {\n grid-area: access-token;\n}\n// style\n.style-label {\n grid-area: style-label;\n}\n.style {\n grid-area: style;\n}\n// module\n.module-label {\n grid-area: module-label;\n}\n.module {\n grid-area: module;\n}\n// checkboxes options\n.checkboxes-options {\n grid-area: checkboxes-options;\n grid-template-columns: max-content max-content;\n justify-content: space-between;\n}\n\n// - - - - - - - - - - - - -\n// Main\n// - - - - - - - - - - - - -\n\n.main {\n display: grid;\n grid-template-columns: 250px 1fr;\n block-size: 100%;\n overflow: auto;\n\n &--loading {\n grid-template-columns: 1fr;\n }\n}\n\n.panel-tab {\n block-size: 100%;\n display: grid;\n grid-template-columns: 1fr 300px;\n\n .panel-item {\n overflow: auto;\n }\n}\n.panel-tab:has(> :only-child) {\n grid-template-columns: 1fr;\n}\n\n.tree-view {\n padding-block: var(--mer-spacing--2xs);\n}\n\n.tree-view-panel-item {\n border-inline-start: var(--section-common-border);\n}\n\n.checker-board {\n --white-square-color: #fff1;\n --black-square-color: #0000;\n background: linear-gradient(\n 45deg,\n var(--white-square-color) 25%,\n var(--black-square-color) 25%\n ),\n linear-gradient(\n -45deg,\n var(--white-square-color) 25%,\n var(--black-square-color) 25%\n ),\n linear-gradient(\n 45deg,\n var(--black-square-color) 75%,\n var(--white-square-color) 75%\n ),\n linear-gradient(\n -45deg,\n var(--black-square-color) 75%,\n var(--white-square-color) 75%\n );\n background-size: 20px 20px;\n background-position: 0 0, 0 10px, 10px -10px, -10px 0px;\n}\n\n/*--- Tabs ---*/\n.tab {\n border-width: 0 !important; // WA/TODO this should be a class on mercury\n}\n.tab.fit-images .composition-tab-slot {\n font-size: 0; // WA to prevent scroll\n}\n.tab.fit-images img {\n object-fit: scale-down;\n object-position: left top;\n max-height: 100%;\n}\n.tab--hidden {\n display: none;\n}\n\n// - - - - - - - - - - - - -\n// Footer\n// - - - - - - - - - - - - -\n\n.button-cancel,\n.button-ok {\n min-inline-size: var(--mer-spacing--4xl);\n}\n\n// - - - - - - - - - - - - -\n// Other\n// - - - - - - - - - - - - -\n\n.messages-slot-container {\n block-size: 100%;\n}\n\n.composition-tab-slot {\n block-size: 100%;\n overflow: auto;\n}\n\n.empty-state {\n overflow: auto;\n}\n.empty-state-button {\n // WA (It looks more pleasing with a little bit less of gap)\n transform: translateY(-12px);\n}\n\n// Messages Styles\n.messages-container {\n}\n.message {\n animation: fadeIn var(--mer-timing--fast) ease-in-out forwards;\n\n &--info {\n color: var(--mer-text__on-surface);\n }\n &--warning {\n color: var(--mer-text__warning);\n }\n &--error {\n color: var(--mer-text__error);\n }\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n// WA's\n.combo-box.ch-disabled {\n --control__bg-color: var(--control__background-color--disabled);\n --control__border-color: var(--control__border-color--disabled);\n --control__color: var(--control__color--disabled);\n --ch-placeholder-color: var(--control-placeholder__color--disabled);\n}\n\n.tree-view::part(item__header) {\n // TODO: Remove this when Mercury is updated to >= 0.12.8\n min-inline-size: var(--tree-view__min-inline-size);\n}\n","// Stencil\nimport { Component, Host, h, Prop, Element, State, Watch } from \"@stencil/core\";\n\n// Other Libraries\nimport {\n ChCheckboxCustomEvent,\n ChEditCustomEvent,\n ComboBoxModel,\n TabModel,\n TreeViewItemModel\n} from \"@genexus/chameleon-controls-library\";\nimport { TreeViewItemModelExtended } from \"@genexus/chameleon-controls-library\";\nimport { MercuryBundles, getIconPath } from \"@genexus/mercury\";\n\n// Custom Imports\nimport { config } from \"../../common/config\";\nimport { mapStylesToComboBoxItemModel } from \"./helpers\";\nimport { Locale } from \"../../common/locale\";\nimport { EntityData, GxOption } from \"../../common/types\";\nimport { TAB_DATA, DESIGN_TYPE_TO_TAB_MODEL_MAP, TAB_MODEL } from \"./models\";\n\nconst DESIGN_DATA_TYPE_PANELS = \"panels\";\nconst DESIGN_DATA_TYPE_STENCILS = \"stencils\";\nconst DESIGN_DATA_TYPE_IMAGES = \"images\";\nconst DESIGN_DATA_TYPE_DESIGN_SYSTEM = \"design_system\";\nconst DESIGN_DATA_TYPE_FONTS = \"fonts\";\n\nconst ITEM_COMPOSE_ID_SEPARATOR = \"@@@\";\n\n// ch-checkbox\nconst CHECKED_VALUE = \"on\";\n\n// Icons\nconst MENU_DELETE = getIconPath({\n category: \"menus\",\n name: \"delete\",\n colorType: \"primary\"\n});\nconst DESIGN = getIconPath({\n category: \"objects\",\n name: \"design\"\n});\nconst FILE_UPLOAD = getIconPath({\n category: \"controls\",\n name: \"file-upload\"\n});\n// For empty states\nconst WEBPANEL_ICON = getIconPath({\n category: \"objects\",\n name: \"webpanel\"\n});\nconst PANEL_FOR_SD_ICON = getIconPath({\n category: \"objects\",\n name: \"panel-for-sd\"\n});\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"utils/form\",\n \"utils/layout\",\n \"utils/typography\",\n \"utils/spacing\",\n \"components/button\",\n \"components/checkbox\",\n \"components/edit\",\n \"components/tree-view\",\n \"components/combo-box\",\n \"components/tab\",\n \"components/tooltip\",\n \"chameleon/scrollbar\"\n];\n\n@Component({\n tag: \"gx-ide-design-import\",\n styleUrl: \"design-import.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/design-import\"]\n})\nexport class GxIdeImportFromDesign {\n /**\n * The component hard-coded strings translations.\n */\n // eslint-disable-next-line @stencil-community/own-props-must-be-private\n #componentLocale: any;\n\n /**\n * An array that keeps track of the tree items id's (design system data type\n * + item id) along with the content, that will be used to save and retrieve\n * items information, in order to avoid using a callback to get items\n * information that was already get. loadedItemsArray will be reset every time\n * a new design is loaded.\n */\n // eslint-disable-next-line @stencil-community/own-props-must-be-private\n #loadedItems: Map<string, ItemLoadedInfo> = new Map();\n\n #emptyStateAnimated: boolean = false;\n #formattedExtensions: string;\n\n // 2. REFERENCE TO ELEMENTS //\n\n @Element() el: HTMLGxIdeDesignImportElement;\n\n /* References needed to collect data */\n #accessTokenEl!: HTMLChEditElement;\n #importAsWebPanelsEl!: HTMLChCheckboxElement;\n #moduleEl!: HTMLGxIdeEntitySelectorElement;\n #messagesList: HTMLElement;\n #panelsSelected: string[] = [];\n #stencilsSelected: string[] = [];\n #imagesSelected: string[] = [];\n #fontsSelected: string[] = [];\n #fileInputHiddenEl: HTMLInputElement;\n #pathEl: HTMLChEditElement;\n\n // Use to force a re-render\n @State() reRenderCounter: number = 0;\n\n // Maps to Chameleon Models:\n @State() stylesAsComboBoxModel: ComboBoxModel;\n\n // The current style value\n @State() styleValue: string = \"\";\n\n @State() accessTokenHasError: boolean = false;\n\n @State() pathIsValid: boolean;\n @Watch(\"pathIsValid\")\n pathIsValidChanged(pathIsValid: boolean) {\n if (pathIsValid) {\n this.#evaluateAccessTokenRender();\n } else {\n // hide access token input if path is not valid\n this.requiresAccessToken = false;\n }\n }\n\n @State() tabsModel: TabModel = [];\n\n @State() activeTabs: Map<DesignType, string> = new Map();\n\n @State() renderedTabs: Set<string> = new Set();\n\n /**\n * The design data loaded from file\n */\n @State() designData: DesignData = null;\n @Watch(\"designData\")\n designDataChanged(newDesignData: DesignData) {\n if (newDesignData) {\n // panels\n const panelsSelectedItem = this.#getPanelsSelectedItem(\n this.designData.panels\n );\n const isForWeb = this.#importAsWebPanelsEl.value === CHECKED_VALUE;\n const panelsIconSrc = isForWeb\n ? \"objects/webpanel\"\n : \"objects/panel-for-sd\";\n\n // images\n const imagesIconSrc = \"objects/image\";\n\n this.designDataTreeDataModel = [\n {\n order: 0,\n id: `parent${ITEM_COMPOSE_ID_SEPARATOR}${DESIGN_DATA_TYPE_PANELS}`,\n leaf: false,\n caption: isForWeb\n ? this.#componentLocale.tree.webPanels\n : this.#componentLocale.tree.panels,\n startImgSrc: panelsIconSrc,\n checkbox: true,\n checked: true,\n expanded: true,\n items: this.#recursiveDesignTreeItems(\n this.designData.panels,\n DESIGN_DATA_TYPE_PANELS,\n panelsIconSrc,\n panelsSelectedItem\n )\n },\n {\n order: 1,\n id: `parent${ITEM_COMPOSE_ID_SEPARATOR}${DESIGN_DATA_TYPE_STENCILS}`,\n leaf: false,\n caption: this.#componentLocale.tree.stencils,\n startImgSrc: \"objects/stencil\",\n checkbox: true,\n checked: true,\n expanded: true,\n items: this.designData.stencils.map(item => ({\n id: `${item.id}${ITEM_COMPOSE_ID_SEPARATOR}${DESIGN_DATA_TYPE_STENCILS}`,\n class: \"object tree-view-item\",\n leaf: true,\n caption: item.name,\n startImgSrc: \"objects/stencil\",\n checkbox: true,\n checked: true\n }))\n },\n {\n order: 2,\n id: `parent${ITEM_COMPOSE_ID_SEPARATOR}${DESIGN_DATA_TYPE_IMAGES}`,\n leaf: false,\n caption: this.#componentLocale.tree.images,\n startImgSrc: imagesIconSrc,\n checkbox: true,\n checked: true,\n expanded: true,\n items: this.#recursiveDesignTreeItems(\n this.designData.images,\n DESIGN_DATA_TYPE_IMAGES,\n imagesIconSrc\n )\n },\n {\n order: 3,\n id: `parent${ITEM_COMPOSE_ID_SEPARATOR}${DESIGN_DATA_TYPE_FONTS}`,\n leaf: false,\n caption: this.#componentLocale.tree.fonts,\n startImgSrc: \"controls/font\",\n checkbox: true,\n checked: true,\n expanded: true,\n items: this.designData.fonts.map(item => ({\n id: `${item.id}${ITEM_COMPOSE_ID_SEPARATOR}${DESIGN_DATA_TYPE_FONTS}`,\n leaf: true,\n caption: item.name,\n startImgSrc: \"controls/font\",\n checkbox: true,\n checked: true\n }))\n },\n {\n order: 4,\n id: `${\n this.designData.designSystem.length > 0\n ? this.designData.designSystem[0].id\n : \"parent\"\n }${ITEM_COMPOSE_ID_SEPARATOR}${DESIGN_DATA_TYPE_DESIGN_SYSTEM}`,\n leaf: true,\n caption: this.#componentLocale.tree.designSystem,\n startImgSrc: \"objects/dso\",\n checkbox: true,\n checked: true\n }\n ];\n }\n }\n\n /**\n * The model data loaded into the detail tree\n */\n @State() detailTreeModel: TreeViewItemModel[] = [];\n\n /**\n * If the design data is loading or not, for disabled actions\n */\n @State() isLoading = false;\n\n /**\n * If the design data is loaded or not, for conditioning input file\n */\n @State() isLoaded = false;\n\n /**\n * The messages receive when the file is loading\n */\n @State() messages: MessageData[] = [];\n\n /**\n * The file selected for load the design data\n */\n @State() selectedFile: File;\n\n /**\n * The type of the design data selected for show it visual tabs\n */\n @State() selectedDesignType: DesignType;\n\n /**\n * The item of the design data selected for show its contents on visual tabs\n */\n @State() selectedDesignItem: any;\n\n /**\n * Whether to show or not the access token input field\n */\n @State() requiresAccessToken: boolean;\n\n /**\n * the design data tree view data model\n */\n @State() designDataTreeDataModel: TreeViewItemModel[] = [];\n\n /**\n * Used to trigger a re-render after an item has been selected on\n * renderDesignTree, in order to set the first tab as the active tab\n * (setFirstActiveTab()), since calling this method inside\n * objectsTreeSelectedItemsChangedHandler does not always work without a\n * setTimeOut.\n */\n @State() updateTabsActiveTab: boolean = false;\n\n /**\n * If true, images will be fitted in the container\n */\n @State() fitImages = false;\n\n /**\n * Represents a collection of settings where each key is a specific option. Its\n * boolean value determines whether changes to that option are listened to and\n * trigger the loadCallback callback.\n */\n @Prop() readonly reactiveSettings: ReactiveSettings = {\n path: true,\n style: false,\n module: false,\n importAsWebPanels: true\n };\n\n /**\n * Used to keep track of the settings values since the last loadCallback.\n * Used to know if loadCallback is required to be called again, when any\n * of these values are changed.\n */\n @State() lastLoadCallbackSettingValues: ReactiveSettingsValues = {\n path: undefined,\n style: undefined,\n moduleId: undefined,\n importAsWebPanels: undefined\n };\n\n /**\n * The valid extensions for the files that will be loaded in Path/URL\n * (ie.: \".fig, .sketch\")\n */\n @Prop() readonly extensions!: string[];\n\n /**\n * Default value for the 'Module' field.\n */\n @Prop() readonly defaultModule: EntityData;\n\n /**\n * The path/URL for load the design data\n */\n @Prop({ mutable: true }) path: string = \"\";\n @Watch(\"path\")\n pathChanged(newPath: string) {\n const fileIsLoaded = this.selectedFile?.size > 0;\n const validatePathResult = this.#validatePath(newPath) || fileIsLoaded;\n this.pathIsValid = validatePathResult;\n }\n\n /**\n * The access token for the given path, which is not always required\n */\n @Prop({ mutable: true }) accessToken: string = \"\";\n @Watch(\"accessToken\")\n accessTokenChanged(newAccessToken: string) {\n if (!newAccessToken.trim().length) {\n this.accessTokenHasError = true;\n return;\n }\n this.accessTokenHasError = false;\n this.accessToken = newAccessToken;\n }\n\n /**\n * The value for \"Import as Web Panels\" checkbox.\n */\n @Prop() readonly importAsWebPanels: boolean = false;\n\n /**\n * Callback invoked when the action is executed in the Module/Folder filter.\n * It returns the information of the selected object (id and name) or\n * 'undefined' if it was canceled.\n */\n @Prop() readonly selectModuleCallback: SelectModuleCallback;\n\n /**\n * This is a function provided by the developer that cancel the load operation.\n */\n @Prop() readonly cancelCallback!: CancelCallback;\n\n /**\n * This is a function provided by the developer that initiates the process\n * of importing a design.\n */\n @Prop() readonly confirmCallback!: ConfirmCallback;\n\n /**\n * This is a function provided by the developer that returns the list of\n * data types loaded from a file or URL.\n */\n @Prop() readonly loadCallback!: LoadCallback;\n\n /**\n * This is a function provided by the developer that returns the information\n * of a Design System type of data.\n */\n // eslint-disable-next-line prettier/prettier\n @Prop() readonly loadDesignSystemCallback!: LoadDesignSystemCallback;\n\n /**\n * This is a function provided by the developer that returns the information\n * of a Font type of data.\n */\n @Prop() readonly loadFontCallback!: LoadFontCallback;\n\n /**\n * This is a function provided by the developer that returns the information\n * of an Image System type of data.\n */\n @Prop() readonly loadImageCallback!: LoadImageCallback;\n\n /**\n * This is a function provided by the developer that returns the information\n * of a Panel type of data.\n */\n @Prop() readonly loadPanelDataCallback!: LoadPanelDataCallback;\n\n /**\n * Callback invoked to determine if accessing a design requires an authentication token.\n */\n @Prop() readonly requiresAccessTokenCallback!: RequiresAccessTokenCallback;\n\n /**\n * The styles render in the option style selector\n */\n @Prop() readonly styles!: GxOption[];\n @Watch(\"styles\")\n stylesChanged(newStyles: GxOption[]) {\n this.stylesAsComboBoxModel = mapStylesToComboBoxItemModel(newStyles);\n }\n\n /**\n * This is a function provided by the developer for create an instance of a text editor.\n */\n // eslint-disable-next-line prettier/prettier\n @Prop() readonly textEditorFactoryCallback!: TextEditorFactoryCallback;\n\n async componentWillLoad() {\n this.#componentLocale = await Locale.getComponentStrings(this.el);\n this.#formattedExtensions = this.extensions\n .map(ext => `.${ext}`)\n .join(\", \");\n this.stylesChanged(this.styles);\n this.#initializeActiveTabs();\n this.pathChanged(this.path);\n this.styleValue =\n this.stylesAsComboBoxModel?.length > 0\n ? this.stylesAsComboBoxModel[0]?.value\n : \"\";\n }\n\n @Watch(\"messages\")\n watchMessagesHandler(newValue: boolean, oldValue: boolean) {\n if (newValue !== oldValue) {\n if (this.#messagesList) {\n this.#messagesList.scrollTop = this.#messagesList.scrollHeight;\n }\n }\n }\n\n #recursiveDesignTreeItems(\n items: DesignItemData[],\n designType: DesignType,\n iconSrc: string,\n selectedIndex: number = undefined\n ): TreeViewItemModel[] {\n return items.map((item, i) => {\n const hasVariants = item.variants?.length > 0;\n\n return {\n id: `${item.id}${ITEM_COMPOSE_ID_SEPARATOR}${designType}`,\n leaf: !hasVariants,\n caption: item.name,\n startImgSrc: iconSrc,\n checkbox: true,\n checked: true,\n expanded: hasVariants,\n selected: selectedIndex === i,\n items: hasVariants\n ? this.#recursiveDesignTreeItems(item.variants, designType, iconSrc)\n : []\n };\n });\n }\n\n #initializeActiveTabs = () => {\n this.activeTabs.set(\"panels\", TAB_MODEL.panels[0].id);\n this.activeTabs.set(\"stencils\", TAB_MODEL.stencils[0].id);\n this.activeTabs.set(\"images\", TAB_MODEL.images[0].id);\n this.activeTabs.set(\"fonts\", TAB_MODEL.fonts[0].id);\n this.activeTabs.set(\"design_system\", TAB_MODEL.designSystem[0].id);\n };\n\n #evaluateAccessTokenRender = async () => {\n this.requiresAccessToken = await this.requiresAccessTokenCallback(\n this.path\n );\n // evaluate access token error\n if (this.accessToken.length) {\n this.accessTokenHasError = false;\n }\n };\n\n #pathURLBlurHandler = async () => {\n const loadDataCondition1 =\n this.isLoaded &&\n this.reactiveSettings.path &&\n this.pathIsValid &&\n this.path !== this.lastLoadCallbackSettingValues.path;\n const loadDataCondition2 =\n !this.requiresAccessToken ||\n (this.requiresAccessToken && this.accessToken.length > 0);\n if (loadDataCondition1 && loadDataCondition2) {\n this.#loadData();\n }\n };\n\n #loadTreeItemCompositionModel(\n controls: DesignPanelControlData[]\n ): TreeViewItemModel[] {\n const modelList: TreeViewItemModel[] = [];\n for (const control of controls) {\n let model: TreeViewItemModel = {\n id: control.name,\n caption: control.name,\n startImgSrc: control.type,\n checkbox: false,\n expanded: true,\n leaf: control.leaf\n };\n if (control.controls) {\n model = {\n ...model,\n items: this.#loadTreeItemCompositionModel(control.controls)\n };\n }\n modelList.push(model);\n }\n return modelList;\n }\n\n #objectsTreeSelectedItemsChangedHandler = async (\n event: CustomEvent<TreeViewItemModelExtended[]>\n ) => {\n if (event.detail.length) {\n const item = event.detail[0]?.item;\n const itemComposedId = item.id;\n const idList = itemComposedId.split(ITEM_COMPOSE_ID_SEPARATOR);\n const itemId = idList[0];\n const itemDesignType: DesignType = idList[1] as DesignType;\n const isChildNode = itemId && itemId !== \"parent\";\n const isDesignSystem = itemDesignType === \"design_system\";\n if (isChildNode || isDesignSystem) {\n this.tabsModel = DESIGN_TYPE_TO_TAB_MODEL_MAP.get(itemDesignType);\n this.selectedDesignType = itemDesignType;\n const loadedItem = this.#getLoadedItem(itemComposedId);\n if (!loadedItem) {\n const designDataDetail: DesignItemDataDetail =\n await this.#getDesignDataDetail(itemId, this.selectedDesignType);\n this.#loadedItems.set(itemComposedId, {\n designType: this.selectedDesignType,\n designDataDetail: designDataDetail\n });\n } else {\n // Item has been queried already. The item content exists already.\n this.selectedDesignType = loadedItem.designType;\n this.selectedDesignItem = loadedItem.designDataDetail;\n this.#getCodeFactory(loadedItem.designType);\n this.#renderDetailDataTree(loadedItem.designType);\n }\n this.renderedTabs.clear();\n this.renderedTabs.add(this.activeTabs.get(this.selectedDesignType));\n }\n }\n };\n\n #getLoadedItem = (id: string): ItemLoadedInfo | undefined => {\n return this.#loadedItems?.get(id);\n };\n\n #validatePath = (path: string): boolean => {\n const validPathRegex = /^(\\/|\\.\\/|(\\w:))[^:*?\"<>|]*\\.(sketch|gxsketch)$/i; // Match valid file paths\n const figmaURLRegex = /^https?:\\/\\/(www\\.)?figma\\.com/; // Match URLs containing \"www.figma.com\"\n const urlWithExtensionRegex =\n /^https?:\\/\\/[^\\s/$.?#].[^\\s]*\\.(sketch|gxsketch)$/i; // Match URLs ending with .sketch or .gxsketch\n const pathIsValid =\n validPathRegex.test(path) ||\n figmaURLRegex.test(path) ||\n urlWithExtensionRegex.test(path);\n return pathIsValid;\n };\n\n #objectsTreeCheckedItemsChangedHandler = (\n event: CustomEvent<Map<string, TreeViewItemModelExtended>>\n ) => {\n const items = Array.from(event.detail.values());\n let currentParentId = null;\n const result: { [key: string]: string[] } = {};\n\n for (const item of items) {\n if (item.item.id.startsWith(`parent${ITEM_COMPOSE_ID_SEPARATOR}`)) {\n currentParentId = item.item.id.split(ITEM_COMPOSE_ID_SEPARATOR)[1];\n result[currentParentId] = [];\n } else if (item.item.checked && currentParentId) {\n const parentId = item.item.id.split(ITEM_COMPOSE_ID_SEPARATOR)[1];\n if (parentId === currentParentId) {\n const id = item.item.id.split(ITEM_COMPOSE_ID_SEPARATOR)[0];\n result[currentParentId].push(id);\n }\n }\n }\n // const { designSystem, fonts, images, panels, stencils } = result;\n const { fonts, panels, stencils, images } = result;\n\n // this.designSystemSelected = designSystem;\n this.#panelsSelected = panels;\n this.#stencilsSelected = stencils;\n this.#imagesSelected = images;\n this.#fontsSelected = fonts;\n };\n\n #selectFileHandler = (): void => {\n this.#fileInputHiddenEl.click();\n };\n\n #styleComboBoxInputHandler = (event: CustomEvent<string> | InputEvent) => {\n this.styleValue = (event.target as HTMLChComboBoxRenderElement).value;\n if (\n this.reactiveSettings.style &&\n this.styleValue !== this.lastLoadCallbackSettingValues.style\n ) {\n this.#loadData();\n }\n };\n\n #moduleInputHandler = (event: CustomEvent<EntityData>) => {\n if (\n this.reactiveSettings.module &&\n this.defaultModule.id !== event.detail.id &&\n this.pathIsValid\n ) {\n this.#loadData();\n }\n };\n\n #loadData = async (): Promise<void> => {\n this.isLoading = true;\n const source = this.selectedFile ? this.selectedFile : this.path;\n const token = this.#accessTokenEl ? this.#accessTokenEl.value : undefined;\n const style = this.styleValue;\n const importAsWebPanels = this.#importAsWebPanelsEl.value === CHECKED_VALUE;\n const designData: DesignData = await this.loadCallback(\n source,\n style,\n importAsWebPanels,\n token,\n this.#messageCallback\n );\n\n // clear\n this.#panelsSelected = [];\n this.#stencilsSelected = [];\n this.#fontsSelected = [];\n this.selectedDesignType = undefined;\n this.selectedDesignItem = undefined;\n this.messages = [];\n\n this.designData = designData;\n this.isLoaded = designData?.success ?? false;\n this.isLoading = false;\n\n const firstDesignSystemName = designData.designSystem[0]?.name;\n if (firstDesignSystemName && !this.styleValue) {\n this.styleValue = firstDesignSystemName;\n }\n\n // update the settings that were used for the last load\n if (this.reactiveSettings.path && this.pathIsValid) {\n this.lastLoadCallbackSettingValues.path = this.path;\n }\n if (this.reactiveSettings.style) {\n this.lastLoadCallbackSettingValues.style = style;\n }\n if (this.reactiveSettings.module) {\n this.lastLoadCallbackSettingValues.moduleId = this.#moduleEl.value.id;\n }\n if (this.reactiveSettings.importAsWebPanels) {\n this.lastLoadCallbackSettingValues.importAsWebPanels = importAsWebPanels;\n }\n };\n\n #messageCallback: LoadMessageCallback = message => {\n this.messages = [...this.messages, message];\n };\n\n #getDesignDataDetail = async (\n id: string,\n designType: DesignType\n ): Promise<DesignItemDataDetail> => {\n let loadFn:\n | LoadPanelDataCallback\n | LoadImageCallback\n | LoadFontCallback\n | LoadDesignSystemCallback;\n\n switch (designType) {\n case DESIGN_DATA_TYPE_IMAGES:\n loadFn = this.loadImageCallback;\n break;\n case DESIGN_DATA_TYPE_DESIGN_SYSTEM:\n loadFn = this.loadDesignSystemCallback;\n break;\n case DESIGN_DATA_TYPE_FONTS:\n loadFn = this.loadFontCallback;\n break;\n case DESIGN_DATA_TYPE_PANELS:\n case DESIGN_DATA_TYPE_STENCILS:\n loadFn = this.loadPanelDataCallback;\n break;\n }\n\n let returnedData: DesignItemDataDetail;\n await loadFn(id).then((data: DesignItemDataDetail) => {\n this.selectedDesignType = designType;\n this.selectedDesignItem = data;\n this.#getCodeFactory(designType);\n this.#renderDetailDataTree(designType);\n returnedData = data;\n });\n\n return returnedData;\n };\n\n #getCodeFactory(designType: string) {\n switch (designType) {\n case DESIGN_DATA_TYPE_PANELS:\n case DESIGN_DATA_TYPE_STENCILS:\n this.textEditorFactoryCallback(\n \"code\",\n TAB_DATA.code.slot,\n this.selectedDesignItem.code\n );\n this.textEditorFactoryCallback(\n \"html\",\n TAB_DATA.layout.slot,\n this.selectedDesignItem.layout\n );\n break;\n case DESIGN_DATA_TYPE_DESIGN_SYSTEM:\n this.textEditorFactoryCallback(\n \"tokens\",\n TAB_DATA.tokens.slot,\n this.selectedDesignItem.tokens\n );\n this.textEditorFactoryCallback(\n \"styles\",\n TAB_DATA.styles.slot,\n this.selectedDesignItem.styles\n );\n break;\n }\n }\n\n #confirm = (): void => {\n this.confirmCallback({\n panels: this.#panelsSelected,\n stencils: this.#stencilsSelected,\n fonts: this.#fontsSelected,\n images: this.#imagesSelected,\n moduleId: this.#moduleEl?.value?.id,\n styleName: this.styleValue,\n importAsWebPanels: this.#importAsWebPanelsEl.value === CHECKED_VALUE\n });\n };\n\n #cancel = (): void => {\n this.cancelCallback();\n this.isLoading = false;\n };\n\n #fitImagesHandler = (event: ChCheckboxCustomEvent<any> | InputEvent) => {\n this.fitImages = event.detail === CHECKED_VALUE;\n };\n\n #getPanelsSelectedItem = (panels: DesignItemData[]): number => {\n return panels.reduce((minIndex, item, index, panels) => {\n return panels[minIndex].name <= item.name ? minIndex : index;\n }, 0);\n };\n\n #importAsWebPanelsChangedHandler = () => {\n const loadData =\n this.reactiveSettings.importAsWebPanels && this.pathIsValid;\n if (loadData) {\n this.#loadData();\n }\n };\n\n #removeFileSelection = () => {\n this.selectedFile = null;\n this.path = \"\";\n this.accessToken = \"\";\n this.selectedFile = null;\n this.#fileInputHiddenEl.value = null;\n };\n\n #selectFileInputChangedHandler = (event: InputEvent) => {\n const target = event.target as HTMLInputElement;\n if (target.files?.length > 0) {\n this.selectedFile = target.files[0];\n this.path = this.selectedFile.name;\n // we know the path is valid because the extensions are restricted by \"extensions\" Prop.\n }\n };\n\n #accessFocusHandler = (event: ChEditCustomEvent<string> | FocusEvent) => {\n const element = event.target as HTMLChEditElement;\n element.type = \"text\"; // display token on focus\n };\n\n #accessBlurHandler = (event: ChEditCustomEvent<string> | FocusEvent) => {\n const element = event.target as HTMLChEditElement;\n element.type = \"password\"; // hide token on blur\n\n this.accessTokenChanged(element.value);\n };\n\n #pathUrlInputHandler = async (\n event: ChEditCustomEvent<string> | InputEvent\n ) => {\n this.path = event.detail as string;\n this.#evaluateAccessTokenRender();\n this.selectedFile = null;\n if (!this.path.length) {\n this.designData = null;\n }\n };\n\n #renderHeader = (): Element => {\n const primaryButtonDisabled =\n this.isLoading ||\n (this.pathIsValid &&\n this.requiresAccessToken &&\n this.accessToken.length === 0);\n const clearFileButtonDisabled = this.isLoading || this.path.length === 0;\n const stylesComboDisabled = this.isLoading;\n const moduleDisabled = this.isLoading;\n const pathWithErrorStyles = !this.pathIsValid && this.path.length > 0;\n const displayPathErrorTooltip = !this.pathIsValid && this.path.length > 0;\n const fitImagesIsDisabled =\n this.isLoading ||\n !this.designDataTreeDataModel.length ||\n this.selectedDesignType === \"stencils\" ||\n this.selectedDesignType === \"design_system\";\n\n let primaryButtonCaption;\n if (\n this.pathIsValid &&\n this.path === this.lastLoadCallbackSettingValues.path\n ) {\n primaryButtonCaption = this.#componentLocale.header.btnReload;\n } else if (this.pathIsValid) {\n primaryButtonCaption = this.#componentLocale.header.btnLoad;\n } else {\n primaryButtonCaption = this.#componentLocale.header.selectFileButton;\n }\n\n return (\n <header\n class={{\n \"header\": true,\n \"control-header-with-border\": true,\n \"spacing-body-inline\": true,\n \"spacing-body-block-start\": true,\n \"header--show-access-token\": this.requiresAccessToken,\n \"header--hide-access-token\": !this.requiresAccessToken,\n \"field-group-cols-2\": true\n }}\n >\n <label\n // path/url label\n class=\"label path-url-label\"\n >\n {this.#componentLocale.header.path}\n </label>\n <div class=\"path-url-wrapper buttons-spacer\">\n <ch-edit\n // path/url/file input\n id=\"path-url\"\n class={{\n \"input\": true,\n \"input-error\": pathWithErrorStyles,\n \"path-url-control\": true\n }}\n debounce={config.inputDebounce}\n part=\"option-path\"\n type=\"text\"\n value={this.path}\n onInput={this.#pathUrlInputHandler}\n onBlur={this.reactiveSettings.path && this.#pathURLBlurHandler}\n disabled={this.isLoading}\n placeholder={`${this.#componentLocale.header.pathPlaceholder}`}\n startImgSrc={FILE_UPLOAD}\n ref={(el: HTMLChEditElement) =>\n (this.#pathEl = el as HTMLChEditElement)\n }\n ></ch-edit>\n {displayPathErrorTooltip && (\n <ch-tooltip\n class=\"tooltip\"\n actionElement={this.#pathEl as unknown as HTMLButtonElement}\n blockAlign={config.tooltipSettings.blockAlign}\n inlineAlign={config.tooltipSettings.inlineAlign}\n delay={config.tooltipSettings.delay}\n >\n {this.#componentLocale.header.pathErrorMessage}{\" \"}\n {this.#formattedExtensions}\n </ch-tooltip>\n )}\n\n <input\n hidden\n type=\"file\"\n accept={this.#formattedExtensions}\n onChange={this.#selectFileInputChangedHandler}\n ref={(el: HTMLInputElement) =>\n (this.#fileInputHiddenEl = el as HTMLInputElement)\n }\n />\n\n <div class=\"buttons-spacer\">\n <button\n // remove file selection\n aria-label={this.#componentLocale.header.removeFileSelection}\n title={this.#componentLocale.header.removeFileSelection}\n id=\"reset-all-button\"\n class=\"button-tertiary button-icon-only\"\n part=\"reset-all-button\"\n disabled={clearFileButtonDisabled}\n onClick={!clearFileButtonDisabled && this.#removeFileSelection}\n >\n <ch-image\n class=\"icon-md\"\n src={MENU_DELETE}\n disabled={clearFileButtonDisabled}\n ></ch-image>\n </button>\n <button\n // load file button\n id=\"button-load\"\n type=\"primary-text-only\"\n onClick={\n this.pathIsValid ? this.#loadData : this.#selectFileHandler\n }\n part=\"button button--load\"\n disabled={primaryButtonDisabled}\n class={{\n \"button-primary\": this.pathIsValid,\n \"button-secondary\": !this.pathIsValid,\n \"select-load-button\": true\n }}\n >\n {primaryButtonCaption}\n </button>\n </div>\n </div>\n\n {this.requiresAccessToken && [\n <label\n // access token label\n class=\"label access-token-label\"\n >\n {this.#componentLocale.header.accessToken}\n </label>,\n <div>\n <ch-edit\n class={{\n \"input\": true,\n \"access-token\": true,\n \"input-error\": this.accessTokenHasError\n }}\n ref={(el: HTMLChEditElement) =>\n (this.#accessTokenEl = el as HTMLChEditElement)\n }\n value={this.accessToken}\n placeholder={this.#componentLocale.header.accessTokenPlaceholder}\n onFocus={this.#accessFocusHandler}\n onBlur={this.#accessBlurHandler}\n part=\"access-token\"\n disabled={this.isLoading}\n type=\"password\"\n ></ch-edit>\n {this.accessTokenHasError && (\n <ch-tooltip\n class=\"tooltip\"\n actionElement={\n this.#accessTokenEl as unknown as HTMLButtonElement\n }\n blockAlign={config.tooltipSettings.blockAlign}\n inlineAlign={config.tooltipSettings.inlineAlign}\n delay={config.tooltipSettings.delay}\n >\n {this.#componentLocale.header.accessTokenErrorMessage}\n </ch-tooltip>\n )}\n </div>\n ]}\n <label\n // style label\n class=\"label style-label\"\n >\n {this.#componentLocale.header.style}\n </label>\n <ch-combo-box-render\n // style combo box\n suggest={true}\n suggestOptions={{\n alreadyProcessed: true\n }}\n disabled={stylesComboDisabled}\n model={this.stylesAsComboBoxModel}\n value={this.styleValue}\n onInput={this.#styleComboBoxInputHandler}\n part=\"option-style\"\n class=\"combo-box style\"\n ></ch-combo-box-render>\n\n <label\n // module label\n class=\"label module-label\"\n >\n {this.#componentLocale.header.module}\n </label>\n <gx-ide-entity-selector\n // module entity selector\n labelPosition=\"none\"\n value={this.defaultModule}\n defaultValue={this.defaultModule}\n selectEntityCallback={this.selectModuleCallback}\n ref={(el: HTMLGxIdeEntitySelectorElement) =>\n (this.#moduleEl = el as HTMLGxIdeEntitySelectorElement)\n }\n onValueChanged={\n this.reactiveSettings.module && this.#moduleInputHandler\n }\n disabled={moduleDisabled}\n class=\"module\"\n ></gx-ide-entity-selector>\n\n <div\n // import as web panels\n class=\"checkboxes-options field-group\"\n >\n <ch-checkbox\n caption={this.#componentLocale.header.importAs}\n checkedValue={CHECKED_VALUE}\n class=\"checkbox import-as-web-panels\"\n ref={(el: HTMLChCheckboxElement) =>\n (this.#importAsWebPanelsEl = el as HTMLChCheckboxElement)\n }\n value={this.importAsWebPanels ? CHECKED_VALUE : undefined}\n part=\"option-import-as-web-panels\"\n disabled={this.isLoading}\n onInput={this.#importAsWebPanelsChangedHandler}\n ></ch-checkbox>\n\n <div\n class={{\n \"field-group-inline\": true,\n \"checkboxes-options__col-right\": true\n }}\n >\n <ch-checkbox\n // fit images\n caption={this.#componentLocale.header.fitImages}\n checkedValue={CHECKED_VALUE}\n class=\"checkbox\"\n part=\"fit-images-checkbox\"\n disabled={fitImagesIsDisabled}\n onInput={this.#fitImagesHandler}\n ></ch-checkbox>\n </div>\n </div>\n </header>\n );\n };\n\n #renderMessages = (): HTMLParagraphElement[] => {\n return (\n this.messages.length > 0 &&\n this.messages.map(message => (\n <p\n class={{\n \"text-body-regular-m\": true,\n \"message\": true,\n [`message--${message.type}`]: true\n }}\n >\n {message.type}: {message.text}\n </p>\n ))\n );\n };\n\n #renderDetailDataTree(designType: string) {\n switch (designType) {\n case DESIGN_DATA_TYPE_PANELS:\n case DESIGN_DATA_TYPE_STENCILS:\n this.detailTreeModel = this.#loadTreeItemCompositionModel(\n this.selectedDesignItem.composition.controls\n );\n break;\n }\n }\n\n #renderMain = () => {\n if (this.isLoading || this.designData?.success === false) {\n return (\n <div\n class=\"main main--loading scrollable\"\n ref={(el: HTMLElement) => (this.#messagesList = el as HTMLElement)}\n >\n {this.#renderMessages()}\n <div class=\"text-body-regular-m spacing-body\">\n <slot name=\"messages\"></slot>\n </div>\n </div>\n );\n } else if (this.designData?.success) {\n return (\n /* #main*/\n <div class=\"main\">\n {[this.#renderDesignTree(), this.#renderDesignTabsCh()]}\n </div>\n );\n } else {\n return (\n <gx-ide-empty-state\n class=\"empty-state scrollable\"\n stateIconSrc={DESIGN}\n isAnimated={this.#emptyStateAnimated}\n stateTitle={this.#componentLocale.messages.noDesignSelected}\n key=\"no-objects-empty-state\"\n >\n <button\n // begin by selecting a file\n class=\"button-tertiary empty-state-button\"\n onClick={this.#selectFileHandler}\n >\n {this.#componentLocale.messages.selectDesign}\n </button>\n </gx-ide-empty-state>\n );\n }\n };\n\n #renderDesignTree = (): HTMLChTreeViewElement => {\n return (\n <ch-tree-view-render\n part=\"data-tree\"\n class=\"tree-view\"\n id=\"data-tree\"\n showLines=\"last\"\n model={this.designDataTreeDataModel}\n dragDisabled={true}\n dropDisabled={true}\n expandableButton=\"action\"\n expandOnClick={false}\n toggleCheckboxes={true}\n checkbox={true}\n checked={true}\n onCheckedItemsChange={this.#objectsTreeCheckedItemsChangedHandler}\n onSelectedItemsChange={this.#objectsTreeSelectedItemsChangedHandler}\n ></ch-tree-view-render>\n );\n };\n\n #renderFooter = () => {\n const buttonOkDisabled =\n this.designData?.success !== true || this.isLoading;\n return (\n <footer class=\"control-footer-with-border spacing-body-block-end spacing-body-inline\">\n <div class=\"buttons-spacer\">\n <button\n // button cancel\n id=\"button-cancel\"\n class=\"button-secondary button-cancel\"\n type=\"outlined\"\n onClick={this.#cancel}\n part=\"button button--cancel\"\n slot=\"footer-end\"\n >\n {this.#componentLocale.footer.btnCancel}\n </button>\n <button\n // button ok\n id=\"button-ok\"\n class=\"button-primary button-ok\"\n type=\"primary-text-only\"\n onClick={!buttonOkDisabled && this.#confirm}\n part=\"button button--ok\"\n disabled={buttonOkDisabled}\n slot=\"footer-end\"\n >\n {this.#componentLocale.footer.btnOk}\n </button>\n </div>\n </footer>\n );\n };\n\n #evaluatePanelPreview = () => {\n if (this.selectedDesignType === \"panels\") {\n return this.selectedDesignItem?.composition?.preview ? (\n <div\n part=\"data-panel-composition-preview\"\n class=\"panel-item scrollable\"\n >\n <img\n src={this.selectedDesignItem.composition.preview}\n alt=\"Preview\"\n />\n </div>\n ) : (\n <gx-ide-empty-state\n class=\"panel-tab__empty-state\"\n stateTitle={this.#componentLocale.messages.noPanelPreviewAvailable}\n stateIconSrc={\n this.#importAsWebPanelsEl.value === CHECKED_VALUE\n ? WEBPANEL_ICON\n : PANEL_FOR_SD_ICON\n }\n ></gx-ide-empty-state>\n );\n }\n return null;\n };\n\n #renderPanelTab = (): Element => {\n const renderControlsTree =\n (this.selectedDesignType === DESIGN_DATA_TYPE_PANELS ||\n this.selectedDesignType === DESIGN_DATA_TYPE_STENCILS) &&\n this.detailTreeModel.length > 0;\n\n return (\n <div\n class={{\n \"panel-tab\": true,\n \"panel-tab--controls-tree\": renderControlsTree\n }}\n part=\"data-panel-composition-container\"\n >\n {this.#evaluatePanelPreview()}\n\n {renderControlsTree ? (\n <ch-tree-view-render\n part=\"data-panel-composition-tree\"\n class=\"tree-view tree-view-panel-item scrollable\"\n showLines=\"last\"\n model={this.detailTreeModel}\n dragDisabled={true}\n dropDisabled={true}\n ></ch-tree-view-render>\n ) : null}\n </div>\n );\n };\n\n #renderImageTab = () => {\n return (\n <div\n part=\"data-panel-composition-preview\"\n class=\"data-preview\"\n style={{ height: \"100%\" }}\n >\n <img\n src={this.selectedDesignItem ? this.selectedDesignItem : undefined}\n alt=\"Preview\"\n class={\n this.selectedDesignType === DESIGN_DATA_TYPE_IMAGES\n ? \"checker-board\"\n : undefined\n }\n />\n </div>\n );\n };\n\n #tabSelectionChangedHandler = (\n event: CustomEvent<{\n lastSelectedIndex: number;\n newSelectedId: string;\n newSelectedIndex: number;\n }>\n ): void => {\n this.renderedTabs.clear();\n this.renderedTabs.add(event.detail.newSelectedId);\n this.reRenderCounter++;\n this.activeTabs.set(this.selectedDesignType, event.detail.newSelectedId);\n };\n\n #renderDesignTabsCh = (): HTMLChTabRenderElement => {\n return (\n <ch-tab-render\n // main section\n class={{\n \"tab\": true,\n \"scrollable\": true,\n \"fit-images\": this.fitImages\n }}\n tabListPosition=\"block-start\"\n model={this.tabsModel}\n selectedId={this.activeTabs.get(this.selectedDesignType)}\n overflow=\"auto\"\n contain=\"size\"\n onSelectedItemChange={this.#tabSelectionChangedHandler}\n >\n <div\n slot={TAB_DATA.tokens.slot}\n class=\"spacing-body\"\n style={{\n display: this.renderedTabs.has(TAB_DATA.tokens.id) ? \"\" : \"none\"\n }}\n >\n <slot name={TAB_DATA.tokens.slot}></slot>\n </div>\n\n <div\n slot={TAB_DATA.styles.slot}\n class=\"spacing-body\"\n style={{\n display: this.renderedTabs.has(TAB_DATA.styles.id) ? \"\" : \"none\"\n }}\n >\n <slot name={TAB_DATA.styles.slot}></slot>\n </div>\n\n <div\n class=\"composition-tab-slot scrollable\"\n slot={TAB_DATA.composition.slot}\n style={{\n display: this.renderedTabs.has(TAB_DATA.composition.id)\n ? \"\"\n : \"none\"\n }}\n >\n {this.selectedDesignType === DESIGN_DATA_TYPE_IMAGES ||\n this.selectedDesignType === DESIGN_DATA_TYPE_FONTS\n ? this.#renderImageTab()\n : this.#renderPanelTab()}\n </div>\n\n <div\n slot={TAB_DATA.layout.slot}\n class=\"spacing-body\"\n style={{\n display: this.renderedTabs.has(TAB_DATA.layout.id) ? \"\" : \"none\"\n }}\n >\n <slot name={TAB_DATA.layout.slot}></slot>\n </div>\n\n <div\n slot={TAB_DATA.code.slot}\n class=\"spacing-body\"\n style={{\n display: this.renderedTabs.has(TAB_DATA.code.id) ? \"\" : \"none\"\n }}\n >\n <slot name={TAB_DATA.code.slot}></slot>\n </div>\n </ch-tab-render>\n );\n };\n\n render(): void {\n return (\n <Host class=\"widget\">\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <section class=\"section\">\n {this.#renderHeader()}\n {this.#renderMain()}\n {this.#renderFooter()}\n </section>\n </Host>\n );\n }\n}\n\nexport type LoadMessageCallback = (message: MessageData) => void;\nexport type LoadCallback = (\n source: string | File,\n designSystem: string,\n importAsWebPanels: boolean,\n token: string | undefined,\n onMessage: LoadMessageCallback\n) => Promise<DesignData | undefined>;\nexport type LoadPanelDataCallback = (id: string) => Promise<DesignPanelData>;\nexport type LoadImageCallback = (id: string) => Promise<string>;\nexport type LoadFontCallback = (id: string) => Promise<string>;\nexport type LoadDesignSystemCallback = (\n id: string\n) => Promise<DesignSystemData>;\nexport type TextEditorFactoryCallback = (\n type: TextEditorType,\n parent: string,\n text: string\n) => Promise<void>;\nexport type SelectModuleCallback = () => Promise<EntityData | undefined>;\n\nexport type RequiresAccessTokenCallback = (source: string) => Promise<boolean>;\nexport type ConfirmCallback = (data: DesignImportData) => Promise<boolean>;\nexport type CancelCallback = () => Promise<void>;\n\nexport interface MessageData {\n type: \"error\" | \"warning\" | \"info\";\n text: string;\n}\n\nexport interface DesignData {\n panels: DesignItemData[];\n stencils: DesignItemData[];\n images: DesignItemData[];\n designSystem: DesignItemData[];\n fonts: DesignItemData[];\n success: boolean;\n}\n\nexport interface DesignItemData {\n id: string;\n name: string;\n variants?: DesignItemData[];\n}\n\nexport interface DesignPanelData {\n composition: DesignPanelCompositionData;\n code?: string;\n layout?: string;\n}\n\nexport interface DesignPanelCompositionData {\n preview?: string;\n controls: DesignPanelControlData[];\n}\n\nexport interface DesignPanelControlData {\n name: string;\n type: string;\n leaf?: boolean;\n controls: DesignPanelControlData[];\n}\n\nexport interface DesignSystemData {\n tokens: string;\n styles: string;\n}\n\ntype DesignItemDataDetail = DesignPanelData | DesignSystemData | string;\n\nexport interface DesignImportData {\n panels: string[];\n stencils: string[];\n fonts: string[];\n moduleId: string;\n images: string[];\n styleName: string;\n importAsWebPanels: boolean;\n}\n\nexport type DesignType =\n | typeof DESIGN_DATA_TYPE_PANELS\n | typeof DESIGN_DATA_TYPE_STENCILS\n | typeof DESIGN_DATA_TYPE_IMAGES\n | typeof DESIGN_DATA_TYPE_DESIGN_SYSTEM\n | typeof DESIGN_DATA_TYPE_FONTS;\n\nexport type DesignObjectType = {\n [Key in DesignType]: string;\n};\n\nexport type ItemLoadedInfo = {\n designType: DesignType;\n designDataDetail: DesignItemDataDetail;\n};\n\nexport type TextEditorType = \"code\" | \"html\" | \"styles\" | \"tokens\";\n\nexport type ReactiveSettings = {\n path: boolean;\n style: boolean;\n module: boolean;\n importAsWebPanels: boolean;\n};\n\ntype ReactiveSettingsValues = {\n path: string;\n style: string;\n moduleId: string;\n importAsWebPanels: boolean;\n};\n"],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ import { r as e, h as s, g as r } from "./p-49712340.js";
2
+
3
+ import { g as a } from "./p-b81d21d5.js";
4
+
5
+ import { L as i } from "./p-311eedf3.js";
6
+
7
+ import { h as o } from "./p-960c4988.js";
8
+
9
+ const t = ':host{font-family:var(--mer-font-family--primary)}.message{color:var(--mer-color__neutral-gray--100);display:grid;grid-template-rows:0fr;transition:grid-template-rows 100ms;transition:grid-template-rows 100ms, -ms-grid-rows 100ms;}.message__outer-wrapper{overflow:hidden}.message__inner-wrapper{padding:var(--mer-spacing--sm) var(--mer-spacing--sm);border-radius:var(--mer-border__radius--sm);border-inline-start:var(--mer-border__width--md) solid transparent;background-color:var(--mer-color__neutral-gray--1200);margin-block-start:var(--mer-spacing--xs);position:relative}.message__header{display:flex;gap:var(--mer-spacing--xs);justify-content:space-between;pointer-events:none}.message__header .icon-md{opacity:0}.message__role{display:inline-block;font-weight:var(--mer-font__weight--semi-bold);margin-block-end:var(--mer-spacing--xs);display:inline-grid;grid-template-columns:max-content max-content;gap:6px}.message__role:before{content:"";display:grid;place-self:center flex-end;inline-size:4px;block-size:4px;border-radius:50%;background-color:currentcolor}.message__role--user{color:var(--mer-color__primary--300)}.message__role--hidden{display:none}.message__caption{font-size:var(--mer-font__size--xs);line-height:var(--mer-line-height--regular)}.message--visible{grid-template-rows:1fr}.message--copying{pointer-events:none}.message--copying span:not(.copied),.message--copying .message__caption{color:transparent;-webkit-user-select:none;-ms-user-select:none;user-select:none;}.message--user .message__inner-wrapper{background-color:rgba(91, 167, 255, 0.08);border-color:var(--mer-border-color__primary)}.message--assistant-action .message__inner-wrapper{background-color:rgba(63, 168, 155, 0.05);border-color:var(--mer-border-color__success)}.message--assistant-chat .message__inner-wrapper{background-color:var(--mer-surface__elevation--01)}.message--assistant-in-progress{color:var(--mer-color__neutral-gray--500)}.message--assistant-in-progress .message__inner-wrapper{font-style:italic;display:grid;grid-template-columns:1fr auto;gap:var(--mer-spacing--xs)}.message--assistant-in-progress .message__inner-wrapper .message__caption{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;flex:1}.message--assistant-in-progress .message__inner-wrapper .animation-wrapper{flex:none}.message--assistant-error .message__inner-wrapper{background-color:rgba(251, 124, 132, 0.05);border-color:var(--mer-border-color__error)}.message--copyable{cursor:pointer}.message--copyable:hover{filter:brightness(1.2)}.message--copyable:hover .icon-md{opacity:1}.message:last-child{margin-block-end:0}:host(:first-child) .message__inner-wrapper{margin-block-end:0}.animation-wrapper{width:45px;display:flex;align-items:center;justify-content:center}.dot-pulse{position:relative;left:-9999px;width:5px;height:5px;border-radius:2.5px;background-color:var(--mer-color__neutral-gray--400);color:var(--mer-color__neutral-gray--400);box-shadow:9999px 0 0 -5px;animation:dot-pulse 1.5s infinite linear;animation-delay:0.25s}.dot-pulse::before,.dot-pulse::after{content:"";display:inline-block;position:absolute;top:0;width:5px;height:5px;border-radius:2.5px;background-color:var(--mer-color__neutral-gray--400);color:var(--mer-color__neutral-gray--400)}.dot-pulse::before{box-shadow:9984px 0 0 -5px;animation:dot-pulse-before 1.5s infinite linear;animation-delay:0s}.dot-pulse::after{box-shadow:10014px 0 0 -5px;animation:dot-pulse-after 1.5s infinite linear;animation-delay:0.5s}@keyframes dot-pulse-before{0%{box-shadow:9984px 0 0 -5px}30%{box-shadow:9984px 0 0 2px}60%,100%{box-shadow:9984px 0 0 -5px}}@keyframes dot-pulse{0%{box-shadow:9999px 0 0 -5px}30%{box-shadow:9999px 0 0 2px}60%,100%{box-shadow:9999px 0 0 -5px}}@keyframes dot-pulse-after{0%{box-shadow:10014px 0 0 -5px}30%{box-shadow:10014px 0 0 2px}60%,100%{box-shadow:10014px 0 0 -5px}}.copied{position:absolute;width:100%;height:100%;top:0;left:0;display:flex;align-items:center;justify-content:center;color:var(--mer-color__neutral-gray--300);display:flex;gap:var(--mer-spacing--xs);opacity:0;animation:fadeIn var(--mer-timing--fast) ease-out forwards}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.hiChar{color:var(--mer-color__primary--200);filter:brightness(1.3)}';
10
+
11
+ const n = a({
12
+ category: "bpm",
13
+ name: "tasks",
14
+ colorType: "neutral"
15
+ });
16
+
17
+ const l = class {
18
+ constructor(r) {
19
+ e(this, r);
20
+ this.copyable = false;
21
+ // 7.LISTENERS //
22
+ // 8.PUBLIC METHODS API //
23
+ // 9.LOCAL METHODS //
24
+ this.copyMessage = () => {
25
+ const e = JSON.stringify({
26
+ messageType: this.messageType,
27
+ message: this.message
28
+ }, null, 2);
29
+ navigator.clipboard.writeText(e);
30
+ this.showCopiedMessage = true;
31
+ setTimeout((() => {
32
+ this.showCopiedMessage = false;
33
+ }), 1500);
34
+ };
35
+ this.evaluateMessageIsCopyable = () => {
36
+ this.copyable = this.messageType !== "assistant-in-progress";
37
+ };
38
+ this.evaluateCopyIcon = () => this.copyable ? s("ch-image", {
39
+ class: "icon-md",
40
+ src: n
41
+ }) : null;
42
+ this.visible = false;
43
+ this.showCopiedMessage = false;
44
+ this.message = undefined;
45
+ this.messageType = undefined;
46
+ this.filterValue = undefined;
47
+ this.hidden = undefined;
48
+ this.translations = undefined;
49
+ }
50
+ // 5.EVENTS (EMIT) //
51
+ // 6.COMPONENT LIFECYCLE METHODS //
52
+ async componentWillLoad() {
53
+ this._componentLocale = await i.getComponentStrings(this.el);
54
+ this.evaluateMessageIsCopyable();
55
+ }
56
+ componentDidRender() {
57
+ setTimeout((() => {
58
+ /* Without the timeout it appears instantly (no apparent transition)*/
59
+ this.visible = true;
60
+ const e = this.el.parentElement;
61
+ e.scrollTo(0, 0);
62
+ }), 0);
63
+ }
64
+ // 10.RENDER() FUNCTION //
65
+ render() {
66
+ return s("li", {
67
+ class: {
68
+ message: true,
69
+ "message--visible": this.visible && !this.hidden,
70
+ [`message--${[ this.messageType ]}`]: true,
71
+ "message--assistant": this.messageType !== "user",
72
+ "message--copyable": this.copyable,
73
+ "message--copying": this.showCopiedMessage
74
+ },
75
+ onClick: this.copyable && this.copyMessage
76
+ }, s("div", {
77
+ class: "message__outer-wrapper"
78
+ }, s("div", {
79
+ class: {
80
+ "message__inner-wrapper": true
81
+ }
82
+ }, this.messageType === "user" ? s("div", {
83
+ class: "message__header"
84
+ }, s("span", {
85
+ class: "message__role message__role--user"
86
+ }, this._componentLocale.you), this.evaluateCopyIcon()) : s("div", {
87
+ class: "message__header"
88
+ }, s("span", {
89
+ class: {
90
+ message__role: this.messageType !== "assistant-in-progress",
91
+ "message__role--hidden": this.messageType === "assistant-in-progress",
92
+ "message__role--assistant": true
93
+ }
94
+ }, this._componentLocale.assistant), this.evaluateCopyIcon()), s("div", {
95
+ class: {
96
+ message__caption: true,
97
+ "message__caption--in-progress": this.messageType === "assistant-in-progress"
98
+ }
99
+ }, this.showCopiedMessage ? s("span", {
100
+ class: "copied"
101
+ }, s("ch-image", {
102
+ class: "icon-md",
103
+ src: n
104
+ }), this.translations["copied"]) : null, o(this.message, this.filterValue)), this.messageType === "assistant-in-progress" ? s("div", {
105
+ class: "animation-wrapper"
106
+ }, s("div", {
107
+ class: "dot-pulse"
108
+ })) : null)));
109
+ }
110
+ static get assetsDirs() {
111
+ return [ "gx-ide-assets/ai-message" ];
112
+ }
113
+ get el() {
114
+ return r(this);
115
+ }
116
+ };
117
+
118
+ l.style = t;
119
+
120
+ export { l as gx_ide_ai_message };
121
+ //# sourceMappingURL=p-798eb91a.entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["aiMessageCss","COPY_ICON","getIconPath","category","name","colorType","GxIdeAiMessage","this","copyable","copyMessage","messageInfo","JSON","stringify","messageType","message","navigator","clipboard","writeText","showCopiedMessage","setTimeout","evaluateMessageIsCopyable","evaluateCopyIcon","h","class","src","componentWillLoad","_componentLocale","Locale","getComponentStrings","el","componentDidRender","visible","messagesList","parentElement","scrollTo","render","hidden","onClick","you","message__role","assistant","message__caption","translations","hiChar","filterValue"],"sources":["src/components/ai-assistant/ai-message.scss?tag=gx-ide-ai-message","src/components/ai-assistant/ai-message.tsx"],"sourcesContent":["@import \"../../global/gx-ide-mixins.scss\";\n\n:host {\n font-family: var(--mer-font-family--primary);\n}\n/*--- Messages ---*/\n.message {\n color: var(--mer-color__neutral-gray--100);\n display: grid;\n grid-template-rows: 0fr;\n transition: grid-template-rows 100ms;\n transition: grid-template-rows 100ms, -ms-grid-rows 100ms;\n &__outer-wrapper {\n overflow: hidden;\n }\n &__inner-wrapper {\n padding: var(--mer-spacing--sm) var(--mer-spacing--sm);\n border-radius: var(--mer-border__radius--sm);\n border-inline-start: var(--mer-border__width--md) solid transparent;\n background-color: var(--mer-color__neutral-gray--1200);\n margin-block-start: var(--mer-spacing--xs);\n position: relative;\n }\n &__header {\n display: flex;\n gap: var(--mer-spacing--xs);\n justify-content: space-between;\n pointer-events: none;\n\n .icon-md {\n opacity: 0;\n }\n }\n &__role {\n display: inline-block;\n font-weight: var(--mer-font__weight--semi-bold);\n margin-block-end: var(--mer-spacing--xs);\n display: inline-grid;\n grid-template-columns: max-content max-content;\n gap: 6px;\n &:before {\n content: \"\";\n display: grid;\n place-self: center flex-end;\n inline-size: 4px;\n block-size: 4px;\n border-radius: 50%;\n background-color: currentcolor;\n }\n\n &--user {\n color: var(--mer-color__primary--300);\n }\n &--assistant {\n }\n &--hidden {\n display: none;\n }\n }\n &__caption {\n font-size: var(--mer-font__size--xs);\n line-height: var(--mer-line-height--regular);\n }\n &--visible {\n grid-template-rows: 1fr;\n }\n &--copying {\n pointer-events: none;\n span:not(.copied),\n .message__caption {\n color: transparent;\n -webkit-user-select: none; /* Safari */\n -ms-user-select: none; /* IE 10 and IE 11 */\n user-select: none; /* Standard syntax */\n }\n }\n /*--- Types of messages ---*/\n &--user {\n .message__inner-wrapper {\n background-color: rgba(91, 167, 255, 0.08);\n border-color: var(--mer-border-color__primary);\n }\n }\n &--assistant-action {\n .message__inner-wrapper {\n background-color: rgba(63, 168, 155, 0.05);\n border-color: var(--mer-border-color__success);\n }\n }\n &--assistant-chat {\n .message__inner-wrapper {\n background-color: var(--mer-surface__elevation--01);\n }\n }\n &--assistant-in-progress {\n color: var(--mer-color__neutral-gray--500);\n .message__inner-wrapper {\n font-style: italic;\n display: grid;\n grid-template-columns: 1fr auto;\n gap: var(--mer-spacing--xs);\n\n .message__caption {\n @include ellipsis;\n flex: 1;\n }\n .animation-wrapper {\n flex: none;\n }\n }\n }\n &--assistant-error {\n .message__inner-wrapper {\n background-color: rgba(251, 124, 132, 0.05);\n border-color: var(--mer-border-color__error);\n }\n }\n &--copyable {\n cursor: pointer;\n &:hover {\n filter: brightness(1.2);\n .icon-md {\n opacity: 1;\n }\n }\n }\n &:last-child {\n margin-block-end: 0;\n }\n}\n:host(:first-child) {\n .message {\n &__inner-wrapper {\n margin-block-end: 0;\n }\n }\n}\n\n/*--- Dot Pulse Sweet Animation ---*/\n.animation-wrapper {\n width: 45px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n$color: var(--mer-color__neutral-gray--400);\n.dot-pulse {\n position: relative;\n left: -9999px;\n width: 5px;\n height: 5px;\n border-radius: 2.5px;\n background-color: $color;\n color: $color;\n box-shadow: 9999px 0 0 -5px;\n animation: dot-pulse 1.5s infinite linear;\n animation-delay: 0.25s;\n &::before,\n &::after {\n content: \"\";\n display: inline-block;\n position: absolute;\n top: 0;\n width: 5px;\n height: 5px;\n border-radius: 2.5px;\n background-color: $color;\n color: $color;\n }\n &::before {\n box-shadow: 9984px 0 0 -5px;\n animation: dot-pulse-before 1.5s infinite linear;\n animation-delay: 0s;\n }\n &::after {\n box-shadow: 10014px 0 0 -5px;\n animation: dot-pulse-after 1.5s infinite linear;\n animation-delay: 0.5s;\n }\n}\n@keyframes dot-pulse-before {\n 0% {\n box-shadow: 9984px 0 0 -5px;\n }\n 30% {\n box-shadow: 9984px 0 0 2px;\n }\n 60%,\n 100% {\n box-shadow: 9984px 0 0 -5px;\n }\n}\n@keyframes dot-pulse {\n 0% {\n box-shadow: 9999px 0 0 -5px;\n }\n 30% {\n box-shadow: 9999px 0 0 2px;\n }\n 60%,\n 100% {\n box-shadow: 9999px 0 0 -5px;\n }\n}\n@keyframes dot-pulse-after {\n 0% {\n box-shadow: 10014px 0 0 -5px;\n }\n 30% {\n box-shadow: 10014px 0 0 2px;\n }\n 60%,\n 100% {\n box-shadow: 10014px 0 0 -5px;\n }\n}\n\n/*--- Copy Message ---*/\n.copied {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mer-color__neutral-gray--300);\n display: flex;\n gap: var(--mer-spacing--xs);\n opacity: 0;\n animation: fadeIn var(--mer-timing--fast) ease-out forwards;\n}\n\n@keyframes fadeIn {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n\n@include hiChar;\n","/* STENCIL IMPORTS */\nimport { Component, h, Prop, Element, State } from \"@stencil/core\";\n/* OTHER LIBRARIES IMPORTS */\nimport { getIconPath } from \"@genexus/mercury\";\n/* CUSTOM IMPORTS */\nimport { Locale } from \"../../common/locale\";\nimport { MessageType } from \"./ai-assistant\";\nimport { hiChar } from \"../../common/helpers\";\n\nconst COPY_ICON = getIconPath({\n category: \"bpm\",\n name: \"tasks\",\n colorType: \"neutral\"\n});\n@Component({\n tag: \"gx-ide-ai-message\",\n styleUrl: \"ai-message.scss\",\n shadow: false,\n assetsDirs: [\"gx-ide-assets/ai-message\"]\n})\nexport class GxIdeAiMessage {\n /*\nINDEX:\n1.OWN PROPERTIES \n2.REFERENCE TO ELEMENTS\n3.STATE() VARIABLES\n4.PUBLIC PROPERTY API | WATCH'S\n5.EVENTS (EMIT)\n6.COMPONENT LIFECYCLE METHODS\n7.LISTENERS\n8.PUBLIC METHODS API\n9.LOCAL METHODS\n10.RENDER() FUNCTION\n*/\n\n // 1.OWN PROPERTIES //\n\n /* The message allows to be copied*/\n private _componentLocale: any;\n private copyable = false;\n\n // 2. REFERENCE TO ELEMENTS //\n\n @Element() el: HTMLGxIdeAiMessageElement;\n\n // 3.STATE() VARIABLES //\n\n /**\n * This wil display the message if true\n */\n @State() visible = false;\n\n /**\n * This wil show the user a text, indicating that the message has been copied\n */\n @State() showCopiedMessage = false;\n\n // 4.PUBLIC PROPERTY API | WATCH'S //\n\n /**\n * The actual message\n */\n @Prop() readonly message: string;\n\n /**\n * The message type\n */\n @Prop() readonly messageType: MessageType;\n\n /**\n * The filter value\n */\n @Prop() readonly filterValue: string;\n\n /**\n * It hides the message (used for the filter)\n */\n @Prop() readonly hidden: boolean;\n\n /**\n * An object with the needed string translations.\n */\n @Prop() readonly translations: Translations;\n\n // 5.EVENTS (EMIT) //\n\n // 6.COMPONENT LIFECYCLE METHODS //\n\n async componentWillLoad() {\n this._componentLocale = await Locale.getComponentStrings(this.el);\n this.evaluateMessageIsCopyable();\n }\n\n componentDidRender() {\n setTimeout(() => {\n /* Without the timeout it appears instantly (no apparent transition)*/\n this.visible = true;\n const messagesList = this.el.parentElement;\n messagesList.scrollTo(0, 0);\n }, 0);\n }\n\n // 7.LISTENERS //\n\n // 8.PUBLIC METHODS API //\n\n // 9.LOCAL METHODS //\n\n private copyMessage = () => {\n const messageInfo = JSON.stringify(\n {\n messageType: this.messageType,\n message: this.message\n },\n null,\n 2\n );\n\n navigator.clipboard.writeText(messageInfo);\n this.showCopiedMessage = true;\n setTimeout(() => {\n this.showCopiedMessage = false;\n }, 1500);\n };\n\n private evaluateMessageIsCopyable = () => {\n this.copyable = this.messageType !== \"assistant-in-progress\";\n };\n\n private evaluateCopyIcon = () => {\n return this.copyable ? (\n <ch-image class=\"icon-md\" src={COPY_ICON}></ch-image>\n ) : null;\n };\n\n // 10.RENDER() FUNCTION //\n\n render() {\n return (\n <li\n class={{\n \"message\": true,\n \"message--visible\": this.visible && !this.hidden,\n [`message--${[this.messageType]}`]: true,\n \"message--assistant\": this.messageType !== \"user\",\n \"message--copyable\": this.copyable,\n \"message--copying\": this.showCopiedMessage\n }}\n onClick={this.copyable && this.copyMessage}\n >\n <div class=\"message__outer-wrapper\">\n <div\n class={{\n \"message__inner-wrapper\": true\n }}\n >\n {this.messageType === \"user\" ? (\n <div class=\"message__header\">\n <span class=\"message__role message__role--user\">\n {this._componentLocale.you}\n </span>\n {this.evaluateCopyIcon()}\n </div>\n ) : (\n <div class=\"message__header\">\n <span\n class={{\n \"message__role\":\n this.messageType !== \"assistant-in-progress\",\n \"message__role--hidden\":\n this.messageType === \"assistant-in-progress\",\n \"message__role--assistant\": true\n }}\n >\n {this._componentLocale.assistant}\n </span>\n {this.evaluateCopyIcon()}\n </div>\n )}\n <div\n class={{\n \"message__caption\": true,\n \"message__caption--in-progress\":\n this.messageType === \"assistant-in-progress\"\n }}\n >\n {this.showCopiedMessage ? (\n <span class=\"copied\">\n <ch-image class=\"icon-md\" src={COPY_ICON}></ch-image>\n {this.translations[\"copied\"]}\n </span>\n ) : null}\n {hiChar(this.message, this.filterValue)}\n </div>\n {this.messageType === \"assistant-in-progress\" ? (\n <div class=\"animation-wrapper\">\n <div class=\"dot-pulse\"></div>\n </div>\n ) : null}\n </div>\n </div>\n </li>\n );\n }\n}\n\nexport type Translations = {\n [key: string]: string;\n};\n"],"mappings":";;;;;;;;AAAA,MAAMA,IAAe;;ACSrB,MAAMC,IAAYC,EAAY;EAC5BC,UAAU;EACVC,MAAM;EACNC,WAAW;;;MAQAC,IAAc;;;IAmBjBC,KAAAC,WAAW;;;;QAqEXD,KAAAE,cAAc;MACpB,MAAMC,IAAcC,KAAKC,UACvB;QACEC,aAAaN,KAAKM;QAClBC,SAASP,KAAKO;SAEhB,MACA;MAGFC,UAAUC,UAAUC,UAAUP;MAC9BH,KAAKW,oBAAoB;MACzBC,YAAW;QACTZ,KAAKW,oBAAoB;AAAK,UAC7B;AAAK;IAGFX,KAAAa,4BAA4B;MAClCb,KAAKC,WAAWD,KAAKM,gBAAgB;AAAuB;IAGtDN,KAAAc,mBAAmB,MAClBd,KAAKC,WACVc,EAAA;MAAUC,OAAM;MAAUC,KAAKvB;SAC7B;mBAlFa;6BAKU;;;;;;;;;EAiC7B,uBAAMwB;IACJlB,KAAKmB,yBAAyBC,EAAOC,oBAAoBrB,KAAKsB;IAC9DtB,KAAKa;;EAGP,kBAAAU;IACEX,YAAW;;MAETZ,KAAKwB,UAAU;MACf,MAAMC,IAAezB,KAAKsB,GAAGI;MAC7BD,EAAaE,SAAS,GAAG;AAAE,QAC1B;;;EAsCL,MAAAC;IACE,OACEb,EAAA;MACEC,OAAO;QACLT,SAAW;QACX,oBAAoBP,KAAKwB,YAAYxB,KAAK6B;QAC1C,CAAC,YAAY,EAAC7B,KAAKM,kBAAiB;QACpC,sBAAsBN,KAAKM,gBAAgB;QAC3C,qBAAqBN,KAAKC;QAC1B,oBAAoBD,KAAKW;;MAE3BmB,SAAS9B,KAAKC,YAAYD,KAAKE;OAE/Ba,EAAA;MAAKC,OAAM;OACTD,EAAA;MACEC,OAAO;QACL,0BAA0B;;OAG3BhB,KAAKM,gBAAgB,SACpBS,EAAA;MAAKC,OAAM;OACTD,EAAA;MAAMC,OAAM;OACThB,KAAKmB,iBAAiBY,MAExB/B,KAAKc,sBAGRC,EAAA;MAAKC,OAAM;OACTD,EAAA;MACEC,OAAO;QACLgB,eACEhC,KAAKM,gBAAgB;QACvB,yBACEN,KAAKM,gBAAgB;QACvB,4BAA4B;;OAG7BN,KAAKmB,iBAAiBc,YAExBjC,KAAKc,qBAGVC,EAAA;MACEC,OAAO;QACLkB,kBAAoB;QACpB,iCACElC,KAAKM,gBAAgB;;OAGxBN,KAAKW,oBACJI,EAAA;MAAMC,OAAM;OACVD,EAAA;MAAUC,OAAM;MAAUC,KAAKvB;QAC9BM,KAAKmC,aAAa,aAEnB,MACHC,EAAOpC,KAAKO,SAASP,KAAKqC,eAE5BrC,KAAKM,gBAAgB,0BACpBS,EAAA;MAAKC,OAAM;OACTD,EAAA;MAAKC,OAAM;UAEX"}
@@ -4,7 +4,9 @@ import { L as i } from "./p-311eedf3.js";
4
4
 
5
5
  const s = ":root{--ui-animaton-speed:0.2s}.gxg-title-01{font-family:var(--ds-base-font-family-primary);font-weight:var(--ds-title-01-font-weight);font-size:var(--ds-title-01-font-size);letter-spacing:var(--ds-base-font-letter-spacing--comfortable);color:var(--ds-base-font-color);text-align:start;line-height:var(--ds-base-font-line-height--comfortable)}.gxg-title-01--negative{font-family:var(--ds-base-font-family-primary);font-weight:var(--ds-title-01-font-weight);font-size:var(--ds-title-01-font-size);letter-spacing:var(--ds-base-font-letter-spacing--comfortable);color:var(--ds-base-font-color);text-align:start;line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--negative)}.gxg-title-02{font-family:var(--ds-base-font-family-primary);font-weight:var(--ds-title-02-font-weight);font-size:var(--ds-title-02-font-size);letter-spacing:var(--ds-base-font-letter-spacing--regular);color:var(--ds-base-font-color);text-align:start;text-transform:uppercase;line-height:var(--ds-base-font-line-height--comfortable)}.gxg-title-02--negative{font-family:var(--ds-base-font-family-primary);font-weight:var(--ds-title-02-font-weight);font-size:var(--ds-title-02-font-size);letter-spacing:var(--ds-base-font-letter-spacing--regular);color:var(--ds-base-font-color);text-align:start;text-transform:uppercase;line-height:var(--ds-base-font-line-height--comfortable);color:var(--color-on-primary)}.gxg-title-03{font-family:var(--ds-base-font-family-primary);font-weight:var(--ds-title-03-font-weight);font-size:var(--ds-title-03-font-size);letter-spacing:var(--ds-base-font-letter-spacing--regular);color:var(--ds-base-font-color);text-align:start;text-transform:uppercase;line-height:var(--ds-base-font-line-height--comfortable)}.gxg-title-03--negative{font-family:var(--ds-base-font-family-primary);font-weight:var(--ds-title-03-font-weight);font-size:var(--ds-title-03-font-size);letter-spacing:var(--ds-base-font-letter-spacing--regular);color:var(--ds-base-font-color);text-align:start;text-transform:uppercase;line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--negative)}.gxg-title-04{font-family:var(--ds-base-font-family-primary);font-weight:var(--ds-title-04-font-weight);font-size:var(--ds-title-04-font-size);letter-spacing:var(--ds-base-font-letter-spacing--comfortable);color:var(--ds-base-font-color);text-align:start;line-height:var(--ds-base-font-line-height--comfortable)}.gxg-title-04--negative{font-family:var(--ds-base-font-family-primary);font-weight:var(--ds-title-04-font-weight);font-size:var(--ds-title-04-font-size);letter-spacing:var(--ds-base-font-letter-spacing--comfortable);color:var(--ds-base-font-color);text-align:start;line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--negative)}.gxg-title-05{font-family:var(--ds-base-font-family-primary);font-weight:var(--ds-title-05-font-weight);font-size:var(--ds-title-05-font-size);letter-spacing:var(--ds-base-font-letter-spacing--regular);color:var(--ds-base-font-color);text-align:start;line-height:var(--ds-base-font-line-height--comfortable)}.gxg-title-05--negative{font-family:var(--ds-base-font-family-primary);font-weight:var(--ds-title-05-font-weight);font-size:var(--ds-title-05-font-size);letter-spacing:var(--ds-base-font-letter-spacing--regular);color:var(--ds-base-font-color);text-align:start;line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--negative)}.gxg-text{font-family:var(--ds-base-font-family-primary);font-size:var(--ds-base-font-size);color:var(--ds-base-font-size-color);font-weight:var(--ds-base-font-size-weight);line-height:var(--ds-base-font-line-height--comfortable)}.gxg-text--negative{font-family:var(--ds-base-font-family-primary);font-size:var(--ds-base-font-size);color:var(--ds-base-font-size-color);font-weight:var(--ds-base-font-size-weight);line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--negative)}.gxg-text--gray{font-family:var(--ds-base-font-family-primary);font-size:var(--ds-base-font-size);color:var(--ds-base-font-size-color);font-weight:var(--ds-base-font-size-weight);line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--dimmed)}.gxg-quote{font-family:var(--ds-base-font-family-primary);font-size:var(--ds-base-font-size);color:var(--ds-base-font-size-color);font-weight:var(--ds-base-font-size-weight);line-height:var(--ds-base-font-line-height--comfortable);font-style:italic}.gxg-quote--negative{color:var(--ds-base-font-color--negative)}.gxg-link{line-height:unset;font-family:var(--ds-base-font-family-primary);font-size:var(--ds-base-font-size);color:var(--ds-base-font-size-color);font-weight:var(--ds-base-font-size-weight);line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--link);text-decoration:underline;cursor:pointer;display:inline-block}.gxg-link:hover{color:var(--ds-base-font-color--link-hover)}.gxg-link:active{color:var(--ds-base-font-color--link-active)}.gxg-link-gray{line-height:unset;font-family:var(--ds-base-font-family-primary);font-size:var(--ds-base-font-size);color:var(--ds-base-font-size-color);font-weight:var(--ds-base-font-size-weight);line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--link);text-decoration:underline;cursor:pointer;display:inline-block;color:var(--ds-base-font-color--dimmed)}.gxg-link-gray:hover{line-height:unset;font-family:var(--ds-base-font-family-primary);font-size:var(--ds-base-font-size);color:var(--ds-base-font-size-color);font-weight:var(--ds-base-font-size-weight);line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--link);text-decoration:underline;cursor:pointer;display:inline-block;color:var(--ds-base-font-color--dimmed);filter:brightness(1.4)}.gxg-alert-error{font-family:var(--ds-base-font-family-primary);font-size:var(--ds-base-font-size);color:var(--ds-base-font-size-color);font-weight:var(--ds-base-font-size-weight);line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--error);display:inline-block}.gxg-alert-warning{font-family:var(--ds-base-font-family-primary);font-size:var(--ds-base-font-size);color:var(--ds-base-font-size-color);font-weight:var(--ds-base-font-size-weight);line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--warning);display:inline-block}.gxg-alert-success{font-family:var(--ds-base-font-family-primary);font-size:var(--ds-base-font-size);color:var(--ds-base-font-size-color);font-weight:var(--ds-base-font-size-weight);line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--success);display:inline-block}.gxg-tab--disabled{color:var(--color-primary-disabled);pointer-events:none}.gxg-tab--disabled[disabled]{color:var(--color-primary-disabled);pointer-events:none}.gxg-label{font-family:var(--ds-base-font-family-primary);font-weight:var(--gxg-label-font-weight);font-size:var(--gxg-label-font-size);color:var(--gxg-label-color);text-align:center;line-height:1.455em;display:flex;align-items:center}.gxg-label:hover{color:var(--color-primary-hover)}.gxg-label:focus{color:var(--color-primary-active)}.gxg-label:active{color:var(--color-primary-active)}.gxg-label[disabled]{color:var(--color-primary-disabled)}.gxg-label--negative{color:var(--color-on-primary)}.gxg-label--negative[disabled]{color:var(--color-on-disabled)}.gxg-scrollbar{}.gxg-scrollbar::-webkit-scrollbar{width:var(--gxg-scrollbar-width);height:var(--gxg-scrollbar-width)}.gxg-scrollbar::-webkit-scrollbar-track{background-color:var(--gxg-scrollbar-track-background);border-radius:var(--gxg-scrollbar-track-border-radius)}.gxg-scrollbar::-webkit-scrollbar-thumb{background-color:var(--gxg-scrollbar-track-thumb-background);border-radius:var(--gxg-scrollbar-track-thumb-radius)}.gxg-scrollbar::-webkit-scrollbar-thumb:hover{background-color:var(--gxg-scrollbar-track-thumb-hover-background)}.gxg-scrollbar::-webkit-scrollbar-corner{background:rgba(0, 0, 0, 0)}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}:host{display:grid;block-size:100%}.card-regular{background-color:var(--mer-surface__elevation--01);border:var(--mer-border__width--sm) solid var(--mer-border-color__on-elevation--01);border-radius:var(--mer-border__radius--md);padding:var(--mer-spacing--md) var(--mer-spacing--md);display:grid}.card-small{background-color:var(--mer-surface__elevation--02);border-radius:var(--mer-border__radius--sm);padding:var(--mer-spacing--sm) var(--mer-spacing--sm)}.card-small--actionable:hover{background-color:var(--mer-color__neutral-gray--600)}.card-small--actionable:active{background-color:var(--mer-color__neutral-gray--650)}.card-small:focus-visible{outline:var(--focus__outline-width) var(--focus__outline-style) var(--focus__outline-color);outline-offset:var(--focus__outline-offset)}.empty-state{block-size:100%;display:flex;align-items:center;justify-content:center;flex-direction:column;gap:var(--mer-spacing--sm);text-align:center}.empty-state__title,.empty-state__button,.empty-state__link{max-inline-size:300px}.opacity-0{opacity:0}.opacity-1{opacity:1}.display-contents{display:contents}.gxi-hidden{display:none !important}.gxi-full-height{height:100%}.gxi-overflow-auto{overflow:auto}.gxi-display-flex{display:flex}.align-start{display:flex;align-items:start}.align-center{display:flex;align-items:center}.align-end{display:flex;align-items:end}.overflow-auto{overflow:auto}.justify-start{display:flex;justify-content:start}.justify-center{display:flex;justify-content:center}.justify-end{display:flex;justify-content:end}.grid{display:grid;grid-row-gap:var(--gx-ide-grid-row-gap);grid-column-gap:var(--gx-ide-grid-column-gap);grid-template-rows:auto}ch-grid-cell{display:flex}ch-grid{overflow:auto;height:100%}ch-grid-column{z-index:99;border-bottom:1px solid var(--mer-color__neutral-gray--800)}ch-grid-column:first-child{padding-inline-start:var(--gx-ide-container__padding) !important}ch-grid-column:last-child{padding-inline-end:var(--gx-ide-container__padding) !important}ch-grid-cell{--mer-spacing--xs:var(--gx-ide-container__padding)}.layout{display:grid;gap:var(--mer-spacing--lg);box-sizing:border-box}.layout--two-cols{grid-template-columns:1fr 1fr}.layout--space-above{padding-block-start:var(--mer-spacing--lg)}gxg-tabs{box-shadow:none}:host(.gx-ide-component){height:100% !important;display:flex !important;flex-direction:column !important}:host(:focus-within) gx-ide-top-bar::part(wrapper){background-color:var(--color-secondary-enabled)}.gx-ide-main-wrapper{color:var(--gx-ide-component-text-color);font-weight:var(--mer-font__weight--regular);font-size:var(--mer-font__size--xs);font-family:var(--mer-font-family--primary);height:100%;background-color:var(--gx-ide-component-background-color);display:flex;flex-direction:column;flex-grow:1;box-sizing:border-box}.gx-ide-main{flex-grow:1;overflow-y:auto;}.gx-ide-main::-webkit-scrollbar{width:var(--gxg-scrollbar-width);height:var(--gxg-scrollbar-width)}.gx-ide-main::-webkit-scrollbar-track{background-color:var(--gxg-scrollbar-track-background);border-radius:var(--gxg-scrollbar-track-border-radius)}.gx-ide-main::-webkit-scrollbar-thumb{background-color:var(--gxg-scrollbar-track-thumb-background);border-radius:var(--gxg-scrollbar-track-thumb-radius)}.gx-ide-main::-webkit-scrollbar-thumb:hover{background-color:var(--gxg-scrollbar-track-thumb-hover-background)}.gx-ide-main::-webkit-scrollbar-corner{background:rgba(0, 0, 0, 0)}.gx-ide-overflow{overflow-y:auto;}.gx-ide-overflow::-webkit-scrollbar{width:var(--gxg-scrollbar-width);height:var(--gxg-scrollbar-width)}.gx-ide-overflow::-webkit-scrollbar-track{background-color:var(--gxg-scrollbar-track-background);border-radius:var(--gxg-scrollbar-track-border-radius)}.gx-ide-overflow::-webkit-scrollbar-thumb{background-color:var(--gxg-scrollbar-track-thumb-background);border-radius:var(--gxg-scrollbar-track-thumb-radius)}.gx-ide-overflow::-webkit-scrollbar-thumb:hover{background-color:var(--gxg-scrollbar-track-thumb-hover-background)}.gx-ide-overflow::-webkit-scrollbar-corner{background:rgba(0, 0, 0, 0)}.tree-view-primary{font-size:var(--mer-font__size--2xs)}p{margin:0;font-size:var(--mer-font__size--xxs)}.buttons-container{display:flex;gap:var(--mer-spacing--xs)}:root{--ui-animaton-speed:0.2s}.gxg-title-01{font-family:var(--ds-base-font-family-primary);font-weight:var(--ds-title-01-font-weight);font-size:var(--ds-title-01-font-size);letter-spacing:var(--ds-base-font-letter-spacing--comfortable);color:var(--ds-base-font-color);text-align:start;line-height:var(--ds-base-font-line-height--comfortable)}.gxg-title-01--negative{font-family:var(--ds-base-font-family-primary);font-weight:var(--ds-title-01-font-weight);font-size:var(--ds-title-01-font-size);letter-spacing:var(--ds-base-font-letter-spacing--comfortable);color:var(--ds-base-font-color);text-align:start;line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--negative)}.gxg-title-02{font-family:var(--ds-base-font-family-primary);font-weight:var(--ds-title-02-font-weight);font-size:var(--ds-title-02-font-size);letter-spacing:var(--ds-base-font-letter-spacing--regular);color:var(--ds-base-font-color);text-align:start;text-transform:uppercase;line-height:var(--ds-base-font-line-height--comfortable)}.gxg-title-02--negative{font-family:var(--ds-base-font-family-primary);font-weight:var(--ds-title-02-font-weight);font-size:var(--ds-title-02-font-size);letter-spacing:var(--ds-base-font-letter-spacing--regular);color:var(--ds-base-font-color);text-align:start;text-transform:uppercase;line-height:var(--ds-base-font-line-height--comfortable);color:var(--color-on-primary)}.gxg-title-03{font-family:var(--ds-base-font-family-primary);font-weight:var(--ds-title-03-font-weight);font-size:var(--ds-title-03-font-size);letter-spacing:var(--ds-base-font-letter-spacing--regular);color:var(--ds-base-font-color);text-align:start;text-transform:uppercase;line-height:var(--ds-base-font-line-height--comfortable)}.gxg-title-03--negative{font-family:var(--ds-base-font-family-primary);font-weight:var(--ds-title-03-font-weight);font-size:var(--ds-title-03-font-size);letter-spacing:var(--ds-base-font-letter-spacing--regular);color:var(--ds-base-font-color);text-align:start;text-transform:uppercase;line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--negative)}.gxg-title-04{font-family:var(--ds-base-font-family-primary);font-weight:var(--ds-title-04-font-weight);font-size:var(--ds-title-04-font-size);letter-spacing:var(--ds-base-font-letter-spacing--comfortable);color:var(--ds-base-font-color);text-align:start;line-height:var(--ds-base-font-line-height--comfortable)}.gxg-title-04--negative{font-family:var(--ds-base-font-family-primary);font-weight:var(--ds-title-04-font-weight);font-size:var(--ds-title-04-font-size);letter-spacing:var(--ds-base-font-letter-spacing--comfortable);color:var(--ds-base-font-color);text-align:start;line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--negative)}.gxg-title-05{font-family:var(--ds-base-font-family-primary);font-weight:var(--ds-title-05-font-weight);font-size:var(--ds-title-05-font-size);letter-spacing:var(--ds-base-font-letter-spacing--regular);color:var(--ds-base-font-color);text-align:start;line-height:var(--ds-base-font-line-height--comfortable)}.gxg-title-05--negative{font-family:var(--ds-base-font-family-primary);font-weight:var(--ds-title-05-font-weight);font-size:var(--ds-title-05-font-size);letter-spacing:var(--ds-base-font-letter-spacing--regular);color:var(--ds-base-font-color);text-align:start;line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--negative)}.gxg-text{font-family:var(--ds-base-font-family-primary);font-size:var(--ds-base-font-size);color:var(--ds-base-font-size-color);font-weight:var(--ds-base-font-size-weight);line-height:var(--ds-base-font-line-height--comfortable)}.gxg-text--negative{font-family:var(--ds-base-font-family-primary);font-size:var(--ds-base-font-size);color:var(--ds-base-font-size-color);font-weight:var(--ds-base-font-size-weight);line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--negative)}.gxg-text--gray{font-family:var(--ds-base-font-family-primary);font-size:var(--ds-base-font-size);color:var(--ds-base-font-size-color);font-weight:var(--ds-base-font-size-weight);line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--dimmed)}.gxg-quote{font-family:var(--ds-base-font-family-primary);font-size:var(--ds-base-font-size);color:var(--ds-base-font-size-color);font-weight:var(--ds-base-font-size-weight);line-height:var(--ds-base-font-line-height--comfortable);font-style:italic}.gxg-quote--negative{color:var(--ds-base-font-color--negative)}.gxg-link{line-height:unset;font-family:var(--ds-base-font-family-primary);font-size:var(--ds-base-font-size);color:var(--ds-base-font-size-color);font-weight:var(--ds-base-font-size-weight);line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--link);text-decoration:underline;cursor:pointer;display:inline-block}.gxg-link:hover{color:var(--ds-base-font-color--link-hover)}.gxg-link:active{color:var(--ds-base-font-color--link-active)}.gxg-link-gray{line-height:unset;font-family:var(--ds-base-font-family-primary);font-size:var(--ds-base-font-size);color:var(--ds-base-font-size-color);font-weight:var(--ds-base-font-size-weight);line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--link);text-decoration:underline;cursor:pointer;display:inline-block;color:var(--ds-base-font-color--dimmed)}.gxg-link-gray:hover{line-height:unset;font-family:var(--ds-base-font-family-primary);font-size:var(--ds-base-font-size);color:var(--ds-base-font-size-color);font-weight:var(--ds-base-font-size-weight);line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--link);text-decoration:underline;cursor:pointer;display:inline-block;color:var(--ds-base-font-color--dimmed);filter:brightness(1.4)}.gxg-alert-error{font-family:var(--ds-base-font-family-primary);font-size:var(--ds-base-font-size);color:var(--ds-base-font-size-color);font-weight:var(--ds-base-font-size-weight);line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--error);display:inline-block}.gxg-alert-warning{font-family:var(--ds-base-font-family-primary);font-size:var(--ds-base-font-size);color:var(--ds-base-font-size-color);font-weight:var(--ds-base-font-size-weight);line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--warning);display:inline-block}.gxg-alert-success{font-family:var(--ds-base-font-family-primary);font-size:var(--ds-base-font-size);color:var(--ds-base-font-size-color);font-weight:var(--ds-base-font-size-weight);line-height:var(--ds-base-font-line-height--comfortable);color:var(--ds-base-font-color--success);display:inline-block}.gxg-tab--disabled{color:var(--color-primary-disabled);pointer-events:none}.gxg-tab--disabled[disabled]{color:var(--color-primary-disabled);pointer-events:none}.gxg-label{font-family:var(--ds-base-font-family-primary);font-weight:var(--gxg-label-font-weight);font-size:var(--gxg-label-font-size);color:var(--gxg-label-color);text-align:center;line-height:1.455em;display:flex;align-items:center}.gxg-label:hover{color:var(--color-primary-hover)}.gxg-label:focus{color:var(--color-primary-active)}.gxg-label:active{color:var(--color-primary-active)}.gxg-label[disabled]{color:var(--color-primary-disabled)}.gxg-label--negative{color:var(--color-on-primary)}.gxg-label--negative[disabled]{color:var(--color-on-disabled)}.gxg-scrollbar{}.gxg-scrollbar::-webkit-scrollbar{width:var(--gxg-scrollbar-width);height:var(--gxg-scrollbar-width)}.gxg-scrollbar::-webkit-scrollbar-track{background-color:var(--gxg-scrollbar-track-background);border-radius:var(--gxg-scrollbar-track-border-radius)}.gxg-scrollbar::-webkit-scrollbar-thumb{background-color:var(--gxg-scrollbar-track-thumb-background);border-radius:var(--gxg-scrollbar-track-thumb-radius)}.gxg-scrollbar::-webkit-scrollbar-thumb:hover{background-color:var(--gxg-scrollbar-track-thumb-hover-background)}.gxg-scrollbar::-webkit-scrollbar-corner{background:rgba(0, 0, 0, 0)}:host{font-family:var(--mer-font-family--primary);display:block;height:100%;flex-basis:286px;flex-shrink:0;height:100%;overflow-y:auto}.gx-ide-main-wrapper{padding:0 10px 52px 10px;background-color:var(--mer-surface);height:100%;display:grid;grid-template-rows:auto 1fr auto;gap:var(--mer-spacing--sm)}.header{padding-block-start:var(--mer-spacing--sm);display:flex;flex-direction:column}.header__actions-wrapper{display:flex;gap:var(--ai-assistant-header-actions-gap);margin-inline-start:auto}.header__first-row{display:flex;gap:var(--mer-spacing--xs);align-items:center;justify-content:space-between}.header__filter{margin-block-start:var(--mer-spacing--xs)}.header__second-row{transition:100ms grid-template-rows;display:grid;grid-template-rows:0fr}.header__second-row--visible{grid-template-rows:1fr}.header .filter-inner-wrapper{overflow:hidden}.messages-wrapper{position:relative;overflow:auto;display:flex;flex-direction:column;scroll-behavior:smooth;}.messages-wrapper::-webkit-scrollbar{width:var(--gxg-scrollbar-width);height:var(--gxg-scrollbar-width)}.messages-wrapper::-webkit-scrollbar-track{background-color:var(--gxg-scrollbar-track-background);border-radius:var(--gxg-scrollbar-track-border-radius)}.messages-wrapper::-webkit-scrollbar-thumb{background-color:var(--gxg-scrollbar-track-thumb-background);border-radius:var(--gxg-scrollbar-track-thumb-radius)}.messages-wrapper::-webkit-scrollbar-thumb:hover{background-color:var(--gxg-scrollbar-track-thumb-hover-background)}.messages-wrapper::-webkit-scrollbar-corner{background:rgba(0, 0, 0, 0)}.messages{display:flex;flex-direction:column;list-style-type:none;padding:0;margin:0}.prompt{position:relative;margin-top:auto}.prompt__textarea::part(textarea-wrapper){border:none}.prompt__textarea::part(textarea){border:none;background-color:var(--mer-color__neutral-gray--800)}.prompt__shortcuts{position:absolute;display:flex;align-items:center;gap:var(--mer-spacing--2xs);padding-inline-end:var(--mer-spacing--xs);right:0;top:0;height:100%}.prompt__shortcut{color:var(--mer-color__neutral-gray--400);font-size:var(--mer-font__size--2xs);padding:var(--mer-spacing--3xs) var(--mer-spacing--xs);background-color:var(--mer-color__neutral-gray--700);border-radius:var(--mer-border__radius--xs)}";
6
6
 
7
- const l = class {
7
+ /* OTHER LIBRARIES IMPORTS */ const l = [ "resets/box-sizing", "components/icon" ];
8
+
9
+ const n = class {
8
10
  constructor(a) {
9
11
  e(this, a);
10
12
  this.componentDidRenderFirstTime = t(this, "componentDidRenderFirstTime", 7);
@@ -228,7 +230,9 @@ const l = class {
228
230
  [`assistant--${this.assistantStatus}`]: true,
229
231
  "assistant--in-progress": this.aIInProgress
230
232
  }
231
- }, r("div", {
233
+ }, r("ch-theme", {
234
+ model: l
235
+ }), r("div", {
232
236
  class: "gx-ide-main-wrapper"
233
237
  }, r("header", {
234
238
  class: "header"
@@ -313,7 +317,7 @@ const l = class {
313
317
  }
314
318
  };
315
319
 
316
- l.style = s;
320
+ n.style = s;
317
321
 
318
- export { l as gx_ide_ai_assistant };
319
- //# sourceMappingURL=p-040bd0c5.entry.js.map
322
+ export { n as gx_ide_ai_assistant };
323
+ //# sourceMappingURL=p-a7dcfedd.entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["aiAssistantCss","CSS_BUNDLES","GxIdeTemplate","this","renderedFirstTime","setFocus","scrollToBottomFlag","evaluateAiInProgress","_a","messages","length","type","aIInProgress","evaluateAiStatus","assistantStatus","renderMessage","message","i","text","h","messageType","hidden","filterValue","key","toString","translations","_componentLocale","aiMessage","textAreaInputHandler","userHasTyped","showFilter","filterEl","value","promptEnterHandler","async","prompt","promptTrimmed","detail","replace","textAreaEl","setTimeout","lastUserMessageHeight","offsetHeight","addMessage","userMessageCallback","then","filterMessagesHandler","e","toLowerCase","filteredMessages","forEach","includes","clearMessages","focus","clearCallback","attachShortcuts","focusShortcuts","ctrlFocusIndex","findIndex","toLocaleLowerCase","shiftFocusIndex","cmdKeyIndex","keyFocus","find","document","addEventListener","ctrlKey","shiftKey","metaKey","promptArrowUpHandler","lastUserMessage","textareaShadowPart","style","height","toggleFilterHandler","promptFocusHandler","promptHasFocus","promptBlurHandler","scrollToBottom","messagesWrapperEl","scrollTo","scrollHeight","scrollTop","clientHeight","watchAIInProgressHandler","aiInProgress","watchMessagesHandler","componentWillLoad","Locale","getComponentStrings","el","componentDidLoad","shadowRoot","querySelector","componentDidRender","componentDidRenderFirstTime","emit","componentName","handleFocus","event","preventDefault","clear","updateInProgressMessage","pop","push","render","Host","class","model","filter","icon","onClick","disabled","onInput","ref","scrollable","map","ai","promptValue","maxHeight","promptMaxHeight","placeholder","processingQueryPlaceholder","promptPlaceholder","onEnter","onArrowUpPressed","onBlur","onFocus","_b","prompt__shortcuts","shortcut"],"sources":["src/components/ai-assistant/ai-assistant.scss?tag=gx-ide-ai-assistant&encapsulation=shadow","src/components/ai-assistant/ai-assistant.tsx"],"sourcesContent":["@import \"../../global/gx-ide-common.scss\";\n@import \"../../global/gx-ide-mixins.scss\";\n@import \"../../../node_modules/@genexus/gemini/dist/gemini/globals/mixins.scss\";\n\n:host {\n font-family: var(--mer-font-family--primary);\n display: block;\n height: 100%;\n flex-basis: 286px;\n flex-shrink: 0;\n height: 100%;\n overflow-y: auto;\n}\n.gx-ide-main-wrapper {\n padding: 0 10px 52px 10px;\n background-color: var(--mer-surface);\n height: 100%;\n display: grid;\n grid-template-rows: auto 1fr auto;\n gap: var(--mer-spacing--sm);\n}\n\n/*--- Header ---*/\n.header {\n padding-block-start: var(--mer-spacing--sm);\n display: flex;\n flex-direction: column;\n\n &__actions-wrapper {\n display: flex;\n gap: var(--ai-assistant-header-actions-gap);\n margin-inline-start: auto;\n }\n &__first-row {\n display: flex;\n gap: var(--mer-spacing--xs);\n align-items: center;\n justify-content: space-between;\n }\n &__filter {\n margin-block-start: var(--mer-spacing--xs);\n }\n &__second-row {\n transition: 100ms grid-template-rows;\n display: grid;\n grid-template-rows: 0fr;\n\n &--visible {\n grid-template-rows: 1fr;\n }\n }\n .filter-inner-wrapper {\n overflow: hidden;\n }\n}\n\n/*--- Messages ---*/\n.messages-wrapper {\n position: relative;\n overflow: auto;\n display: flex;\n flex-direction: column;\n scroll-behavior: smooth;\n @include gxg-scrollbar();\n}\n.messages {\n display: flex;\n flex-direction: column;\n list-style-type: none;\n padding: 0;\n margin: 0;\n}\n\n/*--- Prompt ---*/\n.prompt {\n position: relative;\n margin-top: auto;\n\n &__textarea {\n &::part(textarea-wrapper) {\n border: none;\n }\n &::part(textarea) {\n border: none;\n background-color: var(--mer-color__neutral-gray--800);\n }\n }\n &__shortcuts {\n position: absolute;\n display: flex;\n align-items: center;\n gap: var(--mer-spacing--2xs);\n padding-inline-end: var(--mer-spacing--xs);\n right: 0;\n top: 0;\n height: 100%;\n }\n &__shortcut {\n color: var(--mer-color__neutral-gray--400);\n font-size: var(--mer-font__size--2xs);\n padding: var(--mer-spacing--3xs) var(--mer-spacing--xs);\n background-color: var(--mer-color__neutral-gray--700);\n border-radius: var(--mer-border__radius--xs);\n }\n}\n","/* STENCIL IMPORTS */\nimport {\n Component,\n Host,\n h,\n Prop,\n Event,\n EventEmitter,\n Element,\n Method,\n State,\n Watch,\n Listen\n} from \"@stencil/core\";\n/* OTHER LIBRARIES IMPORTS */\nconst CSS_BUNDLES: MercuryBundles = [\"resets/box-sizing\", \"components/icon\"];\n/* CUSTOM IMPORTS */\nimport { Locale } from \"../../common/locale\";\n\nimport { MercuryBundles } from \"@genexus/mercury\";\n\n@Component({\n tag: \"gx-ide-ai-assistant\",\n styleUrl: \"ai-assistant.scss\",\n shadow: { delegatesFocus: true },\n assetsDirs: [\"gx-ide-assets/ai-assistant\"]\n})\nexport class GxIdeTemplate {\n // 1.OWN PROPERTIES //\n\n /**\n * The component hard-coded strings translations.\n */\n private _componentLocale: any;\n private renderedFirstTime = false;\n /* lastUserMessageHeight is used to set the appropriate height on the textarea, if user presses arrowUp (recover last message)*/\n private lastUserMessageHeight: number;\n private setFocus = true;\n private scrollToBottomFlag = true;\n\n // 2. REFERENCE TO ELEMENTS //\n\n @Element() el: HTMLGxIdeAiAssistantElement;\n private textAreaEl!: HTMLGxgFormTextareaElement;\n private textareaShadowPart: HTMLTextAreaElement;\n private filterEl: HTMLGxgFormTextElement;\n private messagesWrapperEl!: HTMLDivElement;\n\n // 3.STATE() VARIABLES //\n\n /**\n * Flag used to hide the shortcuts\n */\n @State() userHasTyped = false;\n\n /**\n * This is true if the last message is of type 'assistant-in-progress'\n */\n @State() aIInProgress = false;\n @Watch(\"aIInProgress\")\n watchAIInProgressHandler(aiInProgress: boolean) {\n if (!aiInProgress) {\n this.setFocus = true;\n }\n }\n\n /**\n * This displays or hides the messages filter\n */\n @State() showFilter = false;\n\n /**\n * True if the prompt textbox has focus\n */\n @State() promptHasFocus = false;\n\n /**\n * The filter value\n */\n @State() filterValue: string;\n\n // 4.PUBLIC PROPERTY API | WATCH'S //\n\n /**\n * List of messages displayed by the component\n */\n @Prop({ mutable: true }) messages: Message[] = [];\n @Watch(\"messages\")\n watchMessagesHandler() {\n this.evaluateAiInProgress();\n this.evaluateAiStatus();\n }\n\n /**\n * The prompt textarea max-height\n */\n @Prop() readonly promptMaxHeight = \"128px\";\n\n /**\n * A temporary property to illustrate the assistant status\n */\n @Prop({ mutable: true }) assistantStatus: AiStatus = \"indeterminate\";\n\n /**\n * List of keys that make up the shortcut to focus on the component's text input\n */\n @Prop() readonly focusShortcuts: string[];\n\n /**\n * List of keys that make up the shortcut to focus on the component's text input\n */\n @Prop() readonly userMessageCallback: UserMessageCallback;\n\n /**\n * Callback that must be invoked when the conversation is cleared, using the header button.\n */\n @Prop() readonly clearCallback: () => Promise<void>;\n\n /**\n * the prompt value\n */\n @Prop() readonly promptValue: string;\n\n /**\n * If tue, it will display a filter.\n */\n @Prop() readonly filter = true;\n\n // 5.EVENTS (EMIT) //\n\n /**\n * This event is emitted once just after the component is fully loaded and the first render() occurs\n */\n @Event() componentDidRenderFirstTime: EventEmitter<boolean>;\n\n // 6.COMPONENT LIFECYCLE METHODS //\n\n async componentWillLoad() {\n this._componentLocale = await Locale.getComponentStrings(this.el);\n this.evaluateAiInProgress();\n this.evaluateAiStatus();\n this.attachShortcuts();\n }\n\n componentDidLoad() {\n this.textareaShadowPart =\n this.textAreaEl.shadowRoot.querySelector(\"textarea\");\n }\n\n componentDidRender() {\n if (!this.renderedFirstTime) {\n this.componentDidRenderFirstTime.emit(\n this._componentLocale.componentName\n );\n this.renderedFirstTime = true;\n }\n if (this.setFocus) {\n setTimeout(() => {\n /* Doesn't seems to work without the setTimeout */\n this.textAreaEl.focus();\n this.setFocus = false;\n }, 50);\n }\n setTimeout(() => {\n this.scrollToBottom();\n }, 200);\n }\n\n // 7.LISTENERS //\n\n @Listen(\"focus\", { capture: true })\n handleFocus(event: FocusEvent) {\n if (this.textAreaEl) {\n event.preventDefault();\n this.textAreaEl.focus();\n }\n }\n\n // 8.PUBLIC METHODS API //\n\n /**\n * Clear the list of messages\n */\n @Method()\n async clear() {\n this.messages = [];\n }\n\n /**\n * Add a message. This method will be used by the host to add messages from the assistant\n */\n @Method()\n async addMessage(message: Message) {\n if (message.text?.length > 0) {\n const messages = [...this.messages];\n const updateInProgressMessage =\n messages?.length > 0 &&\n messages[messages.length - 1].type === \"assistant-in-progress\";\n if (updateInProgressMessage) {\n messages.pop();\n }\n messages.push(message);\n this.messages = messages;\n }\n }\n\n // 9.LOCAL METHODS //\n\n private evaluateAiInProgress = () => {\n if (\n this.messages?.length > 0 &&\n this.messages[this.messages.length - 1].type === \"assistant-in-progress\"\n ) {\n this.aIInProgress = true;\n } else {\n this.aIInProgress = false;\n }\n };\n\n private evaluateAiStatus = () => {\n if (this.messages?.length === 0) {\n this.assistantStatus = \"indeterminate\";\n return;\n }\n if (\n this.messages[this.messages.length - 1].type ===\n \"assistant-in-progress\" ||\n this.messages[this.messages.length - 1].type === \"user\"\n ) {\n this.assistantStatus = \"indeterminate\";\n } else if (\n this.messages[this.messages.length - 1].type === \"assistant-error\"\n ) {\n this.assistantStatus = \"error\";\n } else {\n this.assistantStatus = \"success\";\n }\n };\n\n private renderMessage = (\n message: Message,\n i: number\n ): HTMLLIElement | void => {\n if (message.text.length > 0) {\n return (\n <gx-ide-ai-message\n message={message.text}\n messageType={message.type}\n hidden={message.hidden}\n filterValue={this.filterValue}\n key={`${i.toString()}-${message.type}`}\n translations={this._componentLocale.aiMessage}\n ></gx-ide-ai-message>\n );\n }\n };\n\n private textAreaInputHandler = () => {\n this.userHasTyped = true;\n this.showFilter = false;\n this.filterEl.value = \"\";\n this.filterValue = \"\";\n this.scrollToBottomFlag = true;\n };\n\n private promptEnterHandler = async (prompt: CustomEvent<string>) => {\n /* First remove double spaces */\n const promptTrimmed = prompt.detail.replace(/\\s+/g, \" \");\n /* Update textarea value to get the proper height */\n this.textAreaEl.value = promptTrimmed;\n setTimeout(() => {\n /* Then save the actual height (setTimeOut required) */\n this.lastUserMessageHeight = this.textAreaEl.offsetHeight;\n }, 0);\n /* The clear the textarea */\n this.textAreaEl.value = \"\";\n /* Insert the user message */\n this.addMessage({\n type: \"user\",\n text: promptTrimmed\n });\n /* Call the callback */\n if (this.userMessageCallback && !this.aIInProgress) {\n this.aIInProgress = true;\n this.userMessageCallback(promptTrimmed).then(() => {\n this.aIInProgress = false;\n });\n }\n };\n\n private filterMessagesHandler = (e: CustomEvent<string>) => {\n this.scrollToBottomFlag = false;\n this.filterValue = e.detail.toLowerCase();\n const filteredMessages = [...this.messages];\n filteredMessages.forEach(message => {\n if (message.text.toLowerCase().includes(this.filterValue)) {\n message.hidden = false;\n } else {\n message.hidden = true;\n }\n });\n this.messages = filteredMessages;\n };\n\n private clearMessages = () => {\n this.messages = [];\n this.textAreaEl.focus();\n if (this.clearCallback) {\n this.clearCallback();\n }\n };\n\n private attachShortcuts = () => {\n if (this.focusShortcuts?.length > 0) {\n const ctrlFocusIndex = this.focusShortcuts.findIndex(\n key => key.toLocaleLowerCase() === \"ctrl\"\n );\n const shiftFocusIndex = this.focusShortcuts.findIndex(\n key => key.toLocaleLowerCase() === \"shift\"\n );\n const cmdKeyIndex = this.focusShortcuts.findIndex(\n key => key.toLocaleLowerCase() === \"cmd\"\n );\n const keyFocus = this.focusShortcuts\n .find(key => {\n return (\n key.toLocaleLowerCase() !== \"ctrl\" &&\n key.toLocaleLowerCase() !== \"shift\" &&\n key.toLocaleLowerCase() !== \"cmd\"\n );\n })\n .toLowerCase();\n document.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n if (e.key === keyFocus && ctrlFocusIndex !== -1 && e.ctrlKey) {\n this.textAreaEl.focus();\n this.userHasTyped = true;\n } else if (e.key === keyFocus && shiftFocusIndex !== -1 && e.shiftKey) {\n this.textAreaEl.focus();\n this.userHasTyped = true;\n } else if (e.key === keyFocus && cmdKeyIndex !== -1 && e.metaKey) {\n this.textAreaEl.focus();\n this.userHasTyped = true;\n }\n });\n }\n };\n\n private promptArrowUpHandler = () => {\n this.userHasTyped = true;\n const lastUserMessage = this.messages?.find(message => {\n return message.type === \"user\";\n });\n if (lastUserMessage) {\n if (this.lastUserMessageHeight) {\n this.textareaShadowPart.style.height = `${this.lastUserMessageHeight}px`;\n }\n this.textAreaEl.value = lastUserMessage.text;\n }\n };\n\n private toggleFilterHandler = () => {\n this.showFilter = !this.showFilter;\n if (this.showFilter) {\n this.filterEl.focus();\n }\n };\n\n private promptFocusHandler = () => {\n this.promptHasFocus = true;\n };\n\n private promptBlurHandler = () => {\n this.promptHasFocus = false;\n };\n\n private scrollToBottom = () => {\n if (this.scrollToBottomFlag) {\n this.messagesWrapperEl.scrollTo(0, this.messagesWrapperEl.scrollHeight);\n this.messagesWrapperEl.scrollTop =\n this.messagesWrapperEl.scrollHeight -\n this.messagesWrapperEl.clientHeight;\n }\n };\n\n // 10.RENDER() FUNCTION //\n\n render() {\n return (\n <Host\n class={{\n [`assistant--${this.assistantStatus}`]: true,\n \"assistant--in-progress\": this.aIInProgress\n }}\n >\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <div class=\"gx-ide-main-wrapper\">\n <header class=\"header\">\n <div class=\"header__first-row\">\n <gxg-title type=\"title-02\">\n {this._componentLocale.componentName}\n </gxg-title>\n <div class=\"header__actions-wrapper\">\n {this.filter ? (\n <gxg-button\n class=\"header__filter-button\"\n type=\"tertiary\"\n icon=\"menus/find\"\n onClick={this.toggleFilterHandler}\n disabled={this.messages.length === 0}\n ></gxg-button>\n ) : null}\n\n <gxg-button\n class=\"header__clear-button\"\n type=\"tertiary\"\n icon=\"bpm/delete\"\n onClick={this.clearMessages}\n disabled={this.messages.length === 0}\n ></gxg-button>\n </div>\n </div>\n {this.filter ? (\n <div\n class={{\n \"header__second-row\": true,\n \"header__second-row--visible\": this.showFilter\n }}\n >\n <div class=\"filter-inner-wrapper\">\n <gxg-form-text\n class=\"header__filter\"\n onInput={this.filterMessagesHandler as any}\n ref={el => (this.filterEl = el as HTMLGxgFormTextElement)}\n ></gxg-form-text>\n </div>\n </div>\n ) : null}\n </header>\n\n <div\n class={{\n \"messages-wrapper\": true,\n \"scrollable\": true\n }}\n ref={el => (this.messagesWrapperEl = el as HTMLDivElement)}\n >\n {this.messages?.length ? (\n <ol class={{ messages: true }}>\n {this.messages.map((message, i) => {\n return this.renderMessage(message, i);\n })}\n </ol>\n ) : null}\n </div>\n\n <div\n class={{\n prompt: true\n }}\n >\n <gxg-form-textarea\n ai\n class=\"prompt__textarea\"\n value={this.promptValue}\n maxHeight={this.promptMaxHeight}\n placeholder={\n this.aIInProgress\n ? this._componentLocale.processingQueryPlaceholder\n : this._componentLocale.promptPlaceholder\n }\n onInput={this.textAreaInputHandler}\n onEnter={this.promptEnterHandler}\n onArrowUpPressed={this.promptArrowUpHandler}\n onBlur={this.promptBlurHandler}\n onFocus={this.promptFocusHandler}\n disabled={this.aIInProgress}\n ref={el => (this.textAreaEl = el as HTMLGxgFormTextareaElement)}\n ></gxg-form-textarea>\n {!this.userHasTyped &&\n !this.aIInProgress &&\n !this.promptHasFocus &&\n this.focusShortcuts?.length > 0 ? (\n <div\n class={{\n prompt__shortcuts: true\n }}\n >\n {this.focusShortcuts.map((shortcut, i) => {\n /* Up to three keys allowed*/\n return i <= 2 ? (\n <span class=\"prompt__shortcut\">{shortcut}</span>\n ) : null;\n })}\n </div>\n ) : null}\n </div>\n </div>\n </Host>\n );\n }\n}\n\nexport type AiStatus = \"indeterminate\" | \"success\" | \"error\";\n\nexport type Message = {\n type: MessageType;\n text: string;\n hidden?: boolean;\n filterValue?: string;\n};\n\nexport type MessageType =\n | \"user\"\n | \"assistant-chat\"\n | \"assistant-action\"\n | \"assistant-in-progress\"\n | \"assistant-error\";\n\nexport type UserMessageCallback = (text: string) => Promise<void>;\n"],"mappings":"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"}