@genexus/genexus-ide-ui 1.0.3 → 1.0.4
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-container_2.cjs.entry.js.map +1 -1
- package/dist/cjs/gx-ide-loader.cjs.entry.js +1 -1
- package/dist/cjs/gx-ide-loader.cjs.entry.js.map +1 -1
- package/dist/cjs/gx-ide-start-page.cjs.entry.js +1 -1
- package/dist/cjs/gx-ide-start-page.cjs.entry.js.map +1 -1
- package/dist/collection/components/_helpers/container/container.js.map +1 -1
- package/dist/collection/components/_helpers/ide-loader/ide-loader.css +1 -0
- package/dist/collection/components/start-page/start-page.js +1 -1
- package/dist/collection/components/start-page/start-page.js.map +1 -1
- package/dist/components/container.js.map +1 -1
- package/dist/components/gx-ide-start-page.js +1 -1
- package/dist/components/gx-ide-start-page.js.map +1 -1
- package/dist/components/ide-loader.js +1 -1
- package/dist/components/ide-loader.js.map +1 -1
- package/dist/esm/gx-ide-container_2.entry.js.map +1 -1
- package/dist/esm/gx-ide-loader.entry.js +1 -1
- package/dist/esm/gx-ide-loader.entry.js.map +1 -1
- package/dist/esm/gx-ide-start-page.entry.js +1 -1
- package/dist/esm/gx-ide-start-page.entry.js.map +1 -1
- package/dist/genexus-ide-ui/genexus-ide-ui.esm.js +1 -1
- package/dist/genexus-ide-ui/p-7ac25fc3.entry.js.map +1 -1
- package/dist/genexus-ide-ui/{p-cb0e11db.entry.js → p-dd07e68a.entry.js} +2 -2
- package/dist/genexus-ide-ui/p-dd07e68a.entry.js.map +1 -0
- package/dist/genexus-ide-ui/{p-bbb30314.entry.js → p-eb49e4f1.entry.js} +2 -2
- package/dist/genexus-ide-ui/p-eb49e4f1.entry.js.map +1 -0
- package/package.json +3 -6
- package/dist/genexus-ide-ui/p-bbb30314.entry.js.map +0 -1
- package/dist/genexus-ide-ui/p-cb0e11db.entry.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["containerCss","GxIdeContainer","this","headingClasses","heading","inactiveTitle","titleType","noHeadingBorder","hasOnlyHeading","headingJustify","noHeadingPadding","noHeadingPaddingBlockEnd","noHeadingGap","headingPaddingTop","_a","containerTitle","length","titleHeightAsInput","flexRow","contentClasses","content","flexContent","noContentPadding","noContentGap","noContentBorderTop","contentBorderEnd","alignItems","undefined","justifyContent","aboveFooter","hasAboveFooterSlot","h","class","noBorderAboveFooter","noAboveFooterPadding","slimmerFooter","name","footer","hasFooterSlot","hasOnlyFooter","hasSlottedContent","noBorderFooter","footerJustify","noFooterPadding","componentWillLoad","evaluateSlots","headerSlot","el","querySelectorAll","hasHeaderSlot","slottedContent","footerAboveSlot","footerStartSlot","footerEndSlot","evaluateSections","hasOnlyContent","render","result","type","alignment","titleAlignment","part","Host","container","sectionsPadding","displayBorder","displayBorderTop","displayBorderEnd","displayBorderBottom","displayBorderStart","titleCss","GxIdeTitle","geminiType"],"sources":["src/components/_helpers/container/container.scss?tag=gx-ide-container&encapsulation=shadow","src/components/_helpers/container/container.tsx","src/components/_helpers/title/title.scss?tag=gx-ide-title&encapsulation=shadow","src/components/_helpers/title/title.tsx"],"sourcesContent":["@import \"../../../../node_modules/@genexus/gemini/dist/gemini/globals/mixins.scss\";\n\n/*******************************\nHOST / GENERAL\n********************************/\n:host {\n --gx-ide-container-elements-spacing: var(--mer-spacing--xs);\n display: block;\n height: 100%;\n box-sizing: border-box;\n}\n.container {\n display: grid;\n height: 100%;\n grid-template-rows: auto 1fr auto;\n box-sizing: border-box;\n}\n.heading,\n.content,\n.footer,\n.footer-above {\n padding: var(--gx-ide-container__padding);\n}\n/*PADDING*/\n.container--padding-s {\n --gx-ide-container__padding: var(--mer-spacing--xs);\n}\n.container--padding-m {\n --gx-ide-container__padding: var(--mer-spacing--sm);\n}\n.container--padding-l {\n --gx-ide-container__padding: var(--mer-spacing--md);\n}\n/*BORDERS*/\n.container--display-border {\n border: 1px solid var(--gx-ide-container-border-color);\n}\n.container--display-border-top {\n border-top: 1px solid var(--gx-ide-container-border-color);\n}\n.container--display-border-end {\n border-inline-end: 1px solid var(--gx-ide-container-border-color);\n}\n.container--display-border-bottom {\n border-bottom: 1px solid var(--gx-ide-container-border-color);\n}\n.container--display-border-start {\n border-inline-start: 1px solid var(--gx-ide-container-border-color);\n}\n.container--overflow-hidden-y {\n overflow-y: hidden;\n}\n/*******************************\nHEADING\n********************************/\n.heading {\n // @include gxg-flex-justify();\n display: flex;\n flex-direction: column;\n gap: var(--gx-ide-container__padding);\n width: 100%;\n box-sizing: border-box;\n border-bottom: 1px solid var(--gx-ide-container-border-color);\n &--no-border {\n border-bottom: 0;\n }\n &--no-padding {\n padding: 0;\n }\n &--no-padding-block-end {\n padding-block-end: 0;\n }\n &--no-gap {\n gap: 0;\n }\n &--inactive {\n color: var(--gxg-color--disabled);\n }\n &--padding-top {\n padding: var(--gx-ide-container__padding) 0 0 0;\n }\n &--slimmer {\n padding-top: var(--mer-spacing--xs);\n padding-bottom: var(--mer-spacing--xs);\n }\n &--form-text-height {\n .heading__title {\n min-height: var(--gxg-form-text-height);\n justify-content: center;\n }\n }\n &--flex-row {\n flex-direction: row;\n align-items: center;\n justify-content: center;\n }\n}\n/*******************************\nCONTENT\n********************************/\n.content {\n overflow-x: auto;\n display: flex;\n flex-direction: column;\n gap: var(--gx-ide-form-items-gap);\n box-sizing: border-box;\n @include gxg-scrollbar();\n\n &--no-padding {\n padding: 0;\n }\n &--no-border-top {\n border-top: none;\n }\n &--flex {\n display: flex;\n }\n &--no-gap {\n gap: 0;\n }\n &--align-items-start {\n align-items: start;\n }\n &--align-items-center {\n align-items: center;\n }\n &--align-items-end {\n align-items: end;\n }\n &--justify-content-start {\n justify-content: start;\n }\n &--justify-content-center {\n justify-content: center;\n }\n &--justify-content-end {\n justify-content: end;\n }\n &--border-end {\n border-inline-end: 1px solid var(--gx-ide-container-border-color);\n }\n}\n/*only content*/\n.container--only-content {\n grid-template-rows: 1fr;\n}\n/*no header, but has footer*/\n.container--no-header:not(.container--only-content) {\n grid-template-rows: 1fr auto;\n}\n/*no footer, but has header*/\n.container--no-footer:not(.container--only-content) {\n grid-template-rows: auto 1fr;\n}\n/*******************************\nFOOTER\n********************************/\n/*ABOVE*/\n.footer-above {\n border-top: 1px solid var(--gx-ide-container-border-color);\n &--no-border-top {\n border-top: 0;\n }\n &--slimmer {\n padding-top: var(--mer-spacing--xs);\n padding-bottom: var(--mer-spacing--xs);\n }\n &--no-padding {\n padding: 0;\n }\n}\n/*START and END*/\n.footer {\n display: flex;\n gap: var(--gx-ide-container-elements-spacing);\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: center;\n border-top: 1px solid var(--gx-ide-container-border-color);\n &__start,\n &__end {\n display: flex;\n gap: var(--gx-ide-container-elements-spacing);\n }\n &--no-border {\n border-top: 0;\n }\n &--no-padding {\n padding: 0;\n }\n &--slimmer {\n padding-top: var(--mer-spacing--xs);\n padding-bottom: var(--mer-spacing--xs);\n }\n}\n","import { Component, Host, h, Prop, Element, State } from \"@stencil/core\";\nimport { TitleAlignment } from \"@genexus/gemini/dist/types/common/types\";\nimport { TitleType } from \"../title/title\";\n@Component({\n tag: \"gx-ide-container\",\n styleUrl: \"container.scss\",\n shadow: true\n})\nexport class GxIdeContainer {\n // 1.OWN PROPERTIES //\n\n /* GENERAL */\n\n /**\n * By setting the title to inactive, the color will be gray instead of black.\n */\n @Prop() readonly inactiveTitle: boolean = false;\n\n /**\n * The title of the container\n */\n @Prop() readonly containerTitle: string;\n\n /**\n * The title of the container\n */\n @Prop() readonly titleType: TitleType = \"primary\";\n\n /**\n * Displays a border all around the container\n */\n @Prop() readonly displayBorder: boolean = false;\n\n /**\n * Displays a border on the top\n */\n @Prop() readonly displayBorderTop: boolean = false;\n\n /**\n * Displays a border at the end\n */\n @Prop() readonly displayBorderEnd: boolean = false;\n\n /**\n * Displays a border at on the bottom\n */\n @Prop() readonly displayBorderBottom: boolean = false;\n\n /**\n * Displays a border at the start\n */\n @Prop() readonly displayBorderStart: boolean = false;\n\n /**\n * The container general padding (applies to .heading, .content, and .footer)\n */\n @Prop() readonly sectionsPadding: SectionsPadding = \"m\";\n\n /* HEADING*/\n\n /**\n * Title alignment\n */\n @Prop() readonly titleAlignment: TitleAlignment = \"center\";\n\n /**\n * Removes the border bottom from the heading\n */\n @Prop() readonly noHeadingBorder: boolean = false;\n\n /**\n * Removes the heading gap\n */\n @Prop() readonly noHeadingGap: boolean = false;\n\n /**\n * Removes the padding from the heading\n */\n @Prop() readonly noHeadingPadding: boolean = false;\n\n /**\n * Removes the padding block end from the heading\n */\n @Prop() readonly noHeadingPaddingBlockEnd: boolean = false;\n\n /**\n * Adds padding to the top of the heading\n */\n @Prop() readonly headingPaddingTop: boolean = false;\n\n /**\n * The heading justification\n */\n @Prop() readonly headingJustify: HeadingJustify = \"center\";\n\n /**\n * It forces the .heading__title min-height to be as tall as the gxg-form-text height. This is useful when you are displaying two gx-ide-container's on the same row, both of them display a title, and one of them displays a gxg-form-text in the header (usually used to filter content). Without this property set to true, the .heading without a gxg-from-text would be shorter. At the time of writing, this is used on ww-images.\n */\n @Prop() readonly titleHeightAsInput: boolean = false;\n\n /**\n * Makes the header (.heading) display flex:row, instad of the default flex:column.\n */\n @Prop() readonly flexRow: boolean = false;\n\n /* CONTENT */\n\n /**\n * Makes the content a flex container\n */\n @Prop() readonly flexContent: boolean = false;\n\n /**\n * Removes the border-top from the content\n */\n @Prop() readonly noContentBorderTop: boolean = false;\n\n /**\n * Removes the padding from the content\n */\n @Prop() readonly noContentPadding: boolean = false;\n\n /**\n * Removes the gap from the content\n */\n @Prop() readonly noContentGap: boolean = false;\n\n /**\n * Align items\n */\n @Prop() readonly alignItems: AlignItems = undefined;\n\n /**\n * Justify content\n */\n @Prop() readonly justifyContent: JustifyContent = undefined;\n\n /**\n * Display border end on the content\n */\n @Prop() readonly contentBorderEnd: boolean = false;\n\n /* FOOTER ABOVE */\n\n /**\n * Makes the above footer vertical padding slimmer\n */\n @Prop() readonly slimmerAboveFooter: boolean = false;\n\n /**\n * Removes the above padding from the footer\n */\n @Prop() readonly noAboveFooterPadding: boolean = false;\n\n /**\n * Removes the above border top\n */\n @Prop() readonly noBorderAboveFooter: boolean = false;\n\n /* FOOTER > START and FOOTER > END*/\n\n /**\n * Makes the footer vertical padding slimmer\n */\n @Prop() readonly slimmerFooter: boolean = false;\n\n /**\n * Removes the padding from the footer\n */\n @Prop() readonly noFooterPadding: boolean = false;\n\n /**\n * The footer justification\n */\n @Prop() readonly footerJustify: FooterJustify = \"end\";\n\n /**\n * Removes the border top from the footer\n */\n @Prop() readonly noBorderFooter: boolean = false;\n\n // 2. REFERENCE TO ELEMENTS //\n\n @Element() el: HTMLGxIdeContainerElement;\n\n // 3.STATE() VARIABLES //\n\n /**\n * A boolean variable indicating if the component has or not any content for the 'header' slot\n */\n @State() hasHeaderSlot = false;\n\n /**\n * A boolean variable indicating if the component has or not any content slotted content (regular slotted content, without 'slot' attribute)\n */\n @State() hasSlottedContent = false;\n\n /**\n * A boolean variable indicating if the component has or not any content for the 'footer' slot\n */\n @State() hasFooterSlot = false;\n\n /**\n * A boolean variable indicating if the component has or not any content for the 'footer' slot\n */\n @State() hasAboveFooterSlot = false;\n\n /**\n * A boolean variable indicating that the container only has the heading section\n */\n @State() hasOnlyHeading = false;\n\n /**\n * A boolean variable indicating that the container only has the content section\n */\n @State() hasOnlyContent = false;\n\n /**\n * A boolean variable indicating that the container only has the footer section\n */\n @State() hasOnlyFooter = false;\n\n // 4.PUBLIC PROPERTY API //\n\n // 5.EVENTS (EMIT) //\n\n // 6.COMPONENT LIFECYCLE EVENTS //\n\n componentWillLoad() {\n this.evaluateSlots();\n }\n\n // 7.LISTENERS //\n\n // 8.PUBLIC METHODS API //\n\n // 9.LOCAL METHODS //\n\n private evaluateSlots() {\n // header\n const headerSlot = this.el.querySelectorAll(':scope > [slot=\"header\"]');\n if (headerSlot.length) {\n this.hasHeaderSlot = true;\n }\n // content\n const slottedContent = this.el.querySelectorAll(\":scope > :not([slot])\");\n if (slottedContent.length) {\n this.hasSlottedContent = true;\n }\n // footer\n const footerAboveSlot = this.el.querySelectorAll(\n ':scope > [slot=\"footer-above\"]'\n );\n const footerStartSlot = this.el.querySelectorAll(\n ':scope > [slot=\"footer-start\"]'\n );\n const footerEndSlot = this.el.querySelectorAll(\n ':scope > [slot=\"footer-end\"]'\n );\n if (footerStartSlot.length || footerEndSlot.length) {\n this.hasFooterSlot = true;\n }\n if (footerAboveSlot.length) {\n this.hasAboveFooterSlot = true;\n }\n }\n\n private evaluateSections() {\n // has only heading\n if (\n !this.hasSlottedContent &&\n !this.hasFooterSlot &&\n !this.hasAboveFooterSlot\n ) {\n this.hasOnlyHeading = true;\n }\n // has only content\n if (\n this.hasSlottedContent &&\n !this.containerTitle &&\n !this.hasHeaderSlot &&\n !this.hasAboveFooterSlot &&\n !this.hasFooterSlot\n ) {\n this.hasOnlyContent = true;\n }\n // has only footer\n if (\n !this.hasSlottedContent &&\n !this.containerTitle &&\n !this.hasAboveFooterSlot\n ) {\n this.hasOnlyFooter = true;\n }\n }\n\n private headingClasses = (): string | { [className: string]: boolean } => {\n return {\n \"heading\": true,\n \"heading--inactive\": this.inactiveTitle,\n \"heading--slimmer\": this.titleType === \"secondary\",\n \"heading--no-border\": this.noHeadingBorder || this.hasOnlyHeading,\n [`heading--justify-${this.headingJustify}`]: true,\n \"heading--no-padding\": this.noHeadingPadding,\n \"heading--no-padding-block-end\": this.noHeadingPaddingBlockEnd,\n \"heading--no-gap\": this.noHeadingGap,\n \"heading--padding-top\":\n this.headingPaddingTop && this.containerTitle?.length > 0,\n \"heading--form-text-height\": this.titleHeightAsInput,\n \"heading--flex-row\": this.flexRow\n };\n };\n\n private contentClasses = (): string | { [className: string]: boolean } => {\n return {\n \"content\": true,\n \"content--flex\": this.flexContent,\n \"content--no-padding\": this.noContentPadding,\n \"content--no-gap\": this.noContentGap,\n \"content--no-border-top\": this.noContentBorderTop,\n \"content--border-end\": this.contentBorderEnd,\n [`content--align-items-${this.alignItems}`]:\n this.alignItems !== undefined,\n [`content--justify-content-${this.justifyContent}`]:\n this.justifyContent !== undefined\n };\n };\n\n private aboveFooter = (): JSX.Element | null => {\n return this.hasAboveFooterSlot ? (\n <footer\n class={{\n \"footer-above\": true,\n \"footer-above--no-border-top\": this.noBorderAboveFooter,\n \"footer-above--no-padding\": this.noAboveFooterPadding,\n \"footer-above--slimmer\": this.slimmerFooter\n }}\n >\n <slot name=\"footer-above\"></slot>\n </footer>\n ) : null;\n };\n\n private footer = (): JSX.Element | null => {\n return this.hasFooterSlot ? (\n <footer\n class={{\n \"footer\": true,\n \"footer--no-border\":\n this.hasOnlyFooter ||\n !this.hasSlottedContent ||\n this.noBorderFooter,\n [`footer--justify-${this.footerJustify}`]: true,\n [`footer--justify-${this.footerJustify}`]: true,\n \"footer--no-padding\": this.noFooterPadding,\n \"footer--slimmer\": this.slimmerFooter\n }}\n >\n <div class=\"footer__start\">\n <slot name=\"footer-start\"></slot>\n </div>\n <div class=\"footer__end\">\n <slot name=\"footer-end\"></slot>\n </div>\n </footer>\n ) : null;\n };\n\n // 10.RENDER() FUNCTION //\n\n render() {\n this.evaluateSections();\n const result = [\n this.containerTitle || this.hasHeaderSlot ? (\n <header class={this.headingClasses()}>\n {this.containerTitle ? (\n <gx-ide-title\n class=\"heading__title\"\n type={this.titleType}\n alignment={this.titleAlignment as any}\n >\n {this.containerTitle}\n </gx-ide-title>\n ) : null}\n {this.hasHeaderSlot ? (\n <div class=\"heading__inner-wrapper\">\n <slot name=\"header\"></slot>\n </div>\n ) : null}\n </header>\n ) : null,\n this.hasSlottedContent ? (\n <div class={this.contentClasses()} part=\"content\">\n <slot></slot>\n </div>\n ) : null,\n this.aboveFooter(),\n this.footer()\n ];\n\n return (\n <Host>\n <div\n class={{\n \"container\": true,\n [`container--padding-${this.sectionsPadding}`]: true,\n \"container--display-border\": this.displayBorder,\n \"container--display-border-top\": this.displayBorderTop,\n \"container--display-border-end\": this.displayBorderEnd,\n \"container--display-border-bottom\": this.displayBorderBottom,\n \"container--display-border-start\": this.displayBorderStart,\n \"container--only-content\": this.hasOnlyContent,\n \"container--no-header\": !this.hasHeaderSlot && !this.containerTitle,\n \"container--no-footer\":\n !this.hasFooterSlot && !this.hasAboveFooterSlot\n }}\n >\n {result}\n </div>\n </Host>\n );\n }\n}\n\nexport type HeadingJustify = \"start\" | \"center\" | \"end\";\nexport type FooterJustify = \"start\" | \"center\" | \"end\";\nexport type SectionsPadding = \"s\" | \"m\" | \"l\";\nexport type AlignItems = \"start\" | \"center\" | \"end\";\nexport type JustifyContent = \"start\" | \"center\" | \"end\";\n",":host {\n --gx-ide-title-padding: var(--gx-ide-container--padding, --mer-spacing--sm);\n display: flex;\n flex-direction: column;\n color: var(--gx-ide-component-text-color);\n font-family: var(--mer-font-family--primary);\n line-height: 1.6em;\n background-color: transparent;\n padding: 0;\n}\n/*alignment*/\n:host(.alignment--start) {\n align-items: start;\n}\n:host(.alignment--center) {\n align-items: center;\n}\n/*padding*/\n:host(.alignment--start) {\n text-align: start;\n}\n:host([padding]) {\n padding: var(--gx-ide-title-padding);\n}\n:host([no-padding-bottom]) {\n padding-bottom: 0;\n}\n/*border*/\n:host([border]) {\n border-bottom: 1px solid var(--gx-ide-container-border-color);\n}\n/*type*/\n:host(.title-type--primary) {\n}\n:host(.title-type--secondary) {\n //a little subtle\n color: var(--gray-06);\n}\n","import { Component, Host, h, Prop } from \"@stencil/core\";\nimport { TitleType as GeminiTitleType } from \"@genexus/gemini/dist/types/components/title/title\";\n\n@Component({\n tag: \"gx-ide-title\",\n styleUrl: \"title.scss\",\n shadow: true\n})\nexport class GxIdeTitle {\n /**\n * Description: This helper component has been created for using as a title for the dialogs sections.\n */\n\n private geminiType: GeminiTitleType;\n\n /**\n * The title caption (the title)\n */\n @Prop() readonly titleCaption: string;\n\n /**\n * The title caption (the title)\n */\n @Prop() readonly type: TitleType = \"primary\";\n\n /**\n * The title alignment\n */\n @Prop() readonly alignment: TitleAlignment = \"start\";\n\n /**\n * Disables the padding\n */\n @Prop({ reflect: true }) readonly padding: boolean = false;\n\n /**\n * Disables the padding on the bottom\n */\n @Prop({ reflect: true }) readonly noPaddingBottom: boolean = false;\n\n /**\n * Displays a border on the bottom\n */\n @Prop({ reflect: true }) readonly border: boolean = false;\n\n componentWillLoad() {\n if (this.type === \"primary\") {\n this.geminiType = \"title-04\";\n } else if (this.type === \"secondary\") {\n this.geminiType = \"title-05\";\n }\n }\n\n render() {\n return (\n <Host\n class={{\n [`alignment--${this.alignment}`]: true,\n [`title-type--${this.type}`]: true\n }}\n >\n <gxg-title type={this.geminiType} alignment={this.alignment}>\n <slot></slot>\n </gxg-title>\n </Host>\n );\n }\n}\n\nexport type TitleType = \"primary\" | \"secondary\";\n\nexport type TitleAlignment = \"start\" | \"center\";\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["containerCss","GxIdeContainer","this","headingClasses","heading","inactiveTitle","titleType","noHeadingBorder","hasOnlyHeading","headingJustify","noHeadingPadding","noHeadingPaddingBlockEnd","noHeadingGap","headingPaddingTop","_a","containerTitle","length","titleHeightAsInput","flexRow","contentClasses","content","flexContent","noContentPadding","noContentGap","noContentBorderTop","contentBorderEnd","alignItems","undefined","justifyContent","aboveFooter","hasAboveFooterSlot","h","class","noBorderAboveFooter","noAboveFooterPadding","slimmerFooter","name","footer","hasFooterSlot","hasOnlyFooter","hasSlottedContent","noBorderFooter","footerJustify","noFooterPadding","componentWillLoad","evaluateSlots","headerSlot","el","querySelectorAll","hasHeaderSlot","slottedContent","footerAboveSlot","footerStartSlot","footerEndSlot","evaluateSections","hasOnlyContent","render","result","type","alignment","titleAlignment","part","Host","container","sectionsPadding","displayBorder","displayBorderTop","displayBorderEnd","displayBorderBottom","displayBorderStart","titleCss","GxIdeTitle","geminiType"],"sources":["src/components/_helpers/container/container.scss?tag=gx-ide-container&encapsulation=shadow","src/components/_helpers/container/container.tsx","src/components/_helpers/title/title.scss?tag=gx-ide-title&encapsulation=shadow","src/components/_helpers/title/title.tsx"],"sourcesContent":["@import \"../../../../node_modules/@genexus/gemini/dist/gemini/globals/mixins.scss\";\n\n/*******************************\nHOST / GENERAL\n********************************/\n:host {\n --gx-ide-container-elements-spacing: var(--mer-spacing--xs);\n display: block;\n height: 100%;\n box-sizing: border-box;\n}\n.container {\n display: grid;\n height: 100%;\n grid-template-rows: auto 1fr auto;\n box-sizing: border-box;\n}\n.heading,\n.content,\n.footer,\n.footer-above {\n padding: var(--gx-ide-container__padding);\n}\n/*PADDING*/\n.container--padding-s {\n --gx-ide-container__padding: var(--mer-spacing--xs);\n}\n.container--padding-m {\n --gx-ide-container__padding: var(--mer-spacing--sm);\n}\n.container--padding-l {\n --gx-ide-container__padding: var(--mer-spacing--md);\n}\n/*BORDERS*/\n.container--display-border {\n border: 1px solid var(--gx-ide-container-border-color);\n}\n.container--display-border-top {\n border-top: 1px solid var(--gx-ide-container-border-color);\n}\n.container--display-border-end {\n border-inline-end: 1px solid var(--gx-ide-container-border-color);\n}\n.container--display-border-bottom {\n border-bottom: 1px solid var(--gx-ide-container-border-color);\n}\n.container--display-border-start {\n border-inline-start: 1px solid var(--gx-ide-container-border-color);\n}\n.container--overflow-hidden-y {\n overflow-y: hidden;\n}\n/*******************************\nHEADING\n********************************/\n.heading {\n // @include gxg-flex-justify();\n display: flex;\n flex-direction: column;\n gap: var(--gx-ide-container__padding);\n width: 100%;\n box-sizing: border-box;\n border-bottom: 1px solid var(--gx-ide-container-border-color);\n &--no-border {\n border-bottom: 0;\n }\n &--no-padding {\n padding: 0;\n }\n &--no-padding-block-end {\n padding-block-end: 0;\n }\n &--no-gap {\n gap: 0;\n }\n &--inactive {\n color: var(--gxg-color--disabled);\n }\n &--padding-top {\n padding: var(--gx-ide-container__padding) 0 0 0;\n }\n &--slimmer {\n padding-top: var(--mer-spacing--xs);\n padding-bottom: var(--mer-spacing--xs);\n }\n &--form-text-height {\n .heading__title {\n min-height: var(--gxg-form-text-height);\n justify-content: center;\n }\n }\n &--flex-row {\n flex-direction: row;\n align-items: center;\n justify-content: center;\n }\n}\n/*******************************\nCONTENT\n********************************/\n.content {\n overflow-x: auto;\n display: flex;\n flex-direction: column;\n gap: var(--gx-ide-form-items-gap);\n box-sizing: border-box;\n @include gxg-scrollbar();\n\n &--no-padding {\n padding: 0;\n }\n &--no-border-top {\n border-top: none;\n }\n &--flex {\n display: flex;\n }\n &--no-gap {\n gap: 0;\n }\n &--align-items-start {\n align-items: start;\n }\n &--align-items-center {\n align-items: center;\n }\n &--align-items-end {\n align-items: end;\n }\n &--justify-content-start {\n justify-content: start;\n }\n &--justify-content-center {\n justify-content: center;\n }\n &--justify-content-end {\n justify-content: end;\n }\n &--border-end {\n border-inline-end: 1px solid var(--gx-ide-container-border-color);\n }\n}\n/*only content*/\n.container--only-content {\n grid-template-rows: 1fr;\n}\n/*no header, but has footer*/\n.container--no-header:not(.container--only-content) {\n grid-template-rows: 1fr auto;\n}\n/*no footer, but has header*/\n.container--no-footer:not(.container--only-content) {\n grid-template-rows: auto 1fr;\n}\n/*******************************\nFOOTER\n********************************/\n/*ABOVE*/\n.footer-above {\n border-top: 1px solid var(--gx-ide-container-border-color);\n &--no-border-top {\n border-top: 0;\n }\n &--slimmer {\n padding-top: var(--mer-spacing--xs);\n padding-bottom: var(--mer-spacing--xs);\n }\n &--no-padding {\n padding: 0;\n }\n}\n/*START and END*/\n.footer {\n display: flex;\n gap: var(--gx-ide-container-elements-spacing);\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: center;\n border-top: 1px solid var(--gx-ide-container-border-color);\n &__start,\n &__end {\n display: flex;\n gap: var(--gx-ide-container-elements-spacing);\n }\n &--no-border {\n border-top: 0;\n }\n &--no-padding {\n padding: 0;\n }\n &--slimmer {\n padding-top: var(--mer-spacing--xs);\n padding-bottom: var(--mer-spacing--xs);\n }\n}\n","import { Component, Host, h, Prop, Element, State } from \"@stencil/core\";\nimport { TitleAlignment } from \"@genexus/gemini/dist/types/common/types\";\nimport { TitleType } from \"../title/title\";\n@Component({\n tag: \"gx-ide-container\",\n styleUrl: \"container.scss\",\n shadow: true\n})\nexport class GxIdeContainer {\n // 1.OWN PROPERTIES //\n\n /* GENERAL */\n\n /**\n * By setting the title to inactive, the color will be gray instead of black.\n */\n @Prop() readonly inactiveTitle: boolean = false;\n\n /**\n * The title of the container\n */\n @Prop() readonly containerTitle: string;\n\n /**\n * The title of the container\n */\n @Prop() readonly titleType: TitleType = \"primary\";\n\n /**\n * Displays a border all around the container\n */\n @Prop() readonly displayBorder: boolean = false;\n\n /**\n * Displays a border on the top\n */\n @Prop() readonly displayBorderTop: boolean = false;\n\n /**\n * Displays a border at the end\n */\n @Prop() readonly displayBorderEnd: boolean = false;\n\n /**\n * Displays a border at on the bottom\n */\n @Prop() readonly displayBorderBottom: boolean = false;\n\n /**\n * Displays a border at the start\n */\n @Prop() readonly displayBorderStart: boolean = false;\n\n /**\n * The container general padding (applies to .heading, .content, and .footer)\n */\n @Prop() readonly sectionsPadding: SectionsPadding = \"m\";\n\n /* HEADING*/\n\n /**\n * Title alignment\n */\n @Prop() readonly titleAlignment: TitleAlignment = \"center\";\n\n /**\n * Removes the border bottom from the heading\n */\n @Prop() readonly noHeadingBorder: boolean = false;\n\n /**\n * Removes the heading gap\n */\n @Prop() readonly noHeadingGap: boolean = false;\n\n /**\n * Removes the padding from the heading\n */\n @Prop() readonly noHeadingPadding: boolean = false;\n\n /**\n * Removes the padding block end from the heading\n */\n @Prop() readonly noHeadingPaddingBlockEnd: boolean = false;\n\n /**\n * Adds padding to the top of the heading\n */\n @Prop() readonly headingPaddingTop: boolean = false;\n\n /**\n * The heading justification\n */\n @Prop() readonly headingJustify: HeadingJustify = \"center\";\n\n /**\n * It forces the .heading__title min-height to be as tall as the gxg-form-text height. This is useful when you are displaying two gx-ide-container's on the same row, both of them display a title, and one of them displays a gxg-form-text in the header (usually used to filter content). Without this property set to true, the .heading without a gxg-from-text would be shorter. At the time of writing, this is used on ww-images.\n */\n @Prop() readonly titleHeightAsInput: boolean = false;\n\n /**\n * Makes the header (.heading) display flex:row, instad of the default flex:column.\n */\n @Prop() readonly flexRow: boolean = false;\n\n /* CONTENT */\n\n /**\n * Makes the content a flex container\n */\n @Prop() readonly flexContent: boolean = false;\n\n /**\n * Removes the border-top from the content\n */\n @Prop() readonly noContentBorderTop: boolean = false;\n\n /**\n * Removes the padding from the content\n */\n @Prop() readonly noContentPadding: boolean = false;\n\n /**\n * Removes the gap from the content\n */\n @Prop() readonly noContentGap: boolean = false;\n\n /**\n * Align items\n */\n @Prop() readonly alignItems: AlignItems = undefined;\n\n /**\n * Justify content\n */\n @Prop() readonly justifyContent: JustifyContent = undefined;\n\n /**\n * Display border end on the content\n */\n @Prop() readonly contentBorderEnd: boolean = false;\n\n /* FOOTER ABOVE */\n\n /**\n * Makes the above footer vertical padding slimmer\n */\n @Prop() readonly slimmerAboveFooter: boolean = false;\n\n /**\n * Removes the above padding from the footer\n */\n @Prop() readonly noAboveFooterPadding: boolean = false;\n\n /**\n * Removes the above border top\n */\n @Prop() readonly noBorderAboveFooter: boolean = false;\n\n /* FOOTER > START and FOOTER > END*/\n\n /**\n * Makes the footer vertical padding slimmer\n */\n @Prop() readonly slimmerFooter: boolean = false;\n\n /**\n * Removes the padding from the footer\n */\n @Prop() readonly noFooterPadding: boolean = false;\n\n /**\n * The footer justification\n */\n @Prop() readonly footerJustify: FooterJustify = \"end\";\n\n /**\n * Removes the border top from the footer\n */\n @Prop() readonly noBorderFooter: boolean = false;\n\n // 2. REFERENCE TO ELEMENTS //\n\n @Element() el: HTMLGxIdeContainerElement;\n\n // 3.STATE() VARIABLES //\n\n /**\n * A boolean variable indicating if the component has or not any content for the 'header' slot\n */\n @State() hasHeaderSlot = false;\n\n /**\n * A boolean variable indicating if the component has or not any content slotted content (regular slotted content, without 'slot' attribute)\n */\n @State() hasSlottedContent = false;\n\n /**\n * A boolean variable indicating if the component has or not any content for the 'footer' slot\n */\n @State() hasFooterSlot = false;\n\n /**\n * A boolean variable indicating if the component has or not any content for the 'footer' slot\n */\n @State() hasAboveFooterSlot = false;\n\n /**\n * A boolean variable indicating that the container only has the heading section\n */\n @State() hasOnlyHeading = false;\n\n /**\n * A boolean variable indicating that the container only has the content section\n */\n @State() hasOnlyContent = false;\n\n /**\n * A boolean variable indicating that the container only has the footer section\n */\n @State() hasOnlyFooter = false;\n\n // 4.PUBLIC PROPERTY API //\n\n // 5.EVENTS (EMIT) //\n\n // 6.COMPONENT LIFECYCLE EVENTS //\n\n componentWillLoad() {\n this.evaluateSlots();\n }\n\n // 7.LISTENERS //\n\n // 8.PUBLIC METHODS API //\n\n // 9.LOCAL METHODS //\n\n private evaluateSlots() {\n // header\n const headerSlot = this.el.querySelectorAll(':scope > [slot=\"header\"]');\n if (headerSlot.length) {\n this.hasHeaderSlot = true;\n }\n // content\n const slottedContent = this.el.querySelectorAll(\":scope > :not([slot])\");\n if (slottedContent.length) {\n this.hasSlottedContent = true;\n }\n // footer\n const footerAboveSlot = this.el.querySelectorAll(\n ':scope > [slot=\"footer-above\"]'\n );\n const footerStartSlot = this.el.querySelectorAll(\n ':scope > [slot=\"footer-start\"]'\n );\n const footerEndSlot = this.el.querySelectorAll(\n ':scope > [slot=\"footer-end\"]'\n );\n if (footerStartSlot.length || footerEndSlot.length) {\n this.hasFooterSlot = true;\n }\n if (footerAboveSlot.length) {\n this.hasAboveFooterSlot = true;\n }\n }\n\n private evaluateSections() {\n // has only heading\n if (\n !this.hasSlottedContent &&\n !this.hasFooterSlot &&\n !this.hasAboveFooterSlot\n ) {\n this.hasOnlyHeading = true;\n }\n // has only content\n if (\n this.hasSlottedContent &&\n !this.containerTitle &&\n !this.hasHeaderSlot &&\n !this.hasAboveFooterSlot &&\n !this.hasFooterSlot\n ) {\n this.hasOnlyContent = true;\n }\n // has only footer\n if (\n !this.hasSlottedContent &&\n !this.containerTitle &&\n !this.hasAboveFooterSlot\n ) {\n this.hasOnlyFooter = true;\n }\n }\n\n private headingClasses = (): string | { [className: string]: boolean } => {\n return {\n \"heading\": true,\n \"heading--inactive\": this.inactiveTitle,\n \"heading--slimmer\": this.titleType === \"secondary\",\n \"heading--no-border\": this.noHeadingBorder || this.hasOnlyHeading,\n [`heading--justify-${this.headingJustify}`]: true,\n \"heading--no-padding\": this.noHeadingPadding,\n \"heading--no-padding-block-end\": this.noHeadingPaddingBlockEnd,\n \"heading--no-gap\": this.noHeadingGap,\n \"heading--padding-top\":\n this.headingPaddingTop && this.containerTitle?.length > 0,\n \"heading--form-text-height\": this.titleHeightAsInput,\n \"heading--flex-row\": this.flexRow\n };\n };\n\n private contentClasses = (): string | { [className: string]: boolean } => {\n return {\n \"content\": true,\n \"content--flex\": this.flexContent,\n \"content--no-padding\": this.noContentPadding,\n \"content--no-gap\": this.noContentGap,\n \"content--no-border-top\": this.noContentBorderTop,\n \"content--border-end\": this.contentBorderEnd,\n [`content--align-items-${this.alignItems}`]:\n this.alignItems !== undefined,\n [`content--justify-content-${this.justifyContent}`]:\n this.justifyContent !== undefined\n };\n };\n\n private aboveFooter = (): any | null => {\n return this.hasAboveFooterSlot ? (\n <footer\n class={{\n \"footer-above\": true,\n \"footer-above--no-border-top\": this.noBorderAboveFooter,\n \"footer-above--no-padding\": this.noAboveFooterPadding,\n \"footer-above--slimmer\": this.slimmerFooter\n }}\n >\n <slot name=\"footer-above\"></slot>\n </footer>\n ) : null;\n };\n\n private footer = (): any | null => {\n return this.hasFooterSlot ? (\n <footer\n class={{\n \"footer\": true,\n \"footer--no-border\":\n this.hasOnlyFooter ||\n !this.hasSlottedContent ||\n this.noBorderFooter,\n [`footer--justify-${this.footerJustify}`]: true,\n [`footer--justify-${this.footerJustify}`]: true,\n \"footer--no-padding\": this.noFooterPadding,\n \"footer--slimmer\": this.slimmerFooter\n }}\n >\n <div class=\"footer__start\">\n <slot name=\"footer-start\"></slot>\n </div>\n <div class=\"footer__end\">\n <slot name=\"footer-end\"></slot>\n </div>\n </footer>\n ) : null;\n };\n\n // 10.RENDER() FUNCTION //\n\n render() {\n this.evaluateSections();\n const result = [\n this.containerTitle || this.hasHeaderSlot ? (\n <header class={this.headingClasses()}>\n {this.containerTitle ? (\n <gx-ide-title\n class=\"heading__title\"\n type={this.titleType}\n alignment={this.titleAlignment as any}\n >\n {this.containerTitle}\n </gx-ide-title>\n ) : null}\n {this.hasHeaderSlot ? (\n <div class=\"heading__inner-wrapper\">\n <slot name=\"header\"></slot>\n </div>\n ) : null}\n </header>\n ) : null,\n this.hasSlottedContent ? (\n <div class={this.contentClasses()} part=\"content\">\n <slot></slot>\n </div>\n ) : null,\n this.aboveFooter(),\n this.footer()\n ];\n\n return (\n <Host>\n <div\n class={{\n \"container\": true,\n [`container--padding-${this.sectionsPadding}`]: true,\n \"container--display-border\": this.displayBorder,\n \"container--display-border-top\": this.displayBorderTop,\n \"container--display-border-end\": this.displayBorderEnd,\n \"container--display-border-bottom\": this.displayBorderBottom,\n \"container--display-border-start\": this.displayBorderStart,\n \"container--only-content\": this.hasOnlyContent,\n \"container--no-header\": !this.hasHeaderSlot && !this.containerTitle,\n \"container--no-footer\":\n !this.hasFooterSlot && !this.hasAboveFooterSlot\n }}\n >\n {result}\n </div>\n </Host>\n );\n }\n}\n\nexport type HeadingJustify = \"start\" | \"center\" | \"end\";\nexport type FooterJustify = \"start\" | \"center\" | \"end\";\nexport type SectionsPadding = \"s\" | \"m\" | \"l\";\nexport type AlignItems = \"start\" | \"center\" | \"end\";\nexport type JustifyContent = \"start\" | \"center\" | \"end\";\n",":host {\n --gx-ide-title-padding: var(--gx-ide-container--padding, --mer-spacing--sm);\n display: flex;\n flex-direction: column;\n color: var(--gx-ide-component-text-color);\n font-family: var(--mer-font-family--primary);\n line-height: 1.6em;\n background-color: transparent;\n padding: 0;\n}\n/*alignment*/\n:host(.alignment--start) {\n align-items: start;\n}\n:host(.alignment--center) {\n align-items: center;\n}\n/*padding*/\n:host(.alignment--start) {\n text-align: start;\n}\n:host([padding]) {\n padding: var(--gx-ide-title-padding);\n}\n:host([no-padding-bottom]) {\n padding-bottom: 0;\n}\n/*border*/\n:host([border]) {\n border-bottom: 1px solid var(--gx-ide-container-border-color);\n}\n/*type*/\n:host(.title-type--primary) {\n}\n:host(.title-type--secondary) {\n //a little subtle\n color: var(--gray-06);\n}\n","import { Component, Host, h, Prop } from \"@stencil/core\";\nimport { TitleType as GeminiTitleType } from \"@genexus/gemini/dist/types/components/title/title\";\n\n@Component({\n tag: \"gx-ide-title\",\n styleUrl: \"title.scss\",\n shadow: true\n})\nexport class GxIdeTitle {\n /**\n * Description: This helper component has been created for using as a title for the dialogs sections.\n */\n\n private geminiType: GeminiTitleType;\n\n /**\n * The title caption (the title)\n */\n @Prop() readonly titleCaption: string;\n\n /**\n * The title caption (the title)\n */\n @Prop() readonly type: TitleType = \"primary\";\n\n /**\n * The title alignment\n */\n @Prop() readonly alignment: TitleAlignment = \"start\";\n\n /**\n * Disables the padding\n */\n @Prop({ reflect: true }) readonly padding: boolean = false;\n\n /**\n * Disables the padding on the bottom\n */\n @Prop({ reflect: true }) readonly noPaddingBottom: boolean = false;\n\n /**\n * Displays a border on the bottom\n */\n @Prop({ reflect: true }) readonly border: boolean = false;\n\n componentWillLoad() {\n if (this.type === \"primary\") {\n this.geminiType = \"title-04\";\n } else if (this.type === \"secondary\") {\n this.geminiType = \"title-05\";\n }\n }\n\n render() {\n return (\n <Host\n class={{\n [`alignment--${this.alignment}`]: true,\n [`title-type--${this.type}`]: true\n }}\n >\n <gxg-title type={this.geminiType} alignment={this.alignment}>\n <slot></slot>\n </gxg-title>\n </Host>\n );\n }\n}\n\nexport type TitleType = \"primary\" | \"secondary\";\n\nexport type TitleAlignment = \"start\" | \"center\";\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { r as e, c as r, h as a, H as i } from "./p-aaed592c.js";
|
|
2
2
|
|
|
3
|
-
const o = ".loader__wrapper{position:absolute;border:none;opacity:0;transition:var(--show-transition) opacity;inline-size:100%;block-size:100%;display:flex;background-color:var(--gxg-ide-loader-wrapper__background-color--from);backdrop-filter:var(--gxg-ide-loader-wrapper__backdrop-filter);padding:var(--gxg-ide-loader-wrapper__padding);flex-direction:column;align-items:center;justify-content:center;box-sizing:border-box;color:var(--gxg-ide-loader-wrapper__color)}.loader__wrapper--visible{opacity:1}.loader__spinner{border:var(--gxg-ide-loader-spinner__border);border-block-start:var(--gxg-ide-loader-spinner__border-top);border-radius:50%;animation:spinner 0.6s infinite linear;inline-size:var(--gxg-ide-loader-spinner__width);block-size:var(--gxg-ide-loader-spinner__width);flex-shrink:0;opacity:1}.loader__content-wrapper{display:flex;text-align:center;flex-direction:column;margin-block-start:var(--gxg-ide-loader-content-wrapper__mbs);gap:var(--mer-spacing--xs);max-block-size:var(--gxg-ide-loader-content-wrapper__max-width);animation:fadeIn var(--mer-timing--fast) forwards;opacity:1}.loader__content-wrapper--hidden{display:none}@keyframes wrapper{0%{background-color:var(--gxg-ide-loader-wrapper__background-color--from)}100%{background-color:var(--gxg-ide-loader-wrapper__background-color--to)}}@keyframes spinner{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}:host([display-border]) .loader__wrapper{border:1px solid var(--mer-color__elevation--02)}@keyframes fadeIn{0%{opacity:0}}";
|
|
3
|
+
const o = ".loader__wrapper{position:absolute;border:none;opacity:0;transition:var(--show-transition) opacity;inline-size:100%;block-size:100%;display:flex;background-color:var(--gxg-ide-loader-wrapper__background-color--from);backdrop-filter:var(--gxg-ide-loader-wrapper__backdrop-filter);padding:var(--gxg-ide-loader-wrapper__padding);flex-direction:column;align-items:center;justify-content:center;box-sizing:border-box;color:var(--gxg-ide-loader-wrapper__color);z-index:99}.loader__wrapper--visible{opacity:1}.loader__spinner{border:var(--gxg-ide-loader-spinner__border);border-block-start:var(--gxg-ide-loader-spinner__border-top);border-radius:50%;animation:spinner 0.6s infinite linear;inline-size:var(--gxg-ide-loader-spinner__width);block-size:var(--gxg-ide-loader-spinner__width);flex-shrink:0;opacity:1}.loader__content-wrapper{display:flex;text-align:center;flex-direction:column;margin-block-start:var(--gxg-ide-loader-content-wrapper__mbs);gap:var(--mer-spacing--xs);max-block-size:var(--gxg-ide-loader-content-wrapper__max-width);animation:fadeIn var(--mer-timing--fast) forwards;opacity:1}.loader__content-wrapper--hidden{display:none}@keyframes wrapper{0%{background-color:var(--gxg-ide-loader-wrapper__background-color--from)}100%{background-color:var(--gxg-ide-loader-wrapper__background-color--to)}}@keyframes spinner{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}:host([display-border]) .loader__wrapper{border:1px solid var(--mer-color__elevation--02)}@keyframes fadeIn{0%{opacity:0}}";
|
|
4
4
|
|
|
5
5
|
var t = undefined && undefined.__classPrivateFieldGet || function(e, r, a, i) {
|
|
6
6
|
if (a === "a" && !i) throw new TypeError("Private accessor was defined without a getter");
|
|
@@ -70,4 +70,4 @@ n = new WeakMap, s = new WeakMap, d = new WeakMap, p = new WeakMap, l = new Weak
|
|
|
70
70
|
h.style = o;
|
|
71
71
|
|
|
72
72
|
export { h as gx_ide_loader };
|
|
73
|
-
//# sourceMappingURL=p-
|
|
73
|
+
//# sourceMappingURL=p-dd07e68a.entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["ideLoaderCss","CSS_BUNDLES","IdeLoader","_IdeLoader_timeoutReference","set","this","_IdeLoader_cancelProcess","cancelCallback","clearTimeout","__classPrivateFieldGet","show","_IdeLoader_renderCancelButton","cancelLabel","h","class","type","onClick","_IdeLoader_renderDescription","description","_IdeLoader_renderTitle","loaderTitle","render","Host","model","showWrapper","part","popover","call"],"sources":["src/components/_helpers/ide-loader/ide-loader.scss?tag=gx-ide-loader&encapsulation=shadow","src/components/_helpers/ide-loader/ide-loader.tsx"],"sourcesContent":["$animation: fadeIn var(--mer-timing--fast) forwards;\n\n.loader {\n &__wrapper {\n position: absolute;\n border: none;\n opacity: 0;\n transition: var(--show-transition) opacity;\n inline-size: 100%;\n block-size: 100%;\n display: flex;\n background-color: var(--gxg-ide-loader-wrapper__background-color--from);\n backdrop-filter: var(--gxg-ide-loader-wrapper__backdrop-filter);\n padding: var(--gxg-ide-loader-wrapper__padding);\n flex-direction: column;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n color: var(--gxg-ide-loader-wrapper__color);\n z-index: 99; // WA to prevent tree-view chevron arrow to appear above.\n\n &--visible {\n opacity: 1;\n }\n }\n &__spinner {\n border: var(--gxg-ide-loader-spinner__border);\n border-block-start: var(--gxg-ide-loader-spinner__border-top);\n border-radius: 50%;\n animation: spinner 0.6s infinite linear;\n inline-size: var(--gxg-ide-loader-spinner__width);\n block-size: var(--gxg-ide-loader-spinner__width);\n flex-shrink: 0;\n opacity: 1;\n }\n\n &__content-wrapper {\n display: flex;\n text-align: center;\n flex-direction: column;\n margin-block-start: var(--gxg-ide-loader-content-wrapper__mbs);\n gap: var(--mer-spacing--xs);\n max-block-size: var(--gxg-ide-loader-content-wrapper__max-width);\n &--hidden {\n display: none;\n }\n animation: $animation;\n opacity: 1;\n }\n}\n\n/*background color animation*/\n@keyframes wrapper {\n 0% {\n background-color: var(--gxg-ide-loader-wrapper__background-color--from);\n }\n 100% {\n background-color: var(--gxg-ide-loader-wrapper__background-color--to);\n }\n}\n@keyframes spinner {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(359deg);\n }\n}\n\n:host([display-border]) {\n .loader {\n &__wrapper {\n border: 1px solid var(--mer-color__elevation--02);\n }\n }\n}\n\n@keyframes fadeIn {\n 0% {\n opacity: 0;\n }\n}\n","import {\n Component,\n Host,\n h,\n Prop,\n State,\n Event,\n EventEmitter\n} from \"@stencil/core\";\n\nimport { MercuryBundles } from \"@genexus/mercury\";\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"components/button\",\n \"utils/typography\"\n];\n@Component({\n tag: \"gx-ide-loader\",\n styleUrl: \"ide-loader.scss\",\n shadow: true\n})\nexport class IdeLoader {\n #timeoutReference: ReturnType<typeof setTimeout>;\n\n /**\n * shows the '.loader-wrapper'\n */\n @State() showWrapper = true;\n\n /**\n * The time the loader will await before abort.\n */\n @Prop() readonly abortTime: number = 5 * 60 * 1000; // 5 minutes\n\n /**\n * The cancel callback\n */\n @Prop() readonly cancelCallback: IdeLoaderCancelCallback;\n\n /**\n * The cancel button label (optional)\n */\n @Prop() readonly cancelLabel: string;\n\n /**\n * The loader description (optional)\n */\n @Prop() readonly description: string;\n\n /**\n * Displays a border all around\n */\n @Prop({ reflect: true }) readonly displayBorder: boolean = false;\n\n /**\n * The loader title (optional)\n */\n @Prop() readonly loaderTitle: string;\n\n /**\n * It shows the loader\n */\n @Prop({ mutable: true }) show = false;\n\n /**\n * This event is emitted when \"show\" is false.\n */\n @Event() loaderFinished: EventEmitter<void>;\n\n #cancelProcess = (): void => {\n if (this.cancelCallback) {\n this.cancelCallback();\n }\n clearTimeout(this.#timeoutReference);\n this.show = false;\n };\n\n #renderCancelButton = (): HTMLButtonElement | null =>\n this.cancelLabel && (\n <div>\n <button\n class=\"button-secondary\"\n type=\"button\"\n onClick={this.#cancelProcess}\n >\n {this.cancelLabel}\n </button>\n </div>\n );\n\n #renderDescription = (): HTMLParagraphElement | null =>\n this.description && <p class=\"text-body-italic-s\">{this.description}</p>;\n\n #renderTitle = (): HTMLParagraphElement | null =>\n this.loaderTitle && <p class=\"text-body-regular-m\">{this.loaderTitle}</p>;\n\n render() {\n return (\n <Host>\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n {this.show && (\n <div\n class={{\n [`loader__wrapper`]: true,\n \"loader__wrapper--visible\": this.showWrapper\n }}\n part=\"loader-wrapper\"\n popover=\"\"\n >\n <div class=\"loader__spinner\"></div>\n <div\n class={{\n \"loader__content-wrapper\": true,\n \"loader__content-wrapper--hidden\":\n !this.description && !this.loaderTitle && !this.cancelLabel\n }}\n >\n {this.#renderTitle()}\n {this.#renderDescription()}\n {this.#renderCancelButton()}\n </div>\n </div>\n )}\n </Host>\n );\n }\n}\n\nexport type IdeLoaderCancelCallback = () => void;\n"],"mappings":";;AAAA,MAAMA,IAAe;;;;;;;;;;ACYrB,MAAMC,IAA8B,EAClC,qBACA,qBACA;;MAOWC,IAAS;;;;IACpBC,EAAAC,IAAAC,WAAA;IA+CAC,EAAAF,IAAAC,OAAiB;MACf,IAAIA,KAAKE,gBAAgB;QACvBF,KAAKE;;MAEPC,aAAaC,EAAAJ,MAAIF,GAAA;MACjBE,KAAKK,OAAO;AAAK;IAGnBC,EAAAP,IAAAC,OAAsB,MACpBA,KAAKO,eACHC,EAAA,aACEA,EAAA;MACEC,OAAM;MACNC,MAAK;MACLC,SAASP,EAAAJ,MAAIC,GAAA;OAEZD,KAAKO;IAKdK,EAAAb,IAAAC,OAAqB,MACnBA,KAAKa,eAAeL,EAAA;MAAGC,OAAM;OAAsBT,KAAKa;IAE1DC,EAAAf,IAAAC,OAAe,MACbA,KAAKe,eAAeP,EAAA;MAAGC,OAAM;OAAuBT,KAAKe;uBAnEpC;qBAKc,IAAI,KAAK;;;;yBAoBa;;gBAU3B;;EAkChC,MAAAC;IACE,OACER,EAACS,GAAI,MACHT,EAAA;MAAUU,OAAOtB;QAChBI,KAAKK,QACJG,EAAA;MACEC,OAAO;QACL,CAAC,oBAAoB;QACrB,4BAA4BT,KAAKmB;;MAEnCC,MAAK;MACLC,SAAQ;OAERb,EAAA;MAAKC,OAAM;QACXD,EAAA;MACEC,OAAO;QACL,2BAA2B;QAC3B,oCACGT,KAAKa,gBAAgBb,KAAKe,gBAAgBf,KAAKO;;OAGnDH,EAAAJ,MAAIc,GAAA,KAAaQ,KAAjBtB,OACAI,EAAAJ,MAAIY,GAAA,KAAmBU,KAAvBtB,OACAI,EAAAJ,MAAIM,GAAA,KAAoBgB,KAAxBtB"}
|
|
@@ -67,7 +67,7 @@ const T = class {
|
|
|
67
67
|
n(this.news);
|
|
68
68
|
}))));
|
|
69
69
|
p.set(this, (async n => {
|
|
70
|
-
const e = n.
|
|
70
|
+
const e = n.currentTarget.id;
|
|
71
71
|
await this.openKbCallback(e);
|
|
72
72
|
}));
|
|
73
73
|
u.set(this, (n => {
|
|
@@ -225,4 +225,4 @@ p = new WeakMap, u = new WeakMap, y = new WeakMap, x = new WeakMap, w = new Weak
|
|
|
225
225
|
T.style = c;
|
|
226
226
|
|
|
227
227
|
export { T as gx_ide_start_page };
|
|
228
|
-
//# sourceMappingURL=p-
|
|
228
|
+
//# sourceMappingURL=p-eb49e4f1.entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["startPageCss","CSS_BUNDLES","KB_ICON","getIconPath","category","name","FOLDER_ICON","colorType","GxIdeStartPage","_GxIdeStartPage_recentKbsFilter","set","this","_GxIdeStartPage_kbsFilterValue","_GxIdeStartPage_evaluateRenderKbs","_a","kbs","length","__classPrivateFieldGet","_GxIdeStartPage_renderKbs","call","h","class","stateIconSrc","stateTitle","_componentLocale","emptyState","title","stateDescription","description","_GxIdeStartPage_filterKbs","filteredKbs","filter","kb","toLowerCase","includes","_GxIdeStartPage_getNewsCallbackRecentNews","async","Promise","resolve","news","getNewsCallback","_GxIdeStartPage_openKbHandler","e","kbId","currentTarget","id","openKbCallback","_GxIdeStartPage_renderKb","formattedDate","formatDate","lastOpenedDate","dateCaption","recentKbs","lastOpened","toLocaleLowerCase","_b","key","type","onClick","src","config","headingsClasses","cardSmall","hiChar","map","noKbsFiltered","_GxIdeStartPage_searchKbsInputHandler","event","__classPrivateFieldSet","target","value","_GxIdeStartPage_searchNewsInputHandler","newsFilterValue","watchNews","newsFilterThreshold","displayNewsFilter","kbsChanged","loadingKbs","kbsFilterThreshold","displayKbsFilter","componentWillLoad","Locale","getComponentStrings","el","componentDidLoad","focus","render","Host","model","cardRegular","placeholder","onInput","ref","disabled","loaderTitle","loader","show","recentNews","inputPlaceholder","_c","openNewsCallback","filterValue"],"sources":["src/components/start-page/start-page.scss?tag=gx-ide-start-page&encapsulation=shadow","src/components/start-page/start-page.tsx"],"sourcesContent":["@import \"../../global/gx-ide-common.scss\";\n@import \"../../global/gx-ide-mixins.scss\";\n@import \"../../global/reset.scss\";\n\n@include hiChar();\n\n:host {\n overflow: auto;\n container-type: inline-size;\n container-name: host;\n}\n\n.layout-main,\n.layout__panel {\n block-size: 100%;\n overflow: auto;\n}\n@container host (max-width: 768px) {\n .layout.layout-main {\n grid-template-columns: 1fr;\n grid-template-rows: 1fr 1fr;\n }\n}\n\n// recent kb's\n.panel-recent-kbs {\n position: relative;\n}\n.recent-kbs,\n.recent-news {\n display: grid;\n grid-template-rows: auto 1fr;\n gap: var(--mer-spacing--md);\n overflow: auto;\n\n &__header {\n display: grid;\n gap: var(--mer-spacing--md);\n }\n}\n\n.kbs-container {\n display: grid;\n gap: var(--mer-spacing--xs);\n overflow: auto;\n grid-auto-rows: max-content;\n container-type: inline-size;\n container-name: kb-container;\n animation: fadeIn var(--mer-timing--super-fast) forwards linear;\n}\n\n.card-kb {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mer-spacing--lg);\n container-type: inline-size;\n container-name: card-kb;\n\n &__left-col {\n display: flex;\n align-items: center;\n gap: var(--mer-spacing--sm);\n }\n}\n@container kb-container (max-width: 360px) {\n .card-kb {\n align-items: center;\n flex-direction: column;\n gap: var(--mer-spacing--xs);\n justify-content: start;\n }\n}\n\n// recent news\ngx-ide-recent-news {\n overflow: auto;\n}\n.panel-recent-news {\n position: relative;\n}\n\n@keyframes exactMatchBright {\n 100% {\n filter: brightness(1.25);\n }\n}\n.exact-match-bright {\n animation: exactMatchBright var(--mer-timing--super-fast) ease-in-out 4\n alternate;\n}\n\ngx-ide-loader::part(loader-wrapper) {\n border: var(--mer-border__width--sm) solid\n var(--mer-border-color__on-elevation--01);\n border-radius: var(--mer-border__radius--md);\n}\n\n@keyframes fadeIn {\n 0% {\n opacity: 0;\n }\n}\n","/* STENCIL IMPORTS */\nimport { Component, Host, h, Prop, Element, State, Watch } from \"@stencil/core\";\n/* OTHER LIBRARIES IMPORTS */\nimport { MercuryBundles, getIconPath } from \"@genexus/mercury\";\n/* CUSTOM IMPORTS */\nimport { Locale } from \"../../common/locale\";\nimport { config } from \"../../common/config\";\nimport { formatDate, hiChar } from \"../../common/helpers\";\nimport { ChEditCustomEvent } from \"@genexus/chameleon-controls-library\";\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"utils/typography\",\n \"utils/layout\",\n \"components/edit\",\n \"components/icon\",\n \"components/button\",\n \"chameleon/scrollbar\"\n];\n\nconst KB_ICON = getIconPath({\n category: \"objects\",\n name: \"knowledge-base\"\n});\nconst FOLDER_ICON = getIconPath({\n category: \"system\",\n name: \"folder\",\n colorType: \"on-elevation\"\n});\n\n@Component({\n tag: \"gx-ide-start-page\",\n styleUrl: \"start-page.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/start-page\"]\n})\nexport class GxIdeStartPage {\n /**\n * The component hard-coded strings translations.\n */\n private _componentLocale: any;\n\n #recentKbsFilter: HTMLChEditElement;\n #kbsFilterValue: string = \"\";\n\n @Element() el: HTMLGxIdeStartPageElement;\n\n /**\n * The condition required to display the kbs filter\n */\n @State() displayKbsFilter: boolean = true;\n\n /**\n * The condition required to display the news filter\n */\n @State() displayNewsFilter: boolean = false;\n\n /**\n * The filtered KBs after user input\n */\n @State() filteredKbs: RecentKBData[] = [];\n\n /**\n * The filtered news after user input\n */\n @State() filteredNews: NewsData[] = [];\n\n /**\n * True if kbs have been not loaded yet.\n */\n @State() loadingKbs: boolean = true;\n\n /**\n * A list of recent news\n */\n @State() news: NewsData[];\n @Watch(\"news\")\n watchNews(news: NewsData[]) {\n if (news?.length >= this.newsFilterThreshold) {\n this.displayNewsFilter = true;\n } else {\n this.displayNewsFilter = false;\n }\n }\n\n /**\n * The filter value for the recent news set by the user input\n */\n @State() newsFilterValue: string;\n\n /**\n * True if the component has been rendered for the first time.\n */\n @State() renderedFirstTime = false;\n\n /**\n * Callback invoked to load the news feed (right panel \"Recent News\").\n */\n @Prop() readonly getNewsCallback!: GetNewsCallback;\n\n /**\n * Ann array of the user's KB's\n */\n @Prop() readonly kbs: RecentKBData[] = [];\n @Watch(\"kbs\")\n kbsChanged(kbs: RecentKBData[]) {\n this.loadingKbs = false;\n this.#filterKbs();\n if (kbs?.length >= this.kbsFilterThreshold) {\n this.displayKbsFilter = true;\n } else {\n this.displayKbsFilter = false;\n }\n }\n\n /**\n * The minimum number of \"kbs\" that is required to display the kb's filter.\n */\n @Prop() readonly kbsFilterThreshold: number = 6;\n\n /**\n * The minimum number of \"news\" that is required to display the news's filter.\n */\n @Prop() readonly newsFilterThreshold: number = 6;\n\n /**\n * Callback invoked to open a knowledge base when the user clicks on a KB card.\n */\n @Prop() readonly openKbCallback!: OpenKbCallback;\n\n /**\n * Callback invoked to open a news article.\n */\n @Prop() readonly openNewsCallback!: OpenNewsCallback;\n\n async componentWillLoad() {\n this._componentLocale = await Locale.getComponentStrings(this.el);\n }\n\n componentDidLoad() {\n this.#recentKbsFilter?.focus();\n }\n\n #evaluateRenderKbs = () => {\n if (this.kbs?.length > 0) {\n return this.#renderKbs();\n } else {\n return (\n <gx-ide-empty-state\n class=\"kbs-empty-state\"\n stateIconSrc={FOLDER_ICON}\n stateTitle={this._componentLocale.emptyState.title}\n stateDescription={this._componentLocale.emptyState.description}\n ></gx-ide-empty-state>\n );\n }\n };\n\n #filterKbs = () => {\n this.filteredKbs = this.kbs.filter(kb =>\n kb.name?.toLowerCase().includes(this.#kbsFilterValue)\n );\n };\n\n #getNewsCallbackRecentNews = async (): Promise<NewsData[]> => {\n return new Promise(async resolve => {\n this.news = await this.getNewsCallback();\n resolve(this.news);\n });\n };\n\n #openKbHandler = async (e: MouseEvent) => {\n const kbId = (e.currentTarget as HTMLElement).id;\n await this.openKbCallback(kbId);\n };\n\n #renderKb = (kb: RecentKBData): HTMLButtonElement | null => {\n const formattedDate = formatDate(kb.lastOpenedDate, \"pretty\");\n const dateCaption = formattedDate\n ? `${this._componentLocale.recentKbs.lastOpened} ${formattedDate}`\n : null;\n return (\n <article class=\"display-contents\">\n <button\n class={{\n \"card-small\": true,\n \"card-small--actionable\": true,\n \"card-kb\": true,\n \"exact-match-bright\":\n kb.name?.toLocaleLowerCase() ===\n this.#kbsFilterValue?.toLowerCase()\n }}\n id={kb.id}\n key={kb.id}\n type=\"button\"\n onClick={this.#openKbHandler}\n >\n <div class=\"card-kb__left-col\">\n <ch-image src={KB_ICON} class=\"icon-md\"></ch-image>\n <h2 class={config.headingsClasses.cardSmall}>\n {hiChar(kb.name, this.#kbsFilterValue)}\n </h2>\n </div>\n {dateCaption && <div class=\"card-kb__right-col\">{dateCaption}</div>}\n </button>\n </article>\n );\n };\n\n #renderKbs = () => {\n if (this.filteredKbs.length) {\n return (\n <div class=\"kbs-container scrollable\">\n {this.filteredKbs?.map(this.#renderKb)}\n </div>\n );\n }\n return (\n <gx-ide-empty-state\n stateIconSrc={KB_ICON}\n stateTitle={this._componentLocale.recentKbs.noKbsFiltered.title}\n ></gx-ide-empty-state>\n );\n };\n\n #searchKbsInputHandler = (event: Event | ChEditCustomEvent<InputEvent>) => {\n this.#kbsFilterValue = (\n event as ChEditCustomEvent<InputEvent>\n ).target.value.toLowerCase();\n this.#filterKbs();\n };\n\n #searchNewsInputHandler = (event: Event | ChEditCustomEvent<InputEvent>) => {\n this.newsFilterValue = (\n event as ChEditCustomEvent<InputEvent>\n ).target.value.toLowerCase();\n };\n\n render() {\n return (\n <Host class=\"start-page-host\">\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <div class=\"layout layout-main layout--cols-2\">\n <div class=\"layout__panel panel-recent-kbs\">\n <section class=\"card-regular recent-kbs\">\n <header class=\"recent-kbs__header\">\n <h2\n class={{\n [config.headingsClasses.cardRegular]: true,\n \"recent-kbs__title\": true\n }}\n >\n {this._componentLocale.recentKbs.title}\n </h2>\n {this.displayKbsFilter && (\n <ch-edit\n type=\"text\"\n class=\"form-input recent-kbs__name-filter\"\n placeholder={this._componentLocale.recentKbs.placeholder}\n onInput={this.#searchKbsInputHandler}\n ref={el =>\n (this.#recentKbsFilter = el as HTMLChEditElement)\n }\n disabled={!(this.kbs?.length > 0)}\n ></ch-edit>\n )}\n </header>\n\n {this.loadingKbs ? (\n <gx-ide-loader\n loaderTitle={this._componentLocale.recentKbs.loader.title}\n description={\n this._componentLocale.recentKbs.loader.description\n }\n show={true}\n ></gx-ide-loader>\n ) : (\n this.#evaluateRenderKbs()\n )}\n </section>\n </div>\n\n <div class=\"layout__panel panel-recent-news\">\n <section class=\"card-regular recent-news\">\n <header class=\"recent-news__header\">\n <h2 class={config.headingsClasses.cardRegular}>\n {this._componentLocale.recentNews.title}\n </h2>\n {this.displayNewsFilter && (\n <ch-edit\n type=\"text\"\n class=\"form-input recent-news__filter\"\n placeholder={\n this._componentLocale.recentNews.inputPlaceholder\n }\n onInput={\n this.news?.length > 0\n ? this.#searchNewsInputHandler\n : null\n }\n disabled={!(this.news?.length > 0)}\n ></ch-edit>\n )}\n </header>\n\n <gx-ide-recent-news\n getNewsCallback={this.#getNewsCallbackRecentNews}\n openNewsCallback={this.openNewsCallback}\n filterValue={this.newsFilterValue}\n ></gx-ide-recent-news>\n </section>\n </div>\n </div>\n </Host>\n );\n }\n}\n\nexport type OpenKbCallback = (id: string) => Promise<void>;\nexport type GetNewsCallback = () => Promise<NewsData[]>;\nexport type OpenNewsCallback = (id: string) => Promise<void>;\n\nexport type RecentKBData = {\n id: string;\n name: string;\n lastOpenedDate?: Date;\n};\nexport type NewsData = {\n id: string;\n title: string;\n body: string;\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.0.
|
|
4
|
+
"version": "1.0.4",
|
|
5
5
|
"description": "GeneXus IDE UI components",
|
|
6
6
|
"main": "dist/index.cjs.js",
|
|
7
7
|
"module": "dist/index.js",
|
|
@@ -32,16 +32,13 @@
|
|
|
32
32
|
"validate": "npm run test && npm run build",
|
|
33
33
|
"validate.ci": "npm run build -- --max-workers 1 --debug"
|
|
34
34
|
},
|
|
35
|
-
"dependencies": {
|
|
36
|
-
"@types/react": "^18.2.8"
|
|
37
|
-
},
|
|
38
35
|
"peerDependencies": {
|
|
39
|
-
"@genexus/gemini": "*
|
|
36
|
+
"@genexus/gemini": "*2.0.1",
|
|
40
37
|
"@genexus/chameleon-controls-library": ">=6.0.0-next.37",
|
|
41
38
|
"@genexus/mercury": "*0.8.10"
|
|
42
39
|
},
|
|
43
40
|
"devDependencies": {
|
|
44
|
-
"@genexus/gemini": "*
|
|
41
|
+
"@genexus/gemini": "*2.0.1",
|
|
45
42
|
"@genexus/chameleon-controls-library": ">=6.0.0-next.37",
|
|
46
43
|
"@genexus/mercury": "*0.8.10",
|
|
47
44
|
"@stencil-community/eslint-plugin": "^0.6.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["startPageCss","CSS_BUNDLES","KB_ICON","getIconPath","category","name","FOLDER_ICON","colorType","GxIdeStartPage","_GxIdeStartPage_recentKbsFilter","set","this","_GxIdeStartPage_kbsFilterValue","_GxIdeStartPage_evaluateRenderKbs","_a","kbs","length","__classPrivateFieldGet","_GxIdeStartPage_renderKbs","call","h","class","stateIconSrc","stateTitle","_componentLocale","emptyState","title","stateDescription","description","_GxIdeStartPage_filterKbs","filteredKbs","filter","kb","toLowerCase","includes","_GxIdeStartPage_getNewsCallbackRecentNews","async","Promise","resolve","news","getNewsCallback","_GxIdeStartPage_openKbHandler","e","kbId","target","id","openKbCallback","_GxIdeStartPage_renderKb","formattedDate","formatDate","lastOpenedDate","dateCaption","recentKbs","lastOpened","toLocaleLowerCase","_b","key","type","onClick","src","config","headingsClasses","cardSmall","hiChar","map","noKbsFiltered","_GxIdeStartPage_searchKbsInputHandler","event","__classPrivateFieldSet","value","_GxIdeStartPage_searchNewsInputHandler","newsFilterValue","watchNews","newsFilterThreshold","displayNewsFilter","kbsChanged","loadingKbs","kbsFilterThreshold","displayKbsFilter","componentWillLoad","Locale","getComponentStrings","el","componentDidLoad","focus","render","Host","model","cardRegular","placeholder","onInput","ref","disabled","loaderTitle","loader","show","recentNews","inputPlaceholder","_c","openNewsCallback","filterValue"],"sources":["src/components/start-page/start-page.scss?tag=gx-ide-start-page&encapsulation=shadow","src/components/start-page/start-page.tsx"],"sourcesContent":["@import \"../../global/gx-ide-common.scss\";\n@import \"../../global/gx-ide-mixins.scss\";\n@import \"../../global/reset.scss\";\n\n@include hiChar();\n\n:host {\n overflow: auto;\n container-type: inline-size;\n container-name: host;\n}\n\n.layout-main,\n.layout__panel {\n block-size: 100%;\n overflow: auto;\n}\n@container host (max-width: 768px) {\n .layout.layout-main {\n grid-template-columns: 1fr;\n grid-template-rows: 1fr 1fr;\n }\n}\n\n// recent kb's\n.panel-recent-kbs {\n position: relative;\n}\n.recent-kbs,\n.recent-news {\n display: grid;\n grid-template-rows: auto 1fr;\n gap: var(--mer-spacing--md);\n overflow: auto;\n\n &__header {\n display: grid;\n gap: var(--mer-spacing--md);\n }\n}\n\n.kbs-container {\n display: grid;\n gap: var(--mer-spacing--xs);\n overflow: auto;\n grid-auto-rows: max-content;\n container-type: inline-size;\n container-name: kb-container;\n animation: fadeIn var(--mer-timing--super-fast) forwards linear;\n}\n\n.card-kb {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--mer-spacing--lg);\n container-type: inline-size;\n container-name: card-kb;\n\n &__left-col {\n display: flex;\n align-items: center;\n gap: var(--mer-spacing--sm);\n }\n}\n@container kb-container (max-width: 360px) {\n .card-kb {\n align-items: center;\n flex-direction: column;\n gap: var(--mer-spacing--xs);\n justify-content: start;\n }\n}\n\n// recent news\ngx-ide-recent-news {\n overflow: auto;\n}\n.panel-recent-news {\n position: relative;\n}\n\n@keyframes exactMatchBright {\n 100% {\n filter: brightness(1.25);\n }\n}\n.exact-match-bright {\n animation: exactMatchBright var(--mer-timing--super-fast) ease-in-out 4\n alternate;\n}\n\ngx-ide-loader::part(loader-wrapper) {\n border: var(--mer-border__width--sm) solid\n var(--mer-border-color__on-elevation--01);\n border-radius: var(--mer-border__radius--md);\n}\n\n@keyframes fadeIn {\n 0% {\n opacity: 0;\n }\n}\n","/* STENCIL IMPORTS */\nimport { Component, Host, h, Prop, Element, State, Watch } from \"@stencil/core\";\n/* OTHER LIBRARIES IMPORTS */\nimport { MercuryBundles, getIconPath } from \"@genexus/mercury\";\n/* CUSTOM IMPORTS */\nimport { Locale } from \"../../common/locale\";\nimport { config } from \"../../common/config\";\nimport { formatDate, hiChar } from \"../../common/helpers\";\nimport { ChEditCustomEvent } from \"@genexus/chameleon-controls-library\";\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"utils/typography\",\n \"utils/layout\",\n \"components/edit\",\n \"components/icon\",\n \"components/button\",\n \"chameleon/scrollbar\"\n];\n\nconst KB_ICON = getIconPath({\n category: \"objects\",\n name: \"knowledge-base\"\n});\nconst FOLDER_ICON = getIconPath({\n category: \"system\",\n name: \"folder\",\n colorType: \"on-elevation\"\n});\n\n@Component({\n tag: \"gx-ide-start-page\",\n styleUrl: \"start-page.scss\",\n shadow: true,\n assetsDirs: [\"gx-ide-assets/start-page\"]\n})\nexport class GxIdeStartPage {\n /**\n * The component hard-coded strings translations.\n */\n private _componentLocale: any;\n\n #recentKbsFilter: HTMLChEditElement;\n #kbsFilterValue: string = \"\";\n\n @Element() el: HTMLGxIdeStartPageElement;\n\n /**\n * The condition required to display the kbs filter\n */\n @State() displayKbsFilter: boolean = true;\n\n /**\n * The condition required to display the news filter\n */\n @State() displayNewsFilter: boolean = false;\n\n /**\n * The filtered KBs after user input\n */\n @State() filteredKbs: RecentKBData[] = [];\n\n /**\n * The filtered news after user input\n */\n @State() filteredNews: NewsData[] = [];\n\n /**\n * True if kbs have been not loaded yet.\n */\n @State() loadingKbs: boolean = true;\n\n /**\n * A list of recent news\n */\n @State() news: NewsData[];\n @Watch(\"news\")\n watchNews(news: NewsData[]) {\n if (news?.length >= this.newsFilterThreshold) {\n this.displayNewsFilter = true;\n } else {\n this.displayNewsFilter = false;\n }\n }\n\n /**\n * The filter value for the recent news set by the user input\n */\n @State() newsFilterValue: string;\n\n /**\n * True if the component has been rendered for the first time.\n */\n @State() renderedFirstTime = false;\n\n /**\n * Callback invoked to load the news feed (right panel \"Recent News\").\n */\n @Prop() readonly getNewsCallback!: GetNewsCallback;\n\n /**\n * Ann array of the user's KB's\n */\n @Prop() readonly kbs: RecentKBData[] = [];\n @Watch(\"kbs\")\n kbsChanged(kbs: RecentKBData[]) {\n this.loadingKbs = false;\n this.#filterKbs();\n if (kbs?.length >= this.kbsFilterThreshold) {\n this.displayKbsFilter = true;\n } else {\n this.displayKbsFilter = false;\n }\n }\n\n /**\n * The minimum number of \"kbs\" that is required to display the kb's filter.\n */\n @Prop() readonly kbsFilterThreshold: number = 6;\n\n /**\n * The minimum number of \"news\" that is required to display the news's filter.\n */\n @Prop() readonly newsFilterThreshold: number = 6;\n\n /**\n * Callback invoked to open a knowledge base when the user clicks on a KB card.\n */\n @Prop() readonly openKbCallback!: OpenKbCallback;\n\n /**\n * Callback invoked to open a news article.\n */\n @Prop() readonly openNewsCallback!: OpenNewsCallback;\n\n async componentWillLoad() {\n this._componentLocale = await Locale.getComponentStrings(this.el);\n }\n\n componentDidLoad() {\n this.#recentKbsFilter?.focus();\n }\n\n #evaluateRenderKbs = () => {\n if (this.kbs?.length > 0) {\n return this.#renderKbs();\n } else {\n return (\n <gx-ide-empty-state\n class=\"kbs-empty-state\"\n stateIconSrc={FOLDER_ICON}\n stateTitle={this._componentLocale.emptyState.title}\n stateDescription={this._componentLocale.emptyState.description}\n ></gx-ide-empty-state>\n );\n }\n };\n\n #filterKbs = () => {\n this.filteredKbs = this.kbs.filter(kb =>\n kb.name?.toLowerCase().includes(this.#kbsFilterValue)\n );\n };\n\n #getNewsCallbackRecentNews = async (): Promise<NewsData[]> => {\n return new Promise(async resolve => {\n this.news = await this.getNewsCallback();\n resolve(this.news);\n });\n };\n\n #openKbHandler = async (e: MouseEvent) => {\n const kbId = (e.target as HTMLElement).id;\n await this.openKbCallback(kbId);\n };\n\n #renderKb = (kb: RecentKBData): HTMLButtonElement | null => {\n const formattedDate = formatDate(kb.lastOpenedDate, \"pretty\");\n const dateCaption = formattedDate\n ? `${this._componentLocale.recentKbs.lastOpened} ${formattedDate}`\n : null;\n return (\n <article class=\"display-contents\">\n <button\n class={{\n \"card-small\": true,\n \"card-small--actionable\": true,\n \"card-kb\": true,\n \"exact-match-bright\":\n kb.name?.toLocaleLowerCase() ===\n this.#kbsFilterValue?.toLowerCase()\n }}\n id={kb.id}\n key={kb.id}\n type=\"button\"\n onClick={this.#openKbHandler}\n >\n <div class=\"card-kb__left-col\">\n <ch-image src={KB_ICON} class=\"icon-md\"></ch-image>\n <h2 class={config.headingsClasses.cardSmall}>\n {hiChar(kb.name, this.#kbsFilterValue)}\n </h2>\n </div>\n {dateCaption && <div class=\"card-kb__right-col\">{dateCaption}</div>}\n </button>\n </article>\n );\n };\n\n #renderKbs = () => {\n if (this.filteredKbs.length) {\n return (\n <div class=\"kbs-container scrollable\">\n {this.filteredKbs?.map(this.#renderKb)}\n </div>\n );\n }\n return (\n <gx-ide-empty-state\n stateIconSrc={KB_ICON}\n stateTitle={this._componentLocale.recentKbs.noKbsFiltered.title}\n ></gx-ide-empty-state>\n );\n };\n\n #searchKbsInputHandler = (event: Event | ChEditCustomEvent<InputEvent>) => {\n this.#kbsFilterValue = (\n event as ChEditCustomEvent<InputEvent>\n ).target.value.toLowerCase();\n this.#filterKbs();\n };\n\n #searchNewsInputHandler = (event: Event | ChEditCustomEvent<InputEvent>) => {\n this.newsFilterValue = (\n event as ChEditCustomEvent<InputEvent>\n ).target.value.toLowerCase();\n };\n\n render() {\n return (\n <Host class=\"start-page-host\">\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <div class=\"layout layout-main layout--cols-2\">\n <div class=\"layout__panel panel-recent-kbs\">\n <section class=\"card-regular recent-kbs\">\n <header class=\"recent-kbs__header\">\n <h2\n class={{\n [config.headingsClasses.cardRegular]: true,\n \"recent-kbs__title\": true\n }}\n >\n {this._componentLocale.recentKbs.title}\n </h2>\n {this.displayKbsFilter && (\n <ch-edit\n type=\"text\"\n class=\"form-input recent-kbs__name-filter\"\n placeholder={this._componentLocale.recentKbs.placeholder}\n onInput={this.#searchKbsInputHandler}\n ref={el =>\n (this.#recentKbsFilter = el as HTMLChEditElement)\n }\n disabled={!(this.kbs?.length > 0)}\n ></ch-edit>\n )}\n </header>\n\n {this.loadingKbs ? (\n <gx-ide-loader\n loaderTitle={this._componentLocale.recentKbs.loader.title}\n description={\n this._componentLocale.recentKbs.loader.description\n }\n show={true}\n ></gx-ide-loader>\n ) : (\n this.#evaluateRenderKbs()\n )}\n </section>\n </div>\n\n <div class=\"layout__panel panel-recent-news\">\n <section class=\"card-regular recent-news\">\n <header class=\"recent-news__header\">\n <h2 class={config.headingsClasses.cardRegular}>\n {this._componentLocale.recentNews.title}\n </h2>\n {this.displayNewsFilter && (\n <ch-edit\n type=\"text\"\n class=\"form-input recent-news__filter\"\n placeholder={\n this._componentLocale.recentNews.inputPlaceholder\n }\n onInput={\n this.news?.length > 0\n ? this.#searchNewsInputHandler\n : null\n }\n disabled={!(this.news?.length > 0)}\n ></ch-edit>\n )}\n </header>\n\n <gx-ide-recent-news\n getNewsCallback={this.#getNewsCallbackRecentNews}\n openNewsCallback={this.openNewsCallback}\n filterValue={this.newsFilterValue}\n ></gx-ide-recent-news>\n </section>\n </div>\n </div>\n </Host>\n );\n }\n}\n\nexport type OpenKbCallback = (id: string) => Promise<void>;\nexport type GetNewsCallback = () => Promise<NewsData[]>;\nexport type OpenNewsCallback = (id: string) => Promise<void>;\n\nexport type RecentKBData = {\n id: string;\n name: string;\n lastOpenedDate?: Date;\n};\nexport type NewsData = {\n id: string;\n title: string;\n body: string;\n};\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["ideLoaderCss","CSS_BUNDLES","IdeLoader","_IdeLoader_timeoutReference","set","this","_IdeLoader_cancelProcess","cancelCallback","clearTimeout","__classPrivateFieldGet","show","_IdeLoader_renderCancelButton","cancelLabel","h","class","type","onClick","_IdeLoader_renderDescription","description","_IdeLoader_renderTitle","loaderTitle","render","Host","model","showWrapper","part","popover","call"],"sources":["src/components/_helpers/ide-loader/ide-loader.scss?tag=gx-ide-loader&encapsulation=shadow","src/components/_helpers/ide-loader/ide-loader.tsx"],"sourcesContent":["$animation: fadeIn var(--mer-timing--fast) forwards;\n\n.loader {\n &__wrapper {\n position: absolute;\n border: none;\n opacity: 0;\n transition: var(--show-transition) opacity;\n inline-size: 100%;\n block-size: 100%;\n display: flex;\n background-color: var(--gxg-ide-loader-wrapper__background-color--from);\n backdrop-filter: var(--gxg-ide-loader-wrapper__backdrop-filter);\n padding: var(--gxg-ide-loader-wrapper__padding);\n flex-direction: column;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n color: var(--gxg-ide-loader-wrapper__color);\n\n &--visible {\n opacity: 1;\n }\n }\n &__spinner {\n border: var(--gxg-ide-loader-spinner__border);\n border-block-start: var(--gxg-ide-loader-spinner__border-top);\n border-radius: 50%;\n animation: spinner 0.6s infinite linear;\n inline-size: var(--gxg-ide-loader-spinner__width);\n block-size: var(--gxg-ide-loader-spinner__width);\n flex-shrink: 0;\n opacity: 1;\n }\n\n &__content-wrapper {\n display: flex;\n text-align: center;\n flex-direction: column;\n margin-block-start: var(--gxg-ide-loader-content-wrapper__mbs);\n gap: var(--mer-spacing--xs);\n max-block-size: var(--gxg-ide-loader-content-wrapper__max-width);\n &--hidden {\n display: none;\n }\n animation: $animation;\n opacity: 1;\n }\n}\n\n/*background color animation*/\n@keyframes wrapper {\n 0% {\n background-color: var(--gxg-ide-loader-wrapper__background-color--from);\n }\n 100% {\n background-color: var(--gxg-ide-loader-wrapper__background-color--to);\n }\n}\n@keyframes spinner {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(359deg);\n }\n}\n\n:host([display-border]) {\n .loader {\n &__wrapper {\n border: 1px solid var(--mer-color__elevation--02);\n }\n }\n}\n\n@keyframes fadeIn {\n 0% {\n opacity: 0;\n }\n}\n","import {\n Component,\n Host,\n h,\n Prop,\n State,\n Event,\n EventEmitter\n} from \"@stencil/core\";\n\nimport { MercuryBundles } from \"@genexus/mercury\";\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"components/button\",\n \"utils/typography\"\n];\n@Component({\n tag: \"gx-ide-loader\",\n styleUrl: \"ide-loader.scss\",\n shadow: true\n})\nexport class IdeLoader {\n #timeoutReference: ReturnType<typeof setTimeout>;\n\n /**\n * shows the '.loader-wrapper'\n */\n @State() showWrapper = true;\n\n /**\n * The time the loader will await before abort.\n */\n @Prop() readonly abortTime: number = 5 * 60 * 1000; // 5 minutes\n\n /**\n * The cancel callback\n */\n @Prop() readonly cancelCallback: IdeLoaderCancelCallback;\n\n /**\n * The cancel button label (optional)\n */\n @Prop() readonly cancelLabel: string;\n\n /**\n * The loader description (optional)\n */\n @Prop() readonly description: string;\n\n /**\n * Displays a border all around\n */\n @Prop({ reflect: true }) readonly displayBorder: boolean = false;\n\n /**\n * The loader title (optional)\n */\n @Prop() readonly loaderTitle: string;\n\n /**\n * It shows the loader\n */\n @Prop({ mutable: true }) show = false;\n\n /**\n * This event is emitted when \"show\" is false.\n */\n @Event() loaderFinished: EventEmitter<void>;\n\n #cancelProcess = (): void => {\n if (this.cancelCallback) {\n this.cancelCallback();\n }\n clearTimeout(this.#timeoutReference);\n this.show = false;\n };\n\n #renderCancelButton = (): HTMLButtonElement | null =>\n this.cancelLabel && (\n <div>\n <button\n class=\"button-secondary\"\n type=\"button\"\n onClick={this.#cancelProcess}\n >\n {this.cancelLabel}\n </button>\n </div>\n );\n\n #renderDescription = (): HTMLParagraphElement | null =>\n this.description && <p class=\"text-body-italic-s\">{this.description}</p>;\n\n #renderTitle = (): HTMLParagraphElement | null =>\n this.loaderTitle && <p class=\"text-body-regular-m\">{this.loaderTitle}</p>;\n\n render() {\n return (\n <Host>\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n {this.show && (\n <div\n class={{\n [`loader__wrapper`]: true,\n \"loader__wrapper--visible\": this.showWrapper\n }}\n part=\"loader-wrapper\"\n popover=\"\"\n >\n <div class=\"loader__spinner\"></div>\n <div\n class={{\n \"loader__content-wrapper\": true,\n \"loader__content-wrapper--hidden\":\n !this.description && !this.loaderTitle && !this.cancelLabel\n }}\n >\n {this.#renderTitle()}\n {this.#renderDescription()}\n {this.#renderCancelButton()}\n </div>\n </div>\n )}\n </Host>\n );\n }\n}\n\nexport type IdeLoaderCancelCallback = () => void;\n"],"mappings":";;AAAA,MAAMA,IAAe;;;;;;;;;;ACYrB,MAAMC,IAA8B,EAClC,qBACA,qBACA;;MAOWC,IAAS;;;;IACpBC,EAAAC,IAAAC,WAAA;IA+CAC,EAAAF,IAAAC,OAAiB;MACf,IAAIA,KAAKE,gBAAgB;QACvBF,KAAKE;;MAEPC,aAAaC,EAAAJ,MAAIF,GAAA;MACjBE,KAAKK,OAAO;AAAK;IAGnBC,EAAAP,IAAAC,OAAsB,MACpBA,KAAKO,eACHC,EAAA,aACEA,EAAA;MACEC,OAAM;MACNC,MAAK;MACLC,SAASP,EAAAJ,MAAIC,GAAA;OAEZD,KAAKO;IAKdK,EAAAb,IAAAC,OAAqB,MACnBA,KAAKa,eAAeL,EAAA;MAAGC,OAAM;OAAsBT,KAAKa;IAE1DC,EAAAf,IAAAC,OAAe,MACbA,KAAKe,eAAeP,EAAA;MAAGC,OAAM;OAAuBT,KAAKe;uBAnEpC;qBAKc,IAAI,KAAK;;;;yBAoBa;;gBAU3B;;EAkChC,MAAAC;IACE,OACER,EAACS,GAAI,MACHT,EAAA;MAAUU,OAAOtB;QAChBI,KAAKK,QACJG,EAAA;MACEC,OAAO;QACL,CAAC,oBAAoB;QACrB,4BAA4BT,KAAKmB;;MAEnCC,MAAK;MACLC,SAAQ;OAERb,EAAA;MAAKC,OAAM;QACXD,EAAA;MACEC,OAAO;QACL,2BAA2B;QAC3B,oCACGT,KAAKa,gBAAgBb,KAAKe,gBAAgBf,KAAKO;;OAGnDH,EAAAJ,MAAIc,GAAA,KAAaQ,KAAjBtB,OACAI,EAAAJ,MAAIY,GAAA,KAAmBU,KAAvBtB,OACAI,EAAAJ,MAAIM,GAAA,KAAoBgB,KAAxBtB"}
|