@genexus/genexus-ide-ui 1.0.23 → 1.0.24
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/gx-ide-ai-assistant.cjs.entry.js +4 -3
- package/dist/cjs/gx-ide-ai-assistant.cjs.entry.js.map +1 -1
- package/dist/cjs/gx-ide-ai-message.cjs.entry.js +10 -28
- package/dist/cjs/gx-ide-ai-message.cjs.entry.js.map +1 -1
- package/dist/cjs/gx-ide-welcome-page.cjs.entry.js +2 -2
- package/dist/cjs/gx-ide-welcome-page.cjs.entry.js.map +1 -1
- package/dist/collection/components/ai-assistant/ai-assistant.css +2 -2
- package/dist/collection/components/ai-assistant/ai-assistant.js +3 -2
- package/dist/collection/components/ai-assistant/ai-assistant.js.map +1 -1
- package/dist/collection/components/ai-assistant/ai-message.css +38 -13
- package/dist/collection/components/ai-assistant/ai-message.js +11 -27
- package/dist/collection/components/ai-assistant/ai-message.js.map +1 -1
- package/dist/collection/components/ai-assistant/gx-ide-assets/ai-assistant/langs/ai-assistant.lang.en.json +1 -0
- package/dist/collection/components/ai-assistant/gx-ide-assets/ai-assistant/langs/ai-assistant.lang.ja.json +2 -1
- package/dist/collection/components/ai-assistant/gx-ide-assets/ai-message/langs/ai-message.lang.en.json +4 -0
- package/dist/collection/components/ai-assistant/gx-ide-assets/ai-message/langs/ai-message.lang.ja.json +3 -0
- package/dist/collection/components/ai-assistant/gx-ide-assets/ai-message/langs/ai-message.lang.zh.json +3 -0
- package/dist/collection/components/welcome-page/welcome-page.css +2 -16
- package/dist/collection/components/welcome-page/welcome-page.js +1 -1
- package/dist/collection/components/welcome-page/welcome-page.js.map +1 -1
- package/dist/components/ai-message.js +10 -28
- package/dist/components/ai-message.js.map +1 -1
- package/dist/components/gx-ide-ai-assistant.js +4 -3
- package/dist/components/gx-ide-ai-assistant.js.map +1 -1
- package/dist/components/gx-ide-welcome-page.js +2 -2
- package/dist/components/gx-ide-welcome-page.js.map +1 -1
- package/dist/esm/gx-ide-ai-assistant.entry.js +4 -3
- package/dist/esm/gx-ide-ai-assistant.entry.js.map +1 -1
- package/dist/esm/gx-ide-ai-message.entry.js +10 -28
- package/dist/esm/gx-ide-ai-message.entry.js.map +1 -1
- package/dist/esm/gx-ide-welcome-page.entry.js +2 -2
- package/dist/esm/gx-ide-welcome-page.entry.js.map +1 -1
- package/dist/genexus-ide-ui/genexus-ide-ui.esm.js +1 -1
- package/dist/genexus-ide-ui/gx-ide-assets/ai-assistant/langs/ai-assistant.lang.en.json +1 -0
- package/dist/genexus-ide-ui/gx-ide-assets/ai-assistant/langs/ai-assistant.lang.ja.json +2 -1
- package/dist/genexus-ide-ui/gx-ide-assets/ai-message/langs/ai-message.lang.en.json +4 -0
- package/dist/genexus-ide-ui/gx-ide-assets/ai-message/langs/ai-message.lang.ja.json +3 -0
- package/dist/genexus-ide-ui/gx-ide-assets/ai-message/langs/ai-message.lang.zh.json +3 -0
- package/dist/genexus-ide-ui/{p-7a2d3f1c.entry.js → p-10beeb25.entry.js} +32 -30
- package/dist/genexus-ide-ui/p-10beeb25.entry.js.map +1 -0
- package/dist/genexus-ide-ui/p-673480ac.entry.js +88 -0
- package/dist/genexus-ide-ui/p-673480ac.entry.js.map +1 -0
- package/dist/genexus-ide-ui/{p-26b2037d.entry.js → p-9e810ad5.entry.js} +5 -4
- package/dist/genexus-ide-ui/p-9e810ad5.entry.js.map +1 -0
- package/dist/types/components/ai-assistant/ai-message.d.ts +1 -1
- package/dist/types/components/welcome-page/welcome-page.d.ts +4 -1
- package/package.json +3 -3
- package/dist/genexus-ide-ui/p-26b2037d.entry.js.map +0 -1
- package/dist/genexus-ide-ui/p-5dfb7c66.entry.js +0 -106
- package/dist/genexus-ide-ui/p-5dfb7c66.entry.js.map +0 -1
- package/dist/genexus-ide-ui/p-7a2d3f1c.entry.js.map +0 -1
|
@@ -920,7 +920,7 @@ FORM ELEMENTS
|
|
|
920
920
|
|
|
921
921
|
.gx-ide-main-wrapper {
|
|
922
922
|
padding: 0 10px 52px 10px;
|
|
923
|
-
background-color: var(--mer-
|
|
923
|
+
background-color: var(--mer-surface);
|
|
924
924
|
height: 100%;
|
|
925
925
|
display: grid;
|
|
926
926
|
grid-template-rows: auto 1fr auto;
|
|
@@ -1004,10 +1004,10 @@ FORM ELEMENTS
|
|
|
1004
1004
|
}
|
|
1005
1005
|
.prompt__textarea::part(textarea-wrapper) {
|
|
1006
1006
|
border: none;
|
|
1007
|
-
background-color: var(--mer-color__neutral-gray--1100);
|
|
1008
1007
|
}
|
|
1009
1008
|
.prompt__textarea::part(textarea) {
|
|
1010
1009
|
border: none;
|
|
1010
|
+
background-color: var(--mer-color__neutral-gray--800);
|
|
1011
1011
|
}
|
|
1012
1012
|
.prompt__shortcuts {
|
|
1013
1013
|
position: absolute;
|
|
@@ -200,7 +200,7 @@ export class GxIdeTemplate {
|
|
|
200
200
|
/* Doesn't seems to work without the setTimeout */
|
|
201
201
|
this.textAreaEl.focus();
|
|
202
202
|
this.setFocus = false;
|
|
203
|
-
},
|
|
203
|
+
}, 50);
|
|
204
204
|
}
|
|
205
205
|
setTimeout(() => {
|
|
206
206
|
this.scrollToBottom();
|
|
@@ -246,7 +246,8 @@ export class GxIdeTemplate {
|
|
|
246
246
|
"header__second-row": true,
|
|
247
247
|
"header__second-row--visible": this.showFilter
|
|
248
248
|
} }, h("div", { class: "filter-inner-wrapper" }, h("gxg-form-text", { class: "header__filter", onInput: this.filterMessagesHandler, ref: el => (this.filterEl = el) })))) : null), h("div", { class: {
|
|
249
|
-
"messages-wrapper": true
|
|
249
|
+
"messages-wrapper": true,
|
|
250
|
+
"scrollable": true
|
|
250
251
|
}, ref: el => (this.messagesWrapperEl = el) }, ((_a = this.messages) === null || _a === void 0 ? void 0 : _a.length) ? (h("ol", { class: { messages: true } }, this.messages.map((message, i) => {
|
|
251
252
|
return this.renderMessage(message, i);
|
|
252
253
|
}))) : null), h("div", { class: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-assistant.js","sourceRoot":"","sources":["../../../src/components/ai-assistant/ai-assistant.tsx"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,OAAO,EACL,SAAS,EACT,IAAI,EACJ,CAAC,EACD,IAAI,EACJ,KAAK,EAEL,OAAO,EACP,MAAM,EACN,KAAK,EACL,KAAK,EACL,MAAM,EACP,MAAM,eAAe,CAAC;AACvB,6BAA6B;AAC7B,oBAAoB;AACpB,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAQ7C,MAAM,OAAO,aAAa;;QAOhB,sBAAiB,GAAG,KAAK,CAAC;QAG1B,aAAQ,GAAG,IAAI,CAAC;QAChB,uBAAkB,GAAG,IAAI,CAAC;QAwKlC,qBAAqB;QAEb,yBAAoB,GAAG,GAAG,EAAE;;YAClC,IACE,CAAA,MAAA,IAAI,CAAC,QAAQ,0CAAE,MAAM,IAAG,CAAC;gBACzB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,uBAAuB,EACxE;gBACA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;aAC1B;iBAAM;gBACL,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;aAC3B;QACH,CAAC,CAAC;QAEM,qBAAgB,GAAG,GAAG,EAAE;;YAC9B,IAAI,CAAA,MAAA,IAAI,CAAC,QAAQ,0CAAE,MAAM,MAAK,CAAC,EAAE;gBAC/B,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;gBACvC,OAAO;aACR;YACD,IACE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI;gBAC1C,uBAAuB;gBACzB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,EACvD;gBACA,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;aACxC;iBAAM,IACL,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,iBAAiB,EAClE;gBACA,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC;aAChC;iBAAM;gBACL,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;aAClC;QACH,CAAC,CAAC;QAEM,kBAAa,GAAG,CACtB,OAAgB,EAChB,CAAS,EACa,EAAE;YACxB,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC3B,OAAO,CACL,yBACE,OAAO,EAAE,OAAO,CAAC,IAAI,EACrB,WAAW,EAAE,OAAO,CAAC,IAAI,EACzB,MAAM,EAAE,OAAO,CAAC,MAAM,EACtB,WAAW,EAAE,IAAI,CAAC,WAAW,EAC7B,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,OAAO,CAAC,IAAI,EAAE,EACtC,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,GAC1B,CACtB,CAAC;aACH;QACH,CAAC,CAAC;QAEM,yBAAoB,GAAG,GAAG,EAAE;YAClC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC;YACzB,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC,CAAC;QAEM,uBAAkB,GAAG,KAAK,EAAE,MAA2B,EAAE,EAAE;YACjE,gCAAgC;YAChC,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YACzD,oDAAoD;YACpD,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,aAAa,CAAC;YACtC,UAAU,CAAC,GAAG,EAAE;gBACd,uDAAuD;gBACvD,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;YAC5D,CAAC,EAAE,CAAC,CAAC,CAAC;YACN,4BAA4B;YAC5B,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC;YAC3B,6BAA6B;YAC7B,IAAI,CAAC,UAAU,CAAC;gBACd,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,aAAa;aACpB,CAAC,CAAC;YACH,uBAAuB;YACvB,IAAI,IAAI,CAAC,mBAAmB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;gBAClD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;oBAChD,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;gBAC5B,CAAC,CAAC,CAAC;aACJ;QACH,CAAC,CAAC;QAEM,0BAAqB,GAAG,CAAC,CAAsB,EAAE,EAAE;YACzD,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;YAChC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC1C,MAAM,gBAAgB,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC5C,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;gBACjC,IAAI,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;oBACzD,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC;iBACxB;qBAAM;oBACL,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;iBACvB;YACH,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,GAAG,gBAAgB,CAAC;QACnC,CAAC,CAAC;QAEM,kBAAa,GAAG,GAAG,EAAE;YAC3B,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;YACnB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACxB,IAAI,IAAI,CAAC,aAAa,EAAE;gBACtB,IAAI,CAAC,aAAa,EAAE,CAAC;aACtB;QACH,CAAC,CAAC;QAEM,oBAAe,GAAG,GAAG,EAAE;;YAC7B,IAAI,CAAA,MAAA,IAAI,CAAC,cAAc,0CAAE,MAAM,IAAG,CAAC,EAAE;gBACnC,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAClD,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,MAAM,CAC1C,CAAC;gBACF,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CACnD,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,OAAO,CAC3C,CAAC;gBACF,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAC/C,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,KAAK,CACzC,CAAC;gBACF,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc;qBACjC,IAAI,CAAC,GAAG,CAAC,EAAE;oBACV,OAAO,CACL,GAAG,CAAC,iBAAiB,EAAE,KAAK,MAAM;wBAClC,GAAG,CAAC,iBAAiB,EAAE,KAAK,OAAO;wBACnC,GAAG,CAAC,iBAAiB,EAAE,KAAK,KAAK,CAClC,CAAC;gBACJ,CAAC,CAAC;qBACD,WAAW,EAAE,CAAC;gBACjB,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAgB,EAAE,EAAE;oBACxD,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,cAAc,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE;wBAC5D,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;wBACxB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;qBAC1B;yBAAM,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,eAAe,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;wBACrE,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;wBACxB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;qBAC1B;yBAAM,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,WAAW,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE;wBAChE,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;wBACxB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;qBAC1B;gBACH,CAAC,CAAC,CAAC;aACJ;QACH,CAAC,CAAC;QAEM,yBAAoB,GAAG,GAAG,EAAE;;YAClC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,MAAM,eAAe,GAAG,MAAA,IAAI,CAAC,QAAQ,0CAAE,IAAI,CAAC,OAAO,CAAC,EAAE;gBACpD,OAAO,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC;YACjC,CAAC,CAAC,CAAC;YACH,IAAI,eAAe,EAAE;gBACnB,IAAI,IAAI,CAAC,qBAAqB,EAAE;oBAC9B,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,qBAAqB,IAAI,CAAC;iBAC1E;gBACD,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC;aAC9C;QACH,CAAC,CAAC;QAEM,wBAAmB,GAAG,GAAG,EAAE;YACjC,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;YACnC,IAAI,IAAI,CAAC,UAAU,EAAE;gBACnB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;aACvB;QACH,CAAC,CAAC;QAEM,uBAAkB,GAAG,GAAG,EAAE;YAChC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC,CAAC;QAEM,sBAAiB,GAAG,GAAG,EAAE;YAC/B,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC9B,CAAC,CAAC;QAEM,mBAAc,GAAG,GAAG,EAAE;YAC5B,IAAI,IAAI,CAAC,kBAAkB,EAAE;gBAC3B,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;gBACxE,IAAI,CAAC,iBAAiB,CAAC,SAAS;oBAC9B,IAAI,CAAC,iBAAiB,CAAC,YAAY;wBACnC,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC;aACvC;QACH,CAAC,CAAC;4BAzUsB,KAAK;4BAKL,KAAK;0BAWP,KAAK;8BAKD,KAAK;;wBAYgB,EAAE;+BAUd,OAAO;+BAKW,eAAe;;;;;sBAyB1C,IAAI;;IAlE9B,wBAAwB,CAAC,YAAqB;QAC5C,IAAI,CAAC,YAAY,EAAE;YACjB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;SACtB;IACH,CAAC;IAwBD,oBAAoB;QAClB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IA4CD,mCAAmC;IAEnC,KAAK,CAAC,iBAAiB;QACrB,IAAI,CAAC,gBAAgB,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClE,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED,gBAAgB;QACd,IAAI,CAAC,kBAAkB;YACrB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IACzD,CAAC;IAED,kBAAkB;QAChB,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;YAC3B,IAAI,CAAC,2BAA2B,CAAC,IAAI,CACnC,IAAI,CAAC,gBAAgB,CAAC,aAAa,CACpC,CAAC;YACF,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;SAC/B;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,UAAU,CAAC,GAAG,EAAE;gBACd,kDAAkD;gBAClD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBACxB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACxB,CAAC,EAAE,CAAC,CAAC,CAAC;SACP;QACD,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC;IAED,iBAAiB;IAGjB,WAAW,CAAC,KAAiB;QAC3B,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;SACzB;IACH,CAAC;IAED,0BAA0B;IAE1B;;OAEG;IAEH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACrB,CAAC;IAED;;OAEG;IAEH,KAAK,CAAC,UAAU,CAAC,OAAgB;;QAC/B,IAAI,CAAA,MAAA,OAAO,CAAC,IAAI,0CAAE,MAAM,IAAG,CAAC,EAAE;YAC5B,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;YACpC,MAAM,uBAAuB,GAC3B,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,IAAG,CAAC;gBACpB,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,uBAAuB,CAAC;YACjE,IAAI,uBAAuB,EAAE;gBAC3B,QAAQ,CAAC,GAAG,EAAE,CAAC;aAChB;YACD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;SAC1B;IACH,CAAC;IAoLD,0BAA0B;IAE1B,MAAM;;QACJ,OAAO,CACL,EAAC,IAAI,IACH,KAAK,EAAE;gBACL,CAAC,cAAc,IAAI,CAAC,eAAe,EAAE,CAAC,EAAE,IAAI;gBAC5C,wBAAwB,EAAE,IAAI,CAAC,YAAY;aAC5C;YAED,WAAK,KAAK,EAAC,qBAAqB;gBAC9B,cAAQ,KAAK,EAAC,QAAQ;oBACpB,WAAK,KAAK,EAAC,mBAAmB;wBAC5B,iBAAW,IAAI,EAAC,UAAU,IACvB,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAC1B;wBACZ,WAAK,KAAK,EAAC,yBAAyB;4BACjC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CACb,kBACE,KAAK,EAAC,uBAAuB,EAC7B,IAAI,EAAC,UAAU,EACf,IAAI,EAAC,YAAY,EACjB,OAAO,EAAE,IAAI,CAAC,mBAAmB,EACjC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,GACxB,CACf,CAAC,CAAC,CAAC,IAAI;4BAER,kBACE,KAAK,EAAC,sBAAsB,EAC5B,IAAI,EAAC,UAAU,EACf,IAAI,EAAC,YAAY,EACjB,OAAO,EAAE,IAAI,CAAC,aAAa,EAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,GACxB,CACV,CACF;oBACL,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CACb,WACE,KAAK,EAAE;4BACL,oBAAoB,EAAE,IAAI;4BAC1B,6BAA6B,EAAE,IAAI,CAAC,UAAU;yBAC/C;wBAED,WAAK,KAAK,EAAC,sBAAsB;4BAC/B,qBACE,KAAK,EAAC,gBAAgB,EACtB,OAAO,EAAE,IAAI,CAAC,qBAA4B,EAC1C,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,EAA4B,CAAC,GAC1C,CACb,CACF,CACP,CAAC,CAAC,CAAC,IAAI,CACD;gBAET,WACE,KAAK,EAAE;wBACL,kBAAkB,EAAE,IAAI;qBACzB,EACD,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,iBAAiB,GAAG,EAAoB,CAAC,IAEzD,CAAA,MAAA,IAAI,CAAC,QAAQ,0CAAE,MAAM,EAAC,CAAC,CAAC,CACvB,UAAI,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAC1B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE;oBAChC,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBACxC,CAAC,CAAC,CACC,CACN,CAAC,CAAC,CAAC,IAAI,CACJ;gBAEN,WACE,KAAK,EAAE;wBACL,MAAM,EAAE,IAAI;qBACb;oBAED,yBACE,EAAE,QACF,KAAK,EAAC,kBAAkB,EACxB,KAAK,EAAE,IAAI,CAAC,WAAW,EACvB,SAAS,EAAE,IAAI,CAAC,eAAe,EAC/B,WAAW,EACT,IAAI,CAAC,YAAY;4BACf,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,0BAA0B;4BAClD,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,EAE7C,OAAO,EAAE,IAAI,CAAC,oBAAoB,EAClC,OAAO,EAAE,IAAI,CAAC,kBAAkB,EAChC,gBAAgB,EAAE,IAAI,CAAC,oBAAoB,EAC3C,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAC9B,OAAO,EAAE,IAAI,CAAC,kBAAkB,EAChC,QAAQ,EAAE,IAAI,CAAC,YAAY,EAC3B,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,EAAgC,CAAC,GAC5C;oBACpB,CAAC,IAAI,CAAC,YAAY;wBACnB,CAAC,IAAI,CAAC,YAAY;wBAClB,CAAC,IAAI,CAAC,cAAc;wBACpB,CAAA,MAAA,IAAI,CAAC,cAAc,0CAAE,MAAM,IAAG,CAAC,CAAC,CAAC,CAAC,CAChC,WACE,KAAK,EAAE;4BACL,iBAAiB,EAAE,IAAI;yBACxB,IAEA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE;wBACvC,6BAA6B;wBAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CACd,YAAM,KAAK,EAAC,kBAAkB,IAAE,QAAQ,CAAQ,CACjD,CAAC,CAAC,CAAC,IAAI,CAAC;oBACX,CAAC,CAAC,CACE,CACP,CAAC,CAAC,CAAC,IAAI,CACJ,CACF,CACD,CACR,CAAC;IACJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CACF","sourcesContent":["/* STENCIL IMPORTS */\nimport {\n Component,\n Host,\n h,\n Prop,\n Event,\n EventEmitter,\n Element,\n Method,\n State,\n Watch,\n Listen\n} from \"@stencil/core\";\n/* OTHER LIBRARIES IMPORTS */\n/* CUSTOM IMPORTS */\nimport { Locale } from \"../../common/locale\";\n\n@Component({\n tag: \"gx-ide-ai-assistant\",\n styleUrl: \"ai-assistant.scss\",\n shadow: { delegatesFocus: true },\n assetsDirs: [\"gx-ide-assets/ai-assistant\"]\n})\nexport class GxIdeTemplate {\n // 1.OWN PROPERTIES //\n\n /**\n * The component hard-coded strings translations.\n */\n private _componentLocale: any;\n private renderedFirstTime = false;\n /* lastUserMessageHeight is used to set the appropriate height on the textarea, if user presses arrowUp (recover last message)*/\n private lastUserMessageHeight: number;\n private setFocus = true;\n private scrollToBottomFlag = true;\n\n // 2. REFERENCE TO ELEMENTS //\n\n @Element() el: HTMLGxIdeAiAssistantElement;\n private textAreaEl!: HTMLGxgFormTextareaElement;\n private textareaShadowPart: HTMLTextAreaElement;\n private filterEl: HTMLGxgFormTextElement;\n private messagesWrapperEl!: HTMLDivElement;\n\n // 3.STATE() VARIABLES //\n\n /**\n * Flag used to hide the shortcuts\n */\n @State() userHasTyped = false;\n\n /**\n * This is true if the last message is of type 'assistant-in-progress'\n */\n @State() aIInProgress = false;\n @Watch(\"aIInProgress\")\n watchAIInProgressHandler(aiInProgress: boolean) {\n if (!aiInProgress) {\n this.setFocus = true;\n }\n }\n\n /**\n * This displays or hides the messages filter\n */\n @State() showFilter = false;\n\n /**\n * True if the prompt textbox has focus\n */\n @State() promptHasFocus = false;\n\n /**\n * The filter value\n */\n @State() filterValue: string;\n\n // 4.PUBLIC PROPERTY API | WATCH'S //\n\n /**\n * List of messages displayed by the component\n */\n @Prop({ mutable: true }) messages: Message[] = [];\n @Watch(\"messages\")\n watchMessagesHandler() {\n this.evaluateAiInProgress();\n this.evaluateAiStatus();\n }\n\n /**\n * The prompt textarea max-height\n */\n @Prop() readonly promptMaxHeight = \"128px\";\n\n /**\n * A temporary property to illustrate the assistant status\n */\n @Prop({ mutable: true }) assistantStatus: AiStatus = \"indeterminate\";\n\n /**\n * List of keys that make up the shortcut to focus on the component's text input\n */\n @Prop() readonly focusShortcuts: string[];\n\n /**\n * List of keys that make up the shortcut to focus on the component's text input\n */\n @Prop() readonly userMessageCallback: UserMessageCallback;\n\n /**\n * Callback that must be invoked when the conversation is cleared, using the header button.\n */\n @Prop() readonly clearCallback: () => Promise<void>;\n\n /**\n * the prompt value\n */\n @Prop() readonly promptValue: string;\n\n /**\n * If tue, it will display a filter.\n */\n @Prop() readonly filter = true;\n\n // 5.EVENTS (EMIT) //\n\n /**\n * This event is emitted once just after the component is fully loaded and the first render() occurs\n */\n @Event() componentDidRenderFirstTime: EventEmitter<boolean>;\n\n // 6.COMPONENT LIFECYCLE METHODS //\n\n async componentWillLoad() {\n this._componentLocale = await Locale.getComponentStrings(this.el);\n this.evaluateAiInProgress();\n this.evaluateAiStatus();\n this.attachShortcuts();\n }\n\n componentDidLoad() {\n this.textareaShadowPart =\n this.textAreaEl.shadowRoot.querySelector(\"textarea\");\n }\n\n componentDidRender() {\n if (!this.renderedFirstTime) {\n this.componentDidRenderFirstTime.emit(\n this._componentLocale.componentName\n );\n this.renderedFirstTime = true;\n }\n if (this.setFocus) {\n setTimeout(() => {\n /* Doesn't seems to work without the setTimeout */\n this.textAreaEl.focus();\n this.setFocus = false;\n }, 0);\n }\n setTimeout(() => {\n this.scrollToBottom();\n }, 200);\n }\n\n // 7.LISTENERS //\n\n @Listen(\"focus\", { capture: true })\n handleFocus(event: FocusEvent) {\n if (this.textAreaEl) {\n event.preventDefault();\n this.textAreaEl.focus();\n }\n }\n\n // 8.PUBLIC METHODS API //\n\n /**\n * Clear the list of messages\n */\n @Method()\n async clear() {\n this.messages = [];\n }\n\n /**\n * Add a message. This method will be used by the host to add messages from the assistant\n */\n @Method()\n async addMessage(message: Message) {\n if (message.text?.length > 0) {\n const messages = [...this.messages];\n const updateInProgressMessage =\n messages?.length > 0 &&\n messages[messages.length - 1].type === \"assistant-in-progress\";\n if (updateInProgressMessage) {\n messages.pop();\n }\n messages.push(message);\n this.messages = messages;\n }\n }\n\n // 9.LOCAL METHODS //\n\n private evaluateAiInProgress = () => {\n if (\n this.messages?.length > 0 &&\n this.messages[this.messages.length - 1].type === \"assistant-in-progress\"\n ) {\n this.aIInProgress = true;\n } else {\n this.aIInProgress = false;\n }\n };\n\n private evaluateAiStatus = () => {\n if (this.messages?.length === 0) {\n this.assistantStatus = \"indeterminate\";\n return;\n }\n if (\n this.messages[this.messages.length - 1].type ===\n \"assistant-in-progress\" ||\n this.messages[this.messages.length - 1].type === \"user\"\n ) {\n this.assistantStatus = \"indeterminate\";\n } else if (\n this.messages[this.messages.length - 1].type === \"assistant-error\"\n ) {\n this.assistantStatus = \"error\";\n } else {\n this.assistantStatus = \"success\";\n }\n };\n\n private renderMessage = (\n message: Message,\n i: number\n ): HTMLLIElement | void => {\n if (message.text.length > 0) {\n return (\n <gx-ide-ai-message\n message={message.text}\n messageType={message.type}\n hidden={message.hidden}\n filterValue={this.filterValue}\n key={`${i.toString()}-${message.type}`}\n translations={this._componentLocale.aiMessage}\n ></gx-ide-ai-message>\n );\n }\n };\n\n private textAreaInputHandler = () => {\n this.userHasTyped = true;\n this.showFilter = false;\n this.filterEl.value = \"\";\n this.filterValue = \"\";\n this.scrollToBottomFlag = true;\n };\n\n private promptEnterHandler = async (prompt: CustomEvent<string>) => {\n /* First remove double spaces */\n const promptTrimmed = prompt.detail.replace(/\\s+/g, \" \");\n /* Update textarea value to get the proper height */\n this.textAreaEl.value = promptTrimmed;\n setTimeout(() => {\n /* Then save the actual height (setTimeOut required) */\n this.lastUserMessageHeight = this.textAreaEl.offsetHeight;\n }, 0);\n /* The clear the textarea */\n this.textAreaEl.value = \"\";\n /* Insert the user message */\n this.addMessage({\n type: \"user\",\n text: promptTrimmed\n });\n /* Call the callback */\n if (this.userMessageCallback && !this.aIInProgress) {\n this.aIInProgress = true;\n this.userMessageCallback(promptTrimmed).then(() => {\n this.aIInProgress = false;\n });\n }\n };\n\n private filterMessagesHandler = (e: CustomEvent<string>) => {\n this.scrollToBottomFlag = false;\n this.filterValue = e.detail.toLowerCase();\n const filteredMessages = [...this.messages];\n filteredMessages.forEach(message => {\n if (message.text.toLowerCase().includes(this.filterValue)) {\n message.hidden = false;\n } else {\n message.hidden = true;\n }\n });\n this.messages = filteredMessages;\n };\n\n private clearMessages = () => {\n this.messages = [];\n this.textAreaEl.focus();\n if (this.clearCallback) {\n this.clearCallback();\n }\n };\n\n private attachShortcuts = () => {\n if (this.focusShortcuts?.length > 0) {\n const ctrlFocusIndex = this.focusShortcuts.findIndex(\n key => key.toLocaleLowerCase() === \"ctrl\"\n );\n const shiftFocusIndex = this.focusShortcuts.findIndex(\n key => key.toLocaleLowerCase() === \"shift\"\n );\n const cmdKeyIndex = this.focusShortcuts.findIndex(\n key => key.toLocaleLowerCase() === \"cmd\"\n );\n const keyFocus = this.focusShortcuts\n .find(key => {\n return (\n key.toLocaleLowerCase() !== \"ctrl\" &&\n key.toLocaleLowerCase() !== \"shift\" &&\n key.toLocaleLowerCase() !== \"cmd\"\n );\n })\n .toLowerCase();\n document.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n if (e.key === keyFocus && ctrlFocusIndex !== -1 && e.ctrlKey) {\n this.textAreaEl.focus();\n this.userHasTyped = true;\n } else if (e.key === keyFocus && shiftFocusIndex !== -1 && e.shiftKey) {\n this.textAreaEl.focus();\n this.userHasTyped = true;\n } else if (e.key === keyFocus && cmdKeyIndex !== -1 && e.metaKey) {\n this.textAreaEl.focus();\n this.userHasTyped = true;\n }\n });\n }\n };\n\n private promptArrowUpHandler = () => {\n this.userHasTyped = true;\n const lastUserMessage = this.messages?.find(message => {\n return message.type === \"user\";\n });\n if (lastUserMessage) {\n if (this.lastUserMessageHeight) {\n this.textareaShadowPart.style.height = `${this.lastUserMessageHeight}px`;\n }\n this.textAreaEl.value = lastUserMessage.text;\n }\n };\n\n private toggleFilterHandler = () => {\n this.showFilter = !this.showFilter;\n if (this.showFilter) {\n this.filterEl.focus();\n }\n };\n\n private promptFocusHandler = () => {\n this.promptHasFocus = true;\n };\n\n private promptBlurHandler = () => {\n this.promptHasFocus = false;\n };\n\n private scrollToBottom = () => {\n if (this.scrollToBottomFlag) {\n this.messagesWrapperEl.scrollTo(0, this.messagesWrapperEl.scrollHeight);\n this.messagesWrapperEl.scrollTop =\n this.messagesWrapperEl.scrollHeight -\n this.messagesWrapperEl.clientHeight;\n }\n };\n\n // 10.RENDER() FUNCTION //\n\n render() {\n return (\n <Host\n class={{\n [`assistant--${this.assistantStatus}`]: true,\n \"assistant--in-progress\": this.aIInProgress\n }}\n >\n <div class=\"gx-ide-main-wrapper\">\n <header class=\"header\">\n <div class=\"header__first-row\">\n <gxg-title type=\"title-02\">\n {this._componentLocale.componentName}\n </gxg-title>\n <div class=\"header__actions-wrapper\">\n {this.filter ? (\n <gxg-button\n class=\"header__filter-button\"\n type=\"tertiary\"\n icon=\"menus/find\"\n onClick={this.toggleFilterHandler}\n disabled={this.messages.length === 0}\n ></gxg-button>\n ) : null}\n\n <gxg-button\n class=\"header__clear-button\"\n type=\"tertiary\"\n icon=\"bpm/delete\"\n onClick={this.clearMessages}\n disabled={this.messages.length === 0}\n ></gxg-button>\n </div>\n </div>\n {this.filter ? (\n <div\n class={{\n \"header__second-row\": true,\n \"header__second-row--visible\": this.showFilter\n }}\n >\n <div class=\"filter-inner-wrapper\">\n <gxg-form-text\n class=\"header__filter\"\n onInput={this.filterMessagesHandler as any}\n ref={el => (this.filterEl = el as HTMLGxgFormTextElement)}\n ></gxg-form-text>\n </div>\n </div>\n ) : null}\n </header>\n\n <div\n class={{\n \"messages-wrapper\": true\n }}\n ref={el => (this.messagesWrapperEl = el as HTMLDivElement)}\n >\n {this.messages?.length ? (\n <ol class={{ messages: true }}>\n {this.messages.map((message, i) => {\n return this.renderMessage(message, i);\n })}\n </ol>\n ) : null}\n </div>\n\n <div\n class={{\n prompt: true\n }}\n >\n <gxg-form-textarea\n ai\n class=\"prompt__textarea\"\n value={this.promptValue}\n maxHeight={this.promptMaxHeight}\n placeholder={\n this.aIInProgress\n ? this._componentLocale.processingQueryPlaceholder\n : this._componentLocale.promptPlaceholder\n }\n onInput={this.textAreaInputHandler}\n onEnter={this.promptEnterHandler}\n onArrowUpPressed={this.promptArrowUpHandler}\n onBlur={this.promptBlurHandler}\n onFocus={this.promptFocusHandler}\n disabled={this.aIInProgress}\n ref={el => (this.textAreaEl = el as HTMLGxgFormTextareaElement)}\n ></gxg-form-textarea>\n {!this.userHasTyped &&\n !this.aIInProgress &&\n !this.promptHasFocus &&\n this.focusShortcuts?.length > 0 ? (\n <div\n class={{\n prompt__shortcuts: true\n }}\n >\n {this.focusShortcuts.map((shortcut, i) => {\n /* Up to three keys allowed*/\n return i <= 2 ? (\n <span class=\"prompt__shortcut\">{shortcut}</span>\n ) : null;\n })}\n </div>\n ) : null}\n </div>\n </div>\n </Host>\n );\n }\n}\n\nexport type AiStatus = \"indeterminate\" | \"success\" | \"error\";\n\nexport type Message = {\n type: MessageType;\n text: string;\n hidden?: boolean;\n filterValue?: string;\n};\n\nexport type MessageType =\n | \"user\"\n | \"assistant-chat\"\n | \"assistant-action\"\n | \"assistant-in-progress\"\n | \"assistant-error\";\n\nexport type UserMessageCallback = (text: string) => Promise<void>;\n"]}
|
|
1
|
+
{"version":3,"file":"ai-assistant.js","sourceRoot":"","sources":["../../../src/components/ai-assistant/ai-assistant.tsx"],"names":[],"mappings":"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","sourcesContent":["/* STENCIL IMPORTS */\nimport {\n Component,\n Host,\n h,\n Prop,\n Event,\n EventEmitter,\n Element,\n Method,\n State,\n Watch,\n Listen\n} from \"@stencil/core\";\n/* OTHER LIBRARIES IMPORTS */\n/* CUSTOM IMPORTS */\nimport { Locale } from \"../../common/locale\";\n\n@Component({\n tag: \"gx-ide-ai-assistant\",\n styleUrl: \"ai-assistant.scss\",\n shadow: { delegatesFocus: true },\n assetsDirs: [\"gx-ide-assets/ai-assistant\"]\n})\nexport class GxIdeTemplate {\n // 1.OWN PROPERTIES //\n\n /**\n * The component hard-coded strings translations.\n */\n private _componentLocale: any;\n private renderedFirstTime = false;\n /* lastUserMessageHeight is used to set the appropriate height on the textarea, if user presses arrowUp (recover last message)*/\n private lastUserMessageHeight: number;\n private setFocus = true;\n private scrollToBottomFlag = true;\n\n // 2. REFERENCE TO ELEMENTS //\n\n @Element() el: HTMLGxIdeAiAssistantElement;\n private textAreaEl!: HTMLGxgFormTextareaElement;\n private textareaShadowPart: HTMLTextAreaElement;\n private filterEl: HTMLGxgFormTextElement;\n private messagesWrapperEl!: HTMLDivElement;\n\n // 3.STATE() VARIABLES //\n\n /**\n * Flag used to hide the shortcuts\n */\n @State() userHasTyped = false;\n\n /**\n * This is true if the last message is of type 'assistant-in-progress'\n */\n @State() aIInProgress = false;\n @Watch(\"aIInProgress\")\n watchAIInProgressHandler(aiInProgress: boolean) {\n if (!aiInProgress) {\n this.setFocus = true;\n }\n }\n\n /**\n * This displays or hides the messages filter\n */\n @State() showFilter = false;\n\n /**\n * True if the prompt textbox has focus\n */\n @State() promptHasFocus = false;\n\n /**\n * The filter value\n */\n @State() filterValue: string;\n\n // 4.PUBLIC PROPERTY API | WATCH'S //\n\n /**\n * List of messages displayed by the component\n */\n @Prop({ mutable: true }) messages: Message[] = [];\n @Watch(\"messages\")\n watchMessagesHandler() {\n this.evaluateAiInProgress();\n this.evaluateAiStatus();\n }\n\n /**\n * The prompt textarea max-height\n */\n @Prop() readonly promptMaxHeight = \"128px\";\n\n /**\n * A temporary property to illustrate the assistant status\n */\n @Prop({ mutable: true }) assistantStatus: AiStatus = \"indeterminate\";\n\n /**\n * List of keys that make up the shortcut to focus on the component's text input\n */\n @Prop() readonly focusShortcuts: string[];\n\n /**\n * List of keys that make up the shortcut to focus on the component's text input\n */\n @Prop() readonly userMessageCallback: UserMessageCallback;\n\n /**\n * Callback that must be invoked when the conversation is cleared, using the header button.\n */\n @Prop() readonly clearCallback: () => Promise<void>;\n\n /**\n * the prompt value\n */\n @Prop() readonly promptValue: string;\n\n /**\n * If tue, it will display a filter.\n */\n @Prop() readonly filter = true;\n\n // 5.EVENTS (EMIT) //\n\n /**\n * This event is emitted once just after the component is fully loaded and the first render() occurs\n */\n @Event() componentDidRenderFirstTime: EventEmitter<boolean>;\n\n // 6.COMPONENT LIFECYCLE METHODS //\n\n async componentWillLoad() {\n this._componentLocale = await Locale.getComponentStrings(this.el);\n this.evaluateAiInProgress();\n this.evaluateAiStatus();\n this.attachShortcuts();\n }\n\n componentDidLoad() {\n this.textareaShadowPart =\n this.textAreaEl.shadowRoot.querySelector(\"textarea\");\n }\n\n componentDidRender() {\n if (!this.renderedFirstTime) {\n this.componentDidRenderFirstTime.emit(\n this._componentLocale.componentName\n );\n this.renderedFirstTime = true;\n }\n if (this.setFocus) {\n setTimeout(() => {\n /* Doesn't seems to work without the setTimeout */\n this.textAreaEl.focus();\n this.setFocus = false;\n }, 50);\n }\n setTimeout(() => {\n this.scrollToBottom();\n }, 200);\n }\n\n // 7.LISTENERS //\n\n @Listen(\"focus\", { capture: true })\n handleFocus(event: FocusEvent) {\n if (this.textAreaEl) {\n event.preventDefault();\n this.textAreaEl.focus();\n }\n }\n\n // 8.PUBLIC METHODS API //\n\n /**\n * Clear the list of messages\n */\n @Method()\n async clear() {\n this.messages = [];\n }\n\n /**\n * Add a message. This method will be used by the host to add messages from the assistant\n */\n @Method()\n async addMessage(message: Message) {\n if (message.text?.length > 0) {\n const messages = [...this.messages];\n const updateInProgressMessage =\n messages?.length > 0 &&\n messages[messages.length - 1].type === \"assistant-in-progress\";\n if (updateInProgressMessage) {\n messages.pop();\n }\n messages.push(message);\n this.messages = messages;\n }\n }\n\n // 9.LOCAL METHODS //\n\n private evaluateAiInProgress = () => {\n if (\n this.messages?.length > 0 &&\n this.messages[this.messages.length - 1].type === \"assistant-in-progress\"\n ) {\n this.aIInProgress = true;\n } else {\n this.aIInProgress = false;\n }\n };\n\n private evaluateAiStatus = () => {\n if (this.messages?.length === 0) {\n this.assistantStatus = \"indeterminate\";\n return;\n }\n if (\n this.messages[this.messages.length - 1].type ===\n \"assistant-in-progress\" ||\n this.messages[this.messages.length - 1].type === \"user\"\n ) {\n this.assistantStatus = \"indeterminate\";\n } else if (\n this.messages[this.messages.length - 1].type === \"assistant-error\"\n ) {\n this.assistantStatus = \"error\";\n } else {\n this.assistantStatus = \"success\";\n }\n };\n\n private renderMessage = (\n message: Message,\n i: number\n ): HTMLLIElement | void => {\n if (message.text.length > 0) {\n return (\n <gx-ide-ai-message\n message={message.text}\n messageType={message.type}\n hidden={message.hidden}\n filterValue={this.filterValue}\n key={`${i.toString()}-${message.type}`}\n translations={this._componentLocale.aiMessage}\n ></gx-ide-ai-message>\n );\n }\n };\n\n private textAreaInputHandler = () => {\n this.userHasTyped = true;\n this.showFilter = false;\n this.filterEl.value = \"\";\n this.filterValue = \"\";\n this.scrollToBottomFlag = true;\n };\n\n private promptEnterHandler = async (prompt: CustomEvent<string>) => {\n /* First remove double spaces */\n const promptTrimmed = prompt.detail.replace(/\\s+/g, \" \");\n /* Update textarea value to get the proper height */\n this.textAreaEl.value = promptTrimmed;\n setTimeout(() => {\n /* Then save the actual height (setTimeOut required) */\n this.lastUserMessageHeight = this.textAreaEl.offsetHeight;\n }, 0);\n /* The clear the textarea */\n this.textAreaEl.value = \"\";\n /* Insert the user message */\n this.addMessage({\n type: \"user\",\n text: promptTrimmed\n });\n /* Call the callback */\n if (this.userMessageCallback && !this.aIInProgress) {\n this.aIInProgress = true;\n this.userMessageCallback(promptTrimmed).then(() => {\n this.aIInProgress = false;\n });\n }\n };\n\n private filterMessagesHandler = (e: CustomEvent<string>) => {\n this.scrollToBottomFlag = false;\n this.filterValue = e.detail.toLowerCase();\n const filteredMessages = [...this.messages];\n filteredMessages.forEach(message => {\n if (message.text.toLowerCase().includes(this.filterValue)) {\n message.hidden = false;\n } else {\n message.hidden = true;\n }\n });\n this.messages = filteredMessages;\n };\n\n private clearMessages = () => {\n this.messages = [];\n this.textAreaEl.focus();\n if (this.clearCallback) {\n this.clearCallback();\n }\n };\n\n private attachShortcuts = () => {\n if (this.focusShortcuts?.length > 0) {\n const ctrlFocusIndex = this.focusShortcuts.findIndex(\n key => key.toLocaleLowerCase() === \"ctrl\"\n );\n const shiftFocusIndex = this.focusShortcuts.findIndex(\n key => key.toLocaleLowerCase() === \"shift\"\n );\n const cmdKeyIndex = this.focusShortcuts.findIndex(\n key => key.toLocaleLowerCase() === \"cmd\"\n );\n const keyFocus = this.focusShortcuts\n .find(key => {\n return (\n key.toLocaleLowerCase() !== \"ctrl\" &&\n key.toLocaleLowerCase() !== \"shift\" &&\n key.toLocaleLowerCase() !== \"cmd\"\n );\n })\n .toLowerCase();\n document.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n if (e.key === keyFocus && ctrlFocusIndex !== -1 && e.ctrlKey) {\n this.textAreaEl.focus();\n this.userHasTyped = true;\n } else if (e.key === keyFocus && shiftFocusIndex !== -1 && e.shiftKey) {\n this.textAreaEl.focus();\n this.userHasTyped = true;\n } else if (e.key === keyFocus && cmdKeyIndex !== -1 && e.metaKey) {\n this.textAreaEl.focus();\n this.userHasTyped = true;\n }\n });\n }\n };\n\n private promptArrowUpHandler = () => {\n this.userHasTyped = true;\n const lastUserMessage = this.messages?.find(message => {\n return message.type === \"user\";\n });\n if (lastUserMessage) {\n if (this.lastUserMessageHeight) {\n this.textareaShadowPart.style.height = `${this.lastUserMessageHeight}px`;\n }\n this.textAreaEl.value = lastUserMessage.text;\n }\n };\n\n private toggleFilterHandler = () => {\n this.showFilter = !this.showFilter;\n if (this.showFilter) {\n this.filterEl.focus();\n }\n };\n\n private promptFocusHandler = () => {\n this.promptHasFocus = true;\n };\n\n private promptBlurHandler = () => {\n this.promptHasFocus = false;\n };\n\n private scrollToBottom = () => {\n if (this.scrollToBottomFlag) {\n this.messagesWrapperEl.scrollTo(0, this.messagesWrapperEl.scrollHeight);\n this.messagesWrapperEl.scrollTop =\n this.messagesWrapperEl.scrollHeight -\n this.messagesWrapperEl.clientHeight;\n }\n };\n\n // 10.RENDER() FUNCTION //\n\n render() {\n return (\n <Host\n class={{\n [`assistant--${this.assistantStatus}`]: true,\n \"assistant--in-progress\": this.aIInProgress\n }}\n >\n <div class=\"gx-ide-main-wrapper\">\n <header class=\"header\">\n <div class=\"header__first-row\">\n <gxg-title type=\"title-02\">\n {this._componentLocale.componentName}\n </gxg-title>\n <div class=\"header__actions-wrapper\">\n {this.filter ? (\n <gxg-button\n class=\"header__filter-button\"\n type=\"tertiary\"\n icon=\"menus/find\"\n onClick={this.toggleFilterHandler}\n disabled={this.messages.length === 0}\n ></gxg-button>\n ) : null}\n\n <gxg-button\n class=\"header__clear-button\"\n type=\"tertiary\"\n icon=\"bpm/delete\"\n onClick={this.clearMessages}\n disabled={this.messages.length === 0}\n ></gxg-button>\n </div>\n </div>\n {this.filter ? (\n <div\n class={{\n \"header__second-row\": true,\n \"header__second-row--visible\": this.showFilter\n }}\n >\n <div class=\"filter-inner-wrapper\">\n <gxg-form-text\n class=\"header__filter\"\n onInput={this.filterMessagesHandler as any}\n ref={el => (this.filterEl = el as HTMLGxgFormTextElement)}\n ></gxg-form-text>\n </div>\n </div>\n ) : null}\n </header>\n\n <div\n class={{\n \"messages-wrapper\": true,\n \"scrollable\": true\n }}\n ref={el => (this.messagesWrapperEl = el as HTMLDivElement)}\n >\n {this.messages?.length ? (\n <ol class={{ messages: true }}>\n {this.messages.map((message, i) => {\n return this.renderMessage(message, i);\n })}\n </ol>\n ) : null}\n </div>\n\n <div\n class={{\n prompt: true\n }}\n >\n <gxg-form-textarea\n ai\n class=\"prompt__textarea\"\n value={this.promptValue}\n maxHeight={this.promptMaxHeight}\n placeholder={\n this.aIInProgress\n ? this._componentLocale.processingQueryPlaceholder\n : this._componentLocale.promptPlaceholder\n }\n onInput={this.textAreaInputHandler}\n onEnter={this.promptEnterHandler}\n onArrowUpPressed={this.promptArrowUpHandler}\n onBlur={this.promptBlurHandler}\n onFocus={this.promptFocusHandler}\n disabled={this.aIInProgress}\n ref={el => (this.textAreaEl = el as HTMLGxgFormTextareaElement)}\n ></gxg-form-textarea>\n {!this.userHasTyped &&\n !this.aIInProgress &&\n !this.promptHasFocus &&\n this.focusShortcuts?.length > 0 ? (\n <div\n class={{\n prompt__shortcuts: true\n }}\n >\n {this.focusShortcuts.map((shortcut, i) => {\n /* Up to three keys allowed*/\n return i <= 2 ? (\n <span class=\"prompt__shortcut\">{shortcut}</span>\n ) : null;\n })}\n </div>\n ) : null}\n </div>\n </div>\n </Host>\n );\n }\n}\n\nexport type AiStatus = \"indeterminate\" | \"success\" | \"error\";\n\nexport type Message = {\n type: MessageType;\n text: string;\n hidden?: boolean;\n filterValue?: string;\n};\n\nexport type MessageType =\n | \"user\"\n | \"assistant-chat\"\n | \"assistant-action\"\n | \"assistant-in-progress\"\n | \"assistant-error\";\n\nexport type UserMessageCallback = (text: string) => Promise<void>;\n"]}
|
|
@@ -9,7 +9,7 @@ Found on /common/helpers.tsx hiChar function is used to add a span/class to ever
|
|
|
9
9
|
|
|
10
10
|
/*--- Messages ---*/
|
|
11
11
|
.message {
|
|
12
|
-
color: var(--mer-color__neutral-gray--
|
|
12
|
+
color: var(--mer-color__neutral-gray--100);
|
|
13
13
|
display: grid;
|
|
14
14
|
grid-template-rows: 0fr;
|
|
15
15
|
transition: grid-template-rows 100ms;
|
|
@@ -20,15 +20,38 @@ Found on /common/helpers.tsx hiChar function is used to add a span/class to ever
|
|
|
20
20
|
overflow: hidden;
|
|
21
21
|
}
|
|
22
22
|
.message__inner-wrapper {
|
|
23
|
-
padding: var(--mer-spacing--
|
|
24
|
-
border-radius: var(--mer-border__radius--
|
|
25
|
-
border: var(--mer-border__width--
|
|
23
|
+
padding: var(--mer-spacing--sm) var(--mer-spacing--sm);
|
|
24
|
+
border-radius: var(--mer-border__radius--sm);
|
|
25
|
+
border-inline-start: var(--mer-border__width--md) solid transparent;
|
|
26
26
|
background-color: var(--mer-color__neutral-gray--1200);
|
|
27
27
|
margin-block-start: var(--mer-spacing--xs);
|
|
28
28
|
}
|
|
29
|
+
.message__role {
|
|
30
|
+
display: inline-block;
|
|
31
|
+
font-weight: var(--mer-font__weight--semi-bold);
|
|
32
|
+
margin-block-end: var(--mer-spacing--xs);
|
|
33
|
+
display: inline-grid;
|
|
34
|
+
grid-template-columns: max-content max-content;
|
|
35
|
+
gap: 6px;
|
|
36
|
+
}
|
|
37
|
+
.message__role:before {
|
|
38
|
+
content: "";
|
|
39
|
+
display: grid;
|
|
40
|
+
place-self: center flex-end;
|
|
41
|
+
inline-size: 4px;
|
|
42
|
+
block-size: 4px;
|
|
43
|
+
border-radius: 50%;
|
|
44
|
+
background-color: currentcolor;
|
|
45
|
+
}
|
|
46
|
+
.message__role--user {
|
|
47
|
+
color: var(--mer-color__primary--300);
|
|
48
|
+
}
|
|
49
|
+
.message__role--hidden {
|
|
50
|
+
display: none;
|
|
51
|
+
}
|
|
29
52
|
.message__caption {
|
|
30
|
-
font-size: var(--mer-font__size--
|
|
31
|
-
line-height: var(--mer-line-height--
|
|
53
|
+
font-size: var(--mer-font__size--xs);
|
|
54
|
+
line-height: var(--mer-line-height--regular);
|
|
32
55
|
position: relative;
|
|
33
56
|
}
|
|
34
57
|
.message--visible {
|
|
@@ -48,10 +71,15 @@ Found on /common/helpers.tsx hiChar function is used to add a span/class to ever
|
|
|
48
71
|
/* Standard syntax */
|
|
49
72
|
}
|
|
50
73
|
.message--user .message__inner-wrapper {
|
|
51
|
-
background-color:
|
|
74
|
+
background-color: rgba(91, 167, 255, 0.08);
|
|
75
|
+
border-color: var(--mer-border-color__primary);
|
|
52
76
|
}
|
|
53
77
|
.message--assistant-action .message__inner-wrapper {
|
|
54
|
-
|
|
78
|
+
background-color: rgba(63, 168, 155, 0.05);
|
|
79
|
+
border-color: var(--mer-border-color__success);
|
|
80
|
+
}
|
|
81
|
+
.message--assistant-chat .message__inner-wrapper {
|
|
82
|
+
background-color: var(--mer-surface__elevation--01);
|
|
55
83
|
}
|
|
56
84
|
.message--assistant-in-progress {
|
|
57
85
|
color: var(--mer-color__neutral-gray--500);
|
|
@@ -72,11 +100,8 @@ Found on /common/helpers.tsx hiChar function is used to add a span/class to ever
|
|
|
72
100
|
flex: none;
|
|
73
101
|
}
|
|
74
102
|
.message--assistant-error .message__inner-wrapper {
|
|
75
|
-
background-color:
|
|
76
|
-
border-color: var(--mer-
|
|
77
|
-
}
|
|
78
|
-
.message--copyable {
|
|
79
|
-
cursor: pointer;
|
|
103
|
+
background-color: rgba(251, 124, 132, 0.05);
|
|
104
|
+
border-color: var(--mer-border-color__error);
|
|
80
105
|
}
|
|
81
106
|
.message:last-child {
|
|
82
107
|
margin-block-end: 0;
|
|
@@ -1,23 +1,11 @@
|
|
|
1
1
|
/* STENCIL IMPORTS */
|
|
2
2
|
import { h } from "@stencil/core";
|
|
3
|
+
/* OTHER LIBRARIES IMPORTS */
|
|
4
|
+
/* CUSTOM IMPORTS */
|
|
5
|
+
import { Locale } from "../../common/locale";
|
|
3
6
|
import { hiChar } from "../../common/helpers";
|
|
4
7
|
export class GxIdeAiMessage {
|
|
5
8
|
constructor() {
|
|
6
|
-
/*
|
|
7
|
-
INDEX:
|
|
8
|
-
1.OWN PROPERTIES
|
|
9
|
-
2.REFERENCE TO ELEMENTS
|
|
10
|
-
3.STATE() VARIABLES
|
|
11
|
-
4.PUBLIC PROPERTY API | WATCH'S
|
|
12
|
-
5.EVENTS (EMIT)
|
|
13
|
-
6.COMPONENT LIFECYCLE METHODS
|
|
14
|
-
7.LISTENERS
|
|
15
|
-
8.PUBLIC METHODS API
|
|
16
|
-
9.LOCAL METHODS
|
|
17
|
-
10.RENDER() FUNCTION
|
|
18
|
-
*/
|
|
19
|
-
// 1.OWN PROPERTIES //
|
|
20
|
-
/* The message allows to be copied*/
|
|
21
9
|
this.copyable = false;
|
|
22
10
|
// 7.LISTENERS //
|
|
23
11
|
// 8.PUBLIC METHODS API //
|
|
@@ -27,13 +15,6 @@ export class GxIdeAiMessage {
|
|
|
27
15
|
this.messageType !== "assistant-in-progress" &&
|
|
28
16
|
this.messageType !== "assistant-action";
|
|
29
17
|
};
|
|
30
|
-
this.copyMessage = () => {
|
|
31
|
-
navigator.clipboard.writeText(this.message);
|
|
32
|
-
this.showCopiedMessage = true;
|
|
33
|
-
setTimeout(() => {
|
|
34
|
-
this.showCopiedMessage = false;
|
|
35
|
-
}, 1500);
|
|
36
|
-
};
|
|
37
18
|
this.visible = false;
|
|
38
19
|
this.showCopiedMessage = false;
|
|
39
20
|
this.message = undefined;
|
|
@@ -45,6 +26,7 @@ export class GxIdeAiMessage {
|
|
|
45
26
|
// 5.EVENTS (EMIT) //
|
|
46
27
|
// 6.COMPONENT LIFECYCLE METHODS //
|
|
47
28
|
async componentWillLoad() {
|
|
29
|
+
this._componentLocale = await Locale.getComponentStrings(this.el);
|
|
48
30
|
this.evaluateMessageIsCopyable();
|
|
49
31
|
}
|
|
50
32
|
componentDidRender() {
|
|
@@ -64,14 +46,16 @@ export class GxIdeAiMessage {
|
|
|
64
46
|
"message--assistant": this.messageType !== "user",
|
|
65
47
|
"message--copyable": this.copyable,
|
|
66
48
|
"message--copying": this.showCopiedMessage
|
|
67
|
-
}
|
|
49
|
+
} }, h("div", { class: "message__outer-wrapper" }, h("div", { class: {
|
|
68
50
|
"message__inner-wrapper": true
|
|
69
|
-
} }, h("
|
|
51
|
+
} }, this.messageType === "user" ? (h("span", { class: "message__role message__role--user" }, this._componentLocale.you)) : (h("span", { class: {
|
|
52
|
+
"message__role": this.messageType !== "assistant-in-progress",
|
|
53
|
+
"message__role--hidden": this.messageType === "assistant-in-progress",
|
|
54
|
+
"message__role--assistant": true
|
|
55
|
+
} }, this._componentLocale.assistant)), h("div", { class: {
|
|
70
56
|
"message__caption": true,
|
|
71
57
|
"message__caption--in-progress": this.messageType === "assistant-in-progress"
|
|
72
|
-
} }, this.
|
|
73
|
-
copied: true
|
|
74
|
-
} }, h("gxg-icon", { type: "bpm/tasks", color: "mercury" }), this.translations["copied"])) : null, hiChar(this.message, this.filterValue)), this.messageType === "assistant-in-progress" ? (h("div", { class: "animation-wrapper" }, h("div", { class: "dot-pulse" }))) : null))));
|
|
58
|
+
} }, hiChar(this.message, this.filterValue)), this.messageType === "assistant-in-progress" ? (h("div", { class: "animation-wrapper" }, h("div", { class: "dot-pulse" }))) : null))));
|
|
75
59
|
}
|
|
76
60
|
static get is() { return "gx-ide-ai-message"; }
|
|
77
61
|
static get encapsulation() { return "shadow"; }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-message.js","sourceRoot":"","sources":["../../../src/components/ai-assistant/ai-message.tsx"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"ai-message.js","sourceRoot":"","sources":["../../../src/components/ai-assistant/ai-message.tsx"],"names":[],"mappings":"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","sourcesContent":["/* STENCIL IMPORTS */\nimport { Component, h, Prop, Element, State } from \"@stencil/core\";\n/* OTHER LIBRARIES IMPORTS */\n/* CUSTOM IMPORTS */\nimport { Locale } from \"../../common/locale\";\nimport { MessageType } from \"./ai-assistant\";\nimport { hiChar } from \"../../common/helpers\";\n\n@Component({\n tag: \"gx-ide-ai-message\",\n styleUrl: \"ai-message.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/ai-message\"]\n})\nexport class GxIdeAiMessage {\n /*\nINDEX:\n1.OWN PROPERTIES \n2.REFERENCE TO ELEMENTS\n3.STATE() VARIABLES\n4.PUBLIC PROPERTY API | WATCH'S\n5.EVENTS (EMIT)\n6.COMPONENT LIFECYCLE METHODS\n7.LISTENERS\n8.PUBLIC METHODS API\n9.LOCAL METHODS\n10.RENDER() FUNCTION\n*/\n\n // 1.OWN PROPERTIES //\n\n /* The message allows to be copied*/\n private _componentLocale: any;\n private copyable = false;\n\n // 2. REFERENCE TO ELEMENTS //\n\n @Element() el: HTMLGxIdeAiMessageElement;\n\n // 3.STATE() VARIABLES //\n\n /**\n * This wil display the message if true\n */\n @State() visible = false;\n\n /**\n * This wil show the user a text, indicating that the message has been copied\n */\n @State() showCopiedMessage = false;\n\n // 4.PUBLIC PROPERTY API | WATCH'S //\n\n /**\n * The actual message\n */\n @Prop() readonly message: string;\n\n /**\n * The message type\n */\n @Prop() readonly messageType: MessageType;\n\n /**\n * The filter value\n */\n @Prop() readonly filterValue: string;\n\n /**\n * It hides the message (used for the filter)\n */\n @Prop() readonly hidden: boolean;\n\n /**\n * An object with the needed string translations.\n */\n @Prop() readonly translations: Translations;\n\n // 5.EVENTS (EMIT) //\n\n // 6.COMPONENT LIFECYCLE METHODS //\n\n async componentWillLoad() {\n this._componentLocale = await Locale.getComponentStrings(this.el);\n this.evaluateMessageIsCopyable();\n }\n\n componentDidRender() {\n setTimeout(() => {\n /* Without the timeout it appears instantly (no apparent transition)*/\n this.visible = true;\n const messagesList = this.el.parentElement;\n messagesList.scrollTo(0, 0);\n }, 0);\n }\n\n // 7.LISTENERS //\n\n // 8.PUBLIC METHODS API //\n\n // 9.LOCAL METHODS //\n\n private evaluateMessageIsCopyable = () => {\n this.copyable =\n this.messageType !== \"assistant-in-progress\" &&\n this.messageType !== \"assistant-action\";\n };\n\n // 10.RENDER() FUNCTION //\n\n render() {\n return (\n <li\n class={{\n \"message\": true,\n \"message--visible\": this.visible && !this.hidden,\n [`message--${[this.messageType]}`]: true,\n \"message--assistant\": this.messageType !== \"user\",\n \"message--copyable\": this.copyable,\n \"message--copying\": this.showCopiedMessage\n }}\n >\n <div class=\"message__outer-wrapper\">\n <div\n class={{\n \"message__inner-wrapper\": true\n }}\n >\n {this.messageType === \"user\" ? (\n <span class=\"message__role message__role--user\">\n {this._componentLocale.you}\n </span>\n ) : (\n <span\n class={{\n \"message__role\": this.messageType !== \"assistant-in-progress\",\n \"message__role--hidden\":\n this.messageType === \"assistant-in-progress\",\n \"message__role--assistant\": true\n }}\n >\n {this._componentLocale.assistant}\n </span>\n )}\n <div\n class={{\n \"message__caption\": true,\n \"message__caption--in-progress\":\n this.messageType === \"assistant-in-progress\"\n }}\n >\n {hiChar(this.message, this.filterValue)}\n </div>\n {this.messageType === \"assistant-in-progress\" ? (\n <div class=\"animation-wrapper\">\n <div class=\"dot-pulse\"></div>\n </div>\n ) : null}\n </div>\n </div>\n </li>\n );\n }\n}\n\nexport type Translations = {\n [key: string]: string;\n};\n"]}
|
|
@@ -115,22 +115,8 @@
|
|
|
115
115
|
padding: 0;
|
|
116
116
|
margin: 0;
|
|
117
117
|
}
|
|
118
|
-
.slide__list-item {
|
|
119
|
-
|
|
120
|
-
padding-inline-start: 24px;
|
|
121
|
-
}
|
|
122
|
-
.slide__list-item::before {
|
|
123
|
-
content: "";
|
|
124
|
-
display: inline-block;
|
|
125
|
-
inline-size: var(--mer-spacing--sm);
|
|
126
|
-
block-size: var(--mer-spacing--sm);
|
|
127
|
-
border: var(--mer-border__width--sm) solid var(--mer-color__tinted-primary--50);
|
|
128
|
-
border-radius: 50%;
|
|
129
|
-
background-color: var(--mer-color__tinted-primary--10);
|
|
130
|
-
margin-inline-end: var(--mer-spacing--sm);
|
|
131
|
-
position: absolute;
|
|
132
|
-
inset-inline-start: 0;
|
|
133
|
-
inset-block-start: 6px;
|
|
118
|
+
.slide__list-item-title {
|
|
119
|
+
font-weight: var(--mer-font__weight--medium);
|
|
134
120
|
}
|
|
135
121
|
.slide__word {
|
|
136
122
|
transition: var(--mer-timing--regular) opacity;
|
|
@@ -150,7 +150,7 @@ export class GxIdeWelcomePage {
|
|
|
150
150
|
? __classPrivateFieldGet(this, _GxIdeWelcomePage_splitWords, "f").call(this, paragraph)
|
|
151
151
|
: paragraph));
|
|
152
152
|
}), ((_b = slide.listItems) === null || _b === void 0 ? void 0 : _b.length) && (h("ul", { class: "slide__list" }, slide.listItems.map(item => {
|
|
153
|
-
return h("li", { class: "slide__list-item" }, item);
|
|
153
|
+
return (h("li", { class: "slide__list-item" }, h("strong", { class: "slide__list-item-title" }, item.title), " ", item.description));
|
|
154
154
|
})))), isLastSlide && (h("button", { class: "button-primary start-button", onClick: __classPrivateFieldGet(this, _GxIdeWelcomePage_closeSlider, "f") }, __classPrivateFieldGet(this, _GxIdeWelcomePage_componentLocale, "f").startButtonCaption))))));
|
|
155
155
|
}), "f");
|
|
156
156
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"welcome-page.js","sourceRoot":"","sources":["../../../src/components/welcome-page/welcome-page.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA,UAAU;AACV,OAAO,EACL,SAAS,EACT,IAAI,EACJ,CAAC,EACD,IAAI,EACJ,OAAO,EACP,KAAK,EACL,YAAY,EACb,MAAM,eAAe,CAAC;AACvB,kBAAkB;AAClB,OAAO,EAAkB,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/D,iBAAiB;AACjB,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,MAAM,qBAAqB,GAAG,QAAQ,CAAC;AACvC,MAAM,cAAc,GAAG,WAAW,CAAC;AACnC,MAAM,eAAe,GAAG,YAAY,CAAC;AACrC,MAAM,UAAU,GAAG,QAAQ,CAAC;AAC5B,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAChC,MAAM,mBAAmB,GAAG,cAAc,CAAC;AAC3C,MAAM,2BAA2B,GAAG,EAAE,CAAC;AACvC,MAAM,2BAA2B,GAAG,sBAAsB,CAAC;AAE3D,QAAQ;AACR,MAAM,SAAS,GAAG,YAAY,CAC5B,mDAAmD,CACpD,CAAC;AACF,MAAM,UAAU,GAAG,WAAW,CAAC;IAC7B,QAAQ,EAAE,QAAQ;IAClB,IAAI,EAAE,OAAO;IACb,SAAS,EAAE,cAAc;CAC1B,CAAC,CAAC;AAEH,MAAM,WAAW,GAAmB;IAClC,mBAAmB;IACnB,kBAAkB;IAClB,iBAAiB;IACjB,mBAAmB;CACpB,CAAC;AAQF,MAAM,OAAO,gBAAgB;;QAC3B;;WAEG;QACH,wEAAwE;QACxE,oDAAsB;QAEtB,sEAAmE,IAAI,GAAG,EAAE,EAAC;QAC7E,2CAAiC,EAAE,EAAC;QACpC,8CAAoC,EAAE,EAAC;QACvC,2FAA2F;QAC3F,yFAAyF;QACzF,kCAAkC;QAClC,mDAAgC;QAwEhC,wCAAe,GAAG,EAAE;YAClB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;YAC3B,UAAU,CAAC,GAAG,EAAE;gBACd,gDAAgD;gBAChD,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;gBACjB,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,uBAAA,IAAI,8CAAsB,CAAC,CAAC;YACtE,CAAC,EAAE,mBAAmB,CAAC,CAAC;QAC1B,CAAC,EAAC;QAEF,qDAA4B,GAAG,EAAE;YAC/B,uBAAA,IAAI,sCAAc,MAAlB,IAAI,CAAgB,CAAC;YACrB,kEAAkE;YAClE,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,uBAAA,IAAI,8CAAsB,CAAC,CAAC;QACnE,CAAC,EAAC;QAEF,yCAAgB,CAAC,aAAsC,EAAE,EAAE;YACzD,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBACpC,UAAU,CAAC,GAAG,EAAE;oBACd,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;gBAClD,CAAC,EAAE,KAAK,GAAG,2BAA2B,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;QACL,CAAC,EAAC;QAEF,8CAAqB,CAAC,KAAiB,EAAE,EAAE;YACzC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;YAChC,MAAM,WAAW,GAAG,KAAK,CAAC,aAA4B,CAAC;YACvD,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC;YACnE,uBAAA,IAAI,2CAAmB,MAAvB,IAAI,EAAoB,KAAK,CAAC,CAAC;QACjC,CAAC,EAAC;QAEF,iDAAwB,CAAC,KAAoB,EAAE,EAAE;YAC/C,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;YAChC,MAAM,aAAa,GACjB,KAAK,CAAC,GAAG,KAAK,cAAc;gBAC5B,CAAC,IAAI,CAAC,kBAAkB;gBACxB,CAAC,IAAI,CAAC,gBAAgB;gBACtB,IAAI,CAAC,gBAAgB,KAAK,CAAC,CAAC;YAE9B,MAAM,aAAa,GACjB,KAAK,CAAC,GAAG,KAAK,eAAe;gBAC7B,CAAC,IAAI,CAAC,kBAAkB;gBACxB,CAAC,IAAI,CAAC,gBAAgB,CAAC;YAEzB,MAAM,WAAW,GACf,KAAK,CAAC,GAAG,KAAK,UAAU;gBACxB,CAAC,KAAK,CAAC,GAAG,KAAK,eAAe;oBAC5B,CAAC,IAAI,CAAC,kBAAkB;oBACxB,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAE3B,IAAI,aAAa,EAAE;gBACjB,uBAAA,IAAI,0CAAkB,MAAtB,IAAI,CAAoB,CAAC;aAC1B;iBAAM,IAAI,aAAa,EAAE;gBACxB,uBAAA,IAAI,0CAAkB,MAAtB,IAAI,CAAoB,CAAC;aAC1B;iBAAM,IAAI,WAAW,EAAE;gBACtB,uBAAA,IAAI,qCAAa,MAAjB,IAAI,CAAe,CAAC;aACrB;QACH,CAAC,EAAC;QAEF,6CAAoB,GAAG,EAAE;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;YAC3C,uBAAA,IAAI,2CAAmB,MAAvB,IAAI,EAAoB,QAAQ,CAAC,CAAC;QACpC,CAAC,EAAC;QAEF,6CAAoB,GAAG,EAAE;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;YAC3C,uBAAA,IAAI,2CAAmB,MAAvB,IAAI,EAAoB,QAAQ,CAAC,CAAC;QACpC,CAAC,EAAC;QAEF,yCAAgB,GAAG,EAAE;YACnB,6BAA6B;YAC7B,IAAI,uBAAA,IAAI,wCAAgB,EAAE;gBACxB,YAAY,CAAC,uBAAA,IAAI,wCAAgB,CAAC,CAAC;aACpC;YAED,MAAM,eAAe,GACnB,IAAI,CAAC,cAAc,KAAK,MAAM;gBAC9B,CAAC,IAAI,CAAC,gBAAgB;gBACtB,CAAC,IAAI,CAAC,mBAAmB,CAAC;YAE5B,IAAI,CAAC,eAAe,EAAE;gBACpB,OAAO;aACR;YAED,MAAM,iBAAiB,GACrB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC1D,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;YAClD,MAAM,mBAAmB,GAAW,uBAAA,IAAI,uCAAe,MAAnB,IAAI,EAAgB,KAAK,CAAC,CAAC;YAE/D,sBAAsB;YACtB,IAAI,mBAAmB,EAAE;gBACvB,uBAAA,IAAI,oCAAmB,UAAU,CAAC,GAAG,EAAE;oBACrC,uBAAA,IAAI,0CAAkB,MAAtB,IAAI,CAAoB,CAAC;gBAC3B,CAAC,EAAE,mBAAmB,CAAC,MAAA,CAAC;aACzB;QACH,CAAC,EAAC;QAEF,0CAAiB,CACf,UAAkB,EAClB,cAAc,GAAG,IAAI,CAAC,cAAc,EAC5B,EAAE;YACV,MAAM,OAAO,GAAG,UAAU,GAAG,cAAc,CAAC;YAC5C,MAAM,YAAY,GAAG,OAAO,GAAG,KAAK,CAAC,CAAC,kCAAkC;YACxE,OAAO,YAAY,CAAC;QACtB,CAAC,EAAC;QAEF,yCAAgB,GAAG,EAAE;YACnB,uBAAA,IAAI,oCAAmB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;;gBACtD,MAAM,WAAW,GAAG,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;gBACrD,OAAO,CACL,eACE,KAAK,EAAC,gBAAgB,EACtB,GAAG,EAAE,CAAC,EAAe,EAAE,EAAE,CACvB,CAAC,uBAAA,IAAI,2CAAmB,CAAC,KAAK,CAAC,GAAG,EAAiB,CAAC;oBAGtD,WACE,KAAK,EAAC,qBAAqB,EAC3B,IAAI,EAAC,KAAK,gBACE,uBAAA,IAAI,yCAAiB,CAAC,SAAS,CAAC,qBAAqB;wBAEjE,WACE,KAAK,EAAC,yBAAyB,EAC/B,GAAG,EAAE,KAAK,CAAC,YAAY,CAAC,GAAG,EAC3B,GAAG,EAAE,KAAK,CAAC,YAAY,CAAC,GAAG,GAC3B,CACE;oBACN,eAAS,KAAK,EAAC,aAAa;wBAC1B,WAAK,KAAK,EAAC,uBAAuB;4BAChC,cAAQ,KAAK,EAAC,oBAAoB;gCAChC,WAAK,GAAG,EAAE,SAAS,EAAE,GAAG,EAAC,0BAA0B,GAAG;gCACtD,UAAI,KAAK,EAAC,mBAAmB,IAAE,KAAK,CAAC,KAAK,CAAM,CACzC;4BACT,WAAK,KAAK,EAAC,yBAAyB,IACjC,MAAA,KAAK,CAAC,WAAW;mCAAE,GAAG,CAAC,SAAS,CAAC,EAAE;oCAClC,OAAO,CACL,aACG,KAAK,CAAC,mBAAmB;wCACxB,CAAC,CAAC,uBAAA,IAAI,oCAAY,MAAhB,IAAI,EAAa,SAAS,CAAC;wCAC7B,CAAC,CAAC,SAAS,CACX,CACL,CAAC;gCACJ,CAAC,CAAC;gCACD,CAAA,MAAA,KAAK,CAAC,SAAS,0CAAE,MAAM,KAAI,CAC1B,UAAI,KAAK,EAAC,aAAa,IACpB,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;oCAC1B,OAAO,UAAI,KAAK,EAAC,kBAAkB,IAAE,IAAI,CAAM,CAAC;gCAClD,CAAC,CAAC,CACC,CACN,CACG;4BACL,WAAW,IAAI,CACd,cACE,KAAK,EAAC,6BAA6B,EACnC,OAAO,EAAE,uBAAA,IAAI,qCAAa,IAEzB,uBAAA,IAAI,yCAAiB,CAAC,kBAAkB,CAClC,CACV,CACG,CACE,CACF,CACX,CAAC;YACJ,CAAC,CAAC,MAAA,CAAC;QACL,CAAC,EAAC;QAEF,uCAAc,CAAC,SAAiB,EAAqB,EAAE;YACrD,OAAO,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBACrC,gCAAgC;gBAChC,OAAO,YAAM,KAAK,EAAC,aAAa;oBAAE,IAAI;wBAAS,CAAC;YAClD,CAAC,CAAC,CAAC;QACL,CAAC,EAAC;QAEF,8CAAqB,CAAC,aAAqB,EAAE,EAAE;YAC7C,IAAI,IAAI,CAAC,gBAAgB,EAAE;gBACzB,OAAO;aACR;YACD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;YAE/B,6BAA6B;YAC7B,MAAM,WAAW,GAAG,uBAAA,IAAI,2CAAmB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACnE,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;YAEpD,MAAM,kBAAkB,GAAG,uBAAA,IAAI,2CAAmB,CAAC,aAAa,CAAC,CAAC;YAClE,MAAM,0BAA0B,GAC9B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,mBAAmB,CAAC;YACjD,MAAM,mCAAmC,GACvC,uBAAA,IAAI,mEAA2C,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YACrE,IAAI,UAAU,CAAC;YACf,IAAI,aAAsC,CAAC;YAC3C,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,IAAI,0BAA0B,EAAE;gBAC9B,aAAa,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;gBACzE,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC;gBAClC,YAAY,GAAG,UAAU,GAAG,2BAA2B,CAAC;aACzD;YAED,IAAI,CAAC,gBAAgB,GAAG,aAAa,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YAEjE,yCAAyC;YACzC,UAAU,CAAC,GAAG,EAAE;gBACd,kBAAkB,CAAC,SAAS,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;gBAExD,IAAI,0BAA0B,IAAI,CAAC,mCAAmC,EAAE;oBACtE,uBAAA,IAAI,mEAA2C,CAAC,GAAG,CACjD,aAAa,EACb,IAAI,CACL,CAAC;oBACF,uBAAA,IAAI,sCAAc,MAAlB,IAAI,EAAe,aAAa,CAAC,CAAC;oBAClC,UAAU,CAAC,GAAG,EAAE;wBACd,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;oBAClC,CAAC,EAAE,YAAY,CAAC,CAAC;iBAClB;qBAAM;oBACL,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;iBACjC;YACH,CAAC,EAAE,mBAAmB,CAAC,CAAC;YAExB,4BAA4B;YAC5B,IAAI,CAAC,gBAAgB,GAAG,aAAa,CAAC;YACtC,uBAAA,IAAI,sCAAc,MAAlB,IAAI,CAAgB,CAAC,CAAC,gDAAgD;QACxE,CAAC,EAAC;gCA7RkC,CAAC;6BAKH,KAAK;iCAKD,IAAI;gCAKL,KAAK;6BAKR,KAAK;kCAKA,KAAK;mCAKJ,KAAK;8BAKK,MAAM;8BAKd,GAAG;;sBAUN,EAAE;;IAEzC,KAAK,CAAC,iBAAiB;QACrB,uBAAA,IAAI,qCAAoB,MAAM,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,MAAA,CAAC;QAClE,uBAAA,IAAI,sCAAc,MAAlB,IAAI,CAAgB,CAAC;IACvB,CAAC;IAED,gBAAgB;QACd,uBAAA,IAAI,2CAAmB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,GAAG,CAC1D,qBAAqB,CACtB,CAAC;QACF,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,uBAAA,IAAI,kDAA0B,MAA9B,IAAI,CAA4B,CAAC;IACnC,CAAC;IAgOD,MAAM;QACJ,OAAO,CACL,EAAC,IAAI;YACH,gBAAU,KAAK,EAAE,WAAW,GAAa;YACzC,WACE,KAAK,EAAE;oBACL,MAAM,EAAE,IAAI;oBACZ,eAAe,EAAE,IAAI,CAAC,aAAa;oBACnC,mBAAmB,EAAE,IAAI,CAAC,gBAAgB;iBAC3C,EACD,KAAK,EAAE,EAAE,uBAAuB,EAAE,GAAG,mBAAmB,IAAI,EAAE;gBAE9D,eAAS,KAAK,EAAC,OAAO;oBACpB,cAAQ,KAAK,EAAC,eAAe;wBAC3B,cACE,KAAK,EAAC,6CAA6C,gBACxC,oBAAoB,EAC/B,OAAO,EAAE,uBAAA,IAAI,qCAAa;4BAE1B,gBAAU,KAAK,EAAC,SAAS,EAAC,GAAG,EAAE,UAAU,GAAa,CAC/C,CACF;oBACT,WAAK,KAAK,EAAC,kBAAkB,IAAE,uBAAA,IAAI,wCAAgB,CAAO;oBAC1D;wBACE,sBAAsB;wBACtB,KAAK,EAAE;4BACL,eAAe,EAAE,IAAI;4BACrB,0BAA0B,EAAE,IAAI,CAAC,gBAAgB;yBAClD;wBAED,WACE,KAAK,EAAE;gCACL,uBAAuB,EAAE,IAAI;gCAC7B,8BAA8B,EAAE,IAAI,CAAC,gBAAgB;6BACtD;4BAED,UAAI,KAAK,EAAC,aAAa,gBAAY,kBAAkB,IAClD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;gCAC5B,OAAO,CACL,UACE,KAAK,EAAE;wCACL,YAAY,EAAE,IAAI;wCAClB,qBAAqB,EAAE,IAAI,CAAC,kBAAkB;wCAC9C,CAAC,qBAAqB,CAAC,EACrB,KAAK,KAAK,IAAI,CAAC,gBAAgB;qCAClC,gBACW,KAAK,EACjB,OAAO,EACL,CAAC,IAAI,CAAC,kBAAkB,IAAI,uBAAA,IAAI,2CAAmB,GAEjD,CACP,CAAC;4BACJ,CAAC,CAAC,CACC,CACD,CACC,CACD,CACN,CACD,CACR,CAAC;IACJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CACF","sourcesContent":["// Stencil\nimport {\n Component,\n Host,\n h,\n Prop,\n Element,\n State,\n getAssetPath\n} from \"@stencil/core\";\n// Other Libraries\nimport { MercuryBundles, getIconPath } from \"@genexus/mercury\";\n\n// Custom Imports\nimport { Locale } from \"../../common/locale\";\n\nconst ACTIVE_SLIDE_SELECTOR = \"active\";\nconst ARROW_LEFT_KEY = \"ArrowLeft\";\nconst ARROW_RIGHT_KEY = \"ArrowRight\";\nconst ESCAPE_KEY = \"Escape\";\nconst SLIDE_FADE_DURATION = 300;\nconst SLIDE_WORD_SELECTOR = \".slide__word\";\nconst SLIDE_WORD_SELECTOR_TIMEOUT = 70;\nconst SLIDE_WORD_SELECTOR_VISIBLE = \"slide__word--visible\";\n\n// icons\nconst ICON_NEXT = getAssetPath(\n `./gx-ide-assets/welcome-page/images/icon-next.svg`\n);\nconst CLOSE_ICON = getIconPath({\n category: \"system\",\n name: \"close\",\n colorType: \"on-elevation\"\n});\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"utils/typography\",\n \"components/icon\",\n \"components/button\"\n];\n\n@Component({\n tag: \"gx-ide-welcome-page\",\n styleUrl: \"welcome-page.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/welcome-page\"]\n})\nexport class GxIdeWelcomePage {\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 #slidesDescriptionAsChunksAlreadyDisplayed: Map<number, boolean> = new Map();\n #slidesElements: HTMLElement[] = [];\n #slidesElementsRef: HTMLElement[] = [];\n // #slidesDescriptionAsChunksAlreadyDisplayed is used to know if the description of a slide\n // that is set to be displayed as chunks, has already been displayed. Used to not display\n // as chunks after the first time.\n #slideTimeOutId: NodeJS.Timeout;\n\n @Element() el: HTMLGxIdeWelcomePageElement;\n\n /**\n * The current active slide index from 'slides' Prop. It does not considers the very first slide \"Copyright\".\n */\n @State() activeSlideIndex: number = 0;\n\n /**\n * When true the slider will be visible. Used to display and hide the slide with a smooth transition.\n */\n @State() displaySlider: boolean = false;\n\n /**\n * True if the very first slide is visible (The copyright slide)\n */\n @State() copyrightsVisible: boolean = true;\n\n /**\n * True if the user has reached the last slide. Used to hide/disable the navigation.\n */\n @State() lastSlideReached: boolean = false;\n\n /**\n * When true the slider will be visible. Used to display and hide the slider with a smooth transition.\n */\n @State() sliderVisible: boolean = false;\n\n /**\n * True if a slide is transitioning, false otherwise. Used to disable the navigation arrows while transitioning.\n */\n @State() slideTransitioning: boolean = false;\n\n /**\n * True if the user has changed slides by clicking on the navigation dots, or by using the keyboard arrows. This is used to know evaluate the slide transition setTimeOut. If the user has navigated, automatic slide transition should be turned off.\n */\n @State() userHasChangedSlide: boolean = false;\n\n /**\n * The transition type between the slides. \"static\" requires the user to navigate by clicking the navigation dots. \"auto\" will transition automatically after a calculated amount of time.\n */\n @Prop() readonly transitionType: TransitionType = \"auto\";\n\n /**\n * The estimated amount of words per minute that the user requires to read a slide. This value is used to return the time each slide is freezed before transitioning to the next one. Only evaluated when transitionType is set to \"auto\".\n */\n @Prop() readonly wordsPerMinute: number = 250;\n\n /**\n * Callback invoked when the user closes the slider by pressing the close button.\n */\n @Prop() readonly closeCallback!: CloseCallback;\n\n /**\n * An array of slides, with the information that each slide requires. This slides appear after the first slide (Copyrights) that is defined inside the component.\n */\n @Prop() readonly slides: SlideInfo[] = [];\n\n async componentWillLoad() {\n this.#componentLocale = await Locale.getComponentStrings(this.el);\n this.#renderSlides();\n }\n\n componentDidLoad() {\n this.#slidesElementsRef[this.activeSlideIndex].classList.add(\n ACTIVE_SLIDE_SELECTOR\n );\n this.sliderVisible = true;\n this.#initiateSlidesTransition();\n }\n\n #closeSlider = () => {\n this.sliderVisible = false;\n setTimeout(() => {\n // wait until the slide disappears, then remove.\n this.el.remove();\n this.closeCallback();\n document.removeEventListener(\"keydown\", this.#keyboardEventHandler);\n }, SLIDE_FADE_DURATION);\n };\n\n #initiateSlidesTransition = () => {\n this.#slideTimeOut();\n // listen to keydown events to navigate the slides with the arrows\n document.addEventListener(\"keydown\", this.#keyboardEventHandler);\n };\n\n #displayWords = (wordsNodeList: NodeListOf<HTMLElement>) => {\n wordsNodeList.forEach((word, index) => {\n setTimeout(() => {\n word.classList.add(SLIDE_WORD_SELECTOR_VISIBLE);\n }, index * SLIDE_WORD_SELECTOR_TIMEOUT);\n });\n };\n\n #dotClickedHandler = (event: MouseEvent) => {\n this.userHasChangedSlide = true;\n const itemClicked = event.currentTarget as HTMLElement;\n const index = parseInt(itemClicked.getAttribute(\"data-index\"), 10);\n this.#updateActiveSlide(index);\n };\n\n #keyboardEventHandler = (event: KeyboardEvent) => {\n this.userHasChangedSlide = true;\n const goToPrevSlide =\n event.key === ARROW_LEFT_KEY &&\n !this.slideTransitioning &&\n !this.lastSlideReached &&\n this.activeSlideIndex !== 0;\n\n const goToNextSlide =\n event.key === ARROW_RIGHT_KEY &&\n !this.slideTransitioning &&\n !this.lastSlideReached;\n\n const closeSlider =\n event.key === ESCAPE_KEY ||\n (event.key === ARROW_RIGHT_KEY &&\n !this.slideTransitioning &&\n this.lastSlideReached);\n\n if (goToNextSlide) {\n this.#nextSlideHandler();\n } else if (goToPrevSlide) {\n this.#prevSlideHandler();\n } else if (closeSlider) {\n this.#closeSlider();\n }\n };\n\n #nextSlideHandler = () => {\n const newIndex = this.activeSlideIndex + 1;\n this.#updateActiveSlide(newIndex);\n };\n\n #prevSlideHandler = () => {\n const newIndex = this.activeSlideIndex - 1;\n this.#updateActiveSlide(newIndex);\n };\n\n #slideTimeOut = () => {\n // Clear any existing timeout\n if (this.#slideTimeOutId) {\n clearTimeout(this.#slideTimeOutId);\n }\n\n const autoChangeSlide =\n this.transitionType === \"auto\" &&\n !this.lastSlideReached &&\n !this.userHasChangedSlide;\n\n if (!autoChangeSlide) {\n return;\n }\n\n const mergedDescription =\n this.slides[this.activeSlideIndex].description.join(\"\");\n const words = mergedDescription.split(\" \").length;\n const timeBeforeNextSlide: number = this.#secondsToRead(words);\n\n // Set a fresh timeout\n if (timeBeforeNextSlide) {\n this.#slideTimeOutId = setTimeout(() => {\n this.#nextSlideHandler();\n }, timeBeforeNextSlide);\n }\n };\n\n #secondsToRead = (\n wordsCount: number,\n wordsPerMinute = this.wordsPerMinute\n ): number => {\n const minutes = wordsCount / wordsPerMinute;\n const milliseconds = minutes * 60000; // Convert minutes to milliseconds\n return milliseconds;\n };\n\n #renderSlides = () => {\n this.#slidesElements = this.slides.map((slide, index) => {\n const isLastSlide = index === this.slides.length - 1;\n return (\n <section\n class=\"slide__wrapper\"\n ref={(el: HTMLElement) =>\n (this.#slidesElementsRef[index] = el as HTMLElement)\n }\n >\n <div\n class=\"slide__illustration\"\n role=\"img\"\n aria-label={this.#componentLocale.copyright.illustrationAriaLabel}\n >\n <img\n class=\"slide__illustration-img\"\n src={slide.illustration.url}\n alt={slide.illustration.alt}\n />\n </div>\n <section class=\"slide__copy\">\n <div class=\"slide__copy-container\">\n <header class=\"slide__copy-header\">\n <img src={ICON_NEXT} alt=\"GeneXus Next isologotype\" />\n <h2 class=\"slide__copy-title\">{slide.title}</h2>\n </header>\n <div class=\"slide__copy-description\">\n {slide.description?.map(paragraph => {\n return (\n <p>\n {slide.descriptionAsChunks\n ? this.#splitWords(paragraph)\n : paragraph}\n </p>\n );\n })}\n {slide.listItems?.length && (\n <ul class=\"slide__list\">\n {slide.listItems.map(item => {\n return <li class=\"slide__list-item\">{item}</li>;\n })}\n </ul>\n )}\n </div>\n {isLastSlide && (\n <button\n class=\"button-primary start-button\"\n onClick={this.#closeSlider}\n >\n {this.#componentLocale.startButtonCaption}\n </button>\n )}\n </div>\n </section>\n </section>\n );\n });\n };\n\n #splitWords = (paragraph: string): HTMLSpanElement[] => {\n return paragraph.split(\" \").map(word => {\n // keep the space after {word} !\n return <span class=\"slide__word\">{word} </span>;\n });\n };\n\n #updateActiveSlide = (newSlideIndex: number) => {\n if (this.lastSlideReached) {\n return;\n }\n this.slideTransitioning = true;\n\n // unset current active slide\n const activeSlide = this.#slidesElementsRef[this.activeSlideIndex];\n activeSlide.classList.remove(ACTIVE_SLIDE_SELECTOR);\n\n const nextSlideReference = this.#slidesElementsRef[newSlideIndex];\n const displayDescriptionAsChunks =\n this.slides[newSlideIndex].descriptionAsChunks;\n const descriptionAsChunksDisplayedAlready =\n this.#slidesDescriptionAsChunksAlreadyDisplayed.get(newSlideIndex);\n let wordsCount;\n let wordsNodeList: NodeListOf<HTMLElement>;\n let slideTimeOut = 0;\n if (displayDescriptionAsChunks) {\n wordsNodeList = nextSlideReference.querySelectorAll(SLIDE_WORD_SELECTOR);\n wordsCount = wordsNodeList.length;\n slideTimeOut = wordsCount * SLIDE_WORD_SELECTOR_TIMEOUT;\n }\n\n this.lastSlideReached = newSlideIndex === this.slides.length - 1;\n\n // set new slide as active after fade out\n setTimeout(() => {\n nextSlideReference.classList.add(ACTIVE_SLIDE_SELECTOR);\n\n if (displayDescriptionAsChunks && !descriptionAsChunksDisplayedAlready) {\n this.#slidesDescriptionAsChunksAlreadyDisplayed.set(\n newSlideIndex,\n true\n );\n this.#displayWords(wordsNodeList);\n setTimeout(() => {\n this.slideTransitioning = false;\n }, slideTimeOut);\n } else {\n this.slideTransitioning = false;\n }\n }, SLIDE_FADE_DURATION);\n\n // update active slide index\n this.activeSlideIndex = newSlideIndex;\n this.#slideTimeOut(); // this has to be after this.#updateActiveSlide.\n };\n\n render() {\n return (\n <Host>\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <div\n class={{\n \"main\": true,\n \"main--visible\": this.sliderVisible,\n \"main--border-glow\": this.lastSlideReached\n }}\n style={{ \"--slide-fade-duration\": `${SLIDE_FADE_DURATION}ms` }}\n >\n <section class=\"slide\">\n <header class=\"slide__header\">\n <button\n class=\"button-tertiary button-icon-only close-icon\"\n aria-label=\"close presentation\"\n onClick={this.#closeSlider}\n >\n <ch-image class=\"icon-md\" src={CLOSE_ICON}></ch-image>\n </button>\n </header>\n <div class=\"slide__container\">{this.#slidesElements}</div>\n <footer\n // slide common footer\n class={{\n \"slide__footer\": true,\n \"slide__footer-last-slide\": this.lastSlideReached\n }}\n >\n <div\n class={{\n \"slide__footer-wrapper\": true,\n \"slide__footer-wrapper-hidden\": this.lastSlideReached\n }}\n >\n <ul class=\"slide__dots\" aria-label=\"Slide indicators\">\n {this.slides.map((_, index) => {\n return (\n <li\n class={{\n \"slide__dot\": true,\n \"slide__dot-inactive\": this.slideTransitioning,\n [ACTIVE_SLIDE_SELECTOR]:\n index === this.activeSlideIndex\n }}\n data-index={index}\n onClick={\n !this.slideTransitioning && this.#dotClickedHandler\n }\n ></li>\n );\n })}\n </ul>\n </div>\n </footer>\n </section>\n </div>\n </Host>\n );\n }\n}\n\nexport type SlideInfo = {\n illustration: {\n url: string;\n alt: string;\n };\n title: string;\n description?: string[];\n descriptionAsChunks?: boolean;\n listItems?: string[];\n};\n\nexport type CloseCallback = () => Promise<void>;\nexport type TransitionType = \"static\" | \"auto\";\n"]}
|
|
1
|
+
{"version":3,"file":"welcome-page.js","sourceRoot":"","sources":["../../../src/components/welcome-page/welcome-page.tsx"],"names":[],"mappings":"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","sourcesContent":["// Stencil\nimport {\n Component,\n Host,\n h,\n Prop,\n Element,\n State,\n getAssetPath\n} from \"@stencil/core\";\n// Other Libraries\nimport { MercuryBundles, getIconPath } from \"@genexus/mercury\";\n\n// Custom Imports\nimport { Locale } from \"../../common/locale\";\n\nconst ACTIVE_SLIDE_SELECTOR = \"active\";\nconst ARROW_LEFT_KEY = \"ArrowLeft\";\nconst ARROW_RIGHT_KEY = \"ArrowRight\";\nconst ESCAPE_KEY = \"Escape\";\nconst SLIDE_FADE_DURATION = 300;\nconst SLIDE_WORD_SELECTOR = \".slide__word\";\nconst SLIDE_WORD_SELECTOR_TIMEOUT = 70;\nconst SLIDE_WORD_SELECTOR_VISIBLE = \"slide__word--visible\";\n\n// icons\nconst ICON_NEXT = getAssetPath(\n `./gx-ide-assets/welcome-page/images/icon-next.svg`\n);\nconst CLOSE_ICON = getIconPath({\n category: \"system\",\n name: \"close\",\n colorType: \"on-elevation\"\n});\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"utils/typography\",\n \"components/icon\",\n \"components/button\"\n];\n\n@Component({\n tag: \"gx-ide-welcome-page\",\n styleUrl: \"welcome-page.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/welcome-page\"]\n})\nexport class GxIdeWelcomePage {\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 #slidesDescriptionAsChunksAlreadyDisplayed: Map<number, boolean> = new Map();\n #slidesElements: HTMLElement[] = [];\n #slidesElementsRef: HTMLElement[] = [];\n // #slidesDescriptionAsChunksAlreadyDisplayed is used to know if the description of a slide\n // that is set to be displayed as chunks, has already been displayed. Used to not display\n // as chunks after the first time.\n #slideTimeOutId: NodeJS.Timeout;\n\n @Element() el: HTMLGxIdeWelcomePageElement;\n\n /**\n * The current active slide index from 'slides' Prop. It does not considers the very first slide \"Copyright\".\n */\n @State() activeSlideIndex: number = 0;\n\n /**\n * When true the slider will be visible. Used to display and hide the slide with a smooth transition.\n */\n @State() displaySlider: boolean = false;\n\n /**\n * True if the very first slide is visible (The copyright slide)\n */\n @State() copyrightsVisible: boolean = true;\n\n /**\n * True if the user has reached the last slide. Used to hide/disable the navigation.\n */\n @State() lastSlideReached: boolean = false;\n\n /**\n * When true the slider will be visible. Used to display and hide the slider with a smooth transition.\n */\n @State() sliderVisible: boolean = false;\n\n /**\n * True if a slide is transitioning, false otherwise. Used to disable the navigation arrows while transitioning.\n */\n @State() slideTransitioning: boolean = false;\n\n /**\n * True if the user has changed slides by clicking on the navigation dots, or by using the keyboard arrows. This is used to know evaluate the slide transition setTimeOut. If the user has navigated, automatic slide transition should be turned off.\n */\n @State() userHasChangedSlide: boolean = false;\n\n /**\n * The transition type between the slides. \"static\" requires the user to navigate by clicking the navigation dots. \"auto\" will transition automatically after a calculated amount of time.\n */\n @Prop() readonly transitionType: TransitionType = \"auto\";\n\n /**\n * The estimated amount of words per minute that the user requires to read a slide. This value is used to return the time each slide is freezed before transitioning to the next one. Only evaluated when transitionType is set to \"auto\".\n */\n @Prop() readonly wordsPerMinute: number = 250;\n\n /**\n * Callback invoked when the user closes the slider by pressing the close button.\n */\n @Prop() readonly closeCallback!: CloseCallback;\n\n /**\n * An array of slides, with the information that each slide requires. This slides appear after the first slide (Copyrights) that is defined inside the component.\n */\n @Prop() readonly slides: SlideInfo[] = [];\n\n async componentWillLoad() {\n this.#componentLocale = await Locale.getComponentStrings(this.el);\n this.#renderSlides();\n }\n\n componentDidLoad() {\n this.#slidesElementsRef[this.activeSlideIndex].classList.add(\n ACTIVE_SLIDE_SELECTOR\n );\n this.sliderVisible = true;\n this.#initiateSlidesTransition();\n }\n\n #closeSlider = () => {\n this.sliderVisible = false;\n setTimeout(() => {\n // wait until the slide disappears, then remove.\n this.el.remove();\n this.closeCallback();\n document.removeEventListener(\"keydown\", this.#keyboardEventHandler);\n }, SLIDE_FADE_DURATION);\n };\n\n #initiateSlidesTransition = () => {\n this.#slideTimeOut();\n // listen to keydown events to navigate the slides with the arrows\n document.addEventListener(\"keydown\", this.#keyboardEventHandler);\n };\n\n #displayWords = (wordsNodeList: NodeListOf<HTMLElement>) => {\n wordsNodeList.forEach((word, index) => {\n setTimeout(() => {\n word.classList.add(SLIDE_WORD_SELECTOR_VISIBLE);\n }, index * SLIDE_WORD_SELECTOR_TIMEOUT);\n });\n };\n\n #dotClickedHandler = (event: MouseEvent) => {\n this.userHasChangedSlide = true;\n const itemClicked = event.currentTarget as HTMLElement;\n const index = parseInt(itemClicked.getAttribute(\"data-index\"), 10);\n this.#updateActiveSlide(index);\n };\n\n #keyboardEventHandler = (event: KeyboardEvent) => {\n this.userHasChangedSlide = true;\n const goToPrevSlide =\n event.key === ARROW_LEFT_KEY &&\n !this.slideTransitioning &&\n !this.lastSlideReached &&\n this.activeSlideIndex !== 0;\n\n const goToNextSlide =\n event.key === ARROW_RIGHT_KEY &&\n !this.slideTransitioning &&\n !this.lastSlideReached;\n\n const closeSlider =\n event.key === ESCAPE_KEY ||\n (event.key === ARROW_RIGHT_KEY &&\n !this.slideTransitioning &&\n this.lastSlideReached);\n\n if (goToNextSlide) {\n this.#nextSlideHandler();\n } else if (goToPrevSlide) {\n this.#prevSlideHandler();\n } else if (closeSlider) {\n this.#closeSlider();\n }\n };\n\n #nextSlideHandler = () => {\n const newIndex = this.activeSlideIndex + 1;\n this.#updateActiveSlide(newIndex);\n };\n\n #prevSlideHandler = () => {\n const newIndex = this.activeSlideIndex - 1;\n this.#updateActiveSlide(newIndex);\n };\n\n #slideTimeOut = () => {\n // Clear any existing timeout\n if (this.#slideTimeOutId) {\n clearTimeout(this.#slideTimeOutId);\n }\n\n const autoChangeSlide =\n this.transitionType === \"auto\" &&\n !this.lastSlideReached &&\n !this.userHasChangedSlide;\n\n if (!autoChangeSlide) {\n return;\n }\n\n const mergedDescription =\n this.slides[this.activeSlideIndex].description.join(\"\");\n const words = mergedDescription.split(\" \").length;\n const timeBeforeNextSlide: number = this.#secondsToRead(words);\n\n // Set a fresh timeout\n if (timeBeforeNextSlide) {\n this.#slideTimeOutId = setTimeout(() => {\n this.#nextSlideHandler();\n }, timeBeforeNextSlide);\n }\n };\n\n #secondsToRead = (\n wordsCount: number,\n wordsPerMinute = this.wordsPerMinute\n ): number => {\n const minutes = wordsCount / wordsPerMinute;\n const milliseconds = minutes * 60000; // Convert minutes to milliseconds\n return milliseconds;\n };\n\n #renderSlides = () => {\n this.#slidesElements = this.slides.map((slide, index) => {\n const isLastSlide = index === this.slides.length - 1;\n return (\n <section\n class=\"slide__wrapper\"\n ref={(el: HTMLElement) =>\n (this.#slidesElementsRef[index] = el as HTMLElement)\n }\n >\n <div\n class=\"slide__illustration\"\n role=\"img\"\n aria-label={this.#componentLocale.copyright.illustrationAriaLabel}\n >\n <img\n class=\"slide__illustration-img\"\n src={slide.illustration.url}\n alt={slide.illustration.alt}\n />\n </div>\n <section class=\"slide__copy\">\n <div class=\"slide__copy-container\">\n <header class=\"slide__copy-header\">\n <img src={ICON_NEXT} alt=\"GeneXus Next isologotype\" />\n <h2 class=\"slide__copy-title\">{slide.title}</h2>\n </header>\n <div class=\"slide__copy-description\">\n {slide.description?.map(paragraph => {\n return (\n <p>\n {slide.descriptionAsChunks\n ? this.#splitWords(paragraph)\n : paragraph}\n </p>\n );\n })}\n {slide.listItems?.length && (\n <ul class=\"slide__list\">\n {slide.listItems.map(item => {\n return (\n <li class=\"slide__list-item\">\n <strong class=\"slide__list-item-title\">\n {item.title}\n </strong>{\" \"}\n {item.description}\n </li>\n );\n })}\n </ul>\n )}\n </div>\n {isLastSlide && (\n <button\n class=\"button-primary start-button\"\n onClick={this.#closeSlider}\n >\n {this.#componentLocale.startButtonCaption}\n </button>\n )}\n </div>\n </section>\n </section>\n );\n });\n };\n\n #splitWords = (paragraph: string): HTMLSpanElement[] => {\n return paragraph.split(\" \").map(word => {\n // keep the space after {word} !\n return <span class=\"slide__word\">{word} </span>;\n });\n };\n\n #updateActiveSlide = (newSlideIndex: number) => {\n if (this.lastSlideReached) {\n return;\n }\n this.slideTransitioning = true;\n\n // unset current active slide\n const activeSlide = this.#slidesElementsRef[this.activeSlideIndex];\n activeSlide.classList.remove(ACTIVE_SLIDE_SELECTOR);\n\n const nextSlideReference = this.#slidesElementsRef[newSlideIndex];\n const displayDescriptionAsChunks =\n this.slides[newSlideIndex].descriptionAsChunks;\n const descriptionAsChunksDisplayedAlready =\n this.#slidesDescriptionAsChunksAlreadyDisplayed.get(newSlideIndex);\n let wordsCount;\n let wordsNodeList: NodeListOf<HTMLElement>;\n let slideTimeOut = 0;\n if (displayDescriptionAsChunks) {\n wordsNodeList = nextSlideReference.querySelectorAll(SLIDE_WORD_SELECTOR);\n wordsCount = wordsNodeList.length;\n slideTimeOut = wordsCount * SLIDE_WORD_SELECTOR_TIMEOUT;\n }\n\n this.lastSlideReached = newSlideIndex === this.slides.length - 1;\n\n // set new slide as active after fade out\n setTimeout(() => {\n nextSlideReference.classList.add(ACTIVE_SLIDE_SELECTOR);\n\n if (displayDescriptionAsChunks && !descriptionAsChunksDisplayedAlready) {\n this.#slidesDescriptionAsChunksAlreadyDisplayed.set(\n newSlideIndex,\n true\n );\n this.#displayWords(wordsNodeList);\n setTimeout(() => {\n this.slideTransitioning = false;\n }, slideTimeOut);\n } else {\n this.slideTransitioning = false;\n }\n }, SLIDE_FADE_DURATION);\n\n // update active slide index\n this.activeSlideIndex = newSlideIndex;\n this.#slideTimeOut(); // this has to be after this.#updateActiveSlide.\n };\n\n render() {\n return (\n <Host>\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <div\n class={{\n \"main\": true,\n \"main--visible\": this.sliderVisible,\n \"main--border-glow\": this.lastSlideReached\n }}\n style={{ \"--slide-fade-duration\": `${SLIDE_FADE_DURATION}ms` }}\n >\n <section class=\"slide\">\n <header class=\"slide__header\">\n <button\n class=\"button-tertiary button-icon-only close-icon\"\n aria-label=\"close presentation\"\n onClick={this.#closeSlider}\n >\n <ch-image class=\"icon-md\" src={CLOSE_ICON}></ch-image>\n </button>\n </header>\n <div class=\"slide__container\">{this.#slidesElements}</div>\n <footer\n // slide common footer\n class={{\n \"slide__footer\": true,\n \"slide__footer-last-slide\": this.lastSlideReached\n }}\n >\n <div\n class={{\n \"slide__footer-wrapper\": true,\n \"slide__footer-wrapper-hidden\": this.lastSlideReached\n }}\n >\n <ul class=\"slide__dots\" aria-label=\"Slide indicators\">\n {this.slides.map((_, index) => {\n return (\n <li\n class={{\n \"slide__dot\": true,\n \"slide__dot-inactive\": this.slideTransitioning,\n [ACTIVE_SLIDE_SELECTOR]:\n index === this.activeSlideIndex\n }}\n data-index={index}\n onClick={\n !this.slideTransitioning && this.#dotClickedHandler\n }\n ></li>\n );\n })}\n </ul>\n </div>\n </footer>\n </section>\n </div>\n </Host>\n );\n }\n}\n\nexport type SlideInfo = {\n illustration: {\n url: string;\n alt: string;\n };\n title: string;\n description?: string[];\n descriptionAsChunks?: boolean;\n listItems?: Array<{\n title: string;\n description: string;\n }>;\n};\n\nexport type CloseCallback = () => Promise<void>;\nexport type TransitionType = \"static\" | \"auto\";\n"]}
|