@genexus/genexus-ide-ui 1.1.9 → 1.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/{code-render-55d37767.js → code-render-2af31443.js} +2 -2
- package/dist/cjs/{code-render-55d37767.js.map → code-render-2af31443.js.map} +1 -1
- package/dist/cjs/{common-090e6d3a.js → common-8c725d8c.js} +4 -8
- package/dist/cjs/common-8c725d8c.js.map +1 -0
- package/dist/cjs/gx-ide-chat-container_2.cjs.entry.js +2 -2
- package/dist/cjs/gx-ide-chat-container_2.cjs.entry.js.map +1 -1
- package/dist/cjs/gx-ide-manage-module-references-v2.cjs.entry.js +1 -1
- package/dist/cjs/gx-ide-manage-module-references.cjs.entry.js +1 -1
- package/dist/cjs/gx-ide-new-environment.cjs.entry.js +3 -2
- package/dist/cjs/gx-ide-new-environment.cjs.entry.js.map +1 -1
- package/dist/cjs/gx-ide-new-kb.cjs.entry.js +1 -1
- package/dist/cjs/gx-ide-sc-chat-container.cjs.entry.js +7 -3
- package/dist/cjs/gx-ide-sc-chat-container.cjs.entry.js.map +1 -1
- package/dist/cjs/gx-ide-splash.cjs.entry.js +1 -1
- package/dist/cjs/gx-ide-ww-images.cjs.entry.js +1 -1
- package/dist/cjs/index.cjs.js +2 -2
- package/dist/collection/common/common.js +2 -7
- package/dist/collection/common/common.js.map +1 -1
- package/dist/collection/components/chat/chat-welcome/chat-welcome.css +5 -1
- package/dist/collection/components/chat/chat-welcome/chat-welcome.js +1 -1
- package/dist/collection/components/chat/chat-welcome/chat-welcome.js.map +1 -1
- package/dist/collection/components/new-environment/new-environment.js +3 -2
- package/dist/collection/components/new-environment/new-environment.js.map +1 -1
- package/dist/collection/showcase/chat-container/chat.showcase.js +5 -1
- package/dist/collection/showcase/chat-container/chat.showcase.js.map +1 -1
- package/dist/components/chat-welcome.js +2 -2
- package/dist/components/chat-welcome.js.map +1 -1
- package/dist/components/common.js +3 -8
- package/dist/components/common.js.map +1 -1
- package/dist/components/gx-ide-new-environment.js +3 -2
- package/dist/components/gx-ide-new-environment.js.map +1 -1
- package/dist/components/gx-ide-sc-chat-container.js +5 -1
- package/dist/components/gx-ide-sc-chat-container.js.map +1 -1
- package/dist/esm/{code-render-53b3b0bd.js → code-render-e6bf0562.js} +2 -2
- package/dist/esm/{code-render-53b3b0bd.js.map → code-render-e6bf0562.js.map} +1 -1
- package/dist/esm/{common-719c4daf.js → common-c25d8c2f.js} +4 -9
- package/dist/esm/common-c25d8c2f.js.map +1 -0
- package/dist/esm/gx-ide-chat-container_2.entry.js +2 -2
- package/dist/esm/gx-ide-chat-container_2.entry.js.map +1 -1
- package/dist/esm/gx-ide-manage-module-references-v2.entry.js +1 -1
- package/dist/esm/gx-ide-manage-module-references.entry.js +1 -1
- package/dist/esm/gx-ide-new-environment.entry.js +3 -2
- package/dist/esm/gx-ide-new-environment.entry.js.map +1 -1
- package/dist/esm/gx-ide-new-kb.entry.js +1 -1
- package/dist/esm/gx-ide-sc-chat-container.entry.js +7 -3
- package/dist/esm/gx-ide-sc-chat-container.entry.js.map +1 -1
- package/dist/esm/gx-ide-splash.entry.js +1 -1
- package/dist/esm/gx-ide-ww-images.entry.js +1 -1
- package/dist/esm/index.js +2 -2
- package/dist/genexus-ide-ui/genexus-ide-ui.esm.js +1 -1
- package/dist/genexus-ide-ui/index.esm.js +2 -2
- package/dist/genexus-ide-ui/{p-48f5911b.js → p-0c0eb8ae.js} +37 -38
- package/dist/genexus-ide-ui/p-0c0eb8ae.js.map +1 -0
- package/dist/genexus-ide-ui/{p-da473001.entry.js → p-14fc5c24.entry.js} +21 -21
- package/dist/genexus-ide-ui/{p-da473001.entry.js.map → p-14fc5c24.entry.js.map} +1 -1
- package/dist/genexus-ide-ui/{p-a1415a9c.entry.js → p-3b5a4e2e.entry.js} +2 -2
- package/dist/genexus-ide-ui/{p-0bdf34f2.entry.js → p-3b983843.entry.js} +2 -2
- package/dist/genexus-ide-ui/{p-c5178973.js → p-60221a44.js} +29 -29
- package/dist/genexus-ide-ui/{p-ec0809a7.entry.js → p-6d996621.entry.js} +5 -4
- package/dist/genexus-ide-ui/p-6d996621.entry.js.map +1 -0
- package/dist/genexus-ide-ui/{p-d3767a7d.entry.js → p-82878950.entry.js} +134 -133
- package/dist/genexus-ide-ui/p-82878950.entry.js.map +1 -0
- package/dist/genexus-ide-ui/{p-4d0ba4f6.entry.js → p-9dcb8fb7.entry.js} +2 -2
- package/dist/genexus-ide-ui/{p-6f898249.entry.js → p-bc760bb3.entry.js} +2 -2
- package/dist/genexus-ide-ui/{p-e28e6bc4.entry.js → p-ff28c49d.entry.js} +2 -2
- package/dist/types/common/common.d.ts +1 -0
- package/package.json +1 -1
- package/dist/cjs/common-090e6d3a.js.map +0 -1
- package/dist/esm/common-719c4daf.js.map +0 -1
- package/dist/genexus-ide-ui/p-48f5911b.js.map +0 -1
- package/dist/genexus-ide-ui/p-d3767a7d.entry.js.map +0 -1
- package/dist/genexus-ide-ui/p-ec0809a7.entry.js.map +0 -1
- /package/dist/genexus-ide-ui/{p-a1415a9c.entry.js.map → p-3b5a4e2e.entry.js.map} +0 -0
- /package/dist/genexus-ide-ui/{p-0bdf34f2.entry.js.map → p-3b983843.entry.js.map} +0 -0
- /package/dist/genexus-ide-ui/{p-c5178973.js.map → p-60221a44.js.map} +0 -0
- /package/dist/genexus-ide-ui/{p-4d0ba4f6.entry.js.map → p-9dcb8fb7.entry.js.map} +0 -0
- /package/dist/genexus-ide-ui/{p-6f898249.entry.js.map → p-bc760bb3.entry.js.map} +0 -0
- /package/dist/genexus-ide-ui/{p-e28e6bc4.entry.js.map → p-ff28c49d.entry.js.map} +0 -0
|
@@ -13,13 +13,13 @@ var c = undefined && undefined.__classPrivateFieldSet || function(t, e, a, i, s)
|
|
|
13
13
|
return i === "a" ? s.call(t, a) : s ? s.value = a : e.set(t, a), a;
|
|
14
14
|
};
|
|
15
15
|
|
|
16
|
-
var
|
|
16
|
+
var d = undefined && undefined.__classPrivateFieldGet || function(t, e, a, i) {
|
|
17
17
|
if (a === "a" && !i) throw new TypeError("Private accessor was defined without a getter");
|
|
18
18
|
if (typeof e === "function" ? t !== e || !i : !e.has(t)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
19
19
|
return a === "m" ? i : a === "a" ? i.call(t) : i ? i.value : e.get(t);
|
|
20
20
|
};
|
|
21
21
|
|
|
22
|
-
var
|
|
22
|
+
var l, p, h, m, u, f;
|
|
23
23
|
|
|
24
24
|
const g = [ "resets/box-sizing", "utils/typography", "chameleon/scrollbar", "components/button", "components/dropdown", "components/icon", "utils/elevation" ];
|
|
25
25
|
|
|
@@ -49,7 +49,7 @@ const v = n({
|
|
|
49
49
|
const x = class {
|
|
50
50
|
constructor(e) {
|
|
51
51
|
t(this, e);
|
|
52
|
-
|
|
52
|
+
l.set(this, [ {
|
|
53
53
|
type: "slot",
|
|
54
54
|
id: "delete-chat-button"
|
|
55
55
|
}, {
|
|
@@ -115,39 +115,39 @@ const x = class {
|
|
|
115
115
|
class: "dropdown",
|
|
116
116
|
blockAlign: "inside-start",
|
|
117
117
|
inlineAlign: "inside-end",
|
|
118
|
-
model:
|
|
118
|
+
model: d(this, l, "f"),
|
|
119
119
|
expanded: this.menuIsExpanded,
|
|
120
|
-
onExpandedChange:
|
|
120
|
+
onExpandedChange: d(this, m, "f")
|
|
121
121
|
}, e("button", {
|
|
122
122
|
class: "button-tertiary button-icon-only",
|
|
123
|
-
onClick:
|
|
123
|
+
onClick: d(this, h, "f"),
|
|
124
124
|
type: "button",
|
|
125
|
-
"aria-label":
|
|
126
|
-
title:
|
|
125
|
+
"aria-label": d(this, p, "f").showMenuAriaLabel,
|
|
126
|
+
title: d(this, p, "f").showMenuAriaLabel
|
|
127
127
|
}, e("ch-image", {
|
|
128
128
|
class: "icon-md",
|
|
129
129
|
src: v
|
|
130
130
|
})), this.copyConversationCallback && e("button", {
|
|
131
131
|
class: "button-tertiary button-icon-and-text button-copy-chat",
|
|
132
132
|
slot: "copy-chat-button",
|
|
133
|
-
onClick:
|
|
133
|
+
onClick: d(this, u, "f"),
|
|
134
134
|
type: "button",
|
|
135
|
-
"aria-label":
|
|
136
|
-
title:
|
|
135
|
+
"aria-label": d(this, p, "f").copyConversationAriaLabel,
|
|
136
|
+
title: d(this, p, "f").copyConversationAriaLabel
|
|
137
137
|
}, e("ch-image", {
|
|
138
138
|
class: "icon-md",
|
|
139
139
|
src: y
|
|
140
|
-
}),
|
|
140
|
+
}), d(this, p, "f").copyConversationLabel), this.deleteConversationCallback && e("button", {
|
|
141
141
|
class: "button-tertiary button-icon-and-text button-delete-chat",
|
|
142
142
|
slot: "delete-chat-button",
|
|
143
|
-
onClick:
|
|
143
|
+
onClick: d(this, f, "f"),
|
|
144
144
|
type: "button",
|
|
145
|
-
"aria-label":
|
|
146
|
-
title:
|
|
145
|
+
"aria-label": d(this, p, "f").deleteConversationAriaLabel,
|
|
146
|
+
title: d(this, p, "f").deleteConversationAriaLabel
|
|
147
147
|
}, e("ch-image", {
|
|
148
148
|
class: "icon-md",
|
|
149
149
|
src: b
|
|
150
|
-
}),
|
|
150
|
+
}), d(this, p, "f").clearConversationLabel))), e("section", {
|
|
151
151
|
class: "ch-chat-container"
|
|
152
152
|
}, e("slot", null), this.displayConversationCopiedMessage && e("div", {
|
|
153
153
|
class: "chat-container__conversation-copied"
|
|
@@ -168,12 +168,12 @@ const x = class {
|
|
|
168
168
|
}
|
|
169
169
|
};
|
|
170
170
|
|
|
171
|
-
|
|
171
|
+
l = new WeakMap, p = new WeakMap, h = new WeakMap, m = new WeakMap, u = new WeakMap,
|
|
172
172
|
f = new WeakMap;
|
|
173
173
|
|
|
174
174
|
x.style = r;
|
|
175
175
|
|
|
176
|
-
const _ = ":host{block-size:100%}.welcome-container{--opacity:1;--translate-y:0;opacity:var(--opacity);transform:translateY(var(--translate-y));transition:all var(--transition-duration);display:flex;block-size:100%;grid-template-rows:max-content max-content;flex-direction:column;justify-content:space-between;background-repeat:no-repeat;background-size:cover;background-size:contain}.welcome-container.hidden{--opacity:0;--translate-y:4px}.header{--opacity:0;--translate-y:3px;transition:all var(--transition-duration) var(--transition-delay) cubic-bezier(0.4, 0, 0.2, 1);transform:translateY(var(--translate-y));opacity:var(--opacity);display:flex;flex-direction:column;gap:var(--mer-spacing--md);align-items:center;padding:var(--mer-spacing--md)}.header--visible{--opacity:1;--translate-y:0}.header__circle{inline-size:55px;block-size:55px;background-size:contain;background-repeat:no-repeat;background-position:center center;margin-block-end:-6px}.header__title{display:grid;text-align:center;margin:0;text-align:center;white-space:pre-line;line-height:1.3;font-weight:600;font-size:var(--font-size-header-h3)}.header__greeting{line-height:1.4;text-align:center;font-weight:300}.suggested-prompts{--opacity:1;opacity:var(--opacity);transition:opacity var(--transition-duration);display:flex;flex-direction:column;gap:var(--mer-spacing--md);list-style:none;margin:0;padding:var(--mer-spacing--md)}.suggested-prompts.hidden{--opacity:0}.suggested-prompts__button{opacity:0;transform:translateX(-3px);animation:fadeInSuggestedPromptButton var(--mer-timing--regular) ease forwards;animation-delay:var(--delay, 0s);border:0;padding:var(--mer-spacing--sm);border-radius:
|
|
176
|
+
const _ = ":host{block-size:100%}.welcome-container{--opacity:1;--translate-y:0;opacity:var(--opacity);transform:translateY(var(--translate-y));transition:all var(--transition-duration);display:flex;block-size:100%;grid-template-rows:max-content max-content;flex-direction:column;justify-content:space-between;background-repeat:no-repeat;background-size:cover;background-size:contain}.welcome-container.hidden{--opacity:0;--translate-y:4px}.header{--opacity:0;--translate-y:3px;transition:all var(--transition-duration) var(--transition-delay) cubic-bezier(0.4, 0, 0.2, 1);transform:translateY(var(--translate-y));opacity:var(--opacity);display:flex;flex-direction:column;gap:var(--mer-spacing--md);align-items:center;padding:var(--mer-spacing--md)}.header--visible{--opacity:1;--translate-y:0}.header__circle{inline-size:55px;block-size:55px;background-size:contain;background-repeat:no-repeat;background-position:center center;margin-block-end:-6px}.header__title{display:grid;text-align:center;margin:0;text-align:center;white-space:pre-line;line-height:1.3;font-weight:600;font-size:var(--font-size-header-h3)}.header__greeting{line-height:1.4;text-align:center;font-weight:300}.suggested-prompts{--opacity:1;opacity:var(--opacity);transition:opacity var(--transition-duration);display:flex;flex-direction:column;gap:var(--mer-spacing--md);list-style:none;margin:0;padding:var(--mer-spacing--md)}.suggested-prompts.hidden{--opacity:0}.suggested-prompts__button{opacity:0;transform:translateX(-3px);animation:fadeInSuggestedPromptButton var(--mer-timing--regular) ease forwards;animation-delay:var(--delay, 0s);border:0;padding:var(--mer-spacing--sm);border-radius:44px;font-size:14px;font-style:oblique;cursor:pointer;display:flex;align-items:center;gap:var(--mer-spacing--xs);background-color:#22334a;font-weight:100;max-inline-size:300px}.suggested-prompts__button:hover{background-color:#1a2b42}.suggested-prompts__icon{flex-shrink:0}@keyframes fadeInSuggestedPromptButton{from{opacity:0;transform:translateX(-3px)}to{opacity:1;transform:translateX(0)}}";
|
|
177
177
|
|
|
178
178
|
var k = undefined && undefined.__classPrivateFieldGet || function(t, e, a, i) {
|
|
179
179
|
if (a === "a" && !i) throw new TypeError("Private accessor was defined without a getter");
|
|
@@ -316,10 +316,10 @@ const S = class {
|
|
|
316
316
|
"data-prommpt": t
|
|
317
317
|
}, e("ch-image", {
|
|
318
318
|
src: L,
|
|
319
|
-
class: "icon-md"
|
|
319
|
+
class: "icon-md suggested-prompts__icon"
|
|
320
320
|
}), t, e("ch-image", {
|
|
321
321
|
src: A,
|
|
322
|
-
class: "icon-md"
|
|
322
|
+
class: "icon-md suggested-prompts__icon"
|
|
323
323
|
}))))))));
|
|
324
324
|
}
|
|
325
325
|
static get assetsDirs() {
|
|
@@ -335,4 +335,4 @@ T = new WeakMap, W = new WeakMap, j = new WeakMap, C = new WeakMap;
|
|
|
335
335
|
S.style = _;
|
|
336
336
|
|
|
337
337
|
export { x as gx_ide_chat_container, S as gx_ide_chat_welcome };
|
|
338
|
-
//# sourceMappingURL=p-
|
|
338
|
+
//# sourceMappingURL=p-14fc5c24.entry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["chatContainerCss","CSS_BUNDLES","COPY_ICON","getIconPath","category","name","colorType","DELETE_ICON","CONVERSATION_ICON","MORE_HORIZONTAL_ICON","GxIdeChatContainer","_GxIdeChatContainer_menuItems","set","this","type","id","_GxIdeChatContainer_componentLocale","_GxIdeChatContainer_showMenuHandler","menuIsExpanded","_GxIdeChatContainer_menuExpandedChangeHandler","event","detail","_GxIdeChatContainer_copyConversationHandler","copyConversationCallback","_GxIdeChatContainer_deleteConversationHandler","deleteConversationCallback","componentWillLoad","__classPrivateFieldSet","Locale","getComponentStrings","el","showCopyConversationMessage","displayConversationCopiedMessage","setTimeout","render","renderHeader","chatTitle","renderButtonsGroup","h","Host","class","model","blockAlign","inlineAlign","__classPrivateFieldGet","expanded","onExpandedChange","onClick","showMenuAriaLabel","title","src","slot","copyConversationAriaLabel","copyConversationLabel","deleteConversationAriaLabel","clearConversationLabel","chatWelcomeCss","HEADER_ILLUSTRATION","getAssetPath","AI_AVATAR","HEADER_TRANSITION_DELAY","HEADER_TRANSITION_DURATION","SUGGESTED_PROMPT_BUTTON_INTERVAL","SUGGESTED_PROMPT_BUTTONS_DELAY","WELCOME_EXIT_DURATION","AI_ICON","ARROW_RIGHT_ICON","GxIdeChatWelcome","_GxIdeChatWelcome_componentLocale","_GxIdeChatWelcome_animationEntrance","showHeader","showSuggestedPrompts","_GxIdeChatWelcome_sendPromptToChat","async","e","prompt","currentTarget","dataset","_GxIdeChatWelcome_animationExit","call","suggestedPrompRequestedCallback","hideWelcome","Promise","resolve","welcomeTitle","welcomeGreeting","suggestedPrompts","componentDidRender","exitWelcome","hidden","style","backgroundImage","header","map","i"],"sources":["src/components/chat/chat-container/chat-container.scss?tag=gx-ide-chat-container","src/components/chat/chat-container/chat-container.tsx","src/components/chat/chat-welcome/chat-welcome.scss?tag=gx-ide-chat-welcome&encapsulation=shadow","src/components/chat/chat-welcome/chat-welcome.tsx"],"sourcesContent":[".chat-container {\n background-color: var(\n --elevation-background-color,\n --mer-surface__elevation--01\n );\n display: grid;\n block-size: 100%;\n overflow: auto;\n grid-template-rows: 1fr;\n position: relative;\n --chat-common-border-radius: var(--mer-spacing--2xs);\n}\n\n.chat-container.with-header {\n grid-template-rows: max-content 1fr;\n}\n\n.section {\n display: contents;\n}\n\n.header {\n padding: var(--mer-spacing--2xs) var(--mer-spacing--2xs)\n var(--mer-spacing--2xs) var(--mer-spacing--sm);\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mer-spacing--sm);\n color: var(--mer-text__bright);\n border-block-end: var(--mer-border__width--sm) solid\n var(--color-border-surface-on-elevation-01, #333d47);\n\n .button-copy-chat,\n .button-delete-chat {\n --control__border-color: transparent !important;\n }\n\n .button-delete-chat {\n &:hover {\n filter: brightness(1.3);\n }\n &:active {\n filter: brightness(0.8);\n }\n }\n}\n\n.ch-chat-container {\n overflow: auto;\n position: relative;\n display: grid;\n}\n\n// - - - - - - - - - - - - - -\n// other\n// - - - - - - - - - - - - - -\n\n.chat-container__conversation-copied {\n position: absolute;\n z-index: 1;\n inline-size: 100%;\n block-size: 100%;\n background: rgba(22, 22, 23, 0.75);\n backdrop-filter: saturate(180%) blur(20px);\n display: grid;\n align-items: center;\n justify-content: center;\n text-align: center;\n padding: 32px;\n --mer-icon__box--md: 18px;\n pointer-events: none;\n overflow: hidden;\n animation: fadeIn 100ms ease-in-out forwards;\n opacity: 0;\n}\n\n.chat-container__conversation-copied-wrapper {\n display: flex;\n align-items: center;\n gap: var(--mer-spacing--sm);\n position: relative;\n inset-block-start: 4px;\n opacity: 0;\n animation: liftUp var(--mer-timing--fast) ease-in-out forwards;\n animation-delay: var(--mer-timing--fast);\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@keyframes liftUp {\n from {\n opacity: 0;\n inset-block-start: 4px;\n }\n to {\n opacity: 1;\n inset-block-start: 0;\n }\n}\n\n::selection {\n color: #00ccff;\n background: #22334a;\n}\n\n// The following styles shoul be moved over to Mercury\n\n.chat::part(code-block-header__copy) {\n --copy-text-opacity: 0;\n --copy-text-translate-x: 6px;\n opacity: var(--copy-text-opacity);\n pointer-events: none;\n transform: translateX(var(--copy-text-translate-x));\n transition: opacity 100ms ease-in-out, transform 100ms ease-in-out;\n font-size: 12px;\n}\n.chat::part(code-block-header__copy-copied) {\n --copy-button-pointer-events: none !important;\n --copy-text-opacity: 1;\n --copy-text-translate-x: 0;\n}\n.chat::part(code-block-header) {\n align-items: center;\n display: flex;\n gap: 8px;\n}\n","import {\n Component,\n Host,\n h,\n Prop,\n Element,\n Method,\n State\n} from \"@stencil/core\";\nimport { MercuryBundles, getIconPath } from \"@genexus/mercury\";\nimport { ActionMenuModel } from \"@genexus/chameleon-controls-library\";\n\nimport { Locale } from \"../../../common/locale\";\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"utils/typography\",\n \"chameleon/scrollbar\",\n \"components/button\",\n \"components/dropdown\",\n \"components/icon\",\n \"utils/elevation\"\n];\n\nconst COPY_ICON = getIconPath({\n category: \"system\",\n name: \"copy\",\n colorType: \"primary\"\n});\nconst DELETE_ICON = getIconPath({\n category: \"system\",\n name: \"delete-outlined\",\n colorType: \"primary\"\n});\nconst CONVERSATION_ICON = getIconPath({\n category: \"objects\",\n name: \"conversational-flows\"\n});\nconst MORE_HORIZONTAL_ICON = getIconPath({\n category: \"system\",\n name: \"more-horizontal\",\n colorType: \"neutral\"\n});\n\n@Component({\n tag: \"gx-ide-chat-container\",\n styleUrl: \"chat-container.scss\",\n shadow: false,\n assetsDirs: [\"gx-ide-assets/chat-container\"]\n})\nexport class GxIdeChatContainer {\n #menuItems: ActionMenuModel = [\n { type: \"slot\", id: \"delete-chat-button\" },\n { type: \"slot\", id: \"copy-chat-button\" }\n ];\n\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 @Element() el: HTMLGxIdeChatContainerElement;\n\n /**\n * Coneration Copied\n */\n @State() displayConversationCopiedMessage: boolean = false;\n\n /**\n * Displays or hides the menu\n */\n @State() menuIsExpanded: boolean = false;\n\n /**\n * The chat title\n */\n @Prop() readonly chatTitle?: string;\n\n /**\n * If true a button for copying the conversation will be render on the header\n */\n @Prop() readonly copyConversationCallback: () => void;\n\n /**\n * If true a button for deleting the conversation will be render on the header\n */\n @Prop() readonly deleteConversationCallback: () => void;\n\n /**\n * If true a the welcome screen will be rendered\n */\n @Prop() readonly displayWelcomeScreen: boolean = false;\n\n async componentWillLoad() {\n this.#componentLocale = await Locale.getComponentStrings(this.el);\n }\n\n /**\n * It will display a feedback message that the conversation has been copied\n */\n @Method()\n async showCopyConversationMessage() {\n this.displayConversationCopiedMessage = true;\n setTimeout(() => {\n this.displayConversationCopiedMessage = false;\n }, 2000);\n }\n\n #showMenuHandler = () => {\n this.menuIsExpanded = true;\n };\n\n #menuExpandedChangeHandler = (event: CustomEvent<boolean>) => {\n this.menuIsExpanded = event.detail;\n };\n\n #copyConversationHandler = () => {\n if (this.copyConversationCallback) {\n this.copyConversationCallback();\n this.menuIsExpanded = false;\n }\n };\n #deleteConversationHandler = () => {\n if (this.deleteConversationCallback) {\n this.deleteConversationCallback();\n this.menuIsExpanded = false;\n }\n };\n\n render() {\n const renderHeader =\n this.chatTitle ||\n this.copyConversationCallback ||\n this.deleteConversationCallback;\n\n const renderButtonsGroup =\n this.copyConversationCallback || this.deleteConversationCallback;\n return (\n <Host\n class={{\n \"chat-container\": true,\n \"with-header\": !!renderHeader\n }}\n >\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <section class=\"section\">\n {renderHeader && (\n <header class=\"header tiny-semi-bold-l\">\n {this.chatTitle && this.chatTitle}\n {renderButtonsGroup && (\n <ch-action-menu-render\n class=\"dropdown\"\n blockAlign=\"inside-start\"\n inlineAlign=\"inside-end\"\n model={this.#menuItems}\n expanded={this.menuIsExpanded}\n onExpandedChange={this.#menuExpandedChangeHandler}\n >\n <button\n class=\"button-tertiary button-icon-only\"\n onClick={this.#showMenuHandler}\n type=\"button\"\n aria-label={this.#componentLocale.showMenuAriaLabel}\n title={this.#componentLocale.showMenuAriaLabel}\n >\n <ch-image\n class=\"icon-md\"\n src={MORE_HORIZONTAL_ICON}\n ></ch-image>\n </button>\n {this.copyConversationCallback && (\n <button\n class=\"button-tertiary button-icon-and-text button-copy-chat\"\n slot=\"copy-chat-button\"\n onClick={this.#copyConversationHandler}\n type=\"button\"\n aria-label={\n this.#componentLocale.copyConversationAriaLabel\n }\n title={this.#componentLocale.copyConversationAriaLabel}\n >\n <ch-image class=\"icon-md\" src={COPY_ICON}></ch-image>\n {this.#componentLocale.copyConversationLabel}\n </button>\n )}\n {this.deleteConversationCallback && (\n <button\n class=\"button-tertiary button-icon-and-text button-delete-chat\"\n slot=\"delete-chat-button\"\n onClick={this.#deleteConversationHandler}\n type=\"button\"\n aria-label={\n this.#componentLocale.deleteConversationAriaLabel\n }\n title={this.#componentLocale.deleteConversationAriaLabel}\n >\n <ch-image class=\"icon-md\" src={DELETE_ICON}></ch-image>\n {this.#componentLocale.clearConversationLabel}\n </button>\n )}\n </ch-action-menu-render>\n )}\n </header>\n )}\n <section class=\"ch-chat-container\">\n <slot></slot>\n {this.displayConversationCopiedMessage && (\n <div class=\"chat-container__conversation-copied\">\n <div class=\"chat-container__conversation-copied-wrapper\">\n <ch-image class=\"icon-md\" src={CONVERSATION_ICON}></ch-image>\n <p class=\"body-regular-l\">conversation copied</p>\n </div>\n </div>\n )}\n </section>\n {/* <footer class=\"footer elevation-1\">footer</footer> */}\n </section>\n </Host>\n );\n }\n}\n",":host {\n block-size: 100%;\n}\n\n$sharedPadding: var(--mer-spacing--md);\n\n.welcome-container {\n --opacity: 1;\n --translate-y: 0;\n opacity: var(--opacity);\n transform: translateY(var(--translate-y));\n transition: all var(--transition-duration);\n display: flex;\n block-size: 100%;\n grid-template-rows: max-content max-content;\n flex-direction: column;\n justify-content: space-between;\n background-repeat: no-repeat;\n background-size: cover;\n background-size: contain;\n\n &.hidden {\n --opacity: 0;\n --translate-y: 4px;\n }\n}\n\n%absolute-centered {\n position: absolute;\n inset-inline-start: 50%;\n inset-block-start: 50%;\n transform: translate(-50%, -50%);\n}\n\n.header {\n --opacity: 0;\n --translate-y: 3px;\n transition: all var(--transition-duration) var(--transition-delay)\n cubic-bezier(0.4, 0, 0.2, 1);\n transform: translateY(var(--translate-y));\n opacity: var(--opacity);\n display: flex;\n flex-direction: column;\n gap: var(--mer-spacing--md);\n align-items: center;\n padding: $sharedPadding;\n\n &--visible {\n --opacity: 1;\n --translate-y: 0;\n }\n\n &__circle {\n $circleSize: 55px;\n inline-size: $circleSize;\n block-size: $circleSize;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center center;\n margin-block-end: -6px;\n }\n\n &__title {\n display: grid;\n text-align: center;\n margin: 0;\n text-align: center;\n white-space: pre-line;\n line-height: 1.3;\n font-weight: 600;\n font-size: var(--font-size-header-h3);\n }\n\n &__greeting {\n line-height: 1.4;\n text-align: center;\n font-weight: 300;\n }\n}\n\n.suggested-prompts {\n --opacity: 1;\n opacity: var(--opacity);\n transition: opacity var(--transition-duration);\n display: flex;\n flex-direction: column;\n gap: var(--mer-spacing--md);\n list-style: none;\n margin: 0;\n padding: $sharedPadding;\n\n &.hidden {\n --opacity: 0;\n }\n\n &__item {\n }\n\n &__button {\n opacity: 0;\n transform: translateX(-3px);\n animation: fadeInSuggestedPromptButton var(--mer-timing--regular) ease\n forwards;\n animation-delay: var(--delay, 0s);\n\n border: 0;\n padding: var(--mer-spacing--sm);\n border-radius: 30px;\n font-size: 14px; // TODO : Use a token when available\n font-style: oblique;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: var(--mer-spacing--xs);\n background-color: #22334a; // TODO : Use a token when available\n font-weight: 100;\n\n &:hover {\n background-color: #1a2b42;\n }\n }\n}\n\n@keyframes fadeInSuggestedPromptButton {\n from {\n opacity: 0;\n transform: translateX(-3px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n","/* eslint-disable @stencil-community/strict-mutable */\nimport {\n Component,\n Host,\n h,\n Prop,\n Element,\n State,\n getAssetPath,\n Method\n} from \"@stencil/core\";\nimport { MercuryBundles, getIconPath } from \"@genexus/mercury\";\n\nimport { Locale } from \"../../../common/locale\";\n\nconst HEADER_ILLUSTRATION = getAssetPath(\n `./gx-ide-assets/chat-welcome/images/header-illustration.svg`\n);\nconst AI_AVATAR = getAssetPath(\n `./gx-ide-assets/chat-welcome/images/ai-avatar-welcome.svg`\n);\n\nconst HEADER_TRANSITION_DELAY: number = 100;\nconst HEADER_TRANSITION_DURATION: number = 500;\nconst SUGGESTED_PROMPT_BUTTON_INTERVAL: number = 200;\nconst SUGGESTED_PROMPT_BUTTONS_DELAY: number = 500;\nconst WELCOME_EXIT_DURATION: number = 100;\n\nconst AI_ICON = getIconPath({\n category: \"system\",\n name: \"assistant\",\n colorType: \"primary\"\n});\nconst ARROW_RIGHT_ICON = getIconPath({\n category: \"system\",\n name: \"arrow-right\",\n colorType: \"primary\"\n});\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"components/chat\",\n \"components/icon\",\n \"utils/typography\"\n];\n\n@Component({\n tag: \"gx-ide-chat-welcome\",\n styleUrl: \"chat-welcome.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/chat-welcome\"]\n})\nexport class GxIdeChatWelcome {\n // eslint-disable-next-line @stencil-community/own-props-must-be-private\n #componentLocale: any;\n\n @Element() el: HTMLGxIdeChatWelcomeElement;\n\n /**\n * When true, it will display the welcome elements (title, greeting, and buttons)\n */\n @State() showHeader: boolean = false;\n\n /**\n * When true, it will display the suggested prompts buttons\n */\n @State() showSuggestedPrompts: boolean = false;\n\n /**\n * When true, it will hide entire welcome layout\n */\n @State() hideWelcome: boolean = false;\n\n /**\n * The welcome title, if not provided, the default title will be used.\n */\n @Prop({ mutable: true }) welcomeTitle?: string;\n\n /**\n * The welcome greeting description, if not provided, the default title will be used.\n */\n @Prop({ mutable: true }) welcomeGreeting?: string;\n\n /**\n * The suggested prompts, if not provided, the default title will be used.\n */\n @Prop({ mutable: true }) suggestedPrompts?: string[];\n\n /**\n * Fired when the user clicks on a suggested prompt button\n */\n @Prop() readonly suggestedPrompRequestedCallback: (\n prompt: string\n ) => Promise<void>;\n\n async componentWillLoad() {\n this.#componentLocale = await Locale.getComponentStrings(this.el);\n\n // Set defaults\n if (!this.welcomeTitle) {\n this.welcomeTitle = this.#componentLocale.welcomeTitle;\n }\n if (!this.welcomeGreeting) {\n this.welcomeGreeting = this.#componentLocale.welcomeGreeting;\n }\n if (!this.suggestedPrompts) {\n this.suggestedPrompts = this.#componentLocale.suggestedPrompts;\n }\n }\n\n componentDidRender() {\n if (!this.hideWelcome) {\n this.#animationEntrance();\n }\n }\n\n /**\n * It will exit the wellcome screen and remove it from the dom.\n */\n @Method()\n async exitWelcome() {\n this.#animationExit();\n }\n\n #animationEntrance = () => {\n setTimeout(() => {\n this.showHeader = true;\n setTimeout(() => {\n this.showSuggestedPrompts = true;\n }, SUGGESTED_PROMPT_BUTTONS_DELAY);\n }, HEADER_TRANSITION_DELAY + HEADER_TRANSITION_DURATION);\n };\n\n #sendPromptToChat = async (e: MouseEvent) => {\n const prompt = (e.currentTarget as HTMLButtonElement).dataset[\"prommpt\"];\n await this.#animationExit();\n this.suggestedPrompRequestedCallback(prompt);\n };\n\n #animationExit = async (): Promise<void> => {\n this.hideWelcome = true;\n await new Promise(resolve => setTimeout(resolve, WELCOME_EXIT_DURATION));\n };\n\n render() {\n return (\n <Host>\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <div\n class={{ \"welcome-container\": true, \"hidden\": this.hideWelcome }}\n style={{\n \"backgroundImage\": `url(${HEADER_ILLUSTRATION})`,\n \"--transition-duration\": `${WELCOME_EXIT_DURATION}ms`\n }}\n >\n <header\n class={{ \"header\": true, \"header--visible\": this.showHeader }}\n style={{\n \"--transition-delay\": `${HEADER_TRANSITION_DELAY}ms`,\n \"--transition-duration\": `${HEADER_TRANSITION_DURATION}ms`\n }}\n >\n <span\n class=\"header__circle\"\n style={{ backgroundImage: `url(${AI_AVATAR})` }}\n ></span>\n <h2 class=\"header__title\">{this.welcomeTitle}</h2>\n <p class=\"header__greeting\">{this.welcomeGreeting}</p>\n </header>\n\n {this.suggestedPrompts && this.showSuggestedPrompts && (\n <ul class=\"suggested-prompts\">\n {this.suggestedPrompts.map((prompt, i) => (\n <li class=\"suggested-prompts__item\">\n <button\n class={{\n \"suggested-prompts__button\": true\n }}\n onClick={this.#sendPromptToChat}\n style={{\n \"--delay\": `${SUGGESTED_PROMPT_BUTTON_INTERVAL * i}ms`\n }}\n data-prommpt={prompt}\n >\n <ch-image src={AI_ICON} class=\"icon-md\"></ch-image>\n {prompt}\n <ch-image src={ARROW_RIGHT_ICON} class=\"icon-md\"></ch-image>\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["chatContainerCss","CSS_BUNDLES","COPY_ICON","getIconPath","category","name","colorType","DELETE_ICON","CONVERSATION_ICON","MORE_HORIZONTAL_ICON","GxIdeChatContainer","_GxIdeChatContainer_menuItems","set","this","type","id","_GxIdeChatContainer_componentLocale","_GxIdeChatContainer_showMenuHandler","menuIsExpanded","_GxIdeChatContainer_menuExpandedChangeHandler","event","detail","_GxIdeChatContainer_copyConversationHandler","copyConversationCallback","_GxIdeChatContainer_deleteConversationHandler","deleteConversationCallback","componentWillLoad","__classPrivateFieldSet","Locale","getComponentStrings","el","showCopyConversationMessage","displayConversationCopiedMessage","setTimeout","render","renderHeader","chatTitle","renderButtonsGroup","h","Host","class","model","blockAlign","inlineAlign","__classPrivateFieldGet","expanded","onExpandedChange","onClick","showMenuAriaLabel","title","src","slot","copyConversationAriaLabel","copyConversationLabel","deleteConversationAriaLabel","clearConversationLabel","chatWelcomeCss","HEADER_ILLUSTRATION","getAssetPath","AI_AVATAR","HEADER_TRANSITION_DELAY","HEADER_TRANSITION_DURATION","SUGGESTED_PROMPT_BUTTON_INTERVAL","SUGGESTED_PROMPT_BUTTONS_DELAY","WELCOME_EXIT_DURATION","AI_ICON","ARROW_RIGHT_ICON","GxIdeChatWelcome","_GxIdeChatWelcome_componentLocale","_GxIdeChatWelcome_animationEntrance","showHeader","showSuggestedPrompts","_GxIdeChatWelcome_sendPromptToChat","async","e","prompt","currentTarget","dataset","_GxIdeChatWelcome_animationExit","call","suggestedPrompRequestedCallback","hideWelcome","Promise","resolve","welcomeTitle","welcomeGreeting","suggestedPrompts","componentDidRender","exitWelcome","hidden","style","backgroundImage","header","map","i"],"sources":["src/components/chat/chat-container/chat-container.scss?tag=gx-ide-chat-container","src/components/chat/chat-container/chat-container.tsx","src/components/chat/chat-welcome/chat-welcome.scss?tag=gx-ide-chat-welcome&encapsulation=shadow","src/components/chat/chat-welcome/chat-welcome.tsx"],"sourcesContent":[".chat-container {\n background-color: var(\n --elevation-background-color,\n --mer-surface__elevation--01\n );\n display: grid;\n block-size: 100%;\n overflow: auto;\n grid-template-rows: 1fr;\n position: relative;\n --chat-common-border-radius: var(--mer-spacing--2xs);\n}\n\n.chat-container.with-header {\n grid-template-rows: max-content 1fr;\n}\n\n.section {\n display: contents;\n}\n\n.header {\n padding: var(--mer-spacing--2xs) var(--mer-spacing--2xs)\n var(--mer-spacing--2xs) var(--mer-spacing--sm);\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mer-spacing--sm);\n color: var(--mer-text__bright);\n border-block-end: var(--mer-border__width--sm) solid\n var(--color-border-surface-on-elevation-01, #333d47);\n\n .button-copy-chat,\n .button-delete-chat {\n --control__border-color: transparent !important;\n }\n\n .button-delete-chat {\n &:hover {\n filter: brightness(1.3);\n }\n &:active {\n filter: brightness(0.8);\n }\n }\n}\n\n.ch-chat-container {\n overflow: auto;\n position: relative;\n display: grid;\n}\n\n// - - - - - - - - - - - - - -\n// other\n// - - - - - - - - - - - - - -\n\n.chat-container__conversation-copied {\n position: absolute;\n z-index: 1;\n inline-size: 100%;\n block-size: 100%;\n background: rgba(22, 22, 23, 0.75);\n backdrop-filter: saturate(180%) blur(20px);\n display: grid;\n align-items: center;\n justify-content: center;\n text-align: center;\n padding: 32px;\n --mer-icon__box--md: 18px;\n pointer-events: none;\n overflow: hidden;\n animation: fadeIn 100ms ease-in-out forwards;\n opacity: 0;\n}\n\n.chat-container__conversation-copied-wrapper {\n display: flex;\n align-items: center;\n gap: var(--mer-spacing--sm);\n position: relative;\n inset-block-start: 4px;\n opacity: 0;\n animation: liftUp var(--mer-timing--fast) ease-in-out forwards;\n animation-delay: var(--mer-timing--fast);\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@keyframes liftUp {\n from {\n opacity: 0;\n inset-block-start: 4px;\n }\n to {\n opacity: 1;\n inset-block-start: 0;\n }\n}\n\n::selection {\n color: #00ccff;\n background: #22334a;\n}\n\n// The following styles shoul be moved over to Mercury\n\n.chat::part(code-block-header__copy) {\n --copy-text-opacity: 0;\n --copy-text-translate-x: 6px;\n opacity: var(--copy-text-opacity);\n pointer-events: none;\n transform: translateX(var(--copy-text-translate-x));\n transition: opacity 100ms ease-in-out, transform 100ms ease-in-out;\n font-size: 12px;\n}\n.chat::part(code-block-header__copy-copied) {\n --copy-button-pointer-events: none !important;\n --copy-text-opacity: 1;\n --copy-text-translate-x: 0;\n}\n.chat::part(code-block-header) {\n align-items: center;\n display: flex;\n gap: 8px;\n}\n","import {\n Component,\n Host,\n h,\n Prop,\n Element,\n Method,\n State\n} from \"@stencil/core\";\nimport { MercuryBundles, getIconPath } from \"@genexus/mercury\";\nimport { ActionMenuModel } from \"@genexus/chameleon-controls-library\";\n\nimport { Locale } from \"../../../common/locale\";\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"utils/typography\",\n \"chameleon/scrollbar\",\n \"components/button\",\n \"components/dropdown\",\n \"components/icon\",\n \"utils/elevation\"\n];\n\nconst COPY_ICON = getIconPath({\n category: \"system\",\n name: \"copy\",\n colorType: \"primary\"\n});\nconst DELETE_ICON = getIconPath({\n category: \"system\",\n name: \"delete-outlined\",\n colorType: \"primary\"\n});\nconst CONVERSATION_ICON = getIconPath({\n category: \"objects\",\n name: \"conversational-flows\"\n});\nconst MORE_HORIZONTAL_ICON = getIconPath({\n category: \"system\",\n name: \"more-horizontal\",\n colorType: \"neutral\"\n});\n\n@Component({\n tag: \"gx-ide-chat-container\",\n styleUrl: \"chat-container.scss\",\n shadow: false,\n assetsDirs: [\"gx-ide-assets/chat-container\"]\n})\nexport class GxIdeChatContainer {\n #menuItems: ActionMenuModel = [\n { type: \"slot\", id: \"delete-chat-button\" },\n { type: \"slot\", id: \"copy-chat-button\" }\n ];\n\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 @Element() el: HTMLGxIdeChatContainerElement;\n\n /**\n * Coneration Copied\n */\n @State() displayConversationCopiedMessage: boolean = false;\n\n /**\n * Displays or hides the menu\n */\n @State() menuIsExpanded: boolean = false;\n\n /**\n * The chat title\n */\n @Prop() readonly chatTitle?: string;\n\n /**\n * If true a button for copying the conversation will be render on the header\n */\n @Prop() readonly copyConversationCallback: () => void;\n\n /**\n * If true a button for deleting the conversation will be render on the header\n */\n @Prop() readonly deleteConversationCallback: () => void;\n\n /**\n * If true a the welcome screen will be rendered\n */\n @Prop() readonly displayWelcomeScreen: boolean = false;\n\n async componentWillLoad() {\n this.#componentLocale = await Locale.getComponentStrings(this.el);\n }\n\n /**\n * It will display a feedback message that the conversation has been copied\n */\n @Method()\n async showCopyConversationMessage() {\n this.displayConversationCopiedMessage = true;\n setTimeout(() => {\n this.displayConversationCopiedMessage = false;\n }, 2000);\n }\n\n #showMenuHandler = () => {\n this.menuIsExpanded = true;\n };\n\n #menuExpandedChangeHandler = (event: CustomEvent<boolean>) => {\n this.menuIsExpanded = event.detail;\n };\n\n #copyConversationHandler = () => {\n if (this.copyConversationCallback) {\n this.copyConversationCallback();\n this.menuIsExpanded = false;\n }\n };\n #deleteConversationHandler = () => {\n if (this.deleteConversationCallback) {\n this.deleteConversationCallback();\n this.menuIsExpanded = false;\n }\n };\n\n render() {\n const renderHeader =\n this.chatTitle ||\n this.copyConversationCallback ||\n this.deleteConversationCallback;\n\n const renderButtonsGroup =\n this.copyConversationCallback || this.deleteConversationCallback;\n return (\n <Host\n class={{\n \"chat-container\": true,\n \"with-header\": !!renderHeader\n }}\n >\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <section class=\"section\">\n {renderHeader && (\n <header class=\"header tiny-semi-bold-l\">\n {this.chatTitle && this.chatTitle}\n {renderButtonsGroup && (\n <ch-action-menu-render\n class=\"dropdown\"\n blockAlign=\"inside-start\"\n inlineAlign=\"inside-end\"\n model={this.#menuItems}\n expanded={this.menuIsExpanded}\n onExpandedChange={this.#menuExpandedChangeHandler}\n >\n <button\n class=\"button-tertiary button-icon-only\"\n onClick={this.#showMenuHandler}\n type=\"button\"\n aria-label={this.#componentLocale.showMenuAriaLabel}\n title={this.#componentLocale.showMenuAriaLabel}\n >\n <ch-image\n class=\"icon-md\"\n src={MORE_HORIZONTAL_ICON}\n ></ch-image>\n </button>\n {this.copyConversationCallback && (\n <button\n class=\"button-tertiary button-icon-and-text button-copy-chat\"\n slot=\"copy-chat-button\"\n onClick={this.#copyConversationHandler}\n type=\"button\"\n aria-label={\n this.#componentLocale.copyConversationAriaLabel\n }\n title={this.#componentLocale.copyConversationAriaLabel}\n >\n <ch-image class=\"icon-md\" src={COPY_ICON}></ch-image>\n {this.#componentLocale.copyConversationLabel}\n </button>\n )}\n {this.deleteConversationCallback && (\n <button\n class=\"button-tertiary button-icon-and-text button-delete-chat\"\n slot=\"delete-chat-button\"\n onClick={this.#deleteConversationHandler}\n type=\"button\"\n aria-label={\n this.#componentLocale.deleteConversationAriaLabel\n }\n title={this.#componentLocale.deleteConversationAriaLabel}\n >\n <ch-image class=\"icon-md\" src={DELETE_ICON}></ch-image>\n {this.#componentLocale.clearConversationLabel}\n </button>\n )}\n </ch-action-menu-render>\n )}\n </header>\n )}\n <section class=\"ch-chat-container\">\n <slot></slot>\n {this.displayConversationCopiedMessage && (\n <div class=\"chat-container__conversation-copied\">\n <div class=\"chat-container__conversation-copied-wrapper\">\n <ch-image class=\"icon-md\" src={CONVERSATION_ICON}></ch-image>\n <p class=\"body-regular-l\">conversation copied</p>\n </div>\n </div>\n )}\n </section>\n {/* <footer class=\"footer elevation-1\">footer</footer> */}\n </section>\n </Host>\n );\n }\n}\n",":host {\n block-size: 100%;\n}\n\n$sharedPadding: var(--mer-spacing--md);\n\n.welcome-container {\n --opacity: 1;\n --translate-y: 0;\n opacity: var(--opacity);\n transform: translateY(var(--translate-y));\n transition: all var(--transition-duration);\n display: flex;\n block-size: 100%;\n grid-template-rows: max-content max-content;\n flex-direction: column;\n justify-content: space-between;\n background-repeat: no-repeat;\n background-size: cover;\n background-size: contain;\n\n &.hidden {\n --opacity: 0;\n --translate-y: 4px;\n }\n}\n\n%absolute-centered {\n position: absolute;\n inset-inline-start: 50%;\n inset-block-start: 50%;\n transform: translate(-50%, -50%);\n}\n\n.header {\n --opacity: 0;\n --translate-y: 3px;\n transition: all var(--transition-duration) var(--transition-delay)\n cubic-bezier(0.4, 0, 0.2, 1);\n transform: translateY(var(--translate-y));\n opacity: var(--opacity);\n display: flex;\n flex-direction: column;\n gap: var(--mer-spacing--md);\n align-items: center;\n padding: $sharedPadding;\n\n &--visible {\n --opacity: 1;\n --translate-y: 0;\n }\n\n &__circle {\n $circleSize: 55px;\n inline-size: $circleSize;\n block-size: $circleSize;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center center;\n margin-block-end: -6px;\n }\n\n &__title {\n display: grid;\n text-align: center;\n margin: 0;\n text-align: center;\n white-space: pre-line;\n line-height: 1.3;\n font-weight: 600;\n font-size: var(--font-size-header-h3);\n }\n\n &__greeting {\n line-height: 1.4;\n text-align: center;\n font-weight: 300;\n }\n}\n\n.suggested-prompts {\n --opacity: 1;\n opacity: var(--opacity);\n transition: opacity var(--transition-duration);\n display: flex;\n flex-direction: column;\n gap: var(--mer-spacing--md);\n list-style: none;\n margin: 0;\n padding: $sharedPadding;\n\n &.hidden {\n --opacity: 0;\n }\n\n &__item {\n }\n\n &__button {\n opacity: 0;\n transform: translateX(-3px);\n animation: fadeInSuggestedPromptButton var(--mer-timing--regular) ease\n forwards;\n animation-delay: var(--delay, 0s);\n\n border: 0;\n padding: var(--mer-spacing--sm);\n border-radius: 44px; // Works with up to a a four lines button\n font-size: 14px; // TODO : Use a token when available\n font-style: oblique;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: var(--mer-spacing--xs);\n background-color: #22334a; // TODO : Use a token when available\n font-weight: 100;\n max-inline-size: 300px;\n\n &:hover {\n background-color: #1a2b42;\n }\n }\n\n &__icon {\n flex-shrink: 0;\n }\n}\n\n@keyframes fadeInSuggestedPromptButton {\n from {\n opacity: 0;\n transform: translateX(-3px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n","/* eslint-disable @stencil-community/strict-mutable */\nimport {\n Component,\n Host,\n h,\n Prop,\n Element,\n State,\n getAssetPath,\n Method\n} from \"@stencil/core\";\nimport { MercuryBundles, getIconPath } from \"@genexus/mercury\";\n\nimport { Locale } from \"../../../common/locale\";\n\nconst HEADER_ILLUSTRATION = getAssetPath(\n `./gx-ide-assets/chat-welcome/images/header-illustration.svg`\n);\nconst AI_AVATAR = getAssetPath(\n `./gx-ide-assets/chat-welcome/images/ai-avatar-welcome.svg`\n);\n\nconst HEADER_TRANSITION_DELAY: number = 100;\nconst HEADER_TRANSITION_DURATION: number = 500;\nconst SUGGESTED_PROMPT_BUTTON_INTERVAL: number = 200;\nconst SUGGESTED_PROMPT_BUTTONS_DELAY: number = 500;\nconst WELCOME_EXIT_DURATION: number = 100;\n\nconst AI_ICON = getIconPath({\n category: \"system\",\n name: \"assistant\",\n colorType: \"primary\"\n});\nconst ARROW_RIGHT_ICON = getIconPath({\n category: \"system\",\n name: \"arrow-right\",\n colorType: \"primary\"\n});\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"components/chat\",\n \"components/icon\",\n \"utils/typography\"\n];\n\n@Component({\n tag: \"gx-ide-chat-welcome\",\n styleUrl: \"chat-welcome.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/chat-welcome\"]\n})\nexport class GxIdeChatWelcome {\n // eslint-disable-next-line @stencil-community/own-props-must-be-private\n #componentLocale: any;\n\n @Element() el: HTMLGxIdeChatWelcomeElement;\n\n /**\n * When true, it will display the welcome elements (title, greeting, and buttons)\n */\n @State() showHeader: boolean = false;\n\n /**\n * When true, it will display the suggested prompts buttons\n */\n @State() showSuggestedPrompts: boolean = false;\n\n /**\n * When true, it will hide entire welcome layout\n */\n @State() hideWelcome: boolean = false;\n\n /**\n * The welcome title, if not provided, the default title will be used.\n */\n @Prop({ mutable: true }) welcomeTitle?: string;\n\n /**\n * The welcome greeting description, if not provided, the default title will be used.\n */\n @Prop({ mutable: true }) welcomeGreeting?: string;\n\n /**\n * The suggested prompts, if not provided, the default title will be used.\n */\n @Prop({ mutable: true }) suggestedPrompts?: string[];\n\n /**\n * Fired when the user clicks on a suggested prompt button\n */\n @Prop() readonly suggestedPrompRequestedCallback: (\n prompt: string\n ) => Promise<void>;\n\n async componentWillLoad() {\n this.#componentLocale = await Locale.getComponentStrings(this.el);\n\n // Set defaults\n if (!this.welcomeTitle) {\n this.welcomeTitle = this.#componentLocale.welcomeTitle;\n }\n if (!this.welcomeGreeting) {\n this.welcomeGreeting = this.#componentLocale.welcomeGreeting;\n }\n if (!this.suggestedPrompts) {\n this.suggestedPrompts = this.#componentLocale.suggestedPrompts;\n }\n }\n\n componentDidRender() {\n if (!this.hideWelcome) {\n this.#animationEntrance();\n }\n }\n\n /**\n * It will exit the wellcome screen and remove it from the dom.\n */\n @Method()\n async exitWelcome() {\n this.#animationExit();\n }\n\n #animationEntrance = () => {\n setTimeout(() => {\n this.showHeader = true;\n setTimeout(() => {\n this.showSuggestedPrompts = true;\n }, SUGGESTED_PROMPT_BUTTONS_DELAY);\n }, HEADER_TRANSITION_DELAY + HEADER_TRANSITION_DURATION);\n };\n\n #sendPromptToChat = async (e: MouseEvent) => {\n const prompt = (e.currentTarget as HTMLButtonElement).dataset[\"prommpt\"];\n await this.#animationExit();\n this.suggestedPrompRequestedCallback(prompt);\n };\n\n #animationExit = async (): Promise<void> => {\n this.hideWelcome = true;\n await new Promise(resolve => setTimeout(resolve, WELCOME_EXIT_DURATION));\n };\n\n render() {\n return (\n <Host>\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <div\n class={{ \"welcome-container\": true, \"hidden\": this.hideWelcome }}\n style={{\n \"backgroundImage\": `url(${HEADER_ILLUSTRATION})`,\n \"--transition-duration\": `${WELCOME_EXIT_DURATION}ms`\n }}\n >\n <header\n class={{ \"header\": true, \"header--visible\": this.showHeader }}\n style={{\n \"--transition-delay\": `${HEADER_TRANSITION_DELAY}ms`,\n \"--transition-duration\": `${HEADER_TRANSITION_DURATION}ms`\n }}\n >\n <span\n class=\"header__circle\"\n style={{ backgroundImage: `url(${AI_AVATAR})` }}\n ></span>\n <h2 class=\"header__title\">{this.welcomeTitle}</h2>\n <p class=\"header__greeting\">{this.welcomeGreeting}</p>\n </header>\n\n {this.suggestedPrompts && this.showSuggestedPrompts && (\n <ul class=\"suggested-prompts\">\n {this.suggestedPrompts.map((prompt, i) => (\n <li class=\"suggested-prompts__item\">\n <button\n class={{\n \"suggested-prompts__button\": true\n }}\n onClick={this.#sendPromptToChat}\n style={{\n \"--delay\": `${SUGGESTED_PROMPT_BUTTON_INTERVAL * i}ms`\n }}\n data-prommpt={prompt}\n >\n <ch-image\n src={AI_ICON}\n class=\"icon-md suggested-prompts__icon\"\n ></ch-image>\n {prompt}\n <ch-image\n src={ARROW_RIGHT_ICON}\n class=\"icon-md suggested-prompts__icon\"\n ></ch-image>\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { L as s } from "./p-311eedf3.js";
|
|
|
4
4
|
|
|
5
5
|
import { c as o } from "./p-13738332.js";
|
|
6
6
|
|
|
7
|
-
import { a as l } from "./p-
|
|
7
|
+
import { a as l } from "./p-0c0eb8ae.js";
|
|
8
8
|
|
|
9
9
|
import { F as n } from "./p-13feb5cf.js";
|
|
10
10
|
|
|
@@ -608,4 +608,4 @@ const b = class {
|
|
|
608
608
|
b.style = h;
|
|
609
609
|
|
|
610
610
|
export { b as gx_ide_ww_images };
|
|
611
|
-
//# sourceMappingURL=p-
|
|
611
|
+
//# sourceMappingURL=p-3b5a4e2e.entry.js.map
|
|
@@ -2,7 +2,7 @@ import { r as e, c as t, h as r, H as i, a } from "./p-25a9f1d7.js";
|
|
|
2
2
|
|
|
3
3
|
import { g as o } from "./p-ede7bd20.js";
|
|
4
4
|
|
|
5
|
-
import { r as s } from "./p-
|
|
5
|
+
import { r as s } from "./p-0c0eb8ae.js";
|
|
6
6
|
|
|
7
7
|
import { L as l } from "./p-311eedf3.js";
|
|
8
8
|
|
|
@@ -487,4 +487,4 @@ c = new WeakMap, g = new WeakMap;
|
|
|
487
487
|
f.style = n;
|
|
488
488
|
|
|
489
489
|
export { f as gx_ide_manage_module_references };
|
|
490
|
-
//# sourceMappingURL=p-
|
|
490
|
+
//# sourceMappingURL=p-3b983843.entry.js.map
|
|
@@ -1,63 +1,63 @@
|
|
|
1
1
|
import { h as e } from "./p-25a9f1d7.js";
|
|
2
2
|
|
|
3
|
-
import { A as s } from "./p-
|
|
3
|
+
import { A as s } from "./p-0c0eb8ae.js";
|
|
4
4
|
|
|
5
|
-
const
|
|
5
|
+
const a = s("regular", "nexa");
|
|
6
6
|
|
|
7
|
-
const
|
|
7
|
+
const t = "code-block-header__copy";
|
|
8
8
|
|
|
9
|
-
const o = `${
|
|
9
|
+
const o = `${t}-copied`;
|
|
10
10
|
|
|
11
11
|
const r = "code-block-header";
|
|
12
12
|
|
|
13
|
-
const copy = (e, s = false) =>
|
|
14
|
-
const
|
|
15
|
-
|
|
13
|
+
const copy = (e, s = false) => a => {
|
|
14
|
+
const t = 1750;
|
|
15
|
+
a.stopPropagation();
|
|
16
16
|
// 1. Copy message
|
|
17
17
|
navigator.clipboard.writeText(e);
|
|
18
|
-
const r =
|
|
18
|
+
const r = a.target;
|
|
19
19
|
if (s) {
|
|
20
20
|
const e = r.previousElementSibling;
|
|
21
21
|
const s = e === null || e === void 0 ? void 0 : e.getAttribute("part");
|
|
22
|
-
const
|
|
23
|
-
e.setAttribute("part",
|
|
22
|
+
const a = `${s} ${o}`;
|
|
23
|
+
e.setAttribute("part", a);
|
|
24
24
|
setTimeout((() => {
|
|
25
25
|
e.setAttribute("part", `${s}`);
|
|
26
|
-
}),
|
|
26
|
+
}), t);
|
|
27
27
|
} else {
|
|
28
28
|
const e = r.closest("ch-smart-grid-cell");
|
|
29
29
|
const s = e === null || e === void 0 ? void 0 : e.getAttribute("part");
|
|
30
|
-
const
|
|
31
|
-
e.setAttribute("part",
|
|
30
|
+
const a = `${s} copied`;
|
|
31
|
+
e.setAttribute("part", a);
|
|
32
32
|
setTimeout((() => {
|
|
33
33
|
e.setAttribute("part", `${s}`);
|
|
34
|
-
}),
|
|
34
|
+
}), t);
|
|
35
35
|
}
|
|
36
36
|
};
|
|
37
37
|
|
|
38
|
-
const copyButton = (s,
|
|
39
|
-
"aria-label":
|
|
40
|
-
title:
|
|
38
|
+
const copyButton = (s, a, t, o = false) => e("button", {
|
|
39
|
+
"aria-label": a,
|
|
40
|
+
title: a,
|
|
41
41
|
class: "button-copy-code",
|
|
42
42
|
type: "button",
|
|
43
43
|
onClick: copy(s, o),
|
|
44
|
-
part: `message__copy-button ${
|
|
44
|
+
part: `message__copy-button ${t}`
|
|
45
45
|
});
|
|
46
46
|
|
|
47
|
-
const mercuryCodeRender = s =>
|
|
47
|
+
const mercuryCodeRender = s => a => e("div", {
|
|
48
48
|
class: "code-block-container"
|
|
49
49
|
}, e("div", {
|
|
50
50
|
class: r,
|
|
51
51
|
part: r
|
|
52
52
|
}, e("p", {
|
|
53
53
|
part: "code-block-header__copy"
|
|
54
|
-
}, "Copied"), copyButton(
|
|
55
|
-
language:
|
|
56
|
-
lastNestedChildClass:
|
|
57
|
-
value:
|
|
54
|
+
}, "Copied"), copyButton(a.plainText, s, "code-render", true)), e("ch-code", {
|
|
55
|
+
language: a.language,
|
|
56
|
+
lastNestedChildClass: a.lastNestedChildClass,
|
|
57
|
+
value: a.plainText
|
|
58
58
|
}));
|
|
59
59
|
|
|
60
|
-
const renderMessageHeader = (s,
|
|
60
|
+
const renderMessageHeader = (s, a, t, o) => e("div", {
|
|
61
61
|
part: "message__header"
|
|
62
62
|
}, e("div", {
|
|
63
63
|
part: "message__header-start"
|
|
@@ -68,14 +68,14 @@ const renderMessageHeader = (s, t, a, o) => e("div", {
|
|
|
68
68
|
}
|
|
69
69
|
}), e("span", {
|
|
70
70
|
part: `message__role assistant`
|
|
71
|
-
},
|
|
71
|
+
}, a), e("time", {
|
|
72
72
|
dateTime: o,
|
|
73
73
|
part: "message__time"
|
|
74
74
|
}, o)), e("div", {
|
|
75
75
|
part: "message__header-end"
|
|
76
76
|
}, e("p", {
|
|
77
77
|
part: "message__header-copy"
|
|
78
|
-
}, "Copied"), copyButton(
|
|
78
|
+
}, "Copied"), copyButton(t, "Copy code", "common-message")));
|
|
79
79
|
|
|
80
80
|
const mercuryChatMessageRender = (s, n, c = "AI Assistant") => p => {
|
|
81
81
|
const i = renderMessageHeader(n, c, p.content, p.metadata);
|
|
@@ -84,14 +84,14 @@ const mercuryChatMessageRender = (s, n, c = "AI Assistant") => p => {
|
|
|
84
84
|
part: "message__processing-container"
|
|
85
85
|
}, e("span", {
|
|
86
86
|
part: "message__processing"
|
|
87
|
-
}, p.content),
|
|
87
|
+
}, p.content), a) ] : [ i, e("div", {
|
|
88
88
|
part: `message__content assistant ${p.parts}`
|
|
89
89
|
}, e("ch-markdown-viewer", {
|
|
90
90
|
theme: s,
|
|
91
91
|
showIndicator: false,
|
|
92
92
|
renderCode: mercuryCodeRender("Copy response"),
|
|
93
93
|
value: p.content,
|
|
94
|
-
exportparts: `${r},${
|
|
94
|
+
exportparts: `${r},${t},${o}`
|
|
95
95
|
})) ];
|
|
96
96
|
} else if (p.role === "user") {
|
|
97
97
|
return [ e("span", {
|
|
@@ -106,4 +106,4 @@ const mercuryChatMessageRender = (s, n, c = "AI Assistant") => p => {
|
|
|
106
106
|
};
|
|
107
107
|
|
|
108
108
|
export { mercuryCodeRender as a, mercuryChatMessageRender as m };
|
|
109
|
-
//# sourceMappingURL=p-
|
|
109
|
+
//# sourceMappingURL=p-60221a44.js.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { g as e, r as t, h as n, H as a } from "./p-25a9f1d7.js";
|
|
2
2
|
|
|
3
|
-
import { m as s } from "./p-
|
|
3
|
+
import { m as s } from "./p-60221a44.js";
|
|
4
4
|
|
|
5
|
-
import "./p-
|
|
5
|
+
import "./p-0c0eb8ae.js";
|
|
6
6
|
|
|
7
7
|
const o = "{{ASSISTANT_NAME}}";
|
|
8
8
|
|
|
@@ -301,7 +301,8 @@ const T = class {
|
|
|
301
301
|
}, n("gx-ide-chat-welcome", {
|
|
302
302
|
ref: e => m(this, g, e, "f"),
|
|
303
303
|
slot: "empty-chat",
|
|
304
|
-
suggestedPrompRequestedCallback: u(this, k, "f")
|
|
304
|
+
suggestedPrompRequestedCallback: u(this, k, "f"),
|
|
305
|
+
suggestedPrompts: [ "I need to represente a product entity", "I want to create a Customer Tracking application. Can you help me with the architecture?", "I need to create a REST API for my application" ]
|
|
305
306
|
}), n("div", {
|
|
306
307
|
slot: "additional-content"
|
|
307
308
|
}, "Custom content that is rendered when the chat renders content"))));
|
|
@@ -314,4 +315,4 @@ b = new WeakMap, k = new WeakMap;
|
|
|
314
315
|
T.style = h;
|
|
315
316
|
|
|
316
317
|
export { T as gx_ide_sc_chat_container };
|
|
317
|
-
//# sourceMappingURL=p-
|
|
318
|
+
//# sourceMappingURL=p-6d996621.entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["PROCESSING_PLACEHOLDER","timeOut","ASSISTANT_RESPONSE_MARKDOWN","ASSISTANT_RESPONSE_SHORT_MARKDOWN","sendChatToLLM","chatRef","console","log","generatingResponse","addNewMessage","id","Date","getTime","role","content","status","setTimeout","updateLastMessage","dummyStreaming","chatCallbacksWithChatRef","chChatRef","clear","Promise","resolve","uploadImage","stopGeneratingAnswer","clearTimeout","counter","stringToDisplay","mode","streamingCompleted","length","substring","chatTranslations","accessibleName","clearChat","copyResponseButton","downloadCodeButton","imagePicker","removeUploadedImage","sendButton","sendInput","stopGeneratingAnswerButton","placeholder","text","copyCodeButton","processing","sourceFiles","Array","from","_","index","codeFixerRecord","metadata","parts","chatShowcaseCss","AI_AVATAR","getAssetPath","CSS_BUNDLES","GxIdeScChatContainer","_GxIdeScChatContainer_chatContainerRef","set","this","_GxIdeScChatContainer_chatWelcomeRef","_GxIdeScChatContainer_chChatRef","_GxIdeScChatContainer_chatCallbacks","_GxIdeScChatContainer_copyConversationCallbackHandler","__classPrivateFieldGet","showCopyConversationMessage","_GxIdeScChatContainer_deleteConversationCallbackHandler","_GxIdeScChatContainer_suggestedPrompRequestedCallbackHandler","async","prompt","assistantFinalResponse","toLowerCase","includes","userPrompt","exitWelcome","componentDidLoad","assistantStatus","componentDidRender","__classPrivateFieldSet","componentWillLoad","chatItems","render","h","Host","model","chatTitle","copyConversationCallback","deleteConversationCallback","ref","el","class","callbacks","loadingState","renderItem","mercuryChatMessageRender","items","showAdditionalContent","translations","slot","suggestedPrompRequestedCallback","suggestedPrompts"],"sources":["src/showcase/chat-container/callbacks.ts","src/showcase/chat-container/chat-showcase.scss?tag=gx-ide-sc-chat-container&encapsulation=shadow","src/showcase/chat-container/chat.showcase.tsx"],"sourcesContent":["import {\n ChatInternalCallbacks,\n ChatMessage,\n ChatTranslations\n} from \"@genexus/chameleon-controls-library\";\n\nconst PROCESSING_PLACEHOLDER = \"{{ASSISTANT_NAME}}\";\n\nlet timeOut: NodeJS.Timeout;\n\nconst ASSISTANT_RESPONSE_MARKDOWN = `\n###### Code block {#code-block}\nTo create code blocks, you’ll use three backticks (\\` \\`\\`\\` \\`) or three tildes (\\`~~~\\`) on the lines before and after the code block.\n\n\\`\\`\\`\n{\n \"firstName\": \"John\",\n \"lastName\": \"Smith\",\n \"age\": 25\n}\n\\`\\`\\`\n\nAnother way to create code blocks is to indent every line of the block by at least four spaces or one tab.\n\n <html>\n <head>\n </head>\n </html>\n\n\n###### Syntax Highlighting {#syntax-highlighting}\nThis feature allows you to add color highlighting for whatever language your code was written in.\nTo add syntax highlighting, specify a language next to the backticks before the fenced code block.\n\n\\`\\`\\`json\n{\n \"firstName\": \"John\",\n \"lastName\": \"Smith\",\n \"age\": 25\n}\n\\`\\`\\`\n\n\\`\\`\\`javascript\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport Markdown from 'react-markdown'\nimport rehypeHighlight from 'rehype-highlight'\n\nconst markdown = \\`\n# Your markdown here\n\\`\n\nReactDOM.render(\n <Markdown rehypePlugins={[rehypeHighlight]}>{markdown}</Markdown>,\n document.querySelector('#content')\n)\n\\`\\`\\`\n\n###### Horizontal Rules {#horizontal-rules}\nTo create a horizontal rule, use three or more asterisks (\\`***\\`), dashes (\\`---\\`), or underscores (\\`___\\`) on a line by themselves.\n`;\n\nconst ASSISTANT_RESPONSE_SHORT_MARKDOWN = `\n###### Code block {#code-block}\nTo create code blocks, you’ll use three backticks (\\` \\`\\`\\` \\`) or three tildes (\\`~~~\\`) on the lines before and after the code block.\n\n\\`\\`\\`json\n{\n \"firstName\": \"John\",\n \"lastName\": \"Smith\",\n \"age\": 25\n}\n\\`\\`\\`\n`;\n\nconst sendChatToLLM = (chatRef: HTMLChChatElement) => () => {\n console.log(\"dsa\");\n chatRef.generatingResponse = true;\n\n chatRef.addNewMessage({\n id: `${new Date().getTime()}`,\n role: \"assistant\",\n content: \"Analyzing\",\n status: \"waiting\"\n });\n\n timeOut = setTimeout(() => {\n chatRef.updateLastMessage(\n {\n role: \"assistant\",\n content: \"Processing with Chat with LLMs\",\n status: \"waiting\"\n },\n \"replace\"\n );\n\n timeOut = setTimeout(() => {\n dummyStreaming(chatRef, 20, ASSISTANT_RESPONSE_MARKDOWN, \"replace\");\n }, 10000);\n }, 20000);\n};\n\nexport const chatCallbacksWithChatRef = (\n chChatRef: HTMLChChatElement\n): ChatInternalCallbacks => {\n return {\n clear: () => new Promise(resolve => resolve()),\n sendChatToLLM: sendChatToLLM(chChatRef),\n uploadImage: () => new Promise(resolve => resolve(\"\")),\n stopGeneratingAnswer: () => {\n clearTimeout(timeOut);\n\n chChatRef.updateLastMessage(\n {\n role: \"assistant\",\n content: \"\",\n status: \"complete\"\n },\n \"concat\"\n );\n\n return new Promise(resolve => setTimeout(() => resolve, 10));\n }\n };\n};\n\nfunction dummyStreaming(\n chatRef: HTMLChChatElement,\n counter: number,\n stringToDisplay: string,\n mode: \"concat\" | \"replace\"\n) {\n timeOut = setTimeout(\n () => {\n const streamingCompleted = counter >= stringToDisplay.length;\n\n chatRef.updateLastMessage(\n {\n role: \"assistant\",\n content: stringToDisplay.substring(counter - 20, counter),\n\n // {\n // message: stringToDisplay.substring(counter - 20, counter),\n // files: streamingCompleted\n // ? [\n // {\n // url: \"https://next.genexus.ai\",\n // caption: \"Mars Exploration Contract\"\n // },\n // {\n // url: \"https://gx-chameleon.netlify.app\",\n // caption: \"Venus Exploration Contract\"\n // }\n // ]\n // : undefined\n // },\n status: streamingCompleted ? \"complete\" : \"streaming\"\n },\n mode\n );\n\n if (!streamingCompleted) {\n dummyStreaming(chatRef, counter + 20, stringToDisplay, \"concat\");\n } else {\n chatRef.generatingResponse = false;\n }\n },\n counter % 200 === 0 ? 50 : 40\n );\n}\n\nexport const chatTranslations: ChatTranslations = {\n accessibleName: {\n clearChat: \"Clear chat\",\n copyResponseButton: \"Copy assistant response\",\n downloadCodeButton: \"Download code\",\n imagePicker: \"Select images\",\n removeUploadedImage: \"Remove uploaded image\",\n sendButton: \"Send\",\n sendInput: \"Message\",\n stopGeneratingAnswerButton: \"Stop generating answer\"\n },\n placeholder: {\n sendInput: \"Ask me a question...\"\n },\n text: {\n copyCodeButton: \"Copy code\",\n processing: `Processing with ${PROCESSING_PLACEHOLDER}`,\n sourceFiles: \"Source files:\"\n }\n};\n\nexport const chatRecord: ChatMessage[] = [\n { id: \"1\", role: \"user\", content: \"Hello world\" },\n { id: \"2\", role: \"assistant\", content: ASSISTANT_RESPONSE_MARKDOWN },\n { id: \"3\", role: \"user\", content: \"Hello world 1\" },\n { id: \"4\", role: \"assistant\", content: ASSISTANT_RESPONSE_SHORT_MARKDOWN },\n { id: \"5\", role: \"user\", content: \"Hello world 2\" },\n { id: \"6\", role: \"assistant\", content: ASSISTANT_RESPONSE_SHORT_MARKDOWN },\n { id: \"7\", role: \"user\", content: \"Hello world 3\" },\n { id: \"8\", role: \"assistant\", content: ASSISTANT_RESPONSE_SHORT_MARKDOWN },\n { id: \"9\", role: \"user\", content: \"Hello world 4\" },\n { id: \"10\", role: \"assistant\", content: ASSISTANT_RESPONSE_SHORT_MARKDOWN }\n];\n\nexport const longChatRecord: ChatMessage[] = Array.from(\n { length: 40 },\n (_, index) =>\n index % 2 === 0\n ? {\n id: `index: ${index}`,\n role: \"user\",\n content:\n `index: ${index}` +\n `index: ${index}\\n` +\n `index: ${index}\\n` +\n `index: ${index}\\n` +\n `index: ${index}\\n` +\n `index: ${index}\\n` +\n `index: ${index}\\n`\n }\n : {\n id: `index: ${index}`,\n role: \"assistant\",\n content:\n ASSISTANT_RESPONSE_SHORT_MARKDOWN +\n `\\nindex: ${index}\\n` +\n `index: ${index}\\n` +\n `index: ${index}\\n` +\n `index: ${index}\\n` +\n `index: ${index}\\n` +\n `index: ${index}\\n` +\n `index: ${index}\\n`\n }\n);\n\nexport const codeFixerRecord: ChatMessage[] = [\n {\n id: \"1\",\n role: \"user\",\n content: \"Please give me an example about...\",\n metadata: \"14:55\"\n },\n {\n id: \"2\",\n role: \"assistant\",\n status: \"complete\",\n content:\n \"Action required example. Action required example. Action required example.\",\n metadata: \"14:56\"\n },\n {\n id: \"3\",\n role: \"assistant\",\n status: \"complete\",\n content:\n \"Some fields contain missing or invalid data, which may prevent the process from completing correctly. Review your input carefully and make any necessary corrections before continuing.\",\n metadata: \"14:57\",\n parts: \"warning\"\n },\n {\n id: \"4\",\n role: \"error\",\n content:\n \"An unexpected error occurred while processing your request, and the operation couldn’t be completed.Please check your internet connection or try again later. If the problem persists, contact support.\",\n metadata: \"14:58\"\n },\n {\n id: \"5\",\n role: \"assistant\",\n status: \"complete\",\n content:\n \"Your information has been saved successfully, and all changes are now reflected in your account. You can continue with the next steps or return to the dashboard at any time.\",\n metadata: \"14:59\",\n parts: \"success\"\n },\n {\n id: \"6\",\n role: \"user\",\n content:\n \"Implement the function calculate_average_grade in grades.py that takes a list of grades as input and returns the average grade as a floating-point number\",\n metadata: \"15:00\"\n },\n {\n id: \"7\",\n role: \"assistant\",\n status: \"complete\",\n content:\n \"You can provide further details or updates regarding your support ticket and its associated code. Your input here helps us better understand and address your issue effectively.\",\n metadata: \"15:01\"\n },\n {\n id: \"8\",\n role: \"assistant\",\n status: \"waiting\",\n content: \"You can provide further details or updates\"\n },\n {\n id: \"9\",\n role: \"assistant\",\n status: \"complete\",\n content: ASSISTANT_RESPONSE_SHORT_MARKDOWN\n }\n];\n",":host {\n block-size: 100%;\n display: grid;\n}\n","import {\n Component,\n Host,\n h,\n State,\n Prop,\n getAssetPath,\n Method\n} from \"@stencil/core\";\nimport { mercuryChatMessageRender } from \"../../components/chat/code-render\";\n\nimport { MercuryBundles } from \"@genexus/mercury\";\n\nconst AI_AVATAR = getAssetPath(\n `./gx-ide-assets/chat-welcome/images/ai-avatar.svg`\n);\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"utils/elevation\",\n \"components/chat\"\n];\n\nimport {\n chatCallbacksWithChatRef,\n chatTranslations,\n codeFixerRecord\n} from \"./callbacks\";\nimport {\n ChatMessage,\n ChatInternalCallbacks\n} from \"@genexus/chameleon-controls-library\";\nimport { ChatMessageUser } from \"@genexus/chameleon-controls-library/dist/types/components/chat/types\";\n\n@Component({\n tag: \"gx-ide-sc-chat-container\",\n styleUrl: \"chat-showcase.scss\",\n shadow: true\n})\nexport class GxIdeScChatContainer {\n #chatContainerRef!: HTMLGxIdeChatContainerElement;\n #chatWelcomeRef!: HTMLGxIdeChatWelcomeElement;\n #chChatRef!: HTMLChChatElement;\n #chatCallbacks: ChatInternalCallbacks;\n\n /**\n * If true, the chat items length will be 0, since this is a requirement for dipslaying the ch-chat\n * \"empty-chat\" slot that welcome screen uses to display.\n */\n @Prop() readonly mode: \"welcome\" | \"messages-sample\" | \"empty\" =\n \"messages-sample\";\n\n @State() generatingResponse: boolean = false;\n @State() loadingState:\n | \"all-records-loaded\"\n | \"initial\"\n | \"loading\"\n | \"more-data-to-fetch\" = \"all-records-loaded\";\n @State() showAdditionalContent: boolean = false;\n @State() conversationCopied: boolean = false;\n @State() assistantStatus: string = \"Getting Data\";\n @State() chatItems: ChatMessage[] = [];\n\n /**\n * It will exit the wellcome screen and remove it from the dom.\n */\n @Method()\n async exitWelcome() {\n // hand exitWelcome to gx-ide-chat-welcome\n this.#chatWelcomeRef.exitWelcome();\n }\n\n #copyConversationCallbackHandler = () => {\n this.#chatContainerRef.showCopyConversationMessage();\n };\n\n #deleteConversationCallbackHandler = () => {};\n\n componentDidLoad() {\n setTimeout(() => {\n this.assistantStatus = \"Creating Data Base..\";\n }, 1000);\n }\n\n componentDidRender() {\n if (!this.#chatCallbacks && this.#chChatRef) {\n this.#chatCallbacks = chatCallbacksWithChatRef(this.#chChatRef);\n }\n }\n\n async componentWillLoad() {\n if (this.mode === \"messages-sample\") {\n this.chatItems = codeFixerRecord;\n } else if (this.mode === \"welcome\") {\n this.chatItems = [];\n } else if (this.mode === \"empty\") {\n this.chatItems = [\n {\n id: \"1\",\n role: \"assistant\",\n status: \"complete\",\n content: \"Hello! I am your assistant.\",\n metadata: \"14:56\"\n }\n ];\n }\n }\n #suggestedPrompRequestedCallbackHandler = async (\n prompt: string\n ): Promise<void> => {\n let assistantFinalResponse: string;\n if (prompt.toLowerCase().includes(\"transaction\")) {\n assistantFinalResponse =\n 'To create a transaction in GeneXus, start by opening your KB (Knowledge Base) and selecting \"Transaction\" from the \"New Object\" options. Give it a name and define its attributes, starting with a primary key followed by the related data fields. GeneXus will automatically infer the data structure and relationships based on how you define the attributes and their nesting. Once saved, it generates the necessary database tables and forms for inserting, updating, and deleting records. You can then run the application to test the transaction directly in your browser.';\n } else if (prompt.toLowerCase().includes(\"entity\")) {\n assistantFinalResponse =\n 'In GeneXus, creating an entity usually means defining a Transaction object that represents a real-world concept like \"Customer\" or \"Product.\" To do this, create a new Transaction, name it after the entity, and define its attributes—starting with a unique identifier (like CustomerId) and then adding other fields (like CustomerName, CustomerEmail). GeneXus treats this Transaction as an entity and uses it to generate the corresponding table and interface automatically.';\n } else {\n assistantFinalResponse =\n \"Sorry, I didn’t catch that—mind rephrasing it? 😅\";\n }\n\n const userPrompt: ChatMessageUser = {\n id: \"1\",\n role: \"user\",\n content: prompt\n };\n this.#chChatRef.addNewMessage(userPrompt);\n setTimeout(() => {\n this.#chChatRef.addNewMessage({\n id: `${new Date().getTime()}`,\n role: \"assistant\",\n content: \"Analyzing\",\n status: \"waiting\"\n });\n setTimeout(() => {\n this.#chChatRef.updateLastMessage(\n {\n role: \"assistant\",\n content: \"Processing with Chat with LLMs\",\n status: \"waiting\"\n },\n \"replace\"\n );\n setTimeout(() => {\n this.#chChatRef.updateLastMessage(\n {\n role: \"assistant\",\n content: \"Getting information\",\n status: \"waiting\"\n },\n \"replace\"\n );\n this.#chChatRef.updateLastMessage(\n {\n role: \"assistant\",\n content: assistantFinalResponse,\n status: \"complete\"\n },\n \"replace\"\n );\n }, 1500);\n }, 1500);\n }, 100);\n };\n\n render() {\n return (\n <Host>\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <gx-ide-chat-container\n chatTitle=\"GeneXus Assistant\"\n copyConversationCallback={this.#copyConversationCallbackHandler}\n deleteConversationCallback={this.#deleteConversationCallbackHandler}\n ref={el =>\n (this.#chatContainerRef = el as HTMLGxIdeChatContainerElement)\n }\n class=\"elevation-1\"\n >\n <ch-chat\n callbacks={this.#chatCallbacks}\n class=\"chat\"\n generatingResponse={this.generatingResponse}\n loadingState={this.loadingState} // \"all-records-loaded\" to display the welcome screen\n renderItem={mercuryChatMessageRender(\n \"components/markdown-viewer\",\n AI_AVATAR,\n \"Nexa\"\n )}\n items={this.chatItems} // length 0 to display the welcome screen\n showAdditionalContent={this.showAdditionalContent}\n translations={chatTranslations}\n ref={el => (this.#chChatRef = el as HTMLChChatElement)}\n >\n <gx-ide-chat-welcome\n ref={el =>\n (this.#chatWelcomeRef = el as HTMLGxIdeChatWelcomeElement)\n }\n slot=\"empty-chat\"\n suggestedPrompRequestedCallback={\n this.#suggestedPrompRequestedCallbackHandler\n }\n suggestedPrompts={[\n \"I need to represente a product entity\",\n \"I want to create a Customer Tracking application. Can you help me with the architecture?\",\n \"I need to create a REST API for my application\"\n ]}\n ></gx-ide-chat-welcome>\n <div slot=\"additional-content\">\n Custom content that is rendered when the chat renders content\n </div>\n </ch-chat>\n </gx-ide-chat-container>\n </Host>\n );\n }\n}\n"],"mappings":"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"}
|