@genexus/genexus-ide-ui 1.1.31 → 1.1.33

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 (49) hide show
  1. package/dist/cjs/gx-ide-about.cjs.entry.js +1 -1
  2. package/dist/cjs/gx-ide-about.cjs.entry.js.map +1 -1
  3. package/dist/cjs/gx-ide-chat-container_2.cjs.entry.js +9 -2
  4. package/dist/cjs/gx-ide-chat-container_2.cjs.entry.js.map +1 -1
  5. package/dist/cjs/gx-ide-sc-chat-container.cjs.entry.js +2 -1
  6. package/dist/cjs/gx-ide-sc-chat-container.cjs.entry.js.map +1 -1
  7. package/dist/cjs/gx-ide-sign-in-team.cjs.entry.js +1 -1
  8. package/dist/cjs/gx-ide-sign-in-team.cjs.entry.js.map +1 -1
  9. package/dist/collection/components/about/about.css +0 -1
  10. package/dist/collection/components/chat/chat-container/chat-container.js +10 -2
  11. package/dist/collection/components/chat/chat-container/chat-container.js.map +1 -1
  12. package/dist/collection/components/chat/chat-container/gx-ide-assets/chat-container/chat-lit.css +376 -0
  13. package/dist/collection/components/chat/chat-welcome/chat-welcome.js +0 -1
  14. package/dist/collection/components/chat/chat-welcome/chat-welcome.js.map +1 -1
  15. package/dist/collection/components/sign-in-team/sign-in-team.css +1 -2
  16. package/dist/collection/showcase/chat-container/chat.showcase.js +2 -1
  17. package/dist/collection/showcase/chat-container/chat.showcase.js.map +1 -1
  18. package/dist/components/chat-container.js +10 -2
  19. package/dist/components/chat-container.js.map +1 -1
  20. package/dist/components/chat-welcome.js +0 -1
  21. package/dist/components/chat-welcome.js.map +1 -1
  22. package/dist/components/gx-ide-about.js +1 -1
  23. package/dist/components/gx-ide-about.js.map +1 -1
  24. package/dist/components/gx-ide-sc-chat-container.js +2 -1
  25. package/dist/components/gx-ide-sc-chat-container.js.map +1 -1
  26. package/dist/components/gx-ide-sign-in-team.js +1 -1
  27. package/dist/components/gx-ide-sign-in-team.js.map +1 -1
  28. package/dist/esm/gx-ide-about.entry.js +1 -1
  29. package/dist/esm/gx-ide-about.entry.js.map +1 -1
  30. package/dist/esm/gx-ide-chat-container_2.entry.js +10 -3
  31. package/dist/esm/gx-ide-chat-container_2.entry.js.map +1 -1
  32. package/dist/esm/gx-ide-sc-chat-container.entry.js +2 -1
  33. package/dist/esm/gx-ide-sc-chat-container.entry.js.map +1 -1
  34. package/dist/esm/gx-ide-sign-in-team.entry.js +1 -1
  35. package/dist/esm/gx-ide-sign-in-team.entry.js.map +1 -1
  36. package/dist/genexus-ide-ui/genexus-ide-ui.esm.js +1 -1
  37. package/dist/genexus-ide-ui/gx-ide-assets/chat-container/chat-lit.css +376 -0
  38. package/dist/genexus-ide-ui/{p-c3e410cc.entry.js → p-04308eaa.entry.js} +2 -2
  39. package/dist/genexus-ide-ui/p-04308eaa.entry.js.map +1 -0
  40. package/dist/genexus-ide-ui/{p-61343e93.entry.js → p-203f0417.entry.js} +8 -8
  41. package/dist/genexus-ide-ui/p-203f0417.entry.js.map +1 -0
  42. package/dist/genexus-ide-ui/{p-137130ad.entry.js → p-8d6f2b4f.entry.js} +4 -2
  43. package/dist/genexus-ide-ui/{p-137130ad.entry.js.map → p-8d6f2b4f.entry.js.map} +1 -1
  44. package/dist/genexus-ide-ui/{p-1477d49a.entry.js → p-9270c80f.entry.js} +102 -90
  45. package/dist/genexus-ide-ui/p-9270c80f.entry.js.map +1 -0
  46. package/package.json +3 -3
  47. package/dist/genexus-ide-ui/p-1477d49a.entry.js.map +0 -1
  48. package/dist/genexus-ide-ui/p-61343e93.entry.js.map +0 -1
  49. package/dist/genexus-ide-ui/p-c3e410cc.entry.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { r as t, h as e, H as a, a as i, g as s } from "./p-97107ecc.js";
1
+ import { g as t, r as e, h as a, H as i, a as s } from "./p-97107ecc.js";
2
2
 
3
3
  import { g as n } from "./p-401bfc97.js";
4
4
 
