diff --git a/.eslintignore b/.eslintignore index 86f4257f41..d37c6ca864 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,2 +1,6 @@ **/webpack.config.js vendor +docs/js/*.min.js +docs/js/custom.js +docs/js/docs.switcher.js +docs/js/instantsearch.js \ No newline at end of file diff --git a/docs/ai_actions/ai_actions_guide.md b/docs/ai_actions/ai_actions_guide.md index 06f5cdf23e..2572994a9b 100644 --- a/docs/ai_actions/ai_actions_guide.md +++ b/docs/ai_actions/ai_actions_guide.md @@ -8,7 +8,7 @@ month_change: false ## What are AI Actions Wherever you look, artificial intelligence becomes more and more important by enhancing user interaction and automating complex processes. -[[= product_name =]] can be equipped with the AI Actions [LTS update](ibexa_dxp_v4.6.md#lts-updates), which harnesses AI's potential to automate time-consuming editorial tasks. +[[= product_name =]] can be equipped with the AI Actions [LTS update](editions#lts-updates), which harnesses AI's potential to automate time-consuming editorial tasks. AI Actions is an extensible solution for integrating features provided by AI services into your workflows, all managed through a user-friendly interface. Out-of-the-box, AI Actions solution includes two essential components: a framework package and an OpenAI connector package. diff --git a/docs/css/front-page.css b/docs/css/front-page.css index 6189b60abf..e15209b5c4 100644 --- a/docs/css/front-page.css +++ b/docs/css/front-page.css @@ -1,37 +1,39 @@ html { - height: 100%; } + height: 100%; +} body { margin: 0; font-family: "Noto Sans"; letter-spacing: 0.12px; - line-height: 1.5; } + line-height: 1.5; +} .md-typeset .front-page h1, .md-typeset .front-page h2 { line-height: 1.2; font-weight: 600; - font-family: "Work Sans"; } - + font-family: "Work Sans"; +} .md-typeset .front-page h1 { font-size: 28px; - margin-bottom: 32px; } - + margin-bottom: 32px; +} .md-typeset .front-page h2 { font-size: 22px; margin-top: 8px; - margin-bottom: 0; } - + margin-bottom: 0; +} .md-typeset .front-page .row { padding-top: 12px; padding-bottom: 12px; margin: 0 -12px; align-items: stretch; - row-gap: 24px; } - + row-gap: 24px; +} .md-typeset .front-page .col-12 { padding-left: 12px; - padding-right: 12px; } - + padding-right: 12px; +} .md-typeset .front-page .info-tile { border: 1px solid #ececf1; border-radius: 12px; @@ -40,176 +42,256 @@ body { align-items: center; flex: 1; box-shadow: 4px 22px 47px rgba(52, 116, 204, 0.05); - height: 100%; } - .md-typeset .front-page .info-tile--link-card { - padding: 24px; } - .md-typeset .front-page .info-tile--link-card .info-tile__content { - font-size: 14px; - margin-bottom: 0; } - .md-typeset .front-page .info-tile--link-card h3 svg { - fill: #ae1164; - width: 16px; - height: 16px; - margin-right: 4px; } - .md-typeset .front-page .info-tile--link-card a { - color: #131c26; - text-decoration: underline; } - .md-typeset .front-page .info-tile__circle { - width: 72px; - height: 72px; - border-radius: 50%; - margin: 12px; - display: flex; - justify-content: center; - align-items: center; - flex-shrink: 0; } - .md-typeset .front-page .info-tile__content { - padding: 0 4px; - margin-bottom: 18px; - height: 100%; - font-size: 12px; - line-height: 18px; - color: #71767c; - display: flex; - flex-direction: column; - justify-content: center; - flex-grow: 1; } - .md-typeset .front-page .info-tile__content:first-child { - padding-left: 0; } - .md-typeset .front-page .info-tile__content:last-child { - padding-right: 0; } - .md-typeset .front-page .info-tile__content strong { - font-family: "Work Sans"; - display: block; - font-weight: 600; - font-size: 22px; - line-height: 26px; - margin-top: 8px; - color: #131c26; } - .md-typeset .front-page .info-tile__details { - display: flex; - justify-content: flex-end; - align-items: center; - font-size: 10px; - color: #ae1164; } - .md-typeset .front-page .info-tile__arrow-icon { - width: 13px; - height: 13px; - margin-left: 4px; - fill: #ae1164; } - .md-typeset .front-page .info-tile h3 { - font-size: 18px; - font-weight: 600; - margin: 0 0 8px; - padding: 4px; } - .md-typeset .front-page .info-tile h3 a { - text-decoration: none; } - .md-typeset .front-page .info-tile ul { - margin: 0 0 0 12px; - list-style: none; - margin-left: 24px; } - .md-typeset .front-page .info-tile ul li { - padding: 4px; - margin: 0; } - .md-typeset .front-page .info-tile ul li + li { - margin-top: 16px; } - + height: 100%; +} +.md-typeset .front-page .info-tile--link-card { + padding: 24px; +} +.md-typeset .front-page .info-tile--link-card .info-tile__content { + font-size: 14px; + margin-bottom: 0; +} +.md-typeset .front-page .info-tile--link-card h3 svg { + fill: #ae1164; + width: 16px; + height: 16px; + margin-right: 4px; +} +.md-typeset .front-page .info-tile--link-card a { + color: #131c26; + text-decoration: underline; +} +.md-typeset .front-page .info-tile__circle { + width: 72px; + height: 72px; + border-radius: 50%; + margin: 12px; + display: flex; + justify-content: center; + align-items: center; + flex-shrink: 0; +} +.md-typeset .front-page .info-tile__content { + padding: 0 4px; + margin-bottom: 18px; + height: 100%; + font-size: 12px; + line-height: 18px; + color: #71767c; + display: flex; + flex-direction: column; + justify-content: center; + flex-grow: 1; +} +.md-typeset .front-page .info-tile__content:first-child { + padding-left: 0; +} +.md-typeset .front-page .info-tile__content:last-child { + padding-right: 0; +} +.md-typeset .front-page .info-tile__content strong { + font-family: "Work Sans"; + display: block; + font-weight: 600; + font-size: 22px; + line-height: 26px; + margin-top: 8px; + color: #131c26; +} +.md-typeset .front-page .info-tile__details { + display: flex; + justify-content: flex-end; + align-items: center; + font-size: 10px; + color: #ae1164; +} +.md-typeset .front-page .info-tile__arrow-icon { + width: 13px; + height: 13px; + margin-left: 4px; + fill: #ae1164; +} +.md-typeset .front-page .info-tile h3 { + font-size: 18px; + font-weight: 600; + margin: 0 0 8px; + padding: 4px; +} +.md-typeset .front-page .info-tile h3 a { + text-decoration: none; +} +.md-typeset .front-page .info-tile ul { + margin: 0 0 0 12px; + list-style: none; + margin-left: 24px; +} +.md-typeset .front-page .info-tile ul li { + padding: 4px; + margin: 0; +} +.md-typeset .front-page .info-tile ul li + li { + margin-top: 16px; +} .md-typeset .front-page a.info-tile:hover { border-color: #ae1164; box-shadow: 0px 22px 24px 0px rgba(174, 17, 100, 0.1); - text-decoration: none; } - + text-decoration: none; +} +.md-typeset .front-page .notifications { + margin-top: 30px; + margin-bottom: 40px; +} .md-typeset .front-page .notification { - background-color: #f3f3f6; border-radius: 12px; color: #131c26; font-size: 12px; padding: 32px; - margin: 30px 40px 40px 0; - position: relative; } - .md-typeset .front-page .notification__content { - padding-right: 260px; - padding-bottom: 32px; } - .md-typeset .front-page .notification__content h2 { - margin: 0 0 14px; } - .md-typeset .front-page .notification__content a { - color: #131c26; - text-decoration: underline; } - .md-typeset .front-page .notification__content a:hover { - color: #3474cc; } - .md-typeset .front-page .notification__cta a { - display: inline-block; - background: linear-gradient(to right, #db0032 0%, #ae1164 100%); - color: #ffffff; - text-decoration: none; - padding: 15px 16px; - border-radius: 12px; - font-size: 14px; } - .md-typeset .front-page .notification__image { - position: absolute; - right: -40px; - top: -30px; - height: 272px; } - .md-typeset .front-page .notification__image img { - height: 275px; } - + position: relative; + overflow: hidden; + display: flex; + flex-direction: column; + flex: 1 1 0; +} +.md-typeset .front-page .notification__content { + padding-bottom: 32px; + position: relative; + z-index: 1; + height: 100%; +} +.md-typeset .front-page .notification__content h2 { + margin: 0 0 8px; + line-height: 1.5; +} +.md-typeset .front-page .notification__content a { + color: #131c26; + text-decoration: underline; +} +.md-typeset .front-page .notification__content a:hover { + color: #3474cc; +} +.md-typeset .front-page .notification__cta { + position: relative; + z-index: 1; + flex-shrink: 0; +} +.md-typeset .front-page .notification__cta a { + display: inline-block; + text-decoration: none; + padding: 15px 16px; + border-radius: 12px; + font-size: 14px; + color: #ae1164; +} +.md-typeset .front-page .notification__cta a + a { + margin-left: 8px; +} +.md-typeset .front-page .notification__image { + position: absolute; + right: 0; + top: 0; + height: 100%; + z-index: 0; +} +.md-typeset .front-page .notification__image img { + height: 100%; +} +.md-typeset .front-page .notification--latest-release { + background-image: url("../images/background-gradient.svg"); + background-size: cover; + height: calc(100% - 4px); +} +.md-typeset .front-page .notification--latest-release .notification__content { + padding-right: 240px; +} +.md-typeset .front-page .notification--latest-release .notification__cta a { + background: linear-gradient(to right, #db0032 0%, #ae1164 100%); + color: #ffffff; +} +.md-typeset .front-page .notification--lts-update { + border: 2px solid #e0e0e8; + height: 100%; + padding-top: 30px; +} +.md-typeset .front-page .notification--lts-update .notification__cta a:first-child { + border: 1px solid #ae1164; +} .md-typeset .front-page .accordion { border: 1px solid #ececf1; border-radius: 12px; - padding: 12px; } - .md-typeset .front-page .accordion details { - margin: 0; - padding: 0; - border: none; } - .md-typeset .front-page .accordion details[open] { - box-shadow: none; } - .md-typeset .front-page .accordion details[open] summary { - border-bottom: 1px solid #e0e0e8; - padding-bottom: 16px; - margin-bottom: 16px; } - .md-typeset .front-page .accordion details[open] summary .accordion__toggler svg { - transform: rotate(180deg); } - .md-typeset .front-page .accordion details[open] .row { - padding: 8px; - font-size: 14px; } - .md-typeset .front-page .accordion details[open] .row a { - color: #131c26; - text-decoration: underline; } - .md-typeset .front-page .accordion details[open] .row a:hover { - color: #3474cc; } - .md-typeset .front-page .accordion details[open] .row ul { - margin: 0 0 0 12px; - list-style: none; } - .md-typeset .front-page .accordion details[open] .row ul li { - padding: 4px; - margin: 0; } - .md-typeset .front-page .accordion details[open] .row ul li + li { - margin-top: 16px; } - .md-typeset .front-page .accordion summary { - padding: 4px 8px; - margin: 0; - list-style: none; - border: none; - display: flex; - align-items: center; - cursor: pointer; - user-select: none; } - .md-typeset .front-page .accordion summary::before, .md-typeset .front-page .accordion summary::after, .md-typeset .front-page .accordion summary::marker, .md-typeset .front-page .accordion summary::-webkit-details-marker { - display: none; } - .md-typeset .front-page .accordion summary h2 { - margin: 0; - flex-grow: 1; } - .md-typeset .front-page .accordion summary .accordion__toggler { - flex-shrink: 0; } - .md-typeset .front-page .accordion summary .accordion__toggler svg { - width: 13px; - height: 13px; - transform-origin: center; - transition: transform 0.3s; } + padding: 12px; +} +.md-typeset .front-page .accordion details { + margin: 0; + padding: 0; + border: none; +} +.md-typeset .front-page .accordion details[open] { + box-shadow: none; +} +.md-typeset .front-page .accordion details[open] summary { + border-bottom: 1px solid #e0e0e8; + padding-bottom: 16px; + margin-bottom: 16px; +} +.md-typeset .front-page .accordion details[open] summary .accordion__toggler svg { + transform: rotate(180deg); +} +.md-typeset .front-page .accordion details[open] .row { + padding: 8px; + font-size: 14px; +} +.md-typeset .front-page .accordion details[open] .row a { + color: #131c26; + text-decoration: underline; +} +.md-typeset .front-page .accordion details[open] .row a:hover { + color: #3474cc; +} +.md-typeset .front-page .accordion details[open] .row ul { + margin: 0 0 0 12px; + list-style: none; +} +.md-typeset .front-page .accordion details[open] .row ul li { + padding: 4px; + margin: 0; +} +.md-typeset .front-page .accordion details[open] .row ul li + li { + margin-top: 16px; +} +.md-typeset .front-page .accordion summary { + padding: 4px 8px; + margin: 0; + list-style: none; + border: none; + display: flex; + align-items: center; + cursor: pointer; + user-select: none; +} +.md-typeset .front-page .accordion summary::before, .md-typeset .front-page .accordion summary::after, .md-typeset .front-page .accordion summary::marker, .md-typeset .front-page .accordion summary::-webkit-details-marker { + display: none; +} +.md-typeset .front-page .accordion summary h2 { + margin: 0; + flex-grow: 1; +} +.md-typeset .front-page .accordion summary .accordion__toggler { + flex-shrink: 0; +} +.md-typeset .front-page .accordion summary .accordion__toggler svg { + width: 13px; + height: 13px; + transform-origin: center; + transition: transform 0.3s; +} @media (min-width: 1900px) { .bootstrap-iso .col-fhd-3 { -webkit-box-flex: 0; -ms-flex: 0 0 25%; flex: 0 0 25%; - max-width: 25%; } } + max-width: 25%; + } +} + +/*# sourceMappingURL=front-page.css.map */ diff --git a/docs/css/release-notes.css b/docs/css/release-notes.css new file mode 100644 index 0000000000..476dc3b908 --- /dev/null +++ b/docs/css/release-notes.css @@ -0,0 +1,282 @@ +.release-notes-header h1, +.release-notes h1 { + font-size: 24px; +} +.release-notes-header h2, +.release-notes h2 { + font-size: 20px; +} +.release-notes-header h3, +.release-notes h3 { + font-size: 18px; +} +.release-notes-header h4, +.release-notes h4 { + font-size: 16px; +} +.release-notes-header h5, +.release-notes h5 { + font-size: 14px; +} +.release-notes-header h6, +.release-notes h6 { + font-size: 12px; +} + +.release-notes-header { + display: flex; + justify-content: space-between; + align-items: center; + border-bottom: 1px solid #DCDDDE; + padding: 8px 0; +} +.release-notes-header h1 { + line-height: 1.5; + margin: 0; +} + +.release-notes { + margin-top: 24px; +} +.release-notes p:empty { + display: none; +} + +.release-notes-filters { + display: flex; + justify-content: flex-end; + font-size: 14px; + line-height: 1.5; + height: 24px; +} +.release-notes-filters__visible-items { + display: flex; + padding-right: 24px; +} +.release-notes-filters__visible-item { + padding: 4px 24px 4px 8px; + margin-left: 8px; + background-color: #ECECF1; + border-radius: 16px; + font-size: 12px; + position: relative; +} +.release-notes-filters__visible-item--hidden { + display: none; +} +.release-notes-filters__visible-item-remove { + display: inherit; + position: absolute; + top: 50%; + right: 5px; + width: 16px; + height: 16px; + transform: translateY(-50%); + cursor: pointer; +} +.release-notes-filters__visible-item-remove::before, .release-notes-filters__visible-item-remove::after { + content: ""; + width: 1px; + height: 12px; + background: #131C26; + position: absolute; + top: 50%; + left: 50%; +} +.release-notes-filters__visible-item-remove::before { + transform: translate(50%, -50%) rotate(-45deg); +} +.release-notes-filters__visible-item-remove::after { + transform: translate(50%, -50%) rotate(45deg); +} +.release-notes-filters__widget { + position: relative; +} +.release-notes-filters__widget--expanded .release-notes-filters__btn { + color: #A32768; +} +.release-notes-filters__widget--expanded .release-notes-filters__btn svg { + fill: #A32768; +} +.release-notes-filters__widget--expanded .release-notes-filters__items { + display: block; +} +.release-notes-filters__btn { + cursor: pointer; + display: flex; + align-items: center; + height: 24px; +} +.release-notes-filters__btn:hover { + color: #A32768; +} +.release-notes-filters__btn:hover svg { + fill: #A32768; +} +.release-notes-filters__btn-icon { + position: relative; + display: inline-flex; + align-items: center; + margin-right: 8px; +} +.release-notes-filters__btn-icon::after { + position: absolute; + z-index: 1; + right: 0; + top: 0; + display: none; + content: ""; + background-color: #C4234A; + width: 6px; + height: 6px; + border-radius: 50%; +} +.release-notes-filters__btn-icon--selected::after { + display: block; +} +.release-notes-filters__items { + position: absolute; + z-index: 10; + bottom: 0; + left: 50%; + padding: 8px; + transform: translate(-50%, 100%); + border: 1px solid #DCDDDE; + background-color: #FFFFFF; + border-radius: 8px; + display: none; +} +.release-notes-filters__item { + padding: 8px; + white-space: nowrap; +} +.release-notes-filters__item label { + cursor: pointer; +} +.release-notes-filters__item input[type=checkbox] { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + position: relative; + cursor: pointer; + background-color: #FFFFFF; + width: 16px; + height: 16px; + border-radius: 2px; + outline: none; + transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1); + border: 1px solid #71767C; + margin: 0 8px -2.5px 0; +} +.release-notes-filters__item input[type=checkbox]::after { + content: " "; + position: absolute; + top: 3px; + left: 3px; + display: block; + width: 8px; + height: 5px; + border-left: 2px solid transparent; + border-bottom: 2px solid transparent; + transform: rotate(-45deg); +} +.release-notes-filters__item input[type=checkbox]:hover { + border-color: #AE1164; +} +.release-notes-filters__item input[type=checkbox]:focus { + border-color: #AE1164; + box-shadow: 0 0 0 4px rgba(174, 17, 100, 0.25); +} +.release-notes-filters__item input[type=checkbox]:checked { + border-color: #AE1164; + background-color: #AE1164; +} +.release-notes-filters__item input[type=checkbox]:checked::after { + border-color: #FFFFFF; +} + +.release-note { + position: relative; + font-size: 14px; + line-height: 1.5; + padding-left: 24px; + padding-bottom: 36px; +} +.release-note__tags { + display: flex; + padding: 4px 0 8px; +} +.release-note__tag { + font-size: 12px; + padding: 1px 8px; + border: 1px solid; + margin-right: 8px; +} +.release-note__tag--headless { + color: #C4234A; + border-color: #C4234A; +} +.release-note__tag--experience { + color: #D3822B; + border-color: #D3822B; +} +.release-note__tag--commerce { + color: #A32768; + border-color: #A32768; +} +.release-note__tag--lts-update { + color: #5DA7C0; + border-color: #5DA7C0; +} +.release-note__tag--new-feature { + color: #2C9445; + border-color: #2C9445; +} +.release-note__date { + color: #71767C; + margin-bottom: 24px; +} +.release-note h2 { + line-height: 1.5; + margin: 0; +} +.release-note p { + margin: 0 0 12px; +} +.release-note p:last-child { + margin-bottom: 0; +} +.release-note::before { + display: block; + content: ""; + position: absolute; + z-index: 1; + left: 0; + top: 11px; + width: 9px; + height: 9px; + border: 1px solid #A32768; + border-radius: 50%; +} +.release-note::after { + display: block; + content: ""; + position: absolute; + z-index: 0; + top: 19px; + left: 4px; + width: 1px; + height: calc(100% - 8px); + background-color: #E0E0E8; +} +.release-note:last-of-type { + padding-bottom: 0; +} +.release-note:last-of-type::after { + height: calc(100% - 19px); +} +.release-note--hidden { + display: none; +} + +/*# sourceMappingURL=release-notes.css.map */ diff --git a/docs/ibexa_products/editions.md b/docs/ibexa_products/editions.md index d4d62332ae..345a33517e 100644 --- a/docs/ibexa_products/editions.md +++ b/docs/ibexa_products/editions.md @@ -53,4 +53,14 @@ Compare all features available in [[= product_name_headless =]], [[= product_nam | [Cart](cart.md) | | | ✔ | | [Checkout](checkout.md) | | | ✔ | | [Storefront](storefront.md) | | | ✔ | -| [Transactional emails](transactional_emails.md) | | | ✔ | \ No newline at end of file +| [Transactional emails](transactional_emails.md) | | | ✔ | + +## LTS Updates + +LTS Updates are opt-in packages that bring additional features to the [LTS releases](release_process_and_roadmap.md#long-term-support-releases) that they enhance. +The features brought by LTS Updates become standard parts of the next LTS release. + +| Feature | [[= product_name_headless =]] | [[= product_name_exp =]] | [[= product_name_com =]] | +|-----------------|-----------------|-----------------|-----------------| +| [AI Actions](ai_actions_guide.md) | ✔ | ✔ | ✔ | +| [Date and time attribute type](date_and_time.md) | ✔ | ✔ | ✔ | diff --git a/docs/images/background-gradient.svg b/docs/images/background-gradient.svg new file mode 100644 index 0000000000..e08806a186 --- /dev/null +++ b/docs/images/background-gradient.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/docs/images/filters.svg b/docs/images/filters.svg new file mode 100644 index 0000000000..575da38f6d --- /dev/null +++ b/docs/images/filters.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/images/icons.svg b/docs/images/icons.svg index 033ce2e546..ff79aae458 100644 --- a/docs/images/icons.svg +++ b/docs/images/icons.svg @@ -44,5 +44,15 @@ - + + + + + + + + + + + \ No newline at end of file diff --git a/docs/images/notification-latest-release.svg b/docs/images/notification-latest-release.svg new file mode 100644 index 0000000000..547a0a0b51 --- /dev/null +++ b/docs/images/notification-latest-release.svg @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/images/notification-lts-update.svg b/docs/images/notification-lts-update.svg new file mode 100644 index 0000000000..1901c3bbd3 --- /dev/null +++ b/docs/images/notification-lts-update.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/docs/index.md b/docs/index.md index 8ecac6ee8b..991594fadf 100644 --- a/docs/index.md +++ b/docs/index.md @@ -71,22 +71,38 @@ -
-
-
+
+
+
+
+

The latest release is [[= latest_tag_4_6 =]]

+
The latest version of Ibexa DXP is [[= latest_tag_4_6 =]]. You can now update your application to the latest version.
+
+ +
+ The latest release +
+
+
+
+
-

The latest release is v4.6

-
The latest version of Ibexa DXP is v4.6. You can now update your application to the latest version.
-
The newest LTS Update to Ibexa DXP v4.6 is the Date and time attribute type. Install it to add time-related values to product specifications.
+

The newest LTS Update is the Date and time attribute type

+
Install it to add time-related values to product specifications.
- The latest release + LTS Update
+
+
diff --git a/docs/js/release-notes.js b/docs/js/release-notes.js new file mode 100644 index 0000000000..4fd8675cf0 --- /dev/null +++ b/docs/js/release-notes.js @@ -0,0 +1,74 @@ +(function (global, doc) { + const filtersContainer = doc.querySelector('.release-notes-filters'); + + if (!filtersContainer) { + return; + } + + const filterItemsWidget = filtersContainer.querySelector('.release-notes-filters__widget'); + const filterItemsBtn = filterItemsWidget.querySelector('.release-notes-filters__btn'); + const filterItemsBtnIcon = filterItemsBtn.querySelector('.release-notes-filters__btn-icon'); + const filterItemsContainer = filterItemsWidget.querySelector('.release-notes-filters__items'); + const filterItems = filterItemsContainer.querySelectorAll('.release-notes-filters__item input[type="checkbox"]'); + const visibleItemsContainer = filtersContainer.querySelector('.release-notes-filters__visible-items'); + const visibleItems = visibleItemsContainer.querySelectorAll('.release-notes-filters__visible-item'); + const releaseNotesNodes = doc.querySelectorAll('.release-note'); + const releaseNotesItems = [...releaseNotesNodes].map((releaseNotesNode) => { + const tagsNodes = releaseNotesNode.querySelectorAll('.release-note__tag'); + const tagsItems = [...tagsNodes].map((tagNode) => `filter-${tagNode.dataset.filter}`); + + return { + node: releaseNotesNode, + tags: tagsItems, + }; + }); + const handleClickOutside = ({ target }) => { + if (filterItemsWidget.contains(target)) { + return; + } + + filterItemsWidget.classList.toggle('release-notes-filters__widget--expanded', false); + removeClickOutsideEventListener(); + }; + const addClickOutsideEventListener = () => { + doc.body.addEventListener('click', handleClickOutside, false); + }; + const removeClickOutsideEventListener = () => { + doc.body.removeEventListener('click', handleClickOutside, false); + }; + + filterItemsBtn.addEventListener('click', () => { + filterItemsWidget.classList.toggle('release-notes-filters__widget--expanded'); + addClickOutsideEventListener(); + }); + + filterItems.forEach((filterItem) => { + filterItem.addEventListener('change', () => { + const checkedItems = [...filterItems].filter(({ checked }) => checked).map(({ id }) => id); + + releaseNotesItems.forEach(({ node, tags }) => { + const isVisible = checkedItems.length === 0 || tags.some((tag) => checkedItems.includes(tag)); + + node.classList.toggle('release-note--hidden', !isVisible); + }); + visibleItems.forEach((visibleItem) => { + const isVisible = checkedItems.includes(visibleItem.dataset.filter); + + visibleItem.classList.toggle('release-notes-filters__visible-item--hidden', !isVisible); + }); + filterItemsBtnIcon.classList.toggle('release-notes-filters__btn-icon--selected', checkedItems.length > 0); + }, false); + }); + + visibleItems.forEach((visibleItem) => { + const visibleItemsRemoveBtn = visibleItem.querySelector('.release-notes-filters__visible-item-remove'); + const tagName = visibleItem.dataset.filter; + + visibleItemsRemoveBtn.addEventListener('click', () => { + const itemCheckbox = filterItemsContainer.querySelector(`#${tagName}`); + + itemCheckbox.click(); + }); + }); + +})(window, window.document); diff --git a/docs/release_notes/ibexa_dxp_v4.6.md b/docs/release_notes/ibexa_dxp_v4.6.md index 9440460f92..652b51bd06 100644 --- a/docs/release_notes/ibexa_dxp_v4.6.md +++ b/docs/release_notes/ibexa_dxp_v4.6.md @@ -4,29 +4,258 @@ description: Ibexa DXP v4.6 brings improvements to Commerce, PIM and Personaliza -# Ibexa DXP v4.6 +[[= release_notes_filters('Ibexa DXP v4.6 LTS', ['Headless', 'Experience', 'Commerce', 'LTS Update', 'New feature']) =]] -**Version number**: v4.6 +
-**Release date**: February 13, 2024 +[[% set version = 'v4.6.18' %]] +[[= release_note_entry_begin("Ibexa DXP " + version, '2025-03-06', ['Headless', 'Experience', 'Commerce']) =]] -**Release type**: [LTS](https://support.ibexa.co/Public/service-life) +#### PHP API +The PHP API has been enhanced with the following new classes: -**Update**: [v4.5.x to v4.6](https://doc.ibexa.co/en/latest/update_and_migration/from_4.5/update_from_4.5/) +- [`Ibexa\Contracts\ProductCatalog\Form\Data\ProductSelectorData`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Form-Data-ProductSelectorData.html) +- [`Ibexa\Contracts\ProductCatalog\Form\Data\ProductsSelectorData`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Form-Data-ProductsSelectorData.html) +- [`Ibexa\Contracts\ProductCatalog\Form\Type\ProductSelectorType`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Form-Type-ProductSelectorType.html) +#### Full changelog +[[% include 'snippets/release_46.md' %]] -## LTS Updates +[[= release_note_entry_end() =]] -LTS Updates are opt-in packages that bring cutting-edge technologies to an LTS release that they enhance, without compromising the product's stability. -The features brought by an LTS Update become a standard part of the next LTS release. - -### Date and time attribute type +[[= release_note_entry_begin("Date and time attribute", '2025-03-04', ['Headless', 'Experience', 'Commerce', 'LTS Update', 'New feature']) =]] The Date and time attributes allow you to represent date and time values as part of the product specification in the [Product Information Management](pim_guide.md) system. For more information, see [Date and time attributes](date_and_time.md). -### AI Actions +[[= release_note_entry_end() =]] + +[[% set version = 'v4.6.17' %]] +[[= release_note_entry_begin("AI Actions " + version, '2025-03-04', ['LTS Update', 'New feature']) =]] + +#### Features +You can now [duplicate AI actions]([[= user_doc =]]/) in the AI actions list. + +#### PHP API + +The PHP API has been expanded with the following classes and interfaces: + +- [`Ibexa\Contracts\ConnectorAi\ActionConfiguration\ActionConfigurationCopyStruct`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionConfiguration-ActionConfigurationCopyStruct.html) +- [`Ibexa\Contracts\ConnectorAi\ActionHandlerRegistryInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-ActionHandlerRegistryInterface.html) +- [`Ibexa\Contracts\ConnectorAi\Prompt\PromptFactory`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Prompt-PromptFactory.html) +- [`Ibexa\Contracts\ConnectorAi\Prompt\PromptInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-Prompt-PromptInterface.html) +- [`Ibexa\Contracts\ConnectorAi\PromptResolverInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorAi-PromptResolverInterface.html) + +[[= release_note_entry_end() =]] +[[= release_note_entry_begin("Ibexa DXP " + version, '2025-03-04', ['Headless', 'Experience', 'Commerce', 'New feature']) =]] +#### Security + +This release includes security fixes. +To learn more, see the [corresponding security advisory](https://developers.ibexa.co/security-advisories/ibexa-sa-2025-001-vulnerabilities-in-shopping-cart-and-publish-unscheduling). + +#### Features + +- New REST API endpoints for [Segments](../api/rest_api/rest_api_reference/rest_api_reference.html#segments) and [Segment Groups](../api/rest_api/rest_api_reference/rest_api_reference.html#segment-groups) +- PHP API Client ([`Ibexa\Contracts\Connect\ConnectClientInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-ConnectClientInterface.html)) for [Ibexa Connect]([[= connect_doc =]]) +- The following Twig functions now additionally support objects implementing the [`ContentAwareInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-ContentAwareInterface.html) as arguments: + - [`ibexa_content_field_identifier_first_filled_image`](image_twig_functions.md#ibexa_content_field_identifier_first_filled_image) + - [`ibexa_content_name`](content_twig_functions.md#ibexa_content_name) + - [`ibexa_field_is_empty`](field_twig_functions.md#ibexa_field_is_empty) + - [`ibexa_field_description`](field_twig_functions.md#ibexa_field_description) + - [`ibexa_field_name`](field_twig_functions.md#ibexa_field_name) + - [`ibexa_field_value`](field_twig_functions.md#ibexa_field_value) + - [`ibexa_field`](field_twig_functions.md#ibexa_field) + - [`ibexa_has_field`](field_twig_functions.md#ibexa_has_field) + - [`ibexa_render_field`](field_twig_functions.md#ibexa_render_field) + - [`ibexa_seo_is_empty`](content_twig_functions.md#ibexa_seo_is_empty) + - [`ibexa_seo`](content_twig_functions.md#ibexa_seo) + - [`ibexa_taxonomy_entries_for_content`](content_twig_functions.md#ibexa_taxonomy_entries_for_content-filter) +- Added new Twig filter for product attributes grouping: [`ibexa_product_catalog_group_attributes`](product_twig_functions.md#ibexa_product_catalog_group_attributes) + +#### PHP API + +The PHP API has been enhanced with the following new classes and interfaces: + +- `Ibexa\Contracts\Cart`: + - [`Value\Query\Criterion\LogicalAnd`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Cart-Value-Query-Criterion-LogicalAnd.html) + - [`Value\Query\Criterion\OwnerCriterion`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Cart-Value-Query-Criterion-OwnerCriterion.html) + - [`Value\Query\CriterionInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Cart-Value-Query-CriterionInterface.html) +- `Ibexa\Contracts\Segmentation`: + - [`Exception\ValidationFailedExceptionInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Segmentation-Exception-ValidationFailedExceptionInterface.html) +- `Ibexa\Contracts\ProductCatalog`: + - [`Iterator\BatchIteratorAdapter\RegionFetchAdapter`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Iterator-BatchIteratorAdapter-RegionFetchAdapter.html) +- `Ibexa\Contracts\Connect`: + - [`ConnectClientInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-ConnectClientInterface.html) + - [`Exception\BadResponseException`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Exception-BadResponseException.html) + - [`Exception\UnserializablePayload`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Exception-UnserializablePayload.html) + - [`Exception\UnserializableResponse`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Exception-UnserializableResponse.html) + - [`PaginationInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-PaginationInterface.html) + - [`Resource\DataStructure\DataStructureBuilder`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Resource-DataStructure-DataStructureBuilder.html) + - [`Resource\DataStructure\DataStructureCreateStruct`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Resource-DataStructure-DataStructureCreateStruct.html) + - [`Resource\DataStructure\DataStructureFilter`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Resource-DataStructure-DataStructureFilter.html) + - [`Resource\DataStructure\DataStructureProperty`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Resource-DataStructure-DataStructureProperty.html) + - [`Resource\DataStructure\DataStructurePropertyType`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Resource-DataStructure-DataStructurePropertyType.html) + - [`Resource\DataStructureInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Resource-DataStructureInterface.html) + - [`Resource\Hook\HookCreateStruct`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Resource-Hook-HookCreateStruct.html) + - [`Resource\Hook\HookFilter`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Resource-Hook-HookFilter.html) + - [`Resource\Hook\HookSetDetailsStruct`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Resource-Hook-HookSetDetailsStruct.html) + - [`Resource\HookInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Resource-HookInterface.html) + - [`Resource\Scenario\ScenarioCreateStruct`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Resource-Scenario-ScenarioCreateStruct.html) + - [`Resource\Scenario\ScenarioFilter`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Resource-Scenario-ScenarioFilter.html) + - [`Resource\ScenarioInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Resource-ScenarioInterface.html) + - [`Resource\Team\TeamVariableCreateStruct`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Resource-Team-TeamVariableCreateStruct.html) + - [`Resource\Team\TeamVariableFilter`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Resource-Team-TeamVariableFilter.html) + - [`Resource\Team\TeamVariableUpdateStruct`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Resource-Team-TeamVariableUpdateStruct.html) + - [`Resource\TeamInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Resource-TeamInterface.html) + - [`Resource\Template\TemplateCreateStruct`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Resource-Template-TemplateCreateStruct.html) + - [`Resource\Template\TemplateFilter`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Resource-Template-TemplateFilter.html) + - [`Resource\TemplateInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Resource-TemplateInterface.html) + - [`Response\DataStructure\CreateResponse`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Response-DataStructure-CreateResponse.html) + - [`Response\DataStructure\ListResponse`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Response-DataStructure-ListResponse.html) + - [`Response\DataStructure\RetrieveResponse`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Response-DataStructure-RetrieveResponse.html) + - [`Response\Hook\CreateResponse`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Response-Hook-CreateResponse.html) + - [`Response\Hook\ListResponse`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Response-Hook-ListResponse.html) + - [`Response\Hook\RetrieveResponse`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Response-Hook-RetrieveResponse.html) + - [`Response\Hook\SetDetailsResponse`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Response-Hook-SetDetailsResponse.html) + - [`Response\Scenario\CreateResponse`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Response-Scenario-CreateResponse.html) + - [`Response\Scenario\ListResponse`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Response-Scenario-ListResponse.html) + - [`Response\Scenario\RetrieveResponse`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Response-Scenario-RetrieveResponse.html) + - [`Response\Team\TeamVariableCreateResponse`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Response-Team-TeamVariableCreateResponse.html) + - [`Response\Team\TeamVariableListResponse`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Response-Team-TeamVariableListResponse.html) + - [`Response\Team\TeamVariableRetrieveResponse`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Response-Team-TeamVariableRetrieveResponse.html) + - [`Response\Team\TeamVariableUpdateResponse`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Response-Team-TeamVariableUpdateResponse.html) + - [`Response\Template\BlueprintResponse`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Response-Template-BlueprintResponse.html) + - [`Response\Template\CreateResponse`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Response-Template-CreateResponse.html) + - [`Response\Template\ListResponse`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Response-Template-ListResponse.html) + - [`Response\Template\RetrieveResponse`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Response-Template-RetrieveResponse.html) + - [`ResponseInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-ResponseInterface.html) + - [`TransportInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-TransportInterface.html) + - [`Value\Blueprint\Flow`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Value-Blueprint-Flow.html) + - [`Value\Blueprint\Metadata\Scenario`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Value-Blueprint-Metadata-Scenario.html) + - [`Value\Blueprint\Metadata`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Value-Blueprint-Metadata.html) + - [`Value\Blueprint\Module\CustomWebhook`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Value-Blueprint-Module-CustomWebhook.html) + - [`Value\Blueprint\Module\JsonCreate`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Value-Blueprint-Module-JsonCreate.html) + - [`Value\Blueprint\Module\ModuleDesigner`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Value-Blueprint-Module-ModuleDesigner.html) + - [`Value\Blueprint\Module\WebhookRespond`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Value-Blueprint-Module-WebhookRespond.html) + - [`Value\Blueprint`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Value-Blueprint.html) + - [`Value\Controller`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Value-Controller.html) + - [`Value\Scheduling`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Connect-Value-Scheduling.html) + +#### Full changelog +[[% include 'snippets/release_46.md' %]] +[[= release_note_entry_end() =]] + +[[% set version = 'v4.6.16' %]] +[[= release_note_entry_begin("AI Actions " + version, '2025-01-16', ['LTS Update', 'New feature']) =]] + +#### Features + +The new AI Assistant allows you to use the AI capabilities in additional places, including RichText, Text line, Text Block fields, and certain Page Builder blocks. + +[[= release_note_entry_end() =]] + +[[= release_note_entry_begin("Ibexa DXP " + version, '2025-01-16', ['Headless', 'Experience', 'Commerce']) =]] + +#### PHP API + +The PHP API has been enhanced with the following new classes: + +- [`Ibexa\Contracts\AdminUi\Permission\PermissionCheckContextProviderInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-AdminUi-Permission-PermissionCheckContextProviderInterface.html) +- [`Ibexa\Contracts\AdminUi\Values\PermissionCheckContext`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-AdminUi-Values-PermissionCheckContext.html) +- [`Ibexa\Contracts\Checkout\Discounts\DataMapper\DiscountsDataMapperInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Checkout-Discounts-DataMapper-DiscountsDataMapperInterface.html) +- [`Ibexa\Contracts\Seo\Resolver\FieldValueResolverInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Seo-Resolver-FieldValueResolverInterface.html) + +#### Full changelog +[[% include 'snippets/release_46.md' %]] +[[= release_note_entry_end() =]] + +[[% set version = 'v4.6.15' %]] +[[= release_note_entry_begin("AI Actions " + version, '2024-12-13', ['LTS Update', 'New feature']) =]] + +#### REST API + +The REST API has been extended to include endpoints for: + +- [Action Configurations](../api/rest_api/rest_api_reference/rest_api_reference.html#ai-actions-list-action-configurations) +- [Action Types](../api/rest_api/rest_api_reference/rest_api_reference.html#ai-actions-list-action-types) +[[= release_note_entry_end() =]] + + +[[= release_note_entry_begin("Ibexa DXP " + version, '2024-12-13', ['Headless', 'Experience', 'Commerce', 'New feature']) =]] + +### Features + +You can now reuse Page Builder blocks between landing pages using the ["Copy block" action]([[= user_doc =]]/content_management/create_edit_pages/#copy-blocks). + +#### PHP API +The PHP API has been enhanced with the following new classes and interfaces: + +- [`Ibexa\Contracts\ProductCatalog\Values\Price\PriceEnvelopeInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Price-PriceEnvelopeInterface.html) +- [`Ibexa\Contracts\ProductCatalog\Values\Price\PriceStampInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Price-PriceStampInterface.html) +- [`Ibexa\Contracts\ProductCatalog\Values\StampInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-StampInterface.html) + +#### Full changelog +[[% include 'snippets/release_46.md' %]] +[[= release_note_entry_end() =]] + +[[% set version = 'v4.6.14' %]] +[[= release_note_entry_begin("Ibexa DXP " + version, '2024-11-28', ['Headless', 'Experience', 'Commerce']) =]] + +#### Security +This release includes security fixes. +To learn more, see the [corresponding security advisory](https://developers.ibexa.co/security-advisories/ibexa-sa-2024-006-vulnerabilities-in-content-name-pattern-commerce-shop-and-varnish-vhost-templates). + +#### UX Improvements + +- The identifiers for content types and field definitions are now autogenerated based on the provided name +- You can now search in [Trash]([[= user_doc =]]/content_management/content_organization/copy_move_hide_content/#remove-content) by content's name + +#### Search + +- New search criterion: [IsUserEnabled](isuserenabled_criterion.md) + +#### PHP API + +The PHP API has been enhanced with the following new classes and interfaces: + +- [`Ibexa\Contracts\Core\Validation\AbstractValidationStructWrapper`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Validation-AbstractValidationStructWrapper.html) +- [`Ibexa\Contracts\Core\Validation\StructValidator`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Validation-StructValidator.html) +- [`Ibexa\Contracts\Core\Validation\StructWrapperValidator`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Validation-StructWrapperValidator.html) +- [`Ibexa\Contracts\Core\Validation\ValidationFailedException`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Validation-ValidationFailedException.html) +- [`Ibexa\Contracts\Core\Validation\ValidationStructWrapperInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Validation-ValidationStructWrapperInterface.html) +- [`Ibexa\Contracts\Notifications\SystemNotification\SystemMessage`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Notifications-SystemNotification-SystemMessage.html) +- [`Ibexa\Contracts\Notifications\SystemNotification\SystemNotification`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Notifications-SystemNotification-SystemNotification.html) +- [`Ibexa\Contracts\Notifications\SystemNotification\SystemNotificationInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Notifications-SystemNotification-SystemNotificationInterface.html) +- [`Ibexa\Contracts\Notifications\Value\Recipent\UserRecipientInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Notifications-Value-Recipent-UserRecipientInterface.html) +- [`Ibexa\Contracts\ProductCatalog\ProductReferencesResolverStrategy`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-ProductReferencesResolverStrategy.html) +- [`Ibexa\Contracts\ProductCatalog\Values\Product\Query\Criterion\UpdatedAt`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Product-Query-Criterion-UpdatedAt.html) +- [`Ibexa\Contracts\ProductCatalog\Values\Product\Query\Criterion\UpdatedAtRange`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Values-Product-Query-Criterion-UpdatedAtRange.html) + +#### Full changelog +[[% include 'snippets/release_46.md' %]] +[[= release_note_entry_end() =]] + +[[% set version = 'v4.6.13' %]] +[[= release_note_entry_begin("Ibexa DXP " + version, '2024-10-22', ['Headless', 'Experience', 'Commerce']) =]] + +#### PHP API + +The PHP API has been enhanced with the following new classes and interfaces: + +- [Ibexa\Contracts\CoreSearch\Persistence\CriterionMapper\AbstractCompositeCriterionMapper](../api/php_api/php_api_reference/classes/Ibexa-Contracts-CoreSearch-Persistence-CriterionMapper-AbstractCompositeCriterionMapper.html) +- [Ibexa\Contracts\CoreSearch\Persistence\CriterionMapper\AbstractFieldCriterionMapper](../api/php_api/php_api_reference/classes/Ibexa-Contracts-CoreSearch-Persistence-CriterionMapper-AbstractFieldCriterionMapper.html) +- [Ibexa\Contracts\Rest\Output\Exceptions\AbstractExceptionVisitor](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Rest-Output-Exceptions-AbstractExceptionVisitor.html) +- [Ibexa\Contracts\CoreSearch\Values\Query\CriterionMapper](../api/php_api/php_api_reference/classes/Ibexa-Contracts-CoreSearch-Values-Query-CriterionMapper.html) + +#### Full changelog + +[[% include 'snippets/release_46.md' %]] +[[= release_note_entry_end() =]] + +[[% set version = 'v4.6.12' %]] + +[[= release_note_entry_begin("AI Actions", '2024-10-04', ['Headless', 'Experience', 'Commerce', 'LTS Update', 'New feature']) =]] The AI Actions LTS update enhances the usability and flexibility of [[=product_name=]] v4.6 LTS by harnessing the potential of artificial intelligence to automate time-consuming editorial tasks. By default, the AI Actions feature can help users with their work in following scenarios: @@ -34,19 +263,187 @@ By default, the AI Actions feature can help users with their work in following s - Refining text: when editing a content item, users can request that a passage selected in online editor is modified, for example, by adjusting the length of the text, changing its tone, or correcting linguistic errors. - Generating alternative text: when working with images, users can ask AI to generate alternative text for them, which helps improve accessibility and SEO. -![AI Assistant](../ai_actions/img/ai_assistant.png) +![AI Assistant](ai_assistant.png) + +For more information, see [AI Actions product guide](ai_actions_guide.md). + +[[= release_note_entry_end() =]] + + +[[= release_note_entry_begin("Ibexa DXP " + version, '2024-10-04', ['Headless', 'Experience', 'Commerce']) =]] + +#### PHP API + +The PHP API has been enhanced with the following new classes and interfaces: + +- [Ibexa\Contracts\AdminUi\Menu\AbstractFormContextMenuBuilder](../api/php_api/php_api_reference/classes/Ibexa-Contracts-AdminUi-Menu-AbstractFormContextMenuBuilder.html) +- [Ibexa\Contracts\AdminUi\Menu\CopyFormContextMenuBuilder](../api/php_api/php_api_reference/classes/Ibexa-Contracts-AdminUi-Menu-CopyFormContextMenuBuilder.html) +- [Ibexa\Contracts\AdminUi\Menu\CreateFormContextMenuBuilder](../api/php_api/php_api_reference/classes/Ibexa-Contracts-AdminUi-Menu-CreateFormContextMenuBuilder.html) +- [Ibexa\Contracts\AdminUi\Menu\MenuItemFactoryInterface](../api/php_api/php_api_reference/classes/Ibexa-Contracts-AdminUi-Menu-MenuItemFactoryInterface.html) +- [Ibexa\Contracts\AdminUi\Menu\UpdateFormContextMenuBuilder](../api/php_api/php_api_reference/classes/Ibexa-Contracts-AdminUi-Menu-UpdateFormContextMenuBuilder.html) +- [Ibexa\Contracts\Core\Pool\Pool](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Pool-Pool.html) +- [Ibexa\Contracts\Core\Pool\PoolInterface](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Pool-PoolInterface.html) +- [Ibexa\Contracts\CoreSearch\Values\Query\AbstractCriterionQuery](../api/php_api/php_api_reference/classes/Ibexa-Contracts-CoreSearch-Values-Query-AbstractCriterionQuery.html) +- [Ibexa\Contracts\CoreSearch\Values\Query\AbstractSortClause](../api/php_api/php_api_reference/classes/Ibexa-Contracts-CoreSearch-Values-Query-AbstractSortClause.html) +- [Ibexa\Contracts\CoreSearch\Values\Query\Criterion\AbstractCompositeCriterion](../api/php_api/php_api_reference/classes/Ibexa-Contracts-CoreSearch-Values-Query-Criterion-AbstractCompositeCriterion.html) +- [Ibexa\Contracts\CoreSearch\Values\Query\Criterion\CriterionInterface](../api/php_api/php_api_reference/classes/Ibexa-Contracts-CoreSearch-Values-Query-Criterion-CriterionInterface.html) +- [Ibexa\Contracts\CoreSearch\Values\Query\Criterion\FieldValueCriterion](../api/php_api/php_api_reference/classes/Ibexa-Contracts-CoreSearch-Values-Query-Criterion-FieldValueCriterion.html) +- [Ibexa\Contracts\CoreSearch\Values\Query\Criterion\LogicalAnd](../api/php_api/php_api_reference/classes/Ibexa-Contracts-CoreSearch-Values-Query-Criterion-LogicalAnd.html) +- [Ibexa\Contracts\CoreSearch\Values\Query\Criterion\LogicalOr](../api/php_api/php_api_reference/classes/Ibexa-Contracts-CoreSearch-Values-Query-Criterion-LogicalOr.html) +- [Ibexa\Contracts\CoreSearch\Values\Query\CriterionMapper](../api/php_api/php_api_reference/classes/Ibexa-Contracts-CoreSearch-Values-Query-CriterionMapper.html) +- [Ibexa\Contracts\CoreSearch\Values\Query\CriterionMapperInterface](../api/php_api/php_api_reference/classes/Ibexa-Contracts-CoreSearch-Values-Query-CriterionMapperInterface.html) +- [Ibexa\Contracts\CoreSearch\Values\Query\SortClause\FieldValueSortClause](../api/php_api/php_api_reference/classes/Ibexa-Contracts-CoreSearch-Values-Query-SortClause-FieldValueSortClause.html) +- [Ibexa\Contracts\CoreSearch\Values\Query\SortDirection](../api/php_api/php_api_reference/classes/Ibexa-Contracts-CoreSearch-Values-Query-SortDirection.html) +- [Ibexa\Contracts\ProductCatalog\Local\Attribute\ContextAwareValueValidatorInterface](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Local-Attribute-ContextAwareValueValidatorInterface.html) + +#### Full changelog + +[[% include 'snippets/release_46.md' %]] +[[= release_note_entry_end() =]] + +[[% set version = 'v4.6.11' %]] +[[= release_note_entry_begin("Ibexa DXP " + version, '2024-09-16', ['Headless', 'Experience', 'Commerce']) =]] + +#### Search +- New search criterion: [IsBookmarked](isbookmarked_criterion.md) + +#### PHP API +The PHP API has been enhanced with the following new classes and interfaces: -For more information, see [AI Actions product guide](../ai_actions/ai_actions_guide.md). +- [`Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion\Location\IsBookmarked`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Repository-Values-Content-Query-Criterion-Location-IsBookmarked.html) -## Notable changes +And the new methods are: -### [[= product_name_headless =]] +- [`Ibexa\Contracts\Core\Persistence\Bookmark\Handler::loadUserIdsByLocation()`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Persistence-Bookmark-Handler.html#method_loadUserIdsByLocation) +- [`Ibexa\Contracts\ProductCatalog\Local\LocalProductTypeServiceDecorator::addContentTypeFieldDefinition()`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Local-LocalProductTypeServiceDecorator.html#method_addContentTypeFieldDefinition) +- [`Ibexa\Contracts\ProductCatalog\Local\LocalProductTypeServiceDecorator::removeContentTypeFieldDefinition()`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Local-LocalProductTypeServiceDecorator.html#method_removeContentTypeFieldDefinition) +- [`Ibexa\Contracts\ProductCatalog\Local\LocalProductTypeServiceInterface::addContentTypeFieldDefinition()`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Local-LocalProductTypeServiceInterface.html#methods) +- [`Ibexa\Contracts\ProductCatalog\Local\LocalProductTypeServiceInterface::removeContentTypeFieldDefinition()`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ProductCatalog-Local-LocalProductTypeServiceInterface.html#method_removeContentTypeFieldDefinition) + +[[% include 'snippets/release_46.md' %]] +[[= release_note_entry_end() =]] + +[[% set version = 'v4.6.10' %]] +[[= release_note_entry_begin("Ibexa DXP " + version, '2024-08-14', ['Headless', 'Experience', 'Commerce']) =]] +#### Security + +This release includes security fixes. +To learn more, see the [corresponding security advisory](https://developers.ibexa.co/security-advisories/ibexa-sa-2024-005-persistent-xss-in-richtext). + +[[% include 'snippets/release_46.md' %]] +[[= release_note_entry_end() =]] + +[[% set version = 'v4.6.9' %]] +[[= release_note_entry_begin("Ibexa DXP " + version, '2024-07-31', ['Headless', 'Experience', 'Commerce']) =]] +#### Security + +This release includes security fixes. +To learn more, see the [corresponding security advisory](https://developers.ibexa.co/security-advisories/ibexa-sa-2024-004-dom-based-xss-in-file-upload). + +#### PHP API + +The PHP API has been enhanced with the following new classes and interfaces: + +- [`Ibexa\Contracts\ConnectorQualifio\Exception\QualifioException`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorQualifio-Exception-QualifioException.html) +- [`Ibexa\Contracts\ConnectorQualifio\Exception\CampaignFeedNotFoundException`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorQualifio-Exception-CampaignFeedNotFoundException.html) +- [`Ibexa\Contracts\ConnectorQualifio\Exception\CommunicationException`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorQualifio-Exception-CommunicationException.html) +- [`Ibexa\Contracts\ConnectorQualifio\Exception\NotConfiguredException`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-ConnectorQualifio-Exception-NotConfiguredException.html) + +[[% include 'snippets/release_46.md' %]] +[[= release_note_entry_end() =]] + +[[% set version = 'v4.6.8' %]] +[[= release_note_entry_begin("Ibexa DXP " + version, '2024-07-11', ['Headless', 'Experience', 'Commerce']) =]] + +#### PHP API + +The PHP API has been enhanced with the following new class: + +- [`Ibexa\Contracts\FieldTypeRichText\Configuration\ProviderConfiguratorInterface`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-FieldTypeRichText-Configuration-ProviderConfiguratorInterface.html) + +#### Full changelog + +[[% include 'snippets/release_46.md' %]] +[[= release_note_entry_end() =]] + +[[% set version = 'v4.6.7' %]] +[[= release_note_entry_begin("Ibexa DXP " + version, '2024-06-10', ['Headless', 'Experience', 'Commerce']) =]] + +#### PHP API + +The PHP API has been enhanced with the following new classes: + +- [`Ibexa\Contracts\Calendar\EventAction\EventActionCollection`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Calendar-EventAction-EventActionCollection.html) +- [`Ibexa\Contracts\Calendar\EventSource\InMemoryEventSource`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Calendar-EventSource-InMemoryEventSource.html) +- [`Ibexa\Contracts\Core\Event\Mapper\ResolveMissingFieldEvent`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-Event-Mapper-ResolveMissingFieldEvent.html) +- [`Ibexa\Contracts\Core\FieldType\DefaultDataFieldStorage`](../api/php_api/php_api_reference/classes/Ibexa-Contracts-Core-FieldType-DefaultDataFieldStorage.html) + +#### Full changelog + +[[% include 'snippets/release_46.md' %]] +[[= release_note_entry_end() =]] + +[[% set version = 'v4.6.6' %]] +[[= release_note_entry_begin("Ibexa DXP " + version, '2024-05-17', ['Headless', 'Experience', 'Commerce']) =]] +[[% include 'snippets/release_46.md' %]] +[[= release_note_entry_end() =]] + +[[% set version = 'v4.6.5' %]] +[[= release_note_entry_begin("Ibexa DXP " + version, '2024-05-14', ['Headless', 'Experience', 'Commerce']) =]] +[[% include 'snippets/release_46.md' %]] +[[= release_note_entry_end() =]] + +[[% set version = 'v4.6.4' %]] +[[= release_note_entry_begin("Ibexa DXP " + version, '2024-05-13', ['Headless', 'Experience', 'Commerce', 'New feature']) =]] +#### Security + +This release includes security fixes. +To learn more, see the [corresponding security advisory](https://developers.ibexa.co/security-advisories/ibexa-sa-2024-003-vulnerability-in-image-optimizer-dependency). + +### Ibexa Engage + +[Ibexa Engage](ibexa_engage.md) is a data collection tool you can use to engage your audiences. + +#### Full changelog + +[[% include 'snippets/release_46.md' %]] +[[= release_note_entry_end() =]] + +[[% set version = 'v4.6.3' %]] +[[= release_note_entry_begin("Ibexa DXP " + version, '2024-04-11', ['Headless', 'Experience', 'Commerce']) =]] +[[% include 'snippets/release_46.md' %]] +[[= release_note_entry_end() =]] + +[[% set version = 'v4.6.2' %]] +[[= release_note_entry_begin("Ibexa DXP " + version, '2024-03-20', ['Headless', 'Experience', 'Commerce']) =]] + +#### Security + +This release includes security fixes. +To learn more, see the [corresponding security advisory](https://developers.ibexa.co/security-advisories/ibexa-sa-2024-002-file-validation-and-workflow-stages). + +#### Full changelog + +[[% include 'snippets/release_46.md' %]] +[[= release_note_entry_end() =]] + +[[% set version = 'v4.6.1' %]] +[[= release_note_entry_begin("Ibexa DXP " + version, '2024-02-28', ['Headless', 'Experience', 'Commerce']) =]] +[[% include 'snippets/release_46.md' %]] +[[= release_note_entry_end() =]] + +[[% set version = 'v4.6.0' %]] +[[= release_note_entry_begin("Ibexa DXP " + version, '2024-02-13', ['Headless', 'Experience', 'Commerce', 'New feature']) =]] + +### Notable changes + +#### [[= product_name_headless =]] [[= product_name_content =]] changes name to [[= product_name_headless =]] to emphasize [[= product_name_base =]]'s capacity for headless architecture. The feature set and capabilities of the product remain the same. -### Customizable dashboard [[% include 'snippets/experience_badge.md' %]] [[% include 'snippets/commerce_badge.md' %]] +#### Customizable dashboard [[% include 'snippets/experience_badge.md' %]] [[% include 'snippets/commerce_badge.md' %]] Users can now customize the dashboard depending on their needs and preferences, select required blocks, and easily access important information. This solution uses an online editor - Dashboard Builder. @@ -57,11 +454,11 @@ and helps to make better business decisions based on data. For more information, see [Customizable dashboard](https://doc.ibexa.co/projects/userguide/en/master/getting_started/dashboard/dashboard/#customizable-dashboard). -### UX and UI improvements +#### UX and UI improvements Several improvements to the back office interface enhance the user experience. -#### Page Builder improvements [[% include 'snippets/experience_badge.md' %]] [[% include 'snippets/commerce_badge.md' %]] +##### Page Builder improvements [[% include 'snippets/experience_badge.md' %]] [[% include 'snippets/commerce_badge.md' %]] Page Builder user interface has new functionalities and improvements. @@ -80,7 +477,7 @@ Here are the most important changes: For more information, see [Page Builder interface](https://doc.ibexa.co/projects/userguide/en/master/content_management/create_edit_pages/#page-builder-interface). -#### Editing embedded content items +##### Editing embedded content items User can now edit embedded content items without leaving current window. This function is available in the Rich Text Field when creating content items, for selected blocks in the Page Builder, @@ -90,7 +487,7 @@ and while adding or modifying a Content relation. For more information, see [Edit embedded content items](https://doc.ibexa.co/projects/userguide/en/master/content_management/create_edit_content_items/#edit-embedded-content-items). -#### Focus mode +##### Focus mode With multiple changes to the back office UI intended to expose the most important information and actions, editors can now better focus on their work. The UI is now more friendly and appealing for marketers and editors, with simplified Content structure, designed with new and non-advanced users in mind. @@ -109,7 +506,7 @@ As part of this effort, some other changes were introduced that apply to both re ![Sub-items tab](img/4.6_sub_items_tab.png "Sub-items tab") -#### Ability to change site context +##### Ability to change site context With a drop-down list added to the top bar, which changes the site context, editors can choose that the content tree shows only those content items that belong to the selected website. And if content items belong to multiple websites but use different designs or languages depending on the SiteAccess settings, their previews also change. @@ -118,7 +515,7 @@ As part of this effort, the name of the "Sites" area of the main menu has change ![Site context selector](img/4.6_site_selector.png "Site context selector") -#### Distraction free mode +##### Distraction free mode While editing Rich Text Fields, user can switch to distraction free mode. It expands the workspace to full screen and shows only editor toolbar. @@ -127,20 +524,20 @@ It expands the workspace to full screen and shows only editor toolbar. For more information, see [Distraction free mode](https://doc.ibexa.co/projects/userguide/en/master/content_management/create_edit_content_items/#distraction-free-mode). -#### Simplified user actions +##### Simplified user actions Button text now precisely describes actions, so that users who create or edit content understand the purpose of each button. ![Improved button text](img/4.6_publishing_options.png "Improved button text") -#### Draft section added to Content +##### Draft section added to Content For streamlining purpose, the **Draft** section is now situated under **Content**. Users can now easily find and manage their drafts and published content from one area. ![Draft section added to Content](img/4.6_drafts.png "Draft section added to Content") -#### User profile and new options in user settings +##### User profile and new options in user settings With personal touch in mind, editors can now upload their photos (avatar), and provide the following information in their user profiles: @@ -158,7 +555,7 @@ Also, editors and other users can customize their experience even better, with n For more information, see [user profile and settings documentation](https://doc.ibexa.co/projects/userguide/en/master/getting_started/get_started/#edit-user-profile). -#### Recent activity log +##### Recent activity log Several actions on the repository or the application are logged. In the back office, last activity logs can be listed on a dedicated interface (Admin -> Activity list), @@ -168,9 +565,9 @@ on the dashboard within Recent activity block, or on the user profile. For more information, see feature's [User Documentation](https://doc.ibexa.co/projects/userguide/en/master/recent_activity/recent_activity/), and [Developer Documentation](https://doc.ibexa.co/en/master/administration/recent_activity/recent_activity/). -#### Back office search +##### Back office search -##### Search bar, suggestions, autocompletion, and spellcheck +###### Search bar, suggestions, autocompletion, and spellcheck The search bar can be focused with the shortcut Ctrl+/ (Windows, Linux) or Command+/ (Mac). @@ -182,7 +579,7 @@ For example, if the searched text is "Comany", the result page may ask "Did you For more information, see [User Documentation](https://doc.ibexa.co/projects/userguide/en/master/search/search_for_content/), and how to [customize autocompletion suggestions](https://doc.ibexa.co/en/master/administration/back_office/customize_search_suggestion/). -##### Filtering and sorting +###### Filtering and sorting The search result page can be sorted in other orders than relevance. Name, publication of modification dates, this can be extended. @@ -190,22 +587,22 @@ Filters can be applied to the search page to narrow down the results. For more information, see [User Documentation](https://doc.ibexa.co/projects/userguide/en/master/search/search_for_content/#filtered-search), and how to [customize search sorting](https://doc.ibexa.co/en/master/administration/back_office/customize_search_sorting/). -#### New and updated content type icons +##### New and updated content type icons To help users quickly identify different content types in the back office, all content type references are now accompanied with icons. Also, content type icons have changed slightly. ![Content type icons](img/4.6_content_type_icons.png "Content type icons") -### Ibexa Image picker +#### Ibexa Image picker Editors can now use a Digital Asset Management platform that enables storing media assets in a central location, organizing, distributing, and sharing them across many channels. For more information, see [Ibexa DAM](https://doc.ibexa.co/projects/userguide/en/master/dam/ibexa_dam/). -### New features and improvements in PIM +#### New features and improvements in PIM -#### Remote PIM support +##### Remote PIM support This release introduces a foundation for connecting [[= product_name =]] to other sources of product data. You can use it to implement a custom solution and connect to external PIM or ERP systems, import product data, and present it side-by-side with your organization's existing content, while managing product data in a remote system of your choice. @@ -228,14 +625,14 @@ Among other things, the Remote PIM support feature allows [[= product_name =]] c For more information about Remote PIM support and the solution's limitations, see [PIM product guide](https://doc.ibexa.co/en/master/pim/pim_guide/#limitations). -#### Virtual products +##### Virtual products With this feature, you can create virtual products - non-tangible items such as memberships, services, warranties. Default Checkout and Order workflows have been adjusted to allow purchase of virtual products. For more information, see [Create virtual products](https://doc.ibexa.co/projects/userguide/en/master/pim/create_virtual_product/). -#### Product page URLs +##### Product page URLs When you're creating a new product type, you can set up a product URL alias name pattern. With this feature, you can also create custom URL and URL alias name pattern field based on product attributes. @@ -243,7 +640,7 @@ Customized URLs are easier to remember, help with SEO optimization and reduce bo For more information, see [Product page URLs](https://doc.ibexa.co/projects/userguide/en/master/pim/work_with_product_page_urls/). -#### Improved UX of VAT rate assignment +##### Improved UX of VAT rate assignment Users who are creating or editing a product type are less likely to forget about setting VAT rates, because they now have a more prominent place. @@ -251,37 +648,37 @@ Users who are creating or editing a product type are less likely to forget about For more information, see [Create product types](https://doc.ibexa.co/projects/userguide/en/master/pim/create_product_types/). -#### Updated VAT configuration +##### Updated VAT configuration VAT rates configuration has been extended to accept additional flags under the `extras` key. Developers can use them, for example, to pass additional information to the UI, or define special exclusion rules. For more information, see [VAT rates](https://doc.ibexa.co/en/master/pim/pim_configuration/#vat-rates). -#### Ability to search through products in a catalog +##### Ability to search through products in a catalog When you're reviewing catalog details, on the **Products** tab, you can now see what criteria are used to include products in the catalog, and search for a specific product in the catalog. -#### New Twig functions +##### New Twig functions The `ibexa_is_pim_local` Twig helper has been introduced, which can be used in templates to [check whether product data comes from a local or remote data source](https://doc.ibexa.co/en/master/templating/twig_function_reference/storefront_twig_functions/#ibexa_is_pim_local), and adjust their behavior accordingly. Also, several new Twig functions have been implemented that help [get product availability information](https://doc.ibexa.co/en/master/templating/twig_function_reference/product_twig_functions/#ibexa_has_product_availability). -#### New and modified query types +##### New and modified query types The `ProductContentAwareListQueryType` has been created to allow finding products that come from a local database, while `ProductListQueryType` has been modified to find products from an external source of truth. -#### New Search Criterion +##### New Search Criterion With `IsVirtual` criterion that searches for virtual or physical products, product search now supports products of virtual and physical type. -#### Product migration +##### Product migration [Product variants](https://doc.ibexa.co/en/master/content_management/data_migration/importing_data/#product-variants) and [product assets](https://doc.ibexa.co/en/master/content_management/data_migration/importing_data/#product-assets) can now be created through [data migration](https://doc.ibexa.co/en/master/content_management/data_migration/data_migration/). -### New features and improvements in Commerce [[% include 'snippets/commerce_badge.md' %]] +#### New features and improvements in Commerce [[% include 'snippets/commerce_badge.md' %]] -#### Reorder +##### Reorder With the new Reorder feature, customers can effortlessly repurchase previously bought items directly from their order history with a single click, eliminating the need for manual item selection. @@ -290,14 +687,14 @@ This feature is exclusively accessible to logged-in users, ensuring a secure and For more information, see [reorder documentation](https://doc.ibexa.co/en/master/commerce/checkout/reorder/). -#### Orders block +##### Orders block Orders block displays a list of orders associated with a specific company or an individual customer. This block allows users to configure orders statuses, columns, number of orders, and sorting order. For more information, see [Orders block documentation](https://doc.ibexa.co/projects/userguide/en/master/content_management/block_reference/#orders-block). -#### Quick order +##### Quick order The quick order form allows users to streamline the process of placing orders with multiple items in bulk directly from the storefront. @@ -310,17 +707,17 @@ Quick order form is available to both registered and guest users. For more information, see [Quick order documentation](https://doc.ibexa.co/en/master/commerce/cart/quick_order/). -#### Cancel order +##### Cancel order This version allows you to customize order cancellations by defining a specific order status and related transition. For more information, see [Define cancel order](https://doc.ibexa.co/en/master/commerce/order_management/configure_order_management/#define-cancel-order). -#### Integrate with payment gateways +##### Integrate with payment gateways [[= product_name =]] can now be configured to integrate with various payment gateways, like Stripe and PayPal, by using the solution provided by [Payum](https://github.com/Payum). -#### Shipments +##### Shipments Users can now work with the shipments: view and modify their status, filter shipments in shipment lists and check all the details. You can access shipments for your own orders or all the shipments that exist in the system, depending on your permissions. @@ -329,14 +726,14 @@ You can access shipments for your own orders or all the shipments that exist in For more information, see [Work with shipments](https://doc.ibexa.co/projects/userguide/en/master/commerce/shipping_management/work_with_shipments/). -#### Owner criterion +##### Owner criterion Orders and shipments search now supports user reference: - `OwnerCriterion` Criterion searches for orders based on the user reference. - `Owner` Criterion searches for shipments based on the user reference. -#### Customize checkout workflow +##### Customize checkout workflow You can create a PHP definition of the new strategy that allows for workflow manipulation. Defining strategy allows to add conditional steps for workflow if needed. @@ -344,13 +741,13 @@ When a conditional step is added, the checkout process uses the specified workfl For more information, see [Create custom strategy](https://doc.ibexa.co/en/master/commerce/checkout/customize_checkout/#create-custom-strategy). -#### Manage multiple checkout workflows +##### Manage multiple checkout workflows When working with multiple checkout workflows, you can now specify the desired workflow by passing its name as an argument to the checkout initiation button or link. For more information, see [Manage multiple workflows](https://doc.ibexa.co/en/master/commerce/checkout/customize_checkout/#manage-multiple-workflows). -#### Adding context data to cart +##### Adding context data to cart Attach context data to both the Cart and its individual Cart Entries. This feature enhances the flexibility and customization of your e-commerce application, @@ -360,9 +757,9 @@ you can tailor the shopping experience for your customers and enhance the capabi For more information, see [Adding context data](https://doc.ibexa.co/en/master/commerce/cart/cart_api/#adding-context-data). -### New features and improvements in Personalization +#### New features and improvements in Personalization -#### Triggers +##### Triggers Triggers are push messages delivered to end users. With triggers, store managers can increase the engagement of their visitors and customers by delivering recommendations straight to their devices or mailboxes. @@ -379,27 +776,27 @@ The feature requires that your organization exposes an endpoint that passes data For more information, see [Email triggers](https://doc.ibexa.co/projects/userguide/en/master/personalization/triggers/). -#### Multiple attributes in recommendation computation +##### Multiple attributes in recommendation computation With this feature, you get an option to combine several attribute types when computing recommendations. As a result, users can be presented with recommendations from an intersection of submodel results. For more information, see [Submodel parameters](https://doc.ibexa.co/en/master/personalization/api_reference/recommendation_api/#submodel-parameters) and [Submodels](https://doc.ibexa.co/projects/userguide/en/latest/personalization/recommendation_models/#submodels). -#### New scenario filter +##### New scenario filter Depending on a setting that you make when defining a scenario, the recommendation response can now include either product variants or base products only. This way you can deliver more accurate recommendations and avoid showing multiple variants of the same product to the client. For more information, see [Commerce-specific filters](https://doc.ibexa.co/projects/userguide/en/latest/personalization/filters/#commerce-specific-filters). -## Other changes +### Other changes -### Expression Language +#### Expression Language New `project_dir()` expression language function that allows you to reference current project directory in YAML migration files. -### Site Factory events +#### Site Factory events Site Factory events have been moved from the `Ibexa\SiteFactory\ServiceEvent\Events` namespace to the `Ibexa\Contracts\SiteFactory\Events` namespace, keeping the backward compatibility. For a full list of events, see [Site events](https://doc.ibexa.co/en/latest/api/event_reference/site_events/). @@ -407,26 +804,26 @@ For a full list of events, see [Site events](https://doc.ibexa.co/en/latest/api/ Event handling system was improved with the addition of listeners based on `CreateSiteEvent`, `DeleteSiteEvent`, and `UpdateSiteEvent`. New listeners automatically grant permissions to log in to a site, providing a more seamless site management experience. -### Integration with Actito +#### Integration with Actito By using the Actito gateway you can send emails to the end-users about changes in the status of various operations in your commerce presence. -### Integration with Qualifio Engage +#### Integration with Qualifio Engage Use Qualifio Engage integration to create engaging marketing experiences to your customers. -### Integration with SeenThis! +#### Integration with SeenThis! Unlike conventional streaming services, integration with SeenThis! service provides an adaptive streaming technology with no limitations. It allows you to preserve the best video quality with a minimum amount of data transfer. For more information, see [SeenThis! block](https://doc.ibexa.co/projects/userguide/en/master/content_management/block_reference/#seenthis-block). -### API improvements +#### API improvements -#### REST API +##### REST API -##### REST API for shipping [[% include 'snippets/commerce_badge.md' %]] +###### REST API for shipping [[% include 'snippets/commerce_badge.md' %]] Endpoints that allow you to manage shipping methods and shipments by using REST API: @@ -439,13 +836,13 @@ Endpoints that allow you to manage shipping methods and shipments by using REST - GET `/shipping/method-types/{identifier}` - loads shipping methods type based on their identifiers - GET `/orders/order/{identifier}/shipments` - loads a list of shipments -##### REST API for company accounts [[% include 'snippets/experience_badge.md' %]] [[% include 'snippets/commerce_badge.md' %]] +###### REST API for company accounts [[% include 'snippets/experience_badge.md' %]] [[% include 'snippets/commerce_badge.md' %]] Endpoints that allow you to manage companies in your platform with REST API: - GET `/sales-representatives` - returns paginated list of available sales representatives -##### REST API for prices +###### REST API for prices Endpoints that allow you to manage prices in your platform with REST API: @@ -456,7 +853,7 @@ Endpoints that allow you to manage prices in your platform with REST API: - PATCH `/product/catalog/products/{code}/prices/{id}` - updates price or custom price for a given product - DELETE `/product/catalog/products/{code}/prices/{id}` - deletes price for a given product -##### New method signature +###### New method signature A signature for the `\Ibexa\Contracts\Rest\Output\Generator::startValueElement` method has been updated to the following: @@ -470,15 +867,15 @@ A signature for the `\Ibexa\Contracts\Rest\Output\Generator::startValueElement` Any third party code that extends `\Ibexa\Contracts\Rest\Output\Generator` needs to update the method signature accordingly. -### Helpers +#### Helpers A new helper method `ibexa.helpers.contentType.getContentTypeDataByHref` has been introduced to help you get content type data in JavaScript. -### [[= product_name_connect =]] +#### [[= product_name_connect =]] For a list of changes in [[= product_name_connect =]], see [Ibexa app release notes](https://doc.ibexa.co/projects/connect/en/latest/general/ibexa_app_release_notes/). -#### Scenario block +##### Scenario block New [[= product_name_connect =]] scenario block retrieves and displays data from an [[= product_name_connect =]] webhook. Scenario block is a regular Page block and can be configured on field definition level as any other block. @@ -486,22 +883,22 @@ You also need to configure scenario block in the Page Builder. To do it, you nee For more information, see [[[= product_name_connect =]] scenario block](https://doc.ibexa.co/en/master/content_management/pages/ibexa_connect_scenario_block/). -### DDEV +#### DDEV [[[= product_name =]] can officially be run on DDEV](https://ddev.readthedocs.io/en/latest/users/quickstart/#ibexa-dxp). For more information, see the [DDEV guide](https://doc.ibexa.co/en/master/getting_started/install_with_ddev/), which offers a step-by-step walkthrough for installing [[= product_name =]]. -### Customer Data Platform (CDP) +#### Customer Data Platform (CDP) In this release, the CDP configuration allows you to automate the process of exporting data. Users can now export not only Content, but also Users and Products data. For more information, see [CDP Activation](https://doc.ibexa.co/en/master/cdp/cdp_activation/cdp_activation/). -## Developer experience +### Developer experience -### New packages +#### New packages The following packages has been introduced in [[= product_name =]] v4.6.0: @@ -522,7 +919,7 @@ The following packages has been introduced in [[= product_name =]] v4.6.0: The ibexa/content package has been renamed to ibexa/headless. -### REST APIs +#### REST APIs [[= product_name =]] v4.6.0 adds REST API coverage for the following features: @@ -532,7 +929,7 @@ The following packages has been introduced in [[= product_name =]] v4.6.0: - Activity Log - UDW configuration (internal) -#### Endpoints list +##### Endpoints list The following endpoints have been added in 4.6.0 release (27 endpoints in total): @@ -566,7 +963,7 @@ The following endpoints have been added in 4.6.0 release (27 endpoints in total) | `ibexa.shipping.rest.shipment.create` | POST | ANY | ANY | `/api/ibexa/v2/orders/order/{orderIdentifier}/shipments` | | `ibexa.shipping.rest.shipment.update` | PATCH | ANY | ANY | `/api/ibexa/v2/shipments/{shipmentIdentifier}` | -### PHP API +#### PHP API - Autosave API (`\Ibexa\Contracts\AdminUi\Autosave\AutosaveServiceInterface`) - Activity Log API @@ -578,7 +975,7 @@ The following endpoints have been added in 4.6.0 release (27 endpoints in total) - ContentAware API (`\Ibexa\Contracts\Core\Repository\Values\Content\ContentAwareInterface`) - Sorting Definition API (`\Ibexa\Contracts\Search\SortingDefinition`) -### Search Criteria +#### Search Criteria Content @@ -596,11 +993,11 @@ Product - `\Ibexa\Contracts\ProductCatalog\Values\Product\Query\Criterion\IsVirtual` - `ProductStock` and `ProductStockRange` -### Sort Clauses +#### Sort Clauses - `\Ibexa\Contracts\ProductCatalog\Values\Product\Query\SortClause\ProductStock` -### Aggregations +#### Aggregations - Aggregation API for product catalog - Labeled ranges @@ -613,7 +1010,7 @@ Product - `\Ibexa\Contracts\Core\Repository\Values\Content\Search\AggregationResult\TermAggregationResult::getKeys` - `\Ibexa\Contracts\Core\Repository\Values\Content\Search\AggregationResult\RangeAggregationResult::getKeys` -### Events +#### Events The following events have been added in the v4.6.0 release (39 events in total): @@ -669,7 +1066,7 @@ The following events have been added in the v4.6.0 release (39 events in total): - `\Ibexa\Contracts\SiteFactory\Events\DeleteSiteEvent` - `\Ibexa\Contracts\SiteFactory\Events\UpdateSiteEvent` -### Twig functions +#### Twig functions - `ibexa_is_user_profile_available` - `ibexa_is_focus_mode_on` @@ -687,7 +1084,7 @@ The following events have been added in the v4.6.0 release (39 events in total): - `ibexa_taxonomy_entries_for_content` - `ibexa_url` / `ibexa_path` (support for content wrappers) -### View matchers +#### View matchers The following view matchers have been introduced in [[= product_name =]] v4.6.0: @@ -697,8 +1094,9 @@ The following view matchers have been introduced in [[= product_name =]] v4.6.0: - `\Ibexa\Taxonomy\View\Matcher\TaxonomyEntryBased\Level` - `\Ibexa\Taxonomy\View\Matcher\TaxonomyEntryBased\Taxonomy` -## Full changelog +### Full changelog + +[[% include 'snippets/release_46.md' %]] +[[= release_note_entry_end() =]] -| [[= product_name_headless =]] | [[= product_name_exp =]] | [[= product_name_com =]] | -|---------------|------------------|---------------| -| [[[= product_name_headless =]] v4.6](https://github.com/ibexa/headless/releases/tag/v4.6.0) | [[[= product_name_exp =]] v4.6](https://github.com/ibexa/experience/releases/tag/v4.6.0) | [[[= product_name_com =]] v4.6](https://github.com/ibexa/commerce/releases/tag/v4.6.0) | +
diff --git a/docs/snippets/release_46.md b/docs/snippets/release_46.md new file mode 100644 index 0000000000..dfc8ccce0a --- /dev/null +++ b/docs/snippets/release_46.md @@ -0,0 +1,11 @@ +[[% if version is not defined %]] + [[% set version = '' %]] +[[% endif %]] + +To learn more about all the included changes, see the full release change logs: + +- [[[= product_name_headless =]] [[= version =]]](https://github.com/ibexa/headless/releases/tag/[[= version =]]) +- [[[= product_name_exp =]] [[= version =]]](https://github.com/ibexa/experience/releases/tag/[[= version =]]) +- [[[= product_name_com =]] [[= version =]]](https://github.com/ibexa/commerce/releases/tag/[[= version =]]) + +To update your application, see the [update instructions](../update_and_migration/from_4.6/update_from_4.6.md#[[= version_to_anchor(version) =]]). diff --git a/docs/update_and_migration/from_4.6/update_from_4.6.md b/docs/update_and_migration/from_4.6/update_from_4.6.md index 289a51e3a2..dce5980c52 100644 --- a/docs/update_and_migration/from_4.6/update_from_4.6.md +++ b/docs/update_and_migration/from_4.6/update_from_4.6.md @@ -34,6 +34,10 @@ Then execute the instructions below starting from the version you're upgrading f +## v4.6.1 + +No additional steps needed. + ## v4.6.2 #### Database update @@ -105,6 +109,18 @@ Run the following scripts: psql < vendor/ibexa/installer/upgrade/db/postgresql/ibexa-4.6.3-to-4.6.4.sql ``` +## v4.6.5 + +No additional steps needed. + +## v4.6.6 + +No additional steps needed. + +## v4.6.7 + +No additional steps needed. + ## v4.6.8 To avoid deprecations when updating from an older PHP version to PHP 8.2 or 8.3, run the following commands: diff --git a/main.py b/main.py index 2b140533b4..0ee534c714 100644 --- a/main.py +++ b/main.py @@ -4,6 +4,7 @@ import urllib.request from mkdocs.structure.pages import Page from mkdocs.utils import meta +from typing import List CARDS_TEMPLATE = """
@@ -27,7 +28,6 @@ def define_env(env): - macro: a decorator function, to declare a macro. """ - @env.macro def include_file(filename, start_line=0, end_line=None, glue=''): """ @@ -114,3 +114,91 @@ def cards(pages, columns=1, style="cards", force_version=False): ) return """
%s
""" % (style, columns, "\n".join(cards)) + + @env.macro + def version_to_anchor(version : str = '') -> str: + return version.replace('.', '') + + @env.macro + def release_notes_filters(header : str, categories : List[str]) -> str: + validate_categories(categories) + + filters = "".join( + [""" +
+ {category} + +
+ """.format(category_slug=slugify(category), category=category) for category in categories]) + + categories_dropdown = "".join( + [""" +
+ + +
+ """.format(category_slug=slugify(category), category=category) for category in categories] + ) + + return """ +
+

{header}

+
+
+ {visible_filters} +
+
+ +
+ {categories_dropdown} +
+
+
+
+ """.format(header=header, visible_filters=filters, categories_dropdown=categories_dropdown) + + @env.macro + def release_note_entry_begin(header : str, date: str, categories : List[str]) -> str: + validate_categories(categories) + + category_badges = "".join( + [ + """ +
{category}
+ """.format(category_slug=slugify(category), category=category) + for category in categories + ] + ) + + return """ +
+## {header} +
+{category_badges} +
+
{date}
+""".format(header=header, date=date, category_badges=category_badges) + + @env.macro + def release_note_entry_end() -> str: + return "
" + + def slugify(text: str) -> str: + return text.lower().replace(' ', '-') + + def validate_categories(categories: List[str]) -> None: + available_categories = ['Headless', 'Experience', 'Commerce', 'LTS Update', 'New feature'] + + for category in categories: + if category not in available_categories: + raise ValueError( + "Unknown category: {category}. Available categories are: {available_categories}".format(category=category, available_categories=" ".join(available_categories)) + ) diff --git a/mkdocs.yml b/mkdocs.yml index 264c8307ed..2d036d2db6 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -956,6 +956,7 @@ extra_css: - css/navigation.css - css/search.css - css/docs.switcher.css + - css/release-notes.css - css/jquery-ui.min.css - '//cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.css' @@ -963,6 +964,7 @@ extra_javascript: - js/jquery.min.js - js/jquery-ui.min.js - js/custom.js + - js/release-notes.js - js/docs.switcher.js - '//cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.js' diff --git a/package.json b/package.json index 79d74fcc33..1516c22ea4 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "scss": "sass --watch scss:docs/css", "test": "yarn prettier-test && yarn eslint-test", "fix": "yarn prettier-test --write && yarn eslint-test --fix", - "eslint-test": "eslint \"./code_samples/**/*.js\"", + "eslint-test": "eslint \"./docs/js/**/*.js\"", "prettier-test": "yarn prettier \"./code_samples/**/*.{js,scss}\" --check" }, "prettier": "eslint-config-ibexa/prettier", diff --git a/scss/_variables.scss b/scss/_variables.scss new file mode 100644 index 0000000000..2e9f49de32 --- /dev/null +++ b/scss/_variables.scss @@ -0,0 +1,30 @@ +$transition-timing-function: cubic-bezier(0.25, 0.8, 0.25, 1); +$transition-duration: 0.4s; + +$color-primary-main: #A32768; + +$color-dark-85-white: #DCDDDE; +$color-dark-100-white: #FFFFFF; + +$color-info-main: #5DA7C0; + +$color-success-main: #2C9445; + +$color-error-main: #C4234A; + +$color-warning-dark-01: #D3822B; + +$color-primary: #AE1164; + +$color-light: #E0E0E8; +$color-light-400: #ECECF1; + +$color-dark: #131C26; +$color-dark-400: #71767C; + +$h1-font-size: 24px; +$h2-font-size: 20px; +$h3-font-size: 18px; +$h4-font-size: 16px; +$h5-font-size: 14px; +$h6-font-size: 12px; \ No newline at end of file diff --git a/scss/front-page.scss b/scss/front-page.scss index c01dbb0963..aa19cea5d7 100644 --- a/scss/front-page.scss +++ b/scss/front-page.scss @@ -195,21 +195,31 @@ body { } } + .notifications { + margin-top: 30px; + margin-bottom: 40px; + } + .notification { - background-color: $ibexa-color-light-300; border-radius: 12px; color: $ibexa-color-dark; font-size: 12px; padding: 32px; - margin: 30px 40px 40px 0; position: relative; + overflow: hidden; + display: flex; + flex-direction: column; + flex: 1 1 0; &__content { - padding-right: 260px; padding-bottom: 32px; + position: relative; + z-index: 1; + height: 100%; h2 { - margin: 0 0 14px; + margin: 0 0 8px; + line-height: 1.5; } a { @@ -223,25 +233,68 @@ body { } &__cta { + position: relative; + z-index: 1; + flex-shrink: 0; + a { display: inline-block; - background: linear-gradient(to right, $ibexa-color-danger 0%, $ibexa-color-primary 100%); - color: $ibexa-color-white; text-decoration: none; padding: 15px 16px; border-radius: 12px; font-size: 14px; + color: $ibexa-color-primary; + + & + a { + margin-left: 8px; + } } } &__image { position: absolute; - right: -40px; - top: -30px; - height: 272px; + right: 0; + top: 0; + height: 100%; + z-index: 0; img { - height: 275px; + height: 100%; + } + } + + &--latest-release { + background-image: url('../images/background-gradient.svg'); + background-size: cover; + height: calc(100% - 4px); + + .notification { + &__content { + padding-right: 240px; + } + + &__cta { + a { + background: linear-gradient(to right, $ibexa-color-danger 0%, $ibexa-color-primary 100%); + color: $ibexa-color-white; + } + } + } + } + + &--lts-update { + border: 2px solid $ibexa-color-light; + height: calc(100%); + padding-top: 30px; + + .notification { + &__cta { + a { + &:first-child { + border: 1px solid $ibexa-color-primary; + } + } + } } } } diff --git a/scss/release-notes.scss b/scss/release-notes.scss new file mode 100644 index 0000000000..569a68d776 --- /dev/null +++ b/scss/release-notes.scss @@ -0,0 +1,323 @@ +@use 'variables'; + +// TODO: remove after changing header font sizes globally +.release-notes-header, +.release-notes { + h1 { + font-size: variables.$h1-font-size; + } + h2 { + font-size: variables.$h2-font-size; + } + h3 { + font-size: variables.$h3-font-size; + } + h4 { + font-size: variables.$h4-font-size; + } + h5 { + font-size: variables.$h5-font-size; + } + h6 { + font-size: variables.$h6-font-size; + } +} +// END + +.release-notes-header { + display: flex; + justify-content: space-between; + align-items: center; + border-bottom: 1px solid variables.$color-dark-85-white; + padding: 8px 0; + + h1 { + line-height: 1.5; + margin: 0; + } +} + +.release-notes { + margin-top: 24px; + + p { + &:empty { + display: none; + } + } +} + +.release-notes-filters { + display: flex; + justify-content: flex-end; + font-size: 14px; + line-height: 1.5; + height: 24px; + + &__visible-items { + display: flex; + padding-right: 24px; + } + + &__visible-item { + padding: 4px 24px 4px 8px; + margin-left: 8px; + background-color: variables.$color-light-400; + border-radius: 16px; + font-size: 12px; + position: relative; + + &--hidden { + display: none; + } + } + + &__visible-item-remove { + display: inherit; + position: absolute; + top: 50%; + right: 5px; + width: 16px; + height: 16px; + transform: translateY(-50%); + cursor: pointer; + + &::before, + &::after { + content: ''; + width: 1px; + height: 12px; + background: variables.$color-dark; + position: absolute; + top: 50%; + left: 50%; + } + + &::before { + transform: translate(50%, -50%) rotate(-45deg); + } + + &::after { + transform: translate(50%, -50%) rotate(45deg); + } + } + + &__widget { + position: relative; + + &--expanded { + .release-notes-filters { + &__btn { + color: variables.$color-primary-main; + + svg { + fill: variables.$color-primary-main; + } + } + + &__items { + display: block; + } + } + } + } + + &__btn { + cursor: pointer; + display: flex; + align-items: center; + height: 24px; + + &:hover { + color: variables.$color-primary-main; + + svg { + fill: variables.$color-primary-main; + } + } + } + + &__btn-icon { + position: relative; + display: inline-flex; + align-items: center; + margin-right: 8px; + + &::after { + position: absolute; + z-index: 1; + right: 0; + top: 0; + display: none; + content: ''; + background-color: variables.$color-error-main; + width: 6px; + height: 6px; + border-radius: 50%; + } + + &--selected { + &::after { + display: block; + } + } + } + + &__items { + position: absolute; + z-index: 10; + bottom: 0; + left: 50%; + padding: 8px; + transform: translate(-50%, 100%); + border: 1px solid variables.$color-dark-85-white; + background-color: variables.$color-dark-100-white; + border-radius: 8px; + display: none; + } + + &__item { + padding: 8px; + white-space: nowrap; + + label { + cursor: pointer; + } + + input[type="checkbox"] { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + position: relative; + cursor: pointer; + background-color: variables.$color-dark-100-white; + width: 16px; + height: 16px; + border-radius: 2px; + outline: none; + transition: all variables.$transition-duration variables.$transition-timing-function; + border: 1px solid variables.$color-dark-400; + margin: 0 8px -2.5px 0; + + &::after { + content: ' '; + position: absolute; + top: 3px; + left: 3px; + display: block; + width: 8px; + height: 5px; + border-left: 2px solid transparent; + border-bottom: 2px solid transparent; + transform: rotate(-45deg); + } + + &:hover { + border-color: variables.$color-primary; + } + + &:focus { + border-color: variables.$color-primary; + box-shadow: 0 0 0 4px rgba(variables.$color-primary, 0.25); + } + + &:checked { + border-color: variables.$color-primary; + background-color: variables.$color-primary; + + &::after { + border-color: variables.$color-dark-100-white; + } + } + } + } +} + +.release-note { + position: relative; + font-size: 14px; + line-height: 1.5; + padding-left: 24px; + padding-bottom: 36px; + + &__tags { + display: flex; + padding: 4px 0 8px; + } + + &__tag { + font-size: 12px; + padding: 1px 8px; + border: 1px solid; + margin-right: 8px; + + $types: + 'headless' variables.$color-error-main, + 'experience' variables.$color-warning-dark-01, + 'commerce' variables.$color-primary-main, + 'lts-update' variables.$color-info-main, + 'new-feature' variables.$color-success-main; + + + @each $name, $color in $types { + &--#{$name} { + color: $color; + border-color: $color; + } + } + } + + &__date { + color: variables.$color-dark-400; + margin-bottom: 24px; + } + + h2 { + line-height: 1.5; + margin: 0; + } + + p { + margin: 0 0 12px; + + &:last-child { + margin-bottom: 0; + } + } + + &::before { + display: block; + content: ''; + position: absolute; + z-index: 1; + left: 0; + top: 11px; + width: 9px; + height: 9px; + border: 1px solid variables.$color-primary-main; + border-radius: 50%; + } + + &::after { + display: block; + content: ''; + position: absolute; + z-index: 0; + top: 19px; + left: 4px; + width: 1px; + height: calc(100% - 8px); + background-color: variables.$color-light; + } + + &:last-of-type { + padding-bottom: 0; + &::after { + height: calc(100% - 19px); + } + } + + &--hidden { + display: none; + } +}