From 2e700b760d7414a1f476660b9d00842cd6fd7b27 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 26 Feb 2025 18:19:56 +0000 Subject: [PATCH] Deploy to GitHub pages --- atom.xml | 7334 +++++++++++++++++ blogs.html | 266 + css/jbossorg.css | 332 + data/people/alex-porcelli.json | 1 + data/people/example-author.json | 1 + data/people/paul-robinson.json | 1 + img/favicon.ico | Bin 0 -> 1150 bytes img/people/alex-porcelli.png | Bin 0 -> 6829 bytes img/people/default_usericon.png | Bin 0 -> 1151 bytes img/people/don-naro.png | Bin 0 -> 1151 bytes img/people/francesco-marchioni.png | Bin 0 -> 14416 bytes img/people/jason-porter.png | Bin 0 -> 1151 bytes img/people/kevin-conner.png | Bin 0 -> 1151 bytes img/people/mark-little.png | Bin 0 -> 1151 bytes img/people/paul-robinson.png | Bin 0 -> 2922 bytes img/people/pedro-silva.png | Bin 0 -> 7925 bytes img/people/romain-pelisse.png | Bin 0 -> 1600 bytes img/people/stefan-sitani.png | Bin 0 -> 19484 bytes img/posts/rh-summit-banner.png | Bin 0 -> 38371 bytes img/redhat_reversed.svg | 1 + img/sponsored_by_redhat_reversed.svg | 1 + index.html | 135 + js/cpx-footer.js | 44 + js/cpx-search/cpx-query.js | 308 + js/cpx-search/cpx-result.js | 267 + js/cpx-search/cpx-results.js | 214 + js/cpx-search/cpx-search-box.js | 96 + js/jbossorg.js | 0 js/pfe-avatar/LICENSE.txt | 19 + js/pfe-avatar/README.md | 65 + js/pfe-avatar/dist/pfe-avatar.js | 490 ++ js/pfe-avatar/dist/pfe-avatar.js.map | 1 + js/pfe-avatar/dist/pfe-avatar.min.js | 27 + js/pfe-avatar/dist/pfe-avatar.min.js.map | 1 + js/pfe-avatar/dist/pfe-avatar.umd.js | 622 ++ js/pfe-avatar/dist/pfe-avatar.umd.js.map | 1 + js/pfe-avatar/dist/pfe-avatar.umd.min.js | 2 + js/pfe-avatar/dist/pfe-avatar.umd.min.js.map | 1 + js/pfe-avatar/package.json | 80 + js/pfe-band/LICENSE.txt | 19 + js/pfe-band/README.md | 104 + js/pfe-band/dist/pfe-band.js | 233 + js/pfe-band/dist/pfe-band.js.map | 1 + js/pfe-band/dist/pfe-band.json | 156 + js/pfe-band/dist/pfe-band.min.js | 26 + js/pfe-band/dist/pfe-band.min.js.map | 1 + js/pfe-band/dist/pfe-band.umd.js | 329 + js/pfe-band/dist/pfe-band.umd.js.map | 1 + js/pfe-band/dist/pfe-band.umd.min.js | 2 + js/pfe-band/dist/pfe-band.umd.min.js.map | 1 + js/pfe-band/package.json | 86 + js/pfe-card/LICENSE.txt | 19 + js/pfe-card/README.md | 87 + js/pfe-card/dist/pfe-card--lightdom.css | 8 + js/pfe-card/dist/pfe-card--lightdom.min.css | 2 + .../dist/pfe-card--lightdom.min.css.map | 1 + js/pfe-card/dist/pfe-card.js | 222 + js/pfe-card/dist/pfe-card.js.map | 1 + js/pfe-card/dist/pfe-card.json | 97 + js/pfe-card/dist/pfe-card.min.js | 26 + js/pfe-card/dist/pfe-card.min.js.map | 1 + js/pfe-card/dist/pfe-card.umd.js | 320 + js/pfe-card/dist/pfe-card.umd.js.map | 1 + js/pfe-card/dist/pfe-card.umd.min.js | 2 + js/pfe-card/dist/pfe-card.umd.min.js.map | 1 + js/pfe-card/package.json | 89 + js/pfe-cta/LICENSE.txt | 19 + js/pfe-cta/README.md | 160 + js/pfe-cta/dist/pfe-cta--lightdom.css | 46 + js/pfe-cta/dist/pfe-cta--lightdom.min.css | 2 + js/pfe-cta/dist/pfe-cta--lightdom.min.css.map | 1 + js/pfe-cta/dist/pfe-cta.js | 241 + js/pfe-cta/dist/pfe-cta.js.map | 1 + js/pfe-cta/dist/pfe-cta.json | 83 + js/pfe-cta/dist/pfe-cta.min.js | 26 + js/pfe-cta/dist/pfe-cta.min.js.map | 1 + js/pfe-cta/dist/pfe-cta.umd.js | 354 + js/pfe-cta/dist/pfe-cta.umd.js.map | 1 + js/pfe-cta/dist/pfe-cta.umd.min.js | 2 + js/pfe-cta/dist/pfe-cta.umd.min.js.map | 1 + js/pfe-cta/package.json | 82 + js/pfe-datetime/LICENSE.txt | 19 + js/pfe-datetime/README.md | 132 + js/pfe-datetime/dist/pfe-datetime.js | 231 + js/pfe-datetime/dist/pfe-datetime.js.map | 1 + js/pfe-datetime/dist/pfe-datetime.json | 89 + js/pfe-datetime/dist/pfe-datetime.min.js | 26 + js/pfe-datetime/dist/pfe-datetime.min.js.map | 1 + js/pfe-datetime/dist/pfe-datetime.umd.js | 302 + js/pfe-datetime/dist/pfe-datetime.umd.js.map | 1 + js/pfe-datetime/dist/pfe-datetime.umd.min.js | 2 + .../dist/pfe-datetime.umd.min.js.map | 1 + js/pfe-datetime/package.json | 78 + js/pfe-icon/LICENSE.txt | 19 + js/pfe-icon/README.md | 84 + js/pfe-icon/dist/pfe-icon.js | 277 + js/pfe-icon/dist/pfe-icon.js.map | 1 + js/pfe-icon/dist/pfe-icon.json | 55 + js/pfe-icon/dist/pfe-icon.min.js | 27 + js/pfe-icon/dist/pfe-icon.min.js.map | 1 + js/pfe-icon/dist/pfe-icon.umd.js | 419 + js/pfe-icon/dist/pfe-icon.umd.js.map | 1 + js/pfe-icon/dist/pfe-icon.umd.min.js | 2 + js/pfe-icon/dist/pfe-icon.umd.min.js.map | 1 + js/pfe-icon/package.json | 78 + js/pfe-styles/LICENSE.txt | 19 + js/pfe-styles/README.md | 152 + js/pfe-styles/dist/pfe-base.css | 164 + js/pfe-styles/dist/pfe-base.css.map | 1 + js/pfe-styles/dist/pfe-base.min.css | 2 + js/pfe-styles/dist/pfe-base.min.css.map | 1 + js/pfe-styles/dist/pfe-context.css | 40 + js/pfe-styles/dist/pfe-context.css.map | 1 + js/pfe-styles/dist/pfe-context.min.css | 2 + js/pfe-styles/dist/pfe-context.min.css.map | 1 + js/pfe-styles/dist/pfe-layouts.css | 2132 +++++ js/pfe-styles/dist/pfe-layouts.css.map | 1 + js/pfe-styles/dist/pfe-layouts.min.css | 2 + js/pfe-styles/dist/pfe-layouts.min.css.map | 1 + js/pfe-styles/package.json | 83 + js/pfelement/LICENSE.txt | 19 + js/pfelement/README.md | 187 + js/pfelement/dist/pfelement--noscript.css | 6 + js/pfelement/dist/pfelement--noscript.min.css | 2 + .../dist/pfelement--noscript.min.css.map | 1 + js/pfelement/dist/pfelement.css | 52 + js/pfelement/dist/pfelement.css.map | 1 + js/pfelement/dist/pfelement.js | 479 ++ js/pfelement/dist/pfelement.js.map | 1 + js/pfelement/dist/pfelement.min.css | 2 + js/pfelement/dist/pfelement.min.css.map | 1 + js/pfelement/dist/pfelement.min.js | 26 + js/pfelement/dist/pfelement.min.js.map | 1 + js/pfelement/dist/pfelement.umd.js | 635 ++ js/pfelement/dist/pfelement.umd.js.map | 1 + js/pfelement/dist/pfelement.umd.min.js | 2 + js/pfelement/dist/pfelement.umd.min.js.map | 1 + js/pfelement/package.json | 92 + posts/weekly-2020-05-01.html | 180 + posts/weekly-2020-05-14.html | 89 + posts/weekly-2020-05-29.html | 123 + posts/weekly-2020-06-11.html | 131 + posts/weekly-2020-06-26.html | 114 + posts/weekly-2020-07-09.html | 111 + posts/weekly-2020-07-30.html | 130 + posts/weekly-2020-08-13.html | 109 + posts/weekly-2020-08-27.html | 110 + posts/weekly-2020-09-16.html | 81 + posts/weekly-2020-09-30.html | 91 + posts/weekly-2020-10-12.html | 129 + posts/weekly-2020-10-23.html | 131 + posts/weekly-2020-11-06.html | 125 + posts/weekly-2020-11-20.html | 104 + posts/weekly-2020-12-03.html | 132 + posts/weekly-2020-12-17.html | 91 + posts/weekly-2020-12-25.html | 113 + posts/weekly-2021-01-14.html | 120 + posts/weekly-2021-01-28.html | 138 + posts/weekly-2021-02-11.html | 132 + posts/weekly-2021-02-25.html | 125 + posts/weekly-2021-03-11.html | 137 + posts/weekly-2021-03-25.html | 148 + posts/weekly-2021-04-08.html | 134 + posts/weekly-2021-04-26.html | 152 + posts/weekly-2021-05-31.html | 170 + posts/weekly-2021-06-18.html | 154 + posts/weekly-2021-07-01.html | 123 + posts/weekly-2021-07-14.html | 124 + posts/weekly-2021-08-11.html | 119 + posts/weekly-2021-08-27.html | 133 + posts/weekly-2021-09-10.html | 126 + posts/weekly-2021-09-23.html | 152 + posts/weekly-2021-10-08.html | 140 + posts/weekly-2021-10-21.html | 142 + posts/weekly-2021-11-04.html | 159 + posts/weekly-2021-11-18.html | 157 + posts/weekly-2021-12-02.html | 151 + posts/weekly-2021-12-20.html | 163 + posts/weekly-2022-01-13.html | 143 + posts/weekly-2022-01-27.html | 161 + posts/weekly-2022-02-10.html | 174 + posts/weekly-2022-02-25.html | 153 + posts/weekly-2022-03-11.html | 148 + posts/weekly-2022-03-25.html | 136 + posts/weekly-2022-04-07.html | 168 + posts/weekly-2022-04-22.html | 171 + posts/weekly-2022-05-07.html | 150 + posts/weekly-2022-06-02.html | 162 + posts/weekly-2022-06-16.html | 124 + posts/weekly-2022-06-30.html | 162 + posts/weekly-2022-07-14.html | 129 + posts/weekly-2022-07-28.html | 156 + posts/weekly-2022-08-11.html | 171 + posts/weekly-2022-08-25.html | 141 + posts/weekly-2022-09-08.html | 147 + posts/weekly-2022-09-22.html | 136 + posts/weekly-2022-10-07.html | 160 + posts/weekly-2022-10-20.html | 117 + posts/weekly-2022-11-04.html | 128 + posts/weekly-2022-11-18.html | 122 + posts/weekly-2022-12-01.html | 128 + posts/weekly-2022-12-15.html | 147 + posts/weekly-2022-12-29.html | 73 + posts/weekly-2023-01-26.html | 159 + posts/weekly-2023-02-08.html | 163 + posts/weekly-2023-02-24.html | 138 + posts/weekly-2023-03-09.html | 120 + posts/weekly-2023-03-23.html | 120 + posts/weekly-2023-04-06.html | 140 + posts/weekly-2023-04-20.html | 129 + posts/weekly-2023-05-18.html | 126 + posts/weekly-2023-06-01.html | 116 + posts/weekly-2023-07-03.html | 77 + trademarks.html | 570 ++ tweets.html | 67 + 215 files changed, 29850 insertions(+) create mode 100644 atom.xml create mode 100644 blogs.html create mode 100644 css/jbossorg.css create mode 100644 data/people/alex-porcelli.json create mode 100644 data/people/example-author.json create mode 100644 data/people/paul-robinson.json create mode 100644 img/favicon.ico create mode 100644 img/people/alex-porcelli.png create mode 100644 img/people/default_usericon.png create mode 100644 img/people/don-naro.png create mode 100644 img/people/francesco-marchioni.png create mode 100644 img/people/jason-porter.png create mode 100644 img/people/kevin-conner.png create mode 100644 img/people/mark-little.png create mode 100644 img/people/paul-robinson.png create mode 100644 img/people/pedro-silva.png create mode 100644 img/people/romain-pelisse.png create mode 100644 img/people/stefan-sitani.png create mode 100644 img/posts/rh-summit-banner.png create mode 100644 img/redhat_reversed.svg create mode 100644 img/sponsored_by_redhat_reversed.svg create mode 100644 index.html create mode 100644 js/cpx-footer.js create mode 100644 js/cpx-search/cpx-query.js create mode 100644 js/cpx-search/cpx-result.js create mode 100644 js/cpx-search/cpx-results.js create mode 100644 js/cpx-search/cpx-search-box.js create mode 100644 js/jbossorg.js create mode 100644 js/pfe-avatar/LICENSE.txt create mode 100644 js/pfe-avatar/README.md create mode 100644 js/pfe-avatar/dist/pfe-avatar.js create mode 100644 js/pfe-avatar/dist/pfe-avatar.js.map create mode 100644 js/pfe-avatar/dist/pfe-avatar.min.js create mode 100644 js/pfe-avatar/dist/pfe-avatar.min.js.map create mode 100644 js/pfe-avatar/dist/pfe-avatar.umd.js create mode 100644 js/pfe-avatar/dist/pfe-avatar.umd.js.map create mode 100644 js/pfe-avatar/dist/pfe-avatar.umd.min.js create mode 100644 js/pfe-avatar/dist/pfe-avatar.umd.min.js.map create mode 100644 js/pfe-avatar/package.json create mode 100644 js/pfe-band/LICENSE.txt create mode 100644 js/pfe-band/README.md create mode 100644 js/pfe-band/dist/pfe-band.js create mode 100644 js/pfe-band/dist/pfe-band.js.map create mode 100644 js/pfe-band/dist/pfe-band.json create mode 100644 js/pfe-band/dist/pfe-band.min.js create mode 100644 js/pfe-band/dist/pfe-band.min.js.map create mode 100644 js/pfe-band/dist/pfe-band.umd.js create mode 100644 js/pfe-band/dist/pfe-band.umd.js.map create mode 100644 js/pfe-band/dist/pfe-band.umd.min.js create mode 100644 js/pfe-band/dist/pfe-band.umd.min.js.map create mode 100644 js/pfe-band/package.json create mode 100644 js/pfe-card/LICENSE.txt create mode 100644 js/pfe-card/README.md create mode 100644 js/pfe-card/dist/pfe-card--lightdom.css create mode 100644 js/pfe-card/dist/pfe-card--lightdom.min.css create mode 100644 js/pfe-card/dist/pfe-card--lightdom.min.css.map create mode 100644 js/pfe-card/dist/pfe-card.js create mode 100644 js/pfe-card/dist/pfe-card.js.map create mode 100644 js/pfe-card/dist/pfe-card.json create mode 100644 js/pfe-card/dist/pfe-card.min.js create mode 100644 js/pfe-card/dist/pfe-card.min.js.map create mode 100644 js/pfe-card/dist/pfe-card.umd.js create mode 100644 js/pfe-card/dist/pfe-card.umd.js.map create mode 100644 js/pfe-card/dist/pfe-card.umd.min.js create mode 100644 js/pfe-card/dist/pfe-card.umd.min.js.map create mode 100644 js/pfe-card/package.json create mode 100644 js/pfe-cta/LICENSE.txt create mode 100644 js/pfe-cta/README.md create mode 100644 js/pfe-cta/dist/pfe-cta--lightdom.css create mode 100644 js/pfe-cta/dist/pfe-cta--lightdom.min.css create mode 100644 js/pfe-cta/dist/pfe-cta--lightdom.min.css.map create mode 100644 js/pfe-cta/dist/pfe-cta.js create mode 100644 js/pfe-cta/dist/pfe-cta.js.map create mode 100644 js/pfe-cta/dist/pfe-cta.json create mode 100644 js/pfe-cta/dist/pfe-cta.min.js create mode 100644 js/pfe-cta/dist/pfe-cta.min.js.map create mode 100644 js/pfe-cta/dist/pfe-cta.umd.js create mode 100644 js/pfe-cta/dist/pfe-cta.umd.js.map create mode 100644 js/pfe-cta/dist/pfe-cta.umd.min.js create mode 100644 js/pfe-cta/dist/pfe-cta.umd.min.js.map create mode 100644 js/pfe-cta/package.json create mode 100644 js/pfe-datetime/LICENSE.txt create mode 100644 js/pfe-datetime/README.md create mode 100644 js/pfe-datetime/dist/pfe-datetime.js create mode 100644 js/pfe-datetime/dist/pfe-datetime.js.map create mode 100644 js/pfe-datetime/dist/pfe-datetime.json create mode 100644 js/pfe-datetime/dist/pfe-datetime.min.js create mode 100644 js/pfe-datetime/dist/pfe-datetime.min.js.map create mode 100644 js/pfe-datetime/dist/pfe-datetime.umd.js create mode 100644 js/pfe-datetime/dist/pfe-datetime.umd.js.map create mode 100644 js/pfe-datetime/dist/pfe-datetime.umd.min.js create mode 100644 js/pfe-datetime/dist/pfe-datetime.umd.min.js.map create mode 100644 js/pfe-datetime/package.json create mode 100644 js/pfe-icon/LICENSE.txt create mode 100644 js/pfe-icon/README.md create mode 100644 js/pfe-icon/dist/pfe-icon.js create mode 100644 js/pfe-icon/dist/pfe-icon.js.map create mode 100644 js/pfe-icon/dist/pfe-icon.json create mode 100644 js/pfe-icon/dist/pfe-icon.min.js create mode 100644 js/pfe-icon/dist/pfe-icon.min.js.map create mode 100644 js/pfe-icon/dist/pfe-icon.umd.js create mode 100644 js/pfe-icon/dist/pfe-icon.umd.js.map create mode 100644 js/pfe-icon/dist/pfe-icon.umd.min.js create mode 100644 js/pfe-icon/dist/pfe-icon.umd.min.js.map create mode 100644 js/pfe-icon/package.json create mode 100644 js/pfe-styles/LICENSE.txt create mode 100644 js/pfe-styles/README.md create mode 100644 js/pfe-styles/dist/pfe-base.css create mode 100644 js/pfe-styles/dist/pfe-base.css.map create mode 100644 js/pfe-styles/dist/pfe-base.min.css create mode 100644 js/pfe-styles/dist/pfe-base.min.css.map create mode 100644 js/pfe-styles/dist/pfe-context.css create mode 100644 js/pfe-styles/dist/pfe-context.css.map create mode 100644 js/pfe-styles/dist/pfe-context.min.css create mode 100644 js/pfe-styles/dist/pfe-context.min.css.map create mode 100644 js/pfe-styles/dist/pfe-layouts.css create mode 100644 js/pfe-styles/dist/pfe-layouts.css.map create mode 100644 js/pfe-styles/dist/pfe-layouts.min.css create mode 100644 js/pfe-styles/dist/pfe-layouts.min.css.map create mode 100644 js/pfe-styles/package.json create mode 100644 js/pfelement/LICENSE.txt create mode 100644 js/pfelement/README.md create mode 100644 js/pfelement/dist/pfelement--noscript.css create mode 100644 js/pfelement/dist/pfelement--noscript.min.css create mode 100644 js/pfelement/dist/pfelement--noscript.min.css.map create mode 100644 js/pfelement/dist/pfelement.css create mode 100644 js/pfelement/dist/pfelement.css.map create mode 100644 js/pfelement/dist/pfelement.js create mode 100644 js/pfelement/dist/pfelement.js.map create mode 100644 js/pfelement/dist/pfelement.min.css create mode 100644 js/pfelement/dist/pfelement.min.css.map create mode 100644 js/pfelement/dist/pfelement.min.js create mode 100644 js/pfelement/dist/pfelement.min.js.map create mode 100644 js/pfelement/dist/pfelement.umd.js create mode 100644 js/pfelement/dist/pfelement.umd.js.map create mode 100644 js/pfelement/dist/pfelement.umd.min.js create mode 100644 js/pfelement/dist/pfelement.umd.min.js.map create mode 100644 js/pfelement/package.json create mode 100644 posts/weekly-2020-05-01.html create mode 100644 posts/weekly-2020-05-14.html create mode 100644 posts/weekly-2020-05-29.html create mode 100644 posts/weekly-2020-06-11.html create mode 100644 posts/weekly-2020-06-26.html create mode 100644 posts/weekly-2020-07-09.html create mode 100644 posts/weekly-2020-07-30.html create mode 100644 posts/weekly-2020-08-13.html create mode 100644 posts/weekly-2020-08-27.html create mode 100644 posts/weekly-2020-09-16.html create mode 100644 posts/weekly-2020-09-30.html create mode 100644 posts/weekly-2020-10-12.html create mode 100644 posts/weekly-2020-10-23.html create mode 100644 posts/weekly-2020-11-06.html create mode 100644 posts/weekly-2020-11-20.html create mode 100644 posts/weekly-2020-12-03.html create mode 100644 posts/weekly-2020-12-17.html create mode 100644 posts/weekly-2020-12-25.html create mode 100644 posts/weekly-2021-01-14.html create mode 100644 posts/weekly-2021-01-28.html create mode 100644 posts/weekly-2021-02-11.html create mode 100644 posts/weekly-2021-02-25.html create mode 100644 posts/weekly-2021-03-11.html create mode 100644 posts/weekly-2021-03-25.html create mode 100644 posts/weekly-2021-04-08.html create mode 100644 posts/weekly-2021-04-26.html create mode 100644 posts/weekly-2021-05-31.html create mode 100644 posts/weekly-2021-06-18.html create mode 100644 posts/weekly-2021-07-01.html create mode 100644 posts/weekly-2021-07-14.html create mode 100644 posts/weekly-2021-08-11.html create mode 100644 posts/weekly-2021-08-27.html create mode 100644 posts/weekly-2021-09-10.html create mode 100644 posts/weekly-2021-09-23.html create mode 100644 posts/weekly-2021-10-08.html create mode 100644 posts/weekly-2021-10-21.html create mode 100644 posts/weekly-2021-11-04.html create mode 100644 posts/weekly-2021-11-18.html create mode 100644 posts/weekly-2021-12-02.html create mode 100644 posts/weekly-2021-12-20.html create mode 100644 posts/weekly-2022-01-13.html create mode 100644 posts/weekly-2022-01-27.html create mode 100644 posts/weekly-2022-02-10.html create mode 100644 posts/weekly-2022-02-25.html create mode 100644 posts/weekly-2022-03-11.html create mode 100644 posts/weekly-2022-03-25.html create mode 100644 posts/weekly-2022-04-07.html create mode 100644 posts/weekly-2022-04-22.html create mode 100644 posts/weekly-2022-05-07.html create mode 100644 posts/weekly-2022-06-02.html create mode 100644 posts/weekly-2022-06-16.html create mode 100644 posts/weekly-2022-06-30.html create mode 100644 posts/weekly-2022-07-14.html create mode 100644 posts/weekly-2022-07-28.html create mode 100644 posts/weekly-2022-08-11.html create mode 100644 posts/weekly-2022-08-25.html create mode 100644 posts/weekly-2022-09-08.html create mode 100644 posts/weekly-2022-09-22.html create mode 100644 posts/weekly-2022-10-07.html create mode 100644 posts/weekly-2022-10-20.html create mode 100644 posts/weekly-2022-11-04.html create mode 100644 posts/weekly-2022-11-18.html create mode 100644 posts/weekly-2022-12-01.html create mode 100644 posts/weekly-2022-12-15.html create mode 100644 posts/weekly-2022-12-29.html create mode 100644 posts/weekly-2023-01-26.html create mode 100644 posts/weekly-2023-02-08.html create mode 100644 posts/weekly-2023-02-24.html create mode 100644 posts/weekly-2023-03-09.html create mode 100644 posts/weekly-2023-03-23.html create mode 100644 posts/weekly-2023-04-06.html create mode 100644 posts/weekly-2023-04-20.html create mode 100644 posts/weekly-2023-05-18.html create mode 100644 posts/weekly-2023-06-01.html create mode 100644 posts/weekly-2023-07-03.html create mode 100644 trademarks.html create mode 100644 tweets.html diff --git a/atom.xml b/atom.xml new file mode 100644 index 00000000..0dc29fb1 --- /dev/null +++ b/atom.xml @@ -0,0 +1,7334 @@ + + + https://www.jboss.org/blogs.html + JBoss Blogs + 2025-02-26T00:00:00.000Z + https://github.com/jpmonette/feed + + aggregation of various JBoss blogs + https://www.jboss.org/img/favicon.ico + + <![CDATA[Quarkus 3.19 - UBI 9 images, Micrometer to OpenTelemetry bridge, JEP 483 new AOT cache...]]> + https://quarkus.io/blog/quarkus-3-19-1-released/ + + 2025-02-26T00:00:00.000Z + + + Guillaume Smet + + + + <![CDATA[New videos about OpenID Connect and Keycloak from FOSDEM 2025]]> + https://www.keycloak.org/2025/02/recordings-available-fosdem + + 2025-02-25T00:00:00.000Z + + + Alexander Schwartz + + + + <![CDATA[Agentic AI with Quarkus - part 2]]> + https://quarkus.io/blog/agentic-ai-with-quarkus-p2/ + + 2025-02-20T00:00:00.000Z + (Booking) b) .mapToInt(b -> b.partySize) .sum(); return sum + partySize <= capacity; } @Transactional @Tool("Books a table for a given name, date (passed as day of the month, month and year), party size and preference (indoor/outdoor). If the restaurant is full, an exception is thrown. If preference is not specified, `UNSET` is used.") public String book(String name, int day, int month, int year, int partySize, Booking.Preference preference) { var date = LocalDate.of(year, month, day); if (hasCapacity(date, partySize)) { Booking booking = new Booking(); booking.date = date; booking.name = name; booking.partySize = partySize; if (preference == null) { preference = Booking.Preference.UNSET; } booking.preference = preference; booking.persist(); String result = String.format("%s successfully booked a %s table for %d persons on %s", name, preference, partySize, date); Log.info(result); return result; } return "The restaurant is full for that day"; } } To assist the customer in deciding whether to eat outside, the agent can also reuse, as a second tool, the implemented in one of the former examples, passing to it the geographic coordinates of the restaurant. restaurant.location.latitude=45 restaurant.location.longitude=5 The final architectural design of the chatbot is the following: Figure 5. The restaurant chatbot agent Once the customer provides all necessary details, the chatbot confirms the booking and presents a reservation summary. The final booking is then stored in the database. It is possible to give this a try by accessing the URL: A typical example of user interaction could be something like this: Figure 6. An example of interaction with the restaurant chatbot agent CONCLUSIONS AND NEXT STEPS This blog post series illustrates how you can use agentic patterns to implement AI-infused applications with Quarkus and its LangChain4j extension. We have covered workflow patterns in a previous post and agents in this post. Both sets of patterns are based on the same underlying principles but differ in how the control flow is managed. The workflow patterns are more suitable for tasks that can be easily defined programmatically, while agents are more flexible and can handle a broader range of tasks. Nevertheless, the examples discussed in this series can be improved and further generalized with other techniques that will be introduced in future works, such as: * Memory management across LLM calls * State management for long-running processes * Improved observability * Dynamic tools and tool discovery * The relation with the MCP protocol and how agentic architecture can be implemented with MCP clients and servers * How can the RAG pattern be revisited in light of the agentic architecture, both with workflow patterns and agents?]]> + + Mario Fusco + + + + <![CDATA[Keycloak JS 26.2.0 released]]> + https://www.keycloak.org/2025/02/keycloak-js-2620-released + + 2025-02-20T00:00:00.000Z + + + + + + + <![CDATA[RESTEasy in a Foundation]]> + https://resteasy.dev/2025/02/19/resteasy-to-foundation/ + + 2025-02-19T18:11:11.000Z + + + + + + <![CDATA[Keycloak Extensions show GitHub stars]]> + https://www.keycloak.org/2025/02/updated-extension-page + + 2025-02-19T00:00:00.000Z + + + Alexander Schwartz + + + + <![CDATA[Quarkus 3.18.4 - Maintenance release]]> + https://quarkus.io/blog/quarkus-3-18-4-released/ + + 2025-02-19T00:00:00.000Z + + + Guillaume Smet + + + + <![CDATA[Agentic AI with Quarkus - part 1]]> + https://quarkus.io/blog/agentic-ai-with-quarkus/ + + 2025-02-18T00:00:00.000Z + plan(String mood) { var movieSelection = Uni.createFrom().item(() -> movieExpert.findMovie(mood)).runSubscriptionOn(scheduler); var mealSelection = Uni.createFrom().item(() -> foodExpert.findMeal(mood)).runSubscriptionOn(scheduler); return Uni.combine().all() .unis(movieSelection, mealSelection) // This invokes the two LLMs in parallel .with((movies, meals) -> { // Both calls have completed, let's combine the results List moviesAndMeals = new ArrayList<>(); for (int i = 0; i < 3; i++) { moviesAndMeals.add(new EveningPlan(movies.get(i), meals.get(i))); } return moviesAndMeals; }) .await().atMost(Duration.ofSeconds(60)); } The is an AI service asked to provide three titles of movies matching the given mood. @RegisterAiService public interface MovieExpert { @UserMessage(""" You are a great evening planner. Propose a list of 3 movies matching the given mood. The mood is {mood}. Provide a list with the 3 items and nothing else. """) List findMovie(String mood); } The , with a very similar implementation is asked to provide three meals. When these LLM calls are complete, the results (3 lists of 3 items each) are aggregated to create a list of 3 fantastic evening plans with a suggested movie and meal each. Figure 3. The parallelization pattern For instance asking that endpoint to provide evening plans for a romantic mood: curl http://localhost:8080/evening/mood/romantic The outcome is something like: [ EveningPlan[movie=1. The Notebook, meal=1. Candlelit Chicken Piccata], EveningPlan[movie=2. La La Land, meal=2. Rose Petal Risotto], EveningPlan[movie=3. Crazy, Stupid, Love., meal=3. Sunset Seared Scallops] ] In this case, the tracing of the flow of invocations performed to fulfill this request shows, as expected, that the two LLM invocations are performed in parallel. Figure 4. Tracing parallel LLMs invocation ROUTING Another common situation is the need to direct tasks requiring specific handling to specialized models, tools, or processes based on determined criteria. In these cases, the routing workflow allows the dynamic allocation of tasks to the most suitable AI service. shows how this pattern can be applied in a simple scenario where a user asks a question that has to be redirected to a , or expert to be answered most accurately, where any of these experts are an AI service implemented for instance as follows: @RegisterAiService public interface MedicalExpert { @UserMessage(""" You are a medical expert. Analyze the following user request under a medical point of view and provide the best possible answer. The user request is {request}. """) String chat(String request); } The categorization of the user’s request is performed by @RegisterAiService public interface CategoryRouter { @UserMessage(""" Analyze the following user request and categorize it as 'legal', 'medical' or 'technical'. Reply with only one of those words and nothing else. The user request is {request}. """) RequestCategory classify(String request); } that returns one of the possible categories of the user’s request, encoded in this enumeration: public enum RequestCategory { LEGAL, MEDICAL, TECHNICAL, UNKNOWN } Thus, the can send the question to the right expert. public UnaryOperator findExpert(String request) { var category = RequestType.decode(categoryRouter.classify(request)); return switch (category) { case LEGAL -> legalExpert::chat; case MEDICAL -> medicalExpert::chat; case TECHNICAL -> technicalExpert::chat; default -> ignore -> "I cannot find an appropriate category for this request."; }; } Figure 5. Routing pattern In this way, when the user calls the , exposing this service writing something like: "I broke my leg what should I do": curl http://localhost:8080/expert/request/I%20broke%20my%20leg%20what%20should%20I%20do The first LLM categorizes this request as a medical one, and the router forwards it to the medical expert LLM, thus generating a result like . CONCLUSION This article demonstrated how you can implement workflow patterns with Quarkus Langchain4J. Quarkus Langchain4J provides a powerful and flexible way to implement these patterns, allowing you to orchestrate multiple AI services in a way that is both efficient and easy to understand. The next article will cover the agent patterns. So, stay tuned!]]> + + Mario Fusco + + + + <![CDATA[Using LangChain4j to analyze PDF documents]]> + https://quarkus.io/blog/using-langchain4j-to-analyze-pdf-documents/ + + 2025-02-17T00:00:00.000Z + Next we need to install the LangChain4j dependencies: io.quarkiverse.langchain4j quarkus-langchain4j-ai-gemini 0.25.0 CONFIGURE GEMINI LLM Next we need to wire up the Gemini LLM to the application (using your Google AI Gemini API key). quarkus.langchain4j.ai.gemini.chat-model.model-id=gemini-2.0-flash quarkus.langchain4j.log-requests=true quarkus.langchain4j.log-responses=true Logging the request and response is optional but can be helpful for debugging. REGISTER THE AI SERVICE We must register the AI service to use the LeaseAnalyzer interface. import dev.langchain4j.data.pdf.PdfFile; import dev.langchain4j.service.UserMessage; import io.quarkiverse.langchain4j.PdfUrl; import io.quarkiverse.langchain4j.RegisterAiService; @RegisterAiService(chatMemoryProviderSupplier = RegisterAiService.NoChatMemoryProviderSupplier.class) public interface LeaseAnalyzer { @UserMessage("Analyze the given document") LeaseReport analyze(@PdfUrl PdfFile pdfFile); } DEFINE YOUR DATA STRUCTURE Now we need to model the data structure for the lease information that we want the LLM to extract from any lease document. You can customize these fields based on the information you need from the PDF documents but in our use case below we are extracting the following information: public record LeaseReport( LocalDate agreementDate, LocalDate termStartDate, LocalDate termEndDate, LocalDate developmentTermEndDate, String landlordName, String tenantName, String taxParcelId, BigDecimal acres, Boolean exclusiveRights) { } CREATE THE REST ENDPOINT Lastly, we need to create a LeaseAnalyzerResource class that will use the LLM to extract the lease information from the PDF document. @Inject LeaseAnalyzer analyzer; @PUT @Consumes(MediaType.MULTIPART_FORM_DATA) @Produces(MediaType.TEXT_PLAIN) public String upload(@RestForm("file") FileUpload fileUploadRequest) { final String fileName = fileUploadRequest.fileName(); log.infof("Uploading file: %s", fileName); try { // Convert input stream to byte array for processing byte[] fileBytes = Files.readAllBytes(fileUploadRequest.filePath()); // Encode PDF content to base64 for transmission String documentEncoded = Base64.getEncoder().encodeToString(fileBytes); log.info("Google Gemini analyzing...."); long startTime = System.nanoTime(); LeaseReport result = analyzer.analyze(PdfFile.builder().base64Data(documentEncoded).build()); long endTime = System.nanoTime(); log.infof("Google Gemini analyzed in %.2f seconds: %s", (endTime - startTime) / 1_000_000_000.0, result); return result; } catch (IOException e) { throw new RuntimeException(e); } } There is a simple HTML/JavaScript frontend that allows you to upload a PDF document and view the results. In the example below 3 different lease documents were uploaded and analyzed. Figure 1. Lease Analyzer Results You can find the complete example code on . CONCLUSION This article demonstrated how LangChain4j and AI can be leveraged to automatically extract structured metadata from PDF documents. By implementing this solution, our client will significantly reduce manual document processing time, potentially saving thousands of work hours annually. The combination of LangChain4j and Google Gemini AI proves to be a powerful approach for automating document analysis workflows.]]> + + Emil Lefkof + + + + <![CDATA[resteasy-grpc: Handling Collections]]> + https://resteasy.dev/2025/02/14/resteasy-grpc-collections/ + + 2025-02-14T00:00:00.000Z + + + + + + <![CDATA[Eclipse Vert.x 5 candidate 5 released!]]> + https://vertx.io/blog/eclipse-vert-x-5-candidate-5-released + + 2025-02-13T00:00:00.000Z + + Julien Viet + + + + <![CDATA[Vlog: Admin your WildFly with LLM and MCP]]> + https://www.youtube.com/watch?v=wg1hAdOoe2w + + 2025-02-13T00:00:00.000Z + + + smaesti + + + + <![CDATA[An introduction to use the domain mode of the current release of WildFly]]> + https://wildfly.org//news/2025/02/12/wildfly-domain-usage/ + + 2025-02-12T00:00:00.000Z + A key focus in WildFly 25 has been completing our migration away from the > legacy security layer that dates back to JBoss AS and onto the based > introduced in WildFly 11. SE 17 does not provide packages that legacy security > heavily relies upon, so the time has come to complete the transition off of > legacy security. Nevertheless, the resources I could find are mostly outdated or don’t contain the step-by-step walkthrough about the minimal configuration to be done for using the domain mode of WildFly. I have written a book before, explaining the domain mode usage of WildFly[]. There is also a relative document about the domain mode setup[]. All these materials are outdated on the domain configuration topic, so I’d like to update the knowledge on this topic in this blog post, showing how to configure the domain mode for the most recent version of WildFly server, which is version 35 when I’m writing this blog post. I won’t cover all the detail usages of the domain mode in this blog post, but it will be a good start to follow the instructions in this blog posts for the further studies. Here is my local environment setup to use the domain mode of the WildFly server: As the deployment diagram shows above, I used two machines to run the WildFly server in domain mode. In the above setup, the WildFly server running on Machine A acts as a domain controller, and the WildFly server on Machine B will be connected to Machine A accepting the management from the domain server. The host name of the WildFly server running on Machine A will be configured to primary(this will be defined in the name property in the host.xml), and the host name of the WildFly server running on Machine B will be configured to secondary. Both WildFly servers, running on two different machines, will be configured to run a managed server (defined in the server section of the host.xml) within the same server group, named other-server-group. The Primary Host Controller will define a server-three managed server, while the Secondary Host Controller will define a server-two managed server, both belonging to the other-server-group server group. In this way, the Domain Controller can manage the server group and deploy user applications to the managed servers within it, even though the managed servers are running on different hosts. The first step is to download the current version of WildFly. I will use version 35.0.0.Final version in this blog post which is the newest final version when I’m writing this blog post. Here is the release page: * ❯ wget https://github.com/wildfly/wildfly/releases/download/35.0.0.Final/wildfly-35.0.0.Final.zip After the WildFly server zip file is downloaded and extracted into both machines, I can do the configuration work. The extracted WildFly server directory has some of the configuration files out-of-box. Here are the domain configurations provided: ❯ ls wildfly-35.0.0.Final/domain/configuration/ application-roles.properties host-secondary.xml application-users.properties host.xml default-server-logging.properties logging.properties domain.xml mgmt-groups.properties host-primary.xml mgmt-users.properties From the above command output, we can see in the wildfly-35.0.0.Final/domain/configuration/ directory, it contains host-primary.xml and host-secondary.xml files. I will use host-secondary.xml with some modifications in Machine B. However, I’ll use the host.xml instead of host-primary.xml in Machine A, because host-primary.xml has removed all the servers configuration, but we need these servers configuration in our setup. However, I still need to configure a Managed Server in Machine A for demonstration purposes. First, let’s check the host.xml on Machine A to fit the requirement. In host.xml, the host name is set to primary by default: This is what I expect, so I don’t need to change it. Instead of directly editing the configuration file, we can use the jboss-cli.sh to connect to the server to edit the configuration file in a more controllable way. To do this, we can first run the jboss-cli.sh: ❯ pwd /Users/weli/works/wildfly-35.0.0.Final/bin weli@192 ~/works/wildfly-35.0.0.Final/bin ❯ ./jboss-cli.sh You are disconnected at the moment. Type 'connect' to connect to the server or 'help' for the list of supported commands. [disconnected /] After entering the CLI, run the following command to connect to the host controller: [disconnected /] embed-host-controller [domain@embedded /] The above command will run the domain server in offline-mode(To learn about the detailed usages of the above command, you can read this blog post[]). And we can now configure the server in the CLI, and all the changes will be persisted into the host controller configuration file(by default it’s host.xml). Now we can use the CLI to read the host name: [domain@embedded /] /:read-attribute(name=local-host-name) { "outcome" => "success", "result" => "primary" } It’s preferred to use CLI command instead of directly operating on the host controller configuration file. In the rest of this blog post, I’ll introduce both the content of the host controller file, and the way to use the CLI command to modify it. Now we can see the host.xml file has two servers settings by default: I’ll use only server-three in this blog post, so I comment out the server-one and the server-two definitions and only leave the server-three definition here. Here are the commands to disable the server-one and server-two from auto-starting: [domain@embedded /] /host=primary/server-config=server-one:write-attribute(name=auto-start, value=false) { "outcome" => "success", "result" => undefined, "server-groups" => undefined } [domain@embedded /] /host=primary/server-config=server-two:write-attribute(name=auto-start, value=false) { "outcome" => "success", "result" => undefined, "server-groups" => undefined } [domain@embedded /] Alternatively, you can use these commands to remove the server-one and server-two directly: /host=primary/server-config=server-one:remove /host=primary/server-config=server-two:remove In addition, there are several interface properties defined in the host.xml file that we need to override during runtime. Here is the interfaces section in the host.xml: I checked my IP address of Machine A, and it’s 192.168.0.115, so I started the WildFly Server on Machine A by running the following commands in the bin directory of WildFly: $ pwd /wildfly-35.0.0.Final/bin $ ./domain.sh --host-config=host.xml -Djboss.bind.address.management=192.168.0.115 -Djboss.bind.address=192.168.0.115 -Djboss.domain.primary.address=192.168.0.115 Please note that the host.xml is the default value for the --host-config argument. So in this specific case we don’t have to add it. And I can see the server is started and here is the server log output of the above command: ========================================================================= JBoss Bootstrap Environment JBOSS_HOME: /wildfly-35.0.0.Final JAVA: .sdkman/candidates/java/current/bin/java JAVA_OPTS: -Xms64m -Xmx512m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true -Djdk.serialFilter="maxbytes=10485760;maxdepth=128;maxarray=100000;maxrefs=300000" --add-exports=java.desktop/sun.awt=ALL-UNNAMED --add-exports=java.naming/com.sun.jndi.ldap=ALL-UNNAMED --add-exports=java.naming/com.sun.jndi.url.ldap=ALL-UNNAMED --add-exports=java.naming/com.sun.jndi.url.ldaps=ALL-UNNAMED --add-exports=jdk.naming.dns/com.sun.jndi.dns=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.security=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.management/javax.management=ALL-UNNAMED --add-opens=java.naming/javax.naming=ALL-UNNAMED -Djava.security.manager=allow ========================================================================= 17:06:49,064 INFO [org.jboss.modules] (main) JBoss Modules version 2.1.6.Final 17:06:49,405 INFO [org.jboss.threads] (main) JBoss Threads version 2.4.0.Final 17:06:49,428 INFO [org.jboss.as.process.Host Controller.status] (main) WFLYPC0018: Starting process 'Host Controller' 17:06:49,896 INFO [org.jboss.as.process.Host Controller.system.stdout] (stdout for Host Controller) [Host Controller] 17:06:49,875 INFO [org.jboss.modules] (main) JBoss Modules version 2.1.6.Final [Host Controller] 17:06:50,385 INFO [org.jboss.msc] (main) JBoss MSC version 1.5.5.Final [Host Controller] 17:06:50,393 INFO [org.jboss.threads] (main) JBoss Threads version 2.4.0.Final [Host Controller] 17:06:50,441 INFO [org.jboss.as] (MSC service thread 1-2) WFLYSRV0049: WildFly 35.0.0.Final (WildFly Core 27.0.0.Final) starting [Host Controller] 17:06:50,806 INFO [org.wildfly.security] (Controller Boot Thread) ELY00001: WildFly Elytron version 2.6.0.Final [Host Controller] 17:06:51,088 INFO [org.jboss.as.host.controller] (Controller Boot Thread) WFLYHC0003: Creating http management service using network interface (management) port (9990) securePort (-1) [Host Controller] 17:06:51,099 INFO [org.xnio] (MSC service thread 1-3) XNIO version 3.8.16.Final [Host Controller] 17:06:51,103 INFO [org.xnio.nio] (MSC service thread 1-3) XNIO NIO Implementation Version 3.8.16.Final [Host Controller] 17:06:51,139 INFO [org.jboss.remoting] (MSC service thread 1-7) JBoss Remoting version 5.0.30.Final [Host Controller] 17:06:52,510 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0062: Http management interface listening on http://192.168.0.115:9990/management and https://192.168.0.115:-1/management [Host Controller] 17:06:52,510 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0053: Admin console listening on http://192.168.0.115:9990 and https://192.168.0.115:-1 [Host Controller] 17:06:52,546 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly 35.0.0.Final (WildFly Core 27.0.0.Final) (Host Controller) started in 3066ms - Started 70 of 71 services (14 services are lazy, passive or on-demand) - Host Controller configuration files in use: domain.xml, host.xml - Minimum feature stability level: community From the above server log output, I can see the server-bound address is 192.168.0.115 instead of the default 127.0.0.1. Then I opened another terminal window and ran the following command in the bin directory of the WildFly server: $ ./add-user.sh -u admin -p 123 Added user 'admin' to file '/wildfly-35.0.0.Final/standalone/configuration/mgmt-users.properties' Added user 'admin' to file '/wildfly-35.0.0.Final/domain/configuration/mgmt-users.properties' From the above command output, we can see the admin user is added and its password is 123. This added user will be used on the Secondary Host Controller to connect to the Primary Host controller. Please note that the above command didn’t generate a secret value related to the generated admin user as described you may find in the other online materials, which is already deprecated since WildFly 25. So the following secret configuration on the Secondary Host Controller is already deprecated: As the Primary Host Controller is started on Machine A, now we can check the WildFly server configuration on Machine B. As planned, the Host Controller is named secondary, and it will be connected to the Primary Host Controller on Machine A, which acts as the domain controller. Now we can check the configuration on the Secondary Host Controller. The Secondary Host Controller on Machine B will use the host-secondary.xml file as its configuration file. Please note that to edit the host-secondary.xml file in CLI, you should use this command to connect to the embedded server and use the correct host controller file: [disconnected /] embed-host-controller --host-config=host-secondary.xml [domain@embedded /] We need to make some modifications to this file. First I need to add the name property to the host section: Here is the method to use the CLI command to modify the host controller name: $ ./wildfly-35.0.0.Final/bin/jboss-cli.sh You are disconnected at the moment. Type 'connect' to connect to the server or 'help' for the list of supported commands. [disconnected /] embed-host-controller --host-config=host-secondary.xml [domain@embedded /] /host=unknown-host.unknown-domain:write-attribute(name=name,value=secondary) { "outcome" => "success", "result" => undefined, "server-groups" => undefined, "response-headers" => {"process-state" => "reload-required"} } [domain@embedded /] /host=unknown-host.unknown-domain:reload(admin-only=true) {"outcome" => "success"} Please note that if you use tab complete, it should autocomplete your default host name. Giving the host a name can help to analyze the server log output later. So I need to define this authentication-context in the elytron subsystem. This configuration is different from the legacy authentication. Here are the details: ... ... Here is the equivalent CLI command to do the configuration: [domain@embedded /] /host=secondary/subsystem=elytron/authentication-configuration=myConfig:add(sasl-mechanism-selector=DIGEST-MD5, authentication-name=admin, realm=ManagementRealm, credential-reference={clear-text="123"}) {"outcome" => "success"} [domain@embedded /] /host=secondary/subsystem=elytron/authentication-context=myCtx:add(match-rules=[{match-host="${jboss.domain.primary.address}", authentication-configuration=myConfig}]) {"outcome" => "success"} The above configuration shows how to configure the elytron subsystem to provide user admin and its password 123 for usage. The authentication-configuration section is added, and the authentication context myCtx is using this configuration. Please note this is only one way to provide username and password via the Elytron subsystem, and you can avoid using clear-text to provide the password. I won’t dig into more details on how to use Elytron in this blog post, but you can always refer to its document to learn its usage[]. Then I need to add modify configuration of the domain-controller: As the configuration is shown above, I defined the authentication-context to be used as myCtx. Here is the equivalent CLI command to do the configuration: /host=secondary:write-attribute(name=domain-controller.remote.authentication-context, value=myCtx) { "outcome" => "success", "result" => undefined, "server-groups" => undefined, "response-headers" => {"process-state" => "reload-required"} } After configuring the authentication part in the host-secondary.xml file on Machine B, the last thing is that I disabled the server-one and left only server-two in the configuration: Again it’s better to use the CLI command to do the configuration: /host=secondary/server-config=server-one:remove Until now all the configurations are done, and then I can start the WildFly server on Machine B with the following command: ❯ ./domain.sh --host-config=host-secondary.xml -Djboss.bind.address.management=192.168.0.113 -Djboss.bind.address=192.168.0.113 -Djboss.domain.primary.address=192.168.0.115 In the above command, I assign the value host-secondary.xml to the host-config property, and I assign values of jboss.bind.address.management and jboss.bind.address as 192.168.0.113, which is the IP address of Machine B itself. I assigned the value of jboss.domain.primary.address as 192.168.0.115, which is the IP address of Machine A. On Machine A, there is a WildFly server running as a domain controller as described above. Now we can see the server log output of the above command from Machine B: ========================================================================= JBoss Bootstrap Environment JBOSS_HOME: /wildfly-35.0.0.Final JAVA: .sdkman/candidates/java/current/bin/java JAVA_OPTS: -Xms64m -Xmx512m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true -Djdk.serialFilter="maxbytes=10485760;maxdepth=128;maxarray=100000;maxrefs=300000" --add-exports=java.desktop/sun.awt=ALL-UNNAMED --add-exports=java.naming/com.sun.jndi.ldap=ALL-UNNAMED --add-exports=java.naming/com.sun.jndi.url.ldap=ALL-UNNAMED --add-exports=java.naming/com.sun.jndi.url.ldaps=ALL-UNNAMED --add-exports=jdk.naming.dns/com.sun.jndi.dns=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.security=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.management/javax.management=ALL-UNNAMED --add-opens=java.naming/javax.naming=ALL-UNNAMED -Djava.security.manager=allow ========================================================================= 17:17:30,558 INFO [org.jboss.modules] (main) JBoss Modules version 2.1.6.Final 17:17:30,668 INFO [org.jboss.threads] (main) JBoss Threads version 2.4.0.Final 17:17:30,677 INFO [org.jboss.as.process.Host Controller.status] (main) WFLYPC0018: Starting process 'Host Controller' 17:17:30,855 INFO [org.jboss.as.process.Host Controller.system.stdout] (stdout for Host Controller) [Host Controller] 17:17:30,847 INFO [org.jboss.modules] (main) JBoss Modules version 2.1.6.Final [Host Controller] 17:17:31,008 INFO [org.jboss.msc] (main) JBoss MSC version 1.5.5.Final [Host Controller] 17:17:31,010 INFO [org.jboss.threads] (main) JBoss Threads version 2.4.0.Final [Host Controller] 17:17:31,026 INFO [org.jboss.as] (MSC service thread 1-1) WFLYSRV0049: WildFly 35.0.0.Final (WildFly Core 27.0.0.Final) starting [Host Controller] 17:17:31,158 INFO [org.wildfly.security] (Controller Boot Thread) ELY00001: WildFly Elytron version 2.6.0.Final [Host Controller] 17:17:31,270 INFO [org.jboss.as.host.controller] (Controller Boot Thread) WFLYHC0003: Creating http management service using network interface (management) port (9990) securePort (-1) [Host Controller] 17:17:31,275 INFO [org.xnio] (MSC service thread 1-7) XNIO version 3.8.16.Final [Host Controller] 17:17:31,278 INFO [org.xnio.nio] (MSC service thread 1-7) XNIO NIO Implementation Version 3.8.16.Final [Host Controller] 17:17:31,289 INFO [org.jboss.remoting] (MSC service thread 1-7) JBoss Remoting version 5.0.30.Final [Host Controller] 17:17:32,666 INFO [org.jboss.as.host.controller] (Controller Boot Thread) WFLYHC0148: Connected to the domain controller at remote+http://192.168.0.115:9990 [Host Controller] 17:17:32,692 INFO [org.jboss.as.host.controller] (Controller Boot Thread) WFLYHC0023: Starting server server-two 17:17:32,800 INFO [org.jboss.as.process.Server:server-two.status] (ProcessController-threads - 3) WFLYPC0018: Starting process 'Server:server-two' [Host Controller] 17:17:33,442 INFO [org.jboss.as.host.controller] (management task-1) WFLYHC0021: Server [Server:server-two] connected using connection [Channel ID 20a1192c (inbound) of Remoting connection 79a44d09 to 192.168.0.113/192.168.0.113:61942 of endpoint "secondary:MANAGEMENT" <6894739b>] [Host Controller] 17:17:33,452 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0062: Http management interface listening on http://192.168.0.113:9990/management and https://192.168.0.113:-1/management [Host Controller] 17:17:33,452 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0054: Admin console is not enabled [Host Controller] 17:17:33,453 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly 35.0.0.Final (WildFly Core 27.0.0.Final) (Host Controller) started in 2754ms - Started 70 of 71 services (14 services are lazy, passive or on-demand) - Host Controller configuration file in use: host-secondary.xml - Minimum feature stability level: community [Host Controller] 17:17:33,453 INFO [org.jboss.as.host.controller] (server-registration-threads - 1) WFLYHC0020: Registering server server-two From the above server log output on Machine B, we can see the WildFly server is started and server-two is started. In addition, it’s connected to the Domain Controller on Machine A. Here is the server log output from the WildFly server on Machine A: [Host Controller] 17:17:32,549 INFO [org.jboss.as.domain.controller] (Host Controller Service Threads - 23) WFLYHC0019: Registered remote secondary host "secondary", JBoss WildFly 35.0.0.Final (WildFly 27.0.0.Final) From the above Primary Host Controller log output, I can see the secondary host is connected, so it starts to accept the management of Primary Host Controller, which acts as the domain controller. Now I can open the web browser on Machine A to access the WildFly server admin console: Please note that I can’t use the IP address 127.0.0.1 here, because the WildFly server is listening to the public IP address of Machine A, which we have assigned to the jboss.bind.address.management property during the server startup process. Here is the screenshot of the admin page of the WildFly server: We need to enter admin as the username and 123 as the password, which is the user we added as the management user above. And then we can enter the admin page of the server: As we have entered the WildFly admin page, we can try to deploy an example application. There is a helloworld project in the WildFly Quickstart project: * The above project is a simple application that just contains a servlet that will respond with the text

Hello World!

to the request. So I cloned the WildFly Quickstart project into my local environment and then built the helloworld project to generate the helloworld.war: $ pwd /wildfly-quickstart/helloworld $ mvn install ... [INFO] BUILD SUCCESS ... ❯ ls target/*.war target/helloworld.war As the project is built, I can deploy the above WAR file into the WildFly server group. So I go back to the WildFly admin page, and then I can click the Deployments on the top menu and click the Upload Deployment: From the above screenshot, you can see that I tried to deploy the sample project into the other-server-group. I use this server group because I have configured servers on both Primary Host Controller and Secondary Host Controller hosts into this server group. Here is the deployment diagram for the server group: As the diagram shown above, I will use the domain controller’s admin page to deploy helloworld.war into the other-server-group, so the project will be deployed to server-two and server-three, because they both belong to other-server-group. Coming back to the WildFly admin page, I drag and drop the helloworld.war into the deployment page: Then I clicked Next and left the deployment configuration fields as default: Then I clicked Finished and reached the Deployment successful page: Now the helloworld.war is deployed to all the managed servers in the other-server-group. Now I click the Deployments on the top menu of the admin page, and then click the other-server-group, we can see that the helloworld.war is deployed into the server group: As the helloworld project is deployed, we can check the statuses of the two Host Controllers. I clicked the Runtime on top of the menu of the admin page, and then clicked the primary host tab, then I saw that server-three has not started yet: This is because the auto-start property is configured to false in the host.xml of the primary host: So I need to click the Start button of the server-three: After a while the server-three is started: Because we didn’t configure the auto-start to false on the Secondary Host Controller, so it’s already started: From the above screenshots, we can see that the URL of server-two is , and the URL of server-three is . Their ports are different because the port-offset property settings are different. For server-three, the port-offset is configured like this: Because the port-offset is set to 250 for server-three, and the default HTTP port setting is 8080, so 8080+250=8330. For server-two, the configuration is like this: As the port-offset setting is 150, the calculated HTTP port is 8080+150=8330, which is expected. Now we can use the curl command to do the requests to both the Machine A and the Machine B to see if the helloworld project is deployed on two both of the machines: ❯ curl http://192.168.0.115:8330/helloworld/HelloWorld helloworld

Hello World!

❯ curl http://192.168.0.113:8230/helloworld/HelloWorld helloworld

Hello World!

From the above command output, we can see that the helloworld project is deployed two both hosts. Though they are running on two different machines, because these two hosts are in the same other-server-group and they are managed by the domain controller, so the project is deployed to both hosts. I hope this blog post can be helpful to update your knowledge base to see how to use the domain mode in the most current WildFly release. For convenience, I have put the host.xml of the Primary Host Controller and the host-secondary.xml of the Secondary Host Controller online for reference[]. REFERENCES -------------------------------------------------------------------------------- . . . . . .]]>
+ + 阿男 + +
+ + <![CDATA[Quarkus 3.18.3 - Maintenance release]]> + https://quarkus.io/blog/quarkus-3-18-3-released/ + + 2025-02-12T00:00:00.000Z + + + Guillaume Smet + + + + <![CDATA[Keycloak 26.1.2 released]]> + https://www.keycloak.org/2025/02/keycloak-2612-released + + 2025-02-11T00:00:00.000Z + + + + + + + <![CDATA[Quarkus Newsletter #53 - February]]> + https://quarkus.io/blog/quarkus-newsletter-53/ + + 2025-02-11T00:00:00.000Z + + + James Cobb + + + + <![CDATA[Eclipse Vert.x 4.5.13 released!]]> + https://vertx.io/blog/eclipse-vert-x-4-5-13 + + 2025-02-10T00:00:00.000Z + + Julien Viet + + + + <![CDATA[Making WildFly Glow with Intelligence]]> + https://wildfly.org//news/2025/02/10/Glowing-with-AI/ + + 2025-02-10T00:00:00.000Z + org.wildfly.plugins wildfly-maven-plugin ${version.wildfly.maven.plugin} org.wildfly:wildfly-galleon-pack:${version.wildfly.server}* org.wildfly:wildfly-ai-feature-pack:${version.wildfly.ai.feature.pack} ee-core-profile-server jaxrs ollama-chat-model groq-chat-model openai-chat-model default-embedding-content-retriever ROOT.war true package But using WildFly Glow we can make that way simpler: org.wildfly.plugins wildfly-maven-plugin ${version.wildfly.maven.plugin} ${version.wildfly.server} incubating ROOT.war true package AS you can see we are using the discoverProvisioningInfo element to define which version of WildFly server we want to start from. AS you can see we have added an incubating space which enables the discovery of the WildFly AI Feature Pack. Now when we run Apache Maven we can see the following traces : As you can see, Glow discovered the use of the following LLMs: * ollama-chat-model * openai-chat-model * groq-chat-model How did Glow found those ? HOW GLOW WORKS UNDER THE HOOD FOR THE WILDFLY AI FEATURE PACK ? Here is where the magic is happening : @ServerEndpoint(value = "/chatbot", configurator = CustomConfigurator.class) public class ChatBotWebSocketEndpoint { private static final Logger logger = Logger.getLogger(ChatBotWebSocketEndpoint.class.getName()); @Inject @Named(value = "ollama") ChatLanguageModel ollama; @Inject @Named(value = "openai") ChatLanguageModel openai; @Inject @Named(value = "groq") ChatLanguageModel groq; //@Inject Instance instance; private PromptHandler promptHandler; private Bot bot; private List clients = new ArrayList<>(); private final List transports = new ArrayList<>(); private Session session; private final ExecutorService executor = Executors.newFixedThreadPool(1); private final BlockingQueue workQueue = new ArrayBlockingQueue<>(1); // It starts a Thread that notifies all sessions each second @PostConstruct public void init() { ... } ... } As you can see, we inject dev.langchain4j.model.chat.ChatLanguageModel in the org.wildfly.ai.chatbot. ChatBotWebSocketEndpoint using a @Named annotation. This is the rule that Glow uses to detect what the application is using. You can see the Glow rule . So this explain why Glow is detecting that the WildFly MCP application is using Groq,OpenAI and Ollama. Of course, similar rules exist for the embedding models and embedding store. IN CONCLUSION As you could see, developping a Generative AI application using WildFly Glow and the WildFly AI Feature Pack is, as Duke Nukem used to say, a piece of cake.]]> + + Emmanuel Hugonnet + + + + <![CDATA[WildFly 35.0.1 is released!]]> + https://wildfly.org//news/2025/02/06/WildFly3501-Released/ + + 2025-02-06T00:00:00.000Z + + + Darran Lofthouse + + + + <![CDATA[Keycloak 26.1.1 released]]> + https://www.keycloak.org/2025/02/keycloak-2611-released + + 2025-02-05T00:00:00.000Z + + + + + + + <![CDATA[This Week in JBoss - July 03, 2023]]> + https://www.jboss.org/posts/weekly-2023-07-03.html + + 2023-07-03T00:00:00.000Z + +

This Week in JBoss - July 03, 2023

+

Hello to our dear JBoss community. +We, the editorial team, have noticed a downward trend in our readership and have made the decision to no longer carry on. +There are many great blogs out there and the JBoss community of projects is producing a lot of great content for you to learn from. +However, with the steady decline in our editorial views, we no longer feel the effort we put into distilling the blogs and tutorials is having the sort of impact that we would hope. +Writing up the editorials is more work than you might expect and takes a good chunk of time that we could devote to doing our actual jobs or hacking on code.

+

It has been a great ride and we wish you all the best. +We thought about doing a sort of highlight reel to round up some of our favourite blog posts and moments doing the editorial, but realized probably no one is going to read it. +So let’s stop shouting into the void and carry on building cool stuff.

+

Thanks for everything and goodbye.

+ +
+ + Don Naro + +
+ ]]>
+ + Don Naro + do-not-reply@jboss.com + https://www.jboss.org/people/don-naro + + + +
+ + <![CDATA[This Week in JBoss - June, 1st 2023]]> + https://www.jboss.org/posts/weekly-2023-06-01.html + + 2023-06-01T00:00:00.000Z + +

This Week in JBoss - June, 1st 2023

+ +

First and foremost! Dear readers, we want our opinion about the content of the editorial. We know filling up poll can be annoying, so you made as simple as possible…​ Please answer our one question only poll on our editorial! Thanks!

+

Two of the biggest stars of the JBoss ecosystem are for sure Quarkus and, of course, Wildfly, the application server that used to be called, well, JBoss! The last weeks have seen a lot of interesting content and news around those two projects, so we are going to focus this editorial on them. Buckle up, there is a ton of passionating stuff coming your way!

+
+

Quarkus

+
+

The last two weeks have seen again quite a few interesting news, and content released, for the "Supersonic Subatomic Java" framework Quarkus! On top on the 3.1.0.Final release and the 3.0.4.Final release a new guide to migrate to those versions have been published: Migration to Quarkus 3.0 is a breeze! No reason to stay behind now, jump on board of Quarkus 3!

+

I’m also happy to mention that my guide on Automate Quarkus deployment with Ansible has been added to the website. Hope it helps Quarkus user who wants to automate their deployment!

+
+
+
+

Be The Boss of Wildfly

+
+

In the unlikely case, you have never heard of this website, Master The Boss, that has been around since forever, you have a chance to discover today. It has been publishing content on JBoss for over a decade and the articles published in the last week are pretty example of the site’s richness.

+

First one we wanted to mention is KeyCloak Social Login Step-by-Step guide. Keycloak is popular SSO software and social login is certainly worth a mention. Then come two articles more focused on Wildfly. The first one is MicroProfile LRA: A Comprehensive Guide and the second is Using Visual Studio to develop and manage WildFly.

+
+
+
+

Release roundup

+
+

As always the JBoss world is a thriving place thus the last got her fair share of releases:

+ +
+
+
+

Decaf

+
+

Enough java? Too much jitters? Wants to peek outside the coffee cup for a sec? The decaf’s section is here for you!

+

To stay on today’s theme, we wanted to mention that my guide on Automate Quarkus deployment with Ansible has been added to the project’s website. I hope it helps Quarkus user who wants to automate their deployment! And note that there is also a Ansible collection (extension) dedicated to Wildfly.

+

A last note on Ansible, that may interest people of the community. There is a very cool new project called Event Driven Ansible using, behind the curtains, another cool project of the JBoss community: Drools!

+

That’s all folks! Please join us again in two weeks for another round of our JBoss editorial!

+
+
+ +
+ + Romain Pelisse 2023-06-01 + +
+ ]]>
+ + Romain Pelisse 2023-06-01 + do-not-reply@jboss.com + https://www.jboss.org/people/romain-pelisse 2023-06-01 + + + + + + + + + +
+ + <![CDATA[This Week in JBoss - May, 15 2023]]> + https://www.jboss.org/posts/weekly-2023-05-18.html + + 2023-05-18T00:00:00.000Z + +

This Week in JBoss - May, 15 2023

+ +

Happy Friday, everyone!

+

Here is another edition of the JBoss Editorial with exciting news and updates from your JBoss communities.

+
+

Release roundup

+
+

Here are the most recent releases for this edition:

+
+
    +
  • +

    Quarkus 3.0.3.Final released - The Quarkus Team released Quarkus 3.0.3.Final, as part of the second maintenance release of our 3.0 release train. This release contains bugfixes and documentation improvements.

    +
  • +
  • +

    Kogito 1.37 released - The new Kogito release features enhancements in the flow actions, workflow definitions logging and service discovery.

    +
  • +
  • +

    Camel RELEASE 4.0.0-M3 available - The Camel community announces the availability of Camel 4.0.0-M3, the third milestone towards a new 4.0.0 major release which comes with 155 new features and improvements.

    +
  • +
+
+
+
+
+

Exactly-once semantics with Kafka transactions

+
+

Exactly-once semantics with Kafka transactions, by Federico Valeri.

+

Kafka transactions play a vital role in guaranteeing the reliability and integrity of data, making them a pivotal component of the Kafka platform. Nevertheless, these benefits are accompanied by a trade-off in terms of decreased throughput and added latency, necessitating potential adjustments. Neglecting to monitor transactions that remain unresolved can adversely affect the availability of the service. This article sheds some light on this topic.

+
+
+
+

How to use the new OpenShift quick starts to deploy JBoss EAP

+
+

How to use the new OpenShift quick starts to deploy JBoss EAP, by Philip Hayes

+

This article showcases the latest JBoss EAP quick start, specifically created to assist developers who are already familiar with conventional JBoss EAP deployments. Its purpose is to provide a comprehensive walkthrough on constructing and deploying application images on OpenShift. The quick start offers valuable guidance on utilizing Helm to generate the necessary build configs, deployment configs, and external routes for building and deploying JBoss EAP applications on OpenShift.

+
+
+
+

Integrate Excel with Drools on OpenShift with Knative and Quarkus

+
+

Integrate Excel with Drools on OpenShift with Knative and Quarkus, by Matteo Mortari

+

In this blog post, Matteo shares the results of a technical exploration of bringing together different technologies and platforms. At the end of the day, he combined things like regular spreadsheet applications (like Excel), serverless platforms (Knative on OpenShift), and our rule engine Drools to see how they could work together.

+
+
+
+

Podman Desktop Beginner’s Guide

+
+

Podman Desktop Guide, by Francesco Marchioni

+

In this tutorial, I’m introducing the Podman desktop UI which simplifies the usage and management of container images. As an example, we will learn how to pull, start, and monitor a WildFly Container image with just a few clicks!

+
+
+
+

What’s new in Red Hat’s migration toolkit for applications 6.1

+
+

What’s new in Red Hat’s migration toolkit for applications 6.1, by Yashwanth Maheshwaram

+

Red Hat Migration Toolkit is an essential tool to simplify the upgrade or migration of a large set of enterprise applications. This article gives you an update with the latest news and includes a great demo video.

+

That’s all folks! Please join us again in two weeks for another round of our JBoss editorial!

+
+
+ +
+ + Francesco Marchioni + +
+ ]]>
+ + Francesco Marchioni + do-not-reply@jboss.com + https://www.jboss.org/people/francesco-marchioni + + + + + + + +
+ + <![CDATA[This Week in JBoss - April, 20 2023]]> + https://www.jboss.org/posts/weekly-2023-04-20.html + + 2023-04-20T00:00:00.000Z + +

This Week in JBoss - April, 20 2023

+ +

Wow! "It’s another edition of the JBoss Editorial!" We are bringing exciting news and updates from your JBoss communities.

+
+

Release roundup

+
+

Here are the most recent releases for this edition:

+ +
+

How to configure WildFly with YAML files

+

How to configure WildFly with YAML files by F.Marchioni

+

WildFly 28 includes support for YAML configuration which offers a more flexible approach in some use cases. In this tutorial we will discuss which are the best scenarios where YAML configuration is a perfect fit and how to configure WildFly to use YAML files.

+
+
+

An Introduction To Server Connector for IntelliJ

+

An Introduction To Server Connector for IntelliJ by rstryker

+

Server Connector for IntelliJ, also known as IntelliJ-rsp, is a tool for acquiring, locating, installing, starting, stopping, and deloying artifacts to Application Servers like WildFly and EAP. In this article, the author gives us an introduction into IntelliJ-rsp.

+
+
+

Using The RESTEasy Tracing Feature In WildFly

+

Using The RESTEasy Tracing Feature In WildFly by Wei Nan Li

+

The RESTEasy tracing feature has been integrated into WildFly since its version 28. In this article, Wei focuses on the usage of this feature in WildFly.

+
+
+

How to Trace requests with RestEasy

+

How to Trace requests with RestEasy by F.Marchioni

+

In addition to Wei Nan Li article’s Using The RESTEasy Tracing Feature In WildFly, you can read F. Marchioni’s text regarding the how to trace requests with RestEasy.

+
+
+
+
+

Video corner

+
+

Check out some recent awesome YouTube videos from the community.

+ +

That’s all folks! Please join us again in two weeks for another round of our JBoss editorial!

+
+
+ +
+ + Pedro Silva + +
+ ]]>
+ + Pedro Silva + do-not-reply@jboss.com + https://www.jboss.org/people/pedro-silva + + + + + + + +
+ + <![CDATA[This Week in JBoss - April, 06 2023]]> + https://www.jboss.org/posts/weekly-2023-04-06.html + + 2023-04-06T00:00:00.000Z + +

This Week in JBoss - April, 06 2023

+ +

Hi, how are you? Welcome back to another edition of the JBoss Editorial with exciting news and updates from your JBoss communities.

+
+

Release roundup

+
+

Here are the most recent releases for this edition:

+ +
+
+
+

Debugging RestAssured Tests

+
+

Debugging RestAssured Tests, by Francesco Marchioni

+

Anyone running REST Assured tests has probably run into errors such as failing assertions or incorrect responses. +If that is the case for you, then this article from Francesco will no doubt be valuable as he explains some solid techniques for debugging that quickly identify root causes and save you time getting things fixed.

+
+
+
+

Extending the life of Keycloak adapters

+
+

Update on deprecation of Keycloak adapters, by Stian Thorgersen

+

Following up on the announcement to deprecate Keycloak adapters, Stian has provided an udpate on what the future holds for the adapters.

+
+
+
+

Cross resource sharing on WildFly

+
+

How to configure CORS on WildFly, by Francesco Marchioni

+

Francesco delivers another insightful tutorial that quickly gets WildFly set up for cross-domain requests.

+
+
+
+

Video corner

+
+

Check out some recent awesome YouTube videos from the community.

+ +

That’s all folks! Please join us again in two weeks for another round of our JBoss editorial!

+
+
+ +
+ + Don Naro + +
+ ]]>
+ + Don Naro + do-not-reply@jboss.com + https://www.jboss.org/people/don-naro + + + + + + +
+ + <![CDATA[This Week in JBoss - March, 23 2023]]> + https://www.jboss.org/posts/weekly-2023-03-23.html + + 2023-03-23T00:00:00.000Z + +

This Week in JBoss - March, 23 2023

+ +

Happy Friday, everyone!

+

Here is another edition of the JBoss Editorial with exciting news and updates from your JBoss communities.

+
+

Release roundup

+
+

Here are the most recent releases for this edition:

+
+
    +
  • +

    Infinispan 14.0.7 - Although it’s just a minor release update, there is an important update in it: the support for Spring 6 and Spring Boot 3 is finally available! Check the blog post for more news about this release.

    +
  • +
  • +

    Quarkus 3.0.0.Alpha6 released - This new minor release continues the path to the upcoming Quarkus version. Besides, it contains an enhancements to export OpenTelemetry data via JDBC.

    +
  • +
  • +

    Camel RELEASE 4.0.0-M2 available - The Camel community announces the availability of Camel 4.0.0-M2, the second milestone towards a new 4.0.0 major release which comes with 75 new features and improvements.

    +
  • +
+
+
+
+
+

A tutorial on Middleware Automation Collections

+
+

A tutorial on Middleware Automation Collections, by Harsha Cherukuri.

+

This article discusses the ease of getting started with Ansible Middleware Collections and installing the Red Hat Ansible Automation Platform. It describes a tutorial that demonstrates how to configure a WildFly instance using Ansible in six steps, starting with preparing a local machine with the necessary tooling and deploying an instance of WildFly using the WildFly collection provided by the Ansible Middleware.

+
+
+
+

Updates on WildFly Maven Plugin

+
+

WildFly Maven Plugin, by James R. Perkins

+

The wildfly-maven-plugin now includes a dev goal that functions similarly to the run goal, but with the added feature of monitoring source files for changes. In the event of any changes, the plugin automatically rebuilds and redeploys the WAR. This page documents the latest addition which is available in the version 4.1.0.Beta3 of the wildfly-maven-plugin.

+

Besides, you can check this step-by-step guide on how to enable live reload of WildFly applications using the dev goal.

+
+
+
+

Getting started with Camel K

+
+

Getting started with Camel-k, by Francesco Marchioni

+

Camel K is a lightweight integration framework built from Apache Camel K that runs natively in the cloud on OpenShift. If you want to get started with it in less than 5 minutes, than this is the article for you!

+
+
+
+

Video: What’s new in Strimzi 0.34.0

+
+

What’s new in Strimzi 0.34.0, by Jakub Scholz

+

Strimzi 0.34.0 has been released with multiple new features and improvements such as Stable Pod names in Connect. This video will give you an heads up about the new release in just 3 minutes!

+

That’s all folks! Please join us again in two weeks for another round of our JBoss editorial!

+
+
+ +
+ + Francesco Marchioni + +
+ ]]>
+ + Francesco Marchioni + do-not-reply@jboss.com + https://www.jboss.org/people/francesco-marchioni + + + + + + + + +
+ + <![CDATA[This Week in JBoss - 10th March 2023]]> + https://www.jboss.org/posts/weekly-2023-03-09.html + + 2023-03-09T00:00:00.000Z + +

This Week in JBoss - 10th March 2023

+ +

Welcome to another installment of our JBoss editorial! And without any further ado, let’s jump right into it.

+
+

Releases

+ +
+
+

Vert.x

+ +
+
+

Kafka

+
+

If you want to catch up with Kafka, last’s week Kafka Monthly Digest is for you! And you also want to dig further with this article on configuring Knative Broker for Apache Kafka or this comparaison between ActiveMQ and Kafka. Also worth mentioning, we just released an Ansible collection to automate Kafka deployment using Ansible.

+
+
+
+

Decaf'

+
+

Two more article before we end this installment. First, one on Overhauling memory tuning in OpenJDK containers, certainly a topic interesting to anyone deploying Java app inside containers. The second one is from yours truly, it’s about using Ansible to set up and configure your own SSO with Keycloak. I hope you’ll enjoy it! And that note…​

+

That’s all folks! Please join us again in two weeks for another round of our JBoss editorial!

+
+
+ +
+ + Romain Pelisse + +
+ ]]>
+ + Romain Pelisse + do-not-reply@jboss.com + https://www.jboss.org/people/romain-pelisse + + + + + + + +
+ + <![CDATA[This Week in JBoss - 24th February 2023]]> + https://www.jboss.org/posts/weekly-2023-02-24.html + + 2023-02-24T00:00:00.000Z + +

This Week in JBoss - 24th February 2023

+ +

Welocme back everyone! +I don’t know about where you happen to be, but where I’m living, we had the second largest snow storm in recorded weather history. +I’ve been digging out my driveway and front door for a couple of days. +Needless to say, it has been a bit cold here.

+

Also, my thoughts go out to those affected by the war between Russia and Ukraine, on this one year anniversary. +Please stay as safe as you can.

+
+

Releases

+
+
+ +
+
+
+
+

Blogs

+
+
+ +
+
+
+
+

Videos

+
+ +
+
+
+

Until next time!

+
+

Again, everyone stay safe, and I hope that your tests stay green!

+
+
+ +
+ + Jason Porter + +
+ ]]>
+ + Jason Porter + do-not-reply@jboss.com + https://www.jboss.org/people/jason-porter + + + + + + + +
+ + <![CDATA[This Week in JBoss - 26 January 2023]]> + https://www.jboss.org/posts/weekly-2023-02-08.html + + 2023-02-08T00:00:00.000Z + +

This Week in JBoss - 26 January 2023

+ +

Hi everyone!

+

It’s great to be back and bringing you the 2nd edition of the JBoss Editorial of 2023. +We have a lot of exciting news and updates from JBoss world, so enjoy.

+
+

Releases, releases, releases…​

+ +
+
+

Serverless workflow validations

+
+

Serverless workflow validations by Saravana Balaji

+

Writing a Serverless Workflow that matches with the specification’s rules and schema can require some documentation reading, which demands a few hours. In this article Saravana show how to implement a validation mechanism on Serverless Workflow Editor, that checks JSON and YAML files against Serverless Workflow specifications schema and also provides some custom validations in addition to it.

+
+
+
+

New Feature: Dashbuilder Editor With Intellisense Capabilities

+
+

New Feature: Dashbuilder Editor With Intellisense Capabilities by Ajay Jaganathan

+

In this great blog post Ajay introduces the new dashboard feature that now have auto-complete capabilities. This provides the user experience by providing suggestions and helps to reduce the errors made while authoring the dashbuilder specification.

+
+
+
+

Synchronize Your Kie Sandbox Workspace With Bitbucket Or Github

+
+

Synchronize Your Kie Sandbox Workspace With Bitbucket Or Github by Jan Stastny

+

Here is the news, KIE Sandbox now brings the possibility to synchronize your changes not only with GitHub, but also Bitbucket.

+
+
+
+

How JBoss EAP 8-Beta makes deployment on OpenShift easier

+
+

How JBoss EAP 8-Beta makes deployment on OpenShift easier by Philip Hayes

+

The new version of Red Hat JBoss EAP 8-Beta introduced changes to the provisioning and configuration of JBoss EAP application images on Red Hat OpenShift. In this great article, Philip shows the easiest way to put the EAP 8-Beta on the cloud using Openshift.

+
+
+
+

How to use a Datasource in Quarkus

+
+

How to use a Datasource in Quarkus by F.Marchioni

+

If you need to know how to use a Datasource in Quarkus using Agroal, here is a great article to learn about it. Enjoy the reading.

+
+
+
+

Keycloak tutorial for beginners

+
+

Keycloak tutorial for beginners by F.Marchioni

+

In this tutorial, Marchioni show the first steps on the Keycloak world. You will know how to start and configure the Keycloak based on Wildfly and also, the Keycloak based on Quarkus.

+
+
+
+

How to compress logs in WildFly

+
+

How to compress logs in WildFly by F.Marchioni

+

This article shows how to enable logs compression in WildFly by setting the appropriate suffix in your Periodic Rotating File Handler. In the second part of this tutorial we will learn how to compress logs using Log4j instead.

+
+
+
+

How to print logs in JSON format in WildFly

+
+

How to print logs in JSON format in WildFly by F.Marchioni

+

If you need to use JSON format on your Wildfly logs, you would like to read this another great Marchioni tutorial.

+
+
+
+

DataCater uses Quarkus to make Data Streaming more accessible

+
+

DataCater uses Quarkus to make Data Streaming more accessible by Stefan Sprenger

+

This article gives a brief overview of the data streaming platform DataCater, discusses how we moved from Scala Play! and Kafka Streams to Quarkus, and presents why we think that Quarkus is an exceptional framework for developing cloud-native Java applications.

+
+
+
+

YouTube videos

+
+

Definitely catch the replay of Quarkus Insights #116: Continuous delivery with Quarkus Helm and ArgoCD if you haven’t already watched it.

+
+
+
+

Decaf'

+
+

If you want to learn more about AI on Openshit, you need to know the AI ON Opensfhit with demos, patterns, and other Machine Learn, MLOps, and AI stuff. You also may want to more about MLOps and Open Data Hub project. Open Data Hub (ODH) is an open source project that provides open source AI tools for running large and distributed AI workloads on the OpenShift Container Platform. So, go ahead and read the new Open Data Hub documentation.

+

That’s all folks! Please join us again in two weeks for another round of our JBoss editorial!

+
+
+ +
+ + Pedro Silva + +
+ ]]>
+ + Pedro Silva + do-not-reply@jboss.com + https://www.jboss.org/people/pedro-silva + + + + + + + +
+ + <![CDATA[This Week in JBoss - 26 January 2023]]> + https://www.jboss.org/posts/weekly-2023-01-26.html + + 2023-01-26T00:00:00.000Z + +

This Week in JBoss - 26 January 2023

+ +

Hi everyone! +It’s great to be back and bringing you another edition of the JBoss Editorial. +As always there’s a lot of exciting news and updates from JBoss communities, so let’s dive in.

+ +
+

Deploying a WildFly cluster using Ansible

+
+

Deploying a WildFly 27.0.1 cluster using Ansible, by Romain Pelisse

+

Romain treats us to a brief demonstration that uses Ansible to effortlessly set up a WildFly cluster. +Romain uses a short, simple playbook that fully automates his deployment and really shows how Ansible collections can greatly simplify configuration and reduce the time it takes to create large clusters with hundreds of nodes.

+
+
+
+

Listing Maven local artifacts with JBang

+
+

How to list Maven local artifacts using JBang, by Francesco Marchioni

+

I have to say I’m a huge fan of JBang. +What’s not to love about an easy-to-use tool that makes scripting with Java a breeze? +When I noticed the title of Francesco’s post, I clicked it immediately and dug right in. +It did not disappoint and showed a neat JBang CLI script that uses picocli libraries to find the Maven versions of an artifact in your local repository.

+
+
+
+

A look at the Apache Kafka landscape

+
+

Apache Kafka Landscape, by Bilgin Ibryam

+

Bilgin’s post is a great resource for anyone exploring the Apache Kafka ecosystem and provides a lot of time-saving data around various projects, tools, and services related to Kafka.

+
+
+
+

Quickly deploying dashboards to GitHub pages

+
+

Deploying Dashbuilder Dashboards, by William Siqueira

+

William delivers a snappy article that shows you how to publish Dashbuilder dashboards and easily make them available to users in almost no time at all.

+
+
+
+

Quarkus native adopts adaptive GC policy

+
+

Quarkus Native adopts Adaptive GC policy, by Galder Zamarreño

+

Galder’s informative post takes us through an examination of the recent change to the garbage collection policy for Quarkus native applications. +The change aligns with GraalVM’s default "adaptive" GC policy to provide a better out of the box experience. +Galder shows us in spectacular detail how this change brings about more consistent and predictable runtime performance.

+
+
+
+

Event-Driven Ansible Office Hours

+
+

Event-driven Ansible Office Hours

+

Surely by now you’ve heard of Event-Driven Ansible but maybe you only have a rough idea of how the technology works? +Well, great news!

+

The team have started office hours to demo and explain how Event-Driven Ansible allows you to subscribe to an event-listening source and then quickly and easily automate tasks that respond to those events. Follow the link above to find the latest webinar and learn from the community.

+
+
+
+

YouTube videos

+
+

Definitely catch the replay of Quarkus Insights #115: What’s new in Infinispan? if you haven’t already watched it.

+

Also check out Sean Cavanaugh’s demo video, Getting started with Event-Driven Ansible and Ansible Rulebooks.

+
+
+
+

See you next time

+
+

Hope you enjoyed this edition. Please join us again in two weeks for our JBoss editorial!

+
+
+ +
+ + Don Naro + +
+ ]]>
+ + Don Naro + do-not-reply@jboss.com + https://www.jboss.org/people/don-naro + + + + + + + + + + + +
+ + <![CDATA[This Week in JBoss - December, 29th 2022]]> + https://www.jboss.org/posts/weekly-2022-12-29.html + + 2022-12-29T00:00:00.000Z + +

This Week in JBoss - December, 29th 2022

+

Happy Holidays!

+

Welcome to our last installment of JBoss Editorial for 2022! As we are about to let this year behind us, it’s time to look back and review our biggest achievement of the past twelve months, but also look ahead to 2023 and what is as in store for the JBoss community!

+

In the previous years, it was Mark Little who wrote this last editorial, often sharing his thoughts on the JBoss community accomplishments and the exciting challenges of the next year. Needless to say, I have impossible shoes to fill in for here! So, I’m not even trying to :), especially as I certainly don’t have the same overview that Mark has on our industry. Also, I will not list all of the milestones the JBoss community achieve. There were simply too many of them to do so, from Quarkus reaching its 200th release and its third major version, Wildfly implementing the latest version of the Jakarta EE specification or Keycloak named by GitHub one of the top projects in 2022. The only one I could really discuss is the success of my own personal project, integrating as much as possible the JBoss community famous projects into Ansible (Wildfly, Infinispan, Keycloak, and AMQ), both upstream (with the collection available on Ansible Galaxy) and downstream (on Ansible Automation Hub for Red Hat customers). One of those extensions is now even part, as a technical preview feature, of the latest release of Red Hat JWS! But, once more, this is only one of the numerous achievements of this year.

+

This short inventory of mine is probably as incomplete as it is biased, but it does make my case: yet again, the JBoss community has been thriving, releasing new version often, and producing quality content (blogs, videos or presentation). I, for one, can’t wait to see what will come out of it next year, and if you are too, well, I have good news. You are already in the right place ;)! The JBoss Editorial will continue and will keep you inform, as much as we can, of everything happening!

+

That’s all folks! Please join us again in two weeks for another installment of our JBoss editorial!

+ +
+ + Romain Pelisse + +
+ ]]>
+ + Romain Pelisse + do-not-reply@jboss.com + https://www.jboss.org/people/romain-pelisse + + + + + + + +
+ + <![CDATA[This Week in JBoss - December, 15th 2022]]> + https://www.jboss.org/posts/weekly-2022-12-15.html + + 2022-12-15T00:00:00.000Z + +

This Week in JBoss - December, 15th 2022

+ +

Welcome to our new installment of JBoss Editorial! It is almost Christmas, so you can read the best news regarding JBoss world before open the Christmas gift under the tree.

+
+

Releases, releases, releases…​

+
+

It was a great two week with many releases! Enjoy the new features and improvements on our products

+ +
+
+
+

Revised edition of WildFly books now available!

+
+

Revised edition of WildFly books now available! by F.Marchioni

+

Here is the news, the WildFly Administration Guide and Practical Enterprise Application development are now Jakarta EE 10 ready!

+
+
+
+

Filesystem Realm Integrity

+
+

Filesystem Realm Integrity by Ashpan Raskar

+

It is great video from Ashpan about Elytron Realms. He provides an introduction to using integrity verification in filesystem realms, a new feature added in WildFly 27.

+
+
+
+

New WildFly S2I and Runtime Multi-arch Images

+
+

On this article Denise provides details regarding the new S2I and runtime multi-arch images.

+

New WildFly S2I and Runtime Multi-arch Images by Jean-François Denise

+
+
+
+

Using JBeret With Quarkus

+
+

Using JBeret With Quarkus by Wei Nan Li

+

JBeret is a Java and Jakarta EE Batch Processing that implements the Jakarta Batch API specification, and on this article Wei Nan Li describes how to integrate the JBeret with Quarkus.

+
+
+
+

Integrate Red Hat Process Automation Manager with Springboot

+
+

Integrate Red Hat Process Automation Manager with Springboot by Archana Krishnan

+

Another great Archana article describes how to integrate the Red Hat Process Automation Manager with Springboot on Openshift 4.10.

+
+
+
+

How to run OpenTelemetry with WildFly Bootable Jar

+
+

How to run OpenTelemetry with WildFly Bootable Jar by by F.

+

OpenTelemetry is a set of APIs and libraries that provide a vendor-neutral and open standard for observability in cloud-native applications. On this another article, Marchioni will teach you how to use the OpenTelemetry API in a sample REST Service which uses WildFly Bootable jar technology as runtime.

+
+
+
+

Decaf'

+
+

We have also interesting stuff outside the Java world, like the Top Linux resources of 2022 where Heiker Medina shows the best Red Hat Enterprise Linux content of 2022. In the other hand on Top Kubernetes and OpenShift resources of 2022 Medina shows the best of Microservices, Kubernetes, Openshit and Container. Talking about Openshift, on In the Clouds (E32) | 10 Years of Red Hat OpenShift, and Cloud 2022 Roundup video, Stu and Joe talk about the 10 Years of Red Hat OpenShift (kudos to Openshift)! Finally, the Git Cheat Sheet new version was relealed with more tips to use Git.

+

That’s all folks! Please join us again in two weeks for another round of our JBoss editorial!

+
+
+ +
+ + Pedro Silva + +
+ ]]>
+ + Pedro Silva + do-not-reply@jboss.com + https://www.jboss.org/people/pedro-silva + + + + + + + + +
+ + <![CDATA[This Week in JBoss - December, 1st 2022]]> + https://www.jboss.org/posts/weekly-2022-12-01.html + + 2022-12-01T00:00:00.000Z + +

This Week in JBoss - December, 1st 2022

+ +

Happy December!

+

Welcome to our new installment of JBoss Editorial! As the end of the year is near, we are packing as much goodness in this issue as possible, for you to have some passionating reading material to enjoy next to your Christmas tree.

+
+

Quarkus, still going strong

+
+

On top of the recent releases, of the past few weeks, the Quarkus community took the time to publish an article to present the Quarkus for AWS Lambda Snapstart. If you have any interest in Quarkus or cloud development, this is certainly a must read!

+

Last, but not the least, two more, deep articles about Quarkus : one on Reactive CRUD performance case study and the other on Redis Job Queue - Reloaded (a followup on Clément’s previous article on How to implement a job queue with Redis.

+
+
+
+

A good time to learn new (or old) things

+
+

The last two weeks have seen the release of some introductions and presentations articles that are worth mentioning. The first one, my favorite because it talks about an unsung hero of the Wildfly ecosystem, is about : Introducing The Java Batch Processing API And JBeret Implementation. If you have no idea what this is about, please go check it out, this is bound to make your life easier!

+

After this is definitely this humble article entitled A Maven starter for Jakarta EE projects. Indeed, Maven has been at the heart of Java (and thus JBoss) technology for a long while now (around two decades), so such an introduction, for newcomers and experienced developers alike, is certainly nice to see.

+
+
+
+

Techbytes

+
+

If you need something more involved than a quickstarter, there are two articles coming from the Kogito and Drools ecosystem: Kogito serverless workflow event formats and Drools reactive messaging processing.

+
+
+
+

Ansible support for JBoss runtimes

+
+

It’s not strictly speaking JBoss community, but I’m too proud of this baby of mine to keep quiet about it. Since over a year, I’ve been part of an initiative to provide better integration between the automation tool Ansible and many of the middleware solutions being developed by the JBoss Community. We are quite to already have Ansible collections (extension for Ansible) that ease the setup of Wildfly, Infinispan, Keycloak, and AMQ Broker.

+

We also provide, for the community, a collection for Red Hat JBoss Web Server (JWS) and we are very proud and happy to announce that this collection is now also offered, as tech preview, as part of the last release of Red Hat JWS 5.7: Red Hat Ansible Certified Content Collection 1.2 for Red Hat JBoss Web Server.

+

If you are curious about the potential of those collections and how Ansible can help when you deploy JBoss runtimes, please check this (awesome) demo on Ansible Fest Session Catalog: Managing your Red Hat Middleware estate from the edge to the cloud with Ansible.

+
+
+
+

Releases, releases, releases…​

+
+

Releasing is crucial for Open Source project and releasing often is certainly the mark of healthy one, so it comes with no surprises that the last two weeks have already seen their fair share of releases:

+ +

That’s all folks! Please join us again in two weeks for another installment of our JBoss editorial!

+
+
+ +
+ + Romain Pelisse + +
+ ]]>
+ + Romain Pelisse + do-not-reply@jboss.com + https://www.jboss.org/people/romain-pelisse + + + + + + + + +
+ + <![CDATA[This Week in JBoss - November, 18 2022]]> + https://www.jboss.org/posts/weekly-2022-11-18.html + + 2022-11-18T00:00:00.000Z + +

This Week in JBoss - November, 18 2022

+ +

Happy Friday, everyone!

+

Here is another edition of the JBoss Editorial with exciting news and updates from your JBoss communities. In this release under the spotlight you will see several articles about the new WildFly 27 release.

+
+

Release roundup

+
+

Here are the most recent releases for this edition:

+
+
    +
  • +

    Quarkus 2.14.1.Final - Quarkus 2.14.1.Final maintenance release is now available with some bugfixes and documentation improvements on top of our 2.14.0.Final release.

    +
  • +
  • +

    Camel Quarkus 2.14.0 Released - This new release aligns with Camel 3.19.0 and Quarkus 2.14.0.Final. It brings new extensions CloudEvents, Knative and DSL modeline. Many thanks to all contributors and issue reporters!

    +
  • +
  • +

    WildFly Bootable JAR 8.1 Released - The 8.1.0.Final version of the WildFly Bootable JAR Maven plugin has been released with many additions to simplify the development of Jakarta EE 10

    +
  • +
  • +

    Debezium 2.1.0.Alpha1 - Although still an Alpha release, we recommend Debezium users to check this early preview release which includes quite a number of bug fixes but also some noteworthy improvements

    +
  • +
+
+
+
+
+

Updates on WildFly Docker Images

+
+

Updates on WildFly Docker Images, by Jeff Mesnil.

+

This article from Jeff shows how the new WildFly Docker images enable highly requested features such as ARM architecture, multiple JDK versions, on top of base images that are frequently updated to fix OS and JDK vulnerabilities

+
+
+
+

Distributed Jakarta Timers in WildFly

+
+

Distributed Jakarta Timers in WildFly, by Paul Ferraro

+

One more article about the distributed TimerService implementation that improves the scalability and efficiency of Jakarta EJB timers in a cluster by leveraging Infinispan for both timer availability/persistence and distribution of timer scheduling.

+
+
+
+

Enabling Integrity on Filesystem realms

+
+

Enabling Integrity on Filesystem realms, by Ashpan Raskar

+

Another great article from Ashpan about Elytron Realms. In this one, he discusses how you can add integrity checking to your FileSystem Realm by using a public-private key pair.

+
+
+
+

Getting started with gRPC article series

+
+

Getting started with gRPC article, by Francesco Marchioni

+

I have recently added a two-article series about the gRPC framework which allows connecting services across data centers using high-performance Remote Procedure Calls (RPC). In this article, you will learn the building blocks of this framework and how to code a Java application using gRPC. In the follow up article, gRPC made easy with Quarkus you can learn how Quarkus simplifies the creation and test of gRPC applications using quarkus-grpc extension.

+

That’s all folks! Please join us again in two weeks for another round of our JBoss editorial!

+
+
+ +
+ + Francesco Marchioni + +
+ ]]>
+ + Francesco Marchioni + do-not-reply@jboss.com + https://www.jboss.org/people/francesco-marchioni + + + + + + + + +
+ + <![CDATA[This Week in JBoss - November, 4 2022]]> + https://www.jboss.org/posts/weekly-2022-11-04.html + + 2022-11-04T00:00:00.000Z + +

This Week in JBoss - November, 4 2022

+ +

Happy Friday, everyone!

+

Here is another edition of the JBoss Editorial with exciting news and updates from your JBoss communities.

+
+

Release roundup

+
+

Here are the most recent releases for this edition:

+
+
    +
  • +

    Quarkus 2.13.3 - There is a new maintenance release with a new round of bug fixes and documentation improvements. This is a recommended upgrade since it fixes the CVE-2022-42003 Denial of Service (DoS) vulnerability in Jackson. (Check here the full change log

    +
  • +
  • +

    Camel 3.18.0 - Apache Camel 3.18.3 it’s available. This is a new LTS release with 52 new features, improvements and fixes. This release supports Java 11 and 17 and upgrades its BOMs to Spring boot 2.7.5. The artifacts are published and ready for you to download from the Central Maven repository. For more details please take a look at the release notes

    +
  • +
  • +

    Debezium 1.9.7.Final Released - The Debezium is glad to announce the release of Debezium 1.9.7.Final. This release focuses on bug fixes and stability; and is the recommended update for all users from earlier versions. There are no breaking changes in this release. To learn more, check the release notes

    +
  • +
+
+
+
+
+

Drools 8 Final - to Infinity and Beyond!

+
+

Drools 8 Final – toward a modular and cloud native rule engine, by Mario Fusco.

+

The Drools team is happy to announce that our rule engine reached the new major release 8. In this article, Mario discusses how the engine has been heavily reworked to make it more modular, isolating the non-core features in separated modules that users can optionally bring into their projects only when specifically required.

+
+
+
+

Configuring Distributed Timers in WildFly

+
+

How to configure distributed EJB Timers, by Francesco Marchioni

+

Find out how you can configure Distributed EJB Timers within an Infinispan cache. This feature aims to make your cluster scale horizontally for applications using extensively EJB Timers. Available since WildFly 27.

+
+
+
+

How Ansible automates JBoss Web Server updates and upgrades

+
+

How Ansible automates JBoss Web Server updates and upgrades, by +Romain Pelisse

+

It’s time to automate the deployment of JBoss Web Server in your IT! This article from Romain shows how to use Ansible and the JWS collection to fully automate the deployment, patch and upgrades of your JWS installations.

+
+
+
+

Camel Textual Route debugging in Sublime

+
+

Camel Textual Route debugging in Sublime, by Navyashree

+

Debugging camel Routes can also be done within Sublime text editor. Just a few days after showing how to add debug support in Emacs, Navyashree teaches us how to attach Camel application to Sublime text editor for debugging.

+
+
+
+

How Kamelets simplify Camel integrations on Kubernetes

+
+

How Kamelets simplify Camel integrations on Kubernetes, by +Mohammadi Iram

+

Camel K is a lightweight integration framework based on Apache Camel that runs natively on Kubernetes to create serverless and microservice architectures. Learn about the advantages and types of Kamelets configuration files which simplify connections to external systems.

+

That’s all folks! Please join us again in two weeks for another round of our JBoss editorial!

+
+
+ +
+ + Francesco Marchioni + +
+ ]]>
+ + Francesco Marchioni + do-not-reply@jboss.com + https://www.jboss.org/people/francesco-marchioni + + + + + + + + + + + +
+ + <![CDATA[This Week in JBoss - 20 October 2022]]> + https://www.jboss.org/posts/weekly-2022-10-20.html + + 2022-10-20T00:00:00.000Z + +

This Week in JBoss - 20 October 2022

+ +

Welcome back everyone! +We’re here with another JBoss Editorial, highlighting some of the great work done in the community and within Red Hat as it relates to middleware. +Like always, we have some news from the blogosphere and releases. +No new videos out this week. +Let’s get started!

+
+

Releases

+
+
+
    +
  • +

    Kogito 1.29.0.Final - Mostly a bug fix release, but there are some breaking changes, please review before upgrading

    +
  • +
  • +

    Drools 8 - A brand new major release for Drools! This is great news for everyone. New features abound, and migrations as well. Be sure to check it out and read about everything that is new.

    +
  • +
  • +

    Quarkus 2.13.2.Final - Bug fixes and documentation improvements abound in this release. If you’re on 2.13, be sure to upgrade!

    +
  • +
  • +

    RESTEasy 6.2.1.Final - Some bug fixes, mostly component upgrades

    +
  • +
  • +

    Byteman 4.0.20 - This release works all the way up to JDK 20, and also includes a couple of bug fixes!

    +
  • +
+
+
+
+
+

Blogs

+
+
+
    +
  • +

    How to run Artemis Messaging in a Bootable Jar - If you’re running a Wildfly application as a bootable jar, you’ll want to take note of this. Running your application as a bootable jar is a great way to get started moving towards containers, or even building a container around the bootable jar.

    +
  • +
  • +

    Quarkus Newsletter 25 - If you’re looking to catch up with what is happening in Quarkus, look no further. James Cobb gives us a great rundown of things happening in the Quarkus community.

    +
  • +
  • +

    Hacktoberfest - There’s still time to get involved in Hacktoberfest! Be sure to check it out and join others in building better Open Source Software.

    +
  • +
+
+

Thanks everyone for visiting, we hope to see you back next time!

+
+
+ +
+ + Jason Porter + +
+ ]]>
+ + Jason Porter + do-not-reply@jboss.com + https://www.jboss.org/people/jason-porter + + + + + + + +
+ + <![CDATA[This Week in JBoss - 07 October 2022]]> + https://www.jboss.org/posts/weekly-2022-10-07.html + + 2022-10-07T00:00:00.000Z + +

This Week in JBoss - 07 October 2022

+ +

Hi everyone! +It’s great to be back and bringing you another edition of the JBoss Editorial. +As always there’s a lot of exciting news and updates from JBoss communities, so let’s dive in.

+ +
+

The Flying Saucer release is here

+
+

Infinispan 14 Final release announcement, by Tristan Tarrant

+

UFOs, beer, a RESP endpoint, FIPs support for remote caches, a wizard that makes creating complex cache configuration a breeze, what’s not to love? +From Tristan’s release announcement it certainly sounds like there are a lot of great new features and capabilities to help establish the Infinispan project as the default choice for open-source, in-memory caching. +Congrats again to the Infinispan team on all the amazing work!

+
+
+
+

Jakarta MVC in a nutshell

+
+

Jakarta MVC made simple, by Francesco Marchioni

+

Francesco provides a crisp introduction to the Model-View-Controller (MVC) framework for building HTTP applications and delves into where the MVC API sits within the Jakarta ecosystem. +In his post, Francesco provides code samples for an MVC app that show how to perform standard operations.

+

It’s a solid resource for anyone interested in the MVC pattern. +Francesco even provides his ee-mvc-demo source to play around with.

+
+
+
+

Rounding up Jakarta Persistence 3.1

+
+

Jakarta Persistence 3.1 new features, by Francesco Marchioni

+

In another blog post, Francesco takes us on a tour of Jakarta Persistence 3.1. +Using the Jakarta EE 10 runtime and the WildFly 27 Preview release, Francesco shows us how to use java.util.UUID to automatically generate a Primary Key and other cool JPQL functions. +Francesco shows us how to extract the numeric parts from a given date and do some other interesting Math, Date, and Time functions.

+

Once again, Francesco provides his source for us to try out. +You can find it in the uuid-demo repository.

+
+
+
+

Troubleshooting Drools memory issues

+
+

Drools trouble-shooting: Memory issues, by Toshiya Kobayashi

+

Toshiya runs down memory issues frequently encountered in Drools troubleshooting. +Dividing them into three categories - long-term memory leaks, OOM errors when building rules, and OOM errors executing KieSession - Toshiya expertly explains how to solve each memory issue.

+
+
+
+

Comparing Choices in DMN Modeling

+
+

Comparing Choices in DMN Modeling, by Eder Ignatowicz

+

Eder highlights a recent comparative analysis, by Keith Swenson, of TrisoTech DMN Modeler, Camunda, Red Hat Drools Workbench, and KIE Sandbox. +I think it’s worth reading Eder’s post for yourself. +Should you need convincing, I offer this snippet from Keith’s feedback on KIE tools:

+

"…​ if you want practical experience with DMN models and running the models, go right to KIE Sandbox. It works."

+
+
+
+

YouTube videos

+
+

Be sure to check out Quarkus Insights #103: Debezium and Quarkus, A Match Made in Heaven? if you haven’t already.

+

And don’t forget to tune in on October 17 for Quarkus Insights #105: Discover the new Quarkus Redis API

+
+
+
+

See you next time

+
+

Hope you enjoyed this edition. Please join us again in two weeks for our JBoss editorial!

+
+
+ +
+ + Don Naro + +
+ ]]>
+ + Don Naro + do-not-reply@jboss.com + https://www.jboss.org/people/don-naro + + + + + + + + + + + + +
+ + <![CDATA[This Week in JBoss - 22 September 2022]]> + https://www.jboss.org/posts/weekly-2022-09-22.html + + 2022-09-22T00:00:00.000Z + +

This Week in JBoss - 22 September 2022

+ +

Hi everyone and welcome to the latest installment of JBoss editorial! Today’s stars of the show: Quarkus and KIE (Kogito/Drools)

+
+

Quarkus

+
+

Quarkus is quite busy this month! Just yesterday, the project released Quarkus 2.12.3.Final, the third round of bugfixes and performance enhance of for the 2.12, which we mentioned in our previous editorial. But that’s not all, Quarkus tooling also got some love with the release of Quarkus Tools for IntelliJ 1.13.0 released!.

+

Beyond the publication of new software and bugfixes, James Cobb also took the time to publish the 24th installment of the Quarkus Newsletter, a must-read for anyone who wants to follow or play with Quarkus! And to this point, an interesting new player has joined the project’s community: Quarkus adoption by APHP (Assistance Publique des Hôpitaux de Paris)!

+

Of course, if you are already familiar with Quarkus, you may want something more technical to quench your thirst and Clément Escoffier has just the article for you: How to implement a job queue with Redis.

+
+
+
+

KIE

+
+

KIE community has been quite active too in the last days and produced quite an amount of interesting articles about their technology. First, we’ll suggest you’ll dive into this one about Creating your first cloud-agnostic serverless application with Java. It’s a good place to start!

+

Another one, called New visualizer for the Serverless Workflow Editor provides a nice overview of this new tool and we’ll certainly learn more about it and use it. If you are more interested into technical details and implementation, you are in luck, there is a rather detailed overview of the Efesto refactoring.

+

Wait, that’s not all! Check out this article, and the video it links to: Transparent ML, integrating Drools with AIX360!

+
+
+
+

Techbytes

+
+

If KIE and Quarkus have been the most prolific of the last two weeks, there is still a few more articles, coming from other projects, that you may want to check out: +* How to spot Java bugs with SpotBugs +* Getting started with Jakarta RESTful Services +* Creating cache with wizard - Infinispan 14 +* Remote dev-watch development with WildFly Jar Maven Plugin +* Multiple repositories Pull Request chaos, crawl them all in one single place

+
+
+
+

Releases, releases, releases…​

+
+

As always, the JBoss community has been quite active and a few projects published new version in the last two weeks:

+ +
+
+
+

Decaf'

+
+

Feeling too jittery? Enough Java for now? Get refreshed with these two next articles about regular expressions:

+ +

That’s all for today! Please join us again next time for another round of our JBoss editorial!

+
+
+ +
+ + Romain Pelisse + +
+ ]]>
+ + Romain Pelisse + do-not-reply@jboss.com + https://www.jboss.org/people/romain-pelisse + + + + + + +
+ + <![CDATA[This Week in JBoss - 08 September 2022]]> + https://www.jboss.org/posts/weekly-2022-09-08.html + + 2022-09-08T00:00:00.000Z + +

This Week in JBoss - 08 September 2022

+ +

Welcome back, glad to have you back with us this week! +Progress continues to happen at JBoss, and Red Hat. +We have some releases, blogs, and a couple of videos as well.

+
+

Releases

+
+
+ +
+
+
+
+

Blogs

+
+
+ +
+
+
+ +
+

Until next time!

+
+

Everyone stay safe out there, and we look forward to seeing you in two weeks for our next edition!

+
+
+ +
+ + Jason Porter + +
+ ]]>
+ + Jason Porter + do-not-reply@jboss.com + https://www.jboss.org/people/jason-porter + + + + + + + +
+ + <![CDATA[This Week in JBoss - 25 August 2022]]> + https://www.jboss.org/posts/weekly-2022-08-25.html + + 2022-08-25T00:00:00.000Z + +

This Week in JBoss - 25 August 2022

+ +

Hi everyone! +It’s great to be back and bringing you another edition of the JBoss Editorial. +As always there’s a lot of exciting news and updates from JBoss communities so let’s dive in.

+ +
+

Hola, 你好, こんにちは Quarkus

+
+

Hola, 你好, こんにちは Quarkus, by Max Rydahl Andersen

+

Since the launch of Japanese ja.quarkus.io, we got contributors translating the website into (simplified) Chinese at cn.quarkus.io and recently we added Spanish at es.quarkus.io too. These sites are now accessible via the drop-down "globe" menu in the top-right corner.

+
+
+
+

Using RHOSAK from WildFly

+
+

Using RHOSAK from WildFly, by Kabir Khan

+

In this post Kabir shows how to write a simple application which sends and receives messages to/from a Kafka instance using RHOSAK. RHOSAK - Red Hat OpenShift Streams for Apache Kafka, is a cloud service hosted by Red Hat which makes setting up, managing, and scaling Apache Kafka instances very easy

+
+
+
+

Getting started with AtlasMap

+
+

Getting started with AtlasMap, by Francesco Marchioni

+

In this article, Francesco shows the basics of the AtlasMap data mapping solution. He also covers the basic set up of the Web UI and how to use it to create a minimal mapping file. Finally, he discusses two simple ways to use AtlasMap in your Java projects.

+
+
+
+

Optimize loops with long variables in Java

+
+

Optimize loops with long variables in Java, by Roland Westrelin

+

The just-in-time (JIT) compiler in OpenJDK improves Java performance through a number of optimizations, particularly in loops. Until recently, many optimizations worked only when the loop index was an int variable. In this article, Roland shows how the HotSpot virtual machine was upgraded to add the same optimizations for long variables.

+
+
+
+

A DMN FEEL HANDBOOK

+
+

A DMN FEEL handbook, by Matteo Mortari

+

In this announcement, Matteo introduces an (experimental) DMN FEEL handbook, a helpful companion for your DMN modeling activities! You can access the FEEL handbook at DMN FEEL handbook

+
+
+
+

YouTube videos

+
+

From unmissable demos to brilliant chat about the latest Java trends, the JBoss community has some great video content for you:

+ +
+
+
+

See you next time

+
+

Hope you enjoyed this edition. Please join us again in two weeks for our JBoss editorial!

+
+
+ +
+ + Pedro Silva + +
+ ]]>
+ + Pedro Silva + do-not-reply@jboss.com + https://www.jboss.org/people/pedro-silva + + + + + + + + + + + + +
+ + <![CDATA[This Week in JBoss - 11 August 2022]]> + https://www.jboss.org/posts/weekly-2022-08-11.html + + 2022-08-11T00:00:00.000Z + +

This Week in JBoss - 11 August 2022

+ +

Hi everyone! +It’s great to be back and bringing you another edition of the JBoss Editorial. +As always there’s a lot of exciting news and updates from JBoss communities so let’s dive in.

+
+

Release roundup

+
+ +
+
+
+

WildFly Maven plugin to create container images

+
+

Use the wildfly-maven-plugin to create a Docker image of your application, by By Jeff Mesnil

+

Jeff explains how to use the wildlfy-maven-plugin and the new WildFly runtime image to build container images. +The WildFly Maven plugin, currently in beta with Final planned for WildFly 27, offers a new, and very compelling, architecture to control the full runtime from the application pom.xml. +Developers control the full customization of WildFly using feature packs, packaging scripts, and other artifacts. +This approach ensures that the runtime fits the user’s application. +Creating a container image is simply a matter of putting it in a runtime image that contains OpenJDK.

+

The WildFly team are starting an open conversation to bring additional synergies between the Docker and S2I images for WildFly that could benefit the whole community. +The team are aiming to bring new capabilities, additional architectures (in particular linux/arm64), and newer versions of the JDK to all WildFly images. +Be sure to check out Jeff’s post and find out how you can get involved!

+
+
+
+

Jakarta Bean Validation

+
+

Getting started with Jakarta Bean Validation, by Francesco Marchioni

+

Francesco takes a look at the Jakarta Bean Validation specification which allows you to express constraints on your model and create custom ones in an extensible way. +His detailed post shows you how to write a constraint once and use it in any application layer. +Given that Bean validation is layer agnostic, meaning that you can use the same constraint from the presentation to the business model layer.

+
+
+
+

Kogito Rules (Drools) with Java Inheritance

+
+

Kogito Rules (Drools) with Java Inheritance, by Jeff Taylor

+

In this article, Jeff explains how Kogito rules services can reason over application domain model facts that are represented using plain old Java objects, or POJOs, that use standard Java inheritance. +DRL rules files can use POJOs as well as client applications that call the Kogito rules services.

+

Jeff explores two approaches for sharing Java subclasses between a Kogito rules service and a client application. +The first approach isolates objects from each subclass into a JSON array while the second approach uses Jackson inheritance annotations to embed objects from each subclass for REST API calls that serialize and deserialize POJOs to and from JSOn.

+
+
+
+

Welcome Václav Muzikář!

+
+

New Keycloak maintainer: Václav Muzikář, by Bruno Oliveira

+

The Keycloak team has a new community maintainer! +Hearty welcome to Václav Muzikář.

+
+
+
+

YouTube videos

+
+

From unmissable demos to brilliant chat about the latest Java trends, the JBoss community has some great video content for you:

+ +
+
+
+

See you next time

+
+

Hope you enjoyed this edition. Please join us again in two weeks for our JBoss editorial!

+
+
+ +
+ + Don Naro + +
+ ]]>
+ + Don Naro + do-not-reply@jboss.com + https://www.jboss.org/people/don-naro + + + + + + + + + + + + +
+ + <![CDATA[This Week in JBoss - July 28th 2022]]> + https://www.jboss.org/posts/weekly-2022-07-28.html + + 2022-07-28T00:00:00.000Z + +

This Week in JBoss - July 28th 2022

+ +

Hello, everyone. Welcome to the latest edition of This Week in JBoss. We are in the middle of summer, but our favorite projects keep coming up with cool new releases, dev tips, and demos. Take a look at the JBoss community content highlights from the past 2 weeks.

+
+

Releases, releases, releases!

+ +
+
+

Articles & Blogs

+
+
+

Secure Kubernetes certificates with cert-manager and Dekorate

+

Secure Kubernetes certificates with cert-manager and Dekorate by Jose Carvajal Hilario, Anna-Maria Mihalceanu, and Charles Moulliard.

+

Managing SSL certificates for your cloud native apps can sometimes get a little tricky. Cert-manager, a popular tool for cloud-native certificate management helps makes this task a lot easier. But before they can start using it, developers need to deal with creating custom resources that cert-manager requires. Enter Dekorate, the tool that significantly decreases the complexity of managing custom resource for Kubernetes and OpenShift. This walkthrough demonstrates how Dekorate automatically creates cert-manager custom resources from annotations in your code. You can then install these resources in a project on your cluster and use them to secure the REST endpoints of your application with TLS. The article provides rich code examples for every step, and also an example application project based on Spring Boot that you can use to follow along with the walkthrough.

+
+
+

New HTTP clients, a Java generator, and more in Fabric8 6.0.0

+

New HTTP clients, a Java generator, and more in Fabric8 6.0.0 by Andrea Peruffo and Steven Hawkins

+

The Fabric8 Kubernetes client has been making cloud-native development with Java easier for years. After more than five months of intensive work, the release of Fabric8 6.0.0 brings a host of innovative features and capabilities to the core components and utilities in the Fabric8 suite. Steven Hawkins and Andrea Peruffo show off some the coolest features and important bugfixes that the new release has to offer. Check out their article to see the highlights

+
+
+

How to use Java Mission Control to monitor Java apps

+

How to use Java Mission Control to monitor Java apps by Francesco Marchioni

+

Those of you with an interest in monitoring the performance of your Java apps will find Francesco’s post especially informative. The article focuses on Java Flight Recorder (JFR), a JVM monitoring tool that also powers the recently released Cryostat project. In addition to offering insights into the JFR user experience compared to competing tools like JConosle and VisualVM (which he covered in earlier articles), Francesco also provides a quickstart guide for spinning up JFR with Java Mission Control to monitor a Wildfly server.

+
+
+

SaaS security in Kubernetes environments: A layered approach

+

SaaS security in Kubernetes environments: A layered approach by Alex Kubacki

+

In his most recent article, Alex Kubacki analyzes recommended practices for securing software-as-a-service applications. Opening with the argument that if you want to truly secure your applications, you must secure every layer of your application stack (all the way from the hardware to the container network interface), Alex moves on to break down the security concerns specific to each layer. He gives particular attention to the cluster and networking layers, where he highlights the benefits of recently released projects, including Advanced Cluster Security for Kubernetes and the more recent networking security innovations in OpenShift.

+
+
+
+
+

Videos

+
+

Since we are in middle of vacation season, there isn’t as much new content coming out as the rest of the year. Still, there is definitely enough to choose from. +Please enjoy this week’s video picks:

+ +

That’s all for today! Please stay tuned for the next editorial, stay safe, and enjoy the rest of the vacation season!

+
+
+ +
+ + Stefan Sitani + +
+ ]]>
+ + Stefan Sitani + do-not-reply@jboss.com + https://www.jboss.org/people/stefan-sitani + + + + + + + + + + + + + + +
+ + <![CDATA[This Week in JBoss - 15 July 2022]]> + https://www.jboss.org/posts/weekly-2022-07-14.html + + 2022-07-14T00:00:00.000Z + +

This Week in JBoss - 15 July 2022

+ +

Happy Friday, everyone!

+

Here is another edition of the JBoss Editorial with exciting news and updates from your JBoss communities.

+
+

Release roundup

+
+

Here are the most recent releases for this edition:

+
+
    +
  • +

    Quarkus 2.10.2 - There is a new maintenance release with a new round of bugfixes and documentation improvements. Besides, there is a bump version for some packages (JReleaser/Keycloak). This should be a safe upgrade upgrade for anyone already using 2.10. Check here the full change log

    +
  • +
  • +

    Kogito 1.24.0 - We are glad to announce that the Kogito 1.24.0 release is now available!.

    +
  • +
  • +

    Camel 3.18.0 - Apache Camel 3.18.0 it’s available. A new LTS release with 117 new features, improvements and fixes. Supports Java 11 and 17. New releases available also for the other Apache Camel Streams (Camel/K, Kamelets, Camel Kafka Connector, Camel Quarkus )

    +
  • +
  • +

    WildFly 27 Alpha 2 - A new Alpha release of WildFly 27 (Alpha 2) is available if you want a preview of Jakarta EE 10 features which will be fully available with WildFly 27

    +
  • +
+
+
+
+
+

Deploy JBoss EAP on Microsoft Azure Red Hat OpenShift

+
+

Deploy JBoss EAP on Microsoft Azure Red Hat OpenShift, by Philip Hayes

+

There’s a strong demand for cloud-based JBoss EAP options from our customers. This article outlines the benefits of deploying Red Hat JBoss Enterprise Application Platform (EAP) on Red Hat OpenShift and Microsoft Azure.

+
+
+
+

The Road to JBoss EAP 8

+
+

The Road to JBoss EAP 8, by James Falkner

+

Find out how Jakarta EE specifications have evolved since Red Hat JBoss Enterprise Application Platform 7 and what to look forward to in JBoss EAP 8.

+
+
+
+

A first sip of Jakarta Faces 4.0 on WildFly 27

+
+

Getting started with Jakarta Faces 4.0, by Francesco Marchioni

+

Jakarta EE 10 is almost there! Today we will have a look at what is new in Jakarta Faces 4.0 which is available in the Alpha2 version of WildFly 27.

+
+
+
+

Camel K Operations: Monitoring

+
+

How to monitor a Camel K Integration, by Pasquale Congiusti

+

How to monitor a Camel K Integration?. Fortunately, Camel-K has all it takes to let you manage this operation as smooth as possible. This article walks through it.

+
+
+
+

Youtube video: Elytron Filesystem Realm Encryption

+
+

Elytron Filesystem Realm Encryption, by Ashpan Raskar

+

Finally, from WildFly’s youtube channel check this video by Jeff Meslin to learn how to encrypt an Elytron Filesystem Realm and how to convert old filesystem realms to newly encrypted filesystem realms.

+

That’s all folks! Please join us again in two weeks for another round of our JBoss editorial!

+
+
+ +
+ + Francesco Marchioni + +
+ ]]>
+ + Francesco Marchioni + do-not-reply@jboss.com + https://www.jboss.org/people/francesco-marchioni + + + + + + + + + +
+ + <![CDATA[This Week in JBoss - June 30th 2022]]> + https://www.jboss.org/posts/weekly-2022-06-30.html + + 2022-06-30T00:00:00.000Z + +

This Week in JBoss - June 30th 2022

+ +

Hello and welcome to JBoss Editorial June 30th edition! We are nearing the end of the second week of summer, and most of us are already looking forward to our vacation plans. +And while for some the next 2 months will be a time to relax, slow down, and take things a little easy, progress and innovation never really stop! +So for those of you interested in the latest and the greatest that your favorite project have to offer, here are this week’s highlights from around the JBoss community.

+
+

Releases, releases, releases!

+
+

Here are the releases from the JBoss Community for this edition:

+ +
+
+
+

Articles & Blogs

+
+
+

How to convert a web application to Software-as-a-Service

+

How to convert a web application to Software-as-a-Service by Bob Reselman

+

Bob Reselman delves into the "brownfield" approach to redeveloping your web application into a SaaS platform. +Starting off with a well-laid out example business scenario, Bob walks you through the key steps of the process from analyzing your business logic patterns, separating configuration from code, picking an appropriate service architecture, to leveraging the benefits offered by containerization and Kubernetes to ensure that you’ll always be able to scale your services to match the growth of your business.

+
+
+

Multi-cloud storage strategies for SaaS applications

+

Multi-cloud storage strategies for SaaS applications by Michael Hrivnak

+

In the fourth entry to the ongoing SaaS architecture checklist blog series Michael Hrivnak compares software-defined storage (SDS) technologies that help developers create optimized data storage solutions for use in multi-tenant cloud environments. +The first part of Michael’s article deals with the broader technical consideration of how SDS can help developers minimize platform-specific development work, followed by an overview of Red Hat’s current cloud storage technology offerings. In the latter section, Michael provides some insight into combining these offerings to create solutions that provide customers with self-scaling, self-managed, low-latency data storage capabilities.

+
+
+

Cross-site scripting: Explanation and prevention with Go

+

Cross-site scripting: Explanation and prevention with Go by Sandipan Roy

+

Cross-site scripting (XSS) attacks have recently become a topic of interest among application security experts in the cloud native developer community. In his tutorial, Sandipan breaks down the mechanism of executing an XSS attack using malicious JavaScript elements and follows up by outlining 3 strategies for coding in Go that you can use to protect your applications against different types of XSS attacks (Sandipan mentions Stored, Reflected and DOM-based XSS attacks). +The tutorial is richly supplemented by code examples and plenty of additional information context. +Even though this article is a little outside our usual focus area, it is definitely worth a read, especially for those of you interested in buffing up your application security knowledge.

+
+
+

How to build GraphQL applications with Quarkus

+

How to build GraphQL applications with Quarkus by Francesco Marchioni

+

In a follow-up to his earlier article about GraphQL on WildFly, Francesco is back with another tutorial, this time about GraphQL and Quarkus. +The article opens with a brief discussion of the advantages that GraphQL’s schema based data access model has over REST APIs. Francesco then moves on to showing how you can use code.quarkus.io to create a Quarkus application that supports GraphQL using the MicroProfile-compliant SmallRye GraphQL extensions. The test of the tutorial is a step-by-step guide to writing the service class of the application and a GraphQL API class that handles the Query and Mutation operations supported by GraphQL. At this point, Francesco offers a bit of comparison between the different ways that data access operations work in GraphQL as opposed to REST. +The tutorial ends with sections detailing how you can test your applications using either the GraphQL UI provided by the extension, or the SmallRye MicroProfile GraphQL client API. +In a manner typical of most of Francesco’s tutorials, this one also contains a link to a repository with the code for this example project. +And those of you interested in learning more about GraphQL in Quarkus, check out Quarkus Insights episode #93. You can find the link to it in the Videos section of this week’s editorial.

+
+
+
+
+

Videos

+
+

This week there was plenty of fresh content to choose from, so please enjoy some of my top video picks:

+ +

That’s all for today! Please join us again in two weeks for another round of our JBoss editorial! Stay safe and enjoy your summer vacation!

+
+
+ +
+ + Stefan Sitani + +
+ ]]>
+ + Stefan Sitani + do-not-reply@jboss.com + https://www.jboss.org/people/stefan-sitani + + + + + + + + + + + +
+ + <![CDATA[This Week in JBoss - June 16nd 2022]]> + https://www.jboss.org/posts/weekly-2022-06-16.html + + 2022-06-16T00:00:00.000Z + +

This Week in JBoss - June 16nd 2022

+ +

Welcome back! +Here’s some great content at the start of summer, and just like always, some releases!

+

We hope you have had a great week and are looking forward to summer.

+
+

Releases, releases, releases!

+
+
+
    +
  • +

    Keycloak 18.0.1 - The first bug fix release on the 18 branch is out. There are some minor enhancements and one new feature. Check the link for all the issues resolved in this release.

    +
  • +
  • +

    Kogito 1.22.1 - Another minor release, though it does have one small breaking change. Be sure to look at that and adjust your pom files accordingly.

    +
  • +
+
+
+
+
+

Articles & Blogs

+
+
+
    +
  • +

    Infinispan 14 indexing and query news - With development of Infinispan 14 ongoing, Fabio Massimo Ercoli wanted to highlight some changes to indexing and searching. tl;dr: Hibernate annotations will be replaced with new Infinispan annotations. There are some other implications, so be sure to take a look.

    +
  • +
  • +

    Quick JBang Scripting With IntelliJ Idea - Are you using IntelliJ Idea as your Java IDE? Take a look at the JBang integration plugin and what it allows you to do. You’ll be surprised at how much it can help.

    +
  • +
  • +

    How to validate Jakarta REST parameters - Using Bean Validation with JAX-RS is powerful. You can use built-in validations to ease development and extend to create your own custom validations for entities. No more having to write trivial if statements to check if the provided data is valid.

    +
  • +
  • +

    Creating Tabs Using Dashbuilder - Nikhil Dewoolkar walks you through how to create tabs in Dashbuilder, a great alternative to some other dashboard projects.

    +
  • +
+
+
+
+ + +
+ + Jason Porter + +
+ ]]>
+ + Jason Porter + do-not-reply@jboss.com + https://www.jboss.org/people/jason-porter + + + + + + + + + +
+ + <![CDATA[This Week in JBoss - June 2nd 2022]]> + https://www.jboss.org/posts/weekly-2022-06-02.html + + 2022-06-02T00:00:00.000Z + +

This Week in JBoss - June 2nd 2022

+ +

Welcome to the June 2nd edition of the JBoss weekly editorial. Enjoy our pick of the latest news and interesting reads from around the JBoss community.

+
+

Releases, releases, releases!

+ +
+
+

Articles & Blogs

+
+
+

New Keycloak certifications

+

New Keycloak certifications by Marek Posolda

+

We are glad to announce new certifications for Keycloak related to the OpenID Connect and FAPI! In the previous post, we announced certification of Keycloak 15.0.2 with the FAPI and Brazil Open Banking. This is a follow-up of this post with the announcement of the additional certifications.

+
+
+

How to run WildFly on Openshift

+

How to run WildFly on Openshift by F.Marchioni

+

This tutorial will teach you how to run WildFly applications on Openshift using WildFly S2I images. At first, we learn how to build and deploy applications using Helm Charts. Then we learn how to use the S2I legacy approach which relies on ImageStreams and Templates.

+
+
+

WildFly custom caches configuration for Stateful Beans

+

WildFly custom caches configuration for Stateful Beans by F.Marchioni

+

This article has been updated to let you how to configure Stateful EJB Caches for your applications running on the latest version of WildFly application server.

+
+
+

How to consume Quarkus REST Services with React

+

How to consume Quarkus REST Services with React by F.Marchioni

+

ReactJS is a popular and widely used Javascript library for building rich user interfaces. This article shows how to consume Rest Services from a Quarkus application in a simple React frontend.

+
+
+

How to install command-line tools on a Mac

+

How to install command-line tools on a Mac by Varsha Sharma

+

macOS imposes strict limitations on the places from which you can download commands. Many of the Linux-related tools you want to use come from sites other than the App Store, so you have to change your preferences in macOS to use the commands. In this article, Varsha shows how to install a command that is not from the App Store, using the popular Helm client as an example.

+
+
+

What’s new in Red Hat Enterprise Linux 9

+

What’s new in Red Hat Enterprise Linux 9 by Nikhil Mungale and Alex Krikos

+

RHEL 9 is designed to meet the needs of the hybrid cloud environment and can run your code efficiently in a number of environments.

+
+
+

How intelligent applications can benefit from streams processing technology (Apache Kafka)

+

How intelligent applications can benefit from streams processing technology (Apache Kafka) by Jennifer Vargas

+

The creation and delivery of intelligent and stream-based applications requires having a robust streaming platform that can support ingesting and transforming large amounts of data at a fast pace. Red Hat OpenShift Streams for Apache Kafka can support enterprise organizations in solving digital experiences challenges.

+
+
+

Videos

+

This week there was plenty of fresh content to choose from, so please enjoy some of my top video picks:

+ +

That’s all for today! Please join us again in two weeks for another round of our JBoss editorial!

+
+
+
+ +
+ + Pedro Silva + +
+ ]]>
+ + Pedro Silva + do-not-reply@jboss.com + https://www.jboss.org/people/pedro-silva + + + + + + + + + + + +
+ + <![CDATA[This Week in JBoss - May 7th 2022]]> + https://www.jboss.org/posts/weekly-2022-05-07.html + + 2022-05-07T00:00:00.000Z + +

This Week in JBoss - May 7th 2022

+ +

Welcome to the May 7th edition of the JBoss weekly editorial. +The last few weeks have been rich in both new releases from your favorite projects, and also new and interesting content brought to you by your favorite authors and contributors. And with the Red Hat Summit happening this week, we all have even more goodies to look forward to. +Today, we’re looking at highlights from all over the community. From Cryostat to Kafka to Knative and Quarkus, we have plenty to choose from, so sit back and enjoy this week’s selection.

+
+

Releases, releases, releases!

+
+

Here are the releases from the JBoss Community for this edition:

+ +
+
+
+

Articles & Blogs

+
+
+

Monitoring Quarkus JVM mode With Cryostat

+

Monitoring Quarkus JVM Mode With Cryostat by Andrew Azores

+

Cryostat is a container-native implementation of JDK Flight Recorder (JFR) for monitoring the JVM performance in workloads that run on an OpenShift cluster. +Andrew Azores walks you through installing the Cryostat Operator and setting up a Cryostat instance to monitor a Quarkus application running in JVM mode. He also adds a few educational points about Cryostat’s JMX target discovery strategies and the limitations of using Cryostat to monitor Quarkus applications running in native mode.

+
+
+

Use Red Hat’s SSO to manage Kafka broker authorization

+

Use Red Hat’s SSO to manage Kafka broker authorization by Ken Lee and Niti Upadhyay

+

Ken Lee and Niti Upadhyay’s post is a detailed deep dive into combining the Kafka ACL management capabilities provided by Red Hat SSO and the user and group permission management model of OpenLDAP to control publishing and consumption access of LDAP users to specific Kafka topics. The article opens with an architecture overview of the example project, and follows with up with a detailed end-to-end walkthrough of how to to get the required service up and running on OpenShift. The walkthrough steps contain extensive code examples and section providing background information. The article is accompanied by a demo video presented by Ken Lee.

+
+
+

The Red Hat Cloud way: Event-driven, serverless, distributed cloud services to support modern apps

+

The Red Hat Cloud way: Event-driven, serverless, distributed cloud services to support modern apps by Natale Vinto and Sebastien Blanc

+

This short tie-in article for a Red Hat Summit 2022 talk by Natale Vinto and Sebastien Blanc sets stage for the speakers' presentation on the future of cloud-native development with Red Hat’s Cloud Services and Application Services portfolios. Natale and Sebastien will take you on a journey of developing a microservice-based application with Red Hat OpenShift Streams for Apache Kafka and Developer Sandbox for OpenShift that supports serverless, event-driven, on-demand workloads and can adapt to a wide range of purposes. including IoT, edge computing, and big data analytics. If you missed this talk at this years Summit, be sure to catch the recording.

+
+
+

Comparing Distributed Transaction Patterns for Microservices

+

Comparing Distributed Transaction Patterns for Microservices by Bilgin Ibryam

+

Drawing on his vast experience wit working on customer projects as a Solution Architect, Bilgin invites you along on a deep-dive into the technical challenges of using distributed transactions to write data to multiple systems of record in microservice-based applications. He lays out four proven design approaches to making your app write predictably into multiple data storage resources and evaluates the benefits and drawback of each one, in terms of complexity, robustness, and scalability. Bilgin includes multiple examples and references to these patters as they are used in real-world enterprise applications today.

+
+
+

Videos

+

This week there was plenty of fresh content to choose from, so pleas enjoy some of my top video picks:

+ +

That’s all for today! Please join us again in two weeks for another round of our JBoss editorial!

+
+
+
+ +
+ + Stefan Sitani + +
+ ]]>
+ + Stefan Sitani + do-not-reply@jboss.com + https://www.jboss.org/people/stefan-sitani + + + + + + + + + + +
+ + <![CDATA[This Week in JBoss - 22 April 2022]]> + https://www.jboss.org/posts/weekly-2022-04-22.html + + 2022-04-22T00:00:00.000Z + +

This Week in JBoss - 22 April 2022

+ +

Welcome back! +Amazing how quickly two weeks can fly by isn’t it? +We have some great things for you this week including releases, tidbits from the blogoshpere, and information about Red Hat Summit 2022!

+
+

Release roundup

+
+

Let’s jump right into what has been released over the past couple of weeks:

+
+
    +
  • +

    Kogito 1.20.0 - Updates including tooling, images, operator, and the CLI.

    +
  • +
  • +

    Keycloak 18.0.0 - A new admin console preview, new Operator preview, client secret rotation, session limits per user, etc. Lots of great new features and additions!

    +
  • +
  • +

    RESTEasy 6.1.0.Beta1 - First release to implement Jakarta RESTful Web Services 3.1, updates to RESTEasy CDI allowing injection of certain types, and an SeBootstrap API implementation.

    +
  • +
  • +

    Wildfly 26.1.Final - Honestly, too many things to list here, take a look at the blog post including new features, how to run on Java 17, and links to additional information.

    +
  • +
  • +

    Quarkus 2.8.1.Final - First maintenance release of the 2.8 branch, it contains only bug fixes

    +
  • +
+
+
+
+
+ +
+

The KIE team (jBPM, Drools, Optaplanner, Kogito) has had some interesting posts the last couple of weeks:

+
+ +
+
+
+
+

Quarkus Bits

+
+

Quarkus always has interesting things going on, and these past weeks are no exception:

+
+ +
+
+
+
+

Wildfly Buzzings

+
+

Wildfly continues strong with a number of posts:

+
+ +
+
+
+
+

Getting enough REST

+
+

While it may not be one of the sexiest technologies, REST is used all over for communication and microservices. +Take a look at two posts to get going if you’re new to RESTEasy: Getting started with Jakarta RESTful Services and RESTEasy Spring And RESTEasy Spring Boot EE9 Deployment With WildFly Preview.

+
+
+
+

Red Hat Summit 2022

+
+

Red Hat Summit 2022 is happening May 10th and 11th. +It will be a hybrid event. +Take a look at the Red Hat Summit page for more information. +There will be great information, talks, events, and tech for everyone who attends either virtually or in person. +We’re looking forward to seeing you there!

+
+
+ +
+ + Jason Porter + +
+ ]]>
+ + Jason Porter + do-not-reply@jboss.com + https://www.jboss.org/people/jason-porter + + + + + + + + + +
+ + <![CDATA[This Week in JBoss - 07 April 2022]]> + https://www.jboss.org/posts/weekly-2022-04-07.html + + 2022-04-07T00:00:00.000Z + +

This Week in JBoss - 07 April 2022

+ +

Hi everyone! +It’s great to be back and bringing you another edition of the JBoss Editorial. +As always there’s a lot of exciting news and updates from JBoss communities so let’s dive in.

+
+

Release roundup

+
+
+ +
+
+
+
+

.Net core client for Infinispan

+
+

Infinispan .Net Core Client, by Vittorio Rigamonti

+

Vittorio Rigamonti has made a beta release of his .Net core client that allows access to remote caches on Infinispan clusters. +The client provides .Net core applications with the performance benefits of in-memory data storage. +Combined with the Protobuf data encoding Vittorio’s client also gives .Net core applications data interoperability with Java applications that can access the same Infinispan caches. +Using Protobuf with the .Net core client lets you perform remote queries as an added bonus!

+

Go check out Vittorio’s post and use his sample application to get started coding. +While you’re at it, you might find Vittorio’s other blog post on performing remote queries useful.

+
+
+
+

Inside out event streaming with microservice architectures

+
+

Turning Microservices Inside-Out, by Bilgin Ibryam

+

This excellent read from Bilgin starts with recent ideas about the design of relational databases and their place in the event-driven world of microservice architectures. +Bilgin makes his point that, rather than replacing relational databases with event streams, the inside out design principle is better applied to the service level. +Using traditional databases with an event-driven approach allows you to combine the best of both technologies but requires a deliberate focus on APIs. +From there Bilgin explains the flow of events through outbound and inbound APIs and how a "connecting tissue" such as Debezium can help you effectively bring relational databases into event-driven microservices.

+
+
+
+

Camel Quarkus: the Swiss knife of integration

+
+

Riding Camel Quarkus: effortless APIs, by Bruno Meseguer

+

Bruno showcases Camel Quarkus in an extensive post that will leave anyone working on service integration how they could live without it.

+

Using the OpenAPI specification as an example Bruno explains how to use Camel Quarkus to connect to an HTTP service and transform data in a few effortless steps. +There’s a lot to discover in his post and Bruno even walks you through a second iteration of his application in which he reduces the path to integration even further.

+

I think by the end Bruno proves his point, that Camel Quarkus really is a Swiss knife for service integration. +He offers a compelling look at how reducing integration overhead lowers maintenance costs and accelerates development cycles for rapid functionality growth.

+
+
+
+

Quickly debug and profile MySQL databases

+
+

How to trace JDBC Statements performance in MySQL, by Francesco Marchioni

+

Francesco shows us how to quickly debug and profile SQL statements with Java applications using the MySQL JDBC driver. +Using the WildFly CLI Francesco adds a JDBC connection to MySQL database in a container in a few simple steps. +After creating the datasource he demonstrates the hibernate.show_sql option in the application’s persistence.xml. +Once that’s done you can find all sorts of useful information about SQL statements in your logs. +You’re all set to debug and tune!

+
+
+ +
+

See you next time

+
+

Hope you enjoyed this edition. Please join us again in two weeks for our JBoss editorial!

+
+
+ +
+ + Don Naro + +
+ ]]>
+ + Don Naro + do-not-reply@jboss.com + https://www.jboss.org/people/don-naro + + + + + + + + + + + + + + + +
+ + <![CDATA[This Week in JBoss - 25 March 2022]]> + https://www.jboss.org/posts/weekly-2022-03-25.html + + 2022-03-25T00:00:00.000Z + +

This Week in JBoss - 25 March 2022

+ +

Happy Friday, everyone!

+

Here is another edition of the JBoss Editorial with exciting news and updates from your JBoss communities.

+
+

Release roundup

+
+

Here are the most recent releases for this edition:

+
+
    +
  • +

    Quarkus 2.7.5 - There is a new maintenance release with a new round of bugfixes and documentation improvements. This should be a safe upgrade upgrade for anyone already using 2.7. More details on the Migration Guide 2.7

    +
  • +
  • +

    Kogito 1.19.0 - We are glad to announce that the Kogito 1.19.0 release is now available!.

    +
  • +
  • +

    Infinispan 14.0.0.Dev01 - Infinispan 14 GA is almost ready! Expect some cool features such as Redis (RESP) endpoints, new MP Metrics with Micrometer, clustering and endpoint metrics in Prometheus, FIPS compatible Infinispan Installation, Cross-site replication memory and batching improvements and Dynamic Role-Based Access Control

    +
  • +
+
+
+
+
+

Write Kubernetes in Java with the Java Operator SDK (Part 2)

+
+

Write Kubernetes in Java with the Java Operator SDK, Part 2, by Christophe Laprun

+

In this post, Christophe teach us how to use the Java Operator SDK and its Quarkus extension to build a sample application as you take a deeper dive into writing Kubernetes Operators in Java.

+
+
+
+

Deploy Infinispan automatically with Ansible

+
+

Deploy Infinispan automatically with Ansible, by Romain Pelisse

+

In this article from Romain, you will learn how to use Ansible to cover all repetitive work to provision Infinispan. It covers everything from downloading software, preparing the environment (user, group, firewall), deploying the binary files and the configuration, setting up the service in systemd, etc. +That’s a great way to get started with Infinispan and Ansible.

+
+
+
+

Clustering support for JBoss EAP on Azure App Service (Tech Preview)

+
+

Clustering support for JBoss EAP on Azure App Service (Tech Preview), by James Falkner and Jason Freeberg

+

If you want to try out a preview of JBoss EAP clustering on Azure App Service then this article is for you! The combination of JBoss EAP, a leading Jakarta EE platform, with Microsoft Azure, a leading cloud platform, gives JBoss EAP users a powerful path to the cloud.

+
+
+
+

Quarkus Newsletter #18 - March

+
+

Quarkus March newsletter, By James Cobb

+

This newsletter covers what’s new with Java 17 and containers, discusses LogicDrop and Vaadin’s path to using Quarkus, and get a look at Continuous testing with Quarkus.

+
+
+
+

Quarkus Migration Tips

+
+

Quarkus Migration Tips, by Francesco Marchioni

+

In this article from mastertheboss.com you will learn which are the available guidelines to migrate Quarkus applications and tools that can help you to simplify your update strategy

+
+
+
+

Youtube video: Build & Deploy WildFly Quickstarts on OpenShift

+
+

Build & Deploy WildFly Quickstarts on OpenShift, by Jeff Meslin

+

Finally, from WildFly’s youtube channel check this video by Jeff Meslin to learn how to build and deploy a quickstart +for WildFly on OpenShift

+

Jeff shows how to deploy the microprofile-config quickstart for WildFly on the Developer Sandbox for Red Hat OpenShift. This uses the Helm Chart for WildFly to configuring building and deploying WildFly applications.

+

That’s all folks! Please join us again in two weeks for another round of our JBoss editorial!

+
+
+ +
+ + Francesco Marchioni + +
+ ]]>
+ + Francesco Marchioni + do-not-reply@jboss.com + https://www.jboss.org/people/francesco-marchioni + + + + + + + + + +
+ + <![CDATA[This Week in JBoss - 11 March 2022]]> + https://www.jboss.org/posts/weekly-2022-03-11.html + + 2022-03-11T00:00:00.000Z + +

This Week in JBoss - 11 March 2022

+ +

Happy Friday, everyone!

+

Welcome to another edition of the JBoss Editorial that brings you news and updates from your favorite communities.

+
+

Release roundup

+
+

Here are the most recent releases for this edition:

+
+
    +
  • +

    Quarkus 2.7.4 maintenance release with a new round of bugfixes and documentation improvements. This should be a safe upgrade upgrade for anyone already using 2.7.

    +
  • +
  • +

    Quarkus Tools for IntelliJ 1.10.0 release that adds support for Quarkus run/debug configurations and provides several fixes (including security related!).

    +
  • +
  • +

    Kogito 1.18.0 release includes a number of new bug fixes and new features, especially for Serverless Workflows.

    +
  • +
  • +

    Camel 3.14.2 LTS new patch release with 27 improvements and fixes.

    +
  • +
  • +

    Hibernate ORM 6.0.0.CR2 is expected to be the last release candidate before the 6.0 final release.

    +
  • +
  • +

    Hibernate Validator 6.2.2.Final, 7.0.3.Final and 8.0.0.Alpha1. Maintenance releases for Hibernate Validator 6.2 and 7.0 branches - both versions bring back support for validating java.sql.Date. The 8.0.0.Alpha1 targets specifically the upcoming Jakarta EE 10.

    +
  • +
+
+
+
+
+

Testing Jakarta EE applications with CDI-test

+
+

Testing Jakarta EE applications with CDI-test, by Gunnar Hilling

+

In this post, Gunnar presents the CDI-Test JUnit 5 extension, which provides a clever mechanism for unit, component, and integration Jakarta EE application tests at scale.

+

Gunnar provides a sample repository with a fully functional application and its test so you can use it to follow along with the article.

+
+
+
+

Narayana Community Priorities

+
+

Narayana Community Priorities

+

This excellent post from Narayana outlines the project’s near-term priorities based on the community’s feedback.

+

The topics covered by the post include Community Engagement, Java Versions, Integrating with contemporary services, Cloud strategy, and more.

+
+
+
+

Camel K Roadmap

+
+

Camel K Roadmap, by Pasquale Congiusti

+

One more great example of what’s planned for the project published in the open! This time Pasquale provides a comprehensive roadmap for the Camel K project for 2022.

+

Although these plans aren’t commitments, they provide an excellent understanding of where the project is heading.

+
+
+
+

WildFly on the Cloud with Helm

+
+

WildFly on the Cloud with Helm, by Francesco Marchioni

+

The popularity of Helm charts among developers is great. In this article, Francesco provides a step-by-step guide on how to deploy a WildFly application on OpenShift using bootable-jar and source to image.

+

New to Helm Charts? No worries, Francesco also covers a basic Helm setup.

+
+
+
+

Editing Serverless Workflow Definitions with VSCode

+
+

Editing Serverless Workflow Definitions with our new VSCode Extension, by Paulo Martins

+

Here we have Paulo introducing the new VSCode extension for Serverless Workflow provided by Red Hat, which allows users to have a side-by-side real-time preview of their workflows while editing JSON and YAML files inside VSCode.

+

Serverless Workflow is a CNCF based specification for workflows that Kogito already supports; check this out!

+
+
+
+

Content based routing with Quarkus and Kogito

+
+

Content based routing with Quarkus and Kogito, by Matteo Mortari

+

One more post about the Kogito technology! This time we have Matteo presenting a content-based router using DMN, Quarkus, Kogito, Camel, Atlas Map, Managed Kafka, and OpenShift Sandbox! Ohh my!

+

The post is very detailed, covering content with code examples and, more interesting, a link for a youtube video where Matteo explains the concepts and shows a live demo!

+

That’s all for today! Please join us again in two weeks for another round of our JBoss editorial!

+
+
+ +
+ + Alex Porcelli + +
+ ]]>
+ + Alex Porcelli + do-not-reply@jboss.com + https://www.jboss.org/people/alex-porcelli + + + + + + + + + +
+ + <![CDATA[This Week in JBoss - February 25th 2022]]> + https://www.jboss.org/posts/weekly-2022-02-25.html + + 2022-02-25T00:00:00.000Z + +

This Week in JBoss - February 25th 2022

+ +

Welcome back! +What better way to finish off the week (or start the week depending on when you read this) than by seeing what’s new in the software you care about? +As always, we have some great things happening within the community, read on below.

+
+

Releases

+
+
+
    +
  • +

    Quarkus 2.7.2.Final - second maintenance release for the 2.7 branch. This release features a number of bug fixes and updates to Kogito and Optaplanner. View the full changelog.

    +
  • +
  • +

    Kogito 1.17.0 - This release packs in new features, bug fixes and, one small breaking change. Read about the release.

    +
  • +
  • +

    Eclipse Vertx 4.2.5 - The Vertx team has been hard at work bringing the number of bugs down in the 4.2 branch. They have also added the ability to intercept HttpProxy calls, and the Oracle client now has proper pooling. Find out more.

    +
  • +
  • +

    Keycloak 17.0.0 - A major update, too many things to list here, read about the release for changes.

    +
  • +
  • +

    Hibernate Reactive 1.1.3.Final - Biggest change here: Support for Oracle, see more.

    +
  • +
+
+
+

Blogs

+

The blog, Mastertheboss has some great posts about Quarkus:

+
+ +
+

The KIE team (business and process automation space) also have three new blog posts out recently:

+
+ +
+

Those working on Quarkus have a few new things to show and say this week as well:

+
+ +
+

Lastly, a few blogs from other areas around the blogosphere:

+ +

Thanks again for joining us for another week!

+
+
+
+ +
+ + Jason Porter + +
+ ]]>
+ + Jason Porter + do-not-reply@jboss.com + https://www.jboss.org/people/jason-porter + + +
+ + <![CDATA[This Week in JBoss - February 10th 2022]]> + https://www.jboss.org/posts/weekly-2022-02-10.html + + 2022-02-10T00:00:00.000Z + +

This Week in JBoss - February 10th 2022

+ +

Hello! Welcome to the third JBoss weekly editorial of 2022. +Enjoy our pick of the latest news and interesting reads from around the JBoss community.

+
+

Releases, releases, releases!

+
+

Here are the releases from the JBoss Community for this edition:

+ +
+
+
+

Articles, Books, and Tutorials

+
+

Check out some of the recent articles about Java, Kubernetes, Quarkus, Keycloak and more…​

+
+

Deploy your KIE Sandbox to Openshift

+

Deploy your KIE Sandbox to Openshift by Guilherme Caponetto

+

The Kogito Tooling release 0.16.0 includes three container images to make it easy to deploy the KIE Sandbox to an OpenShift instance.

+
+
+

KIE Sandbox: Top 7 key new features

+

KIE Sandbox: Top 7 key new features by Eder Ignatowicz

+

In the last months of 2021, the “.NEW environment” (bpmn.new, dmn.new) received a massive update, and now it’s named KIE Sandbox! Dealing with complex models and collaborating with others has just become much easier. In this blog post, let’s go for a walkthrough of the top new features of KIE Sandbox.

+
+
+

Artemis monitoring in OpenShift

+

Artemis monitoring in OpenShift by Ramón Gordillo

+

It is really simple to monitor the brokers deployed on OpenShift and show the metrics in grafana or configuring alerts based on the metrics. We are using the artemis version included in AMQ 7.9 deployed with the operator.

+
+
+

Deprecation of Keycloak adapters

+

Deprecation of Keycloak adapters by Stian Thorgersen

+

This blog is a notice that the Keycloak project will be deprecating the Keycloak Adapters.

+
+
+

Running Arquillian Tests from Eclipse

+

Running Arquillian Tests from Eclipse by F. Marchioni

+

The blog shows you how to configure the Arquillian Tests on Eclipse.

+
+
+

Reverse engineer your JBoss AS-WildFly configuration to CLI

+

Reverse engineer your JBoss AS-WildFly configuration to CLI by F. Marchioni

+

Exporting your WildFly/JBoss EAP configuration to a CLI script is something you are going to need one day or another. No worries, the project Profile Cloner comes to the rescue!

+
+
+

Intelligent data as a service (iDaaS) - Example data insights

+

Intelligent data as a service (iDaaS) - Example data insights by Eric D. Schabell

+

Part 5 - Data insights through the iDaaS insights architecture provides a different look at the architecture and gives us insights into how our healthcare solutions are performing.

+
+
+

What’s new for developers in Java 18?

+

What’s new for developers in Java 18? by Shaaf, Syed

+

This article highlights some of the features that developers can look for in the upcoming Java 18 release, including the new simple web server module, a more sophisticated way to annotate your Javadocs, and the –finalization=disabled option, which lets you test how a Java application will behave when finalization is removed in a future release. See the end of the article for where to download Java 18 in early access builds.

+
+
+

Build a bootable JAR for cloud-ready microservices

+

Build a bootable JAR for cloud-ready microservices by Mauro Vocale

+

This article describes how to create a bootable JAR using Red Hat JBoss Enterprise Application Platform (JBoss EAP) and Jakarta EE and incorporate useful extensions, particularly a PostgreSQL database and MicroProfile capabilities.

+
+
+

Connect to an external PostgreSQL database using SSL/TLS for Red Hat’s single sign-on technology

+

Connect to an external PostgreSQL database using SSL/TLS for Red Hat’s single sign-on technology by Olivier Rivat

+

This article shows you how to connect securely to applications and data sources using Red Hat’s single sign-on technology.

+
+ +
+

Books

+ +

That’s all for today! Please join us again in two weeks for another round of our JBoss editorial!

+
+
+
+ +
+ + Pedro Silva + +
+ ]]>
+ + Pedro Silva + do-not-reply@jboss.com + https://www.jboss.org/people/pedro-silva + + + + + + + + + + + + +
+ + <![CDATA[This Week in JBoss - January 27th 2022]]> + https://www.jboss.org/posts/weekly-2022-01-27.html + + 2022-01-27T00:00:00.000Z + +

This Week in JBoss - January 27th 2022

+ +

Hello! Welcome to the second JBoss weekly editorial of 2022. +Enjoy our pick of the latest news and interesting reads from around the JBoss community.

+
+

Releases, releases, releases!

+
+

Here are the releases from the JBoss Community for this edition:

+ +
+
+
+

Articles, Books, and Tutorials

+
+

Check out some of the recent articles about Java, Kubernetes, Quarkus, and more…​

+
+

Event-driven predictions with Kogito

+

Event-driven predictions with Kogito by Alessandro Costa

+

This blogpost introduces the event-driven predictions addon and is the third of my series of event-driven with Kogito posts, after the and event-driven predictions addons.

+
+
+

Migrating from Spring Boot to Quarkus with MTA

+

Migrating from Spring Boot to Quarkus with MTA By F.Marchioni

+

In this article we will walk through a sample migration of a Spring Boot REST Application to Quarkus using Red Hat Migration Toolkit for Applications (MTA). The Migration Toolkit for Applications (MTA) is an extensible tool which you can use to simplify the migration of several Java applications.

+
+
+

Intelligent data as a service (iDaaS) - Example HL7 and FHIR integration

+

Intelligent data as a service (iDaaS) - Example HL7 and FHIR integration by Eric D. Schabell

+

Part 4 - Example HL7 & FHIR integration In our from this series we talked about the example iDaaS data architecture which outlines at a higher abstraction level the solution for any healthcare organisation.

+
+
+

Multi-tenancy Support for OpenID Connect Applications

+

Multi-tenancy Support for OpenID Connect Applications By Farah Juma

+

Applications deployed to WildFly can be secured with OpenID Connect, without needing to use the Keycloak client adapter.

+

WildFly 26.0.1.Final, which was just released, includes a fix for multi-tenancy support for OpenID Connect applications. This blog post gives an overview of how to configure OpenID Connect applications deployed to WildFly so they can support multi-tenancy.

+
+
+

WildFly Release Plans for 2022

+

WildFly Release Plans for 2022 By Brian Stansberry

+

In the Changes are coming to WildFly post last September, it was tried to give a sense of how the transition to Jakarta EE 10 was likely to impact the next few WildFly releases. With WildFly 26 out the door and our efforts for 2022 ramping up, we want to give our community on update on how we see things playing out over the course of the year.

+
+
+

Camel meets KEDA

+

Camel meets KEDA By Nicola Ferraro

+

(Kubernetes Event Driven Autoscalers) is a fantastic project (currently incubating) that provides Kubernetes-based autoscalers to help applications to scale out according to the number of incoming events when they are listening to several kinds of event sources.

+
+
+

Event-driven rules with Kogito

+

Event-driven rules with Kogito By Alessandro Costa

+

As part of our effort to make Kogito usable in an event-driven fashion, this article introduces a new addon: the event-driven rules addon. It is available since Kogito v1.12.0 and its behavior resembles what the event-driven decisions addon () already does for decisions.

+
+
+

Red Hat Summit 2022 - Talking Architecture Shop Series

+

Red Hat Summit 2022 - Talking Architecture Shop Series By Eric D. Schabell

+

It’s that time of year again when we get the call for papers! I heard the call and thought this year would be a perfect time to go all in with sessions around our architectures based on a series of talks we’ve designed to showcase the various aspects we cover.

+
+
+

Videos

+

Here’s my pick of this week’s YouTube videos:

+ +

That’s all for today! Please join us again in two weeks for another round of our JBoss editorial!

+
+
+
+ +
+ + Jonthan Vila + +
+ ]]>
+ + Jonthan Vila + do-not-reply@jboss.com + https://www.jboss.org/people/jonthan-vila + + + + + + + + + + + + +
+ + <![CDATA[This Week in JBoss - January 13th 2022]]> + https://www.jboss.org/posts/weekly-2022-01-13.html + + 2022-01-13T00:00:00.000Z + +

This Week in JBoss - January 13th 2022

+ +

Happy new year, everyone! Welcome to the first JBoss weekly editorial of 2022. +Enjoy our pick of the latest news and interesting reads from around the JBoss community.

+
+

Releases, releases, releases!

+
+

Here are the releases from the JBoss Community for this edition:

+ +
+
+
+

Articles, Books, and Tutorials

+
+

New year, new content! Check out some of the recent articles about Java, Kubernetes, Quarkus, and more…​

+
+

New Book: Reactive Systems in Java

+

Reactive Systems in Java, by Clement Escoffier and Ken Finnigan

+

In their new book Reactive Systems in Java, Clement Escoffier and Ken Finnigan take an in-depth look at reactive systems design make applications responsive, elastic, and resilient, and +explore event-driven architectures as a flexible and composable option for designing distributed systems. Full of practical examples, their new book helps developers bring these approaches together when designing applications with Quarkus.

+
+
+

Simplify Java persistence using Quarkus and Hibernate Reactive

+

Simplify Java persistence using Quarkus and Hibernate Reactive by Daniel Oh

+

Daniel Oh walks you through developing a reactive application with persistent data storage that leverages the benefits of simplified JPA implementation using the new extension for Hibernate Reactive with Panache.

+
+
+

Getting started with Netty

+

Getting started with Netty by Francesco Marchioni

+

Francesco’s tutorial introduces you to Netty a client/server framework that provides a simplified layer over non-blocking I/O networking. The introduction briefly describes the notable features that Netty provides. The first part of the tutorial section explains how you can create a simple echo server. The second part shows you how you can expand it by adding a separate Netty Client with its own Handler, and also demonstrates how to send a String between the client and the server over the event loop.

+
+
+

Why you should migrate your Java workloads to OpenShift

+

Why you should migrate your Java workloads to OpenShift by Philip Hayes

+

In the first part of his two-part post series, Philip Hayes outlines the main benefits of migrating Java workloads to OpenShift and explores a number of tools available from Red Hat and from the Konveyor community project that are designed to help you transitions your Java workloads to the cloud with ease. Stay tuned for part 2 that will take an in-depth look at migrating a JBoss EAP application to OpenShift!

+
+
+

How to use Quarkus with the Service Binding Operator

+

How to use Quarkus with the Service Binding Operator by Ioannis Kanellos

+

Ioannis Kanellos opens his article with a brief history of service binding solutions for Kubernetes developers and follows it up with a demonstration of a developer workflow centered around binding an external database service to an application in a cloud environment. With plenty of code examples and technical detail, Ioannis walks you through provisioning a database service, writing a Quarkus app for simplified data access with Hibernate with Panache, generating the service binding resources using the Service Binding Operator, and deploying your project to a containerized Kubernetes cluster running on your local machine.

+
+
+

Videos

+

Here’s my pick of this week’s YouTube videos:

+ +

That’s all for today! Please join us again in two weeks for another round of our JBoss editorial!

+
+
+
+ +
+ + Stefan Sitani + +
+ ]]>
+ + Stefan Sitani + do-not-reply@jboss.com + https://www.jboss.org/people/stefan-sitani + + + + + + + + + + + +
+ + <![CDATA[This Week in JBoss - 20 December 2021]]> + https://www.jboss.org/posts/weekly-2021-12-20.html + + 2021-12-20T00:00:00.000Z + +

This Week in JBoss - 20 December 2021

+ +

Hello! With a bit of delay, here is our very last editorial of the year! Sadly, it focus point has to be the log4j vulnerability,but we also ensured there was some interesting and exciting news too. Enjoy and happy holidays!

+
+

log4j Security vulnerabilities

+
+

Sadly, we have to start our editorial with a less-than-ideal piece of news. In case, you somehow missed, be aware that some vulnerabilities have been found in Log4J. Being one of the most used Java library, it is a rather critical issue. Please take look at this article to know How to fix Log4j CVE-2021-44228.

+

Some other projects from the JBoss community may also have been impacted. Please check any project you are currently using and see if, like KIE or InfiniSpan, they have provided information on the impact of the vulnerability.

+

Note that, on the bright side, Quarkus is not affected by the Log4J Vulnerability.

+
+
+ +
+

Security concern

+
+

With the nasty security vulnereablity on log4j, it’s certainly time to look at some new security features coming in either Elytron or Wildly (or both):

+ +
+
+
+

Quarkus

+
+

Always on top of the latest new feature, Quarkus offers you to Explore Java 17 language features with Quarkus! If you already hook to Quarkus and love how it allows you to deploy native executables, you’ll probably be interested by this article on Compressing native executables with UPX

+
+
+
+

Releases, releases, releases…​

+
+

As always, the JBoss community has been quite actived and released quite a lot:

+ +

That’s all for today! Please join us again next year for another round of our JBoss editorial!

+
+
+ +
+ + Romain Pelisse + +
+ ]]>
+ + Romain Pelisse + do-not-reply@jboss.com + https://www.jboss.org/people/romain-pelisse + + + + + + + + +
+ + <![CDATA[This Week in JBoss - 2 December 2021]]> + https://www.jboss.org/posts/weekly-2021-12-02.html + + 2021-12-02T00:00:00.000Z + +

This Week in JBoss - 2 December 2021

+ +

Hello! Welcome to our first December JBoss Editorial featuring the most interesting news and updates from our community.

+
+

Release roundup

+
+

Here are the releases from the JBoss Community for this edition:

+ +
+
+
+

Normalize web services with Camel K and AtlasMap

+
+

Normalize web services with Camel K and AtlasMap, Part 2, by Bruno Meseguer

+

Bruno’s article is a walkthrough Camel K 's implementation step by step. It also covers how to simplify data mapping with AtlasMap, which is a data mapping solution with an interactive web-based user interface.

+
+
+
+

Saga pattern with processes and Kogito – Part 1

+
+

Saga pattern with processes and Kogito – Part 1, by Tiago Dolphine

+

Saga is meant to provide transaction management using a sequence of steps that could be also called local transactions. In this article Tiago shows how to apply this pattern to Kogito processes.

+
+
+
+

Quarkus 2.5.0.Final released - GraalVM/Mandrel 21.3 and usability improvements all over the place.

+
+

Quarkus 2.5.0.Final released, by Guillaume Smet

+

Announce the availability of Quarkus 2.5.0.Final which comes with the following main improvements:

+
+
    +
  • +

    Upgrade to GraalVM/Mandrel 21.3

    +
  • +
  • +

    Support for JPA entity listeners for Hibernate ORM in native mode

    +
  • +
  • +

    Ability to add HTTP headers to responses

    +
  • +
  • +

    Various usability improvements in extensions and our dev mode/testing infrastructure

    +
  • +
+
+
+
+
+

SmallRye Stork meets Quarkus

+
+

SmallRye Stork meets Quarkus, by Michał Szynkiewicz

+

Michał introduces SmallRye Stork and its Quarkus integration. Stork provides a way to locate and select services. It’s simple and customizable. Stay tuned as more articles will follow up on this topic.

+
+
+
+

News from Java 18

+
+

News from Java 18, by Francesco Marchioni

+

Java 17 was just released in September 2021 however the Java Community Process is already working on the next release of Java with a list of cool new features. This article discusses the top picks from the JEP Process.

+
+
+
+

Free eBooks

+
+

Are you looking for a quick guide to migrating and modernizing your Java-based applications? Modernizing Enterprise Java walks you through the journey. Grab the eBook from Natale Vinto and Markus Eisele:

+ +

That’s all for today! Please join us again in two weeks for another round of our JBoss editorial!

+
+
+ +
+ + Francesco Marchioni + +
+ ]]>
+ + Francesco Marchioni + do-not-reply@jboss.com + https://www.jboss.org/people/francesco-marchioni + + + + + + +
+ + <![CDATA[This Week in JBoss - 18 November 2021]]> + https://www.jboss.org/posts/weekly-2021-11-18.html + + 2021-11-18T00:00:00.000Z + +

This Week in JBoss - 18 November 2021

+ +

Hello! Welcome to another edition of the JBoss Editorial that brings you news and updates from our community.

+
+

Release roundup

+
+

Here are the releases from the JBoss Community for this edition:

+ +
+
+
+

Test-driven development with Quarkus

+
+

Test-driven development with Quarkus, by Eric Deandrea

+

Eric’s article provides a detailed walkthrough of how to take advantage of Quarkus continuous testing and Dev UI for test-driven development. Eric also provides a sample repository that you can use to follow along with the article.

+
+
+
+

Boost throughput with RESTEasy Reactive in Quarkus 2.

+
+

Boost throughput with RESTEasy Reactive in Quarkus 2., by Daniel Oh

+

Daniel shows how some simple changes in your REST endpoints can boost the throughput of your application using RESTEasy Reactive. He also shows how to use the Endpoint score dashboard to assess the performance of your endpoints.

+
+
+
+

Low Code Camel

+
+

Low Code Camel - How Kamelets enable a low code integration experience., by Nicola Ferraro

+

This excellent post shows how Kamelets is driving a deeper transformation towards "low code" development with Camel. Nicola Ferraro shows that you can use Kamelets directly with yaml or take advantage of the Karavan tool to design and visualize your integration flows graphically.

+
+
+
+

Getting started with Hibernate reactive on Quarkus

+
+

Getting started with Hibernate reactive on Quarkus, by F. Marchioni

+

Reactive everywhere! In this post, F. Marchioni helps us get started with Hibernate reactive, providing a step-by-step from project creation to configuration and coding.

+

The post covers the "classic" Hibernate ORM, but Hibernate Reactive can also be applied to Panache.

+
+
+
+

Java LTS - perspective of a library author

+
+

Java LTS - perspective of a library author, by Emmanuel Bernard

+

Oracle is proposing a change to the Java LTS lifecycle from the current 3 years for 2 years. In this post, Emmanuel Bernard put some light on the challenges, from the perspective of a library author, that such changes may bring to the complex Java ecosystem.

+
+
+
+

Videos

+
+

YouTube is such a great platform to share knowledge, here are my top picks for this week’s editorial:

+ +

That’s all for today! Please join us again in two weeks for another round of our JBoss editorial!

+
+
+ +
+ + Alex Porcelli + +
+ ]]>
+ + Alex Porcelli + do-not-reply@jboss.com + https://www.jboss.org/people/alex-porcelli + + + + + + + +
+ + <![CDATA[This Week in JBoss - 04 November 2021]]> + https://www.jboss.org/posts/weekly-2021-11-04.html + + 2021-11-04T00:00:00.000Z + +

This Week in JBoss - 04 November 2021

+ +

Hello! Welcome to another edition of the JBoss Editorial that brings you news and updates from our community.

+
+

Release roundup

+
+

Congrats on all the releases and great work from the community!

+ +
+
+
+

Keycloak.X

+
+

Keycloak.X Update, by Stian Thorgersen

+

Stian’s informative article takes us through the highlights and goes into detail about what’s coming with Keycloak.X. +He also shares the roadmap for all the work that lies ahead for the Keycloak team. +It looks like some awesome changes are coming with Keycloak.X so get ready!

+
+
+
+

Kogito Public API: The Road Ahead

+
+

The Road Towards a Kogito Public API, by Edoardo Vacchi

+

Edoardo gives an overview of the principles and reasoning that he and the Kogito team have put into the design of their new public API.

+
+
+
+

WildFly S2I v2 Architecture Overview

+
+

WildFly S2I v2 architecture overview, by Jean-François Denise

+

This informative post describes a set of pain points that the WildFly team plan to address with a re-architecture of the S2I images. +JF Denise goes into detail and explains the benefits of the new approach that will offer more flexibility, increased efficiency , and a greatly improved user experience.

+
+
+
+

Distributed Security Realms in Elytron

+
+

Using distributed realm in Elytron, by Diana Krepinska Vilkolakova

+

Diana treats us to an overview of distributed security realms in Elytron that combine identities located across multiple security realms of any type into a single security realm.

+
+
+
+

Securing WildFly Applications with OpenID Connect

+
+

Secure WildFly applications with OpenID Connect, by F. Marchioni

+

This post covers a basic example for using OpenID Connect and the elytron-oidc-client in WildFly to secure applications.

+
+
+
+

Quarkus Insights

+
+

Get your popcorn ready and sit back to watch some Quarkus insights. +Here are my top picks for this week’s editorial:

+ +
+
+ +
+ + Don Naro + +
+ ]]>
+ + Don Naro + do-not-reply@jboss.com + https://www.jboss.org/people/don-naro + + + + + + + + + +
+ + <![CDATA[This Week in JBoss - 21 October 2021]]> + https://www.jboss.org/posts/weekly-2021-10-21.html + + 2021-10-21T00:00:00.000Z + +

This Week in JBoss - 21 October 2021

+ +

Welcome back to another edition of the JBoss Editorial, a bi-weekly editorial containing information about JBoss and Red Hat related news and software!

+
+

Release roundup

+
+

Once again, let’s thank everyone who has contributed to rolling out new releases over the past two weeks!

+ +
+
+
+

WildFly

+
+

This past week, the Wildfly Elytron team (a team specializing in server and client side security) participated in the Open Source Day hackathon. +It is an all day hackathon celebrating Open Source technologies and allowing participants to learn about Open Source and contribute to projects designed to solve real world problems.

+

Issues in the Elytron issue tracker were triaged ahead of the event and new contributors were onboarded and taught about Git, creating and submitting pull requests, and how Open Source works. +The event went well for the Elytron team with double the amount of PRs submitted than in the Summer Open Source Day!

+

We’d also like to mention that in Wildfly 25 support has been added for the MicroProfile Reactive Messaging 2.0. More information and a sample application can be found within the announcement.

+
+
+
+

Quarkus Videos

+
+

The Quarkus team has been busy in front of the camera these last two weeks! +Six videos have come out, including a new Quarkus Insights. +These videos cover remote development, the DevCLI, DevUI, DevServices, and continuous testing. +Most of these are under five minutes, why not watch them all?

+ +
+
+ +
+ + Jason Porter + +
+ ]]>
+ + Jason Porter + do-not-reply@jboss.com + https://www.jboss.org/people/jason-porter + + + + + + +
+ + <![CDATA[This Week in JBoss - 08 October 2021]]> + https://www.jboss.org/posts/weekly-2021-10-08.html + + 2021-10-08T00:00:00.000Z + +

This Week in JBoss - 08 October 2021

+ +

Hello! Welcome to another edition of the JBoss Editorial that brings you news and updates from our community.

+
+

Release roundup

+
+

Congrats on all the releases and great work from the community!

+ +
+
+
+

WildFly 25

+
+

WildFly 25 is released!, by Brian Stansberry

+

It feels appropriate to call special attention to Brian’s release announcement of WildFly 15. +The entire team has done great work and Brian goes into detail about all the new features, including finishing the migration to Elytron-based security and Java SE 17 support. +Congrats to the WildFly community on another fantastic milestone!

+
+
+
+

Elytron Hacktoberfest

+
+

Hacktoberfest Has Begun, by Farah Juma

+

Calling all hackers!! +WildFly Elytron is participating in this year’s Hacktoberfest. +Check out Farah’s post to register and contribute to Elytron, Elytron Web, or WildFly OpenSSL repositories.

+
+
+
+

Run Decision Manager with Podman

+
+

Beginners Guide to Installing Decision Management Tooling in a Local Container using Podman, by Eric Schabell

+

Eric’s step-by-step tutorial taught me how to quickly set up a running instance of Decision Manager in a local container. +I really enjoyed the tutorial and would recommend as a great way to introduce yourself to the world of process automation.

+
+
+
+

Authenticating to Business Central with SSH keys

+
+

Business Central SSH Key-Based Authentication, by Eder Ignatowicz

+

This brief article shows you how easy it is to configure authentication with Business Central using SSH keys. +At the end, Eder also combines JBang with JGit in a nifty way to use a different SSH keys and provides you with the code.

+
+
+
+

Quarkus Insights

+
+

Get your popcorn ready and sit back to watch some Quarkus insights. +Here are my top picks for this week’s editorial:

+ +
+
+ +
+ + Don Naro + +
+ ]]>
+ + Don Naro + do-not-reply@jboss.com + https://www.jboss.org/people/don-naro + + + + + + + + + +
+ + <![CDATA[This Week in JBoss - 23 September 2021]]> + https://www.jboss.org/posts/weekly-2021-09-23.html + + 2021-09-23T00:00:00.000Z + +

This Week in JBoss - 23 September 2021

+ +

Welcome to yet another installment of the JBoss Editorial! September is coming to an end, but it has been a pretty busy month for the JBoss community.

+
+

Quarkus

+
+

Quarkus has really come a long way since the first release only a few years ago. A testament to the fact is certainly the compelling user stories released by the project’s team in the last weeks. First, we have How Quarkus Improved Logicdrop’s Developer Experience and Process, followed by Eclipse Adoptium Uses Quarkus for high volume Java SE distribution API. And we even have a nice retail business use case, with VCStream: a new messaging platform for DECATHLON’s Value Chain, built on Quarkus!

+

So, if you have yet to jump onboard the Quarkus train, it’s really time to do so! And, to help you do it, you can check out this nice tutorial on Quarkus for Spring developers: Getting started. Once you are hooked by Quarkus, go check out the Quarkus Newsletter #12!

+
+
+
+

Kogito never stops!

+
+

Kogito and its ecosystem have been quite active lately. In the last two weeks, five different articles have been released, each covering very different aspects of the project:

+ +
+
+
+

OpenJDK and GC pauses

+
+

After all this Quarkus and Kogito action, if you are still looking for even more technical nitty, gritty details, you should certainly check out this article on Shenandoah in OpenJDK 17: Sub-millisecond GC pauses.

+
+
+
+

Releases, releases, releases…​

+
+

As always, projects of the JBoss community have been quite active and released a few exciting new versions, including a beta of Wildlfy’s next major version!

+
+ +
+
+
+
+

Decaf' - Ansible for JBoss middleware

+
+

In the past months, we’ve been doing some hard work to ensure that JBoss software can fit as neatly as possible within an Ansible playbook. There is a still a lot to be done, but we are already quite proud of to two Ansible collections we have released. The first one is called, JCliff, but will soon be renamed to WildFly, as it aims to integrate, as smoothly as possible, the app server into Ansible. The latest version (v.0.0.10) has already a few exciting features: +* systemd integration, a reusable role to help set up WildFly as a systemd service +* a reusable role to install JDBC driver and their module +* and, of course, more fine-tuning of WildFly’s subsystem thanks to the JCLiff (embedded in the collection) which allows Ansible to configure mod_cluster, sockets, JMS queues and so many other features.

+

We are also very happy about the release of JWS Collection for Ansible (v0.0.2), which allows us to quickly set up Apache Tomcat or its counterpart, JBoss Web Server, but also provides some nice features, like integration with systemd and common criteria (partial) compliance checking. Please check our blog entry about this Ansible collection for Apache Tomcat / JWS for more details!

+

(Given that those are projects I work on, I fully assume that this entry is a shameless plug :) )

+

That’s all for today! Please join us again in two weeks for another installment of our JBoss editorial! Stay safe and healthy in the meantime.

+
+
+ +
+ + Romain Pelisse + +
+ ]]>
+ + Romain Pelisse + do-not-reply@jboss.com + https://www.jboss.org/people/romain-pelisse + + + + + + +
+ + <![CDATA[This Week in JBoss - 10 September 2021]]> + https://www.jboss.org/posts/weekly-2021-09-10.html + + 2021-09-10T00:00:00.000Z + +

This Week in JBoss - 10 September 2021

+ +

Hello! Welcome to another edition of the JBoss Editorial that brings you news and updates from our community.

+
+

Release roundup

+
+

Congrats to each team on completing all the hard work and thanks to all community contributors!

+ +
+
+
+

Quarkus LRA extension and microservice reliability

+
+

An Extension for Long Running Activities, by Michael Musgrove

+

Quarkus provides an @LRA annotations that lets you build more reliable service interactions. +Michael’s informative article breaks down the details and walks you through an example with microservices that coordinate long running actions that complete in an atomic manner.

+
+
+
+

Metadata for your BPMN nodes

+
+

BPMN and Metadata – Leveraging app capabilities, by Wagner Lemos

+

The BPMN Editor includes fields where you can add metadata to nodes, offering a versatile and flexible way to receive custom event notifications via process listeners. +Wagner’s article shows us how to control process flow with metadata, highlighting both its simplicity and usefulness.

+
+
+
+

Kogito in action

+
+

Shopping recommendations in PMML – Kogito at Work, by Gabriele Cardosi

+

Bringing Drools rules into the cloud with Kogito: a step by step path, by Mario Fusco

+

The Kogito team do an amazing job providing hands-on, practical examples for real-world use cases. +Since our last editorial, Gabriele concludes a previous post by demonstrating how to set up a Kogito service that allows remote clients to get purchase recommendations to personalize a web shopping experience.

+

Mario Fusco’s latest entry on the Kogito blog gives a lot of food for thought and is highly recommended. +In his article, Mario digs into migrating from Drools and start using Kogito and Quarkus. +He shows you how to start building microservices that you can eventually deploy into Function as a Service (FaaS) environments to provide stateless rule evaluation.

+
+
+ +
+ + Don Naro + +
+ ]]>
+ + Don Naro + do-not-reply@jboss.com + https://www.jboss.org/people/don-naro + + + + + + + +
+ + <![CDATA[This Week in JBoss - 27 August 2021]]> + https://www.jboss.org/posts/weekly-2021-08-27.html + + 2021-08-27T00:00:00.000Z + +

This Week in JBoss - 27 August 2021

+ +

Hello! Welcome to another edition of the JBoss Editorial that brings you news and updates from our community.

+
+

Calling all Kogito DMN contributors

+
+

Guilherme Carreiro brings us the second in a series of posts that guide you through contributing to Kogito’s DMN editor, DMN editor – Contributors Guide – Part 2. +The post gives a nice overview of the DMN and the BPMN editors then links to some additional resources that guide you through the tasks of creating and testing Reactive components.

+
+
+
+

RESTEasy Reactive in Quarkus 2.2

+
+

Clément gives a very insightful look at how Quarkus and RESTEasy Reactive make your life easier when implementing HTTP APIs. +He also explains different dispatching strategies in Quarkus 2.2, based on method signatures to intelligently decide whether methods should be called on the I/O thread or a worker thread at build time.

+

Go read the full details in Clément’s post, RESTEasy Reactive - To block or not to block and take a look at some of the code examples he provides.

+
+
+
+

Narayana LRA annotation checker

+
+

The Narayana team have provided a Maven plugin that checks LRA (Long Running Actions) annotations. +This plugin helps developers avoid errors and follow the rules of the LRA specification. +There’s also a sample Quarkus project in that shows you how to use it.

+

You can read Ondra Chaloupka’s article here: LRA annotation checker Maven plugin.

+
+
+
+

DevConf.US 2021 - Designing your best architecture diagrams workshop

+
+

Over on Eric Schabell’s blog, he announces the Designing your best architecture diagrams workshop that he will deliver at this year’s DevConf.US on Thursday, September 2. +Eric’s workshop takes attendees through the process of using open-source tooling to design architecture diagrams like an expert.

+

Congrats to Eric on getting the workshop accepted. +I’m sure it will be an invaluable workshop for all those who face the challenges of communicating complex architectural designs to project teams.

+
+
+
+

Apache Camel at Kubecon EU

+
+

Nicola Ferraro presented Apache Camel at the Kubecon EU conference that took place on August 19th, 2020.

+

Nicola’s presentation focused on Camel K integration with Knative with a detailed explanation and a super cool demo. +Visit his blog to read details and watch the video at Serverless Integration on Kubernetes with Apache Camel K.

+
+
+
+

Release roundup

+
+

Let’s start things off this week with a look the latest releases.

+
+ +
+
+
+ +
+ + Don Naro + +
+ ]]>
+ + Don Naro + do-not-reply@jboss.com + https://www.jboss.org/people/don-naro + + + + + + + + + +
+ + <![CDATA[This Week in JBoss - 11 August 2021]]> + https://www.jboss.org/posts/weekly-2021-08-11.html + + 2021-08-11T00:00:00.000Z + +

This Week in JBoss - 11 August 2021

+ +

After short pause for the summer holiday, welcome back to this new installment of the JBoss Editorial! As always, the JBoss community has been quite active and there is quite a lot to cover today, especially on hybrid cloud and Kogito. Let’s dive right in!

+
+

Hybrid Cloud

+
+

During the last weeks, Christina Lei did a quite interesting series of articles on hybrid cloud. After an overview of making hybrid cloud, she explores some in-depth topic like dynamic security or observability. To conclude this serie, another article covers hosting and managing on hybrid cloud.

+
+
+
+

Kogito this and Kogito that!

+
+

With the new release of Kogito 1.9.1, it’s time to explore (maybe again) all the potential of this framework. And fortunately, there are a lot of in-depth articles released recently doing just that! Let’s start with one on how to capture decisions using DMN followed by a tutorial on how to implement task’s deadline with Kogito.

+

Once you get the hang of it, you’ll want to learn how to manage your BPMN and DMN assets on gitpod.io. Or explore event-driven decisinning with AMQ streams and Kogito. If those articles have but open your appetite for the framework, you can carry on with a tutorial on how to develop better widgets or how to add data from KIE server for authoring dashboards.

+
+
+
+

Techbytes

+
+

Want to learn more? Don’t worry, we have few more intriguing technical articles for you:

+ +
+
+
+

Releases

+
+

As always, the JBoss community has been releasing new version at a steady stream:

+ +

That’s all for today! Please join us again in two weeks for another installment of our JBoss editorial! Stay safe and healthy in the meantime.

+
+
+ +
+ + Romain Pelisse + +
+ ]]>
+ + Romain Pelisse + do-not-reply@jboss.com + https://www.jboss.org/people/romain-pelisse + + + + + + + +
+ + <![CDATA[This Week in JBoss - 14 July 2021]]> + https://www.jboss.org/posts/weekly-2021-07-14.html + + 2021-07-14T00:00:00.000Z + +

This Week in JBoss - 14 July 2021

+ +

Welcome to this edition of the JBoss Editorial bringing you news and updates from the community.

+
+

From the community

+
+

In this post the Narayana team begins a new blog series on Long Running Actions, a compensation-based approach to transactions.

+

The KIE Tooling team announce the new DMN Runner on dmn/new.

+

Gabriele Cardosi provides a concrete example of a recommendation engine based on top of PMML in Shopping recommendations in PMML.

+

Luca Molteni teaches us How to start contributing to Drools Executable Model

+

Eric Schabell continues his blog series on Cloud Adoption with a an Example adoption architecture.

+

Read this post by Jeff Mesnil to learn how to Run WildFly Preview of Jakarta EE 9.1 with Bootable Jar.

+
+
+
+

Developers on film

+
+

We don’t just publish blog posts! Here’s some recordings of live community events that happened over the past 2 weeks.

+ +
+
+
+

Releases

+
+
+ +
+
+
+ +
+ + Paul Robinson + +
+ ]]>
+ + Paul Robinson + do-not-reply@jboss.com + https://www.jboss.org/people/paul-robinson + + + + + + + + +
+ + <![CDATA[This Week in JBoss - 01 July 2021]]> + https://www.jboss.org/posts/weekly-2021-07-01.html + + 2021-07-01T00:00:00.000Z + +

This Week in JBoss - 01 July 2021

+ +

Hello! Welcome to another edition of the JBoss Editorial that brings you news and updates from our community.

+
+

Release roundup

+
+

Congrats to all the teams on their hard work!

+
+ +
+
+
+
+

From the community

+
+

Karina Varela has a post about automating rule-based services with Java and Kogito up on the Red Hat Developer Blog. The post focuses on Kogito and using it to build, package, and automate the deployment of those rule-based services on Kubernetes and OpenShift!

+

James Falkner quickly tackles RESTEasy Reactive in Quarkus 2.0 over on the Red Hat Developer Blog. With the release of Quarkus 2.0 there are a number of things that have improved. Using REST in a reactive way is one of them. Quarkus 2.0 utilizes Eclipse Vert.x 4 and does some optimizations at build time to further increase performance of REST services.

+

If you’re using Red Hat 3scale API Management and have a need to use WebSockets, be sure to check out Srikanth Kalluru’s blog post for a quick three step walk through of how to get it done!

+

Mauro Vocale has a three part series, part four is not out yet, about moving Java programs to the cloud. Part one introduces you to the legacy application and gets it up and running on OpenShift. This gets you familiar with what the application does and what to expect from further refactorings in subsequent posts. In part two the application will move from Java 8 to Java 11, JBoss EAP 7.3 and Jakarta EE. Lastly, in part three the application will be moved to microservices. Additional monitoring tools will be introduced including Prometheus and Jaeger. The application will be updated for handling restarts, health checks, and other configuration settings.

+

Over in the BPM arena, there are three posts to take a look at: Custom logic in BPMN by Kirill Gaevksii, How to start contributing to Drools executable model where Luca Molteni discusses getting your feet with contributing to Drools’s "Executable Model Compiler". Lastly, Matteo Mortari discusses using Drools DMN and Apache Camel to intelligently route Kafka messages. It includes a video as well as various examples and code to really sink your teeth into.

+

Wildfly 24.0.0.Final includes a preview of Jakarta EE 9.1 features. Jeff Mesnil discusses how to try these features out using a bootable jar. There’s also a section about getting up and running using OpenShift!

+
+
+
+

Developers on film

+
+

Get your popcorn ready and sit back to watch some videos from our community. +Here are my top picks for this week’s editorial:

+ +
+
+ +
+ + Jason Porter + +
+ ]]>
+ + Jason Porter + do-not-reply@jboss.com + https://www.jboss.org/people/jason-porter + + + + + + + +
+ + <![CDATA[This Week in JBoss - 18 June 2021]]> + https://www.jboss.org/posts/weekly-2021-06-18.html + + 2021-06-18T00:00:00.000Z + +

This Week in JBoss - 18 June 2021

+ +

Hello! Welcome to another edition of the JBoss Editorial that brings you news and updates from our community.

+
+

Release roundup

+
+

Congrats to all the teams on their hard work!

+
+
    +
  • +

    Keycloak 14.0.0 is released! This release adds Financial-grade API (FAPI) support and lots of improvements.

    +
  • +
  • +

    Byteman 4.0.16 has shipped and is now the latest version if you’re running Java version 9 to 17.

    +
  • +
  • +

    WildFly 24 is here and brings lots of awesome work. There’s too much to sum up here so click the link and check out the release notes.

    +
  • +
  • +

    Quarkus 2.0.0.CR3 is here. Towards 2.0 final!!

    +
  • +
  • +

    Quarkus 1.13.7.Final is available as a maintenance release.

    +
  • +
  • +

    Eclipse Vert.x 4.1.0 is available with lots of exciting features. Go download and start using it!

    +
  • +
  • +

    Eclipse Vert.x 3.9.8 is also here with numerous bug fixes.

    +
  • +
  • +

    Narayana 5.12.0.Final has been shipped. This version gives several enhancements and fixes some bugs. Go grab it!

    +
  • +
+
+
+
+
+

From the community

+
+

Katia and Ryan on the Infinispan team released a nice two-part series of posts that explained how they built an online game across data centers and multiple cloud providers for this year’s Summit keynote demonstration. +In the first part, Building a real-time leaderboard with Infinispan and Quarkus on a hybrid Kubernetes deployment, Katia and Ryan describe how they designed and implemented various services using Infinispan and Quarkus. +With part two, they explain how using the Infinispan Operator greatly reduced the complexity of standing up their clusters, Creating and managing Infinispan services in the hybrid cloud.

+

Tommaso Teofili’s recent post, Autotuning LIME explanations with few predictions, outlines how to automatically tune LIME hyperparameters to achieve more stable explanations and comes with a PR that lets you dig into all the technical aspects covered in the post.

+

RHPAM connectivity to external AMQ configurations in OpenShift by Michael Perez takes an in-depth look at connecting to an external AMQ with the aim of lowering the memory footprint for RHPAM pods as well as other deployment optimizations. +It’s an interesting read with good technical considerations to sink your teeth into so go give it a look.

+

Over on the WildFly blog, Jeff Mesnil walks us through the process of changing logging levels for cloud-based WildFly applications on the fly. +Take a look at Jeff’s script and straightforward commands to help you easily modify logs for debugging in his post, How to Change Logging Level for WildFly on the Cloud.

+

Bilgin Ibryam is back with a post on the Red Hat Developer blog titled Application modernization patterns with Apache Kafka, Debezium, and Kubernetes. +I really enjoyed this one as Bilgin expertly puts application modernization in context and examines different patterns, tools, and open-source ecosystems that can help you migrate brown-field systems to more modern, event-driven services as well as design green-field services that are future proof by providing the ability to evolve over time. +Be sure to catch up on this one if you haven’t already read it.

+

Just in time for your summer reading list the first book dedicated to Keycloak has been published, Keycloak - Identity and Access Management for Modern Applications. +Congrats to authors Stian Thorgersen and Pedro Igor Silva. +It’s an impressive achievement and no doubt the book is full of invaluable expertise.

+
+
+
+

Evangelist’s corner

+
+

In our last editorial we mentioned Eric Schabell’s series on a retail data framework. +Since then Eric has obviously been hard at work as his next two posts in the series, Retail data framework - Common architectural elements and Retail data framework - Example data architecture. +If you haven’t caught up on that series yet, then I highly recommend taking a look to learn about data flows and management in a retail context.

+

Eric has also posted the first in his next series, Cloud adoption - An architectural introduction. +This series is focused on proven integrations, structures, and interactions with the goal of enabling readers to implement and adopt cloud-based solutions using open-source technologies. +I’m really excited about this series and can’t wait to see what Eric brings in his next posts.

+
+
+
+

Developers on film

+
+

Get your popcorn ready and sit back to watch some videos from our community. +Here are my top picks for this week’s editorial:

+ +
+
+ +
+ + Don Naro + +
+ ]]>
+ + Don Naro + do-not-reply@jboss.com + https://www.jboss.org/people/don-naro + + + + + + + + + +
+ + <![CDATA[This Week in JBoss - 31 May 2021]]> + https://www.jboss.org/posts/weekly-2021-05-31.html + + 2021-05-31T00:00:00.000Z + +

This Week in JBoss - 31 May 2021

+ +

Hello! Welcome to another edition of the JBoss Editorial that brings you news and updates from our community.

+
+

Hello again

+
+

To our community and all our readers,

+

I’d like to start this edition with a sincere and frank apology on behalf of the editorial team for the posts we missed in the last month.

+

There’s been a lot of awesome content that our community has shared and multiple project releases packed with useful new features and clever enhancements. +We’re long overdue in highlighting and celebrating all the great work that JBoss teams are doing, not to mention all the brilliant work of our evangelists and other contributors.

+

It’s been a busy past few weeks and we’ve got a lot of great articles and releases to catch up on, so let’s go.

+
+
+
+

Release roundup

+
+

Let’s start things off with congrats to all the teams on their hard work!

+
+ +
+
+
+
+

Quarkus 2 AMA

+
+

With the recent release of Quarkus CR2, I’m sure we’re all anticipating Quarkus 2.0 GA. +As part of that release, Max and the rest of the Quarkus team are taking questions that they will answer on an episode of Quarkus Insights. +Use the #quarkusinsights tag to submit a question via social media and tune in to Quarkus Insights #51: Q & A - Part II on June 2 to hear your questions answered.

+

Follow the social media links to post your question to the Quarkus team in their post, About to release Quarkus 2 - ask us anything!

+
+
+
+

From the community

+
+

Jeff Mesnil has authored a very helpful and detailed look at building and deploying WildFly applications on OpenShift using Helm Charts in his post, Helm Chart for WildFly

+

Over on the Infinispan blog, Ryan Emerson has shared some details about the CLI compiled to a native image in Infinispan Native CLI, which is well worth a read. +You should also try downloading the latest Infinispan 12 server version and taking it for a spin with the native CLI!

+

Another recent one from the Infinispan team comes from Katia Aresti who, along with Ryan Emerson, explains how they built a real-time leaderboard using Data Grid and several Quarkus extensions to add some magic to this year’s Red Hat Summit Keynote.

+

Jacopo Rota on the Kogito blog explains how to how to deploy a Kogito service together with the TrustyAI infrastructure on an OpenShift cluster in only 15 minutes!

+

Have you been wanting to find out more about Shenandoah GC? Well, you should dive right in and check out Roman Kennke’s informative post, Shenandoah garbage collection in OpenJDK 16: Concurrent reference processing.

+

Bilgin Ibryam has recently posted Data Gateways in the Cloud Native Era that examines how data gateway components support different use cases and offer a solution for hybrid workloads spread across multiple cloud providers.

+

Last but certainly not least is Claus Ibsen’s webinar, Integrate systems in the age of Quarkus and Camel, that explores how the trio of Camel Quarkus, Camel K, and Kamelets simplify the work to manage and bind systems together.

+
+
+
+

Evangelist’s corner

+
+

Eric Schabell never disappoints and his previous series on architectural elements in a real-time stock control solution for retail was no exception. +Eric rounds that series off nicely with Real-time stock control - Example stock control architecture.

+

Not one to rest for long, Eric Schabell launches a new series that tackles how to create a framework for accessing retail data from customers, stock, stores, and staff across multiple internal teams. +I’m sure it’s going to be a brilliant series so go have a look for yourself and find out more in his post, Retail data framework - An architectural introduction.

+

I also really enjoyed reading through Christina and Eric’s Tooling guide for Getting Started with Apache Camel in 2021. +It’s a well put together beginner’s guide to tools that can help with Camel applications.

+
+
+
+

Developers on film

+
+

Get your popcorn ready and sit back to watch some videos from our community. +Here are my top picks for this week’s editorial:

+ +
+
+ +
+ + Don Naro + +
+ ]]>
+ + Don Naro + do-not-reply@jboss.com + https://www.jboss.org/people/don-naro + + + + + + + + + +
+ + <![CDATA[This Week in JBoss - 26 April 2021]]> + https://www.jboss.org/posts/weekly-2021-04-26.html + + 2021-04-26T00:00:00.000Z + +

This Week in JBoss - 26 April 2021

+ +

Welcome to another - slightly delayed, installment of our JBoss Editorial! If anything, the last two weeks in the Jboss community has been all about Quarkus and Kogito. Indeed, you’ll find in this post a trove of information and news on the two projects. But also, an exciting opportunity on Keycloak! Without any further ado, let’s jump right in.

+
+

Keycloak wants you!

+
+

If you are developers who is passionate about Keycloak, there is an opportunity of a lifetime for you! The keycloak team is indeed recruiting!.

+

Also on the SSO project front, there is a cool post on how to integrate Red Data Grid with RHSOO (Keycloak). Go check it out!

+
+
+
+

Kogito your way out of Dodge!

+
+

First of all, a few days ago, yet another (see "Developers on film" below) OpenShift commons briefing around Kogito was delivered (19/04). If the video is (not yet) available, you can checkout the examples code from Github.

+

Then, you may want to catchup on all the cool features released in the last weeks by the project.

+

If you are a user of VSCode, there are a few items for you. First, you can go and check out the score card editors now online. Second, there is a rather tutorial on using the test scenario editor to validate your DMN assets in VSCode.

+
+
+
+

Evangelist’s Corner: Off with their head!!!

+
+

With the Red Hat Summit coming up tomorrow, you may want to check out this post of our very own Eric D. Schabell on the new format we are trying out this year: Red Hat Summit: How to enjoy this three-part event series.

+

On top of that, Eric has, as always, delivered a steady stream of content in the past weeks, with a focus on headless architecture. It started with a first post on Headless eCommerce - An architectural introduction, to which he did a followup on: Headless eCommerce - Common architectural elements.

+

Headless architecture was also part of the Store health and safety architectural introduction, which also was followed up by a post on Store health and safety common architectural elements.

+
+
+
+

Quarkus tips and tricks

+
+

As mentioned in our introduction, Quarkus has been the focused on many content released in the last weeks. On top of that, as you’ll see in the releases section of this editorial, the project has released not one, but two versions, including an alpha of the upcoming Quarkus 2.0.

+

Let’s first take a look at the content relating to Quarkus as a development platform. If you are still new to Quarkus, you may want to start then with this post about deploying Quarkus everywhere with RHEL. After that, still on the topic of packaging and deployment, you can learn how to build even faster Quarkus applications with Fast jar.

+

If you are already onboard Quarkus and his very neat development model, you’ll be quite happy to learn that Mandrel, a specialized distribution of GraalVM for Quarkus is coming up!

+

As you may be aware, Quarkus comes already with quite a few supported extensions, but you may still want to learn more about custom extensions and which problems they can help you solve.

+

If you are already running or developing a few webapps on Quarkus, you’ll be interested in learning how to add eye candy to it.

+
+
+
+

Developers on film

+
+

No time to read anything? What about relaxing and simply watching some nice technical videos instead?

+ +
+
+
+

Release, release, release…​

+
+

As always, the JBoss community has been quite active and released a few major version in the last weeks:

+ +
+
+
+

Decaf'

+
+

Enough Java? Too much jitters? Wants a palate cleanser? Here you with a cool two-part series on deploying the Mosquitto MQTT broker on OpenShift: (part 1) and (part2).

+

That’s all for today! Please join us again in two weeks for another installment of our JBoss editorial! Stay safe and healthy in the meantime.

+
+
+ +
+ + Romain Pelisse + +
+ ]]>
+ + Romain Pelisse + do-not-reply@jboss.com + https://www.jboss.org/people/romain-pelisse + + + + + + + +
+ + <![CDATA[This Week in JBoss - 8 April 2021]]> + https://www.jboss.org/posts/weekly-2021-04-08.html + + 2021-04-08T00:00:00.000Z + +

This Week in JBoss - 8 April 2021

+ +

Hello! Welcome to another edition of the JBoss Editorial that brings you news and updates from our community.

+
+

Release roundup

+
+

Let’s start things off with congrats to the teams on their hard work!

+
+
    +
  • +

    Infinispan 12.1.0.Final is released!
    +This version of Infinispan, codenamed Taedonggang, includes a bunch of new features and fixes. Be sure to check out the announcement and start using it right away.

    +
  • +
  • +

    Quarkus 1.13 and Quarkus 1.13.1.Final are now available with loads of great new features and improvements.

    +
  • +
+
+

Our very own Bela Ban has also recently finished off the work on JGroups 4.2.12 and JGroups 5.1.6. +While there might not be an "official" annoucement on his blog, you can check Bela’s commit history for details.

+
+
+
+

From the community

+
+

Let’s take a look at what’s been happening in the community since our last editorial.

+

First up is a post by Hao Wu, How to Interact with Business Processes Using Camel Routes, that neatly explains using Apache Camel to interact with business processes deployed in a KIE server.

+

Rebecca Searls, over at the RESTEasy blog, recently added a post titled JAX-RS ParamConverter with Quarkus that shows how to write RESTful services with Quarkus using the JAX-RS ParamConverter.

+

Eric Schabell has, yet again, delivered some great posts recently that demonstrate how community technology can solve real world business problems.

+

Finishing off a series of articles on point of sale architectures, Eric delves in a specific example in his post, Point of sale - Example image distribution architecture. +Be sure to check the links at the end of the post in case you missed any of the other articles in his architecture blueprint for point of sale imaging in retail.

+

Not one to rest, Eric kicks things off with another series to share an architectural blueprint for the use case of deploying a container-based eCommerce website while moving away from tightly coupled existing eCommerce platform.

+

This first article in this series is Headless eCommerce - An architectural introduction, which gives you an outline for the use case.

+

Eric then continues the series with his post, Headless eCommerce - Common architectural elements. +In this article, Eric goes into detail on common generic elements that make up the architecture blueprint for the headless eCommerce use case.

+

Stay tuned for the rest of Eric’s series! +I’m sure there’s lots more great information on the way.

+
+
+
+

Red Hat developer network

+
+

James Falkner talks us through what’s new with the beta release of JBoss EAP 7.4 beta, including an detailed look at security and management improvement. +What to find out what’s going on? Take a few minutes and read his post, Security and management improvements in Red Hat JBoss Enterprise Application Platform 7.4 Beta.

+

Pasquale Congiusti also breaks down Camel K’s Kamelets and shows how they simplify complex system integration in his post, Design event-driven integrations with Kamelets and Camel K.

+
+
+
+

Developers on film

+
+

Get your popcorn ready and sit back to watch some videos from our community. +Here are my top picks for this week’s editorial:

+ +
+
+ +
+ + Don Naro + +
+ ]]>
+ + Don Naro + do-not-reply@jboss.com + https://www.jboss.org/people/don-naro + + + + + + + + +
+ + <![CDATA[This Week in JBoss - 25 March 2021]]> + https://www.jboss.org/posts/weekly-2021-03-25.html + + 2021-03-25T00:00:00.000Z + +

This Week in JBoss - 25 March 2021

+ +

Welcome to another edition of the JBoss Editorial where we search through the JBoss Community for interesting articles and updates

+
+

Introducing the prolific Eric Schabell

+
+

If you are a regular reader of the JBoss Editorial you will be very familiar with the work of Eric Schabell, arguably one of the most prolific writers within the JBoss Community. This edition is no different and sees Eric product three more articles.

+

Eric’s first article is a continuation of his Supply Chain Integration Blueprint discussion. In this article Eric expands on the common architectural elements discussed previously and outlines an example Store integration architecture for Supply Chain integration.

+

Eric’s second article walks us through the necessary steps for installing and running the OpenShift Container Platform 4.7 on our local machines.

+

Eric’s final article kicks off a new series of articles within which he will introduce a new architectural blueprint covering "Simplifying and modernizing central management of distributed point-of-sale devices with built in support for container based applications".

+
+
+
+

What’s new in Kogito land?

+
+

The Kogito team have been busy over the last few weeks publishing a number of interesting blog posts covering different aspects of the Kogito ecosystem.

+

We begin our coverage with an article written by William demonstrating how to integrate metrics from a Prometheus datasource into the Business Central. The article walks you through the process from the creation of the data set within Dashbuilder, building the dashboard, how to consider filtering requirements and how to test the dashboard.

+

The next article, written by Manaswini, follows on from William’s article and demonstrates how you can further extend your dashboard through the integration and visualisation of time series data.

+

The final article, written by Ricardo, introduces us to Kogito’s support for the CNCF Serverless Workflow specification, allowing Kogito to provide a serverless interface to a service which can also be used to orchestrate RESTful services described through the OpenAPI standard.

+
+
+
+

Clustering WildFly using DNS ping

+
+

When running within a kubernetes environment it is natural to consider the KUBE_PING protocol for cluster discovery, a protocol relying on the ability to query the kubernetes API server. If you want to remain agnostic of your environment, or if you do not have sufficient permissions to query the kubernetes API server, then an alternative approach to consider would be the DNS_PING protocol as demonstrated by Yeray using a simple WildFly bootable JAR application.

+
+
+
+

Optimizing Camel 3.9, no more saw tooth JVM garbage collection

+
+

The upcoming Camel 3.9 release will include some additional, significant improvements in the performance of the internal routing engine leading to a dramatic reduction in object allocation during continuous use. The Camel team focussed on the five major areas of the codebase they had identified during performance testing with the intention of reducing the allocation count as much as possible, they managed to go one better and achieved a sustained object allocation count of zero! For more information take a look at Claus' blog describing the effort.

+
+
+
+

Monitoring Quarkus applications on OpenShift

+
+

If you are running a Quarkus application on OpenShift you will most likely have a need for integrating with the centralised prometheus instance within the cluster. This integration is fairly straight forward and can be achieved after following only a few simple steps as ably demonstrated by Jose.

+
+
+
+

New Releases

+
+
+ +
+

That’s all for this edition of the JBoss Editorial, please join us in a couple of weeks when we will bring you more news and articles from the JBoss Community Projects.

+
+
+ +
+ + Kevin Conner + +
+ ]]>
+ + Kevin Conner + do-not-reply@jboss.com + https://www.jboss.org/people/kevin-conner + + + + + + + + + + +
+ + <![CDATA[This Week in JBoss - 11 March 2021]]> + https://www.jboss.org/posts/weekly-2021-03-11.html + + 2021-03-11T00:00:00.000Z + +

This Week in JBoss - 11 March 2021

+ +

Hello! Welcome to another edition of the JBoss Editorial that brings you news and updates from our community.

+
+

Release roundup

+
+

Let’s start things off with congrats to all the teams on their hard work!

+
+ +
+
+
+
+

From the community

+
+

There’s been a lot of activity since the last editorial so let’s take a look.

+

First up is Ramon Gordillo’s rather interesting take on moving legacy technology on Kubernetes. +Ramon starts by pointing out that even software that is considered "legacy" and traditionally on-prem is often packed with new and useful features. +Add to that the fact that many containerized applications still rely on legacy systems - "not all apps are greenfield" - and he builds a solid case for doing something that might otherwise induce a few gasps. +Go see how Ramon tackles running IBM DB2 in containers, Trying DB2 in Kubernetes for developers.

+

Migrating jBPM images secured by LDAP to Elytron by Gonzalo Muñoz Fernández is one that I thoroughly enjoyed. +If you’re not familiar with Elytron it is, as Gonzalo explains, Wildfly’s security framework that puts security management and application access into a single subsystem. +In his post, Gonzalo clearly describes and then steps through how to migrate jBPM images from PicketBox, which is a security subsystem based on JAAS login modules, over to Elytron.

+

Also on the Kogito blog, Paul Brown and Emily Murphy take on the challenge of Optimizing COVID-19 vaccination appointment scheduling. +Their post details the approach for using OptaPlanner to handle planning constraints and automatically assign vaccination appointments. +Getting vaccinations rolled out globally is a massive logistical and planning challenge so it’s comforting to know our community is providing tooling to get us all back to "normal".

+

The Red Hat Developer blog has a couple of recent entries focused on JavaScript that are both good reads.

+

Michael Dawson introduces us to the Node.js reference architecture from Red Hat and IBM and explains their reasons for creating it. +The goal is to help developers make good choices when navigating the vibrant and extensive JavaScript ecosystem by recommending packages based on shared experience across teams and projects.

+

Joel Lord takes us through Building rootless containers for JavaScript front ends to demonstrate how you can avoid security vulnerabilities and potential disaster.

+
+
+
+

Evangelist’s corner

+
+

Our ever productive Eric Schabell has brought us some fantastic content that should really get you thinking about community technology can apply to solve real world business problems.

+

Similarly to James and Emily’s post on the Kogito blog, Eric shows how retail pharmacies can optimize scheduling to provide customer vaccinations.

+

Eric also provides a architectural blueprint for supply-chain integration that comes with a treasure trove of resources and is well worth delving into.

+
+
+
+

Developers on film

+
+

Get your popcorn ready and sit back to watch some videos from our community. +Here are my top picks for this week’s editorial:

+ +
+
+ +
+ + Don Naro + +
+ ]]>
+ + Don Naro + do-not-reply@jboss.com + https://www.jboss.org/people/don-naro + + + + + + + + +
+ + <![CDATA[This Week in JBoss - 25 February 2021]]> + https://www.jboss.org/posts/weekly-2021-02-25.html + + 2021-02-25T00:00:00.000Z + +

This Week in JBoss - 25 February 2021

+ +

Welcome to another installment of our JBoss Editorial! Today, we’ll focus on Kogito and the upcoming major release of Wildfly. Enjoy!

+
+

Wildfly 23 Beta: Microprofile

+
+

As the release of the next major version of Wildlfy is coming up soon, Brian Stanberry took the time to write up a brief article on the progress with MicroProfile. If you have interested in playing with MicroProfile Platform 4.0 or see tech preview support for MicroProfile Reactive Messaging 1.0, go check out Wildfly 23 Beta1 and let us know what you think!

+
+
+
+

Kogito

+
+

If you are already a Kogito user or if you are interested in exploring this software, there were a few articles released in the past two weeks that you might find interesting. The first one is on Kogito Notification API which is followed nicely by the second one on Event-driven decisions with Kogito

+

If you want something more practical, you’ll certainly enjoy the third article on 3 steps to author BPMN and DMN assets on GitHub Codespaces

+
+
+
+

Quarkus: Fast jar as default, Multipart support for RESTEasy Reactive

+
+

Following up the recent release of Quarkus 1.11.3.Final, Quarkus 1.12 was just released and includes some exciting new features. First, fast jar is now by default and the framework added multipart support for RESTEasy Reactive. Go check it out!

+

And if you have not yet looked into Quarkus, a new tutorial has been released: Enhancing the development loop with Quarkus remote development, so it’s the perfect opportunity to explore the framework potential and test it over OpenShift.

+
+
+
+

Evangelist’s Corner

+
+

As always, our very own Eric Schabell has provided the community with quite a lot of content in the last two weeks. First, you have a nice introduction to Business optimization architecture, which can be followed by this other piece on Business optimization architecture - Common architectural elements.

+

Of course, Eric has not forgotten the famous OpenShift and delivered a pretty nifty RefCard - Getting started with OpenShift published for DZone. Go grab it!

+
+
+
+

Releases!

+
+ +

That’s all for today! Please join us again in two weeks for another installment of our JBoss editorial! Stay safe and healthy in the meantime.

+
+
+ +
+ + Romain Pelisse + +
+ ]]>
+ + Romain Pelisse + do-not-reply@jboss.com + https://www.jboss.org/people/romain-pelisse + + + + + + + + + + +
+ + <![CDATA[This Week in JBoss - 11 February 2021]]> + https://www.jboss.org/posts/weekly-2021-02-11.html + + 2021-02-11T00:00:00.000Z + +

This Week in JBoss - 11 February 2021

+ +

Here we are again, it’s been two weeks and we’re into the second month of 2021! +How quickly times flies! +In this edition, expect to find release information, blog posts, and general updates from around the JBoss Community.

+
+

Releases!

+
+
+
    +
  • +

    Quarkus 1.11.2.Final is the second maintenance release for the Quarkus 1.11 branch. The notable bug fix with this version is updating to Hibernate ORM 5.4.27.SP1 which fixes a potential data loss issue. Please see the full changelog for more info.

    +
  • +
  • +

    Quarkus 1.11.3.Final is a quick bug fix release that focused on a regression making it impossible to build native executables if your project was using both RESTEasy and OpenTracing. Please see the full changelog for more information.

    +
  • +
  • +

    Wildfly 22.0.1 has been released, about a month after 22.0.

    +
  • +
  • +

    Vert.x 4.0.2 released recently. The 4.0.1 release also happened, but contained potential memory leaks and the team decided not to announce it and proceed with another quick release to fix the issues. Please view the release notes for more details.

    +
  • +
  • +

    Kogito Tooling 0.8.3 released a few days ago. With the release of 0.8.1, the Kogito team released their official version of the BPMN and DMN standalone editors. This release builds on that and continues to allow you to embed the editor within your application. It also allows you to open DMN 1.1 and 1.3 assets. The post also contains a list of bugs squashed

    +
  • +
+
+

We would certainly like to thank all those who helped complete these releases! +Each team is grateful for the help from the community.

+
+
+
+

Highlights from the blogosphere

+
+

Eric Schabell published a migration guide for a traditional JBoss BPM application running either within a VM or on bare-metal to running inside containers using OpenShift Container Platform. +In his post he breaks the migration down into four steps. +I won’t detail them all here, but the steps are very easy and you should be able to get up and running quickly on your own laptop, even without having some of the tech installed previously!

+

Abhishek Kumar discussed project authoring improvements within Business Central recently on the KIE Blog. +The features he discusses are: +. Opening projects directly with a URL +. Changing the default asset page size +. Security permissions for project screen tools and tabs

+

Each of these help users in the authoring process within Business Central through either ease of use or security!

+

Still on the KIE Blog, Yeser Amer demonstrates how to use PMML models in the DMN Editor. +PMML support was released with version 0.7.0. +PMML is an XML file describing a predictive model often generated by data mining or AI algorithms. +The support for this format within the VSCode plugin was recently released and follows the same usage patterns as those found within Business Central, so it may very well be familiar to some.

+

A number of blogs about Quarkus sprang up over the past couple of weeks!

+

Firstly, Georgios Andrianakis discusses achieving massive performance without headaches in a RESTEasy application on Quarkus using RESTEasy Reactive. +He talks about the different models, how to use them, the best way to get performance out of each model, and why this will likely becoming the default model within RESTEasy on Quarkus in the near future.

+

Clement Escoffier helps us get started with AMQP in Quarkus with an in-depth demo similar to using Kafka. +He walks you through the basics and gives you a running project which he steps through to show you all the basics.

+

Over on the Red Hat Developers Blog, Eric Deandrea shows us a very cool trick, or maybe the power of Quarkus’s Spring compatibility, about running a Spring Boot application on Quarkus without changing a single line of Java code! +It is definitely worth the read, head on over to check it out!

+

If you missed the announcement about Quarkus remote development, be sure to read up about it by Daniel Oh on the Red Hat Developer Blog. +Using a mutable-jar package, you can deploy onto OpenShift and continue to develop remotely without having to build a new container and push every time you want to see a change! +What an amazing way to build on the cloud and make sure everything works correctly without having slow downs!

+

Yeray Borges of the Wildfly team demonstrates how to deploy a bootable Wildfly application jar which caches the HTTP session state. +It’s a useful option allowing you to build and test locally and then push to OpenShift with minimal changes ensuring your application still works in the cloud.

+

Lastly, Mario Fusco and Edson Yanaga have a presentation from a recent DevNation Live about designing a Java API. +Check it out over on the Red Hat Developer blog. +Certainly worth the watch if you develop APIs in Java (which should be most of you).

+

Thanks for being with us for another edition of the JBoss Weekly Editorial.

+
+
+ +
+ + Jason Porter + +
+ ]]>
+ + Jason Porter + do-not-reply@jboss.com + https://www.jboss.org/people/jason-porter + + + + + + +
+ + <![CDATA[This Week in JBoss - 28 January 2021]]> + https://www.jboss.org/posts/weekly-2021-01-28.html + + 2021-01-28T00:00:00.000Z + +

This Week in JBoss - 28 January 2021

+ +

Hello! Welcome to another edition of the JBoss Editorial that brings you news and updates from our community.

+
+

Releases!!

+
+

Infinispan 12 release, codenamed Lockdown, brings a ton of new features and improvements. +Indexing and querying capabilities have seen a number of improvements with the help of Hibernate Search integration. +ProtoStream marshalling is upgraded with a new @ProtoAdapter annotation that lets you easily integrate third-party classes. +It’s a pretty elegant solution to what could present itself as a real headache for developers. +Speaking of marshalling improvements, Infinispan 12 also makes your life easier by automatically generating and registering SerializationContextInitializer implementations to marshall user types. +Also notable is the SPI for cross-site replication merge conflicts, which continues on the brilliant work that team has done to provide a solution for ensuring data integrity. +There’s a lot going on in Infinispan 12 and probably too much to try and sum up here so why not head over and read all the details in the Infinispan 12.0.0.Final Announcement.

+

Congratulations to the entire Infinispan team on all the hard work.

+

Quarkus 1.11 is here! +This release brings you RESTEasy Reactive, which is a new JAX-RS implementation for writing RESTful services. +Quarkus 1.11 also introduces the Dev UI so you can quickly visualize all your loaded extensions, access docs, and more. +Of course there are other things in Quarkus 1.11 but RESTEasy Reactive and the Dev UI look to be quite promising indeed.

+

The Quarkus team keep things rolling with the release of Quarkus Tools for IntelliJ 1.3.0 that adds codestarts to the Quarkus project wizard.

+

Keycloak 12.0.2 is now available too! +Head on over to their site and check it out.

+
+
+
+

WildFly Bootable JARs on OpenShift

+
+

Emmanuel Hugonnet shows you how to use WildFly’s bootable JAR feature and the odo CLI tool to easily build and deploy applications on OpenShift.

+
+
+
+

Getting Started with Apache Kafka in Quarkus

+
+

Clement Escoffier details how to get you started with Apache Kafka in Quarkus applications in less than 10 steps using Reactive Messaging. +Clement provides a GitHub repository with the code too so take a look at his Getting Started with Apache Kafka.

+
+
+
+

Easing the Keycloak integration tests in Kie Server with Testcontainers

+
+

Over at the Kie blog, Gonzalo Muñoz Fernández demonstrates using Testcontainers to quickly and easily create integration tests with Kie Server and Keycloak.

+
+
+
+

RESTEasy WADL Module in WildFly

+
+

Wei Nan gives a straightforward example of deploying the RESTEasy WADL module into WildFly.

+
+
+
+

Quarkus Insights: Hibernate Search 6

+
+

Have you subscribed to the Quarkusio YouTube channel yet?

+

If not, head over and take a look. +There are always interesting discussions and cool speakers.

+

One recent video that I really enjoyed, and is timed well with the release of Infinispan 12, is Episode #32 where Yoann Rodière joins the lads and introduces us to Hibernate Search 6. +Yoann goes through all the exciting new stuff in Hibernate Search and explains how the search API gives you accurate and flexible full-text search for applications to overcome the limitations that come from SQL queries.

+
+
+
+

Apache Camel and Java Flight Recorder

+
+

Claus Ibsen’s recent Apache Camel 3.8 and Java Flight Recorder post breaks down how you can capture work steps with Flight Recorder to diagnose Apache Camel and improve performance.

+
+
+
+

Red Hat Developer Highlights

+
+

In another Flight Recorder post, Andrew Azores gives us a great tutorial on using JDK Flight Recorder for containers running on OpenShift.

+

Finally, there is a great DevNation Tech Talk by Sebastien Blanc and Edson Yanaga on Building kubectl plugins with Quarkus.

+
+
+ +
+ + Don Naro + +
+ ]]>
+ + Don Naro + do-not-reply@jboss.com + https://www.jboss.org/people/don-naro + + + + + + + + +
+ + <![CDATA[This Week in JBoss: 14 January 2021]]> + https://www.jboss.org/posts/weekly-2021-01-14.html + + 2021-01-14T00:00:00.000Z + +

This Week in JBoss: 14 January 2021

+ +

Welcome to the first installment of our JBoss Editorial for 2021! And to start the year, we have a brand new major release of the core product of the JBoss community! Yes, Wildfly 22 is out!

+
+

Wildfly 22 and Camel 3.7

+
+

Yes! We have a brand new major version of Wildfly! Wildfly 22 is out!.

+

This release includes support for use of log4j2 in applications, new base health and metrics subsystems to provide server observability for users who don’t need the application instrumentation that comes with MicroProfile Health and Metrics, and a number of other features related to management, provisioning, messaging and security. Plus numerous bug fixes, enhancements and component upgrades.

+

On top of that, there is also an updated version of the new tech-preview WildFly Preview distribution. This will allow the community have a look at what Wildfly developers are doing for Jakarta EE 9 support, along with other changes in the server architecture that are expected to appear later in 2021.

+

Wildfly 22 is already a nice treat, but we also have Camel 3.7, which also quite exciting, and fortunately for all of us, Claus Ibsen has published a review of what he called the fastest Camel ever! So, go check it out if you want to know more about this camel release.

+
+
+
+

Tech bytes

+
+

A few interesting technical articles came out in the last weeks, so we’ll try to catch you up with three of them here. First, we have an excellent one from Bela Ban on running JGroups raft as a service. It’s very hands on post, focusing on getting everything running. Then we have a longer walkthrough to let you experiment on using Spring boot embedded cache with Infinispan on Kubernetes. Certainly, worth a look, isn’t it? The last one is, of course, on Quarkus, because Quarkus is, as it should, all the rage lately. In this article, Clément Escoffier took the time to explain some of the magic beneath Quarkus and Vert.x and why this is the kind magic you to have as a developer.

+
+
+
+

Evangelist’s Corner

+
+

As always, our very own Eric Schabell has been busy in the few last weeks and released a steady stream of new content. First, he published part4 - Installing business automation operator of his series on CodeReady containers. He then revisited the Home loan mortgage process using CodeReady Containers. Still on the topic of CodeReady Containers, he provided a How to setup the OpenShift Container Platform 4.6 on your local machine follow by a tutorial on Building a Human Resources Process with an OpenShift Operator

+
+
+
+

Releases, releases, releases…​

+
+

As always, the JBoss community has been quite active in the last weeks, and more than a few project releases new version (including the forementionned Wildfly 22 and Apache Camel 3.7):

+ +
+
+
+

Decaf

+
+

You want to break from Java programming, but still learn something relevant to it? Well, take a look at this article on Getting started with Tekton and Pipelines. It’s more than likely to pique your interest.

+

That’s all for today! Please join us again in two weeks for another installment of our JBoss editorial! Stay safe and healthy in the meantime.

+
+
+ +
+ + Romain Pelisse + +
+ ]]>
+ + Romain Pelisse + do-not-reply@jboss.com + https://www.jboss.org/people/romain-pelisse + + + + + + + + + + + +
+ + <![CDATA[This Week in JBoss: 25 December 2020]]> + https://www.jboss.org/posts/weekly-2020-12-25.html + + 2020-12-25T00:00:00.000Z + +

This Week in JBoss: 25 December 2020

+

I’m writing this on Christmas Day and have spent the last week or so thinking about what I should put +into my traditional 25th of December entry. Then it came to me in that "lightbulb moment": I’d replicate, +more or less, what I said to my entire team/org before I went on vacation a few days earlier. It’s a summary +of the year and I think it’s relevant for our wider community too. So here it is in a slightly modified form …​

+

I wanted to spend a few minutes thanking you all for the work and interactions you’ve done over this testing year! +I don’t think anyone could have predicted 2020 at the start of the year and I think it’s fair to say that every one of us +has been affected in one way or another. Yet if you look back on the year and the accomplishments we’ve achieved +as a community, you could be forgiven for thinking this was a normal year!

+
+
    +
  • +

    Making Quarkus available to all OpenShift customers, which we announced at KubeCon, as well as continuing the innovation within +(e.g., Hibernate Reactive, RESTeasy Reactive);

    +
  • +
  • +

    Knative/Serverless, where we now have 7 Working Group leads out of 15 in the Knative community, we also added Functions to OpenShift Serverless;

    +
  • +
  • +

    More and more of our technologies become available to Kube developers;

    +
  • +
  • +

    We continued our close involvement with AdoptOpenJDK (aka Eclipse Adoptium), helping to push it to even greater heights;

    +
  • +
  • +

    So many great innovations continued around efforts such as Kogito, Strimzi, Camel-K, Eclipse Vert.x, Infinispan, …​

    +
  • +
  • +

    We all managed to host, attend, present at countless virtual conferences, workshops and Red Hat Summit; probably enough to realise what +we’re all missing from the real things!

    +
  • +
  • +

    Eclipse MicroProfile 4.0 and Eclipse Jakarta EE 9.0 both come to life;

    +
  • +
+
+

The list could go on and on (e.g., EAP XD, OptaPlanner, …) but my point isn’t so much to call out the successes that this +community have helped to drive but rather to illustrate that we were able to do these and more at all! In the +climate of 2020, retaining the kind of focus we have and continuing to go above and beyond, as many of you and the teams +have, is a testament to Red Hat and our communities, our culture and the supporting bonds you’ve all built up and nurtured. For that +alone I thank you and you should all be incredibly proud!

+

With that in mind, whether or not you celebrate Christmas or intend to take extended time away, make sure you do take time +to rest and recharge. Be with your friends and family as much as you can given the continuing Covid situation. Find time to unwind +but also congratulate yourself on coming together in 2020 and delivering so much to our communities, partners and customers. I’m not +even going to try to predict what 2021 will be like but if we can replicate what we’ve been able to do in 2020, I’m sure +we’ll all come through it stronger and together!

+ +
+ + Mark Little + +
+ ]]>
+ + Mark Little + do-not-reply@jboss.com + https://www.jboss.org/people/mark-little + + + +
+ + <![CDATA[This Week in JBoss - 17 December 2020]]> + https://www.jboss.org/posts/weekly-2020-12-17.html + + 2020-12-17T00:00:00.000Z + +

This Week in JBoss - 17 December 2020

+ +

Welcome to another installment of our JBoss Editorial and last before the holidays! As always during this period of the year, we all rush to finish our ongoing tasks so that we can enjoy a bit of rest. And the projects of the JBoss community do the same, which means we have quite of lot to discuss today! So, without any further ado…​

+
+

Quarkus and RestEasy Reactive

+
+

The last months have certainly been quite active for Quarkus. Now part of the portfolio of Red Hat products, the project has everything but slow down. Just last week a new release, Quarkus 1.10.3 was published, but also RestEasy announced a large refactoring of its project RestEasy Reactive in order to integrate and support Quarkus even more. Alessio Soldano, one of the main developers of RestEasy, also shares his thoughts behind this project here.

+

But that’s not all in the Quarkiverse! Andy Damevin released an interesting article on link:But that’s not all in the Quarkus-verse! Andy Damevin released an interesting article on new ways to discover Quarkus new ways to discover Quarkus using Extension codestarts. Whether that you already know Quarkus or want to explore it for the first time, this one will be in any case quite interesting to you! Oh, and by the way Quarkiverse is by no means a "bon mot,” it’s the real thing: Quarkiverse Hub - Home of Community Extensions, so go check out this article from George Gastaldi to know more about it!

+

Last, but certainly not the least, another article will help you migrating your Spring Boot app to Quarkus using the Red Hat migration toolkit.

+
+
+
+

Apache Avro and Apicurio Registry

+
+

Avro and Apicurio got a lot of attention in the last weeks. First, Clément Escoffier, who already took the time to blog about How to Use Kafka, Schema Registry and Avro with Quarkus a few months ago, just released a new article on Using Avro in a native executable. Hugo Guerrero also took a stab at the topic in his blog entry on Debezium serialization with Apache Avro and Apicurio Registry.

+
+
+
+

Decaf'

+
+

With the end of 2020 coming up soon, it’s time to clean up our desk and prepare a clean slate for next year. So let’s do the same with our computer and follow this how-to to clean up your Fedora!

+

That’s all for today! Please join us again in two weeks for another installment of our JBoss editorial! Stay safe and healthy in the meantime.

+
+
+ +
+ + Romain Pelisse + +
+ ]]>
+ + Romain Pelisse + do-not-reply@jboss.com + https://www.jboss.org/people/romain-pelisse + + + + + + +
+ + <![CDATA[This Week in JBoss - 16 September 2020]]> + https://www.jboss.org/posts/weekly-2020-12-03.html + + 2020-12-03T00:00:00.000Z + +

This Week in JBoss - 16 September 2020

+ +

Hello! Welcome to another edition of the JBoss Editorial that brings you news and updates from our community.

+
+

Releases!

+
+

Quarkus 1.10 is out! +This release brings several updates, notably JSON as the default media type for REST resources in your Quarkus applications. +Now you no longer need all those `@Produces and @Consumes annotations!

+

Quarkus 1.10 also brings you two new Micrometer registries, additional metrics, and lots of consistency and configuration improvements to all things Swagger UI, which is detailed in the Stylish API blog post.

+

WildFly have released GraphQL Feature Pack 1.0.0.Final to give WildFly 20 and 21 the latest MicroProfile GraphQL and SmallRye GraphQL capabilities. +Congrats to the WildFly team!

+
+
+
+

Distributed Locks? They Don’t Work!

+
+

Bela Ban’s recent post, I hate distributed locks!, is an insightful and emotionally charged look at the pain and the agony of distributed locks. +He dissects different scenarios in which locks are distributed and the pitfalls for each. +Bela does give hints to other alternatives, but I’d suggest you go read them over on his blog.

+
+
+
+

Cloud Events with Quarkus

+
+

Given that event-drive architectures are becoming ever more popular, Clement Escoffier introduces Cloud Events with the Kafka Connector in Quarkus and shows you how to write and read Cloud Events easily.

+
+
+
+

Vert.x Mutiny API

+
+

In another recent post on the Quarkus blog, Mutiny and the Reactiverse, Clement Escoffier explains using Mutiny variants of Vert.x APIs to get a seamless experience with reactive APIs in Quarkus while taking advantage of the Vert.x ecosystem.

+
+
+
+

Untangling Reactive Streams

+
+

Continuing the discussion on the reactive paradigm, Rebecca Searls strips back complexities of Reactive Streams in her detailed blog post and brings some clarity for wiring a Subscriber, Publisher, and Subscription. +Be sure to check out the demo code in Rebecca’s github.

+
+
+
+

Business Automation and CodeReady Containers

+
+

In this first in his series of articles, Eric D. Schabell begins his journey that will guide you through using the latest Business Automation Operator on the OpenShift Container Platform.

+

Take a look at CodeReady Containers - Installing business automation operator (Part 1) to install the operator manually and then starting using decision management and process automation tooling on OpenShift. +Eric’s post is complete with an example project.

+
+
+
+

Infinispan Website

+
+

The Infinispan community have launched a revamped site at infinispan.org. +The new layout has a great look and feel! Congrats to the team.

+
+
+
+

Red Hat Developer Highlights

+
+

Alex Krikos and Donna Smalls announce Red Hat Software Collections that offer use case-specific tools along with the most current, stable version of dynamic languages, open source databases, web servers, and other critical development components. +Visit the Red Hat Software Collections 3.6 Now Generally Available announcement.

+

David Harris and Nick Boldt’s Using IntelliJ Community Edition in Red Hat CodeReady Workspaces 2.5 post explains how to create a custom workspace with IntelliJ IDEA in CodeReady Workspaces 2.5.

+

Karina Varela introduces us to the out-of-the-box integration with Apache Kafka in Process Automation Manager 7.9 in her artcile, Red Hat Process Automation Manager 7.9 brings Apache Kafka integration and more.

+
+
+ +
+ + Don Naro + +
+ ]]>
+ + Don Naro + do-not-reply@jboss.com + https://www.jboss.org/people/don-naro + + + + + + +
+ + <![CDATA[This week in JBoss - 20th November 2020]]> + https://www.jboss.org/posts/weekly-2020-11-20.html + + 2020-11-20T00:00:00.000Z + +

This week in JBoss - 20th November 2020

+ +

Welcome to another installment of our JBoss Editorial! Today, we’ll focus on some core project of our community. The first one is obviously Wildfly, our Jakarta EE application server whom predecessor (JBoss AS) was the beginning of everything. The second one is our more recent and shiny project, Quarkus. Without any further ado, let’s begin!

+
+

Wildfly, a first Taste of Jakarta 9

+
+

With the release of the Wildfly 21.01, it’s time to put the Jakarta EE server back in the spotlight. Especially as this release gives a a preview of Jakarta EE 9! And if your knowledge of the EE standards needs a refresher to fully enjoy this preview, we got you covered with this in depth two-part series on Jakarta EE multitenancy (part1) and (part 2).

+

But Jakarta EE 9 is not the only newsworthy item around Wildfly. The first part of my own series on automation of Wildfly using Ansible and JCliff is out! It’s hand on a tutorial on how to set up Ansible and its decided collection for Wildfly (JCliff) in order to fully automate the app server set up and configuration.

+
+
+
+

Quarkus, Leading the Future of Java

+
+

It might a bold statement, but we’ve made it! Or rather Red Hat made it as Quarkus 1.7 is available as a product for a little while now. Maybe it’s time to finally take a look at it by following this Red Hat Quarkus tutorial?

+

This is also a perfect opportunity to explore Quarkus functionality and ecosystems. For instance, take a look at this interesting post on mutiny invoke and call. Or simply explore the cloud readiness of the framework with this article on building a serverless blog search with Quarkus and AWS lambda and this introduction to Quarkus on Red Hat Openshift?

+
+
+
+

Techbytes

+
+

If Quarkus and Wildfly did not quench your thirst for knowledge, let us give you a bit more nuggets. First, why not explore the topic of using OpenID connect integration with 3scale? Or maybe contract first development using an event-driven approach with Kafka, AMQ Streams, APIcurio? And to make it extra spicy, Christina has even a added a touch of Google protobuf! By the way, if "event driven" is your thing, you can then move this other article on event driven serverless with Camel K.

+

Still hungry for more? Well, maybe it’s time for less crunchy and technical details? What about stepping back and invite some reflection on Open Source monetization ecosystem.

+
+
+
+

Releases, releases, releases…​

+
+

In case you somehow missed above (most likely by jumping directly to this section) …​ Wildlfy 21 Alpha 1 has been released!

+
+
+
+

Decaf

+
+

All this Java made you too jittery? Time for a Java break? Here are a few dry cookies to go along your cup of joe. As mentioned above, the first part of my series on using [Ansible to automate Wildfly setup] might a nice palate cleanser. Also, if you are using Docker you might be interested in this article describing how to transitioning from Docker to Podman.

+

That’s all for today! Please join us again in two weeks for another installment of our JBoss editorial! Stay safe and healthy in the meantime.

+
+
+ +
+ + Romain Pelisse + +
+ ]]>
+ + Romain Pelisse + do-not-reply@jboss.com + https://www.jboss.org/people/romain-pelisse + + + + + + + + + + + + + + + + + + + +
+ + <![CDATA[This week in JBoss - 6th November 2020]]> + https://www.jboss.org/posts/weekly-2020-11-06.html + + 2020-11-06T00:00:00.000Z + +

This week in JBoss - 6th November 2020

+ +

Welcome to another edition of the JBoss Editorial where we search through the JBoss Community for interesting articles and updates

+
+

Optimizing Camel 3.7

+
+

Camel 3.7 continues the push to optimize camel core by introducing some more improvements including further modularisation to help reduce the size of the runtime, a lightweight mode and more. For further details check out Claus' blog where he covers these improvements in more detail.

+
+
+
+

Keycloak Authentication Using a Mobile Phone Number

+
+

The Keycloak Identity and Access Management project provides an extension mechanism through which a developer can provide additional, custom authentication service providers to expand its capabilities. Siddhartha and his team recently took advantage of this capability to develop a custom authenticator class which could be used to authenticate a user via their mobile phone number.

+
+
+
+

Fronting Decision Management with a Node.js Front End

+
+

If you are interested in exploring how to expose the Decision Management server through a Node.js front end then Eric has a great demo for you. The demo is based on a bank loan scenario and uses numerous technologies within the Decision Management server as well as introducing a client application written in AngularJS and PatternFly.

+
+
+
+

WildFly server configuration with Ansible collection for JCliff

+
+

In the first part of a three part series covering how to take advantage of Ansible capabilities to fine tune a WildFly server, Romain walks us through the necessary steps for installing JCliff and ensuring it can be used within ansible playbooks.

+
+
+
+

Open Liberty and Kerberos/Thanos support

+
+

The Open Liberty 20.0.0.11 release introduced two very interesting capabilities, the addition of kerberos authentication for securing Java Database Connectivity data sources and the ability to visualise MicroProfile Metrics data from Thanos sources. For more information on these capabilities check out Austin’s blog on the topic

+
+
+
+

What’s new in Fabric8 Kubernetes Java Client

+
+

The recent Fabric8 Kubernetes Java client 4.12.0 release included a number of bug fixes and new features. For more information on these updates, including details on some breaking changes, head over to Rohan’s post where he covers these in more detail.

+
+
+
+

JBoss Online

+
+

Eric Schabell will be giving a presentation as part of the KieLives series on all technologies living under the KIE umbrella. Eric’s talk is titled "The ultimate beginers guide to rules and processes" and will be taking place on November 10th.

+
+
+
+

New Releases

+
+
+ +
+

That’s all for this edition of the JBoss Editorial, please join us in a couple of weeks when we will bring you more news and articles from the JBoss Community Projects.

+
+
+ +
+ + Kevin Conner + +
+ ]]>
+ + Kevin Conner + do-not-reply@jboss.com + https://www.jboss.org/people/kevin-conner + + + + + + + + + + + +
+ + <![CDATA[This week in JBoss - 23rd October 2020]]> + https://www.jboss.org/posts/weekly-2020-10-23.html + + 2020-10-23T00:00:00.000Z + +

This week in JBoss - 23rd October 2020

+ +

Welcome to another edition of the JBoss Editorial where we bring you articles and news from across the JBoss Community of projects.

+
+ +
+

In this post, Ken explains why the Quarkus team are now reccomending the use of the Micrometer Quarkus extension over the previous Eclipse MicroProfile Metrics extension.

+
+
+
+

Kafka - How to fail gracefully

+
+

Failures are inevitable. +There is nothing we can do about that, and that also applies to Kafka applications. +Your application may contain a faulty component misbehaving once in a while, or unable to process a specific Kafka record. +In this post, Clement explains how to manage these failures.

+
+
+
+

Use mobile numbers for user authentication in Keycloak

+
+

In this post Siddhartha De explains how to extend Keycloak to use mobile-based authentication. +The post explains the need for mobile-authentication and shows, hands on, how to use the Keycloak service provider interface to create this extension.

+
+
+
+

Securely connect Quarkus and Red Hat Data Grid on Red Hat OpenShift

+
+

Continuing on the theme of security, James Falkner explains (here) how to secure applications deployed on Red Hat OpenShift that use the Quarkus Data Grid Extension.

+
+
+
+

Creating a Payments Architecture

+
+

Eric continues his blog series looking at how Cloud technologies are changing the way we architect and deliver software, in particular how these technologies will apply to the Payment Services industry. +This week Eric describes a Financial Calculations Example

+
+
+
+

Mutiny - How does retry…​ retries?

+
+

Clement was recently helping a community Quarkus user understand how to retry asynchronous operations with Mutiny. +In doing so, he realised it was not all that simple to understand, and so he created this blog post so that the whole community could benefit from his explanation.

+
+
+
+

CodeReady Containers - Building a Cloud-Native Human Resources Process

+
+

In this blog post Eric talks you through how to install process automation developer tooling into a running Openshift Container platform. +You can also refer to one of Eric’s previous posts for details on how to easily get Openshift Container Platform running on your local machine.

+
+
+
+

New Releases

+
+
+ +
+
+
+ +
+ + Paul Robinson + +
+ ]]>
+ + Paul Robinson + do-not-reply@jboss.com + https://www.jboss.org/people/paul-robinson + + + + + + + + + + + + + +
+ + <![CDATA[This week in JBoss - 12th October 2020]]> + https://www.jboss.org/posts/weekly-2020-10-12.html + + 2020-10-12T00:00:00.000Z + +

This week in JBoss - 12th October 2020

+ +

Welcome to another edition of the JBoss Editorial where we bring you articles and news from across the JBoss Community of projects

+
+

Creating a Payments Architecture

+
+

With Cloud technologies changing the way we architect and deliver software Eric has been taking a look at how these technologies will apply to the Payment Services industry.

+

In the next two posts from his Payment Architecture series Eric introduces us to the design of an Anti-Money Laundering solution and follows that with the design of a Fraud Detection solution.

+
+
+
+

CodeReady Containers, Decision Manager and Process Automation

+
+

If you have ever wanted to explore Decision Manager or Process Automation running within the cloud then it has never been easier to get started. Eric has developed two simple setups, both leveraging CodeReady containers and OpenShift Container Platform 4.5, which allow you to quickly set up Decision Manager and Process Automation.

+
+
+
+

Kafka and Emitters, a deeper dive

+
+

Following on from an earlier blog post introducing us to emitters and how they can be used to send messages, Clement has taken a deeper look into the Emitter construct and explains how this can be used to bridge between the imperative and reactive worlds.

+
+
+
+

Optimizing Camel 3.6

+
+

Camel 3.6 will bring with it a number of optimizations to the camel core which will improve not only the performance of the core but also reduce the resources required to run camel routes. For more information check out Claus' blog where he describes the changes in more detail.

+
+
+
+

Kamlets, Camel in the cloud

+
+

Apache Camel K 1.2.0 introduced a number of features, the most important of which is the Kamelet. The Kamelet represents a camel route snippet and encapsulates the logic for connecting to a specific system. For more information check out Nicola’s blog where he introduces you to Kamelets and how they relate to Knative Eventing.

+
+
+
+

Testing Quarkus

+
+

Alex Soto and Burr Sutter recently gave a talk about testing Quarkus applications as part of the DevNation Tech Talk series. The talk covers how to test basic components as well as more advanced topics such as persistence, service virtualization and using containers for testing.

+
+
+
+

Contributing to OpenSource Communities

+
+

With Hacktoberfest already under way there are a number of opportunities for contributing to OpenSource, including a number of projects within the JBoss Community with two of those being Strimzi and Quarkus. If you are interested in contributing to Strimzi then check out Paolo’s post, if interested in contributing to Quarkus then check out Loïc’s post.

+
+
+
+

New Releases

+
+
+ +
+

That’s all for this episode of the JBoss Editorial, please join us for our next edition when we will take another spin through the JBoss Community Projects in search of more interesting news and articles.

+
+
+ +
+ + Kevin Conner + +
+ ]]>
+ + Kevin Conner + do-not-reply@jboss.com + https://www.jboss.org/people/kevin-conner + + + + + + + + + + + + +
+ + <![CDATA[This Week in JBoss - 30 September 2020]]> + https://www.jboss.org/posts/weekly-2020-09-30.html + + 2020-09-30T00:00:00.000Z + +

This Week in JBoss - 30 September 2020

+

It’s that time again where we round up the latest news from the community…

+

Are you looking to develop projects on your local machine, and push them on to a real OpenShift Container Platform, without having to worry about cloud hosting of your container platform? +In this post Eric Schabell provides an easy way to get up and running with CodeReady containers on your own development machine. +He’s automated most of the process through scripts, and guides you through the rest of the process. +Eric also shows you how to drop into the Developer console in OCP providing a developer focused view that hides much of the plumbing that is not needed during development.

+

In this post Mary Cochran shows us a simple way to connect existing services together using CamelK via each service’s REST APIs. +Mary gets deep into the details providing code examples and commands to get you up and running.

+

Eric Schabell continues his blog series, bringing you architectural blueprints for cloud-native financial payment services. +The blueprints are focused on proven interactions, messaging, processing, and integration patterns that you can put to use when building a cloud-native payment architecture. +This week he covers the Common Architecture Elements that make up the architecture, and gets into some details with the Immediate Payments Example.

+

As is normal for this time of year, the conference season is beginning to kick off. +Albeit this year in a virtual arena. +Undoubtedly this is an unfortunate situation for those that enjoy the in-person events. +However, it’s great for accessibility and reach allowing many more people across to globe to attend. +DevConf.US 2020 is one such event. +It’s a free, Red Hat sponsored technology conference for community project and professional contributors to Free and Open Source technologies. +Read more here where Eric describes the “AppDev & Containerization Ask the Experts” Panels that he and Kurt Stam will be moderating.

+

This week Kapil Shukla explains how to build a data streaming pipeline using Kafka Streams and Quarkus. +In this post Kapil shows how data can be processed in real-time as and when it arrives, instead of being batch processed as was needed in the past.

+

In this Post Anton Giertli provides help with troubleshooting user task errors in Red Hat Process Automation Manager and Red Hat JBoss BPM Suite. +If you are a developer working with user tasks and having trouble debugging them, this post might well help you out.

+

With the recent release of Apache Camel VS Code extension (0.0.27) comes several new language support features for Apache Camel. +Read this post to learn more.

+ +
+ + Paul Robinson + +
+ ]]>
+ + Paul Robinson + do-not-reply@jboss.com + https://www.jboss.org/people/paul-robinson + + + + + + + + +
+ + <![CDATA[This Week in JBoss - 16 September 2020]]> + https://www.jboss.org/posts/weekly-2020-09-16.html + + 2020-09-16T00:00:00.000Z + +

This Week in JBoss - 16 September 2020

+

Welcome to another edition of the JBoss Editorial where we gather news from our communities and explore developments from our projects.

+

Our very own Mark Little goes into detail to explain Quarkus and Jakarta EE compatibility. Mark gives an insightful breakdown of the history for both projects and answers a much asked question, will Quarkus and Jarkata EE come together? No spoilers here, though. Go read Mark’s Quarkus and Jakarta EE: Together, or not? if you already haven’t.

+

In the evangelist’s corner, Eric Schabell has brought out an excellent hands-on workshop with labs for Red Hat Decision Manager that show you how to design and build a retail web shop from scratch.

+

Eric also teams up with Ramon Villarreal to bring you architectural blueprints for cloud-native financial payment services. The blueprints are focused on proven interactions, messaging, processing, and integration patterns that you can put to use when building a cloud-native payment architecture.

+

Leon Matthews continues the topic of all things financial with his analysis of the history of Java in the banking sector and the role Quarkus is playing in allowing banks and financial institutions to embrace change, innovate to remain competitive, and become more efficient. Read Leon’s post: 25 years and going strong: Why Java matters to the future of banks.

+

Speaking of Quarkus, Clement Escoffier shows you how to build a stream of beer and then retrieve beers in a reactive way. After walking you through how you can do that with Mutiny, Clement provides a gist with all the code that you can compile and execute with jbang and a single command. You can find everything in his Handling paginated APIs with Mutiny post.

+

Another post from the Quarkus team that is worth reading is Jeff Beck’s Wipro Addresses Seismic Shift in Retail with Quarkus. Jeff shares the Wipro story by describing their needs and challenges and how they adopted Quarkus to modernize their applications and address customer use cases.

+

If it hasn’t crossed your radar, Bela Ban shows us his plans for a One Size Fits All JGroups program and explains what is needed to get there.

+

Jakub Scholz on the Strimzi team shares a post that looks at using the Open Policy Agent Gatekeeper project to enforce policies when creating custom resources and demonstrates how this is useful. While the post focuses on Strimzi, Jakub points out how Gatekeeper can be used with other projects so go take a look.

+

Releases!!

+

Congratulations to the Infinispan team for releasing the Dev03 cut of Infinispan 12. Cross-site replication capabilities continue to advance with an SPI that includes configurable policies for merging conflicting values from asynchronous backups, a feature which guarantees data consistency between global Infinispan clusters. That’s no small feat of engineering! Find out about that and more over on the Infinispan blog.

+

Quarkus 1.8 is out with some shiny new features, including jbang integration for easy Quarkus-based scripting, support for multiple persistence units for the Hibernate ORM extension, a new Micrometer extension, and update to GraalVM 20.2 for building native apps from Quarkus projects. Here is the announcement with all the info.

+

Keycloak have announced their new Account Console, built on React and PatternFly 4. The latest version offers a fresher look and feel with custom themes and extensions. Go check it out.

+ +
+ + Don Naro + +
+ ]]>
+ + Don Naro + do-not-reply@jboss.com + https://www.jboss.org/people/don-naro + + + + +
+ + <![CDATA[JBoss Weekly Editorial 27 August 2020]]> + https://www.jboss.org/posts/weekly-2020-08-27.html + + 2020-08-27T00:00:00.000Z + +

JBoss Weekly Editorial 27 August 2020

+ +

Welcome to another edition of the JBoss Weekly Editorial! +Summer is drawing to a close, but that doesn’t mean Red Hat has been resting, or that nothing has been happening over the past two weeks. +There’s been some great movement and progress made, which we’ll cover. +In this edition we’re going to focus on OpenShift, the blogosphere, and finally, other project news.

+
+

OpenShift

+
+

Last week was KubeCon Europe 2020, which as you can guess, was a big event for OpenShift! +We had 15 speakers from Red Hat speaking over the three days, giving 17 talks. +A number of new announcements, blog posts, and articles came out during KubeCon Europe 2020, They’re all liked at the OpenShift event page. +There’s simply too many to link here. +The above event page has videos, press release links, links to other announcements and blogs.

+
+
+
+

Blogs

+
+

Continuing the trend about OpenShift, Paul Vergilis wrote about external clients and Red Hat AMQ over at the Red Hat Developer blog. +If you’re interested in getting started with Strimzi, Apache Kafka on Kubernetes, you’ll want to catch up on the blog post Paolo Patierno and Jakub Scholz wrote: Introduction to Strimzi: Apache Kafka on Kubernetes (KubeCon Europe 2020). +For those of you running OpenJDK 8, you’ll want to know more about JDK Flight Recorder available in OpenJDK 8u262. An indepth intro is available at the Red Hat Developer Blog written by Mario Torre.

+
+
+
+

Projects

+
+

To wrap up this edition, we will be looking at two announcements from Keycloak:

+
+ +
+

We’re natuarally happy for a new release and sad for Louketo.

+

Thanks for being here with us in this edition! +We look forward to seeing you again in two weeks.

+
+
+ +
+ + Jason Porter + +
+ ]]>
+ + Jason Porter + do-not-reply@jboss.com + https://www.jboss.org/people/jason-porter + + + + + + + + +
+ + <![CDATA[This Week in JBoss - 13 August 2020]]> + https://www.jboss.org/posts/weekly-2020-08-13.html + + 2020-08-13T00:00:00.000Z + +

This Week in JBoss - 13 August 2020

+ +

Welcome to another edition of the JBoss Editorial where we gather news from our communities and explore developments from our projects.

+
+

JGroups 5!

+
+

Exciting news from Bela Ban as JGroups 5.0.0.Final is released. JGroups 5 brings lots of improvements and some major API changes.

+

Perhaps the biggest change is that Message is now an interface with a number of subclasses that perform late marshalling so object payload is serialized at the point when messages are sent, which eliminates a memory allocation and makes JGroups performance even better.

+

Other cool features in JGroups 5 are virtual thread support, an implementation of the Random Early Drop (RED) protocol, more efficient FD_ALL3 failure detection, a new protocol to dump stats, and lots more.

+

Hearty congratulations to Bela and all the contributors and folks who made it happen!!

+

Head over to the JGroups 5 documentation and find out more.

+
+
+
+

Keycloak Tech Talk

+
+

Stian Thorgersen of the Keycloak team presents a DevNation Tech Talk that provides an in-depth look at the best open-source identity and management solution around. Stian gives a great demo of Keycloak that not only highlights features but showcases just how easy it is to integrate and use Keycloak capabilities to secure your applications.

+

Spend half an hour and let Stian dazzle you with A deep dive into Keycloak.

+
+
+
+

Reactive Quarkus: A Java Mutiny

+
+

Another Tech Talk that you should definitely check out comes from Clement Escoffier and Edson Yanaga, who go into detail about Mutiny, a new reactive programming library. Clement and Edson explain why reactive matters, how Mutiny is makes it easier to develop reactive applications, and how the library is integrated with Quarkus.

+

Listen to Clement and Edson deliver their excellent talk, Reactive Quarkus: A Java Mutiny.

+
+
+
+

Skupper and the Hybrid Cloud

+
+

By now I’m sure you’ve heard of Skupper but maybe have yet to see it in action. Ted Ross gives a great introduction and live demonstration of Skupper across AWS, GCP, and Azure that shows real-time load balancing and fail-over.

+

Watch Ted’s Kubernetes and the hybrid cloud with Skupper Tech Talk today. You won’t regret it.

+
+
+
+

In the Community

+
+

Katia Aresti has created a pretty awesome Infinispan Server tutorial that demonstrates a full set of capabilities with a weather application. Visit the Infinispan Remote Weather App Tutorial and try it for yourself.

+

Jakub Scholz on the Strimzi team has written a comprehensive blog post, Using Open Policy Agent with Strimzi and Apache Kafka, that explores support for Kafka authorization using Open Policy Agent.

+

That’s it for this week’s editorial. Thanks for reading and see you next time.

+
+
+ +
+ + Don Naro + +
+ ]]>
+ + Don Naro + do-not-reply@jboss.com + https://www.jboss.org/people/don-naro + + + + + + + + +
+ + <![CDATA[This Week in JBoss - 30th July 2020: No rest for the JBoss community!]]> + https://www.jboss.org/posts/weekly-2020-07-30.html + + 2020-07-30T00:00:00.000Z + +

This Week in JBoss - 30th July 2020: No rest for the JBoss community!

+ +

Welcome to another installment of our JBoss Editorial! The last two weeks have been pretty rich on published content and releases, so let’s dive right in!

+
+

From Spring Boot to Quarkus

+
+

As Quarkus community is increasing the question of how to migrate to this new framework (or rather runtime) often arises. If you happen to have such predicament with Spring Boot, I’m sure you’ll be quite interested to read this article on migrating Spring Boot tests to Quarkus.

+
+
+
+

Secure vue.js with Keycloak

+
+

If most of the content we mentioned today is made of articles, we have one, quite cool video content to share. It’s coming straight from one of the tech-talks of the DevNation and we hope you’ll like it : Secure vue.js using Keycloak.

+
+
+
+

JGroups: Double your performance with virtual threads!

+
+

Quite a lot of exciting things are happening in the realm of JGroups lately! Last time, we already mentioned the new netty transport, but Bela Ban, the creator of project, got us even more excited with this news about how one can double its performance using virtual threads (fibers) on JDK15/16!!! This JDK is still a bit down the road, but its certainly a nice glimpse into tomorrow.

+
+
+
+

Back to the Basics

+
+

As said above, the last two weeks have been particularly rich in interesting content around the JBoss community and the Java ecosystem at large. Some of those articles took the time to go back and rethink some aspects of our work that we take for granted. Let’s first mention this original take on java programming that focuses on taming inconsistent state in a Java code.

+

This first article is already pretty centered around coding, but this next one goes into the very guts of Infinispan! If you know the project, I’m sure you’ll find this entry on anchored keys as fascinating as I did!

+

Let’s also revisit a classic: load balancing a JEE app server (such as Wildfly or its product counterpart JBoss EAP), but with a twist: Load balancing Red Hat JBoss EAP with subclusters.

+
+
+
+

Evangelist’s Corner

+
+

No rest for the wicked! And no, no rest for our very own Eric D. Schabell! In the last two weeks, he has been quite busy again. First of all, he got his very first interview on a podcast (yep, that’s right, he was never on a podcast before!). With the host, he discussed the best practices for Agile integration. If you are interested in this topic, fetch the episode, you won’t regret it!

+

That’s not all. Eric also took the time to update and release his "fully updated to the latest release" version of his Beginners guide - Building a retail web shop workshop update.

+

On top of that, he took the time to describe how to How to Install Red Hat Process Automation Manager 7.7 and share his experience with the Shift Remote 2020 online conference.

+
+
+
+

Releases, releases, releases,…​

+
+

As always, the JBoss community has been pretty busy in the last weeks and a few projects have seized the relative quietness of Summer to release new version of their product:

+ +
+
+
+

Decaf

+
+

For once, this section stays rather close to Java, covering how to deploy your Java Webapp into the cloud using Eclipse JKube. So, yes, we’ll talk Kubernetes, but in a context quite close to home :) .

+

That’s all for another edition of the JBoss Editorial, please join us again for more exciting development from the JBoss Communities.

+
+
+ +
+ + Romain Pelisse + +
+ ]]>
+ + Romain Pelisse + do-not-reply@jboss.com + https://www.jboss.org/people/romain-pelisse + + + + + + + + + + + + + + +
+ + <![CDATA[This Week in JBoss - 9 July 2020: Over the (j)cliff!]]> + https://www.jboss.org/posts/weekly-2020-07-09.html + + 2020-07-09T00:00:00.000Z + +

This Week in JBoss - 9 July 2020: Over the (j)cliff!

+ +

Welcome to another installment of our JBoss Editorial! Summer has begun, well, at least for those of you readers living in the northern hemisphere :)! So let’s enjoy it by giving some nice, interesting and exciting reading material to enjoy while resting in the sun (with your mask, #staysafe!).

+
+

Infinispan 11!

+
+

It’s out! The new major version of Infinispan is here! Please go and check out Infinispan 11!

+
+
+
+

JGroups: new Netty transport!

+
+

I’ve said it many times, JGroups is an incredible piece of software. The power and the flexibility of the frameworks always dazzle me, so I’m very excited about this new netty transport getting into it!

+
+
+
+

Ansible Collection for JCliff

+
+

It’s a pet project of mine that I have already mentioned a few months ago: Andrew Block, Roel Holzmans and I have been working on integrating further Widlfy (and EAP) into Ansible, in order to ensure that one can use the tool to fine-tune as much as possible the JEE server’s configuration. We leverage an existing Open Source Java tool called JCliff to just that.

+

Last year, we released a role, already available in Ansible Galaxy, to integrate JCliff into Ansible. However, since then, the Ansible community released a new format to distribute extension, called Ansible Collection. We therefore decide to migrate our content there and we finally released, just this week, a very first version: Ansible Collection for JCliff 0.0.1.

+

So, please check it out! All you need to do is $ ansible-galaxy collection install redhat.jcliff:0.0.1 and, voilà, the collection is installed and you can start to play with it.

+

Oh, almost forgot! This release also supports, on tops of Linux, MacOSX with homebrew! (Windows using Chocolatey is coming next).

+
+
+
+

Serverless and Microservice

+
+

As alluring as “serverless” is, it does, like any other technology, come with its own challenges. Follow Christina as she goes through the importance of having the proper infrastructure to support your “serverless” apps in this well thought out blog entry: Serverless Integration Components

+

Follow this first read, you may want to take a look at this other article on operators and sidecars are the new model, which also discuss similar concerns.

+
+
+
+

Microprofile

+
+

With the release JBoss EAP XP, there are a lot of opportunities to develop supported microprofile application. So if you want to explore how to develop such an application, please follow Emmanuel Hugonnet’s tutorial on Develop Eclipse MicroProfile applications on Red Hat JBoss Enterprise Application Platform Expansion Pack 1.0 with Red Hat CodeReady Workspaces.

+
+
+
+

Decaf—Quarkus Workshops automated with Ansible

+
+

Yeah, I know, we just talked about Ansible! Where is my Java stuff you are rightly asking. Well, as you’ll see Ansible, while being Python, plays well with Java software, as demonstrated by this article on automate workshop setup with Ansible playbooks and CodeReady workspaces.

+

That’s all for another edition of the JBoss Editorial, please join us again for more exciting development from the JBoss Communities.

+
+
+ +
+ + Romain Pelisse + +
+ ]]>
+ + Romain Pelisse + do-not-reply@jboss.com + https://www.jboss.org/people/romain-pelisse + + + + + + + + + + + + + + + +
+ + <![CDATA[This Week in JBoss: 26 June 2020]]> + https://www.jboss.org/posts/weekly-2020-06-26.html + + 2020-06-26T00:00:00.000Z + +

This Week in JBoss: 26 June 2020

+

Here we are, once again at the close of June. +Another summer has begun, albeit a little different than most. +I hope everyone is safe, healthy, and doing well. +There have been some very interesting blogs posted in the past couple of weeks that we’ll discuss in this edition, as well as a few releases.

+

Operators in Kubernetes provide an extension point for the platform. +They follow a pattern allowing you to manage resources and applications within the cluster. +An operator can be either namespace-scoped or cluster-scoped. +Did you know, however, that you can convert between the two? +That is exactly what Abhishek Koserwal details in six steps over on the Red Hat Developer blog. +Abhishek walks you through a basic example and provides the full example as a GitHub repo. +Read the article for more information, and reasons why you may want or need to switch between the different scopes.

+

Multitenancy may be something you deal with everyday, or it may be something you’re looking at adding to your current application base. +Either way, dealing with persistence can be tricky. +Tenants must not see each other’s data, but be allowed to operate simultaneously. +Your application must also perform well while still being easy to maintain. +Rhuan Rocha has started a two part series on how to use JPA with Multitenancy over on the Red Hat Developer blog. +The first entry details the problem and presents a possible solution using WildFly and EJBs. +Expect the next installment to look more at Hibernate and JPA solutions.

+

Effortlessly building a native application is of course, one of the amazing capabilities of Quarkus. +However, when it comes to debugging, a native Quarkus application makes debugging very difficult. +A large part of this is the optimizations that happen to create that quick, small, native binary. +This debugging complication hasn’t gone unnoticed. +Andrew Dinn has been working on this problem. +He contributed a solution where the debug information is embedded with in the native image and can be access with gdb. +If you’d like to learn more about the solution, read Andrew’s blog entry.

+

Continuing with the Quarkus theme, Durgesh Anaokar wrote about developing and testing a Quarkus Red Hat Data Grid client using Red Hat CodeReady Containers. +Durgesh details installing CRC (Red Hat Code Ready Containers) and Data Grid on OpenShift 4 as well as running the client. +Naturally, his project code is hosted in GitHub, you’ll find that link in his blog entry.

+

Red Hat now has images, Universal Base Images to be exact, of OpenJDK (8 and 11) in Red Hat Enterprise Linux 8.2. +A Universal Base Image (UBI) is an OCI-compliant container base OS image with runtime and language support that can be used as the base for Docker images and Podman/Buildah images. +These will allow you to deploy and build supportable applications on Red Hat OpenShift and RHEL. +It also includes a number of additional user-space packages over a base UBI. +Read more about this over at Red Hat Developers.

+

If you have been following, you’ll know the Infinispan team has been hard at work on Infinispan 11. +They are proud to announce that Inifinspan 11.0.0. Final has been released! +A number of improvements and features have been added to this release including clustering, CLI, Hot Rod Client improvements, non-blocking internals, and others.

+

Along with that new Infinispan release, you can now deploy a natively compiled version of the Infinispan server! +The memory footprint is only 286MB. +There are also native Quarkus extensions for your Quarkus based applications.

+

Not to be left out of the cloud native party, Apache Camel is announcing the GA release of Apache Camel K 1.0. +This release includes tooling, connectors, and integrations with Knative. +This is a great step forward for doing integrations with a small footprint.

+

Lastly, Red Hat JBoss Enterprise Application Platform Expansion Pack 1.0 was recently released. +This is a patch that adds MicroProfile capabilities to JBoss EAP. +There are some policy changes you will need to be aware of, but you find links to all of thosewithin the announcement.

+

Thanks again for being with us on another JBoss Editorial!

+ +
+ + Jason Porter + +
+ ]]>
+ + Jason Porter + do-not-reply@jboss.com + https://www.jboss.org/people/jason-porter + + + + + + +
+ + <![CDATA[This Week in JBoss - 11 June 2020]]> + https://www.jboss.org/posts/weekly-2020-06-11.html + + 2020-06-11T00:00:00.000Z + +

This Week in JBoss - 11 June 2020

+ +

Welcome to another edition of the JBoss Editorial where we gather news from our communities and explore developments from our projects.

+
+

Mandrel

+
+

There has been some exciting +news about Mandrel. +You’ve likely heard of this by now but, in his announcement post, Mark explains how Red Hat has worked +with the GraalVM community to create a distribution of OpenJDK with GraalVM’s native-image +capabilities for producing native executables.

+
+
+
+

AI vs COVID-19

+
+

A recent DevNation Tech Talk with +a very topical subject looks at how OptaPlanner has helped keep medical staff and patients safer with advanced planning algorithms. +It’s nice to see Java play a role in improving things for those who are at the front lines of the pandemic.

+
+
+
+

In the Community

+
+

Eric Schnabell keeps his Cloud-native development series going with a look at +example use cases for using remote container platforms as development environments.

+

The Infinispan blog has seen a flurry of activity in the run up to the 11.0.0.Final release, which +should be available real soon now. In the meantime, you can read about some of the things that will be +available in Infinispan 11 here:

+
+ +
+

Over at the Strimzi blog, there is another installment of the series around Mirror Maker. +Check out the post for mirroring to Azure Event Hub using Mirror Maker 2.

+
+
+
+

Release Roundup

+
+
+ +
+

That’s it for this week’s editorial. Thanks for reading and see you next time.

+
+
+ +
+ + Don Naro + +
+ ]]>
+ + Don Naro + do-not-reply@jboss.com + https://www.jboss.org/people/don-naro + + + + + +
+ + <![CDATA[JBoss Weekly Editorial 29 May 2020]]> + https://www.jboss.org/posts/weekly-2020-05-29.html + + 2020-05-29T00:00:00.000Z + +

JBoss Weekly Editorial 29 May 2020

+ +

Welcome back! +Things keep rolling along for us within Middleware at Red Hat. +We have a couple of new releases and some blogs to talk about this week, so let’s dig in.

+
+

Releases

+
+
+
    +
  • +

    Infinispan 11.0.0.0.CR1 - This CR release sees non-blocking internal changes, a non-blocking Store SPI, slight modifications to clustering scaling, better/more server security, CLI, kubernetes/OpenShift operator, and an update to documentation!

    +
  • +
  • +

    Quarkus 1.5.0.Final - The milestoe is done and the artifacts are in Maven Central. There are a few things left to do to offically announce the release, but all the coding is done. The link here is to the GitHub milestone for a list of issues completed.

    +
  • +
  • +

    Teiid Spring Boot 1.5.0

    +
  • +
+
+
+
+
+

Blogs

+
+

To go along with the Infinispan release, a couple of new blog posts have come out:

+
+ +
+

Eric Schabell has a couple of entries into his Cloud-native development series:

+ +

There is also an entry called Reality Bites: 3 misconceptions that can lead to microservice mayhem discussing pitfalls to avoid while working with Microservices

+

Lastly, we want to cover episodes 2, 3, and 4 of the Quarkus Insights video podcast. +Episode 2 covers quarkus:dev and Command mode. +Episode 3 discusses Hibernate and Panache. +The most recent one, episode 4, talks about JHipster for Quarkus. +You can find these video pod casts at YouTube or the audio on Apple Podcasts and Spotify.

+
+
+ +
+ + Jason Porter + +
+ ]]>
+ + Jason Porter + do-not-reply@jboss.com + https://www.jboss.org/people/jason-porter + + + + +
+ + <![CDATA[JBoss Weekly Editorial 14 May 2020]]> + https://www.jboss.org/posts/weekly-2020-05-14.html + + 2020-05-14T00:00:00.000Z + +

JBoss Weekly Editorial 14 May 2020

+ +

We’re a little light on the news this time, but those of us who have been reading the editorial for a few years will be familiar with the "after Summit slump." +With Red Hat Summit behind us (and what a great Summit, check out the sessions on demand if you missed them), many people have taken PTO. +Expect all the news, blogs, releases, etc. to pick back up in the coming weeks.

+

All that being said, we do have some blogs to go over and one release.

+
+

Blogs

+
+

First up is Eric Schabell’s second entry in his "Demystifying the Event Driven Architecture - Making the case" series. +You can read more about it at his blog.

+

We have another post by Eric: Code Ready Containers - Installing an HR employee rewards project using developer container catalog. +For more information about CodeReady Containers, please visit the Red Hat Developer page.

+

There are a number of DevNation Tech Talks and master courses dropping within the next week, please visit the DevNation page for more information.

+
+
+
+

Releases

+
+

Keycloak released a new version: Keycloak 10.0.1.

+
+
+ +
+ + Jason Porter + +
+ ]]>
+ + Jason Porter + do-not-reply@jboss.com + https://www.jboss.org/people/jason-porter + + + + + +
+ + <![CDATA[This Week in JBoss: 1 May 2020]]> + https://www.jboss.org/posts/weekly-2020-05-01.html + + 2020-05-01T00:00:00.000Z + +

This Week in JBoss: 1 May 2020

+ +

+
+rh summit banner +
+

+
+

[2020-04-30] - The Virtual Red Hat Summit week

+
+

I’m writing this as we wrap up another successful Red Hat Summit. +But this year, with a significant distinction: the event was 100% +virtual. Despite the involuntary move to virtual, there were many +benefits that came about from the change in format. The event was +completely free, and of course required no travel, allowing a much +broader and more diverse set of attendees to benefit from the +content and experience. It was also ran in three regions to +accommodate many more timezones.

+

Being Red Hat we were keen to experiment with the format and find +new ways to engage with the community. It was important for us to +carry over as much of the personality and intimacy of the physical +event as possible. So, this needed to be more than just a bunch of +streamed talks. The talks were pre-recorded which allowed the +presenter(s) to participate directly in the Q&A in real-time +as the talk proceeded. There was also a variety of sessions that +went beyond the talk format. For examples see +Ask the experts, Networking social hour, and +the Virtual Open Neighborhood on the +agenda.

+

If you weren’t able to attend, or want to catch some of the +talks you missed, you can re-live the virtual event here.

+

In other news…​

+
+

Quarkus Insights on Youtube live

+

This week Max Andersen and Emmanuel Bernard kicked off a new video/podcast series +bringing insights into Quarkus. Each episode will focus on a +guest speaker discussing the development or usage of Quarkus. +There are also some dedicated Q&A sessions planned. Be sure +to subscribe to the Quarkus YouTube channel +to catch these sessions and other exciting Quarkus content. +In particular join them on the 4th of May +where Georgios Andrianakis will talk about Quarkus testing +and specifically the new mocking improvements in the recently +released Quarkus 1.4.

+
+
+

Kogito: A Modular Codegen Design Proposal

+

In this post +Edoardo Vacchi explains how Kogito is improving performance +by moving processing out of the run-time and into build-time.

+
+
+

Red Hat Summit 2020 - Ask the Experts: Hybrid Multicloud Pitfalls

+

In one of the many Ask the Experts sessions, +Eric Schabell & Roel Hodzelmans focused on their hybrid +multi-cloud pitfall theories. You can +view the slides here, +or register for the Red Hat Summit Virtual event +to re-watch the content on demand.

+
+
+

Free book on Knative covering Camel K and Kafka and upcoming webinar with live demos

+

In this post Claus Ibsen alerts us to the free eBook +written by Burr Sutter & Kamesh Sampath on the subject of Knative. Go get your +free copy here!

+
+
+

Red Hat Summit 2020 - Business Automation Sessions

+

If you are interested in the area of Business Automation, be sure to view Kris +Verlaenen’s helpful summary +of all the BI related talks held at Red Hat Summit.

+
+
+

Demystifying the Event Driven Architecture - An introduction (part 1)

+

Eric Schabell has started a new blog series +that explores the world of Event Driven Architectures (EDA).

+
+
+

Six reasons why you will love Camel K

+

Interested in Camel K, or want to find out what all the fuss is about? +Read on, +and Christina will give you six reasons to love Camel K.

+
+
+

Hybrid clouds with JGroups and Skupper

+

Bela Ban follows up on his post explaining how to +span JGroups Kubernetes-based clusters across Google and Amazon clouds. +In this new post +Bela improves on the process by using Skupper to simplify this +task and encrypt the data exchanged between different clouds.

+
+
+

This Week’s Releases

+
+
    +
  • +

    Quarkus 1.4. Command mode, HTTP 2, New FaaS framework, Mocking, and more.

    +
  • +
  • +

    Keycloak 10.0.0. +With Identity Brokering Sync Mode, Client Session Timeout for OpenID Connect / OAuth 2.0 +and much more.

    +
  • +
  • +

    Kogito 0.9.1. This release +is a bug fix release, but there has also been considerable work spent on +documentation and code examples. See the link for detais.

    +
  • +
+
+
+
+
+ +
+ + Paul Robinson + +
+ ]]>
+ + Paul Robinson + do-not-reply@jboss.com + https://www.jboss.org/people/paul-robinson + + + + + +
+
\ No newline at end of file diff --git a/blogs.html b/blogs.html new file mode 100644 index 00000000..811e451a --- /dev/null +++ b/blogs.html @@ -0,0 +1,266 @@ + + + + + + + + + Blogs - JBoss.org + + + + + + + + + + +
+ JBoss.ORG + +
+ +
+
+

Blogs

+
+

Community Blog Feed: Most Recent Posts

+
+
+

Quarkus 3.19 - UBI 9 images, Micrometer to OpenTelemetry bridge, JEP 483 new AOT cache…​

+ +
+ + By Guillaume Smet +
+

Today, we released Quarkus 3.19. Quarkus 3.19 is our first step towards the release of our new 3.20 LTS, as 3.20 LTS will be based on the 3.19 branch. You can consider that the next LTS is feature complete and we encourage you to adopt 3.19 and shar…

+
+
+
+

New videos about OpenID Connect and Keycloak from FOSDEM 2025

+ +
+ + By Alexander Schwartz +
+

is a free event for software developers to meet, share ideas and collaborate. Every year, thousands of developers of free and open source software from all over the world gather at the event. Several talks regarding OpenID Connect and Keycloak have …

+
+
+
+

Agentic AI with Quarkus - part 2

+ +
+ + By Mario Fusco +
+

The of this blog post series briefly introduced agentic AI and discussed workflow patterns. This post will explore another kind of pattern: agents. The main difference between the two is that workflow patterns are defined programmatically, while age…

+
+
+
+

Keycloak JS 26.2.0 released

+ +
+ + By Keycloak Blog +
+

HIGHLIGHTS Today marks a significant milestone in the evolution of Keycloak JS with the release of version 26.2.0. This new version represents a shift in how the JavaScript adapter develops and evolves alongside the Keycloak ecosystem. Although this…

+
+
+
+

RESTEasy in a Foundation

+ +
+ + By RESTEasy +
+
+
+
+

Keycloak Extensions show GitHub stars

+ +
+ + By Alexander Schwartz +
+

The Keycloak homepage has an updated community extensions page! Thanks to , each extension shows off with its GitHub stars. This should provide you with a better overview which extensions are popular with the community. If an extension you use is li…

+
+
+
+

Quarkus 3.18.4 - Maintenance release

+ +
+ + By Guillaume Smet +
+

We released Quarkus 3.18.4, the third (we skipped 3.18.0) maintenance release for our 3.18 release train. We will release Quarkus 3.19 next week. UPDATE To update to Quarkus 3.18, we recommend updating to the latest version of the Quarkus CLI and ru…

+
+
+
+

Agentic AI with Quarkus - part 1

+ +
+ + By Mario Fusco +
+

Although there is no universally agreed definition of an AI agent, several emerging patterns demonstrate how to coordinate and combine the capabilities of multiple AI services to create AI-infused applications that can accomplish more complex tasks.…

+
+
+
+

Using LangChain4j to analyze PDF documents

+ +
+ + By Emil Lefkof +
+

In my consulting work, clients frequently present us with challenging problems that require innovative solutions. Recently, we were tasked with extracting structured metadata from PDF documents through automated analysis. Below, I’ll share a simplif…

+
+
+
+

resteasy-grpc: Handling Collections

+ +
+ + By RESTEasy +
+
+
+
+

Eclipse Vert.x 5 candidate 5 released!

+ +
+ + By Julien Viet +
+
+
+
+

Vlog: Admin your WildFly with LLM and MCP

+ +
+ + By smaesti +
+

This video demonstrates using an MCP server to administer a WildFly installation with AI.

+
+
+
+

An introduction to use the domain mode of the current release of WildFly

+ +
+ + By 阿男 +
+

HELLO WORLD!

+
+
+
+

Quarkus 3.18.3 - Maintenance release

+ +
+ + By Guillaume Smet +
+

We released Quarkus 3.18.3, the second (we skipped 3.18.0) maintenance release for our 3.18 release train. We also released Quarkus 3.19.0.CR1 today. We encourage you to test it and report back as we will branch 3.20 LTS from 3.19. UPDATE To update …

+
+
+
+

Keycloak 26.1.2 released

+ +
+ + By Keycloak Blog +
+

To download the release go to . UPGRADING Before upgrading refer to for a complete list of changes. ALL RESOLVED ISSUES DEPRECATED FEATURES * Drop support for end-of-life versions of Node.js nodejs-connect ENHANCEMENTS * Convert tests to standard mo…

+
+
+
+

Quarkus Newsletter #53 - February

+ +
+ + By James Cobb +
+

Be sure to read Max Rydahl Andersen’s blog post that introduces the Model Context Protocol servers project which provides a set of MCP servers implemented using Quarkus and Java. Starting with JDBC, filesystem and JavaFX. Don’t miss transcript of Ho…

+
+
+
+

Eclipse Vert.x 4.5.13 released!

+ +
+ + By Julien Viet +
+
+
+
+

Making WildFly Glow with Intelligence

+ +
+ + By Emmanuel Hugonnet +
+

In WildFly 35 Beta, WildFly Glow has also received a new feature to , this allows feature packs to be grouped into spaces such as an incubating space to reflect the stability of the feature pack and to allow users to select which spaces they want to…

+
+
+
+

WildFly 35.0.1 is released!

+ +
+ + By Darran Lofthouse +
+

WildFly 35.0.1.Final is now available . I am pleased to announce that the WildFly 35.0.1.Final release is now available for download. The following issues were resolved in 35.0.1: BUGS * [] - NPE in race condition between a thread committing a trans…

+
+
+
+

Keycloak 26.1.1 released

+ +
+ + By Keycloak Blog +
+

To download the release go to . HIGHLIGHTS NEW OPTION IN X.509 AUTHENTICATOR TO ABORT AUTHENTICATION IF CRL IS OUTDATED The X.509 authenticator has a new option x509-cert-auth-crl-abort-if-non-updated (CRL abort if non updated in the Admin Console) …

+
+

- End of Results -

+
+
+
+ +
+
+ + + + + + + + + + \ No newline at end of file diff --git a/css/jbossorg.css b/css/jbossorg.css new file mode 100644 index 00000000..cda4f50e --- /dev/null +++ b/css/jbossorg.css @@ -0,0 +1,332 @@ +:root { + --font-family--heading: 'Hind Siliguri', sans-serif; + --font-family--content: 'Montserrat', sans-serif; + --font-weight--light: 300; + --font-weight--semibold: 600; + --font-weight--medium: 500; + --color--white: #FFFFFF; + --color--dark-grey: #2A2A2A; + --color--orange: #F26430; + --color--green: #77BA99; + --color--blue: #004DB9; + --color--grey: #626262; + --font-size--content: calc(1em * 0.75); +} + +body { + margin: 0; + padding: 0; + font-size: 1em; + font-family: var(--font-family--content); +} + +/* Font-sizing */ +h1 { font-size: 86px; } +h2 { font-size: 36px; } +h3 { font-size: 1.5em; } +h4 { font-size: 28px; } +h5 { font-size: 24px; } +h6 { font-size: 22px; } +p { font-size: 18px; } + +/* End Font-sizing */ + +/* Line Height */ +h1 { line-height: 100px; } +h2 { line-height: 46px; } +.this-week h2 { line-height: 68px;} +h3 { line-height: 1.25;} +/* End Line Height */ + +/* Font-families */ +h1, h2, h3, h4, h5, h6, nav { + font-family: var(--font-family--heading); + margin: 0 0 10px 0; padding: 0; +} +p { font-family: var(--font-family--content); } +/* End Font-families */ + +/* Margin */ +h1 { margin-bottom: 42px; } +h2 { margin-bottom: 42px; } +.convo h2 { margin-bottom: 0; } +/* End Margin */ + +/* Font-weights */ +h1, h2, h4 { + font-weight: var(--font-weight--light); +} +h3,h5 { font-weight: var(--font-weight--semibold); } +h6 { font-weight: var(--font-weight--medium); } +/* End Font-weights */ + +/* Text-Transform */ +h1, h2, h4, h6 { text-transform: uppercase; } + + +/* Element Styling */ +h2 { vertical-align: middle;} +p { + font-size: 18px; + line-height: 24px; + margin: 0 0 30px 0; +} +a { color: #004DB9; } +img { max-width: 100%; } +body > header { + background: var(--color--dark-grey); + display: flex; + flex-direction: row; + height: 160px; + align-items: center; + border-bottom: 40px solid var(--color--green); + padding: 0 140px; + margin-bottom: 60px; +} +body.this-week > header { border-bottom: 0; margin-bottom: 0;} + +header a.site-home { + color: var(--color--white); + text-decoration: none; + font-weight: var(--font-weight--light); + font-family: var(--font-family--heading); + flex: 0 0 200px; +} +header a.site-home strong { font-weight: var(--font-weight--semibold);} + +body > header > nav { + flex: 1 1 auto; + list-style: none; + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-end; +} +body > header > nav a { + flex: 1 1 1fr; margin-right: 1em; + color: var(--color--green); + text-transform: uppercase; + text-decoration: none; + font-size: 32px; + font-weight: var(--font-weight--semibold); +} +body > header > nav a:last-child { + margin-right: 0; +} +body > header > nav a.active { + color: var(--color--white); + border-bottom: 8px solid var(--color--orange); + margin-bottom: -8px; +} +body > header > nav a .icon { + font-size: 24px; + vertical-align: top; +} + +main { + display: flex; + flex-direction: row; + align-items: stretch; +} +.site-home { font-size: 65px; } +.site-home span { font-size: 70px; } +.this-week { flex: 0 0 58%; --convo-bg-color: var(--color--orange); } +.blog-feed, .twitter-feed { flex: 0 0 42%; --convo-bg-color: var(--color--green); } +.convo { + background-color: var(--convo-bg-color); + position: relative; + height: 180px; + color: white; + display: flex; + flex-direction: column; + justify-content: center; + margin-bottom: 190px; +} +.convo p { margin: 0; } +.convo::after { + content: ''; + display: block; + background-color: var(--convo-bg-color); + height: 0; + width: 0; + position: absolute; + top: 100%; + left: 140px; + border-width: 70px; + border-style: solid; + background: transparent; + border-right-color: transparent; + border-bottom-color: transparent; + border-left-color: var(--convo-bg-color); + border-top-color: var(--convo-bg-color); +} +main article { + position: relative; +} +main article > * { + padding-left: 140px; + padding-right: 140px; +} +.this-week main article:first-child > * { padding-right: 30px; } + +.this-week .author { + margin-bottom: 50px; + margin-top: -100px; + margin-left: 140px; +} +.author { + margin-bottom: 20px; + display:flex; + flex-direction: row; + align-items: center; + font-size: 18px; +} +.author pfe-avatar { + --pfe-avatar--width: 50px; + display: inline-block; + margin-right:20px; +} +p.byline { + margin: 0; + padding: 0; + color: #454545; + font-size: 16px; +} +p.end-of-results { + text-align: center; + font-size: 16px; +} + +.preamble { + font-size: 24px; + line-height: 32px; + vertical-align: middle; + color: #454545; +} + +.twitter-feed h3 { + font-size: 16px; + color: #454545; +} +.twitter-feed p a { + font-size: 20px; + font-weight: 600; +} + +.blogs-page main, .twitter-page main { + display: flex; +} +.blogs-page main article:first-child, .twitter-page main article:first-child { + flex: 0 0 65%; + padding-right: 30px; +} + +.blogs-page hr { + width: 50%; +} +.blogs-page h3 { + margin-top: 30px; +} + +.rhd-banner { + background-color: var(--color--grey); + color: var(--color--white); + padding: 64px 140px; +} +.rhd-banner .three-cols { + display: flex; + flex-direction: row; +} + +.rhd-banner .three-cols p { + flex: 2; +} +.rhd-banner .three-cols a { + flex: 1; + margin-left: 140px; + color: var(--color--white); + font-size: 22px; + font-weight: bold; +} + +@media (max-width: 1200px) { + h2, .this-week h2 { + font-size: 24px; + line-height: 34px; + } + .rhd-banner .three-cols { + flex-direction: column; + } + body > header, .rhd-banner { + padding-left: 70px; + padding-right: 70px; + } + body > header { + height: 80px; + } + .rhd-banner { + padding-top: 16px; + padding-bottom: 16px; + } + .rhd-banner .three-cols a { + margin-left: 0; + margin-bottom: 30px; + } + .this-week main article:first-child > * { + padding-right: 30px; + } + main article > * { + padding-left: 70px; + padding-right: 70px; + } + .convo { + height: 120px; + margin-bottom: 120px; + } + .convo::after { + border-width: 35px; + left: 70px; + } +} + +@media (max-width: 769px) { + h2, .this-week h2 { + font-size: 24px; + line-height: 28px; + margin-bottom: 1em; + } + body > header, .rhd-banner { + padding-left: 30px; + padding-right: 30px; + } + body > header { + height: auto; + } + header a.site-home { + flex: 0 0 auto; + font-size: 32px; + } + body > header > nav a { + font-size: 24px; + } + .this-week h2 { + line-height: 34px; + } + main { + flex-direction: column; + } + main article > * { + padding-left: 30px; + padding-right: 30px; + } +} + +@media (prefers-color-scheme: dark) { + body { + color: white; + background: black; + } + + h3 { color: #bababa; } + a { color: #6BB5FF; } +} diff --git a/data/people/alex-porcelli.json b/data/people/alex-porcelli.json new file mode 100644 index 00000000..7729d0c6 --- /dev/null +++ b/data/people/alex-porcelli.json @@ -0,0 +1 @@ +{"name":"Alex Porcelli","job_title":"Sr. Principal Software Engineer","twitter":"porcelli"} \ No newline at end of file diff --git a/data/people/example-author.json b/data/people/example-author.json new file mode 100644 index 00000000..2dcacf39 --- /dev/null +++ b/data/people/example-author.json @@ -0,0 +1 @@ +{"name":"Example Author","email":"example@redhat.com","emailhash":"123456487564321351531354153","job_title":"Example Job Title","twitter":"exampletwitter","bio":"Example really came from nothing. She took it upon herself to make something. Something is really quite remarkable."} \ No newline at end of file diff --git a/data/people/paul-robinson.json b/data/people/paul-robinson.json new file mode 100644 index 00000000..49120d94 --- /dev/null +++ b/data/people/paul-robinson.json @@ -0,0 +1 @@ +{"name":"Paul Robinson","job_title":"Software Engineering Manager"} \ No newline at end of file diff --git a/img/favicon.ico b/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c1a7877da003cd9f64c7e50a7383490221fd4fdd GIT binary patch literal 1150 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 bg<$>y!2BS^H3vd$00000NkvXXu0mjf6lt*# literal 0 HcmV?d00001 diff --git a/img/people/default_usericon.png b/img/people/default_usericon.png new file mode 100644 index 0000000000000000000000000000000000000000..5f11b2921b971b9490ac8ff2a6603934035b570c GIT binary patch literal 1151 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 W&DTGZ^s0RT0000h<^0000PbVXQnQ*UN; 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 SsgY;Le>>N?3aSJ2>Hh%Od@eEo literal 0 HcmV?d00001 diff --git a/img/people/pedro-silva.png b/img/people/pedro-silva.png new file mode 100644 index 0000000000000000000000000000000000000000..9acb1cd6d50a7dd042205f1a83db0eede9c3a589 GIT binary patch literal 7925 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 Iol`;+09N0rS^xk5 literal 0 HcmV?d00001 diff --git a/img/people/stefan-sitani.png b/img/people/stefan-sitani.png new file mode 100644 index 0000000000000000000000000000000000000000..8eef1015a6391dd24a27f2eb4675ede5cba114a9 GIT binary patch literal 19484 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 z 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 yYth)85s4;Qi(b!~X@T;qPYv literal 0 HcmV?d00001 diff --git a/img/redhat_reversed.svg b/img/redhat_reversed.svg new file mode 100644 index 00000000..37fe83c4 --- /dev/null +++ b/img/redhat_reversed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/sponsored_by_redhat_reversed.svg b/img/sponsored_by_redhat_reversed.svg new file mode 100644 index 00000000..5cc63442 --- /dev/null +++ b/img/sponsored_by_redhat_reversed.svg @@ -0,0 +1 @@ +Logo-Red_Hat-Sponsored_By-A-Reverse-RGB \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000..6e948493 --- /dev/null +++ b/index.html @@ -0,0 +1,135 @@ + + + + + + + + + This Week in JBoss - July 03, 2023 - JBoss.org + + + + + + + + + + +

+ JBoss.ORG + +
+ +
+

Stay in touch with Red Hat Developer

+
+

Red Hat uses the best and most effective ideas from the community projects to build + enterprise products. These products remain open and are being used all around the world + by corporations, governments, and non-profit organizations.

+ Learn more at developers.redhat.com + @rhdevelopers +
+
+
+
+ +

This Week in JBoss - July 03, 2023

+
+ + Don Naro +
+ +

Hello to our dear JBoss community. +We, the editorial team, have noticed a downward trend in our readership and have made the decision to no longer carry on. +There are many great blogs out there and the JBoss community of projects is producing a lot of great content for you to learn from. +However, with the steady decline in our editorial views, we no longer feel the effort we put into distilling the blogs and tutorials is having the sort of impact that we would hope. +Writing up the editorials is more work than you might expect and takes a good chunk of time that we could devote to doing our actual jobs or hacking on code.

+

It has been a great ride and we wish you all the best. +We thought about doing a sort of highlight reel to round up some of our favourite blog posts and moments doing the editorial, but realized probably no one is going to read it. +So let’s stop shouting into the void and carry on building cool stuff.

+

Thanks for everything and goodbye.

+
+ +
+
+ +
+ + + + + + + + + \ No newline at end of file diff --git a/js/cpx-footer.js b/js/cpx-footer.js new file mode 100644 index 00000000..b5d38048 --- /dev/null +++ b/js/cpx-footer.js @@ -0,0 +1,44 @@ +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var CPXFooter = (function (_super) { + __extends(CPXFooter, _super); + function CPXFooter() { + var _this = _super.call(this) || this; + _this.template = document.createElement("template"); + _this.attachShadow({ mode: "open" }); + return _this; + } + Object.defineProperty(CPXFooter.prototype, "html", { + get: function () { + return "\n \n\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n CC by 3.0 | \n Trademarks | \n Red Hat Privacy Policy\n
\n \n "; + }, + enumerable: false, + configurable: true + }); + CPXFooter.prototype.connectedCallback = function () { + this.shadowRoot.innerHTML = ""; + this.template.innerHTML = this.html; + if (window['ShadyCSS']) { + window['ShadyCSS'].prepareTemplate(this.template, CPXFooter.tag); + } + this.shadowRoot.appendChild(this.template.content.cloneNode(true)); + }; + CPXFooter.tag = 'cpx-footer'; + return CPXFooter; +}(HTMLElement)); +window.customElements.define('cpx-footer', CPXFooter); +window.addEventListener('load', function (event) { + var sponsorFooter = new CPXFooter(); + document.body.appendChild(sponsorFooter); +}); diff --git a/js/cpx-search/cpx-query.js b/js/cpx-search/cpx-query.js new file mode 100644 index 00000000..99949a51 --- /dev/null +++ b/js/cpx-search/cpx-query.js @@ -0,0 +1,308 @@ +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var CPXQuery = (function (_super) { + __extends(CPXQuery, _super); + function CPXQuery() { + var _this = _super.call(this) || this; + _this._filters = { term: '', facets: {} }; + _this._activeFilters = new Map(); + _this._limit = 10; + _this._from = 0; + _this._sort = 'relevance'; + _this._valid = true; + _this._auto = false; + _this.urlTemplate = function (strings, url, term, from, limit, sort, types, tags, sys_types) { + var order = ''; + if (sort === 'most-recent') { + order = '&newFirst=true'; + } + return url + "?start=" + from + "&q=" + term + "&hl=true&hl.fl=description&rows=" + limit + "&" + types + "&" + tags + "&" + sys_types; + }; + _this._changeAttr = _this._changeAttr.bind(_this); + return _this; + } + Object.defineProperty(CPXQuery.prototype, "auto", { + get: function () { + return this._auto; + }, + set: function (val) { + this._auto = val !== null; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(CPXQuery.prototype, "filters", { + get: function () { + return this._filters; + }, + set: function (val) { + if (this._filters === val) + return; + this._filters = val; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(CPXQuery.prototype, "activeFilters", { + get: function () { + return this._activeFilters; + }, + set: function (val) { + if (this._activeFilters === val) + return; + this._activeFilters = val; + this.filters.facets = this._activeFilters; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(CPXQuery.prototype, "from", { + get: function () { + return this._from; + }, + set: function (val) { + if (this._from === val) + return; + this._from = val; + this.setAttribute('from', val.toString()); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(CPXQuery.prototype, "limit", { + get: function () { + return this._limit; + }, + set: function (val) { + if (this._limit === val) + return; + this._limit = val; + this.setAttribute('limit', val.toString()); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(CPXQuery.prototype, "sort", { + get: function () { + return this._sort; + }, + set: function (val) { + if (this._sort === val) + return; + this._sort = val; + this.setAttribute('sort', val); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(CPXQuery.prototype, "results", { + get: function () { + return this._results; + }, + set: function (val) { + if (this._results === val) + return; + this._results = val; + this.from = this.results && this.results.response && typeof this.results.response.docs !== 'undefined' ? this.from + this.results.response.docs.length : 0; + var evt = { + detail: { + term: this.term, + filters: this.activeFilters, + facets: this.results.facet_counts || {}, + sort: this.sort, + limit: this.limit, + from: this.from, + results: this.results.hits, + }, + bubbles: true, + composed: true + }; + this.dispatchEvent(new CustomEvent('search-complete', evt)); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(CPXQuery.prototype, "term", { + get: function () { + return this._term; + }, + set: function (val) { + if (this._term === val) + return; + this._term = val; + this.filters.term = this._term; + this.setAttribute('term', val.toString()); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(CPXQuery.prototype, "url", { + get: function () { + return this._url; + }, + set: function (val) { + if (this._url === val) + return; + this._url = val; + this.setAttribute('url', val.toString()); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(CPXQuery.prototype, "valid", { + get: function () { + return this._valid; + }, + set: function (val) { + if (this._valid === val) + return; + this._valid = val; + }, + enumerable: false, + configurable: true + }); + CPXQuery.prototype.filterString = function (facets) { + var len = facets.length, filterArr = []; + for (var i = 0; i < len; i++) { + for (var j = 0; j < facets[i].items.length; j++) { + if (facets[i].items[j].active) { + var idx = 0; + while (idx < facets[i].items[j].value.length) { + filterArr.push(facets[i].items[j].value[idx]); + idx = idx + 1; + } + } + } + } + return filterArr.join(', '); + }; + CPXQuery.prototype.connectedCallback = function () { + top.addEventListener('params-ready', this._changeAttr); + top.addEventListener('term-change', this._changeAttr); + top.addEventListener('filter-item-change', this._changeAttr); + top.addEventListener('sort-change', this._changeAttr); + top.addEventListener('clear-filters', this._changeAttr); + top.addEventListener('load-more', this._changeAttr); + if (this.auto) { + this.search(); + } + }; + Object.defineProperty(CPXQuery, "observedAttributes", { + get: function () { + return ['term', 'sort', 'limit', 'results', 'url', 'auto']; + }, + enumerable: false, + configurable: true + }); + CPXQuery.prototype.attributeChangedCallback = function (name, oldVal, newVal) { + this[name] = newVal; + }; + CPXQuery.prototype._setFilters = function (item) { + var add = item.active; + if (add) { + if (this.activeFilters.has(item.group)) { + this.activeFilters.get(item.group).add(item.key); + } + else { + this.activeFilters.set(item.group, new Set([item.key])); + } + } + else { + if (this.activeFilters.has(item.group)) { + this.activeFilters.get(item.group).delete(item.key); + if (this.activeFilters.get(item.group).size === 0) { + this.activeFilters.delete(item.group); + } + } + } + }; + CPXQuery.prototype._changeAttr = function (e) { + switch (e.type) { + case 'term-change': + if (e.detail && e.detail.term && e.detail.term.length > 0) { + this.term = e.detail.term; + } + else { + this.term = ''; + } + this.from = 0; + this.search(); + break; + case 'filter-item-change': + if (e.detail && e.detail.facet) { + this._setFilters(e.detail.facet); + } + this.from = 0; + this.search(); + break; + case 'sort-change': + if (e.detail && e.detail.sort) { + this.sort = e.detail.sort; + } + this.from = 0; + this.search(); + break; + case 'load-more': + this.search(); + break; + case 'clear-filters': + this.activeFilters.clear(); + this.search(); + break; + case 'params-ready': + if (e.detail && e.detail.term) { + this.term = e.detail.term; + } + if (e.detail && e.detail.sort) { + this.sort = e.detail.sort; + } + if (e.detail && e.detail.filters) { + this.activeFilters = e.detail.filters; + } + this.from = 0; + if (this.activeFilters.size > 0 || e.detail.term !== null || e.detail.sort !== null || e.detail.qty !== null) { + this.search(); + } + break; + } + }; + CPXQuery.prototype.search = function () { + var _this = this; + var evt = { bubbles: true, composed: true }; + this.dispatchEvent(new CustomEvent('search-start', evt)); + if (this.url && ((this.activeFilters && this.activeFilters.size > 0) || (this.term !== null && this.term !== '' && typeof this.term !== 'undefined')) || this.auto) { + var qURL_1 = new URL(this.url); + qURL_1.searchParams.set('start', this.from.toString()); + qURL_1.searchParams.set('q', this.term || ''); + qURL_1.searchParams.set('hl', 'true'); + qURL_1.searchParams.set('hl.fl', 'description'); + qURL_1.searchParams.set('size', this.limit.toString()); + this.activeFilters.forEach(function (filters, group) { + qURL_1.searchParams.set(group, Array.from(filters).join(',')); + }); + fetch(qURL_1.toString()) + .then(function (resp) { return resp.json(); }) + .then(function (data) { + _this.results = data; + }); + } + else { + var evt_1 = { detail: { invalid: true }, bubbles: true, composed: true }; + this.dispatchEvent(new CustomEvent('search-complete', evt_1)); + } + }; + return CPXQuery; +}(HTMLElement)); +export default CPXQuery; +window.customElements.define('cpx-query', CPXQuery); diff --git a/js/cpx-search/cpx-result.js b/js/cpx-search/cpx-result.js new file mode 100644 index 00000000..ae744a79 --- /dev/null +++ b/js/cpx-search/cpx-result.js @@ -0,0 +1,267 @@ +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var CPXResult = (function (_super) { + __extends(CPXResult, _super); + function CPXResult() { + var _this = _super.call(this) || this; + _this._layout = '
{{description}}
'; + _this.template = document.createElement("template"); + _this.attachShadow({ mode: "open" }); + return _this; + } + Object.defineProperty(CPXResult.prototype, "html", { + get: function () { + return "\n \n
\n

\n " + (this.created ? "" + this.created + "" : '') + "\n " + (this.author ? " | " + this.author : '') + "\n \n

\n

" + (this.url ? "" + this.title + "" : this.title) + "

\n \n
\n" + (this.thumbnail ? "
" : ''); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(CPXResult.prototype, "layout", { + get: function () { + return this._layout; + }, + set: function (val) { + this._layout = val; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(CPXResult.prototype, "url", { + get: function () { + var stage = window.location.href.indexOf('stage') >= 0 || window.location.href.indexOf('developers') < 0 ? '.stage' : ''; + return !this.premium ? this._url : "https://broker" + stage + ".redhat.com/partner/drc/userMapping?redirect=" + encodeURIComponent(this._url); + }, + set: function (val) { + if (this._url === val) + return; + this._url = val; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(CPXResult.prototype, "author", { + get: function () { + return this._author; + }, + set: function (val) { + if (this._author === val) + return; + this._author = val; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(CPXResult.prototype, "title", { + get: function () { + return this._title; + }, + set: function (val) { + if (this._title === val) + return; + this._title = val; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(CPXResult.prototype, "kind", { + get: function () { + return this._kind; + }, + set: function (val) { + if (this._kind === val) + return; + this._kind = val; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(CPXResult.prototype, "created", { + get: function () { + return this._created; + }, + set: function (val) { + if (this._created === val) + return; + this._created = val; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(CPXResult.prototype, "description", { + get: function () { + return this._description; + }, + set: function (val) { + if (this._description === val) + return; + this._description = val; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(CPXResult.prototype, "premium", { + get: function () { + return this._premium; + }, + set: function (val) { + if (this._premium === val) + return; + this._premium = val; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(CPXResult.prototype, "thumbnail", { + get: function () { + return this._thumbnail; + }, + set: function (val) { + if (this._thumbnail === val) + return; + this._thumbnail = val; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(CPXResult.prototype, "result", { + get: function () { + return this._result; + }, + set: function (val) { + if (this._result === val) + return; + this._result = val; + this.title = this._result.fields.sys_title[0] ? this._result.fields.sys_title[0] : 'Default Title'; + this.description = this._result.fields.sys_description[0] ? this._result.fields.sys_description[0] : 'Default Description'; + this.url = this._result.fields.sys_url_view[0] ? this._result.fields.sys_url_view[0] : '#'; + this.kind = this._result._type ? this._result._type : 'webpage'; + this.author = this._result.fields.author[0] ? this._result.fields.author[0] : undefined; + this.created = this._result.fields.sys_created[0] ? this._result.fields.sys_created[0] : 'Published'; + this.renderResult(); + }, + enumerable: false, + configurable: true + }); + CPXResult.prototype.render = function () { + this.shadowRoot.innerHTML = ""; + this.template.innerHTML = this.injectData(this.layout); + if (window['ShadyCSS']) { + window['ShadyCSS'].prepareTemplate(this.template, CPXResult.tag); + } + this.shadowRoot.appendChild(this.template.content.cloneNode(true)); + }; + CPXResult.prototype.connectedCallback = function () { + this.render(); + }; + Object.defineProperty(CPXResult, "observedAttributes", { + get: function () { + return ['result']; + }, + enumerable: false, + configurable: true + }); + CPXResult.prototype.attributeChangedCallback = function (name, oldVal, newVal) { + this[name] = newVal; + }; + CPXResult.prototype.renderResult = function () { + this.render(); + }; + CPXResult.prototype.computeThumbnail = function (result) { + if (result.fields.thumbnail) { + this.thumbnail = result.fields.thumbnail[0]; + } + }; + CPXResult.prototype.injectData = function (layout) { + var _this = this; + var re = /(\{\{\w+\}\})/gm; + var br = /[\{\}]+/g; + var fill = function (match, p1, offset, string) { + return _this[match.replace(br, '')] ? _this[match.replace(br, '')] : ''; + }; + return layout.replace(re, fill); + }; + CPXResult.prototype.computeTitle = function (result) { + var title = ''; + if (result.highlight && result.highlight.sys_title) { + title = result.highlight.sys_title[0]; + } + else { + title = result.fields.sys_title[0]; + } + this.title = title; + }; + CPXResult.prototype.computeKind = function (result) { + var kind = result.fields.sys_type || "webpage", map = { + jbossdeveloper_archetype: 'Archetype', + article: 'Article', + blogpost: 'Blog Post', + jbossdeveloper_bom: 'Bom', + book: 'Book', + cheatsheet: 'Cheat Sheet', + demo: 'Demo', + event: 'Event', + forumthread: 'Forum Thread', + jbossdeveloper_example: 'Demo', + quickstart: 'Quickstart', + quickstart_early_access: 'Demo', + solution: 'Article', + stackoverflow_thread: 'Stack Overflow', + video: 'Video', + webpage: 'Web Page', + website: 'Web Page' + }; + this.kind = map[kind] || 'Web Page'; + }; + CPXResult.prototype.computeCreated = function (result) { + this.created = result.fields.sys_created && result.fields.sys_created.length > 0 ? result.fields.sys_created[0] : ''; + }; + CPXResult.prototype.computeDescription = function (result) { + var description = ''; + if (result.highlight && result.highlight.sys_description) { + description = result.highlight.sys_description[0]; + } + else if (result.highlight && result.highlight.sys_content_plaintext) { + description = result.highlight.sys_content_plaintext[0]; + } + else if (result.fields && result.fields.sys_description) { + description = result.fields.sys_description[0]; + } + else { + description = result.fields.sys_content_plaintext ? result.fields.sys_content_plaintext[0] : ''; + } + var tempDiv = document.createElement("div"); + tempDiv.innerHTML = description; + description = tempDiv.innerText; + this.description = description; + }; + CPXResult.prototype.computeURL = function (result) { + if (result.fields && result.fields.sys_type === 'book' && result.fields.field_book_url) { + this.url = result.fields.field_book_url; + } + else { + this.url = (result.fields && result.fields.sys_url_view) ? result.fields.sys_url_view : ''; + } + }; + CPXResult.prototype.computePremium = function (result) { + var premium = false; + if (result._type === "rht_knowledgebase_article" || result._type === "rht_knowledgebase_solution") { + premium = true; + } + this.premium = premium; + }; + CPXResult.tag = 'cpx-result'; + return CPXResult; +}(HTMLElement)); +export default CPXResult; +window.customElements.define('cpx-result', CPXResult); diff --git a/js/cpx-search/cpx-results.js b/js/cpx-search/cpx-results.js new file mode 100644 index 00000000..2251ed12 --- /dev/null +++ b/js/cpx-search/cpx-results.js @@ -0,0 +1,214 @@ +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +import CPXResult from './cpx-result.js'; +var CPXResults = (function (_super) { + __extends(CPXResults, _super); + function CPXResults() { + var _this = _super.call(this) || this; + _this._resultLayout = "
{{description}}
"; + _this._more = false; + _this._last = 0; + _this._valid = true; + _this.template = document.createElement("template"); + _this.attachShadow({ mode: "open" }); + _this._renderResults = _this._renderResults.bind(_this); + _this._setLoading = _this._setLoading.bind(_this); + _this._checkValid = _this._checkValid.bind(_this); + _this._clearResults = _this._clearResults.bind(_this); + return _this; + } + Object.defineProperty(CPXResults.prototype, "html", { + get: function () { + return "\n \n \n
\n \n

- End of Results -

\n
\n

Well, this is awkward. No search term was entered yet, so this page is a little empty right now.

\n

After you enter a search term in the box above, you will see the results displayed here. \n You can also use the filters to select a content type, product or topic to see some results too. \n Try it out!

\n
"; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(CPXResults.prototype, "results", { + get: function () { + return this._results; + }, + set: function (val) { + if (this._results === val) + return; + this._results = val; + this._renderResults(false); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(CPXResults.prototype, "more", { + get: function () { + return this._more; + }, + set: function (val) { + if (this._more === val) + return; + this._more = val; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(CPXResults.prototype, "last", { + get: function () { + return this._last; + }, + set: function (val) { + if (this._last === val) + return; + this._last = val ? val : 0; + this.setAttribute('last', val.toString()); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(CPXResults.prototype, "valid", { + get: function () { + return this._valid; + }, + set: function (val) { + if (this._valid === val) + return; + this._valid = val; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(CPXResults.prototype, "resultLayout", { + get: function () { + return this._resultLayout; + }, + set: function (val) { + if (this._resultLayout === val) + return; + this._resultLayout = val; + }, + enumerable: false, + configurable: true + }); + CPXResults.prototype.render = function () { + this.shadowRoot.innerHTML = ""; + this.template.innerHTML = this.html; + if (window['ShadyCSS']) { + window['ShadyCSS'].prepareTemplate(this.template, CPXResults.tag); + } + this.shadowRoot.appendChild(this.template.content.cloneNode(true)); + }; + CPXResults.prototype.connectedCallback = function () { + var _this = this; + if (this.querySelector('template')) { + this.resultLayout = this.querySelector('template').innerHTML; + } + this.render(); + this.shadowRoot.querySelector('div.moreBtn').addEventListener('click', function (e) { + e.preventDefault(); + _this.more = true; + var evt = { + detail: { + from: _this.last + }, + bubbles: true, + composed: true + }; + _this.dispatchEvent(new CustomEvent('load-more', evt)); + }); + top.addEventListener('search-complete', this._renderResults); + top.addEventListener('search-start', this._setLoading); + top.addEventListener('params-ready', this._checkValid); + top.addEventListener('popstate', this._clearResults); + }; + CPXResults.prototype.addResult = function (result) { + var item = new CPXResult(); + item.result = result; + item.layout = this.resultLayout; + this.appendChild(item); + }; + CPXResults.prototype._setLoading = function (e) { + this.shadowRoot.querySelector('div.moreBtn').setAttribute('data-hide', ''); + this.shadowRoot.querySelector('.invalidMsg').setAttribute('data-hide', ''); + if (!this.more) { + this.last = 0; + while (this.firstChild) { + this.removeChild(this.firstChild); + } + } + else { + this.more = false; + } + this.shadowRoot.querySelector('.loading').removeAttribute('data-hide'); + }; + CPXResults.prototype._renderResults = function (e) { + if (this.shadowRoot.querySelector('.loading')) { + this.shadowRoot.querySelector('.loading').setAttribute('data-hide', ''); + } + if (e.detail && typeof e.detail.results !== 'undefined' && typeof e.detail.invalid === 'undefined') { + this.addResults(e.detail.results); + } + else { + while (this.firstChild) { + this.removeChild(this.firstChild); + } + this.shadowRoot.querySelector('.end-of-results').setAttribute('data-hide', ''); + this.shadowRoot.querySelector('div.moreBtn').setAttribute('data-hide', ''); + this.shadowRoot.querySelector('.invalidMsg').removeAttribute('data-hide'); + } + var evt = { + detail: { results: this.results }, + bubbles: true, + composed: true + }; + this.dispatchEvent(new CustomEvent('results-loaded', evt)); + }; + CPXResults.prototype._clearResults = function (e) { + this.results = undefined; + }; + CPXResults.prototype._checkValid = function (e) { + var obj = e.detail; + this.valid = Object.keys(obj.filters).length > 0 || (obj.term !== null && obj.term !== '' && typeof obj.term !== 'undefined'); + if (!this.valid) { + this.shadowRoot.querySelector('.invalidMsg').removeAttribute('data-hide'); + } + else { + if (this.shadowRoot.querySelector('.invalidMsg')) { + this.shadowRoot.querySelector('.invalidMsg').setAttribute('data-hide', ''); + } + } + }; + CPXResults.prototype.addResults = function (results) { + if (results && results.hits) { + var hits = results.hits; + var l = hits.length; + for (var i = 0; i < l; i++) { + this.addResult(hits[i]); + } + this.last = this.last + l; + if (this.last >= results.numFound) { + this.shadowRoot.querySelector('.end-of-results').removeAttribute('data-hide'); + } + if (l > 0 && this.last < results.numFound) { + this.shadowRoot.querySelector('.invalidMsg').setAttribute('data-hide', ''); + this.shadowRoot.querySelector('.end-of-results').setAttribute('data-hide', ''); + this.shadowRoot.querySelector('div.moreBtn').removeAttribute('data-hide'); + } + else { + this.shadowRoot.querySelector('div.moreBtn').setAttribute('data-hide', ''); + this.shadowRoot.querySelector('.end-of-results').removeAttribute('data-hide'); + } + } + }; + CPXResults.tag = 'cpx-results'; + return CPXResults; +}(HTMLElement)); +export default CPXResults; +window.customElements.define('cpx-results', CPXResults); diff --git a/js/cpx-search/cpx-search-box.js b/js/cpx-search/cpx-search-box.js new file mode 100644 index 00000000..389b2029 --- /dev/null +++ b/js/cpx-search/cpx-search-box.js @@ -0,0 +1,96 @@ +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var CPXSearchBox = (function (_super) { + __extends(CPXSearchBox, _super); + function CPXSearchBox() { + var _this = _super.call(this) || this; + _this._term = ''; + _this.name = 'Search Box'; + _this.template = document.createElement("template"); + _this.attachShadow({ mode: "open" }); + _this._checkTerm = _this._checkTerm.bind(_this); + return _this; + } + Object.defineProperty(CPXSearchBox.prototype, "html", { + get: function () { + return "\n \n
\n
\n \n
\n \n
"; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(CPXSearchBox.prototype, "term", { + get: function () { + return this._term; + }, + set: function (val) { + if (this._term === val) + return; + this._term = decodeURI(val); + this.shadowRoot.querySelector('input').setAttribute('value', this.term); + }, + enumerable: false, + configurable: true + }); + CPXSearchBox.prototype.render = function () { + this.shadowRoot.innerHTML = ""; + this.template.innerHTML = this.html; + if (window['ShadyCSS']) { + window['ShadyCSS'].prepareTemplate(this.template, CPXSearchBox.tag); + } + this.shadowRoot.appendChild(this.template.content.cloneNode(true)); + }; + CPXSearchBox.prototype.connectedCallback = function () { + var _this = this; + this.render(); + top.addEventListener('params-ready', this._checkTerm); + top.addEventListener('term-change', this._checkTerm); + this.shadowRoot.addEventListener('submit', function (e) { + e.preventDefault(); + _this._termChange(); + return false; + }); + this.shadowRoot.querySelector('#search-btn').addEventListener('click', function (e) { + }); + }; + Object.defineProperty(CPXSearchBox, "observedAttributes", { + get: function () { + return ['term']; + }, + enumerable: false, + configurable: true + }); + CPXSearchBox.prototype.attributeChangedCallback = function (name, oldVal, newVal) { + this[name] = newVal; + }; + CPXSearchBox.prototype._checkTerm = function (e) { + if (e.detail && e.detail.term) { + this.term = e.detail.term; + } + }; + CPXSearchBox.prototype._termChange = function () { + this.term = this.shadowRoot.querySelector('input').value; + var evt = { + detail: { + term: this.term + }, + bubbles: true, + composed: true + }; + this.dispatchEvent(new CustomEvent('term-change', evt)); + }; + CPXSearchBox.tag = 'cpx-search-box'; + return CPXSearchBox; +}(HTMLElement)); +export default CPXSearchBox; +window.customElements.define('cpx-search-box', CPXSearchBox); diff --git a/js/jbossorg.js b/js/jbossorg.js new file mode 100644 index 00000000..e69de29b diff --git a/js/pfe-avatar/LICENSE.txt b/js/pfe-avatar/LICENSE.txt new file mode 100644 index 00000000..599bd61b --- /dev/null +++ b/js/pfe-avatar/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright 2020 Red Hat, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/js/pfe-avatar/README.md b/js/pfe-avatar/README.md new file mode 100644 index 00000000..0226e762 --- /dev/null +++ b/js/pfe-avatar/README.md @@ -0,0 +1,65 @@ +# PFElements Avatar Element + +`pfe-avatar` is an element for displaying a user's avatar image. If the user in question has provided a custom avatar, provide it and it will be displayed. If they don't, a nice colored pattern will be generated based on their name. A specific name will always generate the same pattern, so users' avatars will stay static without the need for storing their generated image. + +## Usage + +```html + + + + + + + +``` + +## Attributes + +### pfe-name (observed) (required) + +The user's name, either given name and family name, or username. When displaying a pattern, the name will be used to seed the pattern generator. + +### pfe-src (observed) + +The URL to the user's custom avatar image. It will be displayed instead of a random pattern. + +### pfe-pattern (observed) + +The type of pattern to display. Currently supported values are `"squares"` and `"triangles"`. + +| squares | triangles | +| ------------------------------- | ----------------------------------- | +| ![squares image](./squares.png) | ![triangles image](./triangles.png) | + +### pfe-shape (observed) + +The shape of the avatar itself. Supported values are `"square"` (default), `"rounded"`, and `"circle"`. + +## Styling + +| Theme Var Hook | Description | Default | +| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------- | +| `--pfe-avatar--colors` | A space-delimited list of colors to use for generated patterns. Only hex values are supported, ex: `#fc0` or `#0fcb41`. Any number of colors may be provided. | `#3B0083 #f0ab00 #007a87 #00b9e4 #92d400` | + +## Test + + npm run test + +## Build + + npm run build + +## Demo + +From the PFElements root directory, run: + + npm start + +## Code style + +Avatar (and all PFElements) use [Prettier][prettier] to auto-format JS and JSON. The style rules get applied when you commit a change. If you choose to, you can [integrate your editor][prettier-ed] with Prettier to have the style rules applied on every save. + +[prettier]: https://github.com/prettier/prettier/ +[prettier-ed]: https://prettier.io/docs/en/editors.html +[web-component-tester]: https://github.com/Polymer/web-component-tester diff --git a/js/pfe-avatar/dist/pfe-avatar.js b/js/pfe-avatar/dist/pfe-avatar.js new file mode 100644 index 00000000..1db03b8f --- /dev/null +++ b/js/pfe-avatar/dist/pfe-avatar.js @@ -0,0 +1,490 @@ +import PFElement from '../../pfelement/dist/pfelement.js'; + +/** + * djb2 string hashing function. + * + * @see http://www.cse.yorku.ca/~oz/hash.html + * @param {String} str the string to hash. + * @return {Number} a positive integer + */ + +function hash(str) { + let hash = 5381; + let i = str.length; + + while (i) { + hash = (hash * 33) ^ str.charCodeAt(--i); + } + + return hash >>> 0; +} + +function h2rgb(v1, v2, vH) { + if (vH < 0) vH += 1; + if (vH > 1) vH -= 1; + if (6 * vH < 1) return v1 + (v2 - v1) * 6 * vH; + if (2 * vH < 1) return v2; + if (3 * vH < 2) return v1 + (v2 - v1) * (2 / 3 - vH) * 6; + return v1; +} + +/** + * Convert an HSL color to RGB. + * + * @param {Number} H the hue component + * @param {Number} S the saturation component + * @param {Number} L the luminance component + * @return {Array} [R, G, B] + * + * @see https://www.easyrgb.com/en/math.php + */ +function hsl2rgb(_H, _S, _L) { + let R, G, B; + + const H = Math.max(0, Math.min(1, _H)); + const S = Math.max(0, Math.min(1, _S)); + const L = Math.max(0, Math.min(1, _L)); + + if (S == 0) { + R = L * 255; + G = L * 255; + B = L * 255; + } else { + let a, b; + + if (L < 0.5) { + b = L * (1 + S); + } else { + b = L + S - S * L; + } + + a = 2 * L - b; + + R = Math.floor(255 * h2rgb(a, b, H + 1 / 3)); + G = Math.floor(255 * h2rgb(a, b, H)); + B = Math.floor(255 * h2rgb(a, b, H - 1 / 3)); + } + + return [R, G, B]; +} + +/** + * Convert an RGBcolor to HSL. + * + * @param {Number} R the red component + * @param {Number} G the green component + * @param {Number} B the blue component + * @return {Array} [H, S, L] + * + * @see https://www.easyrgb.com/en/math.php + */ +function rgb2hsl(_R, _G, _B) { + let H, S, L; + + const R = Math.max(0, Math.min(255, _R)); + const G = Math.max(0, Math.min(255, _G)); + const B = Math.max(0, Math.min(255, _B)); + + const r = R / 255; + const g = G / 255; + const b = B / 255; + + const var_min = Math.min(Math.min(r, g), b); + const var_max = Math.max(Math.max(r, g), b); + const del_max = var_max - var_min; + + L = (var_max + var_min) / 2; + + if (del_max === 0) { + H = 0; + S = 0; + } else { + if (L < 0.5) { + S = del_max / (var_max + var_min); + } else { + S = del_max / (2 - var_max - var_min); + } + + const del_r = ((var_max - r) / 6 + del_max / 2) / del_max; + const del_g = ((var_max - g) / 6 + del_max / 2) / del_max; + const del_b = ((var_max - b) / 6 + del_max / 2) / del_max; + + if (r == var_max) { + H = del_b - del_g; + } else if (g == var_max) { + H = 1 / 3 + del_r - del_b; + } else if (b == var_max) { + H = 2 / 3 + del_g - del_r; + } + + if (H < 0) { + H += 1; + } else if (H > 1) { + H -= 1; + } + } + + return [H, S, L]; +} + +/*! + * PatternFly Elements: PfeAvatar 1.0.0-prerelease.55 + * @license + * Copyright 2020 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * +*/ + +class PfeAvatar extends PFElement { + static get version() { + return "1.0.0-prerelease.55"; + } + + get html() { + return ` +`; + } + static get tag() { + return "pfe-avatar"; + } + + get templateUrl() { + return "pfe-avatar.html"; + } + + get styleUrl() { + return "pfe-avatar.scss"; + } + + static get observedAttributes() { + return ["pfe-name", "pfe-pattern", "pfe-src", "pfe-shape"]; + } + + static get events() { + return { + connected: `${this.tag}:connected` + }; + } + + static get patterns() { + return { + triangles: "triangles", + squares: "squares" + }; + } + + static get defaultSize() { + return 128; + } + + static get defaultColors() { + return "#67accf #448087 #709c6b #a35252 #826cbb"; + } + + get name() { + return this.getAttribute("pfe-name"); + } + + set name(val) { + return this.setAttribute("pfe-name", val); + } + + get src() { + return this.getAttribute("pfe-src"); + } + + set src(href) { + return this.setAttribute("pfe-src", href); + } + + get pattern() { + return this.getAttribute("pfe-pattern") || PfeAvatar.patterns.squares; + } + + set pattern(name) { + if (!PfeAvatar.patterns[name]) { + this.log( + `invalid pattern "${name}", valid patterns are: ${Object.values( + PfeAvatar.patterns + )}` + ); + return; + } + return this.setAttribute("pfe-pattern", name); + } + + constructor() { + super(PfeAvatar); + } + + connectedCallback() { + super.connectedCallback(); + + this._initCanvas(); + + this.emitEvent(PfeAvatar.events.connected, { + bubbles: false + }); + } + + attributeChangedCallback(attr, oldValue, newValue) { + super.attributeChangedCallback(...arguments); + + if (this.connected) { + this.update(); + } else { + this.addEventListener(PfeAvatar.events.connected, () => this.update()); + } + } + + _initCanvas() { + this._canvas = this.shadowRoot.querySelector("canvas"); + const size = + this.var("--pfe-avatar--width").replace(/px$/, "") || + PfeAvatar.defaultSize; + this._canvas.width = size; + this._canvas.height = size; + + this._squareSize = this._canvas.width / 8; + this._triangleSize = this._canvas.width / 4; + + this._ctx = this._canvas.getContext("2d"); + } + + static _registerColors() { + this.colors = []; + const themeColors = this.var("--pfe-avatar--colors") || this.defaultColors; + + themeColors.split(/\s+/).forEach(colorCode => { + let pattern; + switch (colorCode.length) { + case 4: // ex: "#0fc" + pattern = /^#([A-f0-9])([A-f0-9])([A-f0-9])$/.exec(colorCode); + if (pattern) { + pattern.shift(); + const color = pattern.map(c => parseInt(c + c, 16)); + this._registerColor(color); + } else { + this.log(`[pfe-avatar] invalid color ${colorCode}`); + } + break; + case 7: // ex: "#00ffcc" + pattern = /^#([A-f0-9]{2})([A-f0-9]{2})([A-f0-9]{2})$/.exec( + colorCode + ); + if (pattern) { + pattern.shift(); + const color = pattern.map(c => parseInt(c, 16)); + this._registerColor(color); + } else { + this.log(`[pfe-avatar] invalid color ${colorCode}`); + } + } + }); + + return this.colors; + } + + static _registerColor(color) { + PfeAvatar.colors.push({ + color1: `rgb(${color.join(",")})`, + color2: `rgb(${this._adjustColor(color).join(",")})` + }); + } + + static _adjustColor(color) { + const dark = 0.1; + const l_adj = 0.1; // luminance adjustment + const hsl = rgb2hsl(...color); + + // if luminance is too dark already, then lighten the alternate color + // instead of darkening it. + hsl[2] += hsl[2] > dark ? -l_adj : l_adj; + + return hsl2rgb(...hsl); + } + + update() { + // if we have a src element, update the img, otherwise update the random pattern + if (this.hasAttribute("pfe-src")) { + this.shadowRoot.querySelector("img").src = this.src; + } else { + const bitPattern = hash(this.name).toString(2); + const arrPattern = bitPattern.split("").map(n => Number(n)); + this._colorIndex = Math.floor( + (PfeAvatar.colors.length * parseInt(bitPattern, 2)) / Math.pow(2, 32) + ); + this.color1 = PfeAvatar.colors[this._colorIndex].color1; + this.color2 = PfeAvatar.colors[this._colorIndex].color2; + + this._clear(); + this._drawBackground(); + if (this.pattern === PfeAvatar.patterns.squares) { + this._drawSquarePattern(arrPattern); + } else if (this.pattern === PfeAvatar.patterns.triangles) { + this._drawTrianglePattern(arrPattern); + } + // this._drawGradient(); + } + } + + _clear() { + this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height); + } + + _drawBackground() { + this._ctx.fillStyle = this.color1; + this._ctx.fillRect(0, 0, this._canvas.width, this._canvas.height); + } + + _drawSquarePattern(pattern) { + this._ctx.fillStyle = this.color2; + if (this._ctx) { + let i = pattern.length; + while (i--) { + if (pattern[i]) { + this._drawMirroredSquare(i % 4, Math.floor(i / 4)); + } + } + } + } + + /** + * Draw a square at the given position, mirrored onto both the left and right half of the canvas. + */ + _drawMirroredSquare(x, y) { + if (this._ctx) { + this._drawSquare(x, y); + this._drawSquare(7 - x, y); + } + } + + _drawSquare(x, y) { + this._ctx.fillRect( + this._squareSize * x, + this._squareSize * y, + this._squareSize, + this._squareSize + ); + } + + _drawTrianglePattern(pattern) { + this._ctx.fillStyle = this.color2; + if (this._ctx) { + let i = pattern.length; + while (i--) { + if (pattern[i]) { + const x = Math.floor(i / 2) % 2; + const y = Math.floor(i / 4); + const alt = i % 4; + + const p1 = [x, y]; + const p2 = [x, y]; + const p3 = [x, y]; + + switch (alt) { + case 0: + p2[1]++; + p3[0]++; + p3[1]++; + break; + case 1: + p2[0]++; + p3[0]++; + p3[1]++; + break; + case 2: + p2[0]++; + p3[1]++; + break; + case 3: + p1[0]++; + p2[0]++; + p2[1]++; + p3[1]++; + break; + } + + this._drawMirroredTriangle(p1, p2, p3); + } + } + } + } + + /** + * Draw a square at the given position in the top-left quadrant of the + * canvas, and mirrored to the other three quadrants. + */ + _drawMirroredTriangle(p1, p2, p3) { + if (this._ctx) { + this._drawTriangle(p1, p2, p3); + this._drawTriangle( + [4 - p1[0], p1[1]], + [4 - p2[0], p2[1]], + [4 - p3[0], p3[1]] + ); + } + } + + _drawTriangle(p1, p2, p3) { + this._ctx.beginPath(); + this._ctx.moveTo(...p1.map(c => c * this._triangleSize)); + this._ctx.lineTo(...p2.map(c => c * this._triangleSize)); + this._ctx.lineTo(...p3.map(c => c * this._triangleSize)); + this._ctx.closePath(); + this._ctx.fill(); + this._ctx.fill(); + } + + _drawGradient() { + const gradient = this._ctx.createLinearGradient( + 0, + this._canvas.height, + this._canvas.width, + 0 + ); + const color = this.color2; + let gradientColor1 = color; + let gradientColor2 = color; + if (/^#[A-f0-9]{3}$/.test(color)) { + // color is of the form "#fff" + gradientColor1 += "c"; + gradientColor2 += "0"; + } else if (/^#[A-f0-9]{6}$/.test(color)) { + // color is of the form "#ffffff" + gradientColor1 += "cc"; + gradientColor2 += "00"; + } + gradient.addColorStop(0, gradientColor1); + gradient.addColorStop(1, gradientColor2); + gradient.addColorStop(1, gradientColor1); + this._ctx.fillStyle = gradient; + this._ctx.fillRect(0, 0, this._canvas.width, this._canvas.height); + } +} + +PfeAvatar._registerColors(); + +PFElement.create(PfeAvatar); + +export default PfeAvatar; +//# sourceMappingURL=pfe-avatar.js.map diff --git a/js/pfe-avatar/dist/pfe-avatar.js.map b/js/pfe-avatar/dist/pfe-avatar.js.map new file mode 100644 index 00000000..48a8dcb7 --- /dev/null +++ b/js/pfe-avatar/dist/pfe-avatar.js.map @@ -0,0 +1 @@ +{"version":3,"file":"pfe-avatar.js","sources":["../_temp/djb-hash.js","../_temp/hslrgb.js","../_temp/pfe-avatar.js"],"sourcesContent":["/**\n * djb2 string hashing function.\n *\n * @see http://www.cse.yorku.ca/~oz/hash.html\n * @param {String} str the string to hash.\n * @return {Number} a positive integer\n */\n\nfunction hash(str) {\n let hash = 5381;\n let i = str.length;\n\n while (i) {\n hash = (hash * 33) ^ str.charCodeAt(--i);\n }\n\n return hash >>> 0;\n}\n\nexport { hash };\n","function h2rgb(v1, v2, vH) {\n if (vH < 0) vH += 1;\n if (vH > 1) vH -= 1;\n if (6 * vH < 1) return v1 + (v2 - v1) * 6 * vH;\n if (2 * vH < 1) return v2;\n if (3 * vH < 2) return v1 + (v2 - v1) * (2 / 3 - vH) * 6;\n return v1;\n}\n\n/**\n * Convert an HSL color to RGB.\n *\n * @param {Number} H the hue component\n * @param {Number} S the saturation component\n * @param {Number} L the luminance component\n * @return {Array} [R, G, B]\n *\n * @see https://www.easyrgb.com/en/math.php\n */\nexport function hsl2rgb(_H, _S, _L) {\n let R, G, B;\n\n const H = Math.max(0, Math.min(1, _H));\n const S = Math.max(0, Math.min(1, _S));\n const L = Math.max(0, Math.min(1, _L));\n\n if (S == 0) {\n R = L * 255;\n G = L * 255;\n B = L * 255;\n } else {\n let a, b;\n\n if (L < 0.5) {\n b = L * (1 + S);\n } else {\n b = L + S - S * L;\n }\n\n a = 2 * L - b;\n\n R = Math.floor(255 * h2rgb(a, b, H + 1 / 3));\n G = Math.floor(255 * h2rgb(a, b, H));\n B = Math.floor(255 * h2rgb(a, b, H - 1 / 3));\n }\n\n return [R, G, B];\n}\n\n/**\n * Convert an RGBcolor to HSL.\n *\n * @param {Number} R the red component\n * @param {Number} G the green component\n * @param {Number} B the blue component\n * @return {Array} [H, S, L]\n *\n * @see https://www.easyrgb.com/en/math.php\n */\nexport function rgb2hsl(_R, _G, _B) {\n let H, S, L;\n\n const R = Math.max(0, Math.min(255, _R));\n const G = Math.max(0, Math.min(255, _G));\n const B = Math.max(0, Math.min(255, _B));\n\n const r = R / 255;\n const g = G / 255;\n const b = B / 255;\n\n const var_min = Math.min(Math.min(r, g), b);\n const var_max = Math.max(Math.max(r, g), b);\n const del_max = var_max - var_min;\n\n L = (var_max + var_min) / 2;\n\n if (del_max === 0) {\n H = 0;\n S = 0;\n } else {\n if (L < 0.5) {\n S = del_max / (var_max + var_min);\n } else {\n S = del_max / (2 - var_max - var_min);\n }\n\n const del_r = ((var_max - r) / 6 + del_max / 2) / del_max;\n const del_g = ((var_max - g) / 6 + del_max / 2) / del_max;\n const del_b = ((var_max - b) / 6 + del_max / 2) / del_max;\n\n if (r == var_max) {\n H = del_b - del_g;\n } else if (g == var_max) {\n H = 1 / 3 + del_r - del_b;\n } else if (b == var_max) {\n H = 2 / 3 + del_g - del_r;\n }\n\n if (H < 0) {\n H += 1;\n } else if (H > 1) {\n H -= 1;\n }\n }\n\n return [H, S, L];\n}\n","/*!\n * PatternFly Elements: PfeAvatar 1.0.0-prerelease.55\n * @license\n * Copyright 2020 Red Hat, Inc.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n * \n*/\n\nimport PFElement from \"../../pfelement/dist/pfelement.js\";\nimport { hash } from \"./djb-hash.js\";\nimport { hsl2rgb, rgb2hsl } from \"./hslrgb.js\";\n\nclass PfeAvatar extends PFElement {\n static get version() {\n return \"1.0.0-prerelease.55\";\n }\n\n get html() {\n return `\n`;\n }\n static get tag() {\n return \"pfe-avatar\";\n }\n\n get templateUrl() {\n return \"pfe-avatar.html\";\n }\n\n get styleUrl() {\n return \"pfe-avatar.scss\";\n }\n\n static get observedAttributes() {\n return [\"pfe-name\", \"pfe-pattern\", \"pfe-src\", \"pfe-shape\"];\n }\n\n static get events() {\n return {\n connected: `${this.tag}:connected`\n };\n }\n\n static get patterns() {\n return {\n triangles: \"triangles\",\n squares: \"squares\"\n };\n }\n\n static get defaultSize() {\n return 128;\n }\n\n static get defaultColors() {\n return \"#67accf #448087 #709c6b #a35252 #826cbb\";\n }\n\n get name() {\n return this.getAttribute(\"pfe-name\");\n }\n\n set name(val) {\n return this.setAttribute(\"pfe-name\", val);\n }\n\n get src() {\n return this.getAttribute(\"pfe-src\");\n }\n\n set src(href) {\n return this.setAttribute(\"pfe-src\", href);\n }\n\n get pattern() {\n return this.getAttribute(\"pfe-pattern\") || PfeAvatar.patterns.squares;\n }\n\n set pattern(name) {\n if (!PfeAvatar.patterns[name]) {\n this.log(\n `invalid pattern \"${name}\", valid patterns are: ${Object.values(\n PfeAvatar.patterns\n )}`\n );\n return;\n }\n return this.setAttribute(\"pfe-pattern\", name);\n }\n\n constructor() {\n super(PfeAvatar);\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n this._initCanvas();\n\n this.emitEvent(PfeAvatar.events.connected, {\n bubbles: false\n });\n }\n\n attributeChangedCallback(attr, oldValue, newValue) {\n super.attributeChangedCallback(...arguments);\n\n if (this.connected) {\n this.update();\n } else {\n this.addEventListener(PfeAvatar.events.connected, () => this.update());\n }\n }\n\n _initCanvas() {\n this._canvas = this.shadowRoot.querySelector(\"canvas\");\n const size =\n this.var(\"--pfe-avatar--width\").replace(/px$/, \"\") ||\n PfeAvatar.defaultSize;\n this._canvas.width = size;\n this._canvas.height = size;\n\n this._squareSize = this._canvas.width / 8;\n this._triangleSize = this._canvas.width / 4;\n\n this._ctx = this._canvas.getContext(\"2d\");\n }\n\n static _registerColors() {\n this.colors = [];\n const themeColors = this.var(\"--pfe-avatar--colors\") || this.defaultColors;\n\n themeColors.split(/\\s+/).forEach(colorCode => {\n let pattern;\n switch (colorCode.length) {\n case 4: // ex: \"#0fc\"\n pattern = /^#([A-f0-9])([A-f0-9])([A-f0-9])$/.exec(colorCode);\n if (pattern) {\n pattern.shift();\n const color = pattern.map(c => parseInt(c + c, 16));\n this._registerColor(color);\n } else {\n this.log(`[pfe-avatar] invalid color ${colorCode}`);\n }\n break;\n case 7: // ex: \"#00ffcc\"\n pattern = /^#([A-f0-9]{2})([A-f0-9]{2})([A-f0-9]{2})$/.exec(\n colorCode\n );\n if (pattern) {\n pattern.shift();\n const color = pattern.map(c => parseInt(c, 16));\n this._registerColor(color);\n } else {\n this.log(`[pfe-avatar] invalid color ${colorCode}`);\n }\n }\n });\n\n return this.colors;\n }\n\n static _registerColor(color) {\n PfeAvatar.colors.push({\n color1: `rgb(${color.join(\",\")})`,\n color2: `rgb(${this._adjustColor(color).join(\",\")})`\n });\n }\n\n static _adjustColor(color) {\n const dark = 0.1;\n const l_adj = 0.1; // luminance adjustment\n const hsl = rgb2hsl(...color);\n\n // if luminance is too dark already, then lighten the alternate color\n // instead of darkening it.\n hsl[2] += hsl[2] > dark ? -l_adj : l_adj;\n\n return hsl2rgb(...hsl);\n }\n\n update() {\n // if we have a src element, update the img, otherwise update the random pattern\n if (this.hasAttribute(\"pfe-src\")) {\n this.shadowRoot.querySelector(\"img\").src = this.src;\n } else {\n const bitPattern = hash(this.name).toString(2);\n const arrPattern = bitPattern.split(\"\").map(n => Number(n));\n this._colorIndex = Math.floor(\n (PfeAvatar.colors.length * parseInt(bitPattern, 2)) / Math.pow(2, 32)\n );\n this.color1 = PfeAvatar.colors[this._colorIndex].color1;\n this.color2 = PfeAvatar.colors[this._colorIndex].color2;\n\n this._clear();\n this._drawBackground();\n if (this.pattern === PfeAvatar.patterns.squares) {\n this._drawSquarePattern(arrPattern);\n } else if (this.pattern === PfeAvatar.patterns.triangles) {\n this._drawTrianglePattern(arrPattern);\n }\n // this._drawGradient();\n }\n }\n\n _clear() {\n this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n }\n\n _drawBackground() {\n this._ctx.fillStyle = this.color1;\n this._ctx.fillRect(0, 0, this._canvas.width, this._canvas.height);\n }\n\n _drawSquarePattern(pattern) {\n this._ctx.fillStyle = this.color2;\n if (this._ctx) {\n let i = pattern.length;\n while (i--) {\n if (pattern[i]) {\n this._drawMirroredSquare(i % 4, Math.floor(i / 4));\n }\n }\n }\n }\n\n /**\n * Draw a square at the given position, mirrored onto both the left and right half of the canvas.\n */\n _drawMirroredSquare(x, y) {\n if (this._ctx) {\n this._drawSquare(x, y);\n this._drawSquare(7 - x, y);\n }\n }\n\n _drawSquare(x, y) {\n this._ctx.fillRect(\n this._squareSize * x,\n this._squareSize * y,\n this._squareSize,\n this._squareSize\n );\n }\n\n _drawTrianglePattern(pattern) {\n this._ctx.fillStyle = this.color2;\n if (this._ctx) {\n let i = pattern.length;\n while (i--) {\n if (pattern[i]) {\n const x = Math.floor(i / 2) % 2;\n const y = Math.floor(i / 4);\n const alt = i % 4;\n\n const p1 = [x, y];\n const p2 = [x, y];\n const p3 = [x, y];\n\n switch (alt) {\n case 0:\n p2[1]++;\n p3[0]++;\n p3[1]++;\n break;\n case 1:\n p2[0]++;\n p3[0]++;\n p3[1]++;\n break;\n case 2:\n p2[0]++;\n p3[1]++;\n break;\n case 3:\n p1[0]++;\n p2[0]++;\n p2[1]++;\n p3[1]++;\n break;\n }\n\n this._drawMirroredTriangle(p1, p2, p3);\n }\n }\n }\n }\n\n /**\n * Draw a square at the given position in the top-left quadrant of the\n * canvas, and mirrored to the other three quadrants.\n */\n _drawMirroredTriangle(p1, p2, p3) {\n if (this._ctx) {\n this._drawTriangle(p1, p2, p3);\n this._drawTriangle(\n [4 - p1[0], p1[1]],\n [4 - p2[0], p2[1]],\n [4 - p3[0], p3[1]]\n );\n }\n }\n\n _drawTriangle(p1, p2, p3) {\n this._ctx.beginPath();\n this._ctx.moveTo(...p1.map(c => c * this._triangleSize));\n this._ctx.lineTo(...p2.map(c => c * this._triangleSize));\n this._ctx.lineTo(...p3.map(c => c * this._triangleSize));\n this._ctx.closePath();\n this._ctx.fill();\n this._ctx.fill();\n }\n\n _drawGradient() {\n const gradient = this._ctx.createLinearGradient(\n 0,\n this._canvas.height,\n this._canvas.width,\n 0\n );\n const color = this.color2;\n let gradientColor1 = color;\n let gradientColor2 = color;\n if (/^#[A-f0-9]{3}$/.test(color)) {\n // color is of the form \"#fff\"\n gradientColor1 += \"c\";\n gradientColor2 += \"0\";\n } else if (/^#[A-f0-9]{6}$/.test(color)) {\n // color is of the form \"#ffffff\"\n gradientColor1 += \"cc\";\n gradientColor2 += \"00\";\n }\n gradient.addColorStop(0, gradientColor1);\n gradient.addColorStop(1, gradientColor2);\n gradient.addColorStop(1, gradientColor1);\n this._ctx.fillStyle = gradient;\n this._ctx.fillRect(0, 0, this._canvas.width, this._canvas.height);\n }\n}\n\nPfeAvatar._registerColors();\n\nPFElement.create(PfeAvatar);\n\nexport default PfeAvatar;\n"],"names":[],"mappings":";;AAAA;;;;;;;;AAQA,SAAS,IAAI,CAAC,GAAG,EAAE;EACjB,IAAI,IAAI,GAAG,IAAI,CAAC;EAChB,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;;EAEnB,OAAO,CAAC,EAAE;IACR,IAAI,GAAG,CAAC,IAAI,GAAG,EAAE,IAAI,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;GAC1C;;EAED,OAAO,IAAI,KAAK,CAAC,CAAC;CACnB;;ACjBD,SAAS,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;EACzB,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;EACpB,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;EACpB,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;EAC/C,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC;EAC1B,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;EACzD,OAAO,EAAE,CAAC;CACX;;;;;;;;;;;;AAYD,AAAO,SAAS,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;EAClC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;;EAEZ,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;EACvC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;EACvC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;;EAEvC,IAAI,CAAC,IAAI,CAAC,EAAE;IACV,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACZ,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACZ,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;GACb,MAAM;IACL,IAAI,CAAC,EAAE,CAAC,CAAC;;IAET,IAAI,CAAC,GAAG,GAAG,EAAE;MACX,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;KACjB,MAAM;MACL,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;KACnB;;IAED,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;;IAEd,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;GAC9C;;EAED,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;CAClB;;;;;;;;;;;;AAYD,AAAO,SAAS,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;EAClC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;;EAEZ,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;EACzC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;EACzC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;;EAEzC,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;EAClB,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;EAClB,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;;EAElB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;EAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;EAC5C,MAAM,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;;EAElC,CAAC,GAAG,CAAC,OAAO,GAAG,OAAO,IAAI,CAAC,CAAC;;EAE5B,IAAI,OAAO,KAAK,CAAC,EAAE;IACjB,CAAC,GAAG,CAAC,CAAC;IACN,CAAC,GAAG,CAAC,CAAC;GACP,MAAM;IACL,IAAI,CAAC,GAAG,GAAG,EAAE;MACX,CAAC,GAAG,OAAO,IAAI,OAAO,GAAG,OAAO,CAAC,CAAC;KACnC,MAAM;MACL,CAAC,GAAG,OAAO,IAAI,CAAC,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC;KACvC;;IAED,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,CAAC,IAAI,OAAO,CAAC;IAC1D,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,CAAC,IAAI,OAAO,CAAC;IAC1D,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,CAAC,IAAI,OAAO,CAAC;;IAE1D,IAAI,CAAC,IAAI,OAAO,EAAE;MAChB,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC;KACnB,MAAM,IAAI,CAAC,IAAI,OAAO,EAAE;MACvB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC;KAC3B,MAAM,IAAI,CAAC,IAAI,OAAO,EAAE;MACvB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC;KAC3B;;IAED,IAAI,CAAC,GAAG,CAAC,EAAE;MACT,CAAC,IAAI,CAAC,CAAC;KACR,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE;MAChB,CAAC,IAAI,CAAC,CAAC;KACR;GACF;;EAED,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;CAClB;;AC1GD;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,AAIA;AACA,MAAM,SAAS,SAAS,SAAS,CAAC;EAChC,WAAW,OAAO,GAAG;IACnB,OAAO,qBAAqB,CAAC;GAC9B;;EAED,IAAI,IAAI,GAAG;IACT,OAAO,CAAC;;;KAGP,CAAC,CAAC;GACJ;EACD,WAAW,GAAG,GAAG;IACf,OAAO,YAAY,CAAC;GACrB;;EAED,IAAI,WAAW,GAAG;IAChB,OAAO,iBAAiB,CAAC;GAC1B;;EAED,IAAI,QAAQ,GAAG;IACb,OAAO,iBAAiB,CAAC;GAC1B;;EAED,WAAW,kBAAkB,GAAG;IAC9B,OAAO,CAAC,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;GAC5D;;EAED,WAAW,MAAM,GAAG;IAClB,OAAO;MACL,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;KACnC,CAAC;GACH;;EAED,WAAW,QAAQ,GAAG;IACpB,OAAO;MACL,SAAS,EAAE,WAAW;MACtB,OAAO,EAAE,SAAS;KACnB,CAAC;GACH;;EAED,WAAW,WAAW,GAAG;IACvB,OAAO,GAAG,CAAC;GACZ;;EAED,WAAW,aAAa,GAAG;IACzB,OAAO,yCAAyC,CAAC;GAClD;;EAED,IAAI,IAAI,GAAG;IACT,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;GACtC;;EAED,IAAI,IAAI,CAAC,GAAG,EAAE;IACZ,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;GAC3C;;EAED,IAAI,GAAG,GAAG;IACR,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;GACrC;;EAED,IAAI,GAAG,CAAC,IAAI,EAAE;IACZ,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;GAC3C;;EAED,IAAI,OAAO,GAAG;IACZ,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC;GACvE;;EAED,IAAI,OAAO,CAAC,IAAI,EAAE;IAChB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;MAC7B,IAAI,CAAC,GAAG;QACN,CAAC,iBAAiB,EAAE,IAAI,CAAC,uBAAuB,EAAE,MAAM,CAAC,MAAM;UAC7D,SAAS,CAAC,QAAQ;SACnB,CAAC,CAAC;OACJ,CAAC;MACF,OAAO;KACR;IACD,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;GAC/C;;EAED,WAAW,GAAG;IACZ,KAAK,CAAC,SAAS,CAAC,CAAC;GAClB;;EAED,iBAAiB,GAAG;IAClB,KAAK,CAAC,iBAAiB,EAAE,CAAC;;IAE1B,IAAI,CAAC,WAAW,EAAE,CAAC;;IAEnB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE;MACzC,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;GACJ;;EAED,wBAAwB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACjD,KAAK,CAAC,wBAAwB,CAAC,GAAG,SAAS,CAAC,CAAC;;IAE7C,IAAI,IAAI,CAAC,SAAS,EAAE;MAClB,IAAI,CAAC,MAAM,EAAE,CAAC;KACf,MAAM;MACL,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;KACxE;GACF;;EAED,WAAW,GAAG;IACZ,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACvD,MAAM,IAAI;MACR,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;MAClD,SAAS,CAAC,WAAW,CAAC;IACxB,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAC1B,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;;IAE3B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;IAC1C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;;IAE5C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;GAC3C;;EAED,OAAO,eAAe,GAAG;IACvB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IACjB,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC;;IAE3E,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,IAAI;MAC5C,IAAI,OAAO,CAAC;MACZ,QAAQ,SAAS,CAAC,MAAM;QACtB,KAAK,CAAC;UACJ,OAAO,GAAG,mCAAmC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;UAC9D,IAAI,OAAO,EAAE;YACX,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACpD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;WAC5B,MAAM;YACL,IAAI,CAAC,GAAG,CAAC,CAAC,2BAA2B,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;WACrD;UACD,MAAM;QACR,KAAK,CAAC;UACJ,OAAO,GAAG,4CAA4C,CAAC,IAAI;YACzD,SAAS;WACV,CAAC;UACF,IAAI,OAAO,EAAE;YACX,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAChD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;WAC5B,MAAM;YACL,IAAI,CAAC,GAAG,CAAC,CAAC,2BAA2B,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;WACrD;OACJ;KACF,CAAC,CAAC;;IAEH,OAAO,IAAI,CAAC,MAAM,CAAC;GACpB;;EAED,OAAO,cAAc,CAAC,KAAK,EAAE;IAC3B,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;MACpB,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;MACjC,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;KACrD,CAAC,CAAC;GACJ;;EAED,OAAO,YAAY,CAAC,KAAK,EAAE;IACzB,MAAM,IAAI,GAAG,GAAG,CAAC;IACjB,MAAM,KAAK,GAAG,GAAG,CAAC;IAClB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;;;;IAI9B,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC;;IAEzC,OAAO,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;GACxB;;EAED,MAAM,GAAG;;IAEP,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE;MAChC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;KACrD,MAAM;MACL,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;MAC/C,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;MAC5D,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK;QAC3B,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC;OACtE,CAAC;MACF,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;MACxD,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;;MAExD,IAAI,CAAC,MAAM,EAAE,CAAC;MACd,IAAI,CAAC,eAAe,EAAE,CAAC;MACvB,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE;QAC/C,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;OACrC,MAAM,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE;QACxD,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;OACvC;;KAEF;GACF;;EAED,MAAM,GAAG;IACP,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;GACpE;;EAED,eAAe,GAAG;IAChB,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;IAClC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;GACnE;;EAED,kBAAkB,CAAC,OAAO,EAAE;IAC1B,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;IAClC,IAAI,IAAI,CAAC,IAAI,EAAE;MACb,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;MACvB,OAAO,CAAC,EAAE,EAAE;QACV,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE;UACd,IAAI,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACpD;OACF;KACF;GACF;;;;;EAKD,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAAE;IACxB,IAAI,IAAI,CAAC,IAAI,EAAE;MACb,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;MACvB,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;KAC5B;GACF;;EAED,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE;IAChB,IAAI,CAAC,IAAI,CAAC,QAAQ;MAChB,IAAI,CAAC,WAAW,GAAG,CAAC;MACpB,IAAI,CAAC,WAAW,GAAG,CAAC;MACpB,IAAI,CAAC,WAAW;MAChB,IAAI,CAAC,WAAW;KACjB,CAAC;GACH;;EAED,oBAAoB,CAAC,OAAO,EAAE;IAC5B,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;IAClC,IAAI,IAAI,CAAC,IAAI,EAAE;MACb,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;MACvB,OAAO,CAAC,EAAE,EAAE;QACV,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE;UACd,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;UAChC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;UAC5B,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;;UAElB,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;UAClB,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;UAClB,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;UAElB,QAAQ,GAAG;YACT,KAAK,CAAC;cACJ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;cACR,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;cACR,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;cACR,MAAM;YACR,KAAK,CAAC;cACJ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;cACR,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;cACR,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;cACR,MAAM;YACR,KAAK,CAAC;cACJ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;cACR,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;cACR,MAAM;YACR,KAAK,CAAC;cACJ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;cACR,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;cACR,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;cACR,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;cACR,MAAM;WACT;;UAED,IAAI,CAAC,qBAAqB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;SACxC;OACF;KACF;GACF;;;;;;EAMD,qBAAqB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;IAChC,IAAI,IAAI,CAAC,IAAI,EAAE;MACb,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;MAC/B,IAAI,CAAC,aAAa;QAChB,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;OACnB,CAAC;KACH;GACF;;EAED,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;IACxB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IACtB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IACtB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACjB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;GAClB;;EAED,aAAa,GAAG;IACd,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,oBAAoB;MAC7C,CAAC;MACD,IAAI,CAAC,OAAO,CAAC,MAAM;MACnB,IAAI,CAAC,OAAO,CAAC,KAAK;MAClB,CAAC;KACF,CAAC;IACF,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;IAC1B,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;;MAEhC,cAAc,IAAI,GAAG,CAAC;MACtB,cAAc,IAAI,GAAG,CAAC;KACvB,MAAM,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;;MAEvC,cAAc,IAAI,IAAI,CAAC;MACvB,cAAc,IAAI,IAAI,CAAC;KACxB;IACD,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;IACzC,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;IACzC,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;IACzC,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC/B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;GACnE;CACF;;AAED,SAAS,CAAC,eAAe,EAAE,CAAC;;AAE5B,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;;;;"} \ No newline at end of file diff --git a/js/pfe-avatar/dist/pfe-avatar.min.js b/js/pfe-avatar/dist/pfe-avatar.min.js new file mode 100644 index 00000000..735f085d --- /dev/null +++ b/js/pfe-avatar/dist/pfe-avatar.min.js @@ -0,0 +1,27 @@ +import t from"../../pfelement/dist/pfelement.min.js";function e(t,e,a){return a<0&&(a+=1),a>1&&(a-=1),6*a<1?t+6*(e-t)*a:2*a<1?e:3*a<2?t+(e-t)*(2/3-a)*6:t} +/*! + * PatternFly Elements: PfeAvatar 1.0.0-prerelease.55 + * @license + * Copyright 2020 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * +*/ +class a extends t{static get version(){return"1.0.0-prerelease.55"}get html(){return"\n"}static get tag(){return"pfe-avatar"}get templateUrl(){return"pfe-avatar.html"}get styleUrl(){return"pfe-avatar.scss"}static get observedAttributes(){return["pfe-name","pfe-pattern","pfe-src","pfe-shape"]}static get events(){return{connected:`${this.tag}:connected`}}static get patterns(){return{triangles:"triangles",squares:"squares"}}static get defaultSize(){return 128}static get defaultColors(){return"#67accf #448087 #709c6b #a35252 #826cbb"}get name(){return this.getAttribute("pfe-name")}set name(t){return this.setAttribute("pfe-name",t)}get src(){return this.getAttribute("pfe-src")}set src(t){return this.setAttribute("pfe-src",t)}get pattern(){return this.getAttribute("pfe-pattern")||a.patterns.squares}set pattern(t){if(a.patterns[t])return this.setAttribute("pfe-pattern",t);this.log(`invalid pattern "${t}", valid patterns are: ${Object.values(a.patterns)}`)}constructor(){super(a)}connectedCallback(){super.connectedCallback(),this._initCanvas(),this.emitEvent(a.events.connected,{bubbles:!1})}attributeChangedCallback(t,e,r){super.attributeChangedCallback(...arguments),this.connected?this.update():this.addEventListener(a.events.connected,()=>this.update())}_initCanvas(){this._canvas=this.shadowRoot.querySelector("canvas");const t=this.var("--pfe-avatar--width").replace(/px$/,"")||a.defaultSize;this._canvas.width=t,this._canvas.height=t,this._squareSize=this._canvas.width/8,this._triangleSize=this._canvas.width/4,this._ctx=this._canvas.getContext("2d")}static _registerColors(){return this.colors=[],(this.var("--pfe-avatar--colors")||this.defaultColors).split(/\s+/).forEach(t=>{let e;switch(t.length){case 4:if(e=/^#([A-f0-9])([A-f0-9])([A-f0-9])$/.exec(t)){e.shift();const t=e.map(t=>parseInt(t+t,16));this._registerColor(t)}else this.log(`[pfe-avatar] invalid color ${t}`);break;case 7:if(e=/^#([A-f0-9]{2})([A-f0-9]{2})([A-f0-9]{2})$/.exec(t)){e.shift();const t=e.map(t=>parseInt(t,16));this._registerColor(t)}else this.log(`[pfe-avatar] invalid color ${t}`)}}),this.colors}static _registerColor(t){a.colors.push({color1:`rgb(${t.join(",")})`,color2:`rgb(${this._adjustColor(t).join(",")})`})}static _adjustColor(t){const a=function(t,e,a){let r,i,s;const n=Math.max(0,Math.min(255,t))/255,h=Math.max(0,Math.min(255,e))/255,o=Math.max(0,Math.min(255,a))/255,c=Math.min(Math.min(n,h),o),l=Math.max(Math.max(n,h),o),d=l-c;if(s=(l+c)/2,0===d)r=0,i=0;else{i=s<.5?d/(l+c):d/(2-l-c);const t=((l-n)/6+d/2)/d,e=((l-h)/6+d/2)/d,a=((l-o)/6+d/2)/d;n==l?r=a-e:h==l?r=1/3+t-a:o==l&&(r=2/3+e-t),r<0?r+=1:r>1&&(r-=1)}return[r,i,s]}(...t);return a[2]+=a[2]>.1?-.1:.1,function(t,a,r){let i,s,n;const h=Math.max(0,Math.min(1,t)),o=Math.max(0,Math.min(1,a)),c=Math.max(0,Math.min(1,r));if(0==o)i=255*c,s=255*c,n=255*c;else{let t,a;t=2*c-(a=c<.5?c*(1+o):c+o-o*c),i=Math.floor(255*e(t,a,h+1/3)),s=Math.floor(255*e(t,a,h)),n=Math.floor(255*e(t,a,h-1/3))}return[i,s,n]}(...a)}update(){if(this.hasAttribute("pfe-src"))this.shadowRoot.querySelector("img").src=this.src;else{const t=function(t){let e=5381,a=t.length;for(;a;)e=33*e^t.charCodeAt(--a);return e>>>0}(this.name).toString(2),e=t.split("").map(t=>Number(t));this._colorIndex=Math.floor(a.colors.length*parseInt(t,2)/Math.pow(2,32)),this.color1=a.colors[this._colorIndex].color1,this.color2=a.colors[this._colorIndex].color2,this._clear(),this._drawBackground(),this.pattern===a.patterns.squares?this._drawSquarePattern(e):this.pattern===a.patterns.triangles&&this._drawTrianglePattern(e)}}_clear(){this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height)}_drawBackground(){this._ctx.fillStyle=this.color1,this._ctx.fillRect(0,0,this._canvas.width,this._canvas.height)}_drawSquarePattern(t){if(this._ctx.fillStyle=this.color2,this._ctx){let e=t.length;for(;e--;)t[e]&&this._drawMirroredSquare(e%4,Math.floor(e/4))}}_drawMirroredSquare(t,e){this._ctx&&(this._drawSquare(t,e),this._drawSquare(7-t,e))}_drawSquare(t,e){this._ctx.fillRect(this._squareSize*t,this._squareSize*e,this._squareSize,this._squareSize)}_drawTrianglePattern(t){if(this._ctx.fillStyle=this.color2,this._ctx){let e=t.length;for(;e--;)if(t[e]){const t=Math.floor(e/2)%2,a=Math.floor(e/4),r=[t,a],i=[t,a],s=[t,a];switch(e%4){case 0:i[1]++,s[0]++,s[1]++;break;case 1:i[0]++,s[0]++,s[1]++;break;case 2:i[0]++,s[1]++;break;case 3:r[0]++,i[0]++,i[1]++,s[1]++}this._drawMirroredTriangle(r,i,s)}}}_drawMirroredTriangle(t,e,a){this._ctx&&(this._drawTriangle(t,e,a),this._drawTriangle([4-t[0],t[1]],[4-e[0],e[1]],[4-a[0],a[1]]))}_drawTriangle(t,e,a){this._ctx.beginPath(),this._ctx.moveTo(...t.map(t=>t*this._triangleSize)),this._ctx.lineTo(...e.map(t=>t*this._triangleSize)),this._ctx.lineTo(...a.map(t=>t*this._triangleSize)),this._ctx.closePath(),this._ctx.fill(),this._ctx.fill()}_drawGradient(){const t=this._ctx.createLinearGradient(0,this._canvas.height,this._canvas.width,0),e=this.color2;let a=e,r=e;/^#[A-f0-9]{3}$/.test(e)?(a+="c",r+="0"):/^#[A-f0-9]{6}$/.test(e)&&(a+="cc",r+="00"),t.addColorStop(0,a),t.addColorStop(1,r),t.addColorStop(1,a),this._ctx.fillStyle=t,this._ctx.fillRect(0,0,this._canvas.width,this._canvas.height)}}a._registerColors(),t.create(a);export default a; +//# sourceMappingURL=pfe-avatar.min.js.map diff --git a/js/pfe-avatar/dist/pfe-avatar.min.js.map b/js/pfe-avatar/dist/pfe-avatar.min.js.map new file mode 100644 index 00000000..1deca120 --- /dev/null +++ b/js/pfe-avatar/dist/pfe-avatar.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"pfe-avatar.min.js","sources":["../_temp/hslrgb.js","../_temp/pfe-avatar.js","../_temp/djb-hash.js"],"sourcesContent":["function h2rgb(v1, v2, vH) {\n if (vH < 0) vH += 1;\n if (vH > 1) vH -= 1;\n if (6 * vH < 1) return v1 + (v2 - v1) * 6 * vH;\n if (2 * vH < 1) return v2;\n if (3 * vH < 2) return v1 + (v2 - v1) * (2 / 3 - vH) * 6;\n return v1;\n}\n\n/**\n * Convert an HSL color to RGB.\n *\n * @param {Number} H the hue component\n * @param {Number} S the saturation component\n * @param {Number} L the luminance component\n * @return {Array} [R, G, B]\n *\n * @see https://www.easyrgb.com/en/math.php\n */\nexport function hsl2rgb(_H, _S, _L) {\n let R, G, B;\n\n const H = Math.max(0, Math.min(1, _H));\n const S = Math.max(0, Math.min(1, _S));\n const L = Math.max(0, Math.min(1, _L));\n\n if (S == 0) {\n R = L * 255;\n G = L * 255;\n B = L * 255;\n } else {\n let a, b;\n\n if (L < 0.5) {\n b = L * (1 + S);\n } else {\n b = L + S - S * L;\n }\n\n a = 2 * L - b;\n\n R = Math.floor(255 * h2rgb(a, b, H + 1 / 3));\n G = Math.floor(255 * h2rgb(a, b, H));\n B = Math.floor(255 * h2rgb(a, b, H - 1 / 3));\n }\n\n return [R, G, B];\n}\n\n/**\n * Convert an RGBcolor to HSL.\n *\n * @param {Number} R the red component\n * @param {Number} G the green component\n * @param {Number} B the blue component\n * @return {Array} [H, S, L]\n *\n * @see https://www.easyrgb.com/en/math.php\n */\nexport function rgb2hsl(_R, _G, _B) {\n let H, S, L;\n\n const R = Math.max(0, Math.min(255, _R));\n const G = Math.max(0, Math.min(255, _G));\n const B = Math.max(0, Math.min(255, _B));\n\n const r = R / 255;\n const g = G / 255;\n const b = B / 255;\n\n const var_min = Math.min(Math.min(r, g), b);\n const var_max = Math.max(Math.max(r, g), b);\n const del_max = var_max - var_min;\n\n L = (var_max + var_min) / 2;\n\n if (del_max === 0) {\n H = 0;\n S = 0;\n } else {\n if (L < 0.5) {\n S = del_max / (var_max + var_min);\n } else {\n S = del_max / (2 - var_max - var_min);\n }\n\n const del_r = ((var_max - r) / 6 + del_max / 2) / del_max;\n const del_g = ((var_max - g) / 6 + del_max / 2) / del_max;\n const del_b = ((var_max - b) / 6 + del_max / 2) / del_max;\n\n if (r == var_max) {\n H = del_b - del_g;\n } else if (g == var_max) {\n H = 1 / 3 + del_r - del_b;\n } else if (b == var_max) {\n H = 2 / 3 + del_g - del_r;\n }\n\n if (H < 0) {\n H += 1;\n } else if (H > 1) {\n H -= 1;\n }\n }\n\n return [H, S, L];\n}\n","/*!\n * PatternFly Elements: PfeAvatar 1.0.0-prerelease.55\n * @license\n * Copyright 2020 Red Hat, Inc.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n * \n*/\n\nimport PFElement from \"../../pfelement/dist/pfelement.js\";\nimport { hash } from \"./djb-hash.js\";\nimport { hsl2rgb, rgb2hsl } from \"./hslrgb.js\";\n\nclass PfeAvatar extends PFElement {\n static get version() {\n return \"1.0.0-prerelease.55\";\n }\n\n get html() {\n return `\n`;\n }\n static get tag() {\n return \"pfe-avatar\";\n }\n\n get templateUrl() {\n return \"pfe-avatar.html\";\n }\n\n get styleUrl() {\n return \"pfe-avatar.scss\";\n }\n\n static get observedAttributes() {\n return [\"pfe-name\", \"pfe-pattern\", \"pfe-src\", \"pfe-shape\"];\n }\n\n static get events() {\n return {\n connected: `${this.tag}:connected`\n };\n }\n\n static get patterns() {\n return {\n triangles: \"triangles\",\n squares: \"squares\"\n };\n }\n\n static get defaultSize() {\n return 128;\n }\n\n static get defaultColors() {\n return \"#67accf #448087 #709c6b #a35252 #826cbb\";\n }\n\n get name() {\n return this.getAttribute(\"pfe-name\");\n }\n\n set name(val) {\n return this.setAttribute(\"pfe-name\", val);\n }\n\n get src() {\n return this.getAttribute(\"pfe-src\");\n }\n\n set src(href) {\n return this.setAttribute(\"pfe-src\", href);\n }\n\n get pattern() {\n return this.getAttribute(\"pfe-pattern\") || PfeAvatar.patterns.squares;\n }\n\n set pattern(name) {\n if (!PfeAvatar.patterns[name]) {\n this.log(\n `invalid pattern \"${name}\", valid patterns are: ${Object.values(\n PfeAvatar.patterns\n )}`\n );\n return;\n }\n return this.setAttribute(\"pfe-pattern\", name);\n }\n\n constructor() {\n super(PfeAvatar);\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n this._initCanvas();\n\n this.emitEvent(PfeAvatar.events.connected, {\n bubbles: false\n });\n }\n\n attributeChangedCallback(attr, oldValue, newValue) {\n super.attributeChangedCallback(...arguments);\n\n if (this.connected) {\n this.update();\n } else {\n this.addEventListener(PfeAvatar.events.connected, () => this.update());\n }\n }\n\n _initCanvas() {\n this._canvas = this.shadowRoot.querySelector(\"canvas\");\n const size =\n this.var(\"--pfe-avatar--width\").replace(/px$/, \"\") ||\n PfeAvatar.defaultSize;\n this._canvas.width = size;\n this._canvas.height = size;\n\n this._squareSize = this._canvas.width / 8;\n this._triangleSize = this._canvas.width / 4;\n\n this._ctx = this._canvas.getContext(\"2d\");\n }\n\n static _registerColors() {\n this.colors = [];\n const themeColors = this.var(\"--pfe-avatar--colors\") || this.defaultColors;\n\n themeColors.split(/\\s+/).forEach(colorCode => {\n let pattern;\n switch (colorCode.length) {\n case 4: // ex: \"#0fc\"\n pattern = /^#([A-f0-9])([A-f0-9])([A-f0-9])$/.exec(colorCode);\n if (pattern) {\n pattern.shift();\n const color = pattern.map(c => parseInt(c + c, 16));\n this._registerColor(color);\n } else {\n this.log(`[pfe-avatar] invalid color ${colorCode}`);\n }\n break;\n case 7: // ex: \"#00ffcc\"\n pattern = /^#([A-f0-9]{2})([A-f0-9]{2})([A-f0-9]{2})$/.exec(\n colorCode\n );\n if (pattern) {\n pattern.shift();\n const color = pattern.map(c => parseInt(c, 16));\n this._registerColor(color);\n } else {\n this.log(`[pfe-avatar] invalid color ${colorCode}`);\n }\n }\n });\n\n return this.colors;\n }\n\n static _registerColor(color) {\n PfeAvatar.colors.push({\n color1: `rgb(${color.join(\",\")})`,\n color2: `rgb(${this._adjustColor(color).join(\",\")})`\n });\n }\n\n static _adjustColor(color) {\n const dark = 0.1;\n const l_adj = 0.1; // luminance adjustment\n const hsl = rgb2hsl(...color);\n\n // if luminance is too dark already, then lighten the alternate color\n // instead of darkening it.\n hsl[2] += hsl[2] > dark ? -l_adj : l_adj;\n\n return hsl2rgb(...hsl);\n }\n\n update() {\n // if we have a src element, update the img, otherwise update the random pattern\n if (this.hasAttribute(\"pfe-src\")) {\n this.shadowRoot.querySelector(\"img\").src = this.src;\n } else {\n const bitPattern = hash(this.name).toString(2);\n const arrPattern = bitPattern.split(\"\").map(n => Number(n));\n this._colorIndex = Math.floor(\n (PfeAvatar.colors.length * parseInt(bitPattern, 2)) / Math.pow(2, 32)\n );\n this.color1 = PfeAvatar.colors[this._colorIndex].color1;\n this.color2 = PfeAvatar.colors[this._colorIndex].color2;\n\n this._clear();\n this._drawBackground();\n if (this.pattern === PfeAvatar.patterns.squares) {\n this._drawSquarePattern(arrPattern);\n } else if (this.pattern === PfeAvatar.patterns.triangles) {\n this._drawTrianglePattern(arrPattern);\n }\n // this._drawGradient();\n }\n }\n\n _clear() {\n this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n }\n\n _drawBackground() {\n this._ctx.fillStyle = this.color1;\n this._ctx.fillRect(0, 0, this._canvas.width, this._canvas.height);\n }\n\n _drawSquarePattern(pattern) {\n this._ctx.fillStyle = this.color2;\n if (this._ctx) {\n let i = pattern.length;\n while (i--) {\n if (pattern[i]) {\n this._drawMirroredSquare(i % 4, Math.floor(i / 4));\n }\n }\n }\n }\n\n /**\n * Draw a square at the given position, mirrored onto both the left and right half of the canvas.\n */\n _drawMirroredSquare(x, y) {\n if (this._ctx) {\n this._drawSquare(x, y);\n this._drawSquare(7 - x, y);\n }\n }\n\n _drawSquare(x, y) {\n this._ctx.fillRect(\n this._squareSize * x,\n this._squareSize * y,\n this._squareSize,\n this._squareSize\n );\n }\n\n _drawTrianglePattern(pattern) {\n this._ctx.fillStyle = this.color2;\n if (this._ctx) {\n let i = pattern.length;\n while (i--) {\n if (pattern[i]) {\n const x = Math.floor(i / 2) % 2;\n const y = Math.floor(i / 4);\n const alt = i % 4;\n\n const p1 = [x, y];\n const p2 = [x, y];\n const p3 = [x, y];\n\n switch (alt) {\n case 0:\n p2[1]++;\n p3[0]++;\n p3[1]++;\n break;\n case 1:\n p2[0]++;\n p3[0]++;\n p3[1]++;\n break;\n case 2:\n p2[0]++;\n p3[1]++;\n break;\n case 3:\n p1[0]++;\n p2[0]++;\n p2[1]++;\n p3[1]++;\n break;\n }\n\n this._drawMirroredTriangle(p1, p2, p3);\n }\n }\n }\n }\n\n /**\n * Draw a square at the given position in the top-left quadrant of the\n * canvas, and mirrored to the other three quadrants.\n */\n _drawMirroredTriangle(p1, p2, p3) {\n if (this._ctx) {\n this._drawTriangle(p1, p2, p3);\n this._drawTriangle(\n [4 - p1[0], p1[1]],\n [4 - p2[0], p2[1]],\n [4 - p3[0], p3[1]]\n );\n }\n }\n\n _drawTriangle(p1, p2, p3) {\n this._ctx.beginPath();\n this._ctx.moveTo(...p1.map(c => c * this._triangleSize));\n this._ctx.lineTo(...p2.map(c => c * this._triangleSize));\n this._ctx.lineTo(...p3.map(c => c * this._triangleSize));\n this._ctx.closePath();\n this._ctx.fill();\n this._ctx.fill();\n }\n\n _drawGradient() {\n const gradient = this._ctx.createLinearGradient(\n 0,\n this._canvas.height,\n this._canvas.width,\n 0\n );\n const color = this.color2;\n let gradientColor1 = color;\n let gradientColor2 = color;\n if (/^#[A-f0-9]{3}$/.test(color)) {\n // color is of the form \"#fff\"\n gradientColor1 += \"c\";\n gradientColor2 += \"0\";\n } else if (/^#[A-f0-9]{6}$/.test(color)) {\n // color is of the form \"#ffffff\"\n gradientColor1 += \"cc\";\n gradientColor2 += \"00\";\n }\n gradient.addColorStop(0, gradientColor1);\n gradient.addColorStop(1, gradientColor2);\n gradient.addColorStop(1, gradientColor1);\n this._ctx.fillStyle = gradient;\n this._ctx.fillRect(0, 0, this._canvas.width, this._canvas.height);\n }\n}\n\nPfeAvatar._registerColors();\n\nPFElement.create(PfeAvatar);\n\nexport default PfeAvatar;\n","/**\n * djb2 string hashing function.\n *\n * @see http://www.cse.yorku.ca/~oz/hash.html\n * @param {String} str the string to hash.\n * @return {Number} a positive integer\n */\n\nfunction hash(str) {\n let hash = 5381;\n let i = str.length;\n\n while (i) {\n hash = (hash * 33) ^ str.charCodeAt(--i);\n }\n\n return hash >>> 0;\n}\n\nexport { hash };\n"],"names":["h2rgb","v1","v2","vH","PfeAvatar","PFElement","version","html","tag","templateUrl","styleUrl","observedAttributes","events","connected","this","patterns","triangles","squares","defaultSize","defaultColors","name","getAttribute","val","setAttribute","src","href","pattern","log","Object","values","[object Object]","super","connectedCallback","_initCanvas","emitEvent","bubbles","attr","oldValue","newValue","attributeChangedCallback","arguments","update","addEventListener","_canvas","shadowRoot","querySelector","size","var","replace","width","height","_squareSize","_triangleSize","_ctx","getContext","colors","split","forEach","colorCode","length","exec","shift","color","map","c","parseInt","_registerColor","push","color1","join","color2","_adjustColor","hsl","_R","_G","_B","H","S","L","r","Math","max","min","g","b","var_min","var_max","del_max","del_r","del_g","del_b","rgb2hsl","_H","_S","_L","R","G","B","a","floor","hsl2rgb","hasAttribute","bitPattern","str","hash","i","charCodeAt","toString","arrPattern","n","Number","_colorIndex","pow","_clear","_drawBackground","_drawSquarePattern","_drawTrianglePattern","clearRect","fillStyle","fillRect","_drawMirroredSquare","x","y","_drawSquare","p1","p2","p3","_drawMirroredTriangle","_drawTriangle","beginPath","moveTo","lineTo","closePath","fill","gradient","createLinearGradient","gradientColor1","gradientColor2","test","addColorStop","_registerColors","create"],"mappings":"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"} \ No newline at end of file diff --git a/js/pfe-avatar/dist/pfe-avatar.umd.js b/js/pfe-avatar/dist/pfe-avatar.umd.js new file mode 100644 index 00000000..9a5b819a --- /dev/null +++ b/js/pfe-avatar/dist/pfe-avatar.umd.js @@ -0,0 +1,622 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('../../pfelement/dist/pfelement.umd')) : + typeof define === 'function' && define.amd ? define(['../../pfelement/dist/pfelement.umd'], factory) : + (global.PfeAvatar = factory(global.PFElement)); +}(this, (function (PFElement) { 'use strict'; + + PFElement = PFElement && PFElement.hasOwnProperty('default') ? PFElement['default'] : PFElement; + + /** + * djb2 string hashing function. + * + * @see http://www.cse.yorku.ca/~oz/hash.html + * @param {String} str the string to hash. + * @return {Number} a positive integer + */ + + function hash(str) { + var hash = 5381; + var i = str.length; + + while (i) { + hash = hash * 33 ^ str.charCodeAt(--i); + } + + return hash >>> 0; + } + + function h2rgb(v1, v2, vH) { + if (vH < 0) vH += 1; + if (vH > 1) vH -= 1; + if (6 * vH < 1) return v1 + (v2 - v1) * 6 * vH; + if (2 * vH < 1) return v2; + if (3 * vH < 2) return v1 + (v2 - v1) * (2 / 3 - vH) * 6; + return v1; + } + + /** + * Convert an HSL color to RGB. + * + * @param {Number} H the hue component + * @param {Number} S the saturation component + * @param {Number} L the luminance component + * @return {Array} [R, G, B] + * + * @see https://www.easyrgb.com/en/math.php + */ + function hsl2rgb(_H, _S, _L) { + var R = void 0, + G = void 0, + B = void 0; + + var H = Math.max(0, Math.min(1, _H)); + var S = Math.max(0, Math.min(1, _S)); + var L = Math.max(0, Math.min(1, _L)); + + if (S == 0) { + R = L * 255; + G = L * 255; + B = L * 255; + } else { + var a = void 0, + b = void 0; + + if (L < 0.5) { + b = L * (1 + S); + } else { + b = L + S - S * L; + } + + a = 2 * L - b; + + R = Math.floor(255 * h2rgb(a, b, H + 1 / 3)); + G = Math.floor(255 * h2rgb(a, b, H)); + B = Math.floor(255 * h2rgb(a, b, H - 1 / 3)); + } + + return [R, G, B]; + } + + /** + * Convert an RGBcolor to HSL. + * + * @param {Number} R the red component + * @param {Number} G the green component + * @param {Number} B the blue component + * @return {Array} [H, S, L] + * + * @see https://www.easyrgb.com/en/math.php + */ + function rgb2hsl(_R, _G, _B) { + var H = void 0, + S = void 0, + L = void 0; + + var R = Math.max(0, Math.min(255, _R)); + var G = Math.max(0, Math.min(255, _G)); + var B = Math.max(0, Math.min(255, _B)); + + var r = R / 255; + var g = G / 255; + var b = B / 255; + + var var_min = Math.min(Math.min(r, g), b); + var var_max = Math.max(Math.max(r, g), b); + var del_max = var_max - var_min; + + L = (var_max + var_min) / 2; + + if (del_max === 0) { + H = 0; + S = 0; + } else { + if (L < 0.5) { + S = del_max / (var_max + var_min); + } else { + S = del_max / (2 - var_max - var_min); + } + + var del_r = ((var_max - r) / 6 + del_max / 2) / del_max; + var del_g = ((var_max - g) / 6 + del_max / 2) / del_max; + var del_b = ((var_max - b) / 6 + del_max / 2) / del_max; + + if (r == var_max) { + H = del_b - del_g; + } else if (g == var_max) { + H = 1 / 3 + del_r - del_b; + } else if (b == var_max) { + H = 2 / 3 + del_g - del_r; + } + + if (H < 0) { + H += 1; + } else if (H > 1) { + H -= 1; + } + } + + return [H, S, L]; + } + + var classCallCheck = function (instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + }; + + var createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + + var get = function get(object, property, receiver) { + if (object === null) object = Function.prototype; + var desc = Object.getOwnPropertyDescriptor(object, property); + + if (desc === undefined) { + var parent = Object.getPrototypeOf(object); + + if (parent === null) { + return undefined; + } else { + return get(parent, property, receiver); + } + } else if ("value" in desc) { + return desc.value; + } else { + var getter = desc.get; + + if (getter === undefined) { + return undefined; + } + + return getter.call(receiver); + } + }; + + var inherits = function (subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; + }; + + var possibleConstructorReturn = function (self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; + }; + + var toConsumableArray = function (arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; + + return arr2; + } else { + return Array.from(arr); + } + }; + + /*! + * PatternFly Elements: PfeAvatar 1.0.0-prerelease.55 + * @license + * Copyright 2020 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + + var PfeAvatar = function (_PFElement) { + inherits(PfeAvatar, _PFElement); + createClass(PfeAvatar, [{ + key: "html", + get: function get$$1() { + return "\n"; + } + }, { + key: "templateUrl", + get: function get$$1() { + return "pfe-avatar.html"; + } + }, { + key: "styleUrl", + get: function get$$1() { + return "pfe-avatar.scss"; + } + }, { + key: "name", + get: function get$$1() { + return this.getAttribute("pfe-name"); + }, + set: function set$$1(val) { + return this.setAttribute("pfe-name", val); + } + }, { + key: "src", + get: function get$$1() { + return this.getAttribute("pfe-src"); + }, + set: function set$$1(href) { + return this.setAttribute("pfe-src", href); + } + }, { + key: "pattern", + get: function get$$1() { + return this.getAttribute("pfe-pattern") || PfeAvatar.patterns.squares; + }, + set: function set$$1(name) { + if (!PfeAvatar.patterns[name]) { + this.log("invalid pattern \"" + name + "\", valid patterns are: " + Object.values(PfeAvatar.patterns)); + return; + } + return this.setAttribute("pfe-pattern", name); + } + }], [{ + key: "version", + get: function get$$1() { + return "1.0.0-prerelease.55"; + } + }, { + key: "tag", + get: function get$$1() { + return "pfe-avatar"; + } + }, { + key: "observedAttributes", + get: function get$$1() { + return ["pfe-name", "pfe-pattern", "pfe-src", "pfe-shape"]; + } + }, { + key: "events", + get: function get$$1() { + return { + connected: this.tag + ":connected" + }; + } + }, { + key: "patterns", + get: function get$$1() { + return { + triangles: "triangles", + squares: "squares" + }; + } + }, { + key: "defaultSize", + get: function get$$1() { + return 128; + } + }, { + key: "defaultColors", + get: function get$$1() { + return "#67accf #448087 #709c6b #a35252 #826cbb"; + } + }]); + + function PfeAvatar() { + classCallCheck(this, PfeAvatar); + return possibleConstructorReturn(this, (PfeAvatar.__proto__ || Object.getPrototypeOf(PfeAvatar)).call(this, PfeAvatar)); + } + + createClass(PfeAvatar, [{ + key: "connectedCallback", + value: function connectedCallback() { + get(PfeAvatar.prototype.__proto__ || Object.getPrototypeOf(PfeAvatar.prototype), "connectedCallback", this).call(this); + + this._initCanvas(); + + this.emitEvent(PfeAvatar.events.connected, { + bubbles: false + }); + } + }, { + key: "attributeChangedCallback", + value: function attributeChangedCallback(attr, oldValue, newValue) { + var _this2 = this; + + get(PfeAvatar.prototype.__proto__ || Object.getPrototypeOf(PfeAvatar.prototype), "attributeChangedCallback", this).apply(this, arguments); + + if (this.connected) { + this.update(); + } else { + this.addEventListener(PfeAvatar.events.connected, function () { + return _this2.update(); + }); + } + } + }, { + key: "_initCanvas", + value: function _initCanvas() { + this._canvas = this.shadowRoot.querySelector("canvas"); + var size = this.var("--pfe-avatar--width").replace(/px$/, "") || PfeAvatar.defaultSize; + this._canvas.width = size; + this._canvas.height = size; + + this._squareSize = this._canvas.width / 8; + this._triangleSize = this._canvas.width / 4; + + this._ctx = this._canvas.getContext("2d"); + } + }, { + key: "update", + value: function update() { + // if we have a src element, update the img, otherwise update the random pattern + if (this.hasAttribute("pfe-src")) { + this.shadowRoot.querySelector("img").src = this.src; + } else { + var bitPattern = hash(this.name).toString(2); + var arrPattern = bitPattern.split("").map(function (n) { + return Number(n); + }); + this._colorIndex = Math.floor(PfeAvatar.colors.length * parseInt(bitPattern, 2) / Math.pow(2, 32)); + this.color1 = PfeAvatar.colors[this._colorIndex].color1; + this.color2 = PfeAvatar.colors[this._colorIndex].color2; + + this._clear(); + this._drawBackground(); + if (this.pattern === PfeAvatar.patterns.squares) { + this._drawSquarePattern(arrPattern); + } else if (this.pattern === PfeAvatar.patterns.triangles) { + this._drawTrianglePattern(arrPattern); + } + // this._drawGradient(); + } + } + }, { + key: "_clear", + value: function _clear() { + this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height); + } + }, { + key: "_drawBackground", + value: function _drawBackground() { + this._ctx.fillStyle = this.color1; + this._ctx.fillRect(0, 0, this._canvas.width, this._canvas.height); + } + }, { + key: "_drawSquarePattern", + value: function _drawSquarePattern(pattern) { + this._ctx.fillStyle = this.color2; + if (this._ctx) { + var i = pattern.length; + while (i--) { + if (pattern[i]) { + this._drawMirroredSquare(i % 4, Math.floor(i / 4)); + } + } + } + } + + /** + * Draw a square at the given position, mirrored onto both the left and right half of the canvas. + */ + + }, { + key: "_drawMirroredSquare", + value: function _drawMirroredSquare(x, y) { + if (this._ctx) { + this._drawSquare(x, y); + this._drawSquare(7 - x, y); + } + } + }, { + key: "_drawSquare", + value: function _drawSquare(x, y) { + this._ctx.fillRect(this._squareSize * x, this._squareSize * y, this._squareSize, this._squareSize); + } + }, { + key: "_drawTrianglePattern", + value: function _drawTrianglePattern(pattern) { + this._ctx.fillStyle = this.color2; + if (this._ctx) { + var i = pattern.length; + while (i--) { + if (pattern[i]) { + var x = Math.floor(i / 2) % 2; + var y = Math.floor(i / 4); + var alt = i % 4; + + var p1 = [x, y]; + var p2 = [x, y]; + var p3 = [x, y]; + + switch (alt) { + case 0: + p2[1]++; + p3[0]++; + p3[1]++; + break; + case 1: + p2[0]++; + p3[0]++; + p3[1]++; + break; + case 2: + p2[0]++; + p3[1]++; + break; + case 3: + p1[0]++; + p2[0]++; + p2[1]++; + p3[1]++; + break; + } + + this._drawMirroredTriangle(p1, p2, p3); + } + } + } + } + + /** + * Draw a square at the given position in the top-left quadrant of the + * canvas, and mirrored to the other three quadrants. + */ + + }, { + key: "_drawMirroredTriangle", + value: function _drawMirroredTriangle(p1, p2, p3) { + if (this._ctx) { + this._drawTriangle(p1, p2, p3); + this._drawTriangle([4 - p1[0], p1[1]], [4 - p2[0], p2[1]], [4 - p3[0], p3[1]]); + } + } + }, { + key: "_drawTriangle", + value: function _drawTriangle(p1, p2, p3) { + var _ctx, + _this3 = this, + _ctx2, + _ctx3; + + this._ctx.beginPath(); + (_ctx = this._ctx).moveTo.apply(_ctx, toConsumableArray(p1.map(function (c) { + return c * _this3._triangleSize; + }))); + (_ctx2 = this._ctx).lineTo.apply(_ctx2, toConsumableArray(p2.map(function (c) { + return c * _this3._triangleSize; + }))); + (_ctx3 = this._ctx).lineTo.apply(_ctx3, toConsumableArray(p3.map(function (c) { + return c * _this3._triangleSize; + }))); + this._ctx.closePath(); + this._ctx.fill(); + this._ctx.fill(); + } + }, { + key: "_drawGradient", + value: function _drawGradient() { + var gradient = this._ctx.createLinearGradient(0, this._canvas.height, this._canvas.width, 0); + var color = this.color2; + var gradientColor1 = color; + var gradientColor2 = color; + if (/^#[A-f0-9]{3}$/.test(color)) { + // color is of the form "#fff" + gradientColor1 += "c"; + gradientColor2 += "0"; + } else if (/^#[A-f0-9]{6}$/.test(color)) { + // color is of the form "#ffffff" + gradientColor1 += "cc"; + gradientColor2 += "00"; + } + gradient.addColorStop(0, gradientColor1); + gradient.addColorStop(1, gradientColor2); + gradient.addColorStop(1, gradientColor1); + this._ctx.fillStyle = gradient; + this._ctx.fillRect(0, 0, this._canvas.width, this._canvas.height); + } + }], [{ + key: "_registerColors", + value: function _registerColors() { + var _this4 = this; + + this.colors = []; + var themeColors = this.var("--pfe-avatar--colors") || this.defaultColors; + + themeColors.split(/\s+/).forEach(function (colorCode) { + var pattern = void 0; + switch (colorCode.length) { + case 4: + // ex: "#0fc" + pattern = /^#([A-f0-9])([A-f0-9])([A-f0-9])$/.exec(colorCode); + if (pattern) { + pattern.shift(); + var color = pattern.map(function (c) { + return parseInt(c + c, 16); + }); + _this4._registerColor(color); + } else { + _this4.log("[pfe-avatar] invalid color " + colorCode); + } + break; + case 7: + // ex: "#00ffcc" + pattern = /^#([A-f0-9]{2})([A-f0-9]{2})([A-f0-9]{2})$/.exec(colorCode); + if (pattern) { + pattern.shift(); + var _color = pattern.map(function (c) { + return parseInt(c, 16); + }); + _this4._registerColor(_color); + } else { + _this4.log("[pfe-avatar] invalid color " + colorCode); + } + } + }); + + return this.colors; + } + }, { + key: "_registerColor", + value: function _registerColor(color) { + PfeAvatar.colors.push({ + color1: "rgb(" + color.join(",") + ")", + color2: "rgb(" + this._adjustColor(color).join(",") + ")" + }); + } + }, { + key: "_adjustColor", + value: function _adjustColor(color) { + var dark = 0.1; + var l_adj = 0.1; // luminance adjustment + var hsl = rgb2hsl.apply(undefined, toConsumableArray(color)); + + // if luminance is too dark already, then lighten the alternate color + // instead of darkening it. + hsl[2] += hsl[2] > dark ? -l_adj : l_adj; + + return hsl2rgb.apply(undefined, toConsumableArray(hsl)); + } + }]); + return PfeAvatar; + }(PFElement); + + PfeAvatar._registerColors(); + + PFElement.create(PfeAvatar); + + return PfeAvatar; + +}))); +//# sourceMappingURL=pfe-avatar.umd.js.map diff --git a/js/pfe-avatar/dist/pfe-avatar.umd.js.map b/js/pfe-avatar/dist/pfe-avatar.umd.js.map new file mode 100644 index 00000000..4cc3e8b5 --- /dev/null +++ b/js/pfe-avatar/dist/pfe-avatar.umd.js.map @@ -0,0 +1 @@ +{"version":3,"file":"pfe-avatar.umd.js","sources":["../_temp/djb-hash.js","../_temp/hslrgb.js","../_temp/pfe-avatar.umd.js"],"sourcesContent":["/**\n * djb2 string hashing function.\n *\n * @see http://www.cse.yorku.ca/~oz/hash.html\n * @param {String} str the string to hash.\n * @return {Number} a positive integer\n */\n\nfunction hash(str) {\n let hash = 5381;\n let i = str.length;\n\n while (i) {\n hash = (hash * 33) ^ str.charCodeAt(--i);\n }\n\n return hash >>> 0;\n}\n\nexport { hash };\n","function h2rgb(v1, v2, vH) {\n if (vH < 0) vH += 1;\n if (vH > 1) vH -= 1;\n if (6 * vH < 1) return v1 + (v2 - v1) * 6 * vH;\n if (2 * vH < 1) return v2;\n if (3 * vH < 2) return v1 + (v2 - v1) * (2 / 3 - vH) * 6;\n return v1;\n}\n\n/**\n * Convert an HSL color to RGB.\n *\n * @param {Number} H the hue component\n * @param {Number} S the saturation component\n * @param {Number} L the luminance component\n * @return {Array} [R, G, B]\n *\n * @see https://www.easyrgb.com/en/math.php\n */\nexport function hsl2rgb(_H, _S, _L) {\n let R, G, B;\n\n const H = Math.max(0, Math.min(1, _H));\n const S = Math.max(0, Math.min(1, _S));\n const L = Math.max(0, Math.min(1, _L));\n\n if (S == 0) {\n R = L * 255;\n G = L * 255;\n B = L * 255;\n } else {\n let a, b;\n\n if (L < 0.5) {\n b = L * (1 + S);\n } else {\n b = L + S - S * L;\n }\n\n a = 2 * L - b;\n\n R = Math.floor(255 * h2rgb(a, b, H + 1 / 3));\n G = Math.floor(255 * h2rgb(a, b, H));\n B = Math.floor(255 * h2rgb(a, b, H - 1 / 3));\n }\n\n return [R, G, B];\n}\n\n/**\n * Convert an RGBcolor to HSL.\n *\n * @param {Number} R the red component\n * @param {Number} G the green component\n * @param {Number} B the blue component\n * @return {Array} [H, S, L]\n *\n * @see https://www.easyrgb.com/en/math.php\n */\nexport function rgb2hsl(_R, _G, _B) {\n let H, S, L;\n\n const R = Math.max(0, Math.min(255, _R));\n const G = Math.max(0, Math.min(255, _G));\n const B = Math.max(0, Math.min(255, _B));\n\n const r = R / 255;\n const g = G / 255;\n const b = B / 255;\n\n const var_min = Math.min(Math.min(r, g), b);\n const var_max = Math.max(Math.max(r, g), b);\n const del_max = var_max - var_min;\n\n L = (var_max + var_min) / 2;\n\n if (del_max === 0) {\n H = 0;\n S = 0;\n } else {\n if (L < 0.5) {\n S = del_max / (var_max + var_min);\n } else {\n S = del_max / (2 - var_max - var_min);\n }\n\n const del_r = ((var_max - r) / 6 + del_max / 2) / del_max;\n const del_g = ((var_max - g) / 6 + del_max / 2) / del_max;\n const del_b = ((var_max - b) / 6 + del_max / 2) / del_max;\n\n if (r == var_max) {\n H = del_b - del_g;\n } else if (g == var_max) {\n H = 1 / 3 + del_r - del_b;\n } else if (b == var_max) {\n H = 2 / 3 + del_g - del_r;\n }\n\n if (H < 0) {\n H += 1;\n } else if (H > 1) {\n H -= 1;\n }\n }\n\n return [H, S, L];\n}\n","/*!\n * PatternFly Elements: PfeAvatar 1.0.0-prerelease.55\n * @license\n * Copyright 2020 Red Hat, Inc.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n * \n*/\n\nimport PFElement from \"../../pfelement/dist/pfelement.umd\";\nimport { hash } from \"./djb-hash.js\";\nimport { hsl2rgb, rgb2hsl } from \"./hslrgb.js\";\n\nclass PfeAvatar extends PFElement {\n static get version() {\n return \"1.0.0-prerelease.55\";\n }\n\n get html() {\n return `\n`;\n }\n static get tag() {\n return \"pfe-avatar\";\n }\n\n get templateUrl() {\n return \"pfe-avatar.html\";\n }\n\n get styleUrl() {\n return \"pfe-avatar.scss\";\n }\n\n static get observedAttributes() {\n return [\"pfe-name\", \"pfe-pattern\", \"pfe-src\", \"pfe-shape\"];\n }\n\n static get events() {\n return {\n connected: `${this.tag}:connected`\n };\n }\n\n static get patterns() {\n return {\n triangles: \"triangles\",\n squares: \"squares\"\n };\n }\n\n static get defaultSize() {\n return 128;\n }\n\n static get defaultColors() {\n return \"#67accf #448087 #709c6b #a35252 #826cbb\";\n }\n\n get name() {\n return this.getAttribute(\"pfe-name\");\n }\n\n set name(val) {\n return this.setAttribute(\"pfe-name\", val);\n }\n\n get src() {\n return this.getAttribute(\"pfe-src\");\n }\n\n set src(href) {\n return this.setAttribute(\"pfe-src\", href);\n }\n\n get pattern() {\n return this.getAttribute(\"pfe-pattern\") || PfeAvatar.patterns.squares;\n }\n\n set pattern(name) {\n if (!PfeAvatar.patterns[name]) {\n this.log(\n `invalid pattern \"${name}\", valid patterns are: ${Object.values(\n PfeAvatar.patterns\n )}`\n );\n return;\n }\n return this.setAttribute(\"pfe-pattern\", name);\n }\n\n constructor() {\n super(PfeAvatar);\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n this._initCanvas();\n\n this.emitEvent(PfeAvatar.events.connected, {\n bubbles: false\n });\n }\n\n attributeChangedCallback(attr, oldValue, newValue) {\n super.attributeChangedCallback(...arguments);\n\n if (this.connected) {\n this.update();\n } else {\n this.addEventListener(PfeAvatar.events.connected, () => this.update());\n }\n }\n\n _initCanvas() {\n this._canvas = this.shadowRoot.querySelector(\"canvas\");\n const size =\n this.var(\"--pfe-avatar--width\").replace(/px$/, \"\") ||\n PfeAvatar.defaultSize;\n this._canvas.width = size;\n this._canvas.height = size;\n\n this._squareSize = this._canvas.width / 8;\n this._triangleSize = this._canvas.width / 4;\n\n this._ctx = this._canvas.getContext(\"2d\");\n }\n\n static _registerColors() {\n this.colors = [];\n const themeColors = this.var(\"--pfe-avatar--colors\") || this.defaultColors;\n\n themeColors.split(/\\s+/).forEach(colorCode => {\n let pattern;\n switch (colorCode.length) {\n case 4: // ex: \"#0fc\"\n pattern = /^#([A-f0-9])([A-f0-9])([A-f0-9])$/.exec(colorCode);\n if (pattern) {\n pattern.shift();\n const color = pattern.map(c => parseInt(c + c, 16));\n this._registerColor(color);\n } else {\n this.log(`[pfe-avatar] invalid color ${colorCode}`);\n }\n break;\n case 7: // ex: \"#00ffcc\"\n pattern = /^#([A-f0-9]{2})([A-f0-9]{2})([A-f0-9]{2})$/.exec(\n colorCode\n );\n if (pattern) {\n pattern.shift();\n const color = pattern.map(c => parseInt(c, 16));\n this._registerColor(color);\n } else {\n this.log(`[pfe-avatar] invalid color ${colorCode}`);\n }\n }\n });\n\n return this.colors;\n }\n\n static _registerColor(color) {\n PfeAvatar.colors.push({\n color1: `rgb(${color.join(\",\")})`,\n color2: `rgb(${this._adjustColor(color).join(\",\")})`\n });\n }\n\n static _adjustColor(color) {\n const dark = 0.1;\n const l_adj = 0.1; // luminance adjustment\n const hsl = rgb2hsl(...color);\n\n // if luminance is too dark already, then lighten the alternate color\n // instead of darkening it.\n hsl[2] += hsl[2] > dark ? -l_adj : l_adj;\n\n return hsl2rgb(...hsl);\n }\n\n update() {\n // if we have a src element, update the img, otherwise update the random pattern\n if (this.hasAttribute(\"pfe-src\")) {\n this.shadowRoot.querySelector(\"img\").src = this.src;\n } else {\n const bitPattern = hash(this.name).toString(2);\n const arrPattern = bitPattern.split(\"\").map(n => Number(n));\n this._colorIndex = Math.floor(\n (PfeAvatar.colors.length * parseInt(bitPattern, 2)) / Math.pow(2, 32)\n );\n this.color1 = PfeAvatar.colors[this._colorIndex].color1;\n this.color2 = PfeAvatar.colors[this._colorIndex].color2;\n\n this._clear();\n this._drawBackground();\n if (this.pattern === PfeAvatar.patterns.squares) {\n this._drawSquarePattern(arrPattern);\n } else if (this.pattern === PfeAvatar.patterns.triangles) {\n this._drawTrianglePattern(arrPattern);\n }\n // this._drawGradient();\n }\n }\n\n _clear() {\n this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n }\n\n _drawBackground() {\n this._ctx.fillStyle = this.color1;\n this._ctx.fillRect(0, 0, this._canvas.width, this._canvas.height);\n }\n\n _drawSquarePattern(pattern) {\n this._ctx.fillStyle = this.color2;\n if (this._ctx) {\n let i = pattern.length;\n while (i--) {\n if (pattern[i]) {\n this._drawMirroredSquare(i % 4, Math.floor(i / 4));\n }\n }\n }\n }\n\n /**\n * Draw a square at the given position, mirrored onto both the left and right half of the canvas.\n */\n _drawMirroredSquare(x, y) {\n if (this._ctx) {\n this._drawSquare(x, y);\n this._drawSquare(7 - x, y);\n }\n }\n\n _drawSquare(x, y) {\n this._ctx.fillRect(\n this._squareSize * x,\n this._squareSize * y,\n this._squareSize,\n this._squareSize\n );\n }\n\n _drawTrianglePattern(pattern) {\n this._ctx.fillStyle = this.color2;\n if (this._ctx) {\n let i = pattern.length;\n while (i--) {\n if (pattern[i]) {\n const x = Math.floor(i / 2) % 2;\n const y = Math.floor(i / 4);\n const alt = i % 4;\n\n const p1 = [x, y];\n const p2 = [x, y];\n const p3 = [x, y];\n\n switch (alt) {\n case 0:\n p2[1]++;\n p3[0]++;\n p3[1]++;\n break;\n case 1:\n p2[0]++;\n p3[0]++;\n p3[1]++;\n break;\n case 2:\n p2[0]++;\n p3[1]++;\n break;\n case 3:\n p1[0]++;\n p2[0]++;\n p2[1]++;\n p3[1]++;\n break;\n }\n\n this._drawMirroredTriangle(p1, p2, p3);\n }\n }\n }\n }\n\n /**\n * Draw a square at the given position in the top-left quadrant of the\n * canvas, and mirrored to the other three quadrants.\n */\n _drawMirroredTriangle(p1, p2, p3) {\n if (this._ctx) {\n this._drawTriangle(p1, p2, p3);\n this._drawTriangle(\n [4 - p1[0], p1[1]],\n [4 - p2[0], p2[1]],\n [4 - p3[0], p3[1]]\n );\n }\n }\n\n _drawTriangle(p1, p2, p3) {\n this._ctx.beginPath();\n this._ctx.moveTo(...p1.map(c => c * this._triangleSize));\n this._ctx.lineTo(...p2.map(c => c * this._triangleSize));\n this._ctx.lineTo(...p3.map(c => c * this._triangleSize));\n this._ctx.closePath();\n this._ctx.fill();\n this._ctx.fill();\n }\n\n _drawGradient() {\n const gradient = this._ctx.createLinearGradient(\n 0,\n this._canvas.height,\n this._canvas.width,\n 0\n );\n const color = this.color2;\n let gradientColor1 = color;\n let gradientColor2 = color;\n if (/^#[A-f0-9]{3}$/.test(color)) {\n // color is of the form \"#fff\"\n gradientColor1 += \"c\";\n gradientColor2 += \"0\";\n } else if (/^#[A-f0-9]{6}$/.test(color)) {\n // color is of the form \"#ffffff\"\n gradientColor1 += \"cc\";\n gradientColor2 += \"00\";\n }\n gradient.addColorStop(0, gradientColor1);\n gradient.addColorStop(1, gradientColor2);\n gradient.addColorStop(1, gradientColor1);\n this._ctx.fillStyle = gradient;\n this._ctx.fillRect(0, 0, this._canvas.width, this._canvas.height);\n }\n}\n\nPfeAvatar._registerColors();\n\nPFElement.create(PfeAvatar);\n\nexport default PfeAvatar;\n"],"names":["hash","str","i","length","charCodeAt","h2rgb","v1","v2","vH","hsl2rgb","_H","_S","_L","R","G","B","H","Math","max","min","S","L","a","b","floor","rgb2hsl","_R","_G","_B","r","g","var_min","var_max","del_max","del_r","del_g","del_b","PfeAvatar","getAttribute","val","setAttribute","href","patterns","squares","name","log","Object","values","connected","tag","triangles","_initCanvas","emitEvent","events","bubbles","attr","oldValue","newValue","arguments","update","addEventListener","_canvas","shadowRoot","querySelector","size","var","replace","defaultSize","width","height","_squareSize","_triangleSize","_ctx","getContext","hasAttribute","src","bitPattern","toString","arrPattern","split","map","Number","n","_colorIndex","colors","parseInt","pow","color1","color2","_clear","_drawBackground","pattern","_drawSquarePattern","_drawTrianglePattern","clearRect","fillStyle","fillRect","_drawMirroredSquare","x","y","_drawSquare","alt","p1","p2","p3","_drawMirroredTriangle","_drawTriangle","beginPath","moveTo","c","lineTo","closePath","fill","gradient","createLinearGradient","color","gradientColor1","gradientColor2","test","addColorStop","themeColors","defaultColors","forEach","colorCode","exec","shift","_registerColor","push","join","_adjustColor","dark","l_adj","hsl","PFElement","_registerColors","create"],"mappings":"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"} \ No newline at end of file diff --git a/js/pfe-avatar/dist/pfe-avatar.umd.min.js b/js/pfe-avatar/dist/pfe-avatar.umd.min.js new file mode 100644 index 00000000..56283ebb --- /dev/null +++ b/js/pfe-avatar/dist/pfe-avatar.umd.min.js @@ -0,0 +1,2 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("../../pfelement/dist/pfelement.umd")):"function"==typeof define&&define.amd?define(["../../pfelement/dist/pfelement.umd"],e):t.PfeAvatar=e(t.PFElement)}(this,function(t){"use strict";function u(t,e,r){return r<0&&(r+=1),1:host{display:block;position:relative;width:128px;width:var(--pfe-avatar--size,var(--pfe-avatar--width,128px));height:128px;height:var(--pfe-avatar--size,var(--pfe-avatar--width,128px))}:host canvas{width:100%;height:100%;image-rendering:optimizeSpeed;image-rendering:-moz-crisp-edges;image-rendering:-webkit-optimize-contrast;image-rendering:-o-crisp-edges;image-rendering:-o-pixelated;image-rendering:pixelated;-ms-interpolation-mode:nearest-neighbor}:host([pfe-shape=rounded]) canvas,:host([pfe-shape=rounded]) img{border-radius:calc(128px / 8 + 1px);border-radius:calc(var(--pfe-avatar--size,var(--pfe-avatar--width,128px))/ 8 + 1px)}:host([pfe-shape=circle]) canvas,:host([pfe-shape=circle]) img{border-radius:50%}:host([pfe-src]) canvas{display:none}:host([pfe-src]) img{display:block;width:100%;height:100%;-o-object-fit:cover;object-fit:cover}:host(:not([pfe-src])) img{display:none}:host([hidden]){display:none}\n/*# sourceMappingURL=pfe-avatar.min.css.map */\n\n"}},{key:"templateUrl",get:function(){return"pfe-avatar.html"}},{key:"styleUrl",get:function(){return"pfe-avatar.scss"}},{key:"name",get:function(){return this.getAttribute("pfe-name")},set:function(t){return this.setAttribute("pfe-name",t)}},{key:"src",get:function(){return this.getAttribute("pfe-src")},set:function(t){return this.setAttribute("pfe-src",t)}},{key:"pattern",get:function(){return this.getAttribute("pfe-pattern")||c.patterns.squares},set:function(t){if(c.patterns[t])return this.setAttribute("pfe-pattern",t);this.log('invalid pattern "'+t+'", valid patterns are: '+Object.values(c.patterns))}}],[{key:"version",get:function(){return"1.0.0-prerelease.55"}},{key:"tag",get:function(){return"pfe-avatar"}},{key:"observedAttributes",get:function(){return["pfe-name","pfe-pattern","pfe-src","pfe-shape"]}},{key:"events",get:function(){return{connected:this.tag+":connected"}}},{key:"patterns",get:function(){return{triangles:"triangles",squares:"squares"}}},{key:"defaultSize",get:function(){return 128}},{key:"defaultColors",get:function(){return"#67accf #448087 #709c6b #a35252 #826cbb"}}]),r(c,[{key:"connectedCallback",value:function(){o(c.prototype.__proto__||Object.getPrototypeOf(c.prototype),"connectedCallback",this).call(this),this._initCanvas(),this.emitEvent(c.events.connected,{bubbles:!1})}},{key:"attributeChangedCallback",value:function(t,e,r){var a=this;o(c.prototype.__proto__||Object.getPrototypeOf(c.prototype),"attributeChangedCallback",this).apply(this,arguments),this.connected?this.update():this.addEventListener(c.events.connected,function(){return a.update()})}},{key:"_initCanvas",value:function(){this._canvas=this.shadowRoot.querySelector("canvas");var t=this.var("--pfe-avatar--width").replace(/px$/,"")||c.defaultSize;this._canvas.width=t,this._canvas.height=t,this._squareSize=this._canvas.width/8,this._triangleSize=this._canvas.width/4,this._ctx=this._canvas.getContext("2d")}},{key:"update",value:function(){var t,e;this.hasAttribute("pfe-src")?this.shadowRoot.querySelector("img").src=this.src:(e=(t=function(t){for(var e=5381,r=t.length;r;)e=33*e^t.charCodeAt(--r);return e>>>0}(this.name).toString(2)).split("").map(function(t){return Number(t)}),this._colorIndex=Math.floor(c.colors.length*parseInt(t,2)/Math.pow(2,32)),this.color1=c.colors[this._colorIndex].color1,this.color2=c.colors[this._colorIndex].color2,this._clear(),this._drawBackground(),this.pattern===c.patterns.squares?this._drawSquarePattern(e):this.pattern===c.patterns.triangles&&this._drawTrianglePattern(e))}},{key:"_clear",value:function(){this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height)}},{key:"_drawBackground",value:function(){this._ctx.fillStyle=this.color1,this._ctx.fillRect(0,0,this._canvas.width,this._canvas.height)}},{key:"_drawSquarePattern",value:function(t){if(this._ctx.fillStyle=this.color2,this._ctx)for(var e=t.length;e--;)t[e]&&this._drawMirroredSquare(e%4,Math.floor(e/4))}},{key:"_drawMirroredSquare",value:function(t,e){this._ctx&&(this._drawSquare(t,e),this._drawSquare(7-t,e))}},{key:"_drawSquare",value:function(t,e){this._ctx.fillRect(this._squareSize*t,this._squareSize*e,this._squareSize,this._squareSize)}},{key:"_drawTrianglePattern",value:function(t){if(this._ctx.fillStyle=this.color2,this._ctx)for(var e=t.length;e--;)if(t[e]){var r=Math.floor(e/2)%2,a=Math.floor(e/4),i=[r,a],n=[r,a],o=[r,a];switch(e%4){case 0:n[1]++,o[0]++,o[1]++;break;case 1:n[0]++,o[0]++,o[1]++;break;case 2:n[0]++,o[1]++;break;case 3:i[0]++,n[0]++,n[1]++,o[1]++}this._drawMirroredTriangle(i,n,o)}}},{key:"_drawMirroredTriangle",value:function(t,e,r){this._ctx&&(this._drawTriangle(t,e,r),this._drawTriangle([4-t[0],t[1]],[4-e[0],e[1]],[4-r[0],r[1]]))}},{key:"_drawTriangle",value:function(t,e,r){var a,i,n,o=this;this._ctx.beginPath(),(a=this._ctx).moveTo.apply(a,s(t.map(function(t){return t*o._triangleSize}))),(i=this._ctx).lineTo.apply(i,s(e.map(function(t){return t*o._triangleSize}))),(n=this._ctx).lineTo.apply(n,s(r.map(function(t){return t*o._triangleSize}))),this._ctx.closePath(),this._ctx.fill(),this._ctx.fill()}},{key:"_drawGradient",value:function(){var t=this._ctx.createLinearGradient(0,this._canvas.height,this._canvas.width,0),e=this.color2,r=e,a=e;/^#[A-f0-9]{3}$/.test(e)?(r+="c",a+="0"):/^#[A-f0-9]{6}$/.test(e)&&(r+="cc",a+="00"),t.addColorStop(0,r),t.addColorStop(1,a),t.addColorStop(1,r),this._ctx.fillStyle=t,this._ctx.fillRect(0,0,this._canvas.width,this._canvas.height)}}],[{key:"_registerColors",value:function(){var i=this;return this.colors=[],(this.var("--pfe-avatar--colors")||this.defaultColors).split(/\s+/).forEach(function(t){var e,r,a=void 0;switch(t.length){case 4:(a=/^#([A-f0-9])([A-f0-9])([A-f0-9])$/.exec(t))?(a.shift(),e=a.map(function(t){return parseInt(t+t,16)}),i._registerColor(e)):i.log("[pfe-avatar] invalid color "+t);break;case 7:(a=/^#([A-f0-9]{2})([A-f0-9]{2})([A-f0-9]{2})$/.exec(t))?(a.shift(),r=a.map(function(t){return parseInt(t,16)}),i._registerColor(r)):i.log("[pfe-avatar] invalid color "+t)}}),this.colors}},{key:"_registerColor",value:function(t){c.colors.push({color1:"rgb("+t.join(",")+")",color2:"rgb("+this._adjustColor(t).join(",")+")"})}},{key:"_adjustColor",value:function(t){var e=function(t,e,r){var a,i,n,o=void 0,s=void 0,c=Math.max(0,Math.min(255,t))/255,h=Math.max(0,Math.min(255,e))/255,l=Math.max(0,Math.min(255,r))/255,u=Math.min(Math.min(c,h),l),f=Math.max(Math.max(c,h),l),p=f-u,d=(f+u)/2;return 0==p?s=o=0:(s=d<.5?p/(f+u):p/(2-f-u),a=((f-c)/6+p/2)/p,i=((f-h)/6+p/2)/p,n=((f-l)/6+p/2)/p,c==f?o=n-i:h==f?o=1/3+a-n:l==f&&(o=2/3+i-a),o<0?o+=1:1 1) vH -= 1;\n if (6 * vH < 1) return v1 + (v2 - v1) * 6 * vH;\n if (2 * vH < 1) return v2;\n if (3 * vH < 2) return v1 + (v2 - v1) * (2 / 3 - vH) * 6;\n return v1;\n}\n\n/**\n * Convert an HSL color to RGB.\n *\n * @param {Number} H the hue component\n * @param {Number} S the saturation component\n * @param {Number} L the luminance component\n * @return {Array} [R, G, B]\n *\n * @see https://www.easyrgb.com/en/math.php\n */\nexport function hsl2rgb(_H, _S, _L) {\n let R, G, B;\n\n const H = Math.max(0, Math.min(1, _H));\n const S = Math.max(0, Math.min(1, _S));\n const L = Math.max(0, Math.min(1, _L));\n\n if (S == 0) {\n R = L * 255;\n G = L * 255;\n B = L * 255;\n } else {\n let a, b;\n\n if (L < 0.5) {\n b = L * (1 + S);\n } else {\n b = L + S - S * L;\n }\n\n a = 2 * L - b;\n\n R = Math.floor(255 * h2rgb(a, b, H + 1 / 3));\n G = Math.floor(255 * h2rgb(a, b, H));\n B = Math.floor(255 * h2rgb(a, b, H - 1 / 3));\n }\n\n return [R, G, B];\n}\n\n/**\n * Convert an RGBcolor to HSL.\n *\n * @param {Number} R the red component\n * @param {Number} G the green component\n * @param {Number} B the blue component\n * @return {Array} [H, S, L]\n *\n * @see https://www.easyrgb.com/en/math.php\n */\nexport function rgb2hsl(_R, _G, _B) {\n let H, S, L;\n\n const R = Math.max(0, Math.min(255, _R));\n const G = Math.max(0, Math.min(255, _G));\n const B = Math.max(0, Math.min(255, _B));\n\n const r = R / 255;\n const g = G / 255;\n const b = B / 255;\n\n const var_min = Math.min(Math.min(r, g), b);\n const var_max = Math.max(Math.max(r, g), b);\n const del_max = var_max - var_min;\n\n L = (var_max + var_min) / 2;\n\n if (del_max === 0) {\n H = 0;\n S = 0;\n } else {\n if (L < 0.5) {\n S = del_max / (var_max + var_min);\n } else {\n S = del_max / (2 - var_max - var_min);\n }\n\n const del_r = ((var_max - r) / 6 + del_max / 2) / del_max;\n const del_g = ((var_max - g) / 6 + del_max / 2) / del_max;\n const del_b = ((var_max - b) / 6 + del_max / 2) / del_max;\n\n if (r == var_max) {\n H = del_b - del_g;\n } else if (g == var_max) {\n H = 1 / 3 + del_r - del_b;\n } else if (b == var_max) {\n H = 2 / 3 + del_g - del_r;\n }\n\n if (H < 0) {\n H += 1;\n } else if (H > 1) {\n H -= 1;\n }\n }\n\n return [H, S, L];\n}\n","/*!\n * PatternFly Elements: PfeAvatar 1.0.0-prerelease.55\n * @license\n * Copyright 2020 Red Hat, Inc.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n * \n*/\n\nimport PFElement from \"../../pfelement/dist/pfelement.umd\";\nimport { hash } from \"./djb-hash.js\";\nimport { hsl2rgb, rgb2hsl } from \"./hslrgb.js\";\n\nclass PfeAvatar extends PFElement {\n static get version() {\n return \"1.0.0-prerelease.55\";\n }\n\n get html() {\n return `\n`;\n }\n static get tag() {\n return \"pfe-avatar\";\n }\n\n get templateUrl() {\n return \"pfe-avatar.html\";\n }\n\n get styleUrl() {\n return \"pfe-avatar.scss\";\n }\n\n static get observedAttributes() {\n return [\"pfe-name\", \"pfe-pattern\", \"pfe-src\", \"pfe-shape\"];\n }\n\n static get events() {\n return {\n connected: `${this.tag}:connected`\n };\n }\n\n static get patterns() {\n return {\n triangles: \"triangles\",\n squares: \"squares\"\n };\n }\n\n static get defaultSize() {\n return 128;\n }\n\n static get defaultColors() {\n return \"#67accf #448087 #709c6b #a35252 #826cbb\";\n }\n\n get name() {\n return this.getAttribute(\"pfe-name\");\n }\n\n set name(val) {\n return this.setAttribute(\"pfe-name\", val);\n }\n\n get src() {\n return this.getAttribute(\"pfe-src\");\n }\n\n set src(href) {\n return this.setAttribute(\"pfe-src\", href);\n }\n\n get pattern() {\n return this.getAttribute(\"pfe-pattern\") || PfeAvatar.patterns.squares;\n }\n\n set pattern(name) {\n if (!PfeAvatar.patterns[name]) {\n this.log(\n `invalid pattern \"${name}\", valid patterns are: ${Object.values(\n PfeAvatar.patterns\n )}`\n );\n return;\n }\n return this.setAttribute(\"pfe-pattern\", name);\n }\n\n constructor() {\n super(PfeAvatar);\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n this._initCanvas();\n\n this.emitEvent(PfeAvatar.events.connected, {\n bubbles: false\n });\n }\n\n attributeChangedCallback(attr, oldValue, newValue) {\n super.attributeChangedCallback(...arguments);\n\n if (this.connected) {\n this.update();\n } else {\n this.addEventListener(PfeAvatar.events.connected, () => this.update());\n }\n }\n\n _initCanvas() {\n this._canvas = this.shadowRoot.querySelector(\"canvas\");\n const size =\n this.var(\"--pfe-avatar--width\").replace(/px$/, \"\") ||\n PfeAvatar.defaultSize;\n this._canvas.width = size;\n this._canvas.height = size;\n\n this._squareSize = this._canvas.width / 8;\n this._triangleSize = this._canvas.width / 4;\n\n this._ctx = this._canvas.getContext(\"2d\");\n }\n\n static _registerColors() {\n this.colors = [];\n const themeColors = this.var(\"--pfe-avatar--colors\") || this.defaultColors;\n\n themeColors.split(/\\s+/).forEach(colorCode => {\n let pattern;\n switch (colorCode.length) {\n case 4: // ex: \"#0fc\"\n pattern = /^#([A-f0-9])([A-f0-9])([A-f0-9])$/.exec(colorCode);\n if (pattern) {\n pattern.shift();\n const color = pattern.map(c => parseInt(c + c, 16));\n this._registerColor(color);\n } else {\n this.log(`[pfe-avatar] invalid color ${colorCode}`);\n }\n break;\n case 7: // ex: \"#00ffcc\"\n pattern = /^#([A-f0-9]{2})([A-f0-9]{2})([A-f0-9]{2})$/.exec(\n colorCode\n );\n if (pattern) {\n pattern.shift();\n const color = pattern.map(c => parseInt(c, 16));\n this._registerColor(color);\n } else {\n this.log(`[pfe-avatar] invalid color ${colorCode}`);\n }\n }\n });\n\n return this.colors;\n }\n\n static _registerColor(color) {\n PfeAvatar.colors.push({\n color1: `rgb(${color.join(\",\")})`,\n color2: `rgb(${this._adjustColor(color).join(\",\")})`\n });\n }\n\n static _adjustColor(color) {\n const dark = 0.1;\n const l_adj = 0.1; // luminance adjustment\n const hsl = rgb2hsl(...color);\n\n // if luminance is too dark already, then lighten the alternate color\n // instead of darkening it.\n hsl[2] += hsl[2] > dark ? -l_adj : l_adj;\n\n return hsl2rgb(...hsl);\n }\n\n update() {\n // if we have a src element, update the img, otherwise update the random pattern\n if (this.hasAttribute(\"pfe-src\")) {\n this.shadowRoot.querySelector(\"img\").src = this.src;\n } else {\n const bitPattern = hash(this.name).toString(2);\n const arrPattern = bitPattern.split(\"\").map(n => Number(n));\n this._colorIndex = Math.floor(\n (PfeAvatar.colors.length * parseInt(bitPattern, 2)) / Math.pow(2, 32)\n );\n this.color1 = PfeAvatar.colors[this._colorIndex].color1;\n this.color2 = PfeAvatar.colors[this._colorIndex].color2;\n\n this._clear();\n this._drawBackground();\n if (this.pattern === PfeAvatar.patterns.squares) {\n this._drawSquarePattern(arrPattern);\n } else if (this.pattern === PfeAvatar.patterns.triangles) {\n this._drawTrianglePattern(arrPattern);\n }\n // this._drawGradient();\n }\n }\n\n _clear() {\n this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n }\n\n _drawBackground() {\n this._ctx.fillStyle = this.color1;\n this._ctx.fillRect(0, 0, this._canvas.width, this._canvas.height);\n }\n\n _drawSquarePattern(pattern) {\n this._ctx.fillStyle = this.color2;\n if (this._ctx) {\n let i = pattern.length;\n while (i--) {\n if (pattern[i]) {\n this._drawMirroredSquare(i % 4, Math.floor(i / 4));\n }\n }\n }\n }\n\n /**\n * Draw a square at the given position, mirrored onto both the left and right half of the canvas.\n */\n _drawMirroredSquare(x, y) {\n if (this._ctx) {\n this._drawSquare(x, y);\n this._drawSquare(7 - x, y);\n }\n }\n\n _drawSquare(x, y) {\n this._ctx.fillRect(\n this._squareSize * x,\n this._squareSize * y,\n this._squareSize,\n this._squareSize\n );\n }\n\n _drawTrianglePattern(pattern) {\n this._ctx.fillStyle = this.color2;\n if (this._ctx) {\n let i = pattern.length;\n while (i--) {\n if (pattern[i]) {\n const x = Math.floor(i / 2) % 2;\n const y = Math.floor(i / 4);\n const alt = i % 4;\n\n const p1 = [x, y];\n const p2 = [x, y];\n const p3 = [x, y];\n\n switch (alt) {\n case 0:\n p2[1]++;\n p3[0]++;\n p3[1]++;\n break;\n case 1:\n p2[0]++;\n p3[0]++;\n p3[1]++;\n break;\n case 2:\n p2[0]++;\n p3[1]++;\n break;\n case 3:\n p1[0]++;\n p2[0]++;\n p2[1]++;\n p3[1]++;\n break;\n }\n\n this._drawMirroredTriangle(p1, p2, p3);\n }\n }\n }\n }\n\n /**\n * Draw a square at the given position in the top-left quadrant of the\n * canvas, and mirrored to the other three quadrants.\n */\n _drawMirroredTriangle(p1, p2, p3) {\n if (this._ctx) {\n this._drawTriangle(p1, p2, p3);\n this._drawTriangle(\n [4 - p1[0], p1[1]],\n [4 - p2[0], p2[1]],\n [4 - p3[0], p3[1]]\n );\n }\n }\n\n _drawTriangle(p1, p2, p3) {\n this._ctx.beginPath();\n this._ctx.moveTo(...p1.map(c => c * this._triangleSize));\n this._ctx.lineTo(...p2.map(c => c * this._triangleSize));\n this._ctx.lineTo(...p3.map(c => c * this._triangleSize));\n this._ctx.closePath();\n this._ctx.fill();\n this._ctx.fill();\n }\n\n _drawGradient() {\n const gradient = this._ctx.createLinearGradient(\n 0,\n this._canvas.height,\n this._canvas.width,\n 0\n );\n const color = this.color2;\n let gradientColor1 = color;\n let gradientColor2 = color;\n if (/^#[A-f0-9]{3}$/.test(color)) {\n // color is of the form \"#fff\"\n gradientColor1 += \"c\";\n gradientColor2 += \"0\";\n } else if (/^#[A-f0-9]{6}$/.test(color)) {\n // color is of the form \"#ffffff\"\n gradientColor1 += \"cc\";\n gradientColor2 += \"00\";\n }\n gradient.addColorStop(0, gradientColor1);\n gradient.addColorStop(1, gradientColor2);\n gradient.addColorStop(1, gradientColor1);\n this._ctx.fillStyle = gradient;\n this._ctx.fillRect(0, 0, this._canvas.width, this._canvas.height);\n }\n}\n\nPfeAvatar._registerColors();\n\nPFElement.create(PfeAvatar);\n\nexport default PfeAvatar;\n","/**\n * djb2 string hashing function.\n *\n * @see http://www.cse.yorku.ca/~oz/hash.html\n * @param {String} str the string to hash.\n * @return {Number} a positive integer\n */\n\nfunction hash(str) {\n let hash = 5381;\n let i = str.length;\n\n while (i) {\n hash = (hash * 33) ^ str.charCodeAt(--i);\n }\n\n return hash >>> 0;\n}\n\nexport { hash };\n"],"names":["h2rgb","v1","v2","vH","PfeAvatar","PFElement","this","getAttribute","val","setAttribute","href","patterns","squares","name","log","Object","values","tag","_initCanvas","emitEvent","events","connected","attr","oldValue","newValue","arguments","update","addEventListener","_this2","_canvas","shadowRoot","querySelector","size","var","replace","defaultSize","width","height","_squareSize","_triangleSize","_ctx","getContext","bitPattern","arrPattern","hasAttribute","src","str","hash","i","length","charCodeAt","toString","split","map","Number","n","_colorIndex","Math","floor","colors","parseInt","pow","color1","color2","_clear","_drawBackground","pattern","_drawSquarePattern","triangles","_drawTrianglePattern","clearRect","fillStyle","fillRect","_drawMirroredSquare","x","y","_drawSquare","p1","p2","p3","_drawMirroredTriangle","_drawTriangle","beginPath","moveTo","c","_this3","lineTo","closePath","fill","gradient","createLinearGradient","color","gradientColor1","gradientColor2","test","addColorStop","defaultColors","forEach","colorCode","exec","shift","_registerColor","push","join","_adjustColor","hsl","_R","_G","_B","del_r","del_g","del_b","H","S","r","max","min","g","b","var_min","var_max","del_max","L","_H","_S","_L","R","G","B","a","_registerColors","create"],"mappings":"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"} \ No newline at end of file diff --git a/js/pfe-avatar/package.json b/js/pfe-avatar/package.json new file mode 100644 index 00000000..ec72d10e --- /dev/null +++ b/js/pfe-avatar/package.json @@ -0,0 +1,80 @@ +{ + "_args": [ + [ + "@patternfly/pfe-avatar@1.0.0-prerelease.56", + "/home/runner/work/jbossorg.github.io/jbossorg.github.io" + ] + ], + "_from": "@patternfly/pfe-avatar@1.0.0-prerelease.56", + "_id": "@patternfly/pfe-avatar@1.0.0-prerelease.56", + "_inBundle": false, + "_integrity": "sha512-vTKiGKOLgfpMX0nRHUumEdT8mXU2qEz3qkOTtyGBryzVm/M1aAZ764cDmYrNQj7XZVg+uSebxgt7bFO6hpW0Hg==", + "_location": "/@patternfly/pfe-avatar", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "@patternfly/pfe-avatar@1.0.0-prerelease.56", + "name": "@patternfly/pfe-avatar", + "escapedName": "@patternfly%2fpfe-avatar", + "scope": "@patternfly", + "rawSpec": "1.0.0-prerelease.56", + "saveSpec": null, + "fetchSpec": "1.0.0-prerelease.56" + }, + "_requiredBy": [ + "/" + ], + "_resolved": "https://registry.npmjs.org/@patternfly/pfe-avatar/-/pfe-avatar-1.0.0-prerelease.56.tgz", + "_spec": "1.0.0-prerelease.56", + "_where": "/home/runner/work/jbossorg.github.io/jbossorg.github.io", + "bugs": { + "url": "https://github.com/patternfly/patternfly-elements/issues" + }, + "contributors": [ + { + "name": "Michael Clayton" + } + ], + "dependencies": { + "@patternfly/pfelement": "^1.0.0-prerelease.56" + }, + "description": "Avatar for PatternFly Elements", + "devDependencies": { + "@patternfly/pfe-sass": "^1.0.0-prerelease.56" + }, + "files": [ + "dist" + ], + "generator-pfelement-version": "0.6.8", + "gitHead": "efed86135e85925182445801ab89570b3bcec5ca", + "homepage": "https://github.com/patternfly/patternfly-elements#readme", + "keywords": [ + "web-components", + "html" + ], + "license": "MIT", + "main": "./dist/pfe-avatar.umd.js", + "module": "./dist/pfe-avatar.js", + "name": "@patternfly/pfe-avatar", + "pfelement": { + "className": "PfeAvatar", + "elementName": "pfe-avatar" + }, + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/patternfly/patternfly-elements.git", + "directory": "elements/pfe-avatar" + }, + "scripts": { + "build": "../../node_modules/.bin/gulp && ../../node_modules/.bin/prettier --ignore-path ../../.prettierignore --write '**/*.{js,json}'", + "dev": "../../node_modules/.bin/gulp dev", + "test": "../../node_modules/.bin/wct --configFile ../../wct.conf.json elements/pfe-avatar/test/", + "watch": "../../node_modules/.bin/gulp watch" + }, + "unpkg": "./dist/pfe-avatar.umd.min.js", + "version": "1.0.0-prerelease.56" +} diff --git a/js/pfe-band/LICENSE.txt b/js/pfe-band/LICENSE.txt new file mode 100644 index 00000000..599bd61b --- /dev/null +++ b/js/pfe-band/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright 2020 Red Hat, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/js/pfe-band/README.md b/js/pfe-band/README.md new file mode 100644 index 00000000..85f0a515 --- /dev/null +++ b/js/pfe-band/README.md @@ -0,0 +1,104 @@ +# PatternFly Element | Band container + +This container element provides a set of slots in which to render banded content. + +## Slots + +All slots other than `pfe-band--body` are optional. If the slot is not defined, the container tag for it will not be rendered in the template. + +- `pfe-band--header`: This slot renders at the top of the container and generally contains the title, headline, and/or subheadline content. Other possible candidates include a set of social sharing links or tags that describe the content below. The template is automatically wrapping this slot in a `header` tag. Recommend using h-level or p tags inside this slot. +- **Default slot**: This unnamed slot should contain the bulk of the content in this element. The template is automatically wrapping all content within an `article` tag. +- `pfe-band--footer`: This slot is typically used for calls-to-action or footnotes and is pushed to the bottom of the container. Recommended tags include `pfe-cta`.The template is automatically wrapping this slot in a `footer` tag. +- `pfe-band--aside`: This slot is for content that should be rendered to the right or left of the default slot on desktop. Asides often contain `pfe-card` or interest forms which provide users a little more information or context for the band. The template is automatically wrapping this slot in an `aside` tag. + +### Example markup +``` + +

Lighter band; no footer

+ +

Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata dolor sit amet.

+ + +

Aside: left body bottom

+

Ut wisi enim ad minim veniam.

+
+ + + Learn more + +
+``` + + +## Attributes + + + +There are several attributes available for customizing the visual treatment of this container. + +- `pfe-color`: Options include darkest, darker, accent, complement, lighter, lightest. The band has a default value of `#dfdfdf`. Your theme will influence these colors so check there first if you are seeing inconsistencies. + + | color | hex | + |-------|-----| + | default | #dfdfdf | + | darker | #464646 | + | darkest | #131313 | + | accent | #ee0000 | + | complement | #0477a4 | + | lighter | #ececec | + | lightest | #ffffff | + +- `pfe-img-src`: Optional background image applied to the entire band container. Alignment of this image can be managed using the `--pfe-band--BackgroundPosition` variable which is set to `center center` by default. +- `pfe-size`: Optionally adjusts the padding on the container. Accepts: `small`. + +### Aside settings +The aside settings have defaults and if no attribute is defined on the element's main tag, these attributes will be injected with their default values automatically. + +- `pfe-aside-desktop`: This influences where the aside is rendered at the desktop view and are indicated relative to the body content. Options are `right` or `left`. **Right is the default.** +- `pfe-aside-mobile`: This influences the position of the aside in the mobile view as well as where in the DOM the aside markup is rendered. These names are relative to the body content. Options are `top` or `bottom`. **Bottom is the default.** +- `pfe-aside-height`: This influences the height of the aside region relative to the body content. Options are `full` or `body`. A `full` height starts at the top of the band and spans the header, body, and footer regions. A `body` height spans the body and footer regions only with the header region sitting above it in the rendered view. **Body is the default.** + +## Variables +There are several powerful variables available to hook into and override default styles. + +- **Vertical and horizontal padding**: `--pfe-band--Padding--vertical` and `--pfe-band--Padding--horizontal` accept size values such as px, em, rem, etc. +- **Background color**: Though using the `pfe-color` attribute is strongly recommended when setting the background color for the band, you can also use completely custom colors by updating the `--pfe-band--BackgroundColor` variable. If you update this value manually, you should also update the `--theme` context variable to invoke the right theme on it and it's child elements. Supported themes include: `light`, `dark`, and `saturated`. +- **Background position**: This is designed for use with the `pfe-img-src` attribute to allow you to align your background image. Default value is `center center`. +- **Border**: This allows the customization of a border around the entire container and is primarily designed to be used to add a top and/or bottom border line. This variable accepts the entire border shorthand and is set to transparent by default. +- **Layout**: The band has a rudimentary layout system designed to be used inside the slot regions for the header, body, footer, and aside. It uses the CSS grid spec and creates a stacked layout by default. By updating these values, you will be able to create simple grid layouts. Please note that these do not include fallbacks for older browsers. Possible values include: `1fr 1fr`, `repeat(3, 1fr)`, `repeat(auto-fill, minmax(300px, 1fr))` + * `--pfe-band--layout`: Applied to `.pfe-band__container`. + * `--pfe-band_header--layout`: Applied to `.pfe-band__header`. + * `--pfe-band_body--layout`: Applied to `.pfe-band__body`. + * `--pfe-band_footer--layout`: Applied to `.pfe-band__footer`. + * `--pfe-band_aside--layout`: Applied to `.pfe-band__aside`. + +## Test + + npm run test + +## Build + + npm run build + +## Demo + +From the PFElements root directory, run: + + npm start + +## Code style + +Band (and all PatternFly Elements) use [Prettier][prettier] to auto-format JS and JSON. The style rules get applied when you commit a change. If you choose to, you can [integrate your editor][prettier-ed] with Prettier to have the style rules applied on every save. + +[prettier]: https://github.com/prettier/prettier/ +[prettier-ed]: https://github.com/prettier/prettier/#editor-integration +[web-component-tester]: https://github.com/Polymer/web-component-tester diff --git a/js/pfe-band/dist/pfe-band.js b/js/pfe-band/dist/pfe-band.js new file mode 100644 index 00000000..7fa0a8d0 --- /dev/null +++ b/js/pfe-band/dist/pfe-band.js @@ -0,0 +1,233 @@ +import PFElement from '../../pfelement/dist/pfelement.js'; + +// @POLYFILL Element.matches +// https://developer.mozilla.org/en-US/docs/Web/API/Element/matches +if (!Element.prototype.matches) { + Element.prototype.matches = + Element.prototype.msMatchesSelector || + Element.prototype.webkitMatchesSelector; +} + +// @POLYFILL Element.closest +// https://developer.mozilla.org/en-US/docs/Web/API/Element/closest +if (!Element.prototype.closest) { + Element.prototype.closest = function(s) { + var el = this; + do { + if (el.matches(s)) return el; + el = el.parentElement || el.parentNode; + } while (el !== null && el.nodeType === 1); + return null; + }; +} + +// @POLYFILL Array.includes +// https://tc39.github.io/ecma262/#sec-array.prototype.includes +if (!Array.prototype.includes) { + Object.defineProperty(Array.prototype, "includes", { + value: function(valueToFind, fromIndex) { + if (this == null) { + throw new TypeError('"this" is null or not defined'); + } + + // 1. Let O be ? ToObject(this value). + var o = Object(this); + + // 2. Let len be ? ToLength(? Get(O, "length")). + var len = o.length >>> 0; + + // 3. If len is 0, return false. + if (len === 0) { + return false; + } + + // 4. Let n be ? ToInteger(fromIndex). + // (If fromIndex is undefined, this step produces the value 0.) + var n = fromIndex | 0; + + // 5. If n ≥ 0, then + // a. Let k be n. + // 6. Else n < 0, + // a. Let k be len + n. + // b. If k < 0, let k be 0. + var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); + + function sameValueZero(x, y) { + return ( + x === y || + (typeof x === "number" && + typeof y === "number" && + isNaN(x) && + isNaN(y)) + ); + } + + // 7. Repeat, while k < len + while (k < len) { + // a. Let elementK be the result of ? Get(O, ! ToString(k)). + // b. If SameValueZero(valueToFind, elementK) is true, return true. + if (sameValueZero(o[k], valueToFind)) { + return true; + } + // c. Increase k by 1. + k++; + } + + // 8. Return false + return false; + } + }); +} + +/*! + * PatternFly Elements: PfeBand 1.0.0-prerelease.55 + * @license + * Copyright 2020 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * +*/ + +class PfeBand extends PFElement { + static get version() { + return "1.0.0-prerelease.55"; + } + + get html() { + return `
this.has_slot(`pfe-band--${slot}`) ? `pfe-has-${slot}` : "").join(" ")}> + ${this.has_slot("pfe-band--aside") && this.asidePosition.mobile === "top" ? `` : ""} + ${this.has_slot("pfe-band--header") ? `
` : ""} +
+ ${this.has_slot("pfe-band--aside") && this.asidePosition.mobile !== "top" ? `` : ""} + ${this.has_slot("pfe-band--footer") ? `
` : ""} +
`; + } + + static get properties() { + return {"color":{"title":"Background color","type":"string","enum":["lightest","base","darker","darkest","complement","accent"],"default":"base","prefixed":true,"observer":"_colorChanged"},"img-src":{"title":"Background image","type":"string","prefixed":true,"observer":"_imgSrcChanged"},"aside-desktop":{"title":"Aside positioning (desktop)","type":"string","default":"right","enum":["right","left"],"prefixed":true,"observer":"_basicAttributeChanged","options":{"dependencies":[{"type":"slot","id":"aside"}]}},"aside-mobile":{"title":"Aside positioning (mobile)","type":"string","default":"bottom","enum":["top","bottom"],"prefixed":true,"observer":"_basicAttributeChanged","options":{"dependencies":[{"type":"slot","id":"aside"}]}},"aside-height":{"title":"Aside height","type":"string","default":"body","enum":["full","body"],"prefixed":true,"observer":"_basicAttributeChanged","options":{"dependencies":[{"type":"slot","id":"aside"}]}}}; + } + + static get slots() { + return {"header":{"title":"Header","type":"array","namedSlot":true,"maxItems":3,"items":{"title":"Body item","oneOf":[{"$ref":"raw"}]}},"body":{"title":"Body","type":"array","namedSlot":false,"items":{"oneOf":[{"$ref":"pfe-card"},{"$ref":"raw"}]}},"footer":{"title":"Footer","type":"array","namedSlot":true,"maxItems":3,"items":{"oneOf":[{"$ref":"pfe-cta"},{"$ref":"raw"}]}},"aside":{"title":"Aside","type":"array","namedSlot":true,"maxItems":5,"items":{"oneOf":[{"$ref":"pfe-card"},{"$ref":"raw"}]}}}; + } + static get tag() { + return "pfe-band"; + } + + get schemaUrl() { + return "pfe-band.json"; + } + + get templateUrl() { + return "pfe-band.html"; + } + + get styleUrl() { + return "pfe-band.scss"; + } + + get imageSrc() { + return this.getAttribute("pfe-img-src"); + } + + get backgroundColor() { + return this.getAttribute("pfe-color"); + } + + get asidePosition() { + return { + desktop: this.getAttribute("pfe-aside-desktop"), + mobile: this.getAttribute("pfe-aside-mobile"), + height: this.getAttribute("pfe-aside-height") + }; + } + + static get observedAttributes() { + return [ + "pfe-aside-desktop", + "pfe-aside-mobile", + "pfe-aside-height", + "pfe-color", + "pfe-img-src" + ]; + } + + static get cascadingAttributes() { + return { + "pfe-aside-desktop": ".pfe-band__container", + "pfe-aside-mobile": ".pfe-band__container", + "pfe-aside-height": ".pfe-band__container" + }; + } + + // Declare the type of this component + static get PfeType() { + return PFElement.PfeTypes.Container; + } + + constructor() { + super(PfeBand, { type: PfeBand.PfeType }); + } + + connectedCallback() { + super.connectedCallback(); + + // Initialize the background image attachment + if (this.imageSrc) { + this._imgSrcChanged("pfe-img-src", "", this.imageSrc); + } + } + + attributeChangedCallback(attr, oldValue, newValue) { + super.attributeChangedCallback(attr, oldValue, newValue); + // Strip the prefix form the attribute + attr = attr.replace("pfe-", ""); + // If the observer is defined in the attribute properties + if (this[attr] && this[attr].observer) { + // Get the observer function + let observer = this[this[attr].observer].bind(this); + // If it's a function, allow it to run + if (typeof observer === "function") observer(attr, oldValue, newValue); + } + } + + _basicAttributeChanged(attr, oldValue, newValue) { + this[attr].value = newValue; + } + + // Update the color attribute and contexts + _colorChanged(attr, oldValue, newValue) { + this[attr].value = newValue; + // Trigger an update in nested components + this.context_update(); + } + + // Update the background image + _imgSrcChanged(attr, oldValue, newValue) { + // Set the image as the background image + this.style.backgroundImage = newValue ? `url('${newValue}')` : ``; + } +} + +PFElement.create(PfeBand); + +export default PfeBand; +//# sourceMappingURL=pfe-band.js.map diff --git a/js/pfe-band/dist/pfe-band.js.map b/js/pfe-band/dist/pfe-band.js.map new file mode 100644 index 00000000..2f0ab82b --- /dev/null +++ b/js/pfe-band/dist/pfe-band.js.map @@ -0,0 +1 @@ +{"version":3,"file":"pfe-band.js","sources":["../_temp/polyfills--pfe-band.js","../_temp/pfe-band.js"],"sourcesContent":["// @POLYFILL Element.matches\n// https://developer.mozilla.org/en-US/docs/Web/API/Element/matches\nif (!Element.prototype.matches) {\n Element.prototype.matches =\n Element.prototype.msMatchesSelector ||\n Element.prototype.webkitMatchesSelector;\n}\n\n// @POLYFILL Element.closest\n// https://developer.mozilla.org/en-US/docs/Web/API/Element/closest\nif (!Element.prototype.closest) {\n Element.prototype.closest = function(s) {\n var el = this;\n do {\n if (el.matches(s)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n return null;\n };\n}\n\n// @POLYFILL Array.includes\n// https://tc39.github.io/ecma262/#sec-array.prototype.includes\nif (!Array.prototype.includes) {\n Object.defineProperty(Array.prototype, \"includes\", {\n value: function(valueToFind, fromIndex) {\n if (this == null) {\n throw new TypeError('\"this\" is null or not defined');\n }\n\n // 1. Let O be ? ToObject(this value).\n var o = Object(this);\n\n // 2. Let len be ? ToLength(? Get(O, \"length\")).\n var len = o.length >>> 0;\n\n // 3. If len is 0, return false.\n if (len === 0) {\n return false;\n }\n\n // 4. Let n be ? ToInteger(fromIndex).\n // (If fromIndex is undefined, this step produces the value 0.)\n var n = fromIndex | 0;\n\n // 5. If n ≥ 0, then\n // a. Let k be n.\n // 6. Else n < 0,\n // a. Let k be len + n.\n // b. If k < 0, let k be 0.\n var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);\n\n function sameValueZero(x, y) {\n return (\n x === y ||\n (typeof x === \"number\" &&\n typeof y === \"number\" &&\n isNaN(x) &&\n isNaN(y))\n );\n }\n\n // 7. Repeat, while k < len\n while (k < len) {\n // a. Let elementK be the result of ? Get(O, ! ToString(k)).\n // b. If SameValueZero(valueToFind, elementK) is true, return true.\n if (sameValueZero(o[k], valueToFind)) {\n return true;\n }\n // c. Increase k by 1.\n k++;\n }\n\n // 8. Return false\n return false;\n }\n });\n}\n","/*!\n * PatternFly Elements: PfeBand 1.0.0-prerelease.55\n * @license\n * Copyright 2020 Red Hat, Inc.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n * \n*/\n\n// Import polyfills: matches, closest, includes\nimport \"./polyfills--pfe-band.js\";\n\nimport PFElement from \"../../pfelement/dist/pfelement.js\";\n\nclass PfeBand extends PFElement {\n static get version() {\n return \"1.0.0-prerelease.55\";\n }\n\n get html() {\n return `
this.has_slot(`pfe-band--${slot}`) ? `pfe-has-${slot}` : \"\").join(\" \")}>\n ${this.has_slot(\"pfe-band--aside\") && this.asidePosition.mobile === \"top\" ? `` : \"\"}\n ${this.has_slot(\"pfe-band--header\") ? `
` : \"\"}\n
\n ${this.has_slot(\"pfe-band--aside\") && this.asidePosition.mobile !== \"top\" ? `` : \"\"}\n ${this.has_slot(\"pfe-band--footer\") ? `
` : \"\"}\n
`;\n }\n\n static get properties() {\n return {\"color\":{\"title\":\"Background color\",\"type\":\"string\",\"enum\":[\"lightest\",\"base\",\"darker\",\"darkest\",\"complement\",\"accent\"],\"default\":\"base\",\"prefixed\":true,\"observer\":\"_colorChanged\"},\"img-src\":{\"title\":\"Background image\",\"type\":\"string\",\"prefixed\":true,\"observer\":\"_imgSrcChanged\"},\"aside-desktop\":{\"title\":\"Aside positioning (desktop)\",\"type\":\"string\",\"default\":\"right\",\"enum\":[\"right\",\"left\"],\"prefixed\":true,\"observer\":\"_basicAttributeChanged\",\"options\":{\"dependencies\":[{\"type\":\"slot\",\"id\":\"aside\"}]}},\"aside-mobile\":{\"title\":\"Aside positioning (mobile)\",\"type\":\"string\",\"default\":\"bottom\",\"enum\":[\"top\",\"bottom\"],\"prefixed\":true,\"observer\":\"_basicAttributeChanged\",\"options\":{\"dependencies\":[{\"type\":\"slot\",\"id\":\"aside\"}]}},\"aside-height\":{\"title\":\"Aside height\",\"type\":\"string\",\"default\":\"body\",\"enum\":[\"full\",\"body\"],\"prefixed\":true,\"observer\":\"_basicAttributeChanged\",\"options\":{\"dependencies\":[{\"type\":\"slot\",\"id\":\"aside\"}]}}};\n }\n\n static get slots() {\n return {\"header\":{\"title\":\"Header\",\"type\":\"array\",\"namedSlot\":true,\"maxItems\":3,\"items\":{\"title\":\"Body item\",\"oneOf\":[{\"$ref\":\"raw\"}]}},\"body\":{\"title\":\"Body\",\"type\":\"array\",\"namedSlot\":false,\"items\":{\"oneOf\":[{\"$ref\":\"pfe-card\"},{\"$ref\":\"raw\"}]}},\"footer\":{\"title\":\"Footer\",\"type\":\"array\",\"namedSlot\":true,\"maxItems\":3,\"items\":{\"oneOf\":[{\"$ref\":\"pfe-cta\"},{\"$ref\":\"raw\"}]}},\"aside\":{\"title\":\"Aside\",\"type\":\"array\",\"namedSlot\":true,\"maxItems\":5,\"items\":{\"oneOf\":[{\"$ref\":\"pfe-card\"},{\"$ref\":\"raw\"}]}}};\n }\n static get tag() {\n return \"pfe-band\";\n }\n\n get schemaUrl() {\n return \"pfe-band.json\";\n }\n\n get templateUrl() {\n return \"pfe-band.html\";\n }\n\n get styleUrl() {\n return \"pfe-band.scss\";\n }\n\n get imageSrc() {\n return this.getAttribute(\"pfe-img-src\");\n }\n\n get backgroundColor() {\n return this.getAttribute(\"pfe-color\");\n }\n\n get asidePosition() {\n return {\n desktop: this.getAttribute(\"pfe-aside-desktop\"),\n mobile: this.getAttribute(\"pfe-aside-mobile\"),\n height: this.getAttribute(\"pfe-aside-height\")\n };\n }\n\n static get observedAttributes() {\n return [\n \"pfe-aside-desktop\",\n \"pfe-aside-mobile\",\n \"pfe-aside-height\",\n \"pfe-color\",\n \"pfe-img-src\"\n ];\n }\n\n static get cascadingAttributes() {\n return {\n \"pfe-aside-desktop\": \".pfe-band__container\",\n \"pfe-aside-mobile\": \".pfe-band__container\",\n \"pfe-aside-height\": \".pfe-band__container\"\n };\n }\n\n // Declare the type of this component\n static get PfeType() {\n return PFElement.PfeTypes.Container;\n }\n\n constructor() {\n super(PfeBand, { type: PfeBand.PfeType });\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n // Initialize the background image attachment\n if (this.imageSrc) {\n this._imgSrcChanged(\"pfe-img-src\", \"\", this.imageSrc);\n }\n }\n\n attributeChangedCallback(attr, oldValue, newValue) {\n super.attributeChangedCallback(attr, oldValue, newValue);\n // Strip the prefix form the attribute\n attr = attr.replace(\"pfe-\", \"\");\n // If the observer is defined in the attribute properties\n if (this[attr] && this[attr].observer) {\n // Get the observer function\n let observer = this[this[attr].observer].bind(this);\n // If it's a function, allow it to run\n if (typeof observer === \"function\") observer(attr, oldValue, newValue);\n }\n }\n\n _basicAttributeChanged(attr, oldValue, newValue) {\n this[attr].value = newValue;\n }\n\n // Update the color attribute and contexts\n _colorChanged(attr, oldValue, newValue) {\n this[attr].value = newValue;\n // Trigger an update in nested components\n this.context_update();\n }\n\n // Update the background image\n _imgSrcChanged(attr, oldValue, newValue) {\n // Set the image as the background image\n this.style.backgroundImage = newValue ? `url('${newValue}')` : ``;\n }\n}\n\nPFElement.create(PfeBand);\n\nexport { PfeBand as default };\n"],"names":[],"mappings":";;AAAA;;AAEA,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE;EAC9B,OAAO,CAAC,SAAS,CAAC,OAAO;IACvB,OAAO,CAAC,SAAS,CAAC,iBAAiB;IACnC,OAAO,CAAC,SAAS,CAAC,qBAAqB,CAAC;CAC3C;;;;AAID,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE;EAC9B,OAAO,CAAC,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,EAAE;IACtC,IAAI,EAAE,GAAG,IAAI,CAAC;IACd,GAAG;MACD,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;MAC7B,EAAE,GAAG,EAAE,CAAC,aAAa,IAAI,EAAE,CAAC,UAAU,CAAC;KACxC,QAAQ,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC,QAAQ,KAAK,CAAC,EAAE;IAC3C,OAAO,IAAI,CAAC;GACb,CAAC;CACH;;;;AAID,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE;EAC7B,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,EAAE;IACjD,KAAK,EAAE,SAAS,WAAW,EAAE,SAAS,EAAE;MACtC,IAAI,IAAI,IAAI,IAAI,EAAE;QAChB,MAAM,IAAI,SAAS,CAAC,+BAA+B,CAAC,CAAC;OACtD;;;MAGD,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;;;MAGrB,IAAI,GAAG,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;;;MAGzB,IAAI,GAAG,KAAK,CAAC,EAAE;QACb,OAAO,KAAK,CAAC;OACd;;;;MAID,IAAI,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC;;;;;;;MAOtB,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;MAEpD,SAAS,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE;QAC3B;UACE,CAAC,KAAK,CAAC;WACN,OAAO,CAAC,KAAK,QAAQ;YACpB,OAAO,CAAC,KAAK,QAAQ;YACrB,KAAK,CAAC,CAAC,CAAC;YACR,KAAK,CAAC,CAAC,CAAC,CAAC;UACX;OACH;;;MAGD,OAAO,CAAC,GAAG,GAAG,EAAE;;;QAGd,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE;UACpC,OAAO,IAAI,CAAC;SACb;;QAED,CAAC,EAAE,CAAC;OACL;;;MAGD,OAAO,KAAK,CAAC;KACd;GACF,CAAC,CAAC;CACJ;;AC7ED;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,AAKA;AACA,MAAM,OAAO,SAAS,SAAS,CAAC;EAC9B,WAAW,OAAO,GAAG;IACnB,OAAO,qBAAqB,CAAC;GAC9B;;EAED,IAAI,IAAI,GAAG;IACT,OAAO,CAAC;;4CAEgC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;EAC7J,EAAE,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,KAAK,GAAG,CAAC,4EAA4E,CAAC,GAAG,EAAE,CAAC;EAChK,EAAE,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,GAAG,CAAC,+EAA+E,CAAC,GAAG,EAAE,CAAC;;EAE7H,EAAE,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,KAAK,GAAG,CAAC,2EAA2E,CAAC,GAAG,EAAE,CAAC;EAC/J,EAAE,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,GAAG,CAAC,+EAA+E,CAAC,GAAG,EAAE,CAAC;UACrH,CAAC,CAAC;GACT;;EAED,WAAW,UAAU,GAAG;IACtB,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,6BAA6B,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,4BAA4B,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GAC/6B;;EAED,WAAW,KAAK,GAAG;IACjB,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;GACvf;EACD,WAAW,GAAG,GAAG;IACf,OAAO,UAAU,CAAC;GACnB;;EAED,IAAI,SAAS,GAAG;IACd,OAAO,eAAe,CAAC;GACxB;;EAED,IAAI,WAAW,GAAG;IAChB,OAAO,eAAe,CAAC;GACxB;;EAED,IAAI,QAAQ,GAAG;IACb,OAAO,eAAe,CAAC;GACxB;;EAED,IAAI,QAAQ,GAAG;IACb,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;GACzC;;EAED,IAAI,eAAe,GAAG;IACpB,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;GACvC;;EAED,IAAI,aAAa,GAAG;IAClB,OAAO;MACL,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC;MAC/C,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC;MAC7C,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC;KAC9C,CAAC;GACH;;EAED,WAAW,kBAAkB,GAAG;IAC9B,OAAO;MACL,mBAAmB;MACnB,kBAAkB;MAClB,kBAAkB;MAClB,WAAW;MACX,aAAa;KACd,CAAC;GACH;;EAED,WAAW,mBAAmB,GAAG;IAC/B,OAAO;MACL,mBAAmB,EAAE,sBAAsB;MAC3C,kBAAkB,EAAE,sBAAsB;MAC1C,kBAAkB,EAAE,sBAAsB;KAC3C,CAAC;GACH;;;EAGD,WAAW,OAAO,GAAG;IACnB,OAAO,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC;GACrC;;EAED,WAAW,GAAG;IACZ,KAAK,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;GAC3C;;EAED,iBAAiB,GAAG;IAClB,KAAK,CAAC,iBAAiB,EAAE,CAAC;;;IAG1B,IAAI,IAAI,CAAC,QAAQ,EAAE;MACjB,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;KACvD;GACF;;EAED,wBAAwB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACjD,KAAK,CAAC,wBAAwB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;;IAEzD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;;IAEhC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;;MAErC,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;MAEpD,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;KACxE;GACF;;EAED,sBAAsB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE;IAC/C,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,QAAQ,CAAC;GAC7B;;;EAGD,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACtC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,QAAQ,CAAC;;IAE5B,IAAI,CAAC,cAAc,EAAE,CAAC;GACvB;;;EAGD,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE;;IAEvC,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,QAAQ,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;GACnE;CACF;;AAED,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;;;;"} \ No newline at end of file diff --git a/js/pfe-band/dist/pfe-band.json b/js/pfe-band/dist/pfe-band.json new file mode 100644 index 00000000..b20d749a --- /dev/null +++ b/js/pfe-band/dist/pfe-band.json @@ -0,0 +1,156 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Band", + "description": "This element creates a header, body, footer, and aside region in which to place content or other components.", + "type": "object", + "tag": "pfe-band", + "class": "pfe-band", + "category": "container", + "properties": { + "slots": { + "title": "Slots", + "description": "Definition of the supported slots", + "type": "object", + "properties": { + "header": { + "title": "Header", + "type": "array", + "namedSlot": true, + "maxItems": 3, + "items": { + "title": "Body item", + "oneOf": [ + { + "$ref": "raw" + } + ] + } + }, + "body": { + "title": "Body", + "type": "array", + "namedSlot": false, + "items": { + "oneOf": [ + { + "$ref": "pfe-card" + }, + { + "$ref": "raw" + } + ] + } + }, + "footer": { + "title": "Footer", + "type": "array", + "namedSlot": true, + "maxItems": 3, + "items": { + "oneOf": [ + { + "$ref": "pfe-cta" + }, + { + "$ref": "raw" + } + ] + } + }, + "aside": { + "title": "Aside", + "type": "array", + "namedSlot": true, + "maxItems": 5, + "items": { + "oneOf": [ + { + "$ref": "pfe-card" + }, + { + "$ref": "raw" + } + ] + } + } + } + }, + "attributes": { + "title": "Attributes", + "type": "object", + "properties": { + "color": { + "title": "Background color", + "type": "string", + "enum": [ + "lightest", + "base", + "darker", + "darkest", + "complement", + "accent" + ], + "default": "base", + "prefixed": true, + "observer": "_colorChanged" + }, + "img-src": { + "title": "Background image", + "type": "string", + "prefixed": true, + "observer": "_imgSrcChanged" + }, + "aside-desktop": { + "title": "Aside positioning (desktop)", + "type": "string", + "default": "right", + "enum": ["right", "left"], + "prefixed": true, + "observer": "_basicAttributeChanged", + "options": { + "dependencies": [ + { + "type": "slot", + "id": "aside" + } + ] + } + }, + "aside-mobile": { + "title": "Aside positioning (mobile)", + "type": "string", + "default": "bottom", + "enum": ["top", "bottom"], + "prefixed": true, + "observer": "_basicAttributeChanged", + "options": { + "dependencies": [ + { + "type": "slot", + "id": "aside" + } + ] + } + }, + "aside-height": { + "title": "Aside height", + "type": "string", + "default": "body", + "enum": ["full", "body"], + "prefixed": true, + "observer": "_basicAttributeChanged", + "options": { + "dependencies": [ + { + "type": "slot", + "id": "aside" + } + ] + } + } + } + } + }, + "required": ["slots", "attributes"], + "additionalProperties": false +} diff --git a/js/pfe-band/dist/pfe-band.min.js b/js/pfe-band/dist/pfe-band.min.js new file mode 100644 index 00000000..b3b13217 --- /dev/null +++ b/js/pfe-band/dist/pfe-band.min.js @@ -0,0 +1,26 @@ +import e from"../../pfelement/dist/pfelement.min.js";Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector),Element.prototype.closest||(Element.prototype.closest=function(e){var a=this;do{if(a.matches(e))return a;a=a.parentElement||a.parentNode}while(null!==a&&1===a.nodeType);return null}),Array.prototype.includes||Object.defineProperty(Array.prototype,"includes",{value:function(e,a){if(null==this)throw new TypeError('"this" is null or not defined');var r=Object(this),d=r.length>>>0;if(0===d)return!1;var o,t,i=0|a,n=Math.max(i>=0?i:d-Math.abs(i),0);for(;n@media screen and (-ms-high-contrast:active),screen and (-ms-high-contrast:none){:host([pfe-color=accent]),:host([pfe-color=base]),:host([pfe-color=complement]),:host([pfe-color=darker]),:host([pfe-color=darkest]),:host([pfe-color=lightest]){background-color:#fff!important;color:#151515!important}}@media screen and (-ms-high-contrast:active),screen and (-ms-high-contrast:none){:host{color:#151515!important}}:host{--theme:var(--pfe-band--theme, light);display:block;position:relative;padding:calc(calc(16px * 4)/ 2) calc(16px * 1);padding:calc(var(--pfe-band--Padding--vertical,calc(var(--pfe-theme--container-spacer,16px) * 4))/ 2) var(--pfe-band--Padding--horizontal,calc(var(--pfe-theme--container-spacer,16px) * 1));border:1px solid transparent;border:var(--pfe-band--Border,var(--pfe-theme--surface--border-width,1px) var(--pfe-theme--surface--border-style,solid) transparent);background-color:#f0f0f0;background-color:var(--pfe-band--BackgroundColor,var(--pfe-theme--color--surface--base,#f0f0f0));background-position:center center;background-position:var(--pfe-band--BackgroundPosition,center center);color:#3c3f42;color:var(--pfe-broadcasted--text,#3c3f42)}@media screen and (min-width:768px){:host{--pfe-band--Width:calc( 768px - calc(var(--pfe-band--Padding--horizontal, calc( var(--pfe-theme--container-spacer, 16px) * 1)) * 4))}}@media screen and (min-width:992px){:host{--pfe-band--Width:calc( 992px - calc(var(--pfe-band--Padding--horizontal, calc( var(--pfe-theme--container-spacer, 16px) * 1)) * 4))}}@media screen and (min-width:1200px){:host{--pfe-band--Width:calc( 1200px - calc(var(--pfe-band--Padding--horizontal, calc( var(--pfe-theme--container-spacer, 16px) * 1)) * 4))}}@media (min-width:576px){:host{padding:calc(16px * 4) calc(16px * 1);padding:var(--pfe-band--Padding,var(--pfe-band--Padding--vertical,calc(var(--pfe-theme--container-spacer,16px) * 4)) var(--pfe-band--Padding--horizontal,calc(var(--pfe-theme--container-spacer,16px) * 1)))}}@media print{:host{background-color:#fff!important;background-image:none!important;-webkit-box-shadow:none!important;box-shadow:none!important}}@media print{:host{border-radius:3px;border:1px solid #d2d2d2;padding:calc(16px * 4)/2 calc(16px * 1);padding:calc(var(--pfe-theme--container-spacer,16px) * 4)/2 calc(var(--pfe-theme--container-spacer,16px) * 1)}}@media screen and (-ms-high-contrast:active),screen and (-ms-high-contrast:none){:host{background-color:#fff!important;color:#151515!important;background-image:none!important;padding:16px}}:host *,:host ::after,:host ::before{-webkit-box-sizing:border-box;box-sizing:border-box}:host([on=dark]){--pfe-broadcasted--text:var(--pfe-theme--color--text--on-dark, #fff);--pfe-broadcasted--link:var(--pfe-theme--color--link--on-dark, #73bcf7);--pfe-broadcasted--link--hover:var(--pfe-theme--color--link--hover--on-dark, #bee1f4);--pfe-broadcasted--link--focus:var(--pfe-theme--color--link--focus--on-dark, #bee1f4);--pfe-broadcasted--link--visited:var(--pfe-theme--color--link--visited--on-dark, #bee1f4);--pfe-broadcasted--link-decoration:var(--pfe-theme--link-decoration--on-dark, none);--pfe-broadcasted--link-decoration--hover:var(--pfe-theme--link-decoration--hover--on-dark, underline);--pfe-broadcasted--link-decoration--focus:var(--pfe-theme--link-decoration--focus--on-dark, underline);--pfe-broadcasted--link-decoration--visited:var(--pfe-theme--link-decoration--visited--on-dark, none)}:host([on=saturated]){--pfe-broadcasted--text:var(--pfe-theme--color--text--on-saturated, #fff);--pfe-broadcasted--link:var(--pfe-theme--color--link--on-saturated, #fff);--pfe-broadcasted--link--hover:var(--pfe-theme--color--link--hover--on-saturated, #fafafa);--pfe-broadcasted--link--focus:var(--pfe-theme--color--link--focus--on-saturated, #fafafa);--pfe-broadcasted--link--visited:var(--pfe-theme--color--link--visited--on-saturated, #8476d1);--pfe-broadcasted--link-decoration:var(--pfe-theme--link-decoration--on-saturated, underline);--pfe-broadcasted--link-decoration--hover:var(--pfe-theme--link-decoration--hover--on-saturated, underline);--pfe-broadcasted--link-decoration--focus:var(--pfe-theme--link-decoration--focus--on-saturated, underline);--pfe-broadcasted--link-decoration--visited:var(--pfe-theme--link-decoration--visited--on-saturated, underline)}:host([on=light]){--pfe-broadcasted--text:var(--pfe-theme--color--text, #151515);--pfe-broadcasted--link:var(--pfe-theme--color--link, #06c);--pfe-broadcasted--link--hover:var(--pfe-theme--color--link--hover, #004080);--pfe-broadcasted--link--focus:var(--pfe-theme--color--link--focus, #004080);--pfe-broadcasted--link--visited:var(--pfe-theme--color--link--visited, #6753ac);--pfe-broadcasted--link-decoration:var(--pfe-theme--link-decoration, none);--pfe-broadcasted--link-decoration--hover:var(--pfe-theme--link-decoration--hover, underline);--pfe-broadcasted--link-decoration--focus:var(--pfe-theme--link-decoration--focus, underline);--pfe-broadcasted--link-decoration--visited:var(--pfe-theme--link-decoration--visited, none)}:host([pfe-color=darker]){--pfe-band--BackgroundColor:var(--pfe-theme--color--surface--darker, #3c3f42);--pfe-band--theme:var(--pfe-theme--color--surface--darker--theme, dark)}:host([pfe-color=darkest]){--pfe-band--BackgroundColor:var(--pfe-theme--color--surface--darkest, #151515);--pfe-band--theme:var(--pfe-theme--color--surface--darkest--theme, dark)}:host([pfe-color=base]){--pfe-band--BackgroundColor:var(--pfe-theme--color--surface--base, #f0f0f0);--pfe-band--theme:var(--pfe-theme--color--surface--base--theme, light)}:host([pfe-color=lightest]){--pfe-band--BackgroundColor:var(--pfe-theme--color--surface--lightest, #fff);--pfe-band--theme:var(--pfe-theme--color--surface--lightest--theme, light)}:host([pfe-color=accent]){--pfe-band--BackgroundColor:var(--pfe-theme--color--surface--accent, #004080);--pfe-band--theme:var(--pfe-theme--color--surface--accent--theme, saturated)}:host([pfe-color=complement]){--pfe-band--BackgroundColor:var(--pfe-theme--color--surface--complement, #002952);--pfe-band--theme:var(--pfe-theme--color--surface--complement--theme, saturated)}:host([pfe-size=small]){--pfe-band--Padding:calc(var(--pfe-band--Padding--vertical, calc( var(--pfe-theme--container-spacer, 16px) * 4)) / 4) var(--pfe-band--Padding--horizontal, calc( var(--pfe-theme--container-spacer, 16px) * 1))}.pfe-band__container{--pfe-band__region--width:calc(1fr - var(--pfe-band--Width__aside--sm, 240px) - var(--pfe-band--gutter--horizontal, calc(var(--pfe-theme--container-spacer, 16px) * 3)));grid-template-areas:"body";position:relative;margin:0 auto;width:100%;max-width:auto;max-width:var(--pfe-band--Width,auto)}.pfe-band__container[pfe-has-aside]{grid-template-areas:"body" "aside"}@media (min-width:768px){.pfe-band__container[pfe-has-aside]{--pfe-band--layout:1fr var(--pfe-band--Width__aside--sm, 240px)}}@media (min-width:992px){.pfe-band__container[pfe-has-aside]{--pfe-band--layout:1fr var(--pfe-band--Width__aside--lg, 300px)}}.pfe-band__container[pfe-has-aside][pfe-aside-mobile=top]{grid-template-areas:"aside" "body"}@media (min-width:768px){.pfe-band__container[pfe-has-aside][pfe-aside-desktop=left]{grid-template-areas:"aside body";--pfe-band--layout:var(--pfe-band--Width__aside--sm, 240px) 1fr}.pfe-band__container[pfe-has-aside][pfe-aside-desktop=left]>.pfe-band__body{-ms-grid-row:1;-ms-grid-column:2}.pfe-band__container[pfe-has-aside][pfe-aside-desktop=left]>.pfe-band__aside{-ms-grid-row:1;-ms-grid-column:1}}@media (min-width:992px){.pfe-band__container[pfe-has-aside][pfe-aside-desktop=left]{--pfe-band--layout:var(--pfe-band--Width__aside--lg, 300px) 1fr}}.pfe-band__container[pfe-has-header]{grid-template-areas:"header" "body"}.pfe-band__container[pfe-has-header][pfe-has-aside]{grid-template-areas:"header" "body" "aside"}@media (min-width:768px){.pfe-band__container[pfe-has-header][pfe-has-aside]{grid-template-areas:"header header" "body aside"}.pfe-band__container[pfe-has-header][pfe-has-aside]>.pfe-band__header{-ms-grid-row:1;-ms-grid-column:1;-ms-grid-column-span:2}.pfe-band__container[pfe-has-header][pfe-has-aside]>.pfe-band__body{-ms-grid-row:2;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-has-aside]>.pfe-band__aside{-ms-grid-row:2;-ms-grid-column:2}}.pfe-band__container[pfe-has-header][pfe-aside-mobile=top]{grid-template-areas:"aside" "header" "body"}@media (min-width:768px){.pfe-band__container[pfe-has-header][pfe-aside-height=full]{grid-template-areas:"header aside" "body aside"}.pfe-band__container[pfe-has-header][pfe-aside-height=full]>.pfe-band__header{-ms-grid-row:1;-ms-grid-column:1;-ms-grid-column-span:1}.pfe-band__container[pfe-has-header][pfe-aside-height=full]>.pfe-band__body{-ms-grid-row:2;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-aside-height=full]>.pfe-band__aside{-ms-grid-row:1;-ms-grid-row-span:2;-ms-grid-column:2}}@media (min-width:768px){.pfe-band__container[pfe-has-header][pfe-aside-desktop=left]{grid-template-areas:"header header" "aside body"}.pfe-band__container[pfe-has-header][pfe-aside-desktop=left]>.pfe-band__header{-ms-grid-row:1;-ms-grid-column:1;-ms-grid-column-span:2}.pfe-band__container[pfe-has-header][pfe-aside-desktop=left]>.pfe-band__body{-ms-grid-row:2;-ms-grid-column:2}.pfe-band__container[pfe-has-header][pfe-aside-desktop=left]>.pfe-band__aside{-ms-grid-row:2;-ms-grid-row-span:1;-ms-grid-column:1}}@media (min-width:768px){.pfe-band__container[pfe-has-header][pfe-aside-desktop=left][pfe-aside-height=full]{grid-template-areas:"aside header" "aside body"}.pfe-band__container[pfe-has-header][pfe-aside-desktop=left][pfe-aside-height=full]>.pfe-band__header{-ms-grid-row:1;-ms-grid-column:2;-ms-grid-column-span:1}.pfe-band__container[pfe-has-header][pfe-aside-desktop=left][pfe-aside-height=full]>.pfe-band__body{-ms-grid-row:2;-ms-grid-column:2}.pfe-band__container[pfe-has-header][pfe-aside-desktop=left][pfe-aside-height=full]>.pfe-band__aside{-ms-grid-row:1;-ms-grid-row-span:2;-ms-grid-column:1}}.pfe-band__container[pfe-has-footer]{grid-template-areas:"body" "footer"}.pfe-band__container[pfe-has-footer][pfe-has-aside]{grid-template-areas:"body" "aside" "footer"}@media (min-width:768px){.pfe-band__container[pfe-has-footer][pfe-has-aside]{grid-template-areas:"body aside" "footer footer"}.pfe-band__container[pfe-has-footer][pfe-has-aside]>.pfe-band__body{-ms-grid-row:1;-ms-grid-column:1}.pfe-band__container[pfe-has-footer][pfe-has-aside]>.pfe-band__aside{-ms-grid-row:1;-ms-grid-row-span:1;-ms-grid-column:2}.pfe-band__container[pfe-has-footer][pfe-has-aside]>.pfe-band__footer{-ms-grid-row:2;-ms-grid-column:1;-ms-grid-column-span:2}}.pfe-band__container[pfe-has-footer][pfe-aside-mobile=top]{grid-template-areas:"aside" "body" "footer"}@media (min-width:768px){.pfe-band__container[pfe-has-footer][pfe-aside-height=full]{grid-template-areas:"body aside" "footer aside"}.pfe-band__container[pfe-has-footer][pfe-aside-height=full]>.pfe-band__body{-ms-grid-row:1;-ms-grid-column:1}.pfe-band__container[pfe-has-footer][pfe-aside-height=full]>.pfe-band__aside{-ms-grid-row:1;-ms-grid-row-span:2;-ms-grid-column:2}.pfe-band__container[pfe-has-footer][pfe-aside-height=full]>.pfe-band__footer{-ms-grid-row:2;-ms-grid-column:1;-ms-grid-column-span:1}}@media (min-width:768px){.pfe-band__container[pfe-has-footer][pfe-aside-desktop=left]{grid-template-areas:"aside body" "footer footer"}.pfe-band__container[pfe-has-footer][pfe-aside-desktop=left]>.pfe-band__body{-ms-grid-row:1;-ms-grid-column:2}.pfe-band__container[pfe-has-footer][pfe-aside-desktop=left]>.pfe-band__aside{-ms-grid-row:1;-ms-grid-row-span:1;-ms-grid-column:1}.pfe-band__container[pfe-has-footer][pfe-aside-desktop=left]>.pfe-band__footer{-ms-grid-row:2;-ms-grid-column:1;-ms-grid-column-span:2}}@media (min-width:768px){.pfe-band__container[pfe-has-footer][pfe-aside-desktop=left][pfe-aside-height=full]{grid-template-areas:"aside body" "aside footer"}.pfe-band__container[pfe-has-footer][pfe-aside-desktop=left][pfe-aside-height=full]>.pfe-band__body{-ms-grid-row:1;-ms-grid-column:2}.pfe-band__container[pfe-has-footer][pfe-aside-desktop=left][pfe-aside-height=full]>.pfe-band__aside{-ms-grid-row:1;-ms-grid-row-span:2;-ms-grid-column:1}.pfe-band__container[pfe-has-footer][pfe-aside-desktop=left][pfe-aside-height=full]>.pfe-band__footer{-ms-grid-row:2;-ms-grid-column:2;-ms-grid-column-span:1}}.pfe-band__container[pfe-has-header][pfe-has-footer]{grid-template-areas:"header" "body" "footer"}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-has-aside]{grid-template-areas:"header" "body" "footer" "aside"}@media (min-width:768px){.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-has-aside]{grid-template-areas:"header header" "body aside" "footer footer"}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-has-aside]>.pfe-band__header{-ms-grid-row:1;-ms-grid-column:1;-ms-grid-column-span:2}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-has-aside]>.pfe-band__body{-ms-grid-row:2;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-has-aside]>.pfe-band__aside{-ms-grid-row:2;-ms-grid-row-span:1;-ms-grid-column:2}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-has-aside]>.pfe-band__footer{-ms-grid-row:3;-ms-grid-column:1;-ms-grid-column-span:2}}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-mobile=top]{grid-template-areas:"aside" "header" "body" "footer"}@media (min-width:768px){.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-height=full]{grid-template-areas:"header aside" "body aside" "footer aside"}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-height=full]>.pfe-band__header{-ms-grid-row:1;-ms-grid-column:1;-ms-grid-column-span:1}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-height=full]>.pfe-band__body{-ms-grid-row:2;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-height=full]>.pfe-band__aside{-ms-grid-row:1;-ms-grid-row-span:3;-ms-grid-column:2}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-height=full]>.pfe-band__footer{-ms-grid-row:3;-ms-grid-column:1;-ms-grid-column-span:1}}@media (min-width:768px){.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-desktop=left]{grid-template-areas:"header header" "aside body" "footer footer"}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-desktop=left]>.pfe-band__header{-ms-grid-row:1;-ms-grid-column:1;-ms-grid-column-span:2}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-desktop=left]>.pfe-band__body{-ms-grid-row:2;-ms-grid-column:2}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-desktop=left]>.pfe-band__aside{-ms-grid-row:2;-ms-grid-row-span:1;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-desktop=left]>.pfe-band__footer{-ms-grid-row:3;-ms-grid-column:1;-ms-grid-column-span:2}}@media (min-width:768px){.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-desktop=left][pfe-aside-height=full]{grid-template-areas:"aside header" "aside body" "aside footer"}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-desktop=left][pfe-aside-height=full]>.pfe-band__header{-ms-grid-row:1;-ms-grid-column:2;-ms-grid-column-span:1}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-desktop=left][pfe-aside-height=full]>.pfe-band__body{-ms-grid-row:2;-ms-grid-column:2}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-desktop=left][pfe-aside-height=full]>.pfe-band__aside{-ms-grid-row:1;-ms-grid-row-span:3;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-desktop=left][pfe-aside-height=full]>.pfe-band__footer{-ms-grid-row:3;-ms-grid-column:2;-ms-grid-column-span:1}}@supports (display:grid){.pfe-band__container{display:-ms-grid;display:grid;grid-row-gap:16px;grid-row-gap:var(--pfe-band--gutter--vertical,var(--pfe-theme--container-spacer,16px));grid-column-gap:calc(16px * 3);grid-column-gap:var(--pfe-band--gutter--horizontal,calc(var(--pfe-theme--container-spacer,16px) * 3));margin-bottom:0;-ms-grid-columns:1fr;grid-template-columns:1fr;-ms-grid-columns:var(--pfe-band--layout,1fr);grid-template-columns:var(--pfe-band--layout,1fr);-ms-grid-rows:-webkit-max-content;-ms-grid-rows:max-content;grid-template-rows:-webkit-max-content;grid-template-rows:max-content}.pfe-band__container>:nth-child(1){-ms-grid-row:1;-ms-grid-column:1}.pfe-band__container>:nth-child(1){-ms-grid-row:1;-ms-grid-column:1}}.pfe-band__header{margin-bottom:16px;margin-bottom:var(--pfe-band--gutter--vertical,var(--pfe-theme--container-spacer,16px))}@supports (display:grid){.pfe-band__header{-ms-grid-row:1;-ms-grid-column:1;display:-ms-grid;display:grid;grid-row-gap:16px;grid-row-gap:var(--pfe-band--gutter--vertical,var(--pfe-theme--container-spacer,16px));grid-column-gap:calc(16px * 3);grid-column-gap:var(--pfe-band--gutter--horizontal,calc(var(--pfe-theme--container-spacer,16px) * 3));margin-bottom:0;grid-area:header;-ms-grid-columns:1fr;grid-template-columns:1fr;-ms-grid-columns:var(--pfe-band__header--layout,1fr);grid-template-columns:var(--pfe-band__header--layout,1fr)}.pfe-band__container[pfe-has-header][pfe-has-aside]>.pfe-band__header{-ms-grid-row:1;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-aside-mobile=top]>.pfe-band__header{-ms-grid-row:2;-ms-grid-column:1;-ms-grid-column-span:1}.pfe-band__container[pfe-has-header][pfe-has-footer]>.pfe-band__header{-ms-grid-row:1;-ms-grid-column:1;-ms-grid-column-span:1}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-has-aside]>.pfe-band__header{-ms-grid-row:1;-ms-grid-column:1;-ms-grid-column-span:1}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-mobile=top]>.pfe-band__header{-ms-grid-row:2;-ms-grid-column:1;-ms-grid-column-span:1}}.pfe-band__body{margin-bottom:16px;margin-bottom:var(--pfe-band--gutter--vertical,var(--pfe-theme--container-spacer,16px))}@supports (display:grid){.pfe-band__body{-ms-grid-row:1;-ms-grid-column:1;display:-ms-grid;display:grid;grid-row-gap:16px;grid-row-gap:var(--pfe-band--gutter--vertical,var(--pfe-theme--container-spacer,16px));grid-column-gap:calc(16px * 3);grid-column-gap:var(--pfe-band--gutter--horizontal,calc(var(--pfe-theme--container-spacer,16px) * 3));margin-bottom:0;grid-area:body;-ms-grid-columns:1fr;grid-template-columns:1fr;-ms-grid-columns:var(--pfe-band__body--layout,1fr);grid-template-columns:var(--pfe-band__body--layout,1fr)}.pfe-band__container[pfe-has-aside]>.pfe-band__body{-ms-grid-row:1;-ms-grid-column:1}.pfe-band__container[pfe-has-aside][pfe-aside-mobile=top]>.pfe-band__body{-ms-grid-row:2;-ms-grid-column:1}.pfe-band__container[pfe-has-header]>.pfe-band__body{-ms-grid-row:2;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-has-aside]>.pfe-band__body{-ms-grid-row:2;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-aside-mobile=top]>.pfe-band__body{-ms-grid-row:3;-ms-grid-column:1}.pfe-band__container[pfe-has-footer]>.pfe-band__body{-ms-grid-row:1;-ms-grid-column:1}.pfe-band__container[pfe-has-footer][pfe-has-aside]>.pfe-band__body{-ms-grid-row:1;-ms-grid-column:1}.pfe-band__container[pfe-has-footer][pfe-aside-mobile=top]>.pfe-band__body{-ms-grid-row:2;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-has-footer]>.pfe-band__body{-ms-grid-row:2;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-has-aside]>.pfe-band__body{-ms-grid-row:2;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-mobile=top]>.pfe-band__body{-ms-grid-row:3;-ms-grid-column:1}}.pfe-band__aside{margin-bottom:16px;margin-bottom:var(--pfe-band--gutter--vertical,var(--pfe-theme--container-spacer,16px))}@supports (display:grid){.pfe-band__aside{-ms-grid-row:2;-ms-grid-column:1;display:-ms-grid;display:grid;grid-row-gap:16px;grid-row-gap:var(--pfe-band--gutter--vertical,var(--pfe-theme--container-spacer,16px));grid-column-gap:calc(16px * 3);grid-column-gap:var(--pfe-band--gutter--horizontal,calc(var(--pfe-theme--container-spacer,16px) * 3));margin-bottom:0;grid-area:aside;-ms-grid-columns:1fr;grid-template-columns:1fr;-ms-grid-columns:var(--pfe-band__aside--layout,1fr);grid-template-columns:var(--pfe-band__aside--layout,1fr)}.pfe-band__container[pfe-has-aside][pfe-aside-mobile=top]>.pfe-band__aside{-ms-grid-row:1;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-has-aside]>.pfe-band__aside{-ms-grid-row:3;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-aside-mobile=top]>.pfe-band__aside{-ms-grid-row:1;-ms-grid-column:1}.pfe-band__container[pfe-has-footer][pfe-has-aside]>.pfe-band__aside{-ms-grid-row:2;-ms-grid-row-span:1;-ms-grid-column:1}.pfe-band__container[pfe-has-footer][pfe-aside-mobile=top]>.pfe-band__aside{-ms-grid-row:1;-ms-grid-row-span:1;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-has-aside]>.pfe-band__aside{-ms-grid-row:4;-ms-grid-row-span:1;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-mobile=top]>.pfe-band__aside{-ms-grid-row:1;-ms-grid-row-span:1;-ms-grid-column:1}}.pfe-band__footer{margin-bottom:16px;margin-bottom:var(--pfe-band--gutter--vertical,var(--pfe-theme--container-spacer,16px))}@supports (display:grid){.pfe-band__footer{-ms-grid-row:2;-ms-grid-column:1;display:-ms-grid;display:grid;grid-row-gap:16px;grid-row-gap:var(--pfe-band--gutter--vertical,var(--pfe-theme--container-spacer,16px));grid-column-gap:calc(16px * 3);grid-column-gap:var(--pfe-band--gutter--horizontal,calc(var(--pfe-theme--container-spacer,16px) * 3));margin-bottom:0;grid-area:footer;-ms-grid-columns:1fr;grid-template-columns:1fr;-ms-grid-columns:var(--pfe-band__footer--layout,1fr);grid-template-columns:var(--pfe-band__footer--layout,1fr)}.pfe-band__container[pfe-has-footer][pfe-has-aside]>.pfe-band__footer{-ms-grid-row:3;-ms-grid-column:1}.pfe-band__container[pfe-has-footer][pfe-aside-mobile=top]>.pfe-band__footer{-ms-grid-row:3;-ms-grid-column:1;-ms-grid-column-span:1}.pfe-band__container[pfe-has-header][pfe-has-footer]>.pfe-band__footer{-ms-grid-row:3;-ms-grid-column:1;-ms-grid-column-span:1}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-has-aside]>.pfe-band__footer{-ms-grid-row:3;-ms-grid-column:1;-ms-grid-column-span:1}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-mobile=top]>.pfe-band__footer{-ms-grid-row:4;-ms-grid-column:1;-ms-grid-column-span:1}}.pfe-band__aside{-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}@media screen and (-ms-high-contrast:active),screen and (-ms-high-contrast:none){.pfe-band__body{width:60%;float:left}.pfe-band__aside{float:left;width:35%;margin:0 2.5%}.pfe-band__footer{clear:both}.pfe-band__container::after{content:" ";display:block;clear:both}}\n/*# sourceMappingURL=pfe-band.min.css.map */\n
this.has_slot(`pfe-band--${e}`)?`pfe-has-${e}`:"").join(" ")}>\n ${this.has_slot("pfe-band--aside")&&"top"===this.asidePosition.mobile?'':""}\n ${this.has_slot("pfe-band--header")?'
':""}\n
\n ${this.has_slot("pfe-band--aside")&&"top"!==this.asidePosition.mobile?'':""}\n ${this.has_slot("pfe-band--footer")?'
':""}\n
`}static get properties(){return{color:{title:"Background color",type:"string",enum:["lightest","base","darker","darkest","complement","accent"],default:"base",prefixed:!0,observer:"_colorChanged"},"img-src":{title:"Background image",type:"string",prefixed:!0,observer:"_imgSrcChanged"},"aside-desktop":{title:"Aside positioning (desktop)",type:"string",default:"right",enum:["right","left"],prefixed:!0,observer:"_basicAttributeChanged",options:{dependencies:[{type:"slot",id:"aside"}]}},"aside-mobile":{title:"Aside positioning (mobile)",type:"string",default:"bottom",enum:["top","bottom"],prefixed:!0,observer:"_basicAttributeChanged",options:{dependencies:[{type:"slot",id:"aside"}]}},"aside-height":{title:"Aside height",type:"string",default:"body",enum:["full","body"],prefixed:!0,observer:"_basicAttributeChanged",options:{dependencies:[{type:"slot",id:"aside"}]}}}}static get slots(){return{header:{title:"Header",type:"array",namedSlot:!0,maxItems:3,items:{title:"Body item",oneOf:[{$ref:"raw"}]}},body:{title:"Body",type:"array",namedSlot:!1,items:{oneOf:[{$ref:"pfe-card"},{$ref:"raw"}]}},footer:{title:"Footer",type:"array",namedSlot:!0,maxItems:3,items:{oneOf:[{$ref:"pfe-cta"},{$ref:"raw"}]}},aside:{title:"Aside",type:"array",namedSlot:!0,maxItems:5,items:{oneOf:[{$ref:"pfe-card"},{$ref:"raw"}]}}}}static get tag(){return"pfe-band"}get schemaUrl(){return"pfe-band.json"}get templateUrl(){return"pfe-band.html"}get styleUrl(){return"pfe-band.scss"}get imageSrc(){return this.getAttribute("pfe-img-src")}get backgroundColor(){return this.getAttribute("pfe-color")}get asidePosition(){return{desktop:this.getAttribute("pfe-aside-desktop"),mobile:this.getAttribute("pfe-aside-mobile"),height:this.getAttribute("pfe-aside-height")}}static get observedAttributes(){return["pfe-aside-desktop","pfe-aside-mobile","pfe-aside-height","pfe-color","pfe-img-src"]}static get cascadingAttributes(){return{"pfe-aside-desktop":".pfe-band__container","pfe-aside-mobile":".pfe-band__container","pfe-aside-height":".pfe-band__container"}}static get PfeType(){return e.PfeTypes.Container}constructor(){super(a,{type:a.PfeType})}connectedCallback(){super.connectedCallback(),this.imageSrc&&this._imgSrcChanged("pfe-img-src","",this.imageSrc)}attributeChangedCallback(e,a,r){if(super.attributeChangedCallback(e,a,r),this[e=e.replace("pfe-","")]&&this[e].observer){let d=this[this[e].observer].bind(this);"function"==typeof d&&d(e,a,r)}}_basicAttributeChanged(e,a,r){this[e].value=r}_colorChanged(e,a,r){this[e].value=r,this.context_update()}_imgSrcChanged(e,a,r){this.style.backgroundImage=r?`url('${r}')`:""}}e.create(a);export default a; +//# sourceMappingURL=pfe-band.min.js.map diff --git a/js/pfe-band/dist/pfe-band.min.js.map b/js/pfe-band/dist/pfe-band.min.js.map new file mode 100644 index 00000000..aedd4ee8 --- /dev/null +++ b/js/pfe-band/dist/pfe-band.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"pfe-band.min.js","sources":["../_temp/polyfills--pfe-band.js","../_temp/pfe-band.js"],"sourcesContent":["// @POLYFILL Element.matches\n// https://developer.mozilla.org/en-US/docs/Web/API/Element/matches\nif (!Element.prototype.matches) {\n Element.prototype.matches =\n Element.prototype.msMatchesSelector ||\n Element.prototype.webkitMatchesSelector;\n}\n\n// @POLYFILL Element.closest\n// https://developer.mozilla.org/en-US/docs/Web/API/Element/closest\nif (!Element.prototype.closest) {\n Element.prototype.closest = function(s) {\n var el = this;\n do {\n if (el.matches(s)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n return null;\n };\n}\n\n// @POLYFILL Array.includes\n// https://tc39.github.io/ecma262/#sec-array.prototype.includes\nif (!Array.prototype.includes) {\n Object.defineProperty(Array.prototype, \"includes\", {\n value: function(valueToFind, fromIndex) {\n if (this == null) {\n throw new TypeError('\"this\" is null or not defined');\n }\n\n // 1. Let O be ? ToObject(this value).\n var o = Object(this);\n\n // 2. Let len be ? ToLength(? Get(O, \"length\")).\n var len = o.length >>> 0;\n\n // 3. If len is 0, return false.\n if (len === 0) {\n return false;\n }\n\n // 4. Let n be ? ToInteger(fromIndex).\n // (If fromIndex is undefined, this step produces the value 0.)\n var n = fromIndex | 0;\n\n // 5. If n ≥ 0, then\n // a. Let k be n.\n // 6. Else n < 0,\n // a. Let k be len + n.\n // b. If k < 0, let k be 0.\n var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);\n\n function sameValueZero(x, y) {\n return (\n x === y ||\n (typeof x === \"number\" &&\n typeof y === \"number\" &&\n isNaN(x) &&\n isNaN(y))\n );\n }\n\n // 7. Repeat, while k < len\n while (k < len) {\n // a. Let elementK be the result of ? Get(O, ! ToString(k)).\n // b. If SameValueZero(valueToFind, elementK) is true, return true.\n if (sameValueZero(o[k], valueToFind)) {\n return true;\n }\n // c. Increase k by 1.\n k++;\n }\n\n // 8. Return false\n return false;\n }\n });\n}\n","/*!\n * PatternFly Elements: PfeBand 1.0.0-prerelease.55\n * @license\n * Copyright 2020 Red Hat, Inc.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n * \n*/\n\n// Import polyfills: matches, closest, includes\nimport \"./polyfills--pfe-band.js\";\n\nimport PFElement from \"../../pfelement/dist/pfelement.js\";\n\nclass PfeBand extends PFElement {\n static get version() {\n return \"1.0.0-prerelease.55\";\n }\n\n get html() {\n return `
this.has_slot(`pfe-band--${slot}`) ? `pfe-has-${slot}` : \"\").join(\" \")}>\n ${this.has_slot(\"pfe-band--aside\") && this.asidePosition.mobile === \"top\" ? `` : \"\"}\n ${this.has_slot(\"pfe-band--header\") ? `
` : \"\"}\n
\n ${this.has_slot(\"pfe-band--aside\") && this.asidePosition.mobile !== \"top\" ? `` : \"\"}\n ${this.has_slot(\"pfe-band--footer\") ? `
` : \"\"}\n
`;\n }\n\n static get properties() {\n return {\"color\":{\"title\":\"Background color\",\"type\":\"string\",\"enum\":[\"lightest\",\"base\",\"darker\",\"darkest\",\"complement\",\"accent\"],\"default\":\"base\",\"prefixed\":true,\"observer\":\"_colorChanged\"},\"img-src\":{\"title\":\"Background image\",\"type\":\"string\",\"prefixed\":true,\"observer\":\"_imgSrcChanged\"},\"aside-desktop\":{\"title\":\"Aside positioning (desktop)\",\"type\":\"string\",\"default\":\"right\",\"enum\":[\"right\",\"left\"],\"prefixed\":true,\"observer\":\"_basicAttributeChanged\",\"options\":{\"dependencies\":[{\"type\":\"slot\",\"id\":\"aside\"}]}},\"aside-mobile\":{\"title\":\"Aside positioning (mobile)\",\"type\":\"string\",\"default\":\"bottom\",\"enum\":[\"top\",\"bottom\"],\"prefixed\":true,\"observer\":\"_basicAttributeChanged\",\"options\":{\"dependencies\":[{\"type\":\"slot\",\"id\":\"aside\"}]}},\"aside-height\":{\"title\":\"Aside height\",\"type\":\"string\",\"default\":\"body\",\"enum\":[\"full\",\"body\"],\"prefixed\":true,\"observer\":\"_basicAttributeChanged\",\"options\":{\"dependencies\":[{\"type\":\"slot\",\"id\":\"aside\"}]}}};\n }\n\n static get slots() {\n return {\"header\":{\"title\":\"Header\",\"type\":\"array\",\"namedSlot\":true,\"maxItems\":3,\"items\":{\"title\":\"Body item\",\"oneOf\":[{\"$ref\":\"raw\"}]}},\"body\":{\"title\":\"Body\",\"type\":\"array\",\"namedSlot\":false,\"items\":{\"oneOf\":[{\"$ref\":\"pfe-card\"},{\"$ref\":\"raw\"}]}},\"footer\":{\"title\":\"Footer\",\"type\":\"array\",\"namedSlot\":true,\"maxItems\":3,\"items\":{\"oneOf\":[{\"$ref\":\"pfe-cta\"},{\"$ref\":\"raw\"}]}},\"aside\":{\"title\":\"Aside\",\"type\":\"array\",\"namedSlot\":true,\"maxItems\":5,\"items\":{\"oneOf\":[{\"$ref\":\"pfe-card\"},{\"$ref\":\"raw\"}]}}};\n }\n static get tag() {\n return \"pfe-band\";\n }\n\n get schemaUrl() {\n return \"pfe-band.json\";\n }\n\n get templateUrl() {\n return \"pfe-band.html\";\n }\n\n get styleUrl() {\n return \"pfe-band.scss\";\n }\n\n get imageSrc() {\n return this.getAttribute(\"pfe-img-src\");\n }\n\n get backgroundColor() {\n return this.getAttribute(\"pfe-color\");\n }\n\n get asidePosition() {\n return {\n desktop: this.getAttribute(\"pfe-aside-desktop\"),\n mobile: this.getAttribute(\"pfe-aside-mobile\"),\n height: this.getAttribute(\"pfe-aside-height\")\n };\n }\n\n static get observedAttributes() {\n return [\n \"pfe-aside-desktop\",\n \"pfe-aside-mobile\",\n \"pfe-aside-height\",\n \"pfe-color\",\n \"pfe-img-src\"\n ];\n }\n\n static get cascadingAttributes() {\n return {\n \"pfe-aside-desktop\": \".pfe-band__container\",\n \"pfe-aside-mobile\": \".pfe-band__container\",\n \"pfe-aside-height\": \".pfe-band__container\"\n };\n }\n\n // Declare the type of this component\n static get PfeType() {\n return PFElement.PfeTypes.Container;\n }\n\n constructor() {\n super(PfeBand, { type: PfeBand.PfeType });\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n // Initialize the background image attachment\n if (this.imageSrc) {\n this._imgSrcChanged(\"pfe-img-src\", \"\", this.imageSrc);\n }\n }\n\n attributeChangedCallback(attr, oldValue, newValue) {\n super.attributeChangedCallback(attr, oldValue, newValue);\n // Strip the prefix form the attribute\n attr = attr.replace(\"pfe-\", \"\");\n // If the observer is defined in the attribute properties\n if (this[attr] && this[attr].observer) {\n // Get the observer function\n let observer = this[this[attr].observer].bind(this);\n // If it's a function, allow it to run\n if (typeof observer === \"function\") observer(attr, oldValue, newValue);\n }\n }\n\n _basicAttributeChanged(attr, oldValue, newValue) {\n this[attr].value = newValue;\n }\n\n // Update the color attribute and contexts\n _colorChanged(attr, oldValue, newValue) {\n this[attr].value = newValue;\n // Trigger an update in nested components\n this.context_update();\n }\n\n // Update the background image\n _imgSrcChanged(attr, oldValue, newValue) {\n // Set the image as the background image\n this.style.backgroundImage = newValue ? `url('${newValue}')` : ``;\n }\n}\n\nPFElement.create(PfeBand);\n\nexport { PfeBand as default };\n"],"names":["Element","prototype","matches","msMatchesSelector","webkitMatchesSelector","closest","s","el","this","parentElement","parentNode","nodeType","Array","includes","Object","defineProperty","value","valueToFind","fromIndex","TypeError","o","len","length","x","y","n","k","Math","max","abs","isNaN","PfeBand","PFElement","version","html","map","slot","has_slot","join","asidePosition","mobile","properties","color","title","type","enum","default","prefixed","observer","img-src","aside-desktop","options","dependencies","id","aside-mobile","aside-height","slots","header","namedSlot","maxItems","items","oneOf","$ref","body","footer","aside","tag","schemaUrl","templateUrl","styleUrl","imageSrc","getAttribute","backgroundColor","desktop","height","observedAttributes","cascadingAttributes","pfe-aside-desktop","pfe-aside-mobile","pfe-aside-height","PfeType","PfeTypes","Container","[object Object]","super","connectedCallback","_imgSrcChanged","attr","oldValue","newValue","attributeChangedCallback","replace","bind","context_update","style","backgroundImage","create"],"mappings":"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"} \ No newline at end of file diff --git a/js/pfe-band/dist/pfe-band.umd.js b/js/pfe-band/dist/pfe-band.umd.js new file mode 100644 index 00000000..83440e8f --- /dev/null +++ b/js/pfe-band/dist/pfe-band.umd.js @@ -0,0 +1,329 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('../../pfelement/dist/pfelement.umd')) : + typeof define === 'function' && define.amd ? define(['../../pfelement/dist/pfelement.umd'], factory) : + (global.PfeBand = factory(global.PFElement)); +}(this, (function (PFElement) { 'use strict'; + + PFElement = PFElement && PFElement.hasOwnProperty('default') ? PFElement['default'] : PFElement; + + // @POLYFILL Element.matches + // https://developer.mozilla.org/en-US/docs/Web/API/Element/matches + if (!Element.prototype.matches) { + Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector; + } + + // @POLYFILL Element.closest + // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest + if (!Element.prototype.closest) { + Element.prototype.closest = function (s) { + var el = this; + do { + if (el.matches(s)) return el; + el = el.parentElement || el.parentNode; + } while (el !== null && el.nodeType === 1); + return null; + }; + } + + // @POLYFILL Array.includes + // https://tc39.github.io/ecma262/#sec-array.prototype.includes + if (!Array.prototype.includes) { + Object.defineProperty(Array.prototype, "includes", { + value: function value(valueToFind, fromIndex) { + if (this == null) { + throw new TypeError('"this" is null or not defined'); + } + + // 1. Let O be ? ToObject(this value). + var o = Object(this); + + // 2. Let len be ? ToLength(? Get(O, "length")). + var len = o.length >>> 0; + + // 3. If len is 0, return false. + if (len === 0) { + return false; + } + + // 4. Let n be ? ToInteger(fromIndex). + // (If fromIndex is undefined, this step produces the value 0.) + var n = fromIndex | 0; + + // 5. If n ≥ 0, then + // a. Let k be n. + // 6. Else n < 0, + // a. Let k be len + n. + // b. If k < 0, let k be 0. + var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); + + function sameValueZero(x, y) { + return x === y || typeof x === "number" && typeof y === "number" && isNaN(x) && isNaN(y); + } + + // 7. Repeat, while k < len + while (k < len) { + // a. Let elementK be the result of ? Get(O, ! ToString(k)). + // b. If SameValueZero(valueToFind, elementK) is true, return true. + if (sameValueZero(o[k], valueToFind)) { + return true; + } + // c. Increase k by 1. + k++; + } + + // 8. Return false + return false; + } + }); + } + + var classCallCheck = function (instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + }; + + var createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + + var get = function get(object, property, receiver) { + if (object === null) object = Function.prototype; + var desc = Object.getOwnPropertyDescriptor(object, property); + + if (desc === undefined) { + var parent = Object.getPrototypeOf(object); + + if (parent === null) { + return undefined; + } else { + return get(parent, property, receiver); + } + } else if ("value" in desc) { + return desc.value; + } else { + var getter = desc.get; + + if (getter === undefined) { + return undefined; + } + + return getter.call(receiver); + } + }; + + var inherits = function (subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; + }; + + var possibleConstructorReturn = function (self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; + }; + + /*! + * PatternFly Elements: PfeBand 1.0.0-prerelease.55 + * @license + * Copyright 2020 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + + var PfeBand = function (_PFElement) { + inherits(PfeBand, _PFElement); + createClass(PfeBand, [{ + key: "html", + get: function get$$1() { + var _this2 = this; + + return "
\n " + (this.has_slot("pfe-band--aside") && this.asidePosition.mobile === "top" ? "" : "") + "\n " + (this.has_slot("pfe-band--header") ? "
" : "") + "\n
\n " + (this.has_slot("pfe-band--aside") && this.asidePosition.mobile !== "top" ? "" : "") + "\n " + (this.has_slot("pfe-band--footer") ? "
" : "") + "\n
"; + } + }, { + key: "schemaUrl", + get: function get$$1() { + return "pfe-band.json"; + } + }, { + key: "templateUrl", + get: function get$$1() { + return "pfe-band.html"; + } + }, { + key: "styleUrl", + get: function get$$1() { + return "pfe-band.scss"; + } + }, { + key: "imageSrc", + get: function get$$1() { + return this.getAttribute("pfe-img-src"); + } + }, { + key: "backgroundColor", + get: function get$$1() { + return this.getAttribute("pfe-color"); + } + }, { + key: "asidePosition", + get: function get$$1() { + return { + desktop: this.getAttribute("pfe-aside-desktop"), + mobile: this.getAttribute("pfe-aside-mobile"), + height: this.getAttribute("pfe-aside-height") + }; + } + }], [{ + key: "version", + get: function get$$1() { + return "1.0.0-prerelease.55"; + } + }, { + key: "properties", + get: function get$$1() { + return { "color": { "title": "Background color", "type": "string", "enum": ["lightest", "base", "darker", "darkest", "complement", "accent"], "default": "base", "prefixed": true, "observer": "_colorChanged" }, "img-src": { "title": "Background image", "type": "string", "prefixed": true, "observer": "_imgSrcChanged" }, "aside-desktop": { "title": "Aside positioning (desktop)", "type": "string", "default": "right", "enum": ["right", "left"], "prefixed": true, "observer": "_basicAttributeChanged", "options": { "dependencies": [{ "type": "slot", "id": "aside" }] } }, "aside-mobile": { "title": "Aside positioning (mobile)", "type": "string", "default": "bottom", "enum": ["top", "bottom"], "prefixed": true, "observer": "_basicAttributeChanged", "options": { "dependencies": [{ "type": "slot", "id": "aside" }] } }, "aside-height": { "title": "Aside height", "type": "string", "default": "body", "enum": ["full", "body"], "prefixed": true, "observer": "_basicAttributeChanged", "options": { "dependencies": [{ "type": "slot", "id": "aside" }] } } }; + } + }, { + key: "slots", + get: function get$$1() { + return { "header": { "title": "Header", "type": "array", "namedSlot": true, "maxItems": 3, "items": { "title": "Body item", "oneOf": [{ "$ref": "raw" }] } }, "body": { "title": "Body", "type": "array", "namedSlot": false, "items": { "oneOf": [{ "$ref": "pfe-card" }, { "$ref": "raw" }] } }, "footer": { "title": "Footer", "type": "array", "namedSlot": true, "maxItems": 3, "items": { "oneOf": [{ "$ref": "pfe-cta" }, { "$ref": "raw" }] } }, "aside": { "title": "Aside", "type": "array", "namedSlot": true, "maxItems": 5, "items": { "oneOf": [{ "$ref": "pfe-card" }, { "$ref": "raw" }] } } }; + } + }, { + key: "tag", + get: function get$$1() { + return "pfe-band"; + } + }, { + key: "observedAttributes", + get: function get$$1() { + return ["pfe-aside-desktop", "pfe-aside-mobile", "pfe-aside-height", "pfe-color", "pfe-img-src"]; + } + }, { + key: "cascadingAttributes", + get: function get$$1() { + return { + "pfe-aside-desktop": ".pfe-band__container", + "pfe-aside-mobile": ".pfe-band__container", + "pfe-aside-height": ".pfe-band__container" + }; + } + + // Declare the type of this component + + }, { + key: "PfeType", + get: function get$$1() { + return PFElement.PfeTypes.Container; + } + }]); + + function PfeBand() { + classCallCheck(this, PfeBand); + return possibleConstructorReturn(this, (PfeBand.__proto__ || Object.getPrototypeOf(PfeBand)).call(this, PfeBand, { type: PfeBand.PfeType })); + } + + createClass(PfeBand, [{ + key: "connectedCallback", + value: function connectedCallback() { + get(PfeBand.prototype.__proto__ || Object.getPrototypeOf(PfeBand.prototype), "connectedCallback", this).call(this); + + // Initialize the background image attachment + if (this.imageSrc) { + this._imgSrcChanged("pfe-img-src", "", this.imageSrc); + } + } + }, { + key: "attributeChangedCallback", + value: function attributeChangedCallback(attr, oldValue, newValue) { + get(PfeBand.prototype.__proto__ || Object.getPrototypeOf(PfeBand.prototype), "attributeChangedCallback", this).call(this, attr, oldValue, newValue); + // Strip the prefix form the attribute + attr = attr.replace("pfe-", ""); + // If the observer is defined in the attribute properties + if (this[attr] && this[attr].observer) { + // Get the observer function + var observer = this[this[attr].observer].bind(this); + // If it's a function, allow it to run + if (typeof observer === "function") observer(attr, oldValue, newValue); + } + } + }, { + key: "_basicAttributeChanged", + value: function _basicAttributeChanged(attr, oldValue, newValue) { + this[attr].value = newValue; + } + + // Update the color attribute and contexts + + }, { + key: "_colorChanged", + value: function _colorChanged(attr, oldValue, newValue) { + this[attr].value = newValue; + // Trigger an update in nested components + this.context_update(); + } + + // Update the background image + + }, { + key: "_imgSrcChanged", + value: function _imgSrcChanged(attr, oldValue, newValue) { + // Set the image as the background image + this.style.backgroundImage = newValue ? "url('" + newValue + "')" : ""; + } + }]); + return PfeBand; + }(PFElement); + + PFElement.create(PfeBand); + + return PfeBand; + +}))); +//# sourceMappingURL=pfe-band.umd.js.map diff --git a/js/pfe-band/dist/pfe-band.umd.js.map b/js/pfe-band/dist/pfe-band.umd.js.map new file mode 100644 index 00000000..99b90dab --- /dev/null +++ b/js/pfe-band/dist/pfe-band.umd.js.map @@ -0,0 +1 @@ +{"version":3,"file":"pfe-band.umd.js","sources":["../_temp/polyfills--pfe-band.js","../_temp/pfe-band.umd.js"],"sourcesContent":["// @POLYFILL Element.matches\n// https://developer.mozilla.org/en-US/docs/Web/API/Element/matches\nif (!Element.prototype.matches) {\n Element.prototype.matches =\n Element.prototype.msMatchesSelector ||\n Element.prototype.webkitMatchesSelector;\n}\n\n// @POLYFILL Element.closest\n// https://developer.mozilla.org/en-US/docs/Web/API/Element/closest\nif (!Element.prototype.closest) {\n Element.prototype.closest = function(s) {\n var el = this;\n do {\n if (el.matches(s)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n return null;\n };\n}\n\n// @POLYFILL Array.includes\n// https://tc39.github.io/ecma262/#sec-array.prototype.includes\nif (!Array.prototype.includes) {\n Object.defineProperty(Array.prototype, \"includes\", {\n value: function(valueToFind, fromIndex) {\n if (this == null) {\n throw new TypeError('\"this\" is null or not defined');\n }\n\n // 1. Let O be ? ToObject(this value).\n var o = Object(this);\n\n // 2. Let len be ? ToLength(? Get(O, \"length\")).\n var len = o.length >>> 0;\n\n // 3. If len is 0, return false.\n if (len === 0) {\n return false;\n }\n\n // 4. Let n be ? ToInteger(fromIndex).\n // (If fromIndex is undefined, this step produces the value 0.)\n var n = fromIndex | 0;\n\n // 5. If n ≥ 0, then\n // a. Let k be n.\n // 6. Else n < 0,\n // a. Let k be len + n.\n // b. If k < 0, let k be 0.\n var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);\n\n function sameValueZero(x, y) {\n return (\n x === y ||\n (typeof x === \"number\" &&\n typeof y === \"number\" &&\n isNaN(x) &&\n isNaN(y))\n );\n }\n\n // 7. Repeat, while k < len\n while (k < len) {\n // a. Let elementK be the result of ? Get(O, ! ToString(k)).\n // b. If SameValueZero(valueToFind, elementK) is true, return true.\n if (sameValueZero(o[k], valueToFind)) {\n return true;\n }\n // c. Increase k by 1.\n k++;\n }\n\n // 8. Return false\n return false;\n }\n });\n}\n","/*!\n * PatternFly Elements: PfeBand 1.0.0-prerelease.55\n * @license\n * Copyright 2020 Red Hat, Inc.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n * \n*/\n\n// Import polyfills: matches, closest, includes\nimport \"./polyfills--pfe-band.js\";\n\nimport PFElement from \"../../pfelement/dist/pfelement.umd\";\n\nclass PfeBand extends PFElement {\n static get version() {\n return \"1.0.0-prerelease.55\";\n }\n\n get html() {\n return `
this.has_slot(`pfe-band--${slot}`) ? `pfe-has-${slot}` : \"\").join(\" \")}>\n ${this.has_slot(\"pfe-band--aside\") && this.asidePosition.mobile === \"top\" ? `` : \"\"}\n ${this.has_slot(\"pfe-band--header\") ? `
` : \"\"}\n
\n ${this.has_slot(\"pfe-band--aside\") && this.asidePosition.mobile !== \"top\" ? `` : \"\"}\n ${this.has_slot(\"pfe-band--footer\") ? `
` : \"\"}\n
`;\n }\n\n static get properties() {\n return {\"color\":{\"title\":\"Background color\",\"type\":\"string\",\"enum\":[\"lightest\",\"base\",\"darker\",\"darkest\",\"complement\",\"accent\"],\"default\":\"base\",\"prefixed\":true,\"observer\":\"_colorChanged\"},\"img-src\":{\"title\":\"Background image\",\"type\":\"string\",\"prefixed\":true,\"observer\":\"_imgSrcChanged\"},\"aside-desktop\":{\"title\":\"Aside positioning (desktop)\",\"type\":\"string\",\"default\":\"right\",\"enum\":[\"right\",\"left\"],\"prefixed\":true,\"observer\":\"_basicAttributeChanged\",\"options\":{\"dependencies\":[{\"type\":\"slot\",\"id\":\"aside\"}]}},\"aside-mobile\":{\"title\":\"Aside positioning (mobile)\",\"type\":\"string\",\"default\":\"bottom\",\"enum\":[\"top\",\"bottom\"],\"prefixed\":true,\"observer\":\"_basicAttributeChanged\",\"options\":{\"dependencies\":[{\"type\":\"slot\",\"id\":\"aside\"}]}},\"aside-height\":{\"title\":\"Aside height\",\"type\":\"string\",\"default\":\"body\",\"enum\":[\"full\",\"body\"],\"prefixed\":true,\"observer\":\"_basicAttributeChanged\",\"options\":{\"dependencies\":[{\"type\":\"slot\",\"id\":\"aside\"}]}}};\n }\n\n static get slots() {\n return {\"header\":{\"title\":\"Header\",\"type\":\"array\",\"namedSlot\":true,\"maxItems\":3,\"items\":{\"title\":\"Body item\",\"oneOf\":[{\"$ref\":\"raw\"}]}},\"body\":{\"title\":\"Body\",\"type\":\"array\",\"namedSlot\":false,\"items\":{\"oneOf\":[{\"$ref\":\"pfe-card\"},{\"$ref\":\"raw\"}]}},\"footer\":{\"title\":\"Footer\",\"type\":\"array\",\"namedSlot\":true,\"maxItems\":3,\"items\":{\"oneOf\":[{\"$ref\":\"pfe-cta\"},{\"$ref\":\"raw\"}]}},\"aside\":{\"title\":\"Aside\",\"type\":\"array\",\"namedSlot\":true,\"maxItems\":5,\"items\":{\"oneOf\":[{\"$ref\":\"pfe-card\"},{\"$ref\":\"raw\"}]}}};\n }\n static get tag() {\n return \"pfe-band\";\n }\n\n get schemaUrl() {\n return \"pfe-band.json\";\n }\n\n get templateUrl() {\n return \"pfe-band.html\";\n }\n\n get styleUrl() {\n return \"pfe-band.scss\";\n }\n\n get imageSrc() {\n return this.getAttribute(\"pfe-img-src\");\n }\n\n get backgroundColor() {\n return this.getAttribute(\"pfe-color\");\n }\n\n get asidePosition() {\n return {\n desktop: this.getAttribute(\"pfe-aside-desktop\"),\n mobile: this.getAttribute(\"pfe-aside-mobile\"),\n height: this.getAttribute(\"pfe-aside-height\")\n };\n }\n\n static get observedAttributes() {\n return [\n \"pfe-aside-desktop\",\n \"pfe-aside-mobile\",\n \"pfe-aside-height\",\n \"pfe-color\",\n \"pfe-img-src\"\n ];\n }\n\n static get cascadingAttributes() {\n return {\n \"pfe-aside-desktop\": \".pfe-band__container\",\n \"pfe-aside-mobile\": \".pfe-band__container\",\n \"pfe-aside-height\": \".pfe-band__container\"\n };\n }\n\n // Declare the type of this component\n static get PfeType() {\n return PFElement.PfeTypes.Container;\n }\n\n constructor() {\n super(PfeBand, { type: PfeBand.PfeType });\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n // Initialize the background image attachment\n if (this.imageSrc) {\n this._imgSrcChanged(\"pfe-img-src\", \"\", this.imageSrc);\n }\n }\n\n attributeChangedCallback(attr, oldValue, newValue) {\n super.attributeChangedCallback(attr, oldValue, newValue);\n // Strip the prefix form the attribute\n attr = attr.replace(\"pfe-\", \"\");\n // If the observer is defined in the attribute properties\n if (this[attr] && this[attr].observer) {\n // Get the observer function\n let observer = this[this[attr].observer].bind(this);\n // If it's a function, allow it to run\n if (typeof observer === \"function\") observer(attr, oldValue, newValue);\n }\n }\n\n _basicAttributeChanged(attr, oldValue, newValue) {\n this[attr].value = newValue;\n }\n\n // Update the color attribute and contexts\n _colorChanged(attr, oldValue, newValue) {\n this[attr].value = newValue;\n // Trigger an update in nested components\n this.context_update();\n }\n\n // Update the background image\n _imgSrcChanged(attr, oldValue, newValue) {\n // Set the image as the background image\n this.style.backgroundImage = newValue ? `url('${newValue}')` : ``;\n }\n}\n\nPFElement.create(PfeBand);\n\nexport { PfeBand as default };\n"],"names":["Element","prototype","matches","msMatchesSelector","webkitMatchesSelector","closest","s","el","parentElement","parentNode","nodeType","Array","includes","Object","defineProperty","value","valueToFind","fromIndex","TypeError","o","len","length","n","k","Math","max","abs","sameValueZero","x","y","isNaN","PfeBand","map","has_slot","slot","join","asidePosition","mobile","getAttribute","desktop","height","PFElement","PfeTypes","Container","type","PfeType","imageSrc","_imgSrcChanged","attr","oldValue","newValue","replace","observer","bind","context_update","style","backgroundImage","create"],"mappings":"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"} \ No newline at end of file diff --git a/js/pfe-band/dist/pfe-band.umd.min.js b/js/pfe-band/dist/pfe-band.umd.min.js new file mode 100644 index 00000000..6d0ccee3 --- /dev/null +++ b/js/pfe-band/dist/pfe-band.umd.min.js @@ -0,0 +1,2 @@ +!function(e,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a(require("../../pfelement/dist/pfelement.umd")):"function"==typeof define&&define.amd?define(["../../pfelement/dist/pfelement.umd"],a):e.PfeBand=a(e.PFElement)}(this,function(e){"use strict";e=e&&e.hasOwnProperty("default")?e.default:e,Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector),Element.prototype.closest||(Element.prototype.closest=function(e){var a=this;do{if(a.matches(e))return a;a=a.parentElement||a.parentNode}while(null!==a&&1===a.nodeType);return null}),Array.prototype.includes||Object.defineProperty(Array.prototype,"includes",{value:function(e,a){if(null==this)throw new TypeError('"this" is null or not defined');var r=Object(this),o=r.length>>>0;if(0==o)return!1;var d,t,n=0|a,i=Math.max(0<=n?n:o-Math.abs(n),0);for(;i@media screen and (-ms-high-contrast:active),screen and (-ms-high-contrast:none){:host([pfe-color=accent]),:host([pfe-color=base]),:host([pfe-color=complement]),:host([pfe-color=darker]),:host([pfe-color=darkest]),:host([pfe-color=lightest]){background-color:#fff!important;color:#151515!important}}@media screen and (-ms-high-contrast:active),screen and (-ms-high-contrast:none){:host{color:#151515!important}}:host{--theme:var(--pfe-band--theme, light);display:block;position:relative;padding:calc(calc(16px * 4)/ 2) calc(16px * 1);padding:calc(var(--pfe-band--Padding--vertical,calc(var(--pfe-theme--container-spacer,16px) * 4))/ 2) var(--pfe-band--Padding--horizontal,calc(var(--pfe-theme--container-spacer,16px) * 1));border:1px solid transparent;border:var(--pfe-band--Border,var(--pfe-theme--surface--border-width,1px) var(--pfe-theme--surface--border-style,solid) transparent);background-color:#f0f0f0;background-color:var(--pfe-band--BackgroundColor,var(--pfe-theme--color--surface--base,#f0f0f0));background-position:center center;background-position:var(--pfe-band--BackgroundPosition,center center);color:#3c3f42;color:var(--pfe-broadcasted--text,#3c3f42)}@media screen and (min-width:768px){:host{--pfe-band--Width:calc( 768px - calc(var(--pfe-band--Padding--horizontal, calc( var(--pfe-theme--container-spacer, 16px) * 1)) * 4))}}@media screen and (min-width:992px){:host{--pfe-band--Width:calc( 992px - calc(var(--pfe-band--Padding--horizontal, calc( var(--pfe-theme--container-spacer, 16px) * 1)) * 4))}}@media screen and (min-width:1200px){:host{--pfe-band--Width:calc( 1200px - calc(var(--pfe-band--Padding--horizontal, calc( var(--pfe-theme--container-spacer, 16px) * 1)) * 4))}}@media (min-width:576px){:host{padding:calc(16px * 4) calc(16px * 1);padding:var(--pfe-band--Padding,var(--pfe-band--Padding--vertical,calc(var(--pfe-theme--container-spacer,16px) * 4)) var(--pfe-band--Padding--horizontal,calc(var(--pfe-theme--container-spacer,16px) * 1)))}}@media print{:host{background-color:#fff!important;background-image:none!important;-webkit-box-shadow:none!important;box-shadow:none!important}}@media print{:host{border-radius:3px;border:1px solid #d2d2d2;padding:calc(16px * 4)/2 calc(16px * 1);padding:calc(var(--pfe-theme--container-spacer,16px) * 4)/2 calc(var(--pfe-theme--container-spacer,16px) * 1)}}@media screen and (-ms-high-contrast:active),screen and (-ms-high-contrast:none){:host{background-color:#fff!important;color:#151515!important;background-image:none!important;padding:16px}}:host *,:host ::after,:host ::before{-webkit-box-sizing:border-box;box-sizing:border-box}:host([on=dark]){--pfe-broadcasted--text:var(--pfe-theme--color--text--on-dark, #fff);--pfe-broadcasted--link:var(--pfe-theme--color--link--on-dark, #73bcf7);--pfe-broadcasted--link--hover:var(--pfe-theme--color--link--hover--on-dark, #bee1f4);--pfe-broadcasted--link--focus:var(--pfe-theme--color--link--focus--on-dark, #bee1f4);--pfe-broadcasted--link--visited:var(--pfe-theme--color--link--visited--on-dark, #bee1f4);--pfe-broadcasted--link-decoration:var(--pfe-theme--link-decoration--on-dark, none);--pfe-broadcasted--link-decoration--hover:var(--pfe-theme--link-decoration--hover--on-dark, underline);--pfe-broadcasted--link-decoration--focus:var(--pfe-theme--link-decoration--focus--on-dark, underline);--pfe-broadcasted--link-decoration--visited:var(--pfe-theme--link-decoration--visited--on-dark, none)}:host([on=saturated]){--pfe-broadcasted--text:var(--pfe-theme--color--text--on-saturated, #fff);--pfe-broadcasted--link:var(--pfe-theme--color--link--on-saturated, #fff);--pfe-broadcasted--link--hover:var(--pfe-theme--color--link--hover--on-saturated, #fafafa);--pfe-broadcasted--link--focus:var(--pfe-theme--color--link--focus--on-saturated, #fafafa);--pfe-broadcasted--link--visited:var(--pfe-theme--color--link--visited--on-saturated, #8476d1);--pfe-broadcasted--link-decoration:var(--pfe-theme--link-decoration--on-saturated, underline);--pfe-broadcasted--link-decoration--hover:var(--pfe-theme--link-decoration--hover--on-saturated, underline);--pfe-broadcasted--link-decoration--focus:var(--pfe-theme--link-decoration--focus--on-saturated, underline);--pfe-broadcasted--link-decoration--visited:var(--pfe-theme--link-decoration--visited--on-saturated, underline)}:host([on=light]){--pfe-broadcasted--text:var(--pfe-theme--color--text, #151515);--pfe-broadcasted--link:var(--pfe-theme--color--link, #06c);--pfe-broadcasted--link--hover:var(--pfe-theme--color--link--hover, #004080);--pfe-broadcasted--link--focus:var(--pfe-theme--color--link--focus, #004080);--pfe-broadcasted--link--visited:var(--pfe-theme--color--link--visited, #6753ac);--pfe-broadcasted--link-decoration:var(--pfe-theme--link-decoration, none);--pfe-broadcasted--link-decoration--hover:var(--pfe-theme--link-decoration--hover, underline);--pfe-broadcasted--link-decoration--focus:var(--pfe-theme--link-decoration--focus, underline);--pfe-broadcasted--link-decoration--visited:var(--pfe-theme--link-decoration--visited, none)}:host([pfe-color=darker]){--pfe-band--BackgroundColor:var(--pfe-theme--color--surface--darker, #3c3f42);--pfe-band--theme:var(--pfe-theme--color--surface--darker--theme, dark)}:host([pfe-color=darkest]){--pfe-band--BackgroundColor:var(--pfe-theme--color--surface--darkest, #151515);--pfe-band--theme:var(--pfe-theme--color--surface--darkest--theme, dark)}:host([pfe-color=base]){--pfe-band--BackgroundColor:var(--pfe-theme--color--surface--base, #f0f0f0);--pfe-band--theme:var(--pfe-theme--color--surface--base--theme, light)}:host([pfe-color=lightest]){--pfe-band--BackgroundColor:var(--pfe-theme--color--surface--lightest, #fff);--pfe-band--theme:var(--pfe-theme--color--surface--lightest--theme, light)}:host([pfe-color=accent]){--pfe-band--BackgroundColor:var(--pfe-theme--color--surface--accent, #004080);--pfe-band--theme:var(--pfe-theme--color--surface--accent--theme, saturated)}:host([pfe-color=complement]){--pfe-band--BackgroundColor:var(--pfe-theme--color--surface--complement, #002952);--pfe-band--theme:var(--pfe-theme--color--surface--complement--theme, saturated)}:host([pfe-size=small]){--pfe-band--Padding:calc(var(--pfe-band--Padding--vertical, calc( var(--pfe-theme--container-spacer, 16px) * 4)) / 4) var(--pfe-band--Padding--horizontal, calc( var(--pfe-theme--container-spacer, 16px) * 1))}.pfe-band__container{--pfe-band__region--width:calc(1fr - var(--pfe-band--Width__aside--sm, 240px) - var(--pfe-band--gutter--horizontal, calc(var(--pfe-theme--container-spacer, 16px) * 3)));grid-template-areas:"body";position:relative;margin:0 auto;width:100%;max-width:auto;max-width:var(--pfe-band--Width,auto)}.pfe-band__container[pfe-has-aside]{grid-template-areas:"body" "aside"}@media (min-width:768px){.pfe-band__container[pfe-has-aside]{--pfe-band--layout:1fr var(--pfe-band--Width__aside--sm, 240px)}}@media (min-width:992px){.pfe-band__container[pfe-has-aside]{--pfe-band--layout:1fr var(--pfe-band--Width__aside--lg, 300px)}}.pfe-band__container[pfe-has-aside][pfe-aside-mobile=top]{grid-template-areas:"aside" "body"}@media (min-width:768px){.pfe-band__container[pfe-has-aside][pfe-aside-desktop=left]{grid-template-areas:"aside body";--pfe-band--layout:var(--pfe-band--Width__aside--sm, 240px) 1fr}.pfe-band__container[pfe-has-aside][pfe-aside-desktop=left]>.pfe-band__body{-ms-grid-row:1;-ms-grid-column:2}.pfe-band__container[pfe-has-aside][pfe-aside-desktop=left]>.pfe-band__aside{-ms-grid-row:1;-ms-grid-column:1}}@media (min-width:992px){.pfe-band__container[pfe-has-aside][pfe-aside-desktop=left]{--pfe-band--layout:var(--pfe-band--Width__aside--lg, 300px) 1fr}}.pfe-band__container[pfe-has-header]{grid-template-areas:"header" "body"}.pfe-band__container[pfe-has-header][pfe-has-aside]{grid-template-areas:"header" "body" "aside"}@media (min-width:768px){.pfe-band__container[pfe-has-header][pfe-has-aside]{grid-template-areas:"header header" "body aside"}.pfe-band__container[pfe-has-header][pfe-has-aside]>.pfe-band__header{-ms-grid-row:1;-ms-grid-column:1;-ms-grid-column-span:2}.pfe-band__container[pfe-has-header][pfe-has-aside]>.pfe-band__body{-ms-grid-row:2;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-has-aside]>.pfe-band__aside{-ms-grid-row:2;-ms-grid-column:2}}.pfe-band__container[pfe-has-header][pfe-aside-mobile=top]{grid-template-areas:"aside" "header" "body"}@media (min-width:768px){.pfe-band__container[pfe-has-header][pfe-aside-height=full]{grid-template-areas:"header aside" "body aside"}.pfe-band__container[pfe-has-header][pfe-aside-height=full]>.pfe-band__header{-ms-grid-row:1;-ms-grid-column:1;-ms-grid-column-span:1}.pfe-band__container[pfe-has-header][pfe-aside-height=full]>.pfe-band__body{-ms-grid-row:2;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-aside-height=full]>.pfe-band__aside{-ms-grid-row:1;-ms-grid-row-span:2;-ms-grid-column:2}}@media (min-width:768px){.pfe-band__container[pfe-has-header][pfe-aside-desktop=left]{grid-template-areas:"header header" "aside body"}.pfe-band__container[pfe-has-header][pfe-aside-desktop=left]>.pfe-band__header{-ms-grid-row:1;-ms-grid-column:1;-ms-grid-column-span:2}.pfe-band__container[pfe-has-header][pfe-aside-desktop=left]>.pfe-band__body{-ms-grid-row:2;-ms-grid-column:2}.pfe-band__container[pfe-has-header][pfe-aside-desktop=left]>.pfe-band__aside{-ms-grid-row:2;-ms-grid-row-span:1;-ms-grid-column:1}}@media (min-width:768px){.pfe-band__container[pfe-has-header][pfe-aside-desktop=left][pfe-aside-height=full]{grid-template-areas:"aside header" "aside body"}.pfe-band__container[pfe-has-header][pfe-aside-desktop=left][pfe-aside-height=full]>.pfe-band__header{-ms-grid-row:1;-ms-grid-column:2;-ms-grid-column-span:1}.pfe-band__container[pfe-has-header][pfe-aside-desktop=left][pfe-aside-height=full]>.pfe-band__body{-ms-grid-row:2;-ms-grid-column:2}.pfe-band__container[pfe-has-header][pfe-aside-desktop=left][pfe-aside-height=full]>.pfe-band__aside{-ms-grid-row:1;-ms-grid-row-span:2;-ms-grid-column:1}}.pfe-band__container[pfe-has-footer]{grid-template-areas:"body" "footer"}.pfe-band__container[pfe-has-footer][pfe-has-aside]{grid-template-areas:"body" "aside" "footer"}@media (min-width:768px){.pfe-band__container[pfe-has-footer][pfe-has-aside]{grid-template-areas:"body aside" "footer footer"}.pfe-band__container[pfe-has-footer][pfe-has-aside]>.pfe-band__body{-ms-grid-row:1;-ms-grid-column:1}.pfe-band__container[pfe-has-footer][pfe-has-aside]>.pfe-band__aside{-ms-grid-row:1;-ms-grid-row-span:1;-ms-grid-column:2}.pfe-band__container[pfe-has-footer][pfe-has-aside]>.pfe-band__footer{-ms-grid-row:2;-ms-grid-column:1;-ms-grid-column-span:2}}.pfe-band__container[pfe-has-footer][pfe-aside-mobile=top]{grid-template-areas:"aside" "body" "footer"}@media (min-width:768px){.pfe-band__container[pfe-has-footer][pfe-aside-height=full]{grid-template-areas:"body aside" "footer aside"}.pfe-band__container[pfe-has-footer][pfe-aside-height=full]>.pfe-band__body{-ms-grid-row:1;-ms-grid-column:1}.pfe-band__container[pfe-has-footer][pfe-aside-height=full]>.pfe-band__aside{-ms-grid-row:1;-ms-grid-row-span:2;-ms-grid-column:2}.pfe-band__container[pfe-has-footer][pfe-aside-height=full]>.pfe-band__footer{-ms-grid-row:2;-ms-grid-column:1;-ms-grid-column-span:1}}@media (min-width:768px){.pfe-band__container[pfe-has-footer][pfe-aside-desktop=left]{grid-template-areas:"aside body" "footer footer"}.pfe-band__container[pfe-has-footer][pfe-aside-desktop=left]>.pfe-band__body{-ms-grid-row:1;-ms-grid-column:2}.pfe-band__container[pfe-has-footer][pfe-aside-desktop=left]>.pfe-band__aside{-ms-grid-row:1;-ms-grid-row-span:1;-ms-grid-column:1}.pfe-band__container[pfe-has-footer][pfe-aside-desktop=left]>.pfe-band__footer{-ms-grid-row:2;-ms-grid-column:1;-ms-grid-column-span:2}}@media (min-width:768px){.pfe-band__container[pfe-has-footer][pfe-aside-desktop=left][pfe-aside-height=full]{grid-template-areas:"aside body" "aside footer"}.pfe-band__container[pfe-has-footer][pfe-aside-desktop=left][pfe-aside-height=full]>.pfe-band__body{-ms-grid-row:1;-ms-grid-column:2}.pfe-band__container[pfe-has-footer][pfe-aside-desktop=left][pfe-aside-height=full]>.pfe-band__aside{-ms-grid-row:1;-ms-grid-row-span:2;-ms-grid-column:1}.pfe-band__container[pfe-has-footer][pfe-aside-desktop=left][pfe-aside-height=full]>.pfe-band__footer{-ms-grid-row:2;-ms-grid-column:2;-ms-grid-column-span:1}}.pfe-band__container[pfe-has-header][pfe-has-footer]{grid-template-areas:"header" "body" "footer"}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-has-aside]{grid-template-areas:"header" "body" "footer" "aside"}@media (min-width:768px){.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-has-aside]{grid-template-areas:"header header" "body aside" "footer footer"}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-has-aside]>.pfe-band__header{-ms-grid-row:1;-ms-grid-column:1;-ms-grid-column-span:2}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-has-aside]>.pfe-band__body{-ms-grid-row:2;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-has-aside]>.pfe-band__aside{-ms-grid-row:2;-ms-grid-row-span:1;-ms-grid-column:2}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-has-aside]>.pfe-band__footer{-ms-grid-row:3;-ms-grid-column:1;-ms-grid-column-span:2}}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-mobile=top]{grid-template-areas:"aside" "header" "body" "footer"}@media (min-width:768px){.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-height=full]{grid-template-areas:"header aside" "body aside" "footer aside"}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-height=full]>.pfe-band__header{-ms-grid-row:1;-ms-grid-column:1;-ms-grid-column-span:1}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-height=full]>.pfe-band__body{-ms-grid-row:2;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-height=full]>.pfe-band__aside{-ms-grid-row:1;-ms-grid-row-span:3;-ms-grid-column:2}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-height=full]>.pfe-band__footer{-ms-grid-row:3;-ms-grid-column:1;-ms-grid-column-span:1}}@media (min-width:768px){.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-desktop=left]{grid-template-areas:"header header" "aside body" "footer footer"}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-desktop=left]>.pfe-band__header{-ms-grid-row:1;-ms-grid-column:1;-ms-grid-column-span:2}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-desktop=left]>.pfe-band__body{-ms-grid-row:2;-ms-grid-column:2}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-desktop=left]>.pfe-band__aside{-ms-grid-row:2;-ms-grid-row-span:1;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-desktop=left]>.pfe-band__footer{-ms-grid-row:3;-ms-grid-column:1;-ms-grid-column-span:2}}@media (min-width:768px){.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-desktop=left][pfe-aside-height=full]{grid-template-areas:"aside header" "aside body" "aside footer"}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-desktop=left][pfe-aside-height=full]>.pfe-band__header{-ms-grid-row:1;-ms-grid-column:2;-ms-grid-column-span:1}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-desktop=left][pfe-aside-height=full]>.pfe-band__body{-ms-grid-row:2;-ms-grid-column:2}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-desktop=left][pfe-aside-height=full]>.pfe-band__aside{-ms-grid-row:1;-ms-grid-row-span:3;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-desktop=left][pfe-aside-height=full]>.pfe-band__footer{-ms-grid-row:3;-ms-grid-column:2;-ms-grid-column-span:1}}@supports (display:grid){.pfe-band__container{display:-ms-grid;display:grid;grid-row-gap:16px;grid-row-gap:var(--pfe-band--gutter--vertical,var(--pfe-theme--container-spacer,16px));grid-column-gap:calc(16px * 3);grid-column-gap:var(--pfe-band--gutter--horizontal,calc(var(--pfe-theme--container-spacer,16px) * 3));margin-bottom:0;-ms-grid-columns:1fr;grid-template-columns:1fr;-ms-grid-columns:var(--pfe-band--layout,1fr);grid-template-columns:var(--pfe-band--layout,1fr);-ms-grid-rows:-webkit-max-content;-ms-grid-rows:max-content;grid-template-rows:-webkit-max-content;grid-template-rows:max-content}.pfe-band__container>:nth-child(1){-ms-grid-row:1;-ms-grid-column:1}.pfe-band__container>:nth-child(1){-ms-grid-row:1;-ms-grid-column:1}}.pfe-band__header{margin-bottom:16px;margin-bottom:var(--pfe-band--gutter--vertical,var(--pfe-theme--container-spacer,16px))}@supports (display:grid){.pfe-band__header{-ms-grid-row:1;-ms-grid-column:1;display:-ms-grid;display:grid;grid-row-gap:16px;grid-row-gap:var(--pfe-band--gutter--vertical,var(--pfe-theme--container-spacer,16px));grid-column-gap:calc(16px * 3);grid-column-gap:var(--pfe-band--gutter--horizontal,calc(var(--pfe-theme--container-spacer,16px) * 3));margin-bottom:0;grid-area:header;-ms-grid-columns:1fr;grid-template-columns:1fr;-ms-grid-columns:var(--pfe-band__header--layout,1fr);grid-template-columns:var(--pfe-band__header--layout,1fr)}.pfe-band__container[pfe-has-header][pfe-has-aside]>.pfe-band__header{-ms-grid-row:1;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-aside-mobile=top]>.pfe-band__header{-ms-grid-row:2;-ms-grid-column:1;-ms-grid-column-span:1}.pfe-band__container[pfe-has-header][pfe-has-footer]>.pfe-band__header{-ms-grid-row:1;-ms-grid-column:1;-ms-grid-column-span:1}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-has-aside]>.pfe-band__header{-ms-grid-row:1;-ms-grid-column:1;-ms-grid-column-span:1}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-mobile=top]>.pfe-band__header{-ms-grid-row:2;-ms-grid-column:1;-ms-grid-column-span:1}}.pfe-band__body{margin-bottom:16px;margin-bottom:var(--pfe-band--gutter--vertical,var(--pfe-theme--container-spacer,16px))}@supports (display:grid){.pfe-band__body{-ms-grid-row:1;-ms-grid-column:1;display:-ms-grid;display:grid;grid-row-gap:16px;grid-row-gap:var(--pfe-band--gutter--vertical,var(--pfe-theme--container-spacer,16px));grid-column-gap:calc(16px * 3);grid-column-gap:var(--pfe-band--gutter--horizontal,calc(var(--pfe-theme--container-spacer,16px) * 3));margin-bottom:0;grid-area:body;-ms-grid-columns:1fr;grid-template-columns:1fr;-ms-grid-columns:var(--pfe-band__body--layout,1fr);grid-template-columns:var(--pfe-band__body--layout,1fr)}.pfe-band__container[pfe-has-aside]>.pfe-band__body{-ms-grid-row:1;-ms-grid-column:1}.pfe-band__container[pfe-has-aside][pfe-aside-mobile=top]>.pfe-band__body{-ms-grid-row:2;-ms-grid-column:1}.pfe-band__container[pfe-has-header]>.pfe-band__body{-ms-grid-row:2;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-has-aside]>.pfe-band__body{-ms-grid-row:2;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-aside-mobile=top]>.pfe-band__body{-ms-grid-row:3;-ms-grid-column:1}.pfe-band__container[pfe-has-footer]>.pfe-band__body{-ms-grid-row:1;-ms-grid-column:1}.pfe-band__container[pfe-has-footer][pfe-has-aside]>.pfe-band__body{-ms-grid-row:1;-ms-grid-column:1}.pfe-band__container[pfe-has-footer][pfe-aside-mobile=top]>.pfe-band__body{-ms-grid-row:2;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-has-footer]>.pfe-band__body{-ms-grid-row:2;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-has-aside]>.pfe-band__body{-ms-grid-row:2;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-mobile=top]>.pfe-band__body{-ms-grid-row:3;-ms-grid-column:1}}.pfe-band__aside{margin-bottom:16px;margin-bottom:var(--pfe-band--gutter--vertical,var(--pfe-theme--container-spacer,16px))}@supports (display:grid){.pfe-band__aside{-ms-grid-row:2;-ms-grid-column:1;display:-ms-grid;display:grid;grid-row-gap:16px;grid-row-gap:var(--pfe-band--gutter--vertical,var(--pfe-theme--container-spacer,16px));grid-column-gap:calc(16px * 3);grid-column-gap:var(--pfe-band--gutter--horizontal,calc(var(--pfe-theme--container-spacer,16px) * 3));margin-bottom:0;grid-area:aside;-ms-grid-columns:1fr;grid-template-columns:1fr;-ms-grid-columns:var(--pfe-band__aside--layout,1fr);grid-template-columns:var(--pfe-band__aside--layout,1fr)}.pfe-band__container[pfe-has-aside][pfe-aside-mobile=top]>.pfe-band__aside{-ms-grid-row:1;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-has-aside]>.pfe-band__aside{-ms-grid-row:3;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-aside-mobile=top]>.pfe-band__aside{-ms-grid-row:1;-ms-grid-column:1}.pfe-band__container[pfe-has-footer][pfe-has-aside]>.pfe-band__aside{-ms-grid-row:2;-ms-grid-row-span:1;-ms-grid-column:1}.pfe-band__container[pfe-has-footer][pfe-aside-mobile=top]>.pfe-band__aside{-ms-grid-row:1;-ms-grid-row-span:1;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-has-aside]>.pfe-band__aside{-ms-grid-row:4;-ms-grid-row-span:1;-ms-grid-column:1}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-mobile=top]>.pfe-band__aside{-ms-grid-row:1;-ms-grid-row-span:1;-ms-grid-column:1}}.pfe-band__footer{margin-bottom:16px;margin-bottom:var(--pfe-band--gutter--vertical,var(--pfe-theme--container-spacer,16px))}@supports (display:grid){.pfe-band__footer{-ms-grid-row:2;-ms-grid-column:1;display:-ms-grid;display:grid;grid-row-gap:16px;grid-row-gap:var(--pfe-band--gutter--vertical,var(--pfe-theme--container-spacer,16px));grid-column-gap:calc(16px * 3);grid-column-gap:var(--pfe-band--gutter--horizontal,calc(var(--pfe-theme--container-spacer,16px) * 3));margin-bottom:0;grid-area:footer;-ms-grid-columns:1fr;grid-template-columns:1fr;-ms-grid-columns:var(--pfe-band__footer--layout,1fr);grid-template-columns:var(--pfe-band__footer--layout,1fr)}.pfe-band__container[pfe-has-footer][pfe-has-aside]>.pfe-band__footer{-ms-grid-row:3;-ms-grid-column:1}.pfe-band__container[pfe-has-footer][pfe-aside-mobile=top]>.pfe-band__footer{-ms-grid-row:3;-ms-grid-column:1;-ms-grid-column-span:1}.pfe-band__container[pfe-has-header][pfe-has-footer]>.pfe-band__footer{-ms-grid-row:3;-ms-grid-column:1;-ms-grid-column-span:1}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-has-aside]>.pfe-band__footer{-ms-grid-row:3;-ms-grid-column:1;-ms-grid-column-span:1}.pfe-band__container[pfe-has-header][pfe-has-footer][pfe-aside-mobile=top]>.pfe-band__footer{-ms-grid-row:4;-ms-grid-column:1;-ms-grid-column-span:1}}.pfe-band__aside{-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}@media screen and (-ms-high-contrast:active),screen and (-ms-high-contrast:none){.pfe-band__body{width:60%;float:left}.pfe-band__aside{float:left;width:35%;margin:0 2.5%}.pfe-band__footer{clear:both}.pfe-band__container::after{content:" ";display:block;clear:both}}\n/*# sourceMappingURL=pfe-band.min.css.map */\n
\n "+(this.has_slot("pfe-band--aside")&&"top"===this.asidePosition.mobile?'':"")+"\n "+(this.has_slot("pfe-band--header")?'
':"")+'\n
\n '+(this.has_slot("pfe-band--aside")&&"top"!==this.asidePosition.mobile?'':"")+"\n "+(this.has_slot("pfe-band--footer")?'
':"")+"\n
"}},{key:"schemaUrl",get:function(){return"pfe-band.json"}},{key:"templateUrl",get:function(){return"pfe-band.html"}},{key:"styleUrl",get:function(){return"pfe-band.scss"}},{key:"imageSrc",get:function(){return this.getAttribute("pfe-img-src")}},{key:"backgroundColor",get:function(){return this.getAttribute("pfe-color")}},{key:"asidePosition",get:function(){return{desktop:this.getAttribute("pfe-aside-desktop"),mobile:this.getAttribute("pfe-aside-mobile"),height:this.getAttribute("pfe-aside-height")}}}],[{key:"version",get:function(){return"1.0.0-prerelease.55"}},{key:"properties",get:function(){return{color:{title:"Background color",type:"string",enum:["lightest","base","darker","darkest","complement","accent"],default:"base",prefixed:!0,observer:"_colorChanged"},"img-src":{title:"Background image",type:"string",prefixed:!0,observer:"_imgSrcChanged"},"aside-desktop":{title:"Aside positioning (desktop)",type:"string",default:"right",enum:["right","left"],prefixed:!0,observer:"_basicAttributeChanged",options:{dependencies:[{type:"slot",id:"aside"}]}},"aside-mobile":{title:"Aside positioning (mobile)",type:"string",default:"bottom",enum:["top","bottom"],prefixed:!0,observer:"_basicAttributeChanged",options:{dependencies:[{type:"slot",id:"aside"}]}},"aside-height":{title:"Aside height",type:"string",default:"body",enum:["full","body"],prefixed:!0,observer:"_basicAttributeChanged",options:{dependencies:[{type:"slot",id:"aside"}]}}}}},{key:"slots",get:function(){return{header:{title:"Header",type:"array",namedSlot:!0,maxItems:3,items:{title:"Body item",oneOf:[{$ref:"raw"}]}},body:{title:"Body",type:"array",namedSlot:!1,items:{oneOf:[{$ref:"pfe-card"},{$ref:"raw"}]}},footer:{title:"Footer",type:"array",namedSlot:!0,maxItems:3,items:{oneOf:[{$ref:"pfe-cta"},{$ref:"raw"}]}},aside:{title:"Aside",type:"array",namedSlot:!0,maxItems:5,items:{oneOf:[{$ref:"pfe-card"},{$ref:"raw"}]}}}}},{key:"tag",get:function(){return"pfe-band"}},{key:"observedAttributes",get:function(){return["pfe-aside-desktop","pfe-aside-mobile","pfe-aside-height","pfe-color","pfe-img-src"]}},{key:"cascadingAttributes",get:function(){return{"pfe-aside-desktop":".pfe-band__container","pfe-aside-mobile":".pfe-band__container","pfe-aside-height":".pfe-band__container"}}},{key:"PfeType",get:function(){return e.PfeTypes.Container}}]),r(i,[{key:"connectedCallback",value:function(){n(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"connectedCallback",this).call(this),this.imageSrc&&this._imgSrcChanged("pfe-img-src","",this.imageSrc)}},{key:"attributeChangedCallback",value:function(e,a,r){var o;n(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"attributeChangedCallback",this).call(this,e,a,r),this[e=e.replace("pfe-","")]&&this[e].observer&&"function"==typeof(o=this[this[e].observer].bind(this))&&o(e,a,r)}},{key:"_basicAttributeChanged",value:function(e,a,r){this[e].value=r}},{key:"_colorChanged",value:function(e,a,r){this[e].value=r,this.context_update()}},{key:"_imgSrcChanged",value:function(e,a,r){this.style.backgroundImage=r?"url('"+r+"')":""}}]),i);function i(){return a(this,i),d(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,i,{type:i.PfeType}))}return e.create(t),t}); +//# sourceMappingURL=pfe-band.umd.min.js.map diff --git a/js/pfe-band/dist/pfe-band.umd.min.js.map b/js/pfe-band/dist/pfe-band.umd.min.js.map new file mode 100644 index 00000000..b3a5ba19 --- /dev/null +++ b/js/pfe-band/dist/pfe-band.umd.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"pfe-band.umd.min.js","sources":["../_temp/polyfills--pfe-band.js","../_temp/pfe-band.umd.js"],"sourcesContent":["// @POLYFILL Element.matches\n// https://developer.mozilla.org/en-US/docs/Web/API/Element/matches\nif (!Element.prototype.matches) {\n Element.prototype.matches =\n Element.prototype.msMatchesSelector ||\n Element.prototype.webkitMatchesSelector;\n}\n\n// @POLYFILL Element.closest\n// https://developer.mozilla.org/en-US/docs/Web/API/Element/closest\nif (!Element.prototype.closest) {\n Element.prototype.closest = function(s) {\n var el = this;\n do {\n if (el.matches(s)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n return null;\n };\n}\n\n// @POLYFILL Array.includes\n// https://tc39.github.io/ecma262/#sec-array.prototype.includes\nif (!Array.prototype.includes) {\n Object.defineProperty(Array.prototype, \"includes\", {\n value: function(valueToFind, fromIndex) {\n if (this == null) {\n throw new TypeError('\"this\" is null or not defined');\n }\n\n // 1. Let O be ? ToObject(this value).\n var o = Object(this);\n\n // 2. Let len be ? ToLength(? Get(O, \"length\")).\n var len = o.length >>> 0;\n\n // 3. If len is 0, return false.\n if (len === 0) {\n return false;\n }\n\n // 4. Let n be ? ToInteger(fromIndex).\n // (If fromIndex is undefined, this step produces the value 0.)\n var n = fromIndex | 0;\n\n // 5. If n ≥ 0, then\n // a. Let k be n.\n // 6. Else n < 0,\n // a. Let k be len + n.\n // b. If k < 0, let k be 0.\n var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);\n\n function sameValueZero(x, y) {\n return (\n x === y ||\n (typeof x === \"number\" &&\n typeof y === \"number\" &&\n isNaN(x) &&\n isNaN(y))\n );\n }\n\n // 7. Repeat, while k < len\n while (k < len) {\n // a. Let elementK be the result of ? Get(O, ! ToString(k)).\n // b. If SameValueZero(valueToFind, elementK) is true, return true.\n if (sameValueZero(o[k], valueToFind)) {\n return true;\n }\n // c. Increase k by 1.\n k++;\n }\n\n // 8. Return false\n return false;\n }\n });\n}\n","/*!\n * PatternFly Elements: PfeBand 1.0.0-prerelease.55\n * @license\n * Copyright 2020 Red Hat, Inc.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n * \n*/\n\n// Import polyfills: matches, closest, includes\nimport \"./polyfills--pfe-band.js\";\n\nimport PFElement from \"../../pfelement/dist/pfelement.umd\";\n\nclass PfeBand extends PFElement {\n static get version() {\n return \"1.0.0-prerelease.55\";\n }\n\n get html() {\n return `
this.has_slot(`pfe-band--${slot}`) ? `pfe-has-${slot}` : \"\").join(\" \")}>\n ${this.has_slot(\"pfe-band--aside\") && this.asidePosition.mobile === \"top\" ? `` : \"\"}\n ${this.has_slot(\"pfe-band--header\") ? `
` : \"\"}\n
\n ${this.has_slot(\"pfe-band--aside\") && this.asidePosition.mobile !== \"top\" ? `` : \"\"}\n ${this.has_slot(\"pfe-band--footer\") ? `
` : \"\"}\n
`;\n }\n\n static get properties() {\n return {\"color\":{\"title\":\"Background color\",\"type\":\"string\",\"enum\":[\"lightest\",\"base\",\"darker\",\"darkest\",\"complement\",\"accent\"],\"default\":\"base\",\"prefixed\":true,\"observer\":\"_colorChanged\"},\"img-src\":{\"title\":\"Background image\",\"type\":\"string\",\"prefixed\":true,\"observer\":\"_imgSrcChanged\"},\"aside-desktop\":{\"title\":\"Aside positioning (desktop)\",\"type\":\"string\",\"default\":\"right\",\"enum\":[\"right\",\"left\"],\"prefixed\":true,\"observer\":\"_basicAttributeChanged\",\"options\":{\"dependencies\":[{\"type\":\"slot\",\"id\":\"aside\"}]}},\"aside-mobile\":{\"title\":\"Aside positioning (mobile)\",\"type\":\"string\",\"default\":\"bottom\",\"enum\":[\"top\",\"bottom\"],\"prefixed\":true,\"observer\":\"_basicAttributeChanged\",\"options\":{\"dependencies\":[{\"type\":\"slot\",\"id\":\"aside\"}]}},\"aside-height\":{\"title\":\"Aside height\",\"type\":\"string\",\"default\":\"body\",\"enum\":[\"full\",\"body\"],\"prefixed\":true,\"observer\":\"_basicAttributeChanged\",\"options\":{\"dependencies\":[{\"type\":\"slot\",\"id\":\"aside\"}]}}};\n }\n\n static get slots() {\n return {\"header\":{\"title\":\"Header\",\"type\":\"array\",\"namedSlot\":true,\"maxItems\":3,\"items\":{\"title\":\"Body item\",\"oneOf\":[{\"$ref\":\"raw\"}]}},\"body\":{\"title\":\"Body\",\"type\":\"array\",\"namedSlot\":false,\"items\":{\"oneOf\":[{\"$ref\":\"pfe-card\"},{\"$ref\":\"raw\"}]}},\"footer\":{\"title\":\"Footer\",\"type\":\"array\",\"namedSlot\":true,\"maxItems\":3,\"items\":{\"oneOf\":[{\"$ref\":\"pfe-cta\"},{\"$ref\":\"raw\"}]}},\"aside\":{\"title\":\"Aside\",\"type\":\"array\",\"namedSlot\":true,\"maxItems\":5,\"items\":{\"oneOf\":[{\"$ref\":\"pfe-card\"},{\"$ref\":\"raw\"}]}}};\n }\n static get tag() {\n return \"pfe-band\";\n }\n\n get schemaUrl() {\n return \"pfe-band.json\";\n }\n\n get templateUrl() {\n return \"pfe-band.html\";\n }\n\n get styleUrl() {\n return \"pfe-band.scss\";\n }\n\n get imageSrc() {\n return this.getAttribute(\"pfe-img-src\");\n }\n\n get backgroundColor() {\n return this.getAttribute(\"pfe-color\");\n }\n\n get asidePosition() {\n return {\n desktop: this.getAttribute(\"pfe-aside-desktop\"),\n mobile: this.getAttribute(\"pfe-aside-mobile\"),\n height: this.getAttribute(\"pfe-aside-height\")\n };\n }\n\n static get observedAttributes() {\n return [\n \"pfe-aside-desktop\",\n \"pfe-aside-mobile\",\n \"pfe-aside-height\",\n \"pfe-color\",\n \"pfe-img-src\"\n ];\n }\n\n static get cascadingAttributes() {\n return {\n \"pfe-aside-desktop\": \".pfe-band__container\",\n \"pfe-aside-mobile\": \".pfe-band__container\",\n \"pfe-aside-height\": \".pfe-band__container\"\n };\n }\n\n // Declare the type of this component\n static get PfeType() {\n return PFElement.PfeTypes.Container;\n }\n\n constructor() {\n super(PfeBand, { type: PfeBand.PfeType });\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n // Initialize the background image attachment\n if (this.imageSrc) {\n this._imgSrcChanged(\"pfe-img-src\", \"\", this.imageSrc);\n }\n }\n\n attributeChangedCallback(attr, oldValue, newValue) {\n super.attributeChangedCallback(attr, oldValue, newValue);\n // Strip the prefix form the attribute\n attr = attr.replace(\"pfe-\", \"\");\n // If the observer is defined in the attribute properties\n if (this[attr] && this[attr].observer) {\n // Get the observer function\n let observer = this[this[attr].observer].bind(this);\n // If it's a function, allow it to run\n if (typeof observer === \"function\") observer(attr, oldValue, newValue);\n }\n }\n\n _basicAttributeChanged(attr, oldValue, newValue) {\n this[attr].value = newValue;\n }\n\n // Update the color attribute and contexts\n _colorChanged(attr, oldValue, newValue) {\n this[attr].value = newValue;\n // Trigger an update in nested components\n this.context_update();\n }\n\n // Update the background image\n _imgSrcChanged(attr, oldValue, newValue) {\n // Set the image as the background image\n this.style.backgroundImage = newValue ? `url('${newValue}')` : ``;\n }\n}\n\nPFElement.create(PfeBand);\n\nexport { PfeBand as default };\n"],"names":["Element","prototype","matches","msMatchesSelector","webkitMatchesSelector","closest","s","el","this","parentElement","parentNode","nodeType","Array","includes","defineProperty","valueToFind","fromIndex","TypeError","o","Object","len","length","x","y","n","k","Math","max","abs","isNaN","PfeBand","PFElement","map","_this2","has_slot","slot","join","asidePosition","mobile","getAttribute","color","title","type","enum","default","prefixed","observer","img-src","aside-desktop","options","dependencies","id","aside-mobile","aside-height","header","namedSlot","maxItems","items","oneOf","$ref","body","footer","aside","PfeTypes","Container","imageSrc","_imgSrcChanged","attr","oldValue","newValue","replace","bind","value","context_update","style","backgroundImage","PfeType","create"],"mappings":"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"} \ No newline at end of file diff --git a/js/pfe-band/package.json b/js/pfe-band/package.json new file mode 100644 index 00000000..e64575f7 --- /dev/null +++ b/js/pfe-band/package.json @@ -0,0 +1,86 @@ +{ + "_args": [ + [ + "@patternfly/pfe-band@1.0.0-prerelease.56", + "/home/runner/work/jbossorg.github.io/jbossorg.github.io" + ] + ], + "_from": "@patternfly/pfe-band@1.0.0-prerelease.56", + "_id": "@patternfly/pfe-band@1.0.0-prerelease.56", + "_inBundle": false, + "_integrity": "sha512-3RxyBUt8OZnx+i0D+fUe/nGvYO5wmbZcLzNvkp2f3YReOFTrlP6SqB6A++hlnjjYh/TqcOLbckyloPWx59YKag==", + "_location": "/@patternfly/pfe-band", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "@patternfly/pfe-band@1.0.0-prerelease.56", + "name": "@patternfly/pfe-band", + "escapedName": "@patternfly%2fpfe-band", + "scope": "@patternfly", + "rawSpec": "1.0.0-prerelease.56", + "saveSpec": null, + "fetchSpec": "1.0.0-prerelease.56" + }, + "_requiredBy": [ + "/" + ], + "_resolved": "https://registry.npmjs.org/@patternfly/pfe-band/-/pfe-band-1.0.0-prerelease.56.tgz", + "_spec": "1.0.0-prerelease.56", + "_where": "/home/runner/work/jbossorg.github.io/jbossorg.github.io", + "bugs": { + "url": "https://github.com/patternfly/patternfly-elements/issues" + }, + "contributors": [ + { + "name": "castastrophe", + "url": "https://www.github.com/castastrophe" + } + ], + "dependencies": { + "@patternfly/pfelement": "^1.0.0-prerelease.56" + }, + "description": "Band container for PatternFly Elements", + "devDependencies": { + "@patternfly/pfe-sass": "^1.0.0-prerelease.56" + }, + "files": [ + "dist" + ], + "generator-rhelement-version": "0.6.8", + "gitHead": "efed86135e85925182445801ab89570b3bcec5ca", + "homepage": "https://github.com/patternfly/patternfly-elements#readme", + "keywords": [ + "web-components", + "html" + ], + "license": "MIT", + "main": "./dist/pfe-band.umd.js", + "module": "./dist/pfe-band.js", + "name": "@patternfly/pfe-band", + "pfelement": { + "className": "PfeBand", + "elementName": "pfe-band", + "files": { + "styles": "src/pfe-band.scss", + "template": "src/pfe-band.html", + "js": "src/pfe-band.js" + } + }, + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/patternfly/patternfly-elements.git", + "directory": "elements/pfe-band" + }, + "scripts": { + "build": "../../node_modules/.bin/gulp && ../../node_modules/.bin/prettier --ignore-path ../../.prettierignore --write '**/*.{js,json}'", + "dev": "../../node_modules/.bin/gulp dev", + "test": "../../node_modules/.bin/wct --configFile ../../wct.conf.json elements/pfe-band/test/", + "watch": "../../node_modules/.bin/gulp watch" + }, + "unpkg": "./dist/pfe-band.umd.min.js", + "version": "1.0.0-prerelease.56" +} diff --git a/js/pfe-card/LICENSE.txt b/js/pfe-card/LICENSE.txt new file mode 100644 index 00000000..599bd61b --- /dev/null +++ b/js/pfe-card/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright 2020 Red Hat, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/js/pfe-card/README.md b/js/pfe-card/README.md new file mode 100644 index 00000000..6a570f77 --- /dev/null +++ b/js/pfe-card/README.md @@ -0,0 +1,87 @@ +# PFElements Card Element + +## Usage + +```html + +

Card header

+

This is the pfe-card body.

+ + Footer link + +
+``` + +## Slots +All slots are optional. If the slot is not defined, the content will be added to the `body` region of the card. + +### Header +If this slot is used, we expect a heading level tag (h1, h2, h3, h4, h5, h6). An icon, svg, or use of the icon component are also valid in this region. + +### Default slot (body) +Any content that is not designated for the `header` or `footer` slot, will go to this slot. + +### Footer +Use this slot for anything that you want to be stuck to the base of the card. This region is bottom-aligned. + +## Attributes + + + +There are several attributes available for customizing the visual treatment of this container. + +- `pfe-color`: Options include darkest, darker, accent, complement, lighter, lightest. The card has a default value of `#dfdfdf`. Your theme will influence these colors so check there first if you are seeing inconsistencies. + + | color | hex | + |-------|-----| + | lightest | #ffffff | + | lighter | #ececec | + | default | #dfdfdf | + | darker | #464646 | + | darkest | #131313 | + | accent | #ee0000 | + | complement | #0477a4 | + +- `pfe-img-src`: Optional background image applied to the entire card container. Alignment of this image can be managed using the `--pfe-card--BackgroundPosition` variable which is set to `center center` by default. +- `pfe-size`: Optionally adjusts the padding on the container. Accepts: `small`. +- `pfe-overflow`: Optionally allows an image or element to overflow the padding on the container. This property should be added to the direct child of the slotm such as on an image tag; should be added to the element that you want to overflow the container. Accepts: `top`, `right`, `bottom`, `left`. +- `pfe-border`: Optionally apply a border color and weight to the entire card container. The default color and weight is `#d2d2d2` and `1px`, respectively. + +## Variables +There are several powerful variables available to hook into and override default styles. + +- **Background color**: Though using the `pfe-color` attribute is strongly recommended when setting the background color for the band, you can also use completely custom colors by updating the `--pfe-band--BackgroundColor` variable. If you update this value manually, you should also update the `--theme` context variable to invoke the right theme on it and it's child elements. Supported themes include: `light`, `dark`, and `saturated`. +- **Background position**: This is designed for use with the `pfe-img-src` attribute to allow you to align your background image. Default value is `center center`. **Variable name:** `--pfe-card--BackgroundPosition`. +- **Border**: This allows the customization of a border around the entire container. There is a variable for the entire border shorthand (transparent by default) or you can hook into the individual properties. **Variable name:** `--pfe-card--BorderRadius` and `--pfe-card--Border` or `--pfe-card--BorderWeight`, `--pfe-card--BorderStyle`, `--pfe-card--BorderColor`. +- **Padding**: You can customize the padding around the outside of the card container by connecting to either the shortcut padding variable or just one or more of the individual padding regions. **Variable names:** `--pfe-card--Padding` or `--pfe-card--PaddingTop`, `--pfe-card--PaddingRight`, `--pfe-card--PaddingBottom`, `--pfe-card--PaddingLeft`. + +## Test + + npm run test + +## Build + + npm run build + +## Demo + +From the PFElements root directory, run: + + npm start + +## Code style + +Card (and all PFElements) use [Prettier][prettier] to auto-format JS and JSON. The style rules get applied when you commit a change. If you choose to, you can [integrate your editor][prettier-ed] with Prettier to have the style rules applied on every save. + +[prettier]: https://github.com/prettier/prettier/ +[prettier-ed]: https://prettier.io/docs/en/editors.html +[web-component-tester]: https://github.com/Polymer/web-component-tester diff --git a/js/pfe-card/dist/pfe-card--lightdom.css b/js/pfe-card/dist/pfe-card--lightdom.css new file mode 100644 index 00000000..823357af --- /dev/null +++ b/js/pfe-card/dist/pfe-card--lightdom.css @@ -0,0 +1,8 @@ +@media screen and (-ms-high-contrast: active), screen and (-ms-high-contrast: none) { + /* IE10+ */ + pfe-card img[pfe-overflow] { + max-width: 100%; + } +} + +/*# sourceMappingURL=pfe-card--lightdom.css.map */ diff --git a/js/pfe-card/dist/pfe-card--lightdom.min.css b/js/pfe-card/dist/pfe-card--lightdom.min.css new file mode 100644 index 00000000..43d6eb88 --- /dev/null +++ b/js/pfe-card/dist/pfe-card--lightdom.min.css @@ -0,0 +1,2 @@ +@media screen and (-ms-high-contrast:active),screen and (-ms-high-contrast:none){pfe-card img[pfe-overflow]{max-width:100%}} +/*# sourceMappingURL=pfe-card--lightdom.min.css.map */ diff --git a/js/pfe-card/dist/pfe-card--lightdom.min.css.map b/js/pfe-card/dist/pfe-card--lightdom.min.css.map new file mode 100644 index 00000000..b0b3a967 --- /dev/null +++ b/js/pfe-card/dist/pfe-card--lightdom.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../../pfe-sass/mixins/_mixins.scss","../pfe-card--lightdom.scss"],"names":[],"mappings":"AAGM,6CAAA,oCCCF,2BACI,UAAA","file":"pfe-card--lightdom.min.css","sourcesContent":[]} \ No newline at end of file diff --git a/js/pfe-card/dist/pfe-card.js b/js/pfe-card/dist/pfe-card.js new file mode 100644 index 00000000..a1b2729c --- /dev/null +++ b/js/pfe-card/dist/pfe-card.js @@ -0,0 +1,222 @@ +import PFElement from '../../pfelement/dist/pfelement.js'; + +// @POLYFILL Element.matches +// https://developer.mozilla.org/en-US/docs/Web/API/Element/matches +if (!Element.prototype.matches) { + Element.prototype.matches = + Element.prototype.msMatchesSelector || + Element.prototype.webkitMatchesSelector; +} + +// @POLYFILL Element.closest +// https://developer.mozilla.org/en-US/docs/Web/API/Element/closest +if (!Element.prototype.closest) { + Element.prototype.closest = function(s) { + var el = this; + do { + if (el.matches(s)) return el; + el = el.parentElement || el.parentNode; + } while (el !== null && el.nodeType === 1); + return null; + }; +} + +// @POLYFILL Array.includes +// https://tc39.github.io/ecma262/#sec-array.prototype.includes +if (!Array.prototype.includes) { + Object.defineProperty(Array.prototype, "includes", { + value: function(valueToFind, fromIndex) { + if (this == null) { + throw new TypeError('"this" is null or not defined'); + } + + // 1. Let O be ? ToObject(this value). + var o = Object(this); + + // 2. Let len be ? ToLength(? Get(O, "length")). + var len = o.length >>> 0; + + // 3. If len is 0, return false. + if (len === 0) { + return false; + } + + // 4. Let n be ? ToInteger(fromIndex). + // (If fromIndex is undefined, this step produces the value 0.) + var n = fromIndex | 0; + + // 5. If n ≥ 0, then + // a. Let k be n. + // 6. Else n < 0, + // a. Let k be len + n. + // b. If k < 0, let k be 0. + var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); + + function sameValueZero(x, y) { + return ( + x === y || + (typeof x === "number" && + typeof y === "number" && + isNaN(x) && + isNaN(y)) + ); + } + + // 7. Repeat, while k < len + while (k < len) { + // a. Let elementK be the result of ? Get(O, ! ToString(k)). + // b. If SameValueZero(valueToFind, elementK) is true, return true. + if (sameValueZero(o[k], valueToFind)) { + return true; + } + // c. Increase k by 1. + k++; + } + + // 8. Return false + return false; + } + }); +} + +/*! + * PatternFly Elements: PfeCard 1.0.0-prerelease.55 + * @license + * Copyright 2020 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * +*/ + +class PfeCard extends PFElement { + static get version() { + return "1.0.0-prerelease.55"; + } + + get html() { + return `
+ +
+
+ +
+`; + } + + static get properties() { + return {"color":{"title":"Background color","type":"string","enum":["lightest","base","darker","darkest","complement","accent"],"default":"base","prefixed":true,"observer":"_colorChanged"},"img-src":{"title":"Background image","type":"string","observer":"_imgSrcChanged"},"size":{"title":"Padding size","type":"string","enum":["small"],"observer":"_basicAttributeChanged"}}; + } + + static get slots() { + return {"header":{"title":"Header","type":"array","namedSlot":true,"maxItems":3,"items":{"title":"Body item","oneOf":[{"$ref":"raw"}]}},"body":{"title":"Body","type":"array","namedSlot":false,"items":{"oneOf":[{"$ref":"pfe-card"},{"$ref":"raw"}]}},"footer":{"title":"Footer","type":"array","namedSlot":true,"maxItems":3,"items":{"oneOf":[{"$ref":"pfe-cta"},{"$ref":"raw"}]}}}; + } + static get tag() { + return "pfe-card"; + } + + get schemaUrl() { + return "pfe-card.json"; + } + + get templateUrl() { + return "pfe-card.html"; + } + + get styleUrl() { + return "pfe-card.scss"; + } + + get imageSrc() { + return this.getAttribute("pfe-img-src"); + } + + get backgroundColor() { + return this.getAttribute("pfe-color") || "base"; + } + + static get observedAttributes() { + return ["pfe-color", "pfe-img-src", "pfe-size"]; + } + + // Declare the type of this component + static get PfeType() { + return PFElement.PfeTypes.Container; + } + + constructor() { + super(PfeCard, { type: PfeCard.PfeType }); + this._observer = new MutationObserver(() => { + this._mapSchemaToSlots(this.tag, this.slots); + }); + } + + connectedCallback() { + super.connectedCallback(); + + // Initialize the background image attachment + if (this.imageSrc) { + this._imgSrcChanged("pfe-img-src", "", this.imageSrc); + } + + this._observer.observe(this, { childList: true }); + } + + disconnectedCallback() { + this._observer.disconnect(); + } + + attributeChangedCallback(attr, oldValue, newValue) { + super.attributeChangedCallback(attr, oldValue, newValue); + // Strip the prefix from the attribute + attr = attr.replace("pfe-", ""); + // If the observer is defined in the attribute properties + if (this[attr] && this[attr].observer) { + // Get the observer function + let observer = this[this[attr].observer].bind(this); + // If it's a function, allow it to run + if (typeof observer === "function") observer(attr, oldValue, newValue); + } + } + + _basicAttributeChanged(attr, oldValue, newValue) { + this[attr].value = newValue; + } + + // Update the color attribute and contexts + _colorChanged(attr, oldValue, newValue) { + this[attr].value = newValue; + // Trigger an update in nested components + this.context_update(); + } + + // Update the background image + _imgSrcChanged(attr, oldValue, newValue) { + // Set the image as the background image + this.style.backgroundImage = newValue ? `url('${newValue}')` : ``; + } +} + +PFElement.create(PfeCard); + +export default PfeCard; +//# sourceMappingURL=pfe-card.js.map diff --git a/js/pfe-card/dist/pfe-card.js.map b/js/pfe-card/dist/pfe-card.js.map new file mode 100644 index 00000000..c6597543 --- /dev/null +++ b/js/pfe-card/dist/pfe-card.js.map @@ -0,0 +1 @@ +{"version":3,"file":"pfe-card.js","sources":["../_temp/polyfills--pfe-card.js","../_temp/pfe-card.js"],"sourcesContent":["// @POLYFILL Element.matches\n// https://developer.mozilla.org/en-US/docs/Web/API/Element/matches\nif (!Element.prototype.matches) {\n Element.prototype.matches =\n Element.prototype.msMatchesSelector ||\n Element.prototype.webkitMatchesSelector;\n}\n\n// @POLYFILL Element.closest\n// https://developer.mozilla.org/en-US/docs/Web/API/Element/closest\nif (!Element.prototype.closest) {\n Element.prototype.closest = function(s) {\n var el = this;\n do {\n if (el.matches(s)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n return null;\n };\n}\n\n// @POLYFILL Array.includes\n// https://tc39.github.io/ecma262/#sec-array.prototype.includes\nif (!Array.prototype.includes) {\n Object.defineProperty(Array.prototype, \"includes\", {\n value: function(valueToFind, fromIndex) {\n if (this == null) {\n throw new TypeError('\"this\" is null or not defined');\n }\n\n // 1. Let O be ? ToObject(this value).\n var o = Object(this);\n\n // 2. Let len be ? ToLength(? Get(O, \"length\")).\n var len = o.length >>> 0;\n\n // 3. If len is 0, return false.\n if (len === 0) {\n return false;\n }\n\n // 4. Let n be ? ToInteger(fromIndex).\n // (If fromIndex is undefined, this step produces the value 0.)\n var n = fromIndex | 0;\n\n // 5. If n ≥ 0, then\n // a. Let k be n.\n // 6. Else n < 0,\n // a. Let k be len + n.\n // b. If k < 0, let k be 0.\n var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);\n\n function sameValueZero(x, y) {\n return (\n x === y ||\n (typeof x === \"number\" &&\n typeof y === \"number\" &&\n isNaN(x) &&\n isNaN(y))\n );\n }\n\n // 7. Repeat, while k < len\n while (k < len) {\n // a. Let elementK be the result of ? Get(O, ! ToString(k)).\n // b. If SameValueZero(valueToFind, elementK) is true, return true.\n if (sameValueZero(o[k], valueToFind)) {\n return true;\n }\n // c. Increase k by 1.\n k++;\n }\n\n // 8. Return false\n return false;\n }\n });\n}\n","/*!\n * PatternFly Elements: PfeCard 1.0.0-prerelease.55\n * @license\n * Copyright 2020 Red Hat, Inc.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n * \n*/\n\n// Import polyfills: matches, closest, includes\nimport \"./polyfills--pfe-card.js\";\n\nimport PFElement from \"../../pfelement/dist/pfelement.js\";\n\nclass PfeCard extends PFElement {\n static get version() {\n return \"1.0.0-prerelease.55\";\n }\n\n get html() {\n return `
\n \n
\n
\n \n
\n
\n \n
`;\n }\n\n static get properties() {\n return {\"color\":{\"title\":\"Background color\",\"type\":\"string\",\"enum\":[\"lightest\",\"base\",\"darker\",\"darkest\",\"complement\",\"accent\"],\"default\":\"base\",\"prefixed\":true,\"observer\":\"_colorChanged\"},\"img-src\":{\"title\":\"Background image\",\"type\":\"string\",\"observer\":\"_imgSrcChanged\"},\"size\":{\"title\":\"Padding size\",\"type\":\"string\",\"enum\":[\"small\"],\"observer\":\"_basicAttributeChanged\"}};\n }\n\n static get slots() {\n return {\"header\":{\"title\":\"Header\",\"type\":\"array\",\"namedSlot\":true,\"maxItems\":3,\"items\":{\"title\":\"Body item\",\"oneOf\":[{\"$ref\":\"raw\"}]}},\"body\":{\"title\":\"Body\",\"type\":\"array\",\"namedSlot\":false,\"items\":{\"oneOf\":[{\"$ref\":\"pfe-card\"},{\"$ref\":\"raw\"}]}},\"footer\":{\"title\":\"Footer\",\"type\":\"array\",\"namedSlot\":true,\"maxItems\":3,\"items\":{\"oneOf\":[{\"$ref\":\"pfe-cta\"},{\"$ref\":\"raw\"}]}}};\n }\n static get tag() {\n return \"pfe-card\";\n }\n\n get schemaUrl() {\n return \"pfe-card.json\";\n }\n\n get templateUrl() {\n return \"pfe-card.html\";\n }\n\n get styleUrl() {\n return \"pfe-card.scss\";\n }\n\n get imageSrc() {\n return this.getAttribute(\"pfe-img-src\");\n }\n\n get backgroundColor() {\n return this.getAttribute(\"pfe-color\") || \"base\";\n }\n\n static get observedAttributes() {\n return [\"pfe-color\", \"pfe-img-src\", \"pfe-size\"];\n }\n\n // Declare the type of this component\n static get PfeType() {\n return PFElement.PfeTypes.Container;\n }\n\n constructor() {\n super(PfeCard, { type: PfeCard.PfeType });\n this._observer = new MutationObserver(() => {\n this._mapSchemaToSlots(this.tag, this.slots);\n });\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n // Initialize the background image attachment\n if (this.imageSrc) {\n this._imgSrcChanged(\"pfe-img-src\", \"\", this.imageSrc);\n }\n\n this._observer.observe(this, { childList: true });\n }\n\n disconnectedCallback() {\n this._observer.disconnect();\n }\n\n attributeChangedCallback(attr, oldValue, newValue) {\n super.attributeChangedCallback(attr, oldValue, newValue);\n // Strip the prefix from the attribute\n attr = attr.replace(\"pfe-\", \"\");\n // If the observer is defined in the attribute properties\n if (this[attr] && this[attr].observer) {\n // Get the observer function\n let observer = this[this[attr].observer].bind(this);\n // If it's a function, allow it to run\n if (typeof observer === \"function\") observer(attr, oldValue, newValue);\n }\n }\n\n _basicAttributeChanged(attr, oldValue, newValue) {\n this[attr].value = newValue;\n }\n\n // Update the color attribute and contexts\n _colorChanged(attr, oldValue, newValue) {\n this[attr].value = newValue;\n // Trigger an update in nested components\n this.context_update();\n }\n\n // Update the background image\n _imgSrcChanged(attr, oldValue, newValue) {\n // Set the image as the background image\n this.style.backgroundImage = newValue ? `url('${newValue}')` : ``;\n }\n}\n\nPFElement.create(PfeCard);\n\nexport { PfeCard as default };\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/js/pfe-card/dist/pfe-card.json b/js/pfe-card/dist/pfe-card.json new file mode 100644 index 00000000..25f366cb --- /dev/null +++ b/js/pfe-card/dist/pfe-card.json @@ -0,0 +1,97 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Card", + "description": "This element creates a header, body, and footer region in which to place content or other components.", + "type": "object", + "tag": "pfe-card", + "class": "pfe-card", + "category": "container", + "properties": { + "slots": { + "title": "Slots", + "description": "Definition of the supported slots", + "type": "object", + "properties": { + "header": { + "title": "Header", + "type": "array", + "namedSlot": true, + "maxItems": 3, + "items": { + "title": "Body item", + "oneOf": [ + { + "$ref": "raw" + } + ] + } + }, + "body": { + "title": "Body", + "type": "array", + "namedSlot": false, + "items": { + "oneOf": [ + { + "$ref": "pfe-card" + }, + { + "$ref": "raw" + } + ] + } + }, + "footer": { + "title": "Footer", + "type": "array", + "namedSlot": true, + "maxItems": 3, + "items": { + "oneOf": [ + { + "$ref": "pfe-cta" + }, + { + "$ref": "raw" + } + ] + } + } + } + }, + "attributes": { + "title": "Attributes", + "type": "object", + "properties": { + "color": { + "title": "Background color", + "type": "string", + "enum": [ + "lightest", + "base", + "darker", + "darkest", + "complement", + "accent" + ], + "default": "base", + "prefixed": true, + "observer": "_colorChanged" + }, + "img-src": { + "title": "Background image", + "type": "string", + "observer": "_imgSrcChanged" + }, + "size": { + "title": "Padding size", + "type": "string", + "enum": ["small"], + "observer": "_basicAttributeChanged" + } + } + } + }, + "required": ["slots", "attributes"], + "additionalProperties": false +} diff --git a/js/pfe-card/dist/pfe-card.min.js b/js/pfe-card/dist/pfe-card.min.js new file mode 100644 index 00000000..daa89eb0 --- /dev/null +++ b/js/pfe-card/dist/pfe-card.min.js @@ -0,0 +1,26 @@ +import e from"../../pfelement/dist/pfelement.min.js";Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector),Element.prototype.closest||(Element.prototype.closest=function(e){var r=this;do{if(r.matches(e))return r;r=r.parentElement||r.parentNode}while(null!==r&&1===r.nodeType);return null}),Array.prototype.includes||Object.defineProperty(Array.prototype,"includes",{value:function(e,r){if(null==this)throw new TypeError('"this" is null or not defined');var a=Object(this),t=a.length>>>0;if(0===t)return!1;var o,c,d=0|r,p=Math.max(d>=0?d:t-Math.abs(d),0);for(;p@media screen and (-ms-high-contrast:active),screen and (-ms-high-contrast:none){:host([pfe-color=accent]),:host([pfe-color=base]),:host([pfe-color=complement]),:host([pfe-color=darker]),:host([pfe-color=darkest]),:host([pfe-color=lightest]){background-color:#fff!important;color:#151515!important}}@media screen and (-ms-high-contrast:active),screen and (-ms-high-contrast:none){:host{color:#151515!important}}:host{--theme:var(--pfe-card--theme, var(--pfe-theme--color--surface--base--theme, light));display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;justify-items:flex-start;-webkit-align-self:stretch;-ms-flex-item-align:stretch;-ms-grid-row-align:stretch;align-self:stretch;padding:calc(16px * 2) calc(16px * 2) calc(16px * 2) calc(16px * 2);padding:var(--pfe-card--Padding,var(--pfe-card--PaddingTop,calc(var(--pfe-theme--container-spacer,16px) * 2)) var(--pfe-card--PaddingRight,calc(var(--pfe-theme--container-spacer,16px) * 2)) var(--pfe-card--PaddingBottom,calc(var(--pfe-theme--container-spacer,16px) * 2)) var(--pfe-card--PaddingLeft,calc(var(--pfe-theme--container-spacer,16px) * 2)));border:0 solid #d2d2d2;border:var(--pfe-card--Border,var(--pfe-card--BorderWidth,0) var(--pfe-card--BorderStyle,solid) var(--pfe-card--BorderColor,var(--pfe-theme--color--surface--border,#d2d2d2)));border-radius:3px;border-radius:var(--pfe-card--BorderRadius,var(--pfe-theme--surface--border-radius,3px));overflow:hidden;background-color:#f0f0f0;background-color:var(--pfe-card--BackgroundColor,var(--pfe-theme--color--surface--base,#f0f0f0));background-position:center center;background-position:var(--pfe-card--BackgroundPosition,center center);color:#3c3f42;color:var(--pfe-broadcasted--text,#3c3f42)}@media print{:host{background-color:#fff!important;background-image:none!important;-webkit-box-shadow:none!important;box-shadow:none!important}}@media print{:host{border-radius:3px;border:1px solid #d2d2d2}}@media screen and (-ms-high-contrast:active),screen and (-ms-high-contrast:none){:host{background-color:#fff!important;background-color:var(--pfe-theme--color--surface--lightest,#fff)!important;color:#151515!important;color:var(--pfe-theme--color--text,#151515)!important;background-image:none!important;border-radius:3px;border:1px solid #d2d2d2;padding:16px;padding:var(--pfe-theme--container-spacer,16px)}}:host([pfe-color=darker]){--pfe-card--BackgroundColor:var(--pfe-theme--color--surface--darker, #3c3f42);--pfe-card--theme:var(--pfe-theme--color--surface--darker--theme, dark)}:host([pfe-color=darkest]){--pfe-card--BackgroundColor:var(--pfe-theme--color--surface--darkest, #151515);--pfe-card--theme:var(--pfe-theme--color--surface--darkest--theme, dark)}:host([pfe-color=base]){--pfe-card--BackgroundColor:var(--pfe-theme--color--surface--base, #f0f0f0);--pfe-card--theme:var(--pfe-theme--color--surface--base--theme, light)}:host([pfe-color=lightest]){--pfe-card--BackgroundColor:var(--pfe-theme--color--surface--lightest, #fff);--pfe-card--theme:var(--pfe-theme--color--surface--lightest--theme, light)}:host([pfe-color=accent]){--pfe-card--BackgroundColor:var(--pfe-theme--color--surface--accent, #004080);--pfe-card--theme:var(--pfe-theme--color--surface--accent--theme, saturated)}:host([pfe-color=complement]){--pfe-card--BackgroundColor:var(--pfe-theme--color--surface--complement, #002952);--pfe-card--theme:var(--pfe-theme--color--surface--complement--theme, saturated)}:host([on=dark]){--pfe-broadcasted--text:var(--pfe-theme--color--text--on-dark, #fff);--pfe-broadcasted--link:var(--pfe-theme--color--link--on-dark, #73bcf7);--pfe-broadcasted--link--hover:var(--pfe-theme--color--link--hover--on-dark, #bee1f4);--pfe-broadcasted--link--focus:var(--pfe-theme--color--link--focus--on-dark, #bee1f4);--pfe-broadcasted--link--visited:var(--pfe-theme--color--link--visited--on-dark, #bee1f4);--pfe-broadcasted--link-decoration:var(--pfe-theme--link-decoration--on-dark, none);--pfe-broadcasted--link-decoration--hover:var(--pfe-theme--link-decoration--hover--on-dark, underline);--pfe-broadcasted--link-decoration--focus:var(--pfe-theme--link-decoration--focus--on-dark, underline);--pfe-broadcasted--link-decoration--visited:var(--pfe-theme--link-decoration--visited--on-dark, none)}:host([on=saturated]){--pfe-broadcasted--text:var(--pfe-theme--color--text--on-saturated, #fff);--pfe-broadcasted--link:var(--pfe-theme--color--link--on-saturated, #fff);--pfe-broadcasted--link--hover:var(--pfe-theme--color--link--hover--on-saturated, #fafafa);--pfe-broadcasted--link--focus:var(--pfe-theme--color--link--focus--on-saturated, #fafafa);--pfe-broadcasted--link--visited:var(--pfe-theme--color--link--visited--on-saturated, #8476d1);--pfe-broadcasted--link-decoration:var(--pfe-theme--link-decoration--on-saturated, underline);--pfe-broadcasted--link-decoration--hover:var(--pfe-theme--link-decoration--hover--on-saturated, underline);--pfe-broadcasted--link-decoration--focus:var(--pfe-theme--link-decoration--focus--on-saturated, underline);--pfe-broadcasted--link-decoration--visited:var(--pfe-theme--link-decoration--visited--on-saturated, underline)}:host([on=light]){--pfe-broadcasted--text:var(--pfe-theme--color--text, #151515);--pfe-broadcasted--link:var(--pfe-theme--color--link, #06c);--pfe-broadcasted--link--hover:var(--pfe-theme--color--link--hover, #004080);--pfe-broadcasted--link--focus:var(--pfe-theme--color--link--focus, #004080);--pfe-broadcasted--link--visited:var(--pfe-theme--color--link--visited, #6753ac);--pfe-broadcasted--link-decoration:var(--pfe-theme--link-decoration, none);--pfe-broadcasted--link-decoration--hover:var(--pfe-theme--link-decoration--hover, underline);--pfe-broadcasted--link-decoration--focus:var(--pfe-theme--link-decoration--focus, underline);--pfe-broadcasted--link-decoration--visited:var(--pfe-theme--link-decoration--visited, none)}:host([pfe-size=small]){--pfe-card--PaddingTop:var(--pfe-theme--container-spacer, 16px);--pfe-card--PaddingRight:var(--pfe-theme--container-spacer, 16px);--pfe-card--PaddingBottom:var(--pfe-theme--container-spacer, 16px);--pfe-card--PaddingLeft:var(--pfe-theme--container-spacer, 16px)}:host([pfe-border]:not([pfe-border=false])){--pfe-card--BorderWidth:1px}.pfe-card__body ::slotted([pfe-overflow~=top]),.pfe-card__footer ::slotted([pfe-overflow~=top]),.pfe-card__header ::slotted([pfe-overflow~=top]){z-index:1;margin-top:-2rem;margin-top:calc(-1 * calc(16px * 2))!important;margin-top:calc(-1 * var(--pfe-card--PaddingTop,calc(var(--pfe-theme--container-spacer,16px) * 2)))!important}:host([has_header]) .pfe-card__body ::slotted([pfe-overflow~=top]),:host([has_header]) .pfe-card__footer ::slotted([pfe-overflow~=top]),:host([has_header]) .pfe-card__header ::slotted([pfe-overflow~=top]){padding-top:16px;padding-top:var(--pfe-card--spacing,var(--pfe-theme--container-spacer,16px))}.pfe-card__body ::slotted([pfe-overflow~=right]),.pfe-card__footer ::slotted([pfe-overflow~=right]),.pfe-card__header ::slotted([pfe-overflow~=right]){margin-right:-2rem;margin-right:calc(-1 * calc(16px * 2));margin-right:calc(-1 * var(--pfe-card--PaddingRight,calc(var(--pfe-theme--container-spacer,16px) * 2)))}.pfe-card__body ::slotted([pfe-overflow~=bottom]),.pfe-card__footer ::slotted([pfe-overflow~=bottom]),.pfe-card__header ::slotted([pfe-overflow~=bottom]){margin-bottom:-2rem;margin-bottom:calc(-1 * calc(calc(16px * 2) + 3px));margin-bottom:calc(-1 * calc(var(--pfe-card--PaddingBottom,calc(var(--pfe-theme--container-spacer,16px) * 2)) + var(--pfe-card--BorderRadius,var(--pfe-theme--surface--border-radius,3px))));-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.pfe-card__body ::slotted([pfe-overflow~=left]),.pfe-card__footer ::slotted([pfe-overflow~=left]),.pfe-card__header ::slotted([pfe-overflow~=left]){margin-left:-2rem;margin-left:calc(-1 * calc(16px * 2));margin-left:calc(-1 * var(--pfe-card--PaddingLeft,calc(var(--pfe-theme--container-spacer,16px) * 2)))}.pfe-card__body ::slotted(img),.pfe-card__footer ::slotted(img),.pfe-card__header ::slotted(img){max-width:100%!important;-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start;-o-object-fit:cover;object-fit:cover}.pfe-card__body ::slotted(img:not[pfe-overflow]),.pfe-card__footer ::slotted(img:not[pfe-overflow]),.pfe-card__header ::slotted(img:not[pfe-overflow]){-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.pfe-card__body ::slotted(img[pfe-overflow~=right]),.pfe-card__footer ::slotted(img[pfe-overflow~=right]),.pfe-card__header ::slotted(img[pfe-overflow~=right]){max-width:calc(100% + 2rem)!important;max-width:calc(100% + calc(16px * 2))!important;max-width:calc(100% + var(--pfe-card--PaddingRight,calc(var(--pfe-theme--container-spacer,16px) * 2)))!important}.pfe-card__body ::slotted(img[pfe-overflow~=left]),.pfe-card__footer ::slotted(img[pfe-overflow~=left]),.pfe-card__header ::slotted(img[pfe-overflow~=left]){max-width:calc(100% + 2rem)!important;max-width:calc(100% + calc(16px * 2))!important;max-width:calc(100% + var(--pfe-card--PaddingLeft,calc(var(--pfe-theme--container-spacer,16px) * 2)))!important}.pfe-card__body ::slotted(img[pfe-overflow~=right][pfe-overflow~=left]),.pfe-card__footer ::slotted(img[pfe-overflow~=right][pfe-overflow~=left]),.pfe-card__header ::slotted(img[pfe-overflow~=right][pfe-overflow~=left]){max-width:calc(100% + 4rem)!important;max-width:calc(100% + calc(calc(16px * 2) + calc(16px * 2)))!important;max-width:calc(100% + calc(var(--pfe-card--PaddingRight,calc(var(--pfe-theme--container-spacer,16px) * 2)) + var(--pfe-card--PaddingLeft,calc(var(--pfe-theme--container-spacer,16px) * 2))))!important}.pfe-card__header{z-index:2;background-color:rgba(0,0,0,.09);background-color:var(--pfe-card__header--BackgroundColor,rgba(0,0,0,var(--pfe-theme--opacity,.09)));color:#3c3f42;color:var(--pfe-card__header--Color,var(--pfe-broadcasted--text,#3c3f42));margin-top:calc(calc(16px * 2) * -1)!important;margin-top:calc(var(--pfe-card--PaddingTop,calc(var(--pfe-theme--container-spacer,16px) * 2)) * -1)!important;margin-right:calc(calc(16px * 2) * -1);margin-right:calc(var(--pfe-card--PaddingRight,calc(var(--pfe-theme--container-spacer,16px) * 2)) * -1);margin-bottom:16px;margin-bottom:var(--pfe-card--spacing--vertical,var(--pfe-card--spacing,var(--pfe-theme--container-spacer,16px)));margin-left:calc(calc(16px * 2) * -1);margin-left:calc(var(--pfe-card--PaddingLeft,calc(var(--pfe-theme--container-spacer,16px) * 2)) * -1);padding-top:16px;padding-top:var(--pfe-card--spacing--vertical,var(--pfe-card--spacing,var(--pfe-theme--container-spacer,16px)));padding-right:calc(16px * 2);padding-right:var(--pfe-card--PaddingRight,calc(var(--pfe-theme--container-spacer,16px) * 2));padding-left:calc(16px * 2);padding-left:var(--pfe-card--PaddingLeft,calc(var(--pfe-theme--container-spacer,16px) * 2));padding-bottom:16px;padding-bottom:var(--pfe-card--spacing--vertical,var(--pfe-card--spacing,var(--pfe-theme--container-spacer,16px)))}:host([on=dark]) .pfe-card__header{background-color:rgba(255,255,255,.09);background-color:var(--pfe-card__header--BackgroundColor--dark,rgba(255,255,255,var(--pfe-theme--opacity,.09)))}@media screen and (-ms-high-contrast:active),screen and (-ms-high-contrast:none){.pfe-card__header{background-color:#fff!important;color:#151515!important;color:var(--pfe-theme--color--text,#151515)!important}}:host(:not([has_body]):not([has_footer])) .pfe-card__header{margin-bottom:calc(16px * 2);margin-bottom:var(--pfe-card--PaddingBottom,calc(var(--pfe-theme--container-spacer,16px) * 2))}.pfe-card__header ::slotted([pfe-overflow~=top]){--pfe-card__overflow--MarginTop:calc(var(--pfe-card--PaddingTop, calc(var(--pfe-theme--container-spacer, 16px) * 2)) * -1)}:host(:not([has_header])) .pfe-card__header{display:none}:host([has_body],[has_footer]) .pfe-card__header ::slotted([pfe-overflow~=bottom]){--pfe-card__overflow--MarginBottom:calc(var(--pfe-card--spacing--vertical, var(--pfe-card--spacing, var(--pfe-theme--container-spacer, 16px))) * -1)}.pfe-card__header ::slotted([pfe-overflow~=bottom]){--pfe-card__overflow--MarginBottom:calc(var(--pfe-card--PaddingBottom, calc(var(--pfe-theme--container-spacer, 16px) * 2)) * -1)}.pfe-card__header ::slotted(h1){margin-bottom:0}.pfe-card__header ::slotted(h2){margin-bottom:0}.pfe-card__header ::slotted(h3){margin-bottom:0}.pfe-card__header ::slotted(h4){margin-bottom:0}.pfe-card__header ::slotted(h5){margin-bottom:0}.pfe-card__header ::slotted(h6){margin-bottom:0}:host(:not([has_header])) .pfe-card__body ::slotted([pfe-overflow~=top]){--pfe-card__overflow--MarginTop:calc(var(--pfe-card--PaddingTop, calc(var(--pfe-theme--container-spacer, 16px) * 2)) * -1)}.pfe-card__body ::slotted([pfe-overflow~=top]){z-index:1;--pfe-card__overflow--MarginTop:calc(var(--pfe-card--spacing--vertical, var(--pfe-card--spacing, var(--pfe-theme--container-spacer, 16px))) * -1)}.pfe-card__body ::slotted([pfe-overflow~=bottom]){--pfe-card__overflow--MarginBottom:calc(var(--pfe-card--PaddingBottom, calc(var(--pfe-theme--container-spacer, 16px) * 2)) * -1)}:host([has_footer]) .pfe-card__body ::slotted([pfe-overflow~=bottom]){--pfe-card__overflow--MarginBottom:calc(var(--pfe-card--spacing--vertical, var(--pfe-card--spacing, var(--pfe-theme--container-spacer, 16px))) * -1)}:host(:not([has_footer])) .pfe-card__body{margin-bottom:0}.pfe-card__footer{margin-top:auto;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;flex-direction:var(--pfe-card__footer--Row,row);-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-wrap:var(--pfe-card__footer--Wrap,wrap);-ms-flex-wrap:var(--pfe-card__footer--Wrap,wrap);flex-wrap:var(--pfe-card__footer--Wrap,wrap);-webkit-box-align:baseline;-webkit-align-items:baseline;-ms-flex-align:baseline;align-items:baseline;-webkit-box-align:var(--pfe-card__footer--AlignItems,baseline);-webkit-align-items:var(--pfe-card__footer--AlignItems,baseline);-ms-flex-align:var(--pfe-card__footer--AlignItems,baseline);align-items:var(--pfe-card__footer--AlignItems,baseline)}.pfe-card__footer ::slotted([pfe-overflow~=bottom]){--pfe-card__overflow--MarginBottom:calc(var(--pfe-card--PaddingBottom, calc(var(--pfe-theme--container-spacer, 16px) * 2)) * -1)}:host(:not([has_footer])) .pfe-card__footer{display:none}.pfe-card__body,.pfe-card__header{margin-bottom:16px;margin-bottom:var(--pfe-card--spacing--vertical,var(--pfe-card--spacing,var(--pfe-theme--container-spacer,16px)))}.pfe-card__body ::slotted(p:first-child),.pfe-card__header ::slotted(p:first-child){margin-top:0}.pfe-card__body ::slotted(h1:first-child),.pfe-card__header ::slotted(h1:first-child){margin-top:0}.pfe-card__body ::slotted(h2:first-child),.pfe-card__header ::slotted(h2:first-child){margin-top:0}.pfe-card__body ::slotted(h3:first-child),.pfe-card__header ::slotted(h3:first-child){margin-top:0}.pfe-card__body ::slotted(h4:first-child),.pfe-card__header ::slotted(h4:first-child){margin-top:0}.pfe-card__body ::slotted(h5:first-child),.pfe-card__header ::slotted(h5:first-child){margin-top:0}.pfe-card__body ::slotted(h6:first-child),.pfe-card__header ::slotted(h6:first-child){margin-top:0}\n/*# sourceMappingURL=pfe-card.min.css.map */\n
\n \n
\n
\n \n
\n'}static get properties(){return{color:{title:"Background color",type:"string",enum:["lightest","base","darker","darkest","complement","accent"],default:"base",prefixed:!0,observer:"_colorChanged"},"img-src":{title:"Background image",type:"string",observer:"_imgSrcChanged"},size:{title:"Padding size",type:"string",enum:["small"],observer:"_basicAttributeChanged"}}}static get slots(){return{header:{title:"Header",type:"array",namedSlot:!0,maxItems:3,items:{title:"Body item",oneOf:[{$ref:"raw"}]}},body:{title:"Body",type:"array",namedSlot:!1,items:{oneOf:[{$ref:"pfe-card"},{$ref:"raw"}]}},footer:{title:"Footer",type:"array",namedSlot:!0,maxItems:3,items:{oneOf:[{$ref:"pfe-cta"},{$ref:"raw"}]}}}}static get tag(){return"pfe-card"}get schemaUrl(){return"pfe-card.json"}get templateUrl(){return"pfe-card.html"}get styleUrl(){return"pfe-card.scss"}get imageSrc(){return this.getAttribute("pfe-img-src")}get backgroundColor(){return this.getAttribute("pfe-color")||"base"}static get observedAttributes(){return["pfe-color","pfe-img-src","pfe-size"]}static get PfeType(){return e.PfeTypes.Container}constructor(){super(r,{type:r.PfeType}),this._observer=new MutationObserver(()=>{this._mapSchemaToSlots(this.tag,this.slots)})}connectedCallback(){super.connectedCallback(),this.imageSrc&&this._imgSrcChanged("pfe-img-src","",this.imageSrc),this._observer.observe(this,{childList:!0})}disconnectedCallback(){this._observer.disconnect()}attributeChangedCallback(e,r,a){if(super.attributeChangedCallback(e,r,a),this[e=e.replace("pfe-","")]&&this[e].observer){let t=this[this[e].observer].bind(this);"function"==typeof t&&t(e,r,a)}}_basicAttributeChanged(e,r,a){this[e].value=a}_colorChanged(e,r,a){this[e].value=a,this.context_update()}_imgSrcChanged(e,r,a){this.style.backgroundImage=a?`url('${a}')`:""}}e.create(r);export default r; +//# sourceMappingURL=pfe-card.min.js.map diff --git a/js/pfe-card/dist/pfe-card.min.js.map b/js/pfe-card/dist/pfe-card.min.js.map new file mode 100644 index 00000000..c0ec0574 --- /dev/null +++ b/js/pfe-card/dist/pfe-card.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"pfe-card.min.js","sources":["../_temp/polyfills--pfe-card.js","../_temp/pfe-card.js"],"sourcesContent":["// @POLYFILL Element.matches\n// https://developer.mozilla.org/en-US/docs/Web/API/Element/matches\nif (!Element.prototype.matches) {\n Element.prototype.matches =\n Element.prototype.msMatchesSelector ||\n Element.prototype.webkitMatchesSelector;\n}\n\n// @POLYFILL Element.closest\n// https://developer.mozilla.org/en-US/docs/Web/API/Element/closest\nif (!Element.prototype.closest) {\n Element.prototype.closest = function(s) {\n var el = this;\n do {\n if (el.matches(s)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n return null;\n };\n}\n\n// @POLYFILL Array.includes\n// https://tc39.github.io/ecma262/#sec-array.prototype.includes\nif (!Array.prototype.includes) {\n Object.defineProperty(Array.prototype, \"includes\", {\n value: function(valueToFind, fromIndex) {\n if (this == null) {\n throw new TypeError('\"this\" is null or not defined');\n }\n\n // 1. Let O be ? ToObject(this value).\n var o = Object(this);\n\n // 2. Let len be ? ToLength(? Get(O, \"length\")).\n var len = o.length >>> 0;\n\n // 3. If len is 0, return false.\n if (len === 0) {\n return false;\n }\n\n // 4. Let n be ? ToInteger(fromIndex).\n // (If fromIndex is undefined, this step produces the value 0.)\n var n = fromIndex | 0;\n\n // 5. If n ≥ 0, then\n // a. Let k be n.\n // 6. Else n < 0,\n // a. Let k be len + n.\n // b. If k < 0, let k be 0.\n var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);\n\n function sameValueZero(x, y) {\n return (\n x === y ||\n (typeof x === \"number\" &&\n typeof y === \"number\" &&\n isNaN(x) &&\n isNaN(y))\n );\n }\n\n // 7. Repeat, while k < len\n while (k < len) {\n // a. Let elementK be the result of ? Get(O, ! ToString(k)).\n // b. If SameValueZero(valueToFind, elementK) is true, return true.\n if (sameValueZero(o[k], valueToFind)) {\n return true;\n }\n // c. Increase k by 1.\n k++;\n }\n\n // 8. Return false\n return false;\n }\n });\n}\n","/*!\n * PatternFly Elements: PfeCard 1.0.0-prerelease.55\n * @license\n * Copyright 2020 Red Hat, Inc.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n * \n*/\n\n// Import polyfills: matches, closest, includes\nimport \"./polyfills--pfe-card.js\";\n\nimport PFElement from \"../../pfelement/dist/pfelement.js\";\n\nclass PfeCard extends PFElement {\n static get version() {\n return \"1.0.0-prerelease.55\";\n }\n\n get html() {\n return `
\n \n
\n
\n \n
\n
\n \n
`;\n }\n\n static get properties() {\n return {\"color\":{\"title\":\"Background color\",\"type\":\"string\",\"enum\":[\"lightest\",\"base\",\"darker\",\"darkest\",\"complement\",\"accent\"],\"default\":\"base\",\"prefixed\":true,\"observer\":\"_colorChanged\"},\"img-src\":{\"title\":\"Background image\",\"type\":\"string\",\"observer\":\"_imgSrcChanged\"},\"size\":{\"title\":\"Padding size\",\"type\":\"string\",\"enum\":[\"small\"],\"observer\":\"_basicAttributeChanged\"}};\n }\n\n static get slots() {\n return {\"header\":{\"title\":\"Header\",\"type\":\"array\",\"namedSlot\":true,\"maxItems\":3,\"items\":{\"title\":\"Body item\",\"oneOf\":[{\"$ref\":\"raw\"}]}},\"body\":{\"title\":\"Body\",\"type\":\"array\",\"namedSlot\":false,\"items\":{\"oneOf\":[{\"$ref\":\"pfe-card\"},{\"$ref\":\"raw\"}]}},\"footer\":{\"title\":\"Footer\",\"type\":\"array\",\"namedSlot\":true,\"maxItems\":3,\"items\":{\"oneOf\":[{\"$ref\":\"pfe-cta\"},{\"$ref\":\"raw\"}]}}};\n }\n static get tag() {\n return \"pfe-card\";\n }\n\n get schemaUrl() {\n return \"pfe-card.json\";\n }\n\n get templateUrl() {\n return \"pfe-card.html\";\n }\n\n get styleUrl() {\n return \"pfe-card.scss\";\n }\n\n get imageSrc() {\n return this.getAttribute(\"pfe-img-src\");\n }\n\n get backgroundColor() {\n return this.getAttribute(\"pfe-color\") || \"base\";\n }\n\n static get observedAttributes() {\n return [\"pfe-color\", \"pfe-img-src\", \"pfe-size\"];\n }\n\n // Declare the type of this component\n static get PfeType() {\n return PFElement.PfeTypes.Container;\n }\n\n constructor() {\n super(PfeCard, { type: PfeCard.PfeType });\n this._observer = new MutationObserver(() => {\n this._mapSchemaToSlots(this.tag, this.slots);\n });\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n // Initialize the background image attachment\n if (this.imageSrc) {\n this._imgSrcChanged(\"pfe-img-src\", \"\", this.imageSrc);\n }\n\n this._observer.observe(this, { childList: true });\n }\n\n disconnectedCallback() {\n this._observer.disconnect();\n }\n\n attributeChangedCallback(attr, oldValue, newValue) {\n super.attributeChangedCallback(attr, oldValue, newValue);\n // Strip the prefix from the attribute\n attr = attr.replace(\"pfe-\", \"\");\n // If the observer is defined in the attribute properties\n if (this[attr] && this[attr].observer) {\n // Get the observer function\n let observer = this[this[attr].observer].bind(this);\n // If it's a function, allow it to run\n if (typeof observer === \"function\") observer(attr, oldValue, newValue);\n }\n }\n\n _basicAttributeChanged(attr, oldValue, newValue) {\n this[attr].value = newValue;\n }\n\n // Update the color attribute and contexts\n _colorChanged(attr, oldValue, newValue) {\n this[attr].value = newValue;\n // Trigger an update in nested components\n this.context_update();\n }\n\n // Update the background image\n _imgSrcChanged(attr, oldValue, newValue) {\n // Set the image as the background image\n this.style.backgroundImage = newValue ? `url('${newValue}')` : ``;\n }\n}\n\nPFElement.create(PfeCard);\n\nexport { PfeCard as default };\n"],"names":["Element","prototype","matches","msMatchesSelector","webkitMatchesSelector","closest","s","el","this","parentElement","parentNode","nodeType","Array","includes","Object","defineProperty","value","valueToFind","fromIndex","TypeError","o","len","length","x","y","n","k","Math","max","abs","isNaN","PfeCard","PFElement","version","html","properties","color","title","type","enum","default","prefixed","observer","img-src","size","slots","header","namedSlot","maxItems","items","oneOf","$ref","body","footer","tag","schemaUrl","templateUrl","styleUrl","imageSrc","getAttribute","backgroundColor","observedAttributes","PfeType","PfeTypes","Container","[object Object]","super","_observer","MutationObserver","_mapSchemaToSlots","connectedCallback","_imgSrcChanged","observe","childList","disconnect","attr","oldValue","newValue","attributeChangedCallback","replace","bind","context_update","style","backgroundImage","create"],"mappings":"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"} \ No newline at end of file diff --git a/js/pfe-card/dist/pfe-card.umd.js b/js/pfe-card/dist/pfe-card.umd.js new file mode 100644 index 00000000..464340ad --- /dev/null +++ b/js/pfe-card/dist/pfe-card.umd.js @@ -0,0 +1,320 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('../../pfelement/dist/pfelement.umd')) : + typeof define === 'function' && define.amd ? define(['../../pfelement/dist/pfelement.umd'], factory) : + (global.PfeCard = factory(global.PFElement)); +}(this, (function (PFElement) { 'use strict'; + + PFElement = PFElement && PFElement.hasOwnProperty('default') ? PFElement['default'] : PFElement; + + // @POLYFILL Element.matches + // https://developer.mozilla.org/en-US/docs/Web/API/Element/matches + if (!Element.prototype.matches) { + Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector; + } + + // @POLYFILL Element.closest + // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest + if (!Element.prototype.closest) { + Element.prototype.closest = function (s) { + var el = this; + do { + if (el.matches(s)) return el; + el = el.parentElement || el.parentNode; + } while (el !== null && el.nodeType === 1); + return null; + }; + } + + // @POLYFILL Array.includes + // https://tc39.github.io/ecma262/#sec-array.prototype.includes + if (!Array.prototype.includes) { + Object.defineProperty(Array.prototype, "includes", { + value: function value(valueToFind, fromIndex) { + if (this == null) { + throw new TypeError('"this" is null or not defined'); + } + + // 1. Let O be ? ToObject(this value). + var o = Object(this); + + // 2. Let len be ? ToLength(? Get(O, "length")). + var len = o.length >>> 0; + + // 3. If len is 0, return false. + if (len === 0) { + return false; + } + + // 4. Let n be ? ToInteger(fromIndex). + // (If fromIndex is undefined, this step produces the value 0.) + var n = fromIndex | 0; + + // 5. If n ≥ 0, then + // a. Let k be n. + // 6. Else n < 0, + // a. Let k be len + n. + // b. If k < 0, let k be 0. + var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); + + function sameValueZero(x, y) { + return x === y || typeof x === "number" && typeof y === "number" && isNaN(x) && isNaN(y); + } + + // 7. Repeat, while k < len + while (k < len) { + // a. Let elementK be the result of ? Get(O, ! ToString(k)). + // b. If SameValueZero(valueToFind, elementK) is true, return true. + if (sameValueZero(o[k], valueToFind)) { + return true; + } + // c. Increase k by 1. + k++; + } + + // 8. Return false + return false; + } + }); + } + + var classCallCheck = function (instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + }; + + var createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + + var get = function get(object, property, receiver) { + if (object === null) object = Function.prototype; + var desc = Object.getOwnPropertyDescriptor(object, property); + + if (desc === undefined) { + var parent = Object.getPrototypeOf(object); + + if (parent === null) { + return undefined; + } else { + return get(parent, property, receiver); + } + } else if ("value" in desc) { + return desc.value; + } else { + var getter = desc.get; + + if (getter === undefined) { + return undefined; + } + + return getter.call(receiver); + } + }; + + var inherits = function (subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; + }; + + var possibleConstructorReturn = function (self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; + }; + + /*! + * PatternFly Elements: PfeCard 1.0.0-prerelease.55 + * @license + * Copyright 2020 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + + var PfeCard = function (_PFElement) { + inherits(PfeCard, _PFElement); + createClass(PfeCard, [{ + key: "html", + get: function get$$1() { + return "
\n \n
\n
\n \n
\n
\n \n
"; + } + }, { + key: "schemaUrl", + get: function get$$1() { + return "pfe-card.json"; + } + }, { + key: "templateUrl", + get: function get$$1() { + return "pfe-card.html"; + } + }, { + key: "styleUrl", + get: function get$$1() { + return "pfe-card.scss"; + } + }, { + key: "imageSrc", + get: function get$$1() { + return this.getAttribute("pfe-img-src"); + } + }, { + key: "backgroundColor", + get: function get$$1() { + return this.getAttribute("pfe-color") || "base"; + } + }], [{ + key: "version", + get: function get$$1() { + return "1.0.0-prerelease.55"; + } + }, { + key: "properties", + get: function get$$1() { + return { "color": { "title": "Background color", "type": "string", "enum": ["lightest", "base", "darker", "darkest", "complement", "accent"], "default": "base", "prefixed": true, "observer": "_colorChanged" }, "img-src": { "title": "Background image", "type": "string", "observer": "_imgSrcChanged" }, "size": { "title": "Padding size", "type": "string", "enum": ["small"], "observer": "_basicAttributeChanged" } }; + } + }, { + key: "slots", + get: function get$$1() { + return { "header": { "title": "Header", "type": "array", "namedSlot": true, "maxItems": 3, "items": { "title": "Body item", "oneOf": [{ "$ref": "raw" }] } }, "body": { "title": "Body", "type": "array", "namedSlot": false, "items": { "oneOf": [{ "$ref": "pfe-card" }, { "$ref": "raw" }] } }, "footer": { "title": "Footer", "type": "array", "namedSlot": true, "maxItems": 3, "items": { "oneOf": [{ "$ref": "pfe-cta" }, { "$ref": "raw" }] } } }; + } + }, { + key: "tag", + get: function get$$1() { + return "pfe-card"; + } + }, { + key: "observedAttributes", + get: function get$$1() { + return ["pfe-color", "pfe-img-src", "pfe-size"]; + } + + // Declare the type of this component + + }, { + key: "PfeType", + get: function get$$1() { + return PFElement.PfeTypes.Container; + } + }]); + + function PfeCard() { + classCallCheck(this, PfeCard); + + var _this = possibleConstructorReturn(this, (PfeCard.__proto__ || Object.getPrototypeOf(PfeCard)).call(this, PfeCard, { type: PfeCard.PfeType })); + + _this._observer = new MutationObserver(function () { + _this._mapSchemaToSlots(_this.tag, _this.slots); + }); + return _this; + } + + createClass(PfeCard, [{ + key: "connectedCallback", + value: function connectedCallback() { + get(PfeCard.prototype.__proto__ || Object.getPrototypeOf(PfeCard.prototype), "connectedCallback", this).call(this); + + // Initialize the background image attachment + if (this.imageSrc) { + this._imgSrcChanged("pfe-img-src", "", this.imageSrc); + } + + this._observer.observe(this, { childList: true }); + } + }, { + key: "disconnectedCallback", + value: function disconnectedCallback() { + this._observer.disconnect(); + } + }, { + key: "attributeChangedCallback", + value: function attributeChangedCallback(attr, oldValue, newValue) { + get(PfeCard.prototype.__proto__ || Object.getPrototypeOf(PfeCard.prototype), "attributeChangedCallback", this).call(this, attr, oldValue, newValue); + // Strip the prefix from the attribute + attr = attr.replace("pfe-", ""); + // If the observer is defined in the attribute properties + if (this[attr] && this[attr].observer) { + // Get the observer function + var observer = this[this[attr].observer].bind(this); + // If it's a function, allow it to run + if (typeof observer === "function") observer(attr, oldValue, newValue); + } + } + }, { + key: "_basicAttributeChanged", + value: function _basicAttributeChanged(attr, oldValue, newValue) { + this[attr].value = newValue; + } + + // Update the color attribute and contexts + + }, { + key: "_colorChanged", + value: function _colorChanged(attr, oldValue, newValue) { + this[attr].value = newValue; + // Trigger an update in nested components + this.context_update(); + } + + // Update the background image + + }, { + key: "_imgSrcChanged", + value: function _imgSrcChanged(attr, oldValue, newValue) { + // Set the image as the background image + this.style.backgroundImage = newValue ? "url('" + newValue + "')" : ""; + } + }]); + return PfeCard; + }(PFElement); + + PFElement.create(PfeCard); + + return PfeCard; + +}))); +//# sourceMappingURL=pfe-card.umd.js.map diff --git a/js/pfe-card/dist/pfe-card.umd.js.map b/js/pfe-card/dist/pfe-card.umd.js.map new file mode 100644 index 00000000..070d8298 --- /dev/null +++ b/js/pfe-card/dist/pfe-card.umd.js.map @@ -0,0 +1 @@ +{"version":3,"file":"pfe-card.umd.js","sources":["../_temp/polyfills--pfe-card.js","../_temp/pfe-card.umd.js"],"sourcesContent":["// @POLYFILL Element.matches\n// https://developer.mozilla.org/en-US/docs/Web/API/Element/matches\nif (!Element.prototype.matches) {\n Element.prototype.matches =\n Element.prototype.msMatchesSelector ||\n Element.prototype.webkitMatchesSelector;\n}\n\n// @POLYFILL Element.closest\n// https://developer.mozilla.org/en-US/docs/Web/API/Element/closest\nif (!Element.prototype.closest) {\n Element.prototype.closest = function(s) {\n var el = this;\n do {\n if (el.matches(s)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n return null;\n };\n}\n\n// @POLYFILL Array.includes\n// https://tc39.github.io/ecma262/#sec-array.prototype.includes\nif (!Array.prototype.includes) {\n Object.defineProperty(Array.prototype, \"includes\", {\n value: function(valueToFind, fromIndex) {\n if (this == null) {\n throw new TypeError('\"this\" is null or not defined');\n }\n\n // 1. Let O be ? ToObject(this value).\n var o = Object(this);\n\n // 2. Let len be ? ToLength(? Get(O, \"length\")).\n var len = o.length >>> 0;\n\n // 3. If len is 0, return false.\n if (len === 0) {\n return false;\n }\n\n // 4. Let n be ? ToInteger(fromIndex).\n // (If fromIndex is undefined, this step produces the value 0.)\n var n = fromIndex | 0;\n\n // 5. If n ≥ 0, then\n // a. Let k be n.\n // 6. Else n < 0,\n // a. Let k be len + n.\n // b. If k < 0, let k be 0.\n var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);\n\n function sameValueZero(x, y) {\n return (\n x === y ||\n (typeof x === \"number\" &&\n typeof y === \"number\" &&\n isNaN(x) &&\n isNaN(y))\n );\n }\n\n // 7. Repeat, while k < len\n while (k < len) {\n // a. Let elementK be the result of ? Get(O, ! ToString(k)).\n // b. If SameValueZero(valueToFind, elementK) is true, return true.\n if (sameValueZero(o[k], valueToFind)) {\n return true;\n }\n // c. Increase k by 1.\n k++;\n }\n\n // 8. Return false\n return false;\n }\n });\n}\n","/*!\n * PatternFly Elements: PfeCard 1.0.0-prerelease.55\n * @license\n * Copyright 2020 Red Hat, Inc.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n * \n*/\n\n// Import polyfills: matches, closest, includes\nimport \"./polyfills--pfe-card.js\";\n\nimport PFElement from \"../../pfelement/dist/pfelement.umd\";\n\nclass PfeCard extends PFElement {\n static get version() {\n return \"1.0.0-prerelease.55\";\n }\n\n get html() {\n return `
\n \n
\n
\n \n
\n
\n \n
`;\n }\n\n static get properties() {\n return {\"color\":{\"title\":\"Background color\",\"type\":\"string\",\"enum\":[\"lightest\",\"base\",\"darker\",\"darkest\",\"complement\",\"accent\"],\"default\":\"base\",\"prefixed\":true,\"observer\":\"_colorChanged\"},\"img-src\":{\"title\":\"Background image\",\"type\":\"string\",\"observer\":\"_imgSrcChanged\"},\"size\":{\"title\":\"Padding size\",\"type\":\"string\",\"enum\":[\"small\"],\"observer\":\"_basicAttributeChanged\"}};\n }\n\n static get slots() {\n return {\"header\":{\"title\":\"Header\",\"type\":\"array\",\"namedSlot\":true,\"maxItems\":3,\"items\":{\"title\":\"Body item\",\"oneOf\":[{\"$ref\":\"raw\"}]}},\"body\":{\"title\":\"Body\",\"type\":\"array\",\"namedSlot\":false,\"items\":{\"oneOf\":[{\"$ref\":\"pfe-card\"},{\"$ref\":\"raw\"}]}},\"footer\":{\"title\":\"Footer\",\"type\":\"array\",\"namedSlot\":true,\"maxItems\":3,\"items\":{\"oneOf\":[{\"$ref\":\"pfe-cta\"},{\"$ref\":\"raw\"}]}}};\n }\n static get tag() {\n return \"pfe-card\";\n }\n\n get schemaUrl() {\n return \"pfe-card.json\";\n }\n\n get templateUrl() {\n return \"pfe-card.html\";\n }\n\n get styleUrl() {\n return \"pfe-card.scss\";\n }\n\n get imageSrc() {\n return this.getAttribute(\"pfe-img-src\");\n }\n\n get backgroundColor() {\n return this.getAttribute(\"pfe-color\") || \"base\";\n }\n\n static get observedAttributes() {\n return [\"pfe-color\", \"pfe-img-src\", \"pfe-size\"];\n }\n\n // Declare the type of this component\n static get PfeType() {\n return PFElement.PfeTypes.Container;\n }\n\n constructor() {\n super(PfeCard, { type: PfeCard.PfeType });\n this._observer = new MutationObserver(() => {\n this._mapSchemaToSlots(this.tag, this.slots);\n });\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n // Initialize the background image attachment\n if (this.imageSrc) {\n this._imgSrcChanged(\"pfe-img-src\", \"\", this.imageSrc);\n }\n\n this._observer.observe(this, { childList: true });\n }\n\n disconnectedCallback() {\n this._observer.disconnect();\n }\n\n attributeChangedCallback(attr, oldValue, newValue) {\n super.attributeChangedCallback(attr, oldValue, newValue);\n // Strip the prefix from the attribute\n attr = attr.replace(\"pfe-\", \"\");\n // If the observer is defined in the attribute properties\n if (this[attr] && this[attr].observer) {\n // Get the observer function\n let observer = this[this[attr].observer].bind(this);\n // If it's a function, allow it to run\n if (typeof observer === \"function\") observer(attr, oldValue, newValue);\n }\n }\n\n _basicAttributeChanged(attr, oldValue, newValue) {\n this[attr].value = newValue;\n }\n\n // Update the color attribute and contexts\n _colorChanged(attr, oldValue, newValue) {\n this[attr].value = newValue;\n // Trigger an update in nested components\n this.context_update();\n }\n\n // Update the background image\n _imgSrcChanged(attr, oldValue, newValue) {\n // Set the image as the background image\n this.style.backgroundImage = newValue ? `url('${newValue}')` : ``;\n }\n}\n\nPFElement.create(PfeCard);\n\nexport { PfeCard as default };\n"],"names":["Element","prototype","matches","msMatchesSelector","webkitMatchesSelector","closest","s","el","parentElement","parentNode","nodeType","Array","includes","Object","defineProperty","value","valueToFind","fromIndex","TypeError","o","len","length","n","k","Math","max","abs","sameValueZero","x","y","isNaN","PfeCard","getAttribute","PFElement","PfeTypes","Container","type","PfeType","_observer","MutationObserver","_mapSchemaToSlots","tag","slots","imageSrc","_imgSrcChanged","observe","childList","disconnect","attr","oldValue","newValue","replace","observer","bind","context_update","style","backgroundImage","create"],"mappings":"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"} \ No newline at end of file diff --git a/js/pfe-card/dist/pfe-card.umd.min.js b/js/pfe-card/dist/pfe-card.umd.min.js new file mode 100644 index 00000000..29e7be3e --- /dev/null +++ b/js/pfe-card/dist/pfe-card.umd.min.js @@ -0,0 +1,2 @@ +!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r(require("../../pfelement/dist/pfelement.umd")):"function"==typeof define&&define.amd?define(["../../pfelement/dist/pfelement.umd"],r):e.PfeCard=r(e.PFElement)}(this,function(e){"use strict";e=e&&e.hasOwnProperty("default")?e.default:e,Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector),Element.prototype.closest||(Element.prototype.closest=function(e){var r=this;do{if(r.matches(e))return r;r=r.parentElement||r.parentNode}while(null!==r&&1===r.nodeType);return null}),Array.prototype.includes||Object.defineProperty(Array.prototype,"includes",{value:function(e,r){if(null==this)throw new TypeError('"this" is null or not defined');var t=Object(this),a=t.length>>>0;if(0==a)return!1;var o,c,d=0|r,n=Math.max(0<=d?d:a-Math.abs(d),0);for(;n@media screen and (-ms-high-contrast:active),screen and (-ms-high-contrast:none){:host([pfe-color=accent]),:host([pfe-color=base]),:host([pfe-color=complement]),:host([pfe-color=darker]),:host([pfe-color=darkest]),:host([pfe-color=lightest]){background-color:#fff!important;color:#151515!important}}@media screen and (-ms-high-contrast:active),screen and (-ms-high-contrast:none){:host{color:#151515!important}}:host{--theme:var(--pfe-card--theme, var(--pfe-theme--color--surface--base--theme, light));display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;justify-items:flex-start;-webkit-align-self:stretch;-ms-flex-item-align:stretch;-ms-grid-row-align:stretch;align-self:stretch;padding:calc(16px * 2) calc(16px * 2) calc(16px * 2) calc(16px * 2);padding:var(--pfe-card--Padding,var(--pfe-card--PaddingTop,calc(var(--pfe-theme--container-spacer,16px) * 2)) var(--pfe-card--PaddingRight,calc(var(--pfe-theme--container-spacer,16px) * 2)) var(--pfe-card--PaddingBottom,calc(var(--pfe-theme--container-spacer,16px) * 2)) var(--pfe-card--PaddingLeft,calc(var(--pfe-theme--container-spacer,16px) * 2)));border:0 solid #d2d2d2;border:var(--pfe-card--Border,var(--pfe-card--BorderWidth,0) var(--pfe-card--BorderStyle,solid) var(--pfe-card--BorderColor,var(--pfe-theme--color--surface--border,#d2d2d2)));border-radius:3px;border-radius:var(--pfe-card--BorderRadius,var(--pfe-theme--surface--border-radius,3px));overflow:hidden;background-color:#f0f0f0;background-color:var(--pfe-card--BackgroundColor,var(--pfe-theme--color--surface--base,#f0f0f0));background-position:center center;background-position:var(--pfe-card--BackgroundPosition,center center);color:#3c3f42;color:var(--pfe-broadcasted--text,#3c3f42)}@media print{:host{background-color:#fff!important;background-image:none!important;-webkit-box-shadow:none!important;box-shadow:none!important}}@media print{:host{border-radius:3px;border:1px solid #d2d2d2}}@media screen and (-ms-high-contrast:active),screen and (-ms-high-contrast:none){:host{background-color:#fff!important;background-color:var(--pfe-theme--color--surface--lightest,#fff)!important;color:#151515!important;color:var(--pfe-theme--color--text,#151515)!important;background-image:none!important;border-radius:3px;border:1px solid #d2d2d2;padding:16px;padding:var(--pfe-theme--container-spacer,16px)}}:host([pfe-color=darker]){--pfe-card--BackgroundColor:var(--pfe-theme--color--surface--darker, #3c3f42);--pfe-card--theme:var(--pfe-theme--color--surface--darker--theme, dark)}:host([pfe-color=darkest]){--pfe-card--BackgroundColor:var(--pfe-theme--color--surface--darkest, #151515);--pfe-card--theme:var(--pfe-theme--color--surface--darkest--theme, dark)}:host([pfe-color=base]){--pfe-card--BackgroundColor:var(--pfe-theme--color--surface--base, #f0f0f0);--pfe-card--theme:var(--pfe-theme--color--surface--base--theme, light)}:host([pfe-color=lightest]){--pfe-card--BackgroundColor:var(--pfe-theme--color--surface--lightest, #fff);--pfe-card--theme:var(--pfe-theme--color--surface--lightest--theme, light)}:host([pfe-color=accent]){--pfe-card--BackgroundColor:var(--pfe-theme--color--surface--accent, #004080);--pfe-card--theme:var(--pfe-theme--color--surface--accent--theme, saturated)}:host([pfe-color=complement]){--pfe-card--BackgroundColor:var(--pfe-theme--color--surface--complement, #002952);--pfe-card--theme:var(--pfe-theme--color--surface--complement--theme, saturated)}:host([on=dark]){--pfe-broadcasted--text:var(--pfe-theme--color--text--on-dark, #fff);--pfe-broadcasted--link:var(--pfe-theme--color--link--on-dark, #73bcf7);--pfe-broadcasted--link--hover:var(--pfe-theme--color--link--hover--on-dark, #bee1f4);--pfe-broadcasted--link--focus:var(--pfe-theme--color--link--focus--on-dark, #bee1f4);--pfe-broadcasted--link--visited:var(--pfe-theme--color--link--visited--on-dark, #bee1f4);--pfe-broadcasted--link-decoration:var(--pfe-theme--link-decoration--on-dark, none);--pfe-broadcasted--link-decoration--hover:var(--pfe-theme--link-decoration--hover--on-dark, underline);--pfe-broadcasted--link-decoration--focus:var(--pfe-theme--link-decoration--focus--on-dark, underline);--pfe-broadcasted--link-decoration--visited:var(--pfe-theme--link-decoration--visited--on-dark, none)}:host([on=saturated]){--pfe-broadcasted--text:var(--pfe-theme--color--text--on-saturated, #fff);--pfe-broadcasted--link:var(--pfe-theme--color--link--on-saturated, #fff);--pfe-broadcasted--link--hover:var(--pfe-theme--color--link--hover--on-saturated, #fafafa);--pfe-broadcasted--link--focus:var(--pfe-theme--color--link--focus--on-saturated, #fafafa);--pfe-broadcasted--link--visited:var(--pfe-theme--color--link--visited--on-saturated, #8476d1);--pfe-broadcasted--link-decoration:var(--pfe-theme--link-decoration--on-saturated, underline);--pfe-broadcasted--link-decoration--hover:var(--pfe-theme--link-decoration--hover--on-saturated, underline);--pfe-broadcasted--link-decoration--focus:var(--pfe-theme--link-decoration--focus--on-saturated, underline);--pfe-broadcasted--link-decoration--visited:var(--pfe-theme--link-decoration--visited--on-saturated, underline)}:host([on=light]){--pfe-broadcasted--text:var(--pfe-theme--color--text, #151515);--pfe-broadcasted--link:var(--pfe-theme--color--link, #06c);--pfe-broadcasted--link--hover:var(--pfe-theme--color--link--hover, #004080);--pfe-broadcasted--link--focus:var(--pfe-theme--color--link--focus, #004080);--pfe-broadcasted--link--visited:var(--pfe-theme--color--link--visited, #6753ac);--pfe-broadcasted--link-decoration:var(--pfe-theme--link-decoration, none);--pfe-broadcasted--link-decoration--hover:var(--pfe-theme--link-decoration--hover, underline);--pfe-broadcasted--link-decoration--focus:var(--pfe-theme--link-decoration--focus, underline);--pfe-broadcasted--link-decoration--visited:var(--pfe-theme--link-decoration--visited, none)}:host([pfe-size=small]){--pfe-card--PaddingTop:var(--pfe-theme--container-spacer, 16px);--pfe-card--PaddingRight:var(--pfe-theme--container-spacer, 16px);--pfe-card--PaddingBottom:var(--pfe-theme--container-spacer, 16px);--pfe-card--PaddingLeft:var(--pfe-theme--container-spacer, 16px)}:host([pfe-border]:not([pfe-border=false])){--pfe-card--BorderWidth:1px}.pfe-card__body ::slotted([pfe-overflow~=top]),.pfe-card__footer ::slotted([pfe-overflow~=top]),.pfe-card__header ::slotted([pfe-overflow~=top]){z-index:1;margin-top:-2rem;margin-top:calc(-1 * calc(16px * 2))!important;margin-top:calc(-1 * var(--pfe-card--PaddingTop,calc(var(--pfe-theme--container-spacer,16px) * 2)))!important}:host([has_header]) .pfe-card__body ::slotted([pfe-overflow~=top]),:host([has_header]) .pfe-card__footer ::slotted([pfe-overflow~=top]),:host([has_header]) .pfe-card__header ::slotted([pfe-overflow~=top]){padding-top:16px;padding-top:var(--pfe-card--spacing,var(--pfe-theme--container-spacer,16px))}.pfe-card__body ::slotted([pfe-overflow~=right]),.pfe-card__footer ::slotted([pfe-overflow~=right]),.pfe-card__header ::slotted([pfe-overflow~=right]){margin-right:-2rem;margin-right:calc(-1 * calc(16px * 2));margin-right:calc(-1 * var(--pfe-card--PaddingRight,calc(var(--pfe-theme--container-spacer,16px) * 2)))}.pfe-card__body ::slotted([pfe-overflow~=bottom]),.pfe-card__footer ::slotted([pfe-overflow~=bottom]),.pfe-card__header ::slotted([pfe-overflow~=bottom]){margin-bottom:-2rem;margin-bottom:calc(-1 * calc(calc(16px * 2) + 3px));margin-bottom:calc(-1 * calc(var(--pfe-card--PaddingBottom,calc(var(--pfe-theme--container-spacer,16px) * 2)) + var(--pfe-card--BorderRadius,var(--pfe-theme--surface--border-radius,3px))));-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.pfe-card__body ::slotted([pfe-overflow~=left]),.pfe-card__footer ::slotted([pfe-overflow~=left]),.pfe-card__header ::slotted([pfe-overflow~=left]){margin-left:-2rem;margin-left:calc(-1 * calc(16px * 2));margin-left:calc(-1 * var(--pfe-card--PaddingLeft,calc(var(--pfe-theme--container-spacer,16px) * 2)))}.pfe-card__body ::slotted(img),.pfe-card__footer ::slotted(img),.pfe-card__header ::slotted(img){max-width:100%!important;-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start;-o-object-fit:cover;object-fit:cover}.pfe-card__body ::slotted(img:not[pfe-overflow]),.pfe-card__footer ::slotted(img:not[pfe-overflow]),.pfe-card__header ::slotted(img:not[pfe-overflow]){-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.pfe-card__body ::slotted(img[pfe-overflow~=right]),.pfe-card__footer ::slotted(img[pfe-overflow~=right]),.pfe-card__header ::slotted(img[pfe-overflow~=right]){max-width:calc(100% + 2rem)!important;max-width:calc(100% + calc(16px * 2))!important;max-width:calc(100% + var(--pfe-card--PaddingRight,calc(var(--pfe-theme--container-spacer,16px) * 2)))!important}.pfe-card__body ::slotted(img[pfe-overflow~=left]),.pfe-card__footer ::slotted(img[pfe-overflow~=left]),.pfe-card__header ::slotted(img[pfe-overflow~=left]){max-width:calc(100% + 2rem)!important;max-width:calc(100% + calc(16px * 2))!important;max-width:calc(100% + var(--pfe-card--PaddingLeft,calc(var(--pfe-theme--container-spacer,16px) * 2)))!important}.pfe-card__body ::slotted(img[pfe-overflow~=right][pfe-overflow~=left]),.pfe-card__footer ::slotted(img[pfe-overflow~=right][pfe-overflow~=left]),.pfe-card__header ::slotted(img[pfe-overflow~=right][pfe-overflow~=left]){max-width:calc(100% + 4rem)!important;max-width:calc(100% + calc(calc(16px * 2) + calc(16px * 2)))!important;max-width:calc(100% + calc(var(--pfe-card--PaddingRight,calc(var(--pfe-theme--container-spacer,16px) * 2)) + var(--pfe-card--PaddingLeft,calc(var(--pfe-theme--container-spacer,16px) * 2))))!important}.pfe-card__header{z-index:2;background-color:rgba(0,0,0,.09);background-color:var(--pfe-card__header--BackgroundColor,rgba(0,0,0,var(--pfe-theme--opacity,.09)));color:#3c3f42;color:var(--pfe-card__header--Color,var(--pfe-broadcasted--text,#3c3f42));margin-top:calc(calc(16px * 2) * -1)!important;margin-top:calc(var(--pfe-card--PaddingTop,calc(var(--pfe-theme--container-spacer,16px) * 2)) * -1)!important;margin-right:calc(calc(16px * 2) * -1);margin-right:calc(var(--pfe-card--PaddingRight,calc(var(--pfe-theme--container-spacer,16px) * 2)) * -1);margin-bottom:16px;margin-bottom:var(--pfe-card--spacing--vertical,var(--pfe-card--spacing,var(--pfe-theme--container-spacer,16px)));margin-left:calc(calc(16px * 2) * -1);margin-left:calc(var(--pfe-card--PaddingLeft,calc(var(--pfe-theme--container-spacer,16px) * 2)) * -1);padding-top:16px;padding-top:var(--pfe-card--spacing--vertical,var(--pfe-card--spacing,var(--pfe-theme--container-spacer,16px)));padding-right:calc(16px * 2);padding-right:var(--pfe-card--PaddingRight,calc(var(--pfe-theme--container-spacer,16px) * 2));padding-left:calc(16px * 2);padding-left:var(--pfe-card--PaddingLeft,calc(var(--pfe-theme--container-spacer,16px) * 2));padding-bottom:16px;padding-bottom:var(--pfe-card--spacing--vertical,var(--pfe-card--spacing,var(--pfe-theme--container-spacer,16px)))}:host([on=dark]) .pfe-card__header{background-color:rgba(255,255,255,.09);background-color:var(--pfe-card__header--BackgroundColor--dark,rgba(255,255,255,var(--pfe-theme--opacity,.09)))}@media screen and (-ms-high-contrast:active),screen and (-ms-high-contrast:none){.pfe-card__header{background-color:#fff!important;color:#151515!important;color:var(--pfe-theme--color--text,#151515)!important}}:host(:not([has_body]):not([has_footer])) .pfe-card__header{margin-bottom:calc(16px * 2);margin-bottom:var(--pfe-card--PaddingBottom,calc(var(--pfe-theme--container-spacer,16px) * 2))}.pfe-card__header ::slotted([pfe-overflow~=top]){--pfe-card__overflow--MarginTop:calc(var(--pfe-card--PaddingTop, calc(var(--pfe-theme--container-spacer, 16px) * 2)) * -1)}:host(:not([has_header])) .pfe-card__header{display:none}:host([has_body],[has_footer]) .pfe-card__header ::slotted([pfe-overflow~=bottom]){--pfe-card__overflow--MarginBottom:calc(var(--pfe-card--spacing--vertical, var(--pfe-card--spacing, var(--pfe-theme--container-spacer, 16px))) * -1)}.pfe-card__header ::slotted([pfe-overflow~=bottom]){--pfe-card__overflow--MarginBottom:calc(var(--pfe-card--PaddingBottom, calc(var(--pfe-theme--container-spacer, 16px) * 2)) * -1)}.pfe-card__header ::slotted(h1){margin-bottom:0}.pfe-card__header ::slotted(h2){margin-bottom:0}.pfe-card__header ::slotted(h3){margin-bottom:0}.pfe-card__header ::slotted(h4){margin-bottom:0}.pfe-card__header ::slotted(h5){margin-bottom:0}.pfe-card__header ::slotted(h6){margin-bottom:0}:host(:not([has_header])) .pfe-card__body ::slotted([pfe-overflow~=top]){--pfe-card__overflow--MarginTop:calc(var(--pfe-card--PaddingTop, calc(var(--pfe-theme--container-spacer, 16px) * 2)) * -1)}.pfe-card__body ::slotted([pfe-overflow~=top]){z-index:1;--pfe-card__overflow--MarginTop:calc(var(--pfe-card--spacing--vertical, var(--pfe-card--spacing, var(--pfe-theme--container-spacer, 16px))) * -1)}.pfe-card__body ::slotted([pfe-overflow~=bottom]){--pfe-card__overflow--MarginBottom:calc(var(--pfe-card--PaddingBottom, calc(var(--pfe-theme--container-spacer, 16px) * 2)) * -1)}:host([has_footer]) .pfe-card__body ::slotted([pfe-overflow~=bottom]){--pfe-card__overflow--MarginBottom:calc(var(--pfe-card--spacing--vertical, var(--pfe-card--spacing, var(--pfe-theme--container-spacer, 16px))) * -1)}:host(:not([has_footer])) .pfe-card__body{margin-bottom:0}.pfe-card__footer{margin-top:auto;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;flex-direction:var(--pfe-card__footer--Row,row);-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-wrap:var(--pfe-card__footer--Wrap,wrap);-ms-flex-wrap:var(--pfe-card__footer--Wrap,wrap);flex-wrap:var(--pfe-card__footer--Wrap,wrap);-webkit-box-align:baseline;-webkit-align-items:baseline;-ms-flex-align:baseline;align-items:baseline;-webkit-box-align:var(--pfe-card__footer--AlignItems,baseline);-webkit-align-items:var(--pfe-card__footer--AlignItems,baseline);-ms-flex-align:var(--pfe-card__footer--AlignItems,baseline);align-items:var(--pfe-card__footer--AlignItems,baseline)}.pfe-card__footer ::slotted([pfe-overflow~=bottom]){--pfe-card__overflow--MarginBottom:calc(var(--pfe-card--PaddingBottom, calc(var(--pfe-theme--container-spacer, 16px) * 2)) * -1)}:host(:not([has_footer])) .pfe-card__footer{display:none}.pfe-card__body,.pfe-card__header{margin-bottom:16px;margin-bottom:var(--pfe-card--spacing--vertical,var(--pfe-card--spacing,var(--pfe-theme--container-spacer,16px)))}.pfe-card__body ::slotted(p:first-child),.pfe-card__header ::slotted(p:first-child){margin-top:0}.pfe-card__body ::slotted(h1:first-child),.pfe-card__header ::slotted(h1:first-child){margin-top:0}.pfe-card__body ::slotted(h2:first-child),.pfe-card__header ::slotted(h2:first-child){margin-top:0}.pfe-card__body ::slotted(h3:first-child),.pfe-card__header ::slotted(h3:first-child){margin-top:0}.pfe-card__body ::slotted(h4:first-child),.pfe-card__header ::slotted(h4:first-child){margin-top:0}.pfe-card__body ::slotted(h5:first-child),.pfe-card__header ::slotted(h5:first-child){margin-top:0}.pfe-card__body ::slotted(h6:first-child),.pfe-card__header ::slotted(h6:first-child){margin-top:0}\n/*# sourceMappingURL=pfe-card.min.css.map */\n
\n \n
\n
\n \n
\n'}},{key:"schemaUrl",get:function(){return"pfe-card.json"}},{key:"templateUrl",get:function(){return"pfe-card.html"}},{key:"styleUrl",get:function(){return"pfe-card.scss"}},{key:"imageSrc",get:function(){return this.getAttribute("pfe-img-src")}},{key:"backgroundColor",get:function(){return this.getAttribute("pfe-color")||"base"}}],[{key:"version",get:function(){return"1.0.0-prerelease.55"}},{key:"properties",get:function(){return{color:{title:"Background color",type:"string",enum:["lightest","base","darker","darkest","complement","accent"],default:"base",prefixed:!0,observer:"_colorChanged"},"img-src":{title:"Background image",type:"string",observer:"_imgSrcChanged"},size:{title:"Padding size",type:"string",enum:["small"],observer:"_basicAttributeChanged"}}}},{key:"slots",get:function(){return{header:{title:"Header",type:"array",namedSlot:!0,maxItems:3,items:{title:"Body item",oneOf:[{$ref:"raw"}]}},body:{title:"Body",type:"array",namedSlot:!1,items:{oneOf:[{$ref:"pfe-card"},{$ref:"raw"}]}},footer:{title:"Footer",type:"array",namedSlot:!0,maxItems:3,items:{oneOf:[{$ref:"pfe-cta"},{$ref:"raw"}]}}}}},{key:"tag",get:function(){return"pfe-card"}},{key:"observedAttributes",get:function(){return["pfe-color","pfe-img-src","pfe-size"]}},{key:"PfeType",get:function(){return e.PfeTypes.Container}}]),t(n,[{key:"connectedCallback",value:function(){d(n.prototype.__proto__||Object.getPrototypeOf(n.prototype),"connectedCallback",this).call(this),this.imageSrc&&this._imgSrcChanged("pfe-img-src","",this.imageSrc),this._observer.observe(this,{childList:!0})}},{key:"disconnectedCallback",value:function(){this._observer.disconnect()}},{key:"attributeChangedCallback",value:function(e,r,t){var a;d(n.prototype.__proto__||Object.getPrototypeOf(n.prototype),"attributeChangedCallback",this).call(this,e,r,t),this[e=e.replace("pfe-","")]&&this[e].observer&&"function"==typeof(a=this[this[e].observer].bind(this))&&a(e,r,t)}},{key:"_basicAttributeChanged",value:function(e,r,t){this[e].value=t}},{key:"_colorChanged",value:function(e,r,t){this[e].value=t,this.context_update()}},{key:"_imgSrcChanged",value:function(e,r,t){this.style.backgroundImage=t?"url('"+t+"')":""}}]),n);function n(){r(this,n);var e=o(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,{type:n.PfeType}));return e._observer=new MutationObserver(function(){e._mapSchemaToSlots(e.tag,e.slots)}),e}return e.create(c),c}); +//# sourceMappingURL=pfe-card.umd.min.js.map diff --git a/js/pfe-card/dist/pfe-card.umd.min.js.map b/js/pfe-card/dist/pfe-card.umd.min.js.map new file mode 100644 index 00000000..a45924ac --- /dev/null +++ b/js/pfe-card/dist/pfe-card.umd.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"pfe-card.umd.min.js","sources":["../_temp/polyfills--pfe-card.js","../_temp/pfe-card.umd.js"],"sourcesContent":["// @POLYFILL Element.matches\n// https://developer.mozilla.org/en-US/docs/Web/API/Element/matches\nif (!Element.prototype.matches) {\n Element.prototype.matches =\n Element.prototype.msMatchesSelector ||\n Element.prototype.webkitMatchesSelector;\n}\n\n// @POLYFILL Element.closest\n// https://developer.mozilla.org/en-US/docs/Web/API/Element/closest\nif (!Element.prototype.closest) {\n Element.prototype.closest = function(s) {\n var el = this;\n do {\n if (el.matches(s)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n return null;\n };\n}\n\n// @POLYFILL Array.includes\n// https://tc39.github.io/ecma262/#sec-array.prototype.includes\nif (!Array.prototype.includes) {\n Object.defineProperty(Array.prototype, \"includes\", {\n value: function(valueToFind, fromIndex) {\n if (this == null) {\n throw new TypeError('\"this\" is null or not defined');\n }\n\n // 1. Let O be ? ToObject(this value).\n var o = Object(this);\n\n // 2. Let len be ? ToLength(? Get(O, \"length\")).\n var len = o.length >>> 0;\n\n // 3. If len is 0, return false.\n if (len === 0) {\n return false;\n }\n\n // 4. Let n be ? ToInteger(fromIndex).\n // (If fromIndex is undefined, this step produces the value 0.)\n var n = fromIndex | 0;\n\n // 5. If n ≥ 0, then\n // a. Let k be n.\n // 6. Else n < 0,\n // a. Let k be len + n.\n // b. If k < 0, let k be 0.\n var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);\n\n function sameValueZero(x, y) {\n return (\n x === y ||\n (typeof x === \"number\" &&\n typeof y === \"number\" &&\n isNaN(x) &&\n isNaN(y))\n );\n }\n\n // 7. Repeat, while k < len\n while (k < len) {\n // a. Let elementK be the result of ? Get(O, ! ToString(k)).\n // b. If SameValueZero(valueToFind, elementK) is true, return true.\n if (sameValueZero(o[k], valueToFind)) {\n return true;\n }\n // c. Increase k by 1.\n k++;\n }\n\n // 8. Return false\n return false;\n }\n });\n}\n","/*!\n * PatternFly Elements: PfeCard 1.0.0-prerelease.55\n * @license\n * Copyright 2020 Red Hat, Inc.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n * \n*/\n\n// Import polyfills: matches, closest, includes\nimport \"./polyfills--pfe-card.js\";\n\nimport PFElement from \"../../pfelement/dist/pfelement.umd\";\n\nclass PfeCard extends PFElement {\n static get version() {\n return \"1.0.0-prerelease.55\";\n }\n\n get html() {\n return `
\n \n
\n
\n \n
\n
\n \n
`;\n }\n\n static get properties() {\n return {\"color\":{\"title\":\"Background color\",\"type\":\"string\",\"enum\":[\"lightest\",\"base\",\"darker\",\"darkest\",\"complement\",\"accent\"],\"default\":\"base\",\"prefixed\":true,\"observer\":\"_colorChanged\"},\"img-src\":{\"title\":\"Background image\",\"type\":\"string\",\"observer\":\"_imgSrcChanged\"},\"size\":{\"title\":\"Padding size\",\"type\":\"string\",\"enum\":[\"small\"],\"observer\":\"_basicAttributeChanged\"}};\n }\n\n static get slots() {\n return {\"header\":{\"title\":\"Header\",\"type\":\"array\",\"namedSlot\":true,\"maxItems\":3,\"items\":{\"title\":\"Body item\",\"oneOf\":[{\"$ref\":\"raw\"}]}},\"body\":{\"title\":\"Body\",\"type\":\"array\",\"namedSlot\":false,\"items\":{\"oneOf\":[{\"$ref\":\"pfe-card\"},{\"$ref\":\"raw\"}]}},\"footer\":{\"title\":\"Footer\",\"type\":\"array\",\"namedSlot\":true,\"maxItems\":3,\"items\":{\"oneOf\":[{\"$ref\":\"pfe-cta\"},{\"$ref\":\"raw\"}]}}};\n }\n static get tag() {\n return \"pfe-card\";\n }\n\n get schemaUrl() {\n return \"pfe-card.json\";\n }\n\n get templateUrl() {\n return \"pfe-card.html\";\n }\n\n get styleUrl() {\n return \"pfe-card.scss\";\n }\n\n get imageSrc() {\n return this.getAttribute(\"pfe-img-src\");\n }\n\n get backgroundColor() {\n return this.getAttribute(\"pfe-color\") || \"base\";\n }\n\n static get observedAttributes() {\n return [\"pfe-color\", \"pfe-img-src\", \"pfe-size\"];\n }\n\n // Declare the type of this component\n static get PfeType() {\n return PFElement.PfeTypes.Container;\n }\n\n constructor() {\n super(PfeCard, { type: PfeCard.PfeType });\n this._observer = new MutationObserver(() => {\n this._mapSchemaToSlots(this.tag, this.slots);\n });\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n // Initialize the background image attachment\n if (this.imageSrc) {\n this._imgSrcChanged(\"pfe-img-src\", \"\", this.imageSrc);\n }\n\n this._observer.observe(this, { childList: true });\n }\n\n disconnectedCallback() {\n this._observer.disconnect();\n }\n\n attributeChangedCallback(attr, oldValue, newValue) {\n super.attributeChangedCallback(attr, oldValue, newValue);\n // Strip the prefix from the attribute\n attr = attr.replace(\"pfe-\", \"\");\n // If the observer is defined in the attribute properties\n if (this[attr] && this[attr].observer) {\n // Get the observer function\n let observer = this[this[attr].observer].bind(this);\n // If it's a function, allow it to run\n if (typeof observer === \"function\") observer(attr, oldValue, newValue);\n }\n }\n\n _basicAttributeChanged(attr, oldValue, newValue) {\n this[attr].value = newValue;\n }\n\n // Update the color attribute and contexts\n _colorChanged(attr, oldValue, newValue) {\n this[attr].value = newValue;\n // Trigger an update in nested components\n this.context_update();\n }\n\n // Update the background image\n _imgSrcChanged(attr, oldValue, newValue) {\n // Set the image as the background image\n this.style.backgroundImage = newValue ? `url('${newValue}')` : ``;\n }\n}\n\nPFElement.create(PfeCard);\n\nexport { PfeCard as default };\n"],"names":["Element","prototype","matches","msMatchesSelector","webkitMatchesSelector","closest","s","el","this","parentElement","parentNode","nodeType","Array","includes","defineProperty","valueToFind","fromIndex","TypeError","o","Object","len","length","x","y","n","k","Math","max","abs","isNaN","PfeCard","PFElement","getAttribute","color","title","type","enum","default","prefixed","observer","img-src","size","header","namedSlot","maxItems","items","oneOf","$ref","body","footer","PfeTypes","Container","imageSrc","_imgSrcChanged","_observer","observe","childList","disconnect","attr","oldValue","newValue","replace","bind","value","context_update","style","backgroundImage","PfeType","MutationObserver","_mapSchemaToSlots","_this","tag","slots","create"],"mappings":"gUAEKA,QAAQC,UAAUC,kBACbD,UAAUC,QAChBF,QAAQC,UAAUE,mBAClBH,QAAQC,UAAUG,uBAKjBJ,QAAQC,UAAUI,kBACbJ,UAAUI,QAAU,SAASC,OAC/BC,EAAKC,OACN,IACGD,EAAGL,QAAQI,GAAI,OAAOC,IACrBA,EAAGE,eAAiBF,EAAGG,iBACd,OAAPH,GAA+B,IAAhBA,EAAGI,iBACpB,OAMNC,MAAMX,UAAUY,iBACZC,eAAeF,MAAMX,UAAW,WAAY,OAC1C,SAASc,EAAaC,MACf,MAARR,WACI,IAAIS,UAAU,qCAIlBC,EAAIC,OAAOX,MAGXY,EAAMF,EAAEG,SAAW,KAGX,GAARD,SACK,MAccE,EAAGC,EATtBC,EAAgB,EAAZR,EAOJS,EAAIC,KAAKC,IAAS,GAALH,EAASA,EAAIJ,EAAMM,KAAKE,IAAIJ,GAAI,QAa1CC,EAAIL,GAAK,KAXOE,EAcHJ,EAAEO,OAdIF,EAcAR,IAXR,iBAANO,GACO,iBAANC,GACPM,MAAMP,IACNO,MAAMN,UASD,aAOJ,yuBC5CPO,+TAAgBC,44eA+BX,0DAIA,uDAIA,wDAIAvB,KAAKwB,aAAa,8DAIlBxB,KAAKwB,aAAa,cAAgB,+CA7ClC,+DAkBA,CAACC,MAAQ,CAACC,MAAQ,mBAAmBC,KAAO,SAASC,KAAO,CAAC,WAAW,OAAO,SAAS,UAAU,aAAa,UAAUC,QAAU,OAAOC,UAAW,EAAKC,SAAW,iBAAiBC,UAAU,CAACN,MAAQ,mBAAmBC,KAAO,SAASI,SAAW,kBAAkBE,KAAO,CAACP,MAAQ,eAAeC,KAAO,SAASC,KAAO,CAAC,SAASG,SAAW,+DAIpV,CAACG,OAAS,CAACR,MAAQ,SAASC,KAAO,QAAQQ,WAAY,EAAKC,SAAW,EAAEC,MAAQ,CAACX,MAAQ,YAAYY,MAAQ,CAAC,CAACC,KAAO,UAAUC,KAAO,CAACd,MAAQ,OAAOC,KAAO,QAAQQ,WAAY,EAAME,MAAQ,CAACC,MAAQ,CAAC,CAACC,KAAO,YAAY,CAACA,KAAO,UAAUE,OAAS,CAACf,MAAQ,SAASC,KAAO,QAAQQ,WAAY,EAAKC,SAAW,EAAEC,MAAQ,CAACC,MAAQ,CAAC,CAACC,KAAO,WAAW,CAACA,KAAO,6CAGtW,4DAwBA,CAAC,YAAa,cAAe,mDAK7BhB,EAAUmB,SAASC,8JActB3C,KAAK4C,eACFC,eAAe,cAAe,GAAI7C,KAAK4C,eAGzCE,UAAUC,QAAQ/C,KAAM,CAAEgD,WAAW,wDAIrCF,UAAUG,8DAGQC,EAAMC,EAAUC,OAOjCrB,yGANyBmB,EAAMC,EAAUC,GAI3CpD,OAFGkD,EAAKG,QAAQ,OAAQ,MAEVrD,KAAKkD,GAAMnB,UAIH,mBAFpBA,EAAW/B,KAAKA,KAAKkD,GAAMnB,UAAUuB,KAAKtD,QAEV+B,EAASmB,EAAMC,EAAUC,kDAI1CF,EAAMC,EAAUC,QAChCF,GAAMK,MAAQH,wCAIPF,EAAMC,EAAUC,QACvBF,GAAMK,MAAQH,OAEdI,wDAIQN,EAAMC,EAAUC,QAExBK,MAAMC,gBAAkBN,UAAmBA,uGAhD1C9B,EAAS,CAAEK,KAAML,EAAQqC,oBAC1Bb,UAAY,IAAIc,iBAAiB,aAC/BC,kBAAkBC,EAAKC,IAAKD,EAAKE,kBAkD5CzC,EAAU0C,OAAO3C"} \ No newline at end of file diff --git a/js/pfe-card/package.json b/js/pfe-card/package.json new file mode 100644 index 00000000..7ded6243 --- /dev/null +++ b/js/pfe-card/package.json @@ -0,0 +1,89 @@ +{ + "_args": [ + [ + "@patternfly/pfe-card@1.0.0-prerelease.56", + "/home/runner/work/jbossorg.github.io/jbossorg.github.io" + ] + ], + "_from": "@patternfly/pfe-card@1.0.0-prerelease.56", + "_id": "@patternfly/pfe-card@1.0.0-prerelease.56", + "_inBundle": false, + "_integrity": "sha512-CBeRB/1eVzpXw6Y/hnp9/5AwF0FwCU/7xwfLrRDiN4krmEVcsjlYX4V8ugEiZBybgrXx3PtPpJZ5uPQMqrfLkA==", + "_location": "/@patternfly/pfe-card", + "_phantomChildren": {}, + "_requested": { + "type": "version", + "registry": true, + "raw": "@patternfly/pfe-card@1.0.0-prerelease.56", + "name": "@patternfly/pfe-card", + "escapedName": "@patternfly%2fpfe-card", + "scope": "@patternfly", + "rawSpec": "1.0.0-prerelease.56", + "saveSpec": null, + "fetchSpec": "1.0.0-prerelease.56" + }, + "_requiredBy": [ + "/" + ], + "_resolved": "https://registry.npmjs.org/@patternfly/pfe-card/-/pfe-card-1.0.0-prerelease.56.tgz", + "_spec": "1.0.0-prerelease.56", + "_where": "/home/runner/work/jbossorg.github.io/jbossorg.github.io", + "bugs": { + "url": "https://github.com/patternfly/patternfly-elements/issues" + }, + "contributors": [ + { + "name": "Mark Caron", + "email": "mark@redhat.com", + "url": "https://github.com/markcaron" + }, + { + "name": "Kendall Totten" + }, + { + "name": "castastrophe", + "url": "https://www.github.com/castastrophe" + } + ], + "dependencies": { + "@patternfly/pfelement": "^1.0.0-prerelease.56" + }, + "description": "Cards for PatternFly Elements", + "devDependencies": { + "@patternfly/pfe-sass": "^1.0.0-prerelease.56" + }, + "files": [ + "dist" + ], + "generator-pfelement-version": "0.5.0", + "gitHead": "efed86135e85925182445801ab89570b3bcec5ca", + "homepage": "https://github.com/patternfly/patternfly-elements#readme", + "keywords": [ + "web-components", + "html" + ], + "license": "MIT", + "main": "./dist/pfe-card.umd.js", + "module": "./dist/pfe-card.js", + "name": "@patternfly/pfe-card", + "pfelement": { + "className": "PfeCard", + "elementName": "pfe-card" + }, + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/patternfly/patternfly-elements.git", + "directory": "elements/pfe-card" + }, + "scripts": { + "build": "../../node_modules/.bin/gulp && ../../node_modules/.bin/prettier --ignore-path ../../.prettierignore --write '**/*.{js,json}'", + "dev": "../../node_modules/.bin/gulp dev", + "test": "../../node_modules/.bin/wct --configFile ../../wct.conf.json elements/pfe-card/test/", + "watch": "../../node_modules/.bin/gulp watch" + }, + "unpkg": "./dist/pfe-card.umd.min.js", + "version": "1.0.0-prerelease.56" +} diff --git a/js/pfe-cta/LICENSE.txt b/js/pfe-cta/LICENSE.txt new file mode 100644 index 00000000..599bd61b --- /dev/null +++ b/js/pfe-cta/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright 2020 Red Hat, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/js/pfe-cta/README.md b/js/pfe-cta/README.md new file mode 100644 index 00000000..db217e99 --- /dev/null +++ b/js/pfe-cta/README.md @@ -0,0 +1,160 @@ +# PFElements Call-to-action Element + +`pfe-cta` is a call-to-action (CTA) element, that stands out from regular hypertext links, and is used for linking users to webpages. + +_Note: `pfe-cta` is not necessarily a button, though it may look like one visually._ + +## Usage + +```html + + GitHub + + + + Learn more about PFElements + + + + Red Hat + + + + Red Hat + + + + Learn more about PFElements + + + + Red Hat + +``` + +## Slots + +### Default slot + +We expect an anchor tag, `` with an `href`, to be the first child inside `pfe-cta` element. Less preferred but allowed for specific use-cases include: `