@@ -21,34 +21,44 @@ var l = undefined && undefined.__classPrivateFieldGet || function(t, e, a, i) {
21
21
 
22
22
  var d, p, h, m, u, f;
23
23
 
24
- const g = [ "resets/box-sizing", "utils/typography", "chameleon/scrollbar", "components/button", "components/dropdown", "components/icon", "utils/elevation" ];
24
+ // TODO: Remove this once update chat bundle for lit is ready
25
+ // on a new Mercury version
26
+ const g = t(`./gx-ide-assets/chat-container/chat-lit.css`);
25
27
 
26
- const y = n({
28
+ const y = [ "resets/box-sizing", "utils/typography", "chameleon/scrollbar", "components/button", "components/dropdown", "components/icon", "utils/elevation" ];
29
+
30
+ const b = {
31
+ // styleSheet: chatListCss,
32
+ url: g,
33
+ name: "components/chat-lit"
34
+ };
35
+
36
+ const w = n({
27
37
  category: "system",
28
38
  name: "copy",
29
39
  colorType: "primary"
30
40
  });
31
41
 
32
- const b = n({
42
+ const v = n({
33
43
  category: "system",
34
44
  name: "delete-outlined",
35
45
  colorType: "primary"
36
46
  });
37
47
 
38
- const w = n({
48
+ const x = n({
39
49
  category: "objects",
40
50
  name: "conversational-flows"
41
51
  });
42
52
 
43
- const v = n({
53
+ const _ = n({
44
54
  category: "system",
45
55
  name: "more-horizontal",
46
56
  colorType: "neutral"
47
57
  });
48
58
 
49
- const x = class {
50
- constructor(e) {
51
- t(this, e);
59
+ const k = class {
60
+ constructor(t) {
61
+ e(this, t);
52
62
  d.set(this, [ {
53
63
  type: "slot",
54
64
  id: "delete-chat-button"
@@ -99,64 +109,66 @@ const x = class {
99
109
  }
100
110
  render() {
101
111
  const t = this.chatTitle || this.copyConversationCallback || this.deleteConversationCallback;
102
- const i = this.copyConversationCallback || this.deleteConversationCallback;
103
- return e(a, {
112
+ const e = this.copyConversationCallback || this.deleteConversationCallback;
113
+ return a(i, {
104
114
  class: {
105
115
  "chat-container": true,
106
116
  "with-header": !!t
107
117
  }
108
- }, e("ch-theme", {
109
- model: g
110
- }), e("section", {
118
+ }, a("ch-theme", {
119
+ model: y
120
+ }), a("ch-theme", {
121
+ model: b
122
+ }), a("section", {
111
123
  class: "section"
112
- }, t && e("header", {
124
+ }, t && a("header", {
113
125
  class: "header tiny-semi-bold-l"
114
- }, this.chatTitle && this.chatTitle, i && e("ch-action-menu-render", {
126
+ }, this.chatTitle && this.chatTitle, e && a("ch-action-menu-render", {
115
127
  class: "dropdown",
116
128
  blockAlign: "inside-start",
117
129
  inlineAlign: "inside-end",
118
130
  model: l(this, d, "f"),
119
131
  expanded: this.menuIsExpanded,
120
132
  onExpandedChange: l(this, m, "f")
121
- }, e("button", {
133
+ }, a("button", {
122
134
  class: "button-tertiary button-icon-only",
123
135
  onClick: l(this, h, "f"),
124
136
  type: "button",
125
137
  "aria-label": l(this, p, "f").showMenuAriaLabel,
126
138
  title: l(this, p, "f").showMenuAriaLabel
127
- }, e("ch-image", {
139
+ }, a("ch-image", {
128
140
  class: "icon-md",
129
- src: v
130
- })), this.copyConversationCallback && e("button", {
141
+ src: _
142
+ })), this.copyConversationCallback && a("button", {
131
143
  class: "button-tertiary button-icon-and-text button-copy-chat",
132
144
  slot: "copy-chat-button",
133
145
  onClick: l(this, u, "f"),
134
146
  type: "button",
135
147
  "aria-label": l(this, p, "f").copyConversationAriaLabel,
136
148
  title: l(this, p, "f").copyConversationAriaLabel
137
- }, e("ch-image", {
149
+ }, a("ch-image", {
138
150
  class: "icon-md",
139
- src: y
140
- }), l(this, p, "f").copyConversationLabel), this.deleteConversationCallback && e("button", {
151
+ src: w
152
+ }), l(this, p, "f").copyConversationLabel), this.deleteConversationCallback && a("button", {
141
153
  class: "button-tertiary button-icon-and-text button-delete-chat",
142
154
  slot: "delete-chat-button",
143
155
  onClick: l(this, f, "f"),
144
156
  type: "button",
145
157
  "aria-label": l(this, p, "f").deleteConversationAriaLabel,
146
158
  title: l(this, p, "f").deleteConversationAriaLabel
147
- }, e("ch-image", {
159
+ }, a("ch-image", {
148
160
  class: "icon-md",
149
- src: b
150
- }), l(this, p, "f").clearConversationLabel))), e("section", {
161
+ src: v
162
+ }), l(this, p, "f").clearConversationLabel))), a("section", {
151
163
  class: "ch-chat-container"
152
- }, e("slot", null), this.displayConversationCopiedMessage && e("div", {
164
+ }, a("slot", null), this.displayConversationCopiedMessage && a("div", {
153
165
  class: "chat-container__conversation-copied"
154
- }, e("div", {
166
+ }, a("div", {
155
167
  class: "chat-container__conversation-copied-wrapper"
156
- }, e("ch-image", {
168
+ }, a("ch-image", {
157
169
  class: "icon-md",
158
- src: w
159
- }), e("p", {
170
+ src: x
171
+ }), a("p", {
160
172
  class: "body-regular-l"
161
173
  }, "conversation copied"))))));
162
174
  }
@@ -164,81 +176,81 @@ const x = class {
164
176
  return [ "gx-ide-assets/chat-container" ];
165
177
  }
166
178
  get el() {
167
- return i(this);
179
+ return s(this);
168
180
  }
169
181
  };
170
182
 
171
183
  d = new WeakMap, p = new WeakMap, h = new WeakMap, m = new WeakMap, u = new WeakMap,
172
184
  f = new WeakMap;
173
185
 
174
- x.style = r;
186
+ k.style = r;
175
187
 
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)}}";
188
+ const z = ":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
189
 
178
- var k = undefined && undefined.__classPrivateFieldGet || function(t, e, a, i) {
190
+ var T = undefined && undefined.__classPrivateFieldGet || function(t, e, a, i) {
179
191
  if (a === "a" && !i) throw new TypeError("Private accessor was defined without a getter");
180
192
  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");
181
193
  return a === "m" ? i : a === "a" ? i.call(t) : i ? i.value : e.get(t);
182
194
  };
183
195
 
184
- var z = undefined && undefined.__classPrivateFieldSet || function(t, e, a, i, s) {
196
+ var W = undefined && undefined.__classPrivateFieldSet || function(t, e, a, i, s) {
185
197
  if (i === "m") throw new TypeError("Private method is not writable");
186
198
  if (i === "a" && !s) throw new TypeError("Private accessor was defined without a setter");
187
199
  if (typeof e === "function" ? t !== e || !s : !e.has(t)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
188
200
  return i === "a" ? s.call(t, a) : s ? s.value = a : e.set(t, a), a;
189
201
  };
190
202
 
191
- var T, W, j, C;
203
+ var j, C, E, M;
192
204
 
193
- const E = s(`./gx-ide-assets/chat-welcome/images/header-illustration.svg`);
205
+ const P = t(`./gx-ide-assets/chat-welcome/images/header-illustration.svg`);
194
206
 
195
- const M = s(`./gx-ide-assets/chat-welcome/images/ai-avatar-welcome.svg`);
207
+ const I = t(`./gx-ide-assets/chat-welcome/images/ai-avatar-welcome.svg`);
196
208
 
197
- const P = 100;
209
+ const $ = 100;
198
210
 
199
- const I = 500;
211
+ const X = 500;
200
212
 
201
- const $ = 200;
213
+ const D = 200;
202
214
 
203
- const X = 500;
215
+ const L = 500;
204
216
 
205
- const D = 100;
217
+ const A = 100;
206
218
 
207
- const L = n({
219
+ const B = n({
208
220
  category: "system",
209
221
  name: "assistant",
210
222
  colorType: "primary"
211
223
  });
212
224
 
213
- const A = n({
225
+ const S = n({
214
226
  category: "system",
215
227
  name: "arrow-right",
216
228
  colorType: "primary"
217
229
  });
218
230
 
219
- const B = [ "resets/box-sizing", "components/chat", "components/icon", "utils/typography" ];
231
+ const U = [ "resets/box-sizing", "components/icon", "utils/typography" ];
220
232
 
221
- const S = class {
222
- constructor(e) {
223
- t(this, e);
233
+ const Y = class {
234
+ constructor(t) {
235
+ e(this, t);
224
236
  // eslint-disable-next-line @stencil-community/own-props-must-be-private
225
- T.set(this, void 0);
226
- W.set(this, (() => {
237
+ j.set(this, void 0);
238
+ C.set(this, (() => {
227
239
  setTimeout((() => {
228
240
  this.showHeader = true;
229
241
  setTimeout((() => {
230
242
  this.showSuggestedPrompts = true;
231
- }), X);
232
- }), P + I);
243
+ }), L);
244
+ }), $ + X);
233
245
  }));
234
- j.set(this, (async t => {
246
+ E.set(this, (async t => {
235
247
  const e = t.currentTarget.dataset["prommpt"];
236
- await k(this, C, "f").call(this);
248
+ await T(this, M, "f").call(this);
237
249
  this.suggestedPrompRequestedCallback(e);
238
250
  }));
239
- C.set(this, (async () => {
251
+ M.set(this, (async () => {
240
252
  this.hideWelcome = true;
241
- await new Promise((t => setTimeout(t, D)));
253
+ await new Promise((t => setTimeout(t, A)));
242
254
  }));
243
255
  this.showHeader = false;
244
256
  this.showSuggestedPrompts = false;
@@ -249,76 +261,76 @@ const S = class {
249
261
  this.suggestedPrompRequestedCallback = undefined;
250
262
  }
251
263
  async componentWillLoad() {
252
- z(this, T, await o.getComponentStrings(this.el), "f");
264
+ W(this, j, await o.getComponentStrings(this.el), "f");
253
265
  // Set defaults
254
266
  if (!this.welcomeTitle) {
255
- this.welcomeTitle = k(this, T, "f").welcomeTitle;
267
+ this.welcomeTitle = T(this, j, "f").welcomeTitle;
256
268
  }
257
269
  if (!this.welcomeGreeting) {
258
- this.welcomeGreeting = k(this, T, "f").welcomeGreeting;
270
+ this.welcomeGreeting = T(this, j, "f").welcomeGreeting;
259
271
  }
260
272
  if (!this.suggestedPrompts) {
261
- this.suggestedPrompts = k(this, T, "f").suggestedPrompts;
273
+ this.suggestedPrompts = T(this, j, "f").suggestedPrompts;
262
274
  }
263
275
  }
264
276
  componentDidRender() {
265
277
  if (!this.hideWelcome) {
266
- k(this, W, "f").call(this);
278
+ T(this, C, "f").call(this);
267
279
  }
268
280
  }
269
281
  /**
270
282
  * It will exit the wellcome screen and remove it from the dom.
271
283
  */ async exitWelcome() {
272
- k(this, C, "f").call(this);
284
+ T(this, M, "f").call(this);
273
285
  }
274
286
  render() {
275
- return e(a, null, e("ch-theme", {
276
- model: B
277
- }), e("div", {
287
+ return a(i, null, a("ch-theme", {
288
+ model: U
289
+ }), a("div", {
278
290
  class: {
279
291
  "welcome-container": true,
280
292
  hidden: this.hideWelcome
281
293
  },
282
294
  style: {
283
- backgroundImage: `url(${E})`,
284
- "--transition-duration": `${D}ms`
295
+ backgroundImage: `url(${P})`,
296
+ "--transition-duration": `${A}ms`
285
297
  }
286
- }, e("header", {
298
+ }, a("header", {
287
299
  class: {
288
300
  header: true,
289
301
  "header--visible": this.showHeader
290
302
  },
291
303
  style: {
292
- "--transition-delay": `${P}ms`,
293
- "--transition-duration": `${I}ms`
304
+ "--transition-delay": `${$}ms`,
305
+ "--transition-duration": `${X}ms`
294
306
  }
295
- }, e("span", {
307
+ }, a("span", {
296
308
  class: "header__circle",
297
309
  style: {
298
- backgroundImage: `url(${M})`
310
+ backgroundImage: `url(${I})`
299
311
  }
300
- }), e("h2", {
312
+ }), a("h2", {
301
313
  class: "header__title"
302
- }, this.welcomeTitle), e("p", {
314
+ }, this.welcomeTitle), a("p", {
303
315
  class: "header__greeting"
304
- }, this.welcomeGreeting)), this.suggestedPrompts && this.showSuggestedPrompts && e("ul", {
316
+ }, this.welcomeGreeting)), this.suggestedPrompts && this.showSuggestedPrompts && a("ul", {
305
317
  class: "suggested-prompts"
306
- }, this.suggestedPrompts.map(((t, a) => e("li", {
318
+ }, this.suggestedPrompts.map(((t, e) => a("li", {
307
319
  class: "suggested-prompts__item"
308
- }, e("button", {
320
+ }, a("button", {
309
321
  class: {
310
322
  "suggested-prompts__button": true
311
323
  },
312
- onClick: k(this, j, "f"),
324
+ onClick: T(this, E, "f"),
313
325
  style: {
314
- "--delay": `${$ * a}ms`
326
+ "--delay": `${D * e}ms`
315
327
  },
316
328
  "data-prommpt": t
317
- }, e("ch-image", {
318
- src: L,
329
+ }, a("ch-image", {
330
+ src: B,
319
331
  class: "icon-md suggested-prompts__icon"
320
- }), t, e("ch-image", {
321
- src: A,
332
+ }), t, a("ch-image", {
333
+ src: S,
322
334
  class: "icon-md suggested-prompts__icon"
323
335
  }))))))));
324
336
  }
@@ -326,13 +338,13 @@ const S = class {
326
338
  return [ "gx-ide-assets/chat-welcome" ];
327
339
  }
328
340
  get el() {
329
- return i(this);
341
+ return s(this);
330
342
  }
331
343
  };
332
344
 
333
- T = new WeakMap, W = new WeakMap, j = new WeakMap, C = new WeakMap;
345
+ j = new WeakMap, C = new WeakMap, E = new WeakMap, M = new WeakMap;
334
346
 
335
- S.style = _;
347
+ Y.style = z;
336
348
 
337
- export { x as gx_ide_chat_container, S as gx_ide_chat_welcome };
338
- //# sourceMappingURL=p-1477d49a.entry.js.map
349
+ export { k as gx_ide_chat_container, Y as gx_ide_chat_welcome };
350
+ //# sourceMappingURL=p-9270c80f.entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["chatContainerCss","CHAT_LIT_PATH","getAssetPath","CSS_BUNDLES","CSS_BUNDLE_CHAT_LIT","url","name","COPY_ICON","getIconPath","category","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","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// 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:\n opacity 100ms ease-in-out,\n 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 getAssetPath\n} from \"@stencil/core\";\nimport { MercuryBundles, getIconPath } from \"@genexus/mercury\";\nimport { ActionMenuModel } from \"@genexus/chameleon-controls-library\";\n\nimport { Locale } from \"../../../common/locale\";\nimport { ThemeItemModel } from \"@genexus/chameleon-controls-library/dist/types/components/theme/theme-types\";\n\n// TODO: Remove this once update chat bundle for lit is ready\n// on a new Mercury version\nconst CHAT_LIT_PATH = getAssetPath(\n `./gx-ide-assets/chat-container/chat-lit.css`\n);\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];\nconst CSS_BUNDLE_CHAT_LIT: ThemeItemModel = {\n // styleSheet: chatListCss,\n url: CHAT_LIT_PATH,\n name: \"components/chat-lit\"\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 <ch-theme model={CSS_BUNDLE_CHAT_LIT}></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 { 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 = [\n \"resets/box-sizing\",\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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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@genexus/genexus-ide-ui",
3
3
  "license": "Apache-2.0",
4
- "version": "1.1.31",
4
+ "version": "1.1.33",
5
5
  "description": "GeneXus IDE UI components",
6
6
  "main": "dist/index.cjs.js",
7
7
  "module": "dist/index.js",
@@ -37,12 +37,12 @@
37
37
  "peerDependencies": {
38
38
  "@genexus/chameleon-controls-library": "~6.17.1",
39
39
  "@genexus/gemini": "*2.0.1",
40
- "@genexus/mercury": "0.26.1-next.0"
40
+ "@genexus/mercury": "0.28.6"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@genexus/chameleon-controls-library": "~6.17.1",
44
44
  "@genexus/gemini": "*2.0.1",
45
- "@genexus/mercury": "0.26.1-next.0",
45
+ "@genexus/mercury": "0.28.6",
46
46
  "@stencil-community/eslint-plugin": "~0.7.1",
47
47
  "@stencil/core": "~4.9.0",
48
48
  "@stencil/sass": "~1.4.0",
@@ -1 +0,0 @@
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// 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:\n opacity 100ms ease-in-out,\n 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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"}
@@ -1 +0,0 @@
1
- {"version":3,"names":["mapTeamsToComboBoxItemModel","teams","map","team","value","id","caption","name","signInTeamCss","COPYRIGHTS_ILLUSTRATION","getAssetPath","ICON_NEXT","CSS_BUNDLES","CHECKED_VALUE","GxIdeSignInTeam","_GxIdeSignInTeam_componentLocale","set","this","_GxIdeSignInTeam_userTeamsModel","_GxIdeSignInTeam_chSelectTeamEl","_GxIdeSignInTeam_switchStepTransitionTime","_GxIdeSignInTeam_termsAndConditionsCheckboxEl","_GxIdeSignInTeam_privacyPolicyCheckboxEl","_GxIdeSignInTeam_authStepCallback","authStep","signInCallback","__classPrivateFieldGet","_GxIdeSignInTeam_continueHandler","call","async","continueCallback","_GxIdeSignInTeam_renderStepHeader","h","class","src","alt","authStepInternal","titlePart1","titlePart2","_GxIdeSignInTeam_renderStepFooter","signInDisabled","termsConfirmationRequired","termsAndConditionsAccepted","onClick","disabled","buttonCaption","_GxIdeSignInTeam_evaluateTermsConditionsAndPrivacyAccepted","privacyPolicyAccepted","_GxIdeSignInTeam_termsAndConditionsClickedHandler","event","preventDefault","termsCallback","_GxIdeSignInTeam_privacyPolicyClickedHandler","privacyCallback","_GxIdeSignInTeam_evaluateStepRender","signIn","description","checkedValue","ref","el","__classPrivateFieldSet","onInput","htmlFor","agreement","termsAndConditionsLabel","hyperlink","termsAndConditionsLink","privacyAndPolicyLabel","privacyAndPolicyLink","loaderTitle","loader","fetchingTeamsTitle","settingUpSessionTitle","loaderDescription","fetchingTeamsDescription","settingUpDescription","show","selectUserTeam","infoMessage","label","accessibleName","model","_a","authStepChanged","newAuthStep","slideIsVisible","setTimeout","teamsChanged","newTeams","componentWillLoad","Locale","getComponentStrings","style","setProperty","toString","render","Host","slide__main"],"sources":["src/components/sign-in-team/helpers.ts","src/components/sign-in-team/sign-in-team.scss?tag=gx-ide-sign-in-team&encapsulation=shadow","src/components/sign-in-team/sign-in-team.tsx"],"sourcesContent":["import { ComboBoxItemModel } from \"@genexus/chameleon-controls-library/dist/types/components/combo-box/types\";\nimport { TeamData } from \"./sign-in-team\";\n\nexport const mapTeamsToComboBoxItemModel = (\n teams?: TeamData[]\n): ComboBoxItemModel[] | undefined => {\n if (!teams) {\n return [];\n }\n return teams.map(team => ({\n value: team.id,\n caption: team.name\n }));\n};\n",":host {\n display: grid;\n container-type: inline-size;\n container-name: host-container;\n block-size: 100%;\n inline-size: 100%;\n align-items: center;\n justify-content: center;\n padding: var(--mer-spacing--xl);\n}\n\n.slide {\n display: grid;\n grid-template-columns: 1fr 1fr;\n block-size: 100%;\n max-block-size: 700px;\n max-inline-size: 1100px;\n background-color: var(--mer-surface__elevation--01);\n border-radius: var(--mer-spacing--md);\n overflow: hidden;\n\n &__illustration {\n overflow: hidden;\n object-fit: cover;\n object-position: left;\n block-size: 100%;\n inline-size: 100%;\n }\n\n &__main {\n display: grid;\n block-size: 100%;\n inline-size: 100%;\n padding: var(--mer-spacing--3xl);\n transform: translateY(var(--mer-spacing--2xs));\n transition: var(--switch-step-transtion-time) all;\n opacity: 0;\n\n &--visible {\n transform: translateY(0);\n opacity: 1;\n }\n }\n\n &__main-container {\n display: grid;\n place-self: center;\n gap: var(--mer-spacing--lg);\n max-inline-size: 480px;\n }\n\n &__main-header {\n display: grid;\n gap: var(--mer-spacing--lg);\n }\n\n &__main-title {\n display: flex;\n flex-direction: column;\n font-size: var(--mer-font__size--xl);\n font-weight: var(--mer-font__weight--semi-bold);\n letter-spacing: 0.02em;\n color: var(--mer-text__on-surface);\n }\n\n &__main-description {\n display: grid;\n gap: var(--mer-spacing--2xl);\n font-size: var(--mer-font__size--sm);\n font-weight: var(--mer-font__weight--light);\n line-height: var(--mer-line-height--spaced);\n color: var(--mer-text__complementary);\n max-inline-size: 370px;\n }\n}\n\n.teams-list {\n inline-size: 100%;\n max-inline-size: 400px;\n}\n\n.main-btn {\n inline-size: 100%;\n max-inline-size: 124px;\n}\n\n@container host-container (max-width: 768px) {\n .slide {\n grid-template-columns: 1fr 2fr;\n }\n}\n\n@container host-container (max-width: 640px) {\n .slide {\n grid-template-columns: 1fr 5fr;\n }\n}\n\n// WA (this class should be defined on Mercury\n.hyperlink {\n text-decoration: underline;\n cursor: pointer;\n}\n// WA checkboxes labels should not include margin-block-start when\n// placed inside a field-inline.\n.field-inline > .label-agreement {\n margin-block-start: 0 !important;\n}\n","// Stencil\nimport {\n Component,\n Host,\n h,\n Prop,\n State,\n Watch,\n Element,\n getAssetPath\n} from \"@stencil/core\";\n// Other Libraries\nimport { MercuryBundles } from \"@genexus/mercury\";\nimport { ComboBoxItemModel } from \"@genexus/chameleon-controls-library/dist/types/components/combo-box/types\";\n// Custom Imports\nimport { Locale } from \"../../common/locale\";\nimport { mapTeamsToComboBoxItemModel } from \"./helpers\";\n\nconst COPYRIGHTS_ILLUSTRATION = getAssetPath(\n `./gx-ide-assets/welcome-page/images/copyrights-illustration.png`\n);\nconst ICON_NEXT = getAssetPath(\n `./gx-ide-assets/welcome-page/images/icon-next.svg`\n);\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"utils/typography\",\n \"components/button\",\n \"components/combo-box\",\n \"components/checkbox\",\n \"utils/form\"\n];\n\nconst CHECKED_VALUE = \"on\";\n\n@Component({\n tag: \"gx-ide-sign-in-team\",\n styleUrl: \"sign-in-team.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/sign-in-team\"]\n})\nexport class GxIdeSignInTeam {\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 // Select User Team References :\n #userTeamsModel: ComboBoxItemModel[] = [];\n #chSelectTeamEl: HTMLChComboBoxRenderElement;\n #switchStepTransitionTime: number = 100;\n #termsAndConditionsCheckboxEl!: HTMLChCheckboxElement;\n #privacyPolicyCheckboxEl!: HTMLChCheckboxElement;\n\n @Element() el: HTMLGxIdeSignInTeamElement;\n\n /**\n * This is a handover from \"authStep\" that allows updating descriptions once\n * the slide is hidden. This enables a smooth transition between descriptions.\n */\n\n @State() authStepInternal: AuthStep;\n\n /**\n * Defines if the main slide is visible or not. Used for smooth transitions\n * between slides.\n */\n @State() slideIsVisible: boolean = true;\n\n /**\n * True if terms and conditions are accepted.\n */\n @State() termsAndConditionsAccepted: boolean = false;\n\n /**\n * The authentication step to display\n */\n @Prop() readonly authStep: AuthStep = \"signIn\";\n @Watch(\"authStep\")\n authStepChanged(newAuthStep: AuthStep) {\n this.slideIsVisible = false;\n // switch step\n setTimeout(() => {\n this.authStepInternal = newAuthStep;\n }, this.#switchStepTransitionTime);\n // show slide\n setTimeout(() => {\n this.slideIsVisible = true;\n }, this.#switchStepTransitionTime * 2);\n }\n\n /**\n * Callback executed when the user clicks the 'Continue' button\n */\n @Prop() readonly continueCallback!: (teamId: string) => Promise<void>;\n\n /**\n * Callback executed when the user click the \"Sign In\" button\n */\n @Prop() readonly signInCallback!: () => Promise<void>;\n\n /**\n * When true, it will diplay checkboxes for the user to confirm terms and conditions\n */\n @Prop() readonly termsConfirmationRequired: boolean = false;\n\n /**\n * Array that contains the user's teams\n */\n @Prop() readonly teams!: TeamData[];\n @Watch(\"teams\")\n teamsChanged(newTeams: TeamData[]) {\n this.#userTeamsModel = mapTeamsToComboBoxItemModel(newTeams);\n }\n\n /**\n * Callback executed when the user clicks on the \"term and conditions\" link\n */\n @Prop() readonly termsCallback: () => Promise<void>;\n\n /**\n * Callback executed when the user clicks on the \"privacy policy\" link\n */\n @Prop() readonly privacyCallback: () => Promise<void>;\n\n async componentWillLoad() {\n this.#componentLocale = await Locale.getComponentStrings(this.el);\n this.el.style.setProperty(\n \"--switch-step-transtion-time\",\n this.#switchStepTransitionTime.toString() + \"ms\"\n );\n // Initialize values\n this.authStepInternal = this.authStep;\n this.teamsChanged(this.teams);\n }\n\n #authStepCallback = () => {\n if (this.authStep === \"signIn\") {\n this.signInCallback();\n } else if (this.authStep === \"selectUserTeam\") {\n this.#continueHandler();\n }\n };\n\n #continueHandler = async () => {\n await this.continueCallback(this.#chSelectTeamEl.value);\n };\n\n #renderStepHeader = (): HTMLElement => {\n return (\n <header class=\"slide__main-header\">\n <img\n src={ICON_NEXT}\n alt=\"\" // decorative\n />\n <h2\n // Split the title into two spans for better styling\n class=\"slide__main-title\"\n >\n <span>{this.#componentLocale[this.authStepInternal].titlePart1}</span>\n <span>{this.#componentLocale[this.authStepInternal].titlePart2}</span>\n </h2>\n </header>\n );\n };\n\n #renderStepFooter = (): HTMLElement => {\n const signInDisabled =\n this.authStep === \"signIn\" &&\n this.termsConfirmationRequired &&\n !this.termsAndConditionsAccepted;\n return (\n <div>\n <button\n class=\"button-primary main-btn\"\n onClick={this.#authStepCallback}\n disabled={signInDisabled}\n >\n {this.#componentLocale[this.authStepInternal].buttonCaption}\n </button>\n </div>\n );\n };\n\n #evaluateTermsConditionsAndPrivacyAccepted = () => {\n const termsAndConditionsAccepted =\n this.#termsAndConditionsCheckboxEl.value === CHECKED_VALUE;\n const privacyPolicyAccepted =\n this.#privacyPolicyCheckboxEl.value === CHECKED_VALUE;\n this.termsAndConditionsAccepted =\n termsAndConditionsAccepted && privacyPolicyAccepted;\n };\n\n #termsAndConditionsClickedHandler = (event: MouseEvent) => {\n event.preventDefault();\n this.termsCallback();\n };\n\n #privacyPolicyClickedHandler = (event: MouseEvent) => {\n event.preventDefault();\n this.privacyCallback();\n };\n\n #evaluateStepRender = () => {\n if (this.authStepInternal === \"signIn\") {\n return [\n this.#renderStepHeader(),\n <p class=\"body-regular-l\">\n {this.#componentLocale.signIn.description}\n </p>,\n this.termsConfirmationRequired && (\n <div class=\"field-group\">\n <div\n // terms and conditions\n class=\"field field-inline\"\n >\n <ch-checkbox\n checkedValue={CHECKED_VALUE}\n id=\"terms-and-conditions\"\n class=\"checkbox\"\n ref={(el: HTMLChCheckboxElement) =>\n (this.#termsAndConditionsCheckboxEl =\n el as HTMLChCheckboxElement)\n }\n onInput={this.#evaluateTermsConditionsAndPrivacyAccepted}\n ></ch-checkbox>\n <label\n htmlFor=\"terms-and-conditions\"\n class=\"label label-agreement\"\n >\n {this.#componentLocale.agreement.termsAndConditionsLabel}\n <span\n class={{ hyperlink: !!this.termsCallback }}\n onClick={\n this.termsCallback && this.#termsAndConditionsClickedHandler\n }\n >\n {this.#componentLocale.agreement.termsAndConditionsLink}\n </span>\n </label>\n </div>\n <div\n // privacy policy\n class=\"field field-inline\"\n >\n <ch-checkbox\n checkedValue={CHECKED_VALUE}\n id=\"privacy-policy\"\n class=\"checkbox\"\n ref={(el: HTMLChCheckboxElement) =>\n (this.#privacyPolicyCheckboxEl = el as HTMLChCheckboxElement)\n }\n onInput={this.#evaluateTermsConditionsAndPrivacyAccepted}\n ></ch-checkbox>\n <label htmlFor=\"privacy-policy\" class=\"label label-agreement\">\n {this.#componentLocale.agreement.privacyAndPolicyLabel}\n <span\n class={{ hyperlink: !!this.privacyCallback }}\n onClick={\n this.privacyCallback && this.#privacyPolicyClickedHandler\n }\n >\n {this.#componentLocale.agreement.privacyAndPolicyLink}\n </span>\n </label>\n </div>\n </div>\n ),\n\n this.#renderStepFooter()\n ];\n } else if (\n this.authStepInternal === \"fetchUserTeams\" ||\n this.authStepInternal === \"settingUpSession\"\n ) {\n const loaderTitle =\n this.authStepInternal === \"fetchUserTeams\"\n ? this.#componentLocale.loader.fetchingTeamsTitle\n : this.#componentLocale.loader.settingUpSessionTitle;\n const loaderDescription =\n this.authStepInternal === \"fetchUserTeams\"\n ? this.#componentLocale.loader.fetchingTeamsDescription\n : this.#componentLocale.loader.settingUpDescription;\n return (\n <gx-ide-loader\n show\n loaderTitle={loaderTitle}\n description={loaderDescription}\n ></gx-ide-loader>\n );\n } else if (this.authStepInternal === \"selectUserTeam\") {\n return [\n this.#renderStepHeader(),\n <div class=\"slide__select-team-description\">\n <p class=\"body-semi-bold-l\">\n {this.#componentLocale.selectUserTeam.infoMessage}\n </p>\n </div>,\n <div class=\"field-group\">\n <div class=\"field field-block\">\n <label htmlFor=\"teams\">\n {this.#componentLocale.selectUserTeam.label}\n </label>\n <ch-combo-box-render\n id=\"teams\"\n accessibleName=\"Teams\"\n class=\"combo-box teams-list\"\n model={this.#userTeamsModel}\n value={this.#userTeamsModel[0]?.value}\n ref={(el: HTMLChComboBoxRenderElement) =>\n (this.#chSelectTeamEl = el as HTMLChComboBoxRenderElement)\n }\n ></ch-combo-box-render>\n </div>\n </div>,\n this.#renderStepFooter()\n ];\n }\n };\n\n render() {\n return (\n <Host>\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <section class=\"slide\">\n <img\n src={COPYRIGHTS_ILLUSTRATION}\n class=\"slide__illustration\"\n alt=\"\" // decorative\n />\n\n <div\n class={{\n \"slide__main\": true,\n \"slide__main--visible\": this.slideIsVisible\n }}\n >\n <div class=\"slide__main-container\">\n {this.#evaluateStepRender()}\n </div>\n </div>\n </section>\n </Host>\n );\n }\n}\n\nexport type AuthStep =\n | \"signIn\"\n | \"fetchUserTeams\"\n | \"selectUserTeam\"\n | \"settingUpSession\";\n\nexport type TeamData = {\n id: string;\n name: string;\n};\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"names":["aboutCss","CSS_BUNDLES","GxIdeAbout","_GxIdeAbout_componentLocale","set","this","_GxIdeAbout_nextLogo","getAssetPath","_GxIdeAbout_copyVersionsHandler","copying","setTimeout","navigator","clipboard","writeText","__classPrivateFieldGet","copyVersionsAdditionalText","versions","map","version","join","componentWillLoad","__classPrivateFieldSet","Locale","getComponentStrings","el","render","renderPrivacyAndTerms","privacyPolicyCallback","termsAndConditionsCallback","renderPrivacyOrTerms","h","Host","class","model","src","alt","logoAlt","length","type","onClick","disabled","copied","copy","detailsCallback","detailsAndAcknowledgmentes","hidden","privacyPolicy","termsAndConditions","copyright"],"sources":["src/components/about/about.scss?tag=gx-ide-about&encapsulation=shadow","src/components/about/about.tsx"],"sourcesContent":["$versionsListPadding: 14px;\n\n:host {\n --spacing-body-block-start: var(--mer-spacing--lg);\n --spacing-body-block-end: var(--mer-spacing--lg);\n --spacing-body-inline-start: var(--mer-spacing--md);\n --spacing-body-inline-end: var(--mer-spacing--md);\n\n display: grid;\n inline-size: 100%;\n block-size: 100%;\n gap: var(--mer-spacing--md);\n overflow: auto;\n grid-template-rows: max-content 1fr max-content;\n background-color: var(\n --elevation-background-color,\n var(--mer-surface__elevation--02)\n );\n color: var(--mer-text__on-elevation);\n text-align: center;\n}\n.section {\n // section was addad for semantics, in order to allow a footer tag.\n display: contents;\n}\n\n.main {\n overflow: auto;\n display: grid;\n grid-template-rows: 1fr max-content;\n gap: var(--mer-spacing--lg);\n}\n\n.logo {\n &__container {\n display: flex;\n flex-direction: column;\n gap: var(--mer-spacing--sm);\n align-items: center;\n margin: unset;\n }\n &__img {\n $logoSize: 28px;\n inline-size: $logoSize;\n block-size: $logoSize;\n }\n}\n.logotype {\n color: var(--mer-text__bright);\n}\n\n.versions__container {\n overflow: hidden;\n border: var(--mer-border__width--sm) solid\n var(--mer-border-color__on-elevation--01);\n border-radius: var(--mer-border__radius--sm);\n display: grid;\n grid-template-rows: 1fr max-content;\n inline-size: 100%;\n\n button {\n justify-self: center;\n min-inline-size: 72px;\n }\n}\n.versions__container-footer {\n padding: $versionsListPadding;\n}\n\n.versions__list {\n overflow: auto;\n list-style: none;\n margin: 0;\n padding: $versionsListPadding;\n display: flex;\n flex-direction: column;\n gap: var(--mer-spacing--xs);\n text-align: start;\n}\n\n.link-underlined {\n // TODO: Add link helper class in Mercury\n text-decoration: underline;\n color: var(--mer-text__on-elevation);\n &:hover {\n color: var(--mer-text__highlighted);\n }\n &:active {\n color: var(--mer-text__elevation);\n }\n}\n\n.links-container {\n display: flex;\n gap: var(--mer-spacing--xs);\n}\n\n.footer {\n // TODO: Add color helper classes in Mercury\n display: flex;\n align-items: center;\n flex-direction: column;\n gap: var(--mer-spacing--xs);\n color: var(--mer-text__complementary);\n}\n","import {\n Component,\n Host,\n h,\n Prop,\n State,\n Element,\n getAssetPath\n} from \"@stencil/core\";\n\nimport { MercuryBundles } from \"@genexus/mercury\";\nimport { Locale } from \"../../common/locale\";\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"utils/typography\",\n \"utils/elevation\",\n \"components/button\",\n \"chameleon/scrollbar\"\n];\n\n@Component({\n tag: \"gx-ide-about\",\n styleUrl: \"about.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/about\"]\n})\nexport class GxIdeAbout {\n #componentLocale: any;\n #nextLogo = getAssetPath(`./gx-ide-assets/about/images/next-logo.svg`);\n\n @Element() el: HTMLGxIdeAboutElement;\n\n /**\n * GeneXus Next version, and also related dependencies versions\n */\n @Prop() readonly versions: string[] = [];\n\n /**\n * Callback invoked when the user clicks on \"Details & Acknowledgements\"\n */\n @Prop() readonly detailsCallback: DetailsCallback;\n\n /**\n * Callback invoked when the user clicks on \"Privacy policy\"\n */\n @Prop() readonly privacyPolicyCallback: PrivacyPolicyCallback;\n\n /**\n * Callback invoked when the user clicks on \"Terms and conditions\"\n */\n @Prop() readonly termsAndConditionsCallback: TermsAndConditionsCallback;\n\n /**\n * True when the user copies the versions\n */\n @State() copying: boolean = false;\n\n async componentWillLoad() {\n this.#componentLocale = await Locale.getComponentStrings(this.el);\n }\n\n #copyVersionsHandler = () => {\n this.copying = true;\n setTimeout(() => {\n this.copying = false;\n }, 1000);\n\n navigator.clipboard.writeText(\n `${this.#componentLocale.copyVersionsAdditionalText}${this.versions\n .map(version => `- ${version}`)\n .join(\"\\n\")}`\n );\n };\n\n render() {\n const renderPrivacyAndTerms =\n this.privacyPolicyCallback && this.termsAndConditionsCallback;\n const renderPrivacyOrTerms =\n this.privacyPolicyCallback || this.termsAndConditionsCallback;\n\n return (\n <Host class=\"scrollable\">\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <section class=\"section\">\n <header>\n <figure class=\"logo__container\">\n <img\n class=\"logo__img\"\n src={this.#nextLogo}\n alt={this.#componentLocale.logoAlt}\n />\n <figcaption class=\"body-semi-bold-m logotype\">\n GeneXus Next\n </figcaption>\n </figure>\n </header>\n <div class=\"main\">\n {this.versions.length ? (\n <div class=\"versions__container elevation-1\">\n <ul class=\"versions__list scrollable\">\n {this.versions.map(version => {\n return <li class=\"body-regular-s\">{version}</li>;\n })}\n </ul>\n <div class=\"versions__container-footer\">\n <button\n class=\"button-secondary\"\n type=\"button\"\n onClick={this.#copyVersionsHandler}\n disabled={this.copying}\n >\n {this.copying\n ? this.#componentLocale.copied\n : this.#componentLocale.copy}\n {}\n </button>\n </div>\n </div>\n ) : null}\n\n {this.detailsCallback && (\n <button\n class=\"button-tertiary\"\n type=\"button\"\n onClick={this.detailsCallback}\n >\n {this.#componentLocale.detailsAndAcknowledgmentes}\n </button>\n )}\n </div>\n\n <footer class=\"body-regular-s footer\">\n {renderPrivacyOrTerms && (\n <div class=\"links-container\" hidden={!renderPrivacyAndTerms}>\n {this.privacyPolicyCallback && (\n <button\n class=\"link-underlined tiny-regular-s\"\n type=\"button\"\n onClick={this.privacyPolicyCallback}\n >\n {this.#componentLocale.privacyPolicy}\n </button>\n )}\n\n {renderPrivacyAndTerms && \"|\"}\n\n {this.termsAndConditionsCallback && (\n <button\n class=\"link-underlined tiny-regular-s\"\n type=\"button\"\n onClick={this.termsAndConditionsCallback}\n >\n {this.#componentLocale.termsAndConditions}\n </button>\n )}\n </div>\n )}\n {this.#componentLocale.copyright}\n </footer>\n </section>\n </Host>\n );\n }\n}\n\nexport type DetailsCallback = () => Promise<void>;\nexport type PrivacyPolicyCallback = () => Promise<void>;\nexport type TermsAndConditionsCallback = () => Promise<void>;\n"],"mappings":";;;;AAAA,MAAMA,IAAW;;;;;;;;;;;;;;;;;ACajB,MAAMC,IAA8B,EAClC,qBACA,oBACA,mBACA,qBACA;;MASWC,IAAU;;;IACrBC,EAAAC,IAAAC,WAAA;IACAC,EAAAF,IAAAC,MAAYE,EAAa;IAiCzBC,EAAAJ,IAAAC,OAAuB;MACrBA,KAAKI,UAAU;MACfC,YAAW;QACTL,KAAKI,UAAU;AAAK,UACnB;MAEHE,UAAUC,UAAUC,UAClB,GAAGC,EAAAT,MAAIF,GAAA,KAAkBY,6BAA6BV,KAAKW,SACxDC,KAAIC,KAAW,KAAKA,MACpBC,KAAK;AACT;oBApCmC;;;;mBAoBV;;EAE5B,uBAAMC;IACJC,EAAAhB,MAAIF,SAA0BmB,EAAOC,oBAAoBlB,KAAKmB,KAAG;;EAgBnE,MAAAC;IACE,MAAMC,IACJrB,KAAKsB,yBAAyBtB,KAAKuB;IACrC,MAAMC,IACJxB,KAAKsB,yBAAyBtB,KAAKuB;IAErC,OACEE,EAACC,GAAI;MAACC,OAAM;OACVF,EAAA;MAAUG,OAAOhC;QACjB6B,EAAA;MAASE,OAAM;OACbF,EAAA,gBACEA,EAAA;MAAQE,OAAM;OACZF,EAAA;MACEE,OAAM;MACNE,KAAKpB,EAAAT,MAAIC,GAAA;MACT6B,KAAKrB,EAAAT,MAAIF,GAAA,KAAkBiC;QAE7BN,EAAA;MAAYE,OAAM;OAA2B,mBAKjDF,EAAA;MAAKE,OAAM;OACR3B,KAAKW,SAASqB,SACbP,EAAA;MAAKE,OAAM;OACTF,EAAA;MAAIE,OAAM;OACP3B,KAAKW,SAASC,KAAIC,KACVY,EAAA;MAAIE,OAAM;OAAkBd,OAGvCY,EAAA;MAAKE,OAAM;OACTF,EAAA;MACEE,OAAM;MACNM,MAAK;MACLC,SAASzB,EAAAT,MAAIG,GAAA;MACbgC,UAAUnC,KAAKI;OAEdJ,KAAKI,UACFK,EAAAT,MAAIF,GAAA,KAAkBsC,SACtB3B,EAAAT,MAAIF,GAAA,KAAkBuC,UAK9B,MAEHrC,KAAKsC,mBACJb,EAAA;MACEE,OAAM;MACNM,MAAK;MACLC,SAASlC,KAAKsC;OAEb7B,EAAAT,MAAIF,GAAA,KAAkByC,8BAK7Bd,EAAA;MAAQE,OAAM;OACXH,KACCC,EAAA;MAAKE,OAAM;MAAkBa,SAASnB;OACnCrB,KAAKsB,yBACJG,EAAA;MACEE,OAAM;MACNM,MAAK;MACLC,SAASlC,KAAKsB;OAEbb,EAAAT,MAAIF,GAAA,KAAkB2C,gBAI1BpB,KAAyB,KAEzBrB,KAAKuB,8BACJE,EAAA;MACEE,OAAM;MACNM,MAAK;MACLC,SAASlC,KAAKuB;OAEbd,EAAAT,MAAIF,GAAA,KAAkB4C,sBAK9BjC,EAAAT,MAAIF,GAAA,KAAkB6C"}