From c812a6c5ebb21afd613a56f2e8f6fe54fa526137 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Wed, 18 Mar 2026 19:52:39 +0100 Subject: [PATCH 001/430] Prepare next release --- .github/workflows/release.yml | 72 +++- .gitignore | 1 + CHANGELOG.md | 13 + README.md | 42 +- .../org/patternfly/component/AsyncItems.java | 13 + .../patternfly/component/HasAsyncItems.java | 7 + showcase/doc.java | 5 +- showcase/package.json | 2 + showcase/pnpm-lock.yaml | 6 + showcase/src/doc/get-started.md | 75 +++- .../showcase/extension/FinderExtension.java | 15 +- showcase/src/web/core.css | 20 - showcase/src/web/finder.css | 366 ------------------ showcase/src/web/main.js | 4 +- versionBump.sh | 14 + 15 files changed, 215 insertions(+), 440 deletions(-) delete mode 100644 showcase/src/web/core.css delete mode 100644 showcase/src/web/finder.css diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1d31f7769..0e6e334f7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -68,13 +68,43 @@ jobs: CENTRAL_PASSWORD: ${{ secrets.CENTRAL_PASSWORD }} MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }} - publish-apidocs: - name: Publish API Documentation + publish-npm: + name: Publish NPM Packages + runs-on: ubuntu-latest + needs: deploy-patternfly + steps: + - uses: actions/checkout@v6 + - uses: actions/setup-node@v6 + with: + node-version: 25 + registry-url: https://registry.npmjs.org + - run: corepack enable + - name: Publish @patternfly-java/core + working-directory: core/npm + run: pnpm publish --access public --no-git-checks + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + - name: Publish @patternfly-java/finder + working-directory: extensions/finder/npm + run: pnpm publish --access public --no-git-checks + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + - name: Publish @patternfly-java/charts + working-directory: charts/npm + run: | + pnpm install + pnpm run build + pnpm publish --access public --no-git-checks + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + + publish-showcase: + name: Publish Showcase runs-on: ubuntu-latest + needs: publish-npm env: MVN: ./mvnw --show-version --batch-mode --no-transfer-progress steps: - - uses: ts-graphviz/setup-graphviz@v2 - uses: actions/checkout@v6 with: persist-credentials: false @@ -83,33 +113,24 @@ jobs: java-version: 25 distribution: temurin cache: maven - - run: $MVN install - working-directory: bom - - run: $MVN install -Dquickly - - run: $MVN depgraph:aggregate - - run: | - $MVN org.apache.maven.plugins:maven-antrun-plugin:run@copy-doc-files - $MVN org.apache.maven.plugins:maven-antrun-plugin:run@copy-sources - $MVN org.apache.maven.plugins:maven-antrun-plugin:run@copy-demos - $MVN javadoc:javadoc - working-directory: apidoc + - run: $MVN --projects org.patternfly:patternfly-java-showcase --also-make -P showcase,prod package - uses: JamesIves/github-pages-deploy-action@v4.8.0 with: token: ${{ secrets.PUBLISH_CONTENT }} - repository-name: patternfly-java/apidocs + repository-name: patternfly-java/patternfly-java.github.io branch: gh-pages - folder: ./apidoc/target/reports/apidocs + folder: ./showcase/target/showcase clean: true force: true single-commit: true - publish-showcase: - name: Publish Showcase + publish-apidocs: + name: Publish API Documentation runs-on: ubuntu-latest - needs: deploy-patternfly env: MVN: ./mvnw --show-version --batch-mode --no-transfer-progress steps: + - uses: ts-graphviz/setup-graphviz@v2 - uses: actions/checkout@v6 with: persist-credentials: false @@ -118,13 +139,22 @@ jobs: java-version: 25 distribution: temurin cache: maven - - run: $MVN --projects org.patternfly:patternfly-java-showcase --also-make -P showcase,prod package + - run: $MVN install + working-directory: bom + - run: $MVN install -Dquickly + - run: $MVN depgraph:aggregate + - run: | + $MVN org.apache.maven.plugins:maven-antrun-plugin:run@copy-doc-files + $MVN org.apache.maven.plugins:maven-antrun-plugin:run@copy-sources + $MVN org.apache.maven.plugins:maven-antrun-plugin:run@copy-demos + $MVN javadoc:javadoc + working-directory: apidoc - uses: JamesIves/github-pages-deploy-action@v4.8.0 with: token: ${{ secrets.PUBLISH_CONTENT }} - repository-name: patternfly-java/patternfly-java.github.io + repository-name: patternfly-java/apidocs branch: gh-pages - folder: ./showcase/target/showcase + folder: ./apidoc/target/reports/apidocs clean: true force: true single-commit: true diff --git a/.gitignore b/.gitignore index 4f821aaf7..145c8d2a9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ *.bak *.iml .classpath +.claude .DS_Store .idea .jbang diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d29d95e0..fe8f4a1ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,19 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +### Added + +- Add [finder extension](https://patternfly-java.github.io/extensions/finder) (#371) +- Add + `HasAsyncItems, S extends HasIdentifier>` that defines a common interface for components that can display items asynchronously. These components implement it: + - `FinderColumn` + - `MenuList` + - `TreeViewItem` + +### Changed + +- Switch to corepack and pnpm + ## [0.5.0] - 2026-02-20 ### Added diff --git a/README.md b/README.md index fcd60c647..b041120d0 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ [![Verify Codebase](https://github.com/patternfly-java/patternfly-java/actions/workflows/verify.yml/badge.svg)](https://github.com/patternfly-java/patternfly-java/actions/workflows/verify.yml) [![Javadoc](https://img.shields.io/badge/JavaDoc-Online-green)](https://patternfly-java.github.io/apidocs/) [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/patternfly-java/patternfly-java) [![Maven Central](https://img.shields.io/maven-central/v/org.patternfly/patternfly-java-parent)](https://central.sonatype.com/search?q=g%3Aorg.patternfly) ![GWT3/J2CL compatible](https://img.shields.io/badge/GWT3/J2CL-compatible-brightgreen.svg) [![Chat on Gitter](https://badges.gitter.im/patternfly-java/patternfly-java.svg)](https://app.gitter.im/#/room/#pf4-java_core:gitter.im) -PatternFly Java is a 💯 Java implementation of [PatternFly](https://www.patternfly.org/) without any JavaScript dependencies (except for the [charts](#charts)). Its goal is to provide an easy-to-use, elegant, and efficient API to build complex web applications with PatternFly in Java. PatternFly Java integrates with and builds upon Elemento's [builder API](https://github.com/hal/elemento#builder-api). It works with both GWT and J2CL. The following code snippet gives a taste of what PatternFly Java looks like: +PatternFly Java is a 💯 Java implementation of [PatternFly](https://www.patternfly.org/) without any JavaScript dependencies (except for the [charts](#patternfly-javacharts)). Its goal is to provide an easy-to-use, elegant, and efficient API to build complex web applications with PatternFly in Java. PatternFly Java integrates with and builds upon Elemento's [builder API](https://github.com/hal/elemento#builder-api). It works with both GWT and J2CL. The following code snippet gives a taste of what PatternFly Java looks like: ```java body().add(page() @@ -80,26 +80,48 @@ depending on your stack. If you're using GWT, inherit from `org.patternfly.Patte ``` -## Dependencies +## JavaScript Dependencies -PatternFly Java has **no JavaScript** dependencies (except for the charts – see below). Everything necessary is included in the code base for both GWT and J2CL. However, PatternFly Java does **not** come with **stylesheets**. You are expected to include or bundle the necessary stylesheets yourself. Take a look at the PatternFly [getting started guide](https://www.patternfly.org/get-started/develop#htmlcss) for more information. +PatternFly Java has **no JavaScript** dependencies. Everything necessary is included in the code base for both GWT and J2CL. The only exception is the charts package, which wraps PatternFly React Chart components as web components so they can be used from Java. -You can also take a look at the code of the [showcase](https://github.com/patternfly-java/patternfly-java/tree/main/showcase#readme) to see how to set up and use PatternFly Java. +``` +npm install @patternfly-java/charts +``` + +```js +import "@patternfly-java/charts/dist/charts"; +``` + +## Stylesheets + +PatternFly Java does **not** come with PatternFly styles. You have to provide them yourself. Please follow the PatternFly [getting started guide](https://www.patternfly.org/get-started/develop/#develop-with-htmlcss). + +In addition, PatternFly Java defines a set of its own styles in the `core` and `extensions/finder` packages. Unlike other components that map to existing PatternFly components, the finder extension has no related PatternFly component and relies entirely on its own styles. -## Charts +All NPM packages are published under the [`@patternfly-java`](https://www.npmjs.com/org/patternfly-java) scope and share the same version number as the Maven artifacts. -To use charts, you need to install the [`@patternfly-java/charts`](https://www.npmjs.com/package/@patternfly-java/charts) NPM package. This package wraps the supported PatternFly React Chart components as web components. +### @patternfly-java/core -Install the package using npm: +Bundles the PatternFly Java CSS stylesheets required by PatternFly Java components and layouts. ``` -npm install @patternfly-java/charts +npm install @patternfly-java/core ``` -Import it in your JavaScript file: +```js +import "@patternfly-java/core"; +``` + +### @patternfly-java/finder + +Provides the CSS for the [finder](https://patternfly-java.github.io/extensions/finder) extension. Only needed if you use the finder component. + +``` +npm install @patternfly-java/finder +``` ```js -import "@patternfly-java/charts/dist/charts"; +import "@patternfly-java/finder"; ``` # Modules diff --git a/components/src/main/java/org/patternfly/component/AsyncItems.java b/components/src/main/java/org/patternfly/component/AsyncItems.java index 942d1d11f..69ba0f9e3 100644 --- a/components/src/main/java/org/patternfly/component/AsyncItems.java +++ b/components/src/main/java/org/patternfly/component/AsyncItems.java @@ -19,6 +19,19 @@ import elemental2.promise.Promise; +/** + * A functional interface that represents an asynchronous computation yielding an iterable result. + * It extends the {@code Function} interface, allowing it to accept an input of type {@code T} and + * return a {@code Promise} that resolves to an {@code Iterable} of type {@code R}. + *

+ * The purpose of {@code AsyncItems} is to define a contract for handling operations where a computation + * produces multiple results asynchronously, encapsulated in a {@code Promise}. + * + * @param the input type accepted by the function + * @param the type of elements contained in the resulting iterable + * + * @see HasAsyncItems + */ @FunctionalInterface public interface AsyncItems extends Function>> { } diff --git a/components/src/main/java/org/patternfly/component/HasAsyncItems.java b/components/src/main/java/org/patternfly/component/HasAsyncItems.java index 7c59fff89..a627abff1 100644 --- a/components/src/main/java/org/patternfly/component/HasAsyncItems.java +++ b/components/src/main/java/org/patternfly/component/HasAsyncItems.java @@ -21,6 +21,13 @@ import elemental2.dom.HTMLElement; import elemental2.promise.Promise; +/** + * Represents a component or entity that can asynchronously manage items and their associated operations. + * + * @param the type of the element associated with the items + * @param the type of the component extending {@code HasItems}, used for method chaining + * @param the type of the items, which must implement {@code HasIdentifier} + */ public interface HasAsyncItems, S extends HasIdentifier> { default C addItems(AsyncItems items) { diff --git a/showcase/doc.java b/showcase/doc.java index 0d5fa70a0..6481bb48b 100644 --- a/showcase/doc.java +++ b/showcase/doc.java @@ -16,11 +16,13 @@ /// usr/bin/env jbang "$0" "$@" ; exit $? //JAVA 25 //DEPS com.vladsch.flexmark:flexmark-all:0.64.8 +//DEPS com.vladsch.flexmark:flexmark-ext-tables:0.64.8 import com.vladsch.flexmark.html.HtmlRenderer; import com.vladsch.flexmark.parser.Parser; import com.vladsch.flexmark.util.ast.Node; import com.vladsch.flexmark.util.data.MutableDataSet; +import com.vladsch.flexmark.ext.tables.TablesExtension; static final String PACKAGE_NAME = "org.patternfly.showcase"; static final String CLASS_NAME = "Documentation"; @@ -102,7 +104,8 @@ String markdownToHtm(String markdown) { if (markdown == null) { return ""; } - MutableDataSet options = new MutableDataSet(); + MutableDataSet options = new MutableDataSet() + .set(Parser.EXTENSIONS, Arrays.asList(TablesExtension.create())); Parser parser = Parser.builder(options).build(); HtmlRenderer renderer = HtmlRenderer.builder(options).build(); Node document = parser.parse(markdown); diff --git a/showcase/package.json b/showcase/package.json index fa5688a86..9e534cb2b 100644 --- a/showcase/package.json +++ b/showcase/package.json @@ -22,6 +22,8 @@ "@github/relative-time-element": "^5.0.0", "@patternfly/patternfly": "^6.4.0", "@patternfly-java/charts": "^0.0.13", + "@patternfly-java/core": "link:../core/npm", + "@patternfly-java/finder": "link:../extensions/finder/npm", "highlight.js": "^11.11.1" }, "devDependencies": { diff --git a/showcase/pnpm-lock.yaml b/showcase/pnpm-lock.yaml index e600f6d27..7f6de58e3 100644 --- a/showcase/pnpm-lock.yaml +++ b/showcase/pnpm-lock.yaml @@ -14,6 +14,12 @@ importers: '@patternfly-java/charts': specifier: ^0.0.13 version: 0.0.13 + '@patternfly-java/core': + specifier: link:../core/npm + version: link:../core/npm + '@patternfly-java/finder': + specifier: link:../extensions/finder/npm + version: link:../extensions/finder/npm '@patternfly/patternfly': specifier: ^6.4.0 version: 6.4.0 diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 1fb61e6d2..77a893326 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.2.2 + 0.5.0 pom import @@ -22,6 +22,7 @@ and add a dependency to either org.patternfly patternfly-java-gwt + gwt-lib ``` @@ -42,28 +43,68 @@ depending on your stack. If you're using GWT, inherit from `org.patternfly.Patte ``` -## Dependencies +## JavaScript Dependencies -PatternFly Java has **no JavaScript** dependencies. Everything necessary is included in the code base for both GWT and J2CL. However, Patternfly Java does **not** come with **stylesheets**. You are expected to include or bundle the necessary stylesheets yourself. Take a look at the PatternFly [getting started guide](https://www.patternfly.org/get-started/develop#htmlcss) for more information. +PatternFly Java has **no JavaScript** dependencies. Everything necessary is included in the code base for both GWT and J2CL. The only exception is the charts package, which wraps PatternFly React Chart components as web components so they can be used from Java. -You can also take a look at the code of the [showcase](https://github.com/patternfly-java/patternfly-java/tree/main/showcase#readme) to see how to set up and use PatternFly Java. +``` +npm install @patternfly-java/charts +``` + +```js +import "@patternfly-java/charts/dist/charts"; +``` + +## Stylesheets + +PatternFly Java does **not** come with PatternFly styles. You have to provide them yourself. Please follow the PatternFly [getting started guide](https://www.patternfly.org/get-started/develop/#develop-with-htmlcss). + +In addition, PatternFly Java defines a set of its own styles in the `core` and `extensions/finder` packages. Unlike other components that map to existing PatternFly components, the finder extension has no related PatternFly component and relies entirely on its own styles. + +All NPM packages are published under the [`@patternfly-java`](https://www.npmjs.com/org/patternfly-java) scope and share the same version number as the Maven artifacts. + +### @patternfly-java/core + +Bundles the PatternFly Java CSS stylesheets required by PatternFly Java components and layouts. + +``` +npm install @patternfly-java/core +``` + +```js +import "@patternfly-java/core"; +``` + +### @patternfly-java/finder + +Provides the CSS for the [finder](https://patternfly-java.github.io/extensions/finder) extension. Only needed if you use the finder component. + +``` +npm install @patternfly-java/finder +``` + +```js +import "@patternfly-java/finder"; +``` # Modules PatternFly Java consists of these Maven modules (a-z): -| Module | Description | -|----------------------------|----------------------------------| -| patternfly-java-bom | Bill of materials | -| patternfly-java-codeeditor | PatternFly codeeditor | -| patternfly-java-components | PatternFly components | -| patternfly-java-core | Core PatternFly Java classes | -| patternfly-java-finder | PatternFly Java Finder extension | -| patternfly-java-gwt | PatternFly Java for GWT | -| patternfly-java-icons | PatternFly Java icons | -| patternfly-java-j2cl | PatternFly Java for J2CL | -| patternfly-java-layouts | PatternFly Java layouts | - -Here’s the dependency graph of these maven modules and its external dependencies: +| Module | Description | +|----------------------------|-----------------------| +| patternfly-java-bom | Bill of materials | +| patternfly-java-charts | Charts | +| patternfly-java-codeeditor | Code editor extension | +| patternfly-java-components | Components | +| patternfly-java-core | Core classes | +| patternfly-java-finder | Finder extension | +| patternfly-java-gwt | GWT support | +| patternfly-java-icons | Icons | +| patternfly-java-j2cl | J2CL support | +| patternfly-java-layouts | Layouts | +| patternfly-java-tokens | Tokens | + +Here’s the dependency graph of these maven modules and their external dependencies: ![Dependency graph](https://raw.githubusercontent.com/patternfly-java/patternfly-java/main/dependency-graph.png) diff --git a/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java b/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java index 3800b2906..96b5ae608 100644 --- a/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java +++ b/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java @@ -17,6 +17,7 @@ import java.util.function.Function; +import org.jboss.elemento.Elements; import org.jboss.elemento.Id; import org.jboss.elemento.router.Route; import org.patternfly.extension.finder.Finder; @@ -33,6 +34,7 @@ import org.patternfly.showcase.model.File; import org.patternfly.showcase.model.Files; +import static org.jboss.elemento.Elements.a; import static org.jboss.elemento.Elements.removeChildrenFrom; import static org.patternfly.component.button.Button.button; import static org.patternfly.component.content.Content.content; @@ -71,7 +73,15 @@ public class FinderExtension extends SnippetPage { public FinderExtension() { super(extensions.get("finder")); - startExamples(); + startExamples(content(p).editorial() + .add("Some of the examples below rely on JSON data. Please see ") + .add(a("https://github.com/patternfly-java/patternfly-java/blob/main/showcase/src/main/resources/org/patternfly/showcase/files.json", + "_blank").add(Elements.code("files.json"))) + .add(" and ") + .add(a("https://github.com/patternfly-java/patternfly-java/blob/main/showcase/src/main/resources/org/patternfly/showcase/rhcp.json", + "_blank").add(Elements.code("rhcp.json"))) + .add(" for more information.") + ); addSnippet(new Snippet("finder-basic", "Basic", code("finder-basic"), () -> { // @code-start:finder-basic @@ -154,8 +164,7 @@ public FinderExtension() { preview.add(descriptionList().run(dl -> file.meta.forEach(key -> dl.addItem(descriptionListGroup(Id.unique("finder-preview", key)) .addTerm(descriptionListTerm(key)) - .addDescription( - descriptionListDescription(file.meta.get(key))))))); + .addDescription(descriptionListDescription(file.meta.get(key))))))); } })) .addPreview(finderPreview().css(util("p-md")) diff --git a/showcase/src/web/core.css b/showcase/src/web/core.css deleted file mode 100644 index f25cde443..000000000 --- a/showcase/src/web/core.css +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright 2023 Red Hat - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/* PatternFly Java */ - -.pf-m-filtered { - display: none !important; -} diff --git a/showcase/src/web/finder.css b/showcase/src/web/finder.css deleted file mode 100644 index e6b4f7381..000000000 --- a/showcase/src/web/finder.css +++ /dev/null @@ -1,366 +0,0 @@ -/** - * Copyright 2023 Red Hat - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/* PatternFly Java Finder Extension */ -/* A macOS Finder-style column browser for hierarchical navigation */ - -/* =================================================================== - Custom properties - =================================================================== */ - -.pf-v6-c-finder { - --pf-v6-c-finder--BackgroundColor: var(--pf-t--global--background--color--primary--default); - --pf-v6-c-finder--BorderColor: var(--pf-t--global--border--color--default); - --pf-v6-c-finder--BorderWidth: var(--pf-t--global--border--width--100); - --pf-v6-c-finder--BorderRadius: var(--pf-t--global--border--radius--100); - --pf-v6-c-finder--FontSize: var(--pf-t--global--font--size--200); - --pf-v6-c-finder--Color: var(--pf-t--global--text--color--regular); - --pf-v6-c-finder-MaxColumns: 4; - - /* Column */ - --pf-v6-c-finder__column--Width: 18rem; - --pf-v6-c-finder__column--BorderRightColor: var(--pf-t--global--border--color--default); - --pf-v6-c-finder__column--BorderRightWidth: var(--pf-t--global--border--width--100); - - /* Column header */ - --pf-v6-c-finder__column-header--PaddingBlockStart: var(--pf-t--global--spacer--200); - --pf-v6-c-finder__column-header--PaddingBlockEnd: var(--pf-t--global--spacer--200); - --pf-v6-c-finder__column-header--PaddingInlineStart: var(--pf-t--global--spacer--300); - --pf-v6-c-finder__column-header--PaddingInlineEnd: var(--pf-t--global--spacer--200); - --pf-v6-c-finder__column-header--BorderBottomColor: var(--pf-t--global--border--color--default); - --pf-v6-c-finder__column-header--BorderBottomWidth: var(--pf-t--global--border--width--100); - --pf-v6-c-finder__column-title-text--FontWeight: var(--pf-t--global--font--weight--heading--default); - --pf-v6-c-finder__column-title-text--FontSize: var(--pf-t--global--font--size--md); - - /* Column search */ - --pf-v6-c-finder__column-search--PaddingBlock: var(--pf-t--global--spacer--200); - --pf-v6-c-finder__column-search--PaddingInline: var(--pf-t--global--spacer--200); - - /* Column item */ - --pf-v6-c-finder__item--PaddingBlockStart: var(--pf-t--global--spacer--200); - --pf-v6-c-finder__item--PaddingBlockEnd: var(--pf-t--global--spacer--200); - --pf-v6-c-finder__item--PaddingInlineStart: var(--pf-t--global--spacer--300); - --pf-v6-c-finder__item--PaddingInlineEnd: var(--pf-t--global--spacer--300); - --pf-v6-c-finder__item--BackgroundColor: transparent; - --pf-v6-c-finder__item--hover--BackgroundColor: var(--pf-t--global--background--color--primary--hover); - --pf-v6-c-finder__item--m-selected--BackgroundColor: var(--pf-t--global--color--brand--default); - --pf-v6-c-finder__item--m-selected--Color: var(--pf-t--global--text--color--on-brand--default); - --pf-v6-c-finder__item--m-selected--inactive--BackgroundColor: var(--pf-t--global--background--color--primary--hover); - --pf-v6-c-finder__item--m-selected--inactive--Color: var(--pf-t--global--text--color--regular); - --pf-v6-c-finder__item--Gap: var(--pf-t--global--spacer--300); - --pf-v6-c-finder__item-row--MinHeight: 3.125rem; - - /* Column item focus */ - --pf-v6-c-finder__item--focus--OutlineColor: var(--pf-t--global--color--brand--default); - --pf-v6-c-finder__item--focus--OutlineWidth: var(--pf-t--global--border--width--200); - --pf-v6-c-finder__item--focus--OutlineOffset: calc(-1 * var(--pf-t--global--border--width--200)); - - /* Column item icon */ - --pf-v6-c-finder__item-icon--Width: var(--pf-t--global--icon--size--200); - - /* Column item text */ - --pf-v6-c-finder__item-text--FontSize: var(--pf-t--global--font--size--200); - - /* Column item description */ - --pf-v6-c-finder__item-description--FontSize: var(--pf-t--global--font--size--xs); - --pf-v6-c-finder__item-description--Color: var(--pf-t--global--text--color--subtle); - - /* Column item actions */ - --pf-v6-c-finder__item-actions--MarginInlineStart: auto; - - /* Column item pin icon */ - --pf-v6-c-finder__item-pin--Color: var(--pf-t--global--text--color--subtle); - --pf-v6-c-finder__item-pin--m-selected--Color: var(--pf-t--global--text--color--on-brand--default); - - /* Column item folder icon */ - --pf-v6-c-finder__item-folder-icon--Width: var(--pf-t--global--icon--size--200); - --pf-v6-c-finder__item-folder-icon--Color: var(--pf-t--global--text--color--subtle); - --pf-v6-c-finder__item-folder-icon--m-selected--Color: var(--pf-t--global--text--color--on-brand--default); - - /* Preview */ - --pf-v6-c-finder__preview--MinWidth: 24rem; - --pf-v6-c-finder__preview--BackgroundColor: var(--pf-t--global--background--color--primary--default); -} - -/* =================================================================== - Root container - =================================================================== */ - -.pf-v6-c-finder { - display: flex; - background-color: var(--pf-v6-c-finder--BackgroundColor); - border: var(--pf-v6-c-finder--BorderWidth) solid var(--pf-v6-c-finder--BorderColor); - border-radius: var(--pf-v6-c-finder--BorderRadius); - font-size: var(--pf-v6-c-finder--FontSize); - color: var(--pf-v6-c-finder--Color); -} - -/* =================================================================== - Columns container (scrollable) - =================================================================== */ - -.pf-v6-c-finder__columns { - display: flex; - overflow-x: auto; - max-width: calc(var(--pf-v6-c-finder-MaxColumns) * var(--pf-v6-c-finder__column--Width) + var(--pf-v6-c-finder-MaxColumns) * var(--pf-v6-c-finder__column--BorderRightWidth)); -} - -/* =================================================================== - Column - =================================================================== */ - -.pf-v6-c-finder__column { - display: flex; - flex-direction: column; - flex-shrink: 0; - width: var(--pf-v6-c-finder__column--Width); - border-right: var(--pf-v6-c-finder__column--BorderRightWidth) solid var(--pf-v6-c-finder__column--BorderRightColor); -} - -/* =================================================================== - Column header - =================================================================== */ - -.pf-v6-c-finder__column-header { - display: flex; - align-items: center; - gap: var(--pf-t--global--spacer--200); - padding-block-start: var(--pf-v6-c-finder__column-header--PaddingBlockStart); - padding-block-end: var(--pf-v6-c-finder__column-header--PaddingBlockEnd); - padding-inline-start: var(--pf-v6-c-finder__column-header--PaddingInlineStart); - padding-inline-end: var(--pf-v6-c-finder__column-header--PaddingInlineEnd); - border-bottom: var(--pf-v6-c-finder__column-header--BorderBottomWidth) solid var(--pf-v6-c-finder__column-header--BorderBottomColor); -} - -.pf-v6-c-finder__column-title-text { - font-weight: var(--pf-v6-c-finder__column-title-text--FontWeight); - font-size: var(--pf-v6-c-finder__column-title-text--FontSize); - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.pf-v6-c-finder__column.pf-m-active .pf-v6-c-finder__column-title-text { - text-decoration: underline; -} - -.pf-v6-c-finder__column-actions { - display: flex; - align-items: center; - gap: var(--pf-t--global--spacer--100); - margin-inline-start: auto; - flex-shrink: 0; -} - -/* =================================================================== - Column search - =================================================================== */ - -.pf-v6-c-finder__column-search { - padding-block: var(--pf-v6-c-finder__column-search--PaddingBlock); - padding-inline: var(--pf-v6-c-finder__column-search--PaddingInline); -} - -/* =================================================================== - Column items (list) - =================================================================== */ - -.pf-v6-c-finder__column-items { - flex: 1; - overflow-y: auto; - list-style: none; - margin: 0; - padding: 0; -} - -/* =================================================================== - Finder item - =================================================================== */ - -.pf-v6-c-finder__item { - cursor: pointer; - background-color: var(--pf-v6-c-finder__item--BackgroundColor); - color: var(--pf-v6-c-finder--Color); -} - -.pf-v6-c-finder__item:hover { - background-color: var(--pf-v6-c-finder__item--hover--BackgroundColor); -} - -.pf-v6-c-finder__item:focus-visible { - outline: var(--pf-v6-c-finder__item--focus--OutlineWidth) solid var(--pf-v6-c-finder__item--focus--OutlineColor); - outline-offset: var(--pf-v6-c-finder__item--focus--OutlineOffset); -} - -/* =================================================================== - Item row - =================================================================== */ - -.pf-v6-c-finder__item-row { - display: flex; - align-items: center; - min-height: var(--pf-v6-c-finder__item-row--MinHeight); - gap: var(--pf-v6-c-finder__item--Gap); - padding-block-start: var(--pf-v6-c-finder__item--PaddingBlockStart); - padding-block-end: var(--pf-v6-c-finder__item--PaddingBlockEnd); - padding-inline-start: var(--pf-v6-c-finder__item--PaddingInlineStart); - padding-inline-end: var(--pf-v6-c-finder__item--PaddingInlineEnd); -} - -/* =================================================================== - Item sub-elements - =================================================================== */ - -.pf-v6-c-finder__item-icon { - display: inline-flex; - align-items: center; - justify-content: center; - flex-shrink: 0; - width: var(--pf-v6-c-finder__item-icon--Width); -} - -.pf-v6-c-finder__item-content { - display: flex; - flex-direction: column; - min-width: 0; -} - -.pf-v6-c-finder__item-text { - font-size: var(--pf-v6-c-finder__item-text--FontSize); - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.pf-v6-c-finder__item-description { - font-size: var(--pf-v6-c-finder__item-description--FontSize); - color: var(--pf-v6-c-finder__item-description--Color); - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.pf-v6-c-finder__column.pf-m-active .pf-v6-c-finder__item.pf-m-selected .pf-v6-c-finder__item-description { - color: var(--pf-v6-c-finder__item--m-selected--Color); -} - -.pf-v6-c-finder__item-actions { - display: inline-flex; - align-items: center; - gap: var(--pf-t--global--spacer--100); - margin-inline-start: var(--pf-v6-c-finder__item-actions--MarginInlineStart); - flex-shrink: 0; - opacity: 0; -} - -.pf-v6-c-finder__item:hover .pf-v6-c-finder__item-actions, -.pf-v6-c-finder__item.pf-m-selected .pf-v6-c-finder__item-actions { - opacity: 1; -} - -.pf-v6-c-finder__item-pin { - display: inline-flex; - align-items: center; - justify-content: center; - flex-shrink: 0; - color: var(--pf-v6-c-finder__item-pin--Color); - opacity: 0; - cursor: pointer; - background: none; - border: none; - padding: 0; - font-size: inherit; - margin-inline-start: auto; -} - -.pf-v6-c-finder__item-actions + .pf-v6-c-finder__item-pin { - margin-inline-start: 0; -} - -.pf-v6-c-finder__item:hover .pf-v6-c-finder__item-pin, -.pf-v6-c-finder__item.pf-m-pinned .pf-v6-c-finder__item-pin { - opacity: 1; -} - -.pf-v6-c-finder__column.pf-m-active .pf-v6-c-finder__item.pf-m-selected .pf-v6-c-finder__item-pin { - color: var(--pf-v6-c-finder__item-pin--m-selected--Color); -} - -/* Pin icon swap: show thumbtack by default, times when pinned */ -.pf-v6-c-finder__item-pin .pf-v6-c-finder__item-pin-icon--pinned { - display: none; -} - -.pf-v6-c-finder__item.pf-m-pinned .pf-v6-c-finder__item-pin .pf-v6-c-finder__item-pin-icon--default { - display: none; -} - -.pf-v6-c-finder__item.pf-m-pinned .pf-v6-c-finder__item-pin .pf-v6-c-finder__item-pin-icon--pinned { - display: inline; -} - -.pf-v6-c-finder__item-folder-icon { - display: none; - align-items: center; - justify-content: center; - flex-shrink: 0; - width: var(--pf-v6-c-finder__item-folder-icon--Width); - color: var(--pf-v6-c-finder__item-folder-icon--Color); -} - -.pf-v6-c-finder__item.pf-m-folder .pf-v6-c-finder__item-folder-icon { - display: inline-flex; -} - -/* =================================================================== - Item modifiers - =================================================================== */ - -/* Selected item in inactive columns */ -.pf-v6-c-finder__item.pf-m-selected { - background-color: var(--pf-v6-c-finder__item--m-selected--inactive--BackgroundColor); - color: var(--pf-v6-c-finder__item--m-selected--inactive--Color); -} - -.pf-v6-c-finder__item.pf-m-selected:hover { - background-color: var(--pf-v6-c-finder__item--m-selected--inactive--BackgroundColor); -} - -/* Selected item in active column */ -.pf-v6-c-finder__column.pf-m-active .pf-v6-c-finder__item.pf-m-selected { - background-color: var(--pf-v6-c-finder__item--m-selected--BackgroundColor); - color: var(--pf-v6-c-finder__item--m-selected--Color); -} - -.pf-v6-c-finder__column.pf-m-active .pf-v6-c-finder__item.pf-m-selected:hover { - background-color: var(--pf-v6-c-finder__item--m-selected--BackgroundColor); -} - -.pf-v6-c-finder__column.pf-m-active .pf-v6-c-finder__item.pf-m-selected .pf-v6-c-finder__item-folder-icon { - color: var(--pf-v6-c-finder__item-folder-icon--m-selected--Color); -} - -/* =================================================================== - Preview pane - =================================================================== */ - -.pf-v6-c-finder__preview { - display: flex; - flex-direction: column; - min-width: var(--pf-v6-c-finder__preview--MinWidth); - background-color: var(--pf-v6-c-finder__preview--BackgroundColor); - flex: 1; - overflow-y: auto; -} diff --git a/showcase/src/web/main.js b/showcase/src/web/main.js index 76518e8f0..c6b87d34c 100644 --- a/showcase/src/web/main.js +++ b/showcase/src/web/main.js @@ -17,9 +17,9 @@ import "@patternfly/patternfly/patternfly.css"; import "@patternfly/patternfly/patternfly-addons.css"; import "@patternfly/patternfly/patternfly-charts.css"; import "@patternfly-java/charts/dist/charts"; +import "@patternfly-java/core"; +import "@patternfly-java/finder"; import "./pforg/*.css"; -import "./finder.css"; -import "./core.css"; import "./showcase.css"; import "@github/relative-time-element"; diff --git a/versionBump.sh b/versionBump.sh index a4d5afee6..055a3208f 100755 --- a/versionBump.sh +++ b/versionBump.sh @@ -108,3 +108,17 @@ mvn --quiet install &> /dev/null cd "${script_dir}" msg "Update version to ${CYAN}${NEW_VERSION}${NOFORMAT}" mvn --quiet versions:set -DnewVersion="${NEW_VERSION}" -P apidoc &> /dev/null +msg " ${GREEN}✔${NOFORMAT} POMs" +sed -i '' -E "s/[0-9]+\.[0-9]+\.[0-9]+.*<\/version>/$NEW_VERSION<\/version>/" showcase/src/doc/*.md +msg " ${GREEN}✔${NOFORMAT} documentation" +msg "Update NPM versions to ${CYAN}${NEW_VERSION}${NOFORMAT}" +cd "${script_dir}/core/npm" +npm version "${NEW_VERSION}" --no-git-tag-version &> /dev/null +msg " ${GREEN}✔${NOFORMAT} core" +cd "${script_dir}/charts/npm" +npm version "${NEW_VERSION}" --no-git-tag-version &> /dev/null +msg " ${GREEN}✔${NOFORMAT} charts" +cd "${script_dir}/extensions/finder/npm" +npm version "${NEW_VERSION}" --no-git-tag-version &> /dev/null +msg " ${GREEN}✔${NOFORMAT} extensions/finder" +cd "${script_dir}" From c5030f5aef716f2853595acfd6ea90b172cbe454 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Wed, 18 Mar 2026 19:53:18 +0100 Subject: [PATCH 002/430] Release 0.6.0 --- CHANGELOG.md | 5 ++++- README.md | 2 +- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 4 ++-- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 4 ++-- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 22 files changed, 27 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fe8f4a1ff..4e9f97569 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +## [0.6.0] - 2026-03-18 + ### Added - Add [finder extension](https://patternfly-java.github.io/extensions/finder) (#371) @@ -725,7 +727,8 @@ Stay tuned for more to come... --> [Removed]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.11...vRemoved -[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.5.0...HEAD +[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.0...HEAD +[0.6.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.5.0...v0.6.0 [0.5.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.17...v0.5.0 [0.4.17]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.16...v0.4.17 [0.4.16]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.15...v0.4.16 diff --git a/README.md b/README.md index b041120d0..622bfe866 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.5.0 + 0.6.0 pom import diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 16d7c74d4..b3d0df8cb 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.5.1-SNAPSHOT + 0.6.0 ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index aa9807cac..7b72500a2 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.5.1-SNAPSHOT + 0.6.0 pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index 40d4ad458..fe3c8dc9e 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.5.1-SNAPSHOT + 0.6.0 ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 086888337..ffdf84be8 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.0.13", + "version": "0.6.0", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index ee9eee7a2..4e40227cb 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.5.1-SNAPSHOT + 0.6.0 ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 89916eadb..af3b86157 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.5.1-SNAPSHOT + 0.6.0 ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 38f9cc75a..f22d42684 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.5.1-SNAPSHOT + 0.6.0 ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 067f0fdcf..57d8e484b 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.0.1", + "version": "0.6.0", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { @@ -34,4 +34,4 @@ "@patternfly/patternfly": "^6.4.0" }, "packageManager": "pnpm@11.0.0-dev.1005+sha512.91f84a392eea348ea4852a182912d2520273a4336f933b78cc44bc931eb999923c097e9433a9b355adc1f725725ea99082fc9f032a559df832632e764c92c798" -} \ No newline at end of file +} diff --git a/core/pom.xml b/core/pom.xml index fb91980f8..29db35b46 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.5.1-SNAPSHOT + 0.6.0 ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index e56a510a6..70632087a 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.5.1-SNAPSHOT + 0.6.0 ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 63d38451e..f585aa846 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.0.1", + "version": "0.6.0", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { @@ -34,4 +34,4 @@ "@patternfly/patternfly": "^6.4.0" }, "packageManager": "pnpm@11.0.0-dev.1005+sha512.91f84a392eea348ea4852a182912d2520273a4336f933b78cc44bc931eb999923c097e9433a9b355adc1f725725ea99082fc9f032a559df832632e764c92c798" -} \ No newline at end of file +} diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index f6158e689..f7870a79e 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.5.1-SNAPSHOT + 0.6.0 ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 31918ab24..73f5fa759 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.5.1-SNAPSHOT + 0.6.0 ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index 3e4c61f01..73b579feb 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.5.1-SNAPSHOT + 0.6.0 ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 818d0ff45..9b7ffff80 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.5.1-SNAPSHOT + 0.6.0 ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 522532946..1f89cb71e 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.5.1-SNAPSHOT + 0.6.0 ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 506be41e6..dc9c74997 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.5.1-SNAPSHOT + 0.6.0 pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index f10edbdc3..712f187d7 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.5.1-SNAPSHOT + 0.6.0 ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 77a893326..0d89535ea 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.5.0 + 0.6.0 pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 85addd02d..5611d0623 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.5.1-SNAPSHOT + 0.6.0 ../code-parent/pom.xml From a966d6d04a143a909cdc6dc3063cbb0bf5321240 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Wed, 18 Mar 2026 19:53:27 +0100 Subject: [PATCH 003/430] Next is 0.6.1 --- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apidoc/pom.xml b/apidoc/pom.xml index b3d0df8cb..73592fc5c 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.0 + 0.6.1-SNAPSHOT ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 7b72500a2..582a22391 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.0 + 0.6.1-SNAPSHOT pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index fe3c8dc9e..e3c22da1e 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.0 + 0.6.1-SNAPSHOT ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index ffdf84be8..d57fa4f92 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.0", + "version": "0.6.1-SNAPSHOT", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 4e40227cb..2a6fbd634 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.0 + 0.6.1-SNAPSHOT ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index af3b86157..d67c7d617 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.0 + 0.6.1-SNAPSHOT ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index f22d42684..5559c8a23 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.0 + 0.6.1-SNAPSHOT ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 57d8e484b..6afdc4cf3 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.0", + "version": "0.6.1-SNAPSHOT", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 29db35b46..f026a4915 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.0 + 0.6.1-SNAPSHOT ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 70632087a..518cdec8c 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.0 + 0.6.1-SNAPSHOT ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index f585aa846..6e70e77f6 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.0", + "version": "0.6.1-SNAPSHOT", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index f7870a79e..3d2ded11b 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.0 + 0.6.1-SNAPSHOT ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 73f5fa759..327e3b746 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.0 + 0.6.1-SNAPSHOT ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index 73b579feb..0acda34b1 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.0 + 0.6.1-SNAPSHOT ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 9b7ffff80..5ed37ac84 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.0 + 0.6.1-SNAPSHOT ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 1f89cb71e..abd762abc 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.0 + 0.6.1-SNAPSHOT ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index dc9c74997..a92597faa 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.0 + 0.6.1-SNAPSHOT pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index 712f187d7..2f65bd88f 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.0 + 0.6.1-SNAPSHOT ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 0d89535ea..773cc89c4 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.0 + 0.6.1-SNAPSHOT pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 5611d0623..580312035 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.0 + 0.6.1-SNAPSHOT ../code-parent/pom.xml From d5124525c7bc074c8ab68aa162457f6411c25452 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 19 Mar 2026 07:42:45 +0100 Subject: [PATCH 004/430] Undo release v0.6.0 --- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 73592fc5c..1a7911a6c 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.1-SNAPSHOT + 0.6.0-SNAPSHOT ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 582a22391..0a225c099 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.1-SNAPSHOT + 0.6.0-SNAPSHOT pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index e3c22da1e..e9e24b478 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.1-SNAPSHOT + 0.6.0-SNAPSHOT ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index d57fa4f92..ed8d46bf9 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.1-SNAPSHOT", + "version": "0.6.0-SNAPSHOT", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 2a6fbd634..941bb8b00 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.1-SNAPSHOT + 0.6.0-SNAPSHOT ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index d67c7d617..101aa7df3 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.1-SNAPSHOT + 0.6.0-SNAPSHOT ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 5559c8a23..bd68bf03d 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.1-SNAPSHOT + 0.6.0-SNAPSHOT ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 6afdc4cf3..48191e8ea 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.1-SNAPSHOT", + "version": "0.6.0-SNAPSHOT", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index f026a4915..52a8396dc 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.1-SNAPSHOT + 0.6.0-SNAPSHOT ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 518cdec8c..4d8c8df2b 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.1-SNAPSHOT + 0.6.0-SNAPSHOT ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 6e70e77f6..d66139297 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.1-SNAPSHOT", + "version": "0.6.0-SNAPSHOT", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index 3d2ded11b..6ab32d6ad 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.1-SNAPSHOT + 0.6.0-SNAPSHOT ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 327e3b746..24bdb45e5 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.1-SNAPSHOT + 0.6.0-SNAPSHOT ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index 0acda34b1..ff39a4bd4 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.1-SNAPSHOT + 0.6.0-SNAPSHOT ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 5ed37ac84..1b6dccb65 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.1-SNAPSHOT + 0.6.0-SNAPSHOT ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index abd762abc..720cbaf24 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.1-SNAPSHOT + 0.6.0-SNAPSHOT ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index a92597faa..001d110d3 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.1-SNAPSHOT + 0.6.0-SNAPSHOT pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index 2f65bd88f..f9ea7b6df 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.1-SNAPSHOT + 0.6.0-SNAPSHOT ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 773cc89c4..75444cc1d 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.1-SNAPSHOT + 0.6.0-SNAPSHOT pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 580312035..621a5151e 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.1-SNAPSHOT + 0.6.0-SNAPSHOT ../code-parent/pom.xml From 8140f17a10ac3c1fdfdd170b805d92a2eb4aad72 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 19 Mar 2026 07:52:56 +0100 Subject: [PATCH 005/430] Prepare next release --- CHANGELOG.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e9f97569..279b997b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,13 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] -## [0.6.0] - 2026-03-18 - ### Added - Add [finder extension](https://patternfly-java.github.io/extensions/finder) (#371) -- Add - `HasAsyncItems, S extends HasIdentifier>` that defines a common interface for components that can display items asynchronously. These components implement it: +- Add `HasAsyncItems, S extends HasIdentifier>` that defines a common interface for components that can display items asynchronously. These components implement it: - `FinderColumn` - `MenuList` - `TreeViewItem` @@ -21,6 +18,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - Switch to corepack and pnpm +## [0.6.0] - 2026-03-18 + +> [!WARNING] +> Not an official release. Please don't use! + ## [0.5.0] - 2026-02-20 ### Added @@ -726,7 +728,6 @@ Stay tuned for more to come... - for dependency upgrades --> -[Removed]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.11...vRemoved [Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.0...HEAD [0.6.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.5.0...v0.6.0 [0.5.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.17...v0.5.0 From 2117eaa23352dc87339a0ccfb6a49780a676332d Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 19 Mar 2026 07:53:28 +0100 Subject: [PATCH 006/430] Release 0.6.1 --- CHANGELOG.md | 5 ++++- README.md | 2 +- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 22 files changed, 25 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 279b997b1..bdb21c999 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +## [0.6.1] - 2026-03-19 + ### Added - Add [finder extension](https://patternfly-java.github.io/extensions/finder) (#371) @@ -728,7 +730,8 @@ Stay tuned for more to come... - for dependency upgrades --> -[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.0...HEAD +[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.1...HEAD +[0.6.1]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.0...v0.6.1 [0.6.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.5.0...v0.6.0 [0.5.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.17...v0.5.0 [0.4.17]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.16...v0.4.17 diff --git a/README.md b/README.md index 622bfe866..2dc0d5265 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.0 + 0.6.1 pom import diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 1a7911a6c..1d91dda7b 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.0-SNAPSHOT + 0.6.1 ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 0a225c099..0342f1456 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.0-SNAPSHOT + 0.6.1 pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index e9e24b478..1ceef206f 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.0-SNAPSHOT + 0.6.1 ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index ed8d46bf9..821e79369 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.0-SNAPSHOT", + "version": "0.6.1", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 941bb8b00..ebb9bbac4 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.0-SNAPSHOT + 0.6.1 ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 101aa7df3..76de536db 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.0-SNAPSHOT + 0.6.1 ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index bd68bf03d..4f7e2a1fe 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.0-SNAPSHOT + 0.6.1 ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 48191e8ea..818b0f22f 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.0-SNAPSHOT", + "version": "0.6.1", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 52a8396dc..e37d84973 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.0-SNAPSHOT + 0.6.1 ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 4d8c8df2b..5bdc78939 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.0-SNAPSHOT + 0.6.1 ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index d66139297..45942025b 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.0-SNAPSHOT", + "version": "0.6.1", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index 6ab32d6ad..71ffb8ee5 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.0-SNAPSHOT + 0.6.1 ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 24bdb45e5..aee0a6059 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.0-SNAPSHOT + 0.6.1 ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index ff39a4bd4..3e1031ef3 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.0-SNAPSHOT + 0.6.1 ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 1b6dccb65..debba4fbb 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.0-SNAPSHOT + 0.6.1 ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 720cbaf24..93ea29c36 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.0-SNAPSHOT + 0.6.1 ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 001d110d3..087d6f98c 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.0-SNAPSHOT + 0.6.1 pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index f9ea7b6df..28f5dc789 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.0-SNAPSHOT + 0.6.1 ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 75444cc1d..53baa3425 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.0-SNAPSHOT + 0.6.1 pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 621a5151e..90d8fcfbd 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.0-SNAPSHOT + 0.6.1 ../code-parent/pom.xml From 0d8e980aab71bd3875493781c1c47a3220f64569 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 19 Mar 2026 07:53:38 +0100 Subject: [PATCH 007/430] Next is 0.6.2 --- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 1d91dda7b..acba3ef36 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.1 + 0.6.2-SNAPSHOT ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 0342f1456..a10a80568 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.1 + 0.6.2-SNAPSHOT pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index 1ceef206f..db4383092 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.1 + 0.6.2-SNAPSHOT ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 821e79369..1ed6fbec6 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.1", + "version": "0.6.2-SNAPSHOT", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index ebb9bbac4..391c8f981 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.1 + 0.6.2-SNAPSHOT ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 76de536db..d6119c72f 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.1 + 0.6.2-SNAPSHOT ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 4f7e2a1fe..b5ac8c282 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.1 + 0.6.2-SNAPSHOT ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 818b0f22f..2c2c49649 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.1", + "version": "0.6.2-SNAPSHOT", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index e37d84973..8b5baf6a0 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.1 + 0.6.2-SNAPSHOT ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 5bdc78939..3bff5609e 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.1 + 0.6.2-SNAPSHOT ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 45942025b..bfc12f658 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.1", + "version": "0.6.2-SNAPSHOT", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index 71ffb8ee5..2d2e95e57 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.1 + 0.6.2-SNAPSHOT ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index aee0a6059..6e7c5d515 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.1 + 0.6.2-SNAPSHOT ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index 3e1031ef3..8afe491e6 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.1 + 0.6.2-SNAPSHOT ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index debba4fbb..2f2968853 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.1 + 0.6.2-SNAPSHOT ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 93ea29c36..9e7926afb 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.1 + 0.6.2-SNAPSHOT ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 087d6f98c..a3742a366 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.1 + 0.6.2-SNAPSHOT pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index 28f5dc789..219723de8 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.1 + 0.6.2-SNAPSHOT ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 53baa3425..da599f816 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.1 + 0.6.2-SNAPSHOT pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 90d8fcfbd..145c8e9dc 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.1 + 0.6.2-SNAPSHOT ../code-parent/pom.xml From 2bf1b6b2dc01b67fb762cb3fbe88a002d23691d7 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 19 Mar 2026 08:16:52 +0100 Subject: [PATCH 008/430] Change deployment wait until to 'validated' --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a3742a366..c69950acf 100644 --- a/pom.xml +++ b/pom.xml @@ -562,7 +562,7 @@ central true 86400 - published + validated From 6ce4485fe3235d192f838b9d0540d7b8f9c5c1df Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 19 Mar 2026 11:43:16 +0100 Subject: [PATCH 009/430] Tweak release workflow --- .github/workflows/release.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0e6e334f7..efb684bcf 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -183,4 +183,3 @@ jobs: body: ${{ steps.read-changelog.outputs.changes }} draft: false prerelease: false - discussion_category_name: announcements From b78c68b6472fa8e913071fbee1bbeb57edc28747 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 19 Mar 2026 19:35:55 +0100 Subject: [PATCH 010/430] Add support for async items to the finder component --- CHANGELOG.md | 8 ++ .../component/list/DescriptionListGroup.java | 6 + .../patternfly/component/menu/MenuList.java | 32 +++-- .../component/tree/TreeViewItem.java | 20 +-- extensions/finder/npm/finder.css | 23 ++++ .../patternfly/extension/finder/Finder.java | 4 +- .../extension/finder/FinderColumn.java | 7 +- .../extension/finder/FinderItem.java | 13 +- .../showcase/extension/FinderExtension.java | 130 +++++++++++++++++- .../org/patternfly/showcase/rhcp.json | 2 +- 10 files changed, 204 insertions(+), 41 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bdb21c999..a00982b4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +### Added + +- Add support for async items to the finder component + +### Fixed + +- Fix finder column header heights + ## [0.6.1] - 2026-03-19 ### Added diff --git a/components/src/main/java/org/patternfly/component/list/DescriptionListGroup.java b/components/src/main/java/org/patternfly/component/list/DescriptionListGroup.java index f08d005ab..81893f6ab 100644 --- a/components/src/main/java/org/patternfly/component/list/DescriptionListGroup.java +++ b/components/src/main/java/org/patternfly/component/list/DescriptionListGroup.java @@ -18,6 +18,8 @@ import java.util.HashMap; import java.util.Map; +import org.jboss.elemento.Id; +import org.patternfly.component.ComponentType; import org.patternfly.component.HasIdentifier; import org.patternfly.core.ComponentContext; import org.patternfly.core.Dataset; @@ -35,6 +37,10 @@ public class DescriptionListGroup extends DescriptionListSubComponent> load() { @Override public Promise> reload() { - List selected = new ArrayList<>(); - for (MenuItem menuItem : this) { - if (menuItem.isSelected()) { - selected.add(menuItem.identifier()); - } - } - reset(); - return load().then(value -> { - Menu menu = lookupComponent(true); - if (menu != null) { - for (String identifier : selected) { - menu.select(identifier, true, false); + if (status != pending) { + List selected = new ArrayList<>(); + for (MenuItem menuItem : this) { + if (menuItem.isSelected()) { + selected.add(menuItem.identifier()); } } - return Promise.resolve(value); - }); + reset(); + return load().then(value -> { + Menu menu = lookupComponent(true); + if (menu != null) { + for (String identifier : selected) { + menu.select(identifier, true, false); + } + } + return Promise.resolve(value); + }); + } else { + return Promise.resolve(emptyList()); + } } @Override diff --git a/components/src/main/java/org/patternfly/component/tree/TreeViewItem.java b/components/src/main/java/org/patternfly/component/tree/TreeViewItem.java index 0c75efe93..98f609b40 100644 --- a/components/src/main/java/org/patternfly/component/tree/TreeViewItem.java +++ b/components/src/main/java/org/patternfly/component/tree/TreeViewItem.java @@ -385,14 +385,18 @@ public Promise> load() { @Override public Promise> reload() { - boolean expanded = expanded(); - reset(); - return load().then(items -> { - if (expanded) { - expand(false); - } - return Promise.resolve(items); - }); + if (status != pending) { + boolean expanded = expanded(); + reset(); + return load().then(items -> { + if (expanded) { + expand(false); + } + return Promise.resolve(items); + }); + } else { + return Promise.resolve(emptyList()); + } } @Override diff --git a/extensions/finder/npm/finder.css b/extensions/finder/npm/finder.css index e6b4f7381..02618dbe9 100644 --- a/extensions/finder/npm/finder.css +++ b/extensions/finder/npm/finder.css @@ -41,6 +41,7 @@ --pf-v6-c-finder__column-header--PaddingInlineEnd: var(--pf-t--global--spacer--200); --pf-v6-c-finder__column-header--BorderBottomColor: var(--pf-t--global--border--color--default); --pf-v6-c-finder__column-header--BorderBottomWidth: var(--pf-t--global--border--width--100); + --pf-v6-c-finder__column-header--Height: var(--pf-t--global--spacer--2xl); --pf-v6-c-finder__column-title-text--FontWeight: var(--pf-t--global--font--weight--heading--default); --pf-v6-c-finder__column-title-text--FontSize: var(--pf-t--global--font--size--md); @@ -142,6 +143,7 @@ padding-inline-start: var(--pf-v6-c-finder__column-header--PaddingInlineStart); padding-inline-end: var(--pf-v6-c-finder__column-header--PaddingInlineEnd); border-bottom: var(--pf-v6-c-finder__column-header--BorderBottomWidth) solid var(--pf-v6-c-finder__column-header--BorderBottomColor); + height: var(--pf-v6-c-finder__column-header--Height); } .pf-v6-c-finder__column-title-text { @@ -352,6 +354,27 @@ color: var(--pf-v6-c-finder__item-folder-icon--m-selected--Color); } +/* =================================================================== + Status items + =================================================================== */ + +.pf-v6-c-finder__item.pf-m-status { + cursor: default; + background-color: transparent; +} + +.pf-v6-c-finder__item.pf-m-status:hover { + background-color: transparent; +} + +.pf-v6-c-finder__item.pf-m-status .pf-v6-c-finder__item-pin { + display: none; +} + +.pf-v6-c-finder__item.pf-m-status .pf-v6-c-finder__item-folder-icon { + display: none; +} + /* =================================================================== Preview pane =================================================================== */ diff --git a/extensions/finder/src/main/java/org/patternfly/extension/finder/Finder.java b/extensions/finder/src/main/java/org/patternfly/extension/finder/Finder.java index 531209ca2..8450ae02f 100644 --- a/extensions/finder/src/main/java/org/patternfly/extension/finder/Finder.java +++ b/extensions/finder/src/main/java/org/patternfly/extension/finder/Finder.java @@ -114,7 +114,9 @@ public Finder add(FinderColumn item) { item.finder = this; cc.add(item.element()); items.put(item.identifier(), item); - return aur.added(item); + aur.added(item); + item.load(); + return this; } /** diff --git a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java index 2c4d5a4bb..fc9fcca50 100644 --- a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java +++ b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java @@ -254,8 +254,11 @@ public Promise> load() { @Override public Promise> reload() { - reset(); - return load().then(Promise::resolve); + if (status != pending) { + reset(); + return load().then(Promise::resolve); + } + return Promise.resolve(emptyList()); } @Override diff --git a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItem.java b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItem.java index 803f1090c..be5042928 100644 --- a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItem.java +++ b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItem.java @@ -33,7 +33,6 @@ import org.patternfly.core.ComponentContext; import org.patternfly.core.Dataset; import org.patternfly.style.Classes; - import elemental2.dom.Element; import elemental2.dom.Event; import elemental2.dom.HTMLElement; @@ -61,7 +60,6 @@ import static org.patternfly.extension.finder.FinderClasses.pin; import static org.patternfly.extension.finder.FinderItemDescription.finderItemDescription; import static org.patternfly.icon.IconSets.fas.angleRight; -import static org.patternfly.icon.IconSets.fas.search; import static org.patternfly.icon.IconSets.fas.thumbtack; import static org.patternfly.icon.IconSets.fas.times; import static org.patternfly.style.Classes.component; @@ -94,16 +92,6 @@ public static FinderItem finderItem(String identifier, String text, String descr return new FinderItem(identifier).text(text).addDescription(description); } - public static FinderItem emptyItem() { - return emptyItem("No items found", "No items match the filter criteria."); - } - - public static FinderItem emptyItem(String text, String description) { - return emptyItem(emptyState().size(xs).text(text) - .icon(search()) - .addBody(emptyStateBody().text(description))); - } - public static FinderItem emptyItem(EmptyState emptyState) { FinderItem error = statusItem(Id.unique(ComponentType.TreeView.id, SUB_COMPONENT_NAME, "empty")); removeChildrenFrom(error.element()); @@ -300,6 +288,7 @@ void handleClick(Finder finder, FinderColumn column, FinderItem item) { finder.addItem(nextColumn()); } if (finder.preview != null) { + removeChildrenFrom(finder.preview); for (PreviewHandler previewHandler : previewHandlers) { previewHandler.onPreview(item, finder.preview); } diff --git a/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java b/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java index 96b5ae608..f9fbe8b2d 100644 --- a/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java +++ b/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java @@ -15,6 +15,8 @@ */ package org.patternfly.showcase.extension; +import java.util.List; +import java.util.Random; import java.util.function.Function; import org.jboss.elemento.Elements; @@ -29,17 +31,28 @@ import org.patternfly.extension.finder.FinderItemActions; import org.patternfly.extension.finder.FinderItemDescription; import org.patternfly.extension.finder.FinderPreview; +import org.patternfly.extension.finder.PreviewHandler; import org.patternfly.showcase.Snippet; import org.patternfly.showcase.SnippetPage; import org.patternfly.showcase.model.File; import org.patternfly.showcase.model.Files; +import org.patternfly.showcase.model.Record; +import org.patternfly.showcase.model.Track; +import elemental2.promise.Promise; +import static elemental2.dom.DomGlobal.setTimeout; +import static java.util.Arrays.asList; +import static java.util.Collections.singletonList; +import static java.util.stream.Collectors.toList; import static org.jboss.elemento.Elements.a; -import static org.jboss.elemento.Elements.removeChildrenFrom; +import static org.jboss.elemento.Elements.div; +import static org.jboss.elemento.Elements.img; import static org.patternfly.component.button.Button.button; import static org.patternfly.component.content.Content.content; import static org.patternfly.component.content.ContentType.h1; import static org.patternfly.component.content.ContentType.p; +import static org.patternfly.component.emptystate.EmptyState.emptyState; +import static org.patternfly.component.emptystate.EmptyStateBody.emptyStateBody; import static org.patternfly.component.icon.Icon.icon; import static org.patternfly.component.list.DescriptionList.descriptionList; import static org.patternfly.component.list.DescriptionListDescription.descriptionListDescription; @@ -51,9 +64,14 @@ import static org.patternfly.extension.finder.FinderColumnActions.finderColumnActions; import static org.patternfly.extension.finder.FinderColumnHeader.finderColumnHeader; import static org.patternfly.extension.finder.FinderColumnSearch.finderColumnSearch; +import static org.patternfly.extension.finder.FinderItem.emptyItem; import static org.patternfly.extension.finder.FinderItem.finderItem; import static org.patternfly.extension.finder.FinderPreview.finderPreview; +import static org.patternfly.icon.IconSets.fas.ban; +import static org.patternfly.icon.IconSets.fas.folder; +import static org.patternfly.icon.IconSets.fas.music; import static org.patternfly.icon.IconSets.fas.plus; +import static org.patternfly.icon.IconSets.fas.recordVinyl; import static org.patternfly.icon.IconSets.fas.redo; import static org.patternfly.icon.IconSets.fas.search; import static org.patternfly.icon.PredefinedIcon.predefinedIcon; @@ -62,14 +80,16 @@ import static org.patternfly.showcase.BuildingBlocks.mixedKebab; import static org.patternfly.showcase.Code.code; import static org.patternfly.showcase.Data.extensions; +import static org.patternfly.showcase.model.Discography.records; import static org.patternfly.style.Classes.filtered; import static org.patternfly.style.Classes.modifier; import static org.patternfly.style.Classes.util; +import static org.patternfly.style.Size.xs; @Route(value = "/extensions/finder", title = "Finder") public class FinderExtension extends SnippetPage { - @SuppressWarnings("unchecked") + @SuppressWarnings({"unchecked", "ExtractMethodRecommender"}) public FinderExtension() { super(extensions.get("finder")); @@ -153,7 +173,6 @@ public FinderExtension() { })) .onPreview((item, preview) -> { File file = item.get("file"); - removeChildrenFrom(preview); preview.add(content(h1) .add(icon(predefinedIcon(file.icon)).inline()) .add(" " + file.name)); @@ -174,6 +193,111 @@ public FinderExtension() { // @code-end:finder-preview )); + addSnippet(new Snippet("finder-async", "Async items", + content(p).editorial().add("The finder below contains the ") + .add(a("https://en.wikipedia.org/wiki/Red_Hot_Chili_Peppers#Discography", "_blank") + .text("discography")) + .add(" of the Red Hot Chili Peppers. The decades are added statically, the records are loaded ") + .add("asynchronously (with a random delay and error). If there are no records in a decade, an ") + .add("empty item is displayed. Once loaded the records won't be loaded again, until you reload them."), + code("finder-async"), () -> { + // @code-start:finder-async + int[][] decades = new int[][]{ + new int[]{1970, 1979}, + new int[]{1980, 1989}, + new int[]{1990, 1999}, + new int[]{2000, 2009}, + new int[]{2010, 2019}, + new int[]{2020, 2029}, + new int[]{2030, 2039}, + }; + + PreviewHandler recordPreview = (item, preview) -> { + Record record = item.get("record"); + preview.add(content(h1).text(record.title)) + .add(content(p).editorial().text("Released " + record.released)) + .add(div().add(img(record.cover))) + .add(content(p) + .add("More infos: ") + .add(a(record.url, "_blank").text(record.url))); + }; + PreviewHandler trackPreview = (item, preview) -> { + Track track = item.get("track"); + preview.add(content(h1).text(track.title)) + .add(descriptionList().horizontal().css(util("mt-sm")) + .addItem(descriptionListGroup() + .addTerm(descriptionListTerm("Title")) + .addDescription(descriptionListDescription(track.title))) + .addItem(descriptionListGroup() + .addTerm(descriptionListTerm("Length")) + .addDescription(descriptionListDescription(track.length))) + .run(dl -> { + if (track.writer != null) { + dl.addItem(descriptionListGroup() + .addTerm(descriptionListTerm("Writer")) + .addDescription(descriptionListDescription(String.join(", ", track.writer())))); + } + })); + }; + + Function recordItem = record -> finderItem(Id.build(record.title)) + .text(record.title) + .addDescription(String.valueOf(record.year)) + .icon(recordVinyl()) + .store("record", record) + .nextColumn(finderColumn(Id.build(record.title)) + .addHeader(finderColumnHeader(record.title)) + .addItems(record.tracks.asList(), track -> + finderItem(Id.build(record.title, String.valueOf(track.track))) + .text(track.track + ". " + track.title) + .icon(music()) + .store("track", track)) + .onPreview(trackPreview)); + + Function decadeColumn = decade -> finderColumn( + Id.build(String.valueOf(decade[0]), String.valueOf(decade[1]))) + .run(column -> column.addHeader(finderColumnHeader(decade[0] + " - " + decade[1]) + .addActions(finderColumnActions() + .addButton(button(redo()).plain() + .onClick((e, b) -> column.reload()))))) + .addItems(item -> new Promise<>((resolve, reject) -> { + boolean boom = Math.random() < 0.25; + int delay = new Random().nextInt(2000); // simulate remote call + setTimeout(__ -> { + if (boom) { + reject.onInvoke("Random error"); + } else { + List items = records(r -> r.year >= decade[0] && r.year <= decade[1]) + .stream() + .map(recordItem) + .collect(toList()); + if (items.isEmpty()) { + resolve.onInvoke(singletonList(emptyItem(emptyState() + .size(xs) + .text("No records") + .icon(ban()) + .addBody(emptyStateBody().text("No records have been released in this decade"))))); + } else { + resolve.onInvoke(items); + } + } + }, delay); + })) + .onPreview(recordPreview); + + return finder().style("height: 450px;") + .addItem(finderColumn("Decades") + .addHeader(finderColumnHeader("Decades")) + .addItems(asList(decades), + decade -> finderItem(Id.build(String.valueOf(decade[0]), String.valueOf(decade[1]))) + .text(decade[0] + " - " + decade[1]) + .icon(folder()) + .nextColumn(decadeColumn.apply(decade)))) + .addPreview(finderPreview().css(util("p-md"))) + .element(); + // @code-end:finder-async + })); + startApiDocs(Finder.class); addApiDoc(Finder.class, component); addApiDoc(FinderColumn.class, subcomponent); diff --git a/showcase/src/main/resources/org/patternfly/showcase/rhcp.json b/showcase/src/main/resources/org/patternfly/showcase/rhcp.json index 0005c7160..77bc06228 100644 --- a/showcase/src/main/resources/org/patternfly/showcase/rhcp.json +++ b/showcase/src/main/resources/org/patternfly/showcase/rhcp.json @@ -4,7 +4,7 @@ "released" : "Released: August 10, 1984", "year" : 1984, "url" : "https://en.wikipedia.org/wiki/The_Red_Hot_Chili_Peppers_(album)", - "cover" : "https://upload.wikimedia.org/wikipedia/en/5/5e/Rhcp1.jpg", + "cover" : "https://upload.wikimedia.org/wikipedia/en/5/5f/The_Red_Hot_Chili_Peppers_%28album_cover%29.jpg", "tracks" : [ { "track" : 1, From 76249ebde3470de505d27f0277ab1985fde80888 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 19 Mar 2026 19:36:59 +0100 Subject: [PATCH 011/430] Release 0.6.2 --- CHANGELOG.md | 5 ++++- README.md | 2 +- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 22 files changed, 25 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a00982b4d..ce2fcde7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +## [0.6.2] - 2026-03-19 + ### Added - Add support for async items to the finder component @@ -738,7 +740,8 @@ Stay tuned for more to come... - for dependency upgrades --> -[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.1...HEAD +[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.2...HEAD +[0.6.2]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.1...v0.6.2 [0.6.1]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.0...v0.6.1 [0.6.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.5.0...v0.6.0 [0.5.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.17...v0.5.0 diff --git a/README.md b/README.md index 2dc0d5265..a1ad3ef9a 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.1 + 0.6.2 pom import diff --git a/apidoc/pom.xml b/apidoc/pom.xml index acba3ef36..ddf36f680 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.2-SNAPSHOT + 0.6.2 ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index a10a80568..441c92fb4 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.2-SNAPSHOT + 0.6.2 pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index db4383092..ed92fe19d 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.2-SNAPSHOT + 0.6.2 ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 1ed6fbec6..b368d8dbe 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.2-SNAPSHOT", + "version": "0.6.2", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 391c8f981..1239037ba 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.2-SNAPSHOT + 0.6.2 ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index d6119c72f..fd5484a7c 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.2-SNAPSHOT + 0.6.2 ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index b5ac8c282..d1e9880cb 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.2-SNAPSHOT + 0.6.2 ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 2c2c49649..db4cfbdef 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.2-SNAPSHOT", + "version": "0.6.2", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 8b5baf6a0..929c9f04c 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.2-SNAPSHOT + 0.6.2 ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 3bff5609e..6d5ac185a 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.2-SNAPSHOT + 0.6.2 ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index bfc12f658..68ad2cc16 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.2-SNAPSHOT", + "version": "0.6.2", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index 2d2e95e57..da4dadbc4 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.2-SNAPSHOT + 0.6.2 ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 6e7c5d515..0c4691f49 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.2-SNAPSHOT + 0.6.2 ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index 8afe491e6..68a7064b1 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.2-SNAPSHOT + 0.6.2 ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 2f2968853..ea8c26f8e 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.2-SNAPSHOT + 0.6.2 ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 9e7926afb..e3bcf7f55 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.2-SNAPSHOT + 0.6.2 ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index c69950acf..4ea25606b 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.2-SNAPSHOT + 0.6.2 pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index 219723de8..c484f30c5 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.2-SNAPSHOT + 0.6.2 ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index da599f816..fc6f73bb0 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.2-SNAPSHOT + 0.6.2 pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 145c8e9dc..f39798c17 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.2-SNAPSHOT + 0.6.2 ../code-parent/pom.xml From eec2544858981e9e6761b5719dd8ab503ed5ced7 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 19 Mar 2026 19:37:09 +0100 Subject: [PATCH 012/430] Next is 0.6.3 --- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apidoc/pom.xml b/apidoc/pom.xml index ddf36f680..63c6dea64 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.2 + 0.6.3-SNAPSHOT ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 441c92fb4..86860c552 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.2 + 0.6.3-SNAPSHOT pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index ed92fe19d..593680986 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.2 + 0.6.3-SNAPSHOT ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index b368d8dbe..f4bb8e777 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.2", + "version": "0.6.3-SNAPSHOT", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 1239037ba..5e84208c1 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.2 + 0.6.3-SNAPSHOT ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index fd5484a7c..f687bcd7d 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.2 + 0.6.3-SNAPSHOT ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index d1e9880cb..7096152da 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.2 + 0.6.3-SNAPSHOT ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index db4cfbdef..ac030ec7e 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.2", + "version": "0.6.3-SNAPSHOT", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 929c9f04c..c215d5b26 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.2 + 0.6.3-SNAPSHOT ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 6d5ac185a..bef31d984 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.2 + 0.6.3-SNAPSHOT ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 68ad2cc16..d9453582b 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.2", + "version": "0.6.3-SNAPSHOT", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index da4dadbc4..126cb850c 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.2 + 0.6.3-SNAPSHOT ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 0c4691f49..c469bd868 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.2 + 0.6.3-SNAPSHOT ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index 68a7064b1..eb5586953 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.2 + 0.6.3-SNAPSHOT ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index ea8c26f8e..77d42476d 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.2 + 0.6.3-SNAPSHOT ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index e3bcf7f55..db2acfb22 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.2 + 0.6.3-SNAPSHOT ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 4ea25606b..5f3ca5dbf 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.2 + 0.6.3-SNAPSHOT pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index c484f30c5..f4d1bcd6b 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.2 + 0.6.3-SNAPSHOT ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index fc6f73bb0..fb25062d5 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.2 + 0.6.3-SNAPSHOT pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index f39798c17..510e48475 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.2 + 0.6.3-SNAPSHOT ../code-parent/pom.xml From 89ff555c7cc1cc0f9aacdc33679acee4684c2e89 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Fri, 20 Mar 2026 05:24:11 +0100 Subject: [PATCH 013/430] Fix NPM publishing --- .github/workflows/release.yml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index efb684bcf..04c7c86d2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -79,24 +79,22 @@ jobs: node-version: 25 registry-url: https://registry.npmjs.org - run: corepack enable + - name: Configure NPM Authentication + run: echo "//registry.npmjs.org/:_authToken=${NODE_AUTH_TOKEN}" > ~/.npmrc + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - name: Publish @patternfly-java/core working-directory: core/npm run: pnpm publish --access public --no-git-checks - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - name: Publish @patternfly-java/finder working-directory: extensions/finder/npm run: pnpm publish --access public --no-git-checks - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - name: Publish @patternfly-java/charts working-directory: charts/npm run: | pnpm install pnpm run build pnpm publish --access public --no-git-checks - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} publish-showcase: name: Publish Showcase From 1b0bf621d6f476fd95fc7df2c8d3f51a9bfb6e7c Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Fri, 20 Mar 2026 05:42:30 +0100 Subject: [PATCH 014/430] Add missing J2CL externs for the showcase --- CHANGELOG.md | 8 + .../META-INF/externs/showcase.externs.js | 258 ++++++++++++++++++ 2 files changed, 266 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ce2fcde7e..8e0d5e679 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +### Added + +- Add missing J2CL externs for the showcase + +### Fixed + +- Fix NPM publishing + ## [0.6.2] - 2026-03-19 ### Added diff --git a/showcase/src/main/resources/META-INF/externs/showcase.externs.js b/showcase/src/main/resources/META-INF/externs/showcase.externs.js index 4c727b7a9..5206804b1 100644 --- a/showcase/src/main/resources/META-INF/externs/showcase.externs.js +++ b/showcase/src/main/resources/META-INF/externs/showcase.externs.js @@ -66,6 +66,30 @@ Component.prototype.illustration /** @type {string} */ Component.prototype.summary +// ------------------------------------------------------ coordinates + +/** @constructor */ +function Coordinates() { +} + +/** @type {string} */ +Coordinates.prototype.latitude + +/** @type {string} */ +Coordinates.prototype.longitude + +// ------------------------------------------------------ date of birth + +/** @constructor */ +function DateOfBirth() { +} + +/** @type {string} */ +DateOfBirth.prototype.date + +/** @type {number} */ +DateOfBirth.prototype.age + // ------------------------------------------------------ extension /** @constructor */ @@ -87,6 +111,30 @@ Extension.prototype.clazz /** @type {string} */ Extension.prototype.summary +// ------------------------------------------------------ file + +/** @constructor */ +function File() { +} + +/** @type {string} */ +File.prototype.id + +/** @type {string} */ +File.prototype.name + +/** @type {string} */ +File.prototype.description + +/** @type {string} */ +File.prototype.icon + +/** @type {!Object} */ +File.prototype.meta + +/** @type {!Array} */ +File.prototype.children + // ------------------------------------------------------ layout /** @constructor */ @@ -107,3 +155,213 @@ Layout.prototype.clazz /** @type {string} */ Layout.prototype.summary + +// ------------------------------------------------------ location + +/** @constructor */ +function Location() { +} + +/** @type {!Street} */ +Location.prototype.street + +/** @type {string} */ +Location.prototype.city + +/** @type {string} */ +Location.prototype.state + +/** @type {string} */ +Location.prototype.postcode + +/** @type {!Coordinates} */ +Location.prototype.coordinates + +/** @type {!Timezone} */ +Location.prototype.timezone + +// ------------------------------------------------------ login + +/** @constructor */ +function Login() { +} + +/** @type {string} */ +Login.prototype.uuid + +/** @type {string} */ +Login.prototype.username + +/** @type {string} */ +Login.prototype.password + +/** @type {string} */ +Login.prototype.salt + +/** @type {string} */ +Login.prototype.md5 + +/** @type {string} */ +Login.prototype.sha1 + +/** @type {string} */ +Login.prototype.sha256 + +// ------------------------------------------------------ name + +/** @constructor */ +function Name() { +} + +/** @type {string} */ +Name.prototype.title + +/** @type {string} */ +Name.prototype.first + +/** @type {string} */ +Name.prototype.last + +// ------------------------------------------------------ picture + +/** @constructor */ +function Picture() { +} + +/** @type {string} */ +Picture.prototype.large + +/** @type {string} */ +Picture.prototype.medium + +/** @type {string} */ +Picture.prototype.thumbnail + +// ------------------------------------------------------ record + +/** @constructor */ +function Record() { +} + +/** @type {string} */ +Record.prototype.title + +/** @type {string} */ +Record.prototype.released + +/** @type {number} */ +Record.prototype.year + +/** @type {string} */ +Record.prototype.url + +/** @type {string} */ +Record.prototype.cover + +/** @type {!Array} */ +Record.prototype.tracks + +// ------------------------------------------------------ server + +/** @constructor */ +function Server() { +} + +/** @type {string} */ +Server.prototype.name + +/** @type {number} */ +Server.prototype.threads + +/** @type {number} */ +Server.prototype.applications + +/** @type {number} */ +Server.prototype.workspaces + +/** @type {string} */ +Server.prototype.status + +/** @type {string} */ +Server.prototype.location + +// ------------------------------------------------------ street + +/** @constructor */ +function Street() { +} + +/** @type {number} */ +Street.prototype.number + +/** @type {string} */ +Street.prototype.name + +// ------------------------------------------------------ timezone + +/** @constructor */ +function Timezone() { +} + +/** @type {string} */ +Timezone.prototype.offset + +/** @type {string} */ +Timezone.prototype.description + +// ------------------------------------------------------ track + +/** @constructor */ +function Track() { +} + +/** @type {number} */ +Track.prototype.track + +/** @type {string} */ +Track.prototype.title + +/** @type {!Array} */ +Track.prototype.writer + +/** @type {string} */ +Track.prototype.length + +// ------------------------------------------------------ user + +/** @constructor */ +function User() { +} + +/** @type {string} */ +User.prototype.gender + +/** @type {!Name} */ +User.prototype.name + +/** @type {!Location} */ +User.prototype.location + +/** @type {string} */ +User.prototype.email + +/** @type {!Login} */ +User.prototype.login + +/** @type {!DateOfBirth} */ +User.prototype.dob + +/** @type {!DateOfBirth} */ +User.prototype.registered + +/** @type {string} */ +User.prototype.phone + +/** @type {string} */ +User.prototype.cell + +/** @type {!Picture} */ +User.prototype.picture + +/** @type {string} */ +User.prototype.nat \ No newline at end of file From 1874986622a4d3d2fd048ca0e4e89a23aa9d50e2 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Fri, 20 Mar 2026 05:43:04 +0100 Subject: [PATCH 015/430] Release 0.6.3 --- CHANGELOG.md | 5 ++++- README.md | 2 +- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 22 files changed, 25 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e0d5e679..225d90ad8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +## [0.6.3] - 2026-03-20 + ### Added - Add missing J2CL externs for the showcase @@ -748,7 +750,8 @@ Stay tuned for more to come... - for dependency upgrades --> -[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.2...HEAD +[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.3...HEAD +[0.6.3]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.2...v0.6.3 [0.6.2]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.1...v0.6.2 [0.6.1]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.0...v0.6.1 [0.6.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.5.0...v0.6.0 diff --git a/README.md b/README.md index a1ad3ef9a..d04f7f574 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.2 + 0.6.3 pom import diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 63c6dea64..6fe230055 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.3-SNAPSHOT + 0.6.3 ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 86860c552..fe7a0ece5 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.3-SNAPSHOT + 0.6.3 pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index 593680986..caea43156 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.3-SNAPSHOT + 0.6.3 ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index f4bb8e777..0a4ff0407 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.3-SNAPSHOT", + "version": "0.6.3", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 5e84208c1..28895b769 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.3-SNAPSHOT + 0.6.3 ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index f687bcd7d..469700915 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.3-SNAPSHOT + 0.6.3 ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 7096152da..d00f24a2c 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.3-SNAPSHOT + 0.6.3 ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index ac030ec7e..2c77237fe 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.3-SNAPSHOT", + "version": "0.6.3", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index c215d5b26..a4cd56661 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.3-SNAPSHOT + 0.6.3 ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index bef31d984..2a9b68476 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.3-SNAPSHOT + 0.6.3 ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index d9453582b..c44e263c6 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.3-SNAPSHOT", + "version": "0.6.3", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index 126cb850c..c6a5a0fb3 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.3-SNAPSHOT + 0.6.3 ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index c469bd868..966f8a161 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.3-SNAPSHOT + 0.6.3 ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index eb5586953..163b1224d 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.3-SNAPSHOT + 0.6.3 ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 77d42476d..ad4b13387 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.3-SNAPSHOT + 0.6.3 ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index db2acfb22..f66a93e84 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.3-SNAPSHOT + 0.6.3 ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 5f3ca5dbf..29d2c5d74 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.3-SNAPSHOT + 0.6.3 pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index f4d1bcd6b..bd7b9d870 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.3-SNAPSHOT + 0.6.3 ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index fb25062d5..8f5b7d220 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.3-SNAPSHOT + 0.6.3 pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 510e48475..7f7beda54 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.3-SNAPSHOT + 0.6.3 ../code-parent/pom.xml From 8bf9d26babf75cd346fe2dc4de46a1cbaad69e3a Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Fri, 20 Mar 2026 05:43:13 +0100 Subject: [PATCH 016/430] Next is 0.6.4 --- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 6fe230055..37c82478f 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.3 + 0.6.4-SNAPSHOT ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index fe7a0ece5..5b2c6c1f8 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.3 + 0.6.4-SNAPSHOT pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index caea43156..633ee402d 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.3 + 0.6.4-SNAPSHOT ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 0a4ff0407..2e4688c9c 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.3", + "version": "0.6.4-SNAPSHOT", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 28895b769..350374038 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.3 + 0.6.4-SNAPSHOT ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 469700915..8938e910c 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.3 + 0.6.4-SNAPSHOT ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index d00f24a2c..30ee430d0 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.3 + 0.6.4-SNAPSHOT ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 2c77237fe..26de55918 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.3", + "version": "0.6.4-SNAPSHOT", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index a4cd56661..5afdb30e4 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.3 + 0.6.4-SNAPSHOT ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 2a9b68476..f40a81876 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.3 + 0.6.4-SNAPSHOT ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index c44e263c6..d1e0c9246 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.3", + "version": "0.6.4-SNAPSHOT", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index c6a5a0fb3..fc52a19c3 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.3 + 0.6.4-SNAPSHOT ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 966f8a161..8bc3a6674 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.3 + 0.6.4-SNAPSHOT ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index 163b1224d..becedb66b 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.3 + 0.6.4-SNAPSHOT ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index ad4b13387..f7cdd30b0 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.3 + 0.6.4-SNAPSHOT ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index f66a93e84..47fb3a397 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.3 + 0.6.4-SNAPSHOT ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 29d2c5d74..1253e0227 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.3 + 0.6.4-SNAPSHOT pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index bd7b9d870..ae4949e12 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.3 + 0.6.4-SNAPSHOT ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 8f5b7d220..ed45bb8f3 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.3 + 0.6.4-SNAPSHOT pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 7f7beda54..d619367ca 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.3 + 0.6.4-SNAPSHOT ../code-parent/pom.xml From bb910307164e34243e55c5a963e20b24694eddda Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Fri, 20 Mar 2026 11:15:21 +0100 Subject: [PATCH 017/430] Fix NPM publishing --- .github/workflows/release.yml | 1 - CHANGELOG.md | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 04c7c86d2..e79b763a0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -77,7 +77,6 @@ jobs: - uses: actions/setup-node@v6 with: node-version: 25 - registry-url: https://registry.npmjs.org - run: corepack enable - name: Configure NPM Authentication run: echo "//registry.npmjs.org/:_authToken=${NODE_AUTH_TOKEN}" > ~/.npmrc diff --git a/CHANGELOG.md b/CHANGELOG.md index 225d90ad8..354f7dec9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +### Fixed + +- Fix NPM publishing + ## [0.6.3] - 2026-03-20 ### Added From 8ad228636172623098b73b784adafffae647d8f7 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Fri, 20 Mar 2026 11:16:10 +0100 Subject: [PATCH 018/430] Release 0.6.4 --- CHANGELOG.md | 5 ++++- README.md | 2 +- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 22 files changed, 25 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 354f7dec9..d1590e4c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +## [0.6.4] - 2026-03-20 + ### Fixed - Fix NPM publishing @@ -754,7 +756,8 @@ Stay tuned for more to come... - for dependency upgrades --> -[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.3...HEAD +[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.4...HEAD +[0.6.4]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.3...v0.6.4 [0.6.3]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.2...v0.6.3 [0.6.2]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.1...v0.6.2 [0.6.1]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.0...v0.6.1 diff --git a/README.md b/README.md index d04f7f574..4248e4344 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.3 + 0.6.4 pom import diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 37c82478f..7f877bef7 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.4-SNAPSHOT + 0.6.4 ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 5b2c6c1f8..674d6a483 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.4-SNAPSHOT + 0.6.4 pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index 633ee402d..df4e28f6d 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.4-SNAPSHOT + 0.6.4 ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 2e4688c9c..05954775e 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.4-SNAPSHOT", + "version": "0.6.4", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 350374038..ffb7f2007 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.4-SNAPSHOT + 0.6.4 ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 8938e910c..117b57a80 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.4-SNAPSHOT + 0.6.4 ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 30ee430d0..671d3908b 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.4-SNAPSHOT + 0.6.4 ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 26de55918..6ecc0f91a 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.4-SNAPSHOT", + "version": "0.6.4", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 5afdb30e4..467810835 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.4-SNAPSHOT + 0.6.4 ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index f40a81876..16454eca1 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.4-SNAPSHOT + 0.6.4 ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index d1e0c9246..961984048 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.4-SNAPSHOT", + "version": "0.6.4", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index fc52a19c3..f2acc9672 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.4-SNAPSHOT + 0.6.4 ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 8bc3a6674..be030d336 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.4-SNAPSHOT + 0.6.4 ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index becedb66b..8af389bdd 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.4-SNAPSHOT + 0.6.4 ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index f7cdd30b0..1e550366b 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.4-SNAPSHOT + 0.6.4 ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 47fb3a397..d51cefd48 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.4-SNAPSHOT + 0.6.4 ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 1253e0227..ea0ca2b35 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.4-SNAPSHOT + 0.6.4 pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index ae4949e12..59ac49429 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.4-SNAPSHOT + 0.6.4 ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index ed45bb8f3..3ca7fe6fd 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.4-SNAPSHOT + 0.6.4 pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index d619367ca..1d70595a1 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.4-SNAPSHOT + 0.6.4 ../code-parent/pom.xml From 85ebe613510267dc307e7e1d177d466329decdcf Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Fri, 20 Mar 2026 11:16:19 +0100 Subject: [PATCH 019/430] Next is 0.6.5 --- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 7f877bef7..5c253636b 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.4 + 0.6.5-SNAPSHOT ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 674d6a483..0a31a4b7f 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.4 + 0.6.5-SNAPSHOT pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index df4e28f6d..e747fdbd3 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.4 + 0.6.5-SNAPSHOT ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 05954775e..da998cce2 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.4", + "version": "0.6.5-SNAPSHOT", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index ffb7f2007..b0f646214 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.4 + 0.6.5-SNAPSHOT ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 117b57a80..dde8107fb 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.4 + 0.6.5-SNAPSHOT ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 671d3908b..3536f5a5d 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.4 + 0.6.5-SNAPSHOT ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 6ecc0f91a..2b6e8ce93 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.4", + "version": "0.6.5-SNAPSHOT", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 467810835..8f8f90023 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.4 + 0.6.5-SNAPSHOT ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 16454eca1..882ad8354 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.4 + 0.6.5-SNAPSHOT ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 961984048..5668d7828 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.4", + "version": "0.6.5-SNAPSHOT", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index f2acc9672..045ffcac3 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.4 + 0.6.5-SNAPSHOT ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index be030d336..a24be9686 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.4 + 0.6.5-SNAPSHOT ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index 8af389bdd..d4a3b2ef9 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.4 + 0.6.5-SNAPSHOT ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 1e550366b..4e6c69a52 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.4 + 0.6.5-SNAPSHOT ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index d51cefd48..4d45ed733 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.4 + 0.6.5-SNAPSHOT ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index ea0ca2b35..a305e0064 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.4 + 0.6.5-SNAPSHOT pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index 59ac49429..243ac8165 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.4 + 0.6.5-SNAPSHOT ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 3ca7fe6fd..ab221731f 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.4 + 0.6.5-SNAPSHOT pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 1d70595a1..402b801c1 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.4 + 0.6.5-SNAPSHOT ../code-parent/pom.xml From 5ba53ce3fbceb02f865c3d9f8632c7a2c06f7945 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Fri, 20 Mar 2026 11:51:25 +0100 Subject: [PATCH 020/430] Rename File and Location model classes to avoid J2CL extern conflicts The J2CL compiler generates JavaScript externs using the Java class simple name. File and Location clashed with browser built-in globals (File API and Location API), causing JSC_VAR_MULTIPLY_DECLARED_ERROR. Renamed to FileData and LocationData. --- .../patternfly/showcase/extension/FinderExtension.java | 9 +++++---- .../showcase/model/{File.java => FileData.java} | 4 ++-- .../main/java/org/patternfly/showcase/model/Files.java | 2 +- .../showcase/model/{Location.java => LocationData.java} | 2 +- .../main/java/org/patternfly/showcase/model/User.java | 2 +- 5 files changed, 10 insertions(+), 9 deletions(-) rename showcase/src/main/java/org/patternfly/showcase/model/{File.java => FileData.java} (94%) rename showcase/src/main/java/org/patternfly/showcase/model/{Location.java => LocationData.java} (97%) diff --git a/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java b/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java index f9fbe8b2d..a74ea2041 100644 --- a/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java +++ b/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java @@ -34,10 +34,11 @@ import org.patternfly.extension.finder.PreviewHandler; import org.patternfly.showcase.Snippet; import org.patternfly.showcase.SnippetPage; -import org.patternfly.showcase.model.File; +import org.patternfly.showcase.model.FileData; import org.patternfly.showcase.model.Files; import org.patternfly.showcase.model.Record; import org.patternfly.showcase.model.Track; + import elemental2.promise.Promise; import static elemental2.dom.DomGlobal.setTimeout; @@ -106,8 +107,8 @@ public FinderExtension() { code("finder-basic"), () -> { // @code-start:finder-basic // Declare the functions as final arrays here so that they can call each other - final Function[] fileItem = new Function[1]; - final Function[] fileColumn = new Function[1]; + final Function[] fileItem = new Function[1]; + final Function[] fileColumn = new Function[1]; Function demoHeader = text -> finderColumnHeader(text) .addActions(finderColumnActions() @@ -172,7 +173,7 @@ public FinderExtension() { } })) .onPreview((item, preview) -> { - File file = item.get("file"); + FileData file = item.get("file"); preview.add(content(h1) .add(icon(predefinedIcon(file.icon)).inline()) .add(" " + file.name)); diff --git a/showcase/src/main/java/org/patternfly/showcase/model/File.java b/showcase/src/main/java/org/patternfly/showcase/model/FileData.java similarity index 94% rename from showcase/src/main/java/org/patternfly/showcase/model/File.java rename to showcase/src/main/java/org/patternfly/showcase/model/FileData.java index 81a148581..6e2fc26aa 100644 --- a/showcase/src/main/java/org/patternfly/showcase/model/File.java +++ b/showcase/src/main/java/org/patternfly/showcase/model/FileData.java @@ -21,12 +21,12 @@ import jsinterop.base.JsPropertyMap; @JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "Object") -public class File { +public class FileData { public String id; public String name; public String description; public String icon; public JsPropertyMap meta; - public JsArray children; + public JsArray children; } diff --git a/showcase/src/main/java/org/patternfly/showcase/model/Files.java b/showcase/src/main/java/org/patternfly/showcase/model/Files.java index 92bc6f23d..369952f41 100644 --- a/showcase/src/main/java/org/patternfly/showcase/model/Files.java +++ b/showcase/src/main/java/org/patternfly/showcase/model/Files.java @@ -24,7 +24,7 @@ public class Files { - public static JsArray data; + public static JsArray data; static { data = Js.cast(JSON.parse(ResourcesImpl.INSTANCE.files().getText())); diff --git a/showcase/src/main/java/org/patternfly/showcase/model/Location.java b/showcase/src/main/java/org/patternfly/showcase/model/LocationData.java similarity index 97% rename from showcase/src/main/java/org/patternfly/showcase/model/Location.java rename to showcase/src/main/java/org/patternfly/showcase/model/LocationData.java index f66c9e803..7f53b3c84 100644 --- a/showcase/src/main/java/org/patternfly/showcase/model/Location.java +++ b/showcase/src/main/java/org/patternfly/showcase/model/LocationData.java @@ -19,7 +19,7 @@ import jsinterop.annotations.JsType; @JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "Object") -public class Location { +public class LocationData { public Street street; public String city; diff --git a/showcase/src/main/java/org/patternfly/showcase/model/User.java b/showcase/src/main/java/org/patternfly/showcase/model/User.java index 9c2aa9a42..878927f0e 100644 --- a/showcase/src/main/java/org/patternfly/showcase/model/User.java +++ b/showcase/src/main/java/org/patternfly/showcase/model/User.java @@ -50,7 +50,7 @@ public class User { public String gender; public Name name; - public Location location; + public LocationData location; public String email; public Login login; public DateOfBirth dob; From bb3f20de78f7f15cf1863e73ed9d1bed68e4fd36 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Fri, 20 Mar 2026 11:59:03 +0100 Subject: [PATCH 021/430] Fix showcase externs --- CHANGELOG.md | 4 +++ .../extension/finder/FinderItem.java | 1 + .../META-INF/externs/showcase.externs.js | 36 +++++++++---------- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d1590e4c6..9b2250591 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +### Fixed + +- Fix showcase externs + ## [0.6.4] - 2026-03-20 ### Fixed diff --git a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItem.java b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItem.java index be5042928..73f719dd0 100644 --- a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItem.java +++ b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItem.java @@ -33,6 +33,7 @@ import org.patternfly.core.ComponentContext; import org.patternfly.core.Dataset; import org.patternfly.style.Classes; + import elemental2.dom.Element; import elemental2.dom.Event; import elemental2.dom.HTMLElement; diff --git a/showcase/src/main/resources/META-INF/externs/showcase.externs.js b/showcase/src/main/resources/META-INF/externs/showcase.externs.js index 5206804b1..261ad4cf6 100644 --- a/showcase/src/main/resources/META-INF/externs/showcase.externs.js +++ b/showcase/src/main/resources/META-INF/externs/showcase.externs.js @@ -111,29 +111,29 @@ Extension.prototype.clazz /** @type {string} */ Extension.prototype.summary -// ------------------------------------------------------ file +// ------------------------------------------------------ file data /** @constructor */ -function File() { +function FileData() { } /** @type {string} */ -File.prototype.id +FileData.prototype.id /** @type {string} */ -File.prototype.name +FileData.prototype.name /** @type {string} */ -File.prototype.description +FileData.prototype.description /** @type {string} */ -File.prototype.icon +FileData.prototype.icon /** @type {!Object} */ -File.prototype.meta +FileData.prototype.meta -/** @type {!Array} */ -File.prototype.children +/** @type {!Array} */ +FileData.prototype.children // ------------------------------------------------------ layout @@ -156,29 +156,29 @@ Layout.prototype.clazz /** @type {string} */ Layout.prototype.summary -// ------------------------------------------------------ location +// ------------------------------------------------------ location data /** @constructor */ -function Location() { +function LocationData() { } /** @type {!Street} */ -Location.prototype.street +LocationData.prototype.street /** @type {string} */ -Location.prototype.city +LocationData.prototype.city /** @type {string} */ -Location.prototype.state +LocationData.prototype.state /** @type {string} */ -Location.prototype.postcode +LocationData.prototype.postcode /** @type {!Coordinates} */ -Location.prototype.coordinates +LocationData.prototype.coordinates /** @type {!Timezone} */ -Location.prototype.timezone +LocationData.prototype.timezone // ------------------------------------------------------ login @@ -339,7 +339,7 @@ User.prototype.gender /** @type {!Name} */ User.prototype.name -/** @type {!Location} */ +/** @type {!LocationData} */ User.prototype.location /** @type {string} */ From 9e1395bfb61b21f9283628e9cb796729849cecd0 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Fri, 20 Mar 2026 12:06:34 +0100 Subject: [PATCH 022/430] Release 0.6.5 --- CHANGELOG.md | 5 ++++- README.md | 2 +- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 22 files changed, 25 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b2250591..d524b905d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +## [0.6.5] - 2026-03-20 + ### Fixed - Fix showcase externs @@ -760,7 +762,8 @@ Stay tuned for more to come... - for dependency upgrades --> -[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.4...HEAD +[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.5...HEAD +[0.6.5]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.4...v0.6.5 [0.6.4]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.3...v0.6.4 [0.6.3]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.2...v0.6.3 [0.6.2]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.1...v0.6.2 diff --git a/README.md b/README.md index 4248e4344..7ba688745 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.4 + 0.6.5 pom import diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 5c253636b..8fa7c0286 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.5-SNAPSHOT + 0.6.5 ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 0a31a4b7f..e5c43ad7f 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.5-SNAPSHOT + 0.6.5 pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index e747fdbd3..aaad48778 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.5-SNAPSHOT + 0.6.5 ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index da998cce2..a85b301f9 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.5-SNAPSHOT", + "version": "0.6.5", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index b0f646214..1f72c6b4c 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.5-SNAPSHOT + 0.6.5 ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index dde8107fb..bab2ccf58 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.5-SNAPSHOT + 0.6.5 ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 3536f5a5d..ebb2571ae 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.5-SNAPSHOT + 0.6.5 ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 2b6e8ce93..933c6c09e 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.5-SNAPSHOT", + "version": "0.6.5", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 8f8f90023..025cce526 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.5-SNAPSHOT + 0.6.5 ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 882ad8354..ca248d7a5 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.5-SNAPSHOT + 0.6.5 ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 5668d7828..7cbfb92bf 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.5-SNAPSHOT", + "version": "0.6.5", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index 045ffcac3..e3623eb62 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.5-SNAPSHOT + 0.6.5 ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index a24be9686..38d5919db 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.5-SNAPSHOT + 0.6.5 ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index d4a3b2ef9..c86133470 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.5-SNAPSHOT + 0.6.5 ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 4e6c69a52..89eea3b47 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.5-SNAPSHOT + 0.6.5 ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 4d45ed733..69951e5ff 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.5-SNAPSHOT + 0.6.5 ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index a305e0064..a6b89f7fc 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.5-SNAPSHOT + 0.6.5 pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index 243ac8165..73987d07c 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.5-SNAPSHOT + 0.6.5 ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index ab221731f..be05616d6 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.5-SNAPSHOT + 0.6.5 pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 402b801c1..dc7d3849a 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.5-SNAPSHOT + 0.6.5 ../code-parent/pom.xml From ccf644967fb9449be60a2b771bcd193d6efb9e49 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Fri, 20 Mar 2026 12:06:43 +0100 Subject: [PATCH 023/430] Next is 0.6.6 --- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 8fa7c0286..a9de69330 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.5 + 0.6.6-SNAPSHOT ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index e5c43ad7f..ed4e0ea3d 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.5 + 0.6.6-SNAPSHOT pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index aaad48778..2ce538c34 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.5 + 0.6.6-SNAPSHOT ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index a85b301f9..191617cd1 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.5", + "version": "0.6.6-SNAPSHOT", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 1f72c6b4c..e34c217bc 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.5 + 0.6.6-SNAPSHOT ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index bab2ccf58..cc9135146 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.5 + 0.6.6-SNAPSHOT ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index ebb2571ae..dce16659e 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.5 + 0.6.6-SNAPSHOT ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 933c6c09e..6e09d2fa4 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.5", + "version": "0.6.6-SNAPSHOT", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 025cce526..e93ce9be2 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.5 + 0.6.6-SNAPSHOT ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index ca248d7a5..ae38ea36b 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.5 + 0.6.6-SNAPSHOT ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 7cbfb92bf..bae08e974 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.5", + "version": "0.6.6-SNAPSHOT", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index e3623eb62..a1695aacd 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.5 + 0.6.6-SNAPSHOT ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 38d5919db..db5fcfc2b 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.5 + 0.6.6-SNAPSHOT ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index c86133470..d1d7b5167 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.5 + 0.6.6-SNAPSHOT ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 89eea3b47..c354db84c 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.5 + 0.6.6-SNAPSHOT ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 69951e5ff..866dfa413 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.5 + 0.6.6-SNAPSHOT ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index a6b89f7fc..5529a1ab2 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.5 + 0.6.6-SNAPSHOT pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index 73987d07c..d27ce694e 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.5 + 0.6.6-SNAPSHOT ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index be05616d6..d471b9d6a 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.5 + 0.6.6-SNAPSHOT pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index dc7d3849a..742af6ec1 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.5 + 0.6.6-SNAPSHOT ../code-parent/pom.xml From 75dc65e3d5c057bf5f71e8ab4628ce91b378fee3 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Fri, 20 Mar 2026 18:14:43 +0100 Subject: [PATCH 024/430] Add support for finder item actions --- CHANGELOG.md | 6 +++ .../component/menu/MenuToggleAction.java | 4 ++ extensions/finder/npm/finder.css | 27 +++++++--- .../patternfly/extension/finder/Finder.java | 6 +++ .../extension/finder/FinderClasses.java | 1 + .../extension/finder/FinderColumn.java | 15 ++++++ .../extension/finder/FinderItem.java | 34 ++++++++----- .../extension/finder/FinderItemActions.java | 5 +- showcase/package.json | 2 +- .../showcase/demo/FinderRhcpDemo.java | 19 +++++++ .../showcase/extension/FinderExtension.java | 10 ++-- .../patternfly/showcase/model/FileData.java | 49 +++++++++++++++++++ .../META-INF/externs/showcase.externs.js | 3 ++ .../org/patternfly/showcase/files.json | 30 +++++++----- showcase/src/web/pforg/tableOfContents.css | 3 +- 15 files changed, 178 insertions(+), 36 deletions(-) create mode 100644 showcase/src/main/java/org/patternfly/showcase/demo/FinderRhcpDemo.java diff --git a/CHANGELOG.md b/CHANGELOG.md index d524b905d..c5df04bb4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +### Added + +- Add support for finder item actions +- Add `Finder.bordered(boolean)` +- Add `Finder.pinnable(boolean)` + ## [0.6.5] - 2026-03-20 ### Fixed diff --git a/components/src/main/java/org/patternfly/component/menu/MenuToggleAction.java b/components/src/main/java/org/patternfly/component/menu/MenuToggleAction.java index 1d46b637a..c03fa98f9 100644 --- a/components/src/main/java/org/patternfly/component/menu/MenuToggleAction.java +++ b/components/src/main/java/org/patternfly/component/menu/MenuToggleAction.java @@ -35,6 +35,10 @@ public class MenuToggleAction extends MenuToggleSubComponent implements Attachable, + Bordered, HasItems { // ------------------------------------------------------ factory @@ -293,6 +295,10 @@ private void handleKeydown(KeyboardEvent event) { markActive(previousColumn); targetItem.focus(); scrollIntoView(previousColumn); + FinderItem previousItem = previousColumn.item(targetItem.dataset.get(Dataset.identifier)); + if (previousItem != null) { + previousItem.previewItem(this, previousColumn, previousItem); + } } } diff --git a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderClasses.java b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderClasses.java index 182c0b87e..e9e654270 100644 --- a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderClasses.java +++ b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderClasses.java @@ -23,5 +23,6 @@ interface FinderClasses { String folder = "folder"; String items = "items"; String pin = "pin"; + String pinnable = "pinnable"; String preview = "preview"; } diff --git a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java index fc9fcca50..15bb0aad0 100644 --- a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java +++ b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java @@ -97,6 +97,7 @@ public static FinderColumn finderColumn(String identifier) { private final AurHandler aur; private final List> selectHandler; private final HTMLContainerBuilder ul; + private boolean pinnable; private AsyncStatus status; private Comparator comparator; private AsyncItems asyncItems; @@ -141,6 +142,9 @@ public FinderColumn add(FinderColumnSearch search) { @Override public FinderColumn add(FinderItem item) { item.column = this; + if (pinnable) { + item.makePinnable(); + } addOrdered(ul, item); items.put(item.identifier(), item); return aur.added(item); @@ -170,6 +174,17 @@ public FinderColumn ordered(Comparator comparator) { return this; } + /** Same as {@linkplain #pinnable(boolean) pinnable(true)} */ + public FinderColumn pinnable() { + return pinnable(true); + } + + /** Adds/removes {@linkplain Classes#modifier(String) modifier(pinnable)} */ + public FinderColumn pinnable(boolean pinnable) { + this.pinnable = pinnable; + return toggleModifier(this, element(), FinderClasses.pinnable, pinnable); + } + @Override public FinderColumn store(String key, T value) { data.put(key, value); diff --git a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItem.java b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItem.java index 73f719dd0..ea5c4e3a6 100644 --- a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItem.java +++ b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItem.java @@ -163,10 +163,6 @@ private static FinderItem statusItem(String identifier) { .add(ic = span().css(component(finder, item, icon))) .add(cc = span().css(component(finder, item, content)) .add(tc = span().css(component(finder, item, Classes.text)))) - .add(button().css(component(finder, item, pin)) - .on(click, this::togglePin) - .add(thumbtack().css(component(finder, item, pin, icon) + "--default")) - .add(times().css(component(finder, item, pin, icon) + "--pinned"))) .add(span().css(component(finder, item, folder, icon)) .add(angleRight()))); } @@ -288,15 +284,7 @@ void handleClick(Finder finder, FinderColumn column, FinderItem item) { if (hasNext()) { finder.addItem(nextColumn()); } - if (finder.preview != null) { - removeChildrenFrom(finder.preview); - for (PreviewHandler previewHandler : previewHandlers) { - previewHandler.onPreview(item, finder.preview); - } - for (PreviewHandler previewHandler : column.previewHandlers) { - previewHandler.onPreview(item, finder.preview); - } - } + previewItem(finder, column, item); } void markSelected(boolean selected) { @@ -312,7 +300,27 @@ FinderColumn nextColumn() { return nextColumn != null ? nextColumn : nextColumnSupplier != null ? nextColumnSupplier.get() : null; } + void makePinnable() { + insertAfter(button().css(component(finder, item, pin)) + .on(click, this::togglePin) + .add(thumbtack().css(component(finder, item, pin, icon) + "--default")) + .add(times().css(component(finder, item, pin, icon) + "--pinned")) + .element(), cc.element()); + } + void togglePin(Event event) { event.stopPropagation(); } + + void previewItem(Finder finder, FinderColumn column, FinderItem item) { + if (finder.preview != null) { + removeChildrenFrom(finder.preview); + for (PreviewHandler previewHandler : previewHandlers) { + previewHandler.onPreview(item, finder.preview); + } + for (PreviewHandler previewHandler : column.previewHandlers) { + previewHandler.onPreview(item, finder.preview); + } + } + } } diff --git a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItemActions.java b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItemActions.java index d4914dab8..7151798ab 100644 --- a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItemActions.java +++ b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItemActions.java @@ -15,9 +15,11 @@ */ package org.patternfly.extension.finder; +import org.jboss.elemento.EventType; import org.patternfly.component.button.Button; import org.patternfly.component.menu.Dropdown; +import elemental2.dom.Event; import elemental2.dom.HTMLElement; import static org.jboss.elemento.Elements.span; @@ -30,7 +32,7 @@ public class FinderItemActions extends FinderSubComponent fileColumn[0].apply(file)); } }); - return finder().addItem(finderColumn("root").run(column -> column + return finder().bordered() + .addItem(finderColumn("root").run(column -> column .addHeader(demoHeader.apply("Root")) .addSearch(finderColumnSearch() .addSearchInput(searchInput(Id.unique("finder-basic")) @@ -161,7 +165,7 @@ public FinderExtension() { addSnippet(new Snippet("finder-preview", "With preview", code("finder-preview"), () -> // @code-start:finder-preview - finder() + finder().bordered() .addItem(finderColumn("root") .addHeader(finderColumnHeader("Root")) .addItems(Files.data.asList(), file -> finderItem(file.id, file.name) @@ -286,7 +290,7 @@ public FinderExtension() { })) .onPreview(recordPreview); - return finder().style("height: 450px;") + return finder().bordered().style("height: 500px;") .addItem(finderColumn("Decades") .addHeader(finderColumnHeader("Decades")) .addItems(asList(decades), diff --git a/showcase/src/main/java/org/patternfly/showcase/model/FileData.java b/showcase/src/main/java/org/patternfly/showcase/model/FileData.java index 6e2fc26aa..4928964ff 100644 --- a/showcase/src/main/java/org/patternfly/showcase/model/FileData.java +++ b/showcase/src/main/java/org/patternfly/showcase/model/FileData.java @@ -15,11 +15,26 @@ */ package org.patternfly.showcase.model; +import org.jboss.elemento.Id; +import org.patternfly.component.button.Button; +import org.patternfly.extension.finder.FinderItemActions; + import elemental2.core.JsArray; +import jsinterop.annotations.JsOverlay; import jsinterop.annotations.JsPackage; import jsinterop.annotations.JsType; import jsinterop.base.JsPropertyMap; +import static org.patternfly.component.button.Button.button; +import static org.patternfly.component.menu.Dropdown.dropdown; +import static org.patternfly.component.menu.DropdownMenu.dropdownMenu; +import static org.patternfly.component.menu.MenuContent.menuContent; +import static org.patternfly.component.menu.MenuItem.menuItem; +import static org.patternfly.component.menu.MenuList.menuList; +import static org.patternfly.extension.finder.FinderItemActions.finderItemActions; +import static org.patternfly.icon.IconSets.fas.ellipsisV; +import static org.patternfly.icon.PredefinedIcon.predefinedIcon; + @JsType(isNative = true, namespace = JsPackage.GLOBAL, name = "Object") public class FileData { @@ -27,6 +42,40 @@ public class FileData { public String name; public String description; public String icon; + public JsArray actions; public JsPropertyMap meta; public JsArray children; + + @JsOverlay + public final FinderItemActions itemActions() { + if (actions != null && actions.length > 0) { + FinderItemActions fia = finderItemActions(); + fia.addButton(iconOrText(actions.getAt(0))); + if (actions.length > 2) { // all actions should be text only + fia.addDropdown(dropdown(ellipsisV(), "kebab dropdown toggle") + .addMenu(dropdownMenu() + .addContent(menuContent() + .addList(menuList().run(ml -> { + for (int i = 1; i < actions.length; i++) { + ml.addItem(menuItem(Id.build(actions.getAt(i)), actions.getAt(i))); + } + }))))); + } else { + for (int i = 1; i < actions.length; i++) { + fia.addButton(iconOrText(actions.getAt(i))); + } + } + return fia; + } + return null; + } + + @JsOverlay + final Button iconOrText(String value) { + if (value.startsWith("fa") && value.contains(".")) { + return button(predefinedIcon(value)).plain(); + } else { + return button(value).plain(); + } + } } diff --git a/showcase/src/main/resources/META-INF/externs/showcase.externs.js b/showcase/src/main/resources/META-INF/externs/showcase.externs.js index 261ad4cf6..50f30c97b 100644 --- a/showcase/src/main/resources/META-INF/externs/showcase.externs.js +++ b/showcase/src/main/resources/META-INF/externs/showcase.externs.js @@ -129,6 +129,9 @@ FileData.prototype.description /** @type {string} */ FileData.prototype.icon +/** @type {!Array} */ +FileData.prototype.actions + /** @type {!Object} */ FileData.prototype.meta diff --git a/showcase/src/main/resources/org/patternfly/showcase/files.json b/showcase/src/main/resources/org/patternfly/showcase/files.json index 258872300..a0208ccaf 100644 --- a/showcase/src/main/resources/org/patternfly/showcase/files.json +++ b/showcase/src/main/resources/org/patternfly/showcase/files.json @@ -4,7 +4,6 @@ "name": "Applications", "description": "Installed applications", "icon": "fab.appStore", - "actions": true, "meta": { "Kind": "Folder", "Created": "2024-01-15" }, "children": [ { @@ -12,7 +11,7 @@ "name": "Web Browser", "description": "Browse the internet", "icon": "fas.globe", - "actions": true, + "actions": ["far.playCircle"], "meta": { "Kind": "Application", "Version": "120.0", "Size": "245 MB" } }, { @@ -20,39 +19,41 @@ "name": "Code Editor", "description": "Write and edit code", "icon": "fas.code", - "actions": true, + "actions": ["far.playCircle"], "meta": { "Kind": "Application", "Version": "1.85.0", "Size": "380 MB" } }, { "id": "terminal", "name": "Terminal", "icon": "fas.terminal", - "actions": true, + "actions": ["far.playCircle"], "meta": { "Kind": "Application", "Version": "2.12", "Size": "12 MB" } }, { "id": "utilities", "name": "Utilities", "icon": "fas.wrench", - "actions": true, "meta": { "Kind": "Folder", "Created": "2024-02-10" }, "children": [ { "id": "calculator", "name": "Calculator", "icon": "fas.calculator", + "actions": ["far.playCircle"], "meta": { "Kind": "Application", "Size": "5 MB" } }, { "id": "screenshot", "name": "Screenshot", "icon": "fas.camera", + "actions": ["far.playCircle"], "meta": { "Kind": "Application", "Size": "8 MB" } }, { "id": "disk-utility", "name": "Disk Utility", "icon": "fas.hdd", + "actions": ["far.playCircle"], "meta": { "Kind": "Application", "Size": "22 MB" } } ] @@ -64,71 +65,72 @@ "name": "Documents", "description": "Personal documents and projects", "icon": "fas.folder", - "actions": true, "meta": { "Kind": "Folder", "Created": "2023-06-20" }, "children": [ { "id": "projects", "name": "Projects", "icon": "fas.folder", - "actions": true, "meta": { "Kind": "Folder", "Created": "2023-09-01" }, "children": [ { "id": "webapp", "name": "Web App", "icon": "fas.folder", - "actions": true, "meta": { "Kind": "Folder", "Files": "42" }, "children": [ { "id": "index-html", "name": "index.html", "icon": "fas.fileCode", + "actions": ["fas.edit", "Preview", "Delete"], "meta": { "Kind": "HTML Document", "Size": "4.2 KB", "Modified": "2024-03-01" } }, { "id": "styles-css", "name": "styles.css", "icon": "fas.fileCode", + "actions": ["fas.edit", "fas.trash"], "meta": { "Kind": "CSS Stylesheet", "Size": "12.8 KB", "Modified": "2024-03-01" } }, { "id": "app-js", "name": "app.js", "icon": "fas.fileCode", + "actions": ["fas.edit", "fas.trash"], "meta": { "Kind": "JavaScript", "Size": "28.5 KB", "Modified": "2024-02-28" } }, { "id": "src", "name": "src", "icon": "fas.folder", - "actions": true, "meta": { "Kind": "Folder", "Files": "12" }, "children": [ { "id": "components", "name": "components", "icon": "fas.folder", - "actions": true, "meta": { "Kind": "Folder", "Files": "8" }, "children": [ { "id": "header-jsx", "name": "Header.jsx", "icon": "fas.fileCode", + "actions": ["fas.edit", "Compile", "Delete"], "meta": { "Kind": "JSX Component", "Size": "3.1 KB", "Modified": "2024-02-25" } }, { "id": "footer-jsx", "name": "Footer.jsx", "icon": "fas.fileCode", + "actions": ["fas.edit", "Compile", "Delete"], "meta": { "Kind": "JSX Component", "Size": "1.8 KB", "Modified": "2024-02-20" } }, { "id": "sidebar-jsx", "name": "Sidebar.jsx", "icon": "fas.fileCode", + "actions": ["fas.edit", "Compile", "Delete"], "meta": { "Kind": "JSX Component", "Size": "4.5 KB", "Modified": "2024-03-01" } } ] @@ -137,6 +139,7 @@ "id": "utils-js", "name": "utils.js", "icon": "fas.fileCode", + "actions": ["fas.edit", "fas.trash"], "meta": { "Kind": "JavaScript", "Size": "2.4 KB", "Modified": "2024-01-15" } } ] @@ -154,6 +157,7 @@ "id": "main-dart", "name": "main.dart", "icon": "fas.fileCode", + "actions": ["fas.edit", "Compile", "Delete"], "meta": { "Kind": "Dart Source", "Size": "6.1 KB" } } ] @@ -164,12 +168,14 @@ "id": "notes-txt", "name": "notes.txt", "icon": "fas.file", + "actions": ["fas.edit", "Copy", "Print", "Delete"], "meta": { "Kind": "Plain Text", "Size": "2.1 KB", "Modified": "2024-02-15" } }, { "id": "report-pdf", "name": "report.pdf", "icon": "fas.filePdf", + "actions": ["fas.edit", "Copy", "Print", "Delete"], "meta": { "Kind": "PDF Document", "Size": "1.4 MB", "Modified": "2024-01-20" } } ] @@ -179,25 +185,27 @@ "name": "Downloads", "description": "Downloaded files", "icon": "fas.download", - "actions": true, "meta": { "Kind": "Folder", "Created": "2023-06-20" }, "children": [ { "id": "archive-zip", "name": "archive.zip", "icon": "fas.archive", + "actions": ["fas.boxOpen"], "meta": { "Kind": "ZIP Archive", "Size": "45.2 MB", "Modified": "2024-03-05" } }, { "id": "photo-jpg", "name": "vacation-photo.jpg", "icon": "fas.fileImage", + "actions": ["fas.palette"], "meta": { "Kind": "JPEG Image", "Size": "3.8 MB", "Dimensions": "4032 x 3024" } }, { "id": "presentation", "name": "presentation.pptx", "icon": "fas.filePowerpoint", + "actions": ["fas.tv"], "meta": { "Kind": "PowerPoint", "Size": "12.5 MB", "Modified": "2024-02-20" } } ] diff --git a/showcase/src/web/pforg/tableOfContents.css b/showcase/src/web/pforg/tableOfContents.css index 3e121ae78..a361b8198 100644 --- a/showcase/src/web/pforg/tableOfContents.css +++ b/showcase/src/web/pforg/tableOfContents.css @@ -16,7 +16,8 @@ .ws-toc { align-self: flex-start; position: sticky; - width: calc(100% + var(--pf-v6-c-page__main-section--PaddingInlineStart) + var(--pf-v6-c-page__main-section--PaddingInlineEnd)); + width: calc(50% + var(--pf-v6-c-page__main-section--PaddingInlineStart) + var(--pf-v6-c-page__main-section--PaddingInlineEnd)); + min-width: 250px; background-color: var(--pf-t--global--background--color--secondary--default); z-index: 201; margin-block-start: calc(var(--pf-v6-c-page__main-section--PaddingBlockStart) * -1); From abcd0941111a3b36b84f1bcc2a199301f379c424 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Fri, 20 Mar 2026 18:15:40 +0100 Subject: [PATCH 025/430] Fix files.json --- showcase/src/main/resources/org/patternfly/showcase/files.json | 1 - 1 file changed, 1 deletion(-) diff --git a/showcase/src/main/resources/org/patternfly/showcase/files.json b/showcase/src/main/resources/org/patternfly/showcase/files.json index a0208ccaf..95acd129d 100644 --- a/showcase/src/main/resources/org/patternfly/showcase/files.json +++ b/showcase/src/main/resources/org/patternfly/showcase/files.json @@ -150,7 +150,6 @@ "id": "mobile-app", "name": "Mobile App", "icon": "fas.folder", - "actions": true, "meta": { "Kind": "Folder", "Files": "18" }, "children": [ { From a7b5a6a63208dd319b509b92169b9c95bdf9722a Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Fri, 20 Mar 2026 18:27:16 +0100 Subject: [PATCH 026/430] Prepare next release --- .../org/patternfly/showcase/extension/FinderExtension.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java b/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java index 561b3d257..20bee247f 100644 --- a/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java +++ b/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java @@ -266,7 +266,7 @@ public FinderExtension() { .addButton(button(redo()).plain() .onClick((e, b) -> column.reload()))))) .addItems(item -> new Promise<>((resolve, reject) -> { - boolean boom = Math.random() < 0.25; + boolean boom = Math.random() < 0.25; // simulate error int delay = new Random().nextInt(2000); // simulate remote call setTimeout(__ -> { if (boom) { @@ -281,7 +281,7 @@ public FinderExtension() { .size(xs) .text("No records") .icon(ban()) - .addBody(emptyStateBody().text("No records have been released in this decade"))))); + .addBody(emptyStateBody().text("No records have been released in this decade."))))); } else { resolve.onInvoke(items); } From 4e5956f18da4e8b12c1b45437a7bacecffa95077 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Fri, 20 Mar 2026 18:27:45 +0100 Subject: [PATCH 027/430] Release 0.6.6 --- CHANGELOG.md | 5 ++++- README.md | 2 +- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 22 files changed, 25 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c5df04bb4..e01dafaea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +## [0.6.6] - 2026-03-20 + ### Added - Add support for finder item actions @@ -768,7 +770,8 @@ Stay tuned for more to come... - for dependency upgrades --> -[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.5...HEAD +[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.6...HEAD +[0.6.6]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.5...v0.6.6 [0.6.5]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.4...v0.6.5 [0.6.4]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.3...v0.6.4 [0.6.3]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.2...v0.6.3 diff --git a/README.md b/README.md index 7ba688745..3d395e64b 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.5 + 0.6.6 pom import diff --git a/apidoc/pom.xml b/apidoc/pom.xml index a9de69330..d8e4492a0 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.6-SNAPSHOT + 0.6.6 ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index ed4e0ea3d..c40fffca7 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.6-SNAPSHOT + 0.6.6 pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index 2ce538c34..a40291bb7 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.6-SNAPSHOT + 0.6.6 ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 191617cd1..45946c354 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.6-SNAPSHOT", + "version": "0.6.6", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index e34c217bc..37f1d723a 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.6-SNAPSHOT + 0.6.6 ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index cc9135146..b64c3551e 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.6-SNAPSHOT + 0.6.6 ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index dce16659e..dec791b8d 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.6-SNAPSHOT + 0.6.6 ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 6e09d2fa4..1efa53c6c 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.6-SNAPSHOT", + "version": "0.6.6", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index e93ce9be2..d28ea945d 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.6-SNAPSHOT + 0.6.6 ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index ae38ea36b..cdfc78de2 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.6-SNAPSHOT + 0.6.6 ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index bae08e974..181e60e2b 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.6-SNAPSHOT", + "version": "0.6.6", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index a1695aacd..e62fe0a56 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.6-SNAPSHOT + 0.6.6 ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index db5fcfc2b..ec4919c03 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.6-SNAPSHOT + 0.6.6 ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index d1d7b5167..a4f57565e 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.6-SNAPSHOT + 0.6.6 ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index c354db84c..865c38665 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.6-SNAPSHOT + 0.6.6 ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 866dfa413..b26860f74 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.6-SNAPSHOT + 0.6.6 ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 5529a1ab2..6a53ec876 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.6-SNAPSHOT + 0.6.6 pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index d27ce694e..a903a99bc 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.6-SNAPSHOT + 0.6.6 ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index d471b9d6a..c6a0f6a47 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.6-SNAPSHOT + 0.6.6 pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 742af6ec1..b02a60793 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.6-SNAPSHOT + 0.6.6 ../code-parent/pom.xml From acc2091ff0b866529de7a8a4e6f57ddc67457028 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Fri, 20 Mar 2026 18:27:54 +0100 Subject: [PATCH 028/430] Next is 0.6.7 --- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apidoc/pom.xml b/apidoc/pom.xml index d8e4492a0..18cd1893b 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.6 + 0.6.7-SNAPSHOT ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index c40fffca7..0deda065a 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.6 + 0.6.7-SNAPSHOT pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index a40291bb7..d543616ea 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.6 + 0.6.7-SNAPSHOT ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 45946c354..2b8370a7c 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.6", + "version": "0.6.7-SNAPSHOT", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 37f1d723a..79126b6af 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.6 + 0.6.7-SNAPSHOT ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index b64c3551e..1ed3911bb 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.6 + 0.6.7-SNAPSHOT ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index dec791b8d..4d3ae89a9 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.6 + 0.6.7-SNAPSHOT ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 1efa53c6c..efafbf833 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.6", + "version": "0.6.7-SNAPSHOT", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index d28ea945d..80aa41b0f 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.6 + 0.6.7-SNAPSHOT ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index cdfc78de2..acb6918b3 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.6 + 0.6.7-SNAPSHOT ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 181e60e2b..6c1c68a88 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.6", + "version": "0.6.7-SNAPSHOT", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index e62fe0a56..752bfc7aa 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.6 + 0.6.7-SNAPSHOT ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index ec4919c03..02b69ab4a 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.6 + 0.6.7-SNAPSHOT ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index a4f57565e..b88c61812 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.6 + 0.6.7-SNAPSHOT ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 865c38665..4f36a05f7 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.6 + 0.6.7-SNAPSHOT ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index b26860f74..eb9619396 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.6 + 0.6.7-SNAPSHOT ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 6a53ec876..a738ac9dd 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.6 + 0.6.7-SNAPSHOT pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index a903a99bc..d56fe323e 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.6 + 0.6.7-SNAPSHOT ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index c6a0f6a47..06d8290f7 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.6 + 0.6.7-SNAPSHOT pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index b02a60793..78bdae346 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.6 + 0.6.7-SNAPSHOT ../code-parent/pom.xml From 77894e6c5e00f2ee87d4691a62fc4d52d8baf41d Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Sat, 21 Mar 2026 10:22:47 +0100 Subject: [PATCH 029/430] Documentation --- core/npm/README.md | 5 +++-- extensions/finder/npm/README.md | 9 ++++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/core/npm/README.md b/core/npm/README.md index b81a2d792..67c9faefc 100644 --- a/core/npm/README.md +++ b/core/npm/README.md @@ -1,4 +1,4 @@ -# PatternFly Java Finder +# PatternFly Java Core CSS styles for [PatternFly Java](https://patternfly-java.github.io/). @@ -22,7 +22,8 @@ Import the CSS in your stylesheet or JavaScript entry point: ## Requirements -This package requires [PatternFly 6](https://www.patternfly.org/) CSS (`@patternfly/patternfly`) to be present, as it references PatternFly design tokens for colors, spacing, borders, and typography. +This package requires [PatternFly 6](https://www.patternfly.org/) CSS ([ +`@patternfly/patternfly`](https://www.npmjs.com/package/@patternfly/patternfly)) to be present, as it references PatternFly design tokens for colors, spacing, borders, and typography. ## License diff --git a/extensions/finder/npm/README.md b/extensions/finder/npm/README.md index c50717d73..4818f8de2 100644 --- a/extensions/finder/npm/README.md +++ b/extensions/finder/npm/README.md @@ -1,8 +1,10 @@ # PatternFly Java Finder -CSS styles for the [PatternFly Java](https://patternfly-java.github.io/) finder extension. The finder is a macOS Finder-style column browser for hierarchical navigation. +CSS styles for the [PatternFly Java](https://patternfly-java.github.io/extensions/finder) finder extension. The finder is a macOS Finder-style column browser for hierarchical navigation. -This package provides the CSS only. It is meant to be used together with the `org.patternfly:patternfly-java-finder` Maven artifact, which contains the Java component implementation. +This package provides the CSS only. It is meant to be used together with the +[ +`org.patternfly:patternfly-java-finder`](https://central.sonatype.com/artifact/org.patternfly/patternfly-java-finder) Maven artifact, which contains the Java component implementation. ## Installation @@ -22,7 +24,8 @@ Import the CSS in your stylesheet or JavaScript entry point: ## Requirements -This package requires [PatternFly 6](https://www.patternfly.org/) CSS (`@patternfly/patternfly`) to be present, as it references PatternFly design tokens for colors, spacing, borders, and typography. +This package requires [PatternFly 6](https://www.patternfly.org/) CSS ([ +`@patternfly/patternfly`](https://www.npmjs.com/package/@patternfly/patternfly)) to be present, as it references PatternFly design tokens for colors, spacing, borders, and typography. ## License From 2ec43d8aa6db8f159b87f65a3b09aaccda5f0288 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Sun, 22 Mar 2026 19:29:26 +0100 Subject: [PATCH 030/430] Various finder fixes --- CHANGELOG.md | 10 +++ extensions/finder/npm/finder.css | 21 ++++- .../extension/finder/FinderColumn.java | 5 +- .../extension/finder/FinderColumnSearch.java | 79 ++++++++++++++++++- .../extension/finder/FinderItem.java | 39 +++++---- .../extension/finder/FinderItemActions.java | 5 ++ .../showcase/extension/FinderExtension.java | 21 +---- .../patternfly/showcase/model/FileData.java | 65 ++++++++++----- .../org/patternfly/showcase/files.json | 43 +++++----- 9 files changed, 207 insertions(+), 81 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e01dafaea..4a24e3e80 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,16 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +### Added + +- Add support for `BiPredicate` in `FinderColumnSearch` + +### Fixed + +- Fix finder item icons +- Fix colors for finder item actions +- Fix finder preview handlers + ## [0.6.6] - 2026-03-20 ### Added diff --git a/extensions/finder/npm/finder.css b/extensions/finder/npm/finder.css index c86ddb527..593b4caef 100644 --- a/extensions/finder/npm/finder.css +++ b/extensions/finder/npm/finder.css @@ -355,12 +355,27 @@ } .pf-v6-c-finder__column.pf-m-active .pf-v6-c-finder__item.pf-m-selected .pf-v6-c-finder__item-actions .pf-v6-c-button { - --pf-v6-c-button--Color: var(--pf-v6-c-finder__item--m-selected--Color); --pf-v6-c-button__icon--Color: var(--pf-v6-c-finder__item--m-selected--Color); + --pf-v6-c-button--m-link--Color: var(--pf-v6-c-finder__item--m-selected--Color); + --pf-v6-c-button--m-plain--Color: var(--pf-v6-c-finder__item--m-selected--Color); + --pf-v6-c-button--m-plain--hover--Color: var(--pf-v6-c-finder__item--m-selected--Color); + --pf-v6-c-button--m-plain--m-clicked--Color: var(--pf-v6-c-finder__item--m-selected--Color); } -.pf-v6-c-finder__column.pf-m-active .pf-v6-c-finder__item.pf-m-selected .pf-v6-c-finder__item-actions .pf-v6-c-menu-toggle { - --pf-v6-c-menu-toggle--Color: var(--pf-v6-c-finder__item--m-selected--Color); +.pf-v6-c-finder__column.pf-m-active .pf-v6-c-finder__item.pf-m-selected .pf-v6-c-finder__item-actions .pf-v6-c-button.pf-m-link { + --pf-v6-c-button--hover--Color: var(--pf-v6-c-finder__item--m-selected--Color); + --pf-v6-c-button--m-clicked--Color: var(--pf-v6-c-finder__item--m-selected--Color); +} + +.pf-v6-c-finder__column.pf-m-active .pf-v6-c-finder__item.pf-m-selected .pf-v6-c-finder__item-actions .pf-v6-c-menu-toggle.pf-m-plain { + --pf-v6-c-menu-toggle--m-plain--Color: var(--pf-v6-c-finder__item--m-selected--Color); + --pf-v6-c-menu-toggle--hover--Color: var(--pf-v6-c-finder__item--m-selected--Color); + --pf-v6-c-menu-toggle--expanded--Color: var(--pf-v6-c-finder__item--m-selected--Color); +} + +.pf-v6-c-finder__column.pf-m-active .pf-v6-c-finder__item.pf-m-selected .pf-v6-c-finder__item-actions .pf-v6-c-menu-toggle.pf-m-split { + --pf-v6-c-menu-toggle--hover--Color: var(--pf-v6-c-menu-toggle--m-primary--hover--Color); + --pf-v6-c-menu-toggle--expanded--Color: var(--pf-v6-c-menu-toggle--m-primary--expanded--Color); } .pf-v6-c-finder__column.pf-m-active .pf-v6-c-finder__item.pf-m-selected .pf-v6-c-finder__item-folder-icon { diff --git a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java index 15bb0aad0..f03856f60 100644 --- a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java +++ b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java @@ -89,7 +89,7 @@ public static FinderColumn finderColumn(String identifier) { // The component store relies on attach() / detach() and does not work when adding / removing existing references. // See: https://hal-console.gitbook.io/elemento/attach-detach Finder finder; - final List previewHandlers; + PreviewHandler previewHandler; private final String identifier; private final Map data; @@ -110,7 +110,6 @@ public static FinderColumn finderColumn(String identifier) { this.data = new HashMap<>(); this.items = new LinkedHashMap<>(); this.aur = new AurHandler<>(this); - this.previewHandlers = new ArrayList<>(); this.selectHandler = new ArrayList<>(); this.status = static_; @@ -219,7 +218,7 @@ public FinderColumn onSelect(SelectHandler selectHandler) { } public FinderColumn onPreview(PreviewHandler previewHandler) { - this.previewHandlers.add(previewHandler); + this.previewHandler = previewHandler; return this; } diff --git a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumnSearch.java b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumnSearch.java index 8fe003498..b4b8e8eb3 100644 --- a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumnSearch.java +++ b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumnSearch.java @@ -15,6 +15,8 @@ */ package org.patternfly.extension.finder; +import java.util.function.BiPredicate; + import org.patternfly.component.textinputgroup.SearchInput; import elemental2.dom.HTMLElement; @@ -23,6 +25,8 @@ import static org.patternfly.extension.finder.FinderClasses.column; import static org.patternfly.extension.finder.FinderClasses.finder; import static org.patternfly.style.Classes.component; +import static org.patternfly.style.Classes.filtered; +import static org.patternfly.style.Classes.modifier; import static org.patternfly.style.Classes.search; public class FinderColumnSearch extends FinderSubComponent { @@ -37,18 +41,89 @@ public static FinderColumnSearch finderColumnSearch() { public static final String SUB_COMPONENT_NAME = "fcs"; + /** + * A {@link BiPredicate} implementation used to filter {@link FinderItem} instances based on their text content. This filter + * checks if the given {@link FinderItem}'s text does not contain the specified search value (case-insensitive). + *

+ * The predicate evaluates to {@code true} if: - The search value is non-empty. - The lower-cased text of the + * {@link FinderItem} does not contain the lower-cased search value. + *

+ * This can be used to exclude items whose text does not match the specified search criteria. + */ + public static final BiPredicate ITEM_TEXT_CONTAINS_FILTER = (item, value) -> { + String lcv = value.toLowerCase(); + return !value.isEmpty() && !item.text().toLowerCase().contains(lcv); + }; + FinderColumnSearch() { super(SUB_COMPONENT_NAME, div().css(component(finder, column, search)).element()); } // ------------------------------------------------------ add + /** + * Adds a {@link SearchInput} instance to the FinderColumnSearch with no specific filtering predicate. + * + * @param input the {@link SearchInput} instance to be added + * @return the updated {@code FinderColumnSearch} instance + */ public FinderColumnSearch addSearchInput(SearchInput input) { - return add(input); + return add(input, null); } + /** + * Adds a {@link SearchInput} instance to the FinderColumnSearch with no specific filtering predicate. + * + * @param input the {@link SearchInput} instance to be added + * @return the updated {@code FinderColumnSearch} instance + */ public FinderColumnSearch add(SearchInput input) { - return add(input.element()); + return add(input, null); + } + + /** + * Adds a {@link SearchInput} instance to the FinderColumnSearch with a specific filtering predicate. The filtering + * predicate is used to determine how {@link FinderItem}s should be filtered based on their text content and the specified + * search value. If the filter predicate returns {@code true}, the {@link FinderItem} will be marked as filtered. + * + * @param input the {@link SearchInput} instance to be added + * @param predicate a {@link BiPredicate} that defines the filtering logic based on a {@link FinderItem} and the given + * search value + * @return the updated {@code FinderColumnSearch} instance + */ + public FinderColumnSearch addSearchInput(SearchInput input, BiPredicate predicate) { + return add(input, predicate); + } + + /** + * Adds a {@link SearchInput} instance to the FinderColumnSearch with a specific filtering predicate. The filtering + * predicate is used to determine how {@link FinderItem}s should be filtered based on their text content and the specified + * search value. If the filter predicate returns {@code true}, the {@link FinderItem} will be marked as filtered. + * + * @param input the {@link SearchInput} instance to be added + * @param predicate a {@link BiPredicate} that defines the filtering logic based on a {@link FinderItem} and the given + * search value + * @return the updated {@code FinderColumnSearch} instance + */ + public FinderColumnSearch add(SearchInput input, BiPredicate predicate) { + add(input.element()); + if (predicate != null) { + input.onInput((e, si, value) -> { + FinderColumn column = lookupSubComponent(FinderColumn.SUB_COMPONENT_NAME, true); + if (column != null) { + for (FinderItem item : column.items()) { + item.classList().toggle(modifier(filtered), predicate.test(item, value)); + } + } + }); + input.onClear((e, si) -> { + FinderColumn column = lookupSubComponent(FinderColumn.SUB_COMPONENT_NAME, true); + if (column != null) { + column.items().forEach(item -> item.classList().remove(modifier(filtered))); + } + }); + } + return this; } // ------------------------------------------------------ builder diff --git a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItem.java b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItem.java index ea5c4e3a6..f1518b747 100644 --- a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItem.java +++ b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItem.java @@ -15,9 +15,7 @@ */ package org.patternfly.extension.finder; -import java.util.ArrayList; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.function.Supplier; @@ -36,12 +34,15 @@ import elemental2.dom.Element; import elemental2.dom.Event; +import elemental2.dom.HTMLDivElement; import elemental2.dom.HTMLElement; import static java.lang.Boolean.parseBoolean; import static org.jboss.elemento.Elements.button; import static org.jboss.elemento.Elements.div; +import static org.jboss.elemento.Elements.failSafeRemoveFromParent; import static org.jboss.elemento.Elements.insertAfter; +import static org.jboss.elemento.Elements.insertFirst; import static org.jboss.elemento.Elements.li; import static org.jboss.elemento.Elements.removeChildrenFrom; import static org.jboss.elemento.Elements.span; @@ -102,7 +103,7 @@ public static FinderItem emptyItem(EmptyState emptyState) { static FinderItem loadingItem() { FinderItem loading = statusItem(Id.unique(ComponentType.Finder.id, SUB_COMPONENT_NAME, "loading")); - loading.ic.element().replaceWith(spinner(lg, "sm").element()); + insertFirst(loading.element(), spinner(lg, "sm").element()); return loading.text("Loading..."); } @@ -120,7 +121,6 @@ private static FinderItem statusItem(String identifier) { item.element().removeAttribute(role); item.element().removeAttribute(selected); item.element().removeAttribute(tabindex); - item.element().dataset.delete(Dataset.identifier); return item; } @@ -136,11 +136,12 @@ private static FinderItem statusItem(String identifier) { private final String identifier; private final Map data; private final HandlerRegistration clickHandler; - private final List previewHandlers; - private final HTMLContainerBuilder ic; // icon container + private final HTMLContainerBuilder rc; // row container private final HTMLContainerBuilder cc; // content container private final HTMLContainerBuilder tc; // text container + private HTMLElement ic; private FinderColumn nextColumn; + private PreviewHandler previewHandler; private Supplier nextColumnSupplier; FinderItem(String identifier) { @@ -152,15 +153,13 @@ private static FinderItem statusItem(String identifier) { .element()); this.identifier = identifier; this.data = new HashMap<>(); - this.previewHandlers = new ArrayList<>(); this.clickHandler = bind(element(), click, e -> { if (column != null && column.finder != null) { handleClick(column.finder, column, this); } }); - add(div().css(component(finder, item, Classes.row)) - .add(ic = span().css(component(finder, item, icon))) + add(rc = div().css(component(finder, item, Classes.row)) .add(cc = span().css(component(finder, item, content)) .add(tc = span().css(component(finder, item, Classes.text)))) .add(span().css(component(finder, item, folder, icon)) @@ -212,8 +211,8 @@ public FinderItem folder(boolean folder) { @Override public FinderItem icon(Element icon) { - removeIcon(); - ic.add(icon); + removeChildrenFrom(ic); + failSafeIconContainer().appendChild(icon); return this; } @@ -229,7 +228,7 @@ public FinderItem nextColumn(Supplier column) { @Override public FinderItem removeIcon() { - removeChildrenFrom(ic); + failSafeRemoveFromParent(ic); return this; } @@ -248,7 +247,7 @@ public FinderItem that() { // ------------------------------------------------------ events public FinderItem onPreview(PreviewHandler previewHandler) { - this.previewHandlers.add(previewHandler); + this.previewHandler = previewHandler; return this; } @@ -315,12 +314,18 @@ void togglePin(Event event) { void previewItem(Finder finder, FinderColumn column, FinderItem item) { if (finder.preview != null) { removeChildrenFrom(finder.preview); - for (PreviewHandler previewHandler : previewHandlers) { - previewHandler.onPreview(item, finder.preview); - } - for (PreviewHandler previewHandler : column.previewHandlers) { + if (previewHandler != null) { previewHandler.onPreview(item, finder.preview); + } else if (column.previewHandler != null) { + column.previewHandler.onPreview(item, finder.preview); } } } + + private HTMLElement failSafeIconContainer() { + if (ic == null) { + insertFirst(rc.element(), ic = span().css(component(finder, item, icon)).element()); + } + return ic; + } } diff --git a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItemActions.java b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItemActions.java index 7151798ab..e90761673 100644 --- a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItemActions.java +++ b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItemActions.java @@ -47,6 +47,11 @@ public static FinderItemActions finderItemActions() { // ------------------------------------------------------ add + /** + * Adds a button to the finder item actions. The button should be small. Use button types {@code control}, {@code plain}, + * {@code link}, or {@code inline-link}. Avoid {@code primary}, {@code secondary}, or {@code tertiary} button types. Icons + * are ok. + */ public FinderItemActions addButton(Button button) { return add(button); } diff --git a/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java b/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java index 20bee247f..231032e85 100644 --- a/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java +++ b/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java @@ -64,6 +64,7 @@ import static org.patternfly.extension.finder.FinderColumn.finderColumn; import static org.patternfly.extension.finder.FinderColumnActions.finderColumnActions; import static org.patternfly.extension.finder.FinderColumnHeader.finderColumnHeader; +import static org.patternfly.extension.finder.FinderColumnSearch.ITEM_TEXT_CONTAINS_FILTER; import static org.patternfly.extension.finder.FinderColumnSearch.finderColumnSearch; import static org.patternfly.extension.finder.FinderItem.emptyItem; import static org.patternfly.extension.finder.FinderItem.finderItem; @@ -82,8 +83,6 @@ import static org.patternfly.showcase.Code.code; import static org.patternfly.showcase.Data.extensions; import static org.patternfly.showcase.model.Discography.records; -import static org.patternfly.style.Classes.filtered; -import static org.patternfly.style.Classes.modifier; import static org.patternfly.style.Classes.util; import static org.patternfly.style.Size.xs; @@ -141,22 +140,8 @@ public FinderExtension() { return finder().bordered() .addItem(finderColumn("root").run(column -> column .addHeader(demoHeader.apply("Root")) - .addSearch(finderColumnSearch() - .addSearchInput(searchInput(Id.unique("finder-basic")) - .icon(search()) - .placeholder("Filter by name") - .onInput((e, si, value) -> { - String lcv = value.toLowerCase(); - for (FinderItem item : column.items()) { - item.classList().toggle(modifier(filtered), - !value.isEmpty() && !item.text() - .toLowerCase() - .contains(lcv)); - } - }) - .onClear((e, si) -> - column.items().forEach(item -> - item.classList().remove(modifier(filtered)))))) + .addSearch(finderColumnSearch().addSearchInput(searchInput(Id.unique("finder-basic")) + .icon(search()).placeholder("Filter by name"), ITEM_TEXT_CONTAINS_FILTER)) .addItems(Files.data.asList(), fileItem[0]))) .element(); // @code-end:finder-basic diff --git a/showcase/src/main/java/org/patternfly/showcase/model/FileData.java b/showcase/src/main/java/org/patternfly/showcase/model/FileData.java index 4928964ff..58d8ab176 100644 --- a/showcase/src/main/java/org/patternfly/showcase/model/FileData.java +++ b/showcase/src/main/java/org/patternfly/showcase/model/FileData.java @@ -16,21 +16,27 @@ package org.patternfly.showcase.model; import org.jboss.elemento.Id; -import org.patternfly.component.button.Button; +import org.jboss.elemento.IsElement; import org.patternfly.extension.finder.FinderItemActions; import elemental2.core.JsArray; +import elemental2.dom.HTMLElement; import jsinterop.annotations.JsOverlay; import jsinterop.annotations.JsPackage; import jsinterop.annotations.JsType; import jsinterop.base.JsPropertyMap; +import static java.util.Arrays.asList; +import static java.util.Arrays.copyOfRange; import static org.patternfly.component.button.Button.button; import static org.patternfly.component.menu.Dropdown.dropdown; import static org.patternfly.component.menu.DropdownMenu.dropdownMenu; import static org.patternfly.component.menu.MenuContent.menuContent; import static org.patternfly.component.menu.MenuItem.menuItem; import static org.patternfly.component.menu.MenuList.menuList; +import static org.patternfly.component.menu.MenuToggle.menuToggle; +import static org.patternfly.component.menu.MenuToggleAction.menuToggleAction; +import static org.patternfly.component.menu.MenuToggleType.split; import static org.patternfly.extension.finder.FinderItemActions.finderItemActions; import static org.patternfly.icon.IconSets.fas.ellipsisV; import static org.patternfly.icon.PredefinedIcon.predefinedIcon; @@ -50,19 +56,10 @@ public class FileData { public final FinderItemActions itemActions() { if (actions != null && actions.length > 0) { FinderItemActions fia = finderItemActions(); - fia.addButton(iconOrText(actions.getAt(0))); - if (actions.length > 2) { // all actions should be text only - fia.addDropdown(dropdown(ellipsisV(), "kebab dropdown toggle") - .addMenu(dropdownMenu() - .addContent(menuContent() - .addList(menuList().run(ml -> { - for (int i = 1; i < actions.length; i++) { - ml.addItem(menuItem(Id.build(actions.getAt(i)), actions.getAt(i))); - } - }))))); - } else { - for (int i = 1; i < actions.length; i++) { - fia.addButton(iconOrText(actions.getAt(i))); + for (String action : actions.asList()) { + var actionElement = action(action); + if (actionElement != null) { + fia.add(actionElement); } } return fia; @@ -71,11 +68,41 @@ public final FinderItemActions itemActions() { } @JsOverlay - final Button iconOrText(String value) { - if (value.startsWith("fa") && value.contains(".")) { - return button(predefinedIcon(value)).plain(); - } else { - return button(value).plain(); + final IsElement action(String value) { + if (value.contains(":")) { + String prefix = value.substring(0, value.indexOf(":")); + String suffix = value.substring(value.indexOf(":") + 1); + switch (prefix) { + case "control": + return button(suffix).control().small(); + case "icon": + return button(predefinedIcon(suffix)).plain().small(); + case "link": + return button(suffix).link().small(); + case "link-inline": + return button(suffix).link().inline().small(); + case "plain": + return button(suffix).plain().small(); + case "kebab": + return dropdown(menuToggle(ellipsisV()).small()) + .addMenu(dropdownMenu() + .addContent(menuContent() + .addList(menuList() + .addItems(asList(suffix.split("\\|")), text -> + menuItem(Id.build(text), text))))); + case "split": + String[] actions = suffix.split("\\|"); + String first = actions[0]; + String[] rest = copyOfRange(actions, 1, actions.length); + return dropdown(menuToggle(split).small() + .addAction(menuToggleAction(first))) + .addMenu(dropdownMenu() + .addContent(menuContent() + .addList(menuList() + .addItems(asList(rest), text -> + menuItem(Id.build(text), text))))); + } } + return null; } } diff --git a/showcase/src/main/resources/org/patternfly/showcase/files.json b/showcase/src/main/resources/org/patternfly/showcase/files.json index 95acd129d..311b2ce95 100644 --- a/showcase/src/main/resources/org/patternfly/showcase/files.json +++ b/showcase/src/main/resources/org/patternfly/showcase/files.json @@ -11,7 +11,7 @@ "name": "Web Browser", "description": "Browse the internet", "icon": "fas.globe", - "actions": ["far.playCircle"], + "actions": ["icon:fas.play"], "meta": { "Kind": "Application", "Version": "120.0", "Size": "245 MB" } }, { @@ -19,14 +19,14 @@ "name": "Code Editor", "description": "Write and edit code", "icon": "fas.code", - "actions": ["far.playCircle"], + "actions": ["icon:fas.play"], "meta": { "Kind": "Application", "Version": "1.85.0", "Size": "380 MB" } }, { "id": "terminal", "name": "Terminal", "icon": "fas.terminal", - "actions": ["far.playCircle"], + "actions": ["icon:fas.play"], "meta": { "Kind": "Application", "Version": "2.12", "Size": "12 MB" } }, { @@ -39,21 +39,21 @@ "id": "calculator", "name": "Calculator", "icon": "fas.calculator", - "actions": ["far.playCircle"], + "actions": ["icon:fas.play"], "meta": { "Kind": "Application", "Size": "5 MB" } }, { "id": "screenshot", "name": "Screenshot", "icon": "fas.camera", - "actions": ["far.playCircle"], + "actions": ["icon:fas.play"], "meta": { "Kind": "Application", "Size": "8 MB" } }, { "id": "disk-utility", "name": "Disk Utility", "icon": "fas.hdd", - "actions": ["far.playCircle"], + "actions": ["icon:fas.play"], "meta": { "Kind": "Application", "Size": "22 MB" } } ] @@ -83,21 +83,21 @@ "id": "index-html", "name": "index.html", "icon": "fas.fileCode", - "actions": ["fas.edit", "Preview", "Delete"], + "actions": ["icon:fas.edit", "kebab:Preview|Delete"], "meta": { "Kind": "HTML Document", "Size": "4.2 KB", "Modified": "2024-03-01" } }, { "id": "styles-css", "name": "styles.css", "icon": "fas.fileCode", - "actions": ["fas.edit", "fas.trash"], + "actions": ["icon:fas.edit", "icon:fas.trash"], "meta": { "Kind": "CSS Stylesheet", "Size": "12.8 KB", "Modified": "2024-03-01" } }, { "id": "app-js", "name": "app.js", "icon": "fas.fileCode", - "actions": ["fas.edit", "fas.trash"], + "actions": ["icon:fas.edit", "icon:fas.trash"], "meta": { "Kind": "JavaScript", "Size": "28.5 KB", "Modified": "2024-02-28" } }, { @@ -116,21 +116,21 @@ "id": "header-jsx", "name": "Header.jsx", "icon": "fas.fileCode", - "actions": ["fas.edit", "Compile", "Delete"], + "actions": ["icon:fas.edit", "kebab:Compile|Delete"], "meta": { "Kind": "JSX Component", "Size": "3.1 KB", "Modified": "2024-02-25" } }, { "id": "footer-jsx", "name": "Footer.jsx", "icon": "fas.fileCode", - "actions": ["fas.edit", "Compile", "Delete"], + "actions": ["icon:fas.edit", "kebab:Compile|Delete"], "meta": { "Kind": "JSX Component", "Size": "1.8 KB", "Modified": "2024-02-20" } }, { "id": "sidebar-jsx", "name": "Sidebar.jsx", "icon": "fas.fileCode", - "actions": ["fas.edit", "Compile", "Delete"], + "actions": ["icon:fas.edit", "kebab:Compile|Delete"], "meta": { "Kind": "JSX Component", "Size": "4.5 KB", "Modified": "2024-03-01" } } ] @@ -139,7 +139,7 @@ "id": "utils-js", "name": "utils.js", "icon": "fas.fileCode", - "actions": ["fas.edit", "fas.trash"], + "actions": ["icon:fas.edit", "icon:fas.trash"], "meta": { "Kind": "JavaScript", "Size": "2.4 KB", "Modified": "2024-01-15" } } ] @@ -156,7 +156,7 @@ "id": "main-dart", "name": "main.dart", "icon": "fas.fileCode", - "actions": ["fas.edit", "Compile", "Delete"], + "actions": ["icons:fas.edit", "kebab:Compile|Delete"], "meta": { "Kind": "Dart Source", "Size": "6.1 KB" } } ] @@ -167,14 +167,14 @@ "id": "notes-txt", "name": "notes.txt", "icon": "fas.file", - "actions": ["fas.edit", "Copy", "Print", "Delete"], + "actions": ["split:Edit|Copy|Print|Delete"], "meta": { "Kind": "Plain Text", "Size": "2.1 KB", "Modified": "2024-02-15" } }, { "id": "report-pdf", "name": "report.pdf", "icon": "fas.filePdf", - "actions": ["fas.edit", "Copy", "Print", "Delete"], + "actions": ["split:Edit|Copy|Print|Delete"], "meta": { "Kind": "PDF Document", "Size": "1.4 MB", "Modified": "2024-01-20" } } ] @@ -190,21 +190,21 @@ "id": "archive-zip", "name": "archive.zip", "icon": "fas.archive", - "actions": ["fas.boxOpen"], + "actions": ["link:Extract"], "meta": { "Kind": "ZIP Archive", "Size": "45.2 MB", "Modified": "2024-03-05" } }, { "id": "photo-jpg", "name": "vacation-photo.jpg", "icon": "fas.fileImage", - "actions": ["fas.palette"], + "actions": ["link-inline:Edit"], "meta": { "Kind": "JPEG Image", "Size": "3.8 MB", "Dimensions": "4032 x 3024" } }, { "id": "presentation", "name": "presentation.pptx", "icon": "fas.filePowerpoint", - "actions": ["fas.tv"], + "actions": ["control:Present"], "meta": { "Kind": "PowerPoint", "Size": "12.5 MB", "Modified": "2024-02-20" } } ] @@ -226,12 +226,14 @@ "id": "song-1", "name": "Summer Breeze.mp3", "icon": "fas.fileAudio", + "actions": ["icon:fas.play", "icon:fas.pause"], "meta": { "Kind": "MP3 Audio", "Size": "8.2 MB", "Duration": "3:42" } }, { "id": "song-2", "name": "Night Drive.mp3", "icon": "fas.fileAudio", + "actions": ["icon:fas.play", "icon:fas.pause"], "meta": { "Kind": "MP3 Audio", "Size": "9.1 MB", "Duration": "4:15" } } ] @@ -255,12 +257,14 @@ "id": "mountain-jpg", "name": "mountain.jpg", "icon": "fas.fileImage", + "actions": ["link:View", "kebab:Copy|Move|Delete"], "meta": { "Kind": "JPEG Image", "Size": "5.2 MB", "Dimensions": "5120 x 2880" } }, { "id": "ocean-jpg", "name": "ocean.jpg", "icon": "fas.fileImage", + "actions": ["plain:View", "kebab:Copy|Move|Delete"], "meta": { "Kind": "JPEG Image", "Size": "4.8 MB", "Dimensions": "5120 x 2880" } } ] @@ -275,6 +279,7 @@ "id": "screenshot-1", "name": "Screen Shot 2024-03-01.png", "icon": "fas.fileImage", + "actions": ["control:View", "kebab:Copy|Move|Delete"], "meta": { "Kind": "PNG Image", "Size": "1.2 MB" } } ] From 25552db0ea669ff105c4e4feb4163a67edf6579c Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Sun, 22 Mar 2026 19:30:16 +0100 Subject: [PATCH 031/430] Release 0.6.7 --- CHANGELOG.md | 5 ++++- README.md | 2 +- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 22 files changed, 25 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a24e3e80..c73144cc3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +## [0.6.7] - 2026-03-22 + ### Added - Add support for `BiPredicate` in `FinderColumnSearch` @@ -780,7 +782,8 @@ Stay tuned for more to come... - for dependency upgrades --> -[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.6...HEAD +[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.7...HEAD +[0.6.7]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.6...v0.6.7 [0.6.6]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.5...v0.6.6 [0.6.5]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.4...v0.6.5 [0.6.4]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.3...v0.6.4 diff --git a/README.md b/README.md index 3d395e64b..26e890866 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.6 + 0.6.7 pom import diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 18cd1893b..38c932019 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.7-SNAPSHOT + 0.6.7 ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 0deda065a..922fce78e 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.7-SNAPSHOT + 0.6.7 pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index d543616ea..ebdaf44b1 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.7-SNAPSHOT + 0.6.7 ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 2b8370a7c..91a337d39 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.7-SNAPSHOT", + "version": "0.6.7", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 79126b6af..c320e9c6b 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.7-SNAPSHOT + 0.6.7 ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 1ed3911bb..d52974fd1 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.7-SNAPSHOT + 0.6.7 ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 4d3ae89a9..861feabf3 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.7-SNAPSHOT + 0.6.7 ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index efafbf833..4dfb21875 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.7-SNAPSHOT", + "version": "0.6.7", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 80aa41b0f..0934a6b06 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.7-SNAPSHOT + 0.6.7 ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index acb6918b3..8414e6ca1 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.7-SNAPSHOT + 0.6.7 ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 6c1c68a88..277760b00 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.7-SNAPSHOT", + "version": "0.6.7", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index 752bfc7aa..9bd6d053f 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.7-SNAPSHOT + 0.6.7 ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 02b69ab4a..61aeeda79 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.7-SNAPSHOT + 0.6.7 ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index b88c61812..1fbf5fc49 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.7-SNAPSHOT + 0.6.7 ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 4f36a05f7..eff63821f 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.7-SNAPSHOT + 0.6.7 ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index eb9619396..51f55e9c8 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.7-SNAPSHOT + 0.6.7 ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index a738ac9dd..72d42e3cb 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.7-SNAPSHOT + 0.6.7 pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index d56fe323e..282d5dc63 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.7-SNAPSHOT + 0.6.7 ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 06d8290f7..2a82d2ba1 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.7-SNAPSHOT + 0.6.7 pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 78bdae346..03a82b32c 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.7-SNAPSHOT + 0.6.7 ../code-parent/pom.xml From f5287c9b4d84bec0852361b7b7b2c3748e2bb094 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Sun, 22 Mar 2026 19:30:26 +0100 Subject: [PATCH 032/430] Next is 0.6.8 --- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 38c932019..9cb828bbf 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.7 + 0.6.8-SNAPSHOT ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 922fce78e..c91847e2f 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.7 + 0.6.8-SNAPSHOT pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index ebdaf44b1..3c94d7af8 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.7 + 0.6.8-SNAPSHOT ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 91a337d39..13e7069b8 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.7", + "version": "0.6.8-SNAPSHOT", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index c320e9c6b..7ead9d409 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.7 + 0.6.8-SNAPSHOT ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index d52974fd1..a13a4be9f 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.7 + 0.6.8-SNAPSHOT ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 861feabf3..464b9eb04 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.7 + 0.6.8-SNAPSHOT ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 4dfb21875..a2d4ac303 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.7", + "version": "0.6.8-SNAPSHOT", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 0934a6b06..c413c8d35 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.7 + 0.6.8-SNAPSHOT ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 8414e6ca1..9f0ec0934 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.7 + 0.6.8-SNAPSHOT ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 277760b00..136d7bd32 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.7", + "version": "0.6.8-SNAPSHOT", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index 9bd6d053f..9e4ec1efc 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.7 + 0.6.8-SNAPSHOT ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 61aeeda79..b20479264 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.7 + 0.6.8-SNAPSHOT ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index 1fbf5fc49..d9b43250d 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.7 + 0.6.8-SNAPSHOT ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index eff63821f..2927542be 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.7 + 0.6.8-SNAPSHOT ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 51f55e9c8..b7921e13d 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.7 + 0.6.8-SNAPSHOT ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 72d42e3cb..09485612d 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.7 + 0.6.8-SNAPSHOT pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index 282d5dc63..f9943a09b 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.7 + 0.6.8-SNAPSHOT ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 2a82d2ba1..e83250ca2 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.7 + 0.6.8-SNAPSHOT pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 03a82b32c..a80f76971 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.7 + 0.6.8-SNAPSHOT ../code-parent/pom.xml From 3a228c10e7b98aa49067be8ded2a60df91f51a5e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Mar 2026 06:05:40 +0000 Subject: [PATCH 033/430] Bump com.fasterxml.jackson.core:jackson-databind from 2.21.1 to 2.21.2 Bumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.21.1 to 2.21.2. - [Commits](https://github.com/FasterXML/jackson/commits) --- updated-dependencies: - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.21.2 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- core/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/pom.xml b/core/pom.xml index c413c8d35..472004300 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -33,7 +33,7 @@ PatternFly Java core components and layouts - 2.21.1 + 2.21.2 From ebd84e5f7e0a6c262627825642308da37e3d929a Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Mon, 23 Mar 2026 11:21:36 +0100 Subject: [PATCH 034/430] Add finder patch and segment API --- CHANGELOG.md | 13 ++++ .../patternfly/extension/finder/Finder.java | 15 +++++ .../extension/finder/FinderColumn.java | 11 ++++ .../extension/finder/FinderItem.java | 16 ++++- .../extension/finder/FinderPath.java | 66 +++++++++++++++++++ .../extension/finder/FinderSegment.java | 32 +++++++++ 6 files changed, 152 insertions(+), 1 deletion(-) create mode 100644 extensions/finder/src/main/java/org/patternfly/extension/finder/FinderPath.java create mode 100644 extensions/finder/src/main/java/org/patternfly/extension/finder/FinderSegment.java diff --git a/CHANGELOG.md b/CHANGELOG.md index c73144cc3..d742b7582 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,19 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +### Added + +- Add `FinderPath` and `FinderSegment` with `FinderPath` implementing `Iterable` +- Add `FinderPath Finder.path()` +- Add getters for the finder and finder column: + - `FinderColumn FinderItem.column()` + - `Finder FinderItem.finder()` + - `Finder FinderColumn.finder()` + +### Fixed + +- Fix selection of already selected finder items + ## [0.6.7] - 2026-03-22 ### Added diff --git a/extensions/finder/src/main/java/org/patternfly/extension/finder/Finder.java b/extensions/finder/src/main/java/org/patternfly/extension/finder/Finder.java index 5ba7f972e..02e694530 100644 --- a/extensions/finder/src/main/java/org/patternfly/extension/finder/Finder.java +++ b/extensions/finder/src/main/java/org/patternfly/extension/finder/Finder.java @@ -17,6 +17,8 @@ import java.util.Iterator; import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; import java.util.Map; import java.util.function.Function; @@ -175,6 +177,19 @@ public Finder onRemove(RemoveItemHandler onRemove) { // ------------------------------------------------------ api + public FinderPath path() { + List segments = new LinkedList<>(); + for (FinderColumn column : items.values()) { + FinderItem selectedItem = column.selectedItem(); + if (selectedItem != null) { + segments.add(new FinderSegment(column, selectedItem)); + } else { + break; + } + } + return new FinderPath(segments); + } + @Override public Iterator iterator() { return items.values().iterator(); diff --git a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java index f03856f60..a1bde2611 100644 --- a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java +++ b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java @@ -224,6 +224,10 @@ public FinderColumn onPreview(PreviewHandler previewHandler) { // ------------------------------------------------------ api + public Finder finder() { + return finder; + } + @Override public Comparator comparator() { return comparator; @@ -409,6 +413,13 @@ FinderItem nextItem(FinderItem item) { return null; } + FinderItem selectedItem() { + return items.values().stream() + .filter(FinderItem::isSelected) + .findFirst() + .orElse(null); + } + List visibleItems() { return items.values().stream() .filter(item -> !item.classList().contains(modifier(filtered))) diff --git a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItem.java b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItem.java index f1518b747..8ac741e0c 100644 --- a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItem.java +++ b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItem.java @@ -253,6 +253,14 @@ public FinderItem onPreview(PreviewHandler previewHandler) { // ------------------------------------------------------ api + public FinderColumn column() { + return column; + } + + public Finder finder() { + return column.finder(); + } + @Override public String identifier() { return identifier; @@ -274,7 +282,9 @@ public T get(String key) { // ------------------------------------------------------ internal void handleClick(Finder finder, FinderColumn column, FinderItem item) { - if (parseBoolean((element().getAttribute(Aria.selected))) && classList().contains(modifier(Classes.selected))) { + if (isSelected()) { + finder.markActive(column); + previewItem(finder, column, item); return; } @@ -291,6 +301,10 @@ void markSelected(boolean selected) { classList().toggle(modifier(Classes.selected), selected); } + boolean isSelected() { + return parseBoolean((element().getAttribute(Aria.selected))) && classList().contains(modifier(Classes.selected)); + } + boolean hasNext() { return nextColumn != null || nextColumnSupplier != null; } diff --git a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderPath.java b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderPath.java new file mode 100644 index 000000000..b1d46fe43 --- /dev/null +++ b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderPath.java @@ -0,0 +1,66 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.extension.finder; + +import java.util.Iterator; +import java.util.List; +import java.util.function.Predicate; + +import static java.util.stream.Collectors.joining; + +public class FinderPath implements Iterable { + + private final List segments; + + FinderPath(List segments) { + this.segments = segments; + } + + public boolean isEmpty() { + return segments.isEmpty(); + } + + public int size() { + return segments.size(); + } + + @Override + public Iterator iterator() { + return segments.iterator(); + } + + @Override + public String toString() { + return segments.stream().map(FinderSegment::toString).collect(joining("/")); + } + + public FinderSegment findColumn(String identifier) { + return findSegment(segment -> segment.column.identifier().equals(identifier)); + } + + public FinderSegment findItem(String identifier) { + return findSegment(segment -> segment.item.identifier().equals(identifier)); + } + + private FinderSegment findSegment(Predicate condition) { + for (FinderSegment segment : this) { + if (condition.test(segment)) { + return segment; + } + } + return null; + } +} diff --git a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderSegment.java b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderSegment.java new file mode 100644 index 000000000..531d9962b --- /dev/null +++ b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderSegment.java @@ -0,0 +1,32 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.extension.finder; + +public class FinderSegment { + + public final FinderColumn column; + public final FinderItem item; + + FinderSegment(FinderColumn column, FinderItem item) { + this.column = column; + this.item = item; + } + + @Override + public String toString() { + return column.identifier() + "=" + item.identifier(); + } +} From c8a660999f2d5f21a30fef21b31e8a043f456aa7 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Mon, 23 Mar 2026 11:27:39 +0100 Subject: [PATCH 035/430] Release 0.6.8 --- CHANGELOG.md | 5 ++++- README.md | 2 +- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 22 files changed, 25 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d742b7582..0bb3cf07a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +## [0.6.8] - 2026-03-23 + ### Added - Add `FinderPath` and `FinderSegment` with `FinderPath` implementing `Iterable` @@ -795,7 +797,8 @@ Stay tuned for more to come... - for dependency upgrades --> -[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.7...HEAD +[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.8...HEAD +[0.6.8]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.7...v0.6.8 [0.6.7]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.6...v0.6.7 [0.6.6]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.5...v0.6.6 [0.6.5]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.4...v0.6.5 diff --git a/README.md b/README.md index 26e890866..0eea852a8 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.7 + 0.6.8 pom import diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 9cb828bbf..2dd5b4734 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.8-SNAPSHOT + 0.6.8 ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index c91847e2f..4a053e933 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.8-SNAPSHOT + 0.6.8 pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index 3c94d7af8..90c96631b 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.8-SNAPSHOT + 0.6.8 ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 13e7069b8..85518eb99 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.8-SNAPSHOT", + "version": "0.6.8", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 7ead9d409..04509938c 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.8-SNAPSHOT + 0.6.8 ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index a13a4be9f..bc127fcfe 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.8-SNAPSHOT + 0.6.8 ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 464b9eb04..deb52c3c5 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.8-SNAPSHOT + 0.6.8 ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index a2d4ac303..1085abfbc 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.8-SNAPSHOT", + "version": "0.6.8", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 472004300..7e9f1748d 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.8-SNAPSHOT + 0.6.8 ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 9f0ec0934..7c7575752 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.8-SNAPSHOT + 0.6.8 ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 136d7bd32..1ac7f2cb2 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.8-SNAPSHOT", + "version": "0.6.8", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index 9e4ec1efc..22d2790ec 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.8-SNAPSHOT + 0.6.8 ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index b20479264..2485147fb 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.8-SNAPSHOT + 0.6.8 ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index d9b43250d..36ad21d7b 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.8-SNAPSHOT + 0.6.8 ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 2927542be..a2fb44ae9 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.8-SNAPSHOT + 0.6.8 ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index b7921e13d..e55b72fb3 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.8-SNAPSHOT + 0.6.8 ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 09485612d..42cbd76b3 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.8-SNAPSHOT + 0.6.8 pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index f9943a09b..d6d4f56b7 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.8-SNAPSHOT + 0.6.8 ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index e83250ca2..f78743e80 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.8-SNAPSHOT + 0.6.8 pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index a80f76971..ad430bb01 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.8-SNAPSHOT + 0.6.8 ../code-parent/pom.xml From 0f6a4b9c2504e998660c0f2f82defcc30cc2d9c5 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Mon, 23 Mar 2026 11:27:50 +0100 Subject: [PATCH 036/430] Next is 0.6.9 --- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 2dd5b4734..e5359d4a5 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.8 + 0.6.9-SNAPSHOT ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 4a053e933..565bac03a 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.8 + 0.6.9-SNAPSHOT pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index 90c96631b..7bdd36cc2 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.8 + 0.6.9-SNAPSHOT ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 85518eb99..acbca4b65 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.8", + "version": "0.6.9-SNAPSHOT", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 04509938c..b66a6021f 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.8 + 0.6.9-SNAPSHOT ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index bc127fcfe..ed02820ca 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.8 + 0.6.9-SNAPSHOT ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index deb52c3c5..9b4efdc27 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.8 + 0.6.9-SNAPSHOT ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 1085abfbc..a0fd0e721 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.8", + "version": "0.6.9-SNAPSHOT", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 7e9f1748d..3b0d597f8 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.8 + 0.6.9-SNAPSHOT ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 7c7575752..a05b1d277 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.8 + 0.6.9-SNAPSHOT ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 1ac7f2cb2..8418ead0d 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.8", + "version": "0.6.9-SNAPSHOT", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index 22d2790ec..a56b734a6 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.8 + 0.6.9-SNAPSHOT ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 2485147fb..50625d6cf 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.8 + 0.6.9-SNAPSHOT ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index 36ad21d7b..0ee618d6e 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.8 + 0.6.9-SNAPSHOT ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index a2fb44ae9..bcbc05053 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.8 + 0.6.9-SNAPSHOT ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index e55b72fb3..16a2b6cc3 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.8 + 0.6.9-SNAPSHOT ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 42cbd76b3..a58fcc6b9 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.8 + 0.6.9-SNAPSHOT pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index d6d4f56b7..3fe0d759c 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.8 + 0.6.9-SNAPSHOT ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index f78743e80..6005b16d2 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.8 + 0.6.9-SNAPSHOT pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index ad430bb01..41ca4bfa5 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.8 + 0.6.9-SNAPSHOT ../code-parent/pom.xml From 53f89cedefdc6524bbaab952c01529054446efe9 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Mon, 23 Mar 2026 13:31:58 +0100 Subject: [PATCH 037/430] Remove FinderItem.nextColumn(FinderColumn) --- CHANGELOG.md | 4 ++++ .../patternfly/extension/finder/Finder.java | 6 +++--- .../extension/finder/FinderItem.java | 21 +++++++------------ .../showcase/extension/FinderExtension.java | 4 ++-- 4 files changed, 16 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0bb3cf07a..60c1089cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +### Removed + +- Remove `FinderItem.nextColumn(FinderColumn column)`. Next columns can only be added lazily using `FinderItem.nextColumn(Supplier column)` (otherwise the component lookup of finder columns won't work). + ## [0.6.8] - 2026-03-23 ### Added diff --git a/extensions/finder/src/main/java/org/patternfly/extension/finder/Finder.java b/extensions/finder/src/main/java/org/patternfly/extension/finder/Finder.java index 02e694530..7b4914f77 100644 --- a/extensions/finder/src/main/java/org/patternfly/extension/finder/Finder.java +++ b/extensions/finder/src/main/java/org/patternfly/extension/finder/Finder.java @@ -321,10 +321,10 @@ private void handleKeydown(KeyboardEvent event) { event.preventDefault(); if (item.hasNext()) { // Don't use item.nextColumn() here! - // If FinderItem.nextColumnSupplier is not null, it would return a + // If FinderItem.nextColumn is not null, it would return a // new column not in the Finder.items map and not attached to the DOM! - // It is safe to assume that the next column is in the items map because - // it has been selected. FinderItem.handleClick() takes care about this. + // It is safe to assume that the next column is in the item map because + // it has been selected. FinderItem.handleClick() took care about this. FinderColumn nextColumn = nextColumn(column); if (nextColumn != null) { FinderItem targetItem = null; diff --git a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItem.java b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItem.java index 8ac741e0c..19455c183 100644 --- a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItem.java +++ b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItem.java @@ -140,9 +140,8 @@ private static FinderItem statusItem(String identifier) { private final HTMLContainerBuilder cc; // content container private final HTMLContainerBuilder tc; // text container private HTMLElement ic; - private FinderColumn nextColumn; private PreviewHandler previewHandler; - private Supplier nextColumnSupplier; + private Supplier nextColumn; FinderItem(String identifier) { super(SUB_COMPONENT_NAME, li().css(component(finder, item)) @@ -216,13 +215,8 @@ public FinderItem icon(Element icon) { return this; } - public FinderItem nextColumn(FinderColumn column) { - this.nextColumn = column; - return folder(true); - } - public FinderItem nextColumn(Supplier column) { - this.nextColumnSupplier = column; + this.nextColumn = column; return folder(true); } @@ -291,7 +285,10 @@ void handleClick(Finder finder, FinderColumn column, FinderItem item) { finder.select(column); column.select(item); if (hasNext()) { - finder.addItem(nextColumn()); + FinderColumn nextColumnInstance = nextColumn.get(); + if (nextColumnInstance != null) { + finder.addItem(nextColumnInstance); + } } previewItem(finder, column, item); } @@ -306,11 +303,7 @@ boolean isSelected() { } boolean hasNext() { - return nextColumn != null || nextColumnSupplier != null; - } - - FinderColumn nextColumn() { - return nextColumn != null ? nextColumn : nextColumnSupplier != null ? nextColumnSupplier.get() : null; + return nextColumn != null; } void makePinnable() { diff --git a/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java b/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java index 231032e85..179c7d41b 100644 --- a/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java +++ b/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java @@ -235,7 +235,7 @@ public FinderExtension() { .addDescription(String.valueOf(record.year)) .icon(recordVinyl()) .store("record", record) - .nextColumn(finderColumn(Id.build(record.title)) + .nextColumn(() -> finderColumn(Id.build(record.title)) .addHeader(finderColumnHeader(record.title)) .addItems(record.tracks.asList(), track -> finderItem(Id.build(record.title, String.valueOf(track.track))) @@ -282,7 +282,7 @@ public FinderExtension() { decade -> finderItem(Id.build(String.valueOf(decade[0]), String.valueOf(decade[1]))) .text(decade[0] + " - " + decade[1]) .icon(folder()) - .nextColumn(decadeColumn.apply(decade)))) + .nextColumn(() -> decadeColumn.apply(decade)))) .addPreview(finderPreview().css(util("p-md"))) .element(); // @code-end:finder-async From 7b6155ea25c3d2918bd8d8e4d845c17f5abbbfdf Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Mon, 23 Mar 2026 13:54:56 +0100 Subject: [PATCH 038/430] FinderColumn.finderColumn(String identifier, String header) --- CHANGELOG.md | 4 ++++ .../java/org/patternfly/extension/finder/FinderColumn.java | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 60c1089cd..3fab000b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +### Added + +- Add `FinderColumn.finderColumn(String identifier, String header)` + ### Removed - Remove `FinderItem.nextColumn(FinderColumn column)`. Next columns can only be added lazily using `FinderItem.nextColumn(Supplier column)` (otherwise the component lookup of finder columns won't work). diff --git a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java index a1bde2611..7746c3e47 100644 --- a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java +++ b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java @@ -61,6 +61,7 @@ import static org.patternfly.core.AsyncStatus.static_; import static org.patternfly.core.Timeouts.LOADING_TIMEOUT; import static org.patternfly.extension.finder.FinderClasses.column; +import static org.patternfly.extension.finder.FinderColumnHeader.finderColumnHeader; import static org.patternfly.extension.finder.FinderItem.errorItem; import static org.patternfly.extension.finder.FinderItem.loadingItem; import static org.patternfly.style.Classes.component; @@ -80,6 +81,11 @@ public static FinderColumn finderColumn(String identifier) { return new FinderColumn(identifier); } + public static FinderColumn finderColumn(String identifier, String header) { + return new FinderColumn(identifier) + .addHeader(finderColumnHeader(header)); + } + // ------------------------------------------------------ instance public static final String SUB_COMPONENT_NAME = "fc"; From 94ee6787f7fe9ae24c21ed6422c7ff01058ca86b Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Mon, 23 Mar 2026 16:21:07 +0100 Subject: [PATCH 039/430] Add FinderColumn.defaultSearch() --- CHANGELOG.md | 2 ++ .../extension/finder/FinderColumn.java | 30 ++++++++++++++++++- .../extension/finder/FinderColumnSearch.java | 15 ---------- .../showcase/extension/FinderExtension.java | 8 +---- 4 files changed, 32 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3fab000b0..506cb2a78 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ### Added - Add `FinderColumn.finderColumn(String identifier, String header)` +- Add `FinderColumn.defaultSearch(String)` +- Add `FinderColumn.toggleSearch(Predicate)` ### Removed diff --git a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java index 7746c3e47..54a4d9f3b 100644 --- a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java +++ b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java @@ -22,8 +22,10 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.function.Predicate; import org.jboss.elemento.HTMLContainerBuilder; +import org.jboss.elemento.Id; import org.jboss.elemento.logger.Logger; import org.patternfly.component.AddItemHandler; import org.patternfly.component.AsyncItems; @@ -38,7 +40,6 @@ import org.patternfly.core.Dataset; import org.patternfly.handler.SelectHandler; import org.patternfly.style.Classes; - import elemental2.dom.Event; import elemental2.dom.HTMLElement; import elemental2.dom.HTMLUListElement; @@ -53,8 +54,10 @@ import static org.jboss.elemento.Elements.insertBefore; import static org.jboss.elemento.Elements.insertFirst; import static org.jboss.elemento.Elements.removeChildrenFrom; +import static org.jboss.elemento.Elements.setVisible; import static org.jboss.elemento.Elements.ul; import static org.jboss.elemento.Role.tree; +import static org.patternfly.component.textinputgroup.SearchInput.searchInput; import static org.patternfly.core.AsyncStatus.pending; import static org.patternfly.core.AsyncStatus.rejected; import static org.patternfly.core.AsyncStatus.resolved; @@ -62,8 +65,10 @@ import static org.patternfly.core.Timeouts.LOADING_TIMEOUT; import static org.patternfly.extension.finder.FinderClasses.column; import static org.patternfly.extension.finder.FinderColumnHeader.finderColumnHeader; +import static org.patternfly.extension.finder.FinderColumnSearch.finderColumnSearch; import static org.patternfly.extension.finder.FinderItem.errorItem; import static org.patternfly.extension.finder.FinderItem.loadingItem; +import static org.patternfly.icon.IconSets.fas.search; import static org.patternfly.style.Classes.component; import static org.patternfly.style.Classes.filtered; import static org.patternfly.style.Classes.modifier; @@ -105,6 +110,7 @@ public static FinderColumn finderColumn(String identifier, String header) { private final HTMLContainerBuilder ul; private boolean pinnable; private AsyncStatus status; + private FinderColumnSearch search; private Comparator comparator; private AsyncItems asyncItems; @@ -140,6 +146,7 @@ public FinderColumn addSearch(FinderColumnSearch search) { } public FinderColumn add(FinderColumnSearch search) { + this.search = search; insertBefore(search, ul.element()); return this; } @@ -173,6 +180,19 @@ public FinderColumn active(boolean active) { return toggleModifier(this, element(), Classes.active, active); } + public FinderColumn defaultSearch() { + return defaultSearch("Filter by name"); + } + + public FinderColumn defaultSearch(String placeholder) { + return addSearch(finderColumnSearch() + .addSearchInput(searchInput(Id.unique(SUB_COMPONENT_NAME)).icon(search()).placeholder(placeholder), + (item, value) -> { + String lcv = value.toLowerCase(); + return !value.isEmpty() && !item.text().toLowerCase().contains(lcv); + })); + } + @Override public FinderColumn ordered(Comparator comparator) { this.comparator = comparator; @@ -196,6 +216,14 @@ public FinderColumn store(String key, T value) { return this; } + public FinderColumn toggleSearch(Predicate predicate) { + if (search != null) { + aur.onAdd((c, i) -> setVisible(search, predicate.test(c))); + aur.onRemove((c, i) -> setVisible(search, predicate.test(c))); + } + return this; + } + @Override public FinderColumn that() { return this; diff --git a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumnSearch.java b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumnSearch.java index b4b8e8eb3..ea28fba56 100644 --- a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumnSearch.java +++ b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumnSearch.java @@ -18,7 +18,6 @@ import java.util.function.BiPredicate; import org.patternfly.component.textinputgroup.SearchInput; - import elemental2.dom.HTMLElement; import static org.jboss.elemento.Elements.div; @@ -41,20 +40,6 @@ public static FinderColumnSearch finderColumnSearch() { public static final String SUB_COMPONENT_NAME = "fcs"; - /** - * A {@link BiPredicate} implementation used to filter {@link FinderItem} instances based on their text content. This filter - * checks if the given {@link FinderItem}'s text does not contain the specified search value (case-insensitive). - *

- * The predicate evaluates to {@code true} if: - The search value is non-empty. - The lower-cased text of the - * {@link FinderItem} does not contain the lower-cased search value. - *

- * This can be used to exclude items whose text does not match the specified search criteria. - */ - public static final BiPredicate ITEM_TEXT_CONTAINS_FILTER = (item, value) -> { - String lcv = value.toLowerCase(); - return !value.isEmpty() && !item.text().toLowerCase().contains(lcv); - }; - FinderColumnSearch() { super(SUB_COMPONENT_NAME, div().css(component(finder, column, search)).element()); } diff --git a/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java b/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java index 179c7d41b..1627e9e16 100644 --- a/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java +++ b/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java @@ -38,7 +38,6 @@ import org.patternfly.showcase.model.Files; import org.patternfly.showcase.model.Record; import org.patternfly.showcase.model.Track; - import elemental2.promise.Promise; import static elemental2.dom.DomGlobal.setTimeout; @@ -59,13 +58,10 @@ import static org.patternfly.component.list.DescriptionListDescription.descriptionListDescription; import static org.patternfly.component.list.DescriptionListGroup.descriptionListGroup; import static org.patternfly.component.list.DescriptionListTerm.descriptionListTerm; -import static org.patternfly.component.textinputgroup.SearchInput.searchInput; import static org.patternfly.extension.finder.Finder.finder; import static org.patternfly.extension.finder.FinderColumn.finderColumn; import static org.patternfly.extension.finder.FinderColumnActions.finderColumnActions; import static org.patternfly.extension.finder.FinderColumnHeader.finderColumnHeader; -import static org.patternfly.extension.finder.FinderColumnSearch.ITEM_TEXT_CONTAINS_FILTER; -import static org.patternfly.extension.finder.FinderColumnSearch.finderColumnSearch; import static org.patternfly.extension.finder.FinderItem.emptyItem; import static org.patternfly.extension.finder.FinderItem.finderItem; import static org.patternfly.extension.finder.FinderPreview.finderPreview; @@ -75,7 +71,6 @@ import static org.patternfly.icon.IconSets.fas.plus; import static org.patternfly.icon.IconSets.fas.recordVinyl; import static org.patternfly.icon.IconSets.fas.redo; -import static org.patternfly.icon.IconSets.fas.search; import static org.patternfly.icon.PredefinedIcon.predefinedIcon; import static org.patternfly.showcase.ApiDoc.Type.component; import static org.patternfly.showcase.ApiDoc.Type.subcomponent; @@ -140,8 +135,7 @@ public FinderExtension() { return finder().bordered() .addItem(finderColumn("root").run(column -> column .addHeader(demoHeader.apply("Root")) - .addSearch(finderColumnSearch().addSearchInput(searchInput(Id.unique("finder-basic")) - .icon(search()).placeholder("Filter by name"), ITEM_TEXT_CONTAINS_FILTER)) + .defaultSearch() .addItems(Files.data.asList(), fileItem[0]))) .element(); // @code-end:finder-basic From c8c7362ff1d05228f5b8bf94e85494f775bbe6f5 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Mon, 23 Mar 2026 17:10:57 +0100 Subject: [PATCH 040/430] Hide item actions in inactive columns --- CHANGELOG.md | 4 ++++ extensions/finder/npm/finder.css | 2 +- .../java/org/patternfly/extension/finder/FinderColumn.java | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 506cb2a78..fd87c3754 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - Add `FinderColumn.defaultSearch(String)` - Add `FinderColumn.toggleSearch(Predicate)` +### Fixed + +- Hide item actions in inactive columns + ### Removed - Remove `FinderItem.nextColumn(FinderColumn column)`. Next columns can only be added lazily using `FinderItem.nextColumn(Supplier column)` (otherwise the component lookup of finder columns won't work). diff --git a/extensions/finder/npm/finder.css b/extensions/finder/npm/finder.css index 593b4caef..8451a525d 100644 --- a/extensions/finder/npm/finder.css +++ b/extensions/finder/npm/finder.css @@ -272,7 +272,7 @@ flex-shrink: 0; } -.pf-v6-c-finder__item.pf-m-selected .pf-v6-c-finder__item-actions { +.pf-v6-c-finder__column.pf-m-active .pf-v6-c-finder__item.pf-m-selected .pf-v6-c-finder__item-actions { display: inline-flex; } diff --git a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java index 54a4d9f3b..959b92048 100644 --- a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java +++ b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java @@ -218,6 +218,7 @@ public FinderColumn store(String key, T value) { public FinderColumn toggleSearch(Predicate predicate) { if (search != null) { + setVisible(search, predicate.test(this)); aur.onAdd((c, i) -> setVisible(search, predicate.test(c))); aur.onRemove((c, i) -> setVisible(search, predicate.test(c))); } From 8f040472f857696653f4f08773941be5d1b39b9b Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Mon, 23 Mar 2026 19:00:09 +0100 Subject: [PATCH 041/430] Release 0.6.9 --- CHANGELOG.md | 5 ++++- README.md | 2 +- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 22 files changed, 25 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fd87c3754..08dd2cde9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +## [0.6.9] - 2026-03-23 + ### Added - Add `FinderColumn.finderColumn(String identifier, String header)` @@ -811,7 +813,8 @@ Stay tuned for more to come... - for dependency upgrades --> -[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.8...HEAD +[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.9...HEAD +[0.6.9]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.8...v0.6.9 [0.6.8]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.7...v0.6.8 [0.6.7]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.6...v0.6.7 [0.6.6]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.5...v0.6.6 diff --git a/README.md b/README.md index 0eea852a8..a64071b0d 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.8 + 0.6.9 pom import diff --git a/apidoc/pom.xml b/apidoc/pom.xml index e5359d4a5..c806d91fd 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.9-SNAPSHOT + 0.6.9 ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 565bac03a..dc5c51500 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.9-SNAPSHOT + 0.6.9 pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index 7bdd36cc2..ce2722e97 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.9-SNAPSHOT + 0.6.9 ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index acbca4b65..6c3cc15f2 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.9-SNAPSHOT", + "version": "0.6.9", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index b66a6021f..2ca16d842 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.9-SNAPSHOT + 0.6.9 ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index ed02820ca..ff2c34acc 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.9-SNAPSHOT + 0.6.9 ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 9b4efdc27..595470b40 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.9-SNAPSHOT + 0.6.9 ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index a0fd0e721..6da92e6aa 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.9-SNAPSHOT", + "version": "0.6.9", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 3b0d597f8..4bc928d8f 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.9-SNAPSHOT + 0.6.9 ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index a05b1d277..7fa15b643 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.9-SNAPSHOT + 0.6.9 ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 8418ead0d..78bd8af69 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.9-SNAPSHOT", + "version": "0.6.9", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index a56b734a6..ac51a443a 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.9-SNAPSHOT + 0.6.9 ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 50625d6cf..66f25c5ca 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.9-SNAPSHOT + 0.6.9 ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index 0ee618d6e..dad1bc130 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.9-SNAPSHOT + 0.6.9 ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index bcbc05053..686917572 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.9-SNAPSHOT + 0.6.9 ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 16a2b6cc3..baceaf951 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.9-SNAPSHOT + 0.6.9 ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index a58fcc6b9..4c0264102 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.9-SNAPSHOT + 0.6.9 pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index 3fe0d759c..f5a2bcc95 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.9-SNAPSHOT + 0.6.9 ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 6005b16d2..1a9dbc43e 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.9-SNAPSHOT + 0.6.9 pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 41ca4bfa5..58945889e 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.9-SNAPSHOT + 0.6.9 ../code-parent/pom.xml From 3899fced3600679af854d2367bd0e7ddbd139ac0 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Mon, 23 Mar 2026 19:00:18 +0100 Subject: [PATCH 042/430] Next is 0.6.10 --- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apidoc/pom.xml b/apidoc/pom.xml index c806d91fd..3f1202659 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.9 + 0.6.10-SNAPSHOT ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index dc5c51500..d007c8200 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.9 + 0.6.10-SNAPSHOT pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index ce2722e97..4b7de1d37 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.9 + 0.6.10-SNAPSHOT ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 6c3cc15f2..f446c57b6 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.9", + "version": "0.6.10-SNAPSHOT", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 2ca16d842..f48322394 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.9 + 0.6.10-SNAPSHOT ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index ff2c34acc..9a5f8a41c 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.9 + 0.6.10-SNAPSHOT ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 595470b40..7a275fa91 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.9 + 0.6.10-SNAPSHOT ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 6da92e6aa..cb126ed28 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.9", + "version": "0.6.10-SNAPSHOT", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 4bc928d8f..8aadb0e94 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.9 + 0.6.10-SNAPSHOT ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 7fa15b643..9eb36d3cc 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.9 + 0.6.10-SNAPSHOT ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 78bd8af69..f07ec38e7 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.9", + "version": "0.6.10-SNAPSHOT", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index ac51a443a..9ec0ce648 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.9 + 0.6.10-SNAPSHOT ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 66f25c5ca..ab8921389 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.9 + 0.6.10-SNAPSHOT ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index dad1bc130..6ce2d0df3 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.9 + 0.6.10-SNAPSHOT ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 686917572..a279f5914 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.9 + 0.6.10-SNAPSHOT ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index baceaf951..839883f2a 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.9 + 0.6.10-SNAPSHOT ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 4c0264102..92839e4de 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.9 + 0.6.10-SNAPSHOT pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index f5a2bcc95..39ce3f4db 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.9 + 0.6.10-SNAPSHOT ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 1a9dbc43e..0f3a86f9a 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.9 + 0.6.10-SNAPSHOT pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 58945889e..fd7c87d67 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.9 + 0.6.10-SNAPSHOT ../code-parent/pom.xml From 66ef4d123c3749d0ee0e45e31086b5f5047897e2 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 24 Mar 2026 07:45:23 +0100 Subject: [PATCH 043/430] Prepare next release --- CHANGELOG.md | 7 +++++-- pom.xml | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 08dd2cde9..8baba1a85 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,8 +6,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] -## [0.6.9] - 2026-03-23 - ### Added - Add `FinderColumn.finderColumn(String identifier, String header)` @@ -22,6 +20,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - Remove `FinderItem.nextColumn(FinderColumn column)`. Next columns can only be added lazily using `FinderItem.nextColumn(Supplier column)` (otherwise the component lookup of finder columns won't work). +## [0.6.9] - 2026-03-23 + +> [!WARNING] +> Not an official release. Please don't use! + ## [0.6.8] - 2026-03-23 ### Added diff --git a/pom.xml b/pom.xml index 92839e4de..86809f180 100644 --- a/pom.xml +++ b/pom.xml @@ -562,7 +562,7 @@ central true 86400 - validated + published From 5831aabd36664647eb946dde79af5522fba189f9 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 24 Mar 2026 07:46:01 +0100 Subject: [PATCH 044/430] Release 0.6.10 --- CHANGELOG.md | 5 ++++- README.md | 2 +- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 22 files changed, 25 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8baba1a85..68ebc935e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +## [0.6.10] - 2026-03-24 + ### Added - Add `FinderColumn.finderColumn(String identifier, String header)` @@ -816,7 +818,8 @@ Stay tuned for more to come... - for dependency upgrades --> -[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.9...HEAD +[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.10...HEAD +[0.6.10]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.9...v0.6.10 [0.6.9]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.8...v0.6.9 [0.6.8]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.7...v0.6.8 [0.6.7]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.6...v0.6.7 diff --git a/README.md b/README.md index a64071b0d..8481262fd 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.9 + 0.6.10 pom import diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 3f1202659..1cee49285 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.10-SNAPSHOT + 0.6.10 ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index d007c8200..6e57d40e8 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.10-SNAPSHOT + 0.6.10 pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index 4b7de1d37..a674e3db3 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.10-SNAPSHOT + 0.6.10 ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index f446c57b6..3bc59a901 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.10-SNAPSHOT", + "version": "0.6.10", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index f48322394..7f649ba38 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.10-SNAPSHOT + 0.6.10 ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 9a5f8a41c..b05cfb3e6 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.10-SNAPSHOT + 0.6.10 ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 7a275fa91..e727f9058 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.10-SNAPSHOT + 0.6.10 ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index cb126ed28..a02fc7461 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.10-SNAPSHOT", + "version": "0.6.10", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 8aadb0e94..1fb46ff9f 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.10-SNAPSHOT + 0.6.10 ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 9eb36d3cc..0c7236b52 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.10-SNAPSHOT + 0.6.10 ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index f07ec38e7..a9b60a077 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.10-SNAPSHOT", + "version": "0.6.10", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index 9ec0ce648..e7154f252 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.10-SNAPSHOT + 0.6.10 ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index ab8921389..9935e5b02 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.10-SNAPSHOT + 0.6.10 ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index 6ce2d0df3..646b7f603 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.10-SNAPSHOT + 0.6.10 ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index a279f5914..949663e29 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.10-SNAPSHOT + 0.6.10 ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 839883f2a..187693f3c 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.10-SNAPSHOT + 0.6.10 ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 86809f180..ca39c3662 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.10-SNAPSHOT + 0.6.10 pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index 39ce3f4db..351f3d294 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.10-SNAPSHOT + 0.6.10 ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 0f3a86f9a..77b2bbb08 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.10-SNAPSHOT + 0.6.10 pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index fd7c87d67..7cb596688 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.10-SNAPSHOT + 0.6.10 ../code-parent/pom.xml From 6b96733acca7bef211415fe9a78995ad0e57488d Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 24 Mar 2026 07:46:10 +0100 Subject: [PATCH 045/430] Next is 0.6.11 --- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 1cee49285..c0a36590f 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.10 + 0.6.11-SNAPSHOT ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 6e57d40e8..3f2d8070e 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.10 + 0.6.11-SNAPSHOT pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index a674e3db3..49848e80e 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.10 + 0.6.11-SNAPSHOT ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 3bc59a901..ac4d2f505 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.10", + "version": "0.6.11-SNAPSHOT", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 7f649ba38..3ca0abbce 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.10 + 0.6.11-SNAPSHOT ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index b05cfb3e6..f6f62d38b 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.10 + 0.6.11-SNAPSHOT ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index e727f9058..7ce944db4 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.10 + 0.6.11-SNAPSHOT ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index a02fc7461..ba5bfd6ac 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.10", + "version": "0.6.11-SNAPSHOT", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 1fb46ff9f..d02798399 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.10 + 0.6.11-SNAPSHOT ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 0c7236b52..83d3eb242 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.10 + 0.6.11-SNAPSHOT ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index a9b60a077..60c164c5e 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.10", + "version": "0.6.11-SNAPSHOT", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index e7154f252..6b472d6b4 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.10 + 0.6.11-SNAPSHOT ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 9935e5b02..eb1c94931 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.10 + 0.6.11-SNAPSHOT ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index 646b7f603..ef45631e5 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.10 + 0.6.11-SNAPSHOT ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 949663e29..218ada846 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.10 + 0.6.11-SNAPSHOT ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 187693f3c..3c34f6c95 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.10 + 0.6.11-SNAPSHOT ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index ca39c3662..d66385afb 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.10 + 0.6.11-SNAPSHOT pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index 351f3d294..1d264fdd1 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.10 + 0.6.11-SNAPSHOT ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 77b2bbb08..9e8d01939 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.10 + 0.6.11-SNAPSHOT pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 7cb596688..472ba1522 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.10 + 0.6.11-SNAPSHOT ../code-parent/pom.xml From 89550a958fccf1514ba2591968882c5ba261984a Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 24 Mar 2026 15:58:22 +0100 Subject: [PATCH 046/430] Prepare next release --- CHANGELOG.md | 8 ++++ extensions/finder/npm/finder.css | 8 ++++ .../extension/finder/FinderColumn.java | 38 +++++++++++++++++++ .../extension/finder/FinderColumnSearch.java | 9 +++++ .../showcase/extension/FinderExtension.java | 4 +- 5 files changed, 65 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 68ebc935e..a20e3b5c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +### Added + +- Add `FinderColumn.showSearchThreshold(int)` + +### Changed + +- Add padding to the finder preview matching the padding of the finder columns and items + ## [0.6.10] - 2026-03-24 ### Added diff --git a/extensions/finder/npm/finder.css b/extensions/finder/npm/finder.css index 8451a525d..793244c29 100644 --- a/extensions/finder/npm/finder.css +++ b/extensions/finder/npm/finder.css @@ -91,6 +91,10 @@ --pf-v6-c-finder__item-folder-icon--m-selected--Color: var(--pf-t--global--text--color--on-brand--default); /* Preview */ + --pf-v6-c-finder__preview--PaddingBlockStart: var(--pf-t--global--spacer--200); + --pf-v6-c-finder__preview--PaddingBlockEnd: var(--pf-t--global--spacer--200); + --pf-v6-c-finder__preview--PaddingInlineStart: var(--pf-t--global--spacer--300); + --pf-v6-c-finder__preview--PaddingInlineEnd: var(--pf-t--global--spacer--200); --pf-v6-c-finder__preview--MinWidth: 24rem; --pf-v6-c-finder__preview--BackgroundColor: var(--pf-t--global--background--color--primary--default); --pf-v6-c-finder__preview--BorderLeftColor: var(--pf-t--global--border--color--default); @@ -416,4 +420,8 @@ overflow-y: auto; border-left: var(--pf-v6-c-finder__column--BorderRightWidth) solid var(--pf-v6-c-finder__column--BorderRightColor); margin-left: calc(var(--pf-v6-c-finder__column--BorderRightWidth) * -1); + padding-block-start: var(--pf-v6-c-finder__column-header--PaddingBlockStart); + padding-block-end: var(--pf-v6-c-finder__column-header--PaddingBlockEnd); + padding-inline-start: var(--pf-v6-c-finder__column-header--PaddingInlineStart); + padding-inline-end: var(--pf-v6-c-finder__column-header--PaddingInlineEnd); } diff --git a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java index 959b92048..49880de99 100644 --- a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java +++ b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java @@ -180,10 +180,23 @@ public FinderColumn active(boolean active) { return toggleModifier(this, element(), Classes.active, active); } + /** + * Same as {@linkplain #defaultSearch(String) defaultSearch("Filter by name")} + * + * @return the current {@code FinderColumn} instance with the default search functionality added + */ public FinderColumn defaultSearch() { return defaultSearch("Filter by name"); } + /** + * Configures the current {@code FinderColumn} instance with a default search functionality. The search functionality allows + * filtering of items in the column based on the content of a search input field. The provided placeholder text for the + * search input is used to indicate the purpose of the search field to the user. + * + * @param placeholder the placeholder text to display in the search input field + * @return the current {@code FinderColumn} instance with the configured default search functionality + */ public FinderColumn defaultSearch(String placeholder) { return addSearch(finderColumnSearch() .addSearchInput(searchInput(Id.unique(SUB_COMPONENT_NAME)).icon(search()).placeholder(placeholder), @@ -216,6 +229,31 @@ public FinderColumn store(String key, T value) { return this; } + /** + * Configures the current {@code FinderColumn} instance to show the search component when the size of the items in the + * column is greater than or equal to the specified value. The visibility condition is evaluated based on the number of + * items in the column. + *

+ * If no search component is present in the column, this method does nothing. + * + * @param size the minimum number of items required in the column to show the search component + * @return the current {@code FinderColumn} instance with updated search visibility configuration + */ + public FinderColumn showSearchThreshold(int size) { + return toggleSearch(c -> c.size() >= size); + } + + /** + * Toggles the visibility of the search component in the column based on the provided predicate. The predicate is evaluated + * against the current column and determines whether the search component should be visible. Additionally, the visibility of + * the search component reacts to items being added to or removed from the column. + *

+ * If no search component is present in the column, this method does nothing. + * + * @param predicate a {@code Predicate} that evaluates the visibility condition for the search component based on the + * current {@code FinderColumn} + * @return the current {@code FinderColumn} instance with updated search visibility + */ public FinderColumn toggleSearch(Predicate predicate) { if (search != null) { setVisible(search, predicate.test(this)); diff --git a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumnSearch.java b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumnSearch.java index ea28fba56..7c110bd1b 100644 --- a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumnSearch.java +++ b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumnSearch.java @@ -28,6 +28,15 @@ import static org.patternfly.style.Classes.modifier; import static org.patternfly.style.Classes.search; +/** + * The {@code FinderColumnSearch} class is a subcomponent designed to handle search functionality within a finder column. It + * extends the {@link FinderSubComponent} class to provide a specialized interface for managing search inputs. The class allows + * adding {@link SearchInput} instances with or without filtering predicates and defines the behavior for filtering + * {@link FinderItem}s based on user-provided search values. + *

+ * The filtering predicate determines how {@link FinderItem}s are flagged as filtered depending on their text content and the + * specified search value. When no predicate is provided, the {@link FinderItem}s are not programmatically filtered on input. + */ public class FinderColumnSearch extends FinderSubComponent { // ------------------------------------------------------ factory diff --git a/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java b/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java index 1627e9e16..874f1207c 100644 --- a/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java +++ b/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java @@ -170,7 +170,7 @@ public FinderExtension() { .addDescription(descriptionListDescription(file.meta.get(key))))))); } })) - .addPreview(finderPreview().css(util("p-md")) + .addPreview(finderPreview() .add(content(h1).text("Preview")) .add(content(p).editorial().text("Please select an item to see the preview."))) .element() @@ -277,7 +277,7 @@ public FinderExtension() { .text(decade[0] + " - " + decade[1]) .icon(folder()) .nextColumn(() -> decadeColumn.apply(decade)))) - .addPreview(finderPreview().css(util("p-md"))) + .addPreview(finderPreview()) .element(); // @code-end:finder-async })); From 4156fe82bf9a88b7a95de2f64a20819367a49b52 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 24 Mar 2026 15:58:51 +0100 Subject: [PATCH 047/430] Release 0.6.11 --- CHANGELOG.md | 5 ++++- README.md | 2 +- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 22 files changed, 25 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a20e3b5c2..68b54f4c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +## [0.6.11] - 2026-03-24 + ### Added - Add `FinderColumn.showSearchThreshold(int)` @@ -826,7 +828,8 @@ Stay tuned for more to come... - for dependency upgrades --> -[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.10...HEAD +[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.11...HEAD +[0.6.11]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.10...v0.6.11 [0.6.10]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.9...v0.6.10 [0.6.9]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.8...v0.6.9 [0.6.8]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.7...v0.6.8 diff --git a/README.md b/README.md index 8481262fd..2e9acd723 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.10 + 0.6.11 pom import diff --git a/apidoc/pom.xml b/apidoc/pom.xml index c0a36590f..4e2daeeb7 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.11-SNAPSHOT + 0.6.11 ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 3f2d8070e..e487af029 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.11-SNAPSHOT + 0.6.11 pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index 49848e80e..1e20fc593 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.11-SNAPSHOT + 0.6.11 ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index ac4d2f505..26a6348a3 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.11-SNAPSHOT", + "version": "0.6.11", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 3ca0abbce..d29277256 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.11-SNAPSHOT + 0.6.11 ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index f6f62d38b..9bda15e79 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.11-SNAPSHOT + 0.6.11 ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 7ce944db4..b0ea2a7ad 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.11-SNAPSHOT + 0.6.11 ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index ba5bfd6ac..6e757da34 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.11-SNAPSHOT", + "version": "0.6.11", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index d02798399..c8c3e7ee0 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.11-SNAPSHOT + 0.6.11 ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 83d3eb242..e1dbd1691 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.11-SNAPSHOT + 0.6.11 ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 60c164c5e..5cb7bc64c 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.11-SNAPSHOT", + "version": "0.6.11", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index 6b472d6b4..5e9671207 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.11-SNAPSHOT + 0.6.11 ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index eb1c94931..37a306a80 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.11-SNAPSHOT + 0.6.11 ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index ef45631e5..d9072cfbd 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.11-SNAPSHOT + 0.6.11 ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 218ada846..78c6e3662 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.11-SNAPSHOT + 0.6.11 ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 3c34f6c95..299c633f1 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.11-SNAPSHOT + 0.6.11 ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index d66385afb..080270a42 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.11-SNAPSHOT + 0.6.11 pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index 1d264fdd1..fef8db31f 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.11-SNAPSHOT + 0.6.11 ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 9e8d01939..241b2af34 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.11-SNAPSHOT + 0.6.11 pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 472ba1522..7773fe950 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.11-SNAPSHOT + 0.6.11 ../code-parent/pom.xml From 796bc913381467f143e623014281c479409cd6d0 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 24 Mar 2026 15:59:01 +0100 Subject: [PATCH 048/430] Next is 0.6.12 --- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 4e2daeeb7..fddc90fc1 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.11 + 0.6.12-SNAPSHOT ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index e487af029..d9ea305d4 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.11 + 0.6.12-SNAPSHOT pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index 1e20fc593..06559d487 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.11 + 0.6.12-SNAPSHOT ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 26a6348a3..336827530 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.11", + "version": "0.6.12-SNAPSHOT", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index d29277256..8dd83b68c 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.11 + 0.6.12-SNAPSHOT ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 9bda15e79..bf9c340d8 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.11 + 0.6.12-SNAPSHOT ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index b0ea2a7ad..caa8d691c 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.11 + 0.6.12-SNAPSHOT ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 6e757da34..8b99be814 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.11", + "version": "0.6.12-SNAPSHOT", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index c8c3e7ee0..7c12545a4 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.11 + 0.6.12-SNAPSHOT ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index e1dbd1691..401d8e220 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.11 + 0.6.12-SNAPSHOT ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 5cb7bc64c..731ebebca 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.11", + "version": "0.6.12-SNAPSHOT", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index 5e9671207..a20e1ba7e 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.11 + 0.6.12-SNAPSHOT ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 37a306a80..04c5b40e7 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.11 + 0.6.12-SNAPSHOT ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index d9072cfbd..d073d6e1a 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.11 + 0.6.12-SNAPSHOT ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 78c6e3662..de7ecb683 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.11 + 0.6.12-SNAPSHOT ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 299c633f1..f30aabee4 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.11 + 0.6.12-SNAPSHOT ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 080270a42..a94cdcb12 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.11 + 0.6.12-SNAPSHOT pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index fef8db31f..5a0d3102f 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.11 + 0.6.12-SNAPSHOT ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 241b2af34..7004799ec 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.11 + 0.6.12-SNAPSHOT pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 7773fe950..07e3d4cf1 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.11 + 0.6.12-SNAPSHOT ../code-parent/pom.xml From 918b5b8584d97b80658cc9d194f8b015df77074e Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 24 Mar 2026 16:59:55 +0100 Subject: [PATCH 049/430] Prepare next release --- CHANGELOG.md | 7 +++++-- .../java/org/patternfly/extension/finder/FinderColumn.java | 1 + .../patternfly/extension/finder/FinderColumnSearch.java | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 68b54f4c2..2506f9a1d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,8 +6,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] -## [0.6.11] - 2026-03-24 - ### Added - Add `FinderColumn.showSearchThreshold(int)` @@ -16,6 +14,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - Add padding to the finder preview matching the padding of the finder columns and items +## [0.6.11] - 2026-03-24 + +> [!WARNING] +> Not an official release. Please don't use! + ## [0.6.10] - 2026-03-24 ### Added diff --git a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java index 49880de99..c853b189f 100644 --- a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java +++ b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumn.java @@ -40,6 +40,7 @@ import org.patternfly.core.Dataset; import org.patternfly.handler.SelectHandler; import org.patternfly.style.Classes; + import elemental2.dom.Event; import elemental2.dom.HTMLElement; import elemental2.dom.HTMLUListElement; diff --git a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumnSearch.java b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumnSearch.java index 7c110bd1b..4e5fbbecc 100644 --- a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumnSearch.java +++ b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderColumnSearch.java @@ -18,6 +18,7 @@ import java.util.function.BiPredicate; import org.patternfly.component.textinputgroup.SearchInput; + import elemental2.dom.HTMLElement; import static org.jboss.elemento.Elements.div; From e6629bb80bf853249bffd11e9b22012f59016b2c Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 24 Mar 2026 17:00:18 +0100 Subject: [PATCH 050/430] Release 0.6.12 --- CHANGELOG.md | 5 ++++- README.md | 2 +- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 22 files changed, 25 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2506f9a1d..3357899b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +## [0.6.12] - 2026-03-24 + ### Added - Add `FinderColumn.showSearchThreshold(int)` @@ -831,7 +833,8 @@ Stay tuned for more to come... - for dependency upgrades --> -[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.11...HEAD +[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.12...HEAD +[0.6.12]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.11...v0.6.12 [0.6.11]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.10...v0.6.11 [0.6.10]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.9...v0.6.10 [0.6.9]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.8...v0.6.9 diff --git a/README.md b/README.md index 2e9acd723..b8c9ccc08 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.11 + 0.6.12 pom import diff --git a/apidoc/pom.xml b/apidoc/pom.xml index fddc90fc1..f2d020606 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.12-SNAPSHOT + 0.6.12 ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index d9ea305d4..b271c2ca5 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.12-SNAPSHOT + 0.6.12 pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index 06559d487..ab15a73c9 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.12-SNAPSHOT + 0.6.12 ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 336827530..d39b1875c 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.12-SNAPSHOT", + "version": "0.6.12", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 8dd83b68c..2d8398eff 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.12-SNAPSHOT + 0.6.12 ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index bf9c340d8..fdb843637 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.12-SNAPSHOT + 0.6.12 ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index caa8d691c..4e5b683bf 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.12-SNAPSHOT + 0.6.12 ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 8b99be814..177ccebfe 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.12-SNAPSHOT", + "version": "0.6.12", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 7c12545a4..5282ce44b 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.12-SNAPSHOT + 0.6.12 ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 401d8e220..7511b0d53 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.12-SNAPSHOT + 0.6.12 ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 731ebebca..561a7ed93 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.12-SNAPSHOT", + "version": "0.6.12", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index a20e1ba7e..0d67f2ac4 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.12-SNAPSHOT + 0.6.12 ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 04c5b40e7..bff7ad7cb 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.12-SNAPSHOT + 0.6.12 ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index d073d6e1a..f431219e8 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.12-SNAPSHOT + 0.6.12 ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index de7ecb683..c84bbce9b 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.12-SNAPSHOT + 0.6.12 ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index f30aabee4..3648a3ae7 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.12-SNAPSHOT + 0.6.12 ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index a94cdcb12..2482a1872 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.12-SNAPSHOT + 0.6.12 pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index 5a0d3102f..08a05af3f 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.12-SNAPSHOT + 0.6.12 ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 7004799ec..a15097363 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.12-SNAPSHOT + 0.6.12 pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 07e3d4cf1..349eb6487 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.12-SNAPSHOT + 0.6.12 ../code-parent/pom.xml From 8e051787b53a9a7b47043f620611bcfdcad558f2 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 24 Mar 2026 17:00:28 +0100 Subject: [PATCH 051/430] Next is 0.6.13 --- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apidoc/pom.xml b/apidoc/pom.xml index f2d020606..63f21e53f 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.12 + 0.6.13-SNAPSHOT ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index b271c2ca5..544fd819c 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.12 + 0.6.13-SNAPSHOT pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index ab15a73c9..a99feaa64 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.12 + 0.6.13-SNAPSHOT ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index d39b1875c..6b9ecf48c 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.12", + "version": "0.6.13-SNAPSHOT", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 2d8398eff..7ee68d7c9 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.12 + 0.6.13-SNAPSHOT ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index fdb843637..cb5e14a6d 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.12 + 0.6.13-SNAPSHOT ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 4e5b683bf..5256922d0 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.12 + 0.6.13-SNAPSHOT ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 177ccebfe..392b23e87 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.12", + "version": "0.6.13-SNAPSHOT", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 5282ce44b..cd8a13704 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.12 + 0.6.13-SNAPSHOT ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 7511b0d53..6a459437d 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.12 + 0.6.13-SNAPSHOT ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 561a7ed93..65b9e8084 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.12", + "version": "0.6.13-SNAPSHOT", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index 0d67f2ac4..e555e23af 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.12 + 0.6.13-SNAPSHOT ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index bff7ad7cb..6bb2bfc11 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.12 + 0.6.13-SNAPSHOT ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index f431219e8..8d2eccc5a 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.12 + 0.6.13-SNAPSHOT ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index c84bbce9b..06700172d 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.12 + 0.6.13-SNAPSHOT ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 3648a3ae7..5d43bb1bc 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.12 + 0.6.13-SNAPSHOT ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 2482a1872..4d08daf65 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.12 + 0.6.13-SNAPSHOT pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index 08a05af3f..7b9d50b85 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.12 + 0.6.13-SNAPSHOT ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index a15097363..8c7524137 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.12 + 0.6.13-SNAPSHOT pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 349eb6487..860044c26 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.12 + 0.6.13-SNAPSHOT ../code-parent/pom.xml From 1b87060448041dde30d2dddf38aa8f99682b8eab Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 24 Mar 2026 17:36:31 +0100 Subject: [PATCH 052/430] Prepare next release --- CHANGELOG.md | 7 +++++-- extensions/finder/npm/finder.css | 8 ++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3357899b1..f245b4858 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,8 +6,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] -## [0.6.12] - 2026-03-24 - ### Added - Add `FinderColumn.showSearchThreshold(int)` @@ -16,6 +14,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - Add padding to the finder preview matching the padding of the finder columns and items +## [0.6.12] - 2026-03-24 + +> [!WARNING] +> Not an official release. Please don't use! + ## [0.6.11] - 2026-03-24 > [!WARNING] diff --git a/extensions/finder/npm/finder.css b/extensions/finder/npm/finder.css index 793244c29..33119eac9 100644 --- a/extensions/finder/npm/finder.css +++ b/extensions/finder/npm/finder.css @@ -420,8 +420,8 @@ overflow-y: auto; border-left: var(--pf-v6-c-finder__column--BorderRightWidth) solid var(--pf-v6-c-finder__column--BorderRightColor); margin-left: calc(var(--pf-v6-c-finder__column--BorderRightWidth) * -1); - padding-block-start: var(--pf-v6-c-finder__column-header--PaddingBlockStart); - padding-block-end: var(--pf-v6-c-finder__column-header--PaddingBlockEnd); - padding-inline-start: var(--pf-v6-c-finder__column-header--PaddingInlineStart); - padding-inline-end: var(--pf-v6-c-finder__column-header--PaddingInlineEnd); + padding-block-start: var(--pf-v6-c-finder__preview--PaddingBlockStart); + padding-block-end: var(--pf-v6-c-finder__preview--PaddingBlockEnd); + padding-inline-start: var(--pf-v6-c-finder__preview--PaddingInlineStart); + padding-inline-end: var(--pf-v6-c-finder__preview--PaddingInlineEnd); } From d318985cb51708b25c29c0ace680a5fb0aba4434 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 24 Mar 2026 17:37:00 +0100 Subject: [PATCH 053/430] Release 0.6.13 --- CHANGELOG.md | 5 ++++- README.md | 2 +- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 22 files changed, 25 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f245b4858..bfd0452fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +## [0.6.13] - 2026-03-24 + ### Added - Add `FinderColumn.showSearchThreshold(int)` @@ -836,7 +838,8 @@ Stay tuned for more to come... - for dependency upgrades --> -[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.12...HEAD +[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.13...HEAD +[0.6.13]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.12...v0.6.13 [0.6.12]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.11...v0.6.12 [0.6.11]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.10...v0.6.11 [0.6.10]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.9...v0.6.10 diff --git a/README.md b/README.md index b8c9ccc08..b40ac2aa5 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.12 + 0.6.13 pom import diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 63f21e53f..fb8982db9 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.13-SNAPSHOT + 0.6.13 ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 544fd819c..30a4b38f8 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.13-SNAPSHOT + 0.6.13 pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index a99feaa64..1b20c62a8 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.13-SNAPSHOT + 0.6.13 ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 6b9ecf48c..e80c9f795 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.13-SNAPSHOT", + "version": "0.6.13", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 7ee68d7c9..b7c355cdd 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.13-SNAPSHOT + 0.6.13 ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index cb5e14a6d..49a86bc7b 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.13-SNAPSHOT + 0.6.13 ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 5256922d0..eaabc7d3b 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.13-SNAPSHOT + 0.6.13 ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 392b23e87..42abf43e5 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.13-SNAPSHOT", + "version": "0.6.13", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index cd8a13704..52cbd8cac 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.13-SNAPSHOT + 0.6.13 ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 6a459437d..43392b798 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.13-SNAPSHOT + 0.6.13 ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 65b9e8084..a081799ae 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.13-SNAPSHOT", + "version": "0.6.13", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index e555e23af..4151d1d08 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.13-SNAPSHOT + 0.6.13 ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 6bb2bfc11..84b2b86e6 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.13-SNAPSHOT + 0.6.13 ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index 8d2eccc5a..93e11036e 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.13-SNAPSHOT + 0.6.13 ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 06700172d..29ee48625 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.13-SNAPSHOT + 0.6.13 ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 5d43bb1bc..fae3b39a7 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.13-SNAPSHOT + 0.6.13 ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 4d08daf65..16a0841ef 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.13-SNAPSHOT + 0.6.13 pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index 7b9d50b85..dd22f8f42 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.13-SNAPSHOT + 0.6.13 ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 8c7524137..715e2c73a 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.13-SNAPSHOT + 0.6.13 pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 860044c26..4d94601e0 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.13-SNAPSHOT + 0.6.13 ../code-parent/pom.xml From 9a63ae654edaf7ed2e8da280d25b90852fd43b86 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 24 Mar 2026 17:37:09 +0100 Subject: [PATCH 054/430] Next is 0.6.14 --- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apidoc/pom.xml b/apidoc/pom.xml index fb8982db9..5e685c7f6 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.13 + 0.6.14-SNAPSHOT ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 30a4b38f8..c690bcf91 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.13 + 0.6.14-SNAPSHOT pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index 1b20c62a8..bbed36b27 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.13 + 0.6.14-SNAPSHOT ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index e80c9f795..f2353c5b7 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.13", + "version": "0.6.14-SNAPSHOT", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index b7c355cdd..17897060b 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.13 + 0.6.14-SNAPSHOT ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 49a86bc7b..298cca707 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.13 + 0.6.14-SNAPSHOT ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index eaabc7d3b..593fdee2b 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.13 + 0.6.14-SNAPSHOT ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 42abf43e5..8a9999fdc 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.13", + "version": "0.6.14-SNAPSHOT", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 52cbd8cac..23bb9b1dd 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.13 + 0.6.14-SNAPSHOT ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 43392b798..761ccd0b6 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.13 + 0.6.14-SNAPSHOT ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index a081799ae..c1fcf62d0 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.13", + "version": "0.6.14-SNAPSHOT", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index 4151d1d08..9a69a415b 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.13 + 0.6.14-SNAPSHOT ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 84b2b86e6..8fc62aee5 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.13 + 0.6.14-SNAPSHOT ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index 93e11036e..91eb59b6b 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.13 + 0.6.14-SNAPSHOT ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 29ee48625..8649be60f 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.13 + 0.6.14-SNAPSHOT ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index fae3b39a7..447dc450b 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.13 + 0.6.14-SNAPSHOT ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 16a0841ef..567cef97a 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.13 + 0.6.14-SNAPSHOT pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index dd22f8f42..fd8b07477 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.13 + 0.6.14-SNAPSHOT ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 715e2c73a..5ae263c5d 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.13 + 0.6.14-SNAPSHOT pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 4d94601e0..0095cfbe6 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.13 + 0.6.14-SNAPSHOT ../code-parent/pom.xml From 1fb49313c69a5e472d64e871570d572e48172609 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 24 Mar 2026 21:57:09 +0100 Subject: [PATCH 055/430] Prepare next release --- CHANGELOG.md | 7 +++++-- pom.xml | 2 +- .../org/patternfly/showcase/extension/FinderExtension.java | 1 + 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bfd0452fa..81025b22c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,8 +6,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] -## [0.6.13] - 2026-03-24 - ### Added - Add `FinderColumn.showSearchThreshold(int)` @@ -16,6 +14,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - Add padding to the finder preview matching the padding of the finder columns and items +## [0.6.13] - 2026-03-24 + +> [!WARNING] +> Not an official release. Please don't use! + ## [0.6.12] - 2026-03-24 > [!WARNING] diff --git a/pom.xml b/pom.xml index 567cef97a..3b441a883 100644 --- a/pom.xml +++ b/pom.xml @@ -562,7 +562,7 @@ central true 86400 - published + validated diff --git a/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java b/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java index 874f1207c..664a89c62 100644 --- a/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java +++ b/showcase/src/main/java/org/patternfly/showcase/extension/FinderExtension.java @@ -38,6 +38,7 @@ import org.patternfly.showcase.model.Files; import org.patternfly.showcase.model.Record; import org.patternfly.showcase.model.Track; + import elemental2.promise.Promise; import static elemental2.dom.DomGlobal.setTimeout; From 404389e219db1977714bb5a2811d4258283359ed Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 24 Mar 2026 21:57:48 +0100 Subject: [PATCH 056/430] Release 0.6.14 --- CHANGELOG.md | 5 ++++- README.md | 2 +- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 22 files changed, 25 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81025b22c..902e311a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +## [0.6.14] - 2026-03-24 + ### Added - Add `FinderColumn.showSearchThreshold(int)` @@ -841,7 +843,8 @@ Stay tuned for more to come... - for dependency upgrades --> -[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.13...HEAD +[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.14...HEAD +[0.6.14]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.13...v0.6.14 [0.6.13]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.12...v0.6.13 [0.6.12]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.11...v0.6.12 [0.6.11]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.10...v0.6.11 diff --git a/README.md b/README.md index b40ac2aa5..255902d9e 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.13 + 0.6.14 pom import diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 5e685c7f6..0f6feef8b 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.14-SNAPSHOT + 0.6.14 ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index c690bcf91..1e939b653 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.14-SNAPSHOT + 0.6.14 pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index bbed36b27..040bbd8e1 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.14-SNAPSHOT + 0.6.14 ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index f2353c5b7..141f843ac 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.14-SNAPSHOT", + "version": "0.6.14", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 17897060b..199e393eb 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.14-SNAPSHOT + 0.6.14 ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 298cca707..22a437ba7 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.14-SNAPSHOT + 0.6.14 ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 593fdee2b..7944125fc 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.14-SNAPSHOT + 0.6.14 ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 8a9999fdc..becde6f48 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.14-SNAPSHOT", + "version": "0.6.14", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 23bb9b1dd..3162dfb2e 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.14-SNAPSHOT + 0.6.14 ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 761ccd0b6..ea0064c6f 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.14-SNAPSHOT + 0.6.14 ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index c1fcf62d0..eea4de89c 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.14-SNAPSHOT", + "version": "0.6.14", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index 9a69a415b..38c56640c 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.14-SNAPSHOT + 0.6.14 ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 8fc62aee5..07cc85017 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.14-SNAPSHOT + 0.6.14 ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index 91eb59b6b..c6cb25aee 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.14-SNAPSHOT + 0.6.14 ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 8649be60f..adcc9b3b7 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.14-SNAPSHOT + 0.6.14 ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 447dc450b..9e5d909e8 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.14-SNAPSHOT + 0.6.14 ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 3b441a883..57759facc 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.14-SNAPSHOT + 0.6.14 pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index fd8b07477..f90087265 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.14-SNAPSHOT + 0.6.14 ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 5ae263c5d..f0fe1c658 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.14-SNAPSHOT + 0.6.14 pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 0095cfbe6..fa2b7152a 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.14-SNAPSHOT + 0.6.14 ../code-parent/pom.xml From 36fde0313e4c0e654c88e3c08be352cce8c6e989 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 24 Mar 2026 21:57:57 +0100 Subject: [PATCH 057/430] Next is 0.6.15 --- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 0f6feef8b..e450109c9 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.14 + 0.6.15-SNAPSHOT ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 1e939b653..637aec1bd 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.14 + 0.6.15-SNAPSHOT pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index 040bbd8e1..9223b9b40 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.14 + 0.6.15-SNAPSHOT ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 141f843ac..e63d5f526 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.14", + "version": "0.6.15-SNAPSHOT", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 199e393eb..c7f55d87d 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.14 + 0.6.15-SNAPSHOT ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 22a437ba7..b4959eccd 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.14 + 0.6.15-SNAPSHOT ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 7944125fc..48b0578eb 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.14 + 0.6.15-SNAPSHOT ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index becde6f48..6f6849db8 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.14", + "version": "0.6.15-SNAPSHOT", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 3162dfb2e..09b0a4a3b 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.14 + 0.6.15-SNAPSHOT ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index ea0064c6f..7fb234662 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.14 + 0.6.15-SNAPSHOT ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index eea4de89c..1d47ec433 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.14", + "version": "0.6.15-SNAPSHOT", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index 38c56640c..e83a493b3 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.14 + 0.6.15-SNAPSHOT ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 07cc85017..8cc1e27fa 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.14 + 0.6.15-SNAPSHOT ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index c6cb25aee..168cd0fc2 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.14 + 0.6.15-SNAPSHOT ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index adcc9b3b7..a968c1020 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.14 + 0.6.15-SNAPSHOT ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 9e5d909e8..d65d53173 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.14 + 0.6.15-SNAPSHOT ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 57759facc..6d177a349 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.14 + 0.6.15-SNAPSHOT pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index f90087265..159f82e35 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.14 + 0.6.15-SNAPSHOT ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index f0fe1c658..c8f47690f 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.14 + 0.6.15-SNAPSHOT pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index fa2b7152a..a66111707 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.14 + 0.6.15-SNAPSHOT ../code-parent/pom.xml From e2f1e480ae9b4de852228be0c4627a0555fb5d5d Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Wed, 25 Mar 2026 08:14:51 +0100 Subject: [PATCH 058/430] Make finder responsive using container queries --- extensions/finder/npm/finder.css | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/extensions/finder/npm/finder.css b/extensions/finder/npm/finder.css index 33119eac9..04fb344d9 100644 --- a/extensions/finder/npm/finder.css +++ b/extensions/finder/npm/finder.css @@ -30,7 +30,7 @@ --pf-v6-c-finder-MaxColumns: 4; /* Column */ - --pf-v6-c-finder__column--Width: 18rem; + --pf-v6-c-finder__column--Width: clamp(14rem, 25cqi, 20rem); --pf-v6-c-finder__column--BorderRightColor: var(--pf-t--global--border--color--default); --pf-v6-c-finder__column--BorderRightWidth: var(--pf-t--global--border--width--100); @@ -95,7 +95,7 @@ --pf-v6-c-finder__preview--PaddingBlockEnd: var(--pf-t--global--spacer--200); --pf-v6-c-finder__preview--PaddingInlineStart: var(--pf-t--global--spacer--300); --pf-v6-c-finder__preview--PaddingInlineEnd: var(--pf-t--global--spacer--200); - --pf-v6-c-finder__preview--MinWidth: 24rem; + --pf-v6-c-finder__preview--MinWidth: clamp(16rem, 30cqi, 28rem); --pf-v6-c-finder__preview--BackgroundColor: var(--pf-t--global--background--color--primary--default); --pf-v6-c-finder__preview--BorderLeftColor: var(--pf-t--global--border--color--default); --pf-v6-c-finder__preview--BorderLeftWidth: var(--pf-t--global--border--width--100); @@ -106,6 +106,8 @@ =================================================================== */ .pf-v6-c-finder { + container-type: inline-size; + container-name: finder; display: flex; background-color: var(--pf-v6-c-finder--BackgroundColor); font-size: var(--pf-v6-c-finder--FontSize); @@ -425,3 +427,25 @@ padding-inline-start: var(--pf-v6-c-finder__preview--PaddingInlineStart); padding-inline-end: var(--pf-v6-c-finder__preview--PaddingInlineEnd); } + +/* =================================================================== + Responsive container queries + =================================================================== */ + +@container finder (max-width: 40rem) { + .pf-v6-c-finder { + --pf-v6-c-finder-MaxColumns: 1; + } +} + +@container finder (min-width: 40rem) and (max-width: 60rem) { + .pf-v6-c-finder { + --pf-v6-c-finder-MaxColumns: 2; + } +} + +@container finder (min-width: 60rem) and (max-width: 80rem) { + .pf-v6-c-finder { + --pf-v6-c-finder-MaxColumns: 3; + } +} From 840ecd4c55b9b82f8405fbb16f050f0de04e79ed Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Wed, 25 Mar 2026 08:39:25 +0100 Subject: [PATCH 059/430] Update changelog --- CHANGELOG.md | 4 ++++ extensions/finder/npm/finder.css | 14 +++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 902e311a0..ac291dc50 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +### Added + +- Make finder column and preview responsive using container queries + ## [0.6.14] - 2026-03-24 ### Added diff --git a/extensions/finder/npm/finder.css b/extensions/finder/npm/finder.css index 04fb344d9..c1d260bf8 100644 --- a/extensions/finder/npm/finder.css +++ b/extensions/finder/npm/finder.css @@ -30,7 +30,7 @@ --pf-v6-c-finder-MaxColumns: 4; /* Column */ - --pf-v6-c-finder__column--Width: clamp(14rem, 25cqi, 20rem); + --pf-v6-c-finder__column--Width: 18rem; --pf-v6-c-finder__column--BorderRightColor: var(--pf-t--global--border--color--default); --pf-v6-c-finder__column--BorderRightWidth: var(--pf-t--global--border--width--100); @@ -95,7 +95,7 @@ --pf-v6-c-finder__preview--PaddingBlockEnd: var(--pf-t--global--spacer--200); --pf-v6-c-finder__preview--PaddingInlineStart: var(--pf-t--global--spacer--300); --pf-v6-c-finder__preview--PaddingInlineEnd: var(--pf-t--global--spacer--200); - --pf-v6-c-finder__preview--MinWidth: clamp(16rem, 30cqi, 28rem); + --pf-v6-c-finder__preview--MinWidth: 24rem; --pf-v6-c-finder__preview--BackgroundColor: var(--pf-t--global--background--color--primary--default); --pf-v6-c-finder__preview--BorderLeftColor: var(--pf-t--global--border--color--default); --pf-v6-c-finder__preview--BorderLeftWidth: var(--pf-t--global--border--width--100); @@ -137,7 +137,7 @@ display: flex; flex-direction: column; flex-shrink: 0; - width: var(--pf-v6-c-finder__column--Width); + width: clamp(14rem, 25cqi, 18rem); border-right: var(--pf-v6-c-finder__column--BorderRightWidth) solid var(--pf-v6-c-finder__column--BorderRightColor); } @@ -416,7 +416,7 @@ .pf-v6-c-finder__preview { display: flex; flex-direction: column; - min-width: var(--pf-v6-c-finder__preview--MinWidth); + min-width: clamp(16rem, 30cqi, 28rem); background-color: var(--pf-v6-c-finder__preview--BackgroundColor); flex: 1; overflow-y: auto; @@ -433,19 +433,19 @@ =================================================================== */ @container finder (max-width: 40rem) { - .pf-v6-c-finder { + .pf-v6-c-finder__columns { --pf-v6-c-finder-MaxColumns: 1; } } @container finder (min-width: 40rem) and (max-width: 60rem) { - .pf-v6-c-finder { + .pf-v6-c-finder__columns { --pf-v6-c-finder-MaxColumns: 2; } } @container finder (min-width: 60rem) and (max-width: 80rem) { - .pf-v6-c-finder { + .pf-v6-c-finder__columns { --pf-v6-c-finder-MaxColumns: 3; } } From d619b0a4d02e9044a56cd4c0ea4ffd56527214c4 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Wed, 25 Mar 2026 08:40:22 +0100 Subject: [PATCH 060/430] Release 0.6.15 --- CHANGELOG.md | 5 ++++- README.md | 2 +- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 22 files changed, 25 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ac291dc50..5f07d7a9b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +## [0.6.15] - 2026-03-25 + ### Added - Make finder column and preview responsive using container queries @@ -847,7 +849,8 @@ Stay tuned for more to come... - for dependency upgrades --> -[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.14...HEAD +[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.15...HEAD +[0.6.15]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.14...v0.6.15 [0.6.14]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.13...v0.6.14 [0.6.13]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.12...v0.6.13 [0.6.12]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.11...v0.6.12 diff --git a/README.md b/README.md index 255902d9e..acd57b44f 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.14 + 0.6.15 pom import diff --git a/apidoc/pom.xml b/apidoc/pom.xml index e450109c9..67f00ca06 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.15-SNAPSHOT + 0.6.15 ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 637aec1bd..03a599536 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.15-SNAPSHOT + 0.6.15 pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index 9223b9b40..d6311fe27 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.15-SNAPSHOT + 0.6.15 ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index e63d5f526..ca05fe942 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.15-SNAPSHOT", + "version": "0.6.15", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index c7f55d87d..c6b8620cf 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.15-SNAPSHOT + 0.6.15 ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index b4959eccd..49b13dbcb 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.15-SNAPSHOT + 0.6.15 ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 48b0578eb..f88f623da 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.15-SNAPSHOT + 0.6.15 ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 6f6849db8..d7dc8126f 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.15-SNAPSHOT", + "version": "0.6.15", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 09b0a4a3b..33848d29c 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.15-SNAPSHOT + 0.6.15 ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 7fb234662..bfaa2becb 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.15-SNAPSHOT + 0.6.15 ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 1d47ec433..d19677bd7 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.15-SNAPSHOT", + "version": "0.6.15", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index e83a493b3..5dbd029a0 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.15-SNAPSHOT + 0.6.15 ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 8cc1e27fa..45331cb93 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.15-SNAPSHOT + 0.6.15 ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index 168cd0fc2..ea7cde4f0 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.15-SNAPSHOT + 0.6.15 ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index a968c1020..bb4654baa 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.15-SNAPSHOT + 0.6.15 ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index d65d53173..e4b889c19 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.15-SNAPSHOT + 0.6.15 ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 6d177a349..283b5f55b 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.15-SNAPSHOT + 0.6.15 pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index 159f82e35..5ec3669b4 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.15-SNAPSHOT + 0.6.15 ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index c8f47690f..f964e998b 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.15-SNAPSHOT + 0.6.15 pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index a66111707..514dd464b 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.15-SNAPSHOT + 0.6.15 ../code-parent/pom.xml From eff77e34671325f9bd8050eea1a20c34e0624eef Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Wed, 25 Mar 2026 08:40:31 +0100 Subject: [PATCH 061/430] Next is 0.6.16 --- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 67f00ca06..5ef42659b 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.15 + 0.6.16-SNAPSHOT ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 03a599536..70a0f3673 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.15 + 0.6.16-SNAPSHOT pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index d6311fe27..6e31d9075 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.15 + 0.6.16-SNAPSHOT ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index ca05fe942..6a7c296f7 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.15", + "version": "0.6.16-SNAPSHOT", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index c6b8620cf..9340213cf 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.15 + 0.6.16-SNAPSHOT ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 49b13dbcb..ecb167e2a 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.15 + 0.6.16-SNAPSHOT ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index f88f623da..4b04eea87 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.15 + 0.6.16-SNAPSHOT ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index d7dc8126f..e0aba1157 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.15", + "version": "0.6.16-SNAPSHOT", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 33848d29c..4d7c8a113 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.15 + 0.6.16-SNAPSHOT ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index bfaa2becb..3ab558387 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.15 + 0.6.16-SNAPSHOT ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index d19677bd7..ee0213834 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.15", + "version": "0.6.16-SNAPSHOT", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index 5dbd029a0..a50a8e26b 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.15 + 0.6.16-SNAPSHOT ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 45331cb93..b22c42d05 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.15 + 0.6.16-SNAPSHOT ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index ea7cde4f0..d5d6c8c9e 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.15 + 0.6.16-SNAPSHOT ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index bb4654baa..36e874450 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.15 + 0.6.16-SNAPSHOT ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index e4b889c19..4bed5c46e 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.15 + 0.6.16-SNAPSHOT ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 283b5f55b..89a54de9d 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.15 + 0.6.16-SNAPSHOT pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index 5ec3669b4..f7577c5ea 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.15 + 0.6.16-SNAPSHOT ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index f964e998b..a09c62902 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.15 + 0.6.16-SNAPSHOT pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 514dd464b..8dbf7a00a 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.15 + 0.6.16-SNAPSHOT ../code-parent/pom.xml From b44cde07a7ff5c83186cb1c2e490a6a19eb96f3a Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Wed, 25 Mar 2026 13:54:31 +0100 Subject: [PATCH 062/430] Fix loading finder items --- CHANGELOG.md | 4 ++++ .../main/java/org/patternfly/extension/finder/FinderItem.java | 2 +- pom.xml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f07d7a9b..d2946e37b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +### Fixed + +- Fix loading finder items + ## [0.6.15] - 2026-03-25 ### Added diff --git a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItem.java b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItem.java index 19455c183..3615534ce 100644 --- a/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItem.java +++ b/extensions/finder/src/main/java/org/patternfly/extension/finder/FinderItem.java @@ -103,7 +103,7 @@ public static FinderItem emptyItem(EmptyState emptyState) { static FinderItem loadingItem() { FinderItem loading = statusItem(Id.unique(ComponentType.Finder.id, SUB_COMPONENT_NAME, "loading")); - insertFirst(loading.element(), spinner(lg, "sm").element()); + insertFirst(loading.rc.element(), spinner(lg, "sm").element()); return loading.text("Loading..."); } diff --git a/pom.xml b/pom.xml index 89a54de9d..776b4c187 100644 --- a/pom.xml +++ b/pom.xml @@ -561,7 +561,7 @@ central true - 86400 + 86400 validated From 9195ac2a687245b605da18d050cc7867a2073434 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 26 Mar 2026 14:47:27 +0100 Subject: [PATCH 063/430] Add anchored container queries for tooltips based on the popover API --- .../patternfly/component/ComponentType.java | 2 + .../component/tooltip/Tooltip2.java | 360 +++++++++++++++ core/npm/core.css | 91 +++- pom.xml | 4 +- showcase/package.json | 7 +- showcase/pnpm-lock.yaml | 421 +++++++++--------- .../showcase/component/Tooltip2Component.java | 121 +++++ .../org/patternfly/showcase/components.json | 8 + showcase/src/web/main.js | 64 +++ 9 files changed, 872 insertions(+), 206 deletions(-) create mode 100644 components/src/main/java/org/patternfly/component/tooltip/Tooltip2.java create mode 100644 showcase/src/main/java/org/patternfly/showcase/component/Tooltip2Component.java diff --git a/components/src/main/java/org/patternfly/component/ComponentType.java b/components/src/main/java/org/patternfly/component/ComponentType.java index de8a25531..11dd172ee 100644 --- a/components/src/main/java/org/patternfly/component/ComponentType.java +++ b/components/src/main/java/org/patternfly/component/ComponentType.java @@ -161,6 +161,8 @@ public enum ComponentType { Tooltip("tt", "PF6/Component/Tooltip"), + Tooltip2("tt2", "PF6/Component/Tooltip2"), + TreeView("tv", "PF6/Component/TreeView"), Truncate("tr", "PF6/Component/Truncate"), diff --git a/components/src/main/java/org/patternfly/component/tooltip/Tooltip2.java b/components/src/main/java/org/patternfly/component/tooltip/Tooltip2.java new file mode 100644 index 000000000..1f13defa1 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/tooltip/Tooltip2.java @@ -0,0 +1,360 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.component.tooltip; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +import org.gwtproject.event.shared.HandlerRegistration; +import org.jboss.elemento.Attachable; +import org.jboss.elemento.By; +import org.jboss.elemento.ElementContainerDelegate; +import org.jboss.elemento.ElementTextDelegate; +import org.jboss.elemento.Elements; +import org.jboss.elemento.Id; +import org.jboss.elemento.logger.Logger; +import org.patternfly.component.BaseComponent; +import org.patternfly.component.Closeable; +import org.patternfly.component.ComponentType; +import org.patternfly.core.Roles; +import org.patternfly.handler.CloseHandler; +import org.patternfly.popper.Placement; +import elemental2.dom.Element; +import elemental2.dom.Event; +import elemental2.dom.HTMLDivElement; +import elemental2.dom.HTMLElement; +import elemental2.dom.MutationRecord; + +import static elemental2.dom.DomGlobal.clearTimeout; +import static elemental2.dom.DomGlobal.document; +import static elemental2.dom.DomGlobal.setTimeout; +import static org.gwtproject.event.shared.HandlerRegistrations.compose; +import static org.jboss.elemento.Elements.div; +import static org.jboss.elemento.EventType.bind; +import static org.jboss.elemento.EventType.focusin; +import static org.jboss.elemento.EventType.focusout; +import static org.jboss.elemento.EventType.mouseenter; +import static org.jboss.elemento.EventType.mouseleave; +import static org.patternfly.component.tooltip.TriggerAria.describedBy; +import static org.patternfly.component.tooltip.TriggerAria.none; +import static org.patternfly.core.Aria.live; +import static org.patternfly.core.Attributes.role; +import static org.patternfly.handler.CloseHandler.fireEvent; +import static org.patternfly.handler.CloseHandler.shouldClose; +import static org.patternfly.popper.Placement.top; +import static org.patternfly.style.Classes.arrow; +import static org.patternfly.style.Classes.component; +import static org.patternfly.style.Classes.content; +import static org.patternfly.style.Classes.modifier; +import static org.patternfly.style.Classes.textAlignLeft; +import static org.patternfly.style.Classes.tooltip; + +/** + * A tooltip is in-app messaging used to identify elements on a page with short, clarifying text. + *

+ * This implementation uses the Popover API and CSS anchor positioning instead of Popper.js. The tooltip uses the browser's + * top-layer rendering for correct stacking, eliminating z-index issues. + */ +public class Tooltip2 extends BaseComponent implements + Attachable, + Closeable, + ElementContainerDelegate, + ElementTextDelegate { + + // ------------------------------------------------------ factory + + public static Tooltip2 tooltip2() { + return new Tooltip2(null, null); + } + + public static Tooltip2 tooltip2(String text) { + return new Tooltip2(null, text); + } + + public static Tooltip2 tooltip2(By trigger) { + return new Tooltip2(() -> Elements.querySelector(document.body, trigger), null); + } + + public static Tooltip2 tooltip2(By trigger, String text) { + return new Tooltip2(() -> Elements.querySelector(document.body, trigger), text); + } + + public static Tooltip2 tooltip2(HTMLElement trigger) { + return new Tooltip2(() -> trigger, null); + } + + public static Tooltip2 tooltip2(HTMLElement trigger, String text) { + return new Tooltip2(() -> trigger, text); + } + + public static Tooltip2 tooltip2(Supplier trigger) { + return new Tooltip2(trigger, null); + } + + public static Tooltip2 tooltip2(Supplier trigger, String text) { + return new Tooltip2(trigger, text); + } + + // ------------------------------------------------------ instance + + private static final Logger logger = Logger.getLogger(Tooltip2.class.getName()); + + public static final int ENTRY_DELAY = 300; + public static final int EXIT_DELAY = 300; + public static final int DISTANCE = 15; + + private final String id; + private final HTMLElement contentElement; + private final List> closeHandler; + private Supplier triggerSupplier; + private HTMLElement trigger; + private boolean visible; + private int distance; + private int entryDelay; + private int exitDelay; + private double showTimeout; + private double hideTimeout; + private Placement placement; + private TriggerAria aria; + private HandlerRegistration triggerHandlers; + private HandlerRegistration anchorHandlers; + + Tooltip2(Supplier trigger, String text) { + super(ComponentType.Tooltip2, div().css(component(tooltip)) + .attr(role, Roles.tooltip) + .aria(live, "polite") + .attr("popover", "manual") + .element()); + + this.id = Id.unique(componentType().id); + this.triggerSupplier = trigger; + this.closeHandler = new ArrayList<>(); + this.visible = false; + this.distance = DISTANCE; + this.entryDelay = ENTRY_DELAY; + this.exitDelay = EXIT_DELAY; + this.placement = top; + this.aria = describedBy; + this.showTimeout = 0; + this.hideTimeout = 0; + + id(id); + element().appendChild(div().css(component(tooltip, arrow)).element()); + element().appendChild(contentElement = div().css(component(tooltip, content)).element()); + if (text != null) { + contentElement.textContent = text; + } + + Attachable.register(this, this); + } + + @Override + public Element containerDelegate() { + return contentElement; + } + + @Override + public Element textDelegate() { + return contentElement; + } + + @Override + public void attach(MutationRecord mutationRecord) { + if (triggerSupplier != null) { + trigger = triggerSupplier.get(); + if (trigger != null) { + // CSS anchor positioning + String anchorName = "--" + id; + trigger.style.setProperty("anchor-name", anchorName); + style("position-anchor", anchorName); + style("margin", distance + "px"); + applyPlacement(); + + // event listeners on trigger + triggerHandlers = compose( + bind(trigger, mouseenter, this::scheduleShow), + bind(trigger, mouseleave, this::scheduleHide), + bind(trigger, focusin, this::scheduleShow), + bind(trigger, focusout, this::scheduleHide)); + + // event listeners on tooltip itself: + // hovering into the tooltip cancels the hide timer, + // hovering out of the tooltip schedules hide + anchorHandlers = compose( + bind(element(), mouseenter, this::cancelTimers), + bind(element(), mouseleave, this::scheduleHide)); + } else { + logger.error("Unable to find trigger element for tooltip %o", element()); + } + } else { + logger.error("No trigger element defined for tooltip %o", element()); + } + } + + @Override + public void detach(MutationRecord mutationRecord) { + cancelTimers(new Event("")); + if (visible) { + element().hidePopover(); + visible = false; + } + if (anchorHandlers != null) { + anchorHandlers.removeHandler(); + } + if (triggerHandlers != null) { + triggerHandlers.removeHandler(); + } + if (trigger != null) { + trigger.style.removeProperty("anchor-name"); + trigger = null; + } + } + + // ------------------------------------------------------ builder + + public Tooltip2 entryDelay(int delay) { + this.entryDelay = delay; + return this; + } + + public Tooltip2 exitDelay(int delay) { + this.exitDelay = delay; + return this; + } + + public Tooltip2 distance(int distance) { + this.distance = distance; + return this; + } + + public Tooltip2 leftAligned() { + contentElement.classList.add(modifier(textAlignLeft)); + return this; + } + + public Tooltip2 placement(Placement placement) { + this.placement = placement; + return this; + } + + public Tooltip2 trigger(String trigger) { + this.triggerSupplier = () -> Elements.querySelector(document.body, By.selector(trigger)); + return this; + } + + public Tooltip2 trigger(By trigger) { + this.triggerSupplier = () -> Elements.querySelector(document.body, trigger); + return this; + } + + public Tooltip2 trigger(HTMLElement trigger) { + this.triggerSupplier = () -> trigger; + return this; + } + + public Tooltip2 trigger(Supplier trigger) { + this.triggerSupplier = trigger; + return this; + } + + @Override + public Tooltip2 that() { + return this; + } + + // ------------------------------------------------------ aria + + public Tooltip2 aria(TriggerAria aria) { + this.aria = aria; + return this; + } + + // ------------------------------------------------------ events + + @Override + public Tooltip2 onClose(CloseHandler closeHandler) { + if (closeHandler != null) { + this.closeHandler.add(closeHandler); + } + return this; + } + + // ------------------------------------------------------ api + + public void show() { + show(new Event("")); + } + + public void show(Event event) { + if (!visible) { + element().showPopover(); + visible = true; + if (aria != none && trigger != null) { + trigger.setAttribute(aria.attribute, id); + } + } + } + + @Override + public void close(Event event, boolean fireEvent) { + if (shouldClose(this, closeHandler, event, fireEvent)) { + if (visible) { + element().hidePopover(); + visible = false; + if (aria != none && trigger != null) { + trigger.removeAttribute(aria.attribute); + } + fireEvent(this, closeHandler, event, fireEvent); + } + } + } + + @Override + public String text() { + return Elements.textNode(contentElement); + } + + // ------------------------------------------------------ internal + + private void scheduleShow(Event event) { + cancelTimers(event); + showTimeout = setTimeout(e -> show(), entryDelay); + } + + private void scheduleHide(Event event) { + cancelTimers(event); + hideTimeout = setTimeout(e -> close(new Event(""), true), exitDelay); + } + + private void cancelTimers(Event event) { + clearTimeout(showTimeout); + clearTimeout(hideTimeout); + } + + private void applyPlacement() { + // remove old placement modifier + for (String mod : Placement.modifiers) { + classList().remove(mod); + } + + // apply placement modifier CSS class + // controls both arrow direction (PF CSS) and position-area (core.css) + if (placement.modifier != null && !placement.modifier.isEmpty()) { + classList().add(placement.modifier); + } + } +} \ No newline at end of file diff --git a/core/npm/core.css b/core/npm/core.css index f25cde443..2058eafc1 100644 --- a/core/npm/core.css +++ b/core/npm/core.css @@ -13,8 +13,97 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* PatternFly Java */ +/* =================================================================== + Core modifiers + =================================================================== */ .pf-m-filtered { display: none !important; } + +/* =================================================================== + Tooltip using the popover API + =================================================================== */ +/* Reset [popover] UA styles for tooltips using the popover API */ +.pf-v6-c-tooltip[popover] { + border: none; + padding: 0; + background: none; + overflow: visible; + width: max-content; + max-width: var(--pf-v6-c-tooltip--MaxWidth); + position: fixed; + position-try-fallbacks: flip-block flip-inline; + container-type: anchored; +} + +/* CSS anchor positioning for tooltips using the popover API */ +.pf-v6-c-tooltip[popover].pf-m-top { + position-area: block-start; +} + +.pf-v6-c-tooltip[popover].pf-m-bottom { + position-area: block-end; +} + +.pf-v6-c-tooltip[popover].pf-m-left { + position-area: inline-start; +} + +.pf-v6-c-tooltip[popover].pf-m-right { + position-area: inline-end; +} + +/* + * Uncomment this as soon as https://github.com/parcel-bundler/lightningcss/issues/1176 + * has been fixed. + */ +/* +!* Was top, flipped to bottom *! +@container anchored(fallback: flip-block flip-inline) { + .pf-v6-c-tooltip[popover].pf-m-top .pf-v6-c-tooltip__arrow { + --pf-v6-c-tooltip__arrow--InsetBlockEnd: auto; + --pf-v6-c-tooltip__arrow--InsetBlockStart: var(--pf-v6-c-tooltip--m-bottom--InsetBlockStart, 0); + --pf-v6-c-tooltip__arrow--InsetInlineStart: var(--pf-v6-c-tooltip--m-bottom--InsetInlineStart, 50%); + --pf-v6-c-tooltip__arrow--TranslateX: var(--pf-v6-c-tooltip__arrow--m-bottom--TranslateX); + --pf-v6-c-tooltip__arrow--TranslateY: var(--pf-v6-c-tooltip__arrow--m-bottom--TranslateY); + --pf-v6-c-tooltip__arrow--Rotate: var(--pf-v6-c-tooltip__arrow--m-bottom--Rotate); + } +} + +!* Was bottom, flipped to top *! +@container anchored(fallback: flip-block flip-inline) { + .pf-v6-c-tooltip[popover].pf-m-bottom .pf-v6-c-tooltip__arrow { + --pf-v6-c-tooltip__arrow--InsetBlockStart: auto; + --pf-v6-c-tooltip__arrow--InsetBlockEnd: var(--pf-v6-c-tooltip--m-top--InsetBlockEnd, 0); + --pf-v6-c-tooltip__arrow--InsetInlineStart: var(--pf-v6-c-tooltip--m-top--InsetInlineStart, 50%); + --pf-v6-c-tooltip__arrow--TranslateX: var(--pf-v6-c-tooltip__arrow--m-top--TranslateX); + --pf-v6-c-tooltip__arrow--TranslateY: var(--pf-v6-c-tooltip__arrow--m-top--TranslateY); + --pf-v6-c-tooltip__arrow--Rotate: var(--pf-v6-c-tooltip__arrow--m-top--Rotate); + } +} + +!* Was left, flipped to right *! +@container anchored(fallback: flip-block flip-inline) { + .pf-v6-c-tooltip[popover].pf-m-left .pf-v6-c-tooltip__arrow { + --pf-v6-c-tooltip__arrow--InsetInlineEnd: auto; + --pf-v6-c-tooltip__arrow--InsetBlockStart: var(--pf-v6-c-tooltip--m-right--InsetBlockStart, 50%); + --pf-v6-c-tooltip__arrow--InsetInlineStart: var(--pf-v6-c-tooltip--m-right--InsetInlineStart, 0); + --pf-v6-c-tooltip__arrow--TranslateX: var(--pf-v6-c-tooltip__arrow--m-right--TranslateX); + --pf-v6-c-tooltip__arrow--TranslateY: var(--pf-v6-c-tooltip__arrow--m-right--TranslateY); + --pf-v6-c-tooltip__arrow--Rotate: var(--pf-v6-c-tooltip__arrow--m-right--Rotate); + } +} + +!* Was right, flipped to left *! +@container anchored(fallback: flip-block flip-inline) { + .pf-v6-c-tooltip[popover].pf-m-right .pf-v6-c-tooltip__arrow { + --pf-v6-c-tooltip__arrow--InsetInlineStart: auto; + --pf-v6-c-tooltip__arrow--InsetBlockStart: var(--pf-v6-c-tooltip--m-left--InsetBlockStart, 50%); + --pf-v6-c-tooltip__arrow--InsetInlineEnd: var(--pf-v6-c-tooltip--m-left--InsetInlineEnd, 0); + --pf-v6-c-tooltip__arrow--TranslateX: var(--pf-v6-c-tooltip__arrow--m-left--TranslateX); + --pf-v6-c-tooltip__arrow--TranslateY: var(--pf-v6-c-tooltip__arrow--m-left--TranslateY); + --pf-v6-c-tooltip__arrow--Rotate: var(--pf-v6-c-tooltip__arrow--m-left--Rotate); + } +} +*/ diff --git a/pom.xml b/pom.xml index 776b4c187..ba12b3ecc 100644 --- a/pom.xml +++ b/pom.xml @@ -79,9 +79,9 @@ 1.0.8.Final v0.34.6 - 2.4.9 - 2.13.0 1.3.2 + 2.4.10 + 2.13.0 1.0.0-RC1 1.0.0-RC1 6.0.3 diff --git a/showcase/package.json b/showcase/package.json index 70471b03f..ce2e7c231 100644 --- a/showcase/package.json +++ b/showcase/package.json @@ -20,10 +20,10 @@ }, "dependencies": { "@github/relative-time-element": "^5.0.0", - "@patternfly/patternfly": "^6.4.0", "@patternfly-java/charts": "^0.0.13", "@patternfly-java/core": "link:../core/npm", "@patternfly-java/finder": "link:../extensions/finder/npm", + "@patternfly/patternfly": "^6.4.0", "highlight.js": "^11.11.1" }, "devDependencies": { @@ -31,6 +31,8 @@ "@parcel/core": "^2.16.4", "@parcel/reporter-cli": "^2.16.4", "@parcel/resolver-glob": "^2.16.4", + "@parcel/transformer-css": "^2.16.4", + "basic-ftp": "^5.2.0", "concurrently": "^9.2.1", "express": "^5.2.1", "http-proxy-middleware": "^3.0.5", @@ -38,8 +40,7 @@ "open": "^11.0.0", "parcel": "^2.16.4", "parcel-resolver-ignore": "^2.2.1", - "puppeteer": "^24.38.0", - "basic-ftp": "^5.2.0", + "puppeteer": "^24.40.0", "wait-on": "^9.0.4" }, "packageManager": "pnpm@11.0.0-dev.1005+sha512.91f84a392eea348ea4852a182912d2520273a4336f933b78cc44bc931eb999923c097e9433a9b355adc1f725725ea99082fc9f032a559df832632e764c92c798" diff --git a/showcase/pnpm-lock.yaml b/showcase/pnpm-lock.yaml index 7f6de58e3..9c31e4bd7 100644 --- a/showcase/pnpm-lock.yaml +++ b/showcase/pnpm-lock.yaml @@ -39,6 +39,9 @@ importers: '@parcel/resolver-glob': specifier: ^2.16.4 version: 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/transformer-css': + specifier: ^2.16.4 + version: 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) basic-ftp: specifier: ^5.2.0 version: 5.2.0 @@ -64,8 +67,8 @@ importers: specifier: ^2.2.1 version: 2.2.1(@parcel/core@2.16.4(@swc/helpers@0.5.19)) puppeteer: - specifier: ^24.38.0 - version: 24.38.0 + specifier: ^24.40.0 + version: 24.40.0 wait-on: specifier: ^9.0.4 version: 9.0.4 @@ -636,68 +639,80 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - '@swc/core-darwin-arm64@1.15.11': - resolution: {integrity: sha512-QoIupRWVH8AF1TgxYyeA5nS18dtqMuxNwchjBIwJo3RdwLEFiJq6onOx9JAxHtuPwUkIVuU2Xbp+jCJ7Vzmgtg==} + '@swc/core-darwin-arm64@1.15.21': + resolution: {integrity: sha512-SA8SFg9dp0qKRH8goWsax6bptFE2EdmPf2YRAQW9WoHGf3XKM1bX0nd5UdwxmC5hXsBUZAYf7xSciCler6/oyA==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.15.11': - resolution: {integrity: sha512-S52Gu1QtPSfBYDiejlcfp9GlN+NjTZBRRNsz8PNwBgSE626/FUf2PcllVUix7jqkoMC+t0rS8t+2/aSWlMuQtA==} + '@swc/core-darwin-x64@1.15.21': + resolution: {integrity: sha512-//fOVntgowz9+V90lVsNCtyyrtbHp3jWH6Rch7MXHXbcvbLmbCTmssl5DeedUWLLGiAAW1wksBdqdGYOTjaNLw==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.15.11': - resolution: {integrity: sha512-lXJs8oXo6Z4yCpimpQ8vPeCjkgoHu5NoMvmJZ8qxDyU99KVdg6KwU9H79vzrmB+HfH+dCZ7JGMqMF//f8Cfvdg==} + '@swc/core-linux-arm-gnueabihf@1.15.21': + resolution: {integrity: sha512-meNI4Sh6h9h8DvIfEc0l5URabYMSuNvyisLmG6vnoYAS43s8ON3NJR8sDHvdP7NJTrLe0q/x2XCn6yL/BeHcZg==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.15.11': - resolution: {integrity: sha512-chRsz1K52/vj8Mfq/QOugVphlKPWlMh10V99qfH41hbGvwAU6xSPd681upO4bKiOr9+mRIZZW+EfJqY42ZzRyA==} + '@swc/core-linux-arm64-gnu@1.15.21': + resolution: {integrity: sha512-QrXlNQnHeXqU2EzLlnsPoWEh8/GtNJLvfMiPsDhk+ht6Xv8+vhvZ5YZ/BokNWSIZiWPKLAqR0M7T92YF5tmD3g==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.15.11': - resolution: {integrity: sha512-PYftgsTaGnfDK4m6/dty9ryK1FbLk+LosDJ/RJR2nkXGc8rd+WenXIlvHjWULiBVnS1RsjHHOXmTS4nDhe0v0w==} + '@swc/core-linux-arm64-musl@1.15.21': + resolution: {integrity: sha512-8/yGCMO333ultDaMQivE5CjO6oXDPeeg1IV4sphojPkb0Pv0i6zvcRIkgp60xDB+UxLr6VgHgt+BBgqS959E9g==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.15.11': - resolution: {integrity: sha512-DKtnJKIHiZdARyTKiX7zdRjiDS1KihkQWatQiCHMv+zc2sfwb4Glrodx2VLOX4rsa92NLR0Sw8WLcPEMFY1szQ==} + '@swc/core-linux-ppc64-gnu@1.15.21': + resolution: {integrity: sha512-ucW0HzPx0s1dgRvcvuLSPSA/2Kk/VYTv9st8qe1Kc22Gu0Q0rH9+6TcBTmMuNIp0Xs4BPr1uBttmbO1wEGI49Q==} + engines: {node: '>=10'} + cpu: [ppc64] + os: [linux] + + '@swc/core-linux-s390x-gnu@1.15.21': + resolution: {integrity: sha512-ulTnOGc5I7YRObE/9NreAhQg94QkiR5qNhhcUZ1iFAYjzg/JGAi1ch+s/Ixe61pMIr8bfVrF0NOaB0f8wjaAfA==} + engines: {node: '>=10'} + cpu: [s390x] + os: [linux] + + '@swc/core-linux-x64-gnu@1.15.21': + resolution: {integrity: sha512-D0RokxtM+cPvSqJIKR6uja4hbD+scI9ezo95mBhfSyLUs9wnPPl26sLp1ZPR/EXRdYm3F3S6RUtVi+8QXhT24Q==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.15.11': - resolution: {integrity: sha512-mUjjntHj4+8WBaiDe5UwRNHuEzLjIWBTSGTw0JT9+C9/Yyuh4KQqlcEQ3ro6GkHmBGXBFpGIj/o5VMyRWfVfWw==} + '@swc/core-linux-x64-musl@1.15.21': + resolution: {integrity: sha512-nER8u7VeRfmU6fMDzl1NQAbbB/G7O2avmvCOwIul1uGkZ2/acbPH+DCL9h5+0yd/coNcxMBTL6NGepIew+7C2w==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.15.11': - resolution: {integrity: sha512-ZkNNG5zL49YpaFzfl6fskNOSxtcZ5uOYmWBkY4wVAvgbSAQzLRVBp+xArGWh2oXlY/WgL99zQSGTv7RI5E6nzA==} + '@swc/core-win32-arm64-msvc@1.15.21': + resolution: {integrity: sha512-+/AgNBnjYugUA8C0Do4YzymgvnGbztv7j8HKSQLvR/DQgZPoXQ2B3PqB2mTtGh/X5DhlJWiqnunN35JUgWcAeQ==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.15.11': - resolution: {integrity: sha512-6XnzORkZCQzvTQ6cPrU7iaT9+i145oLwnin8JrfsLG41wl26+5cNQ2XV3zcbrnFEV6esjOceom9YO1w9mGJByw==} + '@swc/core-win32-ia32-msvc@1.15.21': + resolution: {integrity: sha512-IkSZj8PX/N4HcaFhMQtzmkV8YSnuNoJ0E6OvMwFiOfejPhiKXvl7CdDsn1f4/emYEIDO3fpgZW9DTaCRMDxaDA==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.15.11': - resolution: {integrity: sha512-IQ2n6af7XKLL6P1gIeZACskSxK8jWtoKpJWLZmdXTDj1MGzktUy4i+FvpdtxFmJWNavRWH1VmTr6kAubRDHeKw==} + '@swc/core-win32-x64-msvc@1.15.21': + resolution: {integrity: sha512-zUyWso7OOENB6e1N1hNuNn8vbvLsTdKQ5WKLgt/JcBNfJhKy/6jmBmqI3GXk/MyvQKd5SLvP7A0F36p7TeDqvw==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.15.11': - resolution: {integrity: sha512-iLmLTodbYxU39HhMPaMUooPwO/zqJWvsqkrXv1ZI38rMb048p6N7qtAtTp37sw9NzSrvH6oli8EdDygo09IZ/w==} + '@swc/core@1.15.21': + resolution: {integrity: sha512-fkk7NJcBscrR3/F8jiqlMptRHP650NxqDnspBMrRe5d8xOoCy9MLL5kOBLFXjFLfMo3KQQHhk+/jUULOMlR1uQ==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '>=0.5.17' @@ -711,8 +726,8 @@ packages: '@swc/helpers@0.5.19': resolution: {integrity: sha512-QamiFeIK3txNjgUTNppE6MiG3p7TdninpZu0E0PbqVh1a9FNLT2FRhisaa4NcaX52XVhA5l7Pk58Ft7Sqi/2sA==} - '@swc/types@0.1.25': - resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} + '@swc/types@0.1.26': + resolution: {integrity: sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw==} '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} @@ -747,8 +762,8 @@ packages: '@types/http-proxy@1.17.17': resolution: {integrity: sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==} - '@types/node@25.3.0': - resolution: {integrity: sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==} + '@types/node@25.5.0': + resolution: {integrity: sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==} '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -785,8 +800,8 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - axios@1.13.5: - resolution: {integrity: sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==} + axios@1.13.6: + resolution: {integrity: sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==} b4a@1.8.0: resolution: {integrity: sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==} @@ -804,8 +819,8 @@ packages: bare-abort-controller: optional: true - bare-fs@4.5.4: - resolution: {integrity: sha512-POK4oplfA7P7gqvetNmCs4CNtm9fNsx+IAh7jH7GgU0OJdge2rso0R20TNWVq6VoWcCvsTdlNDaleLHGaKx8CA==} + bare-fs@4.5.6: + resolution: {integrity: sha512-1QovqDrR80Pmt5HPAsMsXTCFcDYr+NSUKW6nd6WO5v0JBmnItc/irNRzm2KOQ5oZ69P37y+AMujNyNtG+1Rggw==} engines: {bare: '>=1.16.0'} peerDependencies: bare-buffer: '*' @@ -813,32 +828,35 @@ packages: bare-buffer: optional: true - bare-os@3.6.2: - resolution: {integrity: sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==} + bare-os@3.8.0: + resolution: {integrity: sha512-Dc9/SlwfxkXIGYhvMQNUtKaXCaGkZYGcd1vuNUUADVqzu4/vQfvnMkYYOUnt2VwQ2AqKr/8qAVFRtwETljgeFg==} engines: {bare: '>=1.14.0'} bare-path@3.0.0: resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - bare-stream@2.8.0: - resolution: {integrity: sha512-reUN0M2sHRqCdG4lUK3Fw8w98eeUIZHL5c3H7Mbhk2yVBL+oofgaIp0ieLfD5QXwPCypBpmEEKU2WZKzbAk8GA==} + bare-stream@2.11.0: + resolution: {integrity: sha512-Y/+iQ49fL3rIn6w/AVxI/2+BRrpmzJvdWt5Jv8Za6Ngqc6V227c+pYjYYgLdpR3MwQ9ObVXD0ZrqoBztakM0rw==} peerDependencies: + bare-abort-controller: '*' bare-buffer: '*' bare-events: '*' peerDependenciesMeta: + bare-abort-controller: + optional: true bare-buffer: optional: true bare-events: optional: true - bare-url@2.3.2: - resolution: {integrity: sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==} + bare-url@2.4.0: + resolution: {integrity: sha512-NSTU5WN+fy/L0DDenfE8SXQna4voXuW0FHM7wH8i3/q9khUSchfPbPezO4zSFMnDGIf9YE+mt/RWhZgNRKRIXA==} base-x@3.0.11: resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - baseline-browser-mapping@2.10.0: - resolution: {integrity: sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==} + baseline-browser-mapping@2.10.10: + resolution: {integrity: sha512-sUoJ3IMxx4AyRqO4MLeHlnGDkyXRoUG0/AI9fjK+vS72ekpV0yWVY7O0BVjmBcRtkNcsAO2QDZ4tdKKGoI6YaQ==} engines: {node: '>=6.0.0'} hasBin: true @@ -886,8 +904,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001772: - resolution: {integrity: sha512-mIwLZICj+ntVTw4BT2zfp+yu/AqV6GMKfJVJMx3MwPxs+uk/uj2GLl2dH8LQbjiLDX66amCga5nKFyDgRR43kg==} + caniuse-lite@1.0.30001781: + resolution: {integrity: sha512-RdwNCyMsNBftLjW6w01z8bKEvT6e/5tpPVEgtn22TiLGlstHOVecsX2KHFkD5e/vRnIE4EGzpuIODb3mtswtkw==} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -950,8 +968,8 @@ packages: resolution: {integrity: sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==} engines: {node: '>= 0.4.0'} - cosmiconfig@9.0.0: - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + cosmiconfig@9.0.1: + resolution: {integrity: sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==} engines: {node: '>=14'} peerDependencies: typescript: '>=4.9.5' @@ -1073,8 +1091,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.302: - resolution: {integrity: sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==} + electron-to-chromium@1.5.325: + resolution: {integrity: sha512-PwfIw7WQSt3xX7yOf5OE/unLzsK9CaN2f/FvV3WjPR1Knoc1T9vePRVV4W1EM301JzzysK51K7FNKcusCr0zYA==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1350,8 +1368,8 @@ packages: resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} engines: {node: '>=16'} - joi@18.0.2: - resolution: {integrity: sha512-RuCOQMIt78LWnktPoeBL0GErkNaJPTBGcYuyaBvUOQSpcpcLfWrHPPihYdOGbV5pam9VTWbeoF7TsGiHugcjGA==} + joi@18.1.1: + resolution: {integrity: sha512-pJkBiPtNo+o0h19LfSvUN46Y5zY+ck99AtHwch9n2HqVLNRgP0ZMyIH8FRMoP+HV8hy/+AG99dXFfwpf83iZfQ==} engines: {node: '>= 20'} js-tokens@4.0.0: @@ -1372,74 +1390,74 @@ packages: engines: {node: '>=6'} hasBin: true - lightningcss-android-arm64@1.31.1: - resolution: {integrity: sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==} + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [android] - lightningcss-darwin-arm64@1.31.1: - resolution: {integrity: sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==} + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] - lightningcss-darwin-x64@1.31.1: - resolution: {integrity: sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==} + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] - lightningcss-freebsd-x64@1.31.1: - resolution: {integrity: sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==} + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] - lightningcss-linux-arm-gnueabihf@1.31.1: - resolution: {integrity: sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==} + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] - lightningcss-linux-arm64-gnu@1.31.1: - resolution: {integrity: sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==} + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - lightningcss-linux-arm64-musl@1.31.1: - resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==} + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - lightningcss-linux-x64-gnu@1.31.1: - resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==} + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - lightningcss-linux-x64-musl@1.31.1: - resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==} + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - lightningcss-win32-arm64-msvc@1.31.1: - resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==} + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] - lightningcss-win32-x64-msvc@1.31.1: - resolution: {integrity: sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==} + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] - lightningcss@1.31.1: - resolution: {integrity: sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==} + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} engines: {node: '>= 12.0.0'} lines-and-columns@1.2.4: @@ -1515,8 +1533,8 @@ packages: resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} hasBin: true - msgpackr@1.11.8: - resolution: {integrity: sha512-bC4UGzHhVvgDNS7kn9tV8fAucIYUBuGojcaLiz7v+P63Lmtm0Xeji8B/8tYKddALXxJLpwIeBmUN3u64C4YkRA==} + msgpackr@1.11.9: + resolution: {integrity: sha512-FkoAAyyA6HM8wL882EcEyFZ9s7hVADSwG9xrVx3dxxNQAtgADTrJoEWivID82Iv1zWDsv/OtbrrcZAzGzOMdNw==} negotiator@1.0.0: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} @@ -1540,8 +1558,8 @@ packages: resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} hasBin: true - node-releases@2.0.27: - resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + node-releases@2.0.36: + resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==} nullthrows@1.1.1: resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} @@ -1606,12 +1624,12 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} portfinder@1.0.38: @@ -1640,15 +1658,15 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - pump@3.0.3: - resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + pump@3.0.4: + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} - puppeteer-core@24.38.0: - resolution: {integrity: sha512-zB3S/tksIhgi2gZRndUe07AudBz5SXOB7hqG0kEa9/YXWrGwlVlYm3tZtwKgfRftBzbmLQl5iwHkQQl04n/mWw==} + puppeteer-core@24.40.0: + resolution: {integrity: sha512-MWL3XbUCfVgGR0gRsidzT6oKJT2QydPLhMITU6HoVWiiv4gkb6gJi3pcdAa8q4HwjBTbqISOWVP4aJiiyUJvag==} engines: {node: '>=18'} - puppeteer@24.38.0: - resolution: {integrity: sha512-abnJOBVoL9PQTLKSbYGm9mjNFyIPaTVj77J/6cS370dIQtcZMpx8wyZoAuBzR71Aoon6yvI71NEVFUsl3JU82g==} + puppeteer@24.40.0: + resolution: {integrity: sha512-IxQbDq93XHVVLWHrAkFP7F7iHvb9o0mgfsSIMlhHb+JM+JjM1V4v4MNSQfcRWJopx9dsNOr9adYv0U5fm9BJBQ==} engines: {node: '>=18'} hasBin: true @@ -1779,8 +1797,8 @@ packages: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} - streamx@2.23.0: - resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} + streamx@2.25.0: + resolution: {integrity: sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==} string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} @@ -1798,11 +1816,11 @@ packages: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} - tar-fs@3.1.1: - resolution: {integrity: sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==} + tar-fs@3.1.2: + resolution: {integrity: sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==} - tar-stream@3.1.7: - resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + tar-stream@3.1.8: + resolution: {integrity: sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==} teex@1.0.1: resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} @@ -2020,8 +2038,8 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.19.0: - resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} + ws@8.20.0: + resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -2232,7 +2250,7 @@ snapshots: dotenv: 16.6.1 dotenv-expand: 11.0.7 json5: 2.2.3 - msgpackr: 1.11.8 + msgpackr: 1.11.9 nullthrows: 1.1.1 semver: 7.7.4 transitivePeerDependencies: @@ -2305,7 +2323,7 @@ snapshots: '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 browserslist: 4.28.1 - lightningcss: 1.31.1 + lightningcss: 1.32.0 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' @@ -2346,7 +2364,7 @@ snapshots: '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 - '@swc/core': 1.15.11(@swc/helpers@0.5.19) + '@swc/core': 1.15.21(@swc/helpers@0.5.19) nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' @@ -2363,7 +2381,7 @@ snapshots: '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) '@parcel/utils': 2.16.4 '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@swc/core': 1.15.11(@swc/helpers@0.5.19) + '@swc/core': 1.15.21(@swc/helpers@0.5.19) semver: 7.7.4 transitivePeerDependencies: - '@swc/helpers' @@ -2375,7 +2393,7 @@ snapshots: '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 - lightningcss: 1.31.1 + lightningcss: 1.32.0 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' @@ -2590,7 +2608,7 @@ snapshots: '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 browserslist: 4.28.1 - lightningcss: 1.31.1 + lightningcss: 1.32.0 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' @@ -2767,7 +2785,7 @@ snapshots: detect-libc: 2.1.2 is-glob: 4.0.3 node-addon-api: 7.1.1 - picomatch: 4.0.3 + picomatch: 4.0.4 optionalDependencies: '@parcel/watcher-android-arm64': 2.5.6 '@parcel/watcher-darwin-arm64': 2.5.6 @@ -2867,7 +2885,7 @@ snapshots: progress: 2.0.3 proxy-agent: 6.5.0 semver: 7.7.4 - tar-fs: 3.1.1 + tar-fs: 3.1.2 yargs: 17.7.2 transitivePeerDependencies: - bare-abort-controller @@ -2877,51 +2895,59 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@swc/core-darwin-arm64@1.15.11': + '@swc/core-darwin-arm64@1.15.21': optional: true - '@swc/core-darwin-x64@1.15.11': + '@swc/core-darwin-x64@1.15.21': optional: true - '@swc/core-linux-arm-gnueabihf@1.15.11': + '@swc/core-linux-arm-gnueabihf@1.15.21': optional: true - '@swc/core-linux-arm64-gnu@1.15.11': + '@swc/core-linux-arm64-gnu@1.15.21': optional: true - '@swc/core-linux-arm64-musl@1.15.11': + '@swc/core-linux-arm64-musl@1.15.21': optional: true - '@swc/core-linux-x64-gnu@1.15.11': + '@swc/core-linux-ppc64-gnu@1.15.21': optional: true - '@swc/core-linux-x64-musl@1.15.11': + '@swc/core-linux-s390x-gnu@1.15.21': optional: true - '@swc/core-win32-arm64-msvc@1.15.11': + '@swc/core-linux-x64-gnu@1.15.21': optional: true - '@swc/core-win32-ia32-msvc@1.15.11': + '@swc/core-linux-x64-musl@1.15.21': optional: true - '@swc/core-win32-x64-msvc@1.15.11': + '@swc/core-win32-arm64-msvc@1.15.21': optional: true - '@swc/core@1.15.11(@swc/helpers@0.5.19)': + '@swc/core-win32-ia32-msvc@1.15.21': + optional: true + + '@swc/core-win32-x64-msvc@1.15.21': + optional: true + + '@swc/core@1.15.21(@swc/helpers@0.5.19)': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.25 + '@swc/types': 0.1.26 optionalDependencies: - '@swc/core-darwin-arm64': 1.15.11 - '@swc/core-darwin-x64': 1.15.11 - '@swc/core-linux-arm-gnueabihf': 1.15.11 - '@swc/core-linux-arm64-gnu': 1.15.11 - '@swc/core-linux-arm64-musl': 1.15.11 - '@swc/core-linux-x64-gnu': 1.15.11 - '@swc/core-linux-x64-musl': 1.15.11 - '@swc/core-win32-arm64-msvc': 1.15.11 - '@swc/core-win32-ia32-msvc': 1.15.11 - '@swc/core-win32-x64-msvc': 1.15.11 + '@swc/core-darwin-arm64': 1.15.21 + '@swc/core-darwin-x64': 1.15.21 + '@swc/core-linux-arm-gnueabihf': 1.15.21 + '@swc/core-linux-arm64-gnu': 1.15.21 + '@swc/core-linux-arm64-musl': 1.15.21 + '@swc/core-linux-ppc64-gnu': 1.15.21 + '@swc/core-linux-s390x-gnu': 1.15.21 + '@swc/core-linux-x64-gnu': 1.15.21 + '@swc/core-linux-x64-musl': 1.15.21 + '@swc/core-win32-arm64-msvc': 1.15.21 + '@swc/core-win32-ia32-msvc': 1.15.21 + '@swc/core-win32-x64-msvc': 1.15.21 '@swc/helpers': 0.5.19 '@swc/counter@0.1.3': {} @@ -2930,7 +2956,7 @@ snapshots: dependencies: tslib: 2.8.1 - '@swc/types@0.1.25': + '@swc/types@0.1.26': dependencies: '@swc/counter': 0.1.3 @@ -2962,9 +2988,9 @@ snapshots: '@types/http-proxy@1.17.17': dependencies: - '@types/node': 25.3.0 + '@types/node': 25.5.0 - '@types/node@25.3.0': + '@types/node@25.5.0': dependencies: undici-types: 7.18.2 @@ -2972,7 +2998,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 25.3.0 + '@types/node': 25.5.0 optional: true accepts@2.0.0: @@ -2998,7 +3024,7 @@ snapshots: asynckit@0.4.0: {} - axios@1.13.5: + axios@1.13.6: dependencies: follow-redirects: 1.15.11(debug@4.4.3) form-data: 4.0.5 @@ -3010,47 +3036,41 @@ snapshots: bare-events@2.8.2: {} - bare-fs@4.5.4: + bare-fs@4.5.6: dependencies: bare-events: 2.8.2 bare-path: 3.0.0 - bare-stream: 2.8.0(bare-events@2.8.2) - bare-url: 2.3.2 + bare-stream: 2.11.0(bare-events@2.8.2) + bare-url: 2.4.0 fast-fifo: 1.3.2 transitivePeerDependencies: - bare-abort-controller - react-native-b4a - optional: true - bare-os@3.6.2: - optional: true + bare-os@3.8.0: {} bare-path@3.0.0: dependencies: - bare-os: 3.6.2 - optional: true + bare-os: 3.8.0 - bare-stream@2.8.0(bare-events@2.8.2): + bare-stream@2.11.0(bare-events@2.8.2): dependencies: - streamx: 2.23.0 + streamx: 2.25.0 teex: 1.0.1 optionalDependencies: bare-events: 2.8.2 transitivePeerDependencies: - - bare-abort-controller - react-native-b4a - optional: true - bare-url@2.3.2: + bare-url@2.4.0: dependencies: bare-path: 3.0.0 - optional: true base-x@3.0.11: dependencies: safe-buffer: 5.2.1 - baseline-browser-mapping@2.10.0: {} + baseline-browser-mapping@2.10.10: {} basic-auth@2.0.1: dependencies: @@ -3078,10 +3098,10 @@ snapshots: browserslist@4.28.1: dependencies: - baseline-browser-mapping: 2.10.0 - caniuse-lite: 1.0.30001772 - electron-to-chromium: 1.5.302 - node-releases: 2.0.27 + baseline-browser-mapping: 2.10.10 + caniuse-lite: 1.0.30001781 + electron-to-chromium: 1.5.325 + node-releases: 2.0.36 update-browserslist-db: 1.2.3(browserslist@4.28.1) buffer-crc32@0.2.13: {} @@ -3104,7 +3124,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001772: {} + caniuse-lite@1.0.30001781: {} chalk@4.1.2: dependencies: @@ -3158,7 +3178,7 @@ snapshots: corser@2.0.1: {} - cosmiconfig@9.0.0: + cosmiconfig@9.0.1: dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 @@ -3254,7 +3274,7 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.302: {} + electron-to-chromium@1.5.325: {} emoji-regex@8.0.0: {} @@ -3419,7 +3439,7 @@ snapshots: get-stream@5.2.0: dependencies: - pump: 3.0.3 + pump: 3.0.4 get-uri@6.0.5: dependencies: @@ -3568,7 +3588,7 @@ snapshots: dependencies: is-inside-container: 1.0.0 - joi@18.0.2: + joi@18.1.1: dependencies: '@hapi/address': 5.1.1 '@hapi/formula': 3.0.2 @@ -3590,54 +3610,54 @@ snapshots: json5@2.2.3: {} - lightningcss-android-arm64@1.31.1: + lightningcss-android-arm64@1.32.0: optional: true - lightningcss-darwin-arm64@1.31.1: + lightningcss-darwin-arm64@1.32.0: optional: true - lightningcss-darwin-x64@1.31.1: + lightningcss-darwin-x64@1.32.0: optional: true - lightningcss-freebsd-x64@1.31.1: + lightningcss-freebsd-x64@1.32.0: optional: true - lightningcss-linux-arm-gnueabihf@1.31.1: + lightningcss-linux-arm-gnueabihf@1.32.0: optional: true - lightningcss-linux-arm64-gnu@1.31.1: + lightningcss-linux-arm64-gnu@1.32.0: optional: true - lightningcss-linux-arm64-musl@1.31.1: + lightningcss-linux-arm64-musl@1.32.0: optional: true - lightningcss-linux-x64-gnu@1.31.1: + lightningcss-linux-x64-gnu@1.32.0: optional: true - lightningcss-linux-x64-musl@1.31.1: + lightningcss-linux-x64-musl@1.32.0: optional: true - lightningcss-win32-arm64-msvc@1.31.1: + lightningcss-win32-arm64-msvc@1.32.0: optional: true - lightningcss-win32-x64-msvc@1.31.1: + lightningcss-win32-x64-msvc@1.32.0: optional: true - lightningcss@1.31.1: + lightningcss@1.32.0: dependencies: detect-libc: 2.1.2 optionalDependencies: - lightningcss-android-arm64: 1.31.1 - lightningcss-darwin-arm64: 1.31.1 - lightningcss-darwin-x64: 1.31.1 - lightningcss-freebsd-x64: 1.31.1 - lightningcss-linux-arm-gnueabihf: 1.31.1 - lightningcss-linux-arm64-gnu: 1.31.1 - lightningcss-linux-arm64-musl: 1.31.1 - lightningcss-linux-x64-gnu: 1.31.1 - lightningcss-linux-x64-musl: 1.31.1 - lightningcss-win32-arm64-msvc: 1.31.1 - lightningcss-win32-x64-msvc: 1.31.1 + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 lines-and-columns@1.2.4: {} @@ -3659,7 +3679,7 @@ snapshots: lmdb@2.8.5: dependencies: - msgpackr: 1.11.8 + msgpackr: 1.11.9 node-addon-api: 6.1.0 node-gyp-build-optional-packages: 5.1.1 ordered-binary: 1.6.1 @@ -3685,7 +3705,7 @@ snapshots: micromatch@4.0.8: dependencies: braces: 3.0.3 - picomatch: 2.3.1 + picomatch: 2.3.2 mime-db@1.52.0: {} @@ -3719,7 +3739,7 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 optional: true - msgpackr@1.11.8: + msgpackr@1.11.9: optionalDependencies: msgpackr-extract: 3.0.3 @@ -3740,7 +3760,7 @@ snapshots: detect-libc: 2.1.2 optional: true - node-releases@2.0.27: {} + node-releases@2.0.36: {} nullthrows@1.1.1: {} @@ -3832,9 +3852,9 @@ snapshots: picocolors@1.1.1: {} - picomatch@2.3.1: {} + picomatch@2.3.2: {} - picomatch@4.0.3: {} + picomatch@4.0.4: {} portfinder@1.0.38: dependencies: @@ -3869,12 +3889,12 @@ snapshots: proxy-from-env@1.1.0: {} - pump@3.0.3: + pump@3.0.4: dependencies: end-of-stream: 1.4.5 once: 1.4.0 - puppeteer-core@24.38.0: + puppeteer-core@24.40.0: dependencies: '@puppeteer/browsers': 2.13.0 chromium-bidi: 14.0.0(devtools-protocol@0.0.1581282) @@ -3882,7 +3902,7 @@ snapshots: devtools-protocol: 0.0.1581282 typed-query-selector: 2.12.1 webdriver-bidi-protocol: 0.4.1 - ws: 8.19.0 + ws: 8.20.0 transitivePeerDependencies: - bare-abort-controller - bare-buffer @@ -3891,13 +3911,13 @@ snapshots: - supports-color - utf-8-validate - puppeteer@24.38.0: + puppeteer@24.40.0: dependencies: '@puppeteer/browsers': 2.13.0 chromium-bidi: 14.0.0(devtools-protocol@0.0.1581282) - cosmiconfig: 9.0.0 + cosmiconfig: 9.0.1 devtools-protocol: 0.0.1581282 - puppeteer-core: 24.38.0 + puppeteer-core: 24.40.0 typed-query-selector: 2.12.1 transitivePeerDependencies: - bare-abort-controller @@ -4047,7 +4067,7 @@ snapshots: statuses@2.0.2: {} - streamx@2.23.0: + streamx@2.25.0: dependencies: events-universal: 1.0.1 fast-fifo: 1.3.2 @@ -4074,34 +4094,35 @@ snapshots: dependencies: has-flag: 4.0.0 - tar-fs@3.1.1: + tar-fs@3.1.2: dependencies: - pump: 3.0.3 - tar-stream: 3.1.7 + pump: 3.0.4 + tar-stream: 3.1.8 optionalDependencies: - bare-fs: 4.5.4 + bare-fs: 4.5.6 bare-path: 3.0.0 transitivePeerDependencies: - bare-abort-controller - bare-buffer - react-native-b4a - tar-stream@3.1.7: + tar-stream@3.1.8: dependencies: b4a: 1.8.0 + bare-fs: 4.5.6 fast-fifo: 1.3.2 - streamx: 2.23.0 + streamx: 2.25.0 transitivePeerDependencies: - bare-abort-controller + - bare-buffer - react-native-b4a teex@1.0.1: dependencies: - streamx: 2.23.0 + streamx: 2.25.0 transitivePeerDependencies: - bare-abort-controller - react-native-b4a - optional: true term-size@2.2.1: {} @@ -4321,8 +4342,8 @@ snapshots: wait-on@9.0.4: dependencies: - axios: 1.13.5 - joi: 18.0.2 + axios: 1.13.6 + joi: 18.1.1 lodash: 4.17.23 minimist: 1.2.8 rxjs: 7.8.2 @@ -4345,7 +4366,7 @@ snapshots: wrappy@1.0.2: {} - ws@8.19.0: {} + ws@8.20.0: {} wsl-utils@0.3.1: dependencies: diff --git a/showcase/src/main/java/org/patternfly/showcase/component/Tooltip2Component.java b/showcase/src/main/java/org/patternfly/showcase/component/Tooltip2Component.java new file mode 100644 index 000000000..18cdad369 --- /dev/null +++ b/showcase/src/main/java/org/patternfly/showcase/component/Tooltip2Component.java @@ -0,0 +1,121 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.showcase.component; + +import org.jboss.elemento.By; +import org.jboss.elemento.router.Route; +import org.patternfly.component.button.Button; +import org.patternfly.component.tooltip.Tooltip2; +import org.patternfly.component.tooltip.TriggerAria; +import org.patternfly.showcase.LoremIpsum; +import org.patternfly.showcase.Snippet; +import org.patternfly.showcase.SnippetPage; +import elemental2.dom.ScrollIntoViewOptions; + +import static org.jboss.elemento.Elements.div; +import static org.jboss.elemento.Elements.onAttach; +import static org.patternfly.component.button.Button.button; +import static org.patternfly.component.tooltip.Tooltip2.tooltip2; +import static org.patternfly.popper.Placement.auto; +import static org.patternfly.popper.Placement.bottom; +import static org.patternfly.popper.Placement.left; +import static org.patternfly.popper.Placement.right; +import static org.patternfly.popper.Placement.top; +import static org.patternfly.showcase.ApiDoc.Type.component; +import static org.patternfly.showcase.ApiDoc.Type.other; +import static org.patternfly.showcase.Code.code; +import static org.patternfly.showcase.Data.components; + +@Route(value = "/components/tooltip2", title = "Tooltip2") +public class Tooltip2Component extends SnippetPage { + + public Tooltip2Component() { + super(components.get("tooltip2")); + + startExamples(); + addSnippet(new Snippet("tooltip2-basic", "Basic", + code("tooltip2-basic"), () -> + // @code-start:tooltip2-basic + div().style("margin", "100px") + .add(button("I have a tooltip").primary() + .id("tooltip2-basic-button")) + .add(tooltip2(By.id("tooltip2-basic-button"), LoremIpsum.words())) + .element() + // @code-end:tooltip2-basic + )); + + addSnippet(new Snippet("tooltip2-dynamic", "Dynamic content", + code("tooltip2-dynamic"), + () -> { + // @code-start:tooltip2-dynamic + Tooltip2 tooltip = tooltip2(By.id("tooltip2-dynamic-button"), "Copy to clipboard") + .onClose((e, t) -> t.text("Copy to clipboard")); + return div().style("margin", "100px") + .add(button("Copy to clipboard").primary() + .id("tooltip2-dynamic-button") + .onClick((e, b) -> tooltip.text("Successfully copied to clipboard!"))) + .add(tooltip) + .element(); + // @code-end:tooltip2-dynamic + })); + + addSnippet(new Snippet("tooltip2-placements", "Placements", + code("tooltip2-placements"), + () -> + // @code-start:tooltip2-placements + div().style("display: flex; gap: 16px") + .add(button("Bottom").secondary() + .id("tooltip2-bottom-button")) + .add(tooltip2(By.id("tooltip2-bottom-button"), "Bottom tooltip") + .placement(bottom)) + .add(button("Left").secondary() + .id("tooltip2-left-button")) + .add(tooltip2(By.id("tooltip2-left-button"), "Left tooltip") + .placement(left)) + .add(button("Right").secondary() + .id("tooltip2-right-button")) + .add(tooltip2(By.id("tooltip2-right-button"), "Right tooltip") + .placement(right)) + .element() + // @code-end:tooltip2-placements + )); + + addSnippet(new Snippet("tooltip2-auto", "Placement auto", + code("tooltip2-auto"), + () -> { + // @code-start:tooltip2-auto + Button button = button("Tooltip"); + onAttach(button, mr -> { + ScrollIntoViewOptions options = ScrollIntoViewOptions.create(); + options.setBlock("center"); + options.setInline("center"); + button.element().scrollIntoView(options); + }); + return div().style("width", "720px") + .add(div().css("pfj-tooltip-box") + .add(button.css("pfj-tooltip-button").primary() + .id("tooltip2-auto-button")) + .add(tooltip2(By.id("tooltip2-auto-button"), LoremIpsum.words()) + .placement(top))) + .element(); + // @code-end:tooltip2-auto + })); + + startApiDocs(Tooltip2.class); + addApiDoc(Tooltip2.class, component); + addApiDoc(TriggerAria.class, other); + } +} diff --git a/showcase/src/main/resources/org/patternfly/showcase/components.json b/showcase/src/main/resources/org/patternfly/showcase/components.json index 8bfc1c1d1..42c115e8b 100644 --- a/showcase/src/main/resources/org/patternfly/showcase/components.json +++ b/showcase/src/main/resources/org/patternfly/showcase/components.json @@ -657,6 +657,14 @@ "illustration": "tooltip.png", "summary": "A tooltip is a small, temporary, overlay window that provides additional information about an on-screen element." }, + "tooltip2": { + "name": "tooltip2", + "title": "Tooltip2", + "route": "/components/tooltip2", + "clazz": "org.patternfly.component.tooltip.Tooltip2", + "illustration": "tooltip.png", + "summary": "A tooltip using the Popover API and CSS anchor positioning instead of Popper.js. Added as a child of the trigger element for automatic lifecycle management." + }, "tree-view": { "name": "tree-view", "title": "Tree view", diff --git a/showcase/src/web/main.js b/showcase/src/web/main.js index c6b87d34c..6ef6f096a 100644 --- a/showcase/src/web/main.js +++ b/showcase/src/web/main.js @@ -27,3 +27,67 @@ import hljs from "highlight.js/lib/common"; import "highlight.js/styles/github.css"; window["hljs"] = hljs; // 'export' hljs for J2CL + +// Unless https://github.com/parcel-bundler/lightningcss/issues/1176 is fixed, +// we have to inject the anchored container queries manually 😩 +const HEAD = document.querySelector('head') + +const insertStyles = styles => { + const STYLE = document.createElement('style') + STYLE.setAttribute('type', 'text/css') + STYLE.innerHTML = styles + HEAD.appendChild(STYLE) +} + +// language=css +const STYLES_TO_INSERT = ` + /* Was top, flipped to bottom */ + @container anchored(fallback: flip-block flip-inline) { + .pf-v6-c-tooltip[popover].pf-m-top .pf-v6-c-tooltip__arrow { + --pf-v6-c-tooltip__arrow--InsetBlockEnd: auto; + --pf-v6-c-tooltip__arrow--InsetBlockStart: var(--pf-v6-c-tooltip--m-bottom--InsetBlockStart, 0); + --pf-v6-c-tooltip__arrow--InsetInlineStart: var(--pf-v6-c-tooltip--m-bottom--InsetInlineStart, 50%); + --pf-v6-c-tooltip__arrow--TranslateX: var(--pf-v6-c-tooltip__arrow--m-bottom--TranslateX); + --pf-v6-c-tooltip__arrow--TranslateY: var(--pf-v6-c-tooltip__arrow--m-bottom--TranslateY); + --pf-v6-c-tooltip__arrow--Rotate: var(--pf-v6-c-tooltip__arrow--m-bottom--Rotate); + } + } + + /* Was bottom, flipped to top */ + @container anchored(fallback: flip-block flip-inline) { + .pf-v6-c-tooltip[popover].pf-m-bottom .pf-v6-c-tooltip__arrow { + --pf-v6-c-tooltip__arrow--InsetBlockStart: auto; + --pf-v6-c-tooltip__arrow--InsetBlockEnd: var(--pf-v6-c-tooltip--m-top--InsetBlockEnd, 0); + --pf-v6-c-tooltip__arrow--InsetInlineStart: var(--pf-v6-c-tooltip--m-top--InsetInlineStart, 50%); + --pf-v6-c-tooltip__arrow--TranslateX: var(--pf-v6-c-tooltip__arrow--m-top--TranslateX); + --pf-v6-c-tooltip__arrow--TranslateY: var(--pf-v6-c-tooltip__arrow--m-top--TranslateY); + --pf-v6-c-tooltip__arrow--Rotate: var(--pf-v6-c-tooltip__arrow--m-top--Rotate); + } + } + + /* Was left, flipped to right */ + @container anchored(fallback: flip-block flip-inline) { + .pf-v6-c-tooltip[popover].pf-m-left .pf-v6-c-tooltip__arrow { + --pf-v6-c-tooltip__arrow--InsetInlineEnd: auto; + --pf-v6-c-tooltip__arrow--InsetBlockStart: var(--pf-v6-c-tooltip--m-right--InsetBlockStart, 50%); + --pf-v6-c-tooltip__arrow--InsetInlineStart: var(--pf-v6-c-tooltip--m-right--InsetInlineStart, 0); + --pf-v6-c-tooltip__arrow--TranslateX: var(--pf-v6-c-tooltip__arrow--m-right--TranslateX); + --pf-v6-c-tooltip__arrow--TranslateY: var(--pf-v6-c-tooltip__arrow--m-right--TranslateY); + --pf-v6-c-tooltip__arrow--Rotate: var(--pf-v6-c-tooltip__arrow--m-right--Rotate); + } + } + + /* Was right, flipped to left */ + @container anchored(fallback: flip-block flip-inline) { + .pf-v6-c-tooltip[popover].pf-m-right .pf-v6-c-tooltip__arrow { + --pf-v6-c-tooltip__arrow--InsetInlineStart: auto; + --pf-v6-c-tooltip__arrow--InsetBlockStart: var(--pf-v6-c-tooltip--m-left--InsetBlockStart, 50%); + --pf-v6-c-tooltip__arrow--InsetInlineEnd: var(--pf-v6-c-tooltip--m-left--InsetInlineEnd, 0); + --pf-v6-c-tooltip__arrow--TranslateX: var(--pf-v6-c-tooltip__arrow--m-left--TranslateX); + --pf-v6-c-tooltip__arrow--TranslateY: var(--pf-v6-c-tooltip__arrow--m-left--TranslateY); + --pf-v6-c-tooltip__arrow--Rotate: var(--pf-v6-c-tooltip__arrow--m-left--Rotate); + } + } +` + +insertStyles(STYLES_TO_INSERT); From ccfd56f5932fc57725ed32a26fe631801f0a47d3 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 26 Mar 2026 16:37:14 +0100 Subject: [PATCH 064/430] Add auto placement for new tooltips --- .../component/tooltip/Tooltip2.java | 68 +++++++++++++++++-- .../showcase/component/Tooltip2Component.java | 2 +- 2 files changed, 62 insertions(+), 8 deletions(-) diff --git a/components/src/main/java/org/patternfly/component/tooltip/Tooltip2.java b/components/src/main/java/org/patternfly/component/tooltip/Tooltip2.java index 1f13defa1..0ef9a9876 100644 --- a/components/src/main/java/org/patternfly/component/tooltip/Tooltip2.java +++ b/components/src/main/java/org/patternfly/component/tooltip/Tooltip2.java @@ -33,6 +33,7 @@ import org.patternfly.core.Roles; import org.patternfly.handler.CloseHandler; import org.patternfly.popper.Placement; +import elemental2.dom.DOMRect; import elemental2.dom.Element; import elemental2.dom.Event; import elemental2.dom.HTMLDivElement; @@ -42,6 +43,7 @@ import static elemental2.dom.DomGlobal.clearTimeout; import static elemental2.dom.DomGlobal.document; import static elemental2.dom.DomGlobal.setTimeout; +import static elemental2.dom.DomGlobal.window; import static org.gwtproject.event.shared.HandlerRegistrations.compose; import static org.jboss.elemento.Elements.div; import static org.jboss.elemento.EventType.bind; @@ -55,6 +57,10 @@ import static org.patternfly.core.Attributes.role; import static org.patternfly.handler.CloseHandler.fireEvent; import static org.patternfly.handler.CloseHandler.shouldClose; +import static org.patternfly.popper.Placement.auto; +import static org.patternfly.popper.Placement.bottom; +import static org.patternfly.popper.Placement.left; +import static org.patternfly.popper.Placement.right; import static org.patternfly.popper.Placement.top; import static org.patternfly.style.Classes.arrow; import static org.patternfly.style.Classes.component; @@ -301,7 +307,15 @@ public void show() { public void show(Event event) { if (!visible) { - element().showPopover(); + if (placement == auto && trigger != null) { + // Show invisibly to get measurable dimensions, calculate placement, then reveal + element().style.setProperty("visibility", "hidden"); + element().showPopover(); + applyPlacement(bestPlacement()); + element().style.removeProperty("visibility"); + } else { + element().showPopover(); + } visible = true; if (aria != none && trigger != null) { trigger.setAttribute(aria.attribute, id); @@ -346,15 +360,55 @@ private void cancelTimers(Event event) { } private void applyPlacement() { - // remove old placement modifier + if (placement == auto) { + applyPlacement(top); // default for auto, recalculated on show() + } else { + applyPlacement(placement); + } + } + + private void applyPlacement(Placement p) { for (String mod : Placement.modifiers) { classList().remove(mod); } + if (p.modifier != null && !p.modifier.isEmpty()) { + classList().add(p.modifier); + } + } + + private Placement bestPlacement() { + DOMRect triggerRect = trigger.getBoundingClientRect(); + DOMRect tooltipRect = element().getBoundingClientRect(); + double above = triggerRect.top; + double below = window.innerHeight - triggerRect.bottom; + double toLeft = triggerRect.left; + double toRight = window.innerWidth - triggerRect.right; - // apply placement modifier CSS class - // controls both arrow direction (PF CSS) and position-area (core.css) - if (placement.modifier != null && !placement.modifier.isEmpty()) { - classList().add(placement.modifier); + // Check which directions have enough space for the tooltip + boolean topFits = above >= tooltipRect.height + distance; + boolean bottomFits = below >= tooltipRect.height + distance; + boolean leftFits = toLeft >= tooltipRect.width / 3 + distance; + boolean rightFits = toRight >= tooltipRect.width / 3 + distance; + + // Prefer top, but only if the trigger is not near a horizontal edge + if (topFits && leftFits && rightFits) { + return top; + } + // Prefer horizontal when the trigger is near a horizontal edge + if (rightFits && !leftFits) { + return right; + } + if (leftFits && !rightFits) { + return left; + } + // Top still wins over bottom when both horizontal directions fit + if (topFits) { + return top; + } + if (bottomFits) { + return bottom; } + // Last resort: pick the side with the most space + return toRight >= toLeft ? right : left; } -} \ No newline at end of file +} diff --git a/showcase/src/main/java/org/patternfly/showcase/component/Tooltip2Component.java b/showcase/src/main/java/org/patternfly/showcase/component/Tooltip2Component.java index 18cdad369..46575e32a 100644 --- a/showcase/src/main/java/org/patternfly/showcase/component/Tooltip2Component.java +++ b/showcase/src/main/java/org/patternfly/showcase/component/Tooltip2Component.java @@ -109,7 +109,7 @@ public Tooltip2Component() { .add(button.css("pfj-tooltip-button").primary() .id("tooltip2-auto-button")) .add(tooltip2(By.id("tooltip2-auto-button"), LoremIpsum.words()) - .placement(top))) + .placement(auto))) .element(); // @code-end:tooltip2-auto })); From 5a40e0987de448c5ab74c39a3546a65a431c99db Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 26 Mar 2026 17:03:42 +0100 Subject: [PATCH 065/430] Tweak auto placement for new tooltips --- .../component/tooltip/Tooltip2.java | 20 +++++++------------ core/npm/core.css | 6 +++--- showcase/src/web/main.js | 6 +++--- 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/components/src/main/java/org/patternfly/component/tooltip/Tooltip2.java b/components/src/main/java/org/patternfly/component/tooltip/Tooltip2.java index 0ef9a9876..9678c530e 100644 --- a/components/src/main/java/org/patternfly/component/tooltip/Tooltip2.java +++ b/components/src/main/java/org/patternfly/component/tooltip/Tooltip2.java @@ -153,7 +153,7 @@ public static Tooltip2 tooltip2(Supplier trigger, String text) { this.distance = DISTANCE; this.entryDelay = ENTRY_DELAY; this.exitDelay = EXIT_DELAY; - this.placement = top; + this.placement = auto; this.aria = describedBy; this.showTimeout = 0; this.hideTimeout = 0; @@ -188,7 +188,9 @@ public void attach(MutationRecord mutationRecord) { trigger.style.setProperty("anchor-name", anchorName); style("position-anchor", anchorName); style("margin", distance + "px"); - applyPlacement(); + + // top is the default for auto and recalculated on show() + applyPlacement(placement == auto ? top : placement); // event listeners on trigger triggerHandlers = compose( @@ -306,10 +308,10 @@ public void show() { } public void show(Event event) { - if (!visible) { - if (placement == auto && trigger != null) { + if (!visible && trigger != null) { + if (placement == auto) { // Show invisibly to get measurable dimensions, calculate placement, then reveal - element().style.setProperty("visibility", "hidden"); + style("visibility", "hidden"); element().showPopover(); applyPlacement(bestPlacement()); element().style.removeProperty("visibility"); @@ -359,14 +361,6 @@ private void cancelTimers(Event event) { clearTimeout(hideTimeout); } - private void applyPlacement() { - if (placement == auto) { - applyPlacement(top); // default for auto, recalculated on show() - } else { - applyPlacement(placement); - } - } - private void applyPlacement(Placement p) { for (String mod : Placement.modifiers) { classList().remove(mod); diff --git a/core/npm/core.css b/core/npm/core.css index 2058eafc1..602c1d9e8 100644 --- a/core/npm/core.css +++ b/core/npm/core.css @@ -62,8 +62,8 @@ !* Was top, flipped to bottom *! @container anchored(fallback: flip-block flip-inline) { .pf-v6-c-tooltip[popover].pf-m-top .pf-v6-c-tooltip__arrow { - --pf-v6-c-tooltip__arrow--InsetBlockEnd: auto; --pf-v6-c-tooltip__arrow--InsetBlockStart: var(--pf-v6-c-tooltip--m-bottom--InsetBlockStart, 0); + --pf-v6-c-tooltip__arrow--InsetBlockEnd: auto; --pf-v6-c-tooltip__arrow--InsetInlineStart: var(--pf-v6-c-tooltip--m-bottom--InsetInlineStart, 50%); --pf-v6-c-tooltip__arrow--TranslateX: var(--pf-v6-c-tooltip__arrow--m-bottom--TranslateX); --pf-v6-c-tooltip__arrow--TranslateY: var(--pf-v6-c-tooltip__arrow--m-bottom--TranslateY); @@ -86,9 +86,9 @@ !* Was left, flipped to right *! @container anchored(fallback: flip-block flip-inline) { .pf-v6-c-tooltip[popover].pf-m-left .pf-v6-c-tooltip__arrow { - --pf-v6-c-tooltip__arrow--InsetInlineEnd: auto; --pf-v6-c-tooltip__arrow--InsetBlockStart: var(--pf-v6-c-tooltip--m-right--InsetBlockStart, 50%); --pf-v6-c-tooltip__arrow--InsetInlineStart: var(--pf-v6-c-tooltip--m-right--InsetInlineStart, 0); + --pf-v6-c-tooltip__arrow--InsetInlineEnd: auto; --pf-v6-c-tooltip__arrow--TranslateX: var(--pf-v6-c-tooltip__arrow--m-right--TranslateX); --pf-v6-c-tooltip__arrow--TranslateY: var(--pf-v6-c-tooltip__arrow--m-right--TranslateY); --pf-v6-c-tooltip__arrow--Rotate: var(--pf-v6-c-tooltip__arrow--m-right--Rotate); @@ -98,8 +98,8 @@ !* Was right, flipped to left *! @container anchored(fallback: flip-block flip-inline) { .pf-v6-c-tooltip[popover].pf-m-right .pf-v6-c-tooltip__arrow { - --pf-v6-c-tooltip__arrow--InsetInlineStart: auto; --pf-v6-c-tooltip__arrow--InsetBlockStart: var(--pf-v6-c-tooltip--m-left--InsetBlockStart, 50%); + --pf-v6-c-tooltip__arrow--InsetInlineStart: auto; --pf-v6-c-tooltip__arrow--InsetInlineEnd: var(--pf-v6-c-tooltip--m-left--InsetInlineEnd, 0); --pf-v6-c-tooltip__arrow--TranslateX: var(--pf-v6-c-tooltip__arrow--m-left--TranslateX); --pf-v6-c-tooltip__arrow--TranslateY: var(--pf-v6-c-tooltip__arrow--m-left--TranslateY); diff --git a/showcase/src/web/main.js b/showcase/src/web/main.js index 6ef6f096a..a765ba5ff 100644 --- a/showcase/src/web/main.js +++ b/showcase/src/web/main.js @@ -44,8 +44,8 @@ const STYLES_TO_INSERT = ` /* Was top, flipped to bottom */ @container anchored(fallback: flip-block flip-inline) { .pf-v6-c-tooltip[popover].pf-m-top .pf-v6-c-tooltip__arrow { - --pf-v6-c-tooltip__arrow--InsetBlockEnd: auto; --pf-v6-c-tooltip__arrow--InsetBlockStart: var(--pf-v6-c-tooltip--m-bottom--InsetBlockStart, 0); + --pf-v6-c-tooltip__arrow--InsetBlockEnd: auto; --pf-v6-c-tooltip__arrow--InsetInlineStart: var(--pf-v6-c-tooltip--m-bottom--InsetInlineStart, 50%); --pf-v6-c-tooltip__arrow--TranslateX: var(--pf-v6-c-tooltip__arrow--m-bottom--TranslateX); --pf-v6-c-tooltip__arrow--TranslateY: var(--pf-v6-c-tooltip__arrow--m-bottom--TranslateY); @@ -68,9 +68,9 @@ const STYLES_TO_INSERT = ` /* Was left, flipped to right */ @container anchored(fallback: flip-block flip-inline) { .pf-v6-c-tooltip[popover].pf-m-left .pf-v6-c-tooltip__arrow { - --pf-v6-c-tooltip__arrow--InsetInlineEnd: auto; --pf-v6-c-tooltip__arrow--InsetBlockStart: var(--pf-v6-c-tooltip--m-right--InsetBlockStart, 50%); --pf-v6-c-tooltip__arrow--InsetInlineStart: var(--pf-v6-c-tooltip--m-right--InsetInlineStart, 0); + --pf-v6-c-tooltip__arrow--InsetInlineEnd: auto; --pf-v6-c-tooltip__arrow--TranslateX: var(--pf-v6-c-tooltip__arrow--m-right--TranslateX); --pf-v6-c-tooltip__arrow--TranslateY: var(--pf-v6-c-tooltip__arrow--m-right--TranslateY); --pf-v6-c-tooltip__arrow--Rotate: var(--pf-v6-c-tooltip__arrow--m-right--Rotate); @@ -80,8 +80,8 @@ const STYLES_TO_INSERT = ` /* Was right, flipped to left */ @container anchored(fallback: flip-block flip-inline) { .pf-v6-c-tooltip[popover].pf-m-right .pf-v6-c-tooltip__arrow { - --pf-v6-c-tooltip__arrow--InsetInlineStart: auto; --pf-v6-c-tooltip__arrow--InsetBlockStart: var(--pf-v6-c-tooltip--m-left--InsetBlockStart, 50%); + --pf-v6-c-tooltip__arrow--InsetInlineStart: auto; --pf-v6-c-tooltip__arrow--InsetInlineEnd: var(--pf-v6-c-tooltip--m-left--InsetInlineEnd, 0); --pf-v6-c-tooltip__arrow--TranslateX: var(--pf-v6-c-tooltip__arrow--m-left--TranslateX); --pf-v6-c-tooltip__arrow--TranslateY: var(--pf-v6-c-tooltip__arrow--m-left--TranslateY); From bbee3f6f61e28fbbb66f2f2131e27fb7022a76a5 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 26 Mar 2026 17:18:18 +0100 Subject: [PATCH 066/430] Simplified and unified (auto) placement for new tooltips --- .../component/tooltip/Tooltip2.java | 51 +++++++-------- core/npm/core.css | 56 ---------------- showcase/src/web/main.js | 64 ------------------- 3 files changed, 23 insertions(+), 148 deletions(-) diff --git a/components/src/main/java/org/patternfly/component/tooltip/Tooltip2.java b/components/src/main/java/org/patternfly/component/tooltip/Tooltip2.java index 9678c530e..087bbe2d2 100644 --- a/components/src/main/java/org/patternfly/component/tooltip/Tooltip2.java +++ b/components/src/main/java/org/patternfly/component/tooltip/Tooltip2.java @@ -309,15 +309,11 @@ public void show() { public void show(Event event) { if (!visible && trigger != null) { - if (placement == auto) { - // Show invisibly to get measurable dimensions, calculate placement, then reveal - style("visibility", "hidden"); - element().showPopover(); - applyPlacement(bestPlacement()); - element().style.removeProperty("visibility"); - } else { - element().showPopover(); - } + // Show invisibly to get measurable dimensions, calculate placement, then reveal + style("visibility", "hidden"); + element().showPopover(); + applyPlacement(bestPlacement(placement)); + element().style.removeProperty("visibility"); visible = true; if (aria != none && trigger != null) { trigger.setAttribute(aria.attribute, id); @@ -370,7 +366,7 @@ private void applyPlacement(Placement p) { } } - private Placement bestPlacement() { + private Placement bestPlacement(Placement preferred) { DOMRect triggerRect = trigger.getBoundingClientRect(); DOMRect tooltipRect = element().getBoundingClientRect(); double above = triggerRect.top; @@ -384,25 +380,24 @@ private Placement bestPlacement() { boolean leftFits = toLeft >= tooltipRect.width / 3 + distance; boolean rightFits = toRight >= tooltipRect.width / 3 + distance; - // Prefer top, but only if the trigger is not near a horizontal edge - if (topFits && leftFits && rightFits) { - return top; - } - // Prefer horizontal when the trigger is near a horizontal edge - if (rightFits && !leftFits) { - return right; - } - if (leftFits && !rightFits) { - return left; + // Honor explicit preference if it fits + if (preferred != auto) { + if (preferred == top && topFits) {return top;} + if (preferred == bottom && bottomFits) {return bottom;} + if (preferred == left && leftFits) {return left;} + if (preferred == right && rightFits) {return right;} } - // Top still wins over bottom when both horizontal directions fit - if (topFits) { - return top; - } - if (bottomFits) { - return bottom; - } - // Last resort: pick the side with the most space + + // Otherwise apply these rules: + // - prefer top, but only if the trigger is not near a horizontal edge + // - prefer horizontal when the trigger is near a horizontal edge + // - top wins over bottom when both horizontal directions fit + // - last resort: pick the side with the most space + if (topFits && leftFits && rightFits) {return top;} + if (rightFits && !leftFits) {return right;} + if (leftFits && !rightFits) {return left;} + if (topFits) {return top;} + if (bottomFits) {return bottom;} return toRight >= toLeft ? right : left; } } diff --git a/core/npm/core.css b/core/npm/core.css index 602c1d9e8..5db73acc4 100644 --- a/core/npm/core.css +++ b/core/npm/core.css @@ -33,8 +33,6 @@ width: max-content; max-width: var(--pf-v6-c-tooltip--MaxWidth); position: fixed; - position-try-fallbacks: flip-block flip-inline; - container-type: anchored; } /* CSS anchor positioning for tooltips using the popover API */ @@ -53,57 +51,3 @@ .pf-v6-c-tooltip[popover].pf-m-right { position-area: inline-end; } - -/* - * Uncomment this as soon as https://github.com/parcel-bundler/lightningcss/issues/1176 - * has been fixed. - */ -/* -!* Was top, flipped to bottom *! -@container anchored(fallback: flip-block flip-inline) { - .pf-v6-c-tooltip[popover].pf-m-top .pf-v6-c-tooltip__arrow { - --pf-v6-c-tooltip__arrow--InsetBlockStart: var(--pf-v6-c-tooltip--m-bottom--InsetBlockStart, 0); - --pf-v6-c-tooltip__arrow--InsetBlockEnd: auto; - --pf-v6-c-tooltip__arrow--InsetInlineStart: var(--pf-v6-c-tooltip--m-bottom--InsetInlineStart, 50%); - --pf-v6-c-tooltip__arrow--TranslateX: var(--pf-v6-c-tooltip__arrow--m-bottom--TranslateX); - --pf-v6-c-tooltip__arrow--TranslateY: var(--pf-v6-c-tooltip__arrow--m-bottom--TranslateY); - --pf-v6-c-tooltip__arrow--Rotate: var(--pf-v6-c-tooltip__arrow--m-bottom--Rotate); - } -} - -!* Was bottom, flipped to top *! -@container anchored(fallback: flip-block flip-inline) { - .pf-v6-c-tooltip[popover].pf-m-bottom .pf-v6-c-tooltip__arrow { - --pf-v6-c-tooltip__arrow--InsetBlockStart: auto; - --pf-v6-c-tooltip__arrow--InsetBlockEnd: var(--pf-v6-c-tooltip--m-top--InsetBlockEnd, 0); - --pf-v6-c-tooltip__arrow--InsetInlineStart: var(--pf-v6-c-tooltip--m-top--InsetInlineStart, 50%); - --pf-v6-c-tooltip__arrow--TranslateX: var(--pf-v6-c-tooltip__arrow--m-top--TranslateX); - --pf-v6-c-tooltip__arrow--TranslateY: var(--pf-v6-c-tooltip__arrow--m-top--TranslateY); - --pf-v6-c-tooltip__arrow--Rotate: var(--pf-v6-c-tooltip__arrow--m-top--Rotate); - } -} - -!* Was left, flipped to right *! -@container anchored(fallback: flip-block flip-inline) { - .pf-v6-c-tooltip[popover].pf-m-left .pf-v6-c-tooltip__arrow { - --pf-v6-c-tooltip__arrow--InsetBlockStart: var(--pf-v6-c-tooltip--m-right--InsetBlockStart, 50%); - --pf-v6-c-tooltip__arrow--InsetInlineStart: var(--pf-v6-c-tooltip--m-right--InsetInlineStart, 0); - --pf-v6-c-tooltip__arrow--InsetInlineEnd: auto; - --pf-v6-c-tooltip__arrow--TranslateX: var(--pf-v6-c-tooltip__arrow--m-right--TranslateX); - --pf-v6-c-tooltip__arrow--TranslateY: var(--pf-v6-c-tooltip__arrow--m-right--TranslateY); - --pf-v6-c-tooltip__arrow--Rotate: var(--pf-v6-c-tooltip__arrow--m-right--Rotate); - } -} - -!* Was right, flipped to left *! -@container anchored(fallback: flip-block flip-inline) { - .pf-v6-c-tooltip[popover].pf-m-right .pf-v6-c-tooltip__arrow { - --pf-v6-c-tooltip__arrow--InsetBlockStart: var(--pf-v6-c-tooltip--m-left--InsetBlockStart, 50%); - --pf-v6-c-tooltip__arrow--InsetInlineStart: auto; - --pf-v6-c-tooltip__arrow--InsetInlineEnd: var(--pf-v6-c-tooltip--m-left--InsetInlineEnd, 0); - --pf-v6-c-tooltip__arrow--TranslateX: var(--pf-v6-c-tooltip__arrow--m-left--TranslateX); - --pf-v6-c-tooltip__arrow--TranslateY: var(--pf-v6-c-tooltip__arrow--m-left--TranslateY); - --pf-v6-c-tooltip__arrow--Rotate: var(--pf-v6-c-tooltip__arrow--m-left--Rotate); - } -} -*/ diff --git a/showcase/src/web/main.js b/showcase/src/web/main.js index a765ba5ff..c6b87d34c 100644 --- a/showcase/src/web/main.js +++ b/showcase/src/web/main.js @@ -27,67 +27,3 @@ import hljs from "highlight.js/lib/common"; import "highlight.js/styles/github.css"; window["hljs"] = hljs; // 'export' hljs for J2CL - -// Unless https://github.com/parcel-bundler/lightningcss/issues/1176 is fixed, -// we have to inject the anchored container queries manually 😩 -const HEAD = document.querySelector('head') - -const insertStyles = styles => { - const STYLE = document.createElement('style') - STYLE.setAttribute('type', 'text/css') - STYLE.innerHTML = styles - HEAD.appendChild(STYLE) -} - -// language=css -const STYLES_TO_INSERT = ` - /* Was top, flipped to bottom */ - @container anchored(fallback: flip-block flip-inline) { - .pf-v6-c-tooltip[popover].pf-m-top .pf-v6-c-tooltip__arrow { - --pf-v6-c-tooltip__arrow--InsetBlockStart: var(--pf-v6-c-tooltip--m-bottom--InsetBlockStart, 0); - --pf-v6-c-tooltip__arrow--InsetBlockEnd: auto; - --pf-v6-c-tooltip__arrow--InsetInlineStart: var(--pf-v6-c-tooltip--m-bottom--InsetInlineStart, 50%); - --pf-v6-c-tooltip__arrow--TranslateX: var(--pf-v6-c-tooltip__arrow--m-bottom--TranslateX); - --pf-v6-c-tooltip__arrow--TranslateY: var(--pf-v6-c-tooltip__arrow--m-bottom--TranslateY); - --pf-v6-c-tooltip__arrow--Rotate: var(--pf-v6-c-tooltip__arrow--m-bottom--Rotate); - } - } - - /* Was bottom, flipped to top */ - @container anchored(fallback: flip-block flip-inline) { - .pf-v6-c-tooltip[popover].pf-m-bottom .pf-v6-c-tooltip__arrow { - --pf-v6-c-tooltip__arrow--InsetBlockStart: auto; - --pf-v6-c-tooltip__arrow--InsetBlockEnd: var(--pf-v6-c-tooltip--m-top--InsetBlockEnd, 0); - --pf-v6-c-tooltip__arrow--InsetInlineStart: var(--pf-v6-c-tooltip--m-top--InsetInlineStart, 50%); - --pf-v6-c-tooltip__arrow--TranslateX: var(--pf-v6-c-tooltip__arrow--m-top--TranslateX); - --pf-v6-c-tooltip__arrow--TranslateY: var(--pf-v6-c-tooltip__arrow--m-top--TranslateY); - --pf-v6-c-tooltip__arrow--Rotate: var(--pf-v6-c-tooltip__arrow--m-top--Rotate); - } - } - - /* Was left, flipped to right */ - @container anchored(fallback: flip-block flip-inline) { - .pf-v6-c-tooltip[popover].pf-m-left .pf-v6-c-tooltip__arrow { - --pf-v6-c-tooltip__arrow--InsetBlockStart: var(--pf-v6-c-tooltip--m-right--InsetBlockStart, 50%); - --pf-v6-c-tooltip__arrow--InsetInlineStart: var(--pf-v6-c-tooltip--m-right--InsetInlineStart, 0); - --pf-v6-c-tooltip__arrow--InsetInlineEnd: auto; - --pf-v6-c-tooltip__arrow--TranslateX: var(--pf-v6-c-tooltip__arrow--m-right--TranslateX); - --pf-v6-c-tooltip__arrow--TranslateY: var(--pf-v6-c-tooltip__arrow--m-right--TranslateY); - --pf-v6-c-tooltip__arrow--Rotate: var(--pf-v6-c-tooltip__arrow--m-right--Rotate); - } - } - - /* Was right, flipped to left */ - @container anchored(fallback: flip-block flip-inline) { - .pf-v6-c-tooltip[popover].pf-m-right .pf-v6-c-tooltip__arrow { - --pf-v6-c-tooltip__arrow--InsetBlockStart: var(--pf-v6-c-tooltip--m-left--InsetBlockStart, 50%); - --pf-v6-c-tooltip__arrow--InsetInlineStart: auto; - --pf-v6-c-tooltip__arrow--InsetInlineEnd: var(--pf-v6-c-tooltip--m-left--InsetInlineEnd, 0); - --pf-v6-c-tooltip__arrow--TranslateX: var(--pf-v6-c-tooltip__arrow--m-left--TranslateX); - --pf-v6-c-tooltip__arrow--TranslateY: var(--pf-v6-c-tooltip__arrow--m-left--TranslateY); - --pf-v6-c-tooltip__arrow--Rotate: var(--pf-v6-c-tooltip__arrow--m-left--Rotate); - } - } -` - -insertStyles(STYLES_TO_INSERT); From f3110d13628c0956cef4a34944afba15622dbf36 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 26 Mar 2026 17:33:16 +0100 Subject: [PATCH 067/430] Fix jumping tooltips on scroll issue --- .../patternfly/component/tooltip/Tooltip2.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/components/src/main/java/org/patternfly/component/tooltip/Tooltip2.java b/components/src/main/java/org/patternfly/component/tooltip/Tooltip2.java index 087bbe2d2..17ad43fa3 100644 --- a/components/src/main/java/org/patternfly/component/tooltip/Tooltip2.java +++ b/components/src/main/java/org/patternfly/component/tooltip/Tooltip2.java @@ -51,6 +51,7 @@ import static org.jboss.elemento.EventType.focusout; import static org.jboss.elemento.EventType.mouseenter; import static org.jboss.elemento.EventType.mouseleave; +import static org.jboss.elemento.EventType.scroll; import static org.patternfly.component.tooltip.TriggerAria.describedBy; import static org.patternfly.component.tooltip.TriggerAria.none; import static org.patternfly.core.Aria.live; @@ -138,6 +139,7 @@ public static Tooltip2 tooltip2(Supplier trigger, String text) { private TriggerAria aria; private HandlerRegistration triggerHandlers; private HandlerRegistration anchorHandlers; + private HandlerRegistration scrollHandler; Tooltip2(Supplier trigger, String text) { super(ComponentType.Tooltip2, div().css(component(tooltip)) @@ -205,6 +207,9 @@ public void attach(MutationRecord mutationRecord) { anchorHandlers = compose( bind(element(), mouseenter, this::cancelTimers), bind(element(), mouseleave, this::scheduleHide)); + + // hide tooltip immediately on scroll to prevent jump artifacts + scrollHandler = bind(window, scroll.name, this::hideOnScroll); } else { logger.error("Unable to find trigger element for tooltip %o", element()); } @@ -220,6 +225,9 @@ public void detach(MutationRecord mutationRecord) { element().hidePopover(); visible = false; } + if (scrollHandler != null) { + scrollHandler.removeHandler(); + } if (anchorHandlers != null) { anchorHandlers.removeHandler(); } @@ -352,6 +360,13 @@ private void scheduleHide(Event event) { hideTimeout = setTimeout(e -> close(new Event(""), true), exitDelay); } + private void hideOnScroll(Event event) { + cancelTimers(event); + if (visible) { + close(event, true); + } + } + private void cancelTimers(Event event) { clearTimeout(showTimeout); clearTimeout(hideTimeout); From eb86ee758e062259d84204278ac2c47e0544eef5 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 26 Mar 2026 18:10:59 +0100 Subject: [PATCH 068/430] Replace tooltips in snippets and code editor action --- .../codeeditor/CodeEditorAction.java | 20 ++++++------ .../java/org/patternfly/showcase/Snippet.java | 7 ++-- .../showcase/component/Tooltip2Component.java | 32 +++++++++---------- 3 files changed, 29 insertions(+), 30 deletions(-) diff --git a/extensions/codeeditor/src/main/java/org/patternfly/extension/codeeditor/CodeEditorAction.java b/extensions/codeeditor/src/main/java/org/patternfly/extension/codeeditor/CodeEditorAction.java index a83a10861..cb017d150 100644 --- a/extensions/codeeditor/src/main/java/org/patternfly/extension/codeeditor/CodeEditorAction.java +++ b/extensions/codeeditor/src/main/java/org/patternfly/extension/codeeditor/CodeEditorAction.java @@ -20,18 +20,18 @@ import org.patternfly.component.ComponentIcon; import org.patternfly.component.ComponentType; import org.patternfly.component.button.Button; -import org.patternfly.component.tooltip.Tooltip; +import org.patternfly.component.tooltip.Tooltip2; import org.patternfly.core.Aria; import org.patternfly.handler.ComponentHandler; import org.patternfly.icon.PredefinedIcon; - import elemental2.dom.Element; import elemental2.dom.HTMLElement; import static elemental2.dom.DomGlobal.navigator; +import static org.jboss.elemento.Elements.div; import static org.jboss.elemento.EventType.click; import static org.patternfly.component.button.Button.button; -import static org.patternfly.component.tooltip.Tooltip.tooltip; +import static org.patternfly.component.tooltip.Tooltip2.tooltip2; import static org.patternfly.icon.IconSets.fas.copy; public class CodeEditorAction extends CodeEditorSubComponent @@ -61,16 +61,15 @@ public static CodeEditorAction codeEditorCopyToClipboardAction() { public static CodeEditorAction codeEditorCopyToClipboardAction(String copyText, String copiedText) { String copyId = Id.unique(ComponentType.CodeEditor.id, "copy"); - Tooltip copyTooltip = tooltip(By.id(copyId), copyText) - .onClose((e, t) -> t.text(copyText)) // restore text - .appendToBody(); - return new CodeEditorAction(button().icon(copy()).plain()) - .id(copyId) + Tooltip2 copyTooltip = tooltip2(By.id(copyId), copyText) + .onClose((e, t) -> t.text(copyText)); // restore text + return new CodeEditorAction(button().id(copyId).icon(copy()).plain()) .ariaLabel(copyText) .onClick((event, codeBlock) -> { copyTooltip.text(copiedText); navigator.clipboard.writeText(codeBlock.code()); - }); + }) + .add(copyTooltip); } // ------------------------------------------------------ instance @@ -81,8 +80,9 @@ public static CodeEditorAction codeEditorCopyToClipboardAction(String copyText, private ComponentHandler handler; CodeEditorAction(Button button) { - super(SUB_COMPONENT_NAME, button.element()); + super(SUB_COMPONENT_NAME, div().element()); this.button = button; + add(button); } // ------------------------------------------------------ builder diff --git a/showcase/src/main/java/org/patternfly/showcase/Snippet.java b/showcase/src/main/java/org/patternfly/showcase/Snippet.java index a4cb802b0..a973ad9e3 100644 --- a/showcase/src/main/java/org/patternfly/showcase/Snippet.java +++ b/showcase/src/main/java/org/patternfly/showcase/Snippet.java @@ -24,7 +24,6 @@ import org.patternfly.extension.codeeditor.CodeEditor; import org.patternfly.icon.IconSets; import org.patternfly.style.Classes; - import elemental2.dom.HTMLElement; import static org.jboss.elemento.Elements.a; @@ -36,7 +35,7 @@ import static org.patternfly.component.content.Content.content; import static org.patternfly.component.content.ContentType.h3; import static org.patternfly.component.content.ContentType.p; -import static org.patternfly.component.tooltip.Tooltip.tooltip; +import static org.patternfly.component.tooltip.Tooltip2.tooltip2; import static org.patternfly.core.Aria.hidden; import static org.patternfly.core.Attributes.tabindex; import static org.patternfly.extension.codeeditor.CodeEditor.codeEditor; @@ -114,7 +113,7 @@ public Snippet(String id, String title, Content description, String code, By.classname(component(Classes.codeEditor, main))); setVisible(mainElement, !isVisible(mainElement)); })) - .add(tooltip(By.id(codeId), "Toggle Java code")) + .add(tooltip2(By.id(codeId), "Toggle Java code")) .addAction( codeEditorCopyToClipboardAction("Copy code to clipboard", "Code copied") .css("ws-code-editor-control")) @@ -122,7 +121,7 @@ public Snippet(String id, String title, Content description, String code, .id(undoId) .css("ws-code-editor-control") .onClick((event, codeEditorAction) -> undo())) - .add(tooltip(By.id(undoId), "Undo")))) + .add(tooltip2(By.id(undoId), "Undo")))) .code(code))) .element(); diff --git a/showcase/src/main/java/org/patternfly/showcase/component/Tooltip2Component.java b/showcase/src/main/java/org/patternfly/showcase/component/Tooltip2Component.java index 46575e32a..b5f0f28e6 100644 --- a/showcase/src/main/java/org/patternfly/showcase/component/Tooltip2Component.java +++ b/showcase/src/main/java/org/patternfly/showcase/component/Tooltip2Component.java @@ -33,7 +33,6 @@ import static org.patternfly.popper.Placement.bottom; import static org.patternfly.popper.Placement.left; import static org.patternfly.popper.Placement.right; -import static org.patternfly.popper.Placement.top; import static org.patternfly.showcase.ApiDoc.Type.component; import static org.patternfly.showcase.ApiDoc.Type.other; import static org.patternfly.showcase.Code.code; @@ -75,25 +74,26 @@ public Tooltip2Component() { addSnippet(new Snippet("tooltip2-placements", "Placements", code("tooltip2-placements"), () -> - // @code-start:tooltip2-placements - div().style("display: flex; gap: 16px") - .add(button("Bottom").secondary() - .id("tooltip2-bottom-button")) - .add(tooltip2(By.id("tooltip2-bottom-button"), "Bottom tooltip") - .placement(bottom)) - .add(button("Left").secondary() - .id("tooltip2-left-button")) - .add(tooltip2(By.id("tooltip2-left-button"), "Left tooltip") - .placement(left)) - .add(button("Right").secondary() - .id("tooltip2-right-button")) - .add(tooltip2(By.id("tooltip2-right-button"), "Right tooltip") - .placement(right)) - .element() + // @code-start:tooltip2-placements + div().style("display: flex; gap: 16px") + .add(button("Bottom").secondary() + .id("tooltip2-bottom-button")) + .add(tooltip2(By.id("tooltip2-bottom-button"), "Bottom tooltip") + .placement(bottom)) + .add(button("Left").secondary() + .id("tooltip2-left-button")) + .add(tooltip2(By.id("tooltip2-left-button"), "Left tooltip") + .placement(left)) + .add(button("Right").secondary() + .id("tooltip2-right-button")) + .add(tooltip2(By.id("tooltip2-right-button"), "Right tooltip") + .placement(right)) + .element() // @code-end:tooltip2-placements )); addSnippet(new Snippet("tooltip2-auto", "Placement auto", + "Resize the browser window to a minimum to see the auto placement in action.", code("tooltip2-auto"), () -> { // @code-start:tooltip2-auto From 16a2e7cb2709fe452b7894e33450063563fcf927 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 26 Mar 2026 18:53:09 +0100 Subject: [PATCH 069/430] Add Popover2 based on popover API --- .../patternfly/component/ComponentType.java | 2 ++ core/npm/core.css | 31 +++++++++++++++++++ .../org/patternfly/showcase/components.json | 8 +++++ 3 files changed, 41 insertions(+) diff --git a/components/src/main/java/org/patternfly/component/ComponentType.java b/components/src/main/java/org/patternfly/component/ComponentType.java index 11dd172ee..92a597bc1 100644 --- a/components/src/main/java/org/patternfly/component/ComponentType.java +++ b/components/src/main/java/org/patternfly/component/ComponentType.java @@ -115,6 +115,8 @@ public enum ComponentType { Popover("pvr", "PF6/Component/Popover"), + Popover2("pvr2", "PF6/Component/Popover2"), + Progress("prg", "PF6/Component/Progress"), ProgressStepper("ps", "PF6/Component/ProgressStepper"), diff --git a/core/npm/core.css b/core/npm/core.css index 5db73acc4..11a61befb 100644 --- a/core/npm/core.css +++ b/core/npm/core.css @@ -51,3 +51,34 @@ .pf-v6-c-tooltip[popover].pf-m-right { position-area: inline-end; } + +/* =================================================================== + Popover using the popover API + =================================================================== */ +/* Reset [popover] UA styles for popovers using the popover API */ +.pf-v6-c-popover[popover] { + border: none; + padding: 0; + background: none; + overflow: visible; + width: max-content; + max-width: var(--pf-v6-c-popover--MaxWidth); + position: fixed; +} + +/* CSS anchor positioning for popovers using the popover API */ +.pf-v6-c-popover[popover].pf-m-top { + position-area: block-start; +} + +.pf-v6-c-popover[popover].pf-m-bottom { + position-area: block-end; +} + +.pf-v6-c-popover[popover].pf-m-left { + position-area: inline-start; +} + +.pf-v6-c-popover[popover].pf-m-right { + position-area: inline-end; +} diff --git a/showcase/src/main/resources/org/patternfly/showcase/components.json b/showcase/src/main/resources/org/patternfly/showcase/components.json index 42c115e8b..d15958550 100644 --- a/showcase/src/main/resources/org/patternfly/showcase/components.json +++ b/showcase/src/main/resources/org/patternfly/showcase/components.json @@ -469,6 +469,14 @@ "illustration": "popover.png", "summary": "A popover is a small overlay window that provides additional information about an on-screen element." }, + "popover2": { + "name": "popover2", + "title": "Popover2", + "route": "/components/popover2", + "clazz": "org.patternfly.component.popover.Popover2", + "illustration": "popover.png", + "summary": "A popover using the Popover API and CSS anchor positioning instead of Popper.js." + }, "progress-stepper": { "name": "progress-stepper", "title": "Progress stepper", From 9b22a19d1c0da6b2aefad5451e39bec1c96d00a5 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 26 Mar 2026 21:45:10 +0100 Subject: [PATCH 070/430] Fix Popover2 based on popover API --- .../component/popover/Popover2.java | 424 ++++++++++++++++++ .../component/popover/Popover2Body.java | 55 +++ .../component/popover/Popover2Footer.java | 50 +++ .../component/popover/Popover2Header.java | 101 +++++ .../popover/Popover2SubComponent.java | 29 ++ .../component/tooltip/Tooltip2.java | 1 + core/npm/core.css | 61 +++ .../codeeditor/CodeEditorAction.java | 1 + .../java/org/patternfly/showcase/Snippet.java | 1 + .../showcase/component/Popover2Component.java | 272 +++++++++++ .../showcase/component/Tooltip2Component.java | 5 +- showcase/src/web/main.js | 64 +++ 12 files changed, 1062 insertions(+), 2 deletions(-) create mode 100644 components/src/main/java/org/patternfly/component/popover/Popover2.java create mode 100644 components/src/main/java/org/patternfly/component/popover/Popover2Body.java create mode 100644 components/src/main/java/org/patternfly/component/popover/Popover2Footer.java create mode 100644 components/src/main/java/org/patternfly/component/popover/Popover2Header.java create mode 100644 components/src/main/java/org/patternfly/component/popover/Popover2SubComponent.java create mode 100644 showcase/src/main/java/org/patternfly/showcase/component/Popover2Component.java diff --git a/components/src/main/java/org/patternfly/component/popover/Popover2.java b/components/src/main/java/org/patternfly/component/popover/Popover2.java new file mode 100644 index 000000000..6a51cdc0a --- /dev/null +++ b/components/src/main/java/org/patternfly/component/popover/Popover2.java @@ -0,0 +1,424 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.component.popover; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +import org.gwtproject.event.shared.HandlerRegistration; +import org.jboss.elemento.Attachable; +import org.jboss.elemento.By; +import org.jboss.elemento.Elements; +import org.jboss.elemento.Id; +import org.jboss.elemento.logger.Logger; +import org.patternfly.component.BaseComponent; +import org.patternfly.component.Closeable; +import org.patternfly.component.ComponentIcon; +import org.patternfly.component.ComponentType; +import org.patternfly.component.Severity; +import org.patternfly.component.button.Button; +import org.patternfly.core.Aria; +import org.patternfly.handler.CloseHandler; +import org.patternfly.popper.Placement; +import org.patternfly.style.Modifiers.NoPadding; +import elemental2.dom.Element; +import elemental2.dom.Event; +import elemental2.dom.HTMLDivElement; +import elemental2.dom.HTMLElement; +import elemental2.dom.MutationRecord; + +import static elemental2.dom.DomGlobal.document; +import static org.jboss.elemento.Elements.div; +import static org.jboss.elemento.Elements.failSafeRemoveFromParent; +import static org.jboss.elemento.Elements.insertFirst; +import static org.jboss.elemento.EventType.bind; +import static org.jboss.elemento.EventType.click; +import static org.patternfly.component.button.Button.button; +import static org.patternfly.component.popover.Popover2Header.popover2Header; +import static org.patternfly.core.Aria.describedBy; +import static org.patternfly.core.Aria.label; +import static org.patternfly.core.Aria.labelledBy; +import static org.patternfly.core.Aria.modal; +import static org.patternfly.core.Attributes.role; +import static org.patternfly.core.Roles.dialog; +import static org.patternfly.core.Validation.verifyEnum; +import static org.patternfly.handler.CloseHandler.fireEvent; +import static org.patternfly.handler.CloseHandler.shouldClose; +import static org.patternfly.icon.IconSets.fas.times; +import static org.patternfly.popper.Placement.bottom; +import static org.patternfly.popper.Placement.left; +import static org.patternfly.popper.Placement.right; +import static org.patternfly.popper.Placement.top; +import static org.patternfly.style.Classes.arrow; +import static org.patternfly.style.Classes.close; +import static org.patternfly.style.Classes.component; +import static org.patternfly.style.Classes.content; +import static org.patternfly.style.Classes.modifier; +import static org.patternfly.style.Classes.popover; +import static org.patternfly.style.Classes.widthAuto; + +/** + * A popover is in-app messaging that provides more information on specific product areas. Popovers display content in a new + * window that overlays the current page. Unlike modals, popovers don't block the current page. + *

+ * This implementation uses the Popover API and CSS anchor positioning instead of Popper.js. The popover uses the browser's + * top-layer rendering for correct stacking, eliminating z-index issues. + */ +public class Popover2 extends BaseComponent implements + Attachable, + Closeable, + ComponentIcon, + NoPadding { + + // ------------------------------------------------------ factory + + public static Popover2 popover2() { + return new Popover2(null); + } + + public static Popover2 popover2(By trigger) { + return new Popover2(() -> Elements.querySelector(document.body, trigger)); + } + + public static Popover2 popover2(HTMLElement trigger) { + return new Popover2(() -> trigger); + } + + public static Popover2 popover2(Supplier trigger) { + return new Popover2(trigger); + } + + // ------------------------------------------------------ instance + + private static final Logger logger = Logger.getLogger(Popover2.class.getName()); + + public static final int DISTANCE = 20; + + private final String id; + private final HTMLElement contentElement; + private final List> closeHandler; + private Supplier triggerSupplier; + private HTMLElement trigger; + private boolean visible; + private boolean showClose; + private int distance; + // private Placement placement; + private Severity severity; + private Button closeButton; + private Popover2Header header; + private HandlerRegistration triggerHandlers; + private HandlerRegistration outsideClickHandler; + + Popover2(Supplier trigger) { + super(ComponentType.Popover2, div().css(component(popover), top.modifier) + .attr(role, dialog) + .aria(modal, true) + .attr("popover", "manual") + .element()); + + this.id = Id.unique(componentType().id); + this.triggerSupplier = trigger; + this.closeHandler = new ArrayList<>(); + this.visible = false; + this.showClose = true; + this.distance = DISTANCE; + // this.placement = top; + + String bodyId = Id.unique(componentType().id, "body"); + element().appendChild(div().css(component(popover, arrow)).element()); + element().appendChild(contentElement = div().css(component(popover, content)).element()); + aria(describedBy, bodyId); + + Attachable.register(this, this); + } + + @Override + public void attach(MutationRecord mutationRecord) { + if (showClose) { + closable(); + } else { + failSafeRemoveFromParent(closeButton); + } + + if (triggerSupplier != null) { + trigger = triggerSupplier.get(); + if (trigger != null) { + // CSS anchor positioning + String anchorName = "--" + id; + trigger.style.setProperty("anchor-name", anchorName); + style("position-anchor", anchorName); + style("margin", distance + "px"); + + // placement + // applyPlacement(placement); + + // click trigger: toggle on click + triggerHandlers = bind(trigger, click, this::togglePopover); + } else { + logger.error("Unable to find trigger element for popover %o", element()); + } + } else { + logger.error("No trigger element defined for popover %o", element()); + } + } + + @Override + public void detach(MutationRecord mutationRecord) { + if (visible) { + element().hidePopover(); + visible = false; + } + if (outsideClickHandler != null) { + outsideClickHandler.removeHandler(); + } + if (triggerHandlers != null) { + triggerHandlers.removeHandler(); + } + if (trigger != null) { + trigger.style.removeProperty("anchor-name"); + trigger = null; + } + } + + // ------------------------------------------------------ add + + public Popover2 addHeader(String header) { + if (this.header != null) { + this.header.text(header); + return this; + } else { + return add(popover2Header().text(header)); + } + } + + public Popover2 addHeader(Popover2Header header) { + return add(header); + } + + // override to append to the right container! + public Popover2 add(Popover2Header header) { + this.header = header; + contentElement.appendChild(header.element()); + aria(labelledBy, header.headerId); + return this; + } + + public Popover2 addBody(String body) { + return add(Popover2Body.popover2Body().text(body)); + } + + public Popover2 addBody(Popover2Body body) { + return add(body); + } + + // override to append to the right container! + public Popover2 add(Popover2Body body) { + contentElement.appendChild(body.element()); + return this; + } + + public Popover2 addFooter(String footer) { + return add(Popover2Footer.popover2Footer().text(footer)); + } + + public Popover2 addFooter(Popover2Footer footer) { + return add(footer); + } + + // override to append to the right container! + public Popover2 add(Popover2Footer footer) { + contentElement.appendChild(footer.element()); + return this; + } + + // ------------------------------------------------------ builder + + public Popover2 autoWidth() { + return css(modifier(widthAuto)); + } + + public Popover2 closable() { + return closable(null); + } + + public Popover2 closable(CloseHandler closeHandler) { + if (closeButton == null) { + insertFirst(contentElement, div().css(component(popover, close)) + .add(closeButton = button() + .plain() + .icon(times()) + .aria(label, "Close") + .on(click, event -> close(event, true))) + .element()); + } + return onClose(closeHandler); + } + + public Popover2 distance(int distance) { + this.distance = distance; + return this; + } + + @Override + public Popover2 icon(Element icon) { + failSafeHeader().removeIcon(); + failSafeHeader().icon(icon); + return this; + } + + @Override + public Popover2 removeIcon() { + if (header != null) { + header.removeIcon(); + } + return this; + } + + public Popover2 noClose() { + this.showClose = false; + return this; + } + + public Popover2 placement(Placement placement) { + if (verifyEnum(element(), "placement", placement, top, right, bottom, left)) { + for (String mod : Placement.modifiers) { + classList().remove(mod); + } + classList().add(placement.modifier); + } + return this; + } + + public Popover2 status(Severity severity) { + return status(severity, severity.name() + " popover"); + } + + public Popover2 status(Severity severity, String screenReaderText) { + if (this.severity != null) { + element().classList.remove(this.severity.status.modifier()); + } + this.severity = severity; + css(severity.status.modifier()); + icon((severity.icon.get().element())); + return this; + } + + public Popover2 trigger(String trigger) { + this.triggerSupplier = () -> Elements.querySelector(document.body, By.selector(trigger)); + return this; + } + + public Popover2 trigger(By trigger) { + this.triggerSupplier = () -> Elements.querySelector(document.body, trigger); + return this; + } + + public Popover2 trigger(HTMLElement trigger) { + this.triggerSupplier = () -> trigger; + return this; + } + + public Popover2 trigger(Supplier trigger) { + this.triggerSupplier = trigger; + return this; + } + + @Override + public Popover2 that() { + return this; + } + + // ------------------------------------------------------ aria + + /** + * Accessible label for the popover, required when header is not present. + */ + public Popover2 ariaLabel(String label) { + return aria(Aria.label, label); + } + + /** + * Accessible label for the close button. + */ + public Popover2 ariaCloseLabel(String label) { + if (closeButton != null) { + closeButton.aria(Aria.label, label); + } + return this; + } + + // ------------------------------------------------------ events + + @Override + public Popover2 onClose(CloseHandler closeHandler) { + if (closeHandler != null) { + this.closeHandler.add(closeHandler); + } + return this; + } + + // ------------------------------------------------------ api + + public void show() { + if (!visible && trigger != null) { + element().showPopover(); + visible = true; + outsideClickHandler = bind(document, click.name, this::onOutsideClick); + } + } + + @Override + public void close(Event event, boolean fireEvent) { + if (shouldClose(this, closeHandler, event, fireEvent)) { + if (visible) { + element().hidePopover(); + visible = false; + if (outsideClickHandler != null) { + outsideClickHandler.removeHandler(); + outsideClickHandler = null; + } + fireEvent(this, closeHandler, event, fireEvent); + } + } + } + + // ------------------------------------------------------ internal + + private void togglePopover(Event event) { + if (visible) { + close(event, true); + } else { + show(); + } + } + + private void onOutsideClick(Event event) { + if (visible && trigger != null) { + Element target = (Element) event.target; + if (!element().contains(target) && !trigger.contains(target)) { + close(event, true); + } + } + } + + private Popover2Header failSafeHeader() { + if (header == null) { + add(popover2Header()); + } + return header; + } +} diff --git a/components/src/main/java/org/patternfly/component/popover/Popover2Body.java b/components/src/main/java/org/patternfly/component/popover/Popover2Body.java new file mode 100644 index 000000000..990cd53f0 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/popover/Popover2Body.java @@ -0,0 +1,55 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.component.popover; + +import org.jboss.elemento.ElementTextMethods; +import org.jboss.elemento.Id; +import org.patternfly.component.ComponentType; + +import elemental2.dom.HTMLDivElement; + +import static org.jboss.elemento.Elements.div; +import static org.patternfly.style.Classes.body; +import static org.patternfly.style.Classes.component; +import static org.patternfly.style.Classes.popover; + +public class Popover2Body extends Popover2SubComponent implements + ElementTextMethods { + + // ------------------------------------------------------ factory + + public static Popover2Body popover2Body() { + return new Popover2Body(); + } + + // ------------------------------------------------------ instance + + public static final String SUB_COMPONENT_NAME = "p2b"; + + final String id; + + Popover2Body() { + super(SUB_COMPONENT_NAME, div().css(component(popover, body)).element()); + id(id = Id.unique(ComponentType.Popover2.id, "body")); + } + + // ------------------------------------------------------ builder + + @Override + public Popover2Body that() { + return this; + } +} \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/popover/Popover2Footer.java b/components/src/main/java/org/patternfly/component/popover/Popover2Footer.java new file mode 100644 index 000000000..534e42ce5 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/popover/Popover2Footer.java @@ -0,0 +1,50 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.component.popover; + +import org.jboss.elemento.ElementTextMethods; + +import elemental2.dom.HTMLDivElement; + +import static org.jboss.elemento.Elements.div; +import static org.patternfly.style.Classes.component; +import static org.patternfly.style.Classes.footer; +import static org.patternfly.style.Classes.popover; + +public class Popover2Footer extends Popover2SubComponent implements + ElementTextMethods { + + // ------------------------------------------------------ factory + + public static Popover2Footer popover2Footer() { + return new Popover2Footer(); + } + + // ------------------------------------------------------ instance + + public static final String SUB_COMPONENT_NAME = "p2f"; + + Popover2Footer() { + super(SUB_COMPONENT_NAME, div().css(component(popover, footer)).element()); + } + + // ------------------------------------------------------ builder + + @Override + public Popover2Footer that() { + return this; + } +} \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/popover/Popover2Header.java b/components/src/main/java/org/patternfly/component/popover/Popover2Header.java new file mode 100644 index 000000000..3cc708b4c --- /dev/null +++ b/components/src/main/java/org/patternfly/component/popover/Popover2Header.java @@ -0,0 +1,101 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.component.popover; + +import org.jboss.elemento.ElementContainerDelegate; +import org.jboss.elemento.ElementTextDelegate; +import org.jboss.elemento.Id; +import org.patternfly.component.ComponentType; +import org.patternfly.style.Classes; + +import elemental2.dom.Element; +import elemental2.dom.HTMLElement; +import elemental2.dom.HTMLHeadingElement; + +import static org.jboss.elemento.Elements.div; +import static org.jboss.elemento.Elements.failSafeRemoveFromParent; +import static org.jboss.elemento.Elements.h; +import static org.jboss.elemento.Elements.header; +import static org.jboss.elemento.Elements.insertBefore; +import static org.jboss.elemento.Elements.span; +import static org.patternfly.style.Classes.component; +import static org.patternfly.style.Classes.icon; +import static org.patternfly.style.Classes.popover; +import static org.patternfly.style.Classes.text; +import static org.patternfly.style.Classes.title; + +public class Popover2Header extends Popover2SubComponent implements + ElementContainerDelegate, + ElementTextDelegate { + + // ------------------------------------------------------ factory + + public static Popover2Header popover2Header() { + return new Popover2Header(); + } + + // ------------------------------------------------------ instance + + public static final String SUB_COMPONENT_NAME = "p2h"; + + final String headerId; + final HTMLHeadingElement headerElement; + private HTMLElement iconContainer; + + Popover2Header() { + super(SUB_COMPONENT_NAME, header().css(component(popover, Classes.header)).element()); + headerId = Id.unique(ComponentType.Popover2.id, "header"); + element().appendChild(div().css(component(popover, title)) + .id(headerId) + .add(headerElement = h(6).css(component(popover, title, text)) + .element()) + .element()); + } + + @Override + public Element containerDelegate() { + return headerElement; + } + + @Override + public Element textDelegate() { + return headerElement; + } + + // ------------------------------------------------------ builder + + @Override + public Popover2Header that() { + return this; + } + + // ------------------------------------------------------ internal + + void icon(Element icon) { + failSafeIconContainer().appendChild(icon); + } + + void removeIcon() { + failSafeRemoveFromParent(iconContainer); + } + + private HTMLElement failSafeIconContainer() { + if (iconContainer == null) { + insertBefore(iconContainer = span().css(component(popover, title, icon)).element(), headerElement); + } + return iconContainer; + } +} \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/popover/Popover2SubComponent.java b/components/src/main/java/org/patternfly/component/popover/Popover2SubComponent.java new file mode 100644 index 000000000..7e9eb8a99 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/popover/Popover2SubComponent.java @@ -0,0 +1,29 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.component.popover; + +import org.jboss.elemento.TypedBuilder; +import org.patternfly.component.ComponentType; +import org.patternfly.component.SubComponent; + +import elemental2.dom.HTMLElement; + +abstract class Popover2SubComponent> extends SubComponent { + + Popover2SubComponent(String name, E element) { + super(ComponentType.Popover2, name, element); + } +} \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/tooltip/Tooltip2.java b/components/src/main/java/org/patternfly/component/tooltip/Tooltip2.java index 17ad43fa3..2eca7b0af 100644 --- a/components/src/main/java/org/patternfly/component/tooltip/Tooltip2.java +++ b/components/src/main/java/org/patternfly/component/tooltip/Tooltip2.java @@ -33,6 +33,7 @@ import org.patternfly.core.Roles; import org.patternfly.handler.CloseHandler; import org.patternfly.popper.Placement; + import elemental2.dom.DOMRect; import elemental2.dom.Element; import elemental2.dom.Event; diff --git a/core/npm/core.css b/core/npm/core.css index 11a61befb..4e2832a53 100644 --- a/core/npm/core.css +++ b/core/npm/core.css @@ -61,24 +61,85 @@ padding: 0; background: none; overflow: visible; + inset: auto; width: max-content; max-width: var(--pf-v6-c-popover--MaxWidth); position: fixed; + container-type: anchored; } /* CSS anchor positioning for popovers using the popover API */ .pf-v6-c-popover[popover].pf-m-top { position-area: block-start; + position-try-fallbacks: flip-block; } .pf-v6-c-popover[popover].pf-m-bottom { position-area: block-end; + position-try-fallbacks: flip-block; } .pf-v6-c-popover[popover].pf-m-left { position-area: inline-start; + position-try-fallbacks: flip-inline; } .pf-v6-c-popover[popover].pf-m-right { position-area: inline-end; + position-try-fallbacks: flip-inline; } + +/* +Uncomment as soon as https://github.com/parcel-bundler/lightningcss/issues/1176 is fixed +Then remove the hack in showcase/src/web/main.js +*/ + +/* +!* Was top, flipped to bottom *! +@container anchored(fallback: flip-block) { + .pf-v6-c-popover[popover].pf-m-top .pf-v6-c-popover__arrow { + --pf-v6-c-popover__arrow--InsetBlockStart: var(--pf-v6-c-popover--m-bottom--InsetBlockStart, 0); + --pf-v6-c-popover__arrow--InsetBlockEnd: auto; + --pf-v6-c-popover__arrow--InsetInlineStart: var(--pf-v6-c-popover--m-bottom--InsetInlineStart, 50%); + --pf-v6-c-popover__arrow--TranslateX: var(--pf-v6-c-popover__arrow--m-bottom--TranslateX); + --pf-v6-c-popover__arrow--TranslateY: var(--pf-v6-c-popover__arrow--m-bottom--TranslateY); + --pf-v6-c-popover__arrow--Rotate: var(--pf-v6-c-popover__arrow--m-bottom--Rotate); + } +} + +!* Was bottom, flipped to top *! +@container anchored(fallback: flip-block) { + .pf-v6-c-popover[popover].pf-m-bottom .pf-v6-c-popover__arrow { + --pf-v6-c-popover__arrow--InsetBlockStart: auto; + --pf-v6-c-popover__arrow--InsetBlockEnd: var(--pf-v6-c-popover--m-top--InsetBlockEnd, 0); + --pf-v6-c-popover__arrow--InsetInlineStart: var(--pf-v6-c-popover--m-top--InsetInlineStart, 50%); + --pf-v6-c-popover__arrow--TranslateX: var(--pf-v6-c-popover__arrow--m-top--TranslateX); + --pf-v6-c-popover__arrow--TranslateY: var(--pf-v6-c-popover__arrow--m-top--TranslateY); + --pf-v6-c-popover__arrow--Rotate: var(--pf-v6-c-popover__arrow--m-top--Rotate); + } +} + +!* Was left, flipped to right *! +@container anchored(fallback: flip-inline) { + .pf-v6-c-popover[popover].pf-m-left .pf-v6-c-popover__arrow { + --pf-v6-c-popover__arrow--InsetBlockStart: var(--pf-v6-c-popover--m-right--InsetBlockStart, 50%); + --pf-v6-c-popover__arrow--InsetInlineStart: var(--pf-v6-c-popover--m-right--InsetInlineStart, 0); + --pf-v6-c-popover__arrow--InsetInlineEnd: auto; + --pf-v6-c-popover__arrow--TranslateX: var(--pf-v6-c-popover__arrow--m-right--TranslateX); + --pf-v6-c-popover__arrow--TranslateY: var(--pf-v6-c-popover__arrow--m-right--TranslateY); + --pf-v6-c-popover__arrow--Rotate: var(--pf-v6-c-popover__arrow--m-right--Rotate); + } +} + +!* Was right, flipped to left *! +@container anchored(fallback: flip-inline) { + .pf-v6-c-popover[popover].pf-m-right .pf-v6-c-popover__arrow { + --pf-v6-c-popover__arrow--InsetBlockStart: var(--pf-v6-c-popover--m-left--InsetBlockStart, 50%); + --pf-v6-c-popover__arrow--InsetInlineStart: auto; + --pf-v6-c-popover__arrow--InsetInlineEnd: var(--pf-v6-c-popover--m-left--InsetInlineEnd, 0); + --pf-v6-c-popover__arrow--TranslateX: var(--pf-v6-c-popover__arrow--m-left--TranslateX); + --pf-v6-c-popover__arrow--TranslateY: var(--pf-v6-c-popover__arrow--m-left--TranslateY); + --pf-v6-c-popover__arrow--Rotate: var(--pf-v6-c-popover__arrow--m-left--Rotate); + } +} +*/ diff --git a/extensions/codeeditor/src/main/java/org/patternfly/extension/codeeditor/CodeEditorAction.java b/extensions/codeeditor/src/main/java/org/patternfly/extension/codeeditor/CodeEditorAction.java index cb017d150..473b56f84 100644 --- a/extensions/codeeditor/src/main/java/org/patternfly/extension/codeeditor/CodeEditorAction.java +++ b/extensions/codeeditor/src/main/java/org/patternfly/extension/codeeditor/CodeEditorAction.java @@ -24,6 +24,7 @@ import org.patternfly.core.Aria; import org.patternfly.handler.ComponentHandler; import org.patternfly.icon.PredefinedIcon; + import elemental2.dom.Element; import elemental2.dom.HTMLElement; diff --git a/showcase/src/main/java/org/patternfly/showcase/Snippet.java b/showcase/src/main/java/org/patternfly/showcase/Snippet.java index a973ad9e3..6b354ced5 100644 --- a/showcase/src/main/java/org/patternfly/showcase/Snippet.java +++ b/showcase/src/main/java/org/patternfly/showcase/Snippet.java @@ -24,6 +24,7 @@ import org.patternfly.extension.codeeditor.CodeEditor; import org.patternfly.icon.IconSets; import org.patternfly.style.Classes; + import elemental2.dom.HTMLElement; import static org.jboss.elemento.Elements.a; diff --git a/showcase/src/main/java/org/patternfly/showcase/component/Popover2Component.java b/showcase/src/main/java/org/patternfly/showcase/component/Popover2Component.java new file mode 100644 index 000000000..5efee7133 --- /dev/null +++ b/showcase/src/main/java/org/patternfly/showcase/component/Popover2Component.java @@ -0,0 +1,272 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.showcase.component; + +import org.jboss.elemento.By; +import org.jboss.elemento.Elements; +import org.jboss.elemento.router.Route; +import org.patternfly.component.Severity; +import org.patternfly.component.button.Button; +import org.patternfly.component.popover.Popover2; +import org.patternfly.component.popover.Popover2Body; +import org.patternfly.component.popover.Popover2Footer; +import org.patternfly.component.popover.Popover2Header; +import org.patternfly.component.togglegroup.ToggleGroup; +import org.patternfly.showcase.LoremIpsum; +import org.patternfly.showcase.Snippet; +import org.patternfly.showcase.SnippetPage; + +import elemental2.dom.ScrollIntoViewOptions; + +import static org.jboss.elemento.Elements.div; +import static org.jboss.elemento.Elements.onAttach; +import static org.patternfly.component.SelectionMode.single; +import static org.patternfly.component.button.Button.button; +import static org.patternfly.component.list.ActionList.actionList; +import static org.patternfly.component.list.ActionListGroup.actionListGroup; +import static org.patternfly.component.list.ActionListItem.actionListItem; +import static org.patternfly.component.popover.Popover2.popover2; +import static org.patternfly.component.popover.Popover2Body.popover2Body; +import static org.patternfly.component.togglegroup.ToggleGroup.toggleGroup; +import static org.patternfly.component.togglegroup.ToggleGroupItem.toggleGroupItem; +import static org.patternfly.icon.IconSets.fas.bullhorn; +import static org.patternfly.layout.stack.Stack.stack; +import static org.patternfly.layout.stack.StackItem.stackItem; +import static org.patternfly.popper.Placement.auto; +import static org.patternfly.popper.Placement.bottom; +import static org.patternfly.popper.Placement.left; +import static org.patternfly.popper.Placement.right; +import static org.patternfly.popper.Placement.top; +import static org.patternfly.showcase.ApiDoc.Type.component; +import static org.patternfly.showcase.ApiDoc.Type.subcomponent; +import static org.patternfly.showcase.Code.code; +import static org.patternfly.showcase.Data.components; + +@Route(value = "/components/popover2", title = "Popover2") +public class Popover2Component extends SnippetPage { + + public Popover2Component() { + super(components.get("popover2")); + + startExamples(); + addSnippet(new Snippet("popover2-basic", "Basic", + code("popover2-basic"), () -> + // @code-start:popover2-basic + div().style("margin", "50px") + .add(button("Toggle popover").primary() + .id("popover2-basic-button")) + .add(popover2(By.id("popover2-basic-button")) + .ariaLabel("Basic popover") + .addHeader("Popover header") + .addBody("Popovers are triggered by click rather than hover.") + .addFooter("Popover footer")) + .element() + // @code-end:popover2-basic + )); + + addSnippet(new Snippet("popover2-placements", "Placements", + code("popover2-placements"), () -> + // @code-start:popover2-placements + div().style("display: flex; gap: 16px") + .add(button("Bottom").secondary() + .id("popover2-bottom-button")) + .add(popover2(By.id("popover2-bottom-button")) + .placement(bottom) + .ariaLabel("Bottom popover") + .addHeader("Bottom popover") + .addBody("This popover is placed at the bottom.") + .addFooter("Popover footer")) + .add(button("Left").secondary() + .id("popover2-left-button")) + .add(popover2(By.id("popover2-left-button")) + .placement(left) + .ariaLabel("Left popover") + .addHeader("Left popover") + .addBody("This popover is placed on the left.") + .addFooter("Popover footer")) + .add(button("Right").secondary() + .id("popover2-right-button")) + .add(popover2(By.id("popover2-right-button")) + .placement(right) + .ariaLabel("Right popover") + .addHeader("Right popover") + .addBody("This popover is placed on the right.") + .addFooter("Popover footer")) + .element() + // @code-end:popover2-placements + )); + + addSnippet(new Snippet("popover2-close", "Close popover", + code("popover2-close"), () -> { + // @code-start:popover2-close + Popover2 popover = popover2(By.id("popover2-close-button")); + popover.ariaLabel("Popover with button in the body that can close it") + .addHeader("Popover header") + .addBody(popover2Body() + .add(div() + .add(div() + .add("A controlled popover can be closed by calling its ") + .add(Elements.code("close()")) + .add(" method after some user interaction.")) + .add(div() + .add(button("Close popover").inline().link() + .onClick((e, b) -> popover.close()))))) + .addFooter("Popover footer"); + + return div().style("margin", "50px") + .add(button("Toggle popover").primary() + .id("popover2-close-button")) + .add(popover) + .element(); + // @code-end:popover2-close + })); + + addSnippet(new Snippet("popover2-no-padding", "Without header/footer/close and no padding", + code("popover2-no-padding"), () -> + // @code-start:popover2-no-padding + div().style("margin", "50px") + .add(button("Toggle popover").primary() + .id("popover2-no-padding-button")) + .add(popover2(By.id("popover2-no-padding-button")) + .noClose() + .noPadding() + .ariaLabel("Popover with no header, footer, close button, and padding") + .addBody( + "This popover has no padding and is intended for use with content that has its own spacing and should touch the edges of the popover container.")) + .element() + // @code-end:popover2-no-padding + )); + + addSnippet(new Snippet("popover2-auto-width", "Width auto", + code("popover2-auto-width"), () -> + // @code-start:popover2-auto-width + div().style("margin", "50px") + .add(button("Toggle popover").primary() + .id("popover2-auto-width-button")) + .add(popover2(By.id("popover2-auto-width-button")) + .autoWidth() + .ariaLabel("Popover with auto-width.") + .addBody("Removes fixed-width and allows width to be defined by contents.")) + .element() + // @code-end:popover2-auto-width + )); + + addSnippet(new Snippet("popover2-auto-placement", "Auto placement", + "You might need to resize the browser window to a minimum to see the auto placement in action.", + code("popover2-auto-placement"), () -> { + // @code-start:popover2-auto-placement + Button button = button("Toggle popover"); + onAttach(button, mr -> { + ScrollIntoViewOptions options = ScrollIntoViewOptions.create(); + options.setBlock("center"); + options.setInline("center"); + button.element().scrollIntoView(options); + }); + + Popover2 popover = popover2(By.id("popover2-auto-placement-button")); + ToggleGroup toggleGroup = toggleGroup(single) + .addItem(toggleGroupItem("left", "left").onClick((e, t) -> popover.placement(left))) + .addItem(toggleGroupItem("top", "top").onClick((e, t) -> popover.placement(top))) + .addItem(toggleGroupItem("right", "right").onClick((e, t) -> popover.placement(right))) + .addItem(toggleGroupItem("bottom", "bottom").onClick((e, t) -> popover.placement(bottom))); + toggleGroup.select("top", true, false); + return stack().gutter() + .addItem(stackItem() + .add("Placement: ") + .add(toggleGroup)) + .addItem(stackItem() + .add(div().style("width", "720px") + .add(div().css("pfj-popover-box") + .add(button.css("pfj-popover-button").primary() + .id("popover2-auto-placement-button")) + .add(popover + .placement(auto) + .ariaLabel("Advanced popover") + .addHeader("Popover header") + .addBody(LoremIpsum.words(20)) + .addFooter("Popover footer"))))) + .element(); + // @code-end:popover2-auto-placement + })); + + addSnippet(new Snippet("popover2-icon", "Popover with icon in the title", + code("popover2-icon"), () -> + // @code-start:popover2-icon + div().style("margin", "50px") + .add(button("Toggle popover").primary() + .id("popover2-icon-button")) + .add(popover2(By.id("popover2-icon-button")) + .icon(bullhorn()) + .ariaLabel("Popover with icon in the title example.") + .addHeader("Popover with icon") + .addBody(LoremIpsum.words(20)) + .addFooter("Popover footer")) + .element() + // @code-end:popover2-icon + )); + + addSnippet(new Snippet("popover2-alert", "Alert popover", + code("popover2-alert"), () -> { + // @code-start:popover2-alert + return div().style("margin", "50px") + .add(actionList() + .addItem(actionListGroup() + .addItem(actionListItem() + .add(button("Custom").secondary().id("popover2-alert-custom"))) + .addItem(actionListItem() + .add(button("Info").secondary().id("popover2-alert-info"))) + .addItem(actionListItem() + .add(button("Success").secondary().id("popover2-alert-success"))) + .addItem(actionListItem() + .add(button("Warning").warning().id("popover2-alert-warning"))) + .addItem(actionListItem() + .add(button("Danger").danger().id("popover2-alert-danger"))))) + .add(popover2(By.id("popover2-alert-custom")) + .status(Severity.custom) + .addHeader("Popover custom header") + .addBody(LoremIpsum.words(20)) + .addFooter("Popover footer")) + .add(popover2(By.id("popover2-alert-info")) + .status(Severity.info) + .addHeader("Popover info header") + .addBody(LoremIpsum.words(20)) + .addFooter("Popover footer")) + .add(popover2(By.id("popover2-alert-success")) + .status(Severity.success) + .addHeader("Popover success header") + .addBody(LoremIpsum.words(20)) + .addFooter("Popover footer")) + .add(popover2(By.id("popover2-alert-warning")) + .status(Severity.warning) + .addHeader("Popover warning header") + .addBody(LoremIpsum.words(20)) + .addFooter("Popover footer")) + .add(popover2(By.id("popover2-alert-danger")) + .status(Severity.danger) + .addHeader("Popover danger header") + .addBody(LoremIpsum.words(20)) + .addFooter("Popover footer")) + .element(); + // @code-end:popover2-alert + })); + + startApiDocs(Popover2.class); + addApiDoc(Popover2.class, component); + addApiDoc(Popover2Body.class, subcomponent); + addApiDoc(Popover2Footer.class, subcomponent); + addApiDoc(Popover2Header.class, subcomponent); + } +} diff --git a/showcase/src/main/java/org/patternfly/showcase/component/Tooltip2Component.java b/showcase/src/main/java/org/patternfly/showcase/component/Tooltip2Component.java index b5f0f28e6..95381239a 100644 --- a/showcase/src/main/java/org/patternfly/showcase/component/Tooltip2Component.java +++ b/showcase/src/main/java/org/patternfly/showcase/component/Tooltip2Component.java @@ -23,6 +23,7 @@ import org.patternfly.showcase.LoremIpsum; import org.patternfly.showcase.Snippet; import org.patternfly.showcase.SnippetPage; + import elemental2.dom.ScrollIntoViewOptions; import static org.jboss.elemento.Elements.div; @@ -92,8 +93,8 @@ public Tooltip2Component() { // @code-end:tooltip2-placements )); - addSnippet(new Snippet("tooltip2-auto", "Placement auto", - "Resize the browser window to a minimum to see the auto placement in action.", + addSnippet(new Snippet("tooltip2-auto", "Auto placement", + "You might need to resize the browser window to a minimum to see the auto placement in action.", code("tooltip2-auto"), () -> { // @code-start:tooltip2-auto diff --git a/showcase/src/web/main.js b/showcase/src/web/main.js index c6b87d34c..9016e9d80 100644 --- a/showcase/src/web/main.js +++ b/showcase/src/web/main.js @@ -27,3 +27,67 @@ import hljs from "highlight.js/lib/common"; import "highlight.js/styles/github.css"; window["hljs"] = hljs; // 'export' hljs for J2CL + +// Unless https://github.com/parcel-bundler/lightningcss/issues/1176 is fixed, +// we have to inject the anchored container queries manually 😩 +const HEAD = document.querySelector('head') + +const insertStyles = styles => { + const STYLE = document.createElement('style') + STYLE.setAttribute('type', 'text/css') + STYLE.innerHTML = styles + HEAD.appendChild(STYLE) +} + +// language=css +const STYLES_TO_INSERT = ` + /* Was top, flipped to bottom */ + @container anchored(fallback: flip-block) { + .pf-v6-c-popover[popover].pf-m-top .pf-v6-c-popover__arrow { + --pf-v6-c-popover__arrow--InsetBlockStart: var(--pf-v6-c-popover--m-bottom--InsetBlockStart, 0); + --pf-v6-c-popover__arrow--InsetBlockEnd: auto; + --pf-v6-c-popover__arrow--InsetInlineStart: var(--pf-v6-c-popover--m-bottom--InsetInlineStart, 50%); + --pf-v6-c-popover__arrow--TranslateX: var(--pf-v6-c-popover__arrow--m-bottom--TranslateX); + --pf-v6-c-popover__arrow--TranslateY: var(--pf-v6-c-popover__arrow--m-bottom--TranslateY); + --pf-v6-c-popover__arrow--Rotate: var(--pf-v6-c-popover__arrow--m-bottom--Rotate); + } + } + + /* Was bottom, flipped to top */ + @container anchored(fallback: flip-block) { + .pf-v6-c-popover[popover].pf-m-bottom .pf-v6-c-popover__arrow { + --pf-v6-c-popover__arrow--InsetBlockStart: auto; + --pf-v6-c-popover__arrow--InsetBlockEnd: var(--pf-v6-c-popover--m-top--InsetBlockEnd, 0); + --pf-v6-c-popover__arrow--InsetInlineStart: var(--pf-v6-c-popover--m-top--InsetInlineStart, 50%); + --pf-v6-c-popover__arrow--TranslateX: var(--pf-v6-c-popover__arrow--m-top--TranslateX); + --pf-v6-c-popover__arrow--TranslateY: var(--pf-v6-c-popover__arrow--m-top--TranslateY); + --pf-v6-c-popover__arrow--Rotate: var(--pf-v6-c-popover__arrow--m-top--Rotate); + } + } + + /* Was left, flipped to right */ + @container anchored(fallback: flip-inline) { + .pf-v6-c-popover[popover].pf-m-left .pf-v6-c-popover__arrow { + --pf-v6-c-popover__arrow--InsetBlockStart: var(--pf-v6-c-popover--m-right--InsetBlockStart, 50%); + --pf-v6-c-popover__arrow--InsetInlineStart: var(--pf-v6-c-popover--m-right--InsetInlineStart, 0); + --pf-v6-c-popover__arrow--InsetInlineEnd: auto; + --pf-v6-c-popover__arrow--TranslateX: var(--pf-v6-c-popover__arrow--m-right--TranslateX); + --pf-v6-c-popover__arrow--TranslateY: var(--pf-v6-c-popover__arrow--m-right--TranslateY); + --pf-v6-c-popover__arrow--Rotate: var(--pf-v6-c-popover__arrow--m-right--Rotate); + } + } + + /* Was right, flipped to left */ + @container anchored(fallback: flip-inline) { + .pf-v6-c-popover[popover].pf-m-right .pf-v6-c-popover__arrow { + --pf-v6-c-popover__arrow--InsetBlockStart: var(--pf-v6-c-popover--m-left--InsetBlockStart, 50%); + --pf-v6-c-popover__arrow--InsetInlineStart: auto; + --pf-v6-c-popover__arrow--InsetInlineEnd: var(--pf-v6-c-popover--m-left--InsetInlineEnd, 0); + --pf-v6-c-popover__arrow--TranslateX: var(--pf-v6-c-popover__arrow--m-left--TranslateX); + --pf-v6-c-popover__arrow--TranslateY: var(--pf-v6-c-popover__arrow--m-left--TranslateY); + --pf-v6-c-popover__arrow--Rotate: var(--pf-v6-c-popover__arrow--m-left--Rotate); + } + } +` + +insertStyles(STYLES_TO_INSERT); From 5d5e4d2839cdd735e850dfd18c544720bc83dde3 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 26 Mar 2026 22:36:38 +0100 Subject: [PATCH 071/430] Rename Popover2 -> NativePopover, Tooltip2 -> NativeTooltip --- CHANGELOG.md | 4 + .../patternfly/component/ComponentType.java | 8 +- .../{Popover2.java => NativePopover.java} | 101 ++++++------ ...pover2Body.java => NativePopoverBody.java} | 16 +- ...r2Footer.java => NativePopoverFooter.java} | 14 +- ...r2Header.java => NativePopoverHeader.java} | 18 +-- ...nt.java => NativePopoverSubComponent.java} | 6 +- .../{Tooltip2.java => NativeTooltip.java} | 72 ++++----- .../codeeditor/CodeEditorAction.java | 6 +- .../java/org/patternfly/showcase/Snippet.java | 6 +- ...onent.java => NativePopoverComponent.java} | 152 +++++++++--------- ...onent.java => NativeTooltipComponent.java} | 71 ++++---- .../org/patternfly/showcase/components.json | 32 ++-- 13 files changed, 255 insertions(+), 251 deletions(-) rename components/src/main/java/org/patternfly/component/popover/{Popover2.java => NativePopover.java} (79%) rename components/src/main/java/org/patternfly/component/popover/{Popover2Body.java => NativePopoverBody.java} (75%) rename components/src/main/java/org/patternfly/component/popover/{Popover2Footer.java => NativePopoverFooter.java} (76%) rename components/src/main/java/org/patternfly/component/popover/{Popover2Header.java => NativePopoverHeader.java} (84%) rename components/src/main/java/org/patternfly/component/popover/{Popover2SubComponent.java => NativePopoverSubComponent.java} (77%) rename components/src/main/java/org/patternfly/component/tooltip/{Tooltip2.java => NativeTooltip.java} (85%) rename showcase/src/main/java/org/patternfly/showcase/component/{Popover2Component.java => NativePopoverComponent.java} (70%) rename showcase/src/main/java/org/patternfly/showcase/component/{Tooltip2Component.java => NativeTooltipComponent.java} (62%) diff --git a/CHANGELOG.md b/CHANGELOG.md index d2946e37b..93844388c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +### Added + +- Add popover and tooltip components based on the native [popover API](https://developer.mozilla.org/en-US/docs/Web/API/Popover_API) and [CSS anchor positioning](https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Anchor_positioning). + ### Fixed - Fix loading finder items diff --git a/components/src/main/java/org/patternfly/component/ComponentType.java b/components/src/main/java/org/patternfly/component/ComponentType.java index 92a597bc1..1610906ac 100644 --- a/components/src/main/java/org/patternfly/component/ComponentType.java +++ b/components/src/main/java/org/patternfly/component/ComponentType.java @@ -99,6 +99,10 @@ public enum ComponentType { MultiSelect("ms", "PF6/Component/MultiSelect"), + NativePopover("npvr", "PF6/Component/NativePopover"), + + NativeTooltip("ntt", "PF6/Component/NativeTooltip"), + Navigation("nav", "PF6/Component/Nav"), NotificationBadge("nb", "PF6/Component/NotificationBadge"), @@ -115,8 +119,6 @@ public enum ComponentType { Popover("pvr", "PF6/Component/Popover"), - Popover2("pvr2", "PF6/Component/Popover2"), - Progress("prg", "PF6/Component/Progress"), ProgressStepper("ps", "PF6/Component/ProgressStepper"), @@ -163,8 +165,6 @@ public enum ComponentType { Tooltip("tt", "PF6/Component/Tooltip"), - Tooltip2("tt2", "PF6/Component/Tooltip2"), - TreeView("tv", "PF6/Component/TreeView"), Truncate("tr", "PF6/Component/Truncate"), diff --git a/components/src/main/java/org/patternfly/component/popover/Popover2.java b/components/src/main/java/org/patternfly/component/popover/NativePopover.java similarity index 79% rename from components/src/main/java/org/patternfly/component/popover/Popover2.java rename to components/src/main/java/org/patternfly/component/popover/NativePopover.java index 6a51cdc0a..41e6da99f 100644 --- a/components/src/main/java/org/patternfly/component/popover/Popover2.java +++ b/components/src/main/java/org/patternfly/component/popover/NativePopover.java @@ -35,6 +35,7 @@ import org.patternfly.handler.CloseHandler; import org.patternfly.popper.Placement; import org.patternfly.style.Modifiers.NoPadding; + import elemental2.dom.Element; import elemental2.dom.Event; import elemental2.dom.HTMLDivElement; @@ -48,7 +49,7 @@ import static org.jboss.elemento.EventType.bind; import static org.jboss.elemento.EventType.click; import static org.patternfly.component.button.Button.button; -import static org.patternfly.component.popover.Popover2Header.popover2Header; +import static org.patternfly.component.popover.NativePopoverHeader.popoverHeader; import static org.patternfly.core.Aria.describedBy; import static org.patternfly.core.Aria.label; import static org.patternfly.core.Aria.labelledBy; @@ -78,39 +79,39 @@ * This implementation uses the Popover API and CSS anchor positioning instead of Popper.js. The popover uses the browser's * top-layer rendering for correct stacking, eliminating z-index issues. */ -public class Popover2 extends BaseComponent implements +public class NativePopover extends BaseComponent implements Attachable, - Closeable, - ComponentIcon, - NoPadding { + Closeable, + ComponentIcon, + NoPadding { // ------------------------------------------------------ factory - public static Popover2 popover2() { - return new Popover2(null); + public static NativePopover nativePopover() { + return new NativePopover(null); } - public static Popover2 popover2(By trigger) { - return new Popover2(() -> Elements.querySelector(document.body, trigger)); + public static NativePopover nativePopover(By trigger) { + return new NativePopover(() -> Elements.querySelector(document.body, trigger)); } - public static Popover2 popover2(HTMLElement trigger) { - return new Popover2(() -> trigger); + public static NativePopover nativePopover(HTMLElement trigger) { + return new NativePopover(() -> trigger); } - public static Popover2 popover2(Supplier trigger) { - return new Popover2(trigger); + public static NativePopover nativePopover(Supplier trigger) { + return new NativePopover(trigger); } // ------------------------------------------------------ instance - private static final Logger logger = Logger.getLogger(Popover2.class.getName()); + private static final Logger logger = Logger.getLogger(NativePopover.class.getName()); public static final int DISTANCE = 20; private final String id; private final HTMLElement contentElement; - private final List> closeHandler; + private final List> closeHandler; private Supplier triggerSupplier; private HTMLElement trigger; private boolean visible; @@ -119,12 +120,12 @@ public static Popover2 popover2(Supplier trigger) { // private Placement placement; private Severity severity; private Button closeButton; - private Popover2Header header; + private NativePopoverHeader header; private HandlerRegistration triggerHandlers; private HandlerRegistration outsideClickHandler; - Popover2(Supplier trigger) { - super(ComponentType.Popover2, div().css(component(popover), top.modifier) + NativePopover(Supplier trigger) { + super(ComponentType.NativePopover, div().css(component(popover), top.modifier) .attr(role, dialog) .aria(modal, true) .attr("popover", "manual") @@ -196,66 +197,66 @@ public void detach(MutationRecord mutationRecord) { // ------------------------------------------------------ add - public Popover2 addHeader(String header) { + public NativePopover addHeader(String header) { if (this.header != null) { this.header.text(header); return this; } else { - return add(popover2Header().text(header)); + return add(popoverHeader().text(header)); } } - public Popover2 addHeader(Popover2Header header) { + public NativePopover addHeader(NativePopoverHeader header) { return add(header); } // override to append to the right container! - public Popover2 add(Popover2Header header) { + public NativePopover add(NativePopoverHeader header) { this.header = header; contentElement.appendChild(header.element()); aria(labelledBy, header.headerId); return this; } - public Popover2 addBody(String body) { - return add(Popover2Body.popover2Body().text(body)); + public NativePopover addBody(String body) { + return add(NativePopoverBody.popoverBody().text(body)); } - public Popover2 addBody(Popover2Body body) { + public NativePopover addBody(NativePopoverBody body) { return add(body); } // override to append to the right container! - public Popover2 add(Popover2Body body) { + public NativePopover add(NativePopoverBody body) { contentElement.appendChild(body.element()); return this; } - public Popover2 addFooter(String footer) { - return add(Popover2Footer.popover2Footer().text(footer)); + public NativePopover addFooter(String footer) { + return add(NativePopoverFooter.popoverFooter().text(footer)); } - public Popover2 addFooter(Popover2Footer footer) { + public NativePopover addFooter(NativePopoverFooter footer) { return add(footer); } // override to append to the right container! - public Popover2 add(Popover2Footer footer) { + public NativePopover add(NativePopoverFooter footer) { contentElement.appendChild(footer.element()); return this; } // ------------------------------------------------------ builder - public Popover2 autoWidth() { + public NativePopover autoWidth() { return css(modifier(widthAuto)); } - public Popover2 closable() { + public NativePopover closable() { return closable(null); } - public Popover2 closable(CloseHandler closeHandler) { + public NativePopover closable(CloseHandler closeHandler) { if (closeButton == null) { insertFirst(contentElement, div().css(component(popover, close)) .add(closeButton = button() @@ -268,32 +269,32 @@ public Popover2 closable(CloseHandler closeHandler) { return onClose(closeHandler); } - public Popover2 distance(int distance) { + public NativePopover distance(int distance) { this.distance = distance; return this; } @Override - public Popover2 icon(Element icon) { + public NativePopover icon(Element icon) { failSafeHeader().removeIcon(); failSafeHeader().icon(icon); return this; } @Override - public Popover2 removeIcon() { + public NativePopover removeIcon() { if (header != null) { header.removeIcon(); } return this; } - public Popover2 noClose() { + public NativePopover noClose() { this.showClose = false; return this; } - public Popover2 placement(Placement placement) { + public NativePopover placement(Placement placement) { if (verifyEnum(element(), "placement", placement, top, right, bottom, left)) { for (String mod : Placement.modifiers) { classList().remove(mod); @@ -303,11 +304,11 @@ public Popover2 placement(Placement placement) { return this; } - public Popover2 status(Severity severity) { + public NativePopover status(Severity severity) { return status(severity, severity.name() + " popover"); } - public Popover2 status(Severity severity, String screenReaderText) { + public NativePopover status(Severity severity, String screenReaderText) { if (this.severity != null) { element().classList.remove(this.severity.status.modifier()); } @@ -317,28 +318,28 @@ public Popover2 status(Severity severity, String screenReaderText) { return this; } - public Popover2 trigger(String trigger) { + public NativePopover trigger(String trigger) { this.triggerSupplier = () -> Elements.querySelector(document.body, By.selector(trigger)); return this; } - public Popover2 trigger(By trigger) { + public NativePopover trigger(By trigger) { this.triggerSupplier = () -> Elements.querySelector(document.body, trigger); return this; } - public Popover2 trigger(HTMLElement trigger) { + public NativePopover trigger(HTMLElement trigger) { this.triggerSupplier = () -> trigger; return this; } - public Popover2 trigger(Supplier trigger) { + public NativePopover trigger(Supplier trigger) { this.triggerSupplier = trigger; return this; } @Override - public Popover2 that() { + public NativePopover that() { return this; } @@ -347,14 +348,14 @@ public Popover2 that() { /** * Accessible label for the popover, required when header is not present. */ - public Popover2 ariaLabel(String label) { + public NativePopover ariaLabel(String label) { return aria(Aria.label, label); } /** * Accessible label for the close button. */ - public Popover2 ariaCloseLabel(String label) { + public NativePopover ariaCloseLabel(String label) { if (closeButton != null) { closeButton.aria(Aria.label, label); } @@ -364,7 +365,7 @@ public Popover2 ariaCloseLabel(String label) { // ------------------------------------------------------ events @Override - public Popover2 onClose(CloseHandler closeHandler) { + public NativePopover onClose(CloseHandler closeHandler) { if (closeHandler != null) { this.closeHandler.add(closeHandler); } @@ -415,9 +416,9 @@ private void onOutsideClick(Event event) { } } - private Popover2Header failSafeHeader() { + private NativePopoverHeader failSafeHeader() { if (header == null) { - add(popover2Header()); + add(popoverHeader()); } return header; } diff --git a/components/src/main/java/org/patternfly/component/popover/Popover2Body.java b/components/src/main/java/org/patternfly/component/popover/NativePopoverBody.java similarity index 75% rename from components/src/main/java/org/patternfly/component/popover/Popover2Body.java rename to components/src/main/java/org/patternfly/component/popover/NativePopoverBody.java index 990cd53f0..56ff786ed 100644 --- a/components/src/main/java/org/patternfly/component/popover/Popover2Body.java +++ b/components/src/main/java/org/patternfly/component/popover/NativePopoverBody.java @@ -26,30 +26,30 @@ import static org.patternfly.style.Classes.component; import static org.patternfly.style.Classes.popover; -public class Popover2Body extends Popover2SubComponent implements - ElementTextMethods { +public class NativePopoverBody extends NativePopoverSubComponent implements + ElementTextMethods { // ------------------------------------------------------ factory - public static Popover2Body popover2Body() { - return new Popover2Body(); + public static NativePopoverBody popoverBody() { + return new NativePopoverBody(); } // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "p2b"; + public static final String SUB_COMPONENT_NAME = "npb"; final String id; - Popover2Body() { + NativePopoverBody() { super(SUB_COMPONENT_NAME, div().css(component(popover, body)).element()); - id(id = Id.unique(ComponentType.Popover2.id, "body")); + id(id = Id.unique(ComponentType.NativePopover.id, "body")); } // ------------------------------------------------------ builder @Override - public Popover2Body that() { + public NativePopoverBody that() { return this; } } \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/popover/Popover2Footer.java b/components/src/main/java/org/patternfly/component/popover/NativePopoverFooter.java similarity index 76% rename from components/src/main/java/org/patternfly/component/popover/Popover2Footer.java rename to components/src/main/java/org/patternfly/component/popover/NativePopoverFooter.java index 534e42ce5..1702747f8 100644 --- a/components/src/main/java/org/patternfly/component/popover/Popover2Footer.java +++ b/components/src/main/java/org/patternfly/component/popover/NativePopoverFooter.java @@ -24,27 +24,27 @@ import static org.patternfly.style.Classes.footer; import static org.patternfly.style.Classes.popover; -public class Popover2Footer extends Popover2SubComponent implements - ElementTextMethods { +public class NativePopoverFooter extends NativePopoverSubComponent implements + ElementTextMethods { // ------------------------------------------------------ factory - public static Popover2Footer popover2Footer() { - return new Popover2Footer(); + public static NativePopoverFooter popoverFooter() { + return new NativePopoverFooter(); } // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "p2f"; + public static final String SUB_COMPONENT_NAME = "npf"; - Popover2Footer() { + NativePopoverFooter() { super(SUB_COMPONENT_NAME, div().css(component(popover, footer)).element()); } // ------------------------------------------------------ builder @Override - public Popover2Footer that() { + public NativePopoverFooter that() { return this; } } \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/popover/Popover2Header.java b/components/src/main/java/org/patternfly/component/popover/NativePopoverHeader.java similarity index 84% rename from components/src/main/java/org/patternfly/component/popover/Popover2Header.java rename to components/src/main/java/org/patternfly/component/popover/NativePopoverHeader.java index 3cc708b4c..6539303cb 100644 --- a/components/src/main/java/org/patternfly/component/popover/Popover2Header.java +++ b/components/src/main/java/org/patternfly/component/popover/NativePopoverHeader.java @@ -37,27 +37,27 @@ import static org.patternfly.style.Classes.text; import static org.patternfly.style.Classes.title; -public class Popover2Header extends Popover2SubComponent implements - ElementContainerDelegate, - ElementTextDelegate { +public class NativePopoverHeader extends NativePopoverSubComponent implements + ElementContainerDelegate, + ElementTextDelegate { // ------------------------------------------------------ factory - public static Popover2Header popover2Header() { - return new Popover2Header(); + public static NativePopoverHeader popoverHeader() { + return new NativePopoverHeader(); } // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "p2h"; + public static final String SUB_COMPONENT_NAME = "nph"; final String headerId; final HTMLHeadingElement headerElement; private HTMLElement iconContainer; - Popover2Header() { + NativePopoverHeader() { super(SUB_COMPONENT_NAME, header().css(component(popover, Classes.header)).element()); - headerId = Id.unique(ComponentType.Popover2.id, "header"); + headerId = Id.unique(ComponentType.NativePopover.id, "header"); element().appendChild(div().css(component(popover, title)) .id(headerId) .add(headerElement = h(6).css(component(popover, title, text)) @@ -78,7 +78,7 @@ public Element textDelegate() { // ------------------------------------------------------ builder @Override - public Popover2Header that() { + public NativePopoverHeader that() { return this; } diff --git a/components/src/main/java/org/patternfly/component/popover/Popover2SubComponent.java b/components/src/main/java/org/patternfly/component/popover/NativePopoverSubComponent.java similarity index 77% rename from components/src/main/java/org/patternfly/component/popover/Popover2SubComponent.java rename to components/src/main/java/org/patternfly/component/popover/NativePopoverSubComponent.java index 7e9eb8a99..e2ed8eb00 100644 --- a/components/src/main/java/org/patternfly/component/popover/Popover2SubComponent.java +++ b/components/src/main/java/org/patternfly/component/popover/NativePopoverSubComponent.java @@ -21,9 +21,9 @@ import elemental2.dom.HTMLElement; -abstract class Popover2SubComponent> extends SubComponent { +abstract class NativePopoverSubComponent> extends SubComponent { - Popover2SubComponent(String name, E element) { - super(ComponentType.Popover2, name, element); + NativePopoverSubComponent(String name, E element) { + super(ComponentType.NativePopover, name, element); } } \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/tooltip/Tooltip2.java b/components/src/main/java/org/patternfly/component/tooltip/NativeTooltip.java similarity index 85% rename from components/src/main/java/org/patternfly/component/tooltip/Tooltip2.java rename to components/src/main/java/org/patternfly/component/tooltip/NativeTooltip.java index 2eca7b0af..074265bd8 100644 --- a/components/src/main/java/org/patternfly/component/tooltip/Tooltip2.java +++ b/components/src/main/java/org/patternfly/component/tooltip/NativeTooltip.java @@ -77,49 +77,49 @@ * This implementation uses the Popover API and CSS anchor positioning instead of Popper.js. The tooltip uses the browser's * top-layer rendering for correct stacking, eliminating z-index issues. */ -public class Tooltip2 extends BaseComponent implements +public class NativeTooltip extends BaseComponent implements Attachable, - Closeable, - ElementContainerDelegate, - ElementTextDelegate { + Closeable, + ElementContainerDelegate, + ElementTextDelegate { // ------------------------------------------------------ factory - public static Tooltip2 tooltip2() { - return new Tooltip2(null, null); + public static NativeTooltip nativeTooltip() { + return new NativeTooltip(null, null); } - public static Tooltip2 tooltip2(String text) { - return new Tooltip2(null, text); + public static NativeTooltip nativeTooltip(String text) { + return new NativeTooltip(null, text); } - public static Tooltip2 tooltip2(By trigger) { - return new Tooltip2(() -> Elements.querySelector(document.body, trigger), null); + public static NativeTooltip nativeTooltip(By trigger) { + return new NativeTooltip(() -> Elements.querySelector(document.body, trigger), null); } - public static Tooltip2 tooltip2(By trigger, String text) { - return new Tooltip2(() -> Elements.querySelector(document.body, trigger), text); + public static NativeTooltip nativeTooltip(By trigger, String text) { + return new NativeTooltip(() -> Elements.querySelector(document.body, trigger), text); } - public static Tooltip2 tooltip2(HTMLElement trigger) { - return new Tooltip2(() -> trigger, null); + public static NativeTooltip nativeTooltip(HTMLElement trigger) { + return new NativeTooltip(() -> trigger, null); } - public static Tooltip2 tooltip2(HTMLElement trigger, String text) { - return new Tooltip2(() -> trigger, text); + public static NativeTooltip nativeTooltip(HTMLElement trigger, String text) { + return new NativeTooltip(() -> trigger, text); } - public static Tooltip2 tooltip2(Supplier trigger) { - return new Tooltip2(trigger, null); + public static NativeTooltip nativeTooltip(Supplier trigger) { + return new NativeTooltip(trigger, null); } - public static Tooltip2 tooltip2(Supplier trigger, String text) { - return new Tooltip2(trigger, text); + public static NativeTooltip nativeTooltip(Supplier trigger, String text) { + return new NativeTooltip(trigger, text); } // ------------------------------------------------------ instance - private static final Logger logger = Logger.getLogger(Tooltip2.class.getName()); + private static final Logger logger = Logger.getLogger(NativeTooltip.class.getName()); public static final int ENTRY_DELAY = 300; public static final int EXIT_DELAY = 300; @@ -127,7 +127,7 @@ public static Tooltip2 tooltip2(Supplier trigger, String text) { private final String id; private final HTMLElement contentElement; - private final List> closeHandler; + private final List> closeHandler; private Supplier triggerSupplier; private HTMLElement trigger; private boolean visible; @@ -142,8 +142,8 @@ public static Tooltip2 tooltip2(Supplier trigger, String text) { private HandlerRegistration anchorHandlers; private HandlerRegistration scrollHandler; - Tooltip2(Supplier trigger, String text) { - super(ComponentType.Tooltip2, div().css(component(tooltip)) + NativeTooltip(Supplier trigger, String text) { + super(ComponentType.NativeTooltip, div().css(component(tooltip)) .attr(role, Roles.tooltip) .aria(live, "polite") .attr("popover", "manual") @@ -243,59 +243,59 @@ public void detach(MutationRecord mutationRecord) { // ------------------------------------------------------ builder - public Tooltip2 entryDelay(int delay) { + public NativeTooltip entryDelay(int delay) { this.entryDelay = delay; return this; } - public Tooltip2 exitDelay(int delay) { + public NativeTooltip exitDelay(int delay) { this.exitDelay = delay; return this; } - public Tooltip2 distance(int distance) { + public NativeTooltip distance(int distance) { this.distance = distance; return this; } - public Tooltip2 leftAligned() { + public NativeTooltip leftAligned() { contentElement.classList.add(modifier(textAlignLeft)); return this; } - public Tooltip2 placement(Placement placement) { + public NativeTooltip placement(Placement placement) { this.placement = placement; return this; } - public Tooltip2 trigger(String trigger) { + public NativeTooltip trigger(String trigger) { this.triggerSupplier = () -> Elements.querySelector(document.body, By.selector(trigger)); return this; } - public Tooltip2 trigger(By trigger) { + public NativeTooltip trigger(By trigger) { this.triggerSupplier = () -> Elements.querySelector(document.body, trigger); return this; } - public Tooltip2 trigger(HTMLElement trigger) { + public NativeTooltip trigger(HTMLElement trigger) { this.triggerSupplier = () -> trigger; return this; } - public Tooltip2 trigger(Supplier trigger) { + public NativeTooltip trigger(Supplier trigger) { this.triggerSupplier = trigger; return this; } @Override - public Tooltip2 that() { + public NativeTooltip that() { return this; } // ------------------------------------------------------ aria - public Tooltip2 aria(TriggerAria aria) { + public NativeTooltip aria(TriggerAria aria) { this.aria = aria; return this; } @@ -303,7 +303,7 @@ public Tooltip2 aria(TriggerAria aria) { // ------------------------------------------------------ events @Override - public Tooltip2 onClose(CloseHandler closeHandler) { + public NativeTooltip onClose(CloseHandler closeHandler) { if (closeHandler != null) { this.closeHandler.add(closeHandler); } diff --git a/extensions/codeeditor/src/main/java/org/patternfly/extension/codeeditor/CodeEditorAction.java b/extensions/codeeditor/src/main/java/org/patternfly/extension/codeeditor/CodeEditorAction.java index 473b56f84..e351cdc09 100644 --- a/extensions/codeeditor/src/main/java/org/patternfly/extension/codeeditor/CodeEditorAction.java +++ b/extensions/codeeditor/src/main/java/org/patternfly/extension/codeeditor/CodeEditorAction.java @@ -20,7 +20,7 @@ import org.patternfly.component.ComponentIcon; import org.patternfly.component.ComponentType; import org.patternfly.component.button.Button; -import org.patternfly.component.tooltip.Tooltip2; +import org.patternfly.component.tooltip.NativeTooltip; import org.patternfly.core.Aria; import org.patternfly.handler.ComponentHandler; import org.patternfly.icon.PredefinedIcon; @@ -32,7 +32,7 @@ import static org.jboss.elemento.Elements.div; import static org.jboss.elemento.EventType.click; import static org.patternfly.component.button.Button.button; -import static org.patternfly.component.tooltip.Tooltip2.tooltip2; +import static org.patternfly.component.tooltip.NativeTooltip.nativeTooltip; import static org.patternfly.icon.IconSets.fas.copy; public class CodeEditorAction extends CodeEditorSubComponent @@ -62,7 +62,7 @@ public static CodeEditorAction codeEditorCopyToClipboardAction() { public static CodeEditorAction codeEditorCopyToClipboardAction(String copyText, String copiedText) { String copyId = Id.unique(ComponentType.CodeEditor.id, "copy"); - Tooltip2 copyTooltip = tooltip2(By.id(copyId), copyText) + NativeTooltip copyTooltip = nativeTooltip(By.id(copyId), copyText) .onClose((e, t) -> t.text(copyText)); // restore text return new CodeEditorAction(button().id(copyId).icon(copy()).plain()) .ariaLabel(copyText) diff --git a/showcase/src/main/java/org/patternfly/showcase/Snippet.java b/showcase/src/main/java/org/patternfly/showcase/Snippet.java index 6b354ced5..fda7870a8 100644 --- a/showcase/src/main/java/org/patternfly/showcase/Snippet.java +++ b/showcase/src/main/java/org/patternfly/showcase/Snippet.java @@ -21,6 +21,7 @@ import org.jboss.elemento.Id; import org.jboss.elemento.IsElement; import org.patternfly.component.content.Content; +import org.patternfly.component.tooltip.NativeTooltip; import org.patternfly.extension.codeeditor.CodeEditor; import org.patternfly.icon.IconSets; import org.patternfly.style.Classes; @@ -36,7 +37,6 @@ import static org.patternfly.component.content.Content.content; import static org.patternfly.component.content.ContentType.h3; import static org.patternfly.component.content.ContentType.p; -import static org.patternfly.component.tooltip.Tooltip2.tooltip2; import static org.patternfly.core.Aria.hidden; import static org.patternfly.core.Attributes.tabindex; import static org.patternfly.extension.codeeditor.CodeEditor.codeEditor; @@ -114,7 +114,7 @@ public Snippet(String id, String title, Content description, String code, By.classname(component(Classes.codeEditor, main))); setVisible(mainElement, !isVisible(mainElement)); })) - .add(tooltip2(By.id(codeId), "Toggle Java code")) + .add(NativeTooltip.nativeTooltip(By.id(codeId), "Toggle Java code")) .addAction( codeEditorCopyToClipboardAction("Copy code to clipboard", "Code copied") .css("ws-code-editor-control")) @@ -122,7 +122,7 @@ public Snippet(String id, String title, Content description, String code, .id(undoId) .css("ws-code-editor-control") .onClick((event, codeEditorAction) -> undo())) - .add(tooltip2(By.id(undoId), "Undo")))) + .add(NativeTooltip.nativeTooltip(By.id(undoId), "Undo")))) .code(code))) .element(); diff --git a/showcase/src/main/java/org/patternfly/showcase/component/Popover2Component.java b/showcase/src/main/java/org/patternfly/showcase/component/NativePopoverComponent.java similarity index 70% rename from showcase/src/main/java/org/patternfly/showcase/component/Popover2Component.java rename to showcase/src/main/java/org/patternfly/showcase/component/NativePopoverComponent.java index 5efee7133..fe92eace6 100644 --- a/showcase/src/main/java/org/patternfly/showcase/component/Popover2Component.java +++ b/showcase/src/main/java/org/patternfly/showcase/component/NativePopoverComponent.java @@ -20,10 +20,10 @@ import org.jboss.elemento.router.Route; import org.patternfly.component.Severity; import org.patternfly.component.button.Button; -import org.patternfly.component.popover.Popover2; -import org.patternfly.component.popover.Popover2Body; -import org.patternfly.component.popover.Popover2Footer; -import org.patternfly.component.popover.Popover2Header; +import org.patternfly.component.popover.NativePopover; +import org.patternfly.component.popover.NativePopoverBody; +import org.patternfly.component.popover.NativePopoverFooter; +import org.patternfly.component.popover.NativePopoverHeader; import org.patternfly.component.togglegroup.ToggleGroup; import org.patternfly.showcase.LoremIpsum; import org.patternfly.showcase.Snippet; @@ -38,8 +38,8 @@ import static org.patternfly.component.list.ActionList.actionList; import static org.patternfly.component.list.ActionListGroup.actionListGroup; import static org.patternfly.component.list.ActionListItem.actionListItem; -import static org.patternfly.component.popover.Popover2.popover2; -import static org.patternfly.component.popover.Popover2Body.popover2Body; +import static org.patternfly.component.popover.NativePopover.nativePopover; +import static org.patternfly.component.popover.NativePopoverBody.popoverBody; import static org.patternfly.component.togglegroup.ToggleGroup.toggleGroup; import static org.patternfly.component.togglegroup.ToggleGroupItem.toggleGroupItem; import static org.patternfly.icon.IconSets.fas.bullhorn; @@ -55,67 +55,67 @@ import static org.patternfly.showcase.Code.code; import static org.patternfly.showcase.Data.components; -@Route(value = "/components/popover2", title = "Popover2") -public class Popover2Component extends SnippetPage { +@Route(value = "/components/native-popover", title = "Native Popover") +public class NativePopoverComponent extends SnippetPage { - public Popover2Component() { - super(components.get("popover2")); + public NativePopoverComponent() { + super(components.get("native-tooltip")); startExamples(); - addSnippet(new Snippet("popover2-basic", "Basic", - code("popover2-basic"), () -> - // @code-start:popover2-basic + addSnippet(new Snippet("np-basic", "Basic", + code("np-basic"), () -> + // @code-start:np-basic div().style("margin", "50px") .add(button("Toggle popover").primary() - .id("popover2-basic-button")) - .add(popover2(By.id("popover2-basic-button")) + .id("np-basic-button")) + .add(nativePopover(By.id("np-basic-button")) .ariaLabel("Basic popover") .addHeader("Popover header") .addBody("Popovers are triggered by click rather than hover.") .addFooter("Popover footer")) .element() - // @code-end:popover2-basic + // @code-end:np-basic )); - addSnippet(new Snippet("popover2-placements", "Placements", - code("popover2-placements"), () -> - // @code-start:popover2-placements + addSnippet(new Snippet("np-placements", "Placements", + code("np-placements"), () -> + // @code-start:np-placements div().style("display: flex; gap: 16px") .add(button("Bottom").secondary() - .id("popover2-bottom-button")) - .add(popover2(By.id("popover2-bottom-button")) + .id("nt-placements-bottom-button")) + .add(nativePopover(By.id("nt-placements-bottom-button")) .placement(bottom) .ariaLabel("Bottom popover") .addHeader("Bottom popover") .addBody("This popover is placed at the bottom.") .addFooter("Popover footer")) .add(button("Left").secondary() - .id("popover2-left-button")) - .add(popover2(By.id("popover2-left-button")) + .id("nt-placements-left-button")) + .add(nativePopover(By.id("nt-placements-left-button")) .placement(left) .ariaLabel("Left popover") .addHeader("Left popover") .addBody("This popover is placed on the left.") .addFooter("Popover footer")) .add(button("Right").secondary() - .id("popover2-right-button")) - .add(popover2(By.id("popover2-right-button")) + .id("nt-placements-right-button")) + .add(nativePopover(By.id("nt-placements-right-button")) .placement(right) .ariaLabel("Right popover") .addHeader("Right popover") .addBody("This popover is placed on the right.") .addFooter("Popover footer")) .element() - // @code-end:popover2-placements + // @code-end:np-placements )); - addSnippet(new Snippet("popover2-close", "Close popover", - code("popover2-close"), () -> { - // @code-start:popover2-close - Popover2 popover = popover2(By.id("popover2-close-button")); + addSnippet(new Snippet("np-close", "Close popover", + code("np-close"), () -> { + // @code-start:np-close + NativePopover popover = nativePopover(By.id("np-close-button")); popover.ariaLabel("Popover with button in the body that can close it") .addHeader("Popover header") - .addBody(popover2Body() + .addBody(popoverBody() .add(div() .add(div() .add("A controlled popover can be closed by calling its ") @@ -128,46 +128,46 @@ public Popover2Component() { return div().style("margin", "50px") .add(button("Toggle popover").primary() - .id("popover2-close-button")) + .id("np-close-button")) .add(popover) .element(); - // @code-end:popover2-close + // @code-end:np-close })); - addSnippet(new Snippet("popover2-no-padding", "Without header/footer/close and no padding", - code("popover2-no-padding"), () -> - // @code-start:popover2-no-padding + addSnippet(new Snippet("np-no-padding", "Without header/footer/close and no padding", + code("np-no-padding"), () -> + // @code-start:np-no-padding div().style("margin", "50px") .add(button("Toggle popover").primary() - .id("popover2-no-padding-button")) - .add(popover2(By.id("popover2-no-padding-button")) + .id("np-no-padding-button")) + .add(nativePopover(By.id("np-no-padding-button")) .noClose() .noPadding() .ariaLabel("Popover with no header, footer, close button, and padding") .addBody( "This popover has no padding and is intended for use with content that has its own spacing and should touch the edges of the popover container.")) .element() - // @code-end:popover2-no-padding + // @code-end:np-no-padding )); - addSnippet(new Snippet("popover2-auto-width", "Width auto", - code("popover2-auto-width"), () -> - // @code-start:popover2-auto-width + addSnippet(new Snippet("np-auto-width", "Width auto", + code("np-auto-width"), () -> + // @code-start:np-auto-width div().style("margin", "50px") .add(button("Toggle popover").primary() - .id("popover2-auto-width-button")) - .add(popover2(By.id("popover2-auto-width-button")) + .id("np-auto-width-button")) + .add(nativePopover(By.id("np-auto-width-button")) .autoWidth() .ariaLabel("Popover with auto-width.") .addBody("Removes fixed-width and allows width to be defined by contents.")) .element() - // @code-end:popover2-auto-width + // @code-end:np-auto-width )); - addSnippet(new Snippet("popover2-auto-placement", "Auto placement", + addSnippet(new Snippet("np-auto-placement", "Auto placement", "You might need to resize the browser window to a minimum to see the auto placement in action.", - code("popover2-auto-placement"), () -> { - // @code-start:popover2-auto-placement + code("np-auto-placement"), () -> { + // @code-start:np-auto-placement Button button = button("Toggle popover"); onAttach(button, mr -> { ScrollIntoViewOptions options = ScrollIntoViewOptions.create(); @@ -176,7 +176,7 @@ public Popover2Component() { button.element().scrollIntoView(options); }); - Popover2 popover = popover2(By.id("popover2-auto-placement-button")); + NativePopover popover = nativePopover(By.id("np-auto-placement-button")); ToggleGroup toggleGroup = toggleGroup(single) .addItem(toggleGroupItem("left", "left").onClick((e, t) -> popover.placement(left))) .addItem(toggleGroupItem("top", "top").onClick((e, t) -> popover.placement(top))) @@ -191,7 +191,7 @@ public Popover2Component() { .add(div().style("width", "720px") .add(div().css("pfj-popover-box") .add(button.css("pfj-popover-button").primary() - .id("popover2-auto-placement-button")) + .id("np-auto-placement-button")) .add(popover .placement(auto) .ariaLabel("Advanced popover") @@ -199,74 +199,74 @@ public Popover2Component() { .addBody(LoremIpsum.words(20)) .addFooter("Popover footer"))))) .element(); - // @code-end:popover2-auto-placement + // @code-end:np-auto-placement })); - addSnippet(new Snippet("popover2-icon", "Popover with icon in the title", - code("popover2-icon"), () -> - // @code-start:popover2-icon + addSnippet(new Snippet("np-icon", "Popover with icon in the title", + code("np-icon"), () -> + // @code-start:np-icon div().style("margin", "50px") .add(button("Toggle popover").primary() - .id("popover2-icon-button")) - .add(popover2(By.id("popover2-icon-button")) + .id("np-icon-button")) + .add(nativePopover(By.id("np-icon-button")) .icon(bullhorn()) .ariaLabel("Popover with icon in the title example.") .addHeader("Popover with icon") .addBody(LoremIpsum.words(20)) .addFooter("Popover footer")) .element() - // @code-end:popover2-icon + // @code-end:np-icon )); - addSnippet(new Snippet("popover2-alert", "Alert popover", - code("popover2-alert"), () -> { - // @code-start:popover2-alert + addSnippet(new Snippet("np-alert", "Alert popover", + code("np-alert"), () -> { + // @code-start:np-alert return div().style("margin", "50px") .add(actionList() .addItem(actionListGroup() .addItem(actionListItem() - .add(button("Custom").secondary().id("popover2-alert-custom"))) + .add(button("Custom").secondary().id("np-alert-custom"))) .addItem(actionListItem() - .add(button("Info").secondary().id("popover2-alert-info"))) + .add(button("Info").secondary().id("np-alert-info"))) .addItem(actionListItem() - .add(button("Success").secondary().id("popover2-alert-success"))) + .add(button("Success").secondary().id("np-alert-success"))) .addItem(actionListItem() - .add(button("Warning").warning().id("popover2-alert-warning"))) + .add(button("Warning").warning().id("np-alert-warning"))) .addItem(actionListItem() - .add(button("Danger").danger().id("popover2-alert-danger"))))) - .add(popover2(By.id("popover2-alert-custom")) + .add(button("Danger").danger().id("np-alert-danger"))))) + .add(nativePopover(By.id("np-alert-custom")) .status(Severity.custom) .addHeader("Popover custom header") .addBody(LoremIpsum.words(20)) .addFooter("Popover footer")) - .add(popover2(By.id("popover2-alert-info")) + .add(nativePopover(By.id("np-alert-info")) .status(Severity.info) .addHeader("Popover info header") .addBody(LoremIpsum.words(20)) .addFooter("Popover footer")) - .add(popover2(By.id("popover2-alert-success")) + .add(nativePopover(By.id("np-alert-success")) .status(Severity.success) .addHeader("Popover success header") .addBody(LoremIpsum.words(20)) .addFooter("Popover footer")) - .add(popover2(By.id("popover2-alert-warning")) + .add(nativePopover(By.id("np-alert-warning")) .status(Severity.warning) .addHeader("Popover warning header") .addBody(LoremIpsum.words(20)) .addFooter("Popover footer")) - .add(popover2(By.id("popover2-alert-danger")) + .add(nativePopover(By.id("np-alert-danger")) .status(Severity.danger) .addHeader("Popover danger header") .addBody(LoremIpsum.words(20)) .addFooter("Popover footer")) .element(); - // @code-end:popover2-alert + // @code-end:np-alert })); - startApiDocs(Popover2.class); - addApiDoc(Popover2.class, component); - addApiDoc(Popover2Body.class, subcomponent); - addApiDoc(Popover2Footer.class, subcomponent); - addApiDoc(Popover2Header.class, subcomponent); + startApiDocs(NativePopover.class); + addApiDoc(NativePopover.class, component); + addApiDoc(NativePopoverBody.class, subcomponent); + addApiDoc(NativePopoverFooter.class, subcomponent); + addApiDoc(NativePopoverHeader.class, subcomponent); } } diff --git a/showcase/src/main/java/org/patternfly/showcase/component/Tooltip2Component.java b/showcase/src/main/java/org/patternfly/showcase/component/NativeTooltipComponent.java similarity index 62% rename from showcase/src/main/java/org/patternfly/showcase/component/Tooltip2Component.java rename to showcase/src/main/java/org/patternfly/showcase/component/NativeTooltipComponent.java index 95381239a..484fad762 100644 --- a/showcase/src/main/java/org/patternfly/showcase/component/Tooltip2Component.java +++ b/showcase/src/main/java/org/patternfly/showcase/component/NativeTooltipComponent.java @@ -18,7 +18,7 @@ import org.jboss.elemento.By; import org.jboss.elemento.router.Route; import org.patternfly.component.button.Button; -import org.patternfly.component.tooltip.Tooltip2; +import org.patternfly.component.tooltip.NativeTooltip; import org.patternfly.component.tooltip.TriggerAria; import org.patternfly.showcase.LoremIpsum; import org.patternfly.showcase.Snippet; @@ -29,7 +29,6 @@ import static org.jboss.elemento.Elements.div; import static org.jboss.elemento.Elements.onAttach; import static org.patternfly.component.button.Button.button; -import static org.patternfly.component.tooltip.Tooltip2.tooltip2; import static org.patternfly.popper.Placement.auto; import static org.patternfly.popper.Placement.bottom; import static org.patternfly.popper.Placement.left; @@ -39,65 +38,65 @@ import static org.patternfly.showcase.Code.code; import static org.patternfly.showcase.Data.components; -@Route(value = "/components/tooltip2", title = "Tooltip2") -public class Tooltip2Component extends SnippetPage { +@Route(value = "/components/native-tooltip", title = "Native Tooltip") +public class NativeTooltipComponent extends SnippetPage { - public Tooltip2Component() { - super(components.get("tooltip2")); + public NativeTooltipComponent() { + super(components.get("native-tooltip")); startExamples(); - addSnippet(new Snippet("tooltip2-basic", "Basic", - code("tooltip2-basic"), () -> - // @code-start:tooltip2-basic + addSnippet(new Snippet("nt-basic", "Basic", + code("nt-basic"), () -> + // @code-start:nt-basic div().style("margin", "100px") .add(button("I have a tooltip").primary() - .id("tooltip2-basic-button")) - .add(tooltip2(By.id("tooltip2-basic-button"), LoremIpsum.words())) + .id("nt-basic-button")) + .add(NativeTooltip.nativeTooltip(By.id("nt-basic-button"), LoremIpsum.words())) .element() - // @code-end:tooltip2-basic + // @code-end:nt-basic )); - addSnippet(new Snippet("tooltip2-dynamic", "Dynamic content", - code("tooltip2-dynamic"), + addSnippet(new Snippet("nt-dynamic", "Dynamic content", + code("nt-dynamic"), () -> { - // @code-start:tooltip2-dynamic - Tooltip2 tooltip = tooltip2(By.id("tooltip2-dynamic-button"), "Copy to clipboard") + // @code-start:nt-dynamic + NativeTooltip tooltip = NativeTooltip.nativeTooltip(By.id("nt-dynamic-button"), "Copy to clipboard") .onClose((e, t) -> t.text("Copy to clipboard")); return div().style("margin", "100px") .add(button("Copy to clipboard").primary() - .id("tooltip2-dynamic-button") + .id("nt-dynamic-button") .onClick((e, b) -> tooltip.text("Successfully copied to clipboard!"))) .add(tooltip) .element(); - // @code-end:tooltip2-dynamic + // @code-end:nt-dynamic })); - addSnippet(new Snippet("tooltip2-placements", "Placements", - code("tooltip2-placements"), + addSnippet(new Snippet("nt-placements", "Placements", + code("nt-placements"), () -> - // @code-start:tooltip2-placements + // @code-start:nt-placements div().style("display: flex; gap: 16px") .add(button("Bottom").secondary() - .id("tooltip2-bottom-button")) - .add(tooltip2(By.id("tooltip2-bottom-button"), "Bottom tooltip") + .id("nt-placements-bottom-button")) + .add(NativeTooltip.nativeTooltip(By.id("nt-placements-bottom-button"), "Bottom tooltip") .placement(bottom)) .add(button("Left").secondary() - .id("tooltip2-left-button")) - .add(tooltip2(By.id("tooltip2-left-button"), "Left tooltip") + .id("nt-placements-left-button")) + .add(NativeTooltip.nativeTooltip(By.id("nt-placements-left-button"), "Left tooltip") .placement(left)) .add(button("Right").secondary() - .id("tooltip2-right-button")) - .add(tooltip2(By.id("tooltip2-right-button"), "Right tooltip") + .id("nt-placements-right-button")) + .add(NativeTooltip.nativeTooltip(By.id("nt-placements-right-button"), "Right tooltip") .placement(right)) .element() - // @code-end:tooltip2-placements + // @code-end:nt-placements )); - addSnippet(new Snippet("tooltip2-auto", "Auto placement", + addSnippet(new Snippet("nt-auto", "Auto placement", "You might need to resize the browser window to a minimum to see the auto placement in action.", - code("tooltip2-auto"), + code("nt-auto"), () -> { - // @code-start:tooltip2-auto + // @code-start:nt-auto Button button = button("Tooltip"); onAttach(button, mr -> { ScrollIntoViewOptions options = ScrollIntoViewOptions.create(); @@ -108,15 +107,15 @@ public Tooltip2Component() { return div().style("width", "720px") .add(div().css("pfj-tooltip-box") .add(button.css("pfj-tooltip-button").primary() - .id("tooltip2-auto-button")) - .add(tooltip2(By.id("tooltip2-auto-button"), LoremIpsum.words()) + .id("nt-auto-button")) + .add(NativeTooltip.nativeTooltip(By.id("nt-auto-button"), LoremIpsum.words()) .placement(auto))) .element(); - // @code-end:tooltip2-auto + // @code-end:nt-auto })); - startApiDocs(Tooltip2.class); - addApiDoc(Tooltip2.class, component); + startApiDocs(NativeTooltip.class); + addApiDoc(NativeTooltip.class, component); addApiDoc(TriggerAria.class, other); } } diff --git a/showcase/src/main/resources/org/patternfly/showcase/components.json b/showcase/src/main/resources/org/patternfly/showcase/components.json index d15958550..5b6aedc78 100644 --- a/showcase/src/main/resources/org/patternfly/showcase/components.json +++ b/showcase/src/main/resources/org/patternfly/showcase/components.json @@ -385,6 +385,22 @@ "illustration": "modal.png", "summary": "A modal is a window that overlays a page to display important information, without requiring users to navigate to a new page." }, + "native-popover": { + "name": "native-popover", + "title": "Native Popover", + "route": "/components/native-popover", + "clazz": "org.patternfly.component.popover.NativePopover", + "illustration": "popover.png", + "summary": "A popover using the Popover API and CSS anchor positioning instead of Popper.js." + }, + "native-tooltip": { + "name": "native-tooltip", + "title": "Native Tooltip", + "route": "/components/native-tooltip", + "clazz": "org.patternfly.component.tooltip.NativeTooltip", + "illustration": "tooltip.png", + "summary": "A tooltip using the Popover API and CSS anchor positioning instead of Popper.js." + }, "navigation": { "name": "navigation", "title": "Navigation", @@ -469,14 +485,6 @@ "illustration": "popover.png", "summary": "A popover is a small overlay window that provides additional information about an on-screen element." }, - "popover2": { - "name": "popover2", - "title": "Popover2", - "route": "/components/popover2", - "clazz": "org.patternfly.component.popover.Popover2", - "illustration": "popover.png", - "summary": "A popover using the Popover API and CSS anchor positioning instead of Popper.js." - }, "progress-stepper": { "name": "progress-stepper", "title": "Progress stepper", @@ -665,14 +673,6 @@ "illustration": "tooltip.png", "summary": "A tooltip is a small, temporary, overlay window that provides additional information about an on-screen element." }, - "tooltip2": { - "name": "tooltip2", - "title": "Tooltip2", - "route": "/components/tooltip2", - "clazz": "org.patternfly.component.tooltip.Tooltip2", - "illustration": "tooltip.png", - "summary": "A tooltip using the Popover API and CSS anchor positioning instead of Popper.js. Added as a child of the trigger element for automatic lifecycle management." - }, "tree-view": { "name": "tree-view", "title": "Tree view", From 0e92177f198eea3be71a51ab409c2b5751e11ffa Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 26 Mar 2026 23:21:51 +0100 Subject: [PATCH 072/430] Prepare next release --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 93844388c..cb32e208b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ### Added -- Add popover and tooltip components based on the native [popover API](https://developer.mozilla.org/en-US/docs/Web/API/Popover_API) and [CSS anchor positioning](https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Anchor_positioning). +- Add native popover and tooltip components based on the [popover API](https://developer.mozilla.org/en-US/docs/Web/API/Popover_API) and [CSS anchor positioning](https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Anchor_positioning). ### Fixed @@ -18,7 +18,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ### Added -- Make finder column and preview responsive using container queries +- Make the finder column and preview responsive using container queries ## [0.6.14] - 2026-03-24 From 1a2937792ab773e99a1742e1f6ac56337d06f030 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 26 Mar 2026 23:22:28 +0100 Subject: [PATCH 073/430] Release 0.6.16 --- CHANGELOG.md | 5 ++++- README.md | 2 +- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 22 files changed, 25 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cb32e208b..389c5c293 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +## [0.6.16] - 2026-03-26 + ### Added - Add native popover and tooltip components based on the [popover API](https://developer.mozilla.org/en-US/docs/Web/API/Popover_API) and [CSS anchor positioning](https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Anchor_positioning). @@ -857,7 +859,8 @@ Stay tuned for more to come... - for dependency upgrades --> -[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.15...HEAD +[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.16...HEAD +[0.6.16]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.15...v0.6.16 [0.6.15]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.14...v0.6.15 [0.6.14]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.13...v0.6.14 [0.6.13]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.12...v0.6.13 diff --git a/README.md b/README.md index acd57b44f..38b6656be 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.15 + 0.6.16 pom import diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 5ef42659b..aec3a5b4c 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.16-SNAPSHOT + 0.6.16 ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 70a0f3673..1a2e44fa8 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.16-SNAPSHOT + 0.6.16 pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index 6e31d9075..9fe757179 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.16-SNAPSHOT + 0.6.16 ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 6a7c296f7..94bff7529 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.16-SNAPSHOT", + "version": "0.6.16", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 9340213cf..176b1f3bc 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.16-SNAPSHOT + 0.6.16 ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index ecb167e2a..14a18c0d1 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.16-SNAPSHOT + 0.6.16 ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 4b04eea87..e1d2d1677 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.16-SNAPSHOT + 0.6.16 ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index e0aba1157..3241b839e 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.16-SNAPSHOT", + "version": "0.6.16", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 4d7c8a113..8ccf48d2c 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.16-SNAPSHOT + 0.6.16 ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 3ab558387..a21da06c5 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.16-SNAPSHOT + 0.6.16 ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index ee0213834..059d55437 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.16-SNAPSHOT", + "version": "0.6.16", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index a50a8e26b..ccf1eaad8 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.16-SNAPSHOT + 0.6.16 ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index b22c42d05..36422f521 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.16-SNAPSHOT + 0.6.16 ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index d5d6c8c9e..19e7c4bdf 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.16-SNAPSHOT + 0.6.16 ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 36e874450..5664ba4de 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.16-SNAPSHOT + 0.6.16 ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 4bed5c46e..a35aeda98 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.16-SNAPSHOT + 0.6.16 ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index ba12b3ecc..3f37ece76 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.16-SNAPSHOT + 0.6.16 pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index f7577c5ea..b1f16af47 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.16-SNAPSHOT + 0.6.16 ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index a09c62902..0dfd201f9 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.16-SNAPSHOT + 0.6.16 pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 8dbf7a00a..41edd5920 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.16-SNAPSHOT + 0.6.16 ../code-parent/pom.xml From 9713d6bde6fc1cf54013a4bffb04c22e8cb0457e Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 26 Mar 2026 23:22:37 +0100 Subject: [PATCH 074/430] Next is 0.6.17 --- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apidoc/pom.xml b/apidoc/pom.xml index aec3a5b4c..1955784d9 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.16 + 0.6.17-SNAPSHOT ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 1a2e44fa8..a6ec09f5e 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.16 + 0.6.17-SNAPSHOT pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index 9fe757179..1752405dd 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.16 + 0.6.17-SNAPSHOT ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 94bff7529..3afba1876 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.16", + "version": "0.6.17-SNAPSHOT", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 176b1f3bc..d4199de05 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.16 + 0.6.17-SNAPSHOT ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 14a18c0d1..08b26365a 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.16 + 0.6.17-SNAPSHOT ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index e1d2d1677..682d1bd50 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.16 + 0.6.17-SNAPSHOT ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 3241b839e..3c46c5cb2 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.16", + "version": "0.6.17-SNAPSHOT", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 8ccf48d2c..c51c28457 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.16 + 0.6.17-SNAPSHOT ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index a21da06c5..eca6061de 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.16 + 0.6.17-SNAPSHOT ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 059d55437..f1217072c 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.16", + "version": "0.6.17-SNAPSHOT", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index ccf1eaad8..f9cb2d1ba 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.16 + 0.6.17-SNAPSHOT ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 36422f521..c0b32584b 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.16 + 0.6.17-SNAPSHOT ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index 19e7c4bdf..a062911ff 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.16 + 0.6.17-SNAPSHOT ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 5664ba4de..749a5c708 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.16 + 0.6.17-SNAPSHOT ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index a35aeda98..a6ff56ca6 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.16 + 0.6.17-SNAPSHOT ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 3f37ece76..90f383d47 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.16 + 0.6.17-SNAPSHOT pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index b1f16af47..6555782b6 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.16 + 0.6.17-SNAPSHOT ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 0dfd201f9..31c46bcdd 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.16 + 0.6.17-SNAPSHOT pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 41edd5920..92d4af0fa 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.16 + 0.6.17-SNAPSHOT ../code-parent/pom.xml From fc1b86303bac915527b3235fb21ed4372ddb89a7 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Fri, 27 Mar 2026 14:46:42 +0100 Subject: [PATCH 075/430] Move common code of NativeTooltip and NativePopover to NativeAnchor --- .../component/popover/NativePopover.java | 59 +++------ .../component/tooltip/NativeTooltip.java | 103 ++++++--------- core/npm/core.css | 56 ++++---- .../org/patternfly/popover/NativeAnchor.java | 121 ++++++++++++++++++ .../org/patternfly/popover/package-info.java | 25 ++++ core/src/main/module.gwt.xml | 1 + .../component/NativePopoverComponent.java | 2 +- showcase/src/web/main.js | 2 +- 8 files changed, 236 insertions(+), 133 deletions(-) create mode 100644 core/src/main/java/org/patternfly/popover/NativeAnchor.java create mode 100644 core/src/main/java/org/patternfly/popover/package-info.java diff --git a/components/src/main/java/org/patternfly/component/popover/NativePopover.java b/components/src/main/java/org/patternfly/component/popover/NativePopover.java index 41e6da99f..ded503727 100644 --- a/components/src/main/java/org/patternfly/component/popover/NativePopover.java +++ b/components/src/main/java/org/patternfly/component/popover/NativePopover.java @@ -33,6 +33,7 @@ import org.patternfly.component.button.Button; import org.patternfly.core.Aria; import org.patternfly.handler.CloseHandler; +import org.patternfly.popover.NativeAnchor; import org.patternfly.popper.Placement; import org.patternfly.style.Modifiers.NoPadding; @@ -109,15 +110,11 @@ public static NativePopover nativePopover(Supplier trigger) { public static final int DISTANCE = 20; - private final String id; + private final NativeAnchor anchor; private final HTMLElement contentElement; private final List> closeHandler; - private Supplier triggerSupplier; - private HTMLElement trigger; private boolean visible; private boolean showClose; - private int distance; - // private Placement placement; private Severity severity; private Button closeButton; private NativePopoverHeader header; @@ -131,13 +128,11 @@ public static NativePopover nativePopover(Supplier trigger) { .attr("popover", "manual") .element()); - this.id = Id.unique(componentType().id); - this.triggerSupplier = trigger; + String id = Id.unique(componentType().id); + this.anchor = new NativeAnchor(id, DISTANCE, element(), trigger); this.closeHandler = new ArrayList<>(); this.visible = false; this.showClose = true; - this.distance = DISTANCE; - // this.placement = top; String bodyId = Id.unique(componentType().id, "body"); element().appendChild(div().css(component(popover, arrow)).element()); @@ -155,23 +150,12 @@ public void attach(MutationRecord mutationRecord) { failSafeRemoveFromParent(closeButton); } - if (triggerSupplier != null) { - trigger = triggerSupplier.get(); - if (trigger != null) { - // CSS anchor positioning - String anchorName = "--" + id; - trigger.style.setProperty("anchor-name", anchorName); - style("position-anchor", anchorName); - style("margin", distance + "px"); - - // placement - // applyPlacement(placement); - - // click trigger: toggle on click - triggerHandlers = bind(trigger, click, this::togglePopover); - } else { - logger.error("Unable to find trigger element for popover %o", element()); - } + HTMLElement trigger = anchor.attach(); + if (trigger != null) { + // click trigger: toggle on click + triggerHandlers = bind(trigger, click, this::togglePopover); + } else if (anchor.hasTriggerSupplier()) { + logger.error("Unable to find trigger element for popover %o", element()); } else { logger.error("No trigger element defined for popover %o", element()); } @@ -189,10 +173,7 @@ public void detach(MutationRecord mutationRecord) { if (triggerHandlers != null) { triggerHandlers.removeHandler(); } - if (trigger != null) { - trigger.style.removeProperty("anchor-name"); - trigger = null; - } + anchor.detach(); } // ------------------------------------------------------ add @@ -270,7 +251,7 @@ public NativePopover closable(CloseHandler closeHandler) { } public NativePopover distance(int distance) { - this.distance = distance; + anchor.distance(distance); return this; } @@ -296,10 +277,7 @@ public NativePopover noClose() { public NativePopover placement(Placement placement) { if (verifyEnum(element(), "placement", placement, top, right, bottom, left)) { - for (String mod : Placement.modifiers) { - classList().remove(mod); - } - classList().add(placement.modifier); + anchor.applyPlacement(placement); } return this; } @@ -319,22 +297,22 @@ public NativePopover status(Severity severity, String screenReaderText) { } public NativePopover trigger(String trigger) { - this.triggerSupplier = () -> Elements.querySelector(document.body, By.selector(trigger)); + anchor.trigger(trigger); return this; } public NativePopover trigger(By trigger) { - this.triggerSupplier = () -> Elements.querySelector(document.body, trigger); + anchor.trigger(trigger); return this; } public NativePopover trigger(HTMLElement trigger) { - this.triggerSupplier = () -> trigger; + anchor.trigger(trigger); return this; } public NativePopover trigger(Supplier trigger) { - this.triggerSupplier = trigger; + anchor.trigger(trigger); return this; } @@ -375,7 +353,7 @@ public NativePopover onClose(CloseHandler closeHandler) { // ------------------------------------------------------ api public void show() { - if (!visible && trigger != null) { + if (!visible && anchor.trigger() != null) { element().showPopover(); visible = true; outsideClickHandler = bind(document, click.name, this::onOutsideClick); @@ -408,6 +386,7 @@ private void togglePopover(Event event) { } private void onOutsideClick(Event event) { + HTMLElement trigger = anchor.trigger(); if (visible && trigger != null) { Element target = (Element) event.target; if (!element().contains(target) && !trigger.contains(target)) { diff --git a/components/src/main/java/org/patternfly/component/tooltip/NativeTooltip.java b/components/src/main/java/org/patternfly/component/tooltip/NativeTooltip.java index 074265bd8..0be506d5c 100644 --- a/components/src/main/java/org/patternfly/component/tooltip/NativeTooltip.java +++ b/components/src/main/java/org/patternfly/component/tooltip/NativeTooltip.java @@ -32,6 +32,7 @@ import org.patternfly.component.ComponentType; import org.patternfly.core.Roles; import org.patternfly.handler.CloseHandler; +import org.patternfly.popover.NativeAnchor; import org.patternfly.popper.Placement; import elemental2.dom.DOMRect; @@ -126,12 +127,10 @@ public static NativeTooltip nativeTooltip(Supplier trigger, String public static final int DISTANCE = 15; private final String id; + private final NativeAnchor anchor; private final HTMLElement contentElement; private final List> closeHandler; - private Supplier triggerSupplier; - private HTMLElement trigger; private boolean visible; - private int distance; private int entryDelay; private int exitDelay; private double showTimeout; @@ -150,10 +149,9 @@ public static NativeTooltip nativeTooltip(Supplier trigger, String .element()); this.id = Id.unique(componentType().id); - this.triggerSupplier = trigger; + this.anchor = new NativeAnchor(id, DISTANCE, element(), trigger); this.closeHandler = new ArrayList<>(); this.visible = false; - this.distance = DISTANCE; this.entryDelay = ENTRY_DELAY; this.exitDelay = EXIT_DELAY; this.placement = auto; @@ -183,37 +181,29 @@ public Element textDelegate() { @Override public void attach(MutationRecord mutationRecord) { - if (triggerSupplier != null) { - trigger = triggerSupplier.get(); - if (trigger != null) { - // CSS anchor positioning - String anchorName = "--" + id; - trigger.style.setProperty("anchor-name", anchorName); - style("position-anchor", anchorName); - style("margin", distance + "px"); - - // top is the default for auto and recalculated on show() - applyPlacement(placement == auto ? top : placement); - - // event listeners on trigger - triggerHandlers = compose( - bind(trigger, mouseenter, this::scheduleShow), - bind(trigger, mouseleave, this::scheduleHide), - bind(trigger, focusin, this::scheduleShow), - bind(trigger, focusout, this::scheduleHide)); - - // event listeners on tooltip itself: - // hovering into the tooltip cancels the hide timer, - // hovering out of the tooltip schedules hide - anchorHandlers = compose( - bind(element(), mouseenter, this::cancelTimers), - bind(element(), mouseleave, this::scheduleHide)); - - // hide tooltip immediately on scroll to prevent jump artifacts - scrollHandler = bind(window, scroll.name, this::hideOnScroll); - } else { - logger.error("Unable to find trigger element for tooltip %o", element()); - } + HTMLElement trigger = anchor.attach(); + if (trigger != null) { + // top is the default for auto and recalculated on show() + anchor.applyPlacement(placement == auto ? top : placement); + + // event listeners on trigger + triggerHandlers = compose( + bind(trigger, mouseenter, this::scheduleShow), + bind(trigger, mouseleave, this::scheduleHide), + bind(trigger, focusin, this::scheduleShow), + bind(trigger, focusout, this::scheduleHide)); + + // event listeners on tooltip itself: + // hovering into the tooltip cancels the hide timer, + // hovering out of the tooltip schedules hide + anchorHandlers = compose( + bind(element(), mouseenter, this::cancelTimers), + bind(element(), mouseleave, this::scheduleHide)); + + // hide tooltip immediately on scroll to prevent jump artifacts + scrollHandler = bind(window, scroll.name, this::hideOnScroll); + } else if (anchor.hasTriggerSupplier()) { + logger.error("Unable to find trigger element for tooltip %o", element()); } else { logger.error("No trigger element defined for tooltip %o", element()); } @@ -235,10 +225,7 @@ public void detach(MutationRecord mutationRecord) { if (triggerHandlers != null) { triggerHandlers.removeHandler(); } - if (trigger != null) { - trigger.style.removeProperty("anchor-name"); - trigger = null; - } + anchor.detach(); } // ------------------------------------------------------ builder @@ -254,7 +241,7 @@ public NativeTooltip exitDelay(int delay) { } public NativeTooltip distance(int distance) { - this.distance = distance; + anchor.distance(distance); return this; } @@ -269,22 +256,22 @@ public NativeTooltip placement(Placement placement) { } public NativeTooltip trigger(String trigger) { - this.triggerSupplier = () -> Elements.querySelector(document.body, By.selector(trigger)); + anchor.trigger(trigger); return this; } public NativeTooltip trigger(By trigger) { - this.triggerSupplier = () -> Elements.querySelector(document.body, trigger); + anchor.trigger(trigger); return this; } public NativeTooltip trigger(HTMLElement trigger) { - this.triggerSupplier = () -> trigger; + anchor.trigger(trigger); return this; } public NativeTooltip trigger(Supplier trigger) { - this.triggerSupplier = trigger; + anchor.trigger(trigger); return this; } @@ -317,14 +304,15 @@ public void show() { } public void show(Event event) { + HTMLElement trigger = anchor.trigger(); if (!visible && trigger != null) { // Show invisibly to get measurable dimensions, calculate placement, then reveal style("visibility", "hidden"); element().showPopover(); - applyPlacement(bestPlacement(placement)); + anchor.applyPlacement(bestPlacement(placement)); element().style.removeProperty("visibility"); visible = true; - if (aria != none && trigger != null) { + if (aria != none) { trigger.setAttribute(aria.attribute, id); } } @@ -336,6 +324,7 @@ public void close(Event event, boolean fireEvent) { if (visible) { element().hidePopover(); visible = false; + HTMLElement trigger = anchor.trigger(); if (aria != none && trigger != null) { trigger.removeAttribute(aria.attribute); } @@ -373,17 +362,8 @@ private void cancelTimers(Event event) { clearTimeout(hideTimeout); } - private void applyPlacement(Placement p) { - for (String mod : Placement.modifiers) { - classList().remove(mod); - } - if (p.modifier != null && !p.modifier.isEmpty()) { - classList().add(p.modifier); - } - } - private Placement bestPlacement(Placement preferred) { - DOMRect triggerRect = trigger.getBoundingClientRect(); + DOMRect triggerRect = anchor.trigger().getBoundingClientRect(); DOMRect tooltipRect = element().getBoundingClientRect(); double above = triggerRect.top; double below = window.innerHeight - triggerRect.bottom; @@ -391,10 +371,11 @@ private Placement bestPlacement(Placement preferred) { double toRight = window.innerWidth - triggerRect.right; // Check which directions have enough space for the tooltip - boolean topFits = above >= tooltipRect.height + distance; - boolean bottomFits = below >= tooltipRect.height + distance; - boolean leftFits = toLeft >= tooltipRect.width / 3 + distance; - boolean rightFits = toRight >= tooltipRect.width / 3 + distance; + int d = anchor.distance(); + boolean topFits = above >= tooltipRect.height + d; + boolean bottomFits = below >= tooltipRect.height + d; + boolean leftFits = toLeft >= tooltipRect.width / 3 + d; + boolean rightFits = toRight >= tooltipRect.width / 3 + d; // Honor explicit preference if it fits if (preferred != auto) { diff --git a/core/npm/core.css b/core/npm/core.css index 4e2832a53..11bfce975 100644 --- a/core/npm/core.css +++ b/core/npm/core.css @@ -22,70 +22,66 @@ } /* =================================================================== - Tooltip using the popover API + Shared styles for components using the popover API =================================================================== */ -/* Reset [popover] UA styles for tooltips using the popover API */ -.pf-v6-c-tooltip[popover] { + +/* Reset [popover] UA styles */ +.pf-v6-c-tooltip[popover], +.pf-v6-c-popover[popover] { border: none; padding: 0; background: none; overflow: visible; width: max-content; - max-width: var(--pf-v6-c-tooltip--MaxWidth); position: fixed; } -/* CSS anchor positioning for tooltips using the popover API */ -.pf-v6-c-tooltip[popover].pf-m-top { +/* CSS anchor positioning */ +.pf-v6-c-tooltip[popover].pf-m-top, +.pf-v6-c-popover[popover].pf-m-top { position-area: block-start; } -.pf-v6-c-tooltip[popover].pf-m-bottom { +.pf-v6-c-tooltip[popover].pf-m-bottom, +.pf-v6-c-popover[popover].pf-m-bottom { position-area: block-end; } -.pf-v6-c-tooltip[popover].pf-m-left { +.pf-v6-c-tooltip[popover].pf-m-left, +.pf-v6-c-popover[popover].pf-m-left { position-area: inline-start; } -.pf-v6-c-tooltip[popover].pf-m-right { +.pf-v6-c-tooltip[popover].pf-m-right, +.pf-v6-c-popover[popover].pf-m-right { position-area: inline-end; } /* =================================================================== - Popover using the popover API + Tooltip-specific styles =================================================================== */ -/* Reset [popover] UA styles for popovers using the popover API */ + +.pf-v6-c-tooltip[popover] { + max-width: var(--pf-v6-c-tooltip--MaxWidth); +} + +/* =================================================================== + Popover-specific styles + =================================================================== */ + .pf-v6-c-popover[popover] { - border: none; - padding: 0; - background: none; - overflow: visible; inset: auto; - width: max-content; max-width: var(--pf-v6-c-popover--MaxWidth); - position: fixed; container-type: anchored; } -/* CSS anchor positioning for popovers using the popover API */ -.pf-v6-c-popover[popover].pf-m-top { - position-area: block-start; - position-try-fallbacks: flip-block; -} - +.pf-v6-c-popover[popover].pf-m-top, .pf-v6-c-popover[popover].pf-m-bottom { - position-area: block-end; position-try-fallbacks: flip-block; } -.pf-v6-c-popover[popover].pf-m-left { - position-area: inline-start; - position-try-fallbacks: flip-inline; -} - +.pf-v6-c-popover[popover].pf-m-left, .pf-v6-c-popover[popover].pf-m-right { - position-area: inline-end; position-try-fallbacks: flip-inline; } diff --git a/core/src/main/java/org/patternfly/popover/NativeAnchor.java b/core/src/main/java/org/patternfly/popover/NativeAnchor.java new file mode 100644 index 000000000..1763cc054 --- /dev/null +++ b/core/src/main/java/org/patternfly/popover/NativeAnchor.java @@ -0,0 +1,121 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.popover; + +import java.util.function.Supplier; + +import org.jboss.elemento.By; +import org.jboss.elemento.Elements; +import org.patternfly.popper.Placement; + +import elemental2.dom.HTMLElement; + +import static elemental2.dom.DomGlobal.document; + +/** + * Shared anchor positioning logic for components based on the native popover API and CSS anchor positioning. Manages trigger + * resolution, CSS anchor setup/teardown, and placement CSS class toggling. + * + * @see https://developer.mozilla.org/en-US/docs/Web/API/Popover_API + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Anchor_positioning + */ +public class NativeAnchor { + + private final String id; + private int distance; + private final HTMLElement positioned; + private Supplier triggerSupplier; + private HTMLElement trigger; + + public NativeAnchor(String id, int distance, HTMLElement positioned, Supplier triggerSupplier) { + this.id = id; + this.distance = distance; + this.positioned = positioned; + this.triggerSupplier = triggerSupplier; + } + + // ------------------------------------------------------ trigger + + public void trigger(String selector) { + this.triggerSupplier = () -> Elements.querySelector(document.body, By.selector(selector)); + } + + public void trigger(By selector) { + this.triggerSupplier = () -> Elements.querySelector(document.body, selector); + } + + public void trigger(HTMLElement element) { + this.triggerSupplier = () -> element; + } + + public void trigger(Supplier supplier) { + this.triggerSupplier = supplier; + } + + // ------------------------------------------------------ lifecycle + + /** Resolves the trigger and sets up CSS anchor positioning. Returns the resolved trigger element or {@code null}. */ + public HTMLElement attach() { + if (triggerSupplier != null) { + trigger = triggerSupplier.get(); + if (trigger != null) { + String anchorName = "--" + id; + trigger.style.setProperty("anchor-name", anchorName); + positioned.style.setProperty("position-anchor", anchorName); + positioned.style.setProperty("margin", distance + "px"); + } + } + return trigger; + } + + /** Removes anchor positioning styles and clears the trigger reference. */ + public void detach() { + if (trigger != null) { + trigger.style.removeProperty("anchor-name"); + trigger = null; + } + } + + // ------------------------------------------------------ placement + + /** Removes all placement modifier CSS classes and applies the given placement. */ + public void applyPlacement(Placement placement) { + for (String mod : Placement.modifiers) { + positioned.classList.remove(mod); + } + if (placement.modifier != null && !placement.modifier.isEmpty()) { + positioned.classList.add(placement.modifier); + } + } + + // ------------------------------------------------------ access + + public HTMLElement trigger() { + return trigger; + } + + public boolean hasTriggerSupplier() { + return triggerSupplier != null; + } + + public int distance() { + return distance; + } + + public void distance(int distance) { + this.distance = distance; + } +} \ No newline at end of file diff --git a/core/src/main/java/org/patternfly/popover/package-info.java b/core/src/main/java/org/patternfly/popover/package-info.java new file mode 100644 index 000000000..90f8b2622 --- /dev/null +++ b/core/src/main/java/org/patternfly/popover/package-info.java @@ -0,0 +1,25 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Shared infrastructure for components based on the native popover API and CSS anchor positioning. + * + *

This package provides helpers that eliminate duplication between native popover-based components such as + * {@code NativePopover} and {@code NativeTooltip}. It handles trigger resolution, CSS anchor positioning setup/teardown, + * and placement CSS class toggling. + * + * @see org.patternfly.popover.NativeAnchor + */ +package org.patternfly.popover; \ No newline at end of file diff --git a/core/src/main/module.gwt.xml b/core/src/main/module.gwt.xml index 1741a5cef..e2ffa06d9 100644 --- a/core/src/main/module.gwt.xml +++ b/core/src/main/module.gwt.xml @@ -21,6 +21,7 @@ + diff --git a/showcase/src/main/java/org/patternfly/showcase/component/NativePopoverComponent.java b/showcase/src/main/java/org/patternfly/showcase/component/NativePopoverComponent.java index fe92eace6..8383b45cb 100644 --- a/showcase/src/main/java/org/patternfly/showcase/component/NativePopoverComponent.java +++ b/showcase/src/main/java/org/patternfly/showcase/component/NativePopoverComponent.java @@ -59,7 +59,7 @@ public class NativePopoverComponent extends SnippetPage { public NativePopoverComponent() { - super(components.get("native-tooltip")); + super(components.get("native-popover")); startExamples(); addSnippet(new Snippet("np-basic", "Basic", diff --git a/showcase/src/web/main.js b/showcase/src/web/main.js index 9016e9d80..de785a8d6 100644 --- a/showcase/src/web/main.js +++ b/showcase/src/web/main.js @@ -16,9 +16,9 @@ import "@patternfly/patternfly/patternfly.css"; import "@patternfly/patternfly/patternfly-addons.css"; import "@patternfly/patternfly/patternfly-charts.css"; -import "@patternfly-java/charts/dist/charts"; import "@patternfly-java/core"; import "@patternfly-java/finder"; +import "@patternfly-java/charts/dist/charts"; import "./pforg/*.css"; import "./showcase.css"; From 0223191e62f2cbdb85a36b3e38a54b46761e71c0 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Mon, 30 Mar 2026 15:27:58 +0200 Subject: [PATCH 076/430] Add CSS variable and modifier class to toggle CSS positioning fallbacks ans anchor based container queries --- .../component/popover/NativePopover.java | 159 +++++++++++--- .../component/tooltip/NativeTooltip.java | 71 ++---- core/npm/core.css | 100 +++++++-- .../java/org/patternfly/core/Attributes.java | 1 + .../org/patternfly/popover/NativeAnchor.java | 121 ----------- .../java/org/patternfly/popper/Modifiers.java | 4 +- .../java/org/patternfly/popper/Placement.java | 45 ++-- .../org/patternfly/popper/PopperBuilder.java | 2 +- .../position/AnchorPositioning.java | 204 ++++++++++++++++++ .../patternfly/position/CssPositioning.java | 63 ++++++ .../{popover => position}/package-info.java | 6 +- .../java/org/patternfly/style/Classes.java | 1 + showcase/package.json | 2 +- .../component/NativePopoverComponent.java | 17 +- showcase/src/web/main.js | 157 +++++++++----- showcase/src/web/showcase.css | 7 + 16 files changed, 657 insertions(+), 303 deletions(-) delete mode 100644 core/src/main/java/org/patternfly/popover/NativeAnchor.java create mode 100644 core/src/main/java/org/patternfly/position/AnchorPositioning.java create mode 100644 core/src/main/java/org/patternfly/position/CssPositioning.java rename core/src/main/java/org/patternfly/{popover => position}/package-info.java (82%) diff --git a/components/src/main/java/org/patternfly/component/popover/NativePopover.java b/components/src/main/java/org/patternfly/component/popover/NativePopover.java index ded503727..06f405965 100644 --- a/components/src/main/java/org/patternfly/component/popover/NativePopover.java +++ b/components/src/main/java/org/patternfly/component/popover/NativePopover.java @@ -32,23 +32,31 @@ import org.patternfly.component.Severity; import org.patternfly.component.button.Button; import org.patternfly.core.Aria; +import org.patternfly.core.Attributes; import org.patternfly.handler.CloseHandler; -import org.patternfly.popover.NativeAnchor; +import org.patternfly.position.AnchorPositioning; import org.patternfly.popper.Placement; import org.patternfly.style.Modifiers.NoPadding; - import elemental2.dom.Element; import elemental2.dom.Event; import elemental2.dom.HTMLDivElement; import elemental2.dom.HTMLElement; import elemental2.dom.MutationRecord; +import static elemental2.dom.DomGlobal.clearTimeout; import static elemental2.dom.DomGlobal.document; +import static elemental2.dom.DomGlobal.setTimeout; +import static org.gwtproject.event.shared.HandlerRegistrations.compose; import static org.jboss.elemento.Elements.div; import static org.jboss.elemento.Elements.failSafeRemoveFromParent; import static org.jboss.elemento.Elements.insertFirst; import static org.jboss.elemento.EventType.bind; import static org.jboss.elemento.EventType.click; +import static org.jboss.elemento.EventType.focusin; +import static org.jboss.elemento.EventType.focusout; +import static org.jboss.elemento.EventType.mouseenter; +import static org.jboss.elemento.EventType.mouseleave; +import static org.jboss.elemento.EventType.scroll; import static org.patternfly.component.button.Button.button; import static org.patternfly.component.popover.NativePopoverHeader.popoverHeader; import static org.patternfly.core.Aria.describedBy; @@ -57,13 +65,11 @@ import static org.patternfly.core.Aria.modal; import static org.patternfly.core.Attributes.role; import static org.patternfly.core.Roles.dialog; -import static org.patternfly.core.Validation.verifyEnum; import static org.patternfly.handler.CloseHandler.fireEvent; import static org.patternfly.handler.CloseHandler.shouldClose; import static org.patternfly.icon.IconSets.fas.times; -import static org.patternfly.popper.Placement.bottom; -import static org.patternfly.popper.Placement.left; -import static org.patternfly.popper.Placement.right; +import static org.patternfly.position.CssPositioning.popoverEnabled; +import static org.patternfly.popper.Placement.auto; import static org.patternfly.popper.Placement.top; import static org.patternfly.style.Classes.arrow; import static org.patternfly.style.Classes.close; @@ -109,30 +115,47 @@ public static NativePopover nativePopover(Supplier trigger) { private static final Logger logger = Logger.getLogger(NativePopover.class.getName()); public static final int DISTANCE = 20; + public static final int ENTRY_DELAY = 300; + public static final int EXIT_DELAY = 300; - private final NativeAnchor anchor; + private final AnchorPositioning anchorPositioning; private final HTMLElement contentElement; private final List> closeHandler; + private boolean visible; private boolean showClose; + private boolean hoverable; + private int entryDelay; + private int exitDelay; + private double showTimeout; + private double hideTimeout; + private Placement placement; private Severity severity; private Button closeButton; private NativePopoverHeader header; private HandlerRegistration triggerHandlers; + private HandlerRegistration anchorHandlers; private HandlerRegistration outsideClickHandler; + private HandlerRegistration scrollHandler; NativePopover(Supplier trigger) { - super(ComponentType.NativePopover, div().css(component(popover), top.modifier) + super(ComponentType.NativePopover, div().css(component(popover), top.modifier()) .attr(role, dialog) .aria(modal, true) - .attr("popover", "manual") + .attr(Attributes.popover, "manual") .element()); String id = Id.unique(componentType().id); - this.anchor = new NativeAnchor(id, DISTANCE, element(), trigger); + this.anchorPositioning = new AnchorPositioning(id, element(), trigger, DISTANCE, popoverEnabled()); this.closeHandler = new ArrayList<>(); this.visible = false; this.showClose = true; + this.hoverable = false; + this.entryDelay = ENTRY_DELAY; + this.exitDelay = EXIT_DELAY; + this.showTimeout = 0; + this.hideTimeout = 0; + this.placement = auto; String bodyId = Id.unique(componentType().id, "body"); element().appendChild(div().css(component(popover, arrow)).element()); @@ -150,11 +173,32 @@ public void attach(MutationRecord mutationRecord) { failSafeRemoveFromParent(closeButton); } - HTMLElement trigger = anchor.attach(); + HTMLElement trigger = anchorPositioning.attach(); if (trigger != null) { - // click trigger: toggle on click - triggerHandlers = bind(trigger, click, this::togglePopover); - } else if (anchor.hasTriggerSupplier()) { + // top is the default for auto and recalculated on show() + anchorPositioning.applyPlacement(placement == auto ? top : placement); + + if (hoverable) { + triggerHandlers = compose( + bind(trigger, mouseenter, e -> scheduleShow()), + bind(trigger, mouseleave, e -> scheduleHide()), + bind(trigger, focusin, e -> scheduleShow()), + bind(trigger, focusout, e -> scheduleHide())); + anchorHandlers = compose( + bind(element(), mouseenter, e -> cancelTimers()), + bind(element(), mouseleave, e -> scheduleHide())); + if (!anchorPositioning.cssPositioning()) { + scrollHandler = bind(document, scroll, true, e -> recalculatePlacement()); + } + + } else { + triggerHandlers = bind(trigger, click, this::togglePopover); + if (!anchorPositioning.cssPositioning()) { + scrollHandler = bind(document, scroll, true, e -> recalculatePlacement()); + } + } + + } else if (anchorPositioning.hasTriggerSupplier()) { logger.error("Unable to find trigger element for popover %o", element()); } else { logger.error("No trigger element defined for popover %o", element()); @@ -163,17 +207,26 @@ public void attach(MutationRecord mutationRecord) { @Override public void detach(MutationRecord mutationRecord) { + cancelTimers(); if (visible) { element().hidePopover(); visible = false; } + if (scrollHandler != null) { + scrollHandler.removeHandler(); + } + if (anchorHandlers != null) { + anchorHandlers.removeHandler(); + } if (outsideClickHandler != null) { outsideClickHandler.removeHandler(); } if (triggerHandlers != null) { triggerHandlers.removeHandler(); } - anchor.detach(); + if (anchorPositioning != null) { + anchorPositioning.detach(); + } } // ------------------------------------------------------ add @@ -251,7 +304,26 @@ public NativePopover closable(CloseHandler closeHandler) { } public NativePopover distance(int distance) { - anchor.distance(distance); + anchorPositioning.distance(distance); + return this; + } + + public NativePopover entryDelay(int delay) { + this.entryDelay = delay; + return this; + } + + public NativePopover exitDelay(int delay) { + this.exitDelay = delay; + return this; + } + + public NativePopover hoverable() { + return hoverable(true); + } + + public NativePopover hoverable(boolean hoverable) { + this.hoverable = hoverable; return this; } @@ -276,9 +348,7 @@ public NativePopover noClose() { } public NativePopover placement(Placement placement) { - if (verifyEnum(element(), "placement", placement, top, right, bottom, left)) { - anchor.applyPlacement(placement); - } + this.placement = placement; return this; } @@ -297,22 +367,22 @@ public NativePopover status(Severity severity, String screenReaderText) { } public NativePopover trigger(String trigger) { - anchor.trigger(trigger); + anchorPositioning.trigger(trigger); return this; } public NativePopover trigger(By trigger) { - anchor.trigger(trigger); + anchorPositioning.trigger(trigger); return this; } public NativePopover trigger(HTMLElement trigger) { - anchor.trigger(trigger); + anchorPositioning.trigger(trigger); return this; } public NativePopover trigger(Supplier trigger) { - anchor.trigger(trigger); + anchorPositioning.trigger(trigger); return this; } @@ -324,7 +394,7 @@ public NativePopover that() { // ------------------------------------------------------ aria /** - * Accessible label for the popover, required when header is not present. + * Accessible label for the popover, required when a header is not present. */ public NativePopover ariaLabel(String label) { return aria(Aria.label, label); @@ -353,10 +423,22 @@ public NativePopover onClose(CloseHandler closeHandler) { // ------------------------------------------------------ api public void show() { - if (!visible && anchor.trigger() != null) { - element().showPopover(); + if (!visible && anchorPositioning.trigger() != null) { + if (anchorPositioning.cssPositioning()) { + // CSS handles position-try-fallbacks; just apply preferred placement and show + anchorPositioning.applyPlacement(placement == auto ? top : placement); + element().showPopover(); + } else { + // JS calculates best placement via viewport measurements + style("visibility", "hidden"); + element().showPopover(); + anchorPositioning.applyBestPlacement(placement); + element().style.removeProperty("visibility"); + } visible = true; - outsideClickHandler = bind(document, click.name, this::onOutsideClick); + if (!hoverable) { + outsideClickHandler = bind(document, click.name, this::onOutsideClick); + } } } @@ -377,6 +459,27 @@ public void close(Event event, boolean fireEvent) { // ------------------------------------------------------ internal + private void scheduleShow() { + cancelTimers(); + showTimeout = setTimeout(e -> show(), entryDelay); + } + + private void scheduleHide() { + cancelTimers(); + hideTimeout = setTimeout(e -> close(new Event(""), true), exitDelay); + } + + private void recalculatePlacement() { + if (visible) { + anchorPositioning.applyBestPlacement(placement); + } + } + + private void cancelTimers() { + clearTimeout(showTimeout); + clearTimeout(hideTimeout); + } + private void togglePopover(Event event) { if (visible) { close(event, true); @@ -386,7 +489,7 @@ private void togglePopover(Event event) { } private void onOutsideClick(Event event) { - HTMLElement trigger = anchor.trigger(); + HTMLElement trigger = anchorPositioning.trigger(); if (visible && trigger != null) { Element target = (Element) event.target; if (!element().contains(target) && !trigger.contains(target)) { diff --git a/components/src/main/java/org/patternfly/component/tooltip/NativeTooltip.java b/components/src/main/java/org/patternfly/component/tooltip/NativeTooltip.java index 0be506d5c..8d20aa800 100644 --- a/components/src/main/java/org/patternfly/component/tooltip/NativeTooltip.java +++ b/components/src/main/java/org/patternfly/component/tooltip/NativeTooltip.java @@ -30,12 +30,12 @@ import org.patternfly.component.BaseComponent; import org.patternfly.component.Closeable; import org.patternfly.component.ComponentType; +import org.patternfly.core.Attributes; import org.patternfly.core.Roles; import org.patternfly.handler.CloseHandler; -import org.patternfly.popover.NativeAnchor; +import org.patternfly.position.AnchorPositioning; +import org.patternfly.position.CssPositioning; import org.patternfly.popper.Placement; - -import elemental2.dom.DOMRect; import elemental2.dom.Element; import elemental2.dom.Event; import elemental2.dom.HTMLDivElement; @@ -61,9 +61,6 @@ import static org.patternfly.handler.CloseHandler.fireEvent; import static org.patternfly.handler.CloseHandler.shouldClose; import static org.patternfly.popper.Placement.auto; -import static org.patternfly.popper.Placement.bottom; -import static org.patternfly.popper.Placement.left; -import static org.patternfly.popper.Placement.right; import static org.patternfly.popper.Placement.top; import static org.patternfly.style.Classes.arrow; import static org.patternfly.style.Classes.component; @@ -127,7 +124,7 @@ public static NativeTooltip nativeTooltip(Supplier trigger, String public static final int DISTANCE = 15; private final String id; - private final NativeAnchor anchor; + private final AnchorPositioning anchor; private final HTMLElement contentElement; private final List> closeHandler; private boolean visible; @@ -145,11 +142,11 @@ public static NativeTooltip nativeTooltip(Supplier trigger, String super(ComponentType.NativeTooltip, div().css(component(tooltip)) .attr(role, Roles.tooltip) .aria(live, "polite") - .attr("popover", "manual") + .attr(Attributes.popover, "manual") .element()); this.id = Id.unique(componentType().id); - this.anchor = new NativeAnchor(id, DISTANCE, element(), trigger); + this.anchor = new AnchorPositioning(id, element(), trigger, DISTANCE, CssPositioning.tooltipEnabled()); this.closeHandler = new ArrayList<>(); this.visible = false; this.entryDelay = ENTRY_DELAY; @@ -300,17 +297,19 @@ public NativeTooltip onClose(CloseHandler closeHandler) { // ------------------------------------------------------ api public void show() { - show(new Event("")); - } - - public void show(Event event) { HTMLElement trigger = anchor.trigger(); if (!visible && trigger != null) { - // Show invisibly to get measurable dimensions, calculate placement, then reveal - style("visibility", "hidden"); - element().showPopover(); - anchor.applyPlacement(bestPlacement(placement)); - element().style.removeProperty("visibility"); + if (anchor.cssPositioning()) { + // CSS handles position-try-fallbacks; just apply preferred placement and show + anchor.applyPlacement(placement == auto ? top : placement); + element().showPopover(); + } else { + // JS calculates best placement via viewport measurements + style("visibility", "hidden"); + element().showPopover(); + anchor.applyBestPlacement(placement); + element().style.removeProperty("visibility"); + } visible = true; if (aria != none) { trigger.setAttribute(aria.attribute, id); @@ -361,40 +360,4 @@ private void cancelTimers(Event event) { clearTimeout(showTimeout); clearTimeout(hideTimeout); } - - private Placement bestPlacement(Placement preferred) { - DOMRect triggerRect = anchor.trigger().getBoundingClientRect(); - DOMRect tooltipRect = element().getBoundingClientRect(); - double above = triggerRect.top; - double below = window.innerHeight - triggerRect.bottom; - double toLeft = triggerRect.left; - double toRight = window.innerWidth - triggerRect.right; - - // Check which directions have enough space for the tooltip - int d = anchor.distance(); - boolean topFits = above >= tooltipRect.height + d; - boolean bottomFits = below >= tooltipRect.height + d; - boolean leftFits = toLeft >= tooltipRect.width / 3 + d; - boolean rightFits = toRight >= tooltipRect.width / 3 + d; - - // Honor explicit preference if it fits - if (preferred != auto) { - if (preferred == top && topFits) {return top;} - if (preferred == bottom && bottomFits) {return bottom;} - if (preferred == left && leftFits) {return left;} - if (preferred == right && rightFits) {return right;} - } - - // Otherwise apply these rules: - // - prefer top, but only if the trigger is not near a horizontal edge - // - prefer horizontal when the trigger is near a horizontal edge - // - top wins over bottom when both horizontal directions fit - // - last resort: pick the side with the most space - if (topFits && leftFits && rightFits) {return top;} - if (rightFits && !leftFits) {return right;} - if (leftFits && !rightFits) {return left;} - if (topFits) {return top;} - if (bottomFits) {return bottom;} - return toRight >= toLeft ? right : left; - } } diff --git a/core/npm/core.css b/core/npm/core.css index 11bfce975..e1cdafaaa 100644 --- a/core/npm/core.css +++ b/core/npm/core.css @@ -57,6 +57,36 @@ position-area: inline-end; } +/* =================================================================== + CSS-native positioning (opt-in) + + Activated by the pf-m-css-positioning modifier, which is added + by NativeAnchor.attach() when the corresponding CSS custom property is set: + --pf-v6-c-tooltip--css-positioning: 1; + --pf-v6-c-popover--css-positioning: 1; + =================================================================== */ + +/* container-type for @container anchored() queries */ +.pf-v6-c-tooltip[popover].pf-m-css-positioning, +.pf-v6-c-popover[popover].pf-m-css-positioning { + container-type: anchored; +} + +/* position-try-fallbacks for tooltip and popover */ +.pf-v6-c-tooltip[popover].pf-m-css-positioning.pf-m-top, +.pf-v6-c-tooltip[popover].pf-m-css-positioning.pf-m-bottom, +.pf-v6-c-popover[popover].pf-m-css-positioning.pf-m-top, +.pf-v6-c-popover[popover].pf-m-css-positioning.pf-m-bottom { + position-try-fallbacks: flip-block; +} + +.pf-v6-c-tooltip[popover].pf-m-css-positioning.pf-m-left, +.pf-v6-c-tooltip[popover].pf-m-css-positioning.pf-m-right, +.pf-v6-c-popover[popover].pf-m-css-positioning.pf-m-left, +.pf-v6-c-popover[popover].pf-m-css-positioning.pf-m-right { + position-try-fallbacks: flip-inline; +} + /* =================================================================== Tooltip-specific styles =================================================================== */ @@ -72,28 +102,61 @@ .pf-v6-c-popover[popover] { inset: auto; max-width: var(--pf-v6-c-popover--MaxWidth); - container-type: anchored; } -.pf-v6-c-popover[popover].pf-m-top, -.pf-v6-c-popover[popover].pf-m-bottom { - position-try-fallbacks: flip-block; +/* +Arrow correction after CSS flip (requires @container anchored() support). +LightningCSS can't parse these yet (parcel-bundler/lightningcss#1176) — the +packager/optimizer also fails, not just the transformer. So these rules must be +injected at runtime via adoptedStyleSheets (see showcase/src/web/main.js). +Uncomment once lightningcss supports @container anchored(). + +@container anchored(fallback: flip-block) { + .pf-v6-c-tooltip[popover].pf-m-css-positioning.pf-m-top .pf-v6-c-tooltip__arrow { + --pf-v6-c-tooltip__arrow--InsetBlockStart: var(--pf-v6-c-tooltip--m-bottom--InsetBlockStart, 0); + --pf-v6-c-tooltip__arrow--InsetBlockEnd: auto; + --pf-v6-c-tooltip__arrow--InsetInlineStart: var(--pf-v6-c-tooltip--m-bottom--InsetInlineStart, 50%); + --pf-v6-c-tooltip__arrow--TranslateX: var(--pf-v6-c-tooltip__arrow--m-bottom--TranslateX); + --pf-v6-c-tooltip__arrow--TranslateY: var(--pf-v6-c-tooltip__arrow--m-bottom--TranslateY); + --pf-v6-c-tooltip__arrow--Rotate: var(--pf-v6-c-tooltip__arrow--m-bottom--Rotate); + } } -.pf-v6-c-popover[popover].pf-m-left, -.pf-v6-c-popover[popover].pf-m-right { - position-try-fallbacks: flip-inline; +@container anchored(fallback: flip-block) { + .pf-v6-c-tooltip[popover].pf-m-css-positioning.pf-m-bottom .pf-v6-c-tooltip__arrow { + --pf-v6-c-tooltip__arrow--InsetBlockStart: auto; + --pf-v6-c-tooltip__arrow--InsetBlockEnd: var(--pf-v6-c-tooltip--m-top--InsetBlockEnd, 0); + --pf-v6-c-tooltip__arrow--InsetInlineStart: var(--pf-v6-c-tooltip--m-top--InsetInlineStart, 50%); + --pf-v6-c-tooltip__arrow--TranslateX: var(--pf-v6-c-tooltip__arrow--m-top--TranslateX); + --pf-v6-c-tooltip__arrow--TranslateY: var(--pf-v6-c-tooltip__arrow--m-top--TranslateY); + --pf-v6-c-tooltip__arrow--Rotate: var(--pf-v6-c-tooltip__arrow--m-top--Rotate); + } } -/* -Uncomment as soon as https://github.com/parcel-bundler/lightningcss/issues/1176 is fixed -Then remove the hack in showcase/src/web/main.js -*/ +@container anchored(fallback: flip-inline) { + .pf-v6-c-tooltip[popover].pf-m-css-positioning.pf-m-left .pf-v6-c-tooltip__arrow { + --pf-v6-c-tooltip__arrow--InsetBlockStart: var(--pf-v6-c-tooltip--m-right--InsetBlockStart, 50%); + --pf-v6-c-tooltip__arrow--InsetInlineStart: var(--pf-v6-c-tooltip--m-right--InsetInlineStart, 0); + --pf-v6-c-tooltip__arrow--InsetInlineEnd: auto; + --pf-v6-c-tooltip__arrow--TranslateX: var(--pf-v6-c-tooltip__arrow--m-right--TranslateX); + --pf-v6-c-tooltip__arrow--TranslateY: var(--pf-v6-c-tooltip__arrow--m-right--TranslateY); + --pf-v6-c-tooltip__arrow--Rotate: var(--pf-v6-c-tooltip__arrow--m-right--Rotate); + } +} + +@container anchored(fallback: flip-inline) { + .pf-v6-c-tooltip[popover].pf-m-css-positioning.pf-m-right .pf-v6-c-tooltip__arrow { + --pf-v6-c-tooltip__arrow--InsetBlockStart: var(--pf-v6-c-tooltip--m-left--InsetBlockStart, 50%); + --pf-v6-c-tooltip__arrow--InsetInlineStart: auto; + --pf-v6-c-tooltip__arrow--InsetInlineEnd: var(--pf-v6-c-tooltip--m-left--InsetInlineEnd, 0); + --pf-v6-c-tooltip__arrow--TranslateX: var(--pf-v6-c-tooltip__arrow--m-left--TranslateX); + --pf-v6-c-tooltip__arrow--TranslateY: var(--pf-v6-c-tooltip__arrow--m-left--TranslateY); + --pf-v6-c-tooltip__arrow--Rotate: var(--pf-v6-c-tooltip__arrow--m-left--Rotate); + } +} -/* -!* Was top, flipped to bottom *! @container anchored(fallback: flip-block) { - .pf-v6-c-popover[popover].pf-m-top .pf-v6-c-popover__arrow { + .pf-v6-c-popover[popover].pf-m-css-positioning.pf-m-top .pf-v6-c-popover__arrow { --pf-v6-c-popover__arrow--InsetBlockStart: var(--pf-v6-c-popover--m-bottom--InsetBlockStart, 0); --pf-v6-c-popover__arrow--InsetBlockEnd: auto; --pf-v6-c-popover__arrow--InsetInlineStart: var(--pf-v6-c-popover--m-bottom--InsetInlineStart, 50%); @@ -103,9 +166,8 @@ Then remove the hack in showcase/src/web/main.js } } -!* Was bottom, flipped to top *! @container anchored(fallback: flip-block) { - .pf-v6-c-popover[popover].pf-m-bottom .pf-v6-c-popover__arrow { + .pf-v6-c-popover[popover].pf-m-css-positioning.pf-m-bottom .pf-v6-c-popover__arrow { --pf-v6-c-popover__arrow--InsetBlockStart: auto; --pf-v6-c-popover__arrow--InsetBlockEnd: var(--pf-v6-c-popover--m-top--InsetBlockEnd, 0); --pf-v6-c-popover__arrow--InsetInlineStart: var(--pf-v6-c-popover--m-top--InsetInlineStart, 50%); @@ -115,9 +177,8 @@ Then remove the hack in showcase/src/web/main.js } } -!* Was left, flipped to right *! @container anchored(fallback: flip-inline) { - .pf-v6-c-popover[popover].pf-m-left .pf-v6-c-popover__arrow { + .pf-v6-c-popover[popover].pf-m-css-positioning.pf-m-left .pf-v6-c-popover__arrow { --pf-v6-c-popover__arrow--InsetBlockStart: var(--pf-v6-c-popover--m-right--InsetBlockStart, 50%); --pf-v6-c-popover__arrow--InsetInlineStart: var(--pf-v6-c-popover--m-right--InsetInlineStart, 0); --pf-v6-c-popover__arrow--InsetInlineEnd: auto; @@ -127,9 +188,8 @@ Then remove the hack in showcase/src/web/main.js } } -!* Was right, flipped to left *! @container anchored(fallback: flip-inline) { - .pf-v6-c-popover[popover].pf-m-right .pf-v6-c-popover__arrow { + .pf-v6-c-popover[popover].pf-m-css-positioning.pf-m-right .pf-v6-c-popover__arrow { --pf-v6-c-popover__arrow--InsetBlockStart: var(--pf-v6-c-popover--m-left--InsetBlockStart, 50%); --pf-v6-c-popover__arrow--InsetInlineStart: auto; --pf-v6-c-popover__arrow--InsetInlineEnd: var(--pf-v6-c-popover--m-left--InsetInlineEnd, 0); diff --git a/core/src/main/java/org/patternfly/core/Attributes.java b/core/src/main/java/org/patternfly/core/Attributes.java index 2f871099b..682a5f8b2 100644 --- a/core/src/main/java/org/patternfly/core/Attributes.java +++ b/core/src/main/java/org/patternfly/core/Attributes.java @@ -19,6 +19,7 @@ public interface Attributes { String hidden = "hidden"; String tabindex = "tabindex"; + String popover = "popover"; String role = "role"; String required = "required"; String scope = "scope"; diff --git a/core/src/main/java/org/patternfly/popover/NativeAnchor.java b/core/src/main/java/org/patternfly/popover/NativeAnchor.java deleted file mode 100644 index 1763cc054..000000000 --- a/core/src/main/java/org/patternfly/popover/NativeAnchor.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright 2023 Red Hat - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.patternfly.popover; - -import java.util.function.Supplier; - -import org.jboss.elemento.By; -import org.jboss.elemento.Elements; -import org.patternfly.popper.Placement; - -import elemental2.dom.HTMLElement; - -import static elemental2.dom.DomGlobal.document; - -/** - * Shared anchor positioning logic for components based on the native popover API and CSS anchor positioning. Manages trigger - * resolution, CSS anchor setup/teardown, and placement CSS class toggling. - * - * @see https://developer.mozilla.org/en-US/docs/Web/API/Popover_API - * @see https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Anchor_positioning - */ -public class NativeAnchor { - - private final String id; - private int distance; - private final HTMLElement positioned; - private Supplier triggerSupplier; - private HTMLElement trigger; - - public NativeAnchor(String id, int distance, HTMLElement positioned, Supplier triggerSupplier) { - this.id = id; - this.distance = distance; - this.positioned = positioned; - this.triggerSupplier = triggerSupplier; - } - - // ------------------------------------------------------ trigger - - public void trigger(String selector) { - this.triggerSupplier = () -> Elements.querySelector(document.body, By.selector(selector)); - } - - public void trigger(By selector) { - this.triggerSupplier = () -> Elements.querySelector(document.body, selector); - } - - public void trigger(HTMLElement element) { - this.triggerSupplier = () -> element; - } - - public void trigger(Supplier supplier) { - this.triggerSupplier = supplier; - } - - // ------------------------------------------------------ lifecycle - - /** Resolves the trigger and sets up CSS anchor positioning. Returns the resolved trigger element or {@code null}. */ - public HTMLElement attach() { - if (triggerSupplier != null) { - trigger = triggerSupplier.get(); - if (trigger != null) { - String anchorName = "--" + id; - trigger.style.setProperty("anchor-name", anchorName); - positioned.style.setProperty("position-anchor", anchorName); - positioned.style.setProperty("margin", distance + "px"); - } - } - return trigger; - } - - /** Removes anchor positioning styles and clears the trigger reference. */ - public void detach() { - if (trigger != null) { - trigger.style.removeProperty("anchor-name"); - trigger = null; - } - } - - // ------------------------------------------------------ placement - - /** Removes all placement modifier CSS classes and applies the given placement. */ - public void applyPlacement(Placement placement) { - for (String mod : Placement.modifiers) { - positioned.classList.remove(mod); - } - if (placement.modifier != null && !placement.modifier.isEmpty()) { - positioned.classList.add(placement.modifier); - } - } - - // ------------------------------------------------------ access - - public HTMLElement trigger() { - return trigger; - } - - public boolean hasTriggerSupplier() { - return triggerSupplier != null; - } - - public int distance() { - return distance; - } - - public void distance(int distance) { - this.distance = distance; - } -} \ No newline at end of file diff --git a/core/src/main/java/org/patternfly/popper/Modifiers.java b/core/src/main/java/org/patternfly/popper/Modifiers.java index 385ef6aa7..f870172b5 100644 --- a/core/src/main/java/org/patternfly/popper/Modifiers.java +++ b/core/src/main/java/org/patternfly/popper/Modifiers.java @@ -40,11 +40,11 @@ static Modifier placement() { modifier.phase = ModifierPhase.main.name(); modifier.fn = (args) -> { if (args.state != null && args.state.elements != null) { - Placement placement = Placement.fromValue(args.state.placement); + Placement placement = Placement.of(args.state.placement); HTMLElement popper = args.state.elements.popper; if (placement != null && popper != null) { popper.classList.remove(Placement.modifiers); - popper.classList.add(placement.modifier); + popper.classList.add(placement.modifier()); } } }; diff --git a/core/src/main/java/org/patternfly/popper/Placement.java b/core/src/main/java/org/patternfly/popper/Placement.java index 68df157b7..978cc39b3 100644 --- a/core/src/main/java/org/patternfly/popper/Placement.java +++ b/core/src/main/java/org/patternfly/popper/Placement.java @@ -18,43 +18,42 @@ import java.util.Arrays; import org.patternfly.style.Classes; +import org.patternfly.style.TypedModifier; -import static org.patternfly.style.Classes.modifier; - -public enum Placement { +public enum Placement implements TypedModifier { auto("auto", ""), - top("top", modifier(Classes.top)), + top("top", Classes.modifier(Classes.top)), - topStart("top-start", modifier(Classes.top) + "-left"), + topStart("top-start", Classes.modifier(Classes.top) + "-left"), - topEnd("top-end", modifier(Classes.top) + "-right"), + topEnd("top-end", Classes.modifier(Classes.top) + "-right"), - bottom("bottom", modifier(Classes.bottom)), + bottom("bottom", Classes.modifier(Classes.bottom)), - bottomStart("bottom-start", modifier(Classes.bottom) + "-left"), + bottomStart("bottom-start", Classes.modifier(Classes.bottom) + "-left"), - bottomEnd("bottom-end", modifier(Classes.bottom) + "-right"), + bottomEnd("bottom-end", Classes.modifier(Classes.bottom) + "-right"), - left("left", modifier(Classes.left)), + left("left", Classes.modifier(Classes.left)), - leftStart("left-start", modifier(Classes.left) + "-top"), + leftStart("left-start", Classes.modifier(Classes.left) + "-top"), - leftEnd("left-end", modifier(Classes.left) + "-bottom"), + leftEnd("left-end", Classes.modifier(Classes.left) + "-bottom"), - right("right", modifier(Classes.right)), + right("right", Classes.modifier(Classes.right)), - rightStart("right-start", modifier(Classes.right) + "-bottom"), + rightStart("right-start", Classes.modifier(Classes.right) + "-bottom"), - rightEnd("right-end", modifier(Classes.right) + "-bottom"); + rightEnd("right-end", Classes.modifier(Classes.right) + "-bottom"); public static final String[] modifiers = Arrays.stream(values()) .filter(p -> p != auto) .map(p -> p.modifier) .toArray(String[]::new); - public static Placement fromValue(String value) { + public static Placement of(String value) { for (Placement placement : values()) { if (placement.value.equals(value)) { return placement; @@ -63,11 +62,21 @@ public static Placement fromValue(String value) { return null; } - public final String value; - public final String modifier; + private final String value; + private final String modifier; Placement(String value, String modifier) { this.value = value; this.modifier = modifier; } + + @Override + public String value() { + return value; + } + + @Override + public String modifier() { + return modifier; + } } diff --git a/core/src/main/java/org/patternfly/popper/PopperBuilder.java b/core/src/main/java/org/patternfly/popper/PopperBuilder.java index cb4814315..dfe53c9ff 100644 --- a/core/src/main/java/org/patternfly/popper/PopperBuilder.java +++ b/core/src/main/java/org/patternfly/popper/PopperBuilder.java @@ -187,7 +187,7 @@ public Popper build() { return new PopperError(componentName); } else { Options options = new Options(); - options.placement = placement.value; + options.placement = placement.value(); options.modifiers = modifiers; PopperJs popper = PopperJs.createPopper(triggerElement, popperElement, options); logger.debug("Create popper %o for trigger element %o", popperElement, triggerElement); diff --git a/core/src/main/java/org/patternfly/position/AnchorPositioning.java b/core/src/main/java/org/patternfly/position/AnchorPositioning.java new file mode 100644 index 000000000..d56a3849d --- /dev/null +++ b/core/src/main/java/org/patternfly/position/AnchorPositioning.java @@ -0,0 +1,204 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.position; + +import java.util.function.Supplier; + +import org.jboss.elemento.By; +import org.jboss.elemento.Elements; +import org.jboss.elemento.logger.Logger; +import org.patternfly.popper.Placement; +import org.patternfly.style.Classes; +import elemental2.dom.DOMRect; +import elemental2.dom.HTMLElement; + +import static elemental2.dom.DomGlobal.document; +import static elemental2.dom.DomGlobal.window; +import static org.patternfly.popper.Placement.auto; +import static org.patternfly.popper.Placement.bottom; +import static org.patternfly.popper.Placement.left; +import static org.patternfly.popper.Placement.right; +import static org.patternfly.popper.Placement.top; +import static org.patternfly.style.Classes.modifier; +import static org.patternfly.style.TypedModifier.swap; + +/** + * Shared anchor positioning logic for components based on the native popover API and CSS anchor positioning. Manages trigger + * resolution, CSS anchor setup/teardown, and placement CSS class toggling. + * + * @see https://developer.mozilla.org/en-US/docs/Web/API/Popover_API + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Anchor_positioning + */ +public class AnchorPositioning { + + private static final Logger logger = Logger.getLogger(AnchorPositioning.class.getName()); + private final String id; + private final HTMLElement popover; + private final boolean cssPositioning; + private Supplier triggerSupplier; + private HTMLElement trigger; + private int distance; + + public AnchorPositioning(String id, HTMLElement popover, Supplier triggerSupplier, int distance, + boolean cssPositioning) { + this.id = id; + this.popover = popover; + this.triggerSupplier = triggerSupplier; + this.distance = distance; + this.cssPositioning = cssPositioning; + } + + // ------------------------------------------------------ trigger + + public void trigger(String selector) { + this.triggerSupplier = () -> Elements.querySelector(document.body, By.selector(selector)); + } + + public void trigger(By selector) { + this.triggerSupplier = () -> Elements.querySelector(document.body, selector); + } + + public void trigger(HTMLElement element) { + this.triggerSupplier = () -> element; + } + + public void trigger(Supplier supplier) { + this.triggerSupplier = supplier; + } + + // ------------------------------------------------------ lifecycle + + /** Resolves the trigger and sets up CSS anchor positioning. Returns the resolved trigger element or {@code null}. */ + public HTMLElement attach() { + if (triggerSupplier != null) { + trigger = triggerSupplier.get(); + if (trigger != null) { + String anchorName = "--" + id; + trigger.style.setProperty("anchor-name", anchorName); + popover.style.setProperty("position-anchor", anchorName); + popover.style.setProperty("margin", distance + "px"); + if (cssPositioning) { + popover.classList.add(modifier(Classes.cssPositioning)); + } + } + } + return trigger; + } + + /** Removes anchor positioning styles and clears the trigger reference. */ + public void detach() { + if (trigger != null) { + trigger.style.removeProperty("anchor-name"); + popover.classList.remove(modifier(Classes.cssPositioning)); + trigger = null; + } + } + + // ------------------------------------------------------ placement + + /** Removes all placement modifier CSS classes and applies the given placement. */ + public void applyPlacement(Placement placement) { + swap(null, popover, placement, Placement.values()); + } + + /** + * Applies the best placement for the popover element based on the provided preferred placement and available space around + * the trigger element. + * + * @param preferred The preferred placement of the element. + */ + public void applyBestPlacement(Placement preferred) { + applyPlacement(bestPlacement(preferred)); + } + + /** + * Determines the best placement for an element based on the preferred placement and available space around the trigger + * element. + *

+ * The placement is chosen by considering the available space in all directions, honoring the preferred placement if + * sufficient space is available, or applying fallback rules to determine the optimal placement. + * + * @param preferred The preferred placement of the element. If {@code auto}, the method calculates the best placement based + * on the space around the trigger element. + * @return The optimal {@link Placement} for the element considering the preferred placement and the available space. + */ + private Placement bestPlacement(Placement preferred) { + DOMRect triggerRect = trigger.getBoundingClientRect(); + DOMRect positionedRect = popover.getBoundingClientRect(); + double above = triggerRect.top; + double below = window.innerHeight - triggerRect.bottom; + double toLeft = triggerRect.left; + double toRight = window.innerWidth - triggerRect.right; + + // Check which directions have enough space for the tooltip + boolean topFits = above >= positionedRect.height + distance; + boolean bottomFits = below >= positionedRect.height + distance; + boolean leftFits = toLeft >= positionedRect.width / 3 + distance; + boolean rightFits = toRight >= positionedRect.width / 3 + distance; + + Placement placement; + // Honor explicit preference if it fits + if (preferred != auto) { + if (preferred == top && topFits) {placement = top;} else if (preferred == bottom && bottomFits) { + placement = bottom; + } else if (preferred == left && leftFits) {placement = left;} else if (preferred == right && rightFits) { + placement = right; + } else {placement = null;} + } else { + placement = null; + } + + if (placement == null) { + // Otherwise apply these rules: + // - prefer top, but only if the trigger is not near a horizontal edge + // - prefer horizontal when the trigger is near a horizontal edge + // - top wins over bottom when both horizontal directions fit + // - last resort: pick the side with the most space + if (topFits && leftFits && rightFits) {placement = top;} else if (rightFits && !leftFits) { + placement = right; + } else if (leftFits && !rightFits) {placement = left;} else if (topFits) {placement = top;} else if (bottomFits) { + placement = bottom; + } else {placement = toRight >= toLeft ? right : left;} + } + + logger.debug("Best placement for %s: preferred=%s, calculated=%s", id, preferred.name(), placement.name()); + return placement; + } + + // ------------------------------------------------------ access + + public boolean cssPositioning() { + return cssPositioning; + } + + public HTMLElement trigger() { + return trigger; + } + + public boolean hasTriggerSupplier() { + return triggerSupplier != null; + } + + public int distance() { + return distance; + } + + public void distance(int distance) { + this.distance = distance; + } +} diff --git a/core/src/main/java/org/patternfly/position/CssPositioning.java b/core/src/main/java/org/patternfly/position/CssPositioning.java new file mode 100644 index 000000000..bf4f0c045 --- /dev/null +++ b/core/src/main/java/org/patternfly/position/CssPositioning.java @@ -0,0 +1,63 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.position; + +import org.patternfly.style.Variable; + +import static elemental2.dom.DomGlobal.document; +import static org.jboss.elemento.DomGlobal.window; +import static org.patternfly.style.Classes.component; +import static org.patternfly.style.Classes.cssPositioning; +import static org.patternfly.style.Classes.popover; +import static org.patternfly.style.Classes.toolbar; +import static org.patternfly.style.Variable.componentVar; + +/** + * Reads and caches the CSS custom properties that control whether tooltip and popover components use native CSS positioning + * ({@code position-try-fallbacks}) or JavaScript-based positioning ({@code NativeAnchor.bestPlacement()}). + *

+ * To enable CSS positioning, set the corresponding custom property on {@code :root}: + *

+ * :root {
+ *     --pf-v6-c-tooltip--css-positioning: 1;
+ *     --pf-v6-c-popover--css-positioning: 1;
+ * }
+ * 
+ */ +public class CssPositioning { + + private static Boolean tooltipEnabled; + private static Boolean popoverEnabled; + + public static boolean tooltipEnabled() { + if (tooltipEnabled == null) { + tooltipEnabled = readProperty(componentVar(component(toolbar), cssPositioning)); + } + return tooltipEnabled; + } + + public static boolean popoverEnabled() { + if (popoverEnabled == null) { + popoverEnabled = readProperty(componentVar(component(popover), cssPositioning)); + } + return popoverEnabled; + } + + private static boolean readProperty(Variable property) { + String value = window.getComputedStyle(document.documentElement).getPropertyValue(property.name).trim(); + return "1".equals(value) || "true".equals(value); + } +} diff --git a/core/src/main/java/org/patternfly/popover/package-info.java b/core/src/main/java/org/patternfly/position/package-info.java similarity index 82% rename from core/src/main/java/org/patternfly/popover/package-info.java rename to core/src/main/java/org/patternfly/position/package-info.java index 90f8b2622..24683f55c 100644 --- a/core/src/main/java/org/patternfly/popover/package-info.java +++ b/core/src/main/java/org/patternfly/position/package-info.java @@ -16,10 +16,10 @@ /** * Shared infrastructure for components based on the native popover API and CSS anchor positioning. * - *

This package provides helpers that eliminate duplication between native popover-based components such as + *

This package provides helpers that remove duplication between native popover-based components such as * {@code NativePopover} and {@code NativeTooltip}. It handles trigger resolution, CSS anchor positioning setup/teardown, * and placement CSS class toggling. * - * @see org.patternfly.popover.NativeAnchor + * @see org.patternfly.position.AnchorPositioning */ -package org.patternfly.popover; \ No newline at end of file +package org.patternfly.position; \ No newline at end of file diff --git a/core/src/main/java/org/patternfly/style/Classes.java b/core/src/main/java/org/patternfly/style/Classes.java index 748faf7c0..6ebf16239 100644 --- a/core/src/main/java/org/patternfly/style/Classes.java +++ b/core/src/main/java/org/patternfly/style/Classes.java @@ -82,6 +82,7 @@ public interface Classes { String control = "control"; String controls = "controls"; String count = "count"; + String cssPositioning = "css-positioning"; String current = "current"; String danger = "danger"; String dataList = "data-list"; diff --git a/showcase/package.json b/showcase/package.json index ce2e7c231..ba1ff09f2 100644 --- a/showcase/package.json +++ b/showcase/package.json @@ -9,7 +9,7 @@ "src/web/index.html" ], "scripts": { - "start:parcel": "parcel watch src/web/dev.html --dist-dir target/showcase --port 1235", + "start:parcel": "parcel watch src/web/dev.html --dist-dir target/showcase --port 1235 --watch-dir ..", "start:server": "node server.js 1234 1235", "open:browser": "wait-on http://localhost:1234 && open http://localhost:1234", "watch": "concurrently \"pnpm run start:parcel\" \"pnpm run start:server\" \"pnpm run open:browser\"", diff --git a/showcase/src/main/java/org/patternfly/showcase/component/NativePopoverComponent.java b/showcase/src/main/java/org/patternfly/showcase/component/NativePopoverComponent.java index 8383b45cb..4e692de9f 100644 --- a/showcase/src/main/java/org/patternfly/showcase/component/NativePopoverComponent.java +++ b/showcase/src/main/java/org/patternfly/showcase/component/NativePopoverComponent.java @@ -28,7 +28,6 @@ import org.patternfly.showcase.LoremIpsum; import org.patternfly.showcase.Snippet; import org.patternfly.showcase.SnippetPage; - import elemental2.dom.ScrollIntoViewOptions; import static org.jboss.elemento.Elements.div; @@ -77,6 +76,22 @@ public NativePopoverComponent() { // @code-end:np-basic )); + addSnippet(new Snippet("np-hoverable", "Hoverable", + code("np-hoverable"), () -> + // @code-start:np-hoverable + div().style("margin", "50px") + .add(button("Hover to trigger popover").primary() + .id("np-hoverable-button")) + .add(nativePopover(By.id("np-hoverable-button")) + .hoverable() + .ariaLabel("Hoverable popover") + .addHeader("Popover header") + .addBody("This popover opens on hover.") + .addFooter("Popover footer")) + .element() + // @code-end:np-hoverable + )); + addSnippet(new Snippet("np-placements", "Placements", code("np-placements"), () -> // @code-start:np-placements diff --git a/showcase/src/web/main.js b/showcase/src/web/main.js index de785a8d6..6dbb649be 100644 --- a/showcase/src/web/main.js +++ b/showcase/src/web/main.js @@ -16,9 +16,9 @@ import "@patternfly/patternfly/patternfly.css"; import "@patternfly/patternfly/patternfly-addons.css"; import "@patternfly/patternfly/patternfly-charts.css"; -import "@patternfly-java/core"; -import "@patternfly-java/finder"; import "@patternfly-java/charts/dist/charts"; +import "../../../core/npm/core.css"; +import "../../../extensions/finder/npm/finder.css"; import "./pforg/*.css"; import "./showcase.css"; @@ -28,66 +28,115 @@ import "highlight.js/styles/github.css"; window["hljs"] = hljs; // 'export' hljs for J2CL -// Unless https://github.com/parcel-bundler/lightningcss/issues/1176 is fixed, -// we have to inject the anchored container queries manually 😩 -const HEAD = document.querySelector('head') +// Inject @container anchored() rules via adoptedStyleSheets. +// LightningCSS can't parse these (parcel-bundler/lightningcss#1176) — and the +// Parcel packager/optimizer also fails, even with errorRecovery enabled. So +// runtime injection is the only option until lightningcss adds support. +// Once fixed, move these rules back into core.css and remove this block. +try { + const sheet = new CSSStyleSheet(); + sheet.replaceSync(` +/* ---- Tooltip arrow correction ---- */ -const insertStyles = styles => { - const STYLE = document.createElement('style') - STYLE.setAttribute('type', 'text/css') - STYLE.innerHTML = styles - HEAD.appendChild(STYLE) +/* Was top, flipped to bottom */ +@container anchored(fallback: flip-block) { + .pf-v6-c-tooltip[popover].pf-m-css-positioning.pf-m-top .pf-v6-c-tooltip__arrow { + --pf-v6-c-tooltip__arrow--InsetBlockStart: var(--pf-v6-c-tooltip--m-bottom--InsetBlockStart, 0); + --pf-v6-c-tooltip__arrow--InsetBlockEnd: auto; + --pf-v6-c-tooltip__arrow--InsetInlineStart: var(--pf-v6-c-tooltip--m-bottom--InsetInlineStart, 50%); + --pf-v6-c-tooltip__arrow--TranslateX: var(--pf-v6-c-tooltip__arrow--m-bottom--TranslateX); + --pf-v6-c-tooltip__arrow--TranslateY: var(--pf-v6-c-tooltip__arrow--m-bottom--TranslateY); + --pf-v6-c-tooltip__arrow--Rotate: var(--pf-v6-c-tooltip__arrow--m-bottom--Rotate); + } } -// language=css -const STYLES_TO_INSERT = ` - /* Was top, flipped to bottom */ - @container anchored(fallback: flip-block) { - .pf-v6-c-popover[popover].pf-m-top .pf-v6-c-popover__arrow { - --pf-v6-c-popover__arrow--InsetBlockStart: var(--pf-v6-c-popover--m-bottom--InsetBlockStart, 0); - --pf-v6-c-popover__arrow--InsetBlockEnd: auto; - --pf-v6-c-popover__arrow--InsetInlineStart: var(--pf-v6-c-popover--m-bottom--InsetInlineStart, 50%); - --pf-v6-c-popover__arrow--TranslateX: var(--pf-v6-c-popover__arrow--m-bottom--TranslateX); - --pf-v6-c-popover__arrow--TranslateY: var(--pf-v6-c-popover__arrow--m-bottom--TranslateY); - --pf-v6-c-popover__arrow--Rotate: var(--pf-v6-c-popover__arrow--m-bottom--Rotate); - } +/* Was bottom, flipped to top */ +@container anchored(fallback: flip-block) { + .pf-v6-c-tooltip[popover].pf-m-css-positioning.pf-m-bottom .pf-v6-c-tooltip__arrow { + --pf-v6-c-tooltip__arrow--InsetBlockStart: auto; + --pf-v6-c-tooltip__arrow--InsetBlockEnd: var(--pf-v6-c-tooltip--m-top--InsetBlockEnd, 0); + --pf-v6-c-tooltip__arrow--InsetInlineStart: var(--pf-v6-c-tooltip--m-top--InsetInlineStart, 50%); + --pf-v6-c-tooltip__arrow--TranslateX: var(--pf-v6-c-tooltip__arrow--m-top--TranslateX); + --pf-v6-c-tooltip__arrow--TranslateY: var(--pf-v6-c-tooltip__arrow--m-top--TranslateY); + --pf-v6-c-tooltip__arrow--Rotate: var(--pf-v6-c-tooltip__arrow--m-top--Rotate); } +} - /* Was bottom, flipped to top */ - @container anchored(fallback: flip-block) { - .pf-v6-c-popover[popover].pf-m-bottom .pf-v6-c-popover__arrow { - --pf-v6-c-popover__arrow--InsetBlockStart: auto; - --pf-v6-c-popover__arrow--InsetBlockEnd: var(--pf-v6-c-popover--m-top--InsetBlockEnd, 0); - --pf-v6-c-popover__arrow--InsetInlineStart: var(--pf-v6-c-popover--m-top--InsetInlineStart, 50%); - --pf-v6-c-popover__arrow--TranslateX: var(--pf-v6-c-popover__arrow--m-top--TranslateX); - --pf-v6-c-popover__arrow--TranslateY: var(--pf-v6-c-popover__arrow--m-top--TranslateY); - --pf-v6-c-popover__arrow--Rotate: var(--pf-v6-c-popover__arrow--m-top--Rotate); - } +/* Was left, flipped to right */ +@container anchored(fallback: flip-inline) { + .pf-v6-c-tooltip[popover].pf-m-css-positioning.pf-m-left .pf-v6-c-tooltip__arrow { + --pf-v6-c-tooltip__arrow--InsetBlockStart: var(--pf-v6-c-tooltip--m-right--InsetBlockStart, 50%); + --pf-v6-c-tooltip__arrow--InsetInlineStart: var(--pf-v6-c-tooltip--m-right--InsetInlineStart, 0); + --pf-v6-c-tooltip__arrow--InsetInlineEnd: auto; + --pf-v6-c-tooltip__arrow--TranslateX: var(--pf-v6-c-tooltip__arrow--m-right--TranslateX); + --pf-v6-c-tooltip__arrow--TranslateY: var(--pf-v6-c-tooltip__arrow--m-right--TranslateY); + --pf-v6-c-tooltip__arrow--Rotate: var(--pf-v6-c-tooltip__arrow--m-right--Rotate); } +} - /* Was left, flipped to right */ - @container anchored(fallback: flip-inline) { - .pf-v6-c-popover[popover].pf-m-left .pf-v6-c-popover__arrow { - --pf-v6-c-popover__arrow--InsetBlockStart: var(--pf-v6-c-popover--m-right--InsetBlockStart, 50%); - --pf-v6-c-popover__arrow--InsetInlineStart: var(--pf-v6-c-popover--m-right--InsetInlineStart, 0); - --pf-v6-c-popover__arrow--InsetInlineEnd: auto; - --pf-v6-c-popover__arrow--TranslateX: var(--pf-v6-c-popover__arrow--m-right--TranslateX); - --pf-v6-c-popover__arrow--TranslateY: var(--pf-v6-c-popover__arrow--m-right--TranslateY); - --pf-v6-c-popover__arrow--Rotate: var(--pf-v6-c-popover__arrow--m-right--Rotate); - } +/* Was right, flipped to left */ +@container anchored(fallback: flip-inline) { + .pf-v6-c-tooltip[popover].pf-m-css-positioning.pf-m-right .pf-v6-c-tooltip__arrow { + --pf-v6-c-tooltip__arrow--InsetBlockStart: var(--pf-v6-c-tooltip--m-left--InsetBlockStart, 50%); + --pf-v6-c-tooltip__arrow--InsetInlineStart: auto; + --pf-v6-c-tooltip__arrow--InsetInlineEnd: var(--pf-v6-c-tooltip--m-left--InsetInlineEnd, 0); + --pf-v6-c-tooltip__arrow--TranslateX: var(--pf-v6-c-tooltip__arrow--m-left--TranslateX); + --pf-v6-c-tooltip__arrow--TranslateY: var(--pf-v6-c-tooltip__arrow--m-left--TranslateY); + --pf-v6-c-tooltip__arrow--Rotate: var(--pf-v6-c-tooltip__arrow--m-left--Rotate); } +} - /* Was right, flipped to left */ - @container anchored(fallback: flip-inline) { - .pf-v6-c-popover[popover].pf-m-right .pf-v6-c-popover__arrow { - --pf-v6-c-popover__arrow--InsetBlockStart: var(--pf-v6-c-popover--m-left--InsetBlockStart, 50%); - --pf-v6-c-popover__arrow--InsetInlineStart: auto; - --pf-v6-c-popover__arrow--InsetInlineEnd: var(--pf-v6-c-popover--m-left--InsetInlineEnd, 0); - --pf-v6-c-popover__arrow--TranslateX: var(--pf-v6-c-popover__arrow--m-left--TranslateX); - --pf-v6-c-popover__arrow--TranslateY: var(--pf-v6-c-popover__arrow--m-left--TranslateY); - --pf-v6-c-popover__arrow--Rotate: var(--pf-v6-c-popover__arrow--m-left--Rotate); - } +/* ---- Popover arrow correction ---- */ + +/* Was top, flipped to bottom */ +@container anchored(fallback: flip-block) { + .pf-v6-c-popover[popover].pf-m-css-positioning.pf-m-top .pf-v6-c-popover__arrow { + --pf-v6-c-popover__arrow--InsetBlockStart: var(--pf-v6-c-popover--m-bottom--InsetBlockStart, 0); + --pf-v6-c-popover__arrow--InsetBlockEnd: auto; + --pf-v6-c-popover__arrow--InsetInlineStart: var(--pf-v6-c-popover--m-bottom--InsetInlineStart, 50%); + --pf-v6-c-popover__arrow--TranslateX: var(--pf-v6-c-popover__arrow--m-bottom--TranslateX); + --pf-v6-c-popover__arrow--TranslateY: var(--pf-v6-c-popover__arrow--m-bottom--TranslateY); + --pf-v6-c-popover__arrow--Rotate: var(--pf-v6-c-popover__arrow--m-bottom--Rotate); } -` +} -insertStyles(STYLES_TO_INSERT); +/* Was bottom, flipped to top */ +@container anchored(fallback: flip-block) { + .pf-v6-c-popover[popover].pf-m-css-positioning.pf-m-bottom .pf-v6-c-popover__arrow { + --pf-v6-c-popover__arrow--InsetBlockStart: auto; + --pf-v6-c-popover__arrow--InsetBlockEnd: var(--pf-v6-c-popover--m-top--InsetBlockEnd, 0); + --pf-v6-c-popover__arrow--InsetInlineStart: var(--pf-v6-c-popover--m-top--InsetInlineStart, 50%); + --pf-v6-c-popover__arrow--TranslateX: var(--pf-v6-c-popover__arrow--m-top--TranslateX); + --pf-v6-c-popover__arrow--TranslateY: var(--pf-v6-c-popover__arrow--m-top--TranslateY); + --pf-v6-c-popover__arrow--Rotate: var(--pf-v6-c-popover__arrow--m-top--Rotate); + } +} + +/* Was left, flipped to right */ +@container anchored(fallback: flip-inline) { + .pf-v6-c-popover[popover].pf-m-css-positioning.pf-m-left .pf-v6-c-popover__arrow { + --pf-v6-c-popover__arrow--InsetBlockStart: var(--pf-v6-c-popover--m-right--InsetBlockStart, 50%); + --pf-v6-c-popover__arrow--InsetInlineStart: var(--pf-v6-c-popover--m-right--InsetInlineStart, 0); + --pf-v6-c-popover__arrow--InsetInlineEnd: auto; + --pf-v6-c-popover__arrow--TranslateX: var(--pf-v6-c-popover__arrow--m-right--TranslateX); + --pf-v6-c-popover__arrow--TranslateY: var(--pf-v6-c-popover__arrow--m-right--TranslateY); + --pf-v6-c-popover__arrow--Rotate: var(--pf-v6-c-popover__arrow--m-right--Rotate); + } +} + +/* Was right, flipped to left */ +@container anchored(fallback: flip-inline) { + .pf-v6-c-popover[popover].pf-m-css-positioning.pf-m-right .pf-v6-c-popover__arrow { + --pf-v6-c-popover__arrow--InsetBlockStart: var(--pf-v6-c-popover--m-left--InsetBlockStart, 50%); + --pf-v6-c-popover__arrow--InsetInlineStart: auto; + --pf-v6-c-popover__arrow--InsetInlineEnd: var(--pf-v6-c-popover--m-left--InsetInlineEnd, 0); + --pf-v6-c-popover__arrow--TranslateX: var(--pf-v6-c-popover__arrow--m-left--TranslateX); + --pf-v6-c-popover__arrow--TranslateY: var(--pf-v6-c-popover__arrow--m-left--TranslateY); + --pf-v6-c-popover__arrow--Rotate: var(--pf-v6-c-popover__arrow--m-left--Rotate); + } +} +`); + document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet]; +} catch (_) { + console.warn("Failed to inject @container anchored() rules"); +} diff --git a/showcase/src/web/showcase.css b/showcase/src/web/showcase.css index 24638e8ed..1b3db5f9c 100644 --- a/showcase/src/web/showcase.css +++ b/showcase/src/web/showcase.css @@ -13,6 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +:root { + /*--pf-v6-c-tooltip--css-positioning: 1;*/ + --pf-v6-c-popover--css-positioning: 1; +} + .pf-m-redhat-font .pf-c-content { --pf-v6-c-content--FontSize: var(--pf-t--global--font--size--lg); } @@ -27,6 +32,7 @@ border: 2px dashed #ff6b81; } + .pfj-popover-box::before, .pfj-popover-box::after, .pfj-tooltip-box::before, @@ -36,6 +42,7 @@ width: 1500px; height: 600px; } + .pfj-popover-button, .pfj-tooltip-button { position: absolute; left: 600px; From be49db730d78fe6ac292e7d287ab60d672abc785 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Mon, 30 Mar 2026 16:47:25 +0200 Subject: [PATCH 077/430] Native popover & tooltip polishing --- .../component/popover/NativePopover.java | 64 ++++++------ .../component/tooltip/NativeTooltip.java | 99 +++++++++---------- .../patternfly/position/CssPositioning.java | 4 +- showcase/src/web/showcase.css | 4 +- 4 files changed, 82 insertions(+), 89 deletions(-) diff --git a/components/src/main/java/org/patternfly/component/popover/NativePopover.java b/components/src/main/java/org/patternfly/component/popover/NativePopover.java index 06f405965..004e329f2 100644 --- a/components/src/main/java/org/patternfly/component/popover/NativePopover.java +++ b/components/src/main/java/org/patternfly/component/popover/NativePopover.java @@ -36,6 +36,8 @@ import org.patternfly.handler.CloseHandler; import org.patternfly.position.AnchorPositioning; import org.patternfly.popper.Placement; +import org.patternfly.position.CssPositioning; +import org.patternfly.style.Classes; import org.patternfly.style.Modifiers.NoPadding; import elemental2.dom.Element; import elemental2.dom.Event; @@ -63,12 +65,12 @@ import static org.patternfly.core.Aria.label; import static org.patternfly.core.Aria.labelledBy; import static org.patternfly.core.Aria.modal; +import static org.patternfly.core.Attributes.popover; import static org.patternfly.core.Attributes.role; import static org.patternfly.core.Roles.dialog; import static org.patternfly.handler.CloseHandler.fireEvent; import static org.patternfly.handler.CloseHandler.shouldClose; import static org.patternfly.icon.IconSets.fas.times; -import static org.patternfly.position.CssPositioning.popoverEnabled; import static org.patternfly.popper.Placement.auto; import static org.patternfly.popper.Placement.top; import static org.patternfly.style.Classes.arrow; @@ -76,7 +78,6 @@ import static org.patternfly.style.Classes.component; import static org.patternfly.style.Classes.content; import static org.patternfly.style.Classes.modifier; -import static org.patternfly.style.Classes.popover; import static org.patternfly.style.Classes.widthAuto; /** @@ -118,7 +119,7 @@ public static NativePopover nativePopover(Supplier trigger) { public static final int ENTRY_DELAY = 300; public static final int EXIT_DELAY = 300; - private final AnchorPositioning anchorPositioning; + private final AnchorPositioning ap; private final HTMLElement contentElement; private final List> closeHandler; @@ -139,29 +140,28 @@ public static NativePopover nativePopover(Supplier trigger) { private HandlerRegistration scrollHandler; NativePopover(Supplier trigger) { - super(ComponentType.NativePopover, div().css(component(popover), top.modifier()) + super(ComponentType.NativePopover, div().css(component(Classes.popover), top.modifier()) .attr(role, dialog) .aria(modal, true) .attr(Attributes.popover, "manual") .element()); String id = Id.unique(componentType().id); - this.anchorPositioning = new AnchorPositioning(id, element(), trigger, DISTANCE, popoverEnabled()); + this.ap = new AnchorPositioning(id, element(), trigger, DISTANCE, CssPositioning.popoverEnabled()); this.closeHandler = new ArrayList<>(); this.visible = false; this.showClose = true; this.hoverable = false; - this.entryDelay = ENTRY_DELAY; - this.exitDelay = EXIT_DELAY; this.showTimeout = 0; this.hideTimeout = 0; + this.entryDelay = ENTRY_DELAY; + this.exitDelay = EXIT_DELAY; this.placement = auto; String bodyId = Id.unique(componentType().id, "body"); - element().appendChild(div().css(component(popover, arrow)).element()); - element().appendChild(contentElement = div().css(component(popover, content)).element()); + element().appendChild(div().css(component(Classes.popover, arrow)).element()); + element().appendChild(contentElement = div().css(component(Classes.popover, content)).element()); aria(describedBy, bodyId); - Attachable.register(this, this); } @@ -173,10 +173,10 @@ public void attach(MutationRecord mutationRecord) { failSafeRemoveFromParent(closeButton); } - HTMLElement trigger = anchorPositioning.attach(); + HTMLElement trigger = ap.attach(); if (trigger != null) { // top is the default for auto and recalculated on show() - anchorPositioning.applyPlacement(placement == auto ? top : placement); + ap.applyPlacement(placement == auto ? top : placement); if (hoverable) { triggerHandlers = compose( @@ -187,18 +187,16 @@ public void attach(MutationRecord mutationRecord) { anchorHandlers = compose( bind(element(), mouseenter, e -> cancelTimers()), bind(element(), mouseleave, e -> scheduleHide())); - if (!anchorPositioning.cssPositioning()) { - scrollHandler = bind(document, scroll, true, e -> recalculatePlacement()); - } } else { triggerHandlers = bind(trigger, click, this::togglePopover); - if (!anchorPositioning.cssPositioning()) { - scrollHandler = bind(document, scroll, true, e -> recalculatePlacement()); - } } - } else if (anchorPositioning.hasTriggerSupplier()) { + if (!ap.cssPositioning()) { + scrollHandler = bind(document, scroll, true, e -> recalculatePlacement()); + } + + } else if (ap.hasTriggerSupplier()) { logger.error("Unable to find trigger element for popover %o", element()); } else { logger.error("No trigger element defined for popover %o", element()); @@ -224,9 +222,7 @@ public void detach(MutationRecord mutationRecord) { if (triggerHandlers != null) { triggerHandlers.removeHandler(); } - if (anchorPositioning != null) { - anchorPositioning.detach(); - } + ap.detach(); } // ------------------------------------------------------ add @@ -292,7 +288,7 @@ public NativePopover closable() { public NativePopover closable(CloseHandler closeHandler) { if (closeButton == null) { - insertFirst(contentElement, div().css(component(popover, close)) + insertFirst(contentElement, div().css(component(Classes.popover, close)) .add(closeButton = button() .plain() .icon(times()) @@ -304,7 +300,7 @@ public NativePopover closable(CloseHandler closeHandler) { } public NativePopover distance(int distance) { - anchorPositioning.distance(distance); + ap.distance(distance); return this; } @@ -367,22 +363,22 @@ public NativePopover status(Severity severity, String screenReaderText) { } public NativePopover trigger(String trigger) { - anchorPositioning.trigger(trigger); + ap.trigger(trigger); return this; } public NativePopover trigger(By trigger) { - anchorPositioning.trigger(trigger); + ap.trigger(trigger); return this; } public NativePopover trigger(HTMLElement trigger) { - anchorPositioning.trigger(trigger); + ap.trigger(trigger); return this; } public NativePopover trigger(Supplier trigger) { - anchorPositioning.trigger(trigger); + ap.trigger(trigger); return this; } @@ -423,16 +419,16 @@ public NativePopover onClose(CloseHandler closeHandler) { // ------------------------------------------------------ api public void show() { - if (!visible && anchorPositioning.trigger() != null) { - if (anchorPositioning.cssPositioning()) { + if (!visible && ap.trigger() != null) { + if (ap.cssPositioning()) { // CSS handles position-try-fallbacks; just apply preferred placement and show - anchorPositioning.applyPlacement(placement == auto ? top : placement); + ap.applyPlacement(placement == auto ? top : placement); element().showPopover(); } else { // JS calculates best placement via viewport measurements style("visibility", "hidden"); element().showPopover(); - anchorPositioning.applyBestPlacement(placement); + ap.applyBestPlacement(placement); element().style.removeProperty("visibility"); } visible = true; @@ -471,7 +467,7 @@ private void scheduleHide() { private void recalculatePlacement() { if (visible) { - anchorPositioning.applyBestPlacement(placement); + ap.applyBestPlacement(placement); } } @@ -489,7 +485,7 @@ private void togglePopover(Event event) { } private void onOutsideClick(Event event) { - HTMLElement trigger = anchorPositioning.trigger(); + HTMLElement trigger = ap.trigger(); if (visible && trigger != null) { Element target = (Element) event.target; if (!element().contains(target) && !trigger.contains(target)) { diff --git a/components/src/main/java/org/patternfly/component/tooltip/NativeTooltip.java b/components/src/main/java/org/patternfly/component/tooltip/NativeTooltip.java index 8d20aa800..9bf67c5d2 100644 --- a/components/src/main/java/org/patternfly/component/tooltip/NativeTooltip.java +++ b/components/src/main/java/org/patternfly/component/tooltip/NativeTooltip.java @@ -30,12 +30,12 @@ import org.patternfly.component.BaseComponent; import org.patternfly.component.Closeable; import org.patternfly.component.ComponentType; -import org.patternfly.core.Attributes; import org.patternfly.core.Roles; import org.patternfly.handler.CloseHandler; +import org.patternfly.popper.Placement; import org.patternfly.position.AnchorPositioning; import org.patternfly.position.CssPositioning; -import org.patternfly.popper.Placement; +import org.patternfly.style.Classes; import elemental2.dom.Element; import elemental2.dom.Event; import elemental2.dom.HTMLDivElement; @@ -45,7 +45,6 @@ import static elemental2.dom.DomGlobal.clearTimeout; import static elemental2.dom.DomGlobal.document; import static elemental2.dom.DomGlobal.setTimeout; -import static elemental2.dom.DomGlobal.window; import static org.gwtproject.event.shared.HandlerRegistrations.compose; import static org.jboss.elemento.Elements.div; import static org.jboss.elemento.EventType.bind; @@ -57,6 +56,7 @@ import static org.patternfly.component.tooltip.TriggerAria.describedBy; import static org.patternfly.component.tooltip.TriggerAria.none; import static org.patternfly.core.Aria.live; +import static org.patternfly.core.Attributes.popover; import static org.patternfly.core.Attributes.role; import static org.patternfly.handler.CloseHandler.fireEvent; import static org.patternfly.handler.CloseHandler.shouldClose; @@ -119,14 +119,15 @@ public static NativeTooltip nativeTooltip(Supplier trigger, String private static final Logger logger = Logger.getLogger(NativeTooltip.class.getName()); + public static final int DISTANCE = 15; public static final int ENTRY_DELAY = 300; public static final int EXIT_DELAY = 300; - public static final int DISTANCE = 15; private final String id; - private final AnchorPositioning anchor; + private final AnchorPositioning ap; private final HTMLElement contentElement; private final List> closeHandler; + private boolean visible; private int entryDelay; private int exitDelay; @@ -139,22 +140,22 @@ public static NativeTooltip nativeTooltip(Supplier trigger, String private HandlerRegistration scrollHandler; NativeTooltip(Supplier trigger, String text) { - super(ComponentType.NativeTooltip, div().css(component(tooltip)) + super(ComponentType.NativeTooltip, div().css(component(Classes.tooltip)) .attr(role, Roles.tooltip) .aria(live, "polite") - .attr(Attributes.popover, "manual") + .attr(popover, "manual") .element()); this.id = Id.unique(componentType().id); - this.anchor = new AnchorPositioning(id, element(), trigger, DISTANCE, CssPositioning.tooltipEnabled()); + this.ap = new AnchorPositioning(id, element(), trigger, DISTANCE, CssPositioning.tooltipEnabled()); this.closeHandler = new ArrayList<>(); this.visible = false; + this.showTimeout = 0; + this.hideTimeout = 0; this.entryDelay = ENTRY_DELAY; this.exitDelay = EXIT_DELAY; this.placement = auto; this.aria = describedBy; - this.showTimeout = 0; - this.hideTimeout = 0; id(id); element().appendChild(div().css(component(tooltip, arrow)).element()); @@ -162,7 +163,6 @@ public static NativeTooltip nativeTooltip(Supplier trigger, String if (text != null) { contentElement.textContent = text; } - Attachable.register(this, this); } @@ -178,28 +178,25 @@ public Element textDelegate() { @Override public void attach(MutationRecord mutationRecord) { - HTMLElement trigger = anchor.attach(); + HTMLElement trigger = ap.attach(); if (trigger != null) { // top is the default for auto and recalculated on show() - anchor.applyPlacement(placement == auto ? top : placement); + ap.applyPlacement(placement == auto ? top : placement); - // event listeners on trigger triggerHandlers = compose( - bind(trigger, mouseenter, this::scheduleShow), - bind(trigger, mouseleave, this::scheduleHide), - bind(trigger, focusin, this::scheduleShow), - bind(trigger, focusout, this::scheduleHide)); - - // event listeners on tooltip itself: - // hovering into the tooltip cancels the hide timer, - // hovering out of the tooltip schedules hide + bind(trigger, mouseenter, e -> scheduleShow()), + bind(trigger, mouseleave, e -> scheduleHide()), + bind(trigger, focusin, e -> scheduleShow()), + bind(trigger, focusout, e -> scheduleHide())); anchorHandlers = compose( - bind(element(), mouseenter, this::cancelTimers), - bind(element(), mouseleave, this::scheduleHide)); + bind(element(), mouseenter, e -> cancelTimers()), + bind(element(), mouseleave, e -> scheduleHide())); - // hide tooltip immediately on scroll to prevent jump artifacts - scrollHandler = bind(window, scroll.name, this::hideOnScroll); - } else if (anchor.hasTriggerSupplier()) { + if (!ap.cssPositioning()) { + scrollHandler = bind(document, scroll, true, e -> recalculatePlacement()); + } + + } else if (ap.hasTriggerSupplier()) { logger.error("Unable to find trigger element for tooltip %o", element()); } else { logger.error("No trigger element defined for tooltip %o", element()); @@ -208,7 +205,7 @@ public void attach(MutationRecord mutationRecord) { @Override public void detach(MutationRecord mutationRecord) { - cancelTimers(new Event("")); + cancelTimers(); if (visible) { element().hidePopover(); visible = false; @@ -222,11 +219,16 @@ public void detach(MutationRecord mutationRecord) { if (triggerHandlers != null) { triggerHandlers.removeHandler(); } - anchor.detach(); + ap.detach(); } // ------------------------------------------------------ builder + public NativeTooltip distance(int distance) { + ap.distance(distance); + return this; + } + public NativeTooltip entryDelay(int delay) { this.entryDelay = delay; return this; @@ -237,11 +239,6 @@ public NativeTooltip exitDelay(int delay) { return this; } - public NativeTooltip distance(int distance) { - anchor.distance(distance); - return this; - } - public NativeTooltip leftAligned() { contentElement.classList.add(modifier(textAlignLeft)); return this; @@ -253,22 +250,22 @@ public NativeTooltip placement(Placement placement) { } public NativeTooltip trigger(String trigger) { - anchor.trigger(trigger); + ap.trigger(trigger); return this; } public NativeTooltip trigger(By trigger) { - anchor.trigger(trigger); + ap.trigger(trigger); return this; } public NativeTooltip trigger(HTMLElement trigger) { - anchor.trigger(trigger); + ap.trigger(trigger); return this; } public NativeTooltip trigger(Supplier trigger) { - anchor.trigger(trigger); + ap.trigger(trigger); return this; } @@ -297,17 +294,17 @@ public NativeTooltip onClose(CloseHandler closeHandler) { // ------------------------------------------------------ api public void show() { - HTMLElement trigger = anchor.trigger(); + HTMLElement trigger = ap.trigger(); if (!visible && trigger != null) { - if (anchor.cssPositioning()) { + if (ap.cssPositioning()) { // CSS handles position-try-fallbacks; just apply preferred placement and show - anchor.applyPlacement(placement == auto ? top : placement); + ap.applyPlacement(placement == auto ? top : placement); element().showPopover(); } else { // JS calculates best placement via viewport measurements style("visibility", "hidden"); element().showPopover(); - anchor.applyBestPlacement(placement); + ap.applyBestPlacement(placement); element().style.removeProperty("visibility"); } visible = true; @@ -323,7 +320,7 @@ public void close(Event event, boolean fireEvent) { if (visible) { element().hidePopover(); visible = false; - HTMLElement trigger = anchor.trigger(); + HTMLElement trigger = ap.trigger(); if (aria != none && trigger != null) { trigger.removeAttribute(aria.attribute); } @@ -339,25 +336,25 @@ public String text() { // ------------------------------------------------------ internal - private void scheduleShow(Event event) { - cancelTimers(event); + private void scheduleShow() { + cancelTimers(); showTimeout = setTimeout(e -> show(), entryDelay); } - private void scheduleHide(Event event) { - cancelTimers(event); + private void scheduleHide() { + cancelTimers(); hideTimeout = setTimeout(e -> close(new Event(""), true), exitDelay); } - private void hideOnScroll(Event event) { - cancelTimers(event); + private void recalculatePlacement() { if (visible) { - close(event, true); + ap.applyBestPlacement(placement); } } - private void cancelTimers(Event event) { + private void cancelTimers() { clearTimeout(showTimeout); clearTimeout(hideTimeout); } + } diff --git a/core/src/main/java/org/patternfly/position/CssPositioning.java b/core/src/main/java/org/patternfly/position/CssPositioning.java index bf4f0c045..9ebe8d788 100644 --- a/core/src/main/java/org/patternfly/position/CssPositioning.java +++ b/core/src/main/java/org/patternfly/position/CssPositioning.java @@ -22,7 +22,7 @@ import static org.patternfly.style.Classes.component; import static org.patternfly.style.Classes.cssPositioning; import static org.patternfly.style.Classes.popover; -import static org.patternfly.style.Classes.toolbar; +import static org.patternfly.style.Classes.tooltip; import static org.patternfly.style.Variable.componentVar; /** @@ -44,7 +44,7 @@ public class CssPositioning { public static boolean tooltipEnabled() { if (tooltipEnabled == null) { - tooltipEnabled = readProperty(componentVar(component(toolbar), cssPositioning)); + tooltipEnabled = readProperty(componentVar(component(tooltip), cssPositioning)); } return tooltipEnabled; } diff --git a/showcase/src/web/showcase.css b/showcase/src/web/showcase.css index 1b3db5f9c..b7f064189 100644 --- a/showcase/src/web/showcase.css +++ b/showcase/src/web/showcase.css @@ -14,8 +14,8 @@ * limitations under the License. */ :root { - /*--pf-v6-c-tooltip--css-positioning: 1;*/ - --pf-v6-c-popover--css-positioning: 1; + --pf-v6-c-tooltip--css-positioning: 0; + --pf-v6-c-popover--css-positioning: 0; } .pf-m-redhat-font .pf-c-content { From 72a69c4659099a10809d31e11f2167f4746df27a Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 31 Mar 2026 09:42:32 +0200 Subject: [PATCH 078/430] Add native dropdown --- .../patternfly/component/ComponentType.java | 2 + .../component/menu/NativeDropdown.java | 414 ++++++++++++++++++ core/npm/core.css | 63 ++- .../position/AnchorPositioning.java | 16 +- pom.xml | 2 +- .../showcase/component/DropdownComponent.java | 209 ++++----- showcase/src/web/showcase.css | 1 - 7 files changed, 577 insertions(+), 130 deletions(-) create mode 100644 components/src/main/java/org/patternfly/component/menu/NativeDropdown.java diff --git a/components/src/main/java/org/patternfly/component/ComponentType.java b/components/src/main/java/org/patternfly/component/ComponentType.java index 1610906ac..bb1f575ef 100644 --- a/components/src/main/java/org/patternfly/component/ComponentType.java +++ b/components/src/main/java/org/patternfly/component/ComponentType.java @@ -99,6 +99,8 @@ public enum ComponentType { MultiSelect("ms", "PF6/Component/MultiSelect"), + NativeDropdown("ndd", "PF6/Component/NativeDropdown"), + NativePopover("npvr", "PF6/Component/NativePopover"), NativeTooltip("ntt", "PF6/Component/NativeTooltip"), diff --git a/components/src/main/java/org/patternfly/component/menu/NativeDropdown.java b/components/src/main/java/org/patternfly/component/menu/NativeDropdown.java new file mode 100644 index 000000000..552a425dc --- /dev/null +++ b/components/src/main/java/org/patternfly/component/menu/NativeDropdown.java @@ -0,0 +1,414 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.component.menu; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Predicate; + +import org.gwtproject.event.shared.HandlerRegistration; +import org.jboss.elemento.Attachable; +import org.jboss.elemento.By; +import org.jboss.elemento.Id; +import org.jboss.elemento.logger.Logger; +import org.patternfly.component.ComponentDelegate; +import org.patternfly.component.ComponentType; +import org.patternfly.component.Expandable; +import org.patternfly.core.Aria; +import org.patternfly.handler.ComponentHandler; +import org.patternfly.handler.ToggleHandler; +import org.patternfly.icon.PredefinedIcon; +import org.patternfly.popper.Placement; +import org.patternfly.position.AnchorPositioning; +import org.patternfly.style.Classes; +import org.patternfly.style.Modifiers.Disabled; +import elemental2.core.JsArray; +import elemental2.dom.Event; +import elemental2.dom.HTMLElement; +import elemental2.dom.KeyboardEvent; +import elemental2.dom.MutationRecord; +import elemental2.dom.Node; + +import static elemental2.dom.DomGlobal.document; +import static elemental2.dom.DomGlobal.window; +import static org.jboss.elemento.Elements.div; +import static org.jboss.elemento.Elements.insertAfter; +import static org.jboss.elemento.Elements.isVisible; +import static org.jboss.elemento.EventType.bind; +import static org.jboss.elemento.EventType.click; +import static org.jboss.elemento.EventType.keydown; +import static org.jboss.elemento.Key.ArrowDown; +import static org.jboss.elemento.Key.ArrowUp; +import static org.jboss.elemento.Key.Escape; +import static org.jboss.elemento.Key.Tab; +import static org.patternfly.component.menu.DropdownMenu.dropdownMenu; +import static org.patternfly.component.menu.MenuContent.menuContent; +import static org.patternfly.component.menu.MenuList.menuList; +import static org.patternfly.core.Attributes.popover; +import static org.patternfly.popper.Placement.auto; +import static org.patternfly.popper.Placement.bottomStart; +import static org.patternfly.style.Classes.component; +import static org.patternfly.style.Classes.list; + +/** + * A dropdown presents a menu of actions or links in a constrained space that will trigger a process or navigate to a new + * location. + *

+ * This implementation uses the Popover API and CSS anchor positioning instead of Popper.js. The dropdown uses the browser's + * top-layer rendering for correct stacking, eliminating z-index issues. CSS {@code position-try-fallbacks} handles menu + * flipping when there is not enough space. + * + * @see https://www.patternfly.org/components/menus/dropdown/ + */ +public class NativeDropdown extends ComponentDelegate implements + Disabled, + Expandable, + Attachable { + + // ------------------------------------------------------ factory + + public static NativeDropdown nativeDropdown(String text) { + return new NativeDropdown(MenuToggle.menuToggle(text)); + } + + public static NativeDropdown nativeDropdown(PredefinedIcon icon, String label) { + return new NativeDropdown(MenuToggle.menuToggle(icon, label)); + } + + public static NativeDropdown nativeDropdown(MenuToggle menuToggle) { + return new NativeDropdown(menuToggle); + } + + // ------------------------------------------------------ instance + + private static final Logger logger = Logger.getLogger(NativeDropdown.class.getName()); + private static final int DISTANCE = 0; + + private final MenuToggle menuToggle; + private final HTMLElement menuPopover; + private final AnchorPositioning ap; + private final List> toggleHandler; + private final List> loadedHandler; + + private boolean disabled; + private Menu menu; + private MenuContent menuContent; + private MenuList menuList; + private Placement placement; + private Predicate stayOpen; + private HandlerRegistration menuToggleClickHandler; + private HandlerRegistration menuClickHandler; + private HandlerRegistration keyHandler; + private HandlerRegistration outsideClickHandler; + + NativeDropdown(MenuToggle menuToggle) { + super(ComponentType.NativeDropdown); + this.menuToggle = menuToggle; + this.toggleHandler = new ArrayList<>(); + this.loadedHandler = new ArrayList<>(); + this.placement = auto; + + String id = Id.unique(componentType().id); + menuPopover = div().css(component(Classes.menu, Classes.popover)) + .attr(popover, "manual") + .element(); + ap = new AnchorPositioning(id, menuPopover, menuToggle::element, DISTANCE, true); + + delegateTo(menuToggle.element()); + Attachable.register(menuToggle.element(), this); + } + + @Override + public void attach(MutationRecord mutationRecord) { + if (menuToggle != null && menu != null) { + if (disabled) { + menuToggle.disabled(true); + } + insertAfter(menuPopover, menuToggle.element()); + ap.attach(); + ap.applyPlacement(placement == auto ? bottomStart : placement); + menuToggleClickHandler = bind(menuToggle.toggleElement, click, e -> toggle()); + menuClickHandler = bind(menu, click, this::onMenuClick); + keyHandler = bind(window, keydown, this::keyHandler); + + } else { + logger.error("No toggle and/or menu defined for %s %o", componentType().name(), element()); + } + } + + @Override + public void detach(MutationRecord mutationRecord) { + if (expanded()) { + menu.element().hidePopover(); + } + if (outsideClickHandler != null) { + outsideClickHandler.removeHandler(); + } + if (keyHandler != null) { + keyHandler.removeHandler(); + } + if (menuClickHandler != null) { + menuClickHandler.removeHandler(); + } + if (menuToggleClickHandler != null) { + menuToggleClickHandler.removeHandler(); + } + if (ap != null) { + ap.detach(); + } + } + + // ------------------------------------------------------ add + + public NativeDropdown addMenu(Menu menu) { + return add(menu); + } + + // override to ensure internal wiring + public NativeDropdown add(Menu menu) { + this.menu = menu; + menuPopover.appendChild(menu.element()); + return this; + } + + // ------------------------------------------------------ builder + + /** Provides access to the underlying menu toggle using a fluent API style */ + public NativeDropdown applyToMenuToggle(Consumer consumer) { + consumer.accept(menuToggle); + return this; + } + + /** + * Applies the provided {@link Consumer} to the {@link MenuList} associated with this {@link NativeDropdown}. If the menu, + * menu content, or menu list is not yet initialized, they will be created as part of this method. This allows for + * modification or customization of the menu list using the specified consumer. + *

+ * This method simplifies the process of adding menu items to the dropdown menu. It is a shortcut for creating and adding a + * {@link DropdownMenu}, {@link MenuContent}, and {@link MenuList} in a single step. + *

+ * The two dropdowns below are exactly the same. Use the explicit approach if you need to customize the menu, content or + * list or if you want to add {@link MenuGroup}s. + * {@snippet : + * NativeDropdown implicit = nativeDropdown("Dropdown") + * .applyToMenuList(ml -> ml.addItem(menuItem("item-0", "Action"))); + * + * NativeDropdown explicit = nativeDropdown("Dropdown") + * .addContent(menuContent() + * .addList(menuList() + * .addItem(menuItem("item-0", "Action")))); + *} + * + * @param consumer a {@link Consumer} that accepts a {@link MenuList} for customization or modification + * @return the current {@link NativeDropdown} instance for method chaining + */ + public NativeDropdown applyToMenuList(Consumer consumer) { + if (menu == null) { + add(dropdownMenu()); + } + if (menuContent == null) { + menuContent = menuContent(); + menu.addContent(menuContent); + } + if (menuList == null) { + menuList = menuList(); + menuContent.addList(menuList); + } + + consumer.accept(menuList); + return this; + } + + @Override + public NativeDropdown disabled(boolean disabled) { + if (menuToggle != null) { + menuToggle.disabled(disabled); + } else { + // defer to attach() + this.disabled = disabled; + } + return this; + } + + @Override + public boolean isDisabled() { + return menuToggle == null ? disabled : menuToggle.isDisabled(); + } + + public NativeDropdown placement(Placement placement) { + this.placement = placement; + return this; + } + + public NativeDropdown stayOpen() { + return stayOpen(event -> true); + } + + /** + * Specifies a condition that determines whether the menu should remain open when an event occurs. + * + * @param stayOpen a {@link Predicate} that evaluates an {@link Event} to determine if the menu remains open. + * @return the current instance with the condition applied, enabling method chaining. + */ + public NativeDropdown stayOpen(Predicate stayOpen) { + this.stayOpen = stayOpen; + return this; + } + + @Override + public NativeDropdown that() { + return this; + } + + // ------------------------------------------------------ aria + + public NativeDropdown ariaLabel(String label) { + return aria(Aria.label, label); + } + + // ------------------------------------------------------ events + + public NativeDropdown onLoaded(ComponentHandler loadedHandler) { + this.loadedHandler.add(loadedHandler); + return this; + } + + public NativeDropdown onToggle(ToggleHandler toggleHandler) { + this.toggleHandler.add(toggleHandler); + return this; + } + + // ------------------------------------------------------ api + + @Override + public void collapse(boolean fireEvent) { + if (expanded()) { + menuPopover.hidePopover(); + Expandable.collapse(element(), element(), null); + if (outsideClickHandler != null) { + outsideClickHandler.removeHandler(); + outsideClickHandler = null; + } + if (fireEvent) { + toggleHandler.forEach(th -> th.onToggle(new Event(""), this, false)); + } + menuToggle.element().focus(); + } + } + + @Override + public void expand(boolean fireEvent) { + if (!expanded() && !isDisabled()) { + ap.applyPlacement(placement == auto ? bottomStart : placement); + menuPopover.showPopover(); + Expandable.expand(element(), element(), null); + outsideClickHandler = bind(document, click, this::onOutsideClick); + if (fireEvent) { + toggleHandler.forEach(th -> th.onToggle(new Event(""), this, true)); + } + if (menu.hasAsyncItems()) { + menu.loadAll().then(__ -> { + loadedHandler.forEach(th -> th.handle(new Event(""), this)); + return null; + }); + } + } + } + + public MenuToggle menuToggle() { + return menuToggle; + } + + public Menu menu() { + return menu; + } + + // ------------------------------------------------------ internal + + void searchInputControlsMenuList() { + if (menu != null && menuToggle != null && menuToggle.searchInput() != null) { + HTMLElement menuListElement = menu.querySelector(By.classname(component(Classes.menu, list))); + if (menuListElement != null) { + String id = menuListElement.getAttribute("id"); + if (id == null || id.isEmpty()) { + id = Id.unique(ComponentType.Menu.id, "list"); + } + menuToggle.searchInput().input().aria(Aria.controls, id); + } + } + } + + private void keyHandler(KeyboardEvent event) { + if (expanded()) { + if (Escape.match(event)) { + collapse(); + return; + } + if ((menuToggle.element().contains((Node) event.target) || + menu.element().contains((Node) event.target)) && Tab.match(event)) { + collapse(); + } + } + + if (expanded() && menuToggle.element().contains((Node) event.target)) { + boolean arrowUp = ArrowUp.match(event); + boolean arrowDown = ArrowDown.match(event); + if (arrowUp || arrowDown) { + event.preventDefault(); + HTMLElement focusableElement; + JsArray listItems = JsArray.from(menu.element().querySelectorAll("li").values()); + JsArray focusableElements = listItems + .filter((li, __) -> isVisible(li)) + .map((li, __) -> ((HTMLElement) li.querySelector( + "button:not(:disabled),input:not(:disabled),a:not([aria-disabled=\"true\"])"))) + .filter((li, __) -> li != null); + if (arrowDown) { + focusableElement = focusableElements.at(0); + } else { + focusableElement = focusableElements.at(focusableElements.length - 1); + } + if (focusableElement != null) { + focusableElement.focus(); + } + } + } + } + + private void onMenuClick(Event event) { + if (expanded()) { + if (stayOpen != null && stayOpen.test(event)) { + return; + } + collapse(); + } + } + + private void onOutsideClick(Event event) { + if (expanded()) { + Node target = (Node) event.target; + boolean insideMenu = menu.element().contains(target); + boolean insideToggle = menuToggle.element().contains(target); + if (!insideMenu && !insideToggle) { + if (stayOpen != null && stayOpen.test(event)) { + return; + } + collapse(); + } + } + } +} \ No newline at end of file diff --git a/core/npm/core.css b/core/npm/core.css index e1cdafaaa..97337bb50 100644 --- a/core/npm/core.css +++ b/core/npm/core.css @@ -27,7 +27,8 @@ /* Reset [popover] UA styles */ .pf-v6-c-tooltip[popover], -.pf-v6-c-popover[popover] { +.pf-v6-c-popover[popover], +.pf-v6-c-menu__popover { border: none; padding: 0; background: none; @@ -104,6 +105,66 @@ max-width: var(--pf-v6-c-popover--MaxWidth); } +/* =================================================================== + Dropdown menu (NativeDropdown) styles + + Unlike tooltip/popover which are centered on the anchor, dropdown + menus are edge-aligned. Uses anchor() functions for edge-aligned + placements and position-area for centered placements. + No arrow, so no container queries needed. + =================================================================== */ + +.pf-v6-c-menu__popover { + inset: auto; +} + +/* Bottom placements */ +.pf-v6-c-menu__popover.pf-m-css-positioning.pf-m-bottom { + position-area: block-end; + position-try-fallbacks: flip-block; +} + +.pf-v6-c-menu__popover.pf-m-css-positioning.pf-m-bottom-left { + top: anchor(bottom); + left: anchor(left); + position-try-fallbacks: flip-block; +} + +.pf-v6-c-menu__popover.pf-m-css-positioning.pf-m-bottom-right { + top: anchor(bottom); + right: anchor(right); + position-try-fallbacks: flip-block; +} + +/* Top placements */ +.pf-v6-c-menu__popover.pf-m-css-positioning.pf-m-top { + position-area: block-start; + position-try-fallbacks: flip-block; +} + +.pf-v6-c-menu__popover.pf-m-css-positioning.pf-m-top-left { + bottom: anchor(top); + left: anchor(left); + position-try-fallbacks: flip-block; +} + +.pf-v6-c-menu__popover.pf-m-css-positioning.pf-m-top-right { + bottom: anchor(top); + right: anchor(right); + position-try-fallbacks: flip-block; +} + +/* Left/right placements */ +.pf-v6-c-menu__popover.pf-m-css-positioning.pf-m-left { + position-area: inline-start; + position-try-fallbacks: flip-inline; +} + +.pf-v6-c-menu__popover.pf-m-css-positioning.pf-m-right { + position-area: inline-end; + position-try-fallbacks: flip-inline; +} + /* Arrow correction after CSS flip (requires @container anchored() support). LightningCSS can't parse these yet (parcel-bundler/lightningcss#1176) — the diff --git a/core/src/main/java/org/patternfly/position/AnchorPositioning.java b/core/src/main/java/org/patternfly/position/AnchorPositioning.java index d56a3849d..612d1043b 100644 --- a/core/src/main/java/org/patternfly/position/AnchorPositioning.java +++ b/core/src/main/java/org/patternfly/position/AnchorPositioning.java @@ -186,19 +186,23 @@ public boolean cssPositioning() { return cssPositioning; } - public HTMLElement trigger() { - return trigger; + public int distance() { + return distance; + } + + public void distance(int distance) { + this.distance = distance; } public boolean hasTriggerSupplier() { return triggerSupplier != null; } - public int distance() { - return distance; + public HTMLElement popover() { + return popover; } - public void distance(int distance) { - this.distance = distance; + public HTMLElement trigger() { + return trigger; } } diff --git a/pom.xml b/pom.xml index 90f383d47..5af2b273c 100644 --- a/pom.xml +++ b/pom.xml @@ -80,7 +80,7 @@ 1.0.8.Final v0.34.6 1.3.2 - 2.4.10 + 2.4.11 2.13.0 1.0.0-RC1 1.0.0-RC1 diff --git a/showcase/src/main/java/org/patternfly/showcase/component/DropdownComponent.java b/showcase/src/main/java/org/patternfly/showcase/component/DropdownComponent.java index 524c58a15..0e9daa22c 100644 --- a/showcase/src/main/java/org/patternfly/showcase/component/DropdownComponent.java +++ b/showcase/src/main/java/org/patternfly/showcase/component/DropdownComponent.java @@ -20,6 +20,7 @@ import org.jboss.elemento.router.Route; import org.patternfly.component.menu.Dropdown; import org.patternfly.component.menu.DropdownMenu; +import org.patternfly.component.menu.NativeDropdown; import org.patternfly.showcase.Snippet; import org.patternfly.showcase.SnippetPage; @@ -30,7 +31,6 @@ import static org.patternfly.component.content.Content.content; import static org.patternfly.component.content.ContentType.p; import static org.patternfly.component.form.Checkbox.checkboxWrapped; -import static org.patternfly.component.menu.Dropdown.dropdown; import static org.patternfly.component.menu.DropdownMenu.dropdownMenu; import static org.patternfly.component.menu.MenuContent.menuContent; import static org.patternfly.component.menu.MenuGroup.menuGroup; @@ -40,6 +40,7 @@ import static org.patternfly.component.menu.MenuToggle.menuToggle; import static org.patternfly.component.menu.MenuToggleAction.menuToggleAction; import static org.patternfly.component.menu.MenuToggleType.split; +import static org.patternfly.component.menu.NativeDropdown.nativeDropdown; import static org.patternfly.icon.IconSets.fas.cog; import static org.patternfly.icon.IconSets.fas.ellipsisV; import static org.patternfly.showcase.ApiDoc.Type.component; @@ -61,19 +62,15 @@ public DropdownComponent() { code("dropdown-basic"), () -> // @code-start:dropdown-basic div() - .add(dropdown("Dropdown") - .addMenu(dropdownMenu() - .addContent(menuContent() - .addList(menuList() - .addItem(menuItem("item-0", "Action")) - .addItem(linkMenuItem("item-1", "Link", "#item-1")) - .addItem(menuItem("item-2", "Disabled action") - .disabled()) - .addItem(linkMenuItem("item-3", "Disabled link", "#item-3") - .disabled()) - .addDivider() - .addItem(menuItem("item-4", "Separated action")) - .addItem(linkMenuItem("item-5", "Separated link", "#item-5")))))) + .add(nativeDropdown("Dropdown") + .applyToMenuList(ml -> ml + .addItem(menuItem("item-0", "Action")) + .addItem(linkMenuItem("item-1", "Link", "#item-1")) + .addItem(menuItem("item-2", "Disabled action").disabled()) + .addItem(linkMenuItem("item-3", "Disabled link", "#item-3").disabled()) + .addDivider() + .addItem(menuItem("item-4", "Separated action")) + .addItem(linkMenuItem("item-5", "Separated link", "#item-5")))) .element() // @code-end:dropdown-basic )); @@ -82,19 +79,15 @@ public DropdownComponent() { code("dropdown-kebab"), () -> // @code-start:dropdown-kebab div() - .add(dropdown(ellipsisV(), "kebab dropdown toggle") - .addMenu(dropdownMenu() - .addContent(menuContent() - .addList(menuList() - .addItem(menuItem("item-0", "Action")) - .addItem(linkMenuItem("item-1", "Link", "#item-1")) - .addItem(menuItem("item-2", "Disabled action") - .disabled()) - .addItem(linkMenuItem("item-3", "Disabled link", "#item-3") - .disabled()) - .addDivider() - .addItem(menuItem("item-4", "Separated action")) - .addItem(linkMenuItem("item-5", "Separated link", "#item-5")))))) + .add(nativeDropdown(ellipsisV(), "kebab dropdown toggle") + .applyToMenuList(ml -> ml + .addItem(menuItem("item-0", "Action")) + .addItem(linkMenuItem("item-1", "Link", "#item-1")) + .addItem(menuItem("item-2", "Disabled action").disabled()) + .addItem(linkMenuItem("item-3", "Disabled link", "#item-3").disabled()) + .addDivider() + .addItem(menuItem("item-4", "Separated action")) + .addItem(linkMenuItem("item-5", "Separated link", "#item-5")))) .element() // @code-end:dropdown-kebab )); @@ -103,7 +96,7 @@ public DropdownComponent() { code("dropdown-groups"), () -> // @code-start:dropdown-groups div() - .add(dropdown("Dropdown") + .add(nativeDropdown("Dropdown") .addMenu(dropdownMenu() .addContent(menuContent() .addGroup(menuGroup() @@ -129,21 +122,18 @@ public DropdownComponent() { code("dropdown-description"), () -> // @code-start:dropdown-description div() - .add(dropdown(menuToggle("Dropdown").fullWidth()) - .addMenu(dropdownMenu() - .addContent(menuContent() - .addList(menuList() - .addItem(menuItem("item-0", "Action") - .description("This is a description")) - .addItem(linkMenuItem("item-1", "Link", "#item-1") - .description( - "This is a very long description that describes the menu item")) - .addItem(menuItem("item-2", "Disabled action") - .disabled() - .description("Disabled action description")) - .addItem(linkMenuItem("item-3", "Disabled link", "#item-3") - .disabled() - .description("Disabled link description")))))) + .add(nativeDropdown(menuToggle("Dropdown").fullWidth()) + .applyToMenuList(ml -> ml + .addItem(menuItem("item-0", "Action") + .description("This is a description")) + .addItem(linkMenuItem("item-1", "Link", "#item-1") + .description("This is a very long description that describes the menu item")) + .addItem(menuItem("item-2", "Disabled action") + .disabled() + .description("Disabled action description")) + .addItem(linkMenuItem("item-3", "Disabled link", "#item-3") + .disabled() + .description("Disabled link description")))) .element() // @code-end:dropdown-description )); @@ -152,19 +142,15 @@ public DropdownComponent() { code("dropdown-badge"), () -> // @code-start:dropdown-badge div() - .add(dropdown(menuToggle("Count").addBadge(badge(4).unread())) - .addMenu(dropdownMenu() - .addContent(menuContent() - .addList(menuList() - .addItem(menuItem("item-0", "Action")) - .addItem(linkMenuItem("item-1", "Link", "#item-1")) - .addItem(menuItem("item-2", "Disabled action") - .disabled()) - .addItem(linkMenuItem("item-3", "Disabled link", "#item-3") - .disabled()) - .addDivider() - .addItem(menuItem("item-4", "Separated action")) - .addItem(linkMenuItem("item-5", "Separated link", "#item-5")))))) + .add(nativeDropdown(menuToggle("Count").addBadge(badge(4).unread())) + .applyToMenuList(ml -> ml + .addItem(menuItem("item-0", "Action")) + .addItem(linkMenuItem("item-1", "Link", "#item-1")) + .addItem(menuItem("item-2", "Disabled action").disabled()) + .addItem(linkMenuItem("item-3", "Disabled link", "#item-3").disabled()) + .addDivider() + .addItem(menuItem("item-4", "Separated action")) + .addItem(linkMenuItem("item-5", "Separated link", "#item-5")))) .element() // @code-end:dropdown-badge )); @@ -173,19 +159,15 @@ public DropdownComponent() { code("dropdown-icon"), () -> // @code-start:dropdown-icon div() - .add(dropdown(menuToggle("Icon").icon(cog())) - .addMenu(dropdownMenu() - .addContent(menuContent() - .addList(menuList() - .addItem(menuItem("item-0", "Action")) - .addItem(linkMenuItem("item-1", "Link", "#item-1")) - .addItem(menuItem("item-2", "Disabled action") - .disabled()) - .addItem(linkMenuItem("item-3", "Disabled link", "#item-3") - .disabled()) - .addDivider() - .addItem(menuItem("item-4", "Separated action")) - .addItem(linkMenuItem("item-5", "Separated link", "#item-5")))))) + .add(nativeDropdown(menuToggle("Icon").icon(cog())) + .applyToMenuList(ml -> ml + .addItem(menuItem("item-0", "Action")) + .addItem(linkMenuItem("item-1", "Link", "#item-1")) + .addItem(menuItem("item-2", "Disabled action").disabled()) + .addItem(linkMenuItem("item-3", "Disabled link", "#item-3").disabled()) + .addDivider() + .addItem(menuItem("item-4", "Separated action")) + .addItem(linkMenuItem("item-5", "Separated link", "#item-5")))) .element() // @code-end:dropdown-icon )); @@ -194,19 +176,15 @@ public DropdownComponent() { code("dropdown-avatar"), () -> // @code-start:dropdown-avatar div() - .add(dropdown(menuToggle("John Doe").addAvatar(avatar(avatarData(), "avatar"))) - .addMenu(dropdownMenu() - .addContent(menuContent() - .addList(menuList() - .addItem(menuItem("item-0", "Action")) - .addItem(linkMenuItem("item-1", "Link", "#item-1")) - .addItem(menuItem("item-2", "Disabled action") - .disabled()) - .addItem(linkMenuItem("item-3", "Disabled link", "#item-3") - .disabled()) - .addDivider() - .addItem(menuItem("item-4", "Separated action")) - .addItem(linkMenuItem("item-5", "Separated link", "#item-5")))))) + .add(nativeDropdown(menuToggle("John Doe").addAvatar(avatar(avatarData(), "avatar"))) + .applyToMenuList(ml -> ml + .addItem(menuItem("item-0", "Action")) + .addItem(linkMenuItem("item-1", "Link", "#item-1")) + .addItem(menuItem("item-2", "Disabled action").disabled()) + .addItem(linkMenuItem("item-3", "Disabled link", "#item-3").disabled()) + .addDivider() + .addItem(menuItem("item-4", "Separated action")) + .addItem(linkMenuItem("item-5", "Separated link", "#item-5")))) .element() // @code-end:dropdown-avatar )); @@ -215,37 +193,29 @@ public DropdownComponent() { code("dropdown-split-check"), () -> // @code-start:dropdown-split-check div() - .add(dropdown(menuToggle(split) + .add(nativeDropdown(menuToggle(split) .addCheckbox(checkboxWrapped(Id.unique(), "dropdown-split-check"))) - .addMenu(dropdownMenu() - .addContent(menuContent() - .addList(menuList() - .addItem(menuItem("item-0", "Action")) - .addItem(linkMenuItem("item-1", "Link", "#item-1")) - .addItem(menuItem("item-2", "Disabled action") - .disabled()) - .addItem(linkMenuItem("item-3", "Disabled link", "#item-3") - .disabled()) - .addDivider() - .addItem(menuItem("item-4", "Separated action")) - .addItem(linkMenuItem("item-5", "Separated link", "#item-5")))))) + .applyToMenuList(ml -> ml + .addItem(menuItem("item-0", "Action")) + .addItem(linkMenuItem("item-1", "Link", "#item-1")) + .addItem(menuItem("item-2", "Disabled action").disabled()) + .addItem(linkMenuItem("item-3", "Disabled link", "#item-3").disabled()) + .addDivider() + .addItem(menuItem("item-4", "Separated action")) + .addItem(linkMenuItem("item-5", "Separated link", "#item-5")))) .add(br()) .add(br()) - .add(dropdown(menuToggle(split) + .add(nativeDropdown(menuToggle(split) .addCheckbox(checkboxWrapped(Id.unique(), "dropdown-split-check")) .text("10 selected")) - .addMenu(dropdownMenu() - .addContent(menuContent() - .addList(menuList() - .addItem(menuItem("item-0", "Action")) - .addItem(linkMenuItem("item-1", "Link", "#item-1")) - .addItem(menuItem("item-2", "Disabled action") - .disabled()) - .addItem(linkMenuItem("item-3", "Disabled link", "#item-3") - .disabled()) - .addDivider() - .addItem(menuItem("item-4", "Separated action")) - .addItem(linkMenuItem("item-5", "Separated link", "#item-5")))))) + .applyToMenuList(ml -> ml + .addItem(menuItem("item-0", "Action")) + .addItem(linkMenuItem("item-1", "Link", "#item-1")) + .addItem(menuItem("item-2", "Disabled action").disabled()) + .addItem(linkMenuItem("item-3", "Disabled link", "#item-3").disabled()) + .addDivider() + .addItem(menuItem("item-4", "Separated action")) + .addItem(linkMenuItem("item-5", "Separated link", "#item-5")))) .element() // @code-end:dropdown-split-check )); @@ -254,26 +224,23 @@ public DropdownComponent() { code("dropdown-split-action"), () -> // @code-start:dropdown-split-action div() - .add(dropdown(menuToggle(split) + .add(nativeDropdown(menuToggle(split) .addAction(menuToggleAction("Action"))) - .addMenu(dropdownMenu() - .addContent(menuContent() - .addList(menuList() - .addItem(menuItem("item-0", "Action")) - .addItem(linkMenuItem("item-1", "Link", "#item-1")) - .addItem(menuItem("item-2", "Disabled action") - .disabled()) - .addItem(linkMenuItem("item-3", "Disabled link", "#item-3") - .disabled()) - .addDivider() - .addItem(menuItem("item-4", "Separated action")) - .addItem(linkMenuItem("item-5", "Separated link", "#item-5")))))) + .applyToMenuList(ml -> ml + .addItem(menuItem("item-0", "Action")) + .addItem(linkMenuItem("item-1", "Link", "#item-1")) + .addItem(menuItem("item-2", "Disabled action").disabled()) + .addItem(linkMenuItem("item-3", "Disabled link", "#item-3").disabled()) + .addDivider() + .addItem(menuItem("item-4", "Separated action")) + .addItem(linkMenuItem("item-5", "Separated link", "#item-5")))) .element() // @code-end:dropdown-split-action )); startApiDocs(Dropdown.class); addApiDoc(Dropdown.class, component); + addApiDoc(NativeDropdown.class, component); addApiDoc(DropdownMenu.class, component); } } diff --git a/showcase/src/web/showcase.css b/showcase/src/web/showcase.css index b7f064189..ec0ff807e 100644 --- a/showcase/src/web/showcase.css +++ b/showcase/src/web/showcase.css @@ -30,7 +30,6 @@ overscroll-behavior: contain; margin: 0 auto; border: 2px dashed #ff6b81; - } .pfj-popover-box::before, From 6f62f9e2bbed2aed2f5dd6f7675a142fd0a0f5d8 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 31 Mar 2026 11:10:07 +0200 Subject: [PATCH 079/430] Add native single select --- .../patternfly/component/ComponentType.java | 2 + .../component/menu/NativeDropdown.java | 312 +--------------- .../component/menu/NativeMenuToggleMenu.java | 347 ++++++++++++++++++ .../component/menu/NativeSingleSelect.java | 154 ++++++++ .../component/popover/NativePopover.java | 30 +- .../component/tooltip/NativeTooltip.java | 26 +- .../position/AnchorPositioning.java | 38 +- .../showcase/component/DropdownComponent.java | 18 +- .../showcase/component/SelectComponent.java | 53 ++- showcase/src/web/showcase.css | 4 +- 10 files changed, 603 insertions(+), 381 deletions(-) create mode 100644 components/src/main/java/org/patternfly/component/menu/NativeMenuToggleMenu.java create mode 100644 components/src/main/java/org/patternfly/component/menu/NativeSingleSelect.java diff --git a/components/src/main/java/org/patternfly/component/ComponentType.java b/components/src/main/java/org/patternfly/component/ComponentType.java index bb1f575ef..7623fe1d6 100644 --- a/components/src/main/java/org/patternfly/component/ComponentType.java +++ b/components/src/main/java/org/patternfly/component/ComponentType.java @@ -101,6 +101,8 @@ public enum ComponentType { NativeDropdown("ndd", "PF6/Component/NativeDropdown"), + NativeSingleSelect("nss", "PF6/Component/NativeSingleSelect"), + NativePopover("npvr", "PF6/Component/NativePopover"), NativeTooltip("ntt", "PF6/Component/NativeTooltip"), diff --git a/components/src/main/java/org/patternfly/component/menu/NativeDropdown.java b/components/src/main/java/org/patternfly/component/menu/NativeDropdown.java index 552a425dc..243d9f09d 100644 --- a/components/src/main/java/org/patternfly/component/menu/NativeDropdown.java +++ b/components/src/main/java/org/patternfly/component/menu/NativeDropdown.java @@ -15,54 +15,15 @@ */ package org.patternfly.component.menu; -import java.util.ArrayList; -import java.util.List; +import java.util.function.BiConsumer; import java.util.function.Consumer; -import java.util.function.Predicate; -import org.gwtproject.event.shared.HandlerRegistration; -import org.jboss.elemento.Attachable; -import org.jboss.elemento.By; -import org.jboss.elemento.Id; -import org.jboss.elemento.logger.Logger; -import org.patternfly.component.ComponentDelegate; import org.patternfly.component.ComponentType; -import org.patternfly.component.Expandable; -import org.patternfly.core.Aria; -import org.patternfly.handler.ComponentHandler; -import org.patternfly.handler.ToggleHandler; import org.patternfly.icon.PredefinedIcon; -import org.patternfly.popper.Placement; -import org.patternfly.position.AnchorPositioning; -import org.patternfly.style.Classes; -import org.patternfly.style.Modifiers.Disabled; -import elemental2.core.JsArray; -import elemental2.dom.Event; -import elemental2.dom.HTMLElement; -import elemental2.dom.KeyboardEvent; -import elemental2.dom.MutationRecord; -import elemental2.dom.Node; -import static elemental2.dom.DomGlobal.document; -import static elemental2.dom.DomGlobal.window; -import static org.jboss.elemento.Elements.div; -import static org.jboss.elemento.Elements.insertAfter; -import static org.jboss.elemento.Elements.isVisible; -import static org.jboss.elemento.EventType.bind; -import static org.jboss.elemento.EventType.click; -import static org.jboss.elemento.EventType.keydown; -import static org.jboss.elemento.Key.ArrowDown; -import static org.jboss.elemento.Key.ArrowUp; -import static org.jboss.elemento.Key.Escape; -import static org.jboss.elemento.Key.Tab; import static org.patternfly.component.menu.DropdownMenu.dropdownMenu; import static org.patternfly.component.menu.MenuContent.menuContent; import static org.patternfly.component.menu.MenuList.menuList; -import static org.patternfly.core.Attributes.popover; -import static org.patternfly.popper.Placement.auto; -import static org.patternfly.popper.Placement.bottomStart; -import static org.patternfly.style.Classes.component; -import static org.patternfly.style.Classes.list; /** * A dropdown presents a menu of actions or links in a constrained space that will trigger a process or navigate to a new @@ -75,10 +36,7 @@ * @see https://www.patternfly.org/components/menus/dropdown/ */ -public class NativeDropdown extends ComponentDelegate implements - Disabled, - Expandable, - Attachable { +public class NativeDropdown extends NativeMenuToggleMenu { // ------------------------------------------------------ factory @@ -96,104 +54,15 @@ public static NativeDropdown nativeDropdown(MenuToggle menuToggle) { // ------------------------------------------------------ instance - private static final Logger logger = Logger.getLogger(NativeDropdown.class.getName()); - private static final int DISTANCE = 0; - - private final MenuToggle menuToggle; - private final HTMLElement menuPopover; - private final AnchorPositioning ap; - private final List> toggleHandler; - private final List> loadedHandler; - - private boolean disabled; - private Menu menu; private MenuContent menuContent; private MenuList menuList; - private Placement placement; - private Predicate stayOpen; - private HandlerRegistration menuToggleClickHandler; - private HandlerRegistration menuClickHandler; - private HandlerRegistration keyHandler; - private HandlerRegistration outsideClickHandler; NativeDropdown(MenuToggle menuToggle) { - super(ComponentType.NativeDropdown); - this.menuToggle = menuToggle; - this.toggleHandler = new ArrayList<>(); - this.loadedHandler = new ArrayList<>(); - this.placement = auto; - - String id = Id.unique(componentType().id); - menuPopover = div().css(component(Classes.menu, Classes.popover)) - .attr(popover, "manual") - .element(); - ap = new AnchorPositioning(id, menuPopover, menuToggle::element, DISTANCE, true); - - delegateTo(menuToggle.element()); - Attachable.register(menuToggle.element(), this); - } - - @Override - public void attach(MutationRecord mutationRecord) { - if (menuToggle != null && menu != null) { - if (disabled) { - menuToggle.disabled(true); - } - insertAfter(menuPopover, menuToggle.element()); - ap.attach(); - ap.applyPlacement(placement == auto ? bottomStart : placement); - menuToggleClickHandler = bind(menuToggle.toggleElement, click, e -> toggle()); - menuClickHandler = bind(menu, click, this::onMenuClick); - keyHandler = bind(window, keydown, this::keyHandler); - - } else { - logger.error("No toggle and/or menu defined for %s %o", componentType().name(), element()); - } - } - - @Override - public void detach(MutationRecord mutationRecord) { - if (expanded()) { - menu.element().hidePopover(); - } - if (outsideClickHandler != null) { - outsideClickHandler.removeHandler(); - } - if (keyHandler != null) { - keyHandler.removeHandler(); - } - if (menuClickHandler != null) { - menuClickHandler.removeHandler(); - } - if (menuToggleClickHandler != null) { - menuToggleClickHandler.removeHandler(); - } - if (ap != null) { - ap.detach(); - } - } - - // ------------------------------------------------------ add - - public NativeDropdown addMenu(Menu menu) { - return add(menu); - } - - // override to ensure internal wiring - public NativeDropdown add(Menu menu) { - this.menu = menu; - menuPopover.appendChild(menu.element()); - return this; + super(ComponentType.NativeDropdown, menuToggle); } // ------------------------------------------------------ builder - /** Provides access to the underlying menu toggle using a fluent API style */ - public NativeDropdown applyToMenuToggle(Consumer consumer) { - consumer.accept(menuToggle); - return this; - } - /** * Applies the provided {@link Consumer} to the {@link MenuList} associated with this {@link NativeDropdown}. If the menu, * menu content, or menu list is not yet initialized, they will be created as part of this method. This allows for @@ -206,7 +75,7 @@ public NativeDropdown applyToMenuToggle(Consumer consumer) { * list or if you want to add {@link MenuGroup}s. * {@snippet : * NativeDropdown implicit = nativeDropdown("Dropdown") - * .applyToMenuList(ml -> ml.addItem(menuItem("item-0", "Action"))); + * .applyToMenuList((menu, list) -> list.addItem(menuItem("item-0", "Action"))); * * NativeDropdown explicit = nativeDropdown("Dropdown") * .addContent(menuContent() @@ -234,181 +103,8 @@ public NativeDropdown applyToMenuList(Consumer consumer) { return this; } - @Override - public NativeDropdown disabled(boolean disabled) { - if (menuToggle != null) { - menuToggle.disabled(disabled); - } else { - // defer to attach() - this.disabled = disabled; - } - return this; - } - - @Override - public boolean isDisabled() { - return menuToggle == null ? disabled : menuToggle.isDisabled(); - } - - public NativeDropdown placement(Placement placement) { - this.placement = placement; - return this; - } - - public NativeDropdown stayOpen() { - return stayOpen(event -> true); - } - - /** - * Specifies a condition that determines whether the menu should remain open when an event occurs. - * - * @param stayOpen a {@link Predicate} that evaluates an {@link Event} to determine if the menu remains open. - * @return the current instance with the condition applied, enabling method chaining. - */ - public NativeDropdown stayOpen(Predicate stayOpen) { - this.stayOpen = stayOpen; - return this; - } - @Override public NativeDropdown that() { return this; } - - // ------------------------------------------------------ aria - - public NativeDropdown ariaLabel(String label) { - return aria(Aria.label, label); - } - - // ------------------------------------------------------ events - - public NativeDropdown onLoaded(ComponentHandler loadedHandler) { - this.loadedHandler.add(loadedHandler); - return this; - } - - public NativeDropdown onToggle(ToggleHandler toggleHandler) { - this.toggleHandler.add(toggleHandler); - return this; - } - - // ------------------------------------------------------ api - - @Override - public void collapse(boolean fireEvent) { - if (expanded()) { - menuPopover.hidePopover(); - Expandable.collapse(element(), element(), null); - if (outsideClickHandler != null) { - outsideClickHandler.removeHandler(); - outsideClickHandler = null; - } - if (fireEvent) { - toggleHandler.forEach(th -> th.onToggle(new Event(""), this, false)); - } - menuToggle.element().focus(); - } - } - - @Override - public void expand(boolean fireEvent) { - if (!expanded() && !isDisabled()) { - ap.applyPlacement(placement == auto ? bottomStart : placement); - menuPopover.showPopover(); - Expandable.expand(element(), element(), null); - outsideClickHandler = bind(document, click, this::onOutsideClick); - if (fireEvent) { - toggleHandler.forEach(th -> th.onToggle(new Event(""), this, true)); - } - if (menu.hasAsyncItems()) { - menu.loadAll().then(__ -> { - loadedHandler.forEach(th -> th.handle(new Event(""), this)); - return null; - }); - } - } - } - - public MenuToggle menuToggle() { - return menuToggle; - } - - public Menu menu() { - return menu; - } - - // ------------------------------------------------------ internal - - void searchInputControlsMenuList() { - if (menu != null && menuToggle != null && menuToggle.searchInput() != null) { - HTMLElement menuListElement = menu.querySelector(By.classname(component(Classes.menu, list))); - if (menuListElement != null) { - String id = menuListElement.getAttribute("id"); - if (id == null || id.isEmpty()) { - id = Id.unique(ComponentType.Menu.id, "list"); - } - menuToggle.searchInput().input().aria(Aria.controls, id); - } - } - } - - private void keyHandler(KeyboardEvent event) { - if (expanded()) { - if (Escape.match(event)) { - collapse(); - return; - } - if ((menuToggle.element().contains((Node) event.target) || - menu.element().contains((Node) event.target)) && Tab.match(event)) { - collapse(); - } - } - - if (expanded() && menuToggle.element().contains((Node) event.target)) { - boolean arrowUp = ArrowUp.match(event); - boolean arrowDown = ArrowDown.match(event); - if (arrowUp || arrowDown) { - event.preventDefault(); - HTMLElement focusableElement; - JsArray listItems = JsArray.from(menu.element().querySelectorAll("li").values()); - JsArray focusableElements = listItems - .filter((li, __) -> isVisible(li)) - .map((li, __) -> ((HTMLElement) li.querySelector( - "button:not(:disabled),input:not(:disabled),a:not([aria-disabled=\"true\"])"))) - .filter((li, __) -> li != null); - if (arrowDown) { - focusableElement = focusableElements.at(0); - } else { - focusableElement = focusableElements.at(focusableElements.length - 1); - } - if (focusableElement != null) { - focusableElement.focus(); - } - } - } - } - - private void onMenuClick(Event event) { - if (expanded()) { - if (stayOpen != null && stayOpen.test(event)) { - return; - } - collapse(); - } - } - - private void onOutsideClick(Event event) { - if (expanded()) { - Node target = (Node) event.target; - boolean insideMenu = menu.element().contains(target); - boolean insideToggle = menuToggle.element().contains(target); - if (!insideMenu && !insideToggle) { - if (stayOpen != null && stayOpen.test(event)) { - return; - } - collapse(); - } - } - } } \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/menu/NativeMenuToggleMenu.java b/components/src/main/java/org/patternfly/component/menu/NativeMenuToggleMenu.java new file mode 100644 index 000000000..17346fe0e --- /dev/null +++ b/components/src/main/java/org/patternfly/component/menu/NativeMenuToggleMenu.java @@ -0,0 +1,347 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.component.menu; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Predicate; + +import org.gwtproject.event.shared.HandlerRegistration; +import org.jboss.elemento.Attachable; +import org.jboss.elemento.By; +import org.jboss.elemento.Id; +import org.jboss.elemento.TypedBuilder; +import org.jboss.elemento.logger.Logger; +import org.patternfly.component.ComponentDelegate; +import org.patternfly.component.ComponentType; +import org.patternfly.component.Expandable; +import org.patternfly.core.Aria; +import org.patternfly.handler.ComponentHandler; +import org.patternfly.handler.ToggleHandler; +import org.patternfly.popper.Placement; +import org.patternfly.position.AnchorPositioning; +import org.patternfly.style.Classes; +import org.patternfly.style.Modifiers.Disabled; + +import elemental2.core.JsArray; +import elemental2.dom.Event; +import elemental2.dom.HTMLElement; +import elemental2.dom.KeyboardEvent; +import elemental2.dom.MutationRecord; +import elemental2.dom.Node; + +import static elemental2.dom.DomGlobal.document; +import static elemental2.dom.DomGlobal.window; +import static org.jboss.elemento.Elements.div; +import static org.jboss.elemento.Elements.insertAfter; +import static org.jboss.elemento.Elements.isVisible; +import static org.jboss.elemento.EventType.bind; +import static org.jboss.elemento.EventType.click; +import static org.jboss.elemento.EventType.keydown; +import static org.jboss.elemento.Key.ArrowDown; +import static org.jboss.elemento.Key.ArrowUp; +import static org.jboss.elemento.Key.Escape; +import static org.jboss.elemento.Key.Tab; +import static org.patternfly.core.Attributes.popover; +import static org.patternfly.popper.Placement.auto; +import static org.patternfly.popper.Placement.bottomStart; +import static org.patternfly.style.Classes.component; +import static org.patternfly.style.Classes.list; + +/** + * Abstract base component for native components that combine a {@link MenuToggle} and a {@link Menu}, such as + * {@link NativeDropdown} or {@link NativeSingleSelect}. + *

+ * The component delegates to the {@link MenuToggle} component. The {@link Menu} is managed using the native Popover API and CSS + * anchor positioning via {@link AnchorPositioning}. + */ +abstract class NativeMenuToggleMenu> extends ComponentDelegate + implements + Disabled, + Expandable, + Attachable { + + // ------------------------------------------------------ instance + + private static final Logger logger = Logger.getLogger(NativeMenuToggleMenu.class.getName()); + private static final int DISTANCE = 0; + + final MenuToggle menuToggle; + final AnchorPositioning ap; + Menu menu; + private final HTMLElement menuPopover; + private final List> toggleHandler; + private final List> loadedHandler; + private boolean disabled; + private Placement placement; + private Predicate stayOpen; + private HandlerRegistration menuToggleClickHandler; + private HandlerRegistration menuClickHandler; + private HandlerRegistration keyHandler; + private HandlerRegistration outsideClickHandler; + + NativeMenuToggleMenu(ComponentType componentType, MenuToggle menuToggle) { + super(componentType); + this.menuToggle = menuToggle; + this.toggleHandler = new ArrayList<>(); + this.loadedHandler = new ArrayList<>(); + this.placement = auto; + + String id = Id.unique(componentType().id); + menuPopover = div().css(component(Classes.menu, Classes.popover)) + .attr(popover, "manual") + .element(); + ap = new AnchorPositioning(id, menuPopover, menuToggle::element, DISTANCE, true, true); + + delegateTo(menuToggle.element()); + Attachable.register(menuToggle.element(), this); + } + + @Override + public void attach(MutationRecord mutationRecord) { + if (menuToggle != null && menu != null) { + if (disabled) { + menuToggle.disabled(true); + } + insertAfter(menuPopover, menuToggle.element()); + ap.attach(); + ap.applyPlacement(placement == auto ? bottomStart : placement); + menuToggleClickHandler = bind(menuToggle.toggleElement, click, e -> toggle()); + menuClickHandler = bind(menu, click, this::onMenuClick); + keyHandler = bind(window, keydown, this::keyHandler); + + } else { + logger.error("No toggle and/or menu defined for %s %o", componentType().name(), element()); + } + } + + @Override + public void detach(MutationRecord mutationRecord) { + if (expanded()) { + ap.hide(); + } + if (outsideClickHandler != null) { + outsideClickHandler.removeHandler(); + } + if (keyHandler != null) { + keyHandler.removeHandler(); + } + if (menuClickHandler != null) { + menuClickHandler.removeHandler(); + } + if (menuToggleClickHandler != null) { + menuToggleClickHandler.removeHandler(); + } + if (ap != null) { + ap.detach(); + } + } + + // ------------------------------------------------------ add + + public B addMenu(Menu menu) { + return add(menu); + } + + // override to ensure internal wiring + public B add(Menu menu) { + this.menu = menu; + menuPopover.appendChild(menu.element()); + return that(); + } + + // ------------------------------------------------------ builder + + /** Provides access to the underlying menu toggle using a fluent API style */ + public B applyToMenuToggle(Consumer consumer) { + consumer.accept(menuToggle); + return that(); + } + + @Override + public B disabled(boolean disabled) { + if (menuToggle != null) { + menuToggle.disabled(disabled); + } else { + // defer to attach() + this.disabled = disabled; + } + return that(); + } + + @Override + public boolean isDisabled() { + return menuToggle == null ? disabled : menuToggle.isDisabled(); + } + + public B placement(Placement placement) { + this.placement = placement; + return that(); + } + + public B stayOpen() { + return stayOpen(event -> true); + } + + /** + * Specifies a condition that determines whether the menu should remain open when an event occurs. + * + * @param stayOpen a {@link Predicate} that evaluates an {@link Event} to determine if the menu remains open. + * @return the current instance with the condition applied, enabling method chaining. + */ + public B stayOpen(Predicate stayOpen) { + this.stayOpen = stayOpen; + return that(); + } + + // ------------------------------------------------------ aria + + public B ariaLabel(String label) { + return aria(Aria.label, label); + } + + // ------------------------------------------------------ events + + public B onLoaded(ComponentHandler loadedHandler) { + this.loadedHandler.add(loadedHandler); + return that(); + } + + public B onToggle(ToggleHandler toggleHandler) { + this.toggleHandler.add(toggleHandler); + return that(); + } + + // ------------------------------------------------------ api + + @Override + public void collapse(boolean fireEvent) { + if (expanded()) { + ap.hide(); + Expandable.collapse(element(), element(), null); + if (outsideClickHandler != null) { + outsideClickHandler.removeHandler(); + outsideClickHandler = null; + } + if (fireEvent) { + toggleHandler.forEach(th -> th.onToggle(new Event(""), that(), false)); + } + menuToggle.element().focus(); + } + } + + @Override + public void expand(boolean fireEvent) { + if (!expanded() && !isDisabled()) { + ap.applyPlacement(placement == auto ? bottomStart : placement); + ap.show(); + Expandable.expand(element(), element(), null); + outsideClickHandler = bind(document, click, this::onOutsideClick); + if (fireEvent) { + toggleHandler.forEach(th -> th.onToggle(new Event(""), that(), true)); + } + if (menu.hasAsyncItems()) { + menu.loadAll().then(__ -> { + loadedHandler.forEach(th -> th.handle(new Event(""), that())); + return null; + }); + } + } + } + + public MenuToggle menuToggle() { + return menuToggle; + } + + public Menu menu() { + return menu; + } + + // ------------------------------------------------------ internal + + void searchInputControlsMenuList() { + if (menu != null && menuToggle != null && menuToggle.searchInput() != null) { + HTMLElement menuListElement = menu.querySelector(By.classname(component(Classes.menu, list))); + if (menuListElement != null) { + String id = menuListElement.getAttribute("id"); + if (id == null || id.isEmpty()) { + id = Id.unique(ComponentType.Menu.id, "list"); + } + menuToggle.searchInput().input().aria(Aria.controls, id); + } + } + } + + private void keyHandler(KeyboardEvent event) { + if (expanded()) { + if (Escape.match(event)) { + collapse(); + return; + } + if ((menuToggle.element().contains((Node) event.target) || + menu.element().contains((Node) event.target)) && Tab.match(event)) { + collapse(); + } + } + + if (expanded() && menuToggle.element().contains((Node) event.target)) { + boolean arrowUp = ArrowUp.match(event); + boolean arrowDown = ArrowDown.match(event); + if (arrowUp || arrowDown) { + event.preventDefault(); + HTMLElement focusableElement; + JsArray listItems = JsArray.from(menu.element().querySelectorAll("li").values()); + JsArray focusableElements = listItems + .filter((li, __) -> isVisible(li)) + .map((li, __) -> ((HTMLElement) li.querySelector( + "button:not(:disabled),input:not(:disabled),a:not([aria-disabled=\"true\"])"))) + .filter((li, __) -> li != null); + if (arrowDown) { + focusableElement = focusableElements.at(0); + } else { + focusableElement = focusableElements.at(focusableElements.length - 1); + } + if (focusableElement != null) { + focusableElement.focus(); + } + } + } + } + + private void onMenuClick(Event event) { + if (expanded()) { + if (stayOpen != null && stayOpen.test(event)) { + return; + } + collapse(); + } + } + + private void onOutsideClick(Event event) { + if (expanded()) { + Node target = (Node) event.target; + boolean insideMenu = menu.element().contains(target); + boolean insideToggle = menuToggle.element().contains(target); + if (!insideMenu && !insideToggle) { + if (stayOpen != null && stayOpen.test(event)) { + return; + } + collapse(); + } + } + } +} \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/menu/NativeSingleSelect.java b/components/src/main/java/org/patternfly/component/menu/NativeSingleSelect.java new file mode 100644 index 000000000..642a6680f --- /dev/null +++ b/components/src/main/java/org/patternfly/component/menu/NativeSingleSelect.java @@ -0,0 +1,154 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.component.menu; + +import java.util.List; +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +import org.patternfly.component.ComponentType; +import org.patternfly.component.SelectionMode; + +import static org.patternfly.component.menu.MenuContent.menuContent; +import static org.patternfly.component.menu.MenuList.menuList; +import static org.patternfly.component.menu.SingleSelectMenu.singleSelectMenu; + +/** + * A select component to select exactly one item from a list. + *

+ * This implementation uses the Popover API and CSS anchor positioning instead of Popper.js. The select uses the browser's + * top-layer rendering for correct stacking, eliminating z-index issues. CSS {@code position-try-fallbacks} handles menu + * flipping when there is not enough space. + * + * @see https://www.patternfly.org/components/menus/select + */ +public class NativeSingleSelect extends NativeMenuToggleMenu { + + // ------------------------------------------------------ factory + + public static NativeSingleSelect nativeSingleSelect(String text) { + return new NativeSingleSelect(MenuToggle.menuToggle(text)); + } + + public static NativeSingleSelect nativeSingleSelect(MenuToggle menuToggle) { + return new NativeSingleSelect(menuToggle); + } + + // ------------------------------------------------------ instance + + private boolean defaultSelectHandler; + private MenuContent menuContent; + private MenuList menuList; + + NativeSingleSelect(MenuToggle menuToggle) { + super(ComponentType.NativeSingleSelect, menuToggle); + this.defaultSelectHandler = true; + } + + // ------------------------------------------------------ add + + @Override + public NativeSingleSelect add(Menu menu) { + super.add(menu); + if (menu.menuType == MenuType.select && menu.selectionMode == SelectionMode.single && defaultSelectHandler) { + menu.onSingleSelect((e, menuItem, s) -> updateMenuToggle(menuItem)); + } + return this; + } + + // ------------------------------------------------------ builder + + /** + * Applies the provided {@link Consumer} to the {@link MenuList} associated with this {@link NativeSingleSelect}. If the + * menu, menu content, or menu list is not yet initialized, they will be created as part of this method. This allows for + * modification or customization of the menu list using the specified consumer. + *

+ * This method simplifies the process of adding menu items to the select menu. It is a shortcut for creating and adding a + * {@link SingleSelectMenu}, {@link MenuContent}, and {@link MenuList} in a single step. + * + * @param consumer a {@link Consumer} that accepts a {@link MenuList} for customization or modification + * @return the current {@link NativeSingleSelect} instance for method chaining + */ + public NativeSingleSelect applyToMenuList(Consumer consumer) { + if (menu == null) { + add(singleSelectMenu()); + } + if (menuContent == null) { + menuContent = menuContent(); + menu.addContent(menuContent); + } + if (menuList == null) { + menuList = menuList(); + menuContent.addList(menuList); + } + + consumer.accept(menuList); + return this; + } + + public NativeSingleSelect noDefaultSelectHandler() { + this.defaultSelectHandler = false; + return this; + } + + @Override + public NativeSingleSelect that() { + return this; + } + + // ------------------------------------------------------ api + + public void clear() { + clear(true); + } + + public void clear(boolean fireEvent) { + List selectedItems = menu.selectedItems(); + menu.clearSearch(); + menu.unselectAllItems(); + menuToggle.text(""); + if (fireEvent && !selectedItems.isEmpty()) { + menu.fireSingleSelection(selectedItems.get(0), false); + } + } + + public void select(String identifier) { + select(menu().findItem(identifier), true); + } + + public void select(String identifier, boolean fireEvent) { + select(menu().findItem(identifier), fireEvent); + } + + public void select(MenuItem item) { + select(item, true); + } + + public void select(MenuItem item, boolean fireEvent) { + if (menu != null && menuToggle != null && item != null) { + menu.select(item, true, fireEvent); + if (!fireEvent && defaultSelectHandler) { + updateMenuToggle(item); + } + } + } + + // ------------------------------------------------------ internal + + private void updateMenuToggle(MenuItem item) { + menuToggle.text(item.text()); + } +} \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/popover/NativePopover.java b/components/src/main/java/org/patternfly/component/popover/NativePopover.java index 004e329f2..91a7353e9 100644 --- a/components/src/main/java/org/patternfly/component/popover/NativePopover.java +++ b/components/src/main/java/org/patternfly/component/popover/NativePopover.java @@ -123,7 +123,6 @@ public static NativePopover nativePopover(Supplier trigger) { private final HTMLElement contentElement; private final List> closeHandler; - private boolean visible; private boolean showClose; private boolean hoverable; private int entryDelay; @@ -147,9 +146,8 @@ public static NativePopover nativePopover(Supplier trigger) { .element()); String id = Id.unique(componentType().id); - this.ap = new AnchorPositioning(id, element(), trigger, DISTANCE, CssPositioning.popoverEnabled()); + this.ap = new AnchorPositioning(id, element(), trigger, DISTANCE, CssPositioning.popoverEnabled(), false); this.closeHandler = new ArrayList<>(); - this.visible = false; this.showClose = true; this.hoverable = false; this.showTimeout = 0; @@ -206,9 +204,8 @@ public void attach(MutationRecord mutationRecord) { @Override public void detach(MutationRecord mutationRecord) { cancelTimers(); - if (visible) { - element().hidePopover(); - visible = false; + if (ap.visible()) { + ap.hide(); } if (scrollHandler != null) { scrollHandler.removeHandler(); @@ -419,19 +416,19 @@ public NativePopover onClose(CloseHandler closeHandler) { // ------------------------------------------------------ api public void show() { - if (!visible && ap.trigger() != null) { + if (!ap.visible() && ap.trigger() != null) { if (ap.cssPositioning()) { // CSS handles position-try-fallbacks; just apply preferred placement and show ap.applyPlacement(placement == auto ? top : placement); - element().showPopover(); + ap.show(); } else { - // JS calculates best placement via viewport measurements + // JS calculates the best placement via viewport measurements. + // For the calculation to work, the tooltip must be at least hidden style("visibility", "hidden"); - element().showPopover(); + ap.show(); ap.applyBestPlacement(placement); element().style.removeProperty("visibility"); } - visible = true; if (!hoverable) { outsideClickHandler = bind(document, click.name, this::onOutsideClick); } @@ -441,9 +438,8 @@ public void show() { @Override public void close(Event event, boolean fireEvent) { if (shouldClose(this, closeHandler, event, fireEvent)) { - if (visible) { - element().hidePopover(); - visible = false; + if (ap.visible()) { + ap.hide(); if (outsideClickHandler != null) { outsideClickHandler.removeHandler(); outsideClickHandler = null; @@ -466,7 +462,7 @@ private void scheduleHide() { } private void recalculatePlacement() { - if (visible) { + if (ap.visible()) { ap.applyBestPlacement(placement); } } @@ -477,7 +473,7 @@ private void cancelTimers() { } private void togglePopover(Event event) { - if (visible) { + if (ap.visible()) { close(event, true); } else { show(); @@ -486,7 +482,7 @@ private void togglePopover(Event event) { private void onOutsideClick(Event event) { HTMLElement trigger = ap.trigger(); - if (visible && trigger != null) { + if (ap.visible() && trigger != null) { Element target = (Element) event.target; if (!element().contains(target) && !trigger.contains(target)) { close(event, true); diff --git a/components/src/main/java/org/patternfly/component/tooltip/NativeTooltip.java b/components/src/main/java/org/patternfly/component/tooltip/NativeTooltip.java index 9bf67c5d2..add084e21 100644 --- a/components/src/main/java/org/patternfly/component/tooltip/NativeTooltip.java +++ b/components/src/main/java/org/patternfly/component/tooltip/NativeTooltip.java @@ -128,7 +128,6 @@ public static NativeTooltip nativeTooltip(Supplier trigger, String private final HTMLElement contentElement; private final List> closeHandler; - private boolean visible; private int entryDelay; private int exitDelay; private double showTimeout; @@ -147,9 +146,8 @@ public static NativeTooltip nativeTooltip(Supplier trigger, String .element()); this.id = Id.unique(componentType().id); - this.ap = new AnchorPositioning(id, element(), trigger, DISTANCE, CssPositioning.tooltipEnabled()); + this.ap = new AnchorPositioning(id, element(), trigger, DISTANCE, CssPositioning.tooltipEnabled(), false); this.closeHandler = new ArrayList<>(); - this.visible = false; this.showTimeout = 0; this.hideTimeout = 0; this.entryDelay = ENTRY_DELAY; @@ -206,9 +204,8 @@ public void attach(MutationRecord mutationRecord) { @Override public void detach(MutationRecord mutationRecord) { cancelTimers(); - if (visible) { - element().hidePopover(); - visible = false; + if (ap.visible()) { + ap.hide(); } if (scrollHandler != null) { scrollHandler.removeHandler(); @@ -295,19 +292,19 @@ public NativeTooltip onClose(CloseHandler closeHandler) { public void show() { HTMLElement trigger = ap.trigger(); - if (!visible && trigger != null) { + if (!ap.visible() && trigger != null) { if (ap.cssPositioning()) { // CSS handles position-try-fallbacks; just apply preferred placement and show ap.applyPlacement(placement == auto ? top : placement); - element().showPopover(); + ap.show(); } else { - // JS calculates best placement via viewport measurements + // JS calculates the best placement via viewport measurements. + // For the calculation to work, the tooltip must be at least hidden style("visibility", "hidden"); - element().showPopover(); + ap.show(); ap.applyBestPlacement(placement); element().style.removeProperty("visibility"); } - visible = true; if (aria != none) { trigger.setAttribute(aria.attribute, id); } @@ -317,9 +314,8 @@ public void show() { @Override public void close(Event event, boolean fireEvent) { if (shouldClose(this, closeHandler, event, fireEvent)) { - if (visible) { - element().hidePopover(); - visible = false; + if (ap.visible()) { + ap.hide(); HTMLElement trigger = ap.trigger(); if (aria != none && trigger != null) { trigger.removeAttribute(aria.attribute); @@ -347,7 +343,7 @@ private void scheduleHide() { } private void recalculatePlacement() { - if (visible) { + if (ap.visible()) { ap.applyBestPlacement(placement); } } diff --git a/core/src/main/java/org/patternfly/position/AnchorPositioning.java b/core/src/main/java/org/patternfly/position/AnchorPositioning.java index 612d1043b..2ebc89fee 100644 --- a/core/src/main/java/org/patternfly/position/AnchorPositioning.java +++ b/core/src/main/java/org/patternfly/position/AnchorPositioning.java @@ -50,17 +50,20 @@ public class AnchorPositioning { private final String id; private final HTMLElement popover; private final boolean cssPositioning; + private final boolean matchTriggerWidth; private Supplier triggerSupplier; private HTMLElement trigger; + private boolean visible; private int distance; public AnchorPositioning(String id, HTMLElement popover, Supplier triggerSupplier, int distance, - boolean cssPositioning) { + boolean cssPositioning, boolean matchTriggerWidth) { this.id = id; this.popover = popover; this.triggerSupplier = triggerSupplier; this.distance = distance; this.cssPositioning = cssPositioning; + this.matchTriggerWidth = matchTriggerWidth; } // ------------------------------------------------------ trigger @@ -180,6 +183,31 @@ private Placement bestPlacement(Placement preferred) { return placement; } + // ------------------------------------------------------ show / hide + + /** Calls {@link #beforeShow()}, then shows the popover via the Popover API. */ + public void show() { + beforeShow(); + popover.showPopover(); + visible = true; + } + + /** Hides the popover via the Popover API. */ + public void hide() { + popover.hidePopover(); + visible = false; + } + + /** Returns whether the popover is currently visible. */ + public boolean visible() { + return visible; + } + + /** Prepares the popover before it is shown. */ + public void beforeShow() { + applyMinWidth(); + } + // ------------------------------------------------------ access public boolean cssPositioning() { @@ -205,4 +233,12 @@ public HTMLElement popover() { public HTMLElement trigger() { return trigger; } + + // ------------------------------------------------------ internal + + private void applyMinWidth() { + if (matchTriggerWidth && trigger != null) { + popover.style.setProperty("min-width", trigger.offsetWidth + "px"); + } + } } diff --git a/showcase/src/main/java/org/patternfly/showcase/component/DropdownComponent.java b/showcase/src/main/java/org/patternfly/showcase/component/DropdownComponent.java index 0e9daa22c..b3e633386 100644 --- a/showcase/src/main/java/org/patternfly/showcase/component/DropdownComponent.java +++ b/showcase/src/main/java/org/patternfly/showcase/component/DropdownComponent.java @@ -63,7 +63,7 @@ public DropdownComponent() { // @code-start:dropdown-basic div() .add(nativeDropdown("Dropdown") - .applyToMenuList(ml -> ml + .applyToMenuList(list -> list .addItem(menuItem("item-0", "Action")) .addItem(linkMenuItem("item-1", "Link", "#item-1")) .addItem(menuItem("item-2", "Disabled action").disabled()) @@ -80,7 +80,7 @@ public DropdownComponent() { // @code-start:dropdown-kebab div() .add(nativeDropdown(ellipsisV(), "kebab dropdown toggle") - .applyToMenuList(ml -> ml + .applyToMenuList(list -> list .addItem(menuItem("item-0", "Action")) .addItem(linkMenuItem("item-1", "Link", "#item-1")) .addItem(menuItem("item-2", "Disabled action").disabled()) @@ -123,7 +123,7 @@ public DropdownComponent() { // @code-start:dropdown-description div() .add(nativeDropdown(menuToggle("Dropdown").fullWidth()) - .applyToMenuList(ml -> ml + .applyToMenuList(list -> list .addItem(menuItem("item-0", "Action") .description("This is a description")) .addItem(linkMenuItem("item-1", "Link", "#item-1") @@ -143,7 +143,7 @@ public DropdownComponent() { // @code-start:dropdown-badge div() .add(nativeDropdown(menuToggle("Count").addBadge(badge(4).unread())) - .applyToMenuList(ml -> ml + .applyToMenuList(list -> list .addItem(menuItem("item-0", "Action")) .addItem(linkMenuItem("item-1", "Link", "#item-1")) .addItem(menuItem("item-2", "Disabled action").disabled()) @@ -160,7 +160,7 @@ public DropdownComponent() { // @code-start:dropdown-icon div() .add(nativeDropdown(menuToggle("Icon").icon(cog())) - .applyToMenuList(ml -> ml + .applyToMenuList(list -> list .addItem(menuItem("item-0", "Action")) .addItem(linkMenuItem("item-1", "Link", "#item-1")) .addItem(menuItem("item-2", "Disabled action").disabled()) @@ -177,7 +177,7 @@ public DropdownComponent() { // @code-start:dropdown-avatar div() .add(nativeDropdown(menuToggle("John Doe").addAvatar(avatar(avatarData(), "avatar"))) - .applyToMenuList(ml -> ml + .applyToMenuList(list -> list .addItem(menuItem("item-0", "Action")) .addItem(linkMenuItem("item-1", "Link", "#item-1")) .addItem(menuItem("item-2", "Disabled action").disabled()) @@ -195,7 +195,7 @@ public DropdownComponent() { div() .add(nativeDropdown(menuToggle(split) .addCheckbox(checkboxWrapped(Id.unique(), "dropdown-split-check"))) - .applyToMenuList(ml -> ml + .applyToMenuList(list -> list .addItem(menuItem("item-0", "Action")) .addItem(linkMenuItem("item-1", "Link", "#item-1")) .addItem(menuItem("item-2", "Disabled action").disabled()) @@ -208,7 +208,7 @@ public DropdownComponent() { .add(nativeDropdown(menuToggle(split) .addCheckbox(checkboxWrapped(Id.unique(), "dropdown-split-check")) .text("10 selected")) - .applyToMenuList(ml -> ml + .applyToMenuList(list -> list .addItem(menuItem("item-0", "Action")) .addItem(linkMenuItem("item-1", "Link", "#item-1")) .addItem(menuItem("item-2", "Disabled action").disabled()) @@ -226,7 +226,7 @@ public DropdownComponent() { div() .add(nativeDropdown(menuToggle(split) .addAction(menuToggleAction("Action"))) - .applyToMenuList(ml -> ml + .applyToMenuList(list -> list .addItem(menuItem("item-0", "Action")) .addItem(linkMenuItem("item-1", "Link", "#item-1")) .addItem(menuItem("item-2", "Disabled action").disabled()) diff --git a/showcase/src/main/java/org/patternfly/showcase/component/SelectComponent.java b/showcase/src/main/java/org/patternfly/showcase/component/SelectComponent.java index 2613ccce6..76da9f107 100644 --- a/showcase/src/main/java/org/patternfly/showcase/component/SelectComponent.java +++ b/showcase/src/main/java/org/patternfly/showcase/component/SelectComponent.java @@ -33,7 +33,6 @@ import org.patternfly.showcase.Snippet; import org.patternfly.showcase.SnippetPage; import org.patternfly.style.Modifiers.FullWidth; - import elemental2.promise.Promise; import static elemental2.dom.DomGlobal.setTimeout; @@ -60,7 +59,7 @@ import static org.patternfly.component.menu.MultiSelectMenu.multiSelectCheckboxMenu; import static org.patternfly.component.menu.MultiSelectMenu.multiSelectMenu; import static org.patternfly.component.menu.MultiTypeahead.multiTypeahead; -import static org.patternfly.component.menu.SingleSelect.singleSelect; +import static org.patternfly.component.menu.NativeSingleSelect.nativeSingleSelect; import static org.patternfly.component.menu.SingleSelectMenu.singleSelectMenu; import static org.patternfly.component.menu.SingleTypeahead.singleTypeahead; import static org.patternfly.icon.IconSets.fas.bell; @@ -84,14 +83,12 @@ public SelectComponent() { code("single-select"), () -> // @code-start:single-select div() - .add(singleSelect("Select a value") + .add(nativeSingleSelect("Select a value") .style("width", "200px") - .addMenu(singleSelectMenu() - .addContent(menuContent() - .addList(menuList() - .addItem(menuItem("option-0", "Option 1")) - .addItem(menuItem("option-1", "Option 2")) - .addItem(menuItem("option-2", "Option 3")))))) + .applyToMenuList(list -> list + .addItem(menuItem("option-0", "Option 1")) + .addItem(menuItem("option-1", "Option 2")) + .addItem(menuItem("option-2", "Option 3")))) .element() // @code-end:single-select )); @@ -100,23 +97,21 @@ public SelectComponent() { code("select-option-variants"), () -> // @code-start:select-option-variants div() - .add(singleSelect("Select a value") + .add(nativeSingleSelect("Select a value") .style("width", "200px") - .addMenu(singleSelectMenu() - .addContent(menuContent() - .addList(menuList() - .addItem(menuItem("option-0", "Basic option")) - .addItem(menuItem("option-1", "Option with description") - .description("This is a description")) - .addItem(linkMenuItem("option-3", "Option with link", - placeManager().href("/components/menus/select")) - .external()) - .addItem(menuItem("option-4", "Option with icon") - .icon(bell())) - .addItem(menuItem("option-5", "Disabled options") - .disabled()) - .addItem(menuItem("option-6", - "See menu for additional variants")))))) + .applyToMenuList(list -> list + .addItem(menuItem("option-0", "Basic option")) + .addItem(menuItem("option-1", "Option with description") + .description("This is a description")) + .addItem(linkMenuItem("option-3", "Option with link", + placeManager().href("/components/menus/select")) + .external()) + .addItem(menuItem("option-4", "Option with icon") + .icon(bell())) + .addItem(menuItem("option-5", "Disabled options") + .disabled()) + .addItem(menuItem("option-6", + "See menu for additional variants")))) .element() // @code-end:select-option-variants )); @@ -125,7 +120,7 @@ public SelectComponent() { code("select-groups"), () -> // @code-start:select-groups div() - .add(singleSelect("Select a value") + .add(nativeSingleSelect("Select a value") .style("width", "200px") .addMenu(singleSelectMenu() .addContent(menuContent() @@ -151,7 +146,7 @@ public SelectComponent() { HelperText helperText = helperText().liveRegion().addItem(helperTextItem()); setVisible(helperText, false); return div() - .add(singleSelect(menuToggle) + .add(nativeSingleSelect(menuToggle) .style("width", "200px") .addMenu(singleSelectMenu() .onSingleSelect((event, menuItem, selected) -> { @@ -160,9 +155,9 @@ public SelectComponent() { setVisible(helperText, validationStatus == warning || validationStatus == error); helperText.firstItem().status(validationStatus); if (validationStatus == warning) { - helperText.firstItem().text("Danger text that explains the issue."); - } else if (validationStatus == error) { helperText.firstItem().text("Warning text that explains the issue."); + } else if (validationStatus == error) { + helperText.firstItem().text("Error text that explains the issue."); } }) .addContent(menuContent() diff --git a/showcase/src/web/showcase.css b/showcase/src/web/showcase.css index ec0ff807e..916a9078f 100644 --- a/showcase/src/web/showcase.css +++ b/showcase/src/web/showcase.css @@ -14,8 +14,8 @@ * limitations under the License. */ :root { - --pf-v6-c-tooltip--css-positioning: 0; - --pf-v6-c-popover--css-positioning: 0; + --pf-v6-c-tooltip--css-positioning: 1; + --pf-v6-c-popover--css-positioning: 1; } .pf-m-redhat-font .pf-c-content { From b001fad97da50da4f221645d2ee2dda7b1efc05e Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 31 Mar 2026 12:11:09 +0200 Subject: [PATCH 080/430] Let theme selector use native single select --- .../componentgroup/theme/ThemeSelector.java | 14 ++++++++++---- .../java/org/patternfly/showcase/Showcase.java | 2 ++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/components/src/main/java/org/patternfly/componentgroup/theme/ThemeSelector.java b/components/src/main/java/org/patternfly/componentgroup/theme/ThemeSelector.java index 44cfa8e2a..c9d4b1996 100644 --- a/components/src/main/java/org/patternfly/componentgroup/theme/ThemeSelector.java +++ b/components/src/main/java/org/patternfly/componentgroup/theme/ThemeSelector.java @@ -21,9 +21,9 @@ import org.patternfly.component.ComponentType; import org.patternfly.component.menu.MenuContent; import org.patternfly.component.menu.MenuToggle; -import org.patternfly.component.menu.SingleSelect; +import org.patternfly.component.menu.NativeSingleSelect; import org.patternfly.component.togglegroup.ToggleGroup; - +import org.patternfly.popper.Placement; import elemental2.dom.HTMLElement; import elemental2.dom.MutationRecord; @@ -35,7 +35,7 @@ import static org.patternfly.component.menu.MenuItem.menuItem; import static org.patternfly.component.menu.MenuList.menuList; import static org.patternfly.component.menu.MenuToggle.menuToggle; -import static org.patternfly.component.menu.SingleSelect.singleSelect; +import static org.patternfly.component.menu.NativeSingleSelect.nativeSingleSelect; import static org.patternfly.component.menu.SingleSelectMenu.singleSelectMenu; import static org.patternfly.component.togglegroup.ToggleGroup.toggleGroup; import static org.patternfly.component.togglegroup.ToggleGroupItem.toggleGroupItem; @@ -62,6 +62,7 @@ public static ThemeSelector themeSelector(String storagePrefix) { private static final String CONTRAST_KEY = "contrast"; private final ThemeManager colorManager; private final ThemeManager contrastManager; + private final NativeSingleSelect singleSelect; private final MenuContent menuContent; private boolean hasContrast; @@ -91,7 +92,7 @@ public static ThemeSelector themeSelector(String storagePrefix) { .description(color.description) .store(COLOR_KEY, color)))); MenuToggle menuToggle = menuToggle().icon(colorManager.value.icon()); - SingleSelect singleSelect = singleSelect(menuToggle) + singleSelect = nativeSingleSelect(menuToggle) .noDefaultSelectHandler() .addMenu(singleSelectMenu() .onSingleSelect((e, menuItem, selected) -> { @@ -119,6 +120,11 @@ public void detach(MutationRecord mutationRecord) { // ------------------------------------------------------ builder + public ThemeSelector placement(Placement placement) { + singleSelect.placement(placement); + return this; + } + public ThemeSelector withContrast() { if (!hasContrast) { ToggleGroup toggleGroup = toggleGroup(single) diff --git a/showcase/src/main/java/org/patternfly/showcase/Showcase.java b/showcase/src/main/java/org/patternfly/showcase/Showcase.java index ea864b7b9..a429bb584 100644 --- a/showcase/src/main/java/org/patternfly/showcase/Showcase.java +++ b/showcase/src/main/java/org/patternfly/showcase/Showcase.java @@ -52,6 +52,7 @@ import static org.patternfly.component.toolbar.ToolbarItem.toolbarItem; import static org.patternfly.componentgroup.theme.ThemeSelector.themeSelector; import static org.patternfly.icon.IconSets.fab.github; +import static org.patternfly.popper.Placement.bottomEnd; import static org.patternfly.showcase.Data.charts; import static org.patternfly.showcase.Data.extensions; import static org.patternfly.showcase.Data.groupComponents; @@ -136,6 +137,7 @@ public void onModuleLoad() { .add(button(github(), "https://github.com/patternfly-java") .plain())) .addItem(toolbarItem().add(themeSelector("pfj") + .placement(bottomEnd) .withContrast()))))))) .addSidebar(pageSidebar() .addBody(pageSidebarBody() From cac769ea14a977e7a36cbaa5de7e37f9f3b913a4 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 31 Mar 2026 16:14:09 +0200 Subject: [PATCH 081/430] Native single and multi select and typeahead components --- .../patternfly/component/ComponentType.java | 6 + .../component/menu/NativeDropdown.java | 21 +- .../component/menu/NativeMenuToggleMenu.java | 30 +- .../component/menu/NativeMultiSelect.java | 173 ++++++++++++ .../component/menu/NativeMultiTypeahead.java | 256 ++++++++++++++++++ .../component/menu/NativeSingleSelect.java | 8 +- .../component/menu/NativeSingleTypeahead.java | 226 ++++++++++++++++ .../component/menu/NativeTypeahead.java | 75 +++++ .../component/menu/SingleTypeahead.java | 6 +- .../component/menu/StayOpenPredicate.java | 21 ++ .../patternfly/component/menu/Typeahead.java | 8 + .../component/menu/TypeaheadSupport.java | 49 ++++ .../showcase/component/SelectComponent.java | 100 ++++--- 13 files changed, 891 insertions(+), 88 deletions(-) create mode 100644 components/src/main/java/org/patternfly/component/menu/NativeMultiSelect.java create mode 100644 components/src/main/java/org/patternfly/component/menu/NativeMultiTypeahead.java create mode 100644 components/src/main/java/org/patternfly/component/menu/NativeSingleTypeahead.java create mode 100644 components/src/main/java/org/patternfly/component/menu/NativeTypeahead.java create mode 100644 components/src/main/java/org/patternfly/component/menu/StayOpenPredicate.java diff --git a/components/src/main/java/org/patternfly/component/ComponentType.java b/components/src/main/java/org/patternfly/component/ComponentType.java index 7623fe1d6..9f3e8ae1e 100644 --- a/components/src/main/java/org/patternfly/component/ComponentType.java +++ b/components/src/main/java/org/patternfly/component/ComponentType.java @@ -101,8 +101,14 @@ public enum ComponentType { NativeDropdown("ndd", "PF6/Component/NativeDropdown"), + NativeMultiSelect("nms", "PF6/Component/NativeMultiSelect"), + + NativeMultiTypeahead("nmt", "PF6/Component/NativeMultiTypeahead"), + NativeSingleSelect("nss", "PF6/Component/NativeSingleSelect"), + NativeSingleTypeahead("nst", "PF6/Component/NativeSingleTypeahead"), + NativePopover("npvr", "PF6/Component/NativePopover"), NativeTooltip("ntt", "PF6/Component/NativeTooltip"), diff --git a/components/src/main/java/org/patternfly/component/menu/NativeDropdown.java b/components/src/main/java/org/patternfly/component/menu/NativeDropdown.java index 243d9f09d..410e09fc5 100644 --- a/components/src/main/java/org/patternfly/component/menu/NativeDropdown.java +++ b/components/src/main/java/org/patternfly/component/menu/NativeDropdown.java @@ -15,7 +15,6 @@ */ package org.patternfly.component.menu; -import java.util.function.BiConsumer; import java.util.function.Consumer; import org.patternfly.component.ComponentType; @@ -65,23 +64,11 @@ public static NativeDropdown nativeDropdown(MenuToggle menuToggle) { /** * Applies the provided {@link Consumer} to the {@link MenuList} associated with this {@link NativeDropdown}. If the menu, - * menu content, or menu list is not yet initialized, they will be created as part of this method. This allows for - * modification or customization of the menu list using the specified consumer. + * menu content, or menu list is not yet initialized, they will be created as part of this method. *

- * This method simplifies the process of adding menu items to the dropdown menu. It is a shortcut for creating and adding a - * {@link DropdownMenu}, {@link MenuContent}, and {@link MenuList} in a single step. - *

- * The two dropdowns below are exactly the same. Use the explicit approach if you need to customize the menu, content or - * list or if you want to add {@link MenuGroup}s. - * {@snippet : - * NativeDropdown implicit = nativeDropdown("Dropdown") - * .applyToMenuList((menu, list) -> list.addItem(menuItem("item-0", "Action"))); - * - * NativeDropdown explicit = nativeDropdown("Dropdown") - * .addContent(menuContent() - * .addList(menuList() - * .addItem(menuItem("item-0", "Action")))); - *} + * This method simplifies the process of adding menu items to the component. It is a shortcut for creating and adding a + * {@link DropdownMenu}, {@link MenuContent}, and {@link MenuList} in a single step. Don't use this method if you need to us + * another menu type, want to customize the menu, content or list or if you want to use {@link MenuGroup}s. * * @param consumer a {@link Consumer} that accepts a {@link MenuList} for customization or modification * @return the current {@link NativeDropdown} instance for method chaining diff --git a/components/src/main/java/org/patternfly/component/menu/NativeMenuToggleMenu.java b/components/src/main/java/org/patternfly/component/menu/NativeMenuToggleMenu.java index 17346fe0e..ea14d28db 100644 --- a/components/src/main/java/org/patternfly/component/menu/NativeMenuToggleMenu.java +++ b/components/src/main/java/org/patternfly/component/menu/NativeMenuToggleMenu.java @@ -36,7 +36,6 @@ import org.patternfly.position.AnchorPositioning; import org.patternfly.style.Classes; import org.patternfly.style.Modifiers.Disabled; - import elemental2.core.JsArray; import elemental2.dom.Event; import elemental2.dom.HTMLElement; @@ -88,7 +87,7 @@ abstract class NativeMenuToggleMenu> exte private final List> loadedHandler; private boolean disabled; private Placement placement; - private Predicate stayOpen; + private StayOpenPredicate stayOpen; private HandlerRegistration menuToggleClickHandler; private HandlerRegistration menuClickHandler; private HandlerRegistration keyHandler; @@ -120,7 +119,7 @@ public void attach(MutationRecord mutationRecord) { insertAfter(menuPopover, menuToggle.element()); ap.attach(); ap.applyPlacement(placement == auto ? bottomStart : placement); - menuToggleClickHandler = bind(menuToggle.toggleElement, click, e -> toggle()); + menuToggleClickHandler = bind(menuToggle.toggleElement, click, this::onMenuToggleClick); menuClickHandler = bind(menu, click, this::onMenuClick); keyHandler = bind(window, keydown, this::keyHandler); @@ -193,17 +192,13 @@ public B placement(Placement placement) { return that(); } - public B stayOpen() { - return stayOpen(event -> true); - } - /** - * Specifies a condition that determines whether the menu should remain open when an event occurs. + * Specifies a condition that determines whether the menu should remain open when the menu-toggle or the menu is clicked. * * @param stayOpen a {@link Predicate} that evaluates an {@link Event} to determine if the menu remains open. * @return the current instance with the condition applied, enabling method chaining. */ - public B stayOpen(Predicate stayOpen) { + public B stayOpen(StayOpenPredicate stayOpen) { this.stayOpen = stayOpen; return that(); } @@ -286,6 +281,8 @@ void searchInputControlsMenuList() { } } + // ------------------------------------------------------ internal event handlers + private void keyHandler(KeyboardEvent event) { if (expanded()) { if (Escape.match(event)) { @@ -322,9 +319,20 @@ private void keyHandler(KeyboardEvent event) { } } + private void onMenuToggleClick(Event event) { + if (expanded()) { + if (stayOpen != null && stayOpen.test(event, menuToggle, menu)) { + return; + } + collapse(); + } else { + expand(); + } + } + private void onMenuClick(Event event) { if (expanded()) { - if (stayOpen != null && stayOpen.test(event)) { + if (stayOpen != null && stayOpen.test(event, menuToggle, menu)) { return; } collapse(); @@ -337,7 +345,7 @@ private void onOutsideClick(Event event) { boolean insideMenu = menu.element().contains(target); boolean insideToggle = menuToggle.element().contains(target); if (!insideMenu && !insideToggle) { - if (stayOpen != null && stayOpen.test(event)) { + if (stayOpen != null && stayOpen.test(event, menuToggle, menu)) { return; } collapse(); diff --git a/components/src/main/java/org/patternfly/component/menu/NativeMultiSelect.java b/components/src/main/java/org/patternfly/component/menu/NativeMultiSelect.java new file mode 100644 index 000000000..f15be622f --- /dev/null +++ b/components/src/main/java/org/patternfly/component/menu/NativeMultiSelect.java @@ -0,0 +1,173 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.component.menu; + +import java.util.List; +import java.util.Objects; +import java.util.function.Consumer; + +import org.patternfly.component.ComponentType; +import org.patternfly.component.SelectionMode; +import org.patternfly.component.badge.Badge; + +import elemental2.dom.Node; + +import static java.util.Collections.emptyList; +import static java.util.stream.Collectors.toList; +import static org.patternfly.component.badge.Badge.badge; +import static org.patternfly.component.menu.MenuContent.menuContent; +import static org.patternfly.component.menu.MenuList.menuList; +import static org.patternfly.component.menu.MultiSelectMenu.multiSelectMenu; + +/** + * A select component to select multiple items from a list. + *

+ * This implementation uses the Popover API and CSS anchor positioning instead of Popper.js. The select uses the browser's + * top-layer rendering for correct stacking, eliminating z-index issues. CSS {@code position-try-fallbacks} handles menu + * flipping when there is not enough space. + * + * @see https://www.patternfly.org/components/menus/select + */ +public class NativeMultiSelect extends NativeMenuToggleMenu { + + // ------------------------------------------------------ factory + + public static NativeMultiSelect nativeMultiSelect(String text) { + return new NativeMultiSelect(MenuToggle.menuToggle(text).addBadge(badge(0).read())); + } + + public static NativeMultiSelect nativeMultiSelect(MenuToggle menuToggle) { + return new NativeMultiSelect(menuToggle); + } + + // ------------------------------------------------------ instance + + private MenuContent menuContent; + private MenuList menuList; + + NativeMultiSelect(MenuToggle menuToggle) { + super(ComponentType.NativeMultiSelect, menuToggle); + if (menuToggle.badge() != null) { + menuToggle.badge().style("visibility", "hidden", true); + } + stayOpen((e, mt, m) -> menu != null && menu.element().contains(((Node) e.target))); + } + + // ------------------------------------------------------ add + + @Override + public NativeMultiSelect add(Menu menu) { + super.add(menu); + if (menu.selectionMode == SelectionMode.multi) { + menu.onMultiSelect((e, m, items) -> updateMenuToggle(items)); + } + return this; + } + + // ------------------------------------------------------ builder + + /** + * Applies the provided {@link Consumer} to the {@link MenuList} associated with this {@link NativeMultiSelect}. If the + * menu, menu content, or menu list is not yet initialized, they will be created as part of this method. + *

+ * This method simplifies the process of adding menu items to the component. It is a shortcut for creating and adding a + * {@link MultiSelectMenu}, {@link MenuContent}, and {@link MenuList} in a single step. Don't use this method if you need to + * us another menu type, want to customize the menu, content or list or if you want to use {@link MenuGroup}s. + * + * @param consumer a {@link Consumer} that accepts a {@link MenuList} for customization or modification + * @return the current {@link NativeMultiSelect} instance for method chaining + */ + public NativeMultiSelect applyToMenuList(Consumer consumer) { + if (menu == null) { + add(multiSelectMenu()); + } + if (menuContent == null) { + menuContent = menuContent(); + menu.addContent(menuContent); + } + if (menuList == null) { + menuList = menuList(); + menuContent.addList(menuList); + } + + consumer.accept(menuList); + return this; + } + + @Override + public NativeMultiSelect that() { + return this; + } + + // ------------------------------------------------------ api + + public void clear() { + clear(true); + } + + public void clear(boolean fireEvent) { + menu.unselectAllItems(); + updateMenuToggle(emptyList()); + if (fireEvent) { + menu.fireMultiSelection(); + } + } + + public void selectIdentifiers(List identifiers) { + selectItems(identifiers.stream() + .map(identifier -> menu().findItem(identifier)) + .filter(Objects::nonNull) + .collect(toList()), true); + } + + public void selectIdentifiers(List identifiers, boolean fireEvent) { + selectItems(identifiers.stream() + .map(identifier -> menu().findItem(identifier)) + .filter(Objects::nonNull) + .collect(toList()), fireEvent); + } + + public void selectItems(List items) { + selectItems(items, true); + } + + public void selectItems(List items, boolean fireEvent) { + if (menu != null && menuToggle != null && !items.isEmpty()) { + for (MenuItem item : items) { + menu.select(item, true, false); + } + if (fireEvent) { + menu.fireMultiSelection(); + } + } + updateMenuToggle(items); + } + + // ------------------------------------------------------ internal + + private void updateMenuToggle(List items) { + Badge badge = menuToggle.badge(); + if (badge != null) { + int size = items.size(); + badge.count(size); + if (size == 0) { + badge.style("visibility", "hidden", true); + } else { + badge.style("visibility", "unset"); + } + } + } +} \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/menu/NativeMultiTypeahead.java b/components/src/main/java/org/patternfly/component/menu/NativeMultiTypeahead.java new file mode 100644 index 000000000..1a0e0dcc7 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/menu/NativeMultiTypeahead.java @@ -0,0 +1,256 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.component.menu; + +import java.util.List; +import java.util.Objects; +import java.util.function.Consumer; +import java.util.function.Function; + +import org.jboss.elemento.By; +import org.jboss.elemento.Elements; +import org.patternfly.component.ComponentType; +import org.patternfly.component.SelectionMode; +import org.patternfly.component.label.Label; +import org.patternfly.component.label.LabelGroup; +import org.patternfly.component.textinputgroup.BaseFilterInput; +import org.patternfly.component.textinputgroup.FilterInput; +import elemental2.dom.Element; +import elemental2.promise.Promise; + +import static java.util.Collections.emptyList; +import static java.util.stream.Collectors.toList; +import static org.patternfly.component.menu.MenuContent.menuContent; +import static org.patternfly.component.menu.MenuList.menuList; +import static org.patternfly.component.menu.MultiSelectMenu.multiSelectMenu; +import static org.patternfly.component.menu.TypeaheadSupport.shouldExpandOnKeyup; +import static org.patternfly.component.menu.TypeaheadSupport.typeaheadDefaults; +import static org.patternfly.component.textinputgroup.FilterInput.filterInput; +import static org.patternfly.style.Classes.component; +import static org.patternfly.style.Classes.labelGroup; +import static org.patternfly.style.Classes.textInputGroup; +import static org.patternfly.style.Classes.utilities; + +/** + * A typeahead is a select variant that replaces the typical button toggle for opening the select menu with a text input and + * button toggle combo. As a user enters characters into the text input, the menu options will be filtered to match. + *

+ * This implementation uses the Popover API and CSS anchor positioning instead of Popper.js. The typeahead uses the browser's + * top-layer rendering for correct stacking, eliminating z-index issues. CSS {@code position-try-fallbacks} handles menu + * flipping when there is not enough space. + * + * @see https://www.patternfly.org/components/menus/select + */ +public class NativeMultiTypeahead extends NativeMenuToggleMenu + implements NativeTypeahead { + + // ------------------------------------------------------ factory + + /** + * Creates a new {@link NativeMultiTypeahead} component with a {@link MenuToggle} of type {@link MenuToggleType#typeahead} + * and a {@link FilterInput}. + */ + public static NativeMultiTypeahead nativeMultiTypeahead(String id, String placeholder) { + return new NativeMultiTypeahead(filterInput(id).plain().placeholder(placeholder)); + } + + /** + * Creates a new {@link NativeMultiTypeahead} component with a {@link MenuToggle} of type {@link MenuToggleType#typeahead} + * and the specified {@link BaseFilterInput}. + * + * @param filterInput the {@link BaseFilterInput} instance used to configure the typeahead component + * @return a new {@link NativeMultiTypeahead} instance configured with the given filter input + */ + public static NativeMultiTypeahead nativeMultiTypeahead(BaseFilterInput filterInput) { + return new NativeMultiTypeahead(filterInput); + } + + // ------------------------------------------------------ instance + + private final BaseFilterInput filterInput; + private SearchFilter searchFilter; + private NoResults noResults; + private MenuContent menuContent; + private MenuList menuList; + + NativeMultiTypeahead(BaseFilterInput filterInput) { + super(ComponentType.NativeMultiTypeahead, MenuToggle.menuToggle(filterInput)); + this.filterInput = filterInput; + this.searchFilter = SearchFilter.contains(); + this.noResults = NoResults.noResults(); + + typeaheadDefaults(this); + filterInput + .onKeyup((e, c, value) -> { + if (shouldExpandOnKeyup(this, e)) { + expand(false); + } + menu.search(searchFilter, noResults, value); + }) + .onInput((e, c, value) -> { + expand(false); + menu.search(searchFilter, noResults, value); + }) + .noAddOnEnter() + .onEnter((e, fi) -> { + String identifier = filterInput.textToIdentifier().apply(fi.value()); + MenuItem menuItem = menu.findItem(identifier); + if (menuItem != null) { + if (!filterInput.labelGroup().contains(identifier)) { + Label label = filterInput.textToLabel().apply(menuItem.text()); + filterInput.labelGroup().addItem(label); + menu.select(menuItem, true, false); + } + } + }); + stayOpen((event, mt, m) -> { + Element target = (Element) event.target; + boolean itemClick = menu.element().contains(target); + boolean inputClick = filterInput.input().element() == target; + // The labels and utilities may no longer be available in the DOM. That's why we don't use + // element.contains(target), but closest() - bottom up instead of top down! + boolean labelGroupClick = Elements.closest(target, By.classname(component(labelGroup))) != null; + boolean utilitiesClick = Elements.closest(target, By.classname(component(textInputGroup, utilities))) != null; + return itemClick || inputClick || labelGroupClick || utilitiesClick; + }); + } + + // ------------------------------------------------------ add + + @Override + public NativeMultiTypeahead add(Menu menu) { + super.add(menu); + if (menu.selectionMode == SelectionMode.multi) { + menu.onMultiSelect((e, m, items) -> updateMenuToggle(items)); + } + searchInputControlsMenuList(); + return this; + } + + // ------------------------------------------------------ builder + + /** + * Applies the provided consumer to the {@link MenuList} associated with this {@link NativeMultiTypeahead}. If the menu, + * menu content, or menu list is not yet initialized, they will be created as part of this method. + *

+ * This method simplifies the process of adding menu items to the component. It is a shortcut for creating and adding a + * {@link MultiSelectMenu}, {@link MenuContent}, and {@link MenuList} in a single step. Don't use this method if you need to + * us another menu type, want to customize the menu, content or list or if you want to use {@link MenuGroup}s. + * + * @param consumer a consumer that accepts a {@link MenuList} for customization or modification + * @return the current {@link NativeMultiTypeahead} instance for method chaining + */ + public NativeMultiTypeahead applyToMenuList(Consumer consumer) { + if (menu == null) { + add(multiSelectMenu()); + } + if (menuContent == null) { + menuContent = menuContent(); + menu.addContent(menuContent); + } + if (menuList == null) { + menuList = menuList(); + menuContent.addList(menuList); + } + + consumer.accept(menuList); + return this; + } + + @Override + public NativeMultiTypeahead allowNewItems(Function prompt, + Function> createItem) { + TypeaheadSupport.allowNewItems(this, this, prompt, createItem); + return this; + } + + @Override + public NativeMultiTypeahead that() { + return this; + } + + // ------------------------------------------------------ events + + @Override + public NativeMultiTypeahead onSearch(SearchFilter searchFilter) { + this.searchFilter = searchFilter; + return this; + } + + @Override + public NativeMultiTypeahead onNoResults(NoResults noResults) { + this.noResults = noResults; + return this; + } + + // ------------------------------------------------------ api + + public void clear() { + clear(true); + } + + public void clear(boolean fireEvent) { + menu.unselectAllItems(); + updateMenuToggle(emptyList()); + if (fireEvent) { + menu.fireMultiSelection(); + } + } + + public void selectIdentifiers(List identifiers) { + selectItems(identifiers.stream() + .map(identifier -> menu().findItem(identifier)) + .filter(Objects::nonNull) + .collect(toList()), true); + } + + public void selectIdentifiers(List identifiers, boolean fireEvent) { + selectItems(identifiers.stream() + .map(identifier -> menu().findItem(identifier)) + .filter(Objects::nonNull) + .collect(toList()), fireEvent); + } + + public void selectItems(List items) { + selectItems(items, true); + } + + public void selectItems(List items, boolean fireEvent) { + if (menu != null && menuToggle != null && !items.isEmpty()) { + for (MenuItem item : items) { + menu.select(item, true, false); + } + if (fireEvent) { + menu.fireMultiSelection(); + } + } + updateMenuToggle(items); + } + + // ------------------------------------------------------ internal + + private void updateMenuToggle(List items) { + LabelGroup labelGroup = filterInput.labelGroup(); + if (labelGroup != null && items != null) { + labelGroup.clear(); + for (MenuItem item : items) { + Label label = filterInput.textToLabel().apply(item.text()) + .onClose((e, c) -> menu.select(item, false, false)); + labelGroup.addItem(label); + } + } + } +} \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/menu/NativeSingleSelect.java b/components/src/main/java/org/patternfly/component/menu/NativeSingleSelect.java index 642a6680f..ada833c00 100644 --- a/components/src/main/java/org/patternfly/component/menu/NativeSingleSelect.java +++ b/components/src/main/java/org/patternfly/component/menu/NativeSingleSelect.java @@ -73,11 +73,11 @@ public NativeSingleSelect add(Menu menu) { /** * Applies the provided {@link Consumer} to the {@link MenuList} associated with this {@link NativeSingleSelect}. If the - * menu, menu content, or menu list is not yet initialized, they will be created as part of this method. This allows for - * modification or customization of the menu list using the specified consumer. + * menu, menu content, or menu list is not yet initialized, they will be created as part of this method. *

- * This method simplifies the process of adding menu items to the select menu. It is a shortcut for creating and adding a - * {@link SingleSelectMenu}, {@link MenuContent}, and {@link MenuList} in a single step. + * This method simplifies the process of adding menu items to the component. It is a shortcut for creating and adding a + * {@link SingleSelectMenu}, {@link MenuContent}, and {@link MenuList} in a single step. Don't use this method if you need + * to us another menu type, want to customize the menu, content or list or if you want to use {@link MenuGroup}s. * * @param consumer a {@link Consumer} that accepts a {@link MenuList} for customization or modification * @return the current {@link NativeSingleSelect} instance for method chaining diff --git a/components/src/main/java/org/patternfly/component/menu/NativeSingleTypeahead.java b/components/src/main/java/org/patternfly/component/menu/NativeSingleTypeahead.java new file mode 100644 index 000000000..077772f9d --- /dev/null +++ b/components/src/main/java/org/patternfly/component/menu/NativeSingleTypeahead.java @@ -0,0 +1,226 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.component.menu; + +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Function; + +import org.jboss.elemento.By; +import org.jboss.elemento.Elements; +import org.patternfly.component.ComponentType; +import org.patternfly.component.SelectionMode; +import org.patternfly.component.textinputgroup.BaseSearchInput; +import org.patternfly.component.textinputgroup.SearchInput; +import elemental2.dom.Element; +import elemental2.promise.Promise; + +import static org.patternfly.component.menu.MenuContent.menuContent; +import static org.patternfly.component.menu.MenuList.menuList; +import static org.patternfly.component.menu.SingleSelectMenu.singleSelectMenu; +import static org.patternfly.component.menu.TypeaheadSupport.shouldExpandOnKeyup; +import static org.patternfly.component.menu.TypeaheadSupport.typeaheadDefaults; +import static org.patternfly.component.textinputgroup.SearchInput.searchInput; +import static org.patternfly.style.Classes.component; +import static org.patternfly.style.Classes.textInputGroup; +import static org.patternfly.style.Classes.utilities; + +/** + * A typeahead is a select variant that replaces the typical button toggle for opening the select menu with a text input and + * button toggle combo. As a user enters characters into the text input, the menu options will be filtered to match. + *

+ * This implementation uses the Popover API and CSS anchor positioning instead of Popper.js. The typeahead uses the browser's + * top-layer rendering for correct stacking, eliminating z-index issues. CSS {@code position-try-fallbacks} handles menu + * flipping when there is not enough space. + * + * @see https://www.patternfly.org/components/menus/select + */ +public class NativeSingleTypeahead extends NativeMenuToggleMenu + implements NativeTypeahead { + + // ------------------------------------------------------ factory + + /** + * Creates a new {@link NativeSingleTypeahead} component with a {@link MenuToggle} of type {@link MenuToggleType#typeahead} + * and a {@link SearchInput}. + */ + public static NativeSingleTypeahead nativeSingleTypeahead(String id, String placeholder) { + return new NativeSingleTypeahead(searchInput(id).plain().placeholder(placeholder)); + } + + /** + * Creates a new {@link NativeSingleTypeahead} instance using the provided {@link BaseSearchInput}. + * + * @param searchInput the {@link BaseSearchInput} used to configure the typeahead component. + * @return a new {@link NativeSingleTypeahead} instance initialized with a {@link MenuToggle} of type + * {@link MenuToggleType#typeahead}. + */ + public static NativeSingleTypeahead nativeSingleTypeahead(BaseSearchInput searchInput) { + return new NativeSingleTypeahead(searchInput); + } + + // ------------------------------------------------------ instance + + private boolean defaultSelectHandler; + private SearchFilter searchFilter; + private NoResults noResults; + private MenuContent menuContent; + private MenuList menuList; + + NativeSingleTypeahead(BaseSearchInput searchInput) { + super(ComponentType.NativeSingleTypeahead, MenuToggle.menuToggle(searchInput)); + this.defaultSelectHandler = true; + this.searchFilter = SearchFilter.contains(); + this.noResults = NoResults.noResults(); + + typeaheadDefaults(this); + menuToggle.searchInput() + .onKeyup((e, c, value) -> { + if (shouldExpandOnKeyup(this, e)) { + expand(false); + } + menu.search(searchFilter, noResults, value); + }) + .onInput((e, c, value) -> { + expand(false); + menu.search(searchFilter, noResults, value); + }); + stayOpen((e, mt, m) -> { + Element target = (Element) e.target; + boolean inputClick = searchInput.input().element() == target; + // The utilities may no longer be available in the DOM. That's why we don't use + // element.contains(target), but closest() - bottom up instead of top down! + boolean utilitiesClick = Elements.closest(target, By.classname(component(textInputGroup, utilities))) != null; + return inputClick || utilitiesClick; + }); + } + + // ------------------------------------------------------ add + + @Override + public NativeSingleTypeahead add(Menu menu) { + super.add(menu); + if (menu.menuType == MenuType.select && menu.selectionMode == SelectionMode.single && defaultSelectHandler) { + menu.onSingleSelect((e, menuItem, s) -> updateMenuToggle(menuItem)); + } + searchInputControlsMenuList(); + return this; + } + + // ------------------------------------------------------ builder + + /** + * Applies the provided consumer to the {@link MenuList} associated with this {@link NativeSingleTypeahead}. If the menu, + * menu content, or menu list is not yet initialized, they will be created as part of this method. + *

+ * This method simplifies the process of adding menu items to the component. It is a shortcut for creating and adding a + * {@link SingleSelectMenu}, {@link MenuContent}, and {@link MenuList} in a single step. Don't use this method if you need + * to us another menu type, want to customize the menu, content or list or if you want to use {@link MenuGroup}s. + * + * @param consumer a consumer that accepts a {@link MenuList} for customization or modification + * @return the current {@link NativeSingleTypeahead} instance for method chaining + */ + public NativeSingleTypeahead applyToMenuList(Consumer consumer) { + if (menu == null) { + add(singleSelectMenu()); + } + if (menuContent == null) { + menuContent = menuContent(); + menu.addContent(menuContent); + } + if (menuList == null) { + menuList = menuList(); + menuContent.addList(menuList); + } + + consumer.accept(menuList); + return this; + } + + public NativeSingleTypeahead noDefaultSelectHandler() { + this.defaultSelectHandler = false; + return this; + } + + @Override + public NativeSingleTypeahead allowNewItems(Function prompt, + Function> createItem) { + TypeaheadSupport.allowNewItems(this, this, prompt, createItem); + return this; + } + + @Override + public NativeSingleTypeahead that() { + return this; + } + + // ------------------------------------------------------ events + + @Override + public NativeSingleTypeahead onSearch(SearchFilter searchFilter) { + this.searchFilter = searchFilter; + return this; + } + + @Override + public NativeSingleTypeahead onNoResults(NoResults noResults) { + this.noResults = noResults; + return this; + } + + // ------------------------------------------------------ api + + public void clear() { + clear(true); + } + + public void clear(boolean fireEvent) { + List selectedItems = menu.selectedItems(); + menu.clearSearch(); + menu.unselectAllItems(); + menuToggle.text(""); + if (fireEvent && !selectedItems.isEmpty()) { + menu.fireSingleSelection(selectedItems.get(0), false); + } + } + + public void select(String identifier) { + select(menu().findItem(identifier), true); + } + + public void select(String identifier, boolean fireEvent) { + select(menu().findItem(identifier), fireEvent); + } + + public void select(MenuItem item) { + select(item, true); + } + + public void select(MenuItem item, boolean fireEvent) { + if (menu != null && menuToggle != null && item != null) { + menu.select(item, true, fireEvent); + if (!fireEvent && defaultSelectHandler) { + updateMenuToggle(item); + } + } + } + + // ------------------------------------------------------ internal + + private void updateMenuToggle(MenuItem item) { + menuToggle.text(item.text()); + } +} \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/menu/NativeTypeahead.java b/components/src/main/java/org/patternfly/component/menu/NativeTypeahead.java new file mode 100644 index 000000000..c51d9c75c --- /dev/null +++ b/components/src/main/java/org/patternfly/component/menu/NativeTypeahead.java @@ -0,0 +1,75 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.component.menu; + +import java.util.function.Function; + +import elemental2.promise.Promise; + +/** + * Represents a typeahead component interface that allows users to search, filter, and optionally create new items dynamically + * based on input. A typeahead component is typically used in dropdowns or menus to enable efficient selection of items + * from a potentially large set. + * + * @param the type of the implementing class, allowing method chaining for configuration + */ +public interface NativeTypeahead> { + + /** + * Allows the creation of new menu items based on user input. This method enables the typeahead component to dynamically add + * custom items when the provided input does not match any existing items. A default prompt is used to guide the user with a + * message like "Create new item ''". + * + * @param createItem a {@link Function} that takes a {@code String} input representing the user's data and returns a + * {@link Promise} of a {@link MenuItem}, which corresponds to the newly created item. + * @return an instance of the enclosing type, enabling method chaining for further configuration. + */ + default M allowNewItems(Function> createItem) { + return allowNewItems(value -> "Create new item \"" + value + "\"", createItem); + } + + /** + * Allows the creation of new menu items based on user input. This method enables a typeahead component to provide + * functionality for dynamically adding custom items when the user-provided input does not match any existing items. + * + * @param prompt a {@link Function} that takes a {@code String} input representing the user's data and returns a + * {@code String} response, typically used to prompt the user or display a message. + * @param createItem a {@link Function} that takes a {@code String} input representing the user's data and returns a + * {@link Promise} of a {@link MenuItem}, representing the newly created item. + * @return an instance of the enclosing type, enabling method chaining for further configuration. + */ + M allowNewItems(Function prompt, Function> createItem); + + /** + * Configures the search behavior for this typeahead. + * + * @param searchFilter a {@link SearchFilter} that defines the search logic. The first parameter is a {@link MenuItem} + * representing a menu item, and the second parameter is a {@link String} representing the search query. + * The predicate should return {@code true} for items matching the search. + * @return the instance for method chaining. + */ + M onSearch(SearchFilter searchFilter); + + /** + * Configures the behavior for generating a "no results" menu item when no matching items are found in the menu list for the + * given input text. + * + * @param noResults a {@link NoResults} implementation responsible for defining how the "no results" menu item is created + * and displayed when no matches are found. + * @return the instance of the current type enabling method chaining. + */ + M onNoResults(NoResults noResults); +} \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/menu/SingleTypeahead.java b/components/src/main/java/org/patternfly/component/menu/SingleTypeahead.java index a800aeaeb..d220d328b 100644 --- a/components/src/main/java/org/patternfly/component/menu/SingleTypeahead.java +++ b/components/src/main/java/org/patternfly/component/menu/SingleTypeahead.java @@ -78,8 +78,10 @@ public static SingleTypeahead singleTypeahead(BaseSearchInput searchInput) { }); stayOpen(event -> { Node target = (Node) event.target; - return searchInput.input().element() == target || - (searchInput.utilities() != null && searchInput.utilities().element().contains(target)); + boolean inputClick = searchInput.input().element() == target; + boolean utilitiesClick = searchInput.utilities() != null && + searchInput.utilities().element().contains(target); + return inputClick || utilitiesClick; }); } diff --git a/components/src/main/java/org/patternfly/component/menu/StayOpenPredicate.java b/components/src/main/java/org/patternfly/component/menu/StayOpenPredicate.java new file mode 100644 index 000000000..0d4c7b8a6 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/menu/StayOpenPredicate.java @@ -0,0 +1,21 @@ +package org.patternfly.component.menu; + +import java.util.Objects; + +import elemental2.dom.Event; + +@FunctionalInterface +public interface StayOpenPredicate { + + boolean test(Event event, MenuToggle menuToggle, Menu menu); + + default StayOpenPredicate and(StayOpenPredicate other) { + Objects.requireNonNull(other); + return (event, menuToggle, menu) -> test(event, menuToggle, menu) && other.test(event, menuToggle, menu); + } + + default StayOpenPredicate or(StayOpenPredicate other) { + Objects.requireNonNull(other); + return (event, menuToggle, menu) -> test(event, menuToggle, menu) || other.test(event, menuToggle, menu); + } +} diff --git a/components/src/main/java/org/patternfly/component/menu/Typeahead.java b/components/src/main/java/org/patternfly/component/menu/Typeahead.java index 2ce85bc36..4403e6185 100644 --- a/components/src/main/java/org/patternfly/component/menu/Typeahead.java +++ b/components/src/main/java/org/patternfly/component/menu/Typeahead.java @@ -19,6 +19,14 @@ import elemental2.promise.Promise; +/** + * A generic interface representing a typeahead component, which allows for dynamic filtering, searching, + * and optionally creating new menu items based on user-provided input. This component offers flexible + * configuration for handling search queries, displaying "no results" messages, and managing custom + * item creation. + * + * @param A type that extends {@link MenuToggleMenu}, representing the specific implementation of the typeahead. + */ public interface Typeahead> { /** diff --git a/components/src/main/java/org/patternfly/component/menu/TypeaheadSupport.java b/components/src/main/java/org/patternfly/component/menu/TypeaheadSupport.java index 9683fb668..f6e95b370 100644 --- a/components/src/main/java/org/patternfly/component/menu/TypeaheadSupport.java +++ b/components/src/main/java/org/patternfly/component/menu/TypeaheadSupport.java @@ -58,6 +58,32 @@ static void typeaheadDefaults(MenuToggleMenu mtm) { }); } + static void typeaheadDefaults(NativeMenuToggleMenu mtm) { + mtm.menuToggle.searchInput().input() + .attr(role, combobox) + .aria(Aria.expanded, false) + .autocomplete("off") + .on(click, event -> mtm.toggle()); + + mtm.onToggle((e, c, expanded) -> { + if (expanded) { + // show all menu items when expanded + mtm.menu.clearSearch(); + } + }); + mtm.menuToggle.searchInput() + .onClear((e, si) -> { + mtm.menu.clearSearch(); + mtm.menu.unselectAllItems(); + si.input().element().focus(); + }) + .onChange((e, c, value) -> { + if (value.isEmpty()) { + mtm.menu.clearSearch(); + } + }); + } + static boolean shouldExpandOnKeyup(MenuToggleMenu mtm, Event event) { if (Enter.match(event) || Escape.match(event) || Tab.match(event)) { return false; @@ -65,6 +91,13 @@ static boolean shouldExpandOnKeyup(MenuToggleMenu mtm, Event event) { return !mtm.expanded(); } + static boolean shouldExpandOnKeyup(NativeMenuToggleMenu mtm, Event event) { + if (Enter.match(event) || Escape.match(event) || Tab.match(event)) { + return false; + } + return !mtm.expanded(); + } + static void allowNewItems(MenuToggleMenu mtm, Typeahead typeahead, Function prompt, Function> createItem) { typeahead.onNoResults((menuList, text) -> createNewMenuItem(prompt.apply(text)) @@ -80,4 +113,20 @@ static void allowNewItems(MenuToggleMenu mtm, Typeahead typeahead, mtm.collapse(false); }))); } + + static void allowNewItems(NativeMenuToggleMenu mtm, NativeTypeahead typeahead, + Function prompt, Function> createItem) { + typeahead.onNoResults((menuList, text) -> createNewMenuItem(prompt.apply(text)) + .onClick((e, c) -> createItem.apply(text) + .then(menuItem -> { + mtm.menu.clearSearch(); + menuList.add(menuItem); + mtm.menu.select(menuItem, true, true); + return null; + }).finally_(() -> { + mtm.menuToggle.text(text); + mtm.menuToggle.searchInput().input().element().focus(); + mtm.collapse(false); + }))); + } } diff --git a/showcase/src/main/java/org/patternfly/showcase/component/SelectComponent.java b/showcase/src/main/java/org/patternfly/showcase/component/SelectComponent.java index 76da9f107..9718af80c 100644 --- a/showcase/src/main/java/org/patternfly/showcase/component/SelectComponent.java +++ b/showcase/src/main/java/org/patternfly/showcase/component/SelectComponent.java @@ -55,13 +55,13 @@ import static org.patternfly.component.menu.MenuItem.menuItem; import static org.patternfly.component.menu.MenuList.menuList; import static org.patternfly.component.menu.MenuToggle.menuToggle; -import static org.patternfly.component.menu.MultiSelect.multiSelect; import static org.patternfly.component.menu.MultiSelectMenu.multiSelectCheckboxMenu; import static org.patternfly.component.menu.MultiSelectMenu.multiSelectMenu; -import static org.patternfly.component.menu.MultiTypeahead.multiTypeahead; +import static org.patternfly.component.menu.NativeMultiSelect.nativeMultiSelect; +import static org.patternfly.component.menu.NativeMultiTypeahead.nativeMultiTypeahead; import static org.patternfly.component.menu.NativeSingleSelect.nativeSingleSelect; +import static org.patternfly.component.menu.NativeSingleTypeahead.nativeSingleTypeahead; import static org.patternfly.component.menu.SingleSelectMenu.singleSelectMenu; -import static org.patternfly.component.menu.SingleTypeahead.singleTypeahead; import static org.patternfly.icon.IconSets.fas.bell; import static org.patternfly.showcase.ApiDoc.Type.component; import static org.patternfly.showcase.Code.code; @@ -174,7 +174,7 @@ public SelectComponent() { code("multi-select"), () -> // @code-start:multi-select div() - .add(multiSelect("Filter by status") + .add(nativeMultiSelect("Filter by status") .addMenu(multiSelectCheckboxMenu() .addContent(menuContent() .addList(menuList() @@ -191,17 +191,15 @@ public SelectComponent() { code("single-typeahead"), () -> // @code-start:single-typeahead div() - .add(singleTypeahead("single-typeahead-0", "Select a state") - .applyTo(FullWidth::fullWidth) - .addMenu(singleSelectMenu() - .addContent(menuContent() - .addList(menuList() - .addItem(menuItem("alabama", "Alabama")) - .addItem(menuItem("florida", "Florida")) - .addItem(menuItem("new-jersey", "New Jersey")) - .addItem(menuItem("new-mexico", "New Mexico")) - .addItem(menuItem("new-york", "New York")) - .addItem(menuItem("north-carolina", "North Carolina")))))) + .add(nativeSingleTypeahead("single-typeahead-0", "Select a state") + .applyToMenuToggle(FullWidth::fullWidth) + .applyToMenuList(list -> list + .addItem(menuItem("alabama", "Alabama")) + .addItem(menuItem("florida", "Florida")) + .addItem(menuItem("new-jersey", "New Jersey")) + .addItem(menuItem("new-mexico", "New Mexico")) + .addItem(menuItem("new-york", "New York")) + .addItem(menuItem("north-carolina", "North Carolina")))) .element() // @code-end:single-typeahead )); @@ -210,19 +208,17 @@ public SelectComponent() { code("single-typeahead-create"), () -> // @code-start:single-typeahead-create div() - .add(singleTypeahead("single-typeahead-create-0", "Select a state") - .applyTo(FullWidth::fullWidth) + .add(nativeSingleTypeahead("single-typeahead-create-0", "Select a state") + .applyToMenuToggle(FullWidth::fullWidth) + .applyToMenuList(list -> list + .addItem(menuItem("alabama", "Alabama")) + .addItem(menuItem("florida", "Florida")) + .addItem(menuItem("new-jersey", "New Jersey")) + .addItem(menuItem("new-mexico", "New Mexico")) + .addItem(menuItem("new-york", "New York")) + .addItem(menuItem("north-carolina", "North Carolina"))) .allowNewItems(value -> "Create new item \"" + value + "\"", - value -> Promise.resolve(menuItem(Id.build(value), value))) - .addMenu(singleSelectMenu() - .addContent(menuContent() - .addList(menuList() - .addItem(menuItem("alabama", "Alabama")) - .addItem(menuItem("florida", "Florida")) - .addItem(menuItem("new-jersey", "New Jersey")) - .addItem(menuItem("new-mexico", "New Mexico")) - .addItem(menuItem("new-york", "New York")) - .addItem(menuItem("north-carolina", "North Carolina")))))) + value -> Promise.resolve(menuItem(Id.build(value), value)))) .element() // @code-end:single-typeahead-create )); @@ -240,8 +236,8 @@ public SelectComponent() { return div() - .add(singleTypeahead("single-typeahead-async-0", "Lorem ipsum") - .applyTo(FullWidth::fullWidth) + .add(nativeSingleTypeahead("single-typeahead-async-0", "Lorem ipsum") + .applyToMenuToggle(FullWidth::fullWidth) .addMenu(singleSelectMenu().scrollable() .addContent(menuContent() .addList(menuList() @@ -254,17 +250,15 @@ public SelectComponent() { code("multi-typeahead"), () -> // @code-start:multi-typeahead div() - .add(multiTypeahead("multi-typeahead-0", "Select a state") - .applyTo(FullWidth::fullWidth) - .addMenu(multiSelectMenu() - .addContent(menuContent() - .addList(menuList() - .addItem(menuItem("alabama", "Alabama")) - .addItem(menuItem("florida", "Florida")) - .addItem(menuItem("new-jersey", "New Jersey")) - .addItem(menuItem("new-mexico", "New Mexico")) - .addItem(menuItem("new-york", "New York")) - .addItem(menuItem("north-carolina", "North Carolina")))))) + .add(nativeMultiTypeahead("multi-typeahead-0", "Select a state") + .applyToMenuToggle(FullWidth::fullWidth) + .applyToMenuList(list -> list + .addItem(menuItem("alabama", "Alabama")) + .addItem(menuItem("florida", "Florida")) + .addItem(menuItem("new-jersey", "New Jersey")) + .addItem(menuItem("new-mexico", "New Mexico")) + .addItem(menuItem("new-york", "New York")) + .addItem(menuItem("north-carolina", "North Carolina")))) .element() // @code-end:multi-typeahead )); @@ -273,19 +267,17 @@ public SelectComponent() { code("multi-typeahead-create"), () -> // @code-start:multi-typeahead-create div() - .add(multiTypeahead("multi-typeahead-create-0", "Select a state") - .applyTo(FullWidth::fullWidth) + .add(nativeMultiTypeahead("multi-typeahead-create-0", "Select a state") + .applyToMenuToggle(FullWidth::fullWidth) + .applyToMenuList(list -> list + .addItem(menuItem("alabama", "Alabama")) + .addItem(menuItem("florida", "Florida")) + .addItem(menuItem("new-jersey", "New Jersey")) + .addItem(menuItem("new-mexico", "New Mexico")) + .addItem(menuItem("new-york", "New York")) + .addItem(menuItem("north-carolina", "North Carolina"))) .allowNewItems(value -> "Create new item \"" + value + "\"", - value -> Promise.resolve(menuItem(Id.build(value), value))) - .addMenu(multiSelectMenu() - .addContent(menuContent() - .addList(menuList() - .addItem(menuItem("alabama", "Alabama")) - .addItem(menuItem("florida", "Florida")) - .addItem(menuItem("new-jersey", "New Jersey")) - .addItem(menuItem("new-mexico", "New Mexico")) - .addItem(menuItem("new-york", "New York")) - .addItem(menuItem("north-carolina", "North Carolina")))))) + value -> Promise.resolve(menuItem(Id.build(value), value)))) .element() // @code-end:multi-typeahead-create )); @@ -303,8 +295,8 @@ public SelectComponent() { return div() - .add(multiTypeahead("multi-typeahead-async-0", "Lorem ipsum") - .applyTo(FullWidth::fullWidth) + .add(nativeMultiTypeahead("multi-typeahead-async-0", "Lorem ipsum") + .applyToMenuToggle(FullWidth::fullWidth) .addMenu(multiSelectMenu().scrollable() .addContent(menuContent() .addList(menuList() From 783596248ce8efed276aab30f09386ec2255556f Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 31 Mar 2026 16:47:21 +0200 Subject: [PATCH 082/430] Fix stay open predicate --- .../component/menu/NativeMenuToggleMenu.java | 4 +++ .../component/menu/NativeMultiSelect.java | 2 +- .../component/menu/NativeMultiTypeahead.java | 16 +++++------- .../component/menu/NativeSingleTypeahead.java | 16 ++---------- .../component/menu/TypeaheadSupport.java | 10 ++++++++ .../position/AnchorPositioning.java | 25 +++++++++++-------- 6 files changed, 38 insertions(+), 35 deletions(-) diff --git a/components/src/main/java/org/patternfly/component/menu/NativeMenuToggleMenu.java b/components/src/main/java/org/patternfly/component/menu/NativeMenuToggleMenu.java index ea14d28db..353cd3a93 100644 --- a/components/src/main/java/org/patternfly/component/menu/NativeMenuToggleMenu.java +++ b/components/src/main/java/org/patternfly/component/menu/NativeMenuToggleMenu.java @@ -281,6 +281,10 @@ void searchInputControlsMenuList() { } } + boolean menuItemClick(Event event) { + return menu.element().contains((Node) event.target); + } + // ------------------------------------------------------ internal event handlers private void keyHandler(KeyboardEvent event) { diff --git a/components/src/main/java/org/patternfly/component/menu/NativeMultiSelect.java b/components/src/main/java/org/patternfly/component/menu/NativeMultiSelect.java index f15be622f..2591b0b8a 100644 --- a/components/src/main/java/org/patternfly/component/menu/NativeMultiSelect.java +++ b/components/src/main/java/org/patternfly/component/menu/NativeMultiSelect.java @@ -63,7 +63,7 @@ public static NativeMultiSelect nativeMultiSelect(MenuToggle menuToggle) { if (menuToggle.badge() != null) { menuToggle.badge().style("visibility", "hidden", true); } - stayOpen((e, mt, m) -> menu != null && menu.element().contains(((Node) e.target))); + stayOpen((e, mt, m) -> menuItemClick(e)); } // ------------------------------------------------------ add diff --git a/components/src/main/java/org/patternfly/component/menu/NativeMultiTypeahead.java b/components/src/main/java/org/patternfly/component/menu/NativeMultiTypeahead.java index 1a0e0dcc7..37b1c6d66 100644 --- a/components/src/main/java/org/patternfly/component/menu/NativeMultiTypeahead.java +++ b/components/src/main/java/org/patternfly/component/menu/NativeMultiTypeahead.java @@ -38,11 +38,12 @@ import static org.patternfly.component.menu.MultiSelectMenu.multiSelectMenu; import static org.patternfly.component.menu.TypeaheadSupport.shouldExpandOnKeyup; import static org.patternfly.component.menu.TypeaheadSupport.typeaheadDefaults; +import static org.patternfly.component.menu.TypeaheadSupport.utilitiesClick; import static org.patternfly.component.textinputgroup.FilterInput.filterInput; import static org.patternfly.style.Classes.component; +import static org.patternfly.style.Classes.item; import static org.patternfly.style.Classes.labelGroup; -import static org.patternfly.style.Classes.textInputGroup; -import static org.patternfly.style.Classes.utilities; +import static org.patternfly.style.Classes.list; /** * A typeahead is a select variant that replaces the typical button toggle for opening the select menu with a text input and @@ -117,14 +118,9 @@ public static NativeMultiTypeahead nativeMultiTypeahead(BaseFilterInput filte } }); stayOpen((event, mt, m) -> { - Element target = (Element) event.target; - boolean itemClick = menu.element().contains(target); - boolean inputClick = filterInput.input().element() == target; - // The labels and utilities may no longer be available in the DOM. That's why we don't use - // element.contains(target), but closest() - bottom up instead of top down! - boolean labelGroupClick = Elements.closest(target, By.classname(component(labelGroup))) != null; - boolean utilitiesClick = Elements.closest(target, By.classname(component(textInputGroup, utilities))) != null; - return itemClick || inputClick || labelGroupClick || utilitiesClick; + boolean labelGroupListItemClick = Elements.closest((Element) event.target, + By.classname(component(labelGroup, list, item))) != null; + return menuItemClick(event) || utilitiesClick(event) || labelGroupListItemClick; }); } diff --git a/components/src/main/java/org/patternfly/component/menu/NativeSingleTypeahead.java b/components/src/main/java/org/patternfly/component/menu/NativeSingleTypeahead.java index 077772f9d..3f364c1e6 100644 --- a/components/src/main/java/org/patternfly/component/menu/NativeSingleTypeahead.java +++ b/components/src/main/java/org/patternfly/component/menu/NativeSingleTypeahead.java @@ -19,13 +19,10 @@ import java.util.function.Consumer; import java.util.function.Function; -import org.jboss.elemento.By; -import org.jboss.elemento.Elements; import org.patternfly.component.ComponentType; import org.patternfly.component.SelectionMode; import org.patternfly.component.textinputgroup.BaseSearchInput; import org.patternfly.component.textinputgroup.SearchInput; -import elemental2.dom.Element; import elemental2.promise.Promise; import static org.patternfly.component.menu.MenuContent.menuContent; @@ -33,10 +30,8 @@ import static org.patternfly.component.menu.SingleSelectMenu.singleSelectMenu; import static org.patternfly.component.menu.TypeaheadSupport.shouldExpandOnKeyup; import static org.patternfly.component.menu.TypeaheadSupport.typeaheadDefaults; +import static org.patternfly.component.menu.TypeaheadSupport.utilitiesClick; import static org.patternfly.component.textinputgroup.SearchInput.searchInput; -import static org.patternfly.style.Classes.component; -import static org.patternfly.style.Classes.textInputGroup; -import static org.patternfly.style.Classes.utilities; /** * A typeahead is a select variant that replaces the typical button toggle for opening the select menu with a text input and @@ -98,14 +93,7 @@ public static NativeSingleTypeahead nativeSingleTypeahead(BaseSearchInput sea expand(false); menu.search(searchFilter, noResults, value); }); - stayOpen((e, mt, m) -> { - Element target = (Element) e.target; - boolean inputClick = searchInput.input().element() == target; - // The utilities may no longer be available in the DOM. That's why we don't use - // element.contains(target), but closest() - bottom up instead of top down! - boolean utilitiesClick = Elements.closest(target, By.classname(component(textInputGroup, utilities))) != null; - return inputClick || utilitiesClick; - }); + stayOpen((e, mt, m) -> utilitiesClick(e)); } // ------------------------------------------------------ add diff --git a/components/src/main/java/org/patternfly/component/menu/TypeaheadSupport.java b/components/src/main/java/org/patternfly/component/menu/TypeaheadSupport.java index f6e95b370..c452cebcb 100644 --- a/components/src/main/java/org/patternfly/component/menu/TypeaheadSupport.java +++ b/components/src/main/java/org/patternfly/component/menu/TypeaheadSupport.java @@ -17,11 +17,14 @@ import java.util.function.Function; +import org.jboss.elemento.By; import org.patternfly.core.Aria; +import elemental2.dom.Element; import elemental2.dom.Event; import elemental2.promise.Promise; +import static org.jboss.elemento.Elements.closest; import static org.jboss.elemento.EventType.click; import static org.jboss.elemento.Key.Enter; import static org.jboss.elemento.Key.Escape; @@ -29,6 +32,9 @@ import static org.patternfly.component.menu.MenuItem.createNewMenuItem; import static org.patternfly.core.Attributes.role; import static org.patternfly.core.Roles.combobox; +import static org.patternfly.style.Classes.component; +import static org.patternfly.style.Classes.textInputGroup; +import static org.patternfly.style.Classes.utilities; class TypeaheadSupport { @@ -98,6 +104,10 @@ static boolean shouldExpandOnKeyup(NativeMenuToggleMenu mtm, Event event) { return !mtm.expanded(); } + static boolean utilitiesClick(Event event) { + return closest(((Element) event.target), By.classname(component(textInputGroup, utilities))) != null; + } + static void allowNewItems(MenuToggleMenu mtm, Typeahead typeahead, Function prompt, Function> createItem) { typeahead.onNoResults((menuList, text) -> createNewMenuItem(prompt.apply(text)) diff --git a/core/src/main/java/org/patternfly/position/AnchorPositioning.java b/core/src/main/java/org/patternfly/position/AnchorPositioning.java index 2ebc89fee..9fd46d03c 100644 --- a/core/src/main/java/org/patternfly/position/AnchorPositioning.java +++ b/core/src/main/java/org/patternfly/position/AnchorPositioning.java @@ -157,11 +157,13 @@ private Placement bestPlacement(Placement preferred) { Placement placement; // Honor explicit preference if it fits if (preferred != auto) { - if (preferred == top && topFits) {placement = top;} else if (preferred == bottom && bottomFits) { - placement = bottom; - } else if (preferred == left && leftFits) {placement = left;} else if (preferred == right && rightFits) { - placement = right; - } else {placement = null;} + // @formatter:off + if (preferred == top && topFits) { placement = top; } + else if (preferred == bottom && bottomFits) { placement = bottom; } + else if (preferred == left && leftFits) { placement = left;} + else if (preferred == right && rightFits) { placement = right; } + else { placement = null; } + // @formatter:on } else { placement = null; } @@ -172,11 +174,14 @@ private Placement bestPlacement(Placement preferred) { // - prefer horizontal when the trigger is near a horizontal edge // - top wins over bottom when both horizontal directions fit // - last resort: pick the side with the most space - if (topFits && leftFits && rightFits) {placement = top;} else if (rightFits && !leftFits) { - placement = right; - } else if (leftFits && !rightFits) {placement = left;} else if (topFits) {placement = top;} else if (bottomFits) { - placement = bottom; - } else {placement = toRight >= toLeft ? right : left;} + // @formatter:off + if (topFits && leftFits && rightFits) { placement = top; } + else if (rightFits && !leftFits) { placement = right; } + else if (leftFits && !rightFits) { placement = left; } + else if (topFits) { placement = top; } + else if (bottomFits) { placement = bottom; } + else { placement = toRight >= toLeft ? right : left; } + // @formatter:on } logger.debug("Best placement for %s: preferred=%s, calculated=%s", id, preferred.name(), placement.name()); From 5123988d2d8a84d5e9d32eba5e5451dfbd1d5f2d Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Wed, 1 Apr 2026 14:36:11 +0200 Subject: [PATCH 083/430] New Overlay class --- CHANGELOG.md | 169 ++++-- .../patternfly/component/ComponentType.java | 41 +- .../component/codeblock/CodeBlockAction.java | 9 +- .../component/drawer/DrawerPanel.java | 2 +- .../component/form/FormGroupLabel.java | 3 +- .../component/list/DescriptionListTerm.java | 4 +- .../patternfly/component/menu/Dropdown.java | 47 +- .../component/menu/MenuToggleMenu.java | 189 ++++--- .../component/menu/MultiMenuToggleMenu.java | 44 +- .../component/menu/MultiSelect.java | 10 +- .../component/menu/MultiTypeahead.java | 46 +- .../component/menu/NativeDropdown.java | 97 ---- .../component/menu/NativeMultiSelect.java | 173 ------ .../component/menu/NativeMultiTypeahead.java | 252 --------- .../component/menu/NativeSingleSelect.java | 154 ------ .../component/menu/NativeSingleTypeahead.java | 214 -------- .../component/menu/PopperDropdown.java | 58 ++ ...gleMenu.java => PopperMenuToggleMenu.java} | 195 +++---- .../menu/PopperMultiMenuToggleMenu.java | 103 ++++ .../component/menu/PopperMultiSelect.java | 86 +++ .../component/menu/PopperMultiTypeahead.java | 158 ++++++ .../menu/PopperSingleMenuToggleMenu.java | 104 ++++ .../component/menu/PopperSingleSelect.java | 68 +++ .../component/menu/PopperSingleTypeahead.java | 130 +++++ ...iveTypeahead.java => PopperTypeahead.java} | 16 +- .../component/menu/SingleMenuToggleMenu.java | 44 +- .../component/menu/SingleSelect.java | 19 +- .../component/menu/SingleTypeahead.java | 40 +- .../component/menu/StayOpenPredicate.java | 15 + .../patternfly/component/menu/Typeahead.java | 13 +- .../component/menu/TypeaheadSupport.java | 73 +-- .../component/modal/ModalHeader.java | 17 +- .../component/page/MastheadContent.java | 3 +- .../component/popover/NativePopover.java | 499 ------------------ .../patternfly/component/popover/Popover.java | 290 ++++++---- .../component/popover/PopoverBody.java | 4 +- .../component/popover/PopoverFooter.java | 4 +- .../component/popover/PopoverHeader.java | 4 +- .../popover/PopoverSubComponent.java | 2 +- .../component/popover/PopperPopover.java | 430 +++++++++++++++ ...opoverBody.java => PopperPopoverBody.java} | 19 +- ...erFooter.java => PopperPopoverFooter.java} | 17 +- ...erHeader.java => PopperPopoverHeader.java} | 21 +- ...nt.java => PopperPopoverSubComponent.java} | 9 +- .../progressstepper/ProgressStep.java | 11 +- .../patternfly/component/slider/Slider.java | 9 +- .../component/tabs/OverflowTab.java | 72 ++- .../org/patternfly/component/tabs/Tab.java | 13 +- .../org/patternfly/component/tabs/Tabs.java | 33 +- .../component/tooltip/NativeTooltip.java | 356 ------------- .../component/tooltip/PopperTooltip.java | 344 ++++++++++++ .../patternfly/component/tooltip/Tooltip.java | 266 +++++----- .../component/tooltip/TooltipToggle.java | 4 +- .../componentgroup/theme/ThemeSelector.java | 11 +- core/npm/core.css | 2 + .../org/patternfly/popper/FirstUpdateFn.java | 1 + .../java/org/patternfly/popper/Modifier.java | 1 + .../patternfly/popper/ModifierArguments.java | 1 + .../org/patternfly/popper/ModifierFn.java | 1 + .../patternfly/popper/ModifierOptions.java | 1 + .../org/patternfly/popper/ModifierPhase.java | 1 + .../java/org/patternfly/popper/Modifiers.java | 3 + .../java/org/patternfly/popper/Options.java | 1 + .../java/org/patternfly/popper/Popper.java | 1 + .../org/patternfly/popper/PopperBuilder.java | 4 +- .../org/patternfly/popper/PopperError.java | 1 + .../org/patternfly/popper/PopperImpl.java | 1 + .../java/org/patternfly/popper/PopperJs.java | 1 + .../main/java/org/patternfly/popper/Rect.java | 1 + .../java/org/patternfly/popper/State.java | 1 + .../org/patternfly/popper/StateElements.java | 1 + .../org/patternfly/popper/StateRects.java | 1 + .../patternfly/popper/StyleDefinitions.java | 1 + .../org/patternfly/popper/TriggerAction.java | 1 + .../patternfly/popper/UpdateOptionsFn.java | 1 + .../org/patternfly/popper/package-info.java | 149 ------ .../position/AnchorPositioning.java | 16 +- .../{popper => style}/Placement.java | 5 +- .../codeeditor/CodeEditorAction.java | 6 +- .../patternfly/showcase/BuildingBlocks.java | 29 +- .../org/patternfly/showcase/Showcase.java | 2 +- .../java/org/patternfly/showcase/Snippet.java | 6 +- .../org/patternfly/showcase/SnippetPage.java | 2 +- .../component/ActionListComponent.java | 67 +-- .../showcase/component/CardComponent.java | 242 +++------ .../showcase/component/DataListComponent.java | 29 +- .../showcase/component/DropdownComponent.java | 25 +- .../showcase/component/HintComponent.java | 51 +- .../component/InputGroupComponent.java | 15 +- .../component/NativePopoverComponent.java | 287 ---------- .../component/NativeTooltipComponent.java | 121 ----- .../NotificationDrawerComponent.java | 23 +- .../showcase/component/PopoverComponent.java | 267 ++++++---- .../component/ProgressStepperComponent.java | 2 +- .../showcase/component/SelectComponent.java | 31 +- .../showcase/component/TooltipComponent.java | 44 +- .../patternfly/showcase/model/FileData.java | 19 +- .../org/patternfly/showcase/components.json | 16 - showcase/src/web/showcase.css | 4 +- 99 files changed, 2908 insertions(+), 3591 deletions(-) delete mode 100644 components/src/main/java/org/patternfly/component/menu/NativeDropdown.java delete mode 100644 components/src/main/java/org/patternfly/component/menu/NativeMultiSelect.java delete mode 100644 components/src/main/java/org/patternfly/component/menu/NativeMultiTypeahead.java delete mode 100644 components/src/main/java/org/patternfly/component/menu/NativeSingleSelect.java delete mode 100644 components/src/main/java/org/patternfly/component/menu/NativeSingleTypeahead.java create mode 100644 components/src/main/java/org/patternfly/component/menu/PopperDropdown.java rename components/src/main/java/org/patternfly/component/menu/{NativeMenuToggleMenu.java => PopperMenuToggleMenu.java} (63%) create mode 100644 components/src/main/java/org/patternfly/component/menu/PopperMultiMenuToggleMenu.java create mode 100644 components/src/main/java/org/patternfly/component/menu/PopperMultiSelect.java create mode 100644 components/src/main/java/org/patternfly/component/menu/PopperMultiTypeahead.java create mode 100644 components/src/main/java/org/patternfly/component/menu/PopperSingleMenuToggleMenu.java create mode 100644 components/src/main/java/org/patternfly/component/menu/PopperSingleSelect.java create mode 100644 components/src/main/java/org/patternfly/component/menu/PopperSingleTypeahead.java rename components/src/main/java/org/patternfly/component/menu/{NativeTypeahead.java => PopperTypeahead.java} (85%) delete mode 100644 components/src/main/java/org/patternfly/component/popover/NativePopover.java create mode 100644 components/src/main/java/org/patternfly/component/popover/PopperPopover.java rename components/src/main/java/org/patternfly/component/popover/{NativePopoverBody.java => PopperPopoverBody.java} (74%) rename components/src/main/java/org/patternfly/component/popover/{NativePopoverFooter.java => PopperPopoverFooter.java} (75%) rename components/src/main/java/org/patternfly/component/popover/{NativePopoverHeader.java => PopperPopoverHeader.java} (84%) rename components/src/main/java/org/patternfly/component/popover/{NativePopoverSubComponent.java => PopperPopoverSubComponent.java} (82%) delete mode 100644 components/src/main/java/org/patternfly/component/tooltip/NativeTooltip.java create mode 100644 components/src/main/java/org/patternfly/component/tooltip/PopperTooltip.java delete mode 100644 core/src/main/java/org/patternfly/popper/package-info.java rename core/src/main/java/org/patternfly/{popper => style}/Placement.java (95%) delete mode 100644 showcase/src/main/java/org/patternfly/showcase/component/NativePopoverComponent.java delete mode 100644 showcase/src/main/java/org/patternfly/showcase/component/NativeTooltipComponent.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 389c5c293..6937c3561 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +### Added + +- Add native alternatives for dropdown, single and multi-select, and single and multi-type-ahead components +- Deprecate components based on Popper.js + ## [0.6.16] - 2026-03-26 ### Added @@ -61,7 +66,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ### Removed -- Remove `FinderItem.nextColumn(FinderColumn column)`. Next columns can only be added lazily using `FinderItem.nextColumn(Supplier column)` (otherwise the component lookup of finder columns won't work). +- Remove `FinderItem.nextColumn(FinderColumn column)`. Next columns can only be added lazily using + `FinderItem.nextColumn(Supplier column)` (otherwise the component lookup of finder columns won't work). ## [0.6.9] - 2026-03-23 @@ -75,9 +81,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - Add `FinderPath` and `FinderSegment` with `FinderPath` implementing `Iterable` - Add `FinderPath Finder.path()` - Add getters for the finder and finder column: - - `FinderColumn FinderItem.column()` - - `Finder FinderItem.finder()` - - `Finder FinderColumn.finder()` + - `FinderColumn FinderItem.column()` + - `Finder FinderItem.finder()` + - `Finder FinderColumn.finder()` ### Fixed @@ -140,7 +146,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ### Added - Add [finder extension](https://patternfly-java.github.io/extensions/finder) (#371) -- Add `HasAsyncItems, S extends HasIdentifier>` that defines a common interface for components that can display items asynchronously. These components implement it: +- Add + `HasAsyncItems, S extends HasIdentifier>` that defines a common interface for components that can display items asynchronously. These components implement it: - `FinderColumn` - `MenuList` - `TreeViewItem` @@ -319,8 +326,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ### Added - The first charts are here! 🎉 - - Donut chart (#110) - - Donut utilization chart (#111) + - Donut chart (#110) + - Donut utilization chart (#111) - Add typeahead support for single select component - Add support for async item to the menu / menu list component - Add `HasItems.onAdd(BiConsumer onAdd)` @@ -368,7 +375,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - Notification badge component (#71) (thanks @mskacelik) - Timestamp component (#95) (thanks @mskacelik) -- Add new enum `org.patternfly.token.Token` that contains all [PatternFly token](https://www.patternfly.org/tokens/all-patternfly-tokens) as enum constants. +- Add new enum + `org.patternfly.token.Token` that contains all [PatternFly token](https://www.patternfly.org/tokens/all-patternfly-tokens) as enum constants. ### Changed @@ -457,25 +465,25 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - Add `Label.disabled()` - Add `TreeView.select(String id)` - Add `HasItems` → `WithIdentifier` and `ComponentContext` interfaces (if missing). Implemented by - - `Accordion` → `AccordionItem` - - `ActionList`, `ActionListGroup` → `ActionListItem` - - `AlterGroup` → `Alert` - - `Breadcrumb` → `BreadcrumbItem` - - `ChipGroup` → `Chip` - - `DataList` → `DataListItem` - - `DescriptionList` → `DescriptionListGroup` - - `JumpLinks`, `JumpLinksList` → `JumpLinksItem` - - `LabelGroup` → `Label` - - `List` → `ListItem` - - `MenuList` → `MenuItem` - - `Navigation`, `NavigationGroup`, `ExpandableNavigationGroup` → `NavigationItem` - - `SimpleList`, `SimpleListGroup` → `SimpleListItem` - - `Tabs` → `Tab` - - `TBody` → `Tr` - - `ToggleGroup` → `ToggleGroupItem` - - `ToolbarContent`, `ToolbarGroup` → `ToolbarItem` - - `Tr` → `Cell` (`Th` | `Td`) - - `TreeView`, `TreeViewItem` → `TreeViewItem` + - `Accordion` → `AccordionItem` + - `ActionList`, `ActionListGroup` → `ActionListItem` + - `AlterGroup` → `Alert` + - `Breadcrumb` → `BreadcrumbItem` + - `ChipGroup` → `Chip` + - `DataList` → `DataListItem` + - `DescriptionList` → `DescriptionListGroup` + - `JumpLinks`, `JumpLinksList` → `JumpLinksItem` + - `LabelGroup` → `Label` + - `List` → `ListItem` + - `MenuList` → `MenuItem` + - `Navigation`, `NavigationGroup`, `ExpandableNavigationGroup` → `NavigationItem` + - `SimpleList`, `SimpleListGroup` → `SimpleListItem` + - `Tabs` → `Tab` + - `TBody` → `Tr` + - `ToggleGroup` → `ToggleGroupItem` + - `ToolbarContent`, `ToolbarGroup` → `ToolbarItem` + - `Tr` → `Cell` (`Th` | `Td`) + - `TreeView`, `TreeViewItem` → `TreeViewItem` ### Changed @@ -500,25 +508,26 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - Data list component (#34) (not yet fully implemented) - Tree view component (#100) (not yet fully implemented) - Add `ComponentContext` interface to store and retrieve arbitrary values associated with keys in a component. Implemented by - - `AccordionItem` - - `ActionListItem` - - `BreadcrumbItem` - - `DataListItem` - - `JumpLinksItem` - - `ListItem` - - `MenuItem` - - `NavigationItem` - - `SimpleListItem` - - `TabContent` - - `Td`, `Th`, `Tr` - - `ToggleGroupItem` - - `ToolbarItem` - - `TreeViewItem` + - `AccordionItem` + - `ActionListItem` + - `BreadcrumbItem` + - `DataListItem` + - `JumpLinksItem` + - `ListItem` + - `MenuItem` + - `NavigationItem` + - `SimpleListItem` + - `TabContent` + - `Td`, `Th`, `Tr` + - `ToggleGroupItem` + - `ToolbarItem` + - `TreeViewItem` - Add `FlexWrap.noWrap` modifier - Add methods to swap typed modifiers: - - `static > B TypedModifier.swap(B builder, E element, - T value, T[] values)`:
Swaps a typed modifier on an element builder. Swapping is done by removing all modifiers given as `values` and then setting the new modifier given as `value`. - - `static > B TypedModifier.swap(B builder, E element, + - `static > B TypedModifier.swap(B builder, E element, + T value, T[] values)`:
Swaps a typed modifier on an element builder. Swapping is done by removing all modifiers given as + `values` and then setting the new modifier given as `value`. + - `static > B TypedModifier.swap(B builder, E element, T current, T previous, Runnable assignment)`:
Swaps a typed modifier on an element builder. Swapping is done by removing the previous modifier, applying the current modifier, and optionally performing an assignment. ### Changed @@ -675,7 +684,8 @@ Split PatternFly Java into multiple modules: #### API -- [`Breakpoint`](https://patternfly-java.github.io/patternfly-java/org/patternfly/style/Breakpoint.html) and [`Breakpoints`](https://patternfly-java.github.io/patternfly-java/org/patternfly/style/Breakpoints.html) classes to manage responsive CSS modifiers. +- [`Breakpoint`](https://patternfly-java.github.io/patternfly-java/org/patternfly/style/Breakpoint.html) and [ + `Breakpoints`](https://patternfly-java.github.io/patternfly-java/org/patternfly/style/Breakpoints.html) classes to manage responsive CSS modifiers. ### Fixed @@ -692,9 +702,9 @@ Split PatternFly Java into multiple modules: - Text area component (#53) - Add support for responsive layout in various components - Add the following interfaces to unify icon and text handling across components: - - `WithIcon>` - - `WithText>` - - `WithIconAndText>` + - `WithIcon>` + - `WithText>` + - `WithIconAndText>` ### Changed @@ -860,66 +870,129 @@ Stay tuned for more to come... --> [Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.16...HEAD + [0.6.16]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.15...v0.6.16 + [0.6.15]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.14...v0.6.15 + [0.6.14]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.13...v0.6.14 + [0.6.13]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.12...v0.6.13 + [0.6.12]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.11...v0.6.12 + [0.6.11]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.10...v0.6.11 + [0.6.10]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.9...v0.6.10 + [0.6.9]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.8...v0.6.9 + [0.6.8]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.7...v0.6.8 + [0.6.7]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.6...v0.6.7 + [0.6.6]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.5...v0.6.6 + [0.6.5]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.4...v0.6.5 + [0.6.4]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.3...v0.6.4 + [0.6.3]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.2...v0.6.3 + [0.6.2]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.1...v0.6.2 + [0.6.1]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.0...v0.6.1 + [0.6.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.5.0...v0.6.0 + [0.5.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.17...v0.5.0 + [0.4.17]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.16...v0.4.17 + [0.4.16]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.15...v0.4.16 + [0.4.15]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.14...v0.4.15 + [0.4.14]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.13...v0.4.14 + [0.4.13]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.12...v0.4.13 + [0.4.12]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.11...v0.4.12 + [0.4.11]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.10...v0.4.11 + [0.4.10]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.9...v0.4.10 + [0.4.9]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.8...v0.4.9 + [0.4.8]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.7...v0.4.8 + [0.4.7]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.6...v0.4.7 + [0.4.6]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.5...v0.4.6 + [0.4.5]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.4...v0.4.5 + [0.4.4]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.3...v0.4.4 + [0.4.3]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.2...v0.4.3 + [0.4.2]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.1...v0.4.2 + [0.4.1]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.0...v0.4.1 + [0.4.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.3.1...v0.4.0 + [0.3.1]: https://github.com/patternfly-java/patternfly-java/compare/v0.3.0...v0.3.1 + [0.3.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.11...v0.3.0 + [0.2.11]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.10...v0.2.11 + [0.2.10]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.9...v0.2.10 + [0.2.9]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.8...v0.2.9 + [0.2.8]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.7...v0.2.8 + [0.2.7]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.6...v0.2.7 + [0.2.6]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.5...v0.2.6 + [0.2.5]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.4...v0.2.5 + [0.2.4]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.3...v0.2.4 + [0.2.3]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.2...v0.2.3 + [0.2.2]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.1...v0.2.2 + [0.2.1]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.0...v0.2.1 + [0.2.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.1.5...v0.2.0 + [0.1.5]: https://github.com/patternfly-java/patternfly-java/compare/v0.1.4...v0.1.5 + [0.1.4]: https://github.com/patternfly-java/patternfly-java/compare/v0.1.3...v0.1.4 + [0.1.3]: https://github.com/patternfly-java/patternfly-java/compare/v0.1.2...v0.1.3 + [0.1.2]: https://github.com/patternfly-java/patternfly-java/compare/v0.1.1...v0.1.2 + [0.1.1]: https://github.com/patternfly-java/patternfly-java/compare/v0.1.0...v0.1.1 + [0.1.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.0.7...v0.1.0 + [0.0.7]: https://github.com/patternfly-java/patternfly-java/compare/v0.0.6...v0.0.7 + [0.0.6]: https://github.com/patternfly-java/patternfly-java/compare/v0.0.5...v0.0.6 + [0.0.5]: https://github.com/patternfly-java/patternfly-java/compare/v0.0.4...v0.0.5 + [0.0.4]: https://github.com/patternfly-java/patternfly-java/compare/v0.0.3...v0.0.4 + [0.0.3]: https://github.com/patternfly-java/patternfly-java/compare/v0.0.2...v0.0.3 + [0.0.2]: https://github.com/patternfly-java/patternfly-java/compare/v0.0.1...v0.0.2 + [0.0.1]: https://github.com/patternfly-java/patternfly-java/compare/vTemplate...v0.0.1 diff --git a/components/src/main/java/org/patternfly/component/ComponentType.java b/components/src/main/java/org/patternfly/component/ComponentType.java index 9f3e8ae1e..3a3118512 100644 --- a/components/src/main/java/org/patternfly/component/ComponentType.java +++ b/components/src/main/java/org/patternfly/component/ComponentType.java @@ -97,21 +97,9 @@ public enum ComponentType { Modal("mo", "PF6/Component/Modal"), - MultiSelect("ms", "PF6/Component/MultiSelect"), + MultiSelect("msl", "PF6/Component/MultiSelect"), - NativeDropdown("ndd", "PF6/Component/NativeDropdown"), - - NativeMultiSelect("nms", "PF6/Component/NativeMultiSelect"), - - NativeMultiTypeahead("nmt", "PF6/Component/NativeMultiTypeahead"), - - NativeSingleSelect("nss", "PF6/Component/NativeSingleSelect"), - - NativeSingleTypeahead("nst", "PF6/Component/NativeSingleTypeahead"), - - NativePopover("npvr", "PF6/Component/NativePopover"), - - NativeTooltip("ntt", "PF6/Component/NativeTooltip"), + MultiTypeahead("mty", "PF6/Component/MultiTypeahead"), Navigation("nav", "PF6/Component/Nav"), @@ -127,6 +115,27 @@ public enum ComponentType { Panel("pnl", "PF6/Component/Panel"), + @Deprecated + PopperDropdown("pdd", "PF6/Component/PopperDropdown"), + + @Deprecated + PopperMultiSelect("pmsl", "PF6/Component/PopperMultiSelect"), + + @Deprecated + PopperMultiTypeahead("pmty", "PF6/Component/PopperMultiTypeahead"), + + @Deprecated + PopperPopover("ppvr", "PF6/Component/PopperPopover"), + + @Deprecated + PopperSingleSelect("pssl", "PF6/Component/PopperSingleSelect"), + + @Deprecated + PopperSingleTypeahead("psty", "PF6/Component/PopperSingleTypeahead"), + + @Deprecated + PopperTooltip("ptt", "PF6/Component/PopperTooltip"), + Popover("pvr", "PF6/Component/Popover"), Progress("prg", "PF6/Component/Progress"), @@ -143,7 +152,9 @@ public enum ComponentType { SimpleList("sl", "PF6/Component/SimpleList"), - SingleSelect("ss", "PF6/Component/SingleSelect"), + SingleSelect("ssl", "PF6/Component/SingleSelect"), + + SingleTypeahead("sty", "PF6/Component/SingleTypeahead"), Skeleton("sk", "PF6/Component/Skeleton"), diff --git a/components/src/main/java/org/patternfly/component/codeblock/CodeBlockAction.java b/components/src/main/java/org/patternfly/component/codeblock/CodeBlockAction.java index 92e5f2c95..b8b65b7ee 100644 --- a/components/src/main/java/org/patternfly/component/codeblock/CodeBlockAction.java +++ b/components/src/main/java/org/patternfly/component/codeblock/CodeBlockAction.java @@ -59,24 +59,21 @@ public static CodeBlockAction codeBlockCopyToClipboardAction() { public static CodeBlockAction codeBlockCopyToClipboardAction(String copyText, String copiedText) { String copyId = Id.unique(ComponentType.CodeBlock.id, "copy"); Tooltip copyTooltip = tooltip(By.id(copyId), copyText) - .onClose((e, t) -> t.text(copyText)) // restore text - .appendToBody(); + .onClose((e, t) -> t.text(copyText)); // restore text return new CodeBlockAction(copy().element()) .id(copyId) .ariaLabel(copyText) .onClick((event, codeBlock) -> { copyTooltip.text(copiedText); navigator.clipboard.writeText(codeBlock.code()); - }); + }) + .add(copyTooltip); } // ------------------------------------------------------ instance public static final String SUB_COMPONENT_NAME = "cba"; - private final Button button; - private ComponentHandler handler; - private CodeBlock codeBlock; CodeBlockAction(Element icon) { super(SUB_COMPONENT_NAME, div().css(component(Classes.codeBlock, actions, item)).element()); diff --git a/components/src/main/java/org/patternfly/component/drawer/DrawerPanel.java b/components/src/main/java/org/patternfly/component/drawer/DrawerPanel.java index 4c0666182..b6b96aa97 100644 --- a/components/src/main/java/org/patternfly/component/drawer/DrawerPanel.java +++ b/components/src/main/java/org/patternfly/component/drawer/DrawerPanel.java @@ -129,7 +129,7 @@ public void attach(MutationRecord mutationRecord) { String id = element().id; if (id == null || id.isEmpty()) { - id = Id.unique(ComponentType.Dropdown.id, "panel"); + id = Id.unique(ComponentType.Drawer.id, "panel"); id(id); } diff --git a/components/src/main/java/org/patternfly/component/form/FormGroupLabel.java b/components/src/main/java/org/patternfly/component/form/FormGroupLabel.java index 727b9a033..b302b54d4 100644 --- a/components/src/main/java/org/patternfly/component/form/FormGroupLabel.java +++ b/components/src/main/java/org/patternfly/component/form/FormGroupLabel.java @@ -130,9 +130,10 @@ public FormGroupLabel help(String ariaLabel, Popover popover) { .aria(Aria.label, ariaLabel) .add(span().css(component(button, icon)) .add(questionCircle()))) + .add(popover) .element(); + popover.trigger(helpContainer); add(helpContainer); - popover.trigger(helpContainer).appendToBody(); return this; } diff --git a/components/src/main/java/org/patternfly/component/list/DescriptionListTerm.java b/components/src/main/java/org/patternfly/component/list/DescriptionListTerm.java index d2bc69c82..3d404010f 100644 --- a/components/src/main/java/org/patternfly/component/list/DescriptionListTerm.java +++ b/components/src/main/java/org/patternfly/component/list/DescriptionListTerm.java @@ -20,7 +20,6 @@ import org.patternfly.component.ComponentIcon; import org.patternfly.component.popover.Popover; import org.patternfly.style.Classes; - import elemental2.dom.Element; import elemental2.dom.HTMLElement; @@ -98,7 +97,8 @@ public DescriptionListTerm help(Popover popover) { textElement.setAttribute(role, button); textElement.setAttribute("type", "button"); textElement.tabIndex = 0; - popover.trigger(textElement).appendToBody(); + popover.trigger(textElement); + element().appendChild(popover.element()); return this; } diff --git a/components/src/main/java/org/patternfly/component/menu/Dropdown.java b/components/src/main/java/org/patternfly/component/menu/Dropdown.java index 580605171..bd7439210 100644 --- a/components/src/main/java/org/patternfly/component/menu/Dropdown.java +++ b/components/src/main/java/org/patternfly/component/menu/Dropdown.java @@ -15,14 +15,22 @@ */ package org.patternfly.component.menu; +import java.util.function.Consumer; + import org.patternfly.component.ComponentType; import org.patternfly.icon.PredefinedIcon; -import org.patternfly.popper.TriggerAction; + +import static org.patternfly.component.menu.DropdownMenu.dropdownMenu; +import static org.patternfly.component.menu.MenuContent.menuContent; +import static org.patternfly.component.menu.MenuList.menuList; /** * A dropdown presents a menu of actions or links in a constrained space that will trigger a process or navigate to a new - * location. See select component guidelines for more information about making one or more selections from a list of items in a - * value list. + * location. + *

+ * This implementation uses the Popover API and CSS anchor positioning instead of Popper.js. The dropdown uses the browser's + * top-layer rendering for correct stacking, eliminating z-index issues. CSS {@code position-try-fallbacks} handles menu + * flipping when there is not enough space. * * @see https://www.patternfly.org/components/menus/dropdown/ @@ -45,12 +53,43 @@ public static Dropdown dropdown(MenuToggle menuToggle) { // ------------------------------------------------------ instance + private MenuContent menuContent; + private MenuList menuList; + Dropdown(MenuToggle menuToggle) { - super(ComponentType.Dropdown, menuToggle, TriggerAction.click); + super(ComponentType.Dropdown, menuToggle); } // ------------------------------------------------------ builder + /** + * Applies the provided {@link Consumer} to the {@link MenuList} associated with this {@link Dropdown}. If the menu, menu + * content, or menu list is not yet initialized, they will be created as part of this method. + *

+ * This method simplifies the process of adding menu items to the component. It is a shortcut for creating and adding a + * {@link DropdownMenu}, {@link MenuContent}, and {@link MenuList} in a single step. Don't use this method if you need to us + * another menu type, want to customize the menu, content or list or if you want to use {@link MenuGroup}s. + * + * @param consumer a {@link Consumer} that accepts a {@link MenuList} for customization or modification + * @return the current {@link Dropdown} instance for method chaining + */ + public Dropdown applyToMenuList(Consumer consumer) { + if (menu == null) { + add(dropdownMenu()); + } + if (menuContent == null) { + menuContent = menuContent(); + menu.addContent(menuContent); + } + if (menuList == null) { + menuList = menuList(); + menuContent.addList(menuList); + } + + consumer.accept(menuList); + return this; + } + @Override public Dropdown that() { return this; diff --git a/components/src/main/java/org/patternfly/component/menu/MenuToggleMenu.java b/components/src/main/java/org/patternfly/component/menu/MenuToggleMenu.java index 56fb7d193..5813bfc02 100644 --- a/components/src/main/java/org/patternfly/component/menu/MenuToggleMenu.java +++ b/components/src/main/java/org/patternfly/component/menu/MenuToggleMenu.java @@ -16,16 +16,13 @@ package org.patternfly.component.menu; import java.util.ArrayList; -import java.util.EnumSet; import java.util.List; -import java.util.Set; import java.util.function.Consumer; import java.util.function.Predicate; import org.gwtproject.event.shared.HandlerRegistration; import org.jboss.elemento.Attachable; import org.jboss.elemento.By; -import org.jboss.elemento.EventType; import org.jboss.elemento.Id; import org.jboss.elemento.TypedBuilder; import org.jboss.elemento.logger.Logger; @@ -35,13 +32,10 @@ import org.patternfly.core.Aria; import org.patternfly.handler.ComponentHandler; import org.patternfly.handler.ToggleHandler; -import org.patternfly.popper.Modifiers; -import org.patternfly.popper.Placement; -import org.patternfly.popper.Popper; -import org.patternfly.popper.PopperBuilder; -import org.patternfly.popper.TriggerAction; +import org.patternfly.position.AnchorPositioning; import org.patternfly.style.Classes; import org.patternfly.style.Modifiers.Disabled; +import org.patternfly.style.Placement; import elemental2.core.JsArray; import elemental2.dom.Event; @@ -52,25 +46,31 @@ import static elemental2.dom.DomGlobal.document; import static elemental2.dom.DomGlobal.window; -import static org.jboss.elemento.Elements.failSafeRemoveFromParent; +import static org.jboss.elemento.Elements.div; +import static org.jboss.elemento.Elements.insertAfter; import static org.jboss.elemento.Elements.isVisible; -import static org.jboss.elemento.Elements.setVisible; +import static org.jboss.elemento.EventType.bind; +import static org.jboss.elemento.EventType.click; import static org.jboss.elemento.EventType.keydown; import static org.jboss.elemento.Key.ArrowDown; import static org.jboss.elemento.Key.ArrowUp; +import static org.jboss.elemento.Key.Escape; import static org.jboss.elemento.Key.Tab; -import static org.patternfly.popper.Placement.auto; -import static org.patternfly.popper.Placement.bottomStart; +import static org.patternfly.core.Attributes.popover; import static org.patternfly.style.Classes.component; import static org.patternfly.style.Classes.list; +import static org.patternfly.style.Placement.auto; +import static org.patternfly.style.Placement.bottomStart; /** - * Abstract base component for components that combine a {@link MenuToggle} and a {@link Menu}, such as {@link Dropdown}, + * Abstract base component for components that combine a {@link MenuToggle} and a {@link Menu}, such as {@link Dropdown}, * * {@link SingleSelect}, {@link SingleTypeahead}, or {@link MultiSelect}. *

- * The component delegates to the {@link MenuToggle} component. The {@link Menu} is managed by a {@link Popper} instance. + * The component delegates to the {@link MenuToggle} component. The {@link Menu} is managed using the native Popover API and CSS + * anchor positioning via {@link AnchorPositioning}. */ -public abstract class MenuToggleMenu> extends ComponentDelegate implements +abstract class MenuToggleMenu> extends ComponentDelegate + implements Disabled, Expandable, Attachable { @@ -78,30 +78,34 @@ public abstract class MenuToggleMenu> ext // ------------------------------------------------------ instance private static final Logger logger = Logger.getLogger(MenuToggleMenu.class.getName()); - private static final int Z_INDEX = 9999; + private static final int DISTANCE = 0; final MenuToggle menuToggle; + final AnchorPositioning ap; Menu menu; - private final Set triggerActions; + private final HTMLElement menuPopover; private final List> toggleHandler; private final List> loadedHandler; - private int zIndex; - private boolean flip; private boolean disabled; private Placement placement; - private Popper popper; + private StayOpenPredicate stayOpen; + private HandlerRegistration menuToggleClickHandler; + private HandlerRegistration menuClickHandler; private HandlerRegistration keyHandler; - private Predicate stayOpen; + private HandlerRegistration outsideClickHandler; - MenuToggleMenu(ComponentType componentType, MenuToggle menuToggle, TriggerAction triggerAction) { + MenuToggleMenu(ComponentType componentType, MenuToggle menuToggle) { super(componentType); this.menuToggle = menuToggle; this.toggleHandler = new ArrayList<>(); this.loadedHandler = new ArrayList<>(); - this.triggerActions = EnumSet.of(triggerAction); - this.flip = true; - this.placement = bottomStart; - this.zIndex = Z_INDEX; + this.placement = auto; + + String id = Id.unique(componentType().id); + menuPopover = div().css(component(Classes.menu, Classes.popover)) + .attr(popover, "manual") + .element(); + ap = new AnchorPositioning(id, menuPopover, menuToggle::element, DISTANCE, true, true); delegateTo(menuToggle.element()); Attachable.register(menuToggle.element(), this); @@ -113,22 +117,13 @@ public void attach(MutationRecord mutationRecord) { if (disabled) { menuToggle.disabled(true); } - setVisible(menu, false); - document.body.appendChild(menu.element()); // always append to the body to prevent display/width/z-index issues! - popper = new PopperBuilder(componentType().componentName, menuToggle.element(), menu.element()) - .addModifier(Modifiers.eventListeners(false), - Modifiers.flip(placement == auto || flip), - Modifiers.hide(), - Modifiers.noOverflow(), - Modifiers.placement(), - Modifiers.widths()) - .placement(placement) - .registerHandler(menuToggle.toggleElement, triggerActions, - event -> expand(), event -> collapse()) - .stayOpen(stayOpen) - .zIndex(zIndex) - .build(); - keyHandler = EventType.bind(window, keydown, this::keyHandler); + insertAfter(menuPopover, menuToggle.element()); + ap.attach(); + ap.applyPlacement(placement == auto ? bottomStart : placement); + menuToggleClickHandler = bind(menuToggle.toggleElement, click, this::onMenuToggleClick); + menuClickHandler = bind(menu, click, this::onMenuClick); + keyHandler = bind(window, keydown, this::keyHandler); + } else { logger.error("No toggle and/or menu defined for %s %o", componentType().name(), element()); } @@ -136,11 +131,24 @@ public void attach(MutationRecord mutationRecord) { @Override public void detach(MutationRecord mutationRecord) { + if (expanded()) { + ap.hide(); + } + if (outsideClickHandler != null) { + outsideClickHandler.removeHandler(); + } if (keyHandler != null) { keyHandler.removeHandler(); } - failSafeRemoveFromParent(menu); - popper.cleanup(); + if (menuClickHandler != null) { + menuClickHandler.removeHandler(); + } + if (menuToggleClickHandler != null) { + menuToggleClickHandler.removeHandler(); + } + if (ap != null) { + ap.detach(); + } } // ------------------------------------------------------ add @@ -152,14 +160,14 @@ public B addMenu(Menu menu) { // override to ensure internal wiring public B add(Menu menu) { this.menu = menu; - // Do *not* add the menu now, delay it to attach() + menuPopover.appendChild(menu.element()); return that(); } // ------------------------------------------------------ builder /** Provides access to the underlying menu toggle using a fluent API style */ - public B applyTo(Consumer consumer) { + public B applyToMenuToggle(Consumer consumer) { consumer.accept(menuToggle); return that(); } @@ -180,41 +188,22 @@ public boolean isDisabled() { return menuToggle == null ? disabled : menuToggle.isDisabled(); } - public B flip(boolean flip) { - this.flip = flip; - return that(); - } - public B placement(Placement placement) { - if (placement == auto) { - flip = true; - } this.placement = placement; return that(); } - public B stayOpen() { - this.triggerActions.clear(); - this.triggerActions.add(TriggerAction.stayOpen); - return that(); - } - /** - * Specifies a condition that determines whether the menu should remain open when an event occurs. + * Specifies a condition that determines whether the menu should remain open when the menu-toggle or the menu is clicked. * * @param stayOpen a {@link Predicate} that evaluates an {@link Event} to determine if the menu remains open. * @return the current instance with the condition applied, enabling method chaining. */ - public B stayOpen(Predicate stayOpen) { + public B stayOpen(StayOpenPredicate stayOpen) { this.stayOpen = stayOpen; return that(); } - public B zIndex(int zIndex) { - this.zIndex = zIndex; - return that(); - } - // ------------------------------------------------------ aria public B ariaLabel(String label) { @@ -237,19 +226,27 @@ public B onToggle(ToggleHandler toggleHandler) { @Override public void collapse(boolean fireEvent) { - popper.hide(() -> { + if (expanded()) { + ap.hide(); Expandable.collapse(element(), element(), null); + if (outsideClickHandler != null) { + outsideClickHandler.removeHandler(); + outsideClickHandler = null; + } if (fireEvent) { toggleHandler.forEach(th -> th.onToggle(new Event(""), that(), false)); } menuToggle.element().focus(); - }); + } } @Override public void expand(boolean fireEvent) { - popper.show(() -> { + if (!expanded() && !isDisabled()) { + ap.applyPlacement(placement == auto ? bottomStart : placement); + ap.show(); Expandable.expand(element(), element(), null); + outsideClickHandler = bind(document, click, this::onOutsideClick); if (fireEvent) { toggleHandler.forEach(th -> th.onToggle(new Event(""), that(), true)); } @@ -259,7 +256,7 @@ public void expand(boolean fireEvent) { return null; }); } - }); + } } public MenuToggle menuToggle() { @@ -285,10 +282,20 @@ void searchInputControlsMenuList() { } } + boolean menuItemClick(Event event) { + return menu.element().contains((Node) event.target); + } + + // ------------------------------------------------------ internal event handlers + private void keyHandler(KeyboardEvent event) { - if (expanded() && (menuToggle.element().contains((Node) event.target) || - menu.element().contains((Node) event.target))) { - if (Tab.match(event)) { + if (expanded()) { + if (Escape.match(event)) { + collapse(); + return; + } + if ((menuToggle.element().contains((Node) event.target) || + menu.element().contains((Node) event.target)) && Tab.match(event)) { collapse(); } } @@ -316,4 +323,38 @@ private void keyHandler(KeyboardEvent event) { } } } + + private void onMenuToggleClick(Event event) { + if (expanded()) { + if (stayOpen != null && stayOpen.test(event, menuToggle, menu)) { + return; + } + collapse(); + } else { + expand(); + } + } + + private void onMenuClick(Event event) { + if (expanded()) { + if (stayOpen != null && stayOpen.test(event, menuToggle, menu)) { + return; + } + collapse(); + } + } + + private void onOutsideClick(Event event) { + if (expanded()) { + Node target = (Node) event.target; + boolean insideMenu = menu.element().contains(target); + boolean insideToggle = menuToggle.element().contains(target); + if (!insideMenu && !insideToggle) { + if (stayOpen != null && stayOpen.test(event, menuToggle, menu)) { + return; + } + collapse(); + } + } + } } diff --git a/components/src/main/java/org/patternfly/component/menu/MultiMenuToggleMenu.java b/components/src/main/java/org/patternfly/component/menu/MultiMenuToggleMenu.java index 2c2633b1b..5c162326b 100644 --- a/components/src/main/java/org/patternfly/component/menu/MultiMenuToggleMenu.java +++ b/components/src/main/java/org/patternfly/component/menu/MultiMenuToggleMenu.java @@ -17,16 +17,19 @@ import java.util.List; import java.util.Objects; +import java.util.function.Consumer; import org.jboss.elemento.TypedBuilder; import org.patternfly.component.ComponentType; -import org.patternfly.popper.TriggerAction; +import org.patternfly.component.SelectionMode; import elemental2.dom.HTMLElement; import static java.util.Collections.emptyList; import static java.util.stream.Collectors.toList; -import static org.patternfly.component.SelectionMode.multi; +import static org.patternfly.component.menu.MenuContent.menuContent; +import static org.patternfly.component.menu.MenuList.menuList; +import static org.patternfly.component.menu.MultiSelectMenu.multiSelectMenu; /** * Represents an abstract implementation of a menu-based toggle component that supports multi-selection. This class serves as a @@ -39,8 +42,11 @@ abstract class MultiMenuToggleMenu> exten // ------------------------------------------------------ instance - MultiMenuToggleMenu(ComponentType componentType, MenuToggle menuToggle, TriggerAction triggerAction) { - super(componentType, menuToggle, triggerAction); + private MenuContent menuContent; + private MenuList menuList; + + MultiMenuToggleMenu(ComponentType componentType, MenuToggle menuToggle) { + super(componentType, menuToggle); } abstract void updateMenuToggle(List items); @@ -50,7 +56,7 @@ abstract class MultiMenuToggleMenu> exten @Override public B add(Menu menu) { super.add(menu); - if (menu.selectionMode == multi) { + if (menu.selectionMode == SelectionMode.multi) { menu.onMultiSelect((e, m, items) -> updateMenuToggle(items)); } return that(); @@ -58,6 +64,34 @@ public B add(Menu menu) { // ------------------------------------------------------ api + /** + * Applies the provided {@link Consumer} to the {@link MenuList} associated with this {@link MultiSelect}. If the + * menu, menu content, or menu list is not yet initialized, they will be created as part of this method. + *

+ * This method simplifies the process of adding menu items to the component. It is a shortcut for creating and adding a + * {@link MultiSelectMenu}, {@link MenuContent}, and {@link MenuList} in a single step. Don't use this method if you need to + * us another menu type, want to customize the menu, content or list or if you want to use {@link MenuGroup}s. + * + * @param consumer a {@link Consumer} that accepts a {@link MenuList} for customization or modification + * @return the current {@link MultiSelect} instance for method chaining + */ + public B applyToMenuList(Consumer consumer) { + if (menu == null) { + add(multiSelectMenu()); + } + if (menuContent == null) { + menuContent = menuContent(); + menu.addContent(menuContent); + } + if (menuList == null) { + menuList = menuList(); + menuContent.addList(menuList); + } + + consumer.accept(menuList); + return that(); + } + public void clear() { clear(true); } diff --git a/components/src/main/java/org/patternfly/component/menu/MultiSelect.java b/components/src/main/java/org/patternfly/component/menu/MultiSelect.java index feb999342..eab949ae4 100644 --- a/components/src/main/java/org/patternfly/component/menu/MultiSelect.java +++ b/components/src/main/java/org/patternfly/component/menu/MultiSelect.java @@ -19,12 +19,15 @@ import org.patternfly.component.ComponentType; import org.patternfly.component.badge.Badge; -import org.patternfly.popper.TriggerAction; import static org.patternfly.component.badge.Badge.badge; /** * A select component to select multiple items from a list. + *

+ * This implementation uses the Popover API and CSS anchor positioning instead of Popper.js. The select uses the browser's + * top-layer rendering for correct stacking, eliminating z-index issues. CSS {@code position-try-fallbacks} handles menu + * flipping when there is not enough space. * * @see https://www.patternfly.org/components/menus/select */ @@ -56,10 +59,11 @@ public static MultiSelect multiSelect(MenuToggle menuToggle) { // ------------------------------------------------------ instance MultiSelect(MenuToggle menuToggle) { - super(ComponentType.MultiSelect, menuToggle, TriggerAction.stayOpen); + super(ComponentType.MultiSelect, menuToggle); if (menuToggle.badge() != null) { menuToggle.badge().style("visibility", "hidden", true); } + stayOpen((e, mt, m) -> menuItemClick(e)); } @Override @@ -82,4 +86,4 @@ void updateMenuToggle(List items) { public MultiSelect that() { return this; } -} +} \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/menu/MultiTypeahead.java b/components/src/main/java/org/patternfly/component/menu/MultiTypeahead.java index 019335d0b..1ee9b3da3 100644 --- a/components/src/main/java/org/patternfly/component/menu/MultiTypeahead.java +++ b/components/src/main/java/org/patternfly/component/menu/MultiTypeahead.java @@ -18,23 +18,33 @@ import java.util.List; import java.util.function.Function; +import org.jboss.elemento.By; +import org.jboss.elemento.Elements; import org.patternfly.component.ComponentType; import org.patternfly.component.label.Label; import org.patternfly.component.label.LabelGroup; import org.patternfly.component.textinputgroup.BaseFilterInput; import org.patternfly.component.textinputgroup.FilterInput; -import org.patternfly.popper.TriggerAction; -import elemental2.dom.Node; +import elemental2.dom.Element; import elemental2.promise.Promise; import static org.patternfly.component.menu.TypeaheadSupport.shouldExpandOnKeyup; import static org.patternfly.component.menu.TypeaheadSupport.typeaheadDefaults; +import static org.patternfly.component.menu.TypeaheadSupport.utilitiesClick; import static org.patternfly.component.textinputgroup.FilterInput.filterInput; +import static org.patternfly.style.Classes.component; +import static org.patternfly.style.Classes.item; +import static org.patternfly.style.Classes.labelGroup; +import static org.patternfly.style.Classes.list; /** * A typeahead is a select variant that replaces the typical button toggle for opening the select menu with a text input and * button toggle combo. As a user enters characters into the text input, the menu options will be filtered to match. + *

+ * This implementation uses the Popover API and CSS anchor positioning instead of Popper.js. The typeahead uses the browser's + * top-layer rendering for correct stacking, eliminating z-index issues. CSS {@code position-try-fallbacks} handles menu + * flipping when there is not enough space. * * @see https://www.patternfly.org/components/menus/select */ @@ -43,19 +53,18 @@ public class MultiTypeahead extends MultiMenuToggleMenu implemen // ------------------------------------------------------ factory /** - * Creates a new {@link MultiTypeahead} component with a {@link MenuToggle} of type {@link MenuToggleType#typeahead} and a - * {@link FilterInput}. + * Creates a new {@link MultiTypeahead} component with a {@link MenuToggle} of type {@link MenuToggleType#typeahead} + * and a {@link FilterInput}. */ public static MultiTypeahead multiTypeahead(String id, String placeholder) { return new MultiTypeahead(filterInput(id).plain().placeholder(placeholder)); } /** - * Creates a new {@link MultiTypeahead} component with a {@link MenuToggle} of type {@link MenuToggleType#typeahead} and the - * specified {@link BaseFilterInput}. + * Creates a new {@link MultiTypeahead} component with a {@link MenuToggle} of type {@link MenuToggleType#typeahead} + * and the specified {@link BaseFilterInput}. * - * @param filterInput the {@link BaseFilterInput} instance used to configure the typeahead component with filtering and - * search capabilities + * @param filterInput the {@link BaseFilterInput} instance used to configure the typeahead component * @return a new {@link MultiTypeahead} instance configured with the given filter input */ public static MultiTypeahead multiTypeahead(BaseFilterInput filterInput) { @@ -69,7 +78,7 @@ public static MultiTypeahead multiTypeahead(BaseFilterInput filterInput) { private NoResults noResults; MultiTypeahead(BaseFilterInput filterInput) { - super(ComponentType.MultiSelect, MenuToggle.menuToggle(filterInput), TriggerAction.stayOpen); + super(ComponentType.MultiTypeahead, MenuToggle.menuToggle(filterInput)); this.filterInput = filterInput; this.searchFilter = SearchFilter.contains(); this.noResults = NoResults.noResults(); @@ -82,6 +91,10 @@ public static MultiTypeahead multiTypeahead(BaseFilterInput filterInput) { } menu.search(searchFilter, noResults, value); }) + .onInput((e, c, value) -> { + expand(false); + menu.search(searchFilter, noResults, value); + }) .noAddOnEnter() .onEnter((e, fi) -> { String identifier = filterInput.textToIdentifier().apply(fi.value()); @@ -94,14 +107,10 @@ public static MultiTypeahead multiTypeahead(BaseFilterInput filterInput) { } } }); - stayOpen(event -> { - Node target = (Node) event.target; - boolean inputClick = filterInput.input().element() == target; - boolean labelGroupClick = filterInput.labelGroup() != null && - filterInput.labelGroup().element().contains((Node) event.target); - boolean utilitiesClick = menuToggle.searchInput().utilities() != null && - menuToggle.searchInput().utilities().element().contains((Node) event.target); - return inputClick || labelGroupClick || utilitiesClick; + stayOpen((event, mt, m) -> { + boolean labelGroupListItemClick = Elements.closest((Element) event.target, + By.classname(component(labelGroup, list, item))) != null; + return menuItemClick(event) || utilitiesClick(event) || labelGroupListItemClick; }); } @@ -130,7 +139,8 @@ public MultiTypeahead add(Menu menu) { // ------------------------------------------------------ builder @Override - public MultiTypeahead allowNewItems(Function prompt, Function> createItem) { + public MultiTypeahead allowNewItems(Function prompt, + Function> createItem) { TypeaheadSupport.allowNewItems(this, this, prompt, createItem); return this; } diff --git a/components/src/main/java/org/patternfly/component/menu/NativeDropdown.java b/components/src/main/java/org/patternfly/component/menu/NativeDropdown.java deleted file mode 100644 index 410e09fc5..000000000 --- a/components/src/main/java/org/patternfly/component/menu/NativeDropdown.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright 2023 Red Hat - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.patternfly.component.menu; - -import java.util.function.Consumer; - -import org.patternfly.component.ComponentType; -import org.patternfly.icon.PredefinedIcon; - -import static org.patternfly.component.menu.DropdownMenu.dropdownMenu; -import static org.patternfly.component.menu.MenuContent.menuContent; -import static org.patternfly.component.menu.MenuList.menuList; - -/** - * A dropdown presents a menu of actions or links in a constrained space that will trigger a process or navigate to a new - * location. - *

- * This implementation uses the Popover API and CSS anchor positioning instead of Popper.js. The dropdown uses the browser's - * top-layer rendering for correct stacking, eliminating z-index issues. CSS {@code position-try-fallbacks} handles menu - * flipping when there is not enough space. - * - * @see https://www.patternfly.org/components/menus/dropdown/ - */ -public class NativeDropdown extends NativeMenuToggleMenu { - - // ------------------------------------------------------ factory - - public static NativeDropdown nativeDropdown(String text) { - return new NativeDropdown(MenuToggle.menuToggle(text)); - } - - public static NativeDropdown nativeDropdown(PredefinedIcon icon, String label) { - return new NativeDropdown(MenuToggle.menuToggle(icon, label)); - } - - public static NativeDropdown nativeDropdown(MenuToggle menuToggle) { - return new NativeDropdown(menuToggle); - } - - // ------------------------------------------------------ instance - - private MenuContent menuContent; - private MenuList menuList; - - NativeDropdown(MenuToggle menuToggle) { - super(ComponentType.NativeDropdown, menuToggle); - } - - // ------------------------------------------------------ builder - - /** - * Applies the provided {@link Consumer} to the {@link MenuList} associated with this {@link NativeDropdown}. If the menu, - * menu content, or menu list is not yet initialized, they will be created as part of this method. - *

- * This method simplifies the process of adding menu items to the component. It is a shortcut for creating and adding a - * {@link DropdownMenu}, {@link MenuContent}, and {@link MenuList} in a single step. Don't use this method if you need to us - * another menu type, want to customize the menu, content or list or if you want to use {@link MenuGroup}s. - * - * @param consumer a {@link Consumer} that accepts a {@link MenuList} for customization or modification - * @return the current {@link NativeDropdown} instance for method chaining - */ - public NativeDropdown applyToMenuList(Consumer consumer) { - if (menu == null) { - add(dropdownMenu()); - } - if (menuContent == null) { - menuContent = menuContent(); - menu.addContent(menuContent); - } - if (menuList == null) { - menuList = menuList(); - menuContent.addList(menuList); - } - - consumer.accept(menuList); - return this; - } - - @Override - public NativeDropdown that() { - return this; - } -} \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/menu/NativeMultiSelect.java b/components/src/main/java/org/patternfly/component/menu/NativeMultiSelect.java deleted file mode 100644 index 2591b0b8a..000000000 --- a/components/src/main/java/org/patternfly/component/menu/NativeMultiSelect.java +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright 2023 Red Hat - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.patternfly.component.menu; - -import java.util.List; -import java.util.Objects; -import java.util.function.Consumer; - -import org.patternfly.component.ComponentType; -import org.patternfly.component.SelectionMode; -import org.patternfly.component.badge.Badge; - -import elemental2.dom.Node; - -import static java.util.Collections.emptyList; -import static java.util.stream.Collectors.toList; -import static org.patternfly.component.badge.Badge.badge; -import static org.patternfly.component.menu.MenuContent.menuContent; -import static org.patternfly.component.menu.MenuList.menuList; -import static org.patternfly.component.menu.MultiSelectMenu.multiSelectMenu; - -/** - * A select component to select multiple items from a list. - *

- * This implementation uses the Popover API and CSS anchor positioning instead of Popper.js. The select uses the browser's - * top-layer rendering for correct stacking, eliminating z-index issues. CSS {@code position-try-fallbacks} handles menu - * flipping when there is not enough space. - * - * @see https://www.patternfly.org/components/menus/select - */ -public class NativeMultiSelect extends NativeMenuToggleMenu { - - // ------------------------------------------------------ factory - - public static NativeMultiSelect nativeMultiSelect(String text) { - return new NativeMultiSelect(MenuToggle.menuToggle(text).addBadge(badge(0).read())); - } - - public static NativeMultiSelect nativeMultiSelect(MenuToggle menuToggle) { - return new NativeMultiSelect(menuToggle); - } - - // ------------------------------------------------------ instance - - private MenuContent menuContent; - private MenuList menuList; - - NativeMultiSelect(MenuToggle menuToggle) { - super(ComponentType.NativeMultiSelect, menuToggle); - if (menuToggle.badge() != null) { - menuToggle.badge().style("visibility", "hidden", true); - } - stayOpen((e, mt, m) -> menuItemClick(e)); - } - - // ------------------------------------------------------ add - - @Override - public NativeMultiSelect add(Menu menu) { - super.add(menu); - if (menu.selectionMode == SelectionMode.multi) { - menu.onMultiSelect((e, m, items) -> updateMenuToggle(items)); - } - return this; - } - - // ------------------------------------------------------ builder - - /** - * Applies the provided {@link Consumer} to the {@link MenuList} associated with this {@link NativeMultiSelect}. If the - * menu, menu content, or menu list is not yet initialized, they will be created as part of this method. - *

- * This method simplifies the process of adding menu items to the component. It is a shortcut for creating and adding a - * {@link MultiSelectMenu}, {@link MenuContent}, and {@link MenuList} in a single step. Don't use this method if you need to - * us another menu type, want to customize the menu, content or list or if you want to use {@link MenuGroup}s. - * - * @param consumer a {@link Consumer} that accepts a {@link MenuList} for customization or modification - * @return the current {@link NativeMultiSelect} instance for method chaining - */ - public NativeMultiSelect applyToMenuList(Consumer consumer) { - if (menu == null) { - add(multiSelectMenu()); - } - if (menuContent == null) { - menuContent = menuContent(); - menu.addContent(menuContent); - } - if (menuList == null) { - menuList = menuList(); - menuContent.addList(menuList); - } - - consumer.accept(menuList); - return this; - } - - @Override - public NativeMultiSelect that() { - return this; - } - - // ------------------------------------------------------ api - - public void clear() { - clear(true); - } - - public void clear(boolean fireEvent) { - menu.unselectAllItems(); - updateMenuToggle(emptyList()); - if (fireEvent) { - menu.fireMultiSelection(); - } - } - - public void selectIdentifiers(List identifiers) { - selectItems(identifiers.stream() - .map(identifier -> menu().findItem(identifier)) - .filter(Objects::nonNull) - .collect(toList()), true); - } - - public void selectIdentifiers(List identifiers, boolean fireEvent) { - selectItems(identifiers.stream() - .map(identifier -> menu().findItem(identifier)) - .filter(Objects::nonNull) - .collect(toList()), fireEvent); - } - - public void selectItems(List items) { - selectItems(items, true); - } - - public void selectItems(List items, boolean fireEvent) { - if (menu != null && menuToggle != null && !items.isEmpty()) { - for (MenuItem item : items) { - menu.select(item, true, false); - } - if (fireEvent) { - menu.fireMultiSelection(); - } - } - updateMenuToggle(items); - } - - // ------------------------------------------------------ internal - - private void updateMenuToggle(List items) { - Badge badge = menuToggle.badge(); - if (badge != null) { - int size = items.size(); - badge.count(size); - if (size == 0) { - badge.style("visibility", "hidden", true); - } else { - badge.style("visibility", "unset"); - } - } - } -} \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/menu/NativeMultiTypeahead.java b/components/src/main/java/org/patternfly/component/menu/NativeMultiTypeahead.java deleted file mode 100644 index 37b1c6d66..000000000 --- a/components/src/main/java/org/patternfly/component/menu/NativeMultiTypeahead.java +++ /dev/null @@ -1,252 +0,0 @@ -/* - * Copyright 2023 Red Hat - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.patternfly.component.menu; - -import java.util.List; -import java.util.Objects; -import java.util.function.Consumer; -import java.util.function.Function; - -import org.jboss.elemento.By; -import org.jboss.elemento.Elements; -import org.patternfly.component.ComponentType; -import org.patternfly.component.SelectionMode; -import org.patternfly.component.label.Label; -import org.patternfly.component.label.LabelGroup; -import org.patternfly.component.textinputgroup.BaseFilterInput; -import org.patternfly.component.textinputgroup.FilterInput; -import elemental2.dom.Element; -import elemental2.promise.Promise; - -import static java.util.Collections.emptyList; -import static java.util.stream.Collectors.toList; -import static org.patternfly.component.menu.MenuContent.menuContent; -import static org.patternfly.component.menu.MenuList.menuList; -import static org.patternfly.component.menu.MultiSelectMenu.multiSelectMenu; -import static org.patternfly.component.menu.TypeaheadSupport.shouldExpandOnKeyup; -import static org.patternfly.component.menu.TypeaheadSupport.typeaheadDefaults; -import static org.patternfly.component.menu.TypeaheadSupport.utilitiesClick; -import static org.patternfly.component.textinputgroup.FilterInput.filterInput; -import static org.patternfly.style.Classes.component; -import static org.patternfly.style.Classes.item; -import static org.patternfly.style.Classes.labelGroup; -import static org.patternfly.style.Classes.list; - -/** - * A typeahead is a select variant that replaces the typical button toggle for opening the select menu with a text input and - * button toggle combo. As a user enters characters into the text input, the menu options will be filtered to match. - *

- * This implementation uses the Popover API and CSS anchor positioning instead of Popper.js. The typeahead uses the browser's - * top-layer rendering for correct stacking, eliminating z-index issues. CSS {@code position-try-fallbacks} handles menu - * flipping when there is not enough space. - * - * @see https://www.patternfly.org/components/menus/select - */ -public class NativeMultiTypeahead extends NativeMenuToggleMenu - implements NativeTypeahead { - - // ------------------------------------------------------ factory - - /** - * Creates a new {@link NativeMultiTypeahead} component with a {@link MenuToggle} of type {@link MenuToggleType#typeahead} - * and a {@link FilterInput}. - */ - public static NativeMultiTypeahead nativeMultiTypeahead(String id, String placeholder) { - return new NativeMultiTypeahead(filterInput(id).plain().placeholder(placeholder)); - } - - /** - * Creates a new {@link NativeMultiTypeahead} component with a {@link MenuToggle} of type {@link MenuToggleType#typeahead} - * and the specified {@link BaseFilterInput}. - * - * @param filterInput the {@link BaseFilterInput} instance used to configure the typeahead component - * @return a new {@link NativeMultiTypeahead} instance configured with the given filter input - */ - public static NativeMultiTypeahead nativeMultiTypeahead(BaseFilterInput filterInput) { - return new NativeMultiTypeahead(filterInput); - } - - // ------------------------------------------------------ instance - - private final BaseFilterInput filterInput; - private SearchFilter searchFilter; - private NoResults noResults; - private MenuContent menuContent; - private MenuList menuList; - - NativeMultiTypeahead(BaseFilterInput filterInput) { - super(ComponentType.NativeMultiTypeahead, MenuToggle.menuToggle(filterInput)); - this.filterInput = filterInput; - this.searchFilter = SearchFilter.contains(); - this.noResults = NoResults.noResults(); - - typeaheadDefaults(this); - filterInput - .onKeyup((e, c, value) -> { - if (shouldExpandOnKeyup(this, e)) { - expand(false); - } - menu.search(searchFilter, noResults, value); - }) - .onInput((e, c, value) -> { - expand(false); - menu.search(searchFilter, noResults, value); - }) - .noAddOnEnter() - .onEnter((e, fi) -> { - String identifier = filterInput.textToIdentifier().apply(fi.value()); - MenuItem menuItem = menu.findItem(identifier); - if (menuItem != null) { - if (!filterInput.labelGroup().contains(identifier)) { - Label label = filterInput.textToLabel().apply(menuItem.text()); - filterInput.labelGroup().addItem(label); - menu.select(menuItem, true, false); - } - } - }); - stayOpen((event, mt, m) -> { - boolean labelGroupListItemClick = Elements.closest((Element) event.target, - By.classname(component(labelGroup, list, item))) != null; - return menuItemClick(event) || utilitiesClick(event) || labelGroupListItemClick; - }); - } - - // ------------------------------------------------------ add - - @Override - public NativeMultiTypeahead add(Menu menu) { - super.add(menu); - if (menu.selectionMode == SelectionMode.multi) { - menu.onMultiSelect((e, m, items) -> updateMenuToggle(items)); - } - searchInputControlsMenuList(); - return this; - } - - // ------------------------------------------------------ builder - - /** - * Applies the provided consumer to the {@link MenuList} associated with this {@link NativeMultiTypeahead}. If the menu, - * menu content, or menu list is not yet initialized, they will be created as part of this method. - *

- * This method simplifies the process of adding menu items to the component. It is a shortcut for creating and adding a - * {@link MultiSelectMenu}, {@link MenuContent}, and {@link MenuList} in a single step. Don't use this method if you need to - * us another menu type, want to customize the menu, content or list or if you want to use {@link MenuGroup}s. - * - * @param consumer a consumer that accepts a {@link MenuList} for customization or modification - * @return the current {@link NativeMultiTypeahead} instance for method chaining - */ - public NativeMultiTypeahead applyToMenuList(Consumer consumer) { - if (menu == null) { - add(multiSelectMenu()); - } - if (menuContent == null) { - menuContent = menuContent(); - menu.addContent(menuContent); - } - if (menuList == null) { - menuList = menuList(); - menuContent.addList(menuList); - } - - consumer.accept(menuList); - return this; - } - - @Override - public NativeMultiTypeahead allowNewItems(Function prompt, - Function> createItem) { - TypeaheadSupport.allowNewItems(this, this, prompt, createItem); - return this; - } - - @Override - public NativeMultiTypeahead that() { - return this; - } - - // ------------------------------------------------------ events - - @Override - public NativeMultiTypeahead onSearch(SearchFilter searchFilter) { - this.searchFilter = searchFilter; - return this; - } - - @Override - public NativeMultiTypeahead onNoResults(NoResults noResults) { - this.noResults = noResults; - return this; - } - - // ------------------------------------------------------ api - - public void clear() { - clear(true); - } - - public void clear(boolean fireEvent) { - menu.unselectAllItems(); - updateMenuToggle(emptyList()); - if (fireEvent) { - menu.fireMultiSelection(); - } - } - - public void selectIdentifiers(List identifiers) { - selectItems(identifiers.stream() - .map(identifier -> menu().findItem(identifier)) - .filter(Objects::nonNull) - .collect(toList()), true); - } - - public void selectIdentifiers(List identifiers, boolean fireEvent) { - selectItems(identifiers.stream() - .map(identifier -> menu().findItem(identifier)) - .filter(Objects::nonNull) - .collect(toList()), fireEvent); - } - - public void selectItems(List items) { - selectItems(items, true); - } - - public void selectItems(List items, boolean fireEvent) { - if (menu != null && menuToggle != null && !items.isEmpty()) { - for (MenuItem item : items) { - menu.select(item, true, false); - } - if (fireEvent) { - menu.fireMultiSelection(); - } - } - updateMenuToggle(items); - } - - // ------------------------------------------------------ internal - - private void updateMenuToggle(List items) { - LabelGroup labelGroup = filterInput.labelGroup(); - if (labelGroup != null && items != null) { - labelGroup.clear(); - for (MenuItem item : items) { - Label label = filterInput.textToLabel().apply(item.text()) - .onClose((e, c) -> menu.select(item, false, false)); - labelGroup.addItem(label); - } - } - } -} \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/menu/NativeSingleSelect.java b/components/src/main/java/org/patternfly/component/menu/NativeSingleSelect.java deleted file mode 100644 index ada833c00..000000000 --- a/components/src/main/java/org/patternfly/component/menu/NativeSingleSelect.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright 2023 Red Hat - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.patternfly.component.menu; - -import java.util.List; -import java.util.function.BiConsumer; -import java.util.function.Consumer; - -import org.patternfly.component.ComponentType; -import org.patternfly.component.SelectionMode; - -import static org.patternfly.component.menu.MenuContent.menuContent; -import static org.patternfly.component.menu.MenuList.menuList; -import static org.patternfly.component.menu.SingleSelectMenu.singleSelectMenu; - -/** - * A select component to select exactly one item from a list. - *

- * This implementation uses the Popover API and CSS anchor positioning instead of Popper.js. The select uses the browser's - * top-layer rendering for correct stacking, eliminating z-index issues. CSS {@code position-try-fallbacks} handles menu - * flipping when there is not enough space. - * - * @see https://www.patternfly.org/components/menus/select - */ -public class NativeSingleSelect extends NativeMenuToggleMenu { - - // ------------------------------------------------------ factory - - public static NativeSingleSelect nativeSingleSelect(String text) { - return new NativeSingleSelect(MenuToggle.menuToggle(text)); - } - - public static NativeSingleSelect nativeSingleSelect(MenuToggle menuToggle) { - return new NativeSingleSelect(menuToggle); - } - - // ------------------------------------------------------ instance - - private boolean defaultSelectHandler; - private MenuContent menuContent; - private MenuList menuList; - - NativeSingleSelect(MenuToggle menuToggle) { - super(ComponentType.NativeSingleSelect, menuToggle); - this.defaultSelectHandler = true; - } - - // ------------------------------------------------------ add - - @Override - public NativeSingleSelect add(Menu menu) { - super.add(menu); - if (menu.menuType == MenuType.select && menu.selectionMode == SelectionMode.single && defaultSelectHandler) { - menu.onSingleSelect((e, menuItem, s) -> updateMenuToggle(menuItem)); - } - return this; - } - - // ------------------------------------------------------ builder - - /** - * Applies the provided {@link Consumer} to the {@link MenuList} associated with this {@link NativeSingleSelect}. If the - * menu, menu content, or menu list is not yet initialized, they will be created as part of this method. - *

- * This method simplifies the process of adding menu items to the component. It is a shortcut for creating and adding a - * {@link SingleSelectMenu}, {@link MenuContent}, and {@link MenuList} in a single step. Don't use this method if you need - * to us another menu type, want to customize the menu, content or list or if you want to use {@link MenuGroup}s. - * - * @param consumer a {@link Consumer} that accepts a {@link MenuList} for customization or modification - * @return the current {@link NativeSingleSelect} instance for method chaining - */ - public NativeSingleSelect applyToMenuList(Consumer consumer) { - if (menu == null) { - add(singleSelectMenu()); - } - if (menuContent == null) { - menuContent = menuContent(); - menu.addContent(menuContent); - } - if (menuList == null) { - menuList = menuList(); - menuContent.addList(menuList); - } - - consumer.accept(menuList); - return this; - } - - public NativeSingleSelect noDefaultSelectHandler() { - this.defaultSelectHandler = false; - return this; - } - - @Override - public NativeSingleSelect that() { - return this; - } - - // ------------------------------------------------------ api - - public void clear() { - clear(true); - } - - public void clear(boolean fireEvent) { - List selectedItems = menu.selectedItems(); - menu.clearSearch(); - menu.unselectAllItems(); - menuToggle.text(""); - if (fireEvent && !selectedItems.isEmpty()) { - menu.fireSingleSelection(selectedItems.get(0), false); - } - } - - public void select(String identifier) { - select(menu().findItem(identifier), true); - } - - public void select(String identifier, boolean fireEvent) { - select(menu().findItem(identifier), fireEvent); - } - - public void select(MenuItem item) { - select(item, true); - } - - public void select(MenuItem item, boolean fireEvent) { - if (menu != null && menuToggle != null && item != null) { - menu.select(item, true, fireEvent); - if (!fireEvent && defaultSelectHandler) { - updateMenuToggle(item); - } - } - } - - // ------------------------------------------------------ internal - - private void updateMenuToggle(MenuItem item) { - menuToggle.text(item.text()); - } -} \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/menu/NativeSingleTypeahead.java b/components/src/main/java/org/patternfly/component/menu/NativeSingleTypeahead.java deleted file mode 100644 index 3f364c1e6..000000000 --- a/components/src/main/java/org/patternfly/component/menu/NativeSingleTypeahead.java +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright 2023 Red Hat - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.patternfly.component.menu; - -import java.util.List; -import java.util.function.Consumer; -import java.util.function.Function; - -import org.patternfly.component.ComponentType; -import org.patternfly.component.SelectionMode; -import org.patternfly.component.textinputgroup.BaseSearchInput; -import org.patternfly.component.textinputgroup.SearchInput; -import elemental2.promise.Promise; - -import static org.patternfly.component.menu.MenuContent.menuContent; -import static org.patternfly.component.menu.MenuList.menuList; -import static org.patternfly.component.menu.SingleSelectMenu.singleSelectMenu; -import static org.patternfly.component.menu.TypeaheadSupport.shouldExpandOnKeyup; -import static org.patternfly.component.menu.TypeaheadSupport.typeaheadDefaults; -import static org.patternfly.component.menu.TypeaheadSupport.utilitiesClick; -import static org.patternfly.component.textinputgroup.SearchInput.searchInput; - -/** - * A typeahead is a select variant that replaces the typical button toggle for opening the select menu with a text input and - * button toggle combo. As a user enters characters into the text input, the menu options will be filtered to match. - *

- * This implementation uses the Popover API and CSS anchor positioning instead of Popper.js. The typeahead uses the browser's - * top-layer rendering for correct stacking, eliminating z-index issues. CSS {@code position-try-fallbacks} handles menu - * flipping when there is not enough space. - * - * @see https://www.patternfly.org/components/menus/select - */ -public class NativeSingleTypeahead extends NativeMenuToggleMenu - implements NativeTypeahead { - - // ------------------------------------------------------ factory - - /** - * Creates a new {@link NativeSingleTypeahead} component with a {@link MenuToggle} of type {@link MenuToggleType#typeahead} - * and a {@link SearchInput}. - */ - public static NativeSingleTypeahead nativeSingleTypeahead(String id, String placeholder) { - return new NativeSingleTypeahead(searchInput(id).plain().placeholder(placeholder)); - } - - /** - * Creates a new {@link NativeSingleTypeahead} instance using the provided {@link BaseSearchInput}. - * - * @param searchInput the {@link BaseSearchInput} used to configure the typeahead component. - * @return a new {@link NativeSingleTypeahead} instance initialized with a {@link MenuToggle} of type - * {@link MenuToggleType#typeahead}. - */ - public static NativeSingleTypeahead nativeSingleTypeahead(BaseSearchInput searchInput) { - return new NativeSingleTypeahead(searchInput); - } - - // ------------------------------------------------------ instance - - private boolean defaultSelectHandler; - private SearchFilter searchFilter; - private NoResults noResults; - private MenuContent menuContent; - private MenuList menuList; - - NativeSingleTypeahead(BaseSearchInput searchInput) { - super(ComponentType.NativeSingleTypeahead, MenuToggle.menuToggle(searchInput)); - this.defaultSelectHandler = true; - this.searchFilter = SearchFilter.contains(); - this.noResults = NoResults.noResults(); - - typeaheadDefaults(this); - menuToggle.searchInput() - .onKeyup((e, c, value) -> { - if (shouldExpandOnKeyup(this, e)) { - expand(false); - } - menu.search(searchFilter, noResults, value); - }) - .onInput((e, c, value) -> { - expand(false); - menu.search(searchFilter, noResults, value); - }); - stayOpen((e, mt, m) -> utilitiesClick(e)); - } - - // ------------------------------------------------------ add - - @Override - public NativeSingleTypeahead add(Menu menu) { - super.add(menu); - if (menu.menuType == MenuType.select && menu.selectionMode == SelectionMode.single && defaultSelectHandler) { - menu.onSingleSelect((e, menuItem, s) -> updateMenuToggle(menuItem)); - } - searchInputControlsMenuList(); - return this; - } - - // ------------------------------------------------------ builder - - /** - * Applies the provided consumer to the {@link MenuList} associated with this {@link NativeSingleTypeahead}. If the menu, - * menu content, or menu list is not yet initialized, they will be created as part of this method. - *

- * This method simplifies the process of adding menu items to the component. It is a shortcut for creating and adding a - * {@link SingleSelectMenu}, {@link MenuContent}, and {@link MenuList} in a single step. Don't use this method if you need - * to us another menu type, want to customize the menu, content or list or if you want to use {@link MenuGroup}s. - * - * @param consumer a consumer that accepts a {@link MenuList} for customization or modification - * @return the current {@link NativeSingleTypeahead} instance for method chaining - */ - public NativeSingleTypeahead applyToMenuList(Consumer consumer) { - if (menu == null) { - add(singleSelectMenu()); - } - if (menuContent == null) { - menuContent = menuContent(); - menu.addContent(menuContent); - } - if (menuList == null) { - menuList = menuList(); - menuContent.addList(menuList); - } - - consumer.accept(menuList); - return this; - } - - public NativeSingleTypeahead noDefaultSelectHandler() { - this.defaultSelectHandler = false; - return this; - } - - @Override - public NativeSingleTypeahead allowNewItems(Function prompt, - Function> createItem) { - TypeaheadSupport.allowNewItems(this, this, prompt, createItem); - return this; - } - - @Override - public NativeSingleTypeahead that() { - return this; - } - - // ------------------------------------------------------ events - - @Override - public NativeSingleTypeahead onSearch(SearchFilter searchFilter) { - this.searchFilter = searchFilter; - return this; - } - - @Override - public NativeSingleTypeahead onNoResults(NoResults noResults) { - this.noResults = noResults; - return this; - } - - // ------------------------------------------------------ api - - public void clear() { - clear(true); - } - - public void clear(boolean fireEvent) { - List selectedItems = menu.selectedItems(); - menu.clearSearch(); - menu.unselectAllItems(); - menuToggle.text(""); - if (fireEvent && !selectedItems.isEmpty()) { - menu.fireSingleSelection(selectedItems.get(0), false); - } - } - - public void select(String identifier) { - select(menu().findItem(identifier), true); - } - - public void select(String identifier, boolean fireEvent) { - select(menu().findItem(identifier), fireEvent); - } - - public void select(MenuItem item) { - select(item, true); - } - - public void select(MenuItem item, boolean fireEvent) { - if (menu != null && menuToggle != null && item != null) { - menu.select(item, true, fireEvent); - if (!fireEvent && defaultSelectHandler) { - updateMenuToggle(item); - } - } - } - - // ------------------------------------------------------ internal - - private void updateMenuToggle(MenuItem item) { - menuToggle.text(item.text()); - } -} \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/menu/PopperDropdown.java b/components/src/main/java/org/patternfly/component/menu/PopperDropdown.java new file mode 100644 index 000000000..5444a5c77 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/menu/PopperDropdown.java @@ -0,0 +1,58 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.component.menu; + +import org.patternfly.component.ComponentType; +import org.patternfly.icon.PredefinedIcon; +import org.patternfly.popper.TriggerAction; + +/** + * A dropdown presents a menu of actions or links in a constrained space that will trigger a process or navigate to a new + * location. See select component guidelines for more information about making one or more selections from a list of items in a + * value list. + * + * @deprecated This implementation uses the Popper.js API, which is due to be removed soon. Use {@link Dropdown} instead. + */ +@Deprecated +public class PopperDropdown extends PopperMenuToggleMenu { + + // ------------------------------------------------------ factory + + public static PopperDropdown dropdown(String text) { + return new PopperDropdown(MenuToggle.menuToggle(text)); + } + + public static PopperDropdown dropdown(PredefinedIcon icon, String label) { + return new PopperDropdown(MenuToggle.menuToggle(icon, label)); + } + + public static PopperDropdown dropdown(MenuToggle menuToggle) { + return new PopperDropdown(menuToggle); + } + + // ------------------------------------------------------ instance + + PopperDropdown(MenuToggle menuToggle) { + super(ComponentType.PopperDropdown, menuToggle, TriggerAction.click); + } + + // ------------------------------------------------------ builder + + @Override + public PopperDropdown that() { + return this; + } +} diff --git a/components/src/main/java/org/patternfly/component/menu/NativeMenuToggleMenu.java b/components/src/main/java/org/patternfly/component/menu/PopperMenuToggleMenu.java similarity index 63% rename from components/src/main/java/org/patternfly/component/menu/NativeMenuToggleMenu.java rename to components/src/main/java/org/patternfly/component/menu/PopperMenuToggleMenu.java index 353cd3a93..e97c07cd4 100644 --- a/components/src/main/java/org/patternfly/component/menu/NativeMenuToggleMenu.java +++ b/components/src/main/java/org/patternfly/component/menu/PopperMenuToggleMenu.java @@ -16,13 +16,16 @@ package org.patternfly.component.menu; import java.util.ArrayList; +import java.util.EnumSet; import java.util.List; +import java.util.Set; import java.util.function.Consumer; import java.util.function.Predicate; import org.gwtproject.event.shared.HandlerRegistration; import org.jboss.elemento.Attachable; import org.jboss.elemento.By; +import org.jboss.elemento.EventType; import org.jboss.elemento.Id; import org.jboss.elemento.TypedBuilder; import org.jboss.elemento.logger.Logger; @@ -32,10 +35,14 @@ import org.patternfly.core.Aria; import org.patternfly.handler.ComponentHandler; import org.patternfly.handler.ToggleHandler; -import org.patternfly.popper.Placement; -import org.patternfly.position.AnchorPositioning; +import org.patternfly.popper.Modifiers; +import org.patternfly.popper.Popper; +import org.patternfly.popper.PopperBuilder; +import org.patternfly.popper.TriggerAction; import org.patternfly.style.Classes; import org.patternfly.style.Modifiers.Disabled; +import org.patternfly.style.Placement; + import elemental2.core.JsArray; import elemental2.dom.Event; import elemental2.dom.HTMLElement; @@ -45,66 +52,57 @@ import static elemental2.dom.DomGlobal.document; import static elemental2.dom.DomGlobal.window; -import static org.jboss.elemento.Elements.div; -import static org.jboss.elemento.Elements.insertAfter; +import static org.jboss.elemento.Elements.failSafeRemoveFromParent; import static org.jboss.elemento.Elements.isVisible; -import static org.jboss.elemento.EventType.bind; -import static org.jboss.elemento.EventType.click; +import static org.jboss.elemento.Elements.setVisible; import static org.jboss.elemento.EventType.keydown; import static org.jboss.elemento.Key.ArrowDown; import static org.jboss.elemento.Key.ArrowUp; -import static org.jboss.elemento.Key.Escape; import static org.jboss.elemento.Key.Tab; -import static org.patternfly.core.Attributes.popover; -import static org.patternfly.popper.Placement.auto; -import static org.patternfly.popper.Placement.bottomStart; import static org.patternfly.style.Classes.component; import static org.patternfly.style.Classes.list; +import static org.patternfly.style.Placement.auto; +import static org.patternfly.style.Placement.bottomStart; /** - * Abstract base component for native components that combine a {@link MenuToggle} and a {@link Menu}, such as - * {@link NativeDropdown} or {@link NativeSingleSelect}. + * Abstract base component for components that combine a {@link MenuToggle} and a {@link Menu}, such as {@link PopperDropdown}, + * {@link PopperSingleSelect}, {@link PopperSingleTypeahead}, or {@link PopperMultiSelect}. *

- * The component delegates to the {@link MenuToggle} component. The {@link Menu} is managed using the native Popover API and CSS - * anchor positioning via {@link AnchorPositioning}. + * The component delegates to the {@link MenuToggle} component. The {@link Menu} is managed by a {@link Popper} instance. */ -abstract class NativeMenuToggleMenu> extends ComponentDelegate - implements +@Deprecated +abstract class PopperMenuToggleMenu> extends ComponentDelegate implements Disabled, Expandable, Attachable { // ------------------------------------------------------ instance - private static final Logger logger = Logger.getLogger(NativeMenuToggleMenu.class.getName()); - private static final int DISTANCE = 0; + private static final Logger logger = Logger.getLogger(PopperMenuToggleMenu.class.getName()); + private static final int Z_INDEX = 9999; final MenuToggle menuToggle; - final AnchorPositioning ap; Menu menu; - private final HTMLElement menuPopover; + private final Set triggerActions; private final List> toggleHandler; private final List> loadedHandler; + private int zIndex; + private boolean flip; private boolean disabled; private Placement placement; - private StayOpenPredicate stayOpen; - private HandlerRegistration menuToggleClickHandler; - private HandlerRegistration menuClickHandler; + private Popper popper; private HandlerRegistration keyHandler; - private HandlerRegistration outsideClickHandler; + private Predicate stayOpen; - NativeMenuToggleMenu(ComponentType componentType, MenuToggle menuToggle) { + PopperMenuToggleMenu(ComponentType componentType, MenuToggle menuToggle, TriggerAction triggerAction) { super(componentType); this.menuToggle = menuToggle; this.toggleHandler = new ArrayList<>(); this.loadedHandler = new ArrayList<>(); - this.placement = auto; - - String id = Id.unique(componentType().id); - menuPopover = div().css(component(Classes.menu, Classes.popover)) - .attr(popover, "manual") - .element(); - ap = new AnchorPositioning(id, menuPopover, menuToggle::element, DISTANCE, true, true); + this.triggerActions = EnumSet.of(triggerAction); + this.flip = true; + this.placement = bottomStart; + this.zIndex = Z_INDEX; delegateTo(menuToggle.element()); Attachable.register(menuToggle.element(), this); @@ -116,13 +114,22 @@ public void attach(MutationRecord mutationRecord) { if (disabled) { menuToggle.disabled(true); } - insertAfter(menuPopover, menuToggle.element()); - ap.attach(); - ap.applyPlacement(placement == auto ? bottomStart : placement); - menuToggleClickHandler = bind(menuToggle.toggleElement, click, this::onMenuToggleClick); - menuClickHandler = bind(menu, click, this::onMenuClick); - keyHandler = bind(window, keydown, this::keyHandler); - + setVisible(menu, false); + document.body.appendChild(menu.element()); // always append to the body to prevent display/width/z-index issues! + popper = new PopperBuilder(componentType().componentName, menuToggle.element(), menu.element()) + .addModifier(Modifiers.eventListeners(false), + Modifiers.flip(placement == auto || flip), + Modifiers.hide(), + Modifiers.noOverflow(), + Modifiers.placement(), + Modifiers.widths()) + .placement(placement) + .registerHandler(menuToggle.toggleElement, triggerActions, + event -> expand(), event -> collapse()) + .stayOpen(stayOpen) + .zIndex(zIndex) + .build(); + keyHandler = EventType.bind(window, keydown, this::keyHandler); } else { logger.error("No toggle and/or menu defined for %s %o", componentType().name(), element()); } @@ -130,24 +137,11 @@ public void attach(MutationRecord mutationRecord) { @Override public void detach(MutationRecord mutationRecord) { - if (expanded()) { - ap.hide(); - } - if (outsideClickHandler != null) { - outsideClickHandler.removeHandler(); - } if (keyHandler != null) { keyHandler.removeHandler(); } - if (menuClickHandler != null) { - menuClickHandler.removeHandler(); - } - if (menuToggleClickHandler != null) { - menuToggleClickHandler.removeHandler(); - } - if (ap != null) { - ap.detach(); - } + failSafeRemoveFromParent(menu); + popper.cleanup(); } // ------------------------------------------------------ add @@ -159,7 +153,7 @@ public B addMenu(Menu menu) { // override to ensure internal wiring public B add(Menu menu) { this.menu = menu; - menuPopover.appendChild(menu.element()); + // Do *not* add the menu now, delay it to attach() return that(); } @@ -187,22 +181,41 @@ public boolean isDisabled() { return menuToggle == null ? disabled : menuToggle.isDisabled(); } + public B flip(boolean flip) { + this.flip = flip; + return that(); + } + public B placement(Placement placement) { + if (placement == auto) { + flip = true; + } this.placement = placement; return that(); } + public B stayOpen() { + this.triggerActions.clear(); + this.triggerActions.add(TriggerAction.stayOpen); + return that(); + } + /** - * Specifies a condition that determines whether the menu should remain open when the menu-toggle or the menu is clicked. + * Specifies a condition that determines whether the menu should remain open when an event occurs. * * @param stayOpen a {@link Predicate} that evaluates an {@link Event} to determine if the menu remains open. * @return the current instance with the condition applied, enabling method chaining. */ - public B stayOpen(StayOpenPredicate stayOpen) { + public B stayOpen(Predicate stayOpen) { this.stayOpen = stayOpen; return that(); } + public B zIndex(int zIndex) { + this.zIndex = zIndex; + return that(); + } + // ------------------------------------------------------ aria public B ariaLabel(String label) { @@ -225,27 +238,19 @@ public B onToggle(ToggleHandler toggleHandler) { @Override public void collapse(boolean fireEvent) { - if (expanded()) { - ap.hide(); + popper.hide(() -> { Expandable.collapse(element(), element(), null); - if (outsideClickHandler != null) { - outsideClickHandler.removeHandler(); - outsideClickHandler = null; - } if (fireEvent) { toggleHandler.forEach(th -> th.onToggle(new Event(""), that(), false)); } menuToggle.element().focus(); - } + }); } @Override public void expand(boolean fireEvent) { - if (!expanded() && !isDisabled()) { - ap.applyPlacement(placement == auto ? bottomStart : placement); - ap.show(); + popper.show(() -> { Expandable.expand(element(), element(), null); - outsideClickHandler = bind(document, click, this::onOutsideClick); if (fireEvent) { toggleHandler.forEach(th -> th.onToggle(new Event(""), that(), true)); } @@ -255,7 +260,7 @@ public void expand(boolean fireEvent) { return null; }); } - } + }); } public MenuToggle menuToggle() { @@ -281,20 +286,10 @@ void searchInputControlsMenuList() { } } - boolean menuItemClick(Event event) { - return menu.element().contains((Node) event.target); - } - - // ------------------------------------------------------ internal event handlers - private void keyHandler(KeyboardEvent event) { - if (expanded()) { - if (Escape.match(event)) { - collapse(); - return; - } - if ((menuToggle.element().contains((Node) event.target) || - menu.element().contains((Node) event.target)) && Tab.match(event)) { + if (expanded() && (menuToggle.element().contains((Node) event.target) || + menu.element().contains((Node) event.target))) { + if (Tab.match(event)) { collapse(); } } @@ -322,38 +317,4 @@ private void keyHandler(KeyboardEvent event) { } } } - - private void onMenuToggleClick(Event event) { - if (expanded()) { - if (stayOpen != null && stayOpen.test(event, menuToggle, menu)) { - return; - } - collapse(); - } else { - expand(); - } - } - - private void onMenuClick(Event event) { - if (expanded()) { - if (stayOpen != null && stayOpen.test(event, menuToggle, menu)) { - return; - } - collapse(); - } - } - - private void onOutsideClick(Event event) { - if (expanded()) { - Node target = (Node) event.target; - boolean insideMenu = menu.element().contains(target); - boolean insideToggle = menuToggle.element().contains(target); - if (!insideMenu && !insideToggle) { - if (stayOpen != null && stayOpen.test(event, menuToggle, menu)) { - return; - } - collapse(); - } - } - } -} \ No newline at end of file +} diff --git a/components/src/main/java/org/patternfly/component/menu/PopperMultiMenuToggleMenu.java b/components/src/main/java/org/patternfly/component/menu/PopperMultiMenuToggleMenu.java new file mode 100644 index 000000000..848f8e412 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/menu/PopperMultiMenuToggleMenu.java @@ -0,0 +1,103 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.component.menu; + +import java.util.List; +import java.util.Objects; + +import org.jboss.elemento.TypedBuilder; +import org.patternfly.component.ComponentType; +import org.patternfly.popper.TriggerAction; + +import elemental2.dom.HTMLElement; + +import static java.util.Collections.emptyList; +import static java.util.stream.Collectors.toList; +import static org.patternfly.component.SelectionMode.multi; + +/** + * Represents an abstract implementation of a menu-based toggle component that supports multi-selection. This class serves as a + * base for creating specialized multi-menu toggle components, providing functionality for managing selected menu items and + * updating the toggle display. + * + * @param the type of the builder for this component + */ +@Deprecated +abstract class PopperMultiMenuToggleMenu> extends PopperMenuToggleMenu { + + // ------------------------------------------------------ instance + + PopperMultiMenuToggleMenu(ComponentType componentType, MenuToggle menuToggle, TriggerAction triggerAction) { + super(componentType, menuToggle, triggerAction); + } + + abstract void updateMenuToggle(List items); + + // ------------------------------------------------------ add + + @Override + public B add(Menu menu) { + super.add(menu); + if (menu.selectionMode == multi) { + menu.onMultiSelect((e, m, items) -> updateMenuToggle(items)); + } + return that(); + } + + // ------------------------------------------------------ api + + public void clear() { + clear(true); + } + + public void clear(boolean fireEvent) { + menu.unselectAllItems(); + updateMenuToggle(emptyList()); + if (fireEvent) { + menu.fireMultiSelection(); + } + } + + public void selectIdentifiers(List identifiers) { + selectItems(identifiers.stream() + .map(identifier -> menu().findItem(identifier)) + .filter(Objects::nonNull) + .collect(toList()), true); + } + + public void selectIdentifiers(List identifiers, boolean fireEvent) { + selectItems(identifiers.stream() + .map(identifier -> menu().findItem(identifier)) + .filter(Objects::nonNull) + .collect(toList()), fireEvent); + } + + public void selectItems(List items) { + selectItems(items, true); + } + + public void selectItems(List items, boolean fireEvent) { + if (menu != null && menuToggle != null && !items.isEmpty()) { + for (MenuItem item : items) { + menu.select(item, true, false); + } + if (fireEvent) { + menu.fireMultiSelection(); + } + } + updateMenuToggle(items); + } +} diff --git a/components/src/main/java/org/patternfly/component/menu/PopperMultiSelect.java b/components/src/main/java/org/patternfly/component/menu/PopperMultiSelect.java new file mode 100644 index 000000000..ce0349785 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/menu/PopperMultiSelect.java @@ -0,0 +1,86 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.component.menu; + +import java.util.List; + +import org.patternfly.component.ComponentType; +import org.patternfly.component.badge.Badge; +import org.patternfly.popper.TriggerAction; + +import static org.patternfly.component.badge.Badge.badge; + +/** + * A select component to select multiple items from a list. + * + * @deprecated This implementation uses the Popper.js API, which is due to be removed soon. Use {@link MultiSelect} instead. + */ +@Deprecated +public class PopperMultiSelect extends PopperMultiMenuToggleMenu { + + // ------------------------------------------------------ factory + + /** + * Creates a new instance of MultiSelect with a toggle menu initialized using the provided text. The toggle menu includes a + * badge initialized with a count of zero in the read state. + * + * @param text the text to be displayed on the toggle menu + * @return a new instance of MultiSelect initialized with the specified text + */ + public static PopperMultiSelect multiSelect(String text) { + return new PopperMultiSelect(MenuToggle.menuToggle(text).addBadge(badge(0).read())); + } + + /** + * Creates a new instance of {@code MultiSelect} initialized with the specified {@code MenuToggle}. + * + * @param menuToggle the {@code MenuToggle} to initialize the {@code MultiSelect} with + * @return a new instance of {@code MultiSelect} initialized with the provided {@code MenuToggle} + */ + public static PopperMultiSelect multiSelect(MenuToggle menuToggle) { + return new PopperMultiSelect(menuToggle); + } + + // ------------------------------------------------------ instance + + PopperMultiSelect(MenuToggle menuToggle) { + super(ComponentType.PopperMultiSelect, menuToggle, TriggerAction.stayOpen); + if (menuToggle.badge() != null) { + menuToggle.badge().style("visibility", "hidden", true); + } + } + + @Override + void updateMenuToggle(List items) { + Badge badge = menuToggle.badge(); + if (badge != null) { + int size = items.size(); + badge.count(size); + if (size == 0) { + badge.style("visibility", "hidden", true); + } else { + badge.style("visibility", "unset"); + } + } + } + + // ------------------------------------------------------ builder + + @Override + public PopperMultiSelect that() { + return this; + } +} diff --git a/components/src/main/java/org/patternfly/component/menu/PopperMultiTypeahead.java b/components/src/main/java/org/patternfly/component/menu/PopperMultiTypeahead.java new file mode 100644 index 000000000..c3b5ca6f2 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/menu/PopperMultiTypeahead.java @@ -0,0 +1,158 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.component.menu; + +import java.util.List; +import java.util.function.Function; + +import org.patternfly.component.ComponentType; +import org.patternfly.component.label.Label; +import org.patternfly.component.label.LabelGroup; +import org.patternfly.component.textinputgroup.BaseFilterInput; +import org.patternfly.component.textinputgroup.FilterInput; +import org.patternfly.popper.TriggerAction; + +import elemental2.dom.Node; +import elemental2.promise.Promise; + +import static org.patternfly.component.menu.TypeaheadSupport.shouldExpandOnKeyup; +import static org.patternfly.component.menu.TypeaheadSupport.typeaheadDefaults; +import static org.patternfly.component.textinputgroup.FilterInput.filterInput; + +/** + * A typeahead is a select variant that replaces the typical button toggle for opening the select menu with a text input and + * button toggle combo. As a user enters characters into the text input, the menu options will be filtered to match. + * + * @deprecated This implementation uses the Popper.js API, which is due to be removed soon. Use {@link MultiTypeahead} instead. + */ +@Deprecated +public class PopperMultiTypeahead + extends PopperMultiMenuToggleMenu implements PopperTypeahead { + + // ------------------------------------------------------ factory + + /** + * Creates a new {@link PopperMultiTypeahead} component with a {@link MenuToggle} of type {@link MenuToggleType#typeahead} and a + * {@link FilterInput}. + */ + public static PopperMultiTypeahead multiTypeahead(String id, String placeholder) { + return new PopperMultiTypeahead(filterInput(id).plain().placeholder(placeholder)); + } + + /** + * Creates a new {@link PopperMultiTypeahead} component with a {@link MenuToggle} of type {@link MenuToggleType#typeahead} and the + * specified {@link BaseFilterInput}. + * + * @param filterInput the {@link BaseFilterInput} instance used to configure the typeahead component with filtering and + * search capabilities + * @return a new {@link PopperMultiTypeahead} instance configured with the given filter input + */ + public static PopperMultiTypeahead multiTypeahead(BaseFilterInput filterInput) { + return new PopperMultiTypeahead(filterInput); + } + + // ------------------------------------------------------ instance + + private final BaseFilterInput filterInput; + private SearchFilter searchFilter; + private NoResults noResults; + + PopperMultiTypeahead(BaseFilterInput filterInput) { + super(ComponentType.PopperMultiTypeahead, MenuToggle.menuToggle(filterInput), TriggerAction.stayOpen); + this.filterInput = filterInput; + this.searchFilter = SearchFilter.contains(); + this.noResults = NoResults.noResults(); + + typeaheadDefaults(this); + filterInput + .onKeyup((e, c, value) -> { + if (shouldExpandOnKeyup(this, e)) { + expand(false); + } + menu.search(searchFilter, noResults, value); + }) + .noAddOnEnter() + .onEnter((e, fi) -> { + String identifier = filterInput.textToIdentifier().apply(fi.value()); + MenuItem menuItem = menu.findItem(identifier); + if (menuItem != null) { + if (!filterInput.labelGroup().contains(identifier)) { + Label label = filterInput.textToLabel().apply(menuItem.text()); + filterInput.labelGroup().addItem(label); + menu.select(menuItem, true, false); + } + } + }); + stayOpen(event -> { + Node target = (Node) event.target; + boolean inputClick = filterInput.input().element() == target; + boolean labelGroupClick = filterInput.labelGroup() != null && + filterInput.labelGroup().element().contains((Node) event.target); + boolean utilitiesClick = menuToggle.searchInput().utilities() != null && + menuToggle.searchInput().utilities().element().contains((Node) event.target); + return inputClick || labelGroupClick || utilitiesClick; + }); + } + + @Override + void updateMenuToggle(List items) { + LabelGroup labelGroup = filterInput.labelGroup(); + if (labelGroup != null && items != null) { + labelGroup.clear(); + for (MenuItem item : items) { + Label label = filterInput.textToLabel().apply(item.text()) + .onClose((e, c) -> menu.select(item, false, false)); + labelGroup.addItem(label); + } + } + } + + // ------------------------------------------------------ add + + @Override + public PopperMultiTypeahead add(Menu menu) { + super.add(menu); + searchInputControlsMenuList(); + return this; + } + + // ------------------------------------------------------ builder + + @Override + public PopperMultiTypeahead allowNewItems(Function prompt, Function> createItem) { + TypeaheadSupport.allowNewItems(this, this, prompt, createItem); + return this; + } + + @Override + public PopperMultiTypeahead that() { + return this; + } + + // ------------------------------------------------------ events + + @Override + public PopperMultiTypeahead onSearch(SearchFilter searchFilter) { + this.searchFilter = searchFilter; + return this; + } + + @Override + public PopperMultiTypeahead onNoResults(NoResults noResults) { + this.noResults = noResults; + return this; + } +} diff --git a/components/src/main/java/org/patternfly/component/menu/PopperSingleMenuToggleMenu.java b/components/src/main/java/org/patternfly/component/menu/PopperSingleMenuToggleMenu.java new file mode 100644 index 000000000..bb0824462 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/menu/PopperSingleMenuToggleMenu.java @@ -0,0 +1,104 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.component.menu; + +import java.util.List; + +import org.jboss.elemento.TypedBuilder; +import org.patternfly.component.ComponentType; +import org.patternfly.popper.TriggerAction; + +import elemental2.dom.HTMLElement; + +import static org.patternfly.component.SelectionMode.single; +import static org.patternfly.component.menu.MenuType.select; + +/** + * Represents an abstract implementation of a menu-based toggle component that supports single-selection. This class serves as a + * base for creating specialized single-menu toggle components, providing functionality for managing selected menu items and + * updating the toggle display. + * + * @param the type of the builder for this component + */ +@Deprecated +abstract class PopperSingleMenuToggleMenu> extends PopperMenuToggleMenu { + + // ------------------------------------------------------ instance + + boolean defaultSelectHandler; + + PopperSingleMenuToggleMenu(ComponentType componentType, MenuToggle menuToggle, TriggerAction triggerAction) { + super(componentType, menuToggle, triggerAction); + this.defaultSelectHandler = true; + } + + abstract void updateMenuToggle(MenuItem item); + + // ------------------------------------------------------ add + + @Override + public B add(Menu menu) { + super.add(menu); + if (menu.menuType == select && menu.selectionMode == single && defaultSelectHandler) { + menu.onSingleSelect((e, menuItem, s) -> updateMenuToggle(menuItem)); + } + return that(); + } + + // ------------------------------------------------------ builder + + public B noDefaultSelectHandler() { + this.defaultSelectHandler = false; + return that(); + } + + // ------------------------------------------------------ api + + public void clear() { + clear(true); + } + + public void clear(boolean fireEvent) { + List selectedItems = menu.selectedItems(); + menu.clearSearch(); + menu.unselectAllItems(); + menuToggle.text(""); + if (fireEvent && !selectedItems.isEmpty()) { + menu.fireSingleSelection(selectedItems.get(0), false); + } + } + + public void select(String identifier) { + select(menu().findItem(identifier), true); + } + + public void select(String identifier, boolean fireEvent) { + select(menu().findItem(identifier), fireEvent); + } + + public void select(MenuItem item) { + select(item, true); + } + + public void select(MenuItem item, boolean fireEvent) { + if (menu != null && menuToggle != null && item != null) { + menu.select(item, true, fireEvent); + if (!fireEvent && defaultSelectHandler) { + updateMenuToggle(item); + } + } + } +} diff --git a/components/src/main/java/org/patternfly/component/menu/PopperSingleSelect.java b/components/src/main/java/org/patternfly/component/menu/PopperSingleSelect.java new file mode 100644 index 000000000..4d2f9a20b --- /dev/null +++ b/components/src/main/java/org/patternfly/component/menu/PopperSingleSelect.java @@ -0,0 +1,68 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.component.menu; + +import org.patternfly.component.ComponentType; +import org.patternfly.popper.TriggerAction; + +/** + * A select component to select exactly one item from a list. + * + * @deprecated This implementation uses the Popper.js API, which is due to be removed soon. Use {@link SingleSelect} instead. + */ +@Deprecated +public class PopperSingleSelect extends PopperSingleMenuToggleMenu { + + // ------------------------------------------------------ factory + + /** + * Creates a new SingleSelect component with the specified text. + * + * @param text the text to display on the SingleSelect toggle + * @return a new instance of SingleSelect + */ + public static PopperSingleSelect singleSelect(String text) { + return new PopperSingleSelect(MenuToggle.menuToggle(text)); + } + + /** + * Creates a new SingleSelect component using the specified MenuToggle. + * + * @param menuToggle the MenuToggle instance to be used for creating the SingleSelect component + * @return a new instance of SingleSelect + */ + public static PopperSingleSelect singleSelect(MenuToggle menuToggle) { + return new PopperSingleSelect(menuToggle); + } + + // ------------------------------------------------------ instance + + PopperSingleSelect(MenuToggle menuToggle) { + super(ComponentType.PopperSingleSelect, menuToggle, TriggerAction.click); + } + + @Override + void updateMenuToggle(MenuItem item) { + menuToggle.text(item.text()); + } + + // ------------------------------------------------------ builder + + @Override + public PopperSingleSelect that() { + return this; + } +} diff --git a/components/src/main/java/org/patternfly/component/menu/PopperSingleTypeahead.java b/components/src/main/java/org/patternfly/component/menu/PopperSingleTypeahead.java new file mode 100644 index 000000000..f2db33454 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/menu/PopperSingleTypeahead.java @@ -0,0 +1,130 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.component.menu; + +import java.util.function.Function; + +import org.patternfly.component.ComponentType; +import org.patternfly.component.textinputgroup.BaseSearchInput; +import org.patternfly.component.textinputgroup.SearchInput; +import org.patternfly.popper.TriggerAction; + +import elemental2.dom.Node; +import elemental2.promise.Promise; + +import static org.patternfly.component.menu.TypeaheadSupport.shouldExpandOnKeyup; +import static org.patternfly.component.menu.TypeaheadSupport.typeaheadDefaults; +import static org.patternfly.component.textinputgroup.SearchInput.searchInput; + +/** + * A typeahead is a select variant that replaces the typical button toggle for opening the select menu with a text input and + * button toggle combo. As a user enters characters into the text input, the menu options will be filtered to match. + * + * @deprecated This implementation uses the Popper.js API, which is due to be removed soon. Use {@link SingleTypeahead} instead. + */ +@Deprecated +public class PopperSingleTypeahead + extends PopperSingleMenuToggleMenu implements PopperTypeahead { + + // ------------------------------------------------------ factory + + /** + * Creates a new {@link PopperSingleTypeahead} component with a {@link MenuToggle} of type {@link MenuToggleType#typeahead} and a + * {@link SearchInput}. + */ + public static PopperSingleTypeahead singleTypeahead(String id, String placeholder) { + return new PopperSingleTypeahead(searchInput(id).plain().placeholder(placeholder)); + } + + /** + * Creates a new {@link PopperSingleTypeahead} instance using the provided {@link BaseSearchInput}. + * + * @param searchInput the {@link BaseSearchInput} used to configure the typeahead component. This input determines the + * search behavior and the interaction model of the typeahead. + * @return a new {@link PopperSingleTypeahead} instance initialized with a {@link MenuToggle} of type + * {@link MenuToggleType#typeahead}. + */ + public static PopperSingleTypeahead singleTypeahead(BaseSearchInput searchInput) { + return new PopperSingleTypeahead(searchInput); + } + + // ------------------------------------------------------ instance + + private SearchFilter searchFilter; + private NoResults noResults; + + PopperSingleTypeahead(BaseSearchInput searchInput) { + super(ComponentType.PopperSingleTypeahead, MenuToggle.menuToggle(searchInput), TriggerAction.click); + this.searchFilter = SearchFilter.contains(); + this.noResults = NoResults.noResults(); + + typeaheadDefaults(this); + menuToggle.searchInput().onKeyup((e, c, value) -> { + if (shouldExpandOnKeyup(this, e)) { + expand(false); + } + menu.search(searchFilter, noResults, value); + }); + stayOpen(event -> { + Node target = (Node) event.target; + boolean inputClick = searchInput.input().element() == target; + boolean utilitiesClick = searchInput.utilities() != null && + searchInput.utilities().element().contains(target); + return inputClick || utilitiesClick; + }); + } + + @Override + void updateMenuToggle(MenuItem item) { + menuToggle.text(item.text()); + } + + // ------------------------------------------------------ add + + @Override + public PopperSingleTypeahead add(Menu menu) { + super.add(menu); + searchInputControlsMenuList(); + return this; + } + + // ------------------------------------------------------ builder + + @Override + public PopperSingleTypeahead allowNewItems(Function prompt, Function> createItem) { + TypeaheadSupport.allowNewItems(this, this, prompt, createItem); + return this; + } + + @Override + public PopperSingleTypeahead that() { + return this; + } + + // ------------------------------------------------------ events + + @Override + public PopperSingleTypeahead onSearch(SearchFilter searchFilter) { + this.searchFilter = searchFilter; + return this; + } + + @Override + public PopperSingleTypeahead onNoResults(NoResults noResults) { + this.noResults = noResults; + return this; + } +} diff --git a/components/src/main/java/org/patternfly/component/menu/NativeTypeahead.java b/components/src/main/java/org/patternfly/component/menu/PopperTypeahead.java similarity index 85% rename from components/src/main/java/org/patternfly/component/menu/NativeTypeahead.java rename to components/src/main/java/org/patternfly/component/menu/PopperTypeahead.java index c51d9c75c..07c35efe4 100644 --- a/components/src/main/java/org/patternfly/component/menu/NativeTypeahead.java +++ b/components/src/main/java/org/patternfly/component/menu/PopperTypeahead.java @@ -20,13 +20,15 @@ import elemental2.promise.Promise; /** - * Represents a typeahead component interface that allows users to search, filter, and optionally create new items dynamically - * based on input. A typeahead component is typically used in dropdowns or menus to enable efficient selection of items - * from a potentially large set. + * A generic interface representing a typeahead component, which allows for dynamic filtering, searching, + * and optionally creating new menu items based on user-provided input. This component offers flexible + * configuration for handling search queries, displaying "no results" messages, and managing custom + * item creation. * - * @param the type of the implementing class, allowing method chaining for configuration + * @param A type that extends {@link PopperMenuToggleMenu}, representing the specific implementation of the typeahead. */ -public interface NativeTypeahead> { +@Deprecated +public interface PopperTypeahead> { /** * Allows the creation of new menu items based on user input. This method enables the typeahead component to dynamically add @@ -59,7 +61,7 @@ default M allowNewItems(Function> createItem) { * @param searchFilter a {@link SearchFilter} that defines the search logic. The first parameter is a {@link MenuItem} * representing a menu item, and the second parameter is a {@link String} representing the search query. * The predicate should return {@code true} for items matching the search. - * @return the instance for method chaining. + * @return the {@link PopperSingleTypeahead} instance for method chaining. */ M onSearch(SearchFilter searchFilter); @@ -72,4 +74,4 @@ default M allowNewItems(Function> createItem) { * @return the instance of the current type enabling method chaining. */ M onNoResults(NoResults noResults); -} \ No newline at end of file +} diff --git a/components/src/main/java/org/patternfly/component/menu/SingleMenuToggleMenu.java b/components/src/main/java/org/patternfly/component/menu/SingleMenuToggleMenu.java index c45546ea9..55b9f7028 100644 --- a/components/src/main/java/org/patternfly/component/menu/SingleMenuToggleMenu.java +++ b/components/src/main/java/org/patternfly/component/menu/SingleMenuToggleMenu.java @@ -16,15 +16,17 @@ package org.patternfly.component.menu; import java.util.List; +import java.util.function.Consumer; import org.jboss.elemento.TypedBuilder; import org.patternfly.component.ComponentType; -import org.patternfly.popper.TriggerAction; +import org.patternfly.component.SelectionMode; import elemental2.dom.HTMLElement; -import static org.patternfly.component.SelectionMode.single; -import static org.patternfly.component.menu.MenuType.select; +import static org.patternfly.component.menu.MenuContent.menuContent; +import static org.patternfly.component.menu.MenuList.menuList; +import static org.patternfly.component.menu.SingleSelectMenu.singleSelectMenu; /** * Represents an abstract implementation of a menu-based toggle component that supports single-selection. This class serves as a @@ -38,9 +40,11 @@ abstract class SingleMenuToggleMenu> exte // ------------------------------------------------------ instance boolean defaultSelectHandler; + private MenuContent menuContent; + private MenuList menuList; - SingleMenuToggleMenu(ComponentType componentType, MenuToggle menuToggle, TriggerAction triggerAction) { - super(componentType, menuToggle, triggerAction); + SingleMenuToggleMenu(ComponentType componentType, MenuToggle menuToggle) { + super(componentType, menuToggle); this.defaultSelectHandler = true; } @@ -51,7 +55,7 @@ abstract class SingleMenuToggleMenu> exte @Override public B add(Menu menu) { super.add(menu); - if (menu.menuType == select && menu.selectionMode == single && defaultSelectHandler) { + if (menu.menuType == MenuType.select && menu.selectionMode == SelectionMode.single && defaultSelectHandler) { menu.onSingleSelect((e, menuItem, s) -> updateMenuToggle(menuItem)); } return that(); @@ -59,6 +63,34 @@ public B add(Menu menu) { // ------------------------------------------------------ builder + /** + * Applies the provided {@link Consumer} to the {@link MenuList} associated with this {@link SingleSelect}. If the + * menu, menu content, or menu list is not yet initialized, they will be created as part of this method. + *

+ * This method simplifies the process of adding menu items to the component. It is a shortcut for creating and adding a + * {@link SingleSelectMenu}, {@link MenuContent}, and {@link MenuList} in a single step. Don't use this method if you need + * to us another menu type, want to customize the menu, content or list or if you want to use {@link MenuGroup}s. + * + * @param consumer a {@link Consumer} that accepts a {@link MenuList} for customization or modification + * @return the current {@link SingleSelect} instance for method chaining + */ + public B applyToMenuList(Consumer consumer) { + if (menu == null) { + add(singleSelectMenu()); + } + if (menuContent == null) { + menuContent = menuContent(); + menu.addContent(menuContent); + } + if (menuList == null) { + menuList = menuList(); + menuContent.addList(menuList); + } + + consumer.accept(menuList); + return that(); + } + public B noDefaultSelectHandler() { this.defaultSelectHandler = false; return that(); diff --git a/components/src/main/java/org/patternfly/component/menu/SingleSelect.java b/components/src/main/java/org/patternfly/component/menu/SingleSelect.java index 8471a3afa..e7e91f0a5 100644 --- a/components/src/main/java/org/patternfly/component/menu/SingleSelect.java +++ b/components/src/main/java/org/patternfly/component/menu/SingleSelect.java @@ -16,10 +16,13 @@ package org.patternfly.component.menu; import org.patternfly.component.ComponentType; -import org.patternfly.popper.TriggerAction; /** * A select component to select exactly one item from a list. + *

+ * This implementation uses the Popover API and CSS anchor positioning instead of Popper.js. The select uses the browser's + * top-layer rendering for correct stacking, eliminating z-index issues. CSS {@code position-try-fallbacks} handles menu + * flipping when there is not enough space. * * @see https://www.patternfly.org/components/menus/select */ @@ -27,22 +30,10 @@ public class SingleSelect extends SingleMenuToggleMenu { // ------------------------------------------------------ factory - /** - * Creates a new SingleSelect component with the specified text. - * - * @param text the text to display on the SingleSelect toggle - * @return a new instance of SingleSelect - */ public static SingleSelect singleSelect(String text) { return new SingleSelect(MenuToggle.menuToggle(text)); } - /** - * Creates a new SingleSelect component using the specified MenuToggle. - * - * @param menuToggle the MenuToggle instance to be used for creating the SingleSelect component - * @return a new instance of SingleSelect - */ public static SingleSelect singleSelect(MenuToggle menuToggle) { return new SingleSelect(menuToggle); } @@ -50,7 +41,7 @@ public static SingleSelect singleSelect(MenuToggle menuToggle) { // ------------------------------------------------------ instance SingleSelect(MenuToggle menuToggle) { - super(ComponentType.SingleSelect, menuToggle, TriggerAction.click); + super(ComponentType.SingleSelect, menuToggle); } @Override diff --git a/components/src/main/java/org/patternfly/component/menu/SingleTypeahead.java b/components/src/main/java/org/patternfly/component/menu/SingleTypeahead.java index d220d328b..e7cd2cfee 100644 --- a/components/src/main/java/org/patternfly/component/menu/SingleTypeahead.java +++ b/components/src/main/java/org/patternfly/component/menu/SingleTypeahead.java @@ -20,18 +20,21 @@ import org.patternfly.component.ComponentType; import org.patternfly.component.textinputgroup.BaseSearchInput; import org.patternfly.component.textinputgroup.SearchInput; -import org.patternfly.popper.TriggerAction; -import elemental2.dom.Node; import elemental2.promise.Promise; import static org.patternfly.component.menu.TypeaheadSupport.shouldExpandOnKeyup; import static org.patternfly.component.menu.TypeaheadSupport.typeaheadDefaults; +import static org.patternfly.component.menu.TypeaheadSupport.utilitiesClick; import static org.patternfly.component.textinputgroup.SearchInput.searchInput; /** * A typeahead is a select variant that replaces the typical button toggle for opening the select menu with a text input and * button toggle combo. As a user enters characters into the text input, the menu options will be filtered to match. + *

+ * This implementation uses the Popover API and CSS anchor positioning instead of Popper.js. The typeahead uses the browser's + * top-layer rendering for correct stacking, eliminating z-index issues. CSS {@code position-try-fallbacks} handles menu + * flipping when there is not enough space. * * @see https://www.patternfly.org/components/menus/select */ @@ -50,8 +53,7 @@ public static SingleTypeahead singleTypeahead(String id, String placeholder) { /** * Creates a new {@link SingleTypeahead} instance using the provided {@link BaseSearchInput}. * - * @param searchInput the {@link BaseSearchInput} used to configure the typeahead component. This input determines the - * search behavior and the interaction model of the typeahead. + * @param searchInput the {@link BaseSearchInput} used to configure the typeahead component. * @return a new {@link SingleTypeahead} instance initialized with a {@link MenuToggle} of type * {@link MenuToggleType#typeahead}. */ @@ -65,24 +67,23 @@ public static SingleTypeahead singleTypeahead(BaseSearchInput searchInput) { private NoResults noResults; SingleTypeahead(BaseSearchInput searchInput) { - super(ComponentType.SingleSelect, MenuToggle.menuToggle(searchInput), TriggerAction.click); + super(ComponentType.SingleTypeahead, MenuToggle.menuToggle(searchInput)); this.searchFilter = SearchFilter.contains(); this.noResults = NoResults.noResults(); typeaheadDefaults(this); - menuToggle.searchInput().onKeyup((e, c, value) -> { - if (shouldExpandOnKeyup(this, e)) { - expand(false); - } - menu.search(searchFilter, noResults, value); - }); - stayOpen(event -> { - Node target = (Node) event.target; - boolean inputClick = searchInput.input().element() == target; - boolean utilitiesClick = searchInput.utilities() != null && - searchInput.utilities().element().contains(target); - return inputClick || utilitiesClick; - }); + menuToggle.searchInput() + .onKeyup((e, c, value) -> { + if (shouldExpandOnKeyup(this, e)) { + expand(false); + } + menu.search(searchFilter, noResults, value); + }) + .onInput((e, c, value) -> { + expand(false); + menu.search(searchFilter, noResults, value); + }); + stayOpen((e, mt, m) -> utilitiesClick(e)); } @Override @@ -102,7 +103,8 @@ public SingleTypeahead add(Menu menu) { // ------------------------------------------------------ builder @Override - public SingleTypeahead allowNewItems(Function prompt, Function> createItem) { + public SingleTypeahead allowNewItems(Function prompt, + Function> createItem) { TypeaheadSupport.allowNewItems(this, this, prompt, createItem); return this; } diff --git a/components/src/main/java/org/patternfly/component/menu/StayOpenPredicate.java b/components/src/main/java/org/patternfly/component/menu/StayOpenPredicate.java index 0d4c7b8a6..3b0ffc7a8 100644 --- a/components/src/main/java/org/patternfly/component/menu/StayOpenPredicate.java +++ b/components/src/main/java/org/patternfly/component/menu/StayOpenPredicate.java @@ -1,3 +1,18 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.patternfly.component.menu; import java.util.Objects; diff --git a/components/src/main/java/org/patternfly/component/menu/Typeahead.java b/components/src/main/java/org/patternfly/component/menu/Typeahead.java index 4403e6185..9d7e1469e 100644 --- a/components/src/main/java/org/patternfly/component/menu/Typeahead.java +++ b/components/src/main/java/org/patternfly/component/menu/Typeahead.java @@ -20,12 +20,11 @@ import elemental2.promise.Promise; /** - * A generic interface representing a typeahead component, which allows for dynamic filtering, searching, - * and optionally creating new menu items based on user-provided input. This component offers flexible - * configuration for handling search queries, displaying "no results" messages, and managing custom - * item creation. + * Represents a typeahead component interface that allows users to search, filter, and optionally create new items dynamically + * based on input. A typeahead component is typically used in dropdowns or menus to enable efficient selection of items + * from a potentially large set. * - * @param A type that extends {@link MenuToggleMenu}, representing the specific implementation of the typeahead. + * @param the type of the implementing class, allowing method chaining for configuration */ public interface Typeahead> { @@ -60,7 +59,7 @@ default M allowNewItems(Function> createItem) { * @param searchFilter a {@link SearchFilter} that defines the search logic. The first parameter is a {@link MenuItem} * representing a menu item, and the second parameter is a {@link String} representing the search query. * The predicate should return {@code true} for items matching the search. - * @return the {@link SingleTypeahead} instance for method chaining. + * @return the instance for method chaining. */ M onSearch(SearchFilter searchFilter); @@ -73,4 +72,4 @@ default M allowNewItems(Function> createItem) { * @return the instance of the current type enabling method chaining. */ M onNoResults(NoResults noResults); -} +} \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/menu/TypeaheadSupport.java b/components/src/main/java/org/patternfly/component/menu/TypeaheadSupport.java index c452cebcb..972c9c19c 100644 --- a/components/src/main/java/org/patternfly/component/menu/TypeaheadSupport.java +++ b/components/src/main/java/org/patternfly/component/menu/TypeaheadSupport.java @@ -64,32 +64,6 @@ static void typeaheadDefaults(MenuToggleMenu mtm) { }); } - static void typeaheadDefaults(NativeMenuToggleMenu mtm) { - mtm.menuToggle.searchInput().input() - .attr(role, combobox) - .aria(Aria.expanded, false) - .autocomplete("off") - .on(click, event -> mtm.toggle()); - - mtm.onToggle((e, c, expanded) -> { - if (expanded) { - // show all menu items when expanded - mtm.menu.clearSearch(); - } - }); - mtm.menuToggle.searchInput() - .onClear((e, si) -> { - mtm.menu.clearSearch(); - mtm.menu.unselectAllItems(); - si.input().element().focus(); - }) - .onChange((e, c, value) -> { - if (value.isEmpty()) { - mtm.menu.clearSearch(); - } - }); - } - static boolean shouldExpandOnKeyup(MenuToggleMenu mtm, Event event) { if (Enter.match(event) || Escape.match(event) || Tab.match(event)) { return false; @@ -97,13 +71,6 @@ static boolean shouldExpandOnKeyup(MenuToggleMenu mtm, Event event) { return !mtm.expanded(); } - static boolean shouldExpandOnKeyup(NativeMenuToggleMenu mtm, Event event) { - if (Enter.match(event) || Escape.match(event) || Tab.match(event)) { - return false; - } - return !mtm.expanded(); - } - static boolean utilitiesClick(Event event) { return closest(((Element) event.target), By.classname(component(textInputGroup, utilities))) != null; } @@ -124,7 +91,37 @@ static void allowNewItems(MenuToggleMenu mtm, Typeahead typeahead, }))); } - static void allowNewItems(NativeMenuToggleMenu mtm, NativeTypeahead typeahead, + // ------------------------------------------------------ deprecated + + @Deprecated + static void typeaheadDefaults(PopperMenuToggleMenu mtm) { + mtm.menuToggle.searchInput().input() + .attr(role, combobox) + .aria(Aria.expanded, false) + .autocomplete("off") + .on(click, event -> mtm.toggle()); + + mtm.onToggle((e, c, expanded) -> { + if (expanded) { + // show all menu items when expanded + mtm.menu.clearSearch(); + } + }); + mtm.menuToggle.searchInput() + .onClear((e, si) -> { + mtm.menu.clearSearch(); + mtm.menu.unselectAllItems(); + si.input().element().focus(); + }) + .onChange((e, c, value) -> { + if (value.isEmpty()) { + mtm.menu.clearSearch(); + } + }); + } + + @Deprecated + static void allowNewItems(PopperMenuToggleMenu mtm, PopperTypeahead typeahead, Function prompt, Function> createItem) { typeahead.onNoResults((menuList, text) -> createNewMenuItem(prompt.apply(text)) .onClick((e, c) -> createItem.apply(text) @@ -139,4 +136,12 @@ static void allowNewItems(NativeMenuToggleMenu mtm, NativeTypeahead typeah mtm.collapse(false); }))); } + + @Deprecated + static boolean shouldExpandOnKeyup(PopperMenuToggleMenu mtm, Event event) { + if (Enter.match(event) || Escape.match(event) || Tab.match(event)) { + return false; + } + return !mtm.expanded(); + } } diff --git a/components/src/main/java/org/patternfly/component/modal/ModalHeader.java b/components/src/main/java/org/patternfly/component/modal/ModalHeader.java index c0e12abe7..f0cb5258a 100644 --- a/components/src/main/java/org/patternfly/component/modal/ModalHeader.java +++ b/components/src/main/java/org/patternfly/component/modal/ModalHeader.java @@ -15,7 +15,6 @@ */ package org.patternfly.component.modal; -import org.jboss.elemento.Attachable; import org.jboss.elemento.Elements; import org.jboss.elemento.logger.Logger; import org.patternfly.component.popover.Popover; @@ -23,7 +22,6 @@ import org.patternfly.style.Classes; import elemental2.dom.HTMLElement; -import elemental2.dom.MutationRecord; import static org.jboss.elemento.Elements.div; import static org.jboss.elemento.Elements.header; @@ -37,7 +35,7 @@ import static org.patternfly.style.Classes.modalBox; import static org.patternfly.style.Classes.modifier; -public class ModalHeader extends ModalSubComponent implements Attachable { +public class ModalHeader extends ModalSubComponent { // ------------------------------------------------------ factory @@ -50,20 +48,10 @@ public static ModalHeader modalHeader() { private static final Logger logger = Logger.getLogger(ModalHeader.class.getName()); public static final String SUB_COMPONENT_NAME = "mh"; ModalHeaderTitle title; - private Popover popover; - private HTMLElement help; private HTMLElement mainContainer; ModalHeader() { super(SUB_COMPONENT_NAME, header().css(component(modalBox, header)).element()); - Attachable.register(this, this); - } - - @Override - public void attach(MutationRecord mutationRecord) { - if (popover != null && help != null) { - popover.trigger(help).appendToBody(); - } } // ------------------------------------------------------ add @@ -115,8 +103,6 @@ public ModalHeader help(Popover popover) { public ModalHeader help(Popover popover, HTMLElement help) { if (mainContainer == null) { - this.popover = popover; - this.help = help; element().classList.add(modifier(Classes.help)); // move elements @@ -127,6 +113,7 @@ public ModalHeader help(Popover popover, HTMLElement help) { add(mainContainer); add(div().css(component(modalBox, header, Classes.help)) .add(help) + .add(popover.trigger(help)) .element()); } else { logger.warn("Help popover already defined for modal header %o", element()); diff --git a/components/src/main/java/org/patternfly/component/page/MastheadContent.java b/components/src/main/java/org/patternfly/component/page/MastheadContent.java index b534e24e1..81372fd72 100644 --- a/components/src/main/java/org/patternfly/component/page/MastheadContent.java +++ b/components/src/main/java/org/patternfly/component/page/MastheadContent.java @@ -16,7 +16,6 @@ package org.patternfly.component.page; import org.jboss.elemento.ElementTextMethods; -import org.patternfly.component.menu.Dropdown; import org.patternfly.component.toolbar.Toolbar; import elemental2.dom.HTMLDivElement; @@ -29,7 +28,7 @@ /** * Container for the content of a {@link Masthead} component. This container represents the main portion of the masthead area * and will typically contain a {@link Toolbar} or other menu-like content such as a - * {@link Dropdown}. + * {@link org.patternfly.component.menu.Dropdown}. */ public class MastheadContent extends MastheadSubComponent implements ElementTextMethods { diff --git a/components/src/main/java/org/patternfly/component/popover/NativePopover.java b/components/src/main/java/org/patternfly/component/popover/NativePopover.java deleted file mode 100644 index 91a7353e9..000000000 --- a/components/src/main/java/org/patternfly/component/popover/NativePopover.java +++ /dev/null @@ -1,499 +0,0 @@ -/* - * Copyright 2023 Red Hat - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.patternfly.component.popover; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.Supplier; - -import org.gwtproject.event.shared.HandlerRegistration; -import org.jboss.elemento.Attachable; -import org.jboss.elemento.By; -import org.jboss.elemento.Elements; -import org.jboss.elemento.Id; -import org.jboss.elemento.logger.Logger; -import org.patternfly.component.BaseComponent; -import org.patternfly.component.Closeable; -import org.patternfly.component.ComponentIcon; -import org.patternfly.component.ComponentType; -import org.patternfly.component.Severity; -import org.patternfly.component.button.Button; -import org.patternfly.core.Aria; -import org.patternfly.core.Attributes; -import org.patternfly.handler.CloseHandler; -import org.patternfly.position.AnchorPositioning; -import org.patternfly.popper.Placement; -import org.patternfly.position.CssPositioning; -import org.patternfly.style.Classes; -import org.patternfly.style.Modifiers.NoPadding; -import elemental2.dom.Element; -import elemental2.dom.Event; -import elemental2.dom.HTMLDivElement; -import elemental2.dom.HTMLElement; -import elemental2.dom.MutationRecord; - -import static elemental2.dom.DomGlobal.clearTimeout; -import static elemental2.dom.DomGlobal.document; -import static elemental2.dom.DomGlobal.setTimeout; -import static org.gwtproject.event.shared.HandlerRegistrations.compose; -import static org.jboss.elemento.Elements.div; -import static org.jboss.elemento.Elements.failSafeRemoveFromParent; -import static org.jboss.elemento.Elements.insertFirst; -import static org.jboss.elemento.EventType.bind; -import static org.jboss.elemento.EventType.click; -import static org.jboss.elemento.EventType.focusin; -import static org.jboss.elemento.EventType.focusout; -import static org.jboss.elemento.EventType.mouseenter; -import static org.jboss.elemento.EventType.mouseleave; -import static org.jboss.elemento.EventType.scroll; -import static org.patternfly.component.button.Button.button; -import static org.patternfly.component.popover.NativePopoverHeader.popoverHeader; -import static org.patternfly.core.Aria.describedBy; -import static org.patternfly.core.Aria.label; -import static org.patternfly.core.Aria.labelledBy; -import static org.patternfly.core.Aria.modal; -import static org.patternfly.core.Attributes.popover; -import static org.patternfly.core.Attributes.role; -import static org.patternfly.core.Roles.dialog; -import static org.patternfly.handler.CloseHandler.fireEvent; -import static org.patternfly.handler.CloseHandler.shouldClose; -import static org.patternfly.icon.IconSets.fas.times; -import static org.patternfly.popper.Placement.auto; -import static org.patternfly.popper.Placement.top; -import static org.patternfly.style.Classes.arrow; -import static org.patternfly.style.Classes.close; -import static org.patternfly.style.Classes.component; -import static org.patternfly.style.Classes.content; -import static org.patternfly.style.Classes.modifier; -import static org.patternfly.style.Classes.widthAuto; - -/** - * A popover is in-app messaging that provides more information on specific product areas. Popovers display content in a new - * window that overlays the current page. Unlike modals, popovers don't block the current page. - *

- * This implementation uses the Popover API and CSS anchor positioning instead of Popper.js. The popover uses the browser's - * top-layer rendering for correct stacking, eliminating z-index issues. - */ -public class NativePopover extends BaseComponent implements - Attachable, - Closeable, - ComponentIcon, - NoPadding { - - // ------------------------------------------------------ factory - - public static NativePopover nativePopover() { - return new NativePopover(null); - } - - public static NativePopover nativePopover(By trigger) { - return new NativePopover(() -> Elements.querySelector(document.body, trigger)); - } - - public static NativePopover nativePopover(HTMLElement trigger) { - return new NativePopover(() -> trigger); - } - - public static NativePopover nativePopover(Supplier trigger) { - return new NativePopover(trigger); - } - - // ------------------------------------------------------ instance - - private static final Logger logger = Logger.getLogger(NativePopover.class.getName()); - - public static final int DISTANCE = 20; - public static final int ENTRY_DELAY = 300; - public static final int EXIT_DELAY = 300; - - private final AnchorPositioning ap; - private final HTMLElement contentElement; - private final List> closeHandler; - - private boolean showClose; - private boolean hoverable; - private int entryDelay; - private int exitDelay; - private double showTimeout; - private double hideTimeout; - private Placement placement; - private Severity severity; - private Button closeButton; - private NativePopoverHeader header; - private HandlerRegistration triggerHandlers; - private HandlerRegistration anchorHandlers; - private HandlerRegistration outsideClickHandler; - private HandlerRegistration scrollHandler; - - NativePopover(Supplier trigger) { - super(ComponentType.NativePopover, div().css(component(Classes.popover), top.modifier()) - .attr(role, dialog) - .aria(modal, true) - .attr(Attributes.popover, "manual") - .element()); - - String id = Id.unique(componentType().id); - this.ap = new AnchorPositioning(id, element(), trigger, DISTANCE, CssPositioning.popoverEnabled(), false); - this.closeHandler = new ArrayList<>(); - this.showClose = true; - this.hoverable = false; - this.showTimeout = 0; - this.hideTimeout = 0; - this.entryDelay = ENTRY_DELAY; - this.exitDelay = EXIT_DELAY; - this.placement = auto; - - String bodyId = Id.unique(componentType().id, "body"); - element().appendChild(div().css(component(Classes.popover, arrow)).element()); - element().appendChild(contentElement = div().css(component(Classes.popover, content)).element()); - aria(describedBy, bodyId); - Attachable.register(this, this); - } - - @Override - public void attach(MutationRecord mutationRecord) { - if (showClose) { - closable(); - } else { - failSafeRemoveFromParent(closeButton); - } - - HTMLElement trigger = ap.attach(); - if (trigger != null) { - // top is the default for auto and recalculated on show() - ap.applyPlacement(placement == auto ? top : placement); - - if (hoverable) { - triggerHandlers = compose( - bind(trigger, mouseenter, e -> scheduleShow()), - bind(trigger, mouseleave, e -> scheduleHide()), - bind(trigger, focusin, e -> scheduleShow()), - bind(trigger, focusout, e -> scheduleHide())); - anchorHandlers = compose( - bind(element(), mouseenter, e -> cancelTimers()), - bind(element(), mouseleave, e -> scheduleHide())); - - } else { - triggerHandlers = bind(trigger, click, this::togglePopover); - } - - if (!ap.cssPositioning()) { - scrollHandler = bind(document, scroll, true, e -> recalculatePlacement()); - } - - } else if (ap.hasTriggerSupplier()) { - logger.error("Unable to find trigger element for popover %o", element()); - } else { - logger.error("No trigger element defined for popover %o", element()); - } - } - - @Override - public void detach(MutationRecord mutationRecord) { - cancelTimers(); - if (ap.visible()) { - ap.hide(); - } - if (scrollHandler != null) { - scrollHandler.removeHandler(); - } - if (anchorHandlers != null) { - anchorHandlers.removeHandler(); - } - if (outsideClickHandler != null) { - outsideClickHandler.removeHandler(); - } - if (triggerHandlers != null) { - triggerHandlers.removeHandler(); - } - ap.detach(); - } - - // ------------------------------------------------------ add - - public NativePopover addHeader(String header) { - if (this.header != null) { - this.header.text(header); - return this; - } else { - return add(popoverHeader().text(header)); - } - } - - public NativePopover addHeader(NativePopoverHeader header) { - return add(header); - } - - // override to append to the right container! - public NativePopover add(NativePopoverHeader header) { - this.header = header; - contentElement.appendChild(header.element()); - aria(labelledBy, header.headerId); - return this; - } - - public NativePopover addBody(String body) { - return add(NativePopoverBody.popoverBody().text(body)); - } - - public NativePopover addBody(NativePopoverBody body) { - return add(body); - } - - // override to append to the right container! - public NativePopover add(NativePopoverBody body) { - contentElement.appendChild(body.element()); - return this; - } - - public NativePopover addFooter(String footer) { - return add(NativePopoverFooter.popoverFooter().text(footer)); - } - - public NativePopover addFooter(NativePopoverFooter footer) { - return add(footer); - } - - // override to append to the right container! - public NativePopover add(NativePopoverFooter footer) { - contentElement.appendChild(footer.element()); - return this; - } - - // ------------------------------------------------------ builder - - public NativePopover autoWidth() { - return css(modifier(widthAuto)); - } - - public NativePopover closable() { - return closable(null); - } - - public NativePopover closable(CloseHandler closeHandler) { - if (closeButton == null) { - insertFirst(contentElement, div().css(component(Classes.popover, close)) - .add(closeButton = button() - .plain() - .icon(times()) - .aria(label, "Close") - .on(click, event -> close(event, true))) - .element()); - } - return onClose(closeHandler); - } - - public NativePopover distance(int distance) { - ap.distance(distance); - return this; - } - - public NativePopover entryDelay(int delay) { - this.entryDelay = delay; - return this; - } - - public NativePopover exitDelay(int delay) { - this.exitDelay = delay; - return this; - } - - public NativePopover hoverable() { - return hoverable(true); - } - - public NativePopover hoverable(boolean hoverable) { - this.hoverable = hoverable; - return this; - } - - @Override - public NativePopover icon(Element icon) { - failSafeHeader().removeIcon(); - failSafeHeader().icon(icon); - return this; - } - - @Override - public NativePopover removeIcon() { - if (header != null) { - header.removeIcon(); - } - return this; - } - - public NativePopover noClose() { - this.showClose = false; - return this; - } - - public NativePopover placement(Placement placement) { - this.placement = placement; - return this; - } - - public NativePopover status(Severity severity) { - return status(severity, severity.name() + " popover"); - } - - public NativePopover status(Severity severity, String screenReaderText) { - if (this.severity != null) { - element().classList.remove(this.severity.status.modifier()); - } - this.severity = severity; - css(severity.status.modifier()); - icon((severity.icon.get().element())); - return this; - } - - public NativePopover trigger(String trigger) { - ap.trigger(trigger); - return this; - } - - public NativePopover trigger(By trigger) { - ap.trigger(trigger); - return this; - } - - public NativePopover trigger(HTMLElement trigger) { - ap.trigger(trigger); - return this; - } - - public NativePopover trigger(Supplier trigger) { - ap.trigger(trigger); - return this; - } - - @Override - public NativePopover that() { - return this; - } - - // ------------------------------------------------------ aria - - /** - * Accessible label for the popover, required when a header is not present. - */ - public NativePopover ariaLabel(String label) { - return aria(Aria.label, label); - } - - /** - * Accessible label for the close button. - */ - public NativePopover ariaCloseLabel(String label) { - if (closeButton != null) { - closeButton.aria(Aria.label, label); - } - return this; - } - - // ------------------------------------------------------ events - - @Override - public NativePopover onClose(CloseHandler closeHandler) { - if (closeHandler != null) { - this.closeHandler.add(closeHandler); - } - return this; - } - - // ------------------------------------------------------ api - - public void show() { - if (!ap.visible() && ap.trigger() != null) { - if (ap.cssPositioning()) { - // CSS handles position-try-fallbacks; just apply preferred placement and show - ap.applyPlacement(placement == auto ? top : placement); - ap.show(); - } else { - // JS calculates the best placement via viewport measurements. - // For the calculation to work, the tooltip must be at least hidden - style("visibility", "hidden"); - ap.show(); - ap.applyBestPlacement(placement); - element().style.removeProperty("visibility"); - } - if (!hoverable) { - outsideClickHandler = bind(document, click.name, this::onOutsideClick); - } - } - } - - @Override - public void close(Event event, boolean fireEvent) { - if (shouldClose(this, closeHandler, event, fireEvent)) { - if (ap.visible()) { - ap.hide(); - if (outsideClickHandler != null) { - outsideClickHandler.removeHandler(); - outsideClickHandler = null; - } - fireEvent(this, closeHandler, event, fireEvent); - } - } - } - - // ------------------------------------------------------ internal - - private void scheduleShow() { - cancelTimers(); - showTimeout = setTimeout(e -> show(), entryDelay); - } - - private void scheduleHide() { - cancelTimers(); - hideTimeout = setTimeout(e -> close(new Event(""), true), exitDelay); - } - - private void recalculatePlacement() { - if (ap.visible()) { - ap.applyBestPlacement(placement); - } - } - - private void cancelTimers() { - clearTimeout(showTimeout); - clearTimeout(hideTimeout); - } - - private void togglePopover(Event event) { - if (ap.visible()) { - close(event, true); - } else { - show(); - } - } - - private void onOutsideClick(Event event) { - HTMLElement trigger = ap.trigger(); - if (ap.visible() && trigger != null) { - Element target = (Element) event.target; - if (!element().contains(target) && !trigger.contains(target)) { - close(event, true); - } - } - } - - private NativePopoverHeader failSafeHeader() { - if (header == null) { - add(popoverHeader()); - } - return header; - } -} diff --git a/components/src/main/java/org/patternfly/component/popover/Popover.java b/components/src/main/java/org/patternfly/component/popover/Popover.java index 32124a86e..f0e8527bb 100644 --- a/components/src/main/java/org/patternfly/component/popover/Popover.java +++ b/components/src/main/java/org/patternfly/component/popover/Popover.java @@ -16,11 +16,10 @@ package org.patternfly.component.popover; import java.util.ArrayList; -import java.util.EnumSet; import java.util.List; -import java.util.Set; import java.util.function.Supplier; +import org.gwtproject.event.shared.HandlerRegistration; import org.jboss.elemento.Attachable; import org.jboss.elemento.By; import org.jboss.elemento.Elements; @@ -33,30 +32,35 @@ import org.patternfly.component.Severity; import org.patternfly.component.button.Button; import org.patternfly.core.Aria; +import org.patternfly.core.Attributes; import org.patternfly.handler.CloseHandler; -import org.patternfly.popper.Modifiers; -import org.patternfly.popper.Placement; -import org.patternfly.popper.Popper; -import org.patternfly.popper.PopperBuilder; -import org.patternfly.popper.TriggerAction; +import org.patternfly.position.AnchorPositioning; +import org.patternfly.position.CssPositioning; +import org.patternfly.style.Classes; import org.patternfly.style.Modifiers.NoPadding; +import org.patternfly.style.Placement; import elemental2.dom.Element; import elemental2.dom.Event; import elemental2.dom.HTMLDivElement; import elemental2.dom.HTMLElement; import elemental2.dom.MutationRecord; -import elemental2.dom.Node; +import static elemental2.dom.DomGlobal.clearTimeout; import static elemental2.dom.DomGlobal.document; -import static java.util.Arrays.asList; +import static elemental2.dom.DomGlobal.setTimeout; +import static org.gwtproject.event.shared.HandlerRegistrations.compose; import static org.jboss.elemento.Elements.div; import static org.jboss.elemento.Elements.failSafeRemoveFromParent; import static org.jboss.elemento.Elements.insertFirst; +import static org.jboss.elemento.EventType.bind; import static org.jboss.elemento.EventType.click; +import static org.jboss.elemento.EventType.focusin; +import static org.jboss.elemento.EventType.focusout; +import static org.jboss.elemento.EventType.mouseenter; +import static org.jboss.elemento.EventType.mouseleave; +import static org.jboss.elemento.EventType.scroll; import static org.patternfly.component.button.Button.button; -import static org.patternfly.component.popover.PopoverBody.popoverBody; -import static org.patternfly.component.popover.PopoverFooter.popoverFooter; import static org.patternfly.component.popover.PopoverHeader.popoverHeader; import static org.patternfly.core.Aria.describedBy; import static org.patternfly.core.Aria.label; @@ -67,27 +71,29 @@ import static org.patternfly.handler.CloseHandler.fireEvent; import static org.patternfly.handler.CloseHandler.shouldClose; import static org.patternfly.icon.IconSets.fas.times; -import static org.patternfly.popper.Placement.auto; -import static org.patternfly.popper.Placement.top; import static org.patternfly.style.Classes.arrow; import static org.patternfly.style.Classes.close; import static org.patternfly.style.Classes.component; import static org.patternfly.style.Classes.content; import static org.patternfly.style.Classes.modifier; -import static org.patternfly.style.Classes.popover; import static org.patternfly.style.Classes.widthAuto; +import static org.patternfly.style.Placement.auto; +import static org.patternfly.style.Placement.top; /** * A popover is in-app messaging that provides more information on specific product areas. Popovers display content in a new * window that overlays the current page. Unlike modals, popovers don't block the current page. + *

+ * This implementation uses the Popover API and CSS anchor positioning instead of Popper.js. The popover uses the browser's + * top-layer rendering for correct stacking, eliminating z-index issues. * * @see https://www.patternfly.org/components/popover */ public class Popover extends BaseComponent implements + Attachable, Closeable, - NoPadding, ComponentIcon, - Attachable { + NoPadding { // ------------------------------------------------------ factory @@ -111,50 +117,51 @@ public static Popover popover(Supplier trigger) { private static final Logger logger = Logger.getLogger(Popover.class.getName()); - public static final int ANIMATION_DURATION = 300; - public static final int DISTANCE = 25; - public static final int Z_INDEX = 9999; + public static final int DISTANCE = 20; + public static final int ENTRY_DELAY = 300; + public static final int EXIT_DELAY = 300; + private final AnchorPositioning ap; private final HTMLElement contentElement; - private final Set triggerActions; private final List> closeHandler; - private Supplier trigger; - private boolean flip; + private boolean showClose; - private int distance; - private int animationDuration; - private int zIndex; - private Popper popper; + private boolean hoverable; + private int entryDelay; + private int exitDelay; + private double showTimeout; + private double hideTimeout; private Placement placement; - private Button closeButton; private Severity severity; + private Button closeButton; private PopoverHeader header; - private HTMLElement screenReaderElement; - private HTMLElement iconContainer; + private HandlerRegistration triggerHandlers; + private HandlerRegistration anchorHandlers; + private HandlerRegistration outsideClickHandler; + private HandlerRegistration scrollHandler; Popover(Supplier trigger) { - super(ComponentType.Popover, div().css(component(popover)) - .style("display", "none") + super(ComponentType.Popover, div().css(component(Classes.popover), top.modifier()) .attr(role, dialog) .aria(modal, true) + .attr(Attributes.popover, "manual") .element()); - this.trigger = trigger; - this.triggerActions = EnumSet.of(TriggerAction.click); + String id = Id.unique(componentType().id); + this.ap = new AnchorPositioning(id, element(), trigger, DISTANCE, CssPositioning.popoverEnabled(), false); this.closeHandler = new ArrayList<>(); - this.flip = true; this.showClose = true; - this.placement = top; - this.zIndex = Z_INDEX; - this.distance = DISTANCE; - this.animationDuration = ANIMATION_DURATION; + this.hoverable = false; + this.showTimeout = 0; + this.hideTimeout = 0; + this.entryDelay = ENTRY_DELAY; + this.exitDelay = EXIT_DELAY; + this.placement = auto; String bodyId = Id.unique(componentType().id, "body"); - add(div().css(component(popover, arrow))); - add(contentElement = div().css(component(popover, content)) - .element()); + element().appendChild(div().css(component(Classes.popover, arrow)).element()); + element().appendChild(contentElement = div().css(component(Classes.popover, content)).element()); aria(describedBy, bodyId); - Attachable.register(this, this); } @@ -166,25 +173,31 @@ public void attach(MutationRecord mutationRecord) { failSafeRemoveFromParent(closeButton); } + HTMLElement trigger = ap.attach(); if (trigger != null) { - HTMLElement triggerElement = trigger.get(); - if (triggerElement != null) { - popper = new PopperBuilder(componentType().componentName, triggerElement, element()) - .addModifier(Modifiers.eventListeners(false), - Modifiers.flip(placement == auto || flip), - Modifiers.hide(), - Modifiers.noOverflow(), - Modifiers.offset(distance), - Modifiers.placement()) - .animationDuration(animationDuration) - .placement(placement) - .registerHandler(triggerActions, this::show, this::close) - .removePopperOnTriggerDetach() - .zIndex(zIndex) - .build(); + // top is the default for auto and recalculated on show() + ap.applyPlacement(placement == auto ? top : placement); + + if (hoverable) { + triggerHandlers = compose( + bind(trigger, mouseenter, e -> scheduleShow()), + bind(trigger, mouseleave, e -> scheduleHide()), + bind(trigger, focusin, e -> scheduleShow()), + bind(trigger, focusout, e -> scheduleHide())); + anchorHandlers = compose( + bind(element(), mouseenter, e -> cancelTimers()), + bind(element(), mouseleave, e -> scheduleHide())); + } else { - logger.error("Unable to find trigger element for popover %o", element()); + triggerHandlers = bind(trigger, click, this::togglePopover); + } + + if (!ap.cssPositioning()) { + scrollHandler = bind(document, scroll, true, e -> recalculatePlacement()); } + + } else if (ap.hasTriggerSupplier()) { + logger.error("Unable to find trigger element for popover %o", element()); } else { logger.error("No trigger element defined for popover %o", element()); } @@ -192,7 +205,23 @@ public void attach(MutationRecord mutationRecord) { @Override public void detach(MutationRecord mutationRecord) { - popper.cleanup(); + cancelTimers(); + if (ap.visible()) { + ap.hide(); + } + if (scrollHandler != null) { + scrollHandler.removeHandler(); + } + if (anchorHandlers != null) { + anchorHandlers.removeHandler(); + } + if (outsideClickHandler != null) { + outsideClickHandler.removeHandler(); + } + if (triggerHandlers != null) { + triggerHandlers.removeHandler(); + } + ap.detach(); } // ------------------------------------------------------ add @@ -219,7 +248,7 @@ public Popover add(PopoverHeader header) { } public Popover addBody(String body) { - return add(popoverBody().text(body)); + return add(PopoverBody.popoverBody().text(body)); } public Popover addBody(PopoverBody body) { @@ -233,7 +262,7 @@ public Popover add(PopoverBody body) { } public Popover addFooter(String footer) { - return add(popoverFooter().text(footer)); + return add(PopoverFooter.popoverFooter().text(footer)); } public Popover addFooter(PopoverFooter footer) { @@ -248,22 +277,6 @@ public Popover add(PopoverFooter footer) { // ------------------------------------------------------ builder - public Popover appendToBody() { - return appendTo(document.body); - } - - public Popover appendTo(Node node) { - if (node != null) { - node.appendChild(element()); - } - return this; - } - - public Popover animationDuration(int animationDuration) { - this.animationDuration = animationDuration; - return this; - } - public Popover autoWidth() { return css(modifier(widthAuto)); } @@ -274,7 +287,7 @@ public Popover closable() { public Popover closable(CloseHandler closeHandler) { if (closeButton == null) { - insertFirst(contentElement, div().css(component(popover, close)) + insertFirst(contentElement, div().css(component(Classes.popover, close)) .add(closeButton = button() .plain() .icon(times()) @@ -286,12 +299,26 @@ public Popover closable(CloseHandler closeHandler) { } public Popover distance(int distance) { - this.distance = distance; + ap.distance(distance); + return this; + } + + public Popover entryDelay(int delay) { + this.entryDelay = delay; return this; } - public Popover flip(boolean flip) { - this.flip = flip; + public Popover exitDelay(int delay) { + this.exitDelay = delay; + return this; + } + + public Popover hoverable() { + return hoverable(true); + } + + public Popover hoverable(boolean hoverable) { + this.hoverable = hoverable; return this; } @@ -316,9 +343,6 @@ public Popover noClose() { } public Popover placement(Placement placement) { - if (placement == auto) { - flip = true; - } this.placement = placement; return this; } @@ -338,32 +362,22 @@ public Popover status(Severity severity, String screenReaderText) { } public Popover trigger(String trigger) { - return trigger(() -> Elements.querySelector(document.body, By.selector(trigger))); + ap.trigger(trigger); + return this; } public Popover trigger(By trigger) { - return trigger(() -> Elements.querySelector(document.body, trigger)); - } - - public Popover trigger(HTMLElement trigger) { - return trigger(() -> trigger); - } - - public Popover trigger(Supplier trigger) { - this.trigger = trigger; + ap.trigger(trigger); return this; } - public Popover triggerActions(TriggerAction... triggerActions) { - if (triggerActions != null) { - this.triggerActions.clear(); - this.triggerActions.addAll(asList(triggerActions)); - } + public Popover trigger(HTMLElement trigger) { + ap.trigger(trigger); return this; } - public Popover zIndex(int zIndex) { - this.zIndex = zIndex; + public Popover trigger(Supplier trigger) { + ap.trigger(trigger); return this; } @@ -375,7 +389,7 @@ public Popover that() { // ------------------------------------------------------ aria /** - * Accessible label for the popover, required when header is not present. + * Accessible label for the popover, required when a header is not present. */ public Popover ariaLabel(String label) { return aria(Aria.label, label); @@ -395,7 +409,7 @@ public Popover ariaCloseLabel(String label) { @Override public Popover onClose(CloseHandler closeHandler) { - if (closeButton == null) { + if (closeHandler != null) { this.closeHandler.add(closeHandler); } return this; @@ -404,22 +418,80 @@ public Popover onClose(CloseHandler closeHandler) { // ------------------------------------------------------ api public void show() { - show(new Event("")); - } - - public void show(Event event) { - popper.show(null); + if (!ap.visible() && ap.trigger() != null) { + if (ap.cssPositioning()) { + // CSS handles position-try-fallbacks; just apply preferred placement and show + ap.applyPlacement(placement == auto ? top : placement); + ap.show(); + } else { + // JS calculates the best placement via viewport measurements. + // For the calculation to work, the tooltip must be at least hidden + style("visibility", "hidden"); + ap.show(); + ap.applyBestPlacement(placement); + element().style.removeProperty("visibility"); + } + if (!hoverable) { + outsideClickHandler = bind(document, click.name, this::onOutsideClick); + } + } } @Override public void close(Event event, boolean fireEvent) { if (shouldClose(this, closeHandler, event, fireEvent)) { - popper.hide(() -> fireEvent(this, closeHandler, event, fireEvent)); + if (ap.visible()) { + ap.hide(); + if (outsideClickHandler != null) { + outsideClickHandler.removeHandler(); + outsideClickHandler = null; + } + fireEvent(this, closeHandler, event, fireEvent); + } } } // ------------------------------------------------------ internal + private void scheduleShow() { + cancelTimers(); + showTimeout = setTimeout(e -> show(), entryDelay); + } + + private void scheduleHide() { + cancelTimers(); + hideTimeout = setTimeout(e -> close(new Event(""), true), exitDelay); + } + + private void recalculatePlacement() { + if (ap.visible()) { + ap.applyBestPlacement(placement); + } + } + + private void cancelTimers() { + clearTimeout(showTimeout); + clearTimeout(hideTimeout); + } + + private void togglePopover(Event event) { + if (ap.visible()) { + close(event, true); + } else { + show(); + } + } + + private void onOutsideClick(Event event) { + HTMLElement trigger = ap.trigger(); + if (ap.visible() && trigger != null) { + Element target = (Element) event.target; + if (!element().contains(target) && !trigger.contains(target)) { + close(event, true); + } + } + } + private PopoverHeader failSafeHeader() { if (header == null) { add(popoverHeader()); diff --git a/components/src/main/java/org/patternfly/component/popover/PopoverBody.java b/components/src/main/java/org/patternfly/component/popover/PopoverBody.java index 6c1ec875d..e44de7908 100644 --- a/components/src/main/java/org/patternfly/component/popover/PopoverBody.java +++ b/components/src/main/java/org/patternfly/component/popover/PopoverBody.java @@ -37,7 +37,7 @@ public static PopoverBody popoverBody() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "pb"; + public static final String SUB_COMPONENT_NAME = "npb"; final String id; @@ -52,4 +52,4 @@ public static PopoverBody popoverBody() { public PopoverBody that() { return this; } -} +} \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/popover/PopoverFooter.java b/components/src/main/java/org/patternfly/component/popover/PopoverFooter.java index 3674c84dc..b6bbcf747 100644 --- a/components/src/main/java/org/patternfly/component/popover/PopoverFooter.java +++ b/components/src/main/java/org/patternfly/component/popover/PopoverFooter.java @@ -35,7 +35,7 @@ public static PopoverFooter popoverFooter() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "pf"; + public static final String SUB_COMPONENT_NAME = "npf"; PopoverFooter() { super(SUB_COMPONENT_NAME, div().css(component(popover, footer)).element()); @@ -47,4 +47,4 @@ public static PopoverFooter popoverFooter() { public PopoverFooter that() { return this; } -} +} \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/popover/PopoverHeader.java b/components/src/main/java/org/patternfly/component/popover/PopoverHeader.java index a50bf6d50..39b8d87b3 100644 --- a/components/src/main/java/org/patternfly/component/popover/PopoverHeader.java +++ b/components/src/main/java/org/patternfly/component/popover/PopoverHeader.java @@ -49,7 +49,7 @@ public static PopoverHeader popoverHeader() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "ph"; + public static final String SUB_COMPONENT_NAME = "nph"; final String headerId; final HTMLHeadingElement headerElement; @@ -98,4 +98,4 @@ private HTMLElement failSafeIconContainer() { } return iconContainer; } -} +} \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/popover/PopoverSubComponent.java b/components/src/main/java/org/patternfly/component/popover/PopoverSubComponent.java index 66d91d9b6..b668fc220 100644 --- a/components/src/main/java/org/patternfly/component/popover/PopoverSubComponent.java +++ b/components/src/main/java/org/patternfly/component/popover/PopoverSubComponent.java @@ -26,4 +26,4 @@ abstract class PopoverSubComponent implements + Closeable, + NoPadding, + ComponentIcon, + Attachable { + + // ------------------------------------------------------ factory + + public static PopperPopover popover() { + return new PopperPopover(null); + } + + public static PopperPopover popover(By trigger) { + return new PopperPopover(() -> Elements.querySelector(document.body, trigger)); + } + + public static PopperPopover popover(HTMLElement trigger) { + return new PopperPopover(() -> trigger); + } + + public static PopperPopover popover(Supplier trigger) { + return new PopperPopover(trigger); + } + + // ------------------------------------------------------ instance + + private static final Logger logger = Logger.getLogger(PopperPopover.class.getName()); + + public static final int ANIMATION_DURATION = 300; + public static final int DISTANCE = 25; + public static final int Z_INDEX = 9999; + + private final HTMLElement contentElement; + private final Set triggerActions; + private final List> closeHandler; + private Supplier trigger; + private boolean flip; + private boolean showClose; + private int distance; + private int animationDuration; + private int zIndex; + private Popper popper; + private Placement placement; + private Button closeButton; + private Severity severity; + private PopperPopoverHeader header; + private HTMLElement screenReaderElement; + private HTMLElement iconContainer; + + PopperPopover(Supplier trigger) { + super(ComponentType.PopperPopover, div().css(component(popover)) + .style("display", "none") + .attr(role, dialog) + .aria(modal, true) + .element()); + + this.trigger = trigger; + this.triggerActions = EnumSet.of(TriggerAction.click); + this.closeHandler = new ArrayList<>(); + this.flip = true; + this.showClose = true; + this.placement = top; + this.zIndex = Z_INDEX; + this.distance = DISTANCE; + this.animationDuration = ANIMATION_DURATION; + + String bodyId = Id.unique(componentType().id, "body"); + add(div().css(component(popover, arrow))); + add(contentElement = div().css(component(popover, content)) + .element()); + aria(describedBy, bodyId); + + Attachable.register(this, this); + } + + @Override + public void attach(MutationRecord mutationRecord) { + if (showClose) { + closable(); + } else { + failSafeRemoveFromParent(closeButton); + } + + if (trigger != null) { + HTMLElement triggerElement = trigger.get(); + if (triggerElement != null) { + popper = new PopperBuilder(componentType().componentName, triggerElement, element()) + .addModifier(Modifiers.eventListeners(false), + Modifiers.flip(placement == auto || flip), + Modifiers.hide(), + Modifiers.noOverflow(), + Modifiers.offset(distance), + Modifiers.placement()) + .animationDuration(animationDuration) + .placement(placement) + .registerHandler(triggerActions, this::show, this::close) + .removePopperOnTriggerDetach() + .zIndex(zIndex) + .build(); + } else { + logger.error("Unable to find trigger element for popover %o", element()); + } + } else { + logger.error("No trigger element defined for popover %o", element()); + } + } + + @Override + public void detach(MutationRecord mutationRecord) { + popper.cleanup(); + } + + // ------------------------------------------------------ add + + public PopperPopover addHeader(String header) { + if (this.header != null) { + this.header.text(header); + return this; + } else { + return add(popoverHeader().text(header)); + } + } + + public PopperPopover addHeader(PopperPopoverHeader header) { + return add(header); + } + + // override to append to the right container! + public PopperPopover add(PopperPopoverHeader header) { + this.header = header; + contentElement.appendChild(header.element()); + aria(labelledBy, header.headerId); + return this; + } + + public PopperPopover addBody(String body) { + return add(popoverBody().text(body)); + } + + public PopperPopover addBody(PopperPopoverBody body) { + return add(body); + } + + // override to append to the right container! + public PopperPopover add(PopperPopoverBody body) { + contentElement.appendChild(body.element()); + return this; + } + + public PopperPopover addFooter(String footer) { + return add(popoverFooter().text(footer)); + } + + public PopperPopover addFooter(PopperPopoverFooter footer) { + return add(footer); + } + + // override to append to the right container! + public PopperPopover add(PopperPopoverFooter footer) { + contentElement.appendChild(footer.element()); + return this; + } + + // ------------------------------------------------------ builder + + public PopperPopover appendToBody() { + return appendTo(document.body); + } + + public PopperPopover appendTo(Node node) { + if (node != null) { + node.appendChild(element()); + } + return this; + } + + public PopperPopover animationDuration(int animationDuration) { + this.animationDuration = animationDuration; + return this; + } + + public PopperPopover autoWidth() { + return css(modifier(widthAuto)); + } + + public PopperPopover closable() { + return closable(null); + } + + public PopperPopover closable(CloseHandler closeHandler) { + if (closeButton == null) { + insertFirst(contentElement, div().css(component(popover, close)) + .add(closeButton = button() + .plain() + .icon(times()) + .aria(label, "Close") + .on(click, event -> close(event, true))) + .element()); + } + return onClose(closeHandler); + } + + public PopperPopover distance(int distance) { + this.distance = distance; + return this; + } + + public PopperPopover flip(boolean flip) { + this.flip = flip; + return this; + } + + @Override + public PopperPopover icon(Element icon) { + failSafeHeader().removeIcon(); + failSafeHeader().icon(icon); + return this; + } + + @Override + public PopperPopover removeIcon() { + if (header != null) { + header.removeIcon(); + } + return this; + } + + public PopperPopover noClose() { + this.showClose = false; + return this; + } + + public PopperPopover placement(Placement placement) { + if (placement == auto) { + flip = true; + } + this.placement = placement; + return this; + } + + public PopperPopover status(Severity severity) { + return status(severity, severity.name() + " popover"); + } + + public PopperPopover status(Severity severity, String screenReaderText) { + if (this.severity != null) { + element().classList.remove(this.severity.status.modifier()); + } + this.severity = severity; + css(severity.status.modifier()); + icon((severity.icon.get().element())); + return this; + } + + public PopperPopover trigger(String trigger) { + return trigger(() -> Elements.querySelector(document.body, By.selector(trigger))); + } + + public PopperPopover trigger(By trigger) { + return trigger(() -> Elements.querySelector(document.body, trigger)); + } + + public PopperPopover trigger(HTMLElement trigger) { + return trigger(() -> trigger); + } + + public PopperPopover trigger(Supplier trigger) { + this.trigger = trigger; + return this; + } + + public PopperPopover triggerActions(TriggerAction... triggerActions) { + if (triggerActions != null) { + this.triggerActions.clear(); + this.triggerActions.addAll(asList(triggerActions)); + } + return this; + } + + public PopperPopover zIndex(int zIndex) { + this.zIndex = zIndex; + return this; + } + + @Override + public PopperPopover that() { + return this; + } + + // ------------------------------------------------------ aria + + /** + * Accessible label for the popover, required when header is not present. + */ + public PopperPopover ariaLabel(String label) { + return aria(Aria.label, label); + } + + /** + * Accessible label for the close button. + */ + public PopperPopover ariaCloseLabel(String label) { + if (closeButton != null) { + closeButton.aria(Aria.label, label); + } + return this; + } + + // ------------------------------------------------------ events + + @Override + public PopperPopover onClose(CloseHandler closeHandler) { + if (closeButton == null) { + this.closeHandler.add(closeHandler); + } + return this; + } + + // ------------------------------------------------------ api + + public void show() { + show(new Event("")); + } + + public void show(Event event) { + popper.show(null); + } + + @Override + public void close(Event event, boolean fireEvent) { + if (shouldClose(this, closeHandler, event, fireEvent)) { + popper.hide(() -> fireEvent(this, closeHandler, event, fireEvent)); + } + } + + // ------------------------------------------------------ internal + + private PopperPopoverHeader failSafeHeader() { + if (header == null) { + add(popoverHeader()); + } + return header; + } +} diff --git a/components/src/main/java/org/patternfly/component/popover/NativePopoverBody.java b/components/src/main/java/org/patternfly/component/popover/PopperPopoverBody.java similarity index 74% rename from components/src/main/java/org/patternfly/component/popover/NativePopoverBody.java rename to components/src/main/java/org/patternfly/component/popover/PopperPopoverBody.java index 56ff786ed..a423f9693 100644 --- a/components/src/main/java/org/patternfly/component/popover/NativePopoverBody.java +++ b/components/src/main/java/org/patternfly/component/popover/PopperPopoverBody.java @@ -26,30 +26,31 @@ import static org.patternfly.style.Classes.component; import static org.patternfly.style.Classes.popover; -public class NativePopoverBody extends NativePopoverSubComponent implements - ElementTextMethods { +@Deprecated +public class PopperPopoverBody extends PopperPopoverSubComponent implements + ElementTextMethods { // ------------------------------------------------------ factory - public static NativePopoverBody popoverBody() { - return new NativePopoverBody(); + public static PopperPopoverBody popoverBody() { + return new PopperPopoverBody(); } // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "npb"; + public static final String SUB_COMPONENT_NAME = "pb"; final String id; - NativePopoverBody() { + PopperPopoverBody() { super(SUB_COMPONENT_NAME, div().css(component(popover, body)).element()); - id(id = Id.unique(ComponentType.NativePopover.id, "body")); + id(id = Id.unique(ComponentType.PopperPopover.id, "body")); } // ------------------------------------------------------ builder @Override - public NativePopoverBody that() { + public PopperPopoverBody that() { return this; } -} \ No newline at end of file +} diff --git a/components/src/main/java/org/patternfly/component/popover/NativePopoverFooter.java b/components/src/main/java/org/patternfly/component/popover/PopperPopoverFooter.java similarity index 75% rename from components/src/main/java/org/patternfly/component/popover/NativePopoverFooter.java rename to components/src/main/java/org/patternfly/component/popover/PopperPopoverFooter.java index 1702747f8..864ce3761 100644 --- a/components/src/main/java/org/patternfly/component/popover/NativePopoverFooter.java +++ b/components/src/main/java/org/patternfly/component/popover/PopperPopoverFooter.java @@ -24,27 +24,28 @@ import static org.patternfly.style.Classes.footer; import static org.patternfly.style.Classes.popover; -public class NativePopoverFooter extends NativePopoverSubComponent implements - ElementTextMethods { +@Deprecated +public class PopperPopoverFooter extends PopperPopoverSubComponent implements + ElementTextMethods { // ------------------------------------------------------ factory - public static NativePopoverFooter popoverFooter() { - return new NativePopoverFooter(); + public static PopperPopoverFooter popoverFooter() { + return new PopperPopoverFooter(); } // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "npf"; + public static final String SUB_COMPONENT_NAME = "pf"; - NativePopoverFooter() { + PopperPopoverFooter() { super(SUB_COMPONENT_NAME, div().css(component(popover, footer)).element()); } // ------------------------------------------------------ builder @Override - public NativePopoverFooter that() { + public PopperPopoverFooter that() { return this; } -} \ No newline at end of file +} diff --git a/components/src/main/java/org/patternfly/component/popover/NativePopoverHeader.java b/components/src/main/java/org/patternfly/component/popover/PopperPopoverHeader.java similarity index 84% rename from components/src/main/java/org/patternfly/component/popover/NativePopoverHeader.java rename to components/src/main/java/org/patternfly/component/popover/PopperPopoverHeader.java index 6539303cb..2ce5c7be5 100644 --- a/components/src/main/java/org/patternfly/component/popover/NativePopoverHeader.java +++ b/components/src/main/java/org/patternfly/component/popover/PopperPopoverHeader.java @@ -37,27 +37,28 @@ import static org.patternfly.style.Classes.text; import static org.patternfly.style.Classes.title; -public class NativePopoverHeader extends NativePopoverSubComponent implements - ElementContainerDelegate, - ElementTextDelegate { +@Deprecated +public class PopperPopoverHeader extends PopperPopoverSubComponent implements + ElementContainerDelegate, + ElementTextDelegate { // ------------------------------------------------------ factory - public static NativePopoverHeader popoverHeader() { - return new NativePopoverHeader(); + public static PopperPopoverHeader popoverHeader() { + return new PopperPopoverHeader(); } // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "nph"; + public static final String SUB_COMPONENT_NAME = "ph"; final String headerId; final HTMLHeadingElement headerElement; private HTMLElement iconContainer; - NativePopoverHeader() { + PopperPopoverHeader() { super(SUB_COMPONENT_NAME, header().css(component(popover, Classes.header)).element()); - headerId = Id.unique(ComponentType.NativePopover.id, "header"); + headerId = Id.unique(ComponentType.PopperPopover.id, "header"); element().appendChild(div().css(component(popover, title)) .id(headerId) .add(headerElement = h(6).css(component(popover, title, text)) @@ -78,7 +79,7 @@ public Element textDelegate() { // ------------------------------------------------------ builder @Override - public NativePopoverHeader that() { + public PopperPopoverHeader that() { return this; } @@ -98,4 +99,4 @@ private HTMLElement failSafeIconContainer() { } return iconContainer; } -} \ No newline at end of file +} diff --git a/components/src/main/java/org/patternfly/component/popover/NativePopoverSubComponent.java b/components/src/main/java/org/patternfly/component/popover/PopperPopoverSubComponent.java similarity index 82% rename from components/src/main/java/org/patternfly/component/popover/NativePopoverSubComponent.java rename to components/src/main/java/org/patternfly/component/popover/PopperPopoverSubComponent.java index e2ed8eb00..527fe6864 100644 --- a/components/src/main/java/org/patternfly/component/popover/NativePopoverSubComponent.java +++ b/components/src/main/java/org/patternfly/component/popover/PopperPopoverSubComponent.java @@ -21,9 +21,10 @@ import elemental2.dom.HTMLElement; -abstract class NativePopoverSubComponent> extends SubComponent { +@Deprecated +abstract class PopperPopoverSubComponent> extends SubComponent { - NativePopoverSubComponent(String name, E element) { - super(ComponentType.NativePopover, name, element); + PopperPopoverSubComponent(String name, E element) { + super(ComponentType.PopperPopover, name, element); } -} \ No newline at end of file +} diff --git a/components/src/main/java/org/patternfly/component/progressstepper/ProgressStep.java b/components/src/main/java/org/patternfly/component/progressstepper/ProgressStep.java index a213a62c7..605201ad4 100644 --- a/components/src/main/java/org/patternfly/component/progressstepper/ProgressStep.java +++ b/components/src/main/java/org/patternfly/component/progressstepper/ProgressStep.java @@ -73,9 +73,8 @@ public static ProgressStep progressStep(String identifier, String text) { private static final String STEP_MAIN = "step-main"; private static final String STEP_TITLE = "step-title"; private static final String STEP_DESCRIPTION = "step-description"; - private static final String LISTITEM = "listitem"; + private static final String LIST_ITEM = "list-item"; - private final HTMLContainerBuilder stepConnector; private final HTMLElement stepIcon; private final HTMLContainerBuilder stepMain; private HTMLContainerBuilder stepDescription; @@ -93,7 +92,7 @@ public static ProgressStep progressStep(String identifier, String text) { super(ComponentType.ProgressStepper, SUB_COMPONENT_NAME, li().element()); this.identifier = identifier; - this.stepConnector = div().css(component(progressStepper, STEP_CONNECTOR)); + HTMLContainerBuilder stepConnector = div().css(component(progressStepper, STEP_CONNECTOR)); this.stepIcon = span().css(component(progressStepper, STEP_ICON)).element(); this.stepMain = div().css(component(progressStepper, STEP_MAIN)); @@ -102,7 +101,7 @@ public static ProgressStep progressStep(String identifier, String text) { element().appendChild(stepMain.add(div().css(component(progressStepper, STEP_TITLE))).element()); css(component(progressStepper, step)); - element().setAttribute(role, LISTITEM); + element().setAttribute(role, LIST_ITEM); } @Override @@ -231,13 +230,12 @@ public ProgressStep popover(Popover popover) { .element(); stepMain.add(textButton); + stepMain.add(popover.trigger(textButton)); // Re-add description if it existed if (stepDescription != null) { stepMain.add(stepDescription); } - - popover.trigger(textButton).appendToBody(); return this; } @@ -260,6 +258,7 @@ public ProgressStep removePopover() { } // ------------------------------------------ package-private + ProgressStep current(boolean isCurrent) { if (this.isCurrent == isCurrent) { return this; diff --git a/components/src/main/java/org/patternfly/component/slider/Slider.java b/components/src/main/java/org/patternfly/component/slider/Slider.java index abe505194..d1f5c27df 100644 --- a/components/src/main/java/org/patternfly/component/slider/Slider.java +++ b/components/src/main/java/org/patternfly/component/slider/Slider.java @@ -54,7 +54,6 @@ import static java.lang.Double.parseDouble; import static org.jboss.elemento.Elements.children; import static org.jboss.elemento.Elements.div; -import static org.jboss.elemento.Elements.failSafeRemoveFromParent; import static org.jboss.elemento.Elements.insertAfter; import static org.jboss.elemento.Elements.insertFirst; import static org.jboss.elemento.Elements.isAttached; @@ -77,7 +76,6 @@ import static org.patternfly.component.slider.SliderInputPosition.aboveThumb; import static org.patternfly.component.slider.SliderInputPosition.end; import static org.patternfly.component.slider.SliderStep.sliderStep; -import static org.patternfly.component.tooltip.Tooltip.tooltip; import static org.patternfly.core.Aria.hidden; import static org.patternfly.core.Aria.valueMax; import static org.patternfly.core.Aria.valueMin; @@ -224,9 +222,9 @@ public void attach(MutationRecord mutationRecord) { } if (tooltipOnThumb) { - tooltip = tooltip(thumb.element()) - .entryDelay(0) - .appendToBody(); + tooltip = Tooltip.tooltip(thumb.element()) + .entryDelay(0); + add(tooltip); } if (disabled) { @@ -240,7 +238,6 @@ public void attach(MutationRecord mutationRecord) { @Override public void detach(MutationRecord mutationRecord) { - failSafeRemoveFromParent(tooltip); if (mouseMoveHandler != null) { mouseMoveHandler.removeHandler(); } diff --git a/components/src/main/java/org/patternfly/component/tabs/OverflowTab.java b/components/src/main/java/org/patternfly/component/tabs/OverflowTab.java index 5b5027444..14d62977c 100644 --- a/components/src/main/java/org/patternfly/component/tabs/OverflowTab.java +++ b/components/src/main/java/org/patternfly/component/tabs/OverflowTab.java @@ -15,7 +15,6 @@ */ package org.patternfly.component.tabs; -import java.util.EnumSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -29,18 +28,18 @@ import org.patternfly.component.menu.MenuItem; import org.patternfly.component.menu.MenuList; import org.patternfly.core.Aria; +import org.patternfly.core.Attributes; import org.patternfly.core.Roles; -import org.patternfly.popper.Popper; -import org.patternfly.popper.PopperBuilder; -import org.patternfly.popper.TriggerAction; +import org.patternfly.overlay.Overlay; +import org.patternfly.overlay.TriggerMode; import org.patternfly.style.Classes; import org.patternfly.style.Modifiers; -import elemental2.dom.Event; import elemental2.dom.HTMLButtonElement; import elemental2.dom.HTMLElement; import static org.jboss.elemento.Elements.button; +import static org.jboss.elemento.Elements.div; import static org.jboss.elemento.Elements.li; import static org.jboss.elemento.Elements.setVisible; import static org.jboss.elemento.Elements.span; @@ -54,12 +53,7 @@ import static org.patternfly.core.Attributes.role; import static org.patternfly.core.Roles.presentation; import static org.patternfly.icon.IconSets.fas.angleRight; -import static org.patternfly.popper.Modifiers.eventListeners; -import static org.patternfly.popper.Modifiers.flip; -import static org.patternfly.popper.Modifiers.hide; -import static org.patternfly.popper.Modifiers.noOverflow; -import static org.patternfly.popper.Modifiers.placement; -import static org.patternfly.popper.Placement.bottomStart; +import static org.patternfly.overlay.Overlay.overlay; import static org.patternfly.style.Classes.component; import static org.patternfly.style.Classes.current; import static org.patternfly.style.Classes.hasPopup; @@ -69,6 +63,7 @@ import static org.patternfly.style.Classes.modifier; import static org.patternfly.style.Classes.overflow; import static org.patternfly.style.Classes.toggle; +import static org.patternfly.style.Placement.bottomStart; // internal subcomponent! class OverflowTab extends TabSubComponent implements Modifiers.Disabled { @@ -88,10 +83,10 @@ static OverflowTab overflowTab() { private final HTMLElement textElement; private final Menu menu; private final MenuList menuList; + private final Overlay overlay; private int count; private String text; private boolean showCount; - private final Popper popper; private MenuItem selectedMenuItem; OverflowTab() { @@ -108,30 +103,34 @@ static OverflowTab overflowTab() { .add(textElement = span().css(component(Classes.tabs, item, Classes.text)).element()) .add(span().css(component(Classes.tabs, link, toggle, icon)) .add(angleRight()))); - add(menu = menu(select, single) - .onSingleSelect((event, menuItem, selected) -> select(menuItem)) - .addContent(menuContent() - .addList(menuList = menuList() - .addItems(tabs.values(), tab -> menuItem(tab.identifier(), tab.text()))))); - setVisible(menu, false); - - popper = new PopperBuilder(ComponentType.Tabs.componentName, button.element(), menu.element()) - .zIndex(9999) + + HTMLElement menuPopover; + add(menuPopover = div().css(component(Classes.menu, Classes.popover)) + .attr(Attributes.popover, "manual") + .add(menu = menu(select, single) + .onSingleSelect((event, menuItem, selected) -> select(menuItem)) + .addContent(menuContent() + .addList(menuList = menuList() + .addItems(tabs.values(), tab -> menuItem(tab.identifier(), tab.text()))))) + .element()); + + overlay = overlay(menuPopover) + .trigger(button::element) + .triggerMode(TriggerMode.click) .placement(bottomStart) - .addModifier(noOverflow(), - hide(), - flip(true), - placement(), - eventListeners(false)) - .registerHandler(button.element(), EnumSet.of(TriggerAction.click), this::show, this::close) - .build(); + .cssPositioning(true) + .onToggle((event, open) -> { + if (open) { + Expandable.expand(button.element(), button.element(), null); + } else { + Expandable.collapse(button.element(), button.element(), null); + } + }); + overlay.attach(); } - // not a real detach, but called from tabs component void detach() { - if (popper != null) { - popper.cleanup(); - } + overlay.detach(); } // ------------------------------------------------------ builder @@ -180,6 +179,7 @@ void unselect() { } private void select(MenuItem menuItem) { + overlay.hide(); selectedMenuItem = menuItem; Tab tab = tabs.get(menuItem.identifier()); if (tab != null) { @@ -196,12 +196,4 @@ private void updateText() { textElement.textContent += " (" + count + ")"; } } - - private void show(Event event) { - popper.show(() -> Expandable.expand(button.element(), button.element(), null)); - } - - private void close(Event event) { - popper.hide(() -> Expandable.collapse(button.element(), button.element(), null)); - } } diff --git a/components/src/main/java/org/patternfly/component/tabs/Tab.java b/components/src/main/java/org/patternfly/component/tabs/Tab.java index c204a282c..03358c655 100644 --- a/components/src/main/java/org/patternfly/component/tabs/Tab.java +++ b/components/src/main/java/org/patternfly/component/tabs/Tab.java @@ -114,9 +114,6 @@ public static Tab tab(HTMLContainerBuilder builder, S final String contentId; final HTMLContainerBuilder button; final List> closeHandler; - Popover help; - Tooltip tooltip; - Button helpButton; TabContent content; Function> asyncContent; @@ -125,6 +122,7 @@ public static Tab tab(HTMLContainerBuilder builder, S private final HTMLElement textElement; private final boolean anchorElement; private double loadingTimeout; + private Button helpButton; private Button closeButton; private HTMLElement iconContainer; private HTMLElement loadingContainer; @@ -273,14 +271,15 @@ public Tab help(Popover help) { .aria(Aria.label, "More info for " + text()) .add(span().css(component(tabs, item, action, icon)) .add(patternfly.help()))) + .add(help) .element(); + help.trigger(helpButton.element()); if (closeButton == null) { add(helpContainer); } else { insertBefore(helpContainer, closeButton.element()); } } - this.help = help; return this; } @@ -289,10 +288,8 @@ public Tab selected() { } public Tab tooltip(Tooltip tooltip) { - // Override to add the tooltip to the tabs element in Tabs.attach() - // If added to this element, the tooltip won't show, - // because this element is inside a scrolling container (

    ) - this.tooltip = tooltip; + button.add(tooltip); + tooltip.trigger(button.element()); return this; } diff --git a/components/src/main/java/org/patternfly/component/tabs/Tabs.java b/components/src/main/java/org/patternfly/component/tabs/Tabs.java index 9a083df74..f9b209ef8 100644 --- a/components/src/main/java/org/patternfly/component/tabs/Tabs.java +++ b/components/src/main/java/org/patternfly/component/tabs/Tabs.java @@ -142,7 +142,6 @@ public static Tabs tabs(HTMLContainerBuilder builder) private final List> selectHandler; private Function addFunction; private HandlerRegistration resizeHandler; - private HandlerRegistration transitionEndHandler; Tabs(HTMLContainerBuilder builder) { super(ComponentType.Tabs, div().element()); @@ -249,17 +248,9 @@ public void detach(MutationRecord mutationRecord) { if (resizeHandler != null) { resizeHandler.removeHandler(); } - if (transitionEndHandler != null) { - transitionEndHandler.removeHandler(); - } if (overflowTab != null) { overflowTab.detach(); } - for (Tab tab : items.values()) { - // help and tooltip are appended to the body! - failSafeRemoveFromParent(tab.help); - failSafeRemoveFromParent(tab.tooltip); - } } // ------------------------------------------------------ add @@ -363,7 +354,7 @@ public Tabs pageInsets(boolean pageInsets) { } /** - * Flag which places overflowing tabs into a menu triggered by the last tab. Unlike other flags, this can only be turned on, + * Flag that places overflowing tabs into a menu triggered by the last tab. Unlike other flags, this can only be turned on, * but not off. */ public Tabs overflowHorizontal() { @@ -371,7 +362,7 @@ public Tabs overflowHorizontal() { } /** - * Flag which places overflowing tabs into a menu triggered by the last tab. Unlike other flags, this can only be turned on, + * Flag that places overflowing tabs into a menu triggered by the last tab. Unlike other flags, this can only be turned on, * but not off. */ public Tabs overflowHorizontal(String overflowText) { @@ -381,7 +372,7 @@ public Tabs overflowHorizontal(String overflowText) { return this; } - /** By default, the first tab is selected initially. Call this method to disable thi default behaviour. */ + /** By default, the first tab is selected initially. Call this method to disable the default behaviour. */ public Tabs noInitialSelection() { this.noInitialSelection = true; return this; @@ -409,7 +400,7 @@ public Tabs showTabCount() { return showTabCount(true); } - /** Flag which shows the count of overflowing tabs when enabled */ + /** Flag that shows the count of overflowing tabs when enabled */ public Tabs showTabCount(boolean showTabCount) { failSafeOverflowTab().showCount(showTabCount); return this; @@ -448,7 +439,7 @@ public Tabs that() { /** * Provides an accessible label for the tabs. Labels should be unique for each set of tabs that are present on a page. When - * component is set to nav, this prop should be defined to differentiate the tabs from other navigation regions on the + * a component is set to nav, this prop should be defined to differentiate the tabs from other navigation regions on the * page. */ public Tabs ariaLabel(String label) { @@ -456,7 +447,7 @@ public Tabs ariaLabel(String label) { } /** - * Aria-label for the add button. + * Aria-label for the Add button. */ public Tabs ariaAddLabel(String label) { if (addButton != null) { @@ -703,14 +694,6 @@ private void addTabToDOM(Tab tab) { } private void addTabHandle(Tab tab) { - if (tab.tooltip != null) { - tab.tooltip.trigger(tab.button.element()); - tab.tooltip.appendToBody(); - } - if (tab.help != null) { - tab.help.trigger(tab.helpButton.element()); - tab.help.appendToBody(); - } if (this.closeable) { tab.closeable(); tab.closeHandler.addAll(this.closeHandler); @@ -734,8 +717,6 @@ void addTabContent(Tab tab) { private void internalClose(Tab tab) { items.remove(tab.identifier()); - failSafeRemoveFromParent(tab.help); - failSafeRemoveFromParent(tab.tooltip); failSafeRemoveFromParent(tab.content); failSafeRemoveFromParent(tab); } @@ -756,7 +737,7 @@ private void updateOverflow() { int count = 0; List overflowingTabs = new ArrayList<>(); for (Tab tab : items.values()) { - // to calculate the visibility, temporarily make all, but the overflow tab visible + // to calculate the visibility, temporarily make all but the overflow tab visible setVisible(tab, true); if (!isElementInView(tabsContainer, tab, false)) { count++; diff --git a/components/src/main/java/org/patternfly/component/tooltip/NativeTooltip.java b/components/src/main/java/org/patternfly/component/tooltip/NativeTooltip.java deleted file mode 100644 index add084e21..000000000 --- a/components/src/main/java/org/patternfly/component/tooltip/NativeTooltip.java +++ /dev/null @@ -1,356 +0,0 @@ -/* - * Copyright 2023 Red Hat - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.patternfly.component.tooltip; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.Supplier; - -import org.gwtproject.event.shared.HandlerRegistration; -import org.jboss.elemento.Attachable; -import org.jboss.elemento.By; -import org.jboss.elemento.ElementContainerDelegate; -import org.jboss.elemento.ElementTextDelegate; -import org.jboss.elemento.Elements; -import org.jboss.elemento.Id; -import org.jboss.elemento.logger.Logger; -import org.patternfly.component.BaseComponent; -import org.patternfly.component.Closeable; -import org.patternfly.component.ComponentType; -import org.patternfly.core.Roles; -import org.patternfly.handler.CloseHandler; -import org.patternfly.popper.Placement; -import org.patternfly.position.AnchorPositioning; -import org.patternfly.position.CssPositioning; -import org.patternfly.style.Classes; -import elemental2.dom.Element; -import elemental2.dom.Event; -import elemental2.dom.HTMLDivElement; -import elemental2.dom.HTMLElement; -import elemental2.dom.MutationRecord; - -import static elemental2.dom.DomGlobal.clearTimeout; -import static elemental2.dom.DomGlobal.document; -import static elemental2.dom.DomGlobal.setTimeout; -import static org.gwtproject.event.shared.HandlerRegistrations.compose; -import static org.jboss.elemento.Elements.div; -import static org.jboss.elemento.EventType.bind; -import static org.jboss.elemento.EventType.focusin; -import static org.jboss.elemento.EventType.focusout; -import static org.jboss.elemento.EventType.mouseenter; -import static org.jboss.elemento.EventType.mouseleave; -import static org.jboss.elemento.EventType.scroll; -import static org.patternfly.component.tooltip.TriggerAria.describedBy; -import static org.patternfly.component.tooltip.TriggerAria.none; -import static org.patternfly.core.Aria.live; -import static org.patternfly.core.Attributes.popover; -import static org.patternfly.core.Attributes.role; -import static org.patternfly.handler.CloseHandler.fireEvent; -import static org.patternfly.handler.CloseHandler.shouldClose; -import static org.patternfly.popper.Placement.auto; -import static org.patternfly.popper.Placement.top; -import static org.patternfly.style.Classes.arrow; -import static org.patternfly.style.Classes.component; -import static org.patternfly.style.Classes.content; -import static org.patternfly.style.Classes.modifier; -import static org.patternfly.style.Classes.textAlignLeft; -import static org.patternfly.style.Classes.tooltip; - -/** - * A tooltip is in-app messaging used to identify elements on a page with short, clarifying text. - *

    - * This implementation uses the Popover API and CSS anchor positioning instead of Popper.js. The tooltip uses the browser's - * top-layer rendering for correct stacking, eliminating z-index issues. - */ -public class NativeTooltip extends BaseComponent implements - Attachable, - Closeable, - ElementContainerDelegate, - ElementTextDelegate { - - // ------------------------------------------------------ factory - - public static NativeTooltip nativeTooltip() { - return new NativeTooltip(null, null); - } - - public static NativeTooltip nativeTooltip(String text) { - return new NativeTooltip(null, text); - } - - public static NativeTooltip nativeTooltip(By trigger) { - return new NativeTooltip(() -> Elements.querySelector(document.body, trigger), null); - } - - public static NativeTooltip nativeTooltip(By trigger, String text) { - return new NativeTooltip(() -> Elements.querySelector(document.body, trigger), text); - } - - public static NativeTooltip nativeTooltip(HTMLElement trigger) { - return new NativeTooltip(() -> trigger, null); - } - - public static NativeTooltip nativeTooltip(HTMLElement trigger, String text) { - return new NativeTooltip(() -> trigger, text); - } - - public static NativeTooltip nativeTooltip(Supplier trigger) { - return new NativeTooltip(trigger, null); - } - - public static NativeTooltip nativeTooltip(Supplier trigger, String text) { - return new NativeTooltip(trigger, text); - } - - // ------------------------------------------------------ instance - - private static final Logger logger = Logger.getLogger(NativeTooltip.class.getName()); - - public static final int DISTANCE = 15; - public static final int ENTRY_DELAY = 300; - public static final int EXIT_DELAY = 300; - - private final String id; - private final AnchorPositioning ap; - private final HTMLElement contentElement; - private final List> closeHandler; - - private int entryDelay; - private int exitDelay; - private double showTimeout; - private double hideTimeout; - private Placement placement; - private TriggerAria aria; - private HandlerRegistration triggerHandlers; - private HandlerRegistration anchorHandlers; - private HandlerRegistration scrollHandler; - - NativeTooltip(Supplier trigger, String text) { - super(ComponentType.NativeTooltip, div().css(component(Classes.tooltip)) - .attr(role, Roles.tooltip) - .aria(live, "polite") - .attr(popover, "manual") - .element()); - - this.id = Id.unique(componentType().id); - this.ap = new AnchorPositioning(id, element(), trigger, DISTANCE, CssPositioning.tooltipEnabled(), false); - this.closeHandler = new ArrayList<>(); - this.showTimeout = 0; - this.hideTimeout = 0; - this.entryDelay = ENTRY_DELAY; - this.exitDelay = EXIT_DELAY; - this.placement = auto; - this.aria = describedBy; - - id(id); - element().appendChild(div().css(component(tooltip, arrow)).element()); - element().appendChild(contentElement = div().css(component(tooltip, content)).element()); - if (text != null) { - contentElement.textContent = text; - } - Attachable.register(this, this); - } - - @Override - public Element containerDelegate() { - return contentElement; - } - - @Override - public Element textDelegate() { - return contentElement; - } - - @Override - public void attach(MutationRecord mutationRecord) { - HTMLElement trigger = ap.attach(); - if (trigger != null) { - // top is the default for auto and recalculated on show() - ap.applyPlacement(placement == auto ? top : placement); - - triggerHandlers = compose( - bind(trigger, mouseenter, e -> scheduleShow()), - bind(trigger, mouseleave, e -> scheduleHide()), - bind(trigger, focusin, e -> scheduleShow()), - bind(trigger, focusout, e -> scheduleHide())); - anchorHandlers = compose( - bind(element(), mouseenter, e -> cancelTimers()), - bind(element(), mouseleave, e -> scheduleHide())); - - if (!ap.cssPositioning()) { - scrollHandler = bind(document, scroll, true, e -> recalculatePlacement()); - } - - } else if (ap.hasTriggerSupplier()) { - logger.error("Unable to find trigger element for tooltip %o", element()); - } else { - logger.error("No trigger element defined for tooltip %o", element()); - } - } - - @Override - public void detach(MutationRecord mutationRecord) { - cancelTimers(); - if (ap.visible()) { - ap.hide(); - } - if (scrollHandler != null) { - scrollHandler.removeHandler(); - } - if (anchorHandlers != null) { - anchorHandlers.removeHandler(); - } - if (triggerHandlers != null) { - triggerHandlers.removeHandler(); - } - ap.detach(); - } - - // ------------------------------------------------------ builder - - public NativeTooltip distance(int distance) { - ap.distance(distance); - return this; - } - - public NativeTooltip entryDelay(int delay) { - this.entryDelay = delay; - return this; - } - - public NativeTooltip exitDelay(int delay) { - this.exitDelay = delay; - return this; - } - - public NativeTooltip leftAligned() { - contentElement.classList.add(modifier(textAlignLeft)); - return this; - } - - public NativeTooltip placement(Placement placement) { - this.placement = placement; - return this; - } - - public NativeTooltip trigger(String trigger) { - ap.trigger(trigger); - return this; - } - - public NativeTooltip trigger(By trigger) { - ap.trigger(trigger); - return this; - } - - public NativeTooltip trigger(HTMLElement trigger) { - ap.trigger(trigger); - return this; - } - - public NativeTooltip trigger(Supplier trigger) { - ap.trigger(trigger); - return this; - } - - @Override - public NativeTooltip that() { - return this; - } - - // ------------------------------------------------------ aria - - public NativeTooltip aria(TriggerAria aria) { - this.aria = aria; - return this; - } - - // ------------------------------------------------------ events - - @Override - public NativeTooltip onClose(CloseHandler closeHandler) { - if (closeHandler != null) { - this.closeHandler.add(closeHandler); - } - return this; - } - - // ------------------------------------------------------ api - - public void show() { - HTMLElement trigger = ap.trigger(); - if (!ap.visible() && trigger != null) { - if (ap.cssPositioning()) { - // CSS handles position-try-fallbacks; just apply preferred placement and show - ap.applyPlacement(placement == auto ? top : placement); - ap.show(); - } else { - // JS calculates the best placement via viewport measurements. - // For the calculation to work, the tooltip must be at least hidden - style("visibility", "hidden"); - ap.show(); - ap.applyBestPlacement(placement); - element().style.removeProperty("visibility"); - } - if (aria != none) { - trigger.setAttribute(aria.attribute, id); - } - } - } - - @Override - public void close(Event event, boolean fireEvent) { - if (shouldClose(this, closeHandler, event, fireEvent)) { - if (ap.visible()) { - ap.hide(); - HTMLElement trigger = ap.trigger(); - if (aria != none && trigger != null) { - trigger.removeAttribute(aria.attribute); - } - fireEvent(this, closeHandler, event, fireEvent); - } - } - } - - @Override - public String text() { - return Elements.textNode(contentElement); - } - - // ------------------------------------------------------ internal - - private void scheduleShow() { - cancelTimers(); - showTimeout = setTimeout(e -> show(), entryDelay); - } - - private void scheduleHide() { - cancelTimers(); - hideTimeout = setTimeout(e -> close(new Event(""), true), exitDelay); - } - - private void recalculatePlacement() { - if (ap.visible()) { - ap.applyBestPlacement(placement); - } - } - - private void cancelTimers() { - clearTimeout(showTimeout); - clearTimeout(hideTimeout); - } - -} diff --git a/components/src/main/java/org/patternfly/component/tooltip/PopperTooltip.java b/components/src/main/java/org/patternfly/component/tooltip/PopperTooltip.java new file mode 100644 index 000000000..eb6508cfe --- /dev/null +++ b/components/src/main/java/org/patternfly/component/tooltip/PopperTooltip.java @@ -0,0 +1,344 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.component.tooltip; + +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.List; +import java.util.Set; +import java.util.function.Supplier; + +import org.jboss.elemento.Attachable; +import org.jboss.elemento.By; +import org.jboss.elemento.ElementTextMethods; +import org.jboss.elemento.Elements; +import org.jboss.elemento.Id; +import org.jboss.elemento.logger.Logger; +import org.patternfly.component.BaseComponent; +import org.patternfly.component.Closeable; +import org.patternfly.component.ComponentType; +import org.patternfly.core.Roles; +import org.patternfly.handler.CloseHandler; +import org.patternfly.popper.Modifiers; +import org.patternfly.popper.Popper; +import org.patternfly.popper.PopperBuilder; +import org.patternfly.popper.TriggerAction; +import org.patternfly.style.Placement; + +import elemental2.dom.Event; +import elemental2.dom.HTMLDivElement; +import elemental2.dom.HTMLElement; +import elemental2.dom.MutationRecord; +import elemental2.dom.Node; + +import static elemental2.dom.DomGlobal.document; +import static java.util.Arrays.asList; +import static org.jboss.elemento.Elements.div; +import static org.jboss.elemento.Elements.isAttached; +import static org.jboss.elemento.Elements.isVisible; +import static org.patternfly.component.tooltip.TriggerAria.describedBy; +import static org.patternfly.component.tooltip.TriggerAria.none; +import static org.patternfly.core.Aria.live; +import static org.patternfly.core.Attributes.role; +import static org.patternfly.handler.CloseHandler.fireEvent; +import static org.patternfly.handler.CloseHandler.shouldClose; +import static org.patternfly.popper.TriggerAction.focus; +import static org.patternfly.popper.TriggerAction.mouseenter; +import static org.patternfly.style.Classes.arrow; +import static org.patternfly.style.Classes.component; +import static org.patternfly.style.Classes.content; +import static org.patternfly.style.Classes.modifier; +import static org.patternfly.style.Classes.textAlignLeft; +import static org.patternfly.style.Classes.tooltip; +import static org.patternfly.style.Placement.auto; +import static org.patternfly.style.Placement.top; + +/** + * A tooltip is in-app messaging used to identify elements on a page with short, clarifying text. + * + * @deprecated This implementation uses the Popper.js API, which is due to be removed soon. Use {@link Tooltip} instead. + */ +@Deprecated +public class PopperTooltip extends BaseComponent implements + Attachable, + Closeable, + ElementTextMethods { + + // ------------------------------------------------------ factory + + public static PopperTooltip tooltip() { + return new PopperTooltip(null, null); + } + + public static PopperTooltip tooltip(String text) { + return new PopperTooltip(null, text); + } + + public static PopperTooltip tooltip(By trigger) { + return new PopperTooltip(() -> Elements.querySelector(document.body, trigger), null); + } + + public static PopperTooltip tooltip(By trigger, String text) { + return new PopperTooltip(() -> Elements.querySelector(document.body, trigger), text); + } + + public static PopperTooltip tooltip(HTMLElement trigger) { + return new PopperTooltip(() -> trigger, null); + } + + public static PopperTooltip tooltip(HTMLElement trigger, String text) { + return new PopperTooltip(() -> trigger, text); + } + + public static PopperTooltip tooltip(Supplier trigger) { + return new PopperTooltip(trigger, null); + } + + public static PopperTooltip tooltip(Supplier trigger, String text) { + return new PopperTooltip(trigger, text); + } + + // ------------------------------------------------------ instance + + private static final Logger logger = Logger.getLogger(PopperTooltip.class.getName()); + + public static final int ANIMATION_DURATION = 300; + public static final int ENTRY_DELAY = 300; + public static final int EXIT_DELAY = 300; + public static final int DISTANCE = 15; + public static final int Z_INDEX = 9999; + + private final String id; + private final HTMLElement contentElement; + private final Set triggerActions; + private final List> closeHandler; + private Supplier trigger; + private boolean flip; + private int distance; + private int animationDuration; + private int entryDelay; + private int exitDelay; + private int zIndex; + private Popper popper; + private TriggerAria aria; + private Placement placement; + + PopperTooltip(Supplier trigger, String text) { + super(ComponentType.PopperTooltip, div().css(component(tooltip)) + .style("display", "none") + .attr(role, Roles.tooltip) + .aria(live, "polite") + .element()); + + this.id = Id.unique(componentType().id); + this.trigger = trigger; + this.triggerActions = EnumSet.of(mouseenter, focus); + this.closeHandler = new ArrayList<>(); + this.flip = true; + this.placement = top; + this.aria = describedBy; + this.zIndex = Z_INDEX; + this.distance = DISTANCE; + this.entryDelay = ENTRY_DELAY; + this.exitDelay = EXIT_DELAY; + this.animationDuration = ANIMATION_DURATION; + + id(id); + add(div().css(component(tooltip, arrow))); + add(contentElement = div().css(component(tooltip, content)).element()); + if (text != null) { + contentElement.textContent = text; + } + + Attachable.register(this, this); + } + + @Override + public void attach(MutationRecord mutationRecord) { + if (trigger != null) { + HTMLElement triggerElement = trigger.get(); + if (triggerElement != null) { + popper = new PopperBuilder(componentType().componentName, triggerElement, element()) + .animationDuration(animationDuration) + .entryDelay(entryDelay) + .exitDelay(exitDelay) + .zIndex(zIndex) + .placement(placement) + .addModifier(Modifiers.offset(distance), + Modifiers.noOverflow(), + Modifiers.hide(), + Modifiers.flip(placement == auto || flip), + Modifiers.placement(), + Modifiers.eventListeners(false)) + .registerHandler(triggerActions, this::show, this::close) + .removePopperOnTriggerDetach() + .build(); + } else { + logger.error("Unable to find trigger element for tooltip %o", element()); + } + } else { + logger.error("No trigger element defined for tooltip %o", element()); + } + } + + @Override + public void detach(MutationRecord mutationRecord) { + popper.cleanup(); + } + + // ------------------------------------------------------ builder + + public PopperTooltip appendToBody() { + return appendTo(document.body); + } + + public PopperTooltip appendTo(Node node) { + if (node != null) { + node.appendChild(element()); + } + return this; + } + + public PopperTooltip animationDuration(int animationDuration) { + this.animationDuration = animationDuration; + return this; + } + + public PopperTooltip distance(int distance) { + this.distance = distance; + return this; + } + + public PopperTooltip flip(boolean flip) { + this.flip = flip; + return this; + } + + public PopperTooltip entryDelay(int delay) { + this.entryDelay = delay; + return this; + } + + public PopperTooltip exitDelay(int delay) { + this.exitDelay = delay; + return this; + } + + public PopperTooltip leftAligned() { + contentElement.classList.add(modifier(textAlignLeft)); + return this; + } + + public PopperTooltip placement(Placement placement) { + if (placement == auto) { + flip = true; + } + this.placement = placement; + return this; + } + + @Override + public PopperTooltip text(String text) { + Elements.textNode(contentElement, text); + if (isAttached(this) && isVisible(this)) { + popper.update(); + } + return this; + } + + public PopperTooltip trigger(String trigger) { + return trigger(() -> Elements.querySelector(document.body, By.selector(trigger))); + } + + public PopperTooltip trigger(By trigger) { + return trigger(() -> Elements.querySelector(document.body, trigger)); + } + + public PopperTooltip trigger(HTMLElement trigger) { + return trigger(() -> trigger); + } + + public PopperTooltip trigger(Supplier trigger) { + this.trigger = trigger; + return this; + } + + public PopperTooltip triggerActions(TriggerAction... triggerActions) { + if (triggerActions != null) { + this.triggerActions.clear(); + this.triggerActions.addAll(asList(triggerActions)); + } + return this; + } + + public PopperTooltip zIndex(int zIndex) { + this.zIndex = zIndex; + return this; + } + + @Override + public PopperTooltip that() { + return this; + } + + // ------------------------------------------------------ aria + + public PopperTooltip aria(TriggerAria aria) { + this.aria = aria; + return this; + } + + // ------------------------------------------------------ events + + @Override + public PopperTooltip onClose(CloseHandler closeHandler) { + if (closeHandler != null) { + this.closeHandler.add(closeHandler); + } + return this; + } + + // ------------------------------------------------------ api + + public void show() { + show(new Event("")); + } + + public void show(Event event) { + popper.show(() -> { + if (aria != none && trigger.get() != null) { + trigger.get().setAttribute(aria.attribute, id); + } + }); + } + + @Override + public void close(Event event, boolean fireEvent) { + if (shouldClose(this, closeHandler, event, fireEvent)) { + popper.hide(() -> { + if (aria != none && trigger.get() != null) { + trigger.get().removeAttribute(aria.attribute); + } + fireEvent(this, closeHandler, event, fireEvent); + }); + } + } + + @Override + public String text() { + return Elements.textNode(contentElement); + } +} diff --git a/components/src/main/java/org/patternfly/component/tooltip/Tooltip.java b/components/src/main/java/org/patternfly/component/tooltip/Tooltip.java index e7d164e8e..fe02ac4e2 100644 --- a/components/src/main/java/org/patternfly/component/tooltip/Tooltip.java +++ b/components/src/main/java/org/patternfly/component/tooltip/Tooltip.java @@ -16,14 +16,14 @@ package org.patternfly.component.tooltip; import java.util.ArrayList; -import java.util.EnumSet; import java.util.List; -import java.util.Set; import java.util.function.Supplier; +import org.gwtproject.event.shared.HandlerRegistration; import org.jboss.elemento.Attachable; import org.jboss.elemento.By; -import org.jboss.elemento.ElementTextMethods; +import org.jboss.elemento.ElementContainerDelegate; +import org.jboss.elemento.ElementTextDelegate; import org.jboss.elemento.Elements; import org.jboss.elemento.Id; import org.jboss.elemento.logger.Logger; @@ -32,47 +32,57 @@ import org.patternfly.component.ComponentType; import org.patternfly.core.Roles; import org.patternfly.handler.CloseHandler; -import org.patternfly.popper.Modifiers; -import org.patternfly.popper.Placement; -import org.patternfly.popper.Popper; -import org.patternfly.popper.PopperBuilder; -import org.patternfly.popper.TriggerAction; +import org.patternfly.position.AnchorPositioning; +import org.patternfly.position.CssPositioning; +import org.patternfly.style.Classes; +import org.patternfly.style.Placement; +import elemental2.dom.Element; import elemental2.dom.Event; import elemental2.dom.HTMLDivElement; import elemental2.dom.HTMLElement; import elemental2.dom.MutationRecord; -import elemental2.dom.Node; +import static elemental2.dom.DomGlobal.clearTimeout; import static elemental2.dom.DomGlobal.document; -import static java.util.Arrays.asList; +import static elemental2.dom.DomGlobal.setTimeout; +import static org.gwtproject.event.shared.HandlerRegistrations.compose; import static org.jboss.elemento.Elements.div; -import static org.jboss.elemento.Elements.isAttached; -import static org.jboss.elemento.Elements.isVisible; +import static org.jboss.elemento.EventType.bind; +import static org.jboss.elemento.EventType.focusin; +import static org.jboss.elemento.EventType.focusout; +import static org.jboss.elemento.EventType.mouseenter; +import static org.jboss.elemento.EventType.mouseleave; +import static org.jboss.elemento.EventType.scroll; import static org.patternfly.component.tooltip.TriggerAria.describedBy; import static org.patternfly.component.tooltip.TriggerAria.none; import static org.patternfly.core.Aria.live; +import static org.patternfly.core.Attributes.popover; import static org.patternfly.core.Attributes.role; import static org.patternfly.handler.CloseHandler.fireEvent; import static org.patternfly.handler.CloseHandler.shouldClose; -import static org.patternfly.popper.Placement.auto; -import static org.patternfly.popper.Placement.top; -import static org.patternfly.popper.TriggerAction.focus; -import static org.patternfly.popper.TriggerAction.mouseenter; import static org.patternfly.style.Classes.arrow; import static org.patternfly.style.Classes.component; import static org.patternfly.style.Classes.content; import static org.patternfly.style.Classes.modifier; import static org.patternfly.style.Classes.textAlignLeft; import static org.patternfly.style.Classes.tooltip; +import static org.patternfly.style.Placement.auto; +import static org.patternfly.style.Placement.top; /** * A tooltip is in-app messaging used to identify elements on a page with short, clarifying text. + *

    + * This implementation uses the Popover API and CSS anchor positioning instead of Popper.js. The tooltip uses the browser's + * top-layer rendering for correct stacking, eliminating z-index issues. + * + * @see https://www.patternfly.org/components/tooltip */ public class Tooltip extends BaseComponent implements Attachable, Closeable, - ElementTextMethods { + ElementContainerDelegate, + ElementTextDelegate { // ------------------------------------------------------ factory @@ -112,80 +122,83 @@ public static Tooltip tooltip(Supplier trigger, String text) { private static final Logger logger = Logger.getLogger(Tooltip.class.getName()); - public static final int ANIMATION_DURATION = 300; + public static final int DISTANCE = 15; public static final int ENTRY_DELAY = 300; public static final int EXIT_DELAY = 300; - public static final int DISTANCE = 15; - public static final int Z_INDEX = 9999; private final String id; + private final AnchorPositioning ap; private final HTMLElement contentElement; - private final Set triggerActions; private final List> closeHandler; - private Supplier trigger; - private boolean flip; - private int distance; - private int animationDuration; + private int entryDelay; private int exitDelay; - private int zIndex; - private Popper popper; - private TriggerAria aria; + private double showTimeout; + private double hideTimeout; private Placement placement; + private TriggerAria aria; + private HandlerRegistration triggerHandlers; + private HandlerRegistration anchorHandlers; + private HandlerRegistration scrollHandler; Tooltip(Supplier trigger, String text) { - super(ComponentType.Tooltip, div().css(component(tooltip)) - .style("display", "none") + super(ComponentType.Tooltip, div().css(component(Classes.tooltip)) .attr(role, Roles.tooltip) .aria(live, "polite") + .attr(popover, "manual") .element()); this.id = Id.unique(componentType().id); - this.trigger = trigger; - this.triggerActions = EnumSet.of(mouseenter, focus); + this.ap = new AnchorPositioning(id, element(), trigger, DISTANCE, CssPositioning.tooltipEnabled(), false); this.closeHandler = new ArrayList<>(); - this.flip = true; - this.placement = top; - this.aria = describedBy; - this.zIndex = Z_INDEX; - this.distance = DISTANCE; + this.showTimeout = 0; + this.hideTimeout = 0; this.entryDelay = ENTRY_DELAY; this.exitDelay = EXIT_DELAY; - this.animationDuration = ANIMATION_DURATION; + this.placement = auto; + this.aria = describedBy; id(id); - add(div().css(component(tooltip, arrow))); - add(contentElement = div().css(component(tooltip, content)).element()); + element().appendChild(div().css(component(tooltip, arrow)).element()); + element().appendChild(contentElement = div().css(component(tooltip, content)).element()); if (text != null) { contentElement.textContent = text; } - Attachable.register(this, this); } + @Override + public Element containerDelegate() { + return contentElement; + } + + @Override + public Element textDelegate() { + return contentElement; + } + @Override public void attach(MutationRecord mutationRecord) { + HTMLElement trigger = ap.attach(); if (trigger != null) { - HTMLElement triggerElement = trigger.get(); - if (triggerElement != null) { - popper = new PopperBuilder(componentType().componentName, triggerElement, element()) - .animationDuration(animationDuration) - .entryDelay(entryDelay) - .exitDelay(exitDelay) - .zIndex(zIndex) - .placement(placement) - .addModifier(Modifiers.offset(distance), - Modifiers.noOverflow(), - Modifiers.hide(), - Modifiers.flip(placement == auto || flip), - Modifiers.placement(), - Modifiers.eventListeners(false)) - .registerHandler(triggerActions, this::show, this::close) - .removePopperOnTriggerDetach() - .build(); - } else { - logger.error("Unable to find trigger element for tooltip %o", element()); + // top is the default for auto and recalculated on show() + ap.applyPlacement(placement == auto ? top : placement); + + triggerHandlers = compose( + bind(trigger, mouseenter, e -> scheduleShow()), + bind(trigger, mouseleave, e -> scheduleHide()), + bind(trigger, focusin, e -> scheduleShow()), + bind(trigger, focusout, e -> scheduleHide())); + anchorHandlers = compose( + bind(element(), mouseenter, e -> cancelTimers()), + bind(element(), mouseleave, e -> scheduleHide())); + + if (!ap.cssPositioning()) { + scrollHandler = bind(document, scroll, true, e -> recalculatePlacement()); } + + } else if (ap.hasTriggerSupplier()) { + logger.error("Unable to find trigger element for tooltip %o", element()); } else { logger.error("No trigger element defined for tooltip %o", element()); } @@ -193,34 +206,26 @@ public void attach(MutationRecord mutationRecord) { @Override public void detach(MutationRecord mutationRecord) { - popper.cleanup(); - } - - // ------------------------------------------------------ builder - - public Tooltip appendToBody() { - return appendTo(document.body); - } - - public Tooltip appendTo(Node node) { - if (node != null) { - node.appendChild(element()); + cancelTimers(); + if (ap.visible()) { + ap.hide(); } - return this; + if (scrollHandler != null) { + scrollHandler.removeHandler(); + } + if (anchorHandlers != null) { + anchorHandlers.removeHandler(); + } + if (triggerHandlers != null) { + triggerHandlers.removeHandler(); + } + ap.detach(); } - public Tooltip animationDuration(int animationDuration) { - this.animationDuration = animationDuration; - return this; - } + // ------------------------------------------------------ builder public Tooltip distance(int distance) { - this.distance = distance; - return this; - } - - public Tooltip flip(boolean flip) { - this.flip = flip; + ap.distance(distance); return this; } @@ -240,49 +245,27 @@ public Tooltip leftAligned() { } public Tooltip placement(Placement placement) { - if (placement == auto) { - flip = true; - } this.placement = placement; return this; } - @Override - public Tooltip text(String text) { - Elements.textNode(contentElement, text); - if (isAttached(this) && isVisible(this)) { - popper.update(); - } - return this; - } - public Tooltip trigger(String trigger) { - return trigger(() -> Elements.querySelector(document.body, By.selector(trigger))); + ap.trigger(trigger); + return this; } public Tooltip trigger(By trigger) { - return trigger(() -> Elements.querySelector(document.body, trigger)); - } - - public Tooltip trigger(HTMLElement trigger) { - return trigger(() -> trigger); - } - - public Tooltip trigger(Supplier trigger) { - this.trigger = trigger; + ap.trigger(trigger); return this; } - public Tooltip triggerActions(TriggerAction... triggerActions) { - if (triggerActions != null) { - this.triggerActions.clear(); - this.triggerActions.addAll(asList(triggerActions)); - } + public Tooltip trigger(HTMLElement trigger) { + ap.trigger(trigger); return this; } - public Tooltip zIndex(int zIndex) { - this.zIndex = zIndex; + public Tooltip trigger(Supplier trigger) { + ap.trigger(trigger); return this; } @@ -311,26 +294,37 @@ public Tooltip onClose(CloseHandler closeHandler) { // ------------------------------------------------------ api public void show() { - show(new Event("")); - } - - public void show(Event event) { - popper.show(() -> { - if (aria != none && trigger.get() != null) { - trigger.get().setAttribute(aria.attribute, id); + HTMLElement trigger = ap.trigger(); + if (!ap.visible() && trigger != null) { + if (ap.cssPositioning()) { + // CSS handles position-try-fallbacks; just apply preferred placement and show + ap.applyPlacement(placement == auto ? top : placement); + ap.show(); + } else { + // JS calculates the best placement via viewport measurements. + // For the calculation to work, the tooltip must be at least hidden + style("visibility", "hidden"); + ap.show(); + ap.applyBestPlacement(placement); + element().style.removeProperty("visibility"); } - }); + if (aria != none) { + trigger.setAttribute(aria.attribute, id); + } + } } @Override public void close(Event event, boolean fireEvent) { if (shouldClose(this, closeHandler, event, fireEvent)) { - popper.hide(() -> { - if (aria != none && trigger.get() != null) { - trigger.get().removeAttribute(aria.attribute); + if (ap.visible()) { + ap.hide(); + HTMLElement trigger = ap.trigger(); + if (aria != none && trigger != null) { + trigger.removeAttribute(aria.attribute); } fireEvent(this, closeHandler, event, fireEvent); - }); + } } } @@ -338,4 +332,28 @@ public void close(Event event, boolean fireEvent) { public String text() { return Elements.textNode(contentElement); } + + // ------------------------------------------------------ internal + + private void scheduleShow() { + cancelTimers(); + showTimeout = setTimeout(e -> show(), entryDelay); + } + + private void scheduleHide() { + cancelTimers(); + hideTimeout = setTimeout(e -> close(new Event(""), true), exitDelay); + } + + private void recalculatePlacement() { + if (ap.visible()) { + ap.applyBestPlacement(placement); + } + } + + private void cancelTimers() { + clearTimeout(showTimeout); + clearTimeout(hideTimeout); + } + } diff --git a/components/src/main/java/org/patternfly/component/tooltip/TooltipToggle.java b/components/src/main/java/org/patternfly/component/tooltip/TooltipToggle.java index bcbf92d5a..40dfd8df9 100644 --- a/components/src/main/java/org/patternfly/component/tooltip/TooltipToggle.java +++ b/components/src/main/java/org/patternfly/component/tooltip/TooltipToggle.java @@ -21,6 +21,7 @@ import elemental2.dom.HTMLElement; +import static elemental2.dom.DomGlobal.document; import static elemental2.dom.DomGlobal.setTimeout; import static org.jboss.elemento.Elements.failSafeRemoveFromParent; import static org.patternfly.component.tooltip.Tooltip.tooltip; @@ -49,7 +50,8 @@ public void eval(Consumer afterEnable, Consumer beforeDisable) if (tooltip == null) { // no tooltip -> create logger.debug("Tooltip toggle enabled for %o", textElement); - tooltip = tooltip(textElement, textElement.textContent).appendToBody(); + tooltip = tooltip(textElement, textElement.textContent); + document.body.appendChild(tooltip.element()); } else { // just update text tooltip.text(textElement.textContent); diff --git a/components/src/main/java/org/patternfly/componentgroup/theme/ThemeSelector.java b/components/src/main/java/org/patternfly/componentgroup/theme/ThemeSelector.java index c9d4b1996..d913385b4 100644 --- a/components/src/main/java/org/patternfly/componentgroup/theme/ThemeSelector.java +++ b/components/src/main/java/org/patternfly/componentgroup/theme/ThemeSelector.java @@ -21,9 +21,10 @@ import org.patternfly.component.ComponentType; import org.patternfly.component.menu.MenuContent; import org.patternfly.component.menu.MenuToggle; -import org.patternfly.component.menu.NativeSingleSelect; +import org.patternfly.component.menu.SingleSelect; import org.patternfly.component.togglegroup.ToggleGroup; -import org.patternfly.popper.Placement; +import org.patternfly.style.Placement; + import elemental2.dom.HTMLElement; import elemental2.dom.MutationRecord; @@ -35,7 +36,7 @@ import static org.patternfly.component.menu.MenuItem.menuItem; import static org.patternfly.component.menu.MenuList.menuList; import static org.patternfly.component.menu.MenuToggle.menuToggle; -import static org.patternfly.component.menu.NativeSingleSelect.nativeSingleSelect; +import static org.patternfly.component.menu.SingleSelect.singleSelect; import static org.patternfly.component.menu.SingleSelectMenu.singleSelectMenu; import static org.patternfly.component.togglegroup.ToggleGroup.toggleGroup; import static org.patternfly.component.togglegroup.ToggleGroupItem.toggleGroupItem; @@ -62,7 +63,7 @@ public static ThemeSelector themeSelector(String storagePrefix) { private static final String CONTRAST_KEY = "contrast"; private final ThemeManager colorManager; private final ThemeManager contrastManager; - private final NativeSingleSelect singleSelect; + private final SingleSelect singleSelect; private final MenuContent menuContent; private boolean hasContrast; @@ -92,7 +93,7 @@ public static ThemeSelector themeSelector(String storagePrefix) { .description(color.description) .store(COLOR_KEY, color)))); MenuToggle menuToggle = menuToggle().icon(colorManager.value.icon()); - singleSelect = nativeSingleSelect(menuToggle) + singleSelect = singleSelect(menuToggle) .noDefaultSelectHandler() .addMenu(singleSelectMenu() .onSingleSelect((e, menuItem, selected) -> { diff --git a/core/npm/core.css b/core/npm/core.css index 97337bb50..ba16f5456 100644 --- a/core/npm/core.css +++ b/core/npm/core.css @@ -103,6 +103,8 @@ .pf-v6-c-popover[popover] { inset: auto; max-width: var(--pf-v6-c-popover--MaxWidth); + /* Reset font-weight for popovers nested inside bold containers (e.g. description list terms) */ + font-weight: var(--pf-t--global--font--weight--body--default, 400); } /* =================================================================== diff --git a/core/src/main/java/org/patternfly/popper/FirstUpdateFn.java b/core/src/main/java/org/patternfly/popper/FirstUpdateFn.java index 1e0969f5e..5ae6b5270 100644 --- a/core/src/main/java/org/patternfly/popper/FirstUpdateFn.java +++ b/core/src/main/java/org/patternfly/popper/FirstUpdateFn.java @@ -17,6 +17,7 @@ import jsinterop.annotations.JsFunction; +@Deprecated @JsFunction @FunctionalInterface public interface FirstUpdateFn { diff --git a/core/src/main/java/org/patternfly/popper/Modifier.java b/core/src/main/java/org/patternfly/popper/Modifier.java index c689b6e6f..e28aaacac 100644 --- a/core/src/main/java/org/patternfly/popper/Modifier.java +++ b/core/src/main/java/org/patternfly/popper/Modifier.java @@ -19,6 +19,7 @@ import static jsinterop.annotations.JsPackage.GLOBAL; +@Deprecated @JsType(isNative = true, namespace = GLOBAL, name = "Object") public class Modifier { diff --git a/core/src/main/java/org/patternfly/popper/ModifierArguments.java b/core/src/main/java/org/patternfly/popper/ModifierArguments.java index e1b264b76..f004f8d3f 100644 --- a/core/src/main/java/org/patternfly/popper/ModifierArguments.java +++ b/core/src/main/java/org/patternfly/popper/ModifierArguments.java @@ -19,6 +19,7 @@ import static jsinterop.annotations.JsPackage.GLOBAL; +@Deprecated @JsType(isNative = true, namespace = GLOBAL, name = "Object") public class ModifierArguments { diff --git a/core/src/main/java/org/patternfly/popper/ModifierFn.java b/core/src/main/java/org/patternfly/popper/ModifierFn.java index 038928358..1037fd8eb 100644 --- a/core/src/main/java/org/patternfly/popper/ModifierFn.java +++ b/core/src/main/java/org/patternfly/popper/ModifierFn.java @@ -17,6 +17,7 @@ import jsinterop.annotations.JsFunction; +@Deprecated @JsFunction @FunctionalInterface public interface ModifierFn { diff --git a/core/src/main/java/org/patternfly/popper/ModifierOptions.java b/core/src/main/java/org/patternfly/popper/ModifierOptions.java index 782d48ce9..ee5be490f 100644 --- a/core/src/main/java/org/patternfly/popper/ModifierOptions.java +++ b/core/src/main/java/org/patternfly/popper/ModifierOptions.java @@ -19,6 +19,7 @@ import static jsinterop.annotations.JsPackage.GLOBAL; +@Deprecated @JsType(isNative = true, namespace = GLOBAL, name = "Object") public class ModifierOptions { diff --git a/core/src/main/java/org/patternfly/popper/ModifierPhase.java b/core/src/main/java/org/patternfly/popper/ModifierPhase.java index b73cd631c..7d05ab996 100644 --- a/core/src/main/java/org/patternfly/popper/ModifierPhase.java +++ b/core/src/main/java/org/patternfly/popper/ModifierPhase.java @@ -15,6 +15,7 @@ */ package org.patternfly.popper; +@Deprecated public enum ModifierPhase { beforeRead, diff --git a/core/src/main/java/org/patternfly/popper/Modifiers.java b/core/src/main/java/org/patternfly/popper/Modifiers.java index f870172b5..3a762eff2 100644 --- a/core/src/main/java/org/patternfly/popper/Modifiers.java +++ b/core/src/main/java/org/patternfly/popper/Modifiers.java @@ -15,9 +15,12 @@ */ package org.patternfly.popper; +import org.patternfly.style.Placement; + import elemental2.dom.CSSProperties.MinWidthUnionType; import elemental2.dom.HTMLElement; +@Deprecated public interface Modifiers { static Modifier widths() { diff --git a/core/src/main/java/org/patternfly/popper/Options.java b/core/src/main/java/org/patternfly/popper/Options.java index 33d144cca..ab5d2b0e8 100644 --- a/core/src/main/java/org/patternfly/popper/Options.java +++ b/core/src/main/java/org/patternfly/popper/Options.java @@ -20,6 +20,7 @@ import static jsinterop.annotations.JsPackage.GLOBAL; +@Deprecated @JsType(isNative = true, namespace = GLOBAL, name = "Object") public class Options { diff --git a/core/src/main/java/org/patternfly/popper/Popper.java b/core/src/main/java/org/patternfly/popper/Popper.java index 3e299c3df..b2e1244a9 100644 --- a/core/src/main/java/org/patternfly/popper/Popper.java +++ b/core/src/main/java/org/patternfly/popper/Popper.java @@ -19,6 +19,7 @@ import elemental2.promise.Promise; +@Deprecated public interface Popper { int UNDEFINED = -1; diff --git a/core/src/main/java/org/patternfly/popper/PopperBuilder.java b/core/src/main/java/org/patternfly/popper/PopperBuilder.java index dfe53c9ff..a92bca391 100644 --- a/core/src/main/java/org/patternfly/popper/PopperBuilder.java +++ b/core/src/main/java/org/patternfly/popper/PopperBuilder.java @@ -24,6 +24,7 @@ import org.gwtproject.event.shared.HandlerRegistration; import org.jboss.elemento.EventType; import org.jboss.elemento.logger.Logger; +import org.patternfly.style.Placement; import elemental2.core.JsArray; import elemental2.dom.CSSProperties; @@ -41,8 +42,9 @@ import static org.jboss.elemento.Elements.onDetach; import static org.jboss.elemento.EventType.bind; import static org.jboss.elemento.Key.Escape; -import static org.patternfly.popper.Placement.auto; +import static org.patternfly.style.Placement.auto; +@Deprecated public class PopperBuilder { private static final Logger logger = Logger.getLogger(PopperBuilder.class.getName()); diff --git a/core/src/main/java/org/patternfly/popper/PopperError.java b/core/src/main/java/org/patternfly/popper/PopperError.java index febccf24c..349d2ac89 100644 --- a/core/src/main/java/org/patternfly/popper/PopperError.java +++ b/core/src/main/java/org/patternfly/popper/PopperError.java @@ -20,6 +20,7 @@ import elemental2.promise.Promise; +@Deprecated public class PopperError implements Popper { private static final Logger logger = Logger.getLogger(PopperError.class.getName()); diff --git a/core/src/main/java/org/patternfly/popper/PopperImpl.java b/core/src/main/java/org/patternfly/popper/PopperImpl.java index 0da90851b..39100f088 100644 --- a/core/src/main/java/org/patternfly/popper/PopperImpl.java +++ b/core/src/main/java/org/patternfly/popper/PopperImpl.java @@ -31,6 +31,7 @@ /** * Wrapper around {@link PopperJs} */ +@Deprecated public class PopperImpl implements Popper { private final PopperJs popper; diff --git a/core/src/main/java/org/patternfly/popper/PopperJs.java b/core/src/main/java/org/patternfly/popper/PopperJs.java index 419573399..c80930f28 100644 --- a/core/src/main/java/org/patternfly/popper/PopperJs.java +++ b/core/src/main/java/org/patternfly/popper/PopperJs.java @@ -27,6 +27,7 @@ * * @see https://popper.js.org/docs/v2/ */ +@Deprecated @JsType(isNative = true, name = "Popper", namespace = GLOBAL) class PopperJs { diff --git a/core/src/main/java/org/patternfly/popper/Rect.java b/core/src/main/java/org/patternfly/popper/Rect.java index cb962b5c6..a92e47960 100644 --- a/core/src/main/java/org/patternfly/popper/Rect.java +++ b/core/src/main/java/org/patternfly/popper/Rect.java @@ -19,6 +19,7 @@ import static jsinterop.annotations.JsPackage.GLOBAL; +@Deprecated @JsType(isNative = true, namespace = GLOBAL, name = "Object") public class Rect { diff --git a/core/src/main/java/org/patternfly/popper/State.java b/core/src/main/java/org/patternfly/popper/State.java index bfb7ce03a..8264cfd44 100644 --- a/core/src/main/java/org/patternfly/popper/State.java +++ b/core/src/main/java/org/patternfly/popper/State.java @@ -19,6 +19,7 @@ import static jsinterop.annotations.JsPackage.GLOBAL; +@Deprecated @JsType(isNative = true, namespace = GLOBAL, name = "Object") public class State { diff --git a/core/src/main/java/org/patternfly/popper/StateElements.java b/core/src/main/java/org/patternfly/popper/StateElements.java index 2d33bbcea..119efa684 100644 --- a/core/src/main/java/org/patternfly/popper/StateElements.java +++ b/core/src/main/java/org/patternfly/popper/StateElements.java @@ -20,6 +20,7 @@ import static jsinterop.annotations.JsPackage.GLOBAL; +@Deprecated @JsType(isNative = true, namespace = GLOBAL, name = "Object") public class StateElements { diff --git a/core/src/main/java/org/patternfly/popper/StateRects.java b/core/src/main/java/org/patternfly/popper/StateRects.java index 45c2ec449..fc9794e4e 100644 --- a/core/src/main/java/org/patternfly/popper/StateRects.java +++ b/core/src/main/java/org/patternfly/popper/StateRects.java @@ -19,6 +19,7 @@ import static jsinterop.annotations.JsPackage.GLOBAL; +@Deprecated @JsType(isNative = true, namespace = GLOBAL, name = "Object") public class StateRects { diff --git a/core/src/main/java/org/patternfly/popper/StyleDefinitions.java b/core/src/main/java/org/patternfly/popper/StyleDefinitions.java index 7b14ff936..116dcb6b7 100644 --- a/core/src/main/java/org/patternfly/popper/StyleDefinitions.java +++ b/core/src/main/java/org/patternfly/popper/StyleDefinitions.java @@ -20,6 +20,7 @@ import static jsinterop.annotations.JsPackage.GLOBAL; +@Deprecated @JsType(isNative = true, namespace = GLOBAL, name = "Object") public class StyleDefinitions { diff --git a/core/src/main/java/org/patternfly/popper/TriggerAction.java b/core/src/main/java/org/patternfly/popper/TriggerAction.java index 803dae0fd..fcc408484 100644 --- a/core/src/main/java/org/patternfly/popper/TriggerAction.java +++ b/core/src/main/java/org/patternfly/popper/TriggerAction.java @@ -15,6 +15,7 @@ */ package org.patternfly.popper; +@Deprecated public enum TriggerAction { mouseenter, diff --git a/core/src/main/java/org/patternfly/popper/UpdateOptionsFn.java b/core/src/main/java/org/patternfly/popper/UpdateOptionsFn.java index 5d0fef148..10857681f 100644 --- a/core/src/main/java/org/patternfly/popper/UpdateOptionsFn.java +++ b/core/src/main/java/org/patternfly/popper/UpdateOptionsFn.java @@ -17,6 +17,7 @@ import jsinterop.annotations.JsFunction; +@Deprecated @JsFunction @FunctionalInterface public interface UpdateOptionsFn { diff --git a/core/src/main/java/org/patternfly/popper/package-info.java b/core/src/main/java/org/patternfly/popper/package-info.java deleted file mode 100644 index 0e7c5a0b9..000000000 --- a/core/src/main/java/org/patternfly/popper/package-info.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright 2023 Red Hat - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Java wrapper for Popper.js positioning engine used by overlay components. - * - *

    This package provides a type-safe Java API for Popper.js, the positioning - * library used by PatternFly components with popups, tooltips, dropdowns, and other floating elements. It handles - * automatic positioning, collision detection, and dynamic updates. - * - *

    Key Classes

    - * - *
      - *
    • {@link org.patternfly.popper.Popper} - Main interface for controlling popper instances
    • - *
    • {@link org.patternfly.popper.PopperBuilder} - Builder for configuring and creating popper instances
    • - *
    • {@link org.patternfly.popper.Placement} - Enum of placement options (top, bottom, left, right, etc.)
    • - *
    • {@link org.patternfly.popper.Modifier} - Configuration for Popper.js modifiers
    • - *
    • {@link org.patternfly.popper.TriggerAction} - Enum of trigger events (click, hover, focus, etc.)
    • - *
    • {@link org.patternfly.popper.Options} - Configuration options for popper behavior
    • - *
    • {@link org.patternfly.popper.State} - Current state of the popper including position and styles
    • - *
    - * - *

    Basic Usage

    - * - *

    Create a popper to position a floating element relative to a trigger element: - * - * {@snippet : - * HTMLElement trigger = button().element(); - * HTMLElement popup = div().element(); - * - * Popper popper = new PopperBuilder("MyComponent", trigger, popup) - * .placement(Placement.bottom) - * .zIndex(1000) - * .registerHandler(Set.of(TriggerAction.click), - * e -> popper.show(() -> console.log("Visible")), - * e -> popper.hide(() -> console.log("Hidden"))) - * .build(); - * } - * - *

    Placement Options

    - * - *

    Control where the popper appears relative to the trigger element: - * - * {@snippet : - * // Automatic placement (Popper chooses the best position) - * popper = builder.placement(Placement.auto).build(); - * - * // Fixed placement - * popper = builder.placement(Placement.top).build(); - * popper = builder.placement(Placement.bottomStart).build(); - * popper = builder.placement(Placement.rightEnd).build(); - * } - * - *

    Trigger Actions

    - * - *

    Configure how the popper responds to user interactions: - * - * {@snippet : - * // Show on hover - * builder.registerHandler(Set.of(TriggerAction.mouseenter), show, hide); - * - * // Show on click, hide when clicking outside - * builder.registerHandler(Set.of(TriggerAction.click), show, hide); - * - * // Show on focus (for keyboard navigation) - * builder.registerHandler(Set.of(TriggerAction.focus), show, hide); - * - * // Stay open even when clicking inside (e.g., for menus) - * builder.registerHandler(Set.of(TriggerAction.stayOpen), show, hide); - * - * // Manual control only - * builder.registerHandler(Set.of(TriggerAction.manual), show, hide); - * } - * - *

    Animation and Timing

    - * - *

    Configure entrance/exit animations and delays: - * - * {@snippet : - * Popper popper = new PopperBuilder(componentName, trigger, popup) - * .animationDuration(300) // Fade in/out over 300ms - * .entryDelay(500) // Wait 500ms before showing - * .exitDelay(200) // Wait 200ms before hiding - * .build(); - * } - * - *

    Modifiers

    - * - *

    Customize Popper.js behavior with modifiers: - * - * {@snippet : - * // Add offset from trigger element - * Modifier offset = new Modifier(); - * offset.name = "offset"; - * offset.options = new ModifierOptions(); - * offset.options.offset = new int[]{0, 8}; // [skidding, distance] - * - * Popper popper = new PopperBuilder(componentName, trigger, popup) - * .addModifier(offset) - * .build(); - * } - * - *

    Controlling Visibility

    - * - *

    Programmatically show and hide the popper: - * - * {@snippet : - * // Show with callback - * popper.show(() -> console.log("Popper is now visible")); - * - * // Hide with callback - * popper.hide(() -> console.log("Popper is now hidden")); - * - * // Update position (e.g., after content changes) - * popper.update().then(state -> console.log("Updated to: " + state.placement)); - * - * // Clean up when done - * popper.cleanup(); - * } - * - *

    Lifecycle Management

    - * - *

    The {@link org.patternfly.popper.PopperBuilder} provides lifecycle management options: - * - * {@snippet : - * builder - * .removePopperOnTriggerDetach() // Auto-cleanup when trigger is removed from DOM - * .stayOpen(event -> { // Custom logic for keeping popper open - * return popup.contains((Node) event.target); - * }); - * } - * - * @see Popper.js Documentation - * @see org.patternfly.popper.Popper - * @see org.patternfly.popper.PopperBuilder - */ -package org.patternfly.popper; \ No newline at end of file diff --git a/core/src/main/java/org/patternfly/position/AnchorPositioning.java b/core/src/main/java/org/patternfly/position/AnchorPositioning.java index 9fd46d03c..64367cc5f 100644 --- a/core/src/main/java/org/patternfly/position/AnchorPositioning.java +++ b/core/src/main/java/org/patternfly/position/AnchorPositioning.java @@ -20,24 +20,28 @@ import org.jboss.elemento.By; import org.jboss.elemento.Elements; import org.jboss.elemento.logger.Logger; -import org.patternfly.popper.Placement; import org.patternfly.style.Classes; +import org.patternfly.style.Placement; + import elemental2.dom.DOMRect; import elemental2.dom.HTMLElement; import static elemental2.dom.DomGlobal.document; import static elemental2.dom.DomGlobal.window; -import static org.patternfly.popper.Placement.auto; -import static org.patternfly.popper.Placement.bottom; -import static org.patternfly.popper.Placement.left; -import static org.patternfly.popper.Placement.right; -import static org.patternfly.popper.Placement.top; import static org.patternfly.style.Classes.modifier; +import static org.patternfly.style.Placement.auto; +import static org.patternfly.style.Placement.bottom; +import static org.patternfly.style.Placement.left; +import static org.patternfly.style.Placement.right; +import static org.patternfly.style.Placement.top; import static org.patternfly.style.TypedModifier.swap; /** * Shared anchor positioning logic for components based on the native popover API and CSS anchor positioning. Manages trigger * resolution, CSS anchor setup/teardown, and placement CSS class toggling. + *

    + * This class has a {@link #show()} and {@link #hide()} method that delegates to the Popover API, but it does not register any + * event listeners. That is left to the component that uses this class. * * @see https://developer.mozilla.org/en-US/docs/Web/API/Popover_API diff --git a/core/src/main/java/org/patternfly/popper/Placement.java b/core/src/main/java/org/patternfly/style/Placement.java similarity index 95% rename from core/src/main/java/org/patternfly/popper/Placement.java rename to core/src/main/java/org/patternfly/style/Placement.java index 978cc39b3..86451cb07 100644 --- a/core/src/main/java/org/patternfly/popper/Placement.java +++ b/core/src/main/java/org/patternfly/style/Placement.java @@ -13,13 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.patternfly.popper; +package org.patternfly.style; import java.util.Arrays; -import org.patternfly.style.Classes; -import org.patternfly.style.TypedModifier; - public enum Placement implements TypedModifier { auto("auto", ""), diff --git a/extensions/codeeditor/src/main/java/org/patternfly/extension/codeeditor/CodeEditorAction.java b/extensions/codeeditor/src/main/java/org/patternfly/extension/codeeditor/CodeEditorAction.java index e351cdc09..7eecf42d4 100644 --- a/extensions/codeeditor/src/main/java/org/patternfly/extension/codeeditor/CodeEditorAction.java +++ b/extensions/codeeditor/src/main/java/org/patternfly/extension/codeeditor/CodeEditorAction.java @@ -20,7 +20,7 @@ import org.patternfly.component.ComponentIcon; import org.patternfly.component.ComponentType; import org.patternfly.component.button.Button; -import org.patternfly.component.tooltip.NativeTooltip; +import org.patternfly.component.tooltip.Tooltip; import org.patternfly.core.Aria; import org.patternfly.handler.ComponentHandler; import org.patternfly.icon.PredefinedIcon; @@ -32,7 +32,7 @@ import static org.jboss.elemento.Elements.div; import static org.jboss.elemento.EventType.click; import static org.patternfly.component.button.Button.button; -import static org.patternfly.component.tooltip.NativeTooltip.nativeTooltip; +import static org.patternfly.component.tooltip.Tooltip.tooltip; import static org.patternfly.icon.IconSets.fas.copy; public class CodeEditorAction extends CodeEditorSubComponent @@ -62,7 +62,7 @@ public static CodeEditorAction codeEditorCopyToClipboardAction() { public static CodeEditorAction codeEditorCopyToClipboardAction(String copyText, String copiedText) { String copyId = Id.unique(ComponentType.CodeEditor.id, "copy"); - NativeTooltip copyTooltip = nativeTooltip(By.id(copyId), copyText) + Tooltip copyTooltip = tooltip(By.id(copyId), copyText) .onClose((e, t) -> t.text(copyText)); // restore text return new CodeEditorAction(button().id(copyId).icon(copy()).plain()) .ariaLabel(copyText) diff --git a/showcase/src/main/java/org/patternfly/showcase/BuildingBlocks.java b/showcase/src/main/java/org/patternfly/showcase/BuildingBlocks.java index fef8bbd5d..9e0558347 100644 --- a/showcase/src/main/java/org/patternfly/showcase/BuildingBlocks.java +++ b/showcase/src/main/java/org/patternfly/showcase/BuildingBlocks.java @@ -19,33 +19,20 @@ import org.patternfly.component.menu.Dropdown; import static org.patternfly.component.menu.Dropdown.dropdown; -import static org.patternfly.component.menu.DropdownMenu.dropdownMenu; -import static org.patternfly.component.menu.MenuContent.menuContent; import static org.patternfly.component.menu.MenuItem.linkMenuItem; import static org.patternfly.component.menu.MenuItem.menuItem; -import static org.patternfly.component.menu.MenuList.menuList; import static org.patternfly.icon.IconSets.fas.ellipsisV; public class BuildingBlocks { public static Dropdown mixedKebab(String baseId) { - return dropdown(ellipsisV(), "Column actions") - .addMenu(dropdownMenu() - .addContent(menuContent() - .addList(menuList() - .addItem(menuItem(Id.build(baseId, "item-0"), "Action")) - .addItem(linkMenuItem(Id.build(baseId, "item-1"), - "Link", "#" + Id.build(baseId, "item-1"))) - .addItem(menuItem(Id.build(baseId, "item-2"), - "Disabled action") - .disabled()) - .addItem(linkMenuItem(Id.build(baseId, "item-3"), - "Disabled link", "#" + Id.build(baseId, "item-3")) - .disabled()) - .addDivider() - .addItem(menuItem(Id.build(baseId, "item-4"), - "Separated action")) - .addItem(linkMenuItem(Id.build(baseId, "item-5"), - "Separated link", "#" + Id.build(baseId, "item-5")))))); + return dropdown(ellipsisV(), "Column actions").applyToMenuList(list -> list + .addItem(menuItem(Id.build(baseId, "item-0"), "Action")) + .addItem(linkMenuItem(Id.build(baseId, "item-1"), "Link", "#" + Id.build(baseId, "item-1"))) + .addItem(menuItem(Id.build(baseId, "item-2"), "Disabled action").disabled()) + .addItem(linkMenuItem(Id.build(baseId, "item-3"), "Disabled link", "#" + Id.build(baseId, "item-3")).disabled()) + .addDivider() + .addItem(menuItem(Id.build(baseId, "item-4"), "Separated action")) + .addItem(linkMenuItem(Id.build(baseId, "item-5"), "Separated link", "#" + Id.build(baseId, "item-5")))); } } diff --git a/showcase/src/main/java/org/patternfly/showcase/Showcase.java b/showcase/src/main/java/org/patternfly/showcase/Showcase.java index a429bb584..d65663d57 100644 --- a/showcase/src/main/java/org/patternfly/showcase/Showcase.java +++ b/showcase/src/main/java/org/patternfly/showcase/Showcase.java @@ -52,7 +52,6 @@ import static org.patternfly.component.toolbar.ToolbarItem.toolbarItem; import static org.patternfly.componentgroup.theme.ThemeSelector.themeSelector; import static org.patternfly.icon.IconSets.fab.github; -import static org.patternfly.popper.Placement.bottomEnd; import static org.patternfly.showcase.Data.charts; import static org.patternfly.showcase.Data.extensions; import static org.patternfly.showcase.Data.groupComponents; @@ -62,6 +61,7 @@ import static org.patternfly.style.Classes.fullHeight; import static org.patternfly.style.Classes.modifier; import static org.patternfly.style.Classes.static_; +import static org.patternfly.style.Placement.bottomEnd; import static org.patternfly.style.Variable.componentVar; import static org.patternfly.style.Variables.Height; diff --git a/showcase/src/main/java/org/patternfly/showcase/Snippet.java b/showcase/src/main/java/org/patternfly/showcase/Snippet.java index fda7870a8..a4cb802b0 100644 --- a/showcase/src/main/java/org/patternfly/showcase/Snippet.java +++ b/showcase/src/main/java/org/patternfly/showcase/Snippet.java @@ -21,7 +21,6 @@ import org.jboss.elemento.Id; import org.jboss.elemento.IsElement; import org.patternfly.component.content.Content; -import org.patternfly.component.tooltip.NativeTooltip; import org.patternfly.extension.codeeditor.CodeEditor; import org.patternfly.icon.IconSets; import org.patternfly.style.Classes; @@ -37,6 +36,7 @@ import static org.patternfly.component.content.Content.content; import static org.patternfly.component.content.ContentType.h3; import static org.patternfly.component.content.ContentType.p; +import static org.patternfly.component.tooltip.Tooltip.tooltip; import static org.patternfly.core.Aria.hidden; import static org.patternfly.core.Attributes.tabindex; import static org.patternfly.extension.codeeditor.CodeEditor.codeEditor; @@ -114,7 +114,7 @@ public Snippet(String id, String title, Content description, String code, By.classname(component(Classes.codeEditor, main))); setVisible(mainElement, !isVisible(mainElement)); })) - .add(NativeTooltip.nativeTooltip(By.id(codeId), "Toggle Java code")) + .add(tooltip(By.id(codeId), "Toggle Java code")) .addAction( codeEditorCopyToClipboardAction("Copy code to clipboard", "Code copied") .css("ws-code-editor-control")) @@ -122,7 +122,7 @@ public Snippet(String id, String title, Content description, String code, .id(undoId) .css("ws-code-editor-control") .onClick((event, codeEditorAction) -> undo())) - .add(NativeTooltip.nativeTooltip(By.id(undoId), "Undo")))) + .add(tooltip(By.id(undoId), "Undo")))) .code(code))) .element(); diff --git a/showcase/src/main/java/org/patternfly/showcase/SnippetPage.java b/showcase/src/main/java/org/patternfly/showcase/SnippetPage.java index 443722f62..985c3c866 100644 --- a/showcase/src/main/java/org/patternfly/showcase/SnippetPage.java +++ b/showcase/src/main/java/org/patternfly/showcase/SnippetPage.java @@ -70,7 +70,6 @@ import static org.patternfly.layout.flex.Flex.flex; import static org.patternfly.layout.flex.SpaceItems.sm; import static org.patternfly.layout.stack.Stack.stack; -import static org.patternfly.popper.Placement.auto; import static org.patternfly.showcase.Ids.MAIN_ID; import static org.patternfly.showcase.LinkIcon.linkIcon; import static org.patternfly.style.Breakpoint._2xl; @@ -82,6 +81,7 @@ import static org.patternfly.style.ExpandableModifier.expandable; import static org.patternfly.style.ExpandableModifier.nonExpandable; import static org.patternfly.style.GridBreakpoint.gridMd; +import static org.patternfly.style.Placement.auto; import static org.patternfly.style.Size._4xl; import static org.patternfly.style.Width.width20; import static org.patternfly.style.Width.width30; diff --git a/showcase/src/main/java/org/patternfly/showcase/component/ActionListComponent.java b/showcase/src/main/java/org/patternfly/showcase/component/ActionListComponent.java index a2a4a71df..a470f182e 100644 --- a/showcase/src/main/java/org/patternfly/showcase/component/ActionListComponent.java +++ b/showcase/src/main/java/org/patternfly/showcase/component/ActionListComponent.java @@ -19,7 +19,6 @@ import org.patternfly.component.list.ActionList; import org.patternfly.component.list.ActionListGroup; import org.patternfly.component.list.ActionListItem; -import org.patternfly.component.menu.Dropdown; import org.patternfly.showcase.Snippet; import org.patternfly.showcase.SnippetPage; @@ -29,18 +28,11 @@ import static org.patternfly.component.list.ActionList.actionList; import static org.patternfly.component.list.ActionListGroup.actionListGroup; import static org.patternfly.component.list.ActionListItem.actionListItem; -import static org.patternfly.component.menu.Dropdown.dropdown; -import static org.patternfly.component.menu.DropdownMenu.dropdownMenu; -import static org.patternfly.component.menu.MenuContent.menuContent; -import static org.patternfly.component.menu.MenuItem.linkMenuItem; -import static org.patternfly.component.menu.MenuItem.menuItem; -import static org.patternfly.component.menu.MenuList.menuList; -import static org.patternfly.component.menu.MenuToggle.menuToggle; import static org.patternfly.icon.IconSets.fas.check; -import static org.patternfly.icon.IconSets.fas.ellipsisV; import static org.patternfly.icon.IconSets.fas.times; import static org.patternfly.showcase.ApiDoc.Type.component; import static org.patternfly.showcase.ApiDoc.Type.subcomponent; +import static org.patternfly.showcase.BuildingBlocks.mixedKebab; import static org.patternfly.showcase.Code.code; import static org.patternfly.showcase.Data.components; @@ -52,41 +44,28 @@ public ActionListComponent() { startExamples(); addSnippet(new Snippet("action-list-single-group", "Action list single group", - code("action-list-single-group"), () -> { - // @code-start:action-list-single-group - Dropdown dropdown = dropdown(menuToggle(ellipsisV(), "kebab dropdown toggle")) - .addMenu(dropdownMenu() - .addContent(menuContent() - .addList(menuList() - .addItem(menuItem("item-0", "Action")) - .addItem(linkMenuItem("item-1", "Link", "#item-1")) - .addItem(menuItem("item-2", "Disabled action") - .disabled()) - .addItem(linkMenuItem("item-3", "Disabled link", "#item-3") - .disabled()) - .addDivider() - .addItem(menuItem("item-4", "Separated action")) - .addItem(linkMenuItem("item-5", "Separated link", "#item-5"))))); - return div() - .add(actionList() - .addItem(actionListGroup() - .addItem(actionListItem() - .add(button("Next").primary())) - .addItem(actionListItem() - .add(button("Back").secondary())))) - .add(br()) - .add("With kebab") - .add(actionList() - .addItem(actionListGroup() - .addItem(actionListItem() - .add(button("Next").primary())) - .addItem(actionListItem() - .add(button("Back").secondary())) - .addItem(actionListItem() - .add(dropdown)))) - .element(); - // @code-end:action-list-single-group - })); + code("action-list-single-group"), () -> + // @code-start:action-list-single-group + div() + .add(actionList() + .addItem(actionListGroup() + .addItem(actionListItem() + .add(button("Next").primary())) + .addItem(actionListItem() + .add(button("Back").secondary())))) + .add(br()) + .add("With kebab") + .add(actionList() + .addItem(actionListGroup() + .addItem(actionListItem() + .add(button("Next").primary())) + .addItem(actionListItem() + .add(button("Back").secondary())) + .addItem(actionListItem() + .add(mixedKebab("action-list-single-group"))))) + .element() + // @code-end:action-list-single-group + )); addSnippet(new Snippet("action-list-icons", "Action list with icons", code("action-list-icons"), () -> diff --git a/showcase/src/main/java/org/patternfly/showcase/component/CardComponent.java b/showcase/src/main/java/org/patternfly/showcase/component/CardComponent.java index 4259868b0..04118a112 100644 --- a/showcase/src/main/java/org/patternfly/showcase/component/CardComponent.java +++ b/showcase/src/main/java/org/patternfly/showcase/component/CardComponent.java @@ -24,7 +24,6 @@ import org.patternfly.component.card.CardHeader; import org.patternfly.component.card.CardSelectableActions; import org.patternfly.component.card.CardTitle; -import org.patternfly.component.menu.Dropdown; import org.patternfly.showcase.Snippet; import org.patternfly.showcase.SnippetPage; @@ -44,16 +43,9 @@ import static org.patternfly.component.card.CardSelectableActions.cardSelectableActions; import static org.patternfly.component.card.CardTitle.cardTitle; import static org.patternfly.component.form.Checkbox.checkbox; -import static org.patternfly.component.menu.Dropdown.dropdown; -import static org.patternfly.component.menu.DropdownMenu.dropdownMenu; -import static org.patternfly.component.menu.MenuContent.menuContent; -import static org.patternfly.component.menu.MenuItem.linkMenuItem; -import static org.patternfly.component.menu.MenuItem.menuItem; -import static org.patternfly.component.menu.MenuList.menuList; -import static org.patternfly.component.menu.MenuToggle.menuToggle; -import static org.patternfly.icon.IconSets.fas.ellipsisV; import static org.patternfly.showcase.ApiDoc.Type.component; import static org.patternfly.showcase.ApiDoc.Type.subcomponent; +import static org.patternfly.showcase.BuildingBlocks.mixedKebab; import static org.patternfly.showcase.Code.code; import static org.patternfly.showcase.Data.components; import static org.patternfly.style.Classes.modifier; @@ -109,26 +101,13 @@ public CardComponent() { addSnippet(new Snippet("card-header-image", "Header images and actions", code("card-header-image"), () -> { // @code-start:card-header-image - Dropdown dropdown = dropdown(menuToggle(ellipsisV(), "kebab dropdown toggle")) - .addMenu(dropdownMenu() - .addContent(menuContent() - .addList(menuList() - .addItem(menuItem("item-0", "Action")) - .addItem(linkMenuItem("item-1", "Link", "#item-0")) - .addItem(menuItem("item-2", "Disabled action") - .disabled()) - .addItem(linkMenuItem("item-3", "Disabled link", "#item-3") - .disabled()) - .addDivider() - .addItem(menuItem("item-4", "Separated action")) - .addItem(linkMenuItem("item-5", "Separated link", "#item-5"))))); CardActions cardActions = cardActions(); return div() .add(card() .addHeader(cardHeader() .addActions(cardActions - .add(dropdown) - .add(checkbox("card-header-image-check", "card-header-image-check"))) + .addDropdown(mixedKebab("card-header-image")) + .addCheckbox(checkbox("card-header-image-check", "card-header-image-check"))) .add(brand("https://www.patternfly.org/assets/images/pf_logo.svg", "PatternFly") .style("width", "300px"))) .addTitle(cardTitle("Title")) @@ -142,62 +121,37 @@ public CardComponent() { })); addSnippet(new Snippet("card-title-inline", "Title inline with images and actions", - code("card-title-inline"), () -> { - // @code-start:card-title-inline - Dropdown dropdown = dropdown(menuToggle(ellipsisV(), "kebab dropdown toggle")) - .addMenu(dropdownMenu() - .addContent(menuContent() - .addList(menuList() - .addItem(menuItem("item-0", "Action")) - .addItem(linkMenuItem("item-1", "Link", "#item-1")) - .addItem(menuItem("item-2", "Disabled action") - .disabled()) - .addItem(linkMenuItem("item-3", "Disabled link", "#item-3") - .disabled()) - .addDivider() - .addItem(menuItem("item-4", "Separated action")) - .addItem(linkMenuItem("item-5", "Separated link", "#item-5"))))); - return div() - .add(card() - .addHeader(cardHeader() - .addTitle(cardTitle( - "This is a really really really really really really really really really really long header")) - .addActions(cardActions() - .add(dropdown) - .add(checkbox("card-title-inline-check", "card-title-inline-check")))) - .addBody(cardBody().text("Body")) - .addFooter(cardFooter().text("Footer"))) - .element(); - // @code-end:card-title-inline - })); + code("card-title-inline"), () -> + // @code-start:card-title-inline + div() + .add(card() + .addHeader(cardHeader() + .addTitle(cardTitle( + "This is a really really really really really really really really really really long header")) + .addActions(cardActions() + .addDropdown(mixedKebab("card-title-inline")) + .addCheckbox(checkbox("card-title-inline-check", "card-title-inline-check")))) + .addBody(cardBody().text("Body")) + .addFooter(cardFooter().text("Footer"))) + .element() + // @code-end:card-title-inline + )); addSnippet(new Snippet("card-header-no-title", "Card header without title", - code("card-header-no-title"), () -> { - // @code-start:card-header-no-title - Dropdown dropdown = dropdown(menuToggle(ellipsisV(), "kebab dropdown toggle")) - .addMenu(dropdownMenu() - .addContent(menuContent() - .addList(menuList() - .addItem(menuItem("item-0", "Action")) - .addItem(linkMenuItem("item-1", "Link", "#item-1")) - .addItem(menuItem("item-2", "Disabled action") - .disabled()) - .addItem(linkMenuItem("item-3", "Disabled link", "#item-3") - .disabled()) - .addDivider() - .addItem(menuItem("item-4", "Separated action")) - .addItem(linkMenuItem("item-5", "Separated link", "#item-5"))))); - return div() - .add(card() - .addHeader(cardHeader() - .addActions(cardActions() - .add(dropdown) - .add(checkbox("card-header-no-title-check", "card-header-no-title-check")))) - .addBody(cardBody() - .text("This is the card body. There are only actions in the card head."))) - .element(); - // @code-end:card-header-no-title - })); + code("card-header-no-title"), () -> + // @code-start:card-header-no-title + div() + .add(card() + .addHeader(cardHeader() + .addActions(cardActions() + .addDropdown(mixedKebab("card-header-no-title")) + .addCheckbox( + checkbox("card-header-no-title-check", "card-header-no-title-check")))) + .addBody(cardBody() + .text("This is the card body. There are only actions in the card head."))) + .element() + // @code-end:card-header-no-title + )); addSnippet(new Snippet("card-heading", "With HTML heading element", code("card-heading"), () -> @@ -376,95 +330,53 @@ public CardComponent() { })); addSnippet(new Snippet("card-expandable", "Expandable cards", - code("card-expandable"), () -> { - // @code-start:card-expandable - Dropdown dropdown1 = dropdown(menuToggle(ellipsisV(), "kebab dropdown toggle")) - .addMenu(dropdownMenu() - .addContent(menuContent() - .addList(menuList() - .addItem(menuItem("item-0", "Action")) - .addItem(linkMenuItem("item-1", "Link", "#item-1")) - .addItem(menuItem("item-2", "Disabled action") - .disabled()) - .addItem(linkMenuItem("item-3", "Disabled link", "#item-3") - .disabled()) - .addDivider() - .addItem(menuItem("item-4", "Separated action")) - .addItem(linkMenuItem("item-5", "Separated link", "#item-5"))))); - - Dropdown dropdown2 = dropdown(menuToggle(ellipsisV(), "kebab dropdown toggle")) - .addMenu(dropdownMenu() - .addContent(menuContent() - .addList(menuList() - .addItem(menuItem("item-0", "Action")) - .addItem(linkMenuItem("item-1", "Link", "#item-1")) - .addItem(menuItem("item-2", "Disabled action") - .disabled()) - .addItem(linkMenuItem("item-3", "Disabled link", "#item-3") - .disabled()) - .addDivider() - .addItem(menuItem("item-4", "Separated action")) - .addItem(linkMenuItem("item-5", "Separated link", "#item-5"))))); - - return div() - .add(card().expandable() - .addHeader(cardHeader() - .addActions(cardActions() - .add(dropdown1) - .add(checkbox("card-expandable-check-1", "card-expandable-check"))) - .addTitle(cardTitle("Title"))) - .addExpandableContent(cardExpandableContent() - .addBody(cardBody().text("Body")) - .addFooter(cardFooter().text("Footer")))) - .add(br()) - .add(card().expandable(true) - .addHeader(cardHeader() - .addActions(cardActions() - .add(dropdown2) - .add(checkbox("card-expandable-check-2", "card-expandable-check"))) - .addTitle(cardTitle("Title"))) - .addExpandableContent(cardExpandableContent() - .addBody(cardBody().text("Body")) - .addFooter(cardFooter().text("Footer")))) - .element(); - // @code-end:card-expandable - })); + code("card-expandable"), () -> + // @code-start:card-expandable + div() + .add(card().expandable() + .addHeader(cardHeader() + .addActions(cardActions() + .addDropdown(mixedKebab("card-expandable-1")) + .addCheckbox(checkbox("card-expandable-check-1", "card-expandable-check"))) + .addTitle(cardTitle("Title"))) + .addExpandableContent(cardExpandableContent() + .addBody(cardBody().text("Body")) + .addFooter(cardFooter().text("Footer")))) + .add(br()) + .add(card().expandable(true) + .addHeader(cardHeader() + .addActions(cardActions() + .addDropdown(mixedKebab("card-expandable-2")) + .addCheckbox(checkbox("card-expandable-check-2", "card-expandable-check"))) + .addTitle(cardTitle("Title"))) + .addExpandableContent(cardExpandableContent() + .addBody(cardBody().text("Body")) + .addFooter(cardFooter().text("Footer")))) + .element() + // @code-end:card-expandable + )); addSnippet(new Snippet("card-expandable-image", "Expandable with icon", - code("card-expandable-image"), () -> { - // @code-start:card-expandable-image - Dropdown dropdown = dropdown(menuToggle(ellipsisV(), "kebab dropdown toggle")) - .addMenu(dropdownMenu() - .addContent(menuContent() - .addList(menuList() - .addItem(menuItem("item-0", "Action")) - .addItem(linkMenuItem("item-1", "Link", "#item-1")) - .addItem(menuItem("item-2", "Disabled action") - .disabled()) - .addItem(linkMenuItem("item-3", "Disabled link", "#item-3") - .disabled()) - .addDivider() - .addItem(menuItem("item-4", "Separated action")) - .addItem(linkMenuItem("item-5", "Separated link", "#item-5"))))); - - return div() - .add(card().expandable() - .addHeader(cardHeader() - .addActions(cardActions() - .add(dropdown) - .add(checkbox("card-expandable-image-check", - "card-expandable-image-check"))) - .add(img("https://www.patternfly.org/assets/images/pf-logo-small.svg") - .apply(i -> { - i.alt = "PatternFly logo"; - i.setAttribute("width", "27px"); - }))) - .addExpandableContent(cardExpandableContent() - .addBody(cardBody().text("Body")) - .addFooter(cardFooter().text("Footer")))) - .element(); - // @code-end:card-expandable-image - })); + code("card-expandable-image"), () -> + // @code-start:card-expandable-image + div() + .add(card().expandable() + .addHeader(cardHeader() + .addActions(cardActions() + .addDropdown(mixedKebab("card-expandable-image")) + .addCheckbox(checkbox("card-expandable-image-check", + "card-expandable-image-check"))) + .add(img("https://www.patternfly.org/assets/images/pf-logo-small.svg") + .apply(i -> { + i.alt = "PatternFly logo"; + i.setAttribute("width", "27px"); + }))) + .addExpandableContent(cardExpandableContent() + .addBody(cardBody().text("Body")) + .addFooter(cardFooter().text("Footer")))) + .element() + // @code-end:card-expandable-image + )); startApiDocs(Card.class); addApiDoc(Card.class, component); diff --git a/showcase/src/main/java/org/patternfly/showcase/component/DataListComponent.java b/showcase/src/main/java/org/patternfly/showcase/component/DataListComponent.java index f7bbbb856..794d8aac7 100644 --- a/showcase/src/main/java/org/patternfly/showcase/component/DataListComponent.java +++ b/showcase/src/main/java/org/patternfly/showcase/component/DataListComponent.java @@ -15,16 +15,12 @@ */ package org.patternfly.showcase.component; -import java.util.function.Function; - -import org.jboss.elemento.Id; import org.jboss.elemento.router.Route; import org.patternfly.component.list.DataList; import org.patternfly.component.list.DataListAction; import org.patternfly.component.list.DataListCell; import org.patternfly.component.list.DataListExpandableContent; import org.patternfly.component.list.DataListItem; -import org.patternfly.component.menu.Dropdown; import org.patternfly.showcase.LoremIpsum; import org.patternfly.showcase.Snippet; import org.patternfly.showcase.SnippetPage; @@ -36,16 +32,10 @@ import static org.patternfly.component.list.DataListCell.dataListCell; import static org.patternfly.component.list.DataListExpandableContent.dataListExpandableContent; import static org.patternfly.component.list.DataListItem.dataListItem; -import static org.patternfly.component.menu.Dropdown.dropdown; -import static org.patternfly.component.menu.DropdownMenu.dropdownMenu; -import static org.patternfly.component.menu.MenuContent.menuContent; -import static org.patternfly.component.menu.MenuItem.linkMenuItem; -import static org.patternfly.component.menu.MenuItem.menuItem; -import static org.patternfly.component.menu.MenuList.menuList; import static org.patternfly.icon.IconSets.fas.codeBranch; -import static org.patternfly.icon.IconSets.fas.ellipsisV; import static org.patternfly.showcase.ApiDoc.Type.component; import static org.patternfly.showcase.ApiDoc.Type.subcomponent; +import static org.patternfly.showcase.BuildingBlocks.mixedKebab; import static org.patternfly.showcase.Code.code; import static org.patternfly.showcase.Data.components; import static org.patternfly.style.Classes.alignRight; @@ -106,17 +96,6 @@ public DataListComponent() { addSnippet(new Snippet("data-list-expandable", "Expandable", code("data-list-expandable"), () -> { // @code-start:data-list-expandable - Function dropdown = id -> dropdown(ellipsisV(), "kebab dropdown toggle") - .addMenu(dropdownMenu() - .addContent(menuContent() - .addList(menuList() - .addItem(menuItem(Id.build(id, "item-0"), "Action")) - .addItem(linkMenuItem(Id.build(id, "item-1"), "Link", "#item-1")) - .addItem(menuItem(Id.build(id, "item-2"), "Disabled action") - .disabled()) - .addItem(linkMenuItem(Id.build(id, "item-3"), "Disabled link", "#item-3") - .disabled())))); - DataListItem item0 = dataListItem("data-list-expandable-0"); DataListItem item2 = dataListItem("data-list-expandable-2"); DataList dataList = dataList() @@ -130,7 +109,7 @@ public DataListComponent() { .addCell(dataListCell().text(LoremIpsum.paragraph())) .addCell(dataListCell().text(LoremIpsum.paragraph())) .addAction(dataListAction(true) - .add(dropdown.apply("data-list-expandable-0"))) + .add(mixedKebab("data-list-expandable-0"))) .addExpandableContent(dataListExpandableContent() .text(LoremIpsum.paragraphs(5)))) .addItem(dataListItem("data-list-expandable-1") @@ -143,7 +122,7 @@ public DataListComponent() { .addCell(dataListCell().text(LoremIpsum.paragraph())) .addCell(dataListCell().text(LoremIpsum.paragraph())) .addAction(dataListAction(true) - .add(dropdown.apply("data-list-expandable-1"))) + .add(mixedKebab("data-list-expandable-1"))) .addExpandableContent(dataListExpandableContent() .text(LoremIpsum.paragraphs(5)))) .addItem(item2 @@ -156,7 +135,7 @@ public DataListComponent() { .addCell(dataListCell().text(LoremIpsum.paragraph())) .addCell(dataListCell().text(LoremIpsum.paragraph())) .addAction(dataListAction(true) - .add(dropdown.apply("data-list-expandable-2"))) + .add(mixedKebab("data-list-expandable-2"))) .addExpandableContent(dataListExpandableContent().noPadding() .text("This expandable section has no padding. "))); item0.expand(); diff --git a/showcase/src/main/java/org/patternfly/showcase/component/DropdownComponent.java b/showcase/src/main/java/org/patternfly/showcase/component/DropdownComponent.java index b3e633386..5bf9cccab 100644 --- a/showcase/src/main/java/org/patternfly/showcase/component/DropdownComponent.java +++ b/showcase/src/main/java/org/patternfly/showcase/component/DropdownComponent.java @@ -20,7 +20,6 @@ import org.jboss.elemento.router.Route; import org.patternfly.component.menu.Dropdown; import org.patternfly.component.menu.DropdownMenu; -import org.patternfly.component.menu.NativeDropdown; import org.patternfly.showcase.Snippet; import org.patternfly.showcase.SnippetPage; @@ -31,6 +30,7 @@ import static org.patternfly.component.content.Content.content; import static org.patternfly.component.content.ContentType.p; import static org.patternfly.component.form.Checkbox.checkboxWrapped; +import static org.patternfly.component.menu.Dropdown.dropdown; import static org.patternfly.component.menu.DropdownMenu.dropdownMenu; import static org.patternfly.component.menu.MenuContent.menuContent; import static org.patternfly.component.menu.MenuGroup.menuGroup; @@ -40,7 +40,6 @@ import static org.patternfly.component.menu.MenuToggle.menuToggle; import static org.patternfly.component.menu.MenuToggleAction.menuToggleAction; import static org.patternfly.component.menu.MenuToggleType.split; -import static org.patternfly.component.menu.NativeDropdown.nativeDropdown; import static org.patternfly.icon.IconSets.fas.cog; import static org.patternfly.icon.IconSets.fas.ellipsisV; import static org.patternfly.showcase.ApiDoc.Type.component; @@ -62,7 +61,7 @@ public DropdownComponent() { code("dropdown-basic"), () -> // @code-start:dropdown-basic div() - .add(nativeDropdown("Dropdown") + .add(Dropdown.dropdown("Dropdown") .applyToMenuList(list -> list .addItem(menuItem("item-0", "Action")) .addItem(linkMenuItem("item-1", "Link", "#item-1")) @@ -79,7 +78,7 @@ public DropdownComponent() { code("dropdown-kebab"), () -> // @code-start:dropdown-kebab div() - .add(nativeDropdown(ellipsisV(), "kebab dropdown toggle") + .add(Dropdown.dropdown(ellipsisV(), "kebab dropdown toggle") .applyToMenuList(list -> list .addItem(menuItem("item-0", "Action")) .addItem(linkMenuItem("item-1", "Link", "#item-1")) @@ -96,7 +95,7 @@ public DropdownComponent() { code("dropdown-groups"), () -> // @code-start:dropdown-groups div() - .add(nativeDropdown("Dropdown") + .add(Dropdown.dropdown("Dropdown") .addMenu(dropdownMenu() .addContent(menuContent() .addGroup(menuGroup() @@ -122,7 +121,7 @@ public DropdownComponent() { code("dropdown-description"), () -> // @code-start:dropdown-description div() - .add(nativeDropdown(menuToggle("Dropdown").fullWidth()) + .add(dropdown(menuToggle("Dropdown").fullWidth()) .applyToMenuList(list -> list .addItem(menuItem("item-0", "Action") .description("This is a description")) @@ -142,7 +141,7 @@ public DropdownComponent() { code("dropdown-badge"), () -> // @code-start:dropdown-badge div() - .add(nativeDropdown(menuToggle("Count").addBadge(badge(4).unread())) + .add(dropdown(menuToggle("Count").addBadge(badge(4).unread())) .applyToMenuList(list -> list .addItem(menuItem("item-0", "Action")) .addItem(linkMenuItem("item-1", "Link", "#item-1")) @@ -159,7 +158,7 @@ public DropdownComponent() { code("dropdown-icon"), () -> // @code-start:dropdown-icon div() - .add(nativeDropdown(menuToggle("Icon").icon(cog())) + .add(dropdown(menuToggle("Icon").icon(cog())) .applyToMenuList(list -> list .addItem(menuItem("item-0", "Action")) .addItem(linkMenuItem("item-1", "Link", "#item-1")) @@ -176,7 +175,7 @@ public DropdownComponent() { code("dropdown-avatar"), () -> // @code-start:dropdown-avatar div() - .add(nativeDropdown(menuToggle("John Doe").addAvatar(avatar(avatarData(), "avatar"))) + .add(dropdown(menuToggle("John Doe").addAvatar(avatar(avatarData(), "avatar"))) .applyToMenuList(list -> list .addItem(menuItem("item-0", "Action")) .addItem(linkMenuItem("item-1", "Link", "#item-1")) @@ -193,7 +192,7 @@ public DropdownComponent() { code("dropdown-split-check"), () -> // @code-start:dropdown-split-check div() - .add(nativeDropdown(menuToggle(split) + .add(dropdown(menuToggle(split) .addCheckbox(checkboxWrapped(Id.unique(), "dropdown-split-check"))) .applyToMenuList(list -> list .addItem(menuItem("item-0", "Action")) @@ -205,7 +204,7 @@ public DropdownComponent() { .addItem(linkMenuItem("item-5", "Separated link", "#item-5")))) .add(br()) .add(br()) - .add(nativeDropdown(menuToggle(split) + .add(dropdown(menuToggle(split) .addCheckbox(checkboxWrapped(Id.unique(), "dropdown-split-check")) .text("10 selected")) .applyToMenuList(list -> list @@ -224,7 +223,7 @@ public DropdownComponent() { code("dropdown-split-action"), () -> // @code-start:dropdown-split-action div() - .add(nativeDropdown(menuToggle(split) + .add(dropdown(menuToggle(split) .addAction(menuToggleAction("Action"))) .applyToMenuList(list -> list .addItem(menuItem("item-0", "Action")) @@ -240,7 +239,7 @@ public DropdownComponent() { startApiDocs(Dropdown.class); addApiDoc(Dropdown.class, component); - addApiDoc(NativeDropdown.class, component); + addApiDoc(Dropdown.class, component); addApiDoc(DropdownMenu.class, component); } } diff --git a/showcase/src/main/java/org/patternfly/showcase/component/HintComponent.java b/showcase/src/main/java/org/patternfly/showcase/component/HintComponent.java index 10bf63613..2bf3453cb 100644 --- a/showcase/src/main/java/org/patternfly/showcase/component/HintComponent.java +++ b/showcase/src/main/java/org/patternfly/showcase/component/HintComponent.java @@ -33,16 +33,9 @@ import static org.patternfly.component.hint.HintBody.hintBody; import static org.patternfly.component.hint.HintFooter.hintFooter; import static org.patternfly.component.hint.HintTitle.hintTitle; -import static org.patternfly.component.menu.Dropdown.dropdown; -import static org.patternfly.component.menu.DropdownMenu.dropdownMenu; -import static org.patternfly.component.menu.MenuContent.menuContent; -import static org.patternfly.component.menu.MenuItem.linkMenuItem; -import static org.patternfly.component.menu.MenuItem.menuItem; -import static org.patternfly.component.menu.MenuList.menuList; -import static org.patternfly.component.menu.MenuToggle.menuToggle; -import static org.patternfly.icon.IconSets.fas.ellipsisV; import static org.patternfly.showcase.ApiDoc.Type.component; import static org.patternfly.showcase.ApiDoc.Type.subcomponent; +import static org.patternfly.showcase.BuildingBlocks.mixedKebab; import static org.patternfly.showcase.Code.code; import static org.patternfly.showcase.Data.components; import static org.patternfly.style.Classes.util; @@ -59,25 +52,7 @@ public HintComponent() { // @code-start:hint-basic div() .add(hint() - .addActions(hintActions() - .add(dropdown(menuToggle(ellipsisV(), "kebab dropdown toggle")) - .addMenu(dropdownMenu() - .addContent(menuContent() - .addList(menuList() - .addItem(menuItem("hint-basic-item-0", "Action")) - .addItem(linkMenuItem("hint-basic-item-1", "Link", - "#item-1")) - .addItem(menuItem("hint-basic-item-2", - "Disabled action") - .disabled()) - .addItem(linkMenuItem("hint-basic-item-3", - "Disabled link", "#item-3") - .disabled()) - .addDivider() - .addItem(menuItem("hint-basic-item-4", - "Separated action")) - .addItem(linkMenuItem("hint-basic-item-5", - "Separated link", "#item-5"))))))) + .addActions(hintActions().add(mixedKebab("hint-basic"))) .addTitle(hintTitle().text("Do more with Find it Fix it capabilities")) .addBody(hintBody().text( "Upgrade to Red Hat Smart Management to remediate all your systems across regions and geographies.")) @@ -99,27 +74,7 @@ public HintComponent() { .text("Learn more about the improved features.")))) .add(br()) .add(hint() - .addActions(hintActions() - .add(dropdown(menuToggle(ellipsisV(), "kebab dropdown toggle")) - .addMenu(dropdownMenu() - .addContent(menuContent() - .addList(menuList() - .addItem(menuItem("hint-basic-no-title-item-0", - "Action")) - .addItem(linkMenuItem("hint-basic-no-title-item-1", - "Link", - "#item-1")) - .addItem(menuItem("hint-basic-no-title-item-2", - "Disabled action") - .disabled()) - .addItem(linkMenuItem("hint-basic-no-title-item-3", - "Disabled link", "#item-3") - .disabled()) - .addDivider() - .addItem(menuItem("hint-basic-no-title-item-4", - "Separated action")) - .addItem(linkMenuItem("hint-basic-no-title-item-5", - "Separated link", "#item-5"))))))) + .addActions(hintActions().add(mixedKebab("hint-basic-no-title"))) .addBody(hintBody().text( "Upgrade to Red Hat Smart Management to remediate all your systems across regions and geographies.")) .addFooter(hintFooter() diff --git a/showcase/src/main/java/org/patternfly/showcase/component/InputGroupComponent.java b/showcase/src/main/java/org/patternfly/showcase/component/InputGroupComponent.java index 483521af8..e4eb3fa66 100644 --- a/showcase/src/main/java/org/patternfly/showcase/component/InputGroupComponent.java +++ b/showcase/src/main/java/org/patternfly/showcase/component/InputGroupComponent.java @@ -34,20 +34,17 @@ import static org.patternfly.component.inputgroup.InputGroupItem.inputGroupItem; import static org.patternfly.component.inputgroup.InputGroupText.inputGroupText; import static org.patternfly.component.menu.Dropdown.dropdown; -import static org.patternfly.component.menu.DropdownMenu.dropdownMenu; -import static org.patternfly.component.menu.MenuContent.menuContent; import static org.patternfly.component.menu.MenuItem.menuItem; -import static org.patternfly.component.menu.MenuList.menuList; import static org.patternfly.component.menu.MenuToggle.menuToggle; import static org.patternfly.component.popover.Popover.popover; import static org.patternfly.icon.IconSets.fas.at; import static org.patternfly.icon.IconSets.fas.dollarSign; import static org.patternfly.icon.IconSets.fas.questionCircle; -import static org.patternfly.popper.Placement.top; import static org.patternfly.showcase.ApiDoc.Type.component; import static org.patternfly.showcase.ApiDoc.Type.subcomponent; import static org.patternfly.showcase.Code.code; import static org.patternfly.showcase.Data.components; +import static org.patternfly.style.Placement.top; @Route(value = "/components/input-group", title = "Input group") public class InputGroupComponent extends SnippetPage { @@ -100,12 +97,10 @@ public InputGroupComponent() { .add(inputGroup() .addItem(inputGroupItem() .addDropdown(dropdown(menuToggle("Dropdown")) - .addMenu(dropdownMenu() - .addContent(menuContent() - .addList(menuList() - .addItem(menuItem("option-0", "Option 1")) - .addItem(menuItem("option-1", "Option 2")) - .addItem(menuItem("option-2", "Option 3"))))))) + .applyToMenuList(list -> list + .addItem(menuItem("option-0", "Option 1")) + .addItem(menuItem("option-1", "Option 2")) + .addItem(menuItem("option-2", "Option 3"))))) .addItem(inputGroupItem().fill() .addControl(textInput("input-group-dropdown-0"))) .addItem(inputGroupItem() diff --git a/showcase/src/main/java/org/patternfly/showcase/component/NativePopoverComponent.java b/showcase/src/main/java/org/patternfly/showcase/component/NativePopoverComponent.java deleted file mode 100644 index 4e692de9f..000000000 --- a/showcase/src/main/java/org/patternfly/showcase/component/NativePopoverComponent.java +++ /dev/null @@ -1,287 +0,0 @@ -/* - * Copyright 2023 Red Hat - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.patternfly.showcase.component; - -import org.jboss.elemento.By; -import org.jboss.elemento.Elements; -import org.jboss.elemento.router.Route; -import org.patternfly.component.Severity; -import org.patternfly.component.button.Button; -import org.patternfly.component.popover.NativePopover; -import org.patternfly.component.popover.NativePopoverBody; -import org.patternfly.component.popover.NativePopoverFooter; -import org.patternfly.component.popover.NativePopoverHeader; -import org.patternfly.component.togglegroup.ToggleGroup; -import org.patternfly.showcase.LoremIpsum; -import org.patternfly.showcase.Snippet; -import org.patternfly.showcase.SnippetPage; -import elemental2.dom.ScrollIntoViewOptions; - -import static org.jboss.elemento.Elements.div; -import static org.jboss.elemento.Elements.onAttach; -import static org.patternfly.component.SelectionMode.single; -import static org.patternfly.component.button.Button.button; -import static org.patternfly.component.list.ActionList.actionList; -import static org.patternfly.component.list.ActionListGroup.actionListGroup; -import static org.patternfly.component.list.ActionListItem.actionListItem; -import static org.patternfly.component.popover.NativePopover.nativePopover; -import static org.patternfly.component.popover.NativePopoverBody.popoverBody; -import static org.patternfly.component.togglegroup.ToggleGroup.toggleGroup; -import static org.patternfly.component.togglegroup.ToggleGroupItem.toggleGroupItem; -import static org.patternfly.icon.IconSets.fas.bullhorn; -import static org.patternfly.layout.stack.Stack.stack; -import static org.patternfly.layout.stack.StackItem.stackItem; -import static org.patternfly.popper.Placement.auto; -import static org.patternfly.popper.Placement.bottom; -import static org.patternfly.popper.Placement.left; -import static org.patternfly.popper.Placement.right; -import static org.patternfly.popper.Placement.top; -import static org.patternfly.showcase.ApiDoc.Type.component; -import static org.patternfly.showcase.ApiDoc.Type.subcomponent; -import static org.patternfly.showcase.Code.code; -import static org.patternfly.showcase.Data.components; - -@Route(value = "/components/native-popover", title = "Native Popover") -public class NativePopoverComponent extends SnippetPage { - - public NativePopoverComponent() { - super(components.get("native-popover")); - - startExamples(); - addSnippet(new Snippet("np-basic", "Basic", - code("np-basic"), () -> - // @code-start:np-basic - div().style("margin", "50px") - .add(button("Toggle popover").primary() - .id("np-basic-button")) - .add(nativePopover(By.id("np-basic-button")) - .ariaLabel("Basic popover") - .addHeader("Popover header") - .addBody("Popovers are triggered by click rather than hover.") - .addFooter("Popover footer")) - .element() - // @code-end:np-basic - )); - - addSnippet(new Snippet("np-hoverable", "Hoverable", - code("np-hoverable"), () -> - // @code-start:np-hoverable - div().style("margin", "50px") - .add(button("Hover to trigger popover").primary() - .id("np-hoverable-button")) - .add(nativePopover(By.id("np-hoverable-button")) - .hoverable() - .ariaLabel("Hoverable popover") - .addHeader("Popover header") - .addBody("This popover opens on hover.") - .addFooter("Popover footer")) - .element() - // @code-end:np-hoverable - )); - - addSnippet(new Snippet("np-placements", "Placements", - code("np-placements"), () -> - // @code-start:np-placements - div().style("display: flex; gap: 16px") - .add(button("Bottom").secondary() - .id("nt-placements-bottom-button")) - .add(nativePopover(By.id("nt-placements-bottom-button")) - .placement(bottom) - .ariaLabel("Bottom popover") - .addHeader("Bottom popover") - .addBody("This popover is placed at the bottom.") - .addFooter("Popover footer")) - .add(button("Left").secondary() - .id("nt-placements-left-button")) - .add(nativePopover(By.id("nt-placements-left-button")) - .placement(left) - .ariaLabel("Left popover") - .addHeader("Left popover") - .addBody("This popover is placed on the left.") - .addFooter("Popover footer")) - .add(button("Right").secondary() - .id("nt-placements-right-button")) - .add(nativePopover(By.id("nt-placements-right-button")) - .placement(right) - .ariaLabel("Right popover") - .addHeader("Right popover") - .addBody("This popover is placed on the right.") - .addFooter("Popover footer")) - .element() - // @code-end:np-placements - )); - - addSnippet(new Snippet("np-close", "Close popover", - code("np-close"), () -> { - // @code-start:np-close - NativePopover popover = nativePopover(By.id("np-close-button")); - popover.ariaLabel("Popover with button in the body that can close it") - .addHeader("Popover header") - .addBody(popoverBody() - .add(div() - .add(div() - .add("A controlled popover can be closed by calling its ") - .add(Elements.code("close()")) - .add(" method after some user interaction.")) - .add(div() - .add(button("Close popover").inline().link() - .onClick((e, b) -> popover.close()))))) - .addFooter("Popover footer"); - - return div().style("margin", "50px") - .add(button("Toggle popover").primary() - .id("np-close-button")) - .add(popover) - .element(); - // @code-end:np-close - })); - - addSnippet(new Snippet("np-no-padding", "Without header/footer/close and no padding", - code("np-no-padding"), () -> - // @code-start:np-no-padding - div().style("margin", "50px") - .add(button("Toggle popover").primary() - .id("np-no-padding-button")) - .add(nativePopover(By.id("np-no-padding-button")) - .noClose() - .noPadding() - .ariaLabel("Popover with no header, footer, close button, and padding") - .addBody( - "This popover has no padding and is intended for use with content that has its own spacing and should touch the edges of the popover container.")) - .element() - // @code-end:np-no-padding - )); - - addSnippet(new Snippet("np-auto-width", "Width auto", - code("np-auto-width"), () -> - // @code-start:np-auto-width - div().style("margin", "50px") - .add(button("Toggle popover").primary() - .id("np-auto-width-button")) - .add(nativePopover(By.id("np-auto-width-button")) - .autoWidth() - .ariaLabel("Popover with auto-width.") - .addBody("Removes fixed-width and allows width to be defined by contents.")) - .element() - // @code-end:np-auto-width - )); - - addSnippet(new Snippet("np-auto-placement", "Auto placement", - "You might need to resize the browser window to a minimum to see the auto placement in action.", - code("np-auto-placement"), () -> { - // @code-start:np-auto-placement - Button button = button("Toggle popover"); - onAttach(button, mr -> { - ScrollIntoViewOptions options = ScrollIntoViewOptions.create(); - options.setBlock("center"); - options.setInline("center"); - button.element().scrollIntoView(options); - }); - - NativePopover popover = nativePopover(By.id("np-auto-placement-button")); - ToggleGroup toggleGroup = toggleGroup(single) - .addItem(toggleGroupItem("left", "left").onClick((e, t) -> popover.placement(left))) - .addItem(toggleGroupItem("top", "top").onClick((e, t) -> popover.placement(top))) - .addItem(toggleGroupItem("right", "right").onClick((e, t) -> popover.placement(right))) - .addItem(toggleGroupItem("bottom", "bottom").onClick((e, t) -> popover.placement(bottom))); - toggleGroup.select("top", true, false); - return stack().gutter() - .addItem(stackItem() - .add("Placement: ") - .add(toggleGroup)) - .addItem(stackItem() - .add(div().style("width", "720px") - .add(div().css("pfj-popover-box") - .add(button.css("pfj-popover-button").primary() - .id("np-auto-placement-button")) - .add(popover - .placement(auto) - .ariaLabel("Advanced popover") - .addHeader("Popover header") - .addBody(LoremIpsum.words(20)) - .addFooter("Popover footer"))))) - .element(); - // @code-end:np-auto-placement - })); - - addSnippet(new Snippet("np-icon", "Popover with icon in the title", - code("np-icon"), () -> - // @code-start:np-icon - div().style("margin", "50px") - .add(button("Toggle popover").primary() - .id("np-icon-button")) - .add(nativePopover(By.id("np-icon-button")) - .icon(bullhorn()) - .ariaLabel("Popover with icon in the title example.") - .addHeader("Popover with icon") - .addBody(LoremIpsum.words(20)) - .addFooter("Popover footer")) - .element() - // @code-end:np-icon - )); - - addSnippet(new Snippet("np-alert", "Alert popover", - code("np-alert"), () -> { - // @code-start:np-alert - return div().style("margin", "50px") - .add(actionList() - .addItem(actionListGroup() - .addItem(actionListItem() - .add(button("Custom").secondary().id("np-alert-custom"))) - .addItem(actionListItem() - .add(button("Info").secondary().id("np-alert-info"))) - .addItem(actionListItem() - .add(button("Success").secondary().id("np-alert-success"))) - .addItem(actionListItem() - .add(button("Warning").warning().id("np-alert-warning"))) - .addItem(actionListItem() - .add(button("Danger").danger().id("np-alert-danger"))))) - .add(nativePopover(By.id("np-alert-custom")) - .status(Severity.custom) - .addHeader("Popover custom header") - .addBody(LoremIpsum.words(20)) - .addFooter("Popover footer")) - .add(nativePopover(By.id("np-alert-info")) - .status(Severity.info) - .addHeader("Popover info header") - .addBody(LoremIpsum.words(20)) - .addFooter("Popover footer")) - .add(nativePopover(By.id("np-alert-success")) - .status(Severity.success) - .addHeader("Popover success header") - .addBody(LoremIpsum.words(20)) - .addFooter("Popover footer")) - .add(nativePopover(By.id("np-alert-warning")) - .status(Severity.warning) - .addHeader("Popover warning header") - .addBody(LoremIpsum.words(20)) - .addFooter("Popover footer")) - .add(nativePopover(By.id("np-alert-danger")) - .status(Severity.danger) - .addHeader("Popover danger header") - .addBody(LoremIpsum.words(20)) - .addFooter("Popover footer")) - .element(); - // @code-end:np-alert - })); - - startApiDocs(NativePopover.class); - addApiDoc(NativePopover.class, component); - addApiDoc(NativePopoverBody.class, subcomponent); - addApiDoc(NativePopoverFooter.class, subcomponent); - addApiDoc(NativePopoverHeader.class, subcomponent); - } -} diff --git a/showcase/src/main/java/org/patternfly/showcase/component/NativeTooltipComponent.java b/showcase/src/main/java/org/patternfly/showcase/component/NativeTooltipComponent.java deleted file mode 100644 index 484fad762..000000000 --- a/showcase/src/main/java/org/patternfly/showcase/component/NativeTooltipComponent.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright 2023 Red Hat - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.patternfly.showcase.component; - -import org.jboss.elemento.By; -import org.jboss.elemento.router.Route; -import org.patternfly.component.button.Button; -import org.patternfly.component.tooltip.NativeTooltip; -import org.patternfly.component.tooltip.TriggerAria; -import org.patternfly.showcase.LoremIpsum; -import org.patternfly.showcase.Snippet; -import org.patternfly.showcase.SnippetPage; - -import elemental2.dom.ScrollIntoViewOptions; - -import static org.jboss.elemento.Elements.div; -import static org.jboss.elemento.Elements.onAttach; -import static org.patternfly.component.button.Button.button; -import static org.patternfly.popper.Placement.auto; -import static org.patternfly.popper.Placement.bottom; -import static org.patternfly.popper.Placement.left; -import static org.patternfly.popper.Placement.right; -import static org.patternfly.showcase.ApiDoc.Type.component; -import static org.patternfly.showcase.ApiDoc.Type.other; -import static org.patternfly.showcase.Code.code; -import static org.patternfly.showcase.Data.components; - -@Route(value = "/components/native-tooltip", title = "Native Tooltip") -public class NativeTooltipComponent extends SnippetPage { - - public NativeTooltipComponent() { - super(components.get("native-tooltip")); - - startExamples(); - addSnippet(new Snippet("nt-basic", "Basic", - code("nt-basic"), () -> - // @code-start:nt-basic - div().style("margin", "100px") - .add(button("I have a tooltip").primary() - .id("nt-basic-button")) - .add(NativeTooltip.nativeTooltip(By.id("nt-basic-button"), LoremIpsum.words())) - .element() - // @code-end:nt-basic - )); - - addSnippet(new Snippet("nt-dynamic", "Dynamic content", - code("nt-dynamic"), - () -> { - // @code-start:nt-dynamic - NativeTooltip tooltip = NativeTooltip.nativeTooltip(By.id("nt-dynamic-button"), "Copy to clipboard") - .onClose((e, t) -> t.text("Copy to clipboard")); - return div().style("margin", "100px") - .add(button("Copy to clipboard").primary() - .id("nt-dynamic-button") - .onClick((e, b) -> tooltip.text("Successfully copied to clipboard!"))) - .add(tooltip) - .element(); - // @code-end:nt-dynamic - })); - - addSnippet(new Snippet("nt-placements", "Placements", - code("nt-placements"), - () -> - // @code-start:nt-placements - div().style("display: flex; gap: 16px") - .add(button("Bottom").secondary() - .id("nt-placements-bottom-button")) - .add(NativeTooltip.nativeTooltip(By.id("nt-placements-bottom-button"), "Bottom tooltip") - .placement(bottom)) - .add(button("Left").secondary() - .id("nt-placements-left-button")) - .add(NativeTooltip.nativeTooltip(By.id("nt-placements-left-button"), "Left tooltip") - .placement(left)) - .add(button("Right").secondary() - .id("nt-placements-right-button")) - .add(NativeTooltip.nativeTooltip(By.id("nt-placements-right-button"), "Right tooltip") - .placement(right)) - .element() - // @code-end:nt-placements - )); - - addSnippet(new Snippet("nt-auto", "Auto placement", - "You might need to resize the browser window to a minimum to see the auto placement in action.", - code("nt-auto"), - () -> { - // @code-start:nt-auto - Button button = button("Tooltip"); - onAttach(button, mr -> { - ScrollIntoViewOptions options = ScrollIntoViewOptions.create(); - options.setBlock("center"); - options.setInline("center"); - button.element().scrollIntoView(options); - }); - return div().style("width", "720px") - .add(div().css("pfj-tooltip-box") - .add(button.css("pfj-tooltip-button").primary() - .id("nt-auto-button")) - .add(NativeTooltip.nativeTooltip(By.id("nt-auto-button"), LoremIpsum.words()) - .placement(auto))) - .element(); - // @code-end:nt-auto - })); - - startApiDocs(NativeTooltip.class); - addApiDoc(NativeTooltip.class, component); - addApiDoc(TriggerAria.class, other); - } -} diff --git a/showcase/src/main/java/org/patternfly/showcase/component/NotificationDrawerComponent.java b/showcase/src/main/java/org/patternfly/showcase/component/NotificationDrawerComponent.java index 5e84c8b50..c1fbba030 100644 --- a/showcase/src/main/java/org/patternfly/showcase/component/NotificationDrawerComponent.java +++ b/showcase/src/main/java/org/patternfly/showcase/component/NotificationDrawerComponent.java @@ -31,21 +31,15 @@ import static org.patternfly.component.Severity.info; import static org.patternfly.component.Severity.success; import static org.patternfly.component.Severity.warning; -import static org.patternfly.component.menu.Dropdown.dropdown; -import static org.patternfly.component.menu.DropdownMenu.dropdownMenu; -import static org.patternfly.component.menu.MenuContent.menuContent; -import static org.patternfly.component.menu.MenuItem.linkMenuItem; -import static org.patternfly.component.menu.MenuItem.menuItem; -import static org.patternfly.component.menu.MenuList.menuList; import static org.patternfly.component.notification.NotificationDrawer.notificationDrawer; import static org.patternfly.component.notification.NotificationDrawerBody.notificationDrawerBody; import static org.patternfly.component.notification.NotificationDrawerHeader.notificationDrawerHeader; import static org.patternfly.component.notification.NotificationDrawerItem.notificationDrawerItem; import static org.patternfly.component.notification.NotificationDrawerItemBody.notificationDrawerItemBody; import static org.patternfly.component.notification.NotificationDrawerList.notificationDrawerList; -import static org.patternfly.icon.IconSets.fas.ellipsisV; import static org.patternfly.showcase.ApiDoc.Type.component; import static org.patternfly.showcase.ApiDoc.Type.subcomponent; +import static org.patternfly.showcase.BuildingBlocks.mixedKebab; import static org.patternfly.showcase.Code.code; import static org.patternfly.showcase.Data.components; @@ -61,20 +55,7 @@ public NotificationDrawerComponent() { notificationDrawer() .addHeader(notificationDrawerHeader() .status("2 unread") - .addAction(dropdown(ellipsisV(), "kebab dropdown toggle") - .addMenu(dropdownMenu() - .addContent(menuContent() - .addList(menuList() - .addItem(menuItem("item-0", "Action")) - .addItem(linkMenuItem("item-1", "Link", "#item-1")) - .addItem(menuItem("item-2", "Disabled action") - .disabled()) - .addItem(linkMenuItem("item-3", "Disabled link", "#item-3") - .disabled()) - .addDivider() - .addItem(menuItem("item-4", "Separated action")) - .addItem(linkMenuItem("item-5", "Separated link", - "#item-5"))))))) + .addAction(mixedKebab("notification-drawer-basic"))) .addBody(notificationDrawerBody() .addList(notificationDrawerList() .addItem(notificationDrawerItem(info, "Unread info notification title") diff --git a/showcase/src/main/java/org/patternfly/showcase/component/PopoverComponent.java b/showcase/src/main/java/org/patternfly/showcase/component/PopoverComponent.java index 980f1ab0f..56d04a32c 100644 --- a/showcase/src/main/java/org/patternfly/showcase/component/PopoverComponent.java +++ b/showcase/src/main/java/org/patternfly/showcase/component/PopoverComponent.java @@ -24,6 +24,7 @@ import org.patternfly.component.popover.PopoverBody; import org.patternfly.component.popover.PopoverFooter; import org.patternfly.component.popover.PopoverHeader; +import org.patternfly.component.togglegroup.ToggleGroup; import org.patternfly.showcase.LoremIpsum; import org.patternfly.showcase.Snippet; import org.patternfly.showcase.SnippetPage; @@ -32,19 +33,27 @@ import static org.jboss.elemento.Elements.div; import static org.jboss.elemento.Elements.onAttach; +import static org.patternfly.component.SelectionMode.single; import static org.patternfly.component.button.Button.button; import static org.patternfly.component.list.ActionList.actionList; import static org.patternfly.component.list.ActionListGroup.actionListGroup; import static org.patternfly.component.list.ActionListItem.actionListItem; import static org.patternfly.component.popover.Popover.popover; import static org.patternfly.component.popover.PopoverBody.popoverBody; +import static org.patternfly.component.togglegroup.ToggleGroup.toggleGroup; +import static org.patternfly.component.togglegroup.ToggleGroupItem.toggleGroupItem; import static org.patternfly.icon.IconSets.fas.bullhorn; -import static org.patternfly.popper.Placement.auto; -import static org.patternfly.popper.TriggerAction.mouseenter; +import static org.patternfly.layout.stack.Stack.stack; +import static org.patternfly.layout.stack.StackItem.stackItem; import static org.patternfly.showcase.ApiDoc.Type.component; import static org.patternfly.showcase.ApiDoc.Type.subcomponent; import static org.patternfly.showcase.Code.code; import static org.patternfly.showcase.Data.components; +import static org.patternfly.style.Placement.auto; +import static org.patternfly.style.Placement.bottom; +import static org.patternfly.style.Placement.left; +import static org.patternfly.style.Placement.right; +import static org.patternfly.style.Placement.top; @Route(value = "/components/popover", title = "Popover") public class PopoverComponent extends SnippetPage { @@ -54,44 +63,72 @@ public PopoverComponent() { startExamples(); addSnippet(new Snippet("popover-basic", "Basic", - code("popover-basic"), () -> { - // @code-start:popover-basic - popover(By.id("popover-basic-button")) - .ariaLabel("Basic popover") - .addHeader("Popover header") - .addBody("Popovers are triggered by click rather than hover.") - .addFooter("Popover footer") - .appendToBody(); - - return div().style("margin", "50px") - .add(button("Toggle popover").primary() - .id("popover-basic-button")) - .element(); - // @code-end:popover-basic - })); + code("popover-basic"), () -> + // @code-start:popover-basic + div().style("margin", "50px") + .add(button("Toggle popover").primary() + .id("popover-basic-button")) + .add(Popover.popover(By.id("popover-basic-button")) + .ariaLabel("Basic popover") + .addHeader("Popover header") + .addBody("Popovers are triggered by click rather than hover.") + .addFooter("Popover footer")) + .element() + // @code-end:popover-basic + )); addSnippet(new Snippet("popover-hoverable", "Hoverable", - code("popover-hoverable"), () -> { - // @code-start:popover-hoverable - popover(By.id("popover-hoverable-button")) - .ariaLabel("Hoverable popover") - .triggerActions(mouseenter) - .addHeader("Popover header") - .addBody("This popover opens on hover.") - .addFooter("Popover footer") - .appendToBody(); + code("popover-hoverable"), () -> + // @code-start:popover-hoverable + div().style("margin", "50px") + .add(button("Hover to trigger popover").primary() + .id("popover-hoverable-button")) + .add(Popover.popover(By.id("popover-hoverable-button")) + .hoverable() + .ariaLabel("Hoverable popover") + .addHeader("Popover header") + .addBody("This popover opens on hover.") + .addFooter("Popover footer")) + .element() + // @code-end:popover-hoverable + )); - return div().style("margin", "50px") - .add(button("Hover to trigger popover").primary() - .id("popover-hoverable-button")) - .element(); - // @code-end:popover-hoverable - })); + addSnippet(new Snippet("popover-placements", "Placements", + code("popover-placements"), () -> + // @code-start:popover-placements + div().style("display: flex; gap: 16px") + .add(button("Bottom").secondary() + .id("nt-placements-bottom-button")) + .add(Popover.popover(By.id("nt-placements-bottom-button")) + .placement(bottom) + .ariaLabel("Bottom popover") + .addHeader("Bottom popover") + .addBody("This popover is placed at the bottom.") + .addFooter("Popover footer")) + .add(button("Left").secondary() + .id("nt-placements-left-button")) + .add(Popover.popover(By.id("nt-placements-left-button")) + .placement(left) + .ariaLabel("Left popover") + .addHeader("Left popover") + .addBody("This popover is placed on the left.") + .addFooter("Popover footer")) + .add(button("Right").secondary() + .id("nt-placements-right-button")) + .add(Popover.popover(By.id("nt-placements-right-button")) + .placement(right) + .ariaLabel("Right popover") + .addHeader("Right popover") + .addBody("This popover is placed on the right.") + .addFooter("Popover footer")) + .element() + // @code-end:popover-placements + )); addSnippet(new Snippet("popover-close", "Close popover", code("popover-close"), () -> { // @code-start:popover-close - Popover popover = popover(By.id("popover-close-button")); + Popover popover = Popover.popover(By.id("popover-close-button")); popover.ariaLabel("Popover with button in the body that can close it") .addHeader("Popover header") .addBody(popoverBody() @@ -103,53 +140,50 @@ public PopoverComponent() { .add(div() .add(button("Close popover").inline().link() .onClick((e, b) -> popover.close()))))) - .addFooter("Popover footer") - .appendToBody(); + .addFooter("Popover footer"); return div().style("margin", "50px") .add(button("Toggle popover").primary() .id("popover-close-button")) + .add(popover) .element(); // @code-end:popover-close })); addSnippet(new Snippet("popover-no-padding", "Without header/footer/close and no padding", - code("popover-no-padding"), () -> { - // @code-start:popover-no-padding - popover(By.id("popover-no-padding-button")) - .noClose() - .noPadding() - .ariaLabel("Popover with no header, footer, close button, and padding") - .addBody( - "This popover has no padding and is intended for use with content that has its own spacing and should touch the edges of the popover container.") - .appendToBody(); - - return div().style("margin", "50px") - .add(button("Toggle popover").primary() - .id("popover-no-padding-button")) - .element(); - // @code-end:popover-no-padding - })); + code("popover-no-padding"), () -> + // @code-start:popover-no-padding + div().style("margin", "50px") + .add(button("Toggle popover").primary() + .id("popover-no-padding-button")) + .add(Popover.popover(By.id("popover-no-padding-button")) + .noClose() + .noPadding() + .ariaLabel("Popover with no header, footer, close button, and padding") + .addBody( + "This popover has no padding and is intended for use with content that has its own spacing and should touch the edges of the popover container.")) + .element() + // @code-end:popover-no-padding + )); addSnippet(new Snippet("popover-auto-width", "Width auto", - code("popover-auto-width"), () -> { - // @code-start:popover-auto-width - popover(By.id("popover-auto-width-button")) - .autoWidth() - .ariaLabel("Popover with auto-width.") - .addBody("Removes fixed-width and allows width to be defined by contents.") - .appendToBody(); - - return div().style("margin", "50px") - .add(button("Toggle popover").primary() - .id("popover-auto-width-button")) - .element(); - // @code-end:popover-auto-width - })); + code("popover-auto-width"), () -> + // @code-start:popover-auto-width + div().style("margin", "50px") + .add(button("Toggle popover").primary() + .id("popover-auto-width-button")) + .add(Popover.popover(By.id("popover-auto-width-button")) + .autoWidth() + .ariaLabel("Popover with auto-width.") + .addBody("Removes fixed-width and allows width to be defined by contents.")) + .element() + // @code-end:popover-auto-width + )); - addSnippet(new Snippet("popover-advanced", "Advanced", - code("popover-advanced"), () -> { - // @code-start:popover-advanced + addSnippet(new Snippet("popover-auto-placement", "Auto placement", + "You might need to resize the browser window to a minimum to see the auto placement in action.", + code("popover-auto-placement"), () -> { + // @code-start:popover-auto-placement Button button = button("Toggle popover"); onAttach(button, mr -> { ScrollIntoViewOptions options = ScrollIntoViewOptions.create(); @@ -158,49 +192,51 @@ public PopoverComponent() { button.element().scrollIntoView(options); }); - return div().style("width", "720px") - .add(div().css("pfj-popover-box") - .add(button.css("pfj-popover-button").primary() - .id("popover-advanced-button")) - .add(popover(By.id("popover-advanced-button")) - .placement(auto) - .ariaLabel("Advanced popover") - .addHeader("Popover header") - .addBody(LoremIpsum.words(20)) - .addFooter("Popover footer"))) + Popover popover = Popover.popover(By.id("popover-auto-placement-button")); + ToggleGroup toggleGroup = toggleGroup(single) + .addItem(toggleGroupItem("left", "left").onClick((e, t) -> popover.placement(left))) + .addItem(toggleGroupItem("top", "top").onClick((e, t) -> popover.placement(top))) + .addItem(toggleGroupItem("right", "right").onClick((e, t) -> popover.placement(right))) + .addItem(toggleGroupItem("bottom", "bottom").onClick((e, t) -> popover.placement(bottom))); + toggleGroup.select("top", true, false); + return stack().gutter() + .addItem(stackItem() + .add("Placement: ") + .add(toggleGroup)) + .addItem(stackItem() + .add(div().style("width", "720px") + .add(div().css("pfj-popover-box") + .add(button.css("pfj-popover-button").primary() + .id("popover-auto-placement-button")) + .add(popover + .placement(auto) + .ariaLabel("Advanced popover") + .addHeader("Popover header") + .addBody(LoremIpsum.words(20)) + .addFooter("Popover footer"))))) .element(); - // @code-end:popover-advanced + // @code-end:popover-auto-placement })); addSnippet(new Snippet("popover-icon", "Popover with icon in the title", - code("popover-icon"), () -> { - // @code-start:popover-icon - popover(By.id("popover-icon-button")) - .icon(bullhorn()) - .ariaLabel("Popover with icon in the title example.") - .addHeader("Popover with icon") - .addBody(LoremIpsum.words(20)) - .addFooter("Popover footer") - .appendToBody(); - - return div().style("margin", "50px") - .add(button("Toggle popover").primary() - .id("popover-icon-button")) - .element(); - // @code-end:popover-icon - })); + code("popover-icon"), () -> + // @code-start:popover-icon + div().style("margin", "50px") + .add(button("Toggle popover").primary() + .id("popover-icon-button")) + .add(Popover.popover(By.id("popover-icon-button")) + .icon(bullhorn()) + .ariaLabel("Popover with icon in the title example.") + .addHeader("Popover with icon") + .addBody(LoremIpsum.words(20)) + .addFooter("Popover footer")) + .element() + // @code-end:popover-icon + )); addSnippet(new Snippet("popover-alert", "Alert popover", code("popover-alert"), () -> { // @code-start:popover-alert - for (Severity severity : Severity.values()) { - popover(By.id("popover-alert-" + severity.name())) - .status(severity) - .addHeader("Popover " + severity.name() + " header") - .addBody(LoremIpsum.words(20)) - .addFooter("Popover footer") - .appendToBody(); - } return div().style("margin", "50px") .add(actionList() .addItem(actionListGroup() @@ -214,6 +250,31 @@ public PopoverComponent() { .add(button("Warning").warning().id("popover-alert-warning"))) .addItem(actionListItem() .add(button("Danger").danger().id("popover-alert-danger"))))) + .add(Popover.popover(By.id("popover-alert-custom")) + .status(Severity.custom) + .addHeader("Popover custom header") + .addBody(LoremIpsum.words(20)) + .addFooter("Popover footer")) + .add(Popover.popover(By.id("popover-alert-info")) + .status(Severity.info) + .addHeader("Popover info header") + .addBody(LoremIpsum.words(20)) + .addFooter("Popover footer")) + .add(Popover.popover(By.id("popover-alert-success")) + .status(Severity.success) + .addHeader("Popover success header") + .addBody(LoremIpsum.words(20)) + .addFooter("Popover footer")) + .add(Popover.popover(By.id("popover-alert-warning")) + .status(Severity.warning) + .addHeader("Popover warning header") + .addBody(LoremIpsum.words(20)) + .addFooter("Popover footer")) + .add(Popover.popover(By.id("popover-alert-danger")) + .status(Severity.danger) + .addHeader("Popover danger header") + .addBody(LoremIpsum.words(20)) + .addFooter("Popover footer")) .element(); // @code-end:popover-alert })); diff --git a/showcase/src/main/java/org/patternfly/showcase/component/ProgressStepperComponent.java b/showcase/src/main/java/org/patternfly/showcase/component/ProgressStepperComponent.java index a8bb71d01..a6aa297c6 100644 --- a/showcase/src/main/java/org/patternfly/showcase/component/ProgressStepperComponent.java +++ b/showcase/src/main/java/org/patternfly/showcase/component/ProgressStepperComponent.java @@ -40,13 +40,13 @@ import static org.patternfly.icon.IconSets.fas.checkDouble; import static org.patternfly.icon.IconSets.fas.clock; import static org.patternfly.icon.IconSets.patternfly.pending; -import static org.patternfly.popper.Placement.right; import static org.patternfly.showcase.ApiDoc.Type.component; import static org.patternfly.showcase.ApiDoc.Type.other; import static org.patternfly.showcase.ApiDoc.Type.subcomponent; import static org.patternfly.showcase.Code.code; import static org.patternfly.showcase.Data.components; import static org.patternfly.style.Classes.label; +import static org.patternfly.style.Placement.right; @Route(value = "/components/progress-stepper", title = "Progress stepper") public class ProgressStepperComponent extends SnippetPage { diff --git a/showcase/src/main/java/org/patternfly/showcase/component/SelectComponent.java b/showcase/src/main/java/org/patternfly/showcase/component/SelectComponent.java index 9718af80c..71129eec9 100644 --- a/showcase/src/main/java/org/patternfly/showcase/component/SelectComponent.java +++ b/showcase/src/main/java/org/patternfly/showcase/component/SelectComponent.java @@ -33,6 +33,7 @@ import org.patternfly.showcase.Snippet; import org.patternfly.showcase.SnippetPage; import org.patternfly.style.Modifiers.FullWidth; + import elemental2.promise.Promise; import static elemental2.dom.DomGlobal.setTimeout; @@ -55,13 +56,13 @@ import static org.patternfly.component.menu.MenuItem.menuItem; import static org.patternfly.component.menu.MenuList.menuList; import static org.patternfly.component.menu.MenuToggle.menuToggle; +import static org.patternfly.component.menu.MultiSelect.multiSelect; import static org.patternfly.component.menu.MultiSelectMenu.multiSelectCheckboxMenu; import static org.patternfly.component.menu.MultiSelectMenu.multiSelectMenu; -import static org.patternfly.component.menu.NativeMultiSelect.nativeMultiSelect; -import static org.patternfly.component.menu.NativeMultiTypeahead.nativeMultiTypeahead; -import static org.patternfly.component.menu.NativeSingleSelect.nativeSingleSelect; -import static org.patternfly.component.menu.NativeSingleTypeahead.nativeSingleTypeahead; +import static org.patternfly.component.menu.MultiTypeahead.multiTypeahead; +import static org.patternfly.component.menu.SingleSelect.singleSelect; import static org.patternfly.component.menu.SingleSelectMenu.singleSelectMenu; +import static org.patternfly.component.menu.SingleTypeahead.singleTypeahead; import static org.patternfly.icon.IconSets.fas.bell; import static org.patternfly.showcase.ApiDoc.Type.component; import static org.patternfly.showcase.Code.code; @@ -83,7 +84,7 @@ public SelectComponent() { code("single-select"), () -> // @code-start:single-select div() - .add(nativeSingleSelect("Select a value") + .add(singleSelect("Select a value") .style("width", "200px") .applyToMenuList(list -> list .addItem(menuItem("option-0", "Option 1")) @@ -97,7 +98,7 @@ public SelectComponent() { code("select-option-variants"), () -> // @code-start:select-option-variants div() - .add(nativeSingleSelect("Select a value") + .add(singleSelect("Select a value") .style("width", "200px") .applyToMenuList(list -> list .addItem(menuItem("option-0", "Basic option")) @@ -120,7 +121,7 @@ public SelectComponent() { code("select-groups"), () -> // @code-start:select-groups div() - .add(nativeSingleSelect("Select a value") + .add(singleSelect("Select a value") .style("width", "200px") .addMenu(singleSelectMenu() .addContent(menuContent() @@ -146,7 +147,7 @@ public SelectComponent() { HelperText helperText = helperText().liveRegion().addItem(helperTextItem()); setVisible(helperText, false); return div() - .add(nativeSingleSelect(menuToggle) + .add(singleSelect(menuToggle) .style("width", "200px") .addMenu(singleSelectMenu() .onSingleSelect((event, menuItem, selected) -> { @@ -174,7 +175,7 @@ public SelectComponent() { code("multi-select"), () -> // @code-start:multi-select div() - .add(nativeMultiSelect("Filter by status") + .add(multiSelect("Filter by status") .addMenu(multiSelectCheckboxMenu() .addContent(menuContent() .addList(menuList() @@ -191,7 +192,7 @@ public SelectComponent() { code("single-typeahead"), () -> // @code-start:single-typeahead div() - .add(nativeSingleTypeahead("single-typeahead-0", "Select a state") + .add(singleTypeahead("single-typeahead-0", "Select a state") .applyToMenuToggle(FullWidth::fullWidth) .applyToMenuList(list -> list .addItem(menuItem("alabama", "Alabama")) @@ -208,7 +209,7 @@ public SelectComponent() { code("single-typeahead-create"), () -> // @code-start:single-typeahead-create div() - .add(nativeSingleTypeahead("single-typeahead-create-0", "Select a state") + .add(singleTypeahead("single-typeahead-create-0", "Select a state") .applyToMenuToggle(FullWidth::fullWidth) .applyToMenuList(list -> list .addItem(menuItem("alabama", "Alabama")) @@ -236,7 +237,7 @@ public SelectComponent() { return div() - .add(nativeSingleTypeahead("single-typeahead-async-0", "Lorem ipsum") + .add(singleTypeahead("single-typeahead-async-0", "Lorem ipsum") .applyToMenuToggle(FullWidth::fullWidth) .addMenu(singleSelectMenu().scrollable() .addContent(menuContent() @@ -250,7 +251,7 @@ public SelectComponent() { code("multi-typeahead"), () -> // @code-start:multi-typeahead div() - .add(nativeMultiTypeahead("multi-typeahead-0", "Select a state") + .add(multiTypeahead("multi-typeahead-0", "Select a state") .applyToMenuToggle(FullWidth::fullWidth) .applyToMenuList(list -> list .addItem(menuItem("alabama", "Alabama")) @@ -267,7 +268,7 @@ public SelectComponent() { code("multi-typeahead-create"), () -> // @code-start:multi-typeahead-create div() - .add(nativeMultiTypeahead("multi-typeahead-create-0", "Select a state") + .add(multiTypeahead("multi-typeahead-create-0", "Select a state") .applyToMenuToggle(FullWidth::fullWidth) .applyToMenuList(list -> list .addItem(menuItem("alabama", "Alabama")) @@ -295,7 +296,7 @@ public SelectComponent() { return div() - .add(nativeMultiTypeahead("multi-typeahead-async-0", "Lorem ipsum") + .add(multiTypeahead("multi-typeahead-async-0", "Lorem ipsum") .applyToMenuToggle(FullWidth::fullWidth) .addMenu(multiSelectMenu().scrollable() .addContent(menuContent() diff --git a/showcase/src/main/java/org/patternfly/showcase/component/TooltipComponent.java b/showcase/src/main/java/org/patternfly/showcase/component/TooltipComponent.java index 3fc22e816..04e8c29b8 100644 --- a/showcase/src/main/java/org/patternfly/showcase/component/TooltipComponent.java +++ b/showcase/src/main/java/org/patternfly/showcase/component/TooltipComponent.java @@ -19,7 +19,6 @@ import org.jboss.elemento.router.Route; import org.patternfly.component.button.Button; import org.patternfly.component.tooltip.Tooltip; -import org.patternfly.component.tooltip.TooltipToggle; import org.patternfly.component.tooltip.TriggerAria; import org.patternfly.showcase.LoremIpsum; import org.patternfly.showcase.Snippet; @@ -31,13 +30,14 @@ import static org.jboss.elemento.Elements.onAttach; import static org.patternfly.component.button.Button.button; import static org.patternfly.component.tooltip.Tooltip.tooltip; -import static org.patternfly.core.Aria.label; -import static org.patternfly.icon.IconSets.fas.copy; -import static org.patternfly.popper.Placement.auto; import static org.patternfly.showcase.ApiDoc.Type.component; import static org.patternfly.showcase.ApiDoc.Type.other; import static org.patternfly.showcase.Code.code; import static org.patternfly.showcase.Data.components; +import static org.patternfly.style.Placement.auto; +import static org.patternfly.style.Placement.bottom; +import static org.patternfly.style.Placement.left; +import static org.patternfly.style.Placement.right; @Route(value = "/components/tooltip", title = "Tooltip") public class TooltipComponent extends SnippetPage { @@ -62,18 +62,39 @@ public TooltipComponent() { () -> { // @code-start:tooltip-dynamic Tooltip tooltip = tooltip(By.id("tooltip-dynamic-button"), "Copy to clipboard") - .onClose((e, t) -> t.text("Copy to clipboard")) - .appendToBody(); + .onClose((e, t) -> t.text("Copy to clipboard")); return div().style("margin", "100px") - .add(button().icon(copy()).plain() - .aria(label, "Copy") + .add(button("Copy to clipboard").primary() .id("tooltip-dynamic-button") .onClick((e, b) -> tooltip.text("Successfully copied to clipboard!"))) + .add(tooltip) .element(); // @code-end:tooltip-dynamic })); - addSnippet(new Snippet("tooltip-auto", "Placement auto", + addSnippet(new Snippet("tooltip-placements", "Placements", + code("tooltip-placements"), + () -> + // @code-start:tooltip-placements + div().style("display: flex; gap: 16px") + .add(button("Bottom").secondary() + .id("tooltip-placements-bottom-button")) + .add(tooltip(By.id("tooltip-placements-bottom-button"), "Bottom tooltip") + .placement(bottom)) + .add(button("Left").secondary() + .id("tooltip-placements-left-button")) + .add(tooltip(By.id("tooltip-placements-left-button"), "Left tooltip") + .placement(left)) + .add(button("Right").secondary() + .id("tooltip-placements-right-button")) + .add(tooltip(By.id("tooltip-placements-right-button"), "Right tooltip") + .placement(right)) + .element() + // @code-end:tooltip-placements + )); + + addSnippet(new Snippet("tooltip-auto", "Auto placement", + "You might need to resize the browser window to a minimum to see the auto placement in action.", code("tooltip-auto"), () -> { // @code-start:tooltip-auto @@ -87,8 +108,8 @@ public TooltipComponent() { return div().style("width", "720px") .add(div().css("pfj-tooltip-box") .add(button.css("pfj-tooltip-button").primary() - .id("tooltip-options-button")) - .add(tooltip(By.id("tooltip-options-button"), LoremIpsum.words()) + .id("tooltip-auto-button")) + .add(tooltip(By.id("tooltip-auto-button"), LoremIpsum.words()) .placement(auto))) .element(); // @code-end:tooltip-auto @@ -96,7 +117,6 @@ public TooltipComponent() { startApiDocs(Tooltip.class); addApiDoc(Tooltip.class, component); - addApiDoc(TooltipToggle.class, other); addApiDoc(TriggerAria.class, other); } } diff --git a/showcase/src/main/java/org/patternfly/showcase/model/FileData.java b/showcase/src/main/java/org/patternfly/showcase/model/FileData.java index 58d8ab176..4446a630a 100644 --- a/showcase/src/main/java/org/patternfly/showcase/model/FileData.java +++ b/showcase/src/main/java/org/patternfly/showcase/model/FileData.java @@ -30,10 +30,7 @@ import static java.util.Arrays.copyOfRange; import static org.patternfly.component.button.Button.button; import static org.patternfly.component.menu.Dropdown.dropdown; -import static org.patternfly.component.menu.DropdownMenu.dropdownMenu; -import static org.patternfly.component.menu.MenuContent.menuContent; import static org.patternfly.component.menu.MenuItem.menuItem; -import static org.patternfly.component.menu.MenuList.menuList; import static org.patternfly.component.menu.MenuToggle.menuToggle; import static org.patternfly.component.menu.MenuToggleAction.menuToggleAction; import static org.patternfly.component.menu.MenuToggleType.split; @@ -85,22 +82,18 @@ final IsElement action(String value) { return button(suffix).plain().small(); case "kebab": return dropdown(menuToggle(ellipsisV()).small()) - .addMenu(dropdownMenu() - .addContent(menuContent() - .addList(menuList() - .addItems(asList(suffix.split("\\|")), text -> - menuItem(Id.build(text), text))))); + .applyToMenuList(list -> list + .addItems(asList(suffix.split("\\|")), text -> + menuItem(Id.build(text), text))); case "split": String[] actions = suffix.split("\\|"); String first = actions[0]; String[] rest = copyOfRange(actions, 1, actions.length); return dropdown(menuToggle(split).small() .addAction(menuToggleAction(first))) - .addMenu(dropdownMenu() - .addContent(menuContent() - .addList(menuList() - .addItems(asList(rest), text -> - menuItem(Id.build(text), text))))); + .applyToMenuList(list -> list + .addItems(asList(rest), text -> + menuItem(Id.build(text), text))); } } return null; diff --git a/showcase/src/main/resources/org/patternfly/showcase/components.json b/showcase/src/main/resources/org/patternfly/showcase/components.json index 5b6aedc78..8bfc1c1d1 100644 --- a/showcase/src/main/resources/org/patternfly/showcase/components.json +++ b/showcase/src/main/resources/org/patternfly/showcase/components.json @@ -385,22 +385,6 @@ "illustration": "modal.png", "summary": "A modal is a window that overlays a page to display important information, without requiring users to navigate to a new page." }, - "native-popover": { - "name": "native-popover", - "title": "Native Popover", - "route": "/components/native-popover", - "clazz": "org.patternfly.component.popover.NativePopover", - "illustration": "popover.png", - "summary": "A popover using the Popover API and CSS anchor positioning instead of Popper.js." - }, - "native-tooltip": { - "name": "native-tooltip", - "title": "Native Tooltip", - "route": "/components/native-tooltip", - "clazz": "org.patternfly.component.tooltip.NativeTooltip", - "illustration": "tooltip.png", - "summary": "A tooltip using the Popover API and CSS anchor positioning instead of Popper.js." - }, "navigation": { "name": "navigation", "title": "Navigation", diff --git a/showcase/src/web/showcase.css b/showcase/src/web/showcase.css index 916a9078f..ec0ff807e 100644 --- a/showcase/src/web/showcase.css +++ b/showcase/src/web/showcase.css @@ -14,8 +14,8 @@ * limitations under the License. */ :root { - --pf-v6-c-tooltip--css-positioning: 1; - --pf-v6-c-popover--css-positioning: 1; + --pf-v6-c-tooltip--css-positioning: 0; + --pf-v6-c-popover--css-positioning: 0; } .pf-m-redhat-font .pf-c-content { From 4b6467f727368012dd376a565455e70f2e8cb5c4 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Wed, 1 Apr 2026 14:36:20 +0200 Subject: [PATCH 084/430] New Overlay class --- .../patternfly/handler/OverlayHandler.java | 35 ++ .../java/org/patternfly/overlay/Overlay.java | 518 ++++++++++++++++++ .../org/patternfly/overlay/TriggerMode.java | 31 ++ overlay-plan.md | 201 +++++++ 4 files changed, 785 insertions(+) create mode 100644 core/src/main/java/org/patternfly/handler/OverlayHandler.java create mode 100644 core/src/main/java/org/patternfly/overlay/Overlay.java create mode 100644 core/src/main/java/org/patternfly/overlay/TriggerMode.java create mode 100644 overlay-plan.md diff --git a/core/src/main/java/org/patternfly/handler/OverlayHandler.java b/core/src/main/java/org/patternfly/handler/OverlayHandler.java new file mode 100644 index 000000000..6e8686316 --- /dev/null +++ b/core/src/main/java/org/patternfly/handler/OverlayHandler.java @@ -0,0 +1,35 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.handler; + +import elemental2.dom.Event; + +/** + * Handler called when an overlay's visibility changes. + * + * @see org.patternfly.overlay.Overlay + */ +@FunctionalInterface +public interface OverlayHandler { + + /** + * Called when the overlay is shown or hidden. + * + * @param event the event that triggered the visibility change + * @param open {@code true} if the overlay was shown, {@code false} if it was hidden + */ + void handle(Event event, boolean open); +} \ No newline at end of file diff --git a/core/src/main/java/org/patternfly/overlay/Overlay.java b/core/src/main/java/org/patternfly/overlay/Overlay.java new file mode 100644 index 000000000..a94b7e22f --- /dev/null +++ b/core/src/main/java/org/patternfly/overlay/Overlay.java @@ -0,0 +1,518 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.overlay; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Predicate; +import java.util.function.Supplier; + +import org.gwtproject.event.shared.HandlerRegistration; +import org.jboss.elemento.By; +import org.jboss.elemento.Elements; +import org.jboss.elemento.Id; +import org.jboss.elemento.logger.Logger; +import org.patternfly.handler.OverlayHandler; +import org.patternfly.style.Classes; +import org.patternfly.style.Placement; + +import elemental2.dom.DOMRect; +import elemental2.dom.Element; +import elemental2.dom.Event; +import elemental2.dom.HTMLElement; + +import static elemental2.dom.DomGlobal.clearTimeout; +import static elemental2.dom.DomGlobal.document; +import static elemental2.dom.DomGlobal.setTimeout; +import static elemental2.dom.DomGlobal.window; +import static org.gwtproject.event.shared.HandlerRegistrations.compose; +import static org.jboss.elemento.EventType.bind; +import static org.jboss.elemento.EventType.click; +import static org.jboss.elemento.EventType.focusin; +import static org.jboss.elemento.EventType.focusout; +import static org.jboss.elemento.EventType.mouseenter; +import static org.jboss.elemento.EventType.mouseleave; +import static org.jboss.elemento.EventType.scroll; +import static org.patternfly.overlay.TriggerMode.manual; +import static org.patternfly.style.Classes.modifier; +import static org.patternfly.style.Placement.auto; +import static org.patternfly.style.Placement.bottom; +import static org.patternfly.style.Placement.left; +import static org.patternfly.style.Placement.right; +import static org.patternfly.style.Placement.top; +import static org.patternfly.style.TypedModifier.swap; + +/** + * Centralized controller for native popover management. Combines CSS anchor positioning, event listener registration, + * entry/exit delay timers, and show/hide lifecycle management into a single reusable unit. + *

    + * Components such as Tooltip and Popover delegate all overlay behavior to this class, keeping their own code focused on + * component-specific concerns (DOM structure, ARIA, content). + * + * @see Popover API + * @see CSS Anchor Positioning + */ +public class Overlay { + + // ------------------------------------------------------ factory + + public static Overlay overlay(HTMLElement overlayElement) { + return new Overlay(overlayElement); + } + + // ------------------------------------------------------ instance + + private static final Logger logger = Logger.getLogger(Overlay.class.getName()); + + private final String id; + private final HTMLElement overlayElement; + private final List toggleHandlers; + + // anchor positioning + private Supplier triggerSupplier; + private HTMLElement trigger; + private boolean cssPositioning; + private boolean matchTriggerWidth; + private int distance; + private Placement placement; + + // trigger mode + private TriggerMode triggerMode; + + // timers + private int entryDelay; + private int exitDelay; + private double showTimeout; + private double hideTimeout; + + // state + private boolean visible; + + // managed handler registrations + private HandlerRegistration triggerHandlers; + private HandlerRegistration overlayHandlers; + private HandlerRegistration outsideClickHandler; + private HandlerRegistration scrollHandler; + + // callbacks + private Predicate shouldShow; + private Predicate shouldHide; + private Predicate stayOpen; + + Overlay(HTMLElement overlayElement) { + this.id = Id.unique("overlay"); + this.overlayElement = overlayElement; + this.toggleHandlers = new ArrayList<>(); + this.cssPositioning = false; + this.matchTriggerWidth = false; + this.distance = 0; + this.placement = auto; + this.triggerMode = manual; + this.entryDelay = 0; + this.exitDelay = 0; + this.showTimeout = 0; + this.hideTimeout = 0; + this.visible = false; + } + + // ------------------------------------------------------ builder + + public Overlay triggerMode(TriggerMode mode) { + this.triggerMode = mode; + return this; + } + + public Overlay trigger(String selector) { + this.triggerSupplier = () -> Elements.querySelector(document.body, By.selector(selector)); + return this; + } + + public Overlay trigger(By selector) { + this.triggerSupplier = () -> Elements.querySelector(document.body, selector); + return this; + } + + public Overlay trigger(HTMLElement element) { + this.triggerSupplier = () -> element; + return this; + } + + public Overlay trigger(Supplier supplier) { + this.triggerSupplier = supplier; + return this; + } + + public Overlay placement(Placement placement) { + this.placement = placement; + return this; + } + + public Overlay distance(int distance) { + this.distance = distance; + return this; + } + + public Overlay entryDelay(int delay) { + this.entryDelay = delay; + return this; + } + + public Overlay exitDelay(int delay) { + this.exitDelay = delay; + return this; + } + + public Overlay cssPositioning(boolean enabled) { + this.cssPositioning = enabled; + return this; + } + + public Overlay matchTriggerWidth(boolean match) { + this.matchTriggerWidth = match; + return this; + } + + public Overlay shouldShow(Predicate predicate) { + this.shouldShow = predicate; + return this; + } + + public Overlay shouldHide(Predicate predicate) { + this.shouldHide = predicate; + return this; + } + + public Overlay stayOpen(Predicate predicate) { + this.stayOpen = predicate; + return this; + } + + // ------------------------------------------------------ events + + /** Register a handler called after show/hide transitions. */ + public Overlay onToggle(OverlayHandler handler) { + if (handler != null) { + this.toggleHandlers.add(handler); + } + return this; + } + + // ------------------------------------------------------ lifecycle + + /** + * Resolves the trigger element, sets up CSS anchor positioning, and registers event listeners based on the configured + * {@link TriggerMode}. Returns the resolved trigger element or {@code null}. + */ + public HTMLElement attach() { + if (triggerSupplier != null) { + trigger = triggerSupplier.get(); + if (trigger != null) { + setupAnchor(); + + // top is the default for auto and recalculated on show() + applyPlacement(placement == auto ? top : placement); + + switch (triggerMode) { + case hover: + registerHoverListeners(); + break; + case click: + registerClickListeners(); + break; + case manual: + break; + } + + if (!cssPositioning) { + scrollHandler = bind(document, scroll, true, e -> recalculatePlacement()); + } + } else { + logger.error("Unable to find trigger element for overlay %o", overlayElement); + } + } else { + logger.error("No trigger element defined for overlay %o", overlayElement); + } + return trigger; + } + + /** + * Removes all event listeners, cancels pending timers, hides the overlay if visible, and tears down CSS anchor positioning. + */ + public void detach() { + cancelTimers(); + if (visible) { + doHide(new Event("")); + } + if (scrollHandler != null) { + scrollHandler.removeHandler(); + scrollHandler = null; + } + if (overlayHandlers != null) { + overlayHandlers.removeHandler(); + overlayHandlers = null; + } + if (outsideClickHandler != null) { + outsideClickHandler.removeHandler(); + outsideClickHandler = null; + } + if (triggerHandlers != null) { + triggerHandlers.removeHandler(); + triggerHandlers = null; + } + teardownAnchor(); + } + + // ------------------------------------------------------ show / hide + + /** Shows the overlay. Respects the {@code shouldShow} predicate. */ + public void show() { + show(new Event("")); + } + + /** Shows the overlay. Respects the {@code shouldShow} predicate. */ + public void show(Event event) { + if (visible || trigger == null) { + return; + } + if (shouldShow != null && !shouldShow.test(event)) { + return; + } + doShow(event); + } + + /** Hides the overlay. Respects the {@code shouldHide} predicate. */ + public void hide() { + hide(new Event("")); + } + + /** Hides the overlay. Respects the {@code shouldHide} predicate. */ + public void hide(Event event) { + if (!visible) { + return; + } + if (shouldHide != null && !shouldHide.test(event)) { + return; + } + doHide(event); + } + + /** Toggles the overlay between shown and hidden states. */ + public void toggle() { + toggle(new Event("")); + } + + /** Toggles the overlay between shown and hidden states. */ + public void toggle(Event event) { + if (visible) { + hide(event); + } else { + show(event); + } + } + + /** Returns whether the overlay is currently visible. */ + public boolean visible() { + return visible; + } + + // ------------------------------------------------------ placement + + /** Removes all placement modifier CSS classes and applies the given placement. */ + public void applyPlacement(Placement placement) { + swap(null, overlayElement, placement, Placement.values()); + } + + /** + * Applies the best placement for the overlay element based on the provided preferred placement and available space around + * the trigger element. + */ + public void applyBestPlacement(Placement preferred) { + applyPlacement(bestPlacement(preferred)); + } + + // ------------------------------------------------------ access + + public HTMLElement overlayElement() { + return overlayElement; + } + + public HTMLElement trigger() { + return trigger; + } + + public boolean cssPositioning() { + return cssPositioning; + } + + public int distance() { + return distance; + } + + // ------------------------------------------------------ internal + + private void setupAnchor() { + String anchorName = "--" + id; + trigger.style.setProperty("anchor-name", anchorName); + overlayElement.style.setProperty("position-anchor", anchorName); + overlayElement.style.setProperty("margin", distance + "px"); + if (cssPositioning) { + overlayElement.classList.add(modifier(Classes.cssPositioning)); + } + } + + private void teardownAnchor() { + if (trigger != null) { + trigger.style.removeProperty("anchor-name"); + overlayElement.classList.remove(modifier(Classes.cssPositioning)); + trigger = null; + } + } + + private void registerHoverListeners() { + triggerHandlers = compose( + bind(trigger, mouseenter, e -> scheduleShow()), + bind(trigger, mouseleave, e -> scheduleHide()), + bind(trigger, focusin, e -> scheduleShow()), + bind(trigger, focusout, e -> scheduleHide())); + overlayHandlers = compose( + bind(overlayElement, mouseenter, e -> cancelTimers()), + bind(overlayElement, mouseleave, e -> scheduleHide())); + } + + private void registerClickListeners() { + triggerHandlers = bind(trigger, click, this::toggleOnClick); + } + + private void toggleOnClick(Event event) { + if (visible) { + hide(event); + } else { + show(event); + } + } + + private void onOutsideClick(Event event) { + if (visible && trigger != null) { + Element target = (Element) event.target; + if (!overlayElement.contains(target) && !trigger.contains(target)) { + if (stayOpen != null && stayOpen.test(event)) { + return; + } + hide(event); + } + } + } + + private void scheduleShow() { + cancelTimers(); + showTimeout = setTimeout(e -> show(), entryDelay); + } + + private void scheduleHide() { + cancelTimers(); + hideTimeout = setTimeout(e -> hide(), exitDelay); + } + + private void cancelTimers() { + clearTimeout(showTimeout); + clearTimeout(hideTimeout); + } + + private void doShow(Event event) { + applyMinWidth(); + if (cssPositioning) { + applyPlacement(placement == auto ? top : placement); + overlayElement.showPopover(); + } else { + overlayElement.style.setProperty("visibility", "hidden"); + overlayElement.showPopover(); + applyBestPlacement(placement); + overlayElement.style.removeProperty("visibility"); + } + visible = true; + if (triggerMode == TriggerMode.click) { + outsideClickHandler = bind(document, click.name, this::onOutsideClick); + } + for (OverlayHandler handler : toggleHandlers) { + handler.handle(event, true); + } + } + + private void doHide(Event event) { + overlayElement.hidePopover(); + visible = false; + if (outsideClickHandler != null) { + outsideClickHandler.removeHandler(); + outsideClickHandler = null; + } + for (OverlayHandler handler : toggleHandlers) { + handler.handle(event, false); + } + } + + private void recalculatePlacement() { + if (visible) { + applyBestPlacement(placement); + } + } + + private Placement bestPlacement(Placement preferred) { + DOMRect triggerRect = trigger.getBoundingClientRect(); + DOMRect overlayRect = overlayElement.getBoundingClientRect(); + double above = triggerRect.top; + double below = window.innerHeight - triggerRect.bottom; + double toLeft = triggerRect.left; + double toRight = window.innerWidth - triggerRect.right; + + boolean topFits = above >= overlayRect.height + distance; + boolean bottomFits = below >= overlayRect.height + distance; + boolean leftFits = toLeft >= overlayRect.width / 3 + distance; + boolean rightFits = toRight >= overlayRect.width / 3 + distance; + + Placement result; + if (preferred != auto) { + // @formatter:off + if (preferred == top && topFits) { result = top; } + else if (preferred == bottom && bottomFits) { result = bottom; } + else if (preferred == left && leftFits) { result = left; } + else if (preferred == right && rightFits) { result = right; } + else { result = null; } + // @formatter:on + } else { + result = null; + } + + if (result == null) { + // @formatter:off + if (topFits && leftFits && rightFits) { result = top; } + else if (rightFits && !leftFits) { result = right; } + else if (leftFits && !rightFits) { result = left; } + else if (topFits) { result = top; } + else if (bottomFits) { result = bottom; } + else { result = toRight >= toLeft ? right : left; } + // @formatter:on + } + + logger.debug("Best placement for %s: preferred=%s, calculated=%s", id, preferred.name(), result.name()); + return result; + } + + private void applyMinWidth() { + if (matchTriggerWidth && trigger != null) { + overlayElement.style.setProperty("min-width", trigger.offsetWidth + "px"); + } + } +} \ No newline at end of file diff --git a/core/src/main/java/org/patternfly/overlay/TriggerMode.java b/core/src/main/java/org/patternfly/overlay/TriggerMode.java new file mode 100644 index 000000000..eedec57ec --- /dev/null +++ b/core/src/main/java/org/patternfly/overlay/TriggerMode.java @@ -0,0 +1,31 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.overlay; + +/** + * Defines how an {@link Overlay} responds to user interaction on its trigger element. + */ +public enum TriggerMode { + + /** Show on mouseenter/focusin, hide on mouseleave/focusout. The overlay element keeps it open on hover. */ + hover, + + /** Toggle on click. Outside-click dismisses. */ + click, + + /** No automatic listeners. The caller controls show/hide programmatically. */ + manual +} \ No newline at end of file diff --git a/overlay-plan.md b/overlay-plan.md new file mode 100644 index 000000000..9ca893718 --- /dev/null +++ b/overlay-plan.md @@ -0,0 +1,201 @@ +# Plan: Centralized Native Popover Manager (`Overlay`) + +## Context + +The project has duplicated popover lifecycle logic across `Tooltip`, `Popover`, and `MenuToggleMenu`: +- Timer management (entry/exit delays, `scheduleShow`/`scheduleHide`/`cancelTimers`) +- Event listener registration/cleanup (hover, click, outside-click, scroll) +- Show/hide with CSS vs JS positioning paths +- Handler registration lifecycle (`attach`/`detach`) + +`AnchorPositioning` handles positioning but explicitly leaves listeners to components, causing each component to reimplement the same patterns. The deprecated `PopperBuilder` was a similar centralized approach but for Popper.js. + +**Goal**: Create a new class that centralizes ALL native popover concerns (positioning + listeners + timers + lifecycle callbacks) so components only manage their DOM structure, ARIA, and content. + +## Package & Name + +**Package: `org.patternfly.overlay`** - a new dedicated package in the core module for the overlay/popover management infrastructure. Clean separation from `org.patternfly.position` (which handles CSS anchor positioning specifics) and `org.patternfly.popper` (deprecated Popper.js wrapper). + +**Name: `Overlay`** - a well-understood UI term for any element that floats above page content (maps to browser "top layer"). Short, works naturally as `Overlay.overlay(element)`. Avoids collision with `Popper` (deprecated), `Popover` (component), and `AnchorPositioning`. + +## Files to Create + +| File | Purpose | +|---|---| +| `core/.../overlay/TriggerMode.java` | Enum: `hover`, `click`, `manual` | +| `core/.../overlay/Overlay.java` | Main class | +| `core/.../handler/OverlayHandler.java` | `@FunctionalInterface` for toggle callbacks | + +## Design + +### `TriggerMode` enum + +```java +package org.patternfly.overlay; + +public enum TriggerMode { + /** mouseenter/focusin shows, mouseleave/focusout hides. Overlay element keeps it open on hover. */ + hover, + /** Click toggles. Outside-click dismisses. */ + click, + /** No automatic listeners. Caller controls show/hide. */ + manual +} +``` + +### `OverlayHandler` functional interface + +```java +package org.patternfly.handler; + +@FunctionalInterface +public interface OverlayHandler { + void handle(Event event, boolean open); +} +``` + +### `Overlay` class structure + +```java +package org.patternfly.overlay; + +public class Overlay { + + // ------------------------------------------------------ factory + public static Overlay overlay(HTMLElement overlayElement) { ... } + + // ------------------------------------------------------ instance + // identity & elements + private final String id; + private final HTMLElement overlayElement; + + // anchor positioning (from AnchorPositioning) + private Supplier triggerSupplier; + private HTMLElement trigger; + private boolean cssPositioning; + private boolean matchTriggerWidth; + private int distance; + private Placement placement; + + // trigger mode + private TriggerMode triggerMode; // default: manual + + // timers + private int entryDelay; + private int exitDelay; + private double showTimeout; + private double hideTimeout; + + // state + private boolean visible; + + // managed handler registrations + private HandlerRegistration triggerHandlers; + private HandlerRegistration overlayHandlers; + private HandlerRegistration outsideClickHandler; + private HandlerRegistration scrollHandler; + + // callbacks + private List toggleHandlers; + private Predicate shouldShow; + private Predicate shouldHide; + private Predicate stayOpen; + + // ------------------------------------------------------ builder + public Overlay triggerMode(TriggerMode mode) { ... } + public Overlay trigger(HTMLElement | By | String | Supplier) { ... } + public Overlay placement(Placement placement) { ... } + public Overlay distance(int distance) { ... } + public Overlay entryDelay(int delay) { ... } + public Overlay exitDelay(int delay) { ... } + public Overlay cssPositioning(boolean enabled) { ... } + public Overlay matchTriggerWidth(boolean match) { ... } + public Overlay shouldShow(Predicate predicate) { ... } + public Overlay shouldHide(Predicate predicate) { ... } + public Overlay stayOpen(Predicate predicate) { ... } + + // ------------------------------------------------------ events + public Overlay onToggle(OverlayHandler handler) { ... } + + // ------------------------------------------------------ lifecycle + /** Resolve trigger, set up CSS anchor, register listeners per TriggerMode. */ + public HTMLElement attach() { ... } + /** Remove all listeners, cancel timers, hide, tear down anchor. */ + public void detach() { ... } + + // ------------------------------------------------------ show / hide + public void show() { ... } // respects shouldShow, CSS vs JS path + public void hide() { ... } // respects shouldHide + public void toggle() { ... } + public boolean visible() { ... } + + // ------------------------------------------------------ placement + public void applyPlacement(Placement placement) { ... } + public void applyBestPlacement(Placement preferred) { ... } + + // ------------------------------------------------------ access + public HTMLElement overlayElement() { ... } + public HTMLElement trigger() { ... } + + // ------------------------------------------------------ internal + private void scheduleShow() { ... } + private void scheduleHide() { ... } + private void cancelTimers() { ... } + private void doShow() { ... } + private void doHide() { ... } + private void registerHoverListeners(HTMLElement trigger) { ... } + private void registerClickListeners(HTMLElement trigger) { ... } + private void onOutsideClick(Event event) { ... } + private void recalculatePlacement() { ... } + private Placement bestPlacement(Placement preferred) { ... } + private void applyMinWidth() { ... } +} +``` + +### Key method behavior + +**`attach()`**: Resolve trigger -> set CSS anchor properties (`anchor-name`, `position-anchor`, `margin`) -> apply initial placement -> register listeners based on `triggerMode` (hover: mouseenter/mouseleave/focusin/focusout on trigger + mouseenter/mouseleave on overlay element; click: click on trigger + outside-click on document; manual: none) -> register scroll handler if `!cssPositioning`. + +**`show()`**: Check `shouldShow` predicate -> apply min-width if `matchTriggerWidth` -> CSS path: apply placement + `showPopover()` / JS path: `visibility:hidden` + `showPopover()` + `bestPlacement()` + remove `visibility:hidden` -> fire `onToggle(event, true)`. + +**`hide()`**: Check `shouldHide` predicate -> `hidePopover()` -> remove outside-click handler -> fire `onToggle(event, false)`. + +**`detach()`**: Cancel timers -> force hide (bypass shouldHide) -> remove all handler registrations -> remove CSS anchor properties -> clear trigger. + +### How components would use it (future migration, not part of this task) + +**Tooltip**: +```java +this.overlay = Overlay.overlay(element()) + .trigger(trigger) + .triggerMode(TriggerMode.hover) + .placement(auto) + .distance(DISTANCE) + .entryDelay(ENTRY_DELAY).exitDelay(EXIT_DELAY) + .cssPositioning(CssPositioning.tooltipEnabled()); +``` + +**Popover**: +```java +this.overlay = Overlay.overlay(element()) + .trigger(trigger) + .triggerMode(TriggerMode.click) // or .hover via hoverable() + .placement(auto) + .distance(DISTANCE) + .cssPositioning(CssPositioning.popoverEnabled()); +``` + +**MenuToggleMenu** (manual mode, keeps its own keyboard handlers): +```java +this.overlay = Overlay.overlay(menuPopover) + .trigger(menuToggle::element) + .triggerMode(TriggerMode.manual) + .placement(bottomStart) + .matchTriggerWidth(true); +``` + +## Verification + +- `mvn verify -Dquickly` to confirm compilation across all modules +- The new class is additive only (no existing code changes), so no regressions expected +- No tests to write yet (planning phase); tests will come when components migrate to use `Overlay` From 6c8d2d3662581fc8c588eff59a3aaa2161825e27 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Wed, 1 Apr 2026 15:04:06 +0200 Subject: [PATCH 085/430] Refactor Popover and Tooltip to use Overlay --- .../patternfly/component/popover/Popover.java | 177 +++--------------- .../patternfly/component/tooltip/Tooltip.java | 163 ++++------------ .../{position => overlay}/CssPositioning.java | 5 +- .../java/org/patternfly/overlay/Overlay.java | 10 +- 4 files changed, 72 insertions(+), 283 deletions(-) rename core/src/main/java/org/patternfly/{position => overlay}/CssPositioning.java (94%) diff --git a/components/src/main/java/org/patternfly/component/popover/Popover.java b/components/src/main/java/org/patternfly/component/popover/Popover.java index f0e8527bb..227e022ba 100644 --- a/components/src/main/java/org/patternfly/component/popover/Popover.java +++ b/components/src/main/java/org/patternfly/component/popover/Popover.java @@ -19,12 +19,10 @@ import java.util.List; import java.util.function.Supplier; -import org.gwtproject.event.shared.HandlerRegistration; import org.jboss.elemento.Attachable; import org.jboss.elemento.By; import org.jboss.elemento.Elements; import org.jboss.elemento.Id; -import org.jboss.elemento.logger.Logger; import org.patternfly.component.BaseComponent; import org.patternfly.component.Closeable; import org.patternfly.component.ComponentIcon; @@ -34,8 +32,8 @@ import org.patternfly.core.Aria; import org.patternfly.core.Attributes; import org.patternfly.handler.CloseHandler; -import org.patternfly.position.AnchorPositioning; -import org.patternfly.position.CssPositioning; +import org.patternfly.overlay.CssPositioning; +import org.patternfly.overlay.Overlay; import org.patternfly.style.Classes; import org.patternfly.style.Modifiers.NoPadding; import org.patternfly.style.Placement; @@ -46,20 +44,11 @@ import elemental2.dom.HTMLElement; import elemental2.dom.MutationRecord; -import static elemental2.dom.DomGlobal.clearTimeout; import static elemental2.dom.DomGlobal.document; -import static elemental2.dom.DomGlobal.setTimeout; -import static org.gwtproject.event.shared.HandlerRegistrations.compose; import static org.jboss.elemento.Elements.div; import static org.jboss.elemento.Elements.failSafeRemoveFromParent; import static org.jboss.elemento.Elements.insertFirst; -import static org.jboss.elemento.EventType.bind; import static org.jboss.elemento.EventType.click; -import static org.jboss.elemento.EventType.focusin; -import static org.jboss.elemento.EventType.focusout; -import static org.jboss.elemento.EventType.mouseenter; -import static org.jboss.elemento.EventType.mouseleave; -import static org.jboss.elemento.EventType.scroll; import static org.patternfly.component.button.Button.button; import static org.patternfly.component.popover.PopoverHeader.popoverHeader; import static org.patternfly.core.Aria.describedBy; @@ -71,13 +60,14 @@ import static org.patternfly.handler.CloseHandler.fireEvent; import static org.patternfly.handler.CloseHandler.shouldClose; import static org.patternfly.icon.IconSets.fas.times; +import static org.patternfly.overlay.Overlay.overlay; +import static org.patternfly.overlay.TriggerMode.hover; import static org.patternfly.style.Classes.arrow; import static org.patternfly.style.Classes.close; import static org.patternfly.style.Classes.component; import static org.patternfly.style.Classes.content; import static org.patternfly.style.Classes.modifier; import static org.patternfly.style.Classes.widthAuto; -import static org.patternfly.style.Placement.auto; import static org.patternfly.style.Placement.top; /** @@ -115,30 +105,19 @@ public static Popover popover(Supplier trigger) { // ------------------------------------------------------ instance - private static final Logger logger = Logger.getLogger(Popover.class.getName()); - public static final int DISTANCE = 20; public static final int ENTRY_DELAY = 300; public static final int EXIT_DELAY = 300; - private final AnchorPositioning ap; + private final Overlay overlay; private final HTMLElement contentElement; private final List> closeHandler; private boolean showClose; private boolean hoverable; - private int entryDelay; - private int exitDelay; - private double showTimeout; - private double hideTimeout; - private Placement placement; private Severity severity; private Button closeButton; private PopoverHeader header; - private HandlerRegistration triggerHandlers; - private HandlerRegistration anchorHandlers; - private HandlerRegistration outsideClickHandler; - private HandlerRegistration scrollHandler; Popover(Supplier trigger) { super(ComponentType.Popover, div().css(component(Classes.popover), top.modifier()) @@ -147,16 +126,15 @@ public static Popover popover(Supplier trigger) { .attr(Attributes.popover, "manual") .element()); - String id = Id.unique(componentType().id); - this.ap = new AnchorPositioning(id, element(), trigger, DISTANCE, CssPositioning.popoverEnabled(), false); + this.overlay = overlay(element()) + .trigger(trigger) + .distance(DISTANCE) + .entryDelay(ENTRY_DELAY) + .exitDelay(EXIT_DELAY) + .cssPositioning(CssPositioning.popoverEnabled()); this.closeHandler = new ArrayList<>(); this.showClose = true; this.hoverable = false; - this.showTimeout = 0; - this.hideTimeout = 0; - this.entryDelay = ENTRY_DELAY; - this.exitDelay = EXIT_DELAY; - this.placement = auto; String bodyId = Id.unique(componentType().id, "body"); element().appendChild(div().css(component(Classes.popover, arrow)).element()); @@ -173,55 +151,18 @@ public void attach(MutationRecord mutationRecord) { failSafeRemoveFromParent(closeButton); } - HTMLElement trigger = ap.attach(); - if (trigger != null) { - // top is the default for auto and recalculated on show() - ap.applyPlacement(placement == auto ? top : placement); - - if (hoverable) { - triggerHandlers = compose( - bind(trigger, mouseenter, e -> scheduleShow()), - bind(trigger, mouseleave, e -> scheduleHide()), - bind(trigger, focusin, e -> scheduleShow()), - bind(trigger, focusout, e -> scheduleHide())); - anchorHandlers = compose( - bind(element(), mouseenter, e -> cancelTimers()), - bind(element(), mouseleave, e -> scheduleHide())); - - } else { - triggerHandlers = bind(trigger, click, this::togglePopover); - } - - if (!ap.cssPositioning()) { - scrollHandler = bind(document, scroll, true, e -> recalculatePlacement()); + overlay.triggerMode(hoverable ? hover : org.patternfly.overlay.TriggerMode.click); + overlay.onToggle((event, open) -> { + if (!open) { + fireEvent(this, closeHandler, event, true); } - - } else if (ap.hasTriggerSupplier()) { - logger.error("Unable to find trigger element for popover %o", element()); - } else { - logger.error("No trigger element defined for popover %o", element()); - } + }); + overlay.attach(); } @Override public void detach(MutationRecord mutationRecord) { - cancelTimers(); - if (ap.visible()) { - ap.hide(); - } - if (scrollHandler != null) { - scrollHandler.removeHandler(); - } - if (anchorHandlers != null) { - anchorHandlers.removeHandler(); - } - if (outsideClickHandler != null) { - outsideClickHandler.removeHandler(); - } - if (triggerHandlers != null) { - triggerHandlers.removeHandler(); - } - ap.detach(); + overlay.detach(); } // ------------------------------------------------------ add @@ -299,17 +240,17 @@ public Popover closable(CloseHandler closeHandler) { } public Popover distance(int distance) { - ap.distance(distance); + overlay.distance(distance); return this; } public Popover entryDelay(int delay) { - this.entryDelay = delay; + overlay.entryDelay(delay); return this; } public Popover exitDelay(int delay) { - this.exitDelay = delay; + overlay.exitDelay(delay); return this; } @@ -343,7 +284,7 @@ public Popover noClose() { } public Popover placement(Placement placement) { - this.placement = placement; + overlay.placement(placement); return this; } @@ -362,22 +303,22 @@ public Popover status(Severity severity, String screenReaderText) { } public Popover trigger(String trigger) { - ap.trigger(trigger); + overlay.trigger(trigger); return this; } public Popover trigger(By trigger) { - ap.trigger(trigger); + overlay.trigger(trigger); return this; } public Popover trigger(HTMLElement trigger) { - ap.trigger(trigger); + overlay.trigger(trigger); return this; } public Popover trigger(Supplier trigger) { - ap.trigger(trigger); + overlay.trigger(trigger); return this; } @@ -418,80 +359,18 @@ public Popover onClose(CloseHandler closeHandler) { // ------------------------------------------------------ api public void show() { - if (!ap.visible() && ap.trigger() != null) { - if (ap.cssPositioning()) { - // CSS handles position-try-fallbacks; just apply preferred placement and show - ap.applyPlacement(placement == auto ? top : placement); - ap.show(); - } else { - // JS calculates the best placement via viewport measurements. - // For the calculation to work, the tooltip must be at least hidden - style("visibility", "hidden"); - ap.show(); - ap.applyBestPlacement(placement); - element().style.removeProperty("visibility"); - } - if (!hoverable) { - outsideClickHandler = bind(document, click.name, this::onOutsideClick); - } - } + overlay.show(); } @Override public void close(Event event, boolean fireEvent) { if (shouldClose(this, closeHandler, event, fireEvent)) { - if (ap.visible()) { - ap.hide(); - if (outsideClickHandler != null) { - outsideClickHandler.removeHandler(); - outsideClickHandler = null; - } - fireEvent(this, closeHandler, event, fireEvent); - } + overlay.hide(event); } } // ------------------------------------------------------ internal - private void scheduleShow() { - cancelTimers(); - showTimeout = setTimeout(e -> show(), entryDelay); - } - - private void scheduleHide() { - cancelTimers(); - hideTimeout = setTimeout(e -> close(new Event(""), true), exitDelay); - } - - private void recalculatePlacement() { - if (ap.visible()) { - ap.applyBestPlacement(placement); - } - } - - private void cancelTimers() { - clearTimeout(showTimeout); - clearTimeout(hideTimeout); - } - - private void togglePopover(Event event) { - if (ap.visible()) { - close(event, true); - } else { - show(); - } - } - - private void onOutsideClick(Event event) { - HTMLElement trigger = ap.trigger(); - if (ap.visible() && trigger != null) { - Element target = (Element) event.target; - if (!element().contains(target) && !trigger.contains(target)) { - close(event, true); - } - } - } - private PopoverHeader failSafeHeader() { if (header == null) { add(popoverHeader()); diff --git a/components/src/main/java/org/patternfly/component/tooltip/Tooltip.java b/components/src/main/java/org/patternfly/component/tooltip/Tooltip.java index fe02ac4e2..5a05f8f9c 100644 --- a/components/src/main/java/org/patternfly/component/tooltip/Tooltip.java +++ b/components/src/main/java/org/patternfly/component/tooltip/Tooltip.java @@ -19,21 +19,19 @@ import java.util.List; import java.util.function.Supplier; -import org.gwtproject.event.shared.HandlerRegistration; import org.jboss.elemento.Attachable; import org.jboss.elemento.By; import org.jboss.elemento.ElementContainerDelegate; import org.jboss.elemento.ElementTextDelegate; import org.jboss.elemento.Elements; import org.jboss.elemento.Id; -import org.jboss.elemento.logger.Logger; import org.patternfly.component.BaseComponent; import org.patternfly.component.Closeable; import org.patternfly.component.ComponentType; import org.patternfly.core.Roles; import org.patternfly.handler.CloseHandler; -import org.patternfly.position.AnchorPositioning; -import org.patternfly.position.CssPositioning; +import org.patternfly.overlay.Overlay; +import org.patternfly.overlay.CssPositioning; import org.patternfly.style.Classes; import org.patternfly.style.Placement; @@ -43,17 +41,8 @@ import elemental2.dom.HTMLElement; import elemental2.dom.MutationRecord; -import static elemental2.dom.DomGlobal.clearTimeout; import static elemental2.dom.DomGlobal.document; -import static elemental2.dom.DomGlobal.setTimeout; -import static org.gwtproject.event.shared.HandlerRegistrations.compose; import static org.jboss.elemento.Elements.div; -import static org.jboss.elemento.EventType.bind; -import static org.jboss.elemento.EventType.focusin; -import static org.jboss.elemento.EventType.focusout; -import static org.jboss.elemento.EventType.mouseenter; -import static org.jboss.elemento.EventType.mouseleave; -import static org.jboss.elemento.EventType.scroll; import static org.patternfly.component.tooltip.TriggerAria.describedBy; import static org.patternfly.component.tooltip.TriggerAria.none; import static org.patternfly.core.Aria.live; @@ -61,14 +50,14 @@ import static org.patternfly.core.Attributes.role; import static org.patternfly.handler.CloseHandler.fireEvent; import static org.patternfly.handler.CloseHandler.shouldClose; +import static org.patternfly.overlay.Overlay.overlay; +import static org.patternfly.overlay.TriggerMode.hover; import static org.patternfly.style.Classes.arrow; import static org.patternfly.style.Classes.component; import static org.patternfly.style.Classes.content; import static org.patternfly.style.Classes.modifier; import static org.patternfly.style.Classes.textAlignLeft; import static org.patternfly.style.Classes.tooltip; -import static org.patternfly.style.Placement.auto; -import static org.patternfly.style.Placement.top; /** * A tooltip is in-app messaging used to identify elements on a page with short, clarifying text. @@ -120,26 +109,15 @@ public static Tooltip tooltip(Supplier trigger, String text) { // ------------------------------------------------------ instance - private static final Logger logger = Logger.getLogger(Tooltip.class.getName()); - public static final int DISTANCE = 15; public static final int ENTRY_DELAY = 300; public static final int EXIT_DELAY = 300; private final String id; - private final AnchorPositioning ap; + private final Overlay overlay; private final HTMLElement contentElement; private final List> closeHandler; - - private int entryDelay; - private int exitDelay; - private double showTimeout; - private double hideTimeout; - private Placement placement; private TriggerAria aria; - private HandlerRegistration triggerHandlers; - private HandlerRegistration anchorHandlers; - private HandlerRegistration scrollHandler; Tooltip(Supplier trigger, String text) { super(ComponentType.Tooltip, div().css(component(Classes.tooltip)) @@ -149,13 +127,14 @@ public static Tooltip tooltip(Supplier trigger, String text) { .element()); this.id = Id.unique(componentType().id); - this.ap = new AnchorPositioning(id, element(), trigger, DISTANCE, CssPositioning.tooltipEnabled(), false); + this.overlay = overlay(element()) + .triggerMode(hover) + .trigger(trigger) + .distance(DISTANCE) + .entryDelay(ENTRY_DELAY) + .exitDelay(EXIT_DELAY) + .cssPositioning(CssPositioning.tooltipEnabled()); this.closeHandler = new ArrayList<>(); - this.showTimeout = 0; - this.hideTimeout = 0; - this.entryDelay = ENTRY_DELAY; - this.exitDelay = EXIT_DELAY; - this.placement = auto; this.aria = describedBy; id(id); @@ -179,63 +158,41 @@ public Element textDelegate() { @Override public void attach(MutationRecord mutationRecord) { - HTMLElement trigger = ap.attach(); - if (trigger != null) { - // top is the default for auto and recalculated on show() - ap.applyPlacement(placement == auto ? top : placement); - - triggerHandlers = compose( - bind(trigger, mouseenter, e -> scheduleShow()), - bind(trigger, mouseleave, e -> scheduleHide()), - bind(trigger, focusin, e -> scheduleShow()), - bind(trigger, focusout, e -> scheduleHide())); - anchorHandlers = compose( - bind(element(), mouseenter, e -> cancelTimers()), - bind(element(), mouseleave, e -> scheduleHide())); - - if (!ap.cssPositioning()) { - scrollHandler = bind(document, scroll, true, e -> recalculatePlacement()); + overlay.onToggle((event, open) -> { + HTMLElement trigger = overlay.trigger(); + if (open) { + if (aria != none && trigger != null) { + trigger.setAttribute(aria.attribute, id); + } + } else { + if (aria != none && trigger != null) { + trigger.removeAttribute(aria.attribute); + } + fireEvent(this, closeHandler, event, true); } - - } else if (ap.hasTriggerSupplier()) { - logger.error("Unable to find trigger element for tooltip %o", element()); - } else { - logger.error("No trigger element defined for tooltip %o", element()); - } + }); + overlay.attach(); } @Override public void detach(MutationRecord mutationRecord) { - cancelTimers(); - if (ap.visible()) { - ap.hide(); - } - if (scrollHandler != null) { - scrollHandler.removeHandler(); - } - if (anchorHandlers != null) { - anchorHandlers.removeHandler(); - } - if (triggerHandlers != null) { - triggerHandlers.removeHandler(); - } - ap.detach(); + overlay.detach(); } // ------------------------------------------------------ builder public Tooltip distance(int distance) { - ap.distance(distance); + overlay.distance(distance); return this; } public Tooltip entryDelay(int delay) { - this.entryDelay = delay; + overlay.entryDelay(delay); return this; } public Tooltip exitDelay(int delay) { - this.exitDelay = delay; + overlay.exitDelay(delay); return this; } @@ -245,27 +202,27 @@ public Tooltip leftAligned() { } public Tooltip placement(Placement placement) { - this.placement = placement; + overlay.placement(placement); return this; } public Tooltip trigger(String trigger) { - ap.trigger(trigger); + overlay.trigger(trigger); return this; } public Tooltip trigger(By trigger) { - ap.trigger(trigger); + overlay.trigger(trigger); return this; } public Tooltip trigger(HTMLElement trigger) { - ap.trigger(trigger); + overlay.trigger(trigger); return this; } public Tooltip trigger(Supplier trigger) { - ap.trigger(trigger); + overlay.trigger(trigger); return this; } @@ -294,37 +251,13 @@ public Tooltip onClose(CloseHandler closeHandler) { // ------------------------------------------------------ api public void show() { - HTMLElement trigger = ap.trigger(); - if (!ap.visible() && trigger != null) { - if (ap.cssPositioning()) { - // CSS handles position-try-fallbacks; just apply preferred placement and show - ap.applyPlacement(placement == auto ? top : placement); - ap.show(); - } else { - // JS calculates the best placement via viewport measurements. - // For the calculation to work, the tooltip must be at least hidden - style("visibility", "hidden"); - ap.show(); - ap.applyBestPlacement(placement); - element().style.removeProperty("visibility"); - } - if (aria != none) { - trigger.setAttribute(aria.attribute, id); - } - } + overlay.show(); } @Override public void close(Event event, boolean fireEvent) { if (shouldClose(this, closeHandler, event, fireEvent)) { - if (ap.visible()) { - ap.hide(); - HTMLElement trigger = ap.trigger(); - if (aria != none && trigger != null) { - trigger.removeAttribute(aria.attribute); - } - fireEvent(this, closeHandler, event, fireEvent); - } + overlay.hide(event); } } @@ -332,28 +265,4 @@ public void close(Event event, boolean fireEvent) { public String text() { return Elements.textNode(contentElement); } - - // ------------------------------------------------------ internal - - private void scheduleShow() { - cancelTimers(); - showTimeout = setTimeout(e -> show(), entryDelay); - } - - private void scheduleHide() { - cancelTimers(); - hideTimeout = setTimeout(e -> close(new Event(""), true), exitDelay); - } - - private void recalculatePlacement() { - if (ap.visible()) { - ap.applyBestPlacement(placement); - } - } - - private void cancelTimers() { - clearTimeout(showTimeout); - clearTimeout(hideTimeout); - } - } diff --git a/core/src/main/java/org/patternfly/position/CssPositioning.java b/core/src/main/java/org/patternfly/overlay/CssPositioning.java similarity index 94% rename from core/src/main/java/org/patternfly/position/CssPositioning.java rename to core/src/main/java/org/patternfly/overlay/CssPositioning.java index 9ebe8d788..ca835dcb9 100644 --- a/core/src/main/java/org/patternfly/position/CssPositioning.java +++ b/core/src/main/java/org/patternfly/overlay/CssPositioning.java @@ -13,8 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.patternfly.position; +package org.patternfly.overlay; +import org.patternfly.style.Placement; import org.patternfly.style.Variable; import static elemental2.dom.DomGlobal.document; @@ -27,7 +28,7 @@ /** * Reads and caches the CSS custom properties that control whether tooltip and popover components use native CSS positioning - * ({@code position-try-fallbacks}) or JavaScript-based positioning ({@code NativeAnchor.bestPlacement()}). + * ({@code position-try-fallbacks}) or JavaScript-based positioning ({@link Overlay#applyBestPlacement(Placement)}). *

    * To enable CSS positioning, set the corresponding custom property on {@code :root}: *

    diff --git a/core/src/main/java/org/patternfly/overlay/Overlay.java b/core/src/main/java/org/patternfly/overlay/Overlay.java
    index a94b7e22f..6e6195d7f 100644
    --- a/core/src/main/java/org/patternfly/overlay/Overlay.java
    +++ b/core/src/main/java/org/patternfly/overlay/Overlay.java
    @@ -323,11 +323,6 @@ public void toggle(Event event) {
             }
         }
     
    -    /** Returns whether the overlay is currently visible. */
    -    public boolean visible() {
    -        return visible;
    -    }
    -
         // ------------------------------------------------------ placement
     
         /** Removes all placement modifier CSS classes and applies the given placement. */
    @@ -361,6 +356,11 @@ public int distance() {
             return distance;
         }
     
    +    /** Returns whether the overlay is currently visible. */
    +    public boolean visible() {
    +        return visible;
    +    }
    +
         // ------------------------------------------------------ internal
     
         private void setupAnchor() {
    
    From 1c7c631b6605fc35cfc8046907b35f4e38122b89 Mon Sep 17 00:00:00 2001
    From: Harald Pehl 
    Date: Wed, 1 Apr 2026 18:22:23 +0200
    Subject: [PATCH 086/430] Refactor Overlay
    
    ---
     .../component/menu/MenuToggleMenu.java        |  37 ++-
     .../component/menu/PopperMenuToggleMenu.java  |  10 +-
     .../patternfly/component/popover/Popover.java |   9 +-
     .../component/popover/PopperPopover.java      |  10 +-
     .../component/tabs/OverflowTab.java           |   5 +-
     .../component/tooltip/PopperTooltip.java      |  10 +-
     .../patternfly/component/tooltip/Tooltip.java |   5 +-
     .../java/org/patternfly/overlay/Overlay.java  | 117 +++-----
     .../org/patternfly/overlay/package-info.java  |  70 +++++
     .../java/org/patternfly/popper/Modifiers.java |   8 +-
     .../org/patternfly/popper/PopperBuilder.java  |   8 +-
     .../position/AnchorPositioning.java           | 253 ------------------
     .../org/patternfly/position/package-info.java |  25 --
     .../java/org/patternfly/style/Placement.java  |  18 --
     .../org/patternfly/style/TypedModifier.java   |   6 +
     .../org/patternfly/showcase/SnippetPage.java  |   6 +-
     .../showcase/component/PopoverComponent.java  |   3 +-
     .../showcase/component/TooltipComponent.java  |   4 +-
     18 files changed, 159 insertions(+), 445 deletions(-)
     create mode 100644 core/src/main/java/org/patternfly/overlay/package-info.java
     delete mode 100644 core/src/main/java/org/patternfly/position/AnchorPositioning.java
     delete mode 100644 core/src/main/java/org/patternfly/position/package-info.java
    
    diff --git a/components/src/main/java/org/patternfly/component/menu/MenuToggleMenu.java b/components/src/main/java/org/patternfly/component/menu/MenuToggleMenu.java
    index 5813bfc02..e93a1e2b3 100644
    --- a/components/src/main/java/org/patternfly/component/menu/MenuToggleMenu.java
    +++ b/components/src/main/java/org/patternfly/component/menu/MenuToggleMenu.java
    @@ -32,7 +32,7 @@
     import org.patternfly.core.Aria;
     import org.patternfly.handler.ComponentHandler;
     import org.patternfly.handler.ToggleHandler;
    -import org.patternfly.position.AnchorPositioning;
    +import org.patternfly.overlay.Overlay;
     import org.patternfly.style.Classes;
     import org.patternfly.style.Modifiers.Disabled;
     import org.patternfly.style.Placement;
    @@ -56,10 +56,9 @@
     import static org.jboss.elemento.Key.ArrowUp;
     import static org.jboss.elemento.Key.Escape;
     import static org.jboss.elemento.Key.Tab;
    -import static org.patternfly.core.Attributes.popover;
    +import static org.patternfly.overlay.Overlay.overlay;
     import static org.patternfly.style.Classes.component;
     import static org.patternfly.style.Classes.list;
    -import static org.patternfly.style.Placement.auto;
     import static org.patternfly.style.Placement.bottomStart;
     
     /**
    @@ -67,7 +66,7 @@
      * {@link SingleSelect}, {@link SingleTypeahead}, or {@link MultiSelect}.
      * 

    * The component delegates to the {@link MenuToggle} component. The {@link Menu} is managed using the native Popover API and CSS - * anchor positioning via {@link AnchorPositioning}. + * anchor positioning via {@link Overlay}. */ abstract class MenuToggleMenu> extends ComponentDelegate implements @@ -78,10 +77,9 @@ abstract class MenuToggleMenu> extends Co // ------------------------------------------------------ instance private static final Logger logger = Logger.getLogger(MenuToggleMenu.class.getName()); - private static final int DISTANCE = 0; final MenuToggle menuToggle; - final AnchorPositioning ap; + final Overlay overlay; Menu menu; private final HTMLElement menuPopover; private final List> toggleHandler; @@ -99,13 +97,13 @@ abstract class MenuToggleMenu> extends Co this.menuToggle = menuToggle; this.toggleHandler = new ArrayList<>(); this.loadedHandler = new ArrayList<>(); - this.placement = auto; + this.placement = bottomStart; - String id = Id.unique(componentType().id); - menuPopover = div().css(component(Classes.menu, Classes.popover)) - .attr(popover, "manual") - .element(); - ap = new AnchorPositioning(id, menuPopover, menuToggle::element, DISTANCE, true, true); + menuPopover = div().css(component(Classes.menu, Classes.popover)).element(); + overlay = overlay(menuPopover, bottomStart) + .trigger(menuToggle::element) + .cssPositioning(true) + .matchTriggerWidth(true); delegateTo(menuToggle.element()); Attachable.register(menuToggle.element(), this); @@ -118,8 +116,7 @@ public void attach(MutationRecord mutationRecord) { menuToggle.disabled(true); } insertAfter(menuPopover, menuToggle.element()); - ap.attach(); - ap.applyPlacement(placement == auto ? bottomStart : placement); + overlay.attach(); menuToggleClickHandler = bind(menuToggle.toggleElement, click, this::onMenuToggleClick); menuClickHandler = bind(menu, click, this::onMenuClick); keyHandler = bind(window, keydown, this::keyHandler); @@ -132,7 +129,7 @@ public void attach(MutationRecord mutationRecord) { @Override public void detach(MutationRecord mutationRecord) { if (expanded()) { - ap.hide(); + overlay.hide(); } if (outsideClickHandler != null) { outsideClickHandler.removeHandler(); @@ -146,9 +143,7 @@ public void detach(MutationRecord mutationRecord) { if (menuToggleClickHandler != null) { menuToggleClickHandler.removeHandler(); } - if (ap != null) { - ap.detach(); - } + overlay.detach(); } // ------------------------------------------------------ add @@ -190,6 +185,7 @@ public boolean isDisabled() { public B placement(Placement placement) { this.placement = placement; + overlay.placement(placement); return that(); } @@ -227,7 +223,7 @@ public B onToggle(ToggleHandler toggleHandler) { @Override public void collapse(boolean fireEvent) { if (expanded()) { - ap.hide(); + overlay.hide(); Expandable.collapse(element(), element(), null); if (outsideClickHandler != null) { outsideClickHandler.removeHandler(); @@ -243,8 +239,7 @@ public void collapse(boolean fireEvent) { @Override public void expand(boolean fireEvent) { if (!expanded() && !isDisabled()) { - ap.applyPlacement(placement == auto ? bottomStart : placement); - ap.show(); + overlay.show(); Expandable.expand(element(), element(), null); outsideClickHandler = bind(document, click, this::onOutsideClick); if (fireEvent) { diff --git a/components/src/main/java/org/patternfly/component/menu/PopperMenuToggleMenu.java b/components/src/main/java/org/patternfly/component/menu/PopperMenuToggleMenu.java index e97c07cd4..1ae32039a 100644 --- a/components/src/main/java/org/patternfly/component/menu/PopperMenuToggleMenu.java +++ b/components/src/main/java/org/patternfly/component/menu/PopperMenuToggleMenu.java @@ -41,7 +41,7 @@ import org.patternfly.popper.TriggerAction; import org.patternfly.style.Classes; import org.patternfly.style.Modifiers.Disabled; -import org.patternfly.style.Placement; +import org.patternfly.popper.PopperPlacement; import elemental2.core.JsArray; import elemental2.dom.Event; @@ -61,8 +61,8 @@ import static org.jboss.elemento.Key.Tab; import static org.patternfly.style.Classes.component; import static org.patternfly.style.Classes.list; -import static org.patternfly.style.Placement.auto; -import static org.patternfly.style.Placement.bottomStart; +import static org.patternfly.popper.PopperPlacement.auto; +import static org.patternfly.popper.PopperPlacement.bottomStart; /** * Abstract base component for components that combine a {@link MenuToggle} and a {@link Menu}, such as {@link PopperDropdown}, @@ -89,7 +89,7 @@ abstract class PopperMenuToggleMenu> exte private int zIndex; private boolean flip; private boolean disabled; - private Placement placement; + private PopperPlacement placement; private Popper popper; private HandlerRegistration keyHandler; private Predicate stayOpen; @@ -186,7 +186,7 @@ public B flip(boolean flip) { return that(); } - public B placement(Placement placement) { + public B placement(PopperPlacement placement) { if (placement == auto) { flip = true; } diff --git a/components/src/main/java/org/patternfly/component/popover/Popover.java b/components/src/main/java/org/patternfly/component/popover/Popover.java index 227e022ba..fec300eaf 100644 --- a/components/src/main/java/org/patternfly/component/popover/Popover.java +++ b/components/src/main/java/org/patternfly/component/popover/Popover.java @@ -30,14 +30,13 @@ import org.patternfly.component.Severity; import org.patternfly.component.button.Button; import org.patternfly.core.Aria; -import org.patternfly.core.Attributes; import org.patternfly.handler.CloseHandler; import org.patternfly.overlay.CssPositioning; import org.patternfly.overlay.Overlay; +import org.patternfly.overlay.TriggerMode; import org.patternfly.style.Classes; import org.patternfly.style.Modifiers.NoPadding; import org.patternfly.style.Placement; - import elemental2.dom.Element; import elemental2.dom.Event; import elemental2.dom.HTMLDivElement; @@ -61,7 +60,6 @@ import static org.patternfly.handler.CloseHandler.shouldClose; import static org.patternfly.icon.IconSets.fas.times; import static org.patternfly.overlay.Overlay.overlay; -import static org.patternfly.overlay.TriggerMode.hover; import static org.patternfly.style.Classes.arrow; import static org.patternfly.style.Classes.close; import static org.patternfly.style.Classes.component; @@ -123,10 +121,9 @@ public static Popover popover(Supplier trigger) { super(ComponentType.Popover, div().css(component(Classes.popover), top.modifier()) .attr(role, dialog) .aria(modal, true) - .attr(Attributes.popover, "manual") .element()); - this.overlay = overlay(element()) + this.overlay = overlay(element(), top) .trigger(trigger) .distance(DISTANCE) .entryDelay(ENTRY_DELAY) @@ -151,7 +148,7 @@ public void attach(MutationRecord mutationRecord) { failSafeRemoveFromParent(closeButton); } - overlay.triggerMode(hoverable ? hover : org.patternfly.overlay.TriggerMode.click); + overlay.triggerMode(hoverable ? TriggerMode.hover : TriggerMode.click); overlay.onToggle((event, open) -> { if (!open) { fireEvent(this, closeHandler, event, true); diff --git a/components/src/main/java/org/patternfly/component/popover/PopperPopover.java b/components/src/main/java/org/patternfly/component/popover/PopperPopover.java index faac93a8a..0a3acde3e 100644 --- a/components/src/main/java/org/patternfly/component/popover/PopperPopover.java +++ b/components/src/main/java/org/patternfly/component/popover/PopperPopover.java @@ -39,7 +39,7 @@ import org.patternfly.popper.PopperBuilder; import org.patternfly.popper.TriggerAction; import org.patternfly.style.Modifiers.NoPadding; -import org.patternfly.style.Placement; +import org.patternfly.popper.PopperPlacement; import elemental2.dom.Element; import elemental2.dom.Event; @@ -74,8 +74,8 @@ import static org.patternfly.style.Classes.modifier; import static org.patternfly.style.Classes.popover; import static org.patternfly.style.Classes.widthAuto; -import static org.patternfly.style.Placement.auto; -import static org.patternfly.style.Placement.top; +import static org.patternfly.popper.PopperPlacement.auto; +import static org.patternfly.popper.PopperPlacement.top; /** * A popover is in-app messaging that provides more information on specific product areas. Popovers display content in a new @@ -126,7 +126,7 @@ public static PopperPopover popover(Supplier trigger) { private int animationDuration; private int zIndex; private Popper popper; - private Placement placement; + private PopperPlacement placement; private Button closeButton; private Severity severity; private PopperPopoverHeader header; @@ -316,7 +316,7 @@ public PopperPopover noClose() { return this; } - public PopperPopover placement(Placement placement) { + public PopperPopover placement(PopperPlacement placement) { if (placement == auto) { flip = true; } diff --git a/components/src/main/java/org/patternfly/component/tabs/OverflowTab.java b/components/src/main/java/org/patternfly/component/tabs/OverflowTab.java index 14d62977c..62bc02112 100644 --- a/components/src/main/java/org/patternfly/component/tabs/OverflowTab.java +++ b/components/src/main/java/org/patternfly/component/tabs/OverflowTab.java @@ -28,7 +28,6 @@ import org.patternfly.component.menu.MenuItem; import org.patternfly.component.menu.MenuList; import org.patternfly.core.Aria; -import org.patternfly.core.Attributes; import org.patternfly.core.Roles; import org.patternfly.overlay.Overlay; import org.patternfly.overlay.TriggerMode; @@ -106,7 +105,6 @@ static OverflowTab overflowTab() { HTMLElement menuPopover; add(menuPopover = div().css(component(Classes.menu, Classes.popover)) - .attr(Attributes.popover, "manual") .add(menu = menu(select, single) .onSingleSelect((event, menuItem, selected) -> select(menuItem)) .addContent(menuContent() @@ -114,10 +112,9 @@ static OverflowTab overflowTab() { .addItems(tabs.values(), tab -> menuItem(tab.identifier(), tab.text()))))) .element()); - overlay = overlay(menuPopover) + overlay = overlay(menuPopover, bottomStart) .trigger(button::element) .triggerMode(TriggerMode.click) - .placement(bottomStart) .cssPositioning(true) .onToggle((event, open) -> { if (open) { diff --git a/components/src/main/java/org/patternfly/component/tooltip/PopperTooltip.java b/components/src/main/java/org/patternfly/component/tooltip/PopperTooltip.java index eb6508cfe..826baac9f 100644 --- a/components/src/main/java/org/patternfly/component/tooltip/PopperTooltip.java +++ b/components/src/main/java/org/patternfly/component/tooltip/PopperTooltip.java @@ -36,7 +36,7 @@ import org.patternfly.popper.Popper; import org.patternfly.popper.PopperBuilder; import org.patternfly.popper.TriggerAction; -import org.patternfly.style.Placement; +import org.patternfly.popper.PopperPlacement; import elemental2.dom.Event; import elemental2.dom.HTMLDivElement; @@ -63,8 +63,8 @@ import static org.patternfly.style.Classes.modifier; import static org.patternfly.style.Classes.textAlignLeft; import static org.patternfly.style.Classes.tooltip; -import static org.patternfly.style.Placement.auto; -import static org.patternfly.style.Placement.top; +import static org.patternfly.popper.PopperPlacement.auto; +import static org.patternfly.popper.PopperPlacement.top; /** * A tooltip is in-app messaging used to identify elements on a page with short, clarifying text. @@ -134,7 +134,7 @@ public static PopperTooltip tooltip(Supplier trigger, String text) private int zIndex; private Popper popper; private TriggerAria aria; - private Placement placement; + private PopperPlacement placement; PopperTooltip(Supplier trigger, String text) { super(ComponentType.PopperTooltip, div().css(component(tooltip)) @@ -242,7 +242,7 @@ public PopperTooltip leftAligned() { return this; } - public PopperTooltip placement(Placement placement) { + public PopperTooltip placement(PopperPlacement placement) { if (placement == auto) { flip = true; } diff --git a/components/src/main/java/org/patternfly/component/tooltip/Tooltip.java b/components/src/main/java/org/patternfly/component/tooltip/Tooltip.java index 5a05f8f9c..b62f5d529 100644 --- a/components/src/main/java/org/patternfly/component/tooltip/Tooltip.java +++ b/components/src/main/java/org/patternfly/component/tooltip/Tooltip.java @@ -46,7 +46,6 @@ import static org.patternfly.component.tooltip.TriggerAria.describedBy; import static org.patternfly.component.tooltip.TriggerAria.none; import static org.patternfly.core.Aria.live; -import static org.patternfly.core.Attributes.popover; import static org.patternfly.core.Attributes.role; import static org.patternfly.handler.CloseHandler.fireEvent; import static org.patternfly.handler.CloseHandler.shouldClose; @@ -58,6 +57,7 @@ import static org.patternfly.style.Classes.modifier; import static org.patternfly.style.Classes.textAlignLeft; import static org.patternfly.style.Classes.tooltip; +import static org.patternfly.style.Placement.top; /** * A tooltip is in-app messaging used to identify elements on a page with short, clarifying text. @@ -123,11 +123,10 @@ public static Tooltip tooltip(Supplier trigger, String text) { super(ComponentType.Tooltip, div().css(component(Classes.tooltip)) .attr(role, Roles.tooltip) .aria(live, "polite") - .attr(popover, "manual") .element()); this.id = Id.unique(componentType().id); - this.overlay = overlay(element()) + this.overlay = overlay(element(), top) .triggerMode(hover) .trigger(trigger) .distance(DISTANCE) diff --git a/core/src/main/java/org/patternfly/overlay/Overlay.java b/core/src/main/java/org/patternfly/overlay/Overlay.java index 6e6195d7f..e65ff233c 100644 --- a/core/src/main/java/org/patternfly/overlay/Overlay.java +++ b/core/src/main/java/org/patternfly/overlay/Overlay.java @@ -17,7 +17,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.function.Predicate; import java.util.function.Supplier; import org.gwtproject.event.shared.HandlerRegistration; @@ -48,7 +47,6 @@ import static org.jboss.elemento.EventType.scroll; import static org.patternfly.overlay.TriggerMode.manual; import static org.patternfly.style.Classes.modifier; -import static org.patternfly.style.Placement.auto; import static org.patternfly.style.Placement.bottom; import static org.patternfly.style.Placement.left; import static org.patternfly.style.Placement.right; @@ -69,8 +67,8 @@ public class Overlay { // ------------------------------------------------------ factory - public static Overlay overlay(HTMLElement overlayElement) { - return new Overlay(overlayElement); + public static Overlay overlay(HTMLElement overlayElement, Placement placement) { + return new Overlay(overlayElement, placement); } // ------------------------------------------------------ instance @@ -107,25 +105,20 @@ public static Overlay overlay(HTMLElement overlayElement) { private HandlerRegistration outsideClickHandler; private HandlerRegistration scrollHandler; - // callbacks - private Predicate shouldShow; - private Predicate shouldHide; - private Predicate stayOpen; - - Overlay(HTMLElement overlayElement) { + Overlay(HTMLElement overlayElement, Placement placement) { this.id = Id.unique("overlay"); this.overlayElement = overlayElement; this.toggleHandlers = new ArrayList<>(); + this.triggerMode = manual; + this.visible = false; this.cssPositioning = false; this.matchTriggerWidth = false; this.distance = 0; - this.placement = auto; - this.triggerMode = manual; this.entryDelay = 0; this.exitDelay = 0; this.showTimeout = 0; this.hideTimeout = 0; - this.visible = false; + placement(placement); } // ------------------------------------------------------ builder @@ -156,7 +149,7 @@ public Overlay trigger(Supplier supplier) { } public Overlay placement(Placement placement) { - this.placement = placement; + swap(null, overlayElement, placement, this.placement, () -> this.placement = placement); return this; } @@ -185,21 +178,6 @@ public Overlay matchTriggerWidth(boolean match) { return this; } - public Overlay shouldShow(Predicate predicate) { - this.shouldShow = predicate; - return this; - } - - public Overlay shouldHide(Predicate predicate) { - this.shouldHide = predicate; - return this; - } - - public Overlay stayOpen(Predicate predicate) { - this.stayOpen = predicate; - return this; - } - // ------------------------------------------------------ events /** Register a handler called after show/hide transitions. */ @@ -217,14 +195,11 @@ public Overlay onToggle(OverlayHandler handler) { * {@link TriggerMode}. Returns the resolved trigger element or {@code null}. */ public HTMLElement attach() { + overlayElement.setAttribute("popover", "manual"); if (triggerSupplier != null) { trigger = triggerSupplier.get(); if (trigger != null) { setupAnchor(); - - // top is the default for auto and recalculated on show() - applyPlacement(placement == auto ? top : placement); - switch (triggerMode) { case hover: registerHoverListeners(); @@ -249,12 +224,13 @@ public HTMLElement attach() { } /** - * Removes all event listeners, cancels pending timers, hides the overlay if visible, and tears down CSS anchor positioning. + * Removes all event listeners, cancels pending timers, hides the overlay if visible, and tears down CSS anchor + * positioning. */ public void detach() { cancelTimers(); if (visible) { - doHide(new Event("")); + internalHide(new Event("")); } if (scrollHandler != null) { scrollHandler.removeHandler(); @@ -287,10 +263,7 @@ public void show(Event event) { if (visible || trigger == null) { return; } - if (shouldShow != null && !shouldShow.test(event)) { - return; - } - doShow(event); + internalShow(event); } /** Hides the overlay. Respects the {@code shouldHide} predicate. */ @@ -303,10 +276,7 @@ public void hide(Event event) { if (!visible) { return; } - if (shouldHide != null && !shouldHide.test(event)) { - return; - } - doHide(event); + internalHide(event); } /** Toggles the overlay between shown and hidden states. */ @@ -323,21 +293,6 @@ public void toggle(Event event) { } } - // ------------------------------------------------------ placement - - /** Removes all placement modifier CSS classes and applies the given placement. */ - public void applyPlacement(Placement placement) { - swap(null, overlayElement, placement, Placement.values()); - } - - /** - * Applies the best placement for the overlay element based on the provided preferred placement and available space around - * the trigger element. - */ - public void applyBestPlacement(Placement preferred) { - applyPlacement(bestPlacement(preferred)); - } - // ------------------------------------------------------ access public HTMLElement overlayElement() { @@ -408,9 +363,6 @@ private void onOutsideClick(Event event) { if (visible && trigger != null) { Element target = (Element) event.target; if (!overlayElement.contains(target) && !trigger.contains(target)) { - if (stayOpen != null && stayOpen.test(event)) { - return; - } hide(event); } } @@ -431,15 +383,14 @@ private void cancelTimers() { clearTimeout(hideTimeout); } - private void doShow(Event event) { + private void internalShow(Event event) { applyMinWidth(); if (cssPositioning) { - applyPlacement(placement == auto ? top : placement); overlayElement.showPopover(); } else { overlayElement.style.setProperty("visibility", "hidden"); overlayElement.showPopover(); - applyBestPlacement(placement); + placement(bestPlacement()); overlayElement.style.removeProperty("visibility"); } visible = true; @@ -451,7 +402,7 @@ private void doShow(Event event) { } } - private void doHide(Event event) { + private void internalHide(Event event) { overlayElement.hidePopover(); visible = false; if (outsideClickHandler != null) { @@ -465,11 +416,11 @@ private void doHide(Event event) { private void recalculatePlacement() { if (visible) { - applyBestPlacement(placement); + placement(bestPlacement()); } } - private Placement bestPlacement(Placement preferred) { + private Placement bestPlacement() { DOMRect triggerRect = trigger.getBoundingClientRect(); DOMRect overlayRect = overlayElement.getBoundingClientRect(); double above = triggerRect.top; @@ -483,30 +434,26 @@ private Placement bestPlacement(Placement preferred) { boolean rightFits = toRight >= overlayRect.width / 3 + distance; Placement result; - if (preferred != auto) { - // @formatter:off - if (preferred == top && topFits) { result = top; } - else if (preferred == bottom && bottomFits) { result = bottom; } - else if (preferred == left && leftFits) { result = left; } - else if (preferred == right && rightFits) { result = right; } - else { result = null; } - // @formatter:on - } else { - result = null; - } + // @formatter:off + if (placement == top && topFits) { result = top; } + else if (placement == bottom && bottomFits) { result = bottom; } + else if (placement == left && leftFits) { result = left; } + else if (placement == right && rightFits) { result = right; } + else { result = null; } + // @formatter:on if (result == null) { // @formatter:off - if (topFits && leftFits && rightFits) { result = top; } - else if (rightFits && !leftFits) { result = right; } - else if (leftFits && !rightFits) { result = left; } - else if (topFits) { result = top; } - else if (bottomFits) { result = bottom; } - else { result = toRight >= toLeft ? right : left; } + if (topFits && leftFits && rightFits) { result = top; } + else if (rightFits && !leftFits) { result = right; } + else if (leftFits && !rightFits) { result = left; } + else if (topFits) { result = top; } + else if (bottomFits) { result = bottom; } + else { result = toRight >= toLeft ? right : left; } // @formatter:on } - logger.debug("Best placement for %s: preferred=%s, calculated=%s", id, preferred.name(), result.name()); + logger.debug("Best placement for %s: %s → %s", id, placement.name(), result.name()); return result; } diff --git a/core/src/main/java/org/patternfly/overlay/package-info.java b/core/src/main/java/org/patternfly/overlay/package-info.java new file mode 100644 index 000000000..e21ccdd8d --- /dev/null +++ b/core/src/main/java/org/patternfly/overlay/package-info.java @@ -0,0 +1,70 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Overlay management for floating UI elements such as tooltips and popovers. + * + *

    This package provides a centralized controller for positioning, showing, and hiding overlay elements using the + * native Popover API and + * CSS Anchor Positioning. + * Components delegate all overlay behavior to this package, keeping their own code focused on component-specific + * concerns like DOM structure, ARIA attributes, and content. + * + *

    Key Classes

    + * + *
      + *
    • {@link org.patternfly.overlay.Overlay} - Centralized controller that combines anchor positioning, event + * listener registration, entry/exit delay timers, and show/hide lifecycle management
    • + *
    • {@link org.patternfly.overlay.TriggerMode} - Defines how an overlay responds to user interaction: hover, + * click, or manual control
    • + *
    • {@link org.patternfly.overlay.CssPositioning} - Reads CSS custom properties to determine whether to use + * native CSS positioning or JavaScript-based positioning
    • + *
    + * + *

    Usage

    + * + *

    Create an overlay, configure its trigger, placement, and interaction mode, then bind it to a trigger element: + * + * {@snippet : + * import static org.patternfly.overlay.Overlay.overlay; + * + * Overlay overlay = overlay(overlayElement, Placement.top) + * .trigger(() -> triggerElement) + * .triggerMode(TriggerMode.hover) + * .entryDelay(300) + * .exitDelay(300); + * } + * + *

    Positioning

    + * + *

    The overlay supports two positioning strategies. When CSS anchor positioning is enabled via custom properties, + * the browser handles positioning natively using {@code position-try-fallbacks}. Otherwise, the overlay falls back to + * JavaScript-based positioning that calculates the best placement relative to the trigger element. + * + *

    To enable CSS positioning, set the corresponding custom property on {@code :root}: + * + *

    + * :root {
    + *     --pf-v6-c-tooltip--css-positioning: 1;
    + *     --pf-v6-c-popover--css-positioning: 1;
    + * }
    + * 
    + * + * @see org.patternfly.overlay.Overlay + * @see org.patternfly.overlay.TriggerMode + * @see org.patternfly.overlay.CssPositioning + * @see org.patternfly.style.Placement + */ +package org.patternfly.overlay; \ No newline at end of file diff --git a/core/src/main/java/org/patternfly/popper/Modifiers.java b/core/src/main/java/org/patternfly/popper/Modifiers.java index 3a762eff2..c13fd81e6 100644 --- a/core/src/main/java/org/patternfly/popper/Modifiers.java +++ b/core/src/main/java/org/patternfly/popper/Modifiers.java @@ -15,7 +15,7 @@ */ package org.patternfly.popper; -import org.patternfly.style.Placement; +import static org.patternfly.popper.PopperPlacement.auto; import elemental2.dom.CSSProperties.MinWidthUnionType; import elemental2.dom.HTMLElement; @@ -43,10 +43,10 @@ static Modifier placement() { modifier.phase = ModifierPhase.main.name(); modifier.fn = (args) -> { if (args.state != null && args.state.elements != null) { - Placement placement = Placement.of(args.state.placement); + PopperPlacement placement = PopperPlacement.of(args.state.placement); HTMLElement popper = args.state.elements.popper; - if (placement != null && popper != null) { - popper.classList.remove(Placement.modifiers); + if (placement != null && placement != auto && popper != null) { + popper.classList.remove(PopperPlacement.modifiers); popper.classList.add(placement.modifier()); } } diff --git a/core/src/main/java/org/patternfly/popper/PopperBuilder.java b/core/src/main/java/org/patternfly/popper/PopperBuilder.java index a92bca391..6d77928d2 100644 --- a/core/src/main/java/org/patternfly/popper/PopperBuilder.java +++ b/core/src/main/java/org/patternfly/popper/PopperBuilder.java @@ -24,7 +24,7 @@ import org.gwtproject.event.shared.HandlerRegistration; import org.jboss.elemento.EventType; import org.jboss.elemento.logger.Logger; -import org.patternfly.style.Placement; +import org.patternfly.popper.PopperPlacement; import elemental2.core.JsArray; import elemental2.dom.CSSProperties; @@ -42,7 +42,7 @@ import static org.jboss.elemento.Elements.onDetach; import static org.jboss.elemento.EventType.bind; import static org.jboss.elemento.Key.Escape; -import static org.patternfly.style.Placement.auto; +import static org.patternfly.popper.PopperPlacement.auto; @Deprecated public class PopperBuilder { @@ -58,7 +58,7 @@ public class PopperBuilder { private int animationDuration; private int entryDelay; private int exitDelay; - private Placement placement; + private PopperPlacement placement; public PopperBuilder(String componentName, HTMLElement triggerElement, HTMLElement popperElement) { this.componentName = componentName; @@ -98,7 +98,7 @@ public PopperBuilder zIndex(int zIndex) { return this; } - public PopperBuilder placement(Placement placement) { + public PopperBuilder placement(PopperPlacement placement) { this.placement = placement; return this; } diff --git a/core/src/main/java/org/patternfly/position/AnchorPositioning.java b/core/src/main/java/org/patternfly/position/AnchorPositioning.java deleted file mode 100644 index 64367cc5f..000000000 --- a/core/src/main/java/org/patternfly/position/AnchorPositioning.java +++ /dev/null @@ -1,253 +0,0 @@ -/* - * Copyright 2023 Red Hat - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.patternfly.position; - -import java.util.function.Supplier; - -import org.jboss.elemento.By; -import org.jboss.elemento.Elements; -import org.jboss.elemento.logger.Logger; -import org.patternfly.style.Classes; -import org.patternfly.style.Placement; - -import elemental2.dom.DOMRect; -import elemental2.dom.HTMLElement; - -import static elemental2.dom.DomGlobal.document; -import static elemental2.dom.DomGlobal.window; -import static org.patternfly.style.Classes.modifier; -import static org.patternfly.style.Placement.auto; -import static org.patternfly.style.Placement.bottom; -import static org.patternfly.style.Placement.left; -import static org.patternfly.style.Placement.right; -import static org.patternfly.style.Placement.top; -import static org.patternfly.style.TypedModifier.swap; - -/** - * Shared anchor positioning logic for components based on the native popover API and CSS anchor positioning. Manages trigger - * resolution, CSS anchor setup/teardown, and placement CSS class toggling. - *

    - * This class has a {@link #show()} and {@link #hide()} method that delegates to the Popover API, but it does not register any - * event listeners. That is left to the component that uses this class. - * - * @see https://developer.mozilla.org/en-US/docs/Web/API/Popover_API - * @see https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Anchor_positioning - */ -public class AnchorPositioning { - - private static final Logger logger = Logger.getLogger(AnchorPositioning.class.getName()); - private final String id; - private final HTMLElement popover; - private final boolean cssPositioning; - private final boolean matchTriggerWidth; - private Supplier triggerSupplier; - private HTMLElement trigger; - private boolean visible; - private int distance; - - public AnchorPositioning(String id, HTMLElement popover, Supplier triggerSupplier, int distance, - boolean cssPositioning, boolean matchTriggerWidth) { - this.id = id; - this.popover = popover; - this.triggerSupplier = triggerSupplier; - this.distance = distance; - this.cssPositioning = cssPositioning; - this.matchTriggerWidth = matchTriggerWidth; - } - - // ------------------------------------------------------ trigger - - public void trigger(String selector) { - this.triggerSupplier = () -> Elements.querySelector(document.body, By.selector(selector)); - } - - public void trigger(By selector) { - this.triggerSupplier = () -> Elements.querySelector(document.body, selector); - } - - public void trigger(HTMLElement element) { - this.triggerSupplier = () -> element; - } - - public void trigger(Supplier supplier) { - this.triggerSupplier = supplier; - } - - // ------------------------------------------------------ lifecycle - - /** Resolves the trigger and sets up CSS anchor positioning. Returns the resolved trigger element or {@code null}. */ - public HTMLElement attach() { - if (triggerSupplier != null) { - trigger = triggerSupplier.get(); - if (trigger != null) { - String anchorName = "--" + id; - trigger.style.setProperty("anchor-name", anchorName); - popover.style.setProperty("position-anchor", anchorName); - popover.style.setProperty("margin", distance + "px"); - if (cssPositioning) { - popover.classList.add(modifier(Classes.cssPositioning)); - } - } - } - return trigger; - } - - /** Removes anchor positioning styles and clears the trigger reference. */ - public void detach() { - if (trigger != null) { - trigger.style.removeProperty("anchor-name"); - popover.classList.remove(modifier(Classes.cssPositioning)); - trigger = null; - } - } - - // ------------------------------------------------------ placement - - /** Removes all placement modifier CSS classes and applies the given placement. */ - public void applyPlacement(Placement placement) { - swap(null, popover, placement, Placement.values()); - } - - /** - * Applies the best placement for the popover element based on the provided preferred placement and available space around - * the trigger element. - * - * @param preferred The preferred placement of the element. - */ - public void applyBestPlacement(Placement preferred) { - applyPlacement(bestPlacement(preferred)); - } - - /** - * Determines the best placement for an element based on the preferred placement and available space around the trigger - * element. - *

    - * The placement is chosen by considering the available space in all directions, honoring the preferred placement if - * sufficient space is available, or applying fallback rules to determine the optimal placement. - * - * @param preferred The preferred placement of the element. If {@code auto}, the method calculates the best placement based - * on the space around the trigger element. - * @return The optimal {@link Placement} for the element considering the preferred placement and the available space. - */ - private Placement bestPlacement(Placement preferred) { - DOMRect triggerRect = trigger.getBoundingClientRect(); - DOMRect positionedRect = popover.getBoundingClientRect(); - double above = triggerRect.top; - double below = window.innerHeight - triggerRect.bottom; - double toLeft = triggerRect.left; - double toRight = window.innerWidth - triggerRect.right; - - // Check which directions have enough space for the tooltip - boolean topFits = above >= positionedRect.height + distance; - boolean bottomFits = below >= positionedRect.height + distance; - boolean leftFits = toLeft >= positionedRect.width / 3 + distance; - boolean rightFits = toRight >= positionedRect.width / 3 + distance; - - Placement placement; - // Honor explicit preference if it fits - if (preferred != auto) { - // @formatter:off - if (preferred == top && topFits) { placement = top; } - else if (preferred == bottom && bottomFits) { placement = bottom; } - else if (preferred == left && leftFits) { placement = left;} - else if (preferred == right && rightFits) { placement = right; } - else { placement = null; } - // @formatter:on - } else { - placement = null; - } - - if (placement == null) { - // Otherwise apply these rules: - // - prefer top, but only if the trigger is not near a horizontal edge - // - prefer horizontal when the trigger is near a horizontal edge - // - top wins over bottom when both horizontal directions fit - // - last resort: pick the side with the most space - // @formatter:off - if (topFits && leftFits && rightFits) { placement = top; } - else if (rightFits && !leftFits) { placement = right; } - else if (leftFits && !rightFits) { placement = left; } - else if (topFits) { placement = top; } - else if (bottomFits) { placement = bottom; } - else { placement = toRight >= toLeft ? right : left; } - // @formatter:on - } - - logger.debug("Best placement for %s: preferred=%s, calculated=%s", id, preferred.name(), placement.name()); - return placement; - } - - // ------------------------------------------------------ show / hide - - /** Calls {@link #beforeShow()}, then shows the popover via the Popover API. */ - public void show() { - beforeShow(); - popover.showPopover(); - visible = true; - } - - /** Hides the popover via the Popover API. */ - public void hide() { - popover.hidePopover(); - visible = false; - } - - /** Returns whether the popover is currently visible. */ - public boolean visible() { - return visible; - } - - /** Prepares the popover before it is shown. */ - public void beforeShow() { - applyMinWidth(); - } - - // ------------------------------------------------------ access - - public boolean cssPositioning() { - return cssPositioning; - } - - public int distance() { - return distance; - } - - public void distance(int distance) { - this.distance = distance; - } - - public boolean hasTriggerSupplier() { - return triggerSupplier != null; - } - - public HTMLElement popover() { - return popover; - } - - public HTMLElement trigger() { - return trigger; - } - - // ------------------------------------------------------ internal - - private void applyMinWidth() { - if (matchTriggerWidth && trigger != null) { - popover.style.setProperty("min-width", trigger.offsetWidth + "px"); - } - } -} diff --git a/core/src/main/java/org/patternfly/position/package-info.java b/core/src/main/java/org/patternfly/position/package-info.java deleted file mode 100644 index 24683f55c..000000000 --- a/core/src/main/java/org/patternfly/position/package-info.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2023 Red Hat - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Shared infrastructure for components based on the native popover API and CSS anchor positioning. - * - *

    This package provides helpers that remove duplication between native popover-based components such as - * {@code NativePopover} and {@code NativeTooltip}. It handles trigger resolution, CSS anchor positioning setup/teardown, - * and placement CSS class toggling. - * - * @see org.patternfly.position.AnchorPositioning - */ -package org.patternfly.position; \ No newline at end of file diff --git a/core/src/main/java/org/patternfly/style/Placement.java b/core/src/main/java/org/patternfly/style/Placement.java index 86451cb07..087c4e7df 100644 --- a/core/src/main/java/org/patternfly/style/Placement.java +++ b/core/src/main/java/org/patternfly/style/Placement.java @@ -15,12 +15,8 @@ */ package org.patternfly.style; -import java.util.Arrays; - public enum Placement implements TypedModifier { - auto("auto", ""), - top("top", Classes.modifier(Classes.top)), topStart("top-start", Classes.modifier(Classes.top) + "-left"), @@ -45,20 +41,6 @@ public enum Placement implements TypedModifier { rightEnd("right-end", Classes.modifier(Classes.right) + "-bottom"); - public static final String[] modifiers = Arrays.stream(values()) - .filter(p -> p != auto) - .map(p -> p.modifier) - .toArray(String[]::new); - - public static Placement of(String value) { - for (Placement placement : values()) { - if (placement.value.equals(value)) { - return placement; - } - } - return null; - } - private final String value; private final String modifier; diff --git a/core/src/main/java/org/patternfly/style/TypedModifier.java b/core/src/main/java/org/patternfly/style/TypedModifier.java index c3c25abdd..6f25f0a3d 100644 --- a/core/src/main/java/org/patternfly/style/TypedModifier.java +++ b/core/src/main/java/org/patternfly/style/TypedModifier.java @@ -15,6 +15,8 @@ */ package org.patternfly.style; +import java.util.Objects; + import org.jboss.elemento.TypedBuilder; import elemental2.dom.Element; @@ -48,6 +50,10 @@ static */ static > B swap(B builder, Element element, T current, T previous, Runnable assignment) { + if (Objects.equals(previous, current)) { + return builder; + } + if (previous != null && !previous.modifier().isEmpty()) { element.classList.remove(previous.modifier()); } diff --git a/showcase/src/main/java/org/patternfly/showcase/SnippetPage.java b/showcase/src/main/java/org/patternfly/showcase/SnippetPage.java index 985c3c866..69ea25322 100644 --- a/showcase/src/main/java/org/patternfly/showcase/SnippetPage.java +++ b/showcase/src/main/java/org/patternfly/showcase/SnippetPage.java @@ -81,7 +81,7 @@ import static org.patternfly.style.ExpandableModifier.expandable; import static org.patternfly.style.ExpandableModifier.nonExpandable; import static org.patternfly.style.GridBreakpoint.gridMd; -import static org.patternfly.style.Placement.auto; +import static org.patternfly.style.Placement.top; import static org.patternfly.style.Size._4xl; import static org.patternfly.style.Width.width20; import static org.patternfly.style.Width.width30; @@ -130,7 +130,7 @@ public SnippetPage(Layout layout) { .target("patternfly") .icon(swatchbook())) .add(tooltip(By.id("design-guidelines"), "Design guidelines") - .placement(auto))); + .placement(top))); } }) .add(div().css(util(floatInlineEnd)) @@ -141,7 +141,7 @@ public SnippetPage(Layout layout) { .target(ApiDoc.API_DOC_TARGET) .icon(catalog())) .add(tooltip(By.id("api-doc"), "API documentation") - .placement(auto))) + .placement(top))) .add(content().editorial() .add(flex().alignItems(center).add(title(1, _4xl, title))) .add(p().html(summary)))) diff --git a/showcase/src/main/java/org/patternfly/showcase/component/PopoverComponent.java b/showcase/src/main/java/org/patternfly/showcase/component/PopoverComponent.java index 56d04a32c..4b0cd8c42 100644 --- a/showcase/src/main/java/org/patternfly/showcase/component/PopoverComponent.java +++ b/showcase/src/main/java/org/patternfly/showcase/component/PopoverComponent.java @@ -49,7 +49,6 @@ import static org.patternfly.showcase.ApiDoc.Type.subcomponent; import static org.patternfly.showcase.Code.code; import static org.patternfly.showcase.Data.components; -import static org.patternfly.style.Placement.auto; import static org.patternfly.style.Placement.bottom; import static org.patternfly.style.Placement.left; import static org.patternfly.style.Placement.right; @@ -209,7 +208,7 @@ public PopoverComponent() { .add(button.css("pfj-popover-button").primary() .id("popover-auto-placement-button")) .add(popover - .placement(auto) + .placement(top) .ariaLabel("Advanced popover") .addHeader("Popover header") .addBody(LoremIpsum.words(20)) diff --git a/showcase/src/main/java/org/patternfly/showcase/component/TooltipComponent.java b/showcase/src/main/java/org/patternfly/showcase/component/TooltipComponent.java index 04e8c29b8..b1a9aae98 100644 --- a/showcase/src/main/java/org/patternfly/showcase/component/TooltipComponent.java +++ b/showcase/src/main/java/org/patternfly/showcase/component/TooltipComponent.java @@ -34,10 +34,10 @@ import static org.patternfly.showcase.ApiDoc.Type.other; import static org.patternfly.showcase.Code.code; import static org.patternfly.showcase.Data.components; -import static org.patternfly.style.Placement.auto; import static org.patternfly.style.Placement.bottom; import static org.patternfly.style.Placement.left; import static org.patternfly.style.Placement.right; +import static org.patternfly.style.Placement.top; @Route(value = "/components/tooltip", title = "Tooltip") public class TooltipComponent extends SnippetPage { @@ -110,7 +110,7 @@ public TooltipComponent() { .add(button.css("pfj-tooltip-button").primary() .id("tooltip-auto-button")) .add(tooltip(By.id("tooltip-auto-button"), LoremIpsum.words()) - .placement(auto))) + .placement(top))) .element(); // @code-end:tooltip-auto })); From 56931cb476e31caca3e081ab1460b1d9001cb065 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Wed, 1 Apr 2026 18:22:50 +0200 Subject: [PATCH 087/430] Refactor Overlay --- .../patternfly/popper/PopperPlacement.java | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 core/src/main/java/org/patternfly/popper/PopperPlacement.java diff --git a/core/src/main/java/org/patternfly/popper/PopperPlacement.java b/core/src/main/java/org/patternfly/popper/PopperPlacement.java new file mode 100644 index 000000000..c20479ea8 --- /dev/null +++ b/core/src/main/java/org/patternfly/popper/PopperPlacement.java @@ -0,0 +1,90 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.patternfly.popper; + +import java.util.Arrays; + +import org.patternfly.style.Classes; +import org.patternfly.style.TypedModifier; + +/** + * Placement enum for the deprecated Popper.js based components. Use {@link org.patternfly.style.Placement} for non-deprecated + * components. + * + * @deprecated Use {@link org.patternfly.style.Placement} instead. This class exists only to support the deprecated Popper.js + * based components. + */ +@Deprecated +public enum PopperPlacement implements TypedModifier { + + auto("auto", ""), + + top("top", Classes.modifier(Classes.top)), + + topStart("top-start", Classes.modifier(Classes.top) + "-left"), + + topEnd("top-end", Classes.modifier(Classes.top) + "-right"), + + bottom("bottom", Classes.modifier(Classes.bottom)), + + bottomStart("bottom-start", Classes.modifier(Classes.bottom) + "-left"), + + bottomEnd("bottom-end", Classes.modifier(Classes.bottom) + "-right"), + + left("left", Classes.modifier(Classes.left)), + + leftStart("left-start", Classes.modifier(Classes.left) + "-top"), + + leftEnd("left-end", Classes.modifier(Classes.left) + "-bottom"), + + right("right", Classes.modifier(Classes.right)), + + rightStart("right-start", Classes.modifier(Classes.right) + "-bottom"), + + rightEnd("right-end", Classes.modifier(Classes.right) + "-bottom"); + + public static final String[] modifiers = Arrays.stream(values()) + .filter(p -> p != auto) + .map(p -> p.modifier) + .toArray(String[]::new); + + public static PopperPlacement of(String value) { + for (PopperPlacement placement : values()) { + if (placement.value.equals(value)) { + return placement; + } + } + return null; + } + + private final String value; + private final String modifier; + + PopperPlacement(String value, String modifier) { + this.value = value; + this.modifier = modifier; + } + + @Override + public String value() { + return value; + } + + @Override + public String modifier() { + return modifier; + } +} \ No newline at end of file From 104e25cb4502d1f407b6b8f369d1895e2fd80361 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 2 Apr 2026 10:45:23 +0200 Subject: [PATCH 088/430] Replace custom CSS variables with CSS.supports() --- CHANGELOG.md | 18 +- .../component/list/DescriptionListTerm.java | 1 + .../component/menu/MenuToggleMenu.java | 8 +- .../component/menu/PopperMenuToggleMenu.java | 6 +- .../patternfly/component/popover/Popover.java | 5 +- .../component/popover/PopperPopover.java | 6 +- .../component/tabs/OverflowTab.java | 11 +- .../component/tooltip/PopperTooltip.java | 6 +- .../patternfly/component/tooltip/Tooltip.java | 4 +- core/npm/core.css | 131 +- .../patternfly/overlay/CssPositioning.java | 60 +- .../java/org/patternfly/overlay/Overlay.java | 112 +- .../org/patternfly/overlay/package-info.java | 19 +- .../java/org/patternfly/popper/Modifiers.java | 4 +- .../org/patternfly/popper/PopperBuilder.java | 1 - .../java/org/patternfly/style/Classes.java | 1 + .../java/org/patternfly/style/Placement.java | 64 +- showcase/README.md | 2 +- showcase/package.json | 3 - showcase/pnpm-lock.yaml | 1123 ++++------------- .../showcase/component/DropdownComponent.java | 6 +- .../showcase/component/FormComponent.java | 2 +- .../showcase/component/PopoverComponent.java | 36 +- showcase/src/web/main.js | 2 +- showcase/src/web/showcase.css | 5 - 25 files changed, 506 insertions(+), 1130 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6937c3561..c3aab2959 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,10 +6,22 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +> [!IMPORTANT] +> This release deprecates components based on PopperJS and adds alternatives using the [popover API](https://developer.mozilla.org/en-US/docs/Web/API/Popover_API) and [CSS anchor positioning](https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Anchor_positioning). This might break existing code! + +- `org.patternfly.component.popover.PopperPopover` → `org.patternfly.component.popover.Popover` +- `org.patternfly.component.tooltip.PopperTooltip` → `org.patternfly.component.tooltip.Tooltip` +- `org.patternfly.component.menu.PopperDropdown` → `org.patternfly.component.menu.Dropdown` +- `org.patternfly.component.menu.PopperMultiSelect` → `org.patternfly.component.menu.MultiSelect` +- `org.patternfly.component.menu.PopperMultiTypeahead` → `org.patternfly.component.menu.MultiTypeahead` +- `org.patternfly.component.menu.PopperSingleSelect` → `org.patternfly.component.menu.SingleSelect` +- `org.patternfly.component.menu.PopperSingleTypeahead` → `org.patternfly.component.menu.SingleTypeahead` + ### Added - Add native alternatives for dropdown, single and multi-select, and single and multi-type-ahead components -- Deprecate components based on Popper.js +- Deprecate components based on PopperJS +- Add new `Overlay` class replacing the deprecated `PopperBuilder` ## [0.6.16] - 2026-03-26 @@ -575,7 +587,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ### Fixed -- Fix missing JS file for PatternFly Java J2CL +- Fix the missing JS file for PatternFly Java J2CL ### Removed @@ -625,7 +637,7 @@ Split PatternFly Java into multiple modules: ### Changed -- Add showcase to the PatternFly Java codebase. +- Add a showcase to the PatternFly Java codebase. ### Upgrades diff --git a/components/src/main/java/org/patternfly/component/list/DescriptionListTerm.java b/components/src/main/java/org/patternfly/component/list/DescriptionListTerm.java index 3d404010f..1caac23a8 100644 --- a/components/src/main/java/org/patternfly/component/list/DescriptionListTerm.java +++ b/components/src/main/java/org/patternfly/component/list/DescriptionListTerm.java @@ -20,6 +20,7 @@ import org.patternfly.component.ComponentIcon; import org.patternfly.component.popover.Popover; import org.patternfly.style.Classes; + import elemental2.dom.Element; import elemental2.dom.HTMLElement; diff --git a/components/src/main/java/org/patternfly/component/menu/MenuToggleMenu.java b/components/src/main/java/org/patternfly/component/menu/MenuToggleMenu.java index e93a1e2b3..7e4fb8b62 100644 --- a/components/src/main/java/org/patternfly/component/menu/MenuToggleMenu.java +++ b/components/src/main/java/org/patternfly/component/menu/MenuToggleMenu.java @@ -56,6 +56,7 @@ import static org.jboss.elemento.Key.ArrowUp; import static org.jboss.elemento.Key.Escape; import static org.jboss.elemento.Key.Tab; +import static org.patternfly.overlay.CssPositioning.anchorNameSupported; import static org.patternfly.overlay.Overlay.overlay; import static org.patternfly.style.Classes.component; import static org.patternfly.style.Classes.list; @@ -85,7 +86,6 @@ abstract class MenuToggleMenu> extends Co private final List> toggleHandler; private final List> loadedHandler; private boolean disabled; - private Placement placement; private StayOpenPredicate stayOpen; private HandlerRegistration menuToggleClickHandler; private HandlerRegistration menuClickHandler; @@ -97,12 +97,11 @@ abstract class MenuToggleMenu> extends Co this.menuToggle = menuToggle; this.toggleHandler = new ArrayList<>(); this.loadedHandler = new ArrayList<>(); - this.placement = bottomStart; - menuPopover = div().css(component(Classes.menu, Classes.popover)).element(); + menuPopover = div().css(component(Classes.overlay)).element(); overlay = overlay(menuPopover, bottomStart) .trigger(menuToggle::element) - .cssPositioning(true) + .cssPositioning(anchorNameSupported()) .matchTriggerWidth(true); delegateTo(menuToggle.element()); @@ -184,7 +183,6 @@ public boolean isDisabled() { } public B placement(Placement placement) { - this.placement = placement; overlay.placement(placement); return that(); } diff --git a/components/src/main/java/org/patternfly/component/menu/PopperMenuToggleMenu.java b/components/src/main/java/org/patternfly/component/menu/PopperMenuToggleMenu.java index 1ae32039a..b18431cb9 100644 --- a/components/src/main/java/org/patternfly/component/menu/PopperMenuToggleMenu.java +++ b/components/src/main/java/org/patternfly/component/menu/PopperMenuToggleMenu.java @@ -38,10 +38,10 @@ import org.patternfly.popper.Modifiers; import org.patternfly.popper.Popper; import org.patternfly.popper.PopperBuilder; +import org.patternfly.popper.PopperPlacement; import org.patternfly.popper.TriggerAction; import org.patternfly.style.Classes; import org.patternfly.style.Modifiers.Disabled; -import org.patternfly.popper.PopperPlacement; import elemental2.core.JsArray; import elemental2.dom.Event; @@ -59,10 +59,10 @@ import static org.jboss.elemento.Key.ArrowDown; import static org.jboss.elemento.Key.ArrowUp; import static org.jboss.elemento.Key.Tab; -import static org.patternfly.style.Classes.component; -import static org.patternfly.style.Classes.list; import static org.patternfly.popper.PopperPlacement.auto; import static org.patternfly.popper.PopperPlacement.bottomStart; +import static org.patternfly.style.Classes.component; +import static org.patternfly.style.Classes.list; /** * Abstract base component for components that combine a {@link MenuToggle} and a {@link Menu}, such as {@link PopperDropdown}, diff --git a/components/src/main/java/org/patternfly/component/popover/Popover.java b/components/src/main/java/org/patternfly/component/popover/Popover.java index fec300eaf..e53ddffb5 100644 --- a/components/src/main/java/org/patternfly/component/popover/Popover.java +++ b/components/src/main/java/org/patternfly/component/popover/Popover.java @@ -31,12 +31,12 @@ import org.patternfly.component.button.Button; import org.patternfly.core.Aria; import org.patternfly.handler.CloseHandler; -import org.patternfly.overlay.CssPositioning; import org.patternfly.overlay.Overlay; import org.patternfly.overlay.TriggerMode; import org.patternfly.style.Classes; import org.patternfly.style.Modifiers.NoPadding; import org.patternfly.style.Placement; + import elemental2.dom.Element; import elemental2.dom.Event; import elemental2.dom.HTMLDivElement; @@ -59,6 +59,7 @@ import static org.patternfly.handler.CloseHandler.fireEvent; import static org.patternfly.handler.CloseHandler.shouldClose; import static org.patternfly.icon.IconSets.fas.times; +import static org.patternfly.overlay.CssPositioning.containerTypeAnchoredSupported; import static org.patternfly.overlay.Overlay.overlay; import static org.patternfly.style.Classes.arrow; import static org.patternfly.style.Classes.close; @@ -128,7 +129,7 @@ public static Popover popover(Supplier trigger) { .distance(DISTANCE) .entryDelay(ENTRY_DELAY) .exitDelay(EXIT_DELAY) - .cssPositioning(CssPositioning.popoverEnabled()); + .cssPositioning(containerTypeAnchoredSupported()); this.closeHandler = new ArrayList<>(); this.showClose = true; this.hoverable = false; diff --git a/components/src/main/java/org/patternfly/component/popover/PopperPopover.java b/components/src/main/java/org/patternfly/component/popover/PopperPopover.java index 0a3acde3e..ef7bd77b8 100644 --- a/components/src/main/java/org/patternfly/component/popover/PopperPopover.java +++ b/components/src/main/java/org/patternfly/component/popover/PopperPopover.java @@ -37,9 +37,9 @@ import org.patternfly.popper.Modifiers; import org.patternfly.popper.Popper; import org.patternfly.popper.PopperBuilder; +import org.patternfly.popper.PopperPlacement; import org.patternfly.popper.TriggerAction; import org.patternfly.style.Modifiers.NoPadding; -import org.patternfly.popper.PopperPlacement; import elemental2.dom.Element; import elemental2.dom.Event; @@ -67,6 +67,8 @@ import static org.patternfly.handler.CloseHandler.fireEvent; import static org.patternfly.handler.CloseHandler.shouldClose; import static org.patternfly.icon.IconSets.fas.times; +import static org.patternfly.popper.PopperPlacement.auto; +import static org.patternfly.popper.PopperPlacement.top; import static org.patternfly.style.Classes.arrow; import static org.patternfly.style.Classes.close; import static org.patternfly.style.Classes.component; @@ -74,8 +76,6 @@ import static org.patternfly.style.Classes.modifier; import static org.patternfly.style.Classes.popover; import static org.patternfly.style.Classes.widthAuto; -import static org.patternfly.popper.PopperPlacement.auto; -import static org.patternfly.popper.PopperPlacement.top; /** * A popover is in-app messaging that provides more information on specific product areas. Popovers display content in a new diff --git a/components/src/main/java/org/patternfly/component/tabs/OverflowTab.java b/components/src/main/java/org/patternfly/component/tabs/OverflowTab.java index 62bc02112..bd39b79eb 100644 --- a/components/src/main/java/org/patternfly/component/tabs/OverflowTab.java +++ b/components/src/main/java/org/patternfly/component/tabs/OverflowTab.java @@ -52,6 +52,7 @@ import static org.patternfly.core.Attributes.role; import static org.patternfly.core.Roles.presentation; import static org.patternfly.icon.IconSets.fas.angleRight; +import static org.patternfly.overlay.CssPositioning.anchorNameSupported; import static org.patternfly.overlay.Overlay.overlay; import static org.patternfly.style.Classes.component; import static org.patternfly.style.Classes.current; @@ -103,8 +104,8 @@ static OverflowTab overflowTab() { .add(span().css(component(Classes.tabs, link, toggle, icon)) .add(angleRight()))); - HTMLElement menuPopover; - add(menuPopover = div().css(component(Classes.menu, Classes.popover)) + HTMLElement overlayElement; + add(overlayElement = div().css(component(Classes.overlay)) .add(menu = menu(select, single) .onSingleSelect((event, menuItem, selected) -> select(menuItem)) .addContent(menuContent() @@ -112,10 +113,10 @@ static OverflowTab overflowTab() { .addItems(tabs.values(), tab -> menuItem(tab.identifier(), tab.text()))))) .element()); - overlay = overlay(menuPopover, bottomStart) + this.overlay = overlay(overlayElement, bottomStart) .trigger(button::element) .triggerMode(TriggerMode.click) - .cssPositioning(true) + .cssPositioning(anchorNameSupported()) .onToggle((event, open) -> { if (open) { Expandable.expand(button.element(), button.element(), null); @@ -123,7 +124,7 @@ static OverflowTab overflowTab() { Expandable.collapse(button.element(), button.element(), null); } }); - overlay.attach(); + this.overlay.attach(); } void detach() { diff --git a/components/src/main/java/org/patternfly/component/tooltip/PopperTooltip.java b/components/src/main/java/org/patternfly/component/tooltip/PopperTooltip.java index 826baac9f..01b3c5671 100644 --- a/components/src/main/java/org/patternfly/component/tooltip/PopperTooltip.java +++ b/components/src/main/java/org/patternfly/component/tooltip/PopperTooltip.java @@ -35,8 +35,8 @@ import org.patternfly.popper.Modifiers; import org.patternfly.popper.Popper; import org.patternfly.popper.PopperBuilder; -import org.patternfly.popper.TriggerAction; import org.patternfly.popper.PopperPlacement; +import org.patternfly.popper.TriggerAction; import elemental2.dom.Event; import elemental2.dom.HTMLDivElement; @@ -55,6 +55,8 @@ import static org.patternfly.core.Attributes.role; import static org.patternfly.handler.CloseHandler.fireEvent; import static org.patternfly.handler.CloseHandler.shouldClose; +import static org.patternfly.popper.PopperPlacement.auto; +import static org.patternfly.popper.PopperPlacement.top; import static org.patternfly.popper.TriggerAction.focus; import static org.patternfly.popper.TriggerAction.mouseenter; import static org.patternfly.style.Classes.arrow; @@ -63,8 +65,6 @@ import static org.patternfly.style.Classes.modifier; import static org.patternfly.style.Classes.textAlignLeft; import static org.patternfly.style.Classes.tooltip; -import static org.patternfly.popper.PopperPlacement.auto; -import static org.patternfly.popper.PopperPlacement.top; /** * A tooltip is in-app messaging used to identify elements on a page with short, clarifying text. diff --git a/components/src/main/java/org/patternfly/component/tooltip/Tooltip.java b/components/src/main/java/org/patternfly/component/tooltip/Tooltip.java index b62f5d529..5ec701969 100644 --- a/components/src/main/java/org/patternfly/component/tooltip/Tooltip.java +++ b/components/src/main/java/org/patternfly/component/tooltip/Tooltip.java @@ -31,7 +31,6 @@ import org.patternfly.core.Roles; import org.patternfly.handler.CloseHandler; import org.patternfly.overlay.Overlay; -import org.patternfly.overlay.CssPositioning; import org.patternfly.style.Classes; import org.patternfly.style.Placement; @@ -49,6 +48,7 @@ import static org.patternfly.core.Attributes.role; import static org.patternfly.handler.CloseHandler.fireEvent; import static org.patternfly.handler.CloseHandler.shouldClose; +import static org.patternfly.overlay.CssPositioning.containerTypeAnchoredSupported; import static org.patternfly.overlay.Overlay.overlay; import static org.patternfly.overlay.TriggerMode.hover; import static org.patternfly.style.Classes.arrow; @@ -132,7 +132,7 @@ public static Tooltip tooltip(Supplier trigger, String text) { .distance(DISTANCE) .entryDelay(ENTRY_DELAY) .exitDelay(EXIT_DELAY) - .cssPositioning(CssPositioning.tooltipEnabled()); + .cssPositioning(containerTypeAnchoredSupported()); this.closeHandler = new ArrayList<>(); this.aria = describedBy; diff --git a/core/npm/core.css b/core/npm/core.css index ba16f5456..69df3108d 100644 --- a/core/npm/core.css +++ b/core/npm/core.css @@ -28,7 +28,7 @@ /* Reset [popover] UA styles */ .pf-v6-c-tooltip[popover], .pf-v6-c-popover[popover], -.pf-v6-c-menu__popover { +.pf-v6-c-overlay { border: none; padding: 0; background: none; @@ -37,34 +37,67 @@ position: fixed; } -/* CSS anchor positioning */ +/* =================================================================== + CSS anchor positioning rules in clockwise order + + top-left top top-right + \ | / + \ | / + left-- ( ) --right + / | \ + / | \ + bottom-left bottom bottom-right + =================================================================== */ + .pf-v6-c-tooltip[popover].pf-m-top, -.pf-v6-c-popover[popover].pf-m-top { +.pf-v6-c-popover[popover].pf-m-top, +.pf-v6-c-overlay.pf-m-top { position-area: block-start; } +.pf-v6-c-overlay.pf-m-top-right { + bottom: anchor(top); + right: anchor(right); +} + +.pf-v6-c-tooltip[popover].pf-m-right, +.pf-v6-c-popover[popover].pf-m-right, +.pf-v6-c-overlay.pf-m-right { + position-area: inline-end; +} + +.pf-v6-c-overlay.pf-m-bottom-right { + top: anchor(bottom); + right: anchor(right); +} + .pf-v6-c-tooltip[popover].pf-m-bottom, -.pf-v6-c-popover[popover].pf-m-bottom { +.pf-v6-c-popover[popover].pf-m-bottom, +.pf-v6-c-overlay.pf-m-bottom { position-area: block-end; } +.pf-v6-c-overlay.pf-m-bottom-left { + top: anchor(bottom); + left: anchor(left); +} + .pf-v6-c-tooltip[popover].pf-m-left, -.pf-v6-c-popover[popover].pf-m-left { +.pf-v6-c-popover[popover].pf-m-left, +.pf-v6-c-overlay.pf-m-left { position-area: inline-start; } -.pf-v6-c-tooltip[popover].pf-m-right, -.pf-v6-c-popover[popover].pf-m-right { - position-area: inline-end; +.pf-v6-c-overlay.pf-m-top-left { + bottom: anchor(top); + left: anchor(left); } /* =================================================================== - CSS-native positioning (opt-in) + CSS-native positioning Activated by the pf-m-css-positioning modifier, which is added - by NativeAnchor.attach() when the corresponding CSS custom property is set: - --pf-v6-c-tooltip--css-positioning: 1; - --pf-v6-c-popover--css-positioning: 1; + by Overlay.attach() when the browser supports CSS Anchor Positioning. =================================================================== */ /* container-type for @container anchored() queries */ @@ -74,17 +107,25 @@ } /* position-try-fallbacks for tooltip and popover */ -.pf-v6-c-tooltip[popover].pf-m-css-positioning.pf-m-top, -.pf-v6-c-tooltip[popover].pf-m-css-positioning.pf-m-bottom, +.pf-v6-c-popover[popover].pf-m-css-positioning.pf-m-bottom, .pf-v6-c-popover[popover].pf-m-css-positioning.pf-m-top, -.pf-v6-c-popover[popover].pf-m-css-positioning.pf-m-bottom { +.pf-v6-c-tooltip[popover].pf-m-css-positioning.pf-m-bottom, +.pf-v6-c-tooltip[popover].pf-m-css-positioning.pf-m-top, +.pf-v6-c-overlay.pf-m-css-positioning.pf-m-bottom, +.pf-v6-c-overlay.pf-m-css-positioning.pf-m-bottom-left, +.pf-v6-c-overlay.pf-m-css-positioning.pf-m-bottom-right, +.pf-v6-c-overlay.pf-m-css-positioning.pf-m-top, +.pf-v6-c-overlay.pf-m-css-positioning.pf-m-top-left, +.pf-v6-c-overlay.pf-m-css-positioning.pf-m-top-right { position-try-fallbacks: flip-block; } +.pf-v6-c-popover[popover].pf-m-css-positioning.pf-m-left, +.pf-v6-c-popover[popover].pf-m-css-positioning.pf-m-right, .pf-v6-c-tooltip[popover].pf-m-css-positioning.pf-m-left, .pf-v6-c-tooltip[popover].pf-m-css-positioning.pf-m-right, -.pf-v6-c-popover[popover].pf-m-css-positioning.pf-m-left, -.pf-v6-c-popover[popover].pf-m-css-positioning.pf-m-right { +.pf-v6-c-overlay.pf-m-css-positioning.pf-m-left, +.pf-v6-c-overlay.pf-m-css-positioning.pf-m-right { position-try-fallbacks: flip-inline; } @@ -108,65 +149,13 @@ } /* =================================================================== - Dropdown menu (NativeDropdown) styles - - Unlike tooltip/popover which are centered on the anchor, dropdown - menus are edge-aligned. Uses anchor() functions for edge-aligned - placements and position-area for centered placements. - No arrow, so no container queries needed. + Overlay-specific styles =================================================================== */ -.pf-v6-c-menu__popover { +.pf-v6-c-overlay { inset: auto; } -/* Bottom placements */ -.pf-v6-c-menu__popover.pf-m-css-positioning.pf-m-bottom { - position-area: block-end; - position-try-fallbacks: flip-block; -} - -.pf-v6-c-menu__popover.pf-m-css-positioning.pf-m-bottom-left { - top: anchor(bottom); - left: anchor(left); - position-try-fallbacks: flip-block; -} - -.pf-v6-c-menu__popover.pf-m-css-positioning.pf-m-bottom-right { - top: anchor(bottom); - right: anchor(right); - position-try-fallbacks: flip-block; -} - -/* Top placements */ -.pf-v6-c-menu__popover.pf-m-css-positioning.pf-m-top { - position-area: block-start; - position-try-fallbacks: flip-block; -} - -.pf-v6-c-menu__popover.pf-m-css-positioning.pf-m-top-left { - bottom: anchor(top); - left: anchor(left); - position-try-fallbacks: flip-block; -} - -.pf-v6-c-menu__popover.pf-m-css-positioning.pf-m-top-right { - bottom: anchor(top); - right: anchor(right); - position-try-fallbacks: flip-block; -} - -/* Left/right placements */ -.pf-v6-c-menu__popover.pf-m-css-positioning.pf-m-left { - position-area: inline-start; - position-try-fallbacks: flip-inline; -} - -.pf-v6-c-menu__popover.pf-m-css-positioning.pf-m-right { - position-area: inline-end; - position-try-fallbacks: flip-inline; -} - /* Arrow correction after CSS flip (requires @container anchored() support). LightningCSS can't parse these yet (parcel-bundler/lightningcss#1176) — the diff --git a/core/src/main/java/org/patternfly/overlay/CssPositioning.java b/core/src/main/java/org/patternfly/overlay/CssPositioning.java index ca835dcb9..48282b2a9 100644 --- a/core/src/main/java/org/patternfly/overlay/CssPositioning.java +++ b/core/src/main/java/org/patternfly/overlay/CssPositioning.java @@ -15,50 +15,42 @@ */ package org.patternfly.overlay; -import org.patternfly.style.Placement; -import org.patternfly.style.Variable; - -import static elemental2.dom.DomGlobal.document; -import static org.jboss.elemento.DomGlobal.window; -import static org.patternfly.style.Classes.component; -import static org.patternfly.style.Classes.cssPositioning; -import static org.patternfly.style.Classes.popover; -import static org.patternfly.style.Classes.tooltip; -import static org.patternfly.style.Variable.componentVar; +import static elemental2.dom.DomGlobal.CSS; /** - * Reads and caches the CSS custom properties that control whether tooltip and popover components use native CSS positioning - * ({@code position-try-fallbacks}) or JavaScript-based positioning ({@link Overlay#applyBestPlacement(Placement)}). + * Detects whether the browser supports CSS anchor positioning features, which enable native CSS-based overlay placement instead + * of JavaScript-based positioning. *

    - * To enable CSS positioning, set the corresponding custom property on {@code :root}: - *

    - * :root {
    - *     --pf-v6-c-tooltip--css-positioning: 1;
    - *     --pf-v6-c-popover--css-positioning: 1;
    - * }
    - * 
    + * Two levels of support are detected: + *
      + *
    • {@link #anchorNameSupported()} — basic CSS anchor positioning ({@code anchor-name})
    • + *
    • {@link #containerTypeAnchoredSupported()} — anchored container queries ({@code container-type: anchored}), + * required by tooltip and popover for arrow positioning
    • + *
    + * + * @see CSS anchor positioning */ public class CssPositioning { - private static Boolean tooltipEnabled; - private static Boolean popoverEnabled; + private static Boolean supported; + private static Boolean anchoredContainerSupported; - public static boolean tooltipEnabled() { - if (tooltipEnabled == null) { - tooltipEnabled = readProperty(componentVar(component(tooltip), cssPositioning)); + /** Returns {@code true} if the browser supports CSS anchor positioning. */ + public static boolean anchorNameSupported() { + if (supported == null) { + supported = CSS.supports("anchor-name: --test"); } - return tooltipEnabled; + return supported; } - public static boolean popoverEnabled() { - if (popoverEnabled == null) { - popoverEnabled = readProperty(componentVar(component(popover), cssPositioning)); + /** + * Returns {@code true} if the browser supports CSS anchor positioning and anchored container queries + * ({@code container-type: anchored}). + */ + public static boolean containerTypeAnchoredSupported() { + if (anchoredContainerSupported == null) { + anchoredContainerSupported = anchorNameSupported() && CSS.supports("container-type: anchored"); } - return popoverEnabled; - } - - private static boolean readProperty(Variable property) { - String value = window.getComputedStyle(document.documentElement).getPropertyValue(property.name).trim(); - return "1".equals(value) || "true".equals(value); + return anchoredContainerSupported; } } diff --git a/core/src/main/java/org/patternfly/overlay/Overlay.java b/core/src/main/java/org/patternfly/overlay/Overlay.java index e65ff233c..33dbc56ca 100644 --- a/core/src/main/java/org/patternfly/overlay/Overlay.java +++ b/core/src/main/java/org/patternfly/overlay/Overlay.java @@ -27,7 +27,6 @@ import org.patternfly.handler.OverlayHandler; import org.patternfly.style.Classes; import org.patternfly.style.Placement; - import elemental2.dom.DOMRect; import elemental2.dom.Element; import elemental2.dom.Event; @@ -110,9 +109,9 @@ public static Overlay overlay(HTMLElement overlayElement, Placement placement) { this.overlayElement = overlayElement; this.toggleHandlers = new ArrayList<>(); this.triggerMode = manual; - this.visible = false; this.cssPositioning = false; this.matchTriggerWidth = false; + this.visible = false; this.distance = 0; this.entryDelay = 0; this.exitDelay = 0; @@ -149,7 +148,8 @@ public Overlay trigger(Supplier supplier) { } public Overlay placement(Placement placement) { - swap(null, overlayElement, placement, this.placement, () -> this.placement = placement); + // The placement is assigned here but not mapped to CSS modifiers yet. That won't happen until attach() + this.placement = placement; return this; } @@ -195,11 +195,10 @@ public Overlay onToggle(OverlayHandler handler) { * {@link TriggerMode}. Returns the resolved trigger element or {@code null}. */ public HTMLElement attach() { - overlayElement.setAttribute("popover", "manual"); if (triggerSupplier != null) { trigger = triggerSupplier.get(); if (trigger != null) { - setupAnchor(); + setupOverlayAndTrigger(); switch (triggerMode) { case hover: registerHoverListeners(); @@ -210,10 +209,6 @@ public HTMLElement attach() { case manual: break; } - - if (!cssPositioning) { - scrollHandler = bind(document, scroll, true, e -> recalculatePlacement()); - } } else { logger.error("Unable to find trigger element for overlay %o", overlayElement); } @@ -248,17 +243,17 @@ public void detach() { triggerHandlers.removeHandler(); triggerHandlers = null; } - teardownAnchor(); + teardownOverlayAndTrigger(); } // ------------------------------------------------------ show / hide - /** Shows the overlay. Respects the {@code shouldShow} predicate. */ + /** Shows the overlay. */ public void show() { show(new Event("")); } - /** Shows the overlay. Respects the {@code shouldShow} predicate. */ + /** Shows the overlay. */ public void show(Event event) { if (visible || trigger == null) { return; @@ -266,12 +261,12 @@ public void show(Event event) { internalShow(event); } - /** Hides the overlay. Respects the {@code shouldHide} predicate. */ + /** Hides the overlay. */ public void hide() { hide(new Event("")); } - /** Hides the overlay. Respects the {@code shouldHide} predicate. */ + /** Hides the overlay. */ public void hide(Event event) { if (!visible) { return; @@ -316,26 +311,42 @@ public boolean visible() { return visible; } - // ------------------------------------------------------ internal + // ------------------------------------------------------ internal setup / teardown - private void setupAnchor() { + private void setupOverlayAndTrigger() { + overlayElement.setAttribute("popover", "manual"); String anchorName = "--" + id; trigger.style.setProperty("anchor-name", anchorName); overlayElement.style.setProperty("position-anchor", anchorName); overlayElement.style.setProperty("margin", distance + "px"); + overlayElement.classList.add(placement.modifier()); if (cssPositioning) { overlayElement.classList.add(modifier(Classes.cssPositioning)); } } - private void teardownAnchor() { + private void applyMinWidth() { + if (matchTriggerWidth && trigger != null) { + overlayElement.style.setProperty("min-width", trigger.offsetWidth + "px"); + } + } + + private void teardownOverlayAndTrigger() { + overlayElement.classList.remove(modifier(Classes.cssPositioning)); + for (Placement p : Placement.values()) { + overlayElement.classList.remove(p.modifier()); + } + overlayElement.style.removeProperty("margin"); + overlayElement.style.removeProperty("position-anchor"); if (trigger != null) { trigger.style.removeProperty("anchor-name"); - overlayElement.classList.remove(modifier(Classes.cssPositioning)); trigger = null; } + overlayElement.removeAttribute("popover"); } + // ------------------------------------------------------ internal listeners + private void registerHoverListeners() { triggerHandlers = compose( bind(trigger, mouseenter, e -> scheduleShow()), @@ -368,6 +379,8 @@ private void onOutsideClick(Event event) { } } + // ------------------------------------------------------ internal show / hide + private void scheduleShow() { cancelTimers(); showTimeout = setTimeout(e -> show(), entryDelay); @@ -390,8 +403,9 @@ private void internalShow(Event event) { } else { overlayElement.style.setProperty("visibility", "hidden"); overlayElement.showPopover(); - placement(bestPlacement()); + recalculatePlacement(); overlayElement.style.removeProperty("visibility"); + scrollHandler = bind(document, scroll, true, e -> recalculatePlacement()); } visible = true; if (triggerMode == TriggerMode.click) { @@ -405,6 +419,10 @@ private void internalShow(Event event) { private void internalHide(Event event) { overlayElement.hidePopover(); visible = false; + if (scrollHandler != null) { + scrollHandler.removeHandler(); + scrollHandler = null; + } if (outsideClickHandler != null) { outsideClickHandler.removeHandler(); outsideClickHandler = null; @@ -414,9 +432,13 @@ private void internalHide(Event event) { } } + // ------------------------------------------------------ placement calculation (cssPositioning == false) + private void recalculatePlacement() { - if (visible) { - placement(bestPlacement()); + Placement best = bestPlacement(); + if (!overlayElement.classList.contains(best.modifier())) { + logger.debug("Best placement for %s is now %s", id, best.name()); + swap(null, overlayElement, best, Placement.values()); } } @@ -434,32 +456,38 @@ private Placement bestPlacement() { boolean rightFits = toRight >= overlayRect.width / 3 + distance; Placement result; - // @formatter:off - if (placement == top && topFits) { result = top; } - else if (placement == bottom && bottomFits) { result = bottom; } - else if (placement == left && leftFits) { result = left; } - else if (placement == right && rightFits) { result = right; } - else { result = null; } - // @formatter:on - - if (result == null) { + + // If the initial placement fits, keep the exact preferred placement (including start/end alignment) + if (directionFits(placement.base(), topFits, bottomFits, leftFits, rightFits)) { + result = placement; + } else { + // Find the best fallback direction + Placement fallbackBase; // @formatter:off - if (topFits && leftFits && rightFits) { result = top; } - else if (rightFits && !leftFits) { result = right; } - else if (leftFits && !rightFits) { result = left; } - else if (topFits) { result = top; } - else if (bottomFits) { result = bottom; } - else { result = toRight >= toLeft ? right : left; } + if (topFits && leftFits && rightFits) { fallbackBase = top; } + else if (rightFits && !leftFits) { fallbackBase = right; } + else if (leftFits && !rightFits) { fallbackBase = left; } + else if (topFits) { fallbackBase = top; } + else if (bottomFits) { fallbackBase = bottom; } + else { fallbackBase = toRight >= toLeft ? right : left; } // @formatter:on + + // Preserve start/end alignment from the initial placement + result = placement.withBase(fallbackBase); } - logger.debug("Best placement for %s: %s → %s", id, placement.name(), result.name()); return result; } - private void applyMinWidth() { - if (matchTriggerWidth && trigger != null) { - overlayElement.style.setProperty("min-width", trigger.offsetWidth + "px"); - } + private boolean directionFits(Placement base, + boolean topFits, boolean bottomFits, + boolean leftFits, boolean rightFits) { + return switch (base) { + case top -> topFits; + case bottom -> bottomFits; + case left -> leftFits; + case right -> rightFits; + default -> false; + }; } -} \ No newline at end of file +} diff --git a/core/src/main/java/org/patternfly/overlay/package-info.java b/core/src/main/java/org/patternfly/overlay/package-info.java index e21ccdd8d..e72e9a8f8 100644 --- a/core/src/main/java/org/patternfly/overlay/package-info.java +++ b/core/src/main/java/org/patternfly/overlay/package-info.java @@ -29,8 +29,8 @@ * listener registration, entry/exit delay timers, and show/hide lifecycle management *
  • {@link org.patternfly.overlay.TriggerMode} - Defines how an overlay responds to user interaction: hover, * click, or manual control
  • - *
  • {@link org.patternfly.overlay.CssPositioning} - Reads CSS custom properties to determine whether to use - * native CSS positioning or JavaScript-based positioning
  • + *
  • {@link org.patternfly.overlay.CssPositioning} - Detects browser support for CSS Anchor Positioning to + * determine whether to use native CSS positioning or JavaScript-based positioning
  • *
* *

Usage

@@ -49,18 +49,11 @@ * *

Positioning

* - *

The overlay supports two positioning strategies. When CSS anchor positioning is enabled via custom properties, + *

The overlay supports two positioning strategies. When the browser supports + * CSS Anchor Positioning, * the browser handles positioning natively using {@code position-try-fallbacks}. Otherwise, the overlay falls back to - * JavaScript-based positioning that calculates the best placement relative to the trigger element. - * - *

To enable CSS positioning, set the corresponding custom property on {@code :root}: - * - *

- * :root {
- *     --pf-v6-c-tooltip--css-positioning: 1;
- *     --pf-v6-c-popover--css-positioning: 1;
- * }
- * 
+ * JavaScript-based positioning that calculates the best placement relative to the trigger element. Detection is + * automatic via {@link org.patternfly.overlay.CssPositioning#anchorNameSupported()}. * * @see org.patternfly.overlay.Overlay * @see org.patternfly.overlay.TriggerMode diff --git a/core/src/main/java/org/patternfly/popper/Modifiers.java b/core/src/main/java/org/patternfly/popper/Modifiers.java index c13fd81e6..fc7fc3573 100644 --- a/core/src/main/java/org/patternfly/popper/Modifiers.java +++ b/core/src/main/java/org/patternfly/popper/Modifiers.java @@ -15,11 +15,11 @@ */ package org.patternfly.popper; -import static org.patternfly.popper.PopperPlacement.auto; - import elemental2.dom.CSSProperties.MinWidthUnionType; import elemental2.dom.HTMLElement; +import static org.patternfly.popper.PopperPlacement.auto; + @Deprecated public interface Modifiers { diff --git a/core/src/main/java/org/patternfly/popper/PopperBuilder.java b/core/src/main/java/org/patternfly/popper/PopperBuilder.java index 6d77928d2..9e0f27ec6 100644 --- a/core/src/main/java/org/patternfly/popper/PopperBuilder.java +++ b/core/src/main/java/org/patternfly/popper/PopperBuilder.java @@ -24,7 +24,6 @@ import org.gwtproject.event.shared.HandlerRegistration; import org.jboss.elemento.EventType; import org.jboss.elemento.logger.Logger; -import org.patternfly.popper.PopperPlacement; import elemental2.core.JsArray; import elemental2.dom.CSSProperties; diff --git a/core/src/main/java/org/patternfly/style/Classes.java b/core/src/main/java/org/patternfly/style/Classes.java index 6ebf16239..5a5f653a3 100644 --- a/core/src/main/java/org/patternfly/style/Classes.java +++ b/core/src/main/java/org/patternfly/style/Classes.java @@ -200,6 +200,7 @@ public interface Classes { String outerWrap = "outer-wrap"; String outline = "outline"; String overflow = "overflow"; + String overlay = "overlay"; String overflowContainer = "overflow-container"; String overflowScroll = "overflow-scroll"; String padding = "padding"; diff --git a/core/src/main/java/org/patternfly/style/Placement.java b/core/src/main/java/org/patternfly/style/Placement.java index 087c4e7df..87ed3c305 100644 --- a/core/src/main/java/org/patternfly/style/Placement.java +++ b/core/src/main/java/org/patternfly/style/Placement.java @@ -17,36 +17,40 @@ public enum Placement implements TypedModifier { - top("top", Classes.modifier(Classes.top)), + top("top", Classes.modifier(Classes.top), Alignment.NONE), - topStart("top-start", Classes.modifier(Classes.top) + "-left"), + topStart("top-start", Classes.modifier(Classes.top) + "-left", Alignment.START), - topEnd("top-end", Classes.modifier(Classes.top) + "-right"), + topEnd("top-end", Classes.modifier(Classes.top) + "-right", Alignment.END), - bottom("bottom", Classes.modifier(Classes.bottom)), + bottom("bottom", Classes.modifier(Classes.bottom), Alignment.NONE), - bottomStart("bottom-start", Classes.modifier(Classes.bottom) + "-left"), + bottomStart("bottom-start", Classes.modifier(Classes.bottom) + "-left", Alignment.START), - bottomEnd("bottom-end", Classes.modifier(Classes.bottom) + "-right"), + bottomEnd("bottom-end", Classes.modifier(Classes.bottom) + "-right", Alignment.END), - left("left", Classes.modifier(Classes.left)), + left("left", Classes.modifier(Classes.left), Alignment.NONE), - leftStart("left-start", Classes.modifier(Classes.left) + "-top"), + leftStart("left-start", Classes.modifier(Classes.left) + "-top", Alignment.START), - leftEnd("left-end", Classes.modifier(Classes.left) + "-bottom"), + leftEnd("left-end", Classes.modifier(Classes.left) + "-bottom", Alignment.END), - right("right", Classes.modifier(Classes.right)), + right("right", Classes.modifier(Classes.right), Alignment.NONE), - rightStart("right-start", Classes.modifier(Classes.right) + "-bottom"), + rightStart("right-start", Classes.modifier(Classes.right) + "-bottom", Alignment.START), - rightEnd("right-end", Classes.modifier(Classes.right) + "-bottom"); + rightEnd("right-end", Classes.modifier(Classes.right) + "-bottom", Alignment.END); + + private enum Alignment {NONE, START, END} private final String value; private final String modifier; + private final Alignment alignment; - Placement(String value, String modifier) { + Placement(String value, String modifier, Alignment alignment) { this.value = value; this.modifier = modifier; + this.alignment = alignment; } @Override @@ -58,4 +62,38 @@ public String value() { public String modifier() { return modifier; } + + /** Returns the base direction ({@code top}, {@code bottom}, {@code left}, or {@code right}) for this placement. */ + public Placement base() { + return switch (this) { + case topStart, topEnd -> top; + case bottomStart, bottomEnd -> bottom; + case leftStart, leftEnd -> left; + case rightStart, rightEnd -> right; + default -> this; + }; + } + + /** + * Returns a placement that combines the base direction of {@code newBase} with the alignment (none, start, end) of this + * placement. For example, {@code topStart.withBase(bottom)} returns {@code bottomStart}. + */ + public Placement withBase(Placement newBase) { + Placement base = newBase.base(); + return switch (alignment) { + case START -> { + if (base == top) {yield topStart;} + if (base == bottom) {yield bottomStart;} + if (base == left) {yield leftStart;} + yield rightStart; + } + case END -> { + if (base == top) {yield topEnd;} + if (base == bottom) {yield bottomEnd;} + if (base == left) {yield leftEnd;} + yield rightEnd; + } + default -> base; + }; + } } diff --git a/showcase/README.md b/showcase/README.md index 1442f6471..56ee33035 100644 --- a/showcase/README.md +++ b/showcase/README.md @@ -11,7 +11,7 @@ Changes to the Java code will be detected by the J2CL Maven plugin, but you need To start the showcase in development mode, run the following command in the root directory: ```shell -mvn j2cl:watch -P showcase +mvn compile j2cl:watch -P showcase ``` and wait until you see the message diff --git a/showcase/package.json b/showcase/package.json index ba1ff09f2..1398a4ae2 100644 --- a/showcase/package.json +++ b/showcase/package.json @@ -20,9 +20,6 @@ }, "dependencies": { "@github/relative-time-element": "^5.0.0", - "@patternfly-java/charts": "^0.0.13", - "@patternfly-java/core": "link:../core/npm", - "@patternfly-java/finder": "link:../extensions/finder/npm", "@patternfly/patternfly": "^6.4.0", "highlight.js": "^11.11.1" }, diff --git a/showcase/pnpm-lock.yaml b/showcase/pnpm-lock.yaml index 9c31e4bd7..6acd3cdc5 100644 --- a/showcase/pnpm-lock.yaml +++ b/showcase/pnpm-lock.yaml @@ -11,15 +11,6 @@ importers: '@github/relative-time-element': specifier: ^5.0.0 version: 5.0.0 - '@patternfly-java/charts': - specifier: ^0.0.13 - version: 0.0.13 - '@patternfly-java/core': - specifier: link:../core/npm - version: link:../core/npm - '@patternfly-java/finder': - specifier: link:../extensions/finder/npm - version: link:../extensions/finder/npm '@patternfly/patternfly': specifier: ^6.4.0 version: 6.4.0 @@ -29,19 +20,19 @@ importers: devDependencies: '@parcel/config-default': specifier: ^2.16.4 - version: 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))(@swc/helpers@0.5.19) + version: 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(@swc/helpers@0.5.20) '@parcel/core': specifier: ^2.16.4 - version: 2.16.4(@swc/helpers@0.5.19) + version: 2.16.4(@swc/helpers@0.5.20) '@parcel/reporter-cli': specifier: ^2.16.4 - version: 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + version: 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/resolver-glob': specifier: ^2.16.4 - version: 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + version: 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/transformer-css': specifier: ^2.16.4 - version: 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + version: 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) basic-ftp: specifier: ^5.2.0 version: 5.2.0 @@ -62,10 +53,10 @@ importers: version: 11.0.0 parcel: specifier: ^2.16.4 - version: 2.16.4(@swc/helpers@0.5.19) + version: 2.16.4(@swc/helpers@0.5.20) parcel-resolver-ignore: specifier: ^2.2.1 - version: 2.2.1(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + version: 2.2.1(@parcel/core@2.16.4(@swc/helpers@0.5.20)) puppeteer: specifier: ^24.40.0 version: 24.40.0 @@ -112,12 +103,6 @@ packages: '@lezer/lr@1.4.8': resolution: {integrity: sha512-bPWa0Pgx69ylNlMlPvBPryqeLYQjyJjqPx+Aupm5zydLIF3NE+6MMLT8Yi23Bd9cif9VS00aUebn+6fDIGBcDA==} - '@lit-labs/ssr-dom-shim@1.5.1': - resolution: {integrity: sha512-Aou5UdlSpr5whQe8AA/bZG0jMj96CoJIWbGfZ91qieWu5AWUMKw8VR/pAkQkJYvBNhmCcWnZlyyk5oze8JIqYA==} - - '@lit/reactive-element@2.1.2': - resolution: {integrity: sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==} - '@lmdb/lmdb-darwin-arm64@2.8.5': resolution: {integrity: sha512-KPDeVScZgA1oq0CiPBcOa3kHIqU+pTOwRFDIhxvmf8CTNvqdZQYp5cCKW0bUk69VygB2PuTiINFWbY78aR2pQw==} cpu: [arm64] @@ -558,79 +543,9 @@ packages: peerDependencies: '@parcel/core': ^2.16.4 - '@patternfly-java/charts@0.0.13': - resolution: {integrity: sha512-mSAHj6J59AnhJkQmwiQETn3HGT2rAPGwYd4zfNMfbY+VLDiFlVgNE/BFvh+z0F82CRFphmWp1wqKuQ7d5GQX6A==} - '@patternfly/patternfly@6.4.0': resolution: {integrity: sha512-4drFhg74sEc/fftark5wZevODIog17qR4pwLCdB3j5iK3Uu5oMA2SdLhsEeEQggalfnFzve/Km87MdVR0ghhvQ==} - '@patternfly/react-charts@8.4.1': - resolution: {integrity: sha512-kqP5TFr9F/SDTp+nXfcX8gMuZIQ6Uxl55qqiWYgR2zflo0UZWnyL/d2s1fI6Bfi5IuycNdlvJJ/i8QdOsLr5mw==} - peerDependencies: - echarts: ^5.6.0 || ^6.0.0 - react: ^17 || ^18 || ^19 - react-dom: ^17 || ^18 || ^19 - victory-area: ^37.3.6 - victory-axis: ^37.3.6 - victory-bar: ^37.3.6 - victory-box-plot: ^37.3.6 - victory-chart: ^37.3.6 - victory-core: ^37.3.6 - victory-create-container: ^37.3.6 - victory-cursor-container: ^37.3.6 - victory-group: ^37.3.6 - victory-legend: ^37.3.6 - victory-line: ^37.3.6 - victory-pie: ^37.3.6 - victory-scatter: ^37.3.6 - victory-stack: ^37.3.6 - victory-tooltip: ^37.3.6 - victory-voronoi-container: ^37.3.6 - victory-zoom-container: ^37.3.6 - peerDependenciesMeta: - echarts: - optional: true - victory-area: - optional: true - victory-axis: - optional: true - victory-bar: - optional: true - victory-box-plot: - optional: true - victory-chart: - optional: true - victory-core: - optional: true - victory-create-container: - optional: true - victory-cursor-container: - optional: true - victory-group: - optional: true - victory-legend: - optional: true - victory-line: - optional: true - victory-pie: - optional: true - victory-scatter: - optional: true - victory-stack: - optional: true - victory-tooltip: - optional: true - victory-voronoi-container: - optional: true - victory-zoom-container: - optional: true - - '@patternfly/react-styles@6.4.0': - resolution: {integrity: sha512-EXmHA67s5sy+Wy/0uxWoUQ52jr9lsH2wV3QcgtvVc5zxpyBX89gShpqv4jfVqaowznHGDoL6fVBBrSe9BYOliQ==} - - '@patternfly/react-tokens@6.4.0': - resolution: {integrity: sha512-iZthBoXSGQ/+PfGTdPFJVulaJZI3rwE+7A/whOXPGp3Jyq3k6X52pr1+5nlO6WHasbZ9FyeZGqXf4fazUZNjbw==} - '@puppeteer/browsers@2.13.0': resolution: {integrity: sha512-46BZJYJjc/WwmKjsvDFykHtXrtomsCIrwYQPOP7VfMJoZY2bsDF9oROBABR3paDjDcmkUye1Pb1BqdcdiipaWA==} engines: {node: '>=18'} @@ -723,8 +638,8 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/helpers@0.5.19': - resolution: {integrity: sha512-QamiFeIK3txNjgUTNppE6MiG3p7TdninpZu0E0PbqVh1a9FNLT2FRhisaa4NcaX52XVhA5l7Pk58Ft7Sqi/2sA==} + '@swc/helpers@0.5.20': + resolution: {integrity: sha512-2egEBHUMasdypIzrprsu8g+OEVd7Vp2MM3a2eVlM/cyFYto0nGz5BX5BTgh/ShZZI9ed+ozEq+Ngt+rgmUs8tw==} '@swc/types@0.1.26': resolution: {integrity: sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw==} @@ -732,42 +647,12 @@ packages: '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - '@types/d3-array@3.2.2': - resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} - - '@types/d3-color@3.1.3': - resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} - - '@types/d3-ease@3.0.2': - resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} - - '@types/d3-interpolate@3.0.4': - resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} - - '@types/d3-path@3.1.1': - resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} - - '@types/d3-scale@4.0.9': - resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} - - '@types/d3-shape@3.1.8': - resolution: {integrity: sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==} - - '@types/d3-time@3.0.4': - resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} - - '@types/d3-timer@3.0.2': - resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} - '@types/http-proxy@1.17.17': resolution: {integrity: sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==} '@types/node@25.5.0': resolution: {integrity: sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==} - '@types/trusted-types@2.0.7': - resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} @@ -800,8 +685,8 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - axios@1.13.6: - resolution: {integrity: sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==} + axios@1.14.0: + resolution: {integrity: sha512-3Y8yrqLSwjuzpXuZ0oIYZ/XGgLwUIBU3uLvbcpb0pidD9ctpShJd43KSlEEkVQg6DS0G9NKyzOvBfUtDKEyHvQ==} b4a@1.8.0: resolution: {integrity: sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==} @@ -828,15 +713,15 @@ packages: bare-buffer: optional: true - bare-os@3.8.0: - resolution: {integrity: sha512-Dc9/SlwfxkXIGYhvMQNUtKaXCaGkZYGcd1vuNUUADVqzu4/vQfvnMkYYOUnt2VwQ2AqKr/8qAVFRtwETljgeFg==} + bare-os@3.8.6: + resolution: {integrity: sha512-l8xaNWWb/bXuzgsrlF5jaa5QYDJ9S0ddd54cP6CH+081+5iPrbJiCfBWQqrWYzmUhCbsH+WR6qxo9MeHVCr0MQ==} engines: {bare: '>=1.14.0'} bare-path@3.0.0: resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - bare-stream@2.11.0: - resolution: {integrity: sha512-Y/+iQ49fL3rIn6w/AVxI/2+BRrpmzJvdWt5Jv8Za6Ngqc6V227c+pYjYYgLdpR3MwQ9ObVXD0ZrqoBztakM0rw==} + bare-stream@2.12.0: + resolution: {integrity: sha512-w28i8lkBgREV3rPXGbgK+BO66q+ZpKqRWrZLiCdmmUlLPrQ45CzkvRhN+7lnv00Gpi2zy5naRxnUFAxCECDm9g==} peerDependencies: bare-abort-controller: '*' bare-buffer: '*' @@ -855,8 +740,8 @@ packages: base-x@3.0.11: resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - baseline-browser-mapping@2.10.10: - resolution: {integrity: sha512-sUoJ3IMxx4AyRqO4MLeHlnGDkyXRoUG0/AI9fjK+vS72ekpV0yWVY7O0BVjmBcRtkNcsAO2QDZ4tdKKGoI6YaQ==} + baseline-browser-mapping@2.10.13: + resolution: {integrity: sha512-BL2sTuHOdy0YT1lYieUxTw/QMtPBC3pmlJC6xk8BBYVv6vcw3SGdKemQ+Xsx9ik2F/lYDO9tqsFQH1r9PFuHKw==} engines: {node: '>=6.0.0'} hasBin: true @@ -876,8 +761,8 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.28.1: - resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -904,8 +789,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001781: - resolution: {integrity: sha512-RdwNCyMsNBftLjW6w01z8bKEvT6e/5tpPVEgtn22TiLGlstHOVecsX2KHFkD5e/vRnIE4EGzpuIODb3mtswtkw==} + caniuse-lite@1.0.30001784: + resolution: {integrity: sha512-WU346nBTklUV9YfUl60fqRbU5ZqyXlqvo1SgigE1OAXK5bFL8LL9q1K7aap3N739l4BvNqnkm3YrGHiY9sfUQw==} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -977,50 +862,6 @@ packages: typescript: optional: true - d3-array@3.2.4: - resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} - engines: {node: '>=12'} - - d3-color@3.1.0: - resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} - engines: {node: '>=12'} - - d3-ease@3.0.1: - resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} - engines: {node: '>=12'} - - d3-format@3.1.2: - resolution: {integrity: sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==} - engines: {node: '>=12'} - - d3-interpolate@3.0.1: - resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} - engines: {node: '>=12'} - - d3-path@3.1.0: - resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} - engines: {node: '>=12'} - - d3-scale@4.0.2: - resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} - engines: {node: '>=12'} - - d3-shape@3.2.0: - resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} - engines: {node: '>=12'} - - d3-time-format@4.1.0: - resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} - engines: {node: '>=12'} - - d3-time@3.1.0: - resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} - engines: {node: '>=12'} - - d3-timer@3.0.1: - resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} - engines: {node: '>=12'} - data-uri-to-buffer@6.0.2: resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} engines: {node: '>= 14'} @@ -1050,12 +891,6 @@ packages: resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} engines: {node: '>= 14'} - delaunator@4.0.1: - resolution: {integrity: sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==} - - delaunay-find@0.0.6: - resolution: {integrity: sha512-1+almjfrnR7ZamBk0q3Nhg6lqSe6Le4vL0WJDSMx4IDbQwTpUTXPjxC00lqLBT8MYsJpPCbI16sIkw9cPsbi7Q==} - delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -1091,8 +926,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.325: - resolution: {integrity: sha512-PwfIw7WQSt3xX7yOf5OE/unLzsK9CaN2f/FvV3WjPR1Knoc1T9vePRVV4W1EM301JzzysK51K7FNKcusCr0zYA==} + electron-to-chromium@1.5.331: + resolution: {integrity: sha512-IbxXrsTlD3hRodkLnbxAPP4OuJYdWCeM3IOdT+CpcMoIwIoDfCmRpEtSPfwBXxVkg9xmBeY7Lz2Eo2TDn/HC3Q==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1265,9 +1100,6 @@ packages: resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} engines: {node: '>=12.0.0'} - hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - html-encoding-sniffer@3.0.0: resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} engines: {node: '>=12'} @@ -1312,10 +1144,6 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - internmap@2.0.3: - resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} - engines: {node: '>=12'} - ip-address@10.1.0: resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} engines: {node: '>= 12'} @@ -1368,8 +1196,8 @@ packages: resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} engines: {node: '>=16'} - joi@18.1.1: - resolution: {integrity: sha512-pJkBiPtNo+o0h19LfSvUN46Y5zY+ck99AtHwch9n2HqVLNRgP0ZMyIH8FRMoP+HV8hy/+AG99dXFfwpf83iZfQ==} + joi@18.1.2: + resolution: {integrity: sha512-rF5MAmps5esSlhCA+N1b6IYHDw9j/btzGaqfgie522jS02Ju/HXBxamlXVlKEHAxoMKQL77HWI8jlqWsFuekZA==} engines: {node: '>= 20'} js-tokens@4.0.0: @@ -1382,9 +1210,6 @@ packages: json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -1463,21 +1288,12 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - lit-element@4.2.2: - resolution: {integrity: sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==} - - lit-html@3.3.2: - resolution: {integrity: sha512-Qy9hU88zcmaxBXcc10ZpdK7cOLXvXpRoBxERdtqV9QOrfpMZZ6pSYP91LhpPtap3sFMUiL7Tw2RImbe0Al2/kw==} - - lit@3.3.2: - resolution: {integrity: sha512-NF9zbsP79l4ao2SNrH3NkfmFgN/hBYSQo90saIVI1o5GpjAdCPVstVzO1MrLOakHoEhYkrtRjPK6Ob521aoYWQ==} - lmdb@2.8.5: resolution: {integrity: sha512-9bMdFfc80S+vSldBmG3HOuLVHnxRdNTlpzR6QDnzqCQtCzGUEAGTzBKYMeIM+I/sU4oZfgbcbS7X7F65/z/oxQ==} hasBin: true - lodash@4.17.23: - resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} lru-cache@7.18.3: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} @@ -1558,8 +1374,8 @@ packages: resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} hasBin: true - node-releases@2.0.36: - resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==} + node-releases@2.0.37: + resolution: {integrity: sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==} nullthrows@1.1.1: resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} @@ -1615,8 +1431,8 @@ packages: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} - path-to-regexp@8.3.0: - resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} + path-to-regexp@8.4.2: + resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} @@ -1658,6 +1474,10 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} + engines: {node: '>=10'} + pump@3.0.4: resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} @@ -1682,25 +1502,10 @@ packages: resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} engines: {node: '>= 0.10'} - react-dom@19.2.4: - resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} - peerDependencies: - react: ^19.2.4 - - react-fast-compare@3.2.2: - resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} - - react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react-refresh@0.16.0: resolution: {integrity: sha512-FPvF2XxTSikpJxcr+bHut2H4gJ17+18Uy20D5/F+SKzFap62R3cM5wH6b8WN3LyGSYeQilLEcJcR1fjBSI2S1A==} engines: {node: '>=0.10.0'} - react@19.2.4: - resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} - engines: {node: '>=0.10.0'} - regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} @@ -1735,9 +1540,6 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - scheduler@0.27.0: - resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} - secure-compare@3.0.1: resolution: {integrity: sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==} @@ -1886,135 +1688,6 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - victory-area@37.3.6: - resolution: {integrity: sha512-wVC8LKrZJLiSySNuJLRCB449qZTsPiRyzLlNoJwe21y+XA/a2HJbmJSeywmo8P153aX8viKe1H8ygDsTFXQhHw==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: '>=16.6.0' - - victory-axis@37.3.6: - resolution: {integrity: sha512-Vi0dZvgmXmnCdoqc49WckeG5cMXnl7FTtqVhXu9JweA9cgCnkZabBd5mRvAjblb3Lo4j0HZCSPKHYWUPW70qZg==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: '>=16.6.0' - - victory-bar@37.3.6: - resolution: {integrity: sha512-jdATFRWL1LUW/yEpKWx/aId2BiU2o1pPF9+Kh1TFISBduJoI4ZqvZD90H1QK4f/z50PikqiqiDECaKoKM1jfOQ==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: '>=16.6.0' - - victory-box-plot@37.3.6: - resolution: {integrity: sha512-GOucnD63h14ScBuISC/nd1GBTEx6gIZfLE+0P0gyeH1poBKq0trTTvpQDvAMuGR8zICfEETG3ltmUMCwRrFyUg==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: '>=16.6.0' - - victory-brush-container@37.3.6: - resolution: {integrity: sha512-LfZ2CgX1cYAqCtYxcSB68OfZS2v0T2VLXoEArd0lCXfRBY1Gya7GacCUcuo7GoK9XOXeslx7S/U95aVutt1VLg==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: '>=16.6.0' - - victory-chart@37.3.6: - resolution: {integrity: sha512-IkPo/W4AJ7bPu902TGER09OseR9ODm+FQAKfOBw4JsdEhZZ7BiG9zgd/25+x0r5EsTLu81CYGQVkBa+ZazcOlA==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: '>=16.6.0' - - victory-core@37.3.6: - resolution: {integrity: sha512-aFgO6KokxPbUCPznZP5UPhOdI22pMuwDXKDt6eoQOnkVim66Ia+K95TQar2nwVKGYV5j26aKVf/n9blwphGJRw==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: '>=16.6.0' - - victory-create-container@37.3.6: - resolution: {integrity: sha512-Uf5bFQvqUsXCjqpvBW4LhrdrHkM6dBqxYgub6FCsBb86f84xZQ3vY7jFkg/JfvF0oGKMoWXYYrYLC1sk+fcWVA==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: '>=16.6.0' - - victory-cursor-container@37.3.6: - resolution: {integrity: sha512-+Oiw57d5nE+iq8As8RvepknzmNtKq1Gsc50u1X3IRd4jXtX8zqZrgXGlVZ+BP/tkLsWnGYVjKulwKBf2oaEUuw==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: '>=16.6.0' - - victory-group@37.3.6: - resolution: {integrity: sha512-kgy/Azl5BxwlJAV0KDPGypv35TMrOD1J2ZxnJW2Wyyq+e8i0GGBIv5MoBzou64BRsDlS9V0CYRIjnkHgrBpB5w==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: '>=16.6.0' - - victory-legend@37.3.6: - resolution: {integrity: sha512-vRRrhj3/ENqKVLdaBMzEmR83N6BOjox1bthYT1eJjN2H5SIK35bxn30IkiV/Pz3y627EqZe4TAWaxc0jiJlCiA==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: '>=16.6.0' - - victory-line@37.3.6: - resolution: {integrity: sha512-Ke817uf/qFbN9jU7Dba7CrcHXYO5wAZuKKnyeHJmLDeQeFST0773xejnIuC+dBgZipjFr4KIbSd+VcUafFNE1g==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: '>=16.6.0' - - victory-pie@37.3.6: - resolution: {integrity: sha512-tvdgAZ/HQWlo3KDDe0XAVbizHuaNMbgkkiF7zfA7Ww+3bHSs+0P9dsDtK2xP365D8gBCOv8pWmuzvKRhzNbqeA==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: '>=16.6.0' - - victory-polar-axis@37.3.6: - resolution: {integrity: sha512-RpFsCkzHezJq5P+C/wtVdjEHX25JIFsSgs6qYSnfr/hayaFbWgK5HhRFpriQm5hg61cx47WxAOLyHvzf0nasvw==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: '>=16.6.0' - - victory-scatter@37.3.6: - resolution: {integrity: sha512-fp95zMTPXgW1cmTowzDXhn+KxePMVDrzU0lotsHQMdBV7eB+ioXdu9hORlx4VHmMYg2ihsGwRTF+VAZ7rGxphA==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: '>=16.6.0' - - victory-selection-container@37.3.6: - resolution: {integrity: sha512-gd3qODDlBtLEJM7+2jCXk2YcLBUmIpYEEHswytMhwc6zihxXipGBUHRulhLj/I05mKay2gaOAg5ewiJHd4Awgw==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: '>=16.6.0' - - victory-shared-events@37.3.6: - resolution: {integrity: sha512-ygrbOtzLUTbtKebacZKyQRekhSAROnAvMkVI/PKsAGsz0ClY9P7qDEJG7eTUUygjO6ax0tI6WNE6JogQzeD1gw==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: '>=16.6.0' - - victory-stack@37.3.6: - resolution: {integrity: sha512-ldod04RdqGJGH5p5eWXCofdTkbhZqIp3iwW7NpxSbMDLs8zPQIVvDFVtuJgMwQiC5vnIpbhMmxVeFbr8m64ZKA==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: '>=16.6.0' - - victory-tooltip@37.3.6: - resolution: {integrity: sha512-vqaJS9noauOqDDBBAV9Ln9duOY/i17h1DCfCPAqhwPFyvFbwKvAub9zPTeYWAm/14VvWX5O/0yekFCVbcC7hjg==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: '>=16.6.0' - - victory-vendor@37.3.6: - resolution: {integrity: sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==} - - victory-voronoi-container@37.3.6: - resolution: {integrity: sha512-qAAG0rMuK7A4EoJ4cyUk5wNdOW+HuCXNKPOko+hYK6wWOYXJvFhiglYyA85a695YyAXECc6JyJS/crm4IOEFag==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: '>=16.6.0' - - victory-zoom-container@37.3.6: - resolution: {integrity: sha512-AGL+k20mI44OL5b0VgIxlmnNSefIoFmbbim5NraPmIxbtns9qQW/56ivIncJcYomBungIx99gUpsEpcQaMNHgQ==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: '>=16.6.0' - wait-on@9.0.4: resolution: {integrity: sha512-k8qrgfwrPVJXTeFY8tl6BxVHiclK11u72DVKhpybHfUL/K6KM4bdyK9EhIVYGytB5MJe/3lq4Tf0hrjM+pvJZQ==} engines: {node: '>=20.0.0'} @@ -2106,12 +1779,6 @@ snapshots: dependencies: '@lezer/common': 1.5.1 - '@lit-labs/ssr-dom-shim@1.5.1': {} - - '@lit/reactive-element@2.1.2': - dependencies: - '@lit-labs/ssr-dom-shim': 1.5.1 - '@lmdb/lmdb-darwin-arm64@2.8.5': optional: true @@ -2154,11 +1821,11 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': optional: true - '@parcel/bundler-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/bundler-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: '@parcel/diagnostic': 2.16.4 '@parcel/graph': 3.6.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/rust': 2.16.4 '@parcel/utils': 2.16.4 nullthrows: 1.1.1 @@ -2166,10 +1833,10 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/cache@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/cache@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/core': 2.16.4(@swc/helpers@0.5.19) - '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/core': 2.16.4(@swc/helpers@0.5.20) + '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/logger': 2.16.4 '@parcel/utils': 2.16.4 lmdb: 2.8.5 @@ -2180,72 +1847,72 @@ snapshots: dependencies: chalk: 4.1.2 - '@parcel/compressor-raw@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/compressor-raw@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/config-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))(@swc/helpers@0.5.19)': - dependencies: - '@parcel/bundler-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/compressor-raw': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/core': 2.16.4(@swc/helpers@0.5.19) - '@parcel/namer-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/optimizer-css': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/optimizer-html': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/optimizer-image': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/optimizer-svg': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/optimizer-swc': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))(@swc/helpers@0.5.19) - '@parcel/packager-css': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/packager-html': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/packager-js': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/packager-raw': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/packager-svg': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/packager-wasm': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/reporter-dev-server': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/resolver-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/runtime-browser-hmr': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/runtime-js': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/runtime-rsc': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/runtime-service-worker': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/transformer-babel': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/transformer-css': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/transformer-html': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/transformer-image': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/transformer-js': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/transformer-json': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/transformer-node': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/transformer-postcss': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/transformer-posthtml': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/transformer-raw': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/transformer-react-refresh-wrap': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/transformer-svg': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/config-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(@swc/helpers@0.5.20)': + dependencies: + '@parcel/bundler-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/compressor-raw': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/core': 2.16.4(@swc/helpers@0.5.20) + '@parcel/namer-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/optimizer-css': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/optimizer-html': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/optimizer-image': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/optimizer-svg': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/optimizer-swc': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(@swc/helpers@0.5.20) + '@parcel/packager-css': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/packager-html': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/packager-js': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/packager-raw': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/packager-svg': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/packager-wasm': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/reporter-dev-server': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/resolver-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/runtime-browser-hmr': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/runtime-js': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/runtime-rsc': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/runtime-service-worker': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/transformer-babel': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/transformer-css': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/transformer-html': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/transformer-image': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/transformer-js': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/transformer-json': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/transformer-node': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/transformer-postcss': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/transformer-posthtml': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/transformer-raw': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/transformer-react-refresh-wrap': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/transformer-svg': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) transitivePeerDependencies: - '@swc/helpers' - napi-wasm - '@parcel/core@2.16.4(@swc/helpers@0.5.19)': + '@parcel/core@2.16.4(@swc/helpers@0.5.20)': dependencies: '@mischnic/json-sourcemap': 0.1.1 - '@parcel/cache': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/cache': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/diagnostic': 2.16.4 '@parcel/events': 2.16.4 '@parcel/feature-flags': 2.16.4 - '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/graph': 3.6.4 '@parcel/logger': 2.16.4 - '@parcel/package-manager': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))(@swc/helpers@0.5.19) - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/package-manager': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(@swc/helpers@0.5.20) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/profiler': 2.16.4 '@parcel/rust': 2.16.4 '@parcel/source-map': 2.1.1 - '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/utils': 2.16.4 - '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) base-x: 3.0.11 - browserslist: 4.28.1 + browserslist: 4.28.2 clone: 2.1.2 dotenv: 16.6.1 dotenv-expand: 11.0.7 @@ -2268,15 +1935,15 @@ snapshots: '@parcel/feature-flags@2.16.4': {} - '@parcel/fs@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/fs@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/core': 2.16.4(@swc/helpers@0.5.19) + '@parcel/core': 2.16.4(@swc/helpers@0.5.20) '@parcel/feature-flags': 2.16.4 '@parcel/rust': 2.16.4 '@parcel/types-internal': 2.16.4 '@parcel/utils': 2.16.4 '@parcel/watcher': 2.5.6 - '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) transitivePeerDependencies: - napi-wasm @@ -2294,20 +1961,20 @@ snapshots: dependencies: chalk: 4.1.2 - '@parcel/namer-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/namer-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/node-resolver-core@3.7.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/node-resolver-core@3.7.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: '@mischnic/json-sourcemap': 0.1.1 '@parcel/diagnostic': 2.16.4 - '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/rust': 2.16.4 '@parcel/utils': 2.16.4 nullthrows: 1.1.1 @@ -2316,81 +1983,81 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/optimizer-css@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/optimizer-css@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 - browserslist: 4.28.1 + browserslist: 4.28.2 lightningcss: 1.32.0 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/optimizer-html@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/optimizer-html@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/rust': 2.16.4 '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/optimizer-image@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/optimizer-image@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/core': 2.16.4(@swc/helpers@0.5.19) + '@parcel/core': 2.16.4(@swc/helpers@0.5.20) '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/rust': 2.16.4 '@parcel/utils': 2.16.4 - '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) transitivePeerDependencies: - napi-wasm - '@parcel/optimizer-svg@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/optimizer-svg@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/rust': 2.16.4 '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/optimizer-swc@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))(@swc/helpers@0.5.19)': + '@parcel/optimizer-swc@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(@swc/helpers@0.5.20)': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 - '@swc/core': 1.15.21(@swc/helpers@0.5.19) + '@swc/core': 1.15.21(@swc/helpers@0.5.20) nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - '@swc/helpers' - napi-wasm - '@parcel/package-manager@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))(@swc/helpers@0.5.19)': + '@parcel/package-manager@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(@swc/helpers@0.5.20)': dependencies: - '@parcel/core': 2.16.4(@swc/helpers@0.5.19) + '@parcel/core': 2.16.4(@swc/helpers@0.5.20) '@parcel/diagnostic': 2.16.4 - '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/logger': 2.16.4 - '@parcel/node-resolver-core': 3.7.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/node-resolver-core': 3.7.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/utils': 2.16.4 - '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@swc/core': 1.15.21(@swc/helpers@0.5.19) + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@swc/core': 1.15.21(@swc/helpers@0.5.20) semver: 7.7.4 transitivePeerDependencies: - '@swc/helpers' - napi-wasm - '@parcel/packager-css@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/packager-css@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 lightningcss: 1.32.0 @@ -2399,23 +2066,23 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/packager-html@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/packager-html@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/rust': 2.16.4 - '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/packager-js@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/packager-js@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/rust': 2.16.4 '@parcel/source-map': 2.1.1 - '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/utils': 2.16.4 globals: 13.24.0 nullthrows: 1.1.1 @@ -2423,33 +2090,33 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/packager-raw@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/packager-raw@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/packager-svg@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/packager-svg@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/rust': 2.16.4 - '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/packager-wasm@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/packager-wasm@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/plugin@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/plugin@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) transitivePeerDependencies: - '@parcel/core' - napi-wasm @@ -2461,10 +2128,10 @@ snapshots: '@parcel/types-internal': 2.16.4 chrome-trace-event: 1.0.4 - '@parcel/reporter-cli@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/reporter-cli@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/utils': 2.16.4 chalk: 4.1.2 term-size: 2.2.1 @@ -2472,19 +2139,19 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/reporter-dev-server@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/reporter-dev-server@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: '@parcel/codeframe': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/reporter-tracer@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/reporter-tracer@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/utils': 2.16.4 chrome-trace-event: 1.0.4 nullthrows: 1.1.1 @@ -2492,46 +2159,46 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/resolver-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/resolver-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/node-resolver-core': 3.7.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/node-resolver-core': 3.7.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/resolver-glob@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/resolver-glob@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/node-resolver-core': 3.7.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/node-resolver-core': 3.7.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/utils': 2.16.4 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/runtime-browser-hmr@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/runtime-browser-hmr@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/runtime-js@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/runtime-js@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/utils': 2.16.4 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/runtime-rsc@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/runtime-rsc@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/rust': 2.16.4 '@parcel/utils': 2.16.4 nullthrows: 1.1.1 @@ -2539,9 +2206,9 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/runtime-service-worker@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/runtime-service-worker@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/utils': 2.16.4 nullthrows: 1.1.1 transitivePeerDependencies: @@ -2587,13 +2254,13 @@ snapshots: dependencies: detect-libc: 1.0.3 - '@parcel/transformer-babel@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/transformer-babel@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 - browserslist: 4.28.1 + browserslist: 4.28.2 json5: 2.2.3 nullthrows: 1.1.1 semver: 7.7.4 @@ -2601,74 +2268,74 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/transformer-css@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/transformer-css@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 - browserslist: 4.28.1 + browserslist: 4.28.2 lightningcss: 1.32.0 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-html@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/transformer-html@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/rust': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-image@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/transformer-image@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/core': 2.16.4(@swc/helpers@0.5.19) - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/core': 2.16.4(@swc/helpers@0.5.20) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/utils': 2.16.4 - '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) nullthrows: 1.1.1 transitivePeerDependencies: - napi-wasm - '@parcel/transformer-js@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/transformer-js@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/core': 2.16.4(@swc/helpers@0.5.19) + '@parcel/core': 2.16.4(@swc/helpers@0.5.20) '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/rust': 2.16.4 '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 - '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@swc/helpers': 0.5.19 - browserslist: 4.28.1 + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@swc/helpers': 0.5.20 + browserslist: 4.28.2 nullthrows: 1.1.1 regenerator-runtime: 0.14.1 semver: 7.7.4 transitivePeerDependencies: - napi-wasm - '@parcel/transformer-json@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/transformer-json@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) json5: 2.2.3 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-node@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/transformer-node@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-postcss@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/transformer-postcss@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/rust': 2.16.4 '@parcel/utils': 2.16.4 clone: 2.1.2 @@ -2679,35 +2346,35 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/transformer-posthtml@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/transformer-posthtml@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-raw@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/transformer-raw@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-react-refresh-wrap@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/transformer-react-refresh-wrap@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: '@parcel/error-overlay': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/utils': 2.16.4 react-refresh: 0.16.0 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-svg@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/transformer-svg@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/rust': 2.16.4 transitivePeerDependencies: - '@parcel/core' @@ -2720,10 +2387,10 @@ snapshots: '@parcel/source-map': 2.1.1 utility-types: 3.11.0 - '@parcel/types@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/types@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: '@parcel/types-internal': 2.16.4 - '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) transitivePeerDependencies: - '@parcel/core' - napi-wasm @@ -2801,9 +2468,9 @@ snapshots: '@parcel/watcher-win32-ia32': 2.5.6 '@parcel/watcher-win32-x64': 2.5.6 - '@parcel/workers@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/workers@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/core': 2.16.4(@swc/helpers@0.5.19) + '@parcel/core': 2.16.4(@swc/helpers@0.5.20) '@parcel/diagnostic': 2.16.4 '@parcel/logger': 2.16.4 '@parcel/profiler': 2.16.4 @@ -2813,71 +2480,8 @@ snapshots: transitivePeerDependencies: - napi-wasm - '@patternfly-java/charts@0.0.13': - dependencies: - '@patternfly/react-charts': 8.4.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(victory-area@37.3.6(react@19.2.4))(victory-axis@37.3.6(react@19.2.4))(victory-bar@37.3.6(react@19.2.4))(victory-box-plot@37.3.6(react@19.2.4))(victory-chart@37.3.6(react@19.2.4))(victory-core@37.3.6(react@19.2.4))(victory-create-container@37.3.6(react@19.2.4))(victory-cursor-container@37.3.6(react@19.2.4))(victory-group@37.3.6(react@19.2.4))(victory-legend@37.3.6(react@19.2.4))(victory-line@37.3.6(react@19.2.4))(victory-pie@37.3.6(react@19.2.4))(victory-scatter@37.3.6(react@19.2.4))(victory-stack@37.3.6(react@19.2.4))(victory-tooltip@37.3.6(react@19.2.4))(victory-voronoi-container@37.3.6(react@19.2.4))(victory-zoom-container@37.3.6(react@19.2.4)) - '@patternfly/react-styles': 6.4.0 - '@patternfly/react-tokens': 6.4.0 - hoist-non-react-statics: 3.3.2 - lit: 3.3.2 - lodash: 4.17.23 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - tslib: 2.8.1 - victory-area: 37.3.6(react@19.2.4) - victory-axis: 37.3.6(react@19.2.4) - victory-bar: 37.3.6(react@19.2.4) - victory-box-plot: 37.3.6(react@19.2.4) - victory-chart: 37.3.6(react@19.2.4) - victory-core: 37.3.6(react@19.2.4) - victory-create-container: 37.3.6(react@19.2.4) - victory-cursor-container: 37.3.6(react@19.2.4) - victory-group: 37.3.6(react@19.2.4) - victory-legend: 37.3.6(react@19.2.4) - victory-line: 37.3.6(react@19.2.4) - victory-pie: 37.3.6(react@19.2.4) - victory-scatter: 37.3.6(react@19.2.4) - victory-stack: 37.3.6(react@19.2.4) - victory-tooltip: 37.3.6(react@19.2.4) - victory-voronoi-container: 37.3.6(react@19.2.4) - victory-zoom-container: 37.3.6(react@19.2.4) - transitivePeerDependencies: - - echarts - '@patternfly/patternfly@6.4.0': {} - '@patternfly/react-charts@8.4.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(victory-area@37.3.6(react@19.2.4))(victory-axis@37.3.6(react@19.2.4))(victory-bar@37.3.6(react@19.2.4))(victory-box-plot@37.3.6(react@19.2.4))(victory-chart@37.3.6(react@19.2.4))(victory-core@37.3.6(react@19.2.4))(victory-create-container@37.3.6(react@19.2.4))(victory-cursor-container@37.3.6(react@19.2.4))(victory-group@37.3.6(react@19.2.4))(victory-legend@37.3.6(react@19.2.4))(victory-line@37.3.6(react@19.2.4))(victory-pie@37.3.6(react@19.2.4))(victory-scatter@37.3.6(react@19.2.4))(victory-stack@37.3.6(react@19.2.4))(victory-tooltip@37.3.6(react@19.2.4))(victory-voronoi-container@37.3.6(react@19.2.4))(victory-zoom-container@37.3.6(react@19.2.4))': - dependencies: - '@patternfly/react-styles': 6.4.0 - '@patternfly/react-tokens': 6.4.0 - hoist-non-react-statics: 3.3.2 - lodash: 4.17.23 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - tslib: 2.8.1 - optionalDependencies: - victory-area: 37.3.6(react@19.2.4) - victory-axis: 37.3.6(react@19.2.4) - victory-bar: 37.3.6(react@19.2.4) - victory-box-plot: 37.3.6(react@19.2.4) - victory-chart: 37.3.6(react@19.2.4) - victory-core: 37.3.6(react@19.2.4) - victory-create-container: 37.3.6(react@19.2.4) - victory-cursor-container: 37.3.6(react@19.2.4) - victory-group: 37.3.6(react@19.2.4) - victory-legend: 37.3.6(react@19.2.4) - victory-line: 37.3.6(react@19.2.4) - victory-pie: 37.3.6(react@19.2.4) - victory-scatter: 37.3.6(react@19.2.4) - victory-stack: 37.3.6(react@19.2.4) - victory-tooltip: 37.3.6(react@19.2.4) - victory-voronoi-container: 37.3.6(react@19.2.4) - victory-zoom-container: 37.3.6(react@19.2.4) - - '@patternfly/react-styles@6.4.0': {} - - '@patternfly/react-tokens@6.4.0': {} - '@puppeteer/browsers@2.13.0': dependencies: debug: 4.4.3 @@ -2931,7 +2535,7 @@ snapshots: '@swc/core-win32-x64-msvc@1.15.21': optional: true - '@swc/core@1.15.21(@swc/helpers@0.5.19)': + '@swc/core@1.15.21(@swc/helpers@0.5.20)': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.26 @@ -2948,11 +2552,11 @@ snapshots: '@swc/core-win32-arm64-msvc': 1.15.21 '@swc/core-win32-ia32-msvc': 1.15.21 '@swc/core-win32-x64-msvc': 1.15.21 - '@swc/helpers': 0.5.19 + '@swc/helpers': 0.5.20 '@swc/counter@0.1.3': {} - '@swc/helpers@0.5.19': + '@swc/helpers@0.5.20': dependencies: tslib: 2.8.1 @@ -2962,30 +2566,6 @@ snapshots: '@tootallnate/quickjs-emscripten@0.23.0': {} - '@types/d3-array@3.2.2': {} - - '@types/d3-color@3.1.3': {} - - '@types/d3-ease@3.0.2': {} - - '@types/d3-interpolate@3.0.4': - dependencies: - '@types/d3-color': 3.1.3 - - '@types/d3-path@3.1.1': {} - - '@types/d3-scale@4.0.9': - dependencies: - '@types/d3-time': 3.0.4 - - '@types/d3-shape@3.1.8': - dependencies: - '@types/d3-path': 3.1.1 - - '@types/d3-time@3.0.4': {} - - '@types/d3-timer@3.0.2': {} - '@types/http-proxy@1.17.17': dependencies: '@types/node': 25.5.0 @@ -2994,8 +2574,6 @@ snapshots: dependencies: undici-types: 7.18.2 - '@types/trusted-types@2.0.7': {} - '@types/yauzl@2.10.3': dependencies: '@types/node': 25.5.0 @@ -3024,11 +2602,11 @@ snapshots: asynckit@0.4.0: {} - axios@1.13.6: + axios@1.14.0: dependencies: follow-redirects: 1.15.11(debug@4.4.3) form-data: 4.0.5 - proxy-from-env: 1.1.0 + proxy-from-env: 2.1.0 transitivePeerDependencies: - debug @@ -3040,20 +2618,20 @@ snapshots: dependencies: bare-events: 2.8.2 bare-path: 3.0.0 - bare-stream: 2.11.0(bare-events@2.8.2) + bare-stream: 2.12.0(bare-events@2.8.2) bare-url: 2.4.0 fast-fifo: 1.3.2 transitivePeerDependencies: - bare-abort-controller - react-native-b4a - bare-os@3.8.0: {} + bare-os@3.8.6: {} bare-path@3.0.0: dependencies: - bare-os: 3.8.0 + bare-os: 3.8.6 - bare-stream@2.11.0(bare-events@2.8.2): + bare-stream@2.12.0(bare-events@2.8.2): dependencies: streamx: 2.25.0 teex: 1.0.1 @@ -3070,7 +2648,7 @@ snapshots: dependencies: safe-buffer: 5.2.1 - baseline-browser-mapping@2.10.10: {} + baseline-browser-mapping@2.10.13: {} basic-auth@2.0.1: dependencies: @@ -3096,13 +2674,13 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.28.1: + browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.10.10 - caniuse-lite: 1.0.30001781 - electron-to-chromium: 1.5.325 - node-releases: 2.0.36 - update-browserslist-db: 1.2.3(browserslist@4.28.1) + baseline-browser-mapping: 2.10.13 + caniuse-lite: 1.0.30001784 + electron-to-chromium: 1.5.331 + node-releases: 2.0.37 + update-browserslist-db: 1.2.3(browserslist@4.28.2) buffer-crc32@0.2.13: {} @@ -3124,7 +2702,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001781: {} + caniuse-lite@1.0.30001784: {} chalk@4.1.2: dependencies: @@ -3185,44 +2763,6 @@ snapshots: js-yaml: 4.1.1 parse-json: 5.2.0 - d3-array@3.2.4: - dependencies: - internmap: 2.0.3 - - d3-color@3.1.0: {} - - d3-ease@3.0.1: {} - - d3-format@3.1.2: {} - - d3-interpolate@3.0.1: - dependencies: - d3-color: 3.1.0 - - d3-path@3.1.0: {} - - d3-scale@4.0.2: - dependencies: - d3-array: 3.2.4 - d3-format: 3.1.2 - d3-interpolate: 3.0.1 - d3-time: 3.1.0 - d3-time-format: 4.1.0 - - d3-shape@3.2.0: - dependencies: - d3-path: 3.1.0 - - d3-time-format@4.1.0: - dependencies: - d3-time: 3.1.0 - - d3-time@3.1.0: - dependencies: - d3-array: 3.2.4 - - d3-timer@3.0.1: {} - data-uri-to-buffer@6.0.2: {} debug@4.4.3: @@ -3244,12 +2784,6 @@ snapshots: escodegen: 2.1.0 esprima: 4.0.1 - delaunator@4.0.1: {} - - delaunay-find@0.0.6: - dependencies: - delaunator: 4.0.1 - delayed-stream@1.0.0: {} depd@2.0.0: {} @@ -3274,7 +2808,7 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.325: {} + electron-to-chromium@1.5.331: {} emoji-regex@8.0.0: {} @@ -3471,10 +3005,6 @@ snapshots: highlight.js@11.11.1: {} - hoist-non-react-statics@3.3.2: - dependencies: - react-is: 16.13.1 - html-encoding-sniffer@3.0.0: dependencies: whatwg-encoding: 2.0.0 @@ -3554,8 +3084,6 @@ snapshots: inherits@2.0.4: {} - internmap@2.0.3: {} - ip-address@10.1.0: {} ipaddr.js@1.9.1: {} @@ -3588,7 +3116,7 @@ snapshots: dependencies: is-inside-container: 1.0.0 - joi@18.1.1: + joi@18.1.2: dependencies: '@hapi/address': 5.1.1 '@hapi/formula': 3.0.2 @@ -3606,8 +3134,6 @@ snapshots: json-parse-even-better-errors@2.3.1: {} - json-stringify-safe@5.0.1: {} - json5@2.2.3: {} lightningcss-android-arm64@1.32.0: @@ -3661,22 +3187,6 @@ snapshots: lines-and-columns@1.2.4: {} - lit-element@4.2.2: - dependencies: - '@lit-labs/ssr-dom-shim': 1.5.1 - '@lit/reactive-element': 2.1.2 - lit-html: 3.3.2 - - lit-html@3.3.2: - dependencies: - '@types/trusted-types': 2.0.7 - - lit@3.3.2: - dependencies: - '@lit/reactive-element': 2.1.2 - lit-element: 4.2.2 - lit-html: 3.3.2 - lmdb@2.8.5: dependencies: msgpackr: 1.11.9 @@ -3692,7 +3202,7 @@ snapshots: '@lmdb/lmdb-linux-x64': 2.8.5 '@lmdb/lmdb-win32-x64': 2.8.5 - lodash@4.17.23: {} + lodash@4.18.1: {} lru-cache@7.18.3: {} @@ -3760,7 +3270,7 @@ snapshots: detect-libc: 2.1.2 optional: true - node-releases@2.0.36: {} + node-releases@2.0.37: {} nullthrows@1.1.1: {} @@ -3805,26 +3315,26 @@ snapshots: degenerator: 5.0.1 netmask: 2.0.2 - parcel-resolver-ignore@2.2.1(@parcel/core@2.16.4(@swc/helpers@0.5.19)): + parcel-resolver-ignore@2.2.1(@parcel/core@2.16.4(@swc/helpers@0.5.20)): dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - parcel@2.16.4(@swc/helpers@0.5.19): + parcel@2.16.4(@swc/helpers@0.5.20): dependencies: - '@parcel/config-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))(@swc/helpers@0.5.19) - '@parcel/core': 2.16.4(@swc/helpers@0.5.19) + '@parcel/config-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(@swc/helpers@0.5.20) + '@parcel/core': 2.16.4(@swc/helpers@0.5.20) '@parcel/diagnostic': 2.16.4 '@parcel/events': 2.16.4 '@parcel/feature-flags': 2.16.4 - '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/logger': 2.16.4 - '@parcel/package-manager': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))(@swc/helpers@0.5.19) - '@parcel/reporter-cli': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/reporter-dev-server': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/reporter-tracer': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/package-manager': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(@swc/helpers@0.5.20) + '@parcel/reporter-cli': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/reporter-dev-server': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/reporter-tracer': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/utils': 2.16.4 chalk: 4.1.2 commander: 12.1.0 @@ -3846,7 +3356,7 @@ snapshots: parseurl@1.3.3: {} - path-to-regexp@8.3.0: {} + path-to-regexp@8.4.2: {} pend@1.2.0: {} @@ -3889,6 +3399,8 @@ snapshots: proxy-from-env@1.1.0: {} + proxy-from-env@2.1.0: {} + pump@3.0.4: dependencies: end-of-stream: 1.4.5 @@ -3941,19 +3453,8 @@ snapshots: iconv-lite: 0.7.2 unpipe: 1.0.0 - react-dom@19.2.4(react@19.2.4): - dependencies: - react: 19.2.4 - scheduler: 0.27.0 - - react-fast-compare@3.2.2: {} - - react-is@16.13.1: {} - react-refresh@0.16.0: {} - react@19.2.4: {} - regenerator-runtime@0.14.1: {} require-directory@2.1.1: {} @@ -3968,7 +3469,7 @@ snapshots: depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 - path-to-regexp: 8.3.0 + path-to-regexp: 8.4.2 transitivePeerDependencies: - supports-color @@ -3984,8 +3485,6 @@ snapshots: safer-buffer@2.1.2: {} - scheduler@0.27.0: {} - secure-compare@3.0.1: {} semver@7.7.4: {} @@ -4160,9 +3659,9 @@ snapshots: unpipe@1.0.0: {} - update-browserslist-db@1.2.3(browserslist@4.28.1): + update-browserslist-db@1.2.3(browserslist@4.28.2): dependencies: - browserslist: 4.28.1 + browserslist: 4.28.2 escalade: 3.2.0 picocolors: 1.1.1 @@ -4172,179 +3671,11 @@ snapshots: vary@1.1.2: {} - victory-area@37.3.6(react@19.2.4): - dependencies: - lodash: 4.17.23 - react: 19.2.4 - victory-core: 37.3.6(react@19.2.4) - victory-vendor: 37.3.6 - - victory-axis@37.3.6(react@19.2.4): - dependencies: - lodash: 4.17.23 - react: 19.2.4 - victory-core: 37.3.6(react@19.2.4) - - victory-bar@37.3.6(react@19.2.4): - dependencies: - lodash: 4.17.23 - react: 19.2.4 - victory-core: 37.3.6(react@19.2.4) - victory-vendor: 37.3.6 - - victory-box-plot@37.3.6(react@19.2.4): - dependencies: - lodash: 4.17.23 - react: 19.2.4 - victory-core: 37.3.6(react@19.2.4) - victory-vendor: 37.3.6 - - victory-brush-container@37.3.6(react@19.2.4): - dependencies: - lodash: 4.17.23 - react: 19.2.4 - react-fast-compare: 3.2.2 - victory-core: 37.3.6(react@19.2.4) - - victory-chart@37.3.6(react@19.2.4): - dependencies: - lodash: 4.17.23 - react: 19.2.4 - react-fast-compare: 3.2.2 - victory-axis: 37.3.6(react@19.2.4) - victory-core: 37.3.6(react@19.2.4) - victory-polar-axis: 37.3.6(react@19.2.4) - victory-shared-events: 37.3.6(react@19.2.4) - - victory-core@37.3.6(react@19.2.4): - dependencies: - lodash: 4.17.23 - react: 19.2.4 - react-fast-compare: 3.2.2 - victory-vendor: 37.3.6 - - victory-create-container@37.3.6(react@19.2.4): - dependencies: - lodash: 4.17.23 - react: 19.2.4 - victory-brush-container: 37.3.6(react@19.2.4) - victory-core: 37.3.6(react@19.2.4) - victory-cursor-container: 37.3.6(react@19.2.4) - victory-selection-container: 37.3.6(react@19.2.4) - victory-voronoi-container: 37.3.6(react@19.2.4) - victory-zoom-container: 37.3.6(react@19.2.4) - - victory-cursor-container@37.3.6(react@19.2.4): - dependencies: - lodash: 4.17.23 - react: 19.2.4 - victory-core: 37.3.6(react@19.2.4) - - victory-group@37.3.6(react@19.2.4): - dependencies: - lodash: 4.17.23 - react: 19.2.4 - react-fast-compare: 3.2.2 - victory-core: 37.3.6(react@19.2.4) - victory-shared-events: 37.3.6(react@19.2.4) - - victory-legend@37.3.6(react@19.2.4): - dependencies: - lodash: 4.17.23 - react: 19.2.4 - victory-core: 37.3.6(react@19.2.4) - - victory-line@37.3.6(react@19.2.4): - dependencies: - lodash: 4.17.23 - react: 19.2.4 - victory-core: 37.3.6(react@19.2.4) - victory-vendor: 37.3.6 - - victory-pie@37.3.6(react@19.2.4): - dependencies: - lodash: 4.17.23 - react: 19.2.4 - victory-core: 37.3.6(react@19.2.4) - victory-vendor: 37.3.6 - - victory-polar-axis@37.3.6(react@19.2.4): - dependencies: - lodash: 4.17.23 - react: 19.2.4 - victory-core: 37.3.6(react@19.2.4) - - victory-scatter@37.3.6(react@19.2.4): - dependencies: - lodash: 4.17.23 - react: 19.2.4 - victory-core: 37.3.6(react@19.2.4) - - victory-selection-container@37.3.6(react@19.2.4): - dependencies: - lodash: 4.17.23 - react: 19.2.4 - victory-core: 37.3.6(react@19.2.4) - - victory-shared-events@37.3.6(react@19.2.4): - dependencies: - json-stringify-safe: 5.0.1 - lodash: 4.17.23 - react: 19.2.4 - react-fast-compare: 3.2.2 - victory-core: 37.3.6(react@19.2.4) - - victory-stack@37.3.6(react@19.2.4): - dependencies: - lodash: 4.17.23 - react: 19.2.4 - react-fast-compare: 3.2.2 - victory-core: 37.3.6(react@19.2.4) - victory-shared-events: 37.3.6(react@19.2.4) - - victory-tooltip@37.3.6(react@19.2.4): - dependencies: - lodash: 4.17.23 - react: 19.2.4 - victory-core: 37.3.6(react@19.2.4) - - victory-vendor@37.3.6: - dependencies: - '@types/d3-array': 3.2.2 - '@types/d3-ease': 3.0.2 - '@types/d3-interpolate': 3.0.4 - '@types/d3-scale': 4.0.9 - '@types/d3-shape': 3.1.8 - '@types/d3-time': 3.0.4 - '@types/d3-timer': 3.0.2 - d3-array: 3.2.4 - d3-ease: 3.0.1 - d3-interpolate: 3.0.1 - d3-scale: 4.0.2 - d3-shape: 3.2.0 - d3-time: 3.1.0 - d3-timer: 3.0.1 - - victory-voronoi-container@37.3.6(react@19.2.4): - dependencies: - delaunay-find: 0.0.6 - lodash: 4.17.23 - react: 19.2.4 - react-fast-compare: 3.2.2 - victory-core: 37.3.6(react@19.2.4) - victory-tooltip: 37.3.6(react@19.2.4) - - victory-zoom-container@37.3.6(react@19.2.4): - dependencies: - lodash: 4.17.23 - react: 19.2.4 - victory-core: 37.3.6(react@19.2.4) - wait-on@9.0.4: dependencies: - axios: 1.13.6 - joi: 18.1.1 - lodash: 4.17.23 + axios: 1.14.0 + joi: 18.1.2 + lodash: 4.18.1 minimist: 1.2.8 rxjs: 7.8.2 transitivePeerDependencies: diff --git a/showcase/src/main/java/org/patternfly/showcase/component/DropdownComponent.java b/showcase/src/main/java/org/patternfly/showcase/component/DropdownComponent.java index 5bf9cccab..ef03cb44b 100644 --- a/showcase/src/main/java/org/patternfly/showcase/component/DropdownComponent.java +++ b/showcase/src/main/java/org/patternfly/showcase/component/DropdownComponent.java @@ -61,7 +61,7 @@ public DropdownComponent() { code("dropdown-basic"), () -> // @code-start:dropdown-basic div() - .add(Dropdown.dropdown("Dropdown") + .add(dropdown("Dropdown") .applyToMenuList(list -> list .addItem(menuItem("item-0", "Action")) .addItem(linkMenuItem("item-1", "Link", "#item-1")) @@ -78,7 +78,7 @@ public DropdownComponent() { code("dropdown-kebab"), () -> // @code-start:dropdown-kebab div() - .add(Dropdown.dropdown(ellipsisV(), "kebab dropdown toggle") + .add(dropdown(ellipsisV(), "kebab dropdown toggle") .applyToMenuList(list -> list .addItem(menuItem("item-0", "Action")) .addItem(linkMenuItem("item-1", "Link", "#item-1")) @@ -95,7 +95,7 @@ public DropdownComponent() { code("dropdown-groups"), () -> // @code-start:dropdown-groups div() - .add(Dropdown.dropdown("Dropdown") + .add(dropdown("Dropdown") .addMenu(dropdownMenu() .addContent(menuContent() .addGroup(menuGroup() diff --git a/showcase/src/main/java/org/patternfly/showcase/component/FormComponent.java b/showcase/src/main/java/org/patternfly/showcase/component/FormComponent.java index 4cbab5c90..500321cd0 100644 --- a/showcase/src/main/java/org/patternfly/showcase/component/FormComponent.java +++ b/showcase/src/main/java/org/patternfly/showcase/component/FormComponent.java @@ -257,7 +257,7 @@ public FormComponent() { // @code-start:form-invalid div() .add(form() - .addGroup(formGroup() + .addGroup(formGroup("form-invalid-age") .addLabel(formGroupLabel("Age")) .addControl(formGroupControl() .addControl(textInput("form-invalid-age", "Five") diff --git a/showcase/src/main/java/org/patternfly/showcase/component/PopoverComponent.java b/showcase/src/main/java/org/patternfly/showcase/component/PopoverComponent.java index 4b0cd8c42..311959c4c 100644 --- a/showcase/src/main/java/org/patternfly/showcase/component/PopoverComponent.java +++ b/showcase/src/main/java/org/patternfly/showcase/component/PopoverComponent.java @@ -67,7 +67,7 @@ public PopoverComponent() { div().style("margin", "50px") .add(button("Toggle popover").primary() .id("popover-basic-button")) - .add(Popover.popover(By.id("popover-basic-button")) + .add(popover(By.id("popover-basic-button")) .ariaLabel("Basic popover") .addHeader("Popover header") .addBody("Popovers are triggered by click rather than hover.") @@ -82,7 +82,7 @@ public PopoverComponent() { div().style("margin", "50px") .add(button("Hover to trigger popover").primary() .id("popover-hoverable-button")) - .add(Popover.popover(By.id("popover-hoverable-button")) + .add(popover(By.id("popover-hoverable-button")) .hoverable() .ariaLabel("Hoverable popover") .addHeader("Popover header") @@ -97,24 +97,24 @@ public PopoverComponent() { // @code-start:popover-placements div().style("display: flex; gap: 16px") .add(button("Bottom").secondary() - .id("nt-placements-bottom-button")) - .add(Popover.popover(By.id("nt-placements-bottom-button")) + .id("popover-placements-bottom-button")) + .add(popover(By.id("popover-placements-bottom-button")) .placement(bottom) .ariaLabel("Bottom popover") .addHeader("Bottom popover") .addBody("This popover is placed at the bottom.") .addFooter("Popover footer")) .add(button("Left").secondary() - .id("nt-placements-left-button")) - .add(Popover.popover(By.id("nt-placements-left-button")) + .id("popover-placements-left-button")) + .add(popover(By.id("popover-placements-left-button")) .placement(left) .ariaLabel("Left popover") .addHeader("Left popover") .addBody("This popover is placed on the left.") .addFooter("Popover footer")) .add(button("Right").secondary() - .id("nt-placements-right-button")) - .add(Popover.popover(By.id("nt-placements-right-button")) + .id("popover-placements-right-button")) + .add(popover(By.id("popover-placements-right-button")) .placement(right) .ariaLabel("Right popover") .addHeader("Right popover") @@ -127,7 +127,7 @@ public PopoverComponent() { addSnippet(new Snippet("popover-close", "Close popover", code("popover-close"), () -> { // @code-start:popover-close - Popover popover = Popover.popover(By.id("popover-close-button")); + Popover popover = popover(By.id("popover-close-button")); popover.ariaLabel("Popover with button in the body that can close it") .addHeader("Popover header") .addBody(popoverBody() @@ -155,7 +155,7 @@ public PopoverComponent() { div().style("margin", "50px") .add(button("Toggle popover").primary() .id("popover-no-padding-button")) - .add(Popover.popover(By.id("popover-no-padding-button")) + .add(popover(By.id("popover-no-padding-button")) .noClose() .noPadding() .ariaLabel("Popover with no header, footer, close button, and padding") @@ -171,7 +171,7 @@ public PopoverComponent() { div().style("margin", "50px") .add(button("Toggle popover").primary() .id("popover-auto-width-button")) - .add(Popover.popover(By.id("popover-auto-width-button")) + .add(popover(By.id("popover-auto-width-button")) .autoWidth() .ariaLabel("Popover with auto-width.") .addBody("Removes fixed-width and allows width to be defined by contents.")) @@ -191,7 +191,7 @@ public PopoverComponent() { button.element().scrollIntoView(options); }); - Popover popover = Popover.popover(By.id("popover-auto-placement-button")); + Popover popover = popover(By.id("popover-auto-placement-button")); ToggleGroup toggleGroup = toggleGroup(single) .addItem(toggleGroupItem("left", "left").onClick((e, t) -> popover.placement(left))) .addItem(toggleGroupItem("top", "top").onClick((e, t) -> popover.placement(top))) @@ -223,7 +223,7 @@ public PopoverComponent() { div().style("margin", "50px") .add(button("Toggle popover").primary() .id("popover-icon-button")) - .add(Popover.popover(By.id("popover-icon-button")) + .add(popover(By.id("popover-icon-button")) .icon(bullhorn()) .ariaLabel("Popover with icon in the title example.") .addHeader("Popover with icon") @@ -249,27 +249,27 @@ public PopoverComponent() { .add(button("Warning").warning().id("popover-alert-warning"))) .addItem(actionListItem() .add(button("Danger").danger().id("popover-alert-danger"))))) - .add(Popover.popover(By.id("popover-alert-custom")) + .add(popover(By.id("popover-alert-custom")) .status(Severity.custom) .addHeader("Popover custom header") .addBody(LoremIpsum.words(20)) .addFooter("Popover footer")) - .add(Popover.popover(By.id("popover-alert-info")) + .add(popover(By.id("popover-alert-info")) .status(Severity.info) .addHeader("Popover info header") .addBody(LoremIpsum.words(20)) .addFooter("Popover footer")) - .add(Popover.popover(By.id("popover-alert-success")) + .add(popover(By.id("popover-alert-success")) .status(Severity.success) .addHeader("Popover success header") .addBody(LoremIpsum.words(20)) .addFooter("Popover footer")) - .add(Popover.popover(By.id("popover-alert-warning")) + .add(popover(By.id("popover-alert-warning")) .status(Severity.warning) .addHeader("Popover warning header") .addBody(LoremIpsum.words(20)) .addFooter("Popover footer")) - .add(Popover.popover(By.id("popover-alert-danger")) + .add(popover(By.id("popover-alert-danger")) .status(Severity.danger) .addHeader("Popover danger header") .addBody(LoremIpsum.words(20)) diff --git a/showcase/src/web/main.js b/showcase/src/web/main.js index 6dbb649be..1b3459586 100644 --- a/showcase/src/web/main.js +++ b/showcase/src/web/main.js @@ -16,7 +16,7 @@ import "@patternfly/patternfly/patternfly.css"; import "@patternfly/patternfly/patternfly-addons.css"; import "@patternfly/patternfly/patternfly-charts.css"; -import "@patternfly-java/charts/dist/charts"; +import "../../../charts/npm/src/charts.js"; import "../../../core/npm/core.css"; import "../../../extensions/finder/npm/finder.css"; import "./pforg/*.css"; diff --git a/showcase/src/web/showcase.css b/showcase/src/web/showcase.css index ec0ff807e..f9b6f271b 100644 --- a/showcase/src/web/showcase.css +++ b/showcase/src/web/showcase.css @@ -13,11 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -:root { - --pf-v6-c-tooltip--css-positioning: 0; - --pf-v6-c-popover--css-positioning: 0; -} - .pf-m-redhat-font .pf-c-content { --pf-v6-c-content--FontSize: var(--pf-t--global--font--size--lg); } From 11674f70baa09362e6d6383a2c5e7a83cbbda220 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 2 Apr 2026 11:00:33 +0200 Subject: [PATCH 089/430] Update changelog --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c3aab2959..81f347fb8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] > [!IMPORTANT] -> This release deprecates components based on PopperJS and adds alternatives using the [popover API](https://developer.mozilla.org/en-US/docs/Web/API/Popover_API) and [CSS anchor positioning](https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Anchor_positioning). This might break existing code! +> This release deprecates components based on PopperJS and adds alternatives using the [popover API](https://developer.mozilla.org/en-US/docs/Web/API/Popover_API) and [CSS anchor positioning](https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Anchor_positioning). The PopperJS based components have been renamed to `PopperJS` and reimplemented `` components are the replacements. This might break existing code! - `org.patternfly.component.popover.PopperPopover` → `org.patternfly.component.popover.Popover` - `org.patternfly.component.tooltip.PopperTooltip` → `org.patternfly.component.tooltip.Tooltip` @@ -17,6 +17,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - `org.patternfly.component.menu.PopperSingleSelect` → `org.patternfly.component.menu.SingleSelect` - `org.patternfly.component.menu.PopperSingleTypeahead` → `org.patternfly.component.menu.SingleTypeahead` +If the browser does not support [CSS anchor positioning](https://caniuse.com/css-anchor-positioning) or [anchor-based container queries](https://caniuse.com/wf-container-anchor-position-queries), the placement of the popover is calculated using the new `Overlay` class. The only requirement is that the browser supports the [popover API](https://caniuse.com/wf-popover), which is available now in all major browsers. + ### Added - Add native alternatives for dropdown, single and multi-select, and single and multi-type-ahead components From 267ef0fd9b2c7f1216bce86f5c3ddb4276818a6a Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 2 Apr 2026 11:28:24 +0200 Subject: [PATCH 090/430] Documentation --- CLAUDE.md | 7 +- .../patternfly/chart/bullet/package-info.java | 47 ++++++++++ .../patternfly/chart/donut/package-info.java | 50 +++++++++++ .../org/patternfly/chart/package-info.java | 68 +++++++++++++++ .../patternfly/chart/pie/package-info.java | 51 +++++++++++ .../chart/utilization/package-info.java | 59 +++++++++++++ .../component/accordion/package-info.java | 53 ++++++++++++ .../component/alert/package-info.java | 60 +++++++++++++ .../component/avatar/package-info.java | 35 ++++++++ .../component/backdrop/package-info.java | 26 ++++++ .../component/backtotop/package-info.java | 33 +++++++ .../component/badge/package-info.java | 46 ++++++++++ .../component/banner/package-info.java | 47 ++++++++++ .../component/brand/package-info.java | 44 ++++++++++ .../component/breadcrumb/package-info.java | 49 +++++++++++ .../component/button/package-info.java | 51 +++++++++++ .../component/card/package-info.java | 65 ++++++++++++++ .../component/codeblock/package-info.java | 58 +++++++++++++ .../component/content/package-info.java | 55 ++++++++++++ .../component/divider/package-info.java | 55 ++++++++++++ .../component/drawer/package-info.java | 74 ++++++++++++++++ .../component/emptystate/package-info.java | 65 ++++++++++++++ .../component/expandable/package-info.java | 56 ++++++++++++ .../component/form/package-info.java | 85 +++++++++++++++++++ .../component/help/package-info.java | 57 +++++++++++++ .../component/hint/package-info.java | 55 ++++++++++++ .../component/icon/package-info.java | 61 +++++++++++++ .../component/inputgroup/package-info.java | 60 +++++++++++++ .../component/jumplinks/package-info.java | 63 ++++++++++++++ .../component/label/package-info.java | 69 +++++++++++++++ .../component/list/package-info.java | 75 ++++++++++++++++ .../component/menu/package-info.java | 77 +++++++++++++++++ .../component/modal/package-info.java | 65 ++++++++++++++ .../component/navigation/package-info.java | 57 +++++++++++++ .../component/notification/package-info.java | 72 ++++++++++++++++ .../component/numberinput/package-info.java | 44 ++++++++++ .../component/page/package-info.java | 58 +++++++++++++ .../component/panel/package-info.java | 46 ++++++++++ .../component/popover/package-info.java | 55 ++++++++++++ .../component/progress/package-info.java | 48 +++++++++++ .../progressstepper/package-info.java | 69 +++++++++++++++ .../component/skeleton/package-info.java | 51 +++++++++++ .../component/skiptocontent/package-info.java | 43 ++++++++++ .../component/slider/package-info.java | 59 +++++++++++++ .../component/spinner/package-info.java | 61 +++++++++++++ .../component/switch_/package-info.java | 53 ++++++++++++ .../component/table/package-info.java | 74 ++++++++++++++++ .../component/tabs/package-info.java | 72 ++++++++++++++++ .../textinputgroup/package-info.java | 68 +++++++++++++++ .../component/timestamp/package-info.java | 78 +++++++++++++++++ .../component/title/package-info.java | 51 +++++++++++ .../component/togglegroup/package-info.java | 62 ++++++++++++++ .../component/toolbar/package-info.java | 80 +++++++++++++++++ .../component/tooltip/package-info.java | 61 +++++++++++++ .../component/tree/package-info.java | 67 +++++++++++++++ .../component/truncate/package-info.java | 52 ++++++++++++ .../component/wizard/package-info.java | 61 +++++++++++++ .../org/patternfly/handler/package-info.java | 1 + .../java/org/patternfly/overlay/Overlay.java | 1 + .../org/patternfly/popper/package-info.java | 26 ++++++ .../layout/bullseye/package-info.java | 39 +++++++++ .../patternfly/layout/flex/package-info.java | 64 ++++++++++++++ .../layout/gallery/package-info.java | 60 +++++++++++++ .../patternfly/layout/grid/package-info.java | 59 +++++++++++++ .../patternfly/layout/level/package-info.java | 52 ++++++++++++ .../patternfly/layout/split/package-info.java | 54 ++++++++++++ .../patternfly/layout/stack/package-info.java | 53 ++++++++++++ 67 files changed, 3669 insertions(+), 3 deletions(-) create mode 100644 charts/src/main/java/org/patternfly/chart/bullet/package-info.java create mode 100644 charts/src/main/java/org/patternfly/chart/donut/package-info.java create mode 100644 charts/src/main/java/org/patternfly/chart/package-info.java create mode 100644 charts/src/main/java/org/patternfly/chart/pie/package-info.java create mode 100644 charts/src/main/java/org/patternfly/chart/utilization/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/accordion/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/alert/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/avatar/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/backdrop/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/backtotop/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/badge/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/banner/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/brand/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/breadcrumb/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/button/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/card/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/codeblock/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/content/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/divider/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/drawer/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/emptystate/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/expandable/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/form/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/help/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/hint/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/icon/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/inputgroup/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/jumplinks/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/label/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/list/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/menu/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/modal/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/navigation/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/notification/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/numberinput/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/page/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/panel/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/popover/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/progress/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/progressstepper/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/skeleton/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/skiptocontent/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/slider/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/spinner/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/switch_/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/table/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/tabs/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/textinputgroup/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/timestamp/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/title/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/togglegroup/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/toolbar/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/tooltip/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/tree/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/truncate/package-info.java create mode 100644 components/src/main/java/org/patternfly/component/wizard/package-info.java create mode 100644 core/src/main/java/org/patternfly/popper/package-info.java create mode 100644 layouts/src/main/java/org/patternfly/layout/bullseye/package-info.java create mode 100644 layouts/src/main/java/org/patternfly/layout/flex/package-info.java create mode 100644 layouts/src/main/java/org/patternfly/layout/gallery/package-info.java create mode 100644 layouts/src/main/java/org/patternfly/layout/grid/package-info.java create mode 100644 layouts/src/main/java/org/patternfly/layout/level/package-info.java create mode 100644 layouts/src/main/java/org/patternfly/layout/split/package-info.java create mode 100644 layouts/src/main/java/org/patternfly/layout/stack/package-info.java diff --git a/CLAUDE.md b/CLAUDE.md index e1e881c59..f3730731e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -22,7 +22,8 @@ Uses Maven Wrapper (`mvnw`). Requires Java 21+ and Maven 3.9.9+. ## Module Structure -- **bom** - Bill of Materials for dependency version management +- **build-config** - Build configuration (checkstyle, license headers) +- **code-parent** - Parent POM for code modules - **core** - Core classes, handlers, styles, utilities (`org.patternfly.core`, `org.patternfly.style`, `org.patternfly.handler`) - **components** - All UI components (`org.patternfly.component.*`) — 50+ component packages - **layouts** - Page layouts (Page, Sidebar, etc.) @@ -31,7 +32,7 @@ Uses Maven Wrapper (`mvnw`). Requires Java 21+ and Maven 3.9.9+. - **charts** - Chart web components wrapper (NPM package) - **extensions/codeeditor**, **extensions/finder** - Extensions - **gwt**, **j2cl** - Compilation target support -- **showcase** - Interactive demo website +- **showcase** - Interactive demo website (activated via `-P showcase` profile) ## Architecture & Patterns @@ -91,7 +92,7 @@ element().css(modifier("danger")); ## Key Dependencies -- **Elemento** (2.4.9) - Base builder API and DOM utilities +- **Elemento** (2.4.11) - Base builder API and DOM utilities - **Elemental2** (1.3.2) - Typed DOM API bindings - **GWT** (2.13.0) - GWT compilation support - **JUnit Jupiter** (6.0.3) - Test framework diff --git a/charts/src/main/java/org/patternfly/chart/bullet/package-info.java b/charts/src/main/java/org/patternfly/chart/bullet/package-info.java new file mode 100644 index 000000000..68ee30e7b --- /dev/null +++ b/charts/src/main/java/org/patternfly/chart/bullet/package-info.java @@ -0,0 +1,47 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly bullet chart component for comparing a primary measure against qualitative ranges and markers. + *

+ * Bullet charts are useful for displaying performance data, such as storage capacity or progress toward a goal, with + * comparative measures and qualitative ranges. + * + *

Usage

+ * + * Use the {@link org.patternfly.chart.bullet.Bullet#bullet()} factory method to create a bullet chart and + * {@link org.patternfly.chart.bullet.BulletData#bulletData(String, double)} to create data points: + * + * {@snippet : + * import static org.patternfly.chart.bullet.Bullet.bullet; + * import static org.patternfly.chart.bullet.BulletData.bulletData; + * + * Bullet chart = bullet() + * .ariaTitle("Bullet chart example") + * .ariaDesc("Storage capacity") + * .comparativeWarningMeasureData(bulletData("Warning", 88)) + * .primarySegmentedMeasureData(bulletData("Measure", 60)) + * .qualitativeRangeData(bulletData("Range", 50), bulletData("Range", 75)) + * .labels(data -> data.name + ": " + data.y) + * .maxDomain(100) + * .height(150) + * .width(600); + * } + * + * @see PatternFly Bullet Chart + * @see org.patternfly.chart.bullet.Bullet + * @see org.patternfly.chart.bullet.BulletData + */ +package org.patternfly.chart.bullet; \ No newline at end of file diff --git a/charts/src/main/java/org/patternfly/chart/donut/package-info.java b/charts/src/main/java/org/patternfly/chart/donut/package-info.java new file mode 100644 index 000000000..4da33299f --- /dev/null +++ b/charts/src/main/java/org/patternfly/chart/donut/package-info.java @@ -0,0 +1,50 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly donut chart component for displaying proportional data in a ring shape. + *

+ * Donut charts display data as segments of a ring, with an optional title and subtitle in the center. They support + * legends, theme colors, custom padding, and different sizes. + * + *

Usage

+ * + * Use the {@link org.patternfly.chart.donut.Donut#donut()} factory method to create a donut chart: + * + * {@snippet : + * import static org.patternfly.chart.Data.data; + * import static org.patternfly.chart.LegendOrientation.vertical; + * import static org.patternfly.chart.LegendPosition.right; + * import static org.patternfly.chart.Padding.padding; + * import static org.patternfly.chart.donut.Donut.donut; + * + * Donut chart = donut() + * .title("100") + * .subTitle("Pets") + * .ariaTitle("Donut chart example") + * .ariaDesc("Average number of pets") + * .data(data("Cats", 35), data("Dogs", 55), data("Birds", 10)) + * .labels(data -> data.x + ": " + data.y + "%") + * .legendData("Cats: 35", "Dogs: 55", "Birds: 10") + * .legendOrientation(vertical) + * .legendPosition(right) + * .padding(padding(20, 140, 20, 20)) + * .width(350); + * } + * + * @see PatternFly Donut Chart + * @see org.patternfly.chart.donut.Donut + */ +package org.patternfly.chart.donut; \ No newline at end of file diff --git a/charts/src/main/java/org/patternfly/chart/package-info.java b/charts/src/main/java/org/patternfly/chart/package-info.java new file mode 100644 index 000000000..09ca79dc5 --- /dev/null +++ b/charts/src/main/java/org/patternfly/chart/package-info.java @@ -0,0 +1,68 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides PatternFly chart implementations for building data visualizations in Java. + *

+ * This package contains the core chart infrastructure of PatternFly Java, wrapping + * PatternFly chart web components. Charts are built using the same + * fluent builder API as other PatternFly Java components and work with both GWT and J2CL. + * + *

Core Classes

+ * + * This package provides the shared foundation for all chart types: + *
    + *
  • {@link org.patternfly.chart.Chart} - Common chart interface
  • + *
  • {@link org.patternfly.chart.BaseChart} - Base class for all chart implementations
  • + *
  • {@link org.patternfly.chart.Data} - Data point representation with {@code x} and {@code y} values
  • + *
  • {@link org.patternfly.chart.ChartThemeColor} - Theme color presets for charts
  • + *
  • {@link org.patternfly.chart.LegendPosition} and {@link org.patternfly.chart.LegendOrientation} - Legend placement
  • + *
  • {@link org.patternfly.chart.Padding} - Chart padding configuration
  • + *
  • {@link org.patternfly.chart.Threshold} - Threshold value definitions
  • + *
+ * + *

Available Chart Types

+ * + *
    + *
  • {@link org.patternfly.chart.bullet.Bullet} - Bullet charts for comparing a measure against ranges and markers
  • + *
  • {@link org.patternfly.chart.donut.Donut} - Donut charts for displaying proportional data
  • + *
  • {@link org.patternfly.chart.pie.Pie} - Pie charts for displaying proportional data as a circle
  • + *
  • {@link org.patternfly.chart.utilization.DonutUtilization} - Donut utilization charts for capacity and usage
  • + *
  • {@link org.patternfly.chart.utilization.DonutThreshold} - Donut threshold charts with warning and danger levels
  • + *
+ * + *

Quick Start

+ * + * Charts are created using static factory methods and configured with a fluent builder API: + * + * {@snippet : + * import static org.patternfly.chart.Data.data; + * import static org.patternfly.chart.donut.Donut.donut; + * + * Donut chart = donut() + * .title("100") + * .subTitle("Pets") + * .ariaTitle("Donut chart example") + * .ariaDesc("Average number of pets") + * .data(data("Cats", 35), data("Dogs", 55), data("Birds", 10)) + * .labels(data -> data.x + ": " + data.y + "%"); + * } + * + * @see PatternFly Charts + * @see PatternFly Java Showcase + * @see org.patternfly.chart.BaseChart + * @see org.patternfly.chart.Data + */ +package org.patternfly.chart; \ No newline at end of file diff --git a/charts/src/main/java/org/patternfly/chart/pie/package-info.java b/charts/src/main/java/org/patternfly/chart/pie/package-info.java new file mode 100644 index 000000000..cb29c7c8f --- /dev/null +++ b/charts/src/main/java/org/patternfly/chart/pie/package-info.java @@ -0,0 +1,51 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly pie chart component for displaying proportional data as a circle. + *

+ * Pie charts display data as segments of a circle. They support legends, theme colors, custom color scales, and + * configurable padding. + * + *

Usage

+ * + * Use the {@link org.patternfly.chart.pie.Pie#pie()} factory method to create a pie chart: + * + * {@snippet : + * import static org.patternfly.chart.Data.data; + * import static org.patternfly.chart.LegendOrientation.vertical; + * import static org.patternfly.chart.LegendPosition.right; + * import static org.patternfly.chart.Padding.padding; + * import static org.patternfly.chart.pie.Pie.pie; + * + * Pie chart = pie() + * .title("100") + * .subTitle("Pets") + * .ariaTitle("Pie chart example") + * .ariaDesc("Average number of pets") + * .data(data("Cats", 35), data("Dogs", 55), data("Birds", 10)) + * .labels(data -> data.x + ": " + data.y + "%") + * .legendData("Cats: 35", "Dogs: 55", "Birds: 10") + * .legendPosition(right) + * .legendOrientation(vertical) + * .padding(padding(20, 140, 20, 20)) + * .width(350) + * .height(230); + * } + * + * @see PatternFly Pie Chart + * @see org.patternfly.chart.pie.Pie + */ +package org.patternfly.chart.pie; \ No newline at end of file diff --git a/charts/src/main/java/org/patternfly/chart/utilization/package-info.java b/charts/src/main/java/org/patternfly/chart/utilization/package-info.java new file mode 100644 index 000000000..e2fca4ec3 --- /dev/null +++ b/charts/src/main/java/org/patternfly/chart/utilization/package-info.java @@ -0,0 +1,59 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly donut utilization and donut threshold chart components for displaying capacity and usage data. + *

+ * Donut utilization charts show a single data value as a percentage of a whole, commonly used for resource usage such as + * storage capacity, memory, or CPU. Donut threshold charts add warning and danger threshold levels that change the chart + * color based on the current value. + * + *

Donut Utilization

+ * + * Use the {@link org.patternfly.chart.utilization.DonutUtilization#donutUtilization()} factory method to create a + * utilization chart: + * + * {@snippet : + * import static org.patternfly.chart.Data.data; + * import static org.patternfly.chart.utilization.DonutUtilization.donutUtilization; + * + * DonutUtilization chart = donutUtilization() + * .title("75%") + * .subTitle("of 100 GBps") + * .ariaTitle("Donut utilization chart example") + * .ariaDesc("Storage capacity") + * .data(data("Storage capacity", 75)) + * .thresholds(60, 90) + * .labels(data -> data.x != null ? data.x + ": " + data.y + "%" : null); + * } + * + *

Donut Threshold

+ * + * Use the {@link org.patternfly.chart.utilization.DonutThreshold#donutThreshold()} factory method to create a threshold + * chart that can be combined with a utilization chart: + * + * {@snippet : + * import static org.patternfly.chart.utilization.DonutThreshold.donutThreshold; + * + * DonutThreshold threshold = donutThreshold() + * .ariaTitle("Donut threshold chart example") + * .ariaDesc("Storage capacity thresholds"); + * } + * + * @see PatternFly Donut Utilization Chart + * @see org.patternfly.chart.utilization.DonutUtilization + * @see org.patternfly.chart.utilization.DonutThreshold + */ +package org.patternfly.chart.utilization; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/accordion/package-info.java b/components/src/main/java/org/patternfly/component/accordion/package-info.java new file mode 100644 index 000000000..f949830da --- /dev/null +++ b/components/src/main/java/org/patternfly/component/accordion/package-info.java @@ -0,0 +1,53 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly accordion component for displaying collapsible content panels. + * + *

An accordion is used to deliver a large amount of content in a small space through progressive disclosure. + * The user gets key details about the underlying content and can choose to expand individual sections to get more detail. + * + *

Usage

+ * + *

Single expand accordion where only one item can be open at a time: + * + * {@snippet : + * Accordion accordion = accordion().singleExpand() + * .addItem(accordionItem("item-1", "First item") + * .add(p().text("Content for first item"))) + * .addItem(accordionItem("item-2", "Second item") + * .add(p().text("Content for second item"))) + * .addItem(accordionItem("item-3", "Third item") + * .add(p().text("Content for third item"))); + * } + * + *

Bordered accordion with multiple body sections: + * + * {@snippet : + * Accordion accordion = accordion().singleExpand().bordered() + * .addItem(accordionItem("item-1", "First item") + * .addBody(accordionItemBody() + * .add(p().text("First body section"))) + * .addBody(accordionItemBody() + * .add(button().text("Call to action").link().inline()))); + * } + * + * @see org.patternfly.component.accordion.Accordion + * @see org.patternfly.component.accordion.AccordionItem + * @see org.patternfly.component.accordion.AccordionItemBody + * @see org.patternfly.component.accordion.AccordionType + * @see PatternFly Accordion + */ +package org.patternfly.component.accordion; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/alert/package-info.java b/components/src/main/java/org/patternfly/component/alert/package-info.java new file mode 100644 index 000000000..bff5fd240 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/alert/package-info.java @@ -0,0 +1,60 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly alert component for displaying notification messages to users. + * + *

Alerts are used to communicate the status of a system, feature, or page. They can appear inline on a page or as + * toast notifications via alert groups. PatternFly supports several alert variants including custom, info, success, + * warning, and danger, each with an associated status icon and color. + * + *

Usage

+ * + *

Basic alert variants: + * + * {@snippet : + * Alert infoAlert = alert(info, "Info alert title"); + * Alert successAlert = alert(success, "Success alert title"); + * Alert warningAlert = alert(warning, "Warning alert title"); + * Alert dangerAlert = alert(danger, "Danger alert title"); + * } + * + *

Alert with description, actions, and close button: + * + * {@snippet : + * Alert alert = alert(success, "Success alert title") + * .closable() + * .addDescription("This should tell the user more information about the alert.") + * .addActionGroup(alertActionGroup() + * .addAction("View details", (e, a) -> handleViewDetails()) + * .addAction("Ignore", (e, a) -> handleIgnore())); + * } + * + *

Inline alert group for static alerts: + * + * {@snippet : + * AlertGroup group = alertGroup(staticInline) + * .addItem(alert(success, "Success alert").inline()) + * .addItem(alert(info, "Info alert")); + * } + * + * @see org.patternfly.component.alert.Alert + * @see org.patternfly.component.alert.AlertGroup + * @see org.patternfly.component.alert.AlertActionGroup + * @see org.patternfly.component.alert.AlertDescription + * @see org.patternfly.component.alert.AlertGroupType + * @see PatternFly Alert + */ +package org.patternfly.component.alert; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/avatar/package-info.java b/components/src/main/java/org/patternfly/component/avatar/package-info.java new file mode 100644 index 000000000..2392135be --- /dev/null +++ b/components/src/main/java/org/patternfly/component/avatar/package-info.java @@ -0,0 +1,35 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly avatar component for displaying user profile images. + * + *

An avatar is a visual used to represent a user. It may contain an image or a placeholder graphic. + * Avatars support different sizes and an optional border. + * + *

Usage

+ * + *

Basic avatar with size and border variations: + * + * {@snippet : + * Avatar basicAvatar = avatar("/img/avatar.svg", "User avatar"); + * Avatar largeAvatar = avatar("/img/avatar.svg", "User avatar").size(lg); + * Avatar borderedAvatar = avatar("/img/avatar.svg", "User avatar").bordered(); + * } + * + * @see org.patternfly.component.avatar.Avatar + * @see PatternFly Avatar + */ +package org.patternfly.component.avatar; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/backdrop/package-info.java b/components/src/main/java/org/patternfly/component/backdrop/package-info.java new file mode 100644 index 000000000..b0a99f55f --- /dev/null +++ b/components/src/main/java/org/patternfly/component/backdrop/package-info.java @@ -0,0 +1,26 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly backdrop component. + * + *

A backdrop is used to screen the main content of a page when a modal overlay is opened. It prevents the user + * from interacting with the page content until the modal is dismissed. The backdrop is typically used internally by + * modal and overlay components. + * + * @see org.patternfly.component.backdrop.Backdrop + * @see PatternFly Backdrop + */ +package org.patternfly.component.backdrop; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/backtotop/package-info.java b/components/src/main/java/org/patternfly/component/backtotop/package-info.java new file mode 100644 index 000000000..377a95d13 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/backtotop/package-info.java @@ -0,0 +1,33 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly back to top component for scrolling navigation. + * + *

The back to top component is a shortcut that allows users to quickly navigate to the top of a lengthy content + * page. It typically appears as a floating button after the user has scrolled down the page. + * + *

Usage

+ * + *

Basic back to top button that is always visible: + * + * {@snippet : + * BackToTop backToTop = backToTop().alwaysVisible(); + * } + * + * @see org.patternfly.component.backtotop.BackToTop + * @see PatternFly Back to top + */ +package org.patternfly.component.backtotop; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/badge/package-info.java b/components/src/main/java/org/patternfly/component/badge/package-info.java new file mode 100644 index 000000000..a33d74395 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/badge/package-info.java @@ -0,0 +1,46 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly badge component for displaying counts and status indicators. + * + *

A badge is used to annotate other information like a label or an object name. Badges are typically used to + * reflect counts such as the number of unread items or the number of objects in a collection. They can be displayed + * in a read or unread state and support custom display formatting and value limits. + * + *

Usage

+ * + *

Read and unread badges: + * + * {@snippet : + * Badge readBadge = badge(7).read(); + * Badge unreadBadge = badge(24).unread(); + * Badge limitedBadge = badge(1000).limit(999).unread(); + * } + * + *

Badges with custom display formatting: + * + * {@snippet : + * Badge customBadge = badge(7).read() + * .display(v -> v + " items"); + * Badge limitedCustom = badge(1000).limit(999).unread() + * .display(v -> v + " items") + * .maxDisplay(v -> "More than you can handle"); + * } + * + * @see org.patternfly.component.badge.Badge + * @see PatternFly Badge + */ +package org.patternfly.component.badge; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/banner/package-info.java b/components/src/main/java/org/patternfly/component/banner/package-info.java new file mode 100644 index 000000000..e69106b7e --- /dev/null +++ b/components/src/main/java/org/patternfly/component/banner/package-info.java @@ -0,0 +1,47 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly banner component for displaying prominent messages across the top of a page. + * + *

A banner is a 1-line, full color, full width container that can be used to communicate short snippets of + * information to users. Banners can be styled with different colors and can optionally convey status using + * severity indicators. + * + *

Usage

+ * + *

Basic banners with different colors: + * + * {@snippet : + * Banner defaultBanner = banner("Default banner"); + * Banner redBanner = banner("Red banner", red); + * Banner blueBanner = banner("Blue banner", blue); + * } + * + *

Banner with links and status: + * + * {@snippet : + * Banner linked = banner(blue) + * .text("Blue banner with an ") + * .add(button("inline link button").link().inline()); + * Banner statusBanner = banner() + * .status(success.status) + * .screenReader("Success banner"); + * } + * + * @see org.patternfly.component.banner.Banner + * @see PatternFly Banner + */ +package org.patternfly.component.banner; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/brand/package-info.java b/components/src/main/java/org/patternfly/component/brand/package-info.java new file mode 100644 index 000000000..490326c49 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/brand/package-info.java @@ -0,0 +1,44 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly brand component for displaying product logos and branding images. + * + *

A brand is used to place a product logotype on a screen. The brand component supports simple image-based + * logos as well as responsive logos with multiple sources for different viewport sizes. + * + *

Usage

+ * + *

Basic brand with a logo image: + * + * {@snippet : + * Brand logo = brand("/img/logo.svg", "Product logo"); + * } + * + *

Responsive brand with different sources for different screen sizes: + * + * {@snippet : + * Brand responsive = brand() + * .widths(breakpoints(default_, "40px", sm, "60px", md, "220px")) + * .addSource("/img/full-logo.svg", "(min-width: 768px)") + * .addSource("/img/icon-logo.svg", "(min-width: 576px)") + * .addImg(img("/img/full-logo.svg") + * .apply(i -> i.alt = "Fallback logo")); + * } + * + * @see org.patternfly.component.brand.Brand + * @see PatternFly Brand + */ +package org.patternfly.component.brand; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/breadcrumb/package-info.java b/components/src/main/java/org/patternfly/component/breadcrumb/package-info.java new file mode 100644 index 000000000..22d9a660e --- /dev/null +++ b/components/src/main/java/org/patternfly/component/breadcrumb/package-info.java @@ -0,0 +1,49 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly breadcrumb component for hierarchical navigation. + * + *

A breadcrumb provides users with a way to navigate back through a hierarchy of pages. Each breadcrumb item + * represents a level in the navigation hierarchy, with the last item typically representing the current page. + * + *

Usage

+ * + *

Basic breadcrumb with linked items: + * + * {@snippet : + * Breadcrumb breadcrumb = breadcrumb() + * .addItem(breadcrumbItem("home", "Section home", "#home")) + * .addItem(breadcrumbItem("title", "Section title", "#title")) + * .addItem(breadcrumbItem("landing", "Section landing", "#landing") + * .active()); + * } + * + *

Breadcrumb without a home link: + * + * {@snippet : + * Breadcrumb breadcrumb = breadcrumb() + * .addItem(breadcrumbItem("home", "Section home")) + * .addItem(breadcrumbItem("title-1", "Section title", "#title-1")) + * .addItem(breadcrumbItem("title-2", "Section title", "#title-2")) + * .addItem(breadcrumbItem("landing", "Section landing", "#landing") + * .active()); + * } + * + * @see org.patternfly.component.breadcrumb.Breadcrumb + * @see org.patternfly.component.breadcrumb.BreadcrumbItem + * @see PatternFly Breadcrumb + */ +package org.patternfly.component.breadcrumb; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/button/package-info.java b/components/src/main/java/org/patternfly/component/button/package-info.java new file mode 100644 index 000000000..f20884fe1 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/button/package-info.java @@ -0,0 +1,51 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly button component for triggering actions and navigation. + * + *

A button is a box area or text that communicates and triggers user actions when clicked or selected. + * PatternFly supports several button styling variants including primary, secondary, tertiary, danger, warning, + * link, plain, and control. Buttons can also include icons, progress indicators, and badge counts. + * + *

Usage

+ * + *

Button variants: + * + * {@snippet : + * Button primary = button("Primary").primary(); + * Button secondary = button("Secondary").secondary(); + * Button danger = button("Danger").danger(); + * Button link = button("Link").link(); + * Button plain = button().icon(times()).plain(); + * } + * + *

Buttons with icons, progress, and click handlers: + * + * {@snippet : + * Button withIcon = button() + * .iconAndText(plusCircle(), "Add item", start) + * .link(); + * Button withProgress = button("Submit").primary() + * .progress(true) + * .onClick((event, btn) -> btn.toggleProgress()); + * Button withBadge = button("Issues").primary() + * .addBadge(badge(7).unread()); + * } + * + * @see org.patternfly.component.button.Button + * @see PatternFly Button + */ +package org.patternfly.component.button; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/card/package-info.java b/components/src/main/java/org/patternfly/component/card/package-info.java new file mode 100644 index 000000000..85b6503e9 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/card/package-info.java @@ -0,0 +1,65 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly card component and its subcomponents for displaying information in a contained, flexible layout. + *

+ * A card is a square or rectangular container that can contain any kind of content. Cards symbolize units of information and + * allow users to interact with a collection of related information. Cards can be composed with a title, body, footer, header, + * and actions using the fluent builder API. + * + *

Usage

+ * + * A basic card with title, body, and footer: + * + * {@snippet : + * import static org.patternfly.component.card.Card.card; + * import static org.patternfly.component.card.CardBody.cardBody; + * import static org.patternfly.component.card.CardFooter.cardFooter; + * import static org.patternfly.component.card.CardTitle.cardTitle; + * + * card() + * .addTitle(cardTitle("Title")) + * .addBody(cardBody().text("Body")) + * .addFooter(cardFooter().text("Footer")); + * } + * + * An expandable card with header, actions, and expandable content: + * + * {@snippet : + * import static org.patternfly.component.card.Card.card; + * import static org.patternfly.component.card.CardBody.cardBody; + * import static org.patternfly.component.card.CardExpandableContent.cardExpandableContent; + * import static org.patternfly.component.card.CardFooter.cardFooter; + * import static org.patternfly.component.card.CardHeader.cardHeader; + * import static org.patternfly.component.card.CardTitle.cardTitle; + * + * card().expandable() + * .addHeader(cardHeader() + * .addTitle(cardTitle("Title"))) + * .addExpandableContent(cardExpandableContent() + * .addBody(cardBody().text("Body")) + * .addFooter(cardFooter().text("Footer"))); + * } + * + * @see Card + * @see CardHeader + * @see CardTitle + * @see CardBody + * @see CardFooter + * @see CardExpandableContent + * @see PatternFly Card + */ +package org.patternfly.component.card; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/codeblock/package-info.java b/components/src/main/java/org/patternfly/component/codeblock/package-info.java new file mode 100644 index 000000000..ae8fdfc23 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/codeblock/package-info.java @@ -0,0 +1,58 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly code block component for displaying blocks of formatted code with optional actions. + *

+ * A code block contains a read-only block of code that can be copied to the clipboard. It can include actions such as a + * copy-to-clipboard button or custom action buttons. The code block also supports a truncated/expandable view for long code + * snippets. + * + *

Usage

+ * + * A basic code block with copy-to-clipboard and a custom action: + * + * {@snippet : + * import static org.patternfly.component.codeblock.CodeBlock.codeBlock; + * import static org.patternfly.component.codeblock.CodeBlockAction.codeBlockAction; + * import static org.patternfly.component.codeblock.CodeBlockAction.codeBlockCopyToClipboardAction; + * + * codeBlock() + * .addAction(codeBlockCopyToClipboardAction()) + * .addAction(codeBlockAction(play()) + * .ariaLabel("Play") + * .onClick((action, codeBlock) -> console.log("Play"))) + * .code("apiVersion: helm.openshift.io/v1beta1/\nkind: HelmChartRepository"); + * } + * + * A truncated (expandable) code block: + * + * {@snippet : + * import static org.patternfly.component.codeblock.CodeBlock.codeBlock; + * import static org.patternfly.component.codeblock.CodeBlockAction.codeBlockCopyToClipboardAction; + * + * codeBlock() + * .addAction(codeBlockCopyToClipboardAction()) + * .truncate() + * .code("long code content..."); + * } + * + * @see CodeBlock + * @see CodeBlockAction + * @see CodeBlockActions + * @see CodeBlockHeader + * @see PatternFly Code block + */ +package org.patternfly.component.codeblock; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/content/package-info.java b/components/src/main/java/org/patternfly/component/content/package-info.java new file mode 100644 index 000000000..944c81d5a --- /dev/null +++ b/components/src/main/java/org/patternfly/component/content/package-info.java @@ -0,0 +1,55 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly content component for rendering styled text elements such as headings, paragraphs, and lists. + *

+ * The content component is used to wrap text content with PatternFly styling. It can act as a wrapper around standard HTML + * elements or render specific content types like headings (h1-h6) and paragraphs. When used as a wrapper, nested HTML elements + * automatically receive PatternFly typography styles. + * + *

Usage

+ * + * Content used as a wrapper for headings: + * + * {@snippet : + * import static org.patternfly.component.content.Content.content; + * import static org.patternfly.component.content.ContentType.h1; + * import static org.patternfly.component.content.ContentType.h2; + * import static org.patternfly.component.content.ContentType.h3; + * + * content() + * .add(content(h1).text("Hello World")) + * .add(content(h2).text("Second Level")) + * .add(content(h3).text("Third Level")); + * } + * + * Content as a wrapper for standard HTML elements: + * + * {@snippet : + * import static org.jboss.elemento.Elements.p; + * import static org.patternfly.component.content.Content.content; + * import static org.patternfly.component.content.ContentType.p; + * + * content() + * .add(content(p).text("Content component renders with PatternFly styles.")) + * .add(p().text("HTML elements within a wrapping Content are styled as well!")); + * } + * + * @see Content + * @see ContentType + * @see PatternFly Content + */ +package org.patternfly.component.content; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/divider/package-info.java b/components/src/main/java/org/patternfly/component/divider/package-info.java new file mode 100644 index 000000000..48261549f --- /dev/null +++ b/components/src/main/java/org/patternfly/component/divider/package-info.java @@ -0,0 +1,55 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly divider component for visually separating content with a horizontal or vertical line. + *

+ * A divider is a horizontal or vertical line that is placed between content to create visual separation. Dividers can be + * rendered as {@code


}, {@code
  • }, or {@code
    } elements depending on the context. The divider supports insets + * and orientation switching at various breakpoints. + * + *

    Usage

    + * + * A simple horizontal divider using an {@code
    } element: + * + * {@snippet : + * import static org.patternfly.component.divider.Divider.divider; + * import static org.patternfly.component.divider.DividerType.hr; + * + * divider(hr); + * } + * + * A vertical divider in a flex layout: + * + * {@snippet : + * import static org.patternfly.component.divider.Divider.divider; + * import static org.patternfly.component.divider.DividerType.hr; + * import static org.patternfly.layout.flex.Flex.flex; + * import static org.patternfly.layout.flex.FlexItem.flexItem; + * import static org.patternfly.style.Breakpoint.default_; + * import static org.patternfly.style.Breakpoints.breakpoints; + * import static org.patternfly.style.Orientation.vertical; + * + * flex() + * .addItem(flexItem().text("First item")) + * .add(divider(hr).orientation(breakpoints(default_, vertical))) + * .addItem(flexItem().text("Second item")); + * } + * + * @see Divider + * @see DividerType + * @see PatternFly Divider + */ +package org.patternfly.component.divider; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/drawer/package-info.java b/components/src/main/java/org/patternfly/component/drawer/package-info.java new file mode 100644 index 000000000..e2a37f2ed --- /dev/null +++ b/components/src/main/java/org/patternfly/component/drawer/package-info.java @@ -0,0 +1,74 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly drawer component and its subcomponents for displaying a collapsible panel alongside content. + *

    + * A drawer is a sliding panel that enters from the start, end, or bottom of the viewport. It can be used for task-based + * information, such as detail panels, help panels, or notification centers. The drawer supports overlay and inline modes, + * resizable panels, and configurable positions. + * + *

    Usage

    + * + * A basic drawer with a toggle button: + * + * {@snippet : + * import static org.patternfly.component.button.Button.button; + * import static org.patternfly.component.drawer.Drawer.drawer; + * import static org.patternfly.component.drawer.DrawerBody.drawerBody; + * import static org.patternfly.component.drawer.DrawerCloseButton.drawerCloseButton; + * import static org.patternfly.component.drawer.DrawerContent.drawerContent; + * import static org.patternfly.component.drawer.DrawerPanel.drawerPanel; + * import static org.patternfly.component.drawer.DrawerPanelHead.drawerPanelHead; + * + * Drawer drawer = drawer(); + * button("Toggle drawer").primary() + * .onClick((event, btn) -> drawer.toggle()); + * drawer + * .addContent(drawerContent() + * .addBody(drawerBody().text("Main content"))) + * .addPanel(drawerPanel() + * .addHead(drawerPanelHead() + * .add(span().text("Panel content")) + * .addCloseButton(drawerCloseButton()))); + * } + * + * A drawer with the panel positioned at the start: + * + * {@snippet : + * import static org.patternfly.component.drawer.Drawer.drawer; + * import static org.patternfly.component.drawer.DrawerBody.drawerBody; + * import static org.patternfly.component.drawer.DrawerContent.drawerContent; + * import static org.patternfly.component.drawer.DrawerPanel.drawerPanel; + * import static org.patternfly.component.drawer.Position.start; + * + * drawer().position(start) + * .addContent(drawerContent() + * .addBody(drawerBody().text("Main content"))) + * .addPanel(drawerPanel()); + * } + * + * @see Drawer + * @see DrawerBody + * @see DrawerCloseButton + * @see DrawerContent + * @see DrawerPanel + * @see DrawerPanelHead + * @see DrawerSection + * @see DrawerColor + * @see Position + * @see PatternFly Drawer + */ +package org.patternfly.component.drawer; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/emptystate/package-info.java b/components/src/main/java/org/patternfly/component/emptystate/package-info.java new file mode 100644 index 000000000..e89784abc --- /dev/null +++ b/components/src/main/java/org/patternfly/component/emptystate/package-info.java @@ -0,0 +1,65 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly empty state component and its subcomponents for displaying placeholder content when no data is + * available. + *

    + * An empty state is used to communicate that a page, section, or area of the UI has no data to show. It typically includes a + * title, an icon, a description, and action buttons. Empty states support different sizes, status severities, and a loading + * spinner variant. + * + *

    Usage

    + * + * A basic empty state with icon, body text, and actions: + * + * {@snippet : + * import static org.patternfly.component.button.Button.button; + * import static org.patternfly.component.emptystate.EmptyState.emptyState; + * import static org.patternfly.component.emptystate.EmptyStateActions.emptyStateActions; + * import static org.patternfly.component.emptystate.EmptyStateBody.emptyStateBody; + * import static org.patternfly.component.emptystate.EmptyStateFooter.emptyStateFooter; + * import static org.patternfly.icon.IconSets.fas.cubes; + * + * emptyState() + * .text("Empty State") + * .icon(cubes()) + * .addBody(emptyStateBody().text( + * "This represents the empty state pattern in PatternFly.")) + * .addFooter(emptyStateFooter() + * .addActions(emptyStateActions() + * .add(button("Primary action").primary())) + * .addActions(emptyStateActions() + * .add(button("Multiple").link()) + * .add(button("Action Buttons").link()))); + * } + * + * An empty state with a loading spinner: + * + * {@snippet : + * import static org.patternfly.component.emptystate.EmptyState.emptyState; + * + * emptyState() + * .text("Loading...") + * .spinner("Loading..."); + * } + * + * @see EmptyState + * @see EmptyStateActions + * @see EmptyStateBody + * @see EmptyStateFooter + * @see PatternFly Empty state + */ +package org.patternfly.component.emptystate; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/expandable/package-info.java b/components/src/main/java/org/patternfly/component/expandable/package-info.java new file mode 100644 index 000000000..3742d4588 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/expandable/package-info.java @@ -0,0 +1,56 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly expandable section component and its subcomponents for toggling the visibility of content. + *

    + * An expandable section is used to hide and show content using a toggle. It supports dynamic toggle text, disclosure and + * indented variations, detached layout, truncation of long content, and custom toggle content with icons or badges. + * + *

    Usage

    + * + * A basic expandable section with dynamic toggle text: + * + * {@snippet : + * import static org.patternfly.component.expandable.ExpandableSection.expandableSection; + * import static org.patternfly.component.expandable.ExpandableSectionContent.expandableSectionContent; + * import static org.patternfly.component.expandable.ExpandableSectionToggle.expandableSectionToggle; + * + * expandableSection() + * .addToggle(expandableSectionToggle("Show more", "Show less")) + * .addContent(expandableSectionContent() + * .text("This content is visible only when the component is expanded.")); + * } + * + * An expandable section with truncation for long content: + * + * {@snippet : + * import static org.patternfly.component.expandable.ExpandableSection.expandableSection; + * import static org.patternfly.component.expandable.ExpandableSectionContent.expandableSectionContent; + * import static org.patternfly.component.expandable.ExpandableSectionToggle.expandableSectionToggle; + * + * expandableSection() + * .truncate(2) + * .addContent(expandableSectionContent() + * .text("Long content that will be truncated to 2 lines...")) + * .addToggle(expandableSectionToggle("Show more", "Show less")); + * } + * + * @see ExpandableSection + * @see ExpandableSectionContent + * @see ExpandableSectionToggle + * @see PatternFly Expandable section + */ +package org.patternfly.component.expandable; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/form/package-info.java b/components/src/main/java/org/patternfly/component/form/package-info.java new file mode 100644 index 000000000..74f724cde --- /dev/null +++ b/components/src/main/java/org/patternfly/component/form/package-info.java @@ -0,0 +1,85 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides form components for building structured data entry interfaces. + * + *

    This package contains the {@link org.patternfly.component.form.Form} component and its sub-components for + * creating accessible, validated forms. Forms organize input controls into groups with labels, helper text, and + * validation feedback. The package includes text inputs, text areas, form selects, checkboxes, and radio buttons. + * + *

    Components

    + * + *
      + *
    • {@link org.patternfly.component.form.Form} - Top-level form container
    • + *
    • {@link org.patternfly.component.form.FormGroup} - Groups a label with a control and helper text
    • + *
    • {@link org.patternfly.component.form.FormGroupLabel} - Label for a form group
    • + *
    • {@link org.patternfly.component.form.FormGroupControl} - Control area within a form group
    • + *
    • {@link org.patternfly.component.form.FormSection} - Groups related form groups under a heading
    • + *
    • {@link org.patternfly.component.form.FormActionGroup} - Contains form action buttons (submit, cancel)
    • + *
    • {@link org.patternfly.component.form.FormAlert} - Displays an alert within a form
    • + *
    • {@link org.patternfly.component.form.FormFieldGroup} - Nestable field group with header and body
    • + *
    • {@link org.patternfly.component.form.TextInput} - Single-line text input
    • + *
    • {@link org.patternfly.component.form.TextArea} - Multi-line text input
    • + *
    • {@link org.patternfly.component.form.FormSelect} - Native select dropdown
    • + *
    • {@link org.patternfly.component.form.Checkbox} - Checkbox control
    • + *
    • {@link org.patternfly.component.form.Radio} - Radio button control
    • + *
    + * + *

    Usage

    + * + *

    A basic form with text inputs, checkboxes, and action buttons: + * + * {@snippet : + * import static org.patternfly.component.button.Button.button; + * import static org.patternfly.component.form.Checkbox.checkbox; + * import static org.patternfly.component.form.Form.form; + * import static org.patternfly.component.form.FormActionGroup.formActionGroup; + * import static org.patternfly.component.form.FormGroup.formGroup; + * import static org.patternfly.component.form.FormGroupControl.formGroupControl; + * import static org.patternfly.component.form.FormGroupLabel.formGroupLabel; + * import static org.patternfly.component.form.FormGroupRole.radiogroup; + * import static org.patternfly.component.form.Radio.radio; + * import static org.patternfly.component.form.TextInput.textInput; + * import static org.patternfly.component.form.TextInputType.email; + * import static org.patternfly.component.help.HelperText.helperText; + * + * Form form = form() + * .addGroup(formGroup("name").required() + * .addLabel(formGroupLabel("Full name")) + * .addControl(formGroupControl() + * .addControl(textInput("name")) + * .addHelperText(helperText("Include your middle name if you have one.")))) + * .addGroup(formGroup("email").required() + * .addLabel(formGroupLabel("Email")) + * .addControl(formGroupControl() + * .addControl(textInput(email, "email")))) + * .addGroup(formGroup("timezone").role(radiogroup) + * .addLabel(formGroupLabel("Timezone")) + * .addControl(formGroupControl().inline() + * .addRadio(radio("tz-0", "timezone", "Eastern")) + * .addRadio(radio("tz-1", "timezone", "Central")) + * .addRadio(radio("tz-2", "timezone", "Pacific")))) + * .addActionGroup(formActionGroup() + * .addButton(button("Submit").primary()) + * .addButton(button("Cancel").link())); + * } + * + * @see PatternFly Form + * @see PatternFly Text Input + * @see PatternFly Checkbox + * @see PatternFly Radio + */ +package org.patternfly.component.form; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/help/package-info.java b/components/src/main/java/org/patternfly/component/help/package-info.java new file mode 100644 index 000000000..4f458986d --- /dev/null +++ b/components/src/main/java/org/patternfly/component/help/package-info.java @@ -0,0 +1,57 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides helper text components for displaying supplementary information alongside form controls. + * + *

    This package contains the {@link org.patternfly.component.help.HelperText} component and its sub-components + * for showing contextual help messages, validation feedback, and status information. Helper text items support + * different validation statuses (default, indeterminate, warning, success, error) and can display static or + * dynamic content with optional custom icons. + * + *

    Components

    + * + *
      + *
    • {@link org.patternfly.component.help.HelperText} - Container for one or more helper text items
    • + *
    • {@link org.patternfly.component.help.HelperTextItem} - Individual helper text message with optional status and icon
    • + *
    + * + *

    Usage

    + * + *

    Static helper text with different validation statuses: + * + * {@snippet : + * import static org.patternfly.component.ValidationStatus.error; + * import static org.patternfly.component.ValidationStatus.success; + * import static org.patternfly.component.ValidationStatus.warning; + * import static org.patternfly.component.help.HelperText.helperText; + * import static org.patternfly.component.help.HelperTextItem.helperTextItem; + * + * // Simple helper text + * HelperText simple = helperText("This is default helper text"); + * HelperText warn = helperText("This is warning helper text", warning); + * HelperText err = helperText("This is error helper text", error); + * + * // Multiple helper text items with dynamic status icons + * HelperText multi = helperText() + * .addItem(helperTextItem("Must be at least 14 characters", success) + * .dynamic()) + * .addItem(helperTextItem("Cannot contain the word 'redhat'", error) + * .dynamic()); + * } + * + * @see PatternFly Helper Text + */ +package org.patternfly.component.help; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/hint/package-info.java b/components/src/main/java/org/patternfly/component/hint/package-info.java new file mode 100644 index 000000000..e4cd074f0 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/hint/package-info.java @@ -0,0 +1,55 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides hint components for displaying contextual banners with supplementary information. + * + *

    This package contains the {@link org.patternfly.component.hint.Hint} component and its sub-components + * for presenting inline messages that provide guidance or suggestions to the user. A hint can include a title, + * body text, actions, and a footer with links or buttons. + * + *

    Components

    + * + *
      + *
    • {@link org.patternfly.component.hint.Hint} - Top-level hint container
    • + *
    • {@link org.patternfly.component.hint.HintTitle} - Optional title for the hint
    • + *
    • {@link org.patternfly.component.hint.HintBody} - Main content area of the hint
    • + *
    • {@link org.patternfly.component.hint.HintActions} - Actions area (e.g., dropdown or buttons)
    • + *
    • {@link org.patternfly.component.hint.HintFooter} - Footer area with links or buttons
    • + *
    + * + *

    Usage

    + * + *

    A hint with title, body, actions, and footer: + * + * {@snippet : + * import static org.patternfly.component.button.Button.button; + * import static org.patternfly.component.hint.Hint.hint; + * import static org.patternfly.component.hint.HintBody.hintBody; + * import static org.patternfly.component.hint.HintFooter.hintFooter; + * import static org.patternfly.component.hint.HintTitle.hintTitle; + * + * Hint hint = hint() + * .addTitle(hintTitle().text("Do more with Find it Fix it capabilities")) + * .addBody(hintBody().text( + * "Upgrade to Red Hat Smart Management to remediate all your systems.")) + * .addFooter(hintFooter() + * .add(button().link().inline() + * .text("Try it for 90 days"))); + * } + * + * @see PatternFly Hint + */ +package org.patternfly.component.hint; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/icon/package-info.java b/components/src/main/java/org/patternfly/component/icon/package-info.java new file mode 100644 index 000000000..758af262a --- /dev/null +++ b/components/src/main/java/org/patternfly/component/icon/package-info.java @@ -0,0 +1,61 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the icon component for rendering styled SVG icons with configurable size and status. + * + *

    This package contains the {@link org.patternfly.component.icon.Icon} component for wrapping SVG icons from + * icon sets (such as FontAwesome or PatternFly icons) with consistent sizing and optional status coloring. + * Icons can be sized to match body text, heading text, or standalone sizes, and can display status colors + * for contextual meaning. + * + *

    Components

    + * + *
      + *
    • {@link org.patternfly.component.icon.Icon} - Renders an icon with configurable size and status
    • + *
    • {@link org.patternfly.component.icon.IconSize} - Defines available icon sizes (standalone, body, and heading sizes)
    • + *
    + * + *

    Usage

    + * + *

    Creating icons with different sizes and status colors: + * + * {@snippet : + * import static org.patternfly.component.icon.Icon.icon; + * import static org.patternfly.component.icon.IconSize.lg; + * import static org.patternfly.component.icon.IconSize.sm; + * import static org.patternfly.component.icon.IconSize.xl; + * import static org.patternfly.icon.IconSets.fas.checkCircle; + * import static org.patternfly.icon.IconSets.fas.cog; + * import static org.patternfly.icon.IconSets.fas.exclamationCircle; + * import static org.patternfly.style.Status.danger; + * import static org.patternfly.style.Status.success; + * + * // Basic icons + * Icon settingsIcon = icon(cog()); + * + * // Icons with sizes + * Icon smallIcon = icon(checkCircle()).size(sm); + * Icon largeIcon = icon(checkCircle()).size(lg); + * Icon extraLargeIcon = icon(checkCircle()).size(xl); + * + * // Icons with status colors + * Icon successIcon = icon(checkCircle()).status(success); + * Icon dangerIcon = icon(exclamationCircle()).status(danger); + * } + * + * @see PatternFly Icon + */ +package org.patternfly.component.icon; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/inputgroup/package-info.java b/components/src/main/java/org/patternfly/component/inputgroup/package-info.java new file mode 100644 index 000000000..58dd16fc9 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/inputgroup/package-info.java @@ -0,0 +1,60 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides input group components for combining form controls with text, icons, or buttons. + * + *

    This package contains the {@link org.patternfly.component.inputgroup.InputGroup} component and its sub-components + * for grouping a text input or text area with supplementary elements such as static text, icons, buttons, or dropdowns. + * Input groups visually connect related controls into a single composite input. + * + *

    Components

    + * + *
      + *
    • {@link org.patternfly.component.inputgroup.InputGroup} - Container that groups input controls together
    • + *
    • {@link org.patternfly.component.inputgroup.InputGroupItem} - Wraps an individual item (control, button, or dropdown)
    • + *
    • {@link org.patternfly.component.inputgroup.InputGroupText} - Displays static text or an icon alongside the input
    • + *
    + * + *

    Usage

    + * + *

    An input group with a text input and a static text suffix: + * + * {@snippet : + * import static org.patternfly.component.button.Button.button; + * import static org.patternfly.component.form.TextInput.textInput; + * import static org.patternfly.component.inputgroup.InputGroup.inputGroup; + * import static org.patternfly.component.inputgroup.InputGroupItem.inputGroupItem; + * import static org.patternfly.component.inputgroup.InputGroupText.inputGroupText; + * import static org.patternfly.icon.IconSets.fas.at; + * + * // Input with text suffix + * InputGroup emailInput = inputGroup() + * .addItem(inputGroupItem().fill() + * .addControl(textInput("email"))) + * .addText(inputGroupText("@example.com")); + * + * // Input with icon prefix and button + * InputGroup searchInput = inputGroup() + * .addText(inputGroupText().icon(at())) + * .addItem(inputGroupItem().fill() + * .addControl(textInput("search"))) + * .addItem(inputGroupItem() + * .addButton(button("Search").control())); + * } + * + * @see PatternFly Input Group + */ +package org.patternfly.component.inputgroup; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/jumplinks/package-info.java b/components/src/main/java/org/patternfly/component/jumplinks/package-info.java new file mode 100644 index 000000000..d5f0fc0f0 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/jumplinks/package-info.java @@ -0,0 +1,63 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides jump links components for navigating within a page using anchor-based scroll navigation. + * + *

    This package contains the {@link org.patternfly.component.jumplinks.JumpLinks} component and its sub-components + * for creating a table-of-contents style navigation that links to sections on the same page. Jump links can be + * displayed horizontally or vertically, with optional labels, centered alignment, and expandable subsections. + * They support scroll spying to automatically highlight the active section. + * + *

    Components

    + * + *
      + *
    • {@link org.patternfly.component.jumplinks.JumpLinks} - Top-level container for jump link items
    • + *
    • {@link org.patternfly.component.jumplinks.JumpLinksItem} - Individual navigation link to a page section
    • + *
    • {@link org.patternfly.component.jumplinks.JumpLinksList} - Nested list for subsection navigation
    • + *
    + * + *

    Usage

    + * + *

    Vertical jump links with a label and nested subsections: + * + * {@snippet : + * import static org.patternfly.component.jumplinks.JumpLinks.jumpLinks; + * import static org.patternfly.component.jumplinks.JumpLinksItem.jumpLinksItem; + * import static org.patternfly.component.jumplinks.JumpLinksList.jumpLinksList; + * import static org.patternfly.style.Breakpoint.default_; + * import static org.patternfly.style.Breakpoints.breakpoints; + * import static org.patternfly.style.ExpandableModifier.expandable; + * + * // Simple vertical jump links + * JumpLinks simpleLinks = jumpLinks("Jump to section").vertical() + * .addItem(jumpLinksItem("section-1", "Introduction")) + * .addItem(jumpLinksItem("section-2", "Getting Started")) + * .addItem(jumpLinksItem("section-3", "Advanced Topics")); + * + * // Expandable vertical jump links with subsections + * JumpLinks expandableLinks = jumpLinks("Jump to section").vertical() + * .expandable(breakpoints(default_, expandable)) + * .addItem(jumpLinksItem("section-1", "Overview")) + * .addItem(jumpLinksItem("section-2", "Configuration") + * .addList(jumpLinksList() + * .addItem(jumpLinksItem("section-2a", "Basic Setup")) + * .addItem(jumpLinksItem("section-2b", "Advanced Options")))) + * .addItem(jumpLinksItem("section-3", "API Reference")); + * } + * + * @see PatternFly Jump Links + */ +package org.patternfly.component.jumplinks; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/label/package-info.java b/components/src/main/java/org/patternfly/component/label/package-info.java new file mode 100644 index 000000000..d260875b2 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/label/package-info.java @@ -0,0 +1,69 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides label and label group components for displaying compact, categorized metadata. + * + *

    This package contains the {@link org.patternfly.component.label.Label} and + * {@link org.patternfly.component.label.LabelGroup} components for displaying tags, categories, or status + * indicators. Labels support multiple colors, filled and outline variants, icons, close buttons, clickable + * behavior, editable text, and overflow truncation. Label groups organize multiple labels together with + * optional overflow handling. + * + *

    Components

    + * + *
      + *
    • {@link org.patternfly.component.label.Label} - Individual label with color, variant, icon, and close support
    • + *
    • {@link org.patternfly.component.label.LabelGroup} - Groups multiple labels with optional overflow
    • + *
    • {@link org.patternfly.component.label.LabelEditCompleteHandler} - Handler for label edit completion
    • + *
    • {@link org.patternfly.component.label.LabelEditCancelHandler} - Handler for label edit cancellation
    • + *
    + * + *

    Usage

    + * + *

    Labels with different colors and variants: + * + * {@snippet : + * import static org.patternfly.component.label.Label.label; + * import static org.patternfly.component.label.LabelGroup.labelGroup; + * import static org.patternfly.icon.IconSets.fas.infoCircle; + * import static org.patternfly.style.Color.blue; + * import static org.patternfly.style.Color.green; + * import static org.patternfly.style.Color.red; + * + * // Filled labels with different colors + * Label blueLabel = label("Blue", blue).filled(); + * Label greenLabel = label("Green", green).filled().icon(infoCircle()); + * Label removable = label("Removable", red).filled().closable(); + * + * // Outline labels + * Label outlineLabel = label("Outline", blue).outline(); + * + * // Compact and clickable labels + * Label compact = label("Compact").compact().filled(); + * Label clickable = label("Clickable", blue).filled() + * .clickable((e, l) -> console.log("Label clicked")); + * + * // Label group + * LabelGroup group = labelGroup() + * .addItem(label("Label 1", blue).filled()) + * .addItem(label("Label 2", green).filled()) + * .addItem(label("Label 3", red).filled().closable()); + * } + * + * @see PatternFly Label + * @see PatternFly Label Group + */ +package org.patternfly.component.label; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/list/package-info.java b/components/src/main/java/org/patternfly/component/list/package-info.java new file mode 100644 index 000000000..c0636d9c0 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/list/package-info.java @@ -0,0 +1,75 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides list components for displaying collections of items in various formats. + * + *

    This package contains several list components: basic lists ({@link org.patternfly.component.list.List}), + * action lists ({@link org.patternfly.component.list.ActionList}), data lists + * ({@link org.patternfly.component.list.DataList}), description lists + * ({@link org.patternfly.component.list.DescriptionList}), and simple lists + * ({@link org.patternfly.component.list.SimpleList}). Each list type serves a different purpose, from + * simple unordered lists to complex data display with expandable content and actions. + * + *

    Components

    + * + *
      + *
    • {@link org.patternfly.component.list.List} - Basic unordered or ordered list
    • + *
    • {@link org.patternfly.component.list.ListItem} - Item within a basic list
    • + *
    • {@link org.patternfly.component.list.ActionList} - List of actions (buttons, dropdowns)
    • + *
    • {@link org.patternfly.component.list.DataList} - Flexible list for displaying structured data
    • + *
    • {@link org.patternfly.component.list.DescriptionList} - Key-value pair list with terms and descriptions
    • + *
    • {@link org.patternfly.component.list.SimpleList} - Selectable list with grouped items
    • + *
    + * + *

    Usage

    + * + *

    Basic lists with different styles: + * + * {@snippet : + * import static org.jboss.elemento.Elements.ol; + * import static org.patternfly.component.list.List.list; + * import static org.patternfly.component.list.ListItem.listItem; + * import static org.patternfly.icon.IconSets.fas.bookOpen; + * import static org.patternfly.icon.IconSets.fas.desktop; + * + * // Basic unordered list + * List basicList = list() + * .addItem(listItem("item-0").text("First")) + * .addItem(listItem("item-1").text("Second")) + * .addItem(listItem("item-2").text("Third")); + * + * // Ordered list + * List orderedList = list(ol()) + * .addItem(listItem("item-0").text("First")) + * .addItem(listItem("item-1").text("Second")) + * .addItem(listItem("item-2").text("Third")); + * + * // Plain list with icons + * List iconList = list().plain() + * .addItem(listItem("item-0").text("Books").icon(bookOpen())) + * .addItem(listItem("item-1").text("Computers").icon(desktop())); + * + * // Inline list + * List inlineList = list().inline() + * .addItem(listItem("item-0").text("First")) + * .addItem(listItem("item-1").text("Second")); + * } + * + * @see PatternFly List + * @see PatternFly Data List + * @see PatternFly Description List + */ +package org.patternfly.component.list; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/menu/package-info.java b/components/src/main/java/org/patternfly/component/menu/package-info.java new file mode 100644 index 000000000..09de64ec9 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/menu/package-info.java @@ -0,0 +1,77 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides menu components for building dropdowns, selects, and general-purpose menus. + * + *

    This package contains the {@link org.patternfly.component.menu.Menu} component and related classes for creating + * menus, dropdowns, single selects, multi selects, and typeaheads. Menus support different types (action, select, + * checkbox), selection modes (click, single, multi), grouped items, icons, descriptions, danger items, search + * filtering, and item actions. + * + *

    Components

    + * + *
      + *
    • {@link org.patternfly.component.menu.Menu} - Core menu component with configurable type and selection mode
    • + *
    • {@link org.patternfly.component.menu.MenuContent} - Scrollable content area of a menu
    • + *
    • {@link org.patternfly.component.menu.MenuList} - List of menu items
    • + *
    • {@link org.patternfly.component.menu.MenuItem} - Individual menu item (action, link, or checkbox)
    • + *
    • {@link org.patternfly.component.menu.MenuGroup} - Groups menu items under a heading
    • + *
    • {@link org.patternfly.component.menu.MenuToggle} - Toggle button that opens/closes a menu
    • + *
    • {@link org.patternfly.component.menu.Dropdown} - Pre-configured menu for dropdown use cases
    • + *
    • {@link org.patternfly.component.menu.SingleSelect} - Pre-configured menu for single selection
    • + *
    • {@link org.patternfly.component.menu.MultiSelect} - Pre-configured menu for multiple selection
    • + *
    • {@link org.patternfly.component.menu.MenuSearch} - Search/filter input within a menu
    • + *
    • {@link org.patternfly.component.menu.MenuFooter} - Footer area for additional actions
    • + *
    + * + *

    Usage

    + * + *

    A basic action menu and a dropdown: + * + * {@snippet : + * import static org.patternfly.component.SelectionMode.click; + * import static org.patternfly.component.menu.Dropdown.dropdown; + * import static org.patternfly.component.menu.Menu.menu; + * import static org.patternfly.component.menu.MenuContent.menuContent; + * import static org.patternfly.component.menu.MenuItem.menuItem; + * import static org.patternfly.component.menu.MenuList.menuList; + * import static org.patternfly.component.menu.MenuToggle.menuToggle; + * import static org.patternfly.component.menu.MenuType.menu; + * + * // Basic action menu + * Menu actionMenu = menu(menu, click) + * .addContent(menuContent() + * .addList(menuList() + * .addItem(menuItem("item-0", "Action")) + * .addItem(menuItem("item-1", "Another action")) + * .addItem(menuItem("item-2", "Disabled action") + * .disabled()))); + * + * // Dropdown with toggle + * Dropdown dropdown = dropdown(menuToggle("Dropdown")) + * .addMenu(menu() + * .addContent(menuContent() + * .addList(menuList() + * .addItem(menuItem("option-0", "Option 1")) + * .addItem(menuItem("option-1", "Option 2")) + * .addItem(menuItem("option-2", "Option 3"))))); + * } + * + * @see PatternFly Menu + * @see PatternFly Dropdown + * @see PatternFly Select + */ +package org.patternfly.component.menu; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/modal/package-info.java b/components/src/main/java/org/patternfly/component/modal/package-info.java new file mode 100644 index 000000000..9b52747e0 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/modal/package-info.java @@ -0,0 +1,65 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly modal dialog component and its subcomponents. + *

    + * A modal is a dialog box that overlays the main content of the page, requiring the user to interact with it before returning + * to the parent application. Modals can contain headers with titles and descriptions, a scrollable body, and a footer with + * action buttons. + * + *

    Usage

    + * + * {@snippet : + * import static org.patternfly.component.button.Button.button; + * import static org.patternfly.component.modal.Modal.modal; + * import static org.patternfly.component.modal.ModalBody.modalBody; + * import static org.patternfly.component.modal.ModalFooter.modalFooter; + * + * Modal modal = modal() + * .addHeader("Basic modal") + * .addBody(modalBody() + * .text("Modal body content")) + * .addFooter(modalFooter() + * .addButton(button("Confirm").primary()) + * .addButton(button("Cancel").link())) + * .appendToBody(); + * modal.open(); + * } + * + * Modals can include a header with title and description: + * + * {@snippet : + * import static org.patternfly.component.button.Button.button; + * import static org.patternfly.component.modal.Modal.modal; + * import static org.patternfly.component.modal.ModalBody.modalBody; + * import static org.patternfly.component.modal.ModalFooter.modalFooter; + * import static org.patternfly.component.modal.ModalHeader.modalHeader; + * + * Modal modal = modal() + * .addHeader(modalHeader() + * .addTitle("Modal with description") + * .addDescription("A description provides more context about the modal.")) + * .addBody(modalBody() + * .text("Modal body content")) + * .addFooter(modalFooter() + * .addButton(button("Confirm").primary()) + * .addButton(button("Cancel").link())) + * .appendToBody(); + * } + * + * @see https://www.patternfly.org/components/modal + */ +package org.patternfly.component.modal; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/navigation/package-info.java b/components/src/main/java/org/patternfly/component/navigation/package-info.java new file mode 100644 index 000000000..c2a86d475 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/navigation/package-info.java @@ -0,0 +1,57 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly navigation component and its subcomponents. + *

    + * A navigation component organizes an application's structure and content, making it easy for users to find information and + * accomplish tasks. Navigation can be rendered in different types including flat, grouped, expandable, and horizontal + * variants. + * + *

    Usage

    + * + * A flat vertical navigation with simple items: + * + * {@snippet : + * import static org.patternfly.component.navigation.Navigation.navigation; + * import static org.patternfly.component.navigation.NavigationItem.navigationItem; + * import static org.patternfly.component.navigation.NavigationType.Vertical.flat; + * + * Navigation navigation = navigation(flat) + * .addItem(navigationItem("item-0", "Link 1", "#item-0")) + * .addItem(navigationItem("item-1", "Link 2", "#item-1")) + * .addItem(navigationItem("item-2", "Link 3", "#item-2")); + * } + * + * An expandable navigation with grouped items: + * + * {@snippet : + * import static org.patternfly.component.navigation.ExpandableNavigationGroup.expandableNavigationGroup; + * import static org.patternfly.component.navigation.Navigation.navigation; + * import static org.patternfly.component.navigation.NavigationItem.navigationItem; + * import static org.patternfly.component.navigation.NavigationType.Vertical.expandable; + * + * Navigation navigation = navigation(expandable) + * .addGroup(expandableNavigationGroup("grp-0", "Expandable group 1") + * .addItem(navigationItem("item-00", "Subnav link 1", "#item-00")) + * .addItem(navigationItem("item-01", "Subnav link 2", "#item-01"))) + * .addGroup(expandableNavigationGroup("grp-1", "Expandable group 2") + * .addItem(navigationItem("item-10", "Subnav link 1", "#item-10")) + * .addItem(navigationItem("item-11", "Subnav link 2", "#item-11"))); + * } + * + * @see https://www.patternfly.org/components/navigation + */ +package org.patternfly.component.navigation; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/notification/package-info.java b/components/src/main/java/org/patternfly/component/notification/package-info.java new file mode 100644 index 000000000..8e61315a2 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/notification/package-info.java @@ -0,0 +1,72 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly notification badge and notification drawer components. + *

    + * This package contains components for displaying notification indicators and organizing notifications. The + * {@link org.patternfly.component.notification.NotificationBadge} shows a count of notifications with read, unread, and + * attention states. The {@link org.patternfly.component.notification.NotificationDrawer} provides a structured list of + * notification items with severity, timestamps, and action support. + * + *

    Usage

    + * + * A notification badge with a count: + * + * {@snippet : + * import static org.patternfly.component.notification.NotificationBadge.notificationBadge; + * + * NotificationBadge badge = notificationBadge() + * .ariaLabel("10 unread notifications") + * .unread() + * .count(10); + * } + * + * A notification drawer with items of different severity: + * + * {@snippet : + * import static org.patternfly.component.Severity.danger; + * import static org.patternfly.component.Severity.info; + * import static org.patternfly.component.Severity.warning; + * import static org.patternfly.component.notification.NotificationDrawer.notificationDrawer; + * import static org.patternfly.component.notification.NotificationDrawerBody.notificationDrawerBody; + * import static org.patternfly.component.notification.NotificationDrawerHeader.notificationDrawerHeader; + * import static org.patternfly.component.notification.NotificationDrawerItem.notificationDrawerItem; + * import static org.patternfly.component.notification.NotificationDrawerItemBody.notificationDrawerItemBody; + * import static org.patternfly.component.notification.NotificationDrawerList.notificationDrawerList; + * + * NotificationDrawer drawer = notificationDrawer() + * .addHeader(notificationDrawerHeader() + * .status("2 unread")) + * .addBody(notificationDrawerBody() + * .addList(notificationDrawerList() + * .addItem(notificationDrawerItem(info, "Info notification title") + * .addBody(notificationDrawerItemBody("This is an info notification.")) + * .timestamp("5 minutes ago")) + * .addItem(notificationDrawerItem(danger, "Danger notification title") + * .addBody(notificationDrawerItemBody("This is a danger notification.")) + * .timestamp("10 minutes ago")) + * .addItem(notificationDrawerItem(warning, "Warning notification title") + * .addBody(notificationDrawerItemBody("This is a warning notification.")) + * .read() + * .timestamp("20 minutes ago")))); + * } + * + * @see https://www.patternfly.org/components/notification-badge + * @see https://www.patternfly.org/components/notification-drawer + */ +package org.patternfly.component.notification; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/numberinput/package-info.java b/components/src/main/java/org/patternfly/component/numberinput/package-info.java new file mode 100644 index 000000000..637d6e383 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/numberinput/package-info.java @@ -0,0 +1,44 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly number input component. + *

    + * A number input provides a numeric input field with increment and decrement buttons. It supports minimum and maximum values, + * custom step sizes, unit labels, validation status, and configurable input widths. + * + *

    Usage

    + * + * {@snippet : + * import static org.patternfly.component.numberinput.NumberInput.numberInput; + * + * NumberInput input = numberInput(90) + * .unit("%"); + * } + * + * A number input with minimum and maximum thresholds: + * + * {@snippet : + * import static org.patternfly.component.numberinput.NumberInput.numberInput; + * + * NumberInput input = numberInput(0) + * .min(0) + * .max(10) + * .unit("%"); + * } + * + * @see https://www.patternfly.org/components/number-input + */ +package org.patternfly.component.numberinput; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/page/package-info.java b/components/src/main/java/org/patternfly/component/page/package-info.java new file mode 100644 index 000000000..4123bcb65 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/page/package-info.java @@ -0,0 +1,58 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly page layout component and its subcomponents. + *

    + * The page component provides the overall structure for an application, including a masthead with branding and tools, a + * sidebar for navigation, and a main content area with sections. It includes support for the masthead, sidebar, page sections, + * breadcrumbs, navigation, tabs, and groups. + * + *

    Usage

    + * + * {@snippet : + * import static org.patternfly.component.page.Masthead.masthead; + * import static org.patternfly.component.page.MastheadBrand.mastheadBrand; + * import static org.patternfly.component.page.MastheadContent.mastheadContent; + * import static org.patternfly.component.page.MastheadLogo.mastheadLogo; + * import static org.patternfly.component.page.MastheadMain.mastheadMain; + * import static org.patternfly.component.page.MastheadToggle.mastheadToggle; + * import static org.patternfly.component.page.Page.page; + * import static org.patternfly.component.page.PageMain.pageMain; + * import static org.patternfly.component.page.PageSection.pageSection; + * import static org.patternfly.component.page.PageSidebar.pageSidebar; + * import static org.patternfly.component.page.PageSidebarBody.pageSidebarBody; + * + * Page page = page() + * .addMasthead(masthead() + * .addMain(mastheadMain() + * .addToggle(mastheadToggle()) + * .addBrand(mastheadBrand() + * .addLogo(mastheadLogo("#") + * .add("Logo")))) + * .addContent(mastheadContent().text("Header tools"))) + * .addSidebar(pageSidebar() + * .addBody(pageSidebarBody() + * .add("Navigation"))) + * .addMain(pageMain("main-id") + * .addSection(pageSection() + * .text("Section 1")) + * .addSection(pageSection().secondary() + * .text("Section 2"))); + * } + * + * @see https://www.patternfly.org/components/page + */ +package org.patternfly.component.page; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/panel/package-info.java b/components/src/main/java/org/patternfly/component/panel/package-info.java new file mode 100644 index 000000000..ba526155e --- /dev/null +++ b/components/src/main/java/org/patternfly/component/panel/package-info.java @@ -0,0 +1,46 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly panel component and its subcomponents. + *

    + * A panel is a container that supports flexible content layouts. Panels can include a header, a main content area, and a + * footer, with optional dividers between sections. Panels support raised, bordered, and scrollable variants. + * + *

    Usage

    + * + * {@snippet : + * import static org.patternfly.component.panel.Panel.panel; + * + * Panel panel = panel() + * .addHeader("Header content") + * .addDivider() + * .addMain("Main content") + * .addFooter("Footer content"); + * } + * + * A raised panel: + * + * {@snippet : + * import static org.patternfly.component.panel.Panel.panel; + * + * Panel panel = panel() + * .raised() + * .addMain("Main content"); + * } + * + * @see https://www.patternfly.org/components/panel + */ +package org.patternfly.component.panel; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/popover/package-info.java b/components/src/main/java/org/patternfly/component/popover/package-info.java new file mode 100644 index 000000000..4e0acd60d --- /dev/null +++ b/components/src/main/java/org/patternfly/component/popover/package-info.java @@ -0,0 +1,55 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly popover component and its subcomponents. + *

    + * A popover is a floating content container that is triggered by a click (or hover) on a trigger element. It can display a + * header, body, and footer, and supports configurable placement relative to the trigger element. Popovers are typically + * used to provide more information or contextual actions. + * + *

    Usage

    + * + * {@snippet : + * import org.jboss.elemento.By; + * import static org.patternfly.component.button.Button.button; + * import static org.patternfly.component.popover.Popover.popover; + * + * button("Toggle popover").primary() + * .id("popover-trigger"); + * Popover popover = popover(By.id("popover-trigger")) + * .ariaLabel("Basic popover") + * .addHeader("Popover header") + * .addBody("Popovers are triggered by click rather than hover.") + * .addFooter("Popover footer"); + * } + * + * A hoverable popover: + * + * {@snippet : + * import org.jboss.elemento.By; + * import static org.patternfly.component.popover.Popover.popover; + * + * Popover popover = popover(By.id("trigger-element")) + * .hoverable() + * .ariaLabel("Hoverable popover") + * .addHeader("Popover header") + * .addBody("This popover opens on hover.") + * .addFooter("Popover footer"); + * } + * + * @see https://www.patternfly.org/components/popover + */ +package org.patternfly.component.popover; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/progress/package-info.java b/components/src/main/java/org/patternfly/component/progress/package-info.java new file mode 100644 index 000000000..943d939ca --- /dev/null +++ b/components/src/main/java/org/patternfly/component/progress/package-info.java @@ -0,0 +1,48 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly progress component. + *

    + * A progress component displays the completion status of an activity or task. It supports different sizes, measure locations + * (inside, outside, or none), and status variants for success, warning, danger, and info states. + * + *

    Usage

    + * + * {@snippet : + * import static org.patternfly.component.progress.Progress.progress; + * + * Progress progress = progress() + * .title("Title") + * .value(33); + * } + * + * A progress bar with status and measure location: + * + * {@snippet : + * import static org.patternfly.component.progress.MeasureLocation.inside; + * import static org.patternfly.component.progress.Progress.progress; + * import static org.patternfly.style.Status.success; + * + * Progress progress = progress() + * .measureLocation(inside) + * .status(success) + * .title("Completed") + * .value(100); + * } + * + * @see https://www.patternfly.org/components/progress + */ +package org.patternfly.component.progress; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/progressstepper/package-info.java b/components/src/main/java/org/patternfly/component/progressstepper/package-info.java new file mode 100644 index 000000000..26cec4925 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/progressstepper/package-info.java @@ -0,0 +1,69 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly progress stepper component and its subcomponents. + *

    + * A progress stepper displays progress through a sequence of discrete steps. Each step can have a variant indicating its + * status (success, info, warning, danger, or pending), an optional description, and custom icons. The stepper supports + * vertical, centered, and compact layout options. + * + *

    Usage

    + * + * {@snippet : + * import static org.patternfly.component.progressstepper.ProgressStep.progressStep; + * import static org.patternfly.component.progressstepper.ProgressStepVariant.info; + * import static org.patternfly.component.progressstepper.ProgressStepVariant.pending; + * import static org.patternfly.component.progressstepper.ProgressStepVariant.success; + * import static org.patternfly.component.progressstepper.ProgressStepper.progressStepper; + * + * ProgressStepper stepper = progressStepper() + * .ariaLabel("Basic progress stepper") + * .add(progressStep("step-1", "First step") + * .variant(success)) + * .add(progressStep("step-2", "Second step") + * .variant(info)) + * .add(progressStep("step-3", "Third step") + * .variant(pending)) + * .first().next(); + * } + * + * A progress stepper with step descriptions: + * + * {@snippet : + * import static org.patternfly.component.progressstepper.ProgressStep.progressStep; + * import static org.patternfly.component.progressstepper.ProgressStepVariant.info; + * import static org.patternfly.component.progressstepper.ProgressStepVariant.pending; + * import static org.patternfly.component.progressstepper.ProgressStepVariant.success; + * import static org.patternfly.component.progressstepper.ProgressStepper.progressStepper; + * + * ProgressStepper stepper = progressStepper() + * .ariaLabel("Progress stepper with descriptions") + * .add(progressStep("step-1", "First step") + * .variant(success) + * .description("This is the first thing to happen")) + * .add(progressStep("step-2", "Second step") + * .variant(info) + * .description("This is the second thing to happen")) + * .add(progressStep("step-3", "Third step") + * .variant(pending) + * .description("This is the last thing to happen")) + * .first().next(); + * } + * + * @see https://www.patternfly.org/components/progress-stepper + */ +package org.patternfly.component.progressstepper; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/skeleton/package-info.java b/components/src/main/java/org/patternfly/component/skeleton/package-info.java new file mode 100644 index 000000000..bf274e701 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/skeleton/package-info.java @@ -0,0 +1,51 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly skeleton component. + *

    + * A skeleton is a placeholder for content that has not yet loaded. It provides a visual indication of where content will + * appear, improving perceived performance. Skeletons support configurable widths, heights, font sizes, and shapes (circle, + * square, or default rectangle). + * + *

    Usage

    + * + * {@snippet : + * import static org.patternfly.component.skeleton.Skeleton.skeleton; + * + * Skeleton skeleton = skeleton() + * .screenReaderText("Loading contents"); + * } + * + * Skeletons with custom widths and shapes: + * + * {@snippet : + * import static org.patternfly.component.skeleton.Shape.circle; + * import static org.patternfly.component.skeleton.Shape.square; + * import static org.patternfly.component.skeleton.Skeleton.skeleton; + * + * Skeleton circleSkeleton = skeleton() + * .shape(circle) + * .width("30%") + * .screenReaderText("Loading circle contents"); + * Skeleton squareSkeleton = skeleton() + * .shape(square) + * .width("30%") + * .screenReaderText("Loading square contents"); + * } + * + * @see https://www.patternfly.org/components/skeleton + */ +package org.patternfly.component.skeleton; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/skiptocontent/package-info.java b/components/src/main/java/org/patternfly/component/skiptocontent/package-info.java new file mode 100644 index 000000000..760bd66ed --- /dev/null +++ b/components/src/main/java/org/patternfly/component/skiptocontent/package-info.java @@ -0,0 +1,43 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly skip to content component. + *

    + * A skip to content component allows screen reader and keyboard users to bypass navigation rather than tabbing through it. + * It is typically added as the first element inside a {@link org.patternfly.component.page.Page} component and links to the + * main content area. + * + *

    Usage

    + * + * {@snippet : + * import static org.patternfly.component.page.Page.page; + * import static org.patternfly.component.skiptocontent.SkipToContent.skipToContent; + * + * page().addSkipToContent(skipToContent("main-content-id")); + * } + * + * With custom text: + * + * {@snippet : + * import static org.patternfly.component.skiptocontent.SkipToContent.skipToContent; + * + * SkipToContent stc = skipToContent("main-content-id", "Jump to main content"); + * } + * + * @see https://www.patternfly.org/components/skip-to-content + */ +package org.patternfly.component.skiptocontent; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/slider/package-info.java b/components/src/main/java/org/patternfly/component/slider/package-info.java new file mode 100644 index 000000000..9aad07ac0 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/slider/package-info.java @@ -0,0 +1,59 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly slider component and its subcomponents. + *

    + * A slider allows users to set a value within a numeric range by dragging a thumb along a track. Sliders support continuous + * and discrete modes with configurable ranges, custom step values, tick marks, boundary labels, input fields, and action + * buttons. + * + *

    Usage

    + * + * A discrete slider with custom steps: + * + * {@snippet : + * import static org.patternfly.component.slider.Slider.slider; + * import static org.patternfly.component.slider.SliderStep.sliderStep; + * import static org.patternfly.component.slider.SliderSteps.sliderSteps; + * + * Slider slider = slider() + * .value(3) + * .showTicks() + * .customSteps(sliderSteps( + * sliderStep(0, "A"), + * sliderStep(1, "B"), + * sliderStep(2, "C"), + * sliderStep(3, "D"), + * sliderStep(4, "E"), + * sliderStep(5, "F"))) + * .onChange((e, s, v) -> {}); + * } + * + * A slider with a numeric range and step size: + * + * {@snippet : + * import static org.patternfly.component.slider.Slider.slider; + * + * Slider slider = slider() + * .value(50) + * .range(0, 200, 50) + * .showTicks() + * .onChange((e, s, v) -> {}); + * } + * + * @see https://www.patternfly.org/components/slider + */ +package org.patternfly.component.slider; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/spinner/package-info.java b/components/src/main/java/org/patternfly/component/spinner/package-info.java new file mode 100644 index 000000000..80bc06481 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/spinner/package-info.java @@ -0,0 +1,61 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides a spinner component to indicate that an action is in progress. + * + *

    The spinner is an SVG-based loading indicator that can be used standalone or inline within text content. + * It supports predefined sizes ({@code sm}, {@code md}, {@code lg}, {@code xl}), custom diameters, and an inline + * variant that adjusts to the surrounding text size. + * + *

    Usage

    + * + *

    Create a basic spinner or configure it with a specific size: + * + * {@snippet : + * import static org.patternfly.component.spinner.Spinner.spinner; + * import static org.patternfly.style.Size.lg; + * import static org.patternfly.style.Size.sm; + * + * // Basic spinner + * Spinner basic = spinner(); + * + * // Spinner with predefined size + * Spinner small = spinner(sm); + * Spinner large = spinner(lg); + * + * // Spinner with custom diameter + * Spinner custom = spinner().diameter("80px"); + * } + * + *

    Use an inline spinner within text content: + * + * {@snippet : + * import static org.jboss.elemento.Elements.h; + * import static org.jboss.elemento.Elements.p; + * import static org.patternfly.component.spinner.Spinner.spinner; + * + * h(1).add("Loading ") + * .add(spinner("Loading data").inline()); + * + * p().add("Please wait ") + * .add(spinner("Processing").inline()) + * .add(" while we process your request."); + * } + * + * @see org.patternfly.component.spinner.Spinner + * @see PatternFly Spinner + */ +package org.patternfly.component.spinner; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/switch_/package-info.java b/components/src/main/java/org/patternfly/component/switch_/package-info.java new file mode 100644 index 000000000..d5e4bdfc2 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/switch_/package-info.java @@ -0,0 +1,53 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides a switch (toggle) component for binary on/off selections. + * + *

    A switch is used to toggle the state of a setting between two options (on and off). It supports labels, + * reversed layout, check icons, and a disabled state. The package name uses a trailing underscore because + * {@code switch} is a reserved Java keyword. + * + *

    Usage

    + * + *

    Create a switch with an ID, name, and initial checked state: + * + * {@snippet : + * import static org.patternfly.component.switch_.Switch.switch_; + * + * // Basic switch with a label + * Switch toggle = switch_("my-switch", "my-switch", true) + * .label("Enable notifications"); + * + * // Reversed layout (label before switch) + * Switch reversed = switch_("reversed", "reversed", true) + * .reversed() + * .label("Reversed layout"); + * + * // Without a label, using a check icon and ARIA label + * Switch noLabel = switch_("no-label", "no-label", true) + * .checkIcon() + * .ariaLabel("Toggle feature"); + * + * // Disabled switch + * Switch disabled = switch_("disabled", "disabled", true) + * .disabled() + * .label("Disabled option"); + * } + * + * @see org.patternfly.component.switch_.Switch + * @see PatternFly Switch + */ +package org.patternfly.component.switch_; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/table/package-info.java b/components/src/main/java/org/patternfly/component/table/package-info.java new file mode 100644 index 000000000..f54fc36e7 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/table/package-info.java @@ -0,0 +1,74 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides table components for displaying structured data in rows and columns. + * + *

    This package contains a composable table implementation with support for captions, header rows, body rows, + * selection (single and multi), compact and borderless variants, tree tables, and wrapping options. Tables are built + * using standard HTML table semantics ({@code thead}, {@code tbody}, {@code tr}, {@code th}, {@code td}). + * + *

    Key Classes

    + * + *
      + *
    • {@link org.patternfly.component.table.Table} - Main table component
    • + *
    • {@link org.patternfly.component.table.Thead} - Table header section
    • + *
    • {@link org.patternfly.component.table.Tbody} - Table body section
    • + *
    • {@link org.patternfly.component.table.Tr} - Table row
    • + *
    • {@link org.patternfly.component.table.Th} - Table header cell
    • + *
    • {@link org.patternfly.component.table.Td} - Table data cell
    • + *
    • {@link org.patternfly.component.table.TableCaption} - Table caption
    • + *
    • {@link org.patternfly.component.table.TableText} - Wrapped/truncated cell text
    • + *
    + * + *

    Usage

    + * + *

    Create a basic table with a caption, header row, and data rows: + * + * {@snippet : + * import static org.patternfly.component.table.Table.table; + * import static org.patternfly.component.table.TableCaption.tableCaption; + * import static org.patternfly.component.table.Tbody.tbody; + * import static org.patternfly.component.table.Td.td; + * import static org.patternfly.component.table.Th.th; + * import static org.patternfly.component.table.Thead.thead; + * import static org.patternfly.component.table.Tr.tr; + * + * Table table = table() + * .addCaption(tableCaption().text("Repositories")) + * .addHead(thead() + * .addRow(tr("head") + * .addItem(th("name").text("Name")) + * .addItem(th("branches").text("Branches")) + * .addItem(th("prs").text("Pull requests")))) + * .addBody(tbody() + * .addRow(tr("row-0") + * .addItem(td("Name").text("Repository 1")) + * .addItem(td("Branches").text("10")) + * .addItem(td("Pull requests").text("25")))); + * } + * + *

    Create a compact table without borders: + * + * {@snippet : + * import static org.patternfly.component.table.Table.table; + * + * Table compact = table().compact(true).noBorders(true); + * } + * + * @see org.patternfly.component.table.Table + * @see PatternFly Table + */ +package org.patternfly.component.table; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/tabs/package-info.java b/components/src/main/java/org/patternfly/component/tabs/package-info.java new file mode 100644 index 000000000..15e228d0f --- /dev/null +++ b/components/src/main/java/org/patternfly/component/tabs/package-info.java @@ -0,0 +1,72 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides a tabs component for organizing content into separate views within the same page. + * + *

    Tabs allow users to switch between groups of related content. This package supports horizontal and vertical + * layouts, box and secondary styling variants, disabled tabs, ARIA-disabled tabs with tooltip support, expandable + * vertical tabs, and overflow handling. + * + *

    Key Classes

    + * + *
      + *
    • {@link org.patternfly.component.tabs.Tabs} - Main tabs container
    • + *
    • {@link org.patternfly.component.tabs.Tab} - Individual tab with label and content
    • + *
    • {@link org.patternfly.component.tabs.TabContent} - Content panel for a tab
    • + *
    • {@link org.patternfly.component.tabs.TabContentBody} - Body within tab content
    • + *
    • {@link org.patternfly.component.tabs.OverflowTab} - Overflow tab for responsive handling
    • + *
    + * + *

    Usage

    + * + *

    Create tabs with content panels: + * + * {@snippet : + * import static org.patternfly.component.tabs.Tab.tab; + * import static org.patternfly.component.tabs.TabContent.tabContent; + * import static org.patternfly.component.tabs.Tabs.tabs; + * + * Tabs tabs = tabs() + * .addItem(tab("users", "Users") + * .addContent(tabContent().text("Users content"))) + * .addItem(tab("containers", "Containers") + * .addContent(tabContent().text("Containers content"))) + * .addItem(tab("database", "Database") + * .addContent(tabContent().text("Database content"))) + * .addItem(tab("disabled", "Disabled") + * .disabled() + * .addContent(tabContent().text("Disabled content"))); + * } + * + *

    Create vertical tabs with box styling: + * + * {@snippet : + * import static org.patternfly.component.tabs.Tab.tab; + * import static org.patternfly.component.tabs.TabContent.tabContent; + * import static org.patternfly.component.tabs.Tabs.tabs; + * + * Tabs verticalTabs = tabs().vertical().box(true) + * .addItem(tab("tab-1", "Tab 1") + * .addContent(tabContent().text("Tab 1 content"))) + * .addItem(tab("tab-2", "Tab 2") + * .addContent(tabContent().text("Tab 2 content"))); + * } + * + * @see org.patternfly.component.tabs.Tabs + * @see org.patternfly.component.tabs.Tab + * @see PatternFly Tabs + */ +package org.patternfly.component.tabs; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/textinputgroup/package-info.java b/components/src/main/java/org/patternfly/component/textinputgroup/package-info.java new file mode 100644 index 000000000..c632fd20b --- /dev/null +++ b/components/src/main/java/org/patternfly/component/textinputgroup/package-info.java @@ -0,0 +1,68 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides text input group components for search, filter, and text input with utilities. + * + *

    A text input group is an input component with additional capabilities such as icons, search utilities (clear + * button), and filter labels. This package includes a base text input group, a search input with built-in clear + * functionality, and a filter input that supports adding and removing filter labels. + * + *

    Key Classes

    + * + *
      + *
    • {@link org.patternfly.component.textinputgroup.TextInputGroup} - Base text input group
    • + *
    • {@link org.patternfly.component.textinputgroup.SearchInput} - Text input with search and clear utilities
    • + *
    • {@link org.patternfly.component.textinputgroup.FilterInput} - Text input with filter label management
    • + *
    • {@link org.patternfly.component.textinputgroup.TextInputGroupUtilities} - Utility buttons (clear, etc.)
    • + *
    + * + *

    Usage

    + * + *

    Create a basic text input group or a search input with an icon: + * + * {@snippet : + * import static org.patternfly.component.textinputgroup.SearchInput.searchInput; + * import static org.patternfly.component.textinputgroup.TextInputGroup.textInputGroup; + * import static org.patternfly.icon.IconSets.fas.search; + * + * // Basic text input group + * TextInputGroup basic = textInputGroup("my-input"); + * + * // Disabled text input group + * TextInputGroup disabled = textInputGroup("disabled-input", "Disabled").disabled(); + * + * // Search input with icon + * SearchInput searchInput = searchInput("search-0").icon(search()); + * } + * + *

    Create a filter input with label management: + * + * {@snippet : + * import static org.patternfly.component.textinputgroup.FilterInput.filterInput; + * import static org.patternfly.icon.IconSets.fas.search; + * + * FilterInput filterInput = filterInput("filter-0").icon(search()) + * .allowDuplicates(false) + * .onAdd((fi, filter) -> console.log("Filter added: " + filter.text())) + * .onRemove((fi, filter) -> console.log("Filter removed: " + filter.text())); + * } + * + * @see org.patternfly.component.textinputgroup.TextInputGroup + * @see org.patternfly.component.textinputgroup.SearchInput + * @see org.patternfly.component.textinputgroup.FilterInput + * @see PatternFly Text Input Group + */ +package org.patternfly.component.textinputgroup; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/timestamp/package-info.java b/components/src/main/java/org/patternfly/component/timestamp/package-info.java new file mode 100644 index 000000000..bd3e92323 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/timestamp/package-info.java @@ -0,0 +1,78 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides a timestamp component for displaying dates and times in various formats. + * + *

    The timestamp component renders a date/time value with support for predefined formats (short, medium, long, full), + * custom formatting options, UTC display, display suffixes, and custom content. It wraps the JavaScript + * {@code Intl.DateTimeFormat} API for locale-aware formatting. + * + *

    Key Classes

    + * + *
      + *
    • {@link org.patternfly.component.timestamp.Timestamp} - Main timestamp component
    • + *
    • {@link org.patternfly.component.timestamp.TimestampFormat} - Predefined format options (short, medium, long, full)
    • + *
    • {@link org.patternfly.component.timestamp.CustomFormat} - Custom date/time format configuration
    • + *
    • {@link org.patternfly.component.timestamp.DateTimeFormatOptions} - Options for individual date/time fields
    • + *
    + * + *

    Usage

    + * + *

    Create timestamps with various formats: + * + * {@snippet : + * import static org.patternfly.component.timestamp.Timestamp.timestamp; + * import org.patternfly.component.timestamp.TimestampFormat; + * + * // Default timestamp (current date/time) + * Timestamp now = timestamp(); + * + * // UTC display + * Timestamp utc = timestamp().utc(true); + * + * // With predefined date and time formats + * Timestamp formatted = timestamp() + * .dateFormat(TimestampFormat.full) + * .timeFormat(TimestampFormat._short); + * + * // With a display suffix + * Timestamp withSuffix = timestamp() + * .dateFormat(TimestampFormat.medium) + * .timeFormat(TimestampFormat._short) + * .displaySuffix("US Eastern"); + * } + * + *

    Create a timestamp with custom format options: + * + * {@snippet : + * import static org.patternfly.component.timestamp.Timestamp.timestamp; + * import org.patternfly.component.timestamp.CustomFormat; + * import org.patternfly.component.timestamp.DateTimeFormatOptions.*; + * + * Timestamp custom = timestamp() + * .customFormat(CustomFormat.create() + * .weekday(Weekday._short) + * .day(Day.numeric) + * .month(Month._short) + * .year(Year._2digit) + * .hour(Hour._2digit)); + * } + * + * @see org.patternfly.component.timestamp.Timestamp + * @see org.patternfly.component.timestamp.TimestampFormat + * @see PatternFly Timestamp + */ +package org.patternfly.component.timestamp; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/title/package-info.java b/components/src/main/java/org/patternfly/component/title/package-info.java new file mode 100644 index 000000000..1bb09e6de --- /dev/null +++ b/components/src/main/java/org/patternfly/component/title/package-info.java @@ -0,0 +1,51 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides a title component for styled heading elements. + * + *

    The title component renders heading elements ({@code h1} through {@code h6}) with PatternFly styling. + * Each heading level has a default size, but custom sizes can be applied independently of the heading level, + * allowing visual flexibility while maintaining semantic HTML structure. + * + *

    Usage

    + * + *

    Create titles with default sizes based on heading level: + * + * {@snippet : + * import static org.patternfly.component.title.Title.title; + * + * Title h1 = title(1, "Main heading"); + * Title h2 = title(2, "Sub heading"); + * Title h3 = title(3, "Section heading"); + * } + * + *

    Create titles with custom sizes independent of the heading level: + * + * {@snippet : + * import static org.patternfly.component.title.Title.title; + * import static org.patternfly.style.Size._4xl; + * import static org.patternfly.style.Size.lg; + * import static org.patternfly.style.Size.md; + * + * Title large = title(1, _4xl, "Extra large title"); + * Title medium = title(3, lg, "Large-sized h3"); + * Title small = title(6, md, "Medium-sized h6"); + * } + * + * @see org.patternfly.component.title.Title + * @see PatternFly Title + */ +package org.patternfly.component.title; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/togglegroup/package-info.java b/components/src/main/java/org/patternfly/component/togglegroup/package-info.java new file mode 100644 index 000000000..089c5309e --- /dev/null +++ b/components/src/main/java/org/patternfly/component/togglegroup/package-info.java @@ -0,0 +1,62 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides a toggle group component for selecting one or multiple options from a group of buttons. + * + *

    A toggle group is a set of toggle items that can operate in single-select or multi-select mode. Items + * can display text, icons, or both, and support compact and disabled states. + * + *

    Key Classes

    + * + *
      + *
    • {@link org.patternfly.component.togglegroup.ToggleGroup} - Main toggle group container
    • + *
    • {@link org.patternfly.component.togglegroup.ToggleGroupItem} - Individual toggle button
    • + *
    + * + *

    Usage

    + * + *

    Create a single-select toggle group: + * + * {@snippet : + * import static org.patternfly.component.SelectionMode.single; + * import static org.patternfly.component.togglegroup.ToggleGroup.toggleGroup; + * import static org.patternfly.component.togglegroup.ToggleGroupItem.toggleGroupItem; + * + * ToggleGroup group = toggleGroup(single) + * .addItem(toggleGroupItem("option-1", "Option 1")) + * .addItem(toggleGroupItem("option-2", "Option 2")) + * .addItem(toggleGroupItem("option-3", "Option 3")); + * } + * + *

    Create a multi-select toggle group with icons: + * + * {@snippet : + * import static org.patternfly.component.SelectionMode.multi; + * import static org.patternfly.component.togglegroup.ToggleGroup.toggleGroup; + * import static org.patternfly.component.togglegroup.ToggleGroupItem.toggleGroupItem; + * import static org.patternfly.icon.IconSets.fas.copy; + * import static org.patternfly.icon.IconSets.fas.undo; + * + * ToggleGroup iconGroup = toggleGroup(multi) + * .addItem(toggleGroupItem("copy").iconAndText(copy(), "Copy")) + * .addItem(toggleGroupItem("undo").iconAndText(undo(), "Undo")); + * } + * + * @see org.patternfly.component.togglegroup.ToggleGroup + * @see org.patternfly.component.togglegroup.ToggleGroupItem + * @see PatternFly Toggle Group + */ +package org.patternfly.component.togglegroup; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/toolbar/package-info.java b/components/src/main/java/org/patternfly/component/toolbar/package-info.java new file mode 100644 index 000000000..ab9d1d28e --- /dev/null +++ b/components/src/main/java/org/patternfly/component/toolbar/package-info.java @@ -0,0 +1,80 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides a toolbar component for organizing actions, filters, and controls in a horizontal layout. + * + *

    A toolbar is a container for grouping related controls such as search inputs, buttons, filters, and + * pagination. It supports content sections, item and group types, toggle groups for responsive behavior, + * filter label groups, adjustable insets, sticky positioning, and color variants. + * + *

    Key Classes

    + * + *
      + *
    • {@link org.patternfly.component.toolbar.Toolbar} - Main toolbar container
    • + *
    • {@link org.patternfly.component.toolbar.ToolbarContent} - Content section within a toolbar
    • + *
    • {@link org.patternfly.component.toolbar.ToolbarGroup} - Group of toolbar items
    • + *
    • {@link org.patternfly.component.toolbar.ToolbarItem} - Individual toolbar item
    • + *
    • {@link org.patternfly.component.toolbar.ToolbarToggleGroup} - Responsive toggle group
    • + *
    • {@link org.patternfly.component.toolbar.ToolbarFilterContent} - Filter content with label groups
    • + *
    • {@link org.patternfly.component.toolbar.ToolbarGroupType} - Typed group variants (action, filter, etc.)
    • + *
    + * + *

    Usage

    + * + *

    Create a toolbar with search input and action buttons: + * + * {@snippet : + * import static org.patternfly.component.button.Button.button; + * import static org.patternfly.component.textinputgroup.SearchInput.searchInput; + * import static org.patternfly.component.toolbar.Toolbar.toolbar; + * import static org.patternfly.component.toolbar.ToolbarContent.toolbarContent; + * import static org.patternfly.component.toolbar.ToolbarItem.toolbarItem; + * + * Toolbar toolbar = toolbar() + * .addContent(toolbarContent() + * .addItem(toolbarItem() + * .add(searchInput("search-0"))) + * .addItem(toolbarItem() + * .add(button("Action").secondary())) + * .addDivider() + * .addItem(toolbarItem() + * .add(button("Primary").primary()))); + * } + * + *

    Create a toolbar with grouped action buttons: + * + * {@snippet : + * import static org.patternfly.component.button.Button.button; + * import static org.patternfly.component.toolbar.Toolbar.toolbar; + * import static org.patternfly.component.toolbar.ToolbarContent.toolbarContent; + * import static org.patternfly.component.toolbar.ToolbarGroup.toolbarGroup; + * import static org.patternfly.component.toolbar.ToolbarGroupType.actionGroup; + * import static org.patternfly.component.toolbar.ToolbarItem.toolbarItem; + * + * Toolbar grouped = toolbar() + * .addContent(toolbarContent() + * .addGroup(toolbarGroup(actionGroup) + * .addItem(toolbarItem().add(button("Edit").secondary())) + * .addItem(toolbarItem().add(button("Clone").secondary()))) + * .addDivider() + * .addGroup(toolbarGroup(actionGroup) + * .addItem(toolbarItem().add(button("Save").primary())))); + * } + * + * @see org.patternfly.component.toolbar.Toolbar + * @see PatternFly Toolbar + */ +package org.patternfly.component.toolbar; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/tooltip/package-info.java b/components/src/main/java/org/patternfly/component/tooltip/package-info.java new file mode 100644 index 000000000..6fc78b612 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/tooltip/package-info.java @@ -0,0 +1,61 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides a tooltip component for displaying contextual information on hover or focus. + * + *

    A tooltip is a small overlay that appears near a trigger element to provide additional information. + * Tooltips are referenced by a CSS selector pointing to the trigger element, support configurable placements + * (top, bottom, left, right), dynamic content updates, and close event handlers. + * + *

    Key Classes

    + * + *
      + *
    • {@link org.patternfly.component.tooltip.Tooltip} - Main tooltip component
    • + *
    • {@link org.patternfly.component.tooltip.TriggerAria} - ARIA configuration for trigger elements
    • + *
    + * + *

    Usage

    + * + *

    Create a tooltip attached to a trigger element: + * + * {@snippet : + * import static org.jboss.elemento.By; + * import static org.patternfly.component.button.Button.button; + * import static org.patternfly.component.tooltip.Tooltip.tooltip; + * + * button("Hover me").primary().id("my-button"); + * tooltip(By.id("my-button"), "This is a tooltip"); + * } + * + *

    Create a tooltip with placement and dynamic content: + * + * {@snippet : + * import static org.jboss.elemento.By; + * import static org.patternfly.component.tooltip.Tooltip.tooltip; + * import static org.patternfly.style.Placement.bottom; + * + * Tooltip tooltip = tooltip(By.id("copy-button"), "Copy to clipboard") + * .placement(bottom) + * .onClose((e, t) -> t.text("Copy to clipboard")); + * + * // Update content dynamically + * tooltip.text("Successfully copied!"); + * } + * + * @see org.patternfly.component.tooltip.Tooltip + * @see PatternFly Tooltip + */ +package org.patternfly.component.tooltip; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/tree/package-info.java b/components/src/main/java/org/patternfly/component/tree/package-info.java new file mode 100644 index 000000000..ff9e60299 --- /dev/null +++ b/components/src/main/java/org/patternfly/component/tree/package-info.java @@ -0,0 +1,67 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides a tree view component for displaying hierarchical data. + * + *

    A tree view renders data in a hierarchical structure with expandable/collapsible nodes. It supports + * selectable items, checkboxes, custom icons, action buttons, and lazy loading of child items. Tree view + * items can be nested to any depth. + * + *

    Key Classes

    + * + *
      + *
    • {@link org.patternfly.component.tree.TreeView} - Main tree view component
    • + *
    • {@link org.patternfly.component.tree.TreeViewItem} - Individual node in the tree
    • + *
    • {@link org.patternfly.component.tree.TreeViewType} - Tree view variants (selectable, checkboxes)
    • + *
    + * + *

    Usage

    + * + *

    Create a basic tree view with nested items: + * + * {@snippet : + * import static org.patternfly.component.tree.TreeView.treeView; + * import static org.patternfly.component.tree.TreeViewItem.treeViewItem; + * + * TreeView tree = treeView() + * .addItem(treeViewItem("app-launcher", "Application launcher") + * .addItem(treeViewItem("app-1", "Application 1") + * .addItem(treeViewItem("settings", "Settings")) + * .addItem(treeViewItem("current", "Current"))) + * .addItem(treeViewItem("app-2", "Application 2"))) + * .addItem(treeViewItem("cost", "Cost management") + * .addItem(treeViewItem("app-3", "Application 3"))); + * } + * + *

    Create a tree view with checkboxes: + * + * {@snippet : + * import static org.patternfly.component.tree.TreeView.treeView; + * import static org.patternfly.component.tree.TreeViewItem.treeViewItem; + * import static org.patternfly.component.tree.TreeViewType.checkboxes; + * + * TreeView checkboxTree = treeView(checkboxes) + * .addItem(treeViewItem("item-1", "Item 1") + * .addItem(treeViewItem("child-1", "Child 1")) + * .addItem(treeViewItem("child-2", "Child 2"))) + * .addItem(treeViewItem("item-2", "Item 2")); + * } + * + * @see org.patternfly.component.tree.TreeView + * @see org.patternfly.component.tree.TreeViewItem + * @see PatternFly Tree View + */ +package org.patternfly.component.tree; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/truncate/package-info.java b/components/src/main/java/org/patternfly/component/truncate/package-info.java new file mode 100644 index 000000000..424f855bf --- /dev/null +++ b/components/src/main/java/org/patternfly/component/truncate/package-info.java @@ -0,0 +1,52 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides a truncate component for shortening long text with an ellipsis. + * + *

    The truncate component shortens text that overflows its container, showing an ellipsis at the end, + * middle, or start of the text. A tooltip with the full text is shown on hover. + * + *

    Key Classes

    + * + *
      + *
    • {@link org.patternfly.component.truncate.Truncate} - Main truncate component
    • + *
    • {@link org.patternfly.component.truncate.TruncatePosition} - Position of the ellipsis (end, middle, start)
    • + *
    + * + *

    Usage

    + * + *

    Truncate text at different positions: + * + * {@snippet : + * import static org.patternfly.component.truncate.Truncate.truncate; + * import static org.patternfly.component.truncate.TruncatePosition.middle; + * import static org.patternfly.component.truncate.TruncatePosition.start; + * + * // Default truncation (at the end) + * Truncate endTruncate = truncate("This is a very long text that will be truncated at the end"); + * + * // Truncation in the middle (useful for file names) + * Truncate middleTruncate = truncate("redhat_logo_black_and_white_reversed_simple.zip", middle); + * + * // Truncation at the start + * Truncate startTruncate = truncate("This is a very long text that will be truncated at the start", start); + * } + * + * @see org.patternfly.component.truncate.Truncate + * @see org.patternfly.component.truncate.TruncatePosition + * @see PatternFly Truncate + */ +package org.patternfly.component.truncate; \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/wizard/package-info.java b/components/src/main/java/org/patternfly/component/wizard/package-info.java new file mode 100644 index 000000000..0cc7be03f --- /dev/null +++ b/components/src/main/java/org/patternfly/component/wizard/package-info.java @@ -0,0 +1,61 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides a wizard component for guiding users through a multi-step workflow. + * + *

    A wizard presents a series of steps with navigation, back/next buttons, and optional validation. + * It supports step types (default, review, summary), custom headers with title and description, custom + * footers, step enter/leave handlers, and asynchronous next/previous handlers using promises. + * + *

    Key Classes

    + * + *
      + *
    • {@link org.patternfly.component.wizard.Wizard} - Main wizard component
    • + *
    • {@link org.patternfly.component.wizard.WizardStep} - Individual wizard step with content
    • + *
    • {@link org.patternfly.component.wizard.WizardHeader} - Custom wizard header
    • + *
    • {@link org.patternfly.component.wizard.WizardHeaderTitle} - Title within the wizard header
    • + *
    • {@link org.patternfly.component.wizard.WizardHeaderDescription} - Description within the wizard header
    • + *
    • {@link org.patternfly.component.wizard.WizardFooter} - Custom wizard footer with buttons
    • + *
    • {@link org.patternfly.component.wizard.WizardNav} - Navigation sidebar
    • + *
    • {@link org.patternfly.component.wizard.WizardNavItem} - Navigation item for a step
    • + *
    • {@link org.patternfly.component.wizard.WizardStepType} - Step type variants (default, review, summary)
    • + *
    • {@link org.patternfly.component.wizard.WizardContext} - Shared context across wizard steps
    • + *
    + * + *

    Usage

    + * + *

    Create a basic wizard with steps: + * + * {@snippet : + * import static org.jboss.elemento.Elements.p; + * import static org.patternfly.component.wizard.Wizard.wizard; + * import static org.patternfly.component.wizard.WizardStep.wizardStep; + * import static org.patternfly.component.wizard.WizardStepType.review; + * + * Wizard wizard = wizard().height(400) + * .addItem(wizardStep("step-0", "Step 1") + * .add(p().text("Step 1 content"))) + * .addItem(wizardStep("step-1", "Step 2") + * .add(p().text("Step 2 content"))) + * .addItem(wizardStep("step-2", "Review", review) + * .add(p().text("Review your selections"))); + * } + * + * @see org.patternfly.component.wizard.Wizard + * @see org.patternfly.component.wizard.WizardStep + * @see PatternFly Wizard + */ +package org.patternfly.component.wizard; \ No newline at end of file diff --git a/core/src/main/java/org/patternfly/handler/package-info.java b/core/src/main/java/org/patternfly/handler/package-info.java index e9b371b75..8c41b2967 100644 --- a/core/src/main/java/org/patternfly/handler/package-info.java +++ b/core/src/main/java/org/patternfly/handler/package-info.java @@ -30,6 +30,7 @@ *

  • {@link org.patternfly.handler.ToggleHandler} - Handler for expand/collapse toggle events
  • *
  • {@link org.patternfly.handler.CloseHandler} - Handler for close/dismiss events
  • *
  • {@link org.patternfly.handler.ResizeHandler} - Handler for resize events with dimensions
  • + *
  • {@link org.patternfly.handler.OverlayHandler} - Handler for overlay visibility changes
  • * * *

    Usage Examples

    diff --git a/core/src/main/java/org/patternfly/overlay/Overlay.java b/core/src/main/java/org/patternfly/overlay/Overlay.java index 33dbc56ca..b42812b6b 100644 --- a/core/src/main/java/org/patternfly/overlay/Overlay.java +++ b/core/src/main/java/org/patternfly/overlay/Overlay.java @@ -27,6 +27,7 @@ import org.patternfly.handler.OverlayHandler; import org.patternfly.style.Classes; import org.patternfly.style.Placement; + import elemental2.dom.DOMRect; import elemental2.dom.Element; import elemental2.dom.Event; diff --git a/core/src/main/java/org/patternfly/popper/package-info.java b/core/src/main/java/org/patternfly/popper/package-info.java new file mode 100644 index 000000000..4e9f92165 --- /dev/null +++ b/core/src/main/java/org/patternfly/popper/package-info.java @@ -0,0 +1,26 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Deprecated JavaScript-based positioning using Popper.js. + * + *

    This package has been replaced by {@link org.patternfly.overlay} which uses the native + * Popover API and + * CSS Anchor Positioning. + * + * @deprecated Use {@link org.patternfly.overlay} instead. + */ +@Deprecated +package org.patternfly.popper; \ No newline at end of file diff --git a/layouts/src/main/java/org/patternfly/layout/bullseye/package-info.java b/layouts/src/main/java/org/patternfly/layout/bullseye/package-info.java new file mode 100644 index 000000000..63dc296cf --- /dev/null +++ b/layouts/src/main/java/org/patternfly/layout/bullseye/package-info.java @@ -0,0 +1,39 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly bullseye layout for centering content both vertically and horizontally within a container. + *

    + * The bullseye layout is useful for centering a single piece of content, such as a login form, empty state, or loading + * indicator, within a larger container. + * + *

    Usage

    + * + * Center content using the bullseye layout: + * + * {@snippet : + * import static org.patternfly.layout.bullseye.Bullseye.bullseye; + * import static org.patternfly.layout.bullseye.BullseyeItem.bullseyeItem; + * + * bullseye() + * .addItem(bullseyeItem() + * .text("Centered content")); + * } + * + * @see Bullseye + * @see BullseyeItem + * @see PatternFly Bullseye + */ +package org.patternfly.layout.bullseye; \ No newline at end of file diff --git a/layouts/src/main/java/org/patternfly/layout/flex/package-info.java b/layouts/src/main/java/org/patternfly/layout/flex/package-info.java new file mode 100644 index 000000000..c8df4c70d --- /dev/null +++ b/layouts/src/main/java/org/patternfly/layout/flex/package-info.java @@ -0,0 +1,64 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly flex layout for building custom layouts with full control over spacing, direction, alignment, + * justification, wrapping, and width. + *

    + * The flex layout utilizes the PatternFly spacer and breakpoint systems to create completely custom layouts. It supports + * nesting flex containers, individual item spacing, responsive breakpoints, and various alignment and justification options. + * + *

    Usage

    + * + * A basic flex layout with items: + * + * {@snippet : + * import static org.patternfly.layout.flex.Flex.flex; + * import static org.patternfly.layout.flex.FlexItem.flexItem; + * + * flex() + * .addItem(flexItem().text("Flex item")) + * .addItem(flexItem().text("Flex item")) + * .addItem(flexItem().text("Flex item")); + * } + * + * A flex layout with custom spacing and responsive direction: + * + * {@snippet : + * import static org.patternfly.layout.flex.Flex.flex; + * import static org.patternfly.layout.flex.FlexItem.flexItem; + * import static org.patternfly.style.Breakpoint.default_; + * import static org.patternfly.style.Breakpoint.lg; + * import static org.patternfly.style.Breakpoints.breakpoints; + * + * flex() + * .direction(breakpoints(default_, Direction.column, lg, Direction.row)) + * .spaceItems(breakpoints(default_, SpaceItems.md)) + * .addItem(flexItem().text("Item 1")) + * .addItem(flexItem().text("Item 2")) + * .addItem(flexItem().text("Item 3")); + * } + * + * @see Flex + * @see FlexItem + * @see Direction + * @see SpaceItems + * @see Spacer + * @see AlignItems + * @see JustifyContent + * @see Gap + * @see PatternFly Flex + */ +package org.patternfly.layout.flex; \ No newline at end of file diff --git a/layouts/src/main/java/org/patternfly/layout/gallery/package-info.java b/layouts/src/main/java/org/patternfly/layout/gallery/package-info.java new file mode 100644 index 000000000..9e03b8e9c --- /dev/null +++ b/layouts/src/main/java/org/patternfly/layout/gallery/package-info.java @@ -0,0 +1,60 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly gallery layout for arranging content in a responsive grid with uniform rows and columns that wrap + * automatically. + *

    + * The gallery layout is useful for displaying a collection of similarly structured items, such as cards or tiles, in a + * responsive grid. It supports gutters for spacing between items and allows adjusting minimum and maximum widths at different + * breakpoints. + * + *

    Usage

    + * + * A basic gallery with gutters: + * + * {@snippet : + * import static org.patternfly.layout.gallery.Gallery.gallery; + * import static org.patternfly.layout.gallery.GalleryItem.galleryItem; + * + * gallery().gutter() + * .addItem(galleryItem().text("Gallery item")) + * .addItem(galleryItem().text("Gallery item")) + * .addItem(galleryItem().text("Gallery item")) + * .addItem(galleryItem().text("Gallery item")); + * } + * + * A gallery with responsive minimum widths: + * + * {@snippet : + * import static org.patternfly.core.Tuple.tuple; + * import static org.patternfly.layout.gallery.Gallery.gallery; + * import static org.patternfly.layout.gallery.GalleryItem.galleryItem; + * import static org.patternfly.style.Breakpoint.lg; + * import static org.patternfly.style.Breakpoint.md; + * import static org.patternfly.style.Breakpoint.xl; + * + * gallery().gutter() + * .minWidths(tuple(md, "100px"), tuple(lg, "150px"), tuple(xl, "200px")) + * .addItem(galleryItem().text("Gallery item")) + * .addItem(galleryItem().text("Gallery item")) + * .addItem(galleryItem().text("Gallery item")); + * } + * + * @see Gallery + * @see GalleryItem + * @see PatternFly Gallery + */ +package org.patternfly.layout.gallery; \ No newline at end of file diff --git a/layouts/src/main/java/org/patternfly/layout/grid/package-info.java b/layouts/src/main/java/org/patternfly/layout/grid/package-info.java new file mode 100644 index 000000000..4770a9c74 --- /dev/null +++ b/layouts/src/main/java/org/patternfly/layout/grid/package-info.java @@ -0,0 +1,59 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly grid layout for placing content on a fixed 12-column grid system. + *

    + * The grid layout allows positioning items across 12 columns with support for spanning multiple columns and rows, gutters for + * spacing, responsive column overrides at different breakpoints, and ordering control. + * + *

    Usage

    + * + * A basic grid layout with column spans and gutters: + * + * {@snippet : + * import static org.patternfly.layout.grid.Grid.grid; + * import static org.patternfly.layout.grid.GridItem.gridItem; + * + * grid().gutter() + * .addItem(gridItem().span(8).text("Main content")) + * .addItem(gridItem().span(4).text("Sidebar")) + * .addItem(gridItem().span(4).text("Footer left")) + * .addItem(gridItem().span(8).text("Footer right")); + * } + * + * A grid with responsive column overrides: + * + * {@snippet : + * import static org.patternfly.layout.grid.Grid.grid; + * import static org.patternfly.layout.grid.GridItem.gridItem; + * import static org.patternfly.style.Breakpoint._2xl; + * import static org.patternfly.style.Breakpoint.lg; + * import static org.patternfly.style.Breakpoint.md; + * import static org.patternfly.style.Breakpoint.sm; + * import static org.patternfly.style.Breakpoints.breakpoints; + * + * grid().columns(breakpoints(sm, 6, md, 4, lg, 3, _2xl, 1)) + * .addItem(gridItem().text("Grid item")) + * .addItem(gridItem().text("Grid item")) + * .addItem(gridItem().text("Grid item")) + * .addItem(gridItem().text("Grid item")); + * } + * + * @see Grid + * @see GridItem + * @see PatternFly Grid + */ +package org.patternfly.layout.grid; \ No newline at end of file diff --git a/layouts/src/main/java/org/patternfly/layout/level/package-info.java b/layouts/src/main/java/org/patternfly/layout/level/package-info.java new file mode 100644 index 000000000..42378ad05 --- /dev/null +++ b/layouts/src/main/java/org/patternfly/layout/level/package-info.java @@ -0,0 +1,52 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly level layout for distributing content evenly across a horizontal row. + *

    + * The level layout is useful for creating horizontal rows where items are distributed evenly, such as toolbars, status bars, + * or summary sections. It supports gutters for spacing between items. + * + *

    Usage

    + * + * A basic level layout: + * + * {@snippet : + * import static org.patternfly.layout.level.Level.level; + * import static org.patternfly.layout.level.LevelItem.levelItem; + * + * level() + * .addItem(levelItem().text("Level item")) + * .addItem(levelItem().text("Level item")) + * .addItem(levelItem().text("Level item")); + * } + * + * A level layout with gutters: + * + * {@snippet : + * import static org.patternfly.layout.level.Level.level; + * import static org.patternfly.layout.level.LevelItem.levelItem; + * + * level().gutter() + * .addItem(levelItem().text("Level item")) + * .addItem(levelItem().text("Level item")) + * .addItem(levelItem().text("Level item")); + * } + * + * @see Level + * @see LevelItem + * @see PatternFly Level + */ +package org.patternfly.layout.level; \ No newline at end of file diff --git a/layouts/src/main/java/org/patternfly/layout/split/package-info.java b/layouts/src/main/java/org/patternfly/layout/split/package-info.java new file mode 100644 index 000000000..c75e217ec --- /dev/null +++ b/layouts/src/main/java/org/patternfly/layout/split/package-info.java @@ -0,0 +1,54 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly split layout for distributing content horizontally with support for a fill item, wrapping, and + * spacing control. + *

    + * The split layout positions items side by side. One item can use {@code fill()} to take up the remaining horizontal space. + * The layout also supports gutters for spacing and wrapping when items overflow. + * + *

    Usage

    + * + * A basic split layout with a fill item: + * + * {@snippet : + * import static org.patternfly.layout.split.Split.split; + * import static org.patternfly.layout.split.SplitItem.splitItem; + * + * split() + * .addItem(splitItem().text("content")) + * .addItem(splitItem().fill().text("pf-m-fill")) + * .addItem(splitItem().text("content")); + * } + * + * A wrappable split layout with gutters: + * + * {@snippet : + * import static org.patternfly.layout.split.Split.split; + * import static org.patternfly.layout.split.SplitItem.splitItem; + * + * split().wrap().gutter() + * .addItem(splitItem().text("content")) + * .addItem(splitItem().text("content")) + * .addItem(splitItem().text("content")) + * .addItem(splitItem().text("content")); + * } + * + * @see Split + * @see SplitItem + * @see PatternFly Split + */ +package org.patternfly.layout.split; \ No newline at end of file diff --git a/layouts/src/main/java/org/patternfly/layout/stack/package-info.java b/layouts/src/main/java/org/patternfly/layout/stack/package-info.java new file mode 100644 index 000000000..3ffc33f89 --- /dev/null +++ b/layouts/src/main/java/org/patternfly/layout/stack/package-info.java @@ -0,0 +1,53 @@ +/* + * Copyright 2023 Red Hat + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Provides the PatternFly stack layout for positioning items vertically, with one or more items filling the available vertical + * space. + *

    + * The stack layout arranges items in a vertical column. One or more items can use {@code fill()} to expand and fill the + * remaining vertical space. The layout also supports gutters for spacing between items. + * + *

    Usage

    + * + * A basic stack layout with a fill item: + * + * {@snippet : + * import static org.patternfly.layout.stack.Stack.stack; + * import static org.patternfly.layout.stack.StackItem.stackItem; + * + * stack() + * .addItem(stackItem().text("Header")) + * .addItem(stackItem().fill().text("Main content")) + * .addItem(stackItem().text("Footer")); + * } + * + * A stack layout with gutters: + * + * {@snippet : + * import static org.patternfly.layout.stack.Stack.stack; + * import static org.patternfly.layout.stack.StackItem.stackItem; + * + * stack().gutter() + * .addItem(stackItem().text("Header")) + * .addItem(stackItem().fill().text("Main content")) + * .addItem(stackItem().text("Footer")); + * } + * + * @see Stack + * @see StackItem + * @see PatternFly Stack + */ +package org.patternfly.layout.stack; \ No newline at end of file From c2100b9a84259de7397cfc3a9b6cdb32f91e4343 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 2 Apr 2026 11:29:15 +0200 Subject: [PATCH 091/430] Release 0.7.0 --- CHANGELOG.md | 129 +++++++++++++++-------------- README.md | 2 +- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 22 files changed, 87 insertions(+), 84 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81f347fb8..8532eb4c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +## [0.7.0] - 2026-04-02 + > [!IMPORTANT] > This release deprecates components based on PopperJS and adds alternatives using the [popover API](https://developer.mozilla.org/en-US/docs/Web/API/Popover_API) and [CSS anchor positioning](https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Anchor_positioning). The PopperJS based components have been renamed to `PopperJS` and reimplemented `` components are the replacements. This might break existing code! @@ -883,130 +885,131 @@ Stay tuned for more to come... - for dependency upgrades --> -[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.16...HEAD -[0.6.16]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.15...v0.6.16 -[0.6.15]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.14...v0.6.15 -[0.6.14]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.13...v0.6.14 -[0.6.13]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.12...v0.6.13 -[0.6.12]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.11...v0.6.12 -[0.6.11]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.10...v0.6.11 -[0.6.10]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.9...v0.6.10 -[0.6.9]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.8...v0.6.9 -[0.6.8]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.7...v0.6.8 -[0.6.7]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.6...v0.6.7 -[0.6.6]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.5...v0.6.6 -[0.6.5]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.4...v0.6.5 -[0.6.4]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.3...v0.6.4 -[0.6.3]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.2...v0.6.3 -[0.6.2]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.1...v0.6.2 -[0.6.1]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.0...v0.6.1 -[0.6.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.5.0...v0.6.0 -[0.5.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.17...v0.5.0 -[0.4.17]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.16...v0.4.17 -[0.4.16]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.15...v0.4.16 -[0.4.15]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.14...v0.4.15 -[0.4.14]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.13...v0.4.14 -[0.4.13]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.12...v0.4.13 -[0.4.12]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.11...v0.4.12 -[0.4.11]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.10...v0.4.11 -[0.4.10]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.9...v0.4.10 -[0.4.9]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.8...v0.4.9 -[0.4.8]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.7...v0.4.8 -[0.4.7]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.6...v0.4.7 -[0.4.6]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.5...v0.4.6 -[0.4.5]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.4...v0.4.5 -[0.4.4]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.3...v0.4.4 -[0.4.3]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.2...v0.4.3 -[0.4.2]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.1...v0.4.2 -[0.4.1]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.0...v0.4.1 -[0.4.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.3.1...v0.4.0 -[0.3.1]: https://github.com/patternfly-java/patternfly-java/compare/v0.3.0...v0.3.1 -[0.3.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.11...v0.3.0 -[0.2.11]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.10...v0.2.11 -[0.2.10]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.9...v0.2.10 -[0.2.9]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.8...v0.2.9 -[0.2.8]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.7...v0.2.8 -[0.2.7]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.6...v0.2.7 -[0.2.6]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.5...v0.2.6 -[0.2.5]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.4...v0.2.5 -[0.2.4]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.3...v0.2.4 -[0.2.3]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.2...v0.2.3 -[0.2.2]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.1...v0.2.2 -[0.2.1]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.0...v0.2.1 -[0.2.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.1.5...v0.2.0 -[0.1.5]: https://github.com/patternfly-java/patternfly-java/compare/v0.1.4...v0.1.5 -[0.1.4]: https://github.com/patternfly-java/patternfly-java/compare/v0.1.3...v0.1.4 -[0.1.3]: https://github.com/patternfly-java/patternfly-java/compare/v0.1.2...v0.1.3 -[0.1.2]: https://github.com/patternfly-java/patternfly-java/compare/v0.1.1...v0.1.2 -[0.1.1]: https://github.com/patternfly-java/patternfly-java/compare/v0.1.0...v0.1.1 -[0.1.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.0.7...v0.1.0 -[0.0.7]: https://github.com/patternfly-java/patternfly-java/compare/v0.0.6...v0.0.7 -[0.0.6]: https://github.com/patternfly-java/patternfly-java/compare/v0.0.5...v0.0.6 -[0.0.5]: https://github.com/patternfly-java/patternfly-java/compare/v0.0.4...v0.0.5 -[0.0.4]: https://github.com/patternfly-java/patternfly-java/compare/v0.0.3...v0.0.4 -[0.0.3]: https://github.com/patternfly-java/patternfly-java/compare/v0.0.2...v0.0.3 -[0.0.2]: https://github.com/patternfly-java/patternfly-java/compare/v0.0.1...v0.0.2 +[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.0...HEAD +[0.7.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.16...v0.7.0 +[0.6.16]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.15...v0.6.16 +[0.6.15]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.14...v0.6.15 +[0.6.14]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.13...v0.6.14 +[0.6.13]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.12...v0.6.13 +[0.6.12]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.11...v0.6.12 +[0.6.11]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.10...v0.6.11 +[0.6.10]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.9...v0.6.10 +[0.6.9]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.8...v0.6.9 +[0.6.8]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.7...v0.6.8 +[0.6.7]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.6...v0.6.7 +[0.6.6]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.5...v0.6.6 +[0.6.5]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.4...v0.6.5 +[0.6.4]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.3...v0.6.4 +[0.6.3]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.2...v0.6.3 +[0.6.2]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.1...v0.6.2 +[0.6.1]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.0...v0.6.1 +[0.6.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.5.0...v0.6.0 +[0.5.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.17...v0.5.0 +[0.4.17]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.16...v0.4.17 +[0.4.16]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.15...v0.4.16 +[0.4.15]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.14...v0.4.15 +[0.4.14]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.13...v0.4.14 +[0.4.13]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.12...v0.4.13 +[0.4.12]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.11...v0.4.12 +[0.4.11]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.10...v0.4.11 +[0.4.10]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.9...v0.4.10 +[0.4.9]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.8...v0.4.9 +[0.4.8]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.7...v0.4.8 +[0.4.7]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.6...v0.4.7 +[0.4.6]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.5...v0.4.6 +[0.4.5]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.4...v0.4.5 +[0.4.4]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.3...v0.4.4 +[0.4.3]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.2...v0.4.3 +[0.4.2]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.1...v0.4.2 +[0.4.1]: https://github.com/patternfly-java/patternfly-java/compare/v0.4.0...v0.4.1 +[0.4.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.3.1...v0.4.0 +[0.3.1]: https://github.com/patternfly-java/patternfly-java/compare/v0.3.0...v0.3.1 +[0.3.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.11...v0.3.0 +[0.2.11]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.10...v0.2.11 +[0.2.10]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.9...v0.2.10 +[0.2.9]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.8...v0.2.9 +[0.2.8]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.7...v0.2.8 +[0.2.7]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.6...v0.2.7 +[0.2.6]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.5...v0.2.6 +[0.2.5]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.4...v0.2.5 +[0.2.4]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.3...v0.2.4 +[0.2.3]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.2...v0.2.3 +[0.2.2]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.1...v0.2.2 +[0.2.1]: https://github.com/patternfly-java/patternfly-java/compare/v0.2.0...v0.2.1 +[0.2.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.1.5...v0.2.0 +[0.1.5]: https://github.com/patternfly-java/patternfly-java/compare/v0.1.4...v0.1.5 +[0.1.4]: https://github.com/patternfly-java/patternfly-java/compare/v0.1.3...v0.1.4 +[0.1.3]: https://github.com/patternfly-java/patternfly-java/compare/v0.1.2...v0.1.3 +[0.1.2]: https://github.com/patternfly-java/patternfly-java/compare/v0.1.1...v0.1.2 +[0.1.1]: https://github.com/patternfly-java/patternfly-java/compare/v0.1.0...v0.1.1 +[0.1.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.0.7...v0.1.0 +[0.0.7]: https://github.com/patternfly-java/patternfly-java/compare/v0.0.6...v0.0.7 +[0.0.6]: https://github.com/patternfly-java/patternfly-java/compare/v0.0.5...v0.0.6 +[0.0.5]: https://github.com/patternfly-java/patternfly-java/compare/v0.0.4...v0.0.5 +[0.0.4]: https://github.com/patternfly-java/patternfly-java/compare/v0.0.3...v0.0.4 +[0.0.3]: https://github.com/patternfly-java/patternfly-java/compare/v0.0.2...v0.0.3 +[0.0.2]: https://github.com/patternfly-java/patternfly-java/compare/v0.0.1...v0.0.2 [0.0.1]: https://github.com/patternfly-java/patternfly-java/compare/vTemplate...v0.0.1 diff --git a/README.md b/README.md index 38b6656be..214d29c1b 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.16 + 0.7.0 pom import diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 1955784d9..f0b02914e 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.17-SNAPSHOT + 0.7.0 ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index a6ec09f5e..db6b2771e 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.6.17-SNAPSHOT + 0.7.0 pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index 1752405dd..b37d77b43 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.17-SNAPSHOT + 0.7.0 ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 3afba1876..638a1bd5a 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.6.17-SNAPSHOT", + "version": "0.7.0", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index d4199de05..79a57d2b0 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.17-SNAPSHOT + 0.7.0 ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 08b26365a..5a7942273 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.6.17-SNAPSHOT + 0.7.0 ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 682d1bd50..8564b883a 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.17-SNAPSHOT + 0.7.0 ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 3c46c5cb2..017410061 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.6.17-SNAPSHOT", + "version": "0.7.0", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index c51c28457..a7e55420e 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.17-SNAPSHOT + 0.7.0 ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index eca6061de..82bdc3fe2 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.17-SNAPSHOT + 0.7.0 ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index f1217072c..66474382f 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.6.17-SNAPSHOT", + "version": "0.7.0", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index f9cb2d1ba..2dae75be4 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.17-SNAPSHOT + 0.7.0 ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index c0b32584b..a638e7849 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.17-SNAPSHOT + 0.7.0 ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index a062911ff..35266160e 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.17-SNAPSHOT + 0.7.0 ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 749a5c708..3d1655d2c 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.17-SNAPSHOT + 0.7.0 ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index a6ff56ca6..1ded45e03 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.17-SNAPSHOT + 0.7.0 ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 5af2b273c..2c56db9b8 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.6.17-SNAPSHOT + 0.7.0 pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index 6555782b6..45875b871 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.17-SNAPSHOT + 0.7.0 ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 31c46bcdd..ede80bdc0 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.6.17-SNAPSHOT + 0.7.0 pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 92d4af0fa..fc99cc6b0 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.6.17-SNAPSHOT + 0.7.0 ../code-parent/pom.xml From 5688313a685acf0185496930246d9c88de4bf06d Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 2 Apr 2026 11:29:24 +0200 Subject: [PATCH 092/430] Next is 0.7.1 --- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apidoc/pom.xml b/apidoc/pom.xml index f0b02914e..808b763de 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.0 + 0.7.1-SNAPSHOT ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index db6b2771e..4c2a8e074 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.7.0 + 0.7.1-SNAPSHOT pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index b37d77b43..55046a2e8 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.0 + 0.7.1-SNAPSHOT ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 638a1bd5a..c075ae188 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.7.0", + "version": "0.7.1-SNAPSHOT", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 79a57d2b0..fb7e11bc6 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.0 + 0.7.1-SNAPSHOT ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 5a7942273..c6539dc81 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.0 + 0.7.1-SNAPSHOT ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 8564b883a..469be0f90 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.0 + 0.7.1-SNAPSHOT ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 017410061..8176f9b0e 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.7.0", + "version": "0.7.1-SNAPSHOT", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index a7e55420e..e6a2fced3 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.0 + 0.7.1-SNAPSHOT ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 82bdc3fe2..08e141f5e 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.0 + 0.7.1-SNAPSHOT ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 66474382f..f38401a65 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.7.0", + "version": "0.7.1-SNAPSHOT", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index 2dae75be4..6f51011ce 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.0 + 0.7.1-SNAPSHOT ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index a638e7849..2998a0c11 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.0 + 0.7.1-SNAPSHOT ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index 35266160e..888159473 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.0 + 0.7.1-SNAPSHOT ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 3d1655d2c..1f112fb36 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.0 + 0.7.1-SNAPSHOT ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 1ded45e03..a57ba6185 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.0 + 0.7.1-SNAPSHOT ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 2c56db9b8..c5a300b08 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.7.0 + 0.7.1-SNAPSHOT pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index 45875b871..3953f6ec5 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.0 + 0.7.1-SNAPSHOT ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index ede80bdc0..4ecaadc70 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.7.0 + 0.7.1-SNAPSHOT pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index fc99cc6b0..6d65d85ff 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.0 + 0.7.1-SNAPSHOT ../code-parent/pom.xml From 1a53927d6b7aa9062a158a00f40783529543bab3 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 2 Apr 2026 11:57:40 +0200 Subject: [PATCH 093/430] Update npm dependencies of the charts module --- charts/npm/package.json | 12 +- charts/npm/pnpm-lock.yaml | 680 ++++++++++++++++++++------------------ 2 files changed, 356 insertions(+), 336 deletions(-) diff --git a/charts/npm/package.json b/charts/npm/package.json index c075ae188..d456862d8 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -29,17 +29,17 @@ }, "devDependencies": { "parcel": "^2.16.4", - "rimraf": "^6.1.2" + "rimraf": "^6.1.3" }, "dependencies": { - "lit": "^3.3.2", - "react": "^19.2.4", - "react-dom": "^19.2.4", - "hoist-non-react-statics": "^3.3.2", "@patternfly/react-charts": "^8.4.1", "@patternfly/react-styles": "^6.4.0", "@patternfly/react-tokens": "^6.4.0", - "lodash": "^4.17.23", + "hoist-non-react-statics": "^3.3.2", + "lit": "^3.3.2", + "lodash": "^4.18.1", + "react": "^19.2.4", + "react-dom": "^19.2.4", "tslib": "^2.8.1", "victory-area": "^37.3.6", "victory-axis": "^37.3.6", diff --git a/charts/npm/pnpm-lock.yaml b/charts/npm/pnpm-lock.yaml index b90ed1024..ce8637a12 100644 --- a/charts/npm/pnpm-lock.yaml +++ b/charts/npm/pnpm-lock.yaml @@ -24,8 +24,8 @@ importers: specifier: ^3.3.2 version: 3.3.2 lodash: - specifier: ^4.17.23 - version: 4.17.23 + specifier: ^4.18.1 + version: 4.18.1 react: specifier: ^19.2.4 version: 19.2.4 @@ -89,9 +89,9 @@ importers: devDependencies: parcel: specifier: ^2.16.4 - version: 2.16.4(@swc/helpers@0.5.19) + version: 2.16.4(@swc/helpers@0.5.20) rimraf: - specifier: ^6.1.2 + specifier: ^6.1.3 version: 6.1.3 packages: @@ -611,68 +611,80 @@ packages: '@patternfly/react-tokens@6.4.0': resolution: {integrity: sha512-iZthBoXSGQ/+PfGTdPFJVulaJZI3rwE+7A/whOXPGp3Jyq3k6X52pr1+5nlO6WHasbZ9FyeZGqXf4fazUZNjbw==} - '@swc/core-darwin-arm64@1.15.18': - resolution: {integrity: sha512-+mIv7uBuSaywN3C9LNuWaX1jJJ3SKfiJuE6Lr3bd+/1Iv8oMU7oLBjYMluX1UrEPzwN2qCdY6Io0yVicABoCwQ==} + '@swc/core-darwin-arm64@1.15.21': + resolution: {integrity: sha512-SA8SFg9dp0qKRH8goWsax6bptFE2EdmPf2YRAQW9WoHGf3XKM1bX0nd5UdwxmC5hXsBUZAYf7xSciCler6/oyA==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.15.18': - resolution: {integrity: sha512-wZle0eaQhnzxWX5V/2kEOI6Z9vl/lTFEC6V4EWcn+5pDjhemCpQv9e/TDJ0GIoiClX8EDWRvuZwh+Z3dhL1NAg==} + '@swc/core-darwin-x64@1.15.21': + resolution: {integrity: sha512-//fOVntgowz9+V90lVsNCtyyrtbHp3jWH6Rch7MXHXbcvbLmbCTmssl5DeedUWLLGiAAW1wksBdqdGYOTjaNLw==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.15.18': - resolution: {integrity: sha512-ao61HGXVqrJFHAcPtF4/DegmwEkVCo4HApnotLU8ognfmU8x589z7+tcf3hU+qBiU1WOXV5fQX6W9Nzs6hjxDw==} + '@swc/core-linux-arm-gnueabihf@1.15.21': + resolution: {integrity: sha512-meNI4Sh6h9h8DvIfEc0l5URabYMSuNvyisLmG6vnoYAS43s8ON3NJR8sDHvdP7NJTrLe0q/x2XCn6yL/BeHcZg==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.15.18': - resolution: {integrity: sha512-3xnctOBLIq3kj8PxOCgPrGjBLP/kNOddr6f5gukYt/1IZxsITQaU9TDyjeX6jG+FiCIHjCuWuffsyQDL5Ew1bg==} + '@swc/core-linux-arm64-gnu@1.15.21': + resolution: {integrity: sha512-QrXlNQnHeXqU2EzLlnsPoWEh8/GtNJLvfMiPsDhk+ht6Xv8+vhvZ5YZ/BokNWSIZiWPKLAqR0M7T92YF5tmD3g==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.15.18': - resolution: {integrity: sha512-0a+Lix+FSSHBSBOA0XznCcHo5/1nA6oLLjcnocvzXeqtdjnPb+SvchItHI+lfeiuj1sClYPDvPMLSLyXFaiIKw==} + '@swc/core-linux-arm64-musl@1.15.21': + resolution: {integrity: sha512-8/yGCMO333ultDaMQivE5CjO6oXDPeeg1IV4sphojPkb0Pv0i6zvcRIkgp60xDB+UxLr6VgHgt+BBgqS959E9g==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.15.18': - resolution: {integrity: sha512-wG9J8vReUlpaHz4KOD/5UE1AUgirimU4UFT9oZmupUDEofxJKYb1mTA/DrMj0s78bkBiNI+7Fo2EgPuvOJfuAA==} + '@swc/core-linux-ppc64-gnu@1.15.21': + resolution: {integrity: sha512-ucW0HzPx0s1dgRvcvuLSPSA/2Kk/VYTv9st8qe1Kc22Gu0Q0rH9+6TcBTmMuNIp0Xs4BPr1uBttmbO1wEGI49Q==} + engines: {node: '>=10'} + cpu: [ppc64] + os: [linux] + + '@swc/core-linux-s390x-gnu@1.15.21': + resolution: {integrity: sha512-ulTnOGc5I7YRObE/9NreAhQg94QkiR5qNhhcUZ1iFAYjzg/JGAi1ch+s/Ixe61pMIr8bfVrF0NOaB0f8wjaAfA==} + engines: {node: '>=10'} + cpu: [s390x] + os: [linux] + + '@swc/core-linux-x64-gnu@1.15.21': + resolution: {integrity: sha512-D0RokxtM+cPvSqJIKR6uja4hbD+scI9ezo95mBhfSyLUs9wnPPl26sLp1ZPR/EXRdYm3F3S6RUtVi+8QXhT24Q==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.15.18': - resolution: {integrity: sha512-4nwbVvCphKzicwNWRmvD5iBaZj8JYsRGa4xOxJmOyHlMDpsvvJ2OR2cODlvWyGFH6BYL1MfIAK3qph3hp0Az6g==} + '@swc/core-linux-x64-musl@1.15.21': + resolution: {integrity: sha512-nER8u7VeRfmU6fMDzl1NQAbbB/G7O2avmvCOwIul1uGkZ2/acbPH+DCL9h5+0yd/coNcxMBTL6NGepIew+7C2w==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.15.18': - resolution: {integrity: sha512-zk0RYO+LjiBCat2RTMHzAWaMky0cra9loH4oRrLKLLNuL+jarxKLFDA8xTZWEkCPLjUTwlRN7d28eDLLMgtUcQ==} + '@swc/core-win32-arm64-msvc@1.15.21': + resolution: {integrity: sha512-+/AgNBnjYugUA8C0Do4YzymgvnGbztv7j8HKSQLvR/DQgZPoXQ2B3PqB2mTtGh/X5DhlJWiqnunN35JUgWcAeQ==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.15.18': - resolution: {integrity: sha512-yVuTrZ0RccD5+PEkpcLOBAuPbYBXS6rslENvIXfvJGXSdX5QGi1ehC4BjAMl5FkKLiam4kJECUI0l7Hq7T1vwg==} + '@swc/core-win32-ia32-msvc@1.15.21': + resolution: {integrity: sha512-IkSZj8PX/N4HcaFhMQtzmkV8YSnuNoJ0E6OvMwFiOfejPhiKXvl7CdDsn1f4/emYEIDO3fpgZW9DTaCRMDxaDA==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.15.18': - resolution: {integrity: sha512-7NRmE4hmUQNCbYU3Hn9Tz57mK9Qq4c97ZS+YlamlK6qG9Fb5g/BB3gPDe0iLlJkns/sYv2VWSkm8c3NmbEGjbg==} + '@swc/core-win32-x64-msvc@1.15.21': + resolution: {integrity: sha512-zUyWso7OOENB6e1N1hNuNn8vbvLsTdKQ5WKLgt/JcBNfJhKy/6jmBmqI3GXk/MyvQKd5SLvP7A0F36p7TeDqvw==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.15.18': - resolution: {integrity: sha512-z87aF9GphWp//fnkRsqvtY+inMVPgYW3zSlXH1kJFvRT5H/wiAn+G32qW5l3oEk63KSF1x3Ov0BfHCObAmT8RA==} + '@swc/core@1.15.21': + resolution: {integrity: sha512-fkk7NJcBscrR3/F8jiqlMptRHP650NxqDnspBMrRe5d8xOoCy9MLL5kOBLFXjFLfMo3KQQHhk+/jUULOMlR1uQ==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '>=0.5.17' @@ -683,11 +695,11 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/helpers@0.5.19': - resolution: {integrity: sha512-QamiFeIK3txNjgUTNppE6MiG3p7TdninpZu0E0PbqVh1a9FNLT2FRhisaa4NcaX52XVhA5l7Pk58Ft7Sqi/2sA==} + '@swc/helpers@0.5.20': + resolution: {integrity: sha512-2egEBHUMasdypIzrprsu8g+OEVd7Vp2MM3a2eVlM/cyFYto0nGz5BX5BTgh/ShZZI9ed+ozEq+Ngt+rgmUs8tw==} - '@swc/types@0.1.25': - resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} + '@swc/types@0.1.26': + resolution: {integrity: sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw==} '@types/d3-array@3.2.2': resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} @@ -730,22 +742,22 @@ packages: base-x@3.0.11: resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - baseline-browser-mapping@2.10.0: - resolution: {integrity: sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==} + baseline-browser-mapping@2.10.13: + resolution: {integrity: sha512-BL2sTuHOdy0YT1lYieUxTw/QMtPBC3pmlJC6xk8BBYVv6vcw3SGdKemQ+Xsx9ik2F/lYDO9tqsFQH1r9PFuHKw==} engines: {node: '>=6.0.0'} hasBin: true - brace-expansion@5.0.4: - resolution: {integrity: sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==} + brace-expansion@5.0.5: + resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} engines: {node: 18 || 20 || >=22} - browserslist@4.28.1: - resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - caniuse-lite@1.0.30001776: - resolution: {integrity: sha512-sg01JDPzZ9jGshqKSckOQthXnYwOEP50jeVFhaSFbZcOy05TiuuaffDOfcwtCisJ9kNQuLBFibYywv2Bgm9osw==} + caniuse-lite@1.0.30001784: + resolution: {integrity: sha512-WU346nBTklUV9YfUl60fqRbU5ZqyXlqvo1SgigE1OAXK5bFL8LL9q1K7aap3N739l4BvNqnkm3YrGHiY9sfUQw==} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -837,8 +849,8 @@ packages: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} - electron-to-chromium@1.5.307: - resolution: {integrity: sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==} + electron-to-chromium@1.5.331: + resolution: {integrity: sha512-IbxXrsTlD3hRodkLnbxAPP4OuJYdWCeM3IOdT+CpcMoIwIoDfCmRpEtSPfwBXxVkg9xmBeY7Lz2Eo2TDn/HC3Q==} escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} @@ -883,74 +895,74 @@ packages: engines: {node: '>=6'} hasBin: true - lightningcss-android-arm64@1.31.1: - resolution: {integrity: sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==} + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [android] - lightningcss-darwin-arm64@1.31.1: - resolution: {integrity: sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==} + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] - lightningcss-darwin-x64@1.31.1: - resolution: {integrity: sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==} + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] - lightningcss-freebsd-x64@1.31.1: - resolution: {integrity: sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==} + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] - lightningcss-linux-arm-gnueabihf@1.31.1: - resolution: {integrity: sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==} + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] - lightningcss-linux-arm64-gnu@1.31.1: - resolution: {integrity: sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==} + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - lightningcss-linux-arm64-musl@1.31.1: - resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==} + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - lightningcss-linux-x64-gnu@1.31.1: - resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==} + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - lightningcss-linux-x64-musl@1.31.1: - resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==} + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - lightningcss-win32-arm64-msvc@1.31.1: - resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==} + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] - lightningcss-win32-x64-msvc@1.31.1: - resolution: {integrity: sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==} + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] - lightningcss@1.31.1: - resolution: {integrity: sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==} + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} engines: {node: '>= 12.0.0'} lit-element@4.2.2: @@ -966,15 +978,15 @@ packages: resolution: {integrity: sha512-9bMdFfc80S+vSldBmG3HOuLVHnxRdNTlpzR6QDnzqCQtCzGUEAGTzBKYMeIM+I/sU4oZfgbcbS7X7F65/z/oxQ==} hasBin: true - lodash@4.17.23: - resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} - lru-cache@11.2.6: - resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} + lru-cache@11.2.7: + resolution: {integrity: sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==} engines: {node: 20 || >=22} - minimatch@10.2.4: - resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} minipass@7.1.3: @@ -985,8 +997,8 @@ packages: resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} hasBin: true - msgpackr@1.11.8: - resolution: {integrity: sha512-bC4UGzHhVvgDNS7kn9tV8fAucIYUBuGojcaLiz7v+P63Lmtm0Xeji8B/8tYKddALXxJLpwIeBmUN3u64C4YkRA==} + msgpackr@1.11.9: + resolution: {integrity: sha512-FkoAAyyA6HM8wL882EcEyFZ9s7hVADSwG9xrVx3dxxNQAtgADTrJoEWivID82Iv1zWDsv/OtbrrcZAzGzOMdNw==} node-addon-api@6.1.0: resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} @@ -1002,8 +1014,8 @@ packages: resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} hasBin: true - node-releases@2.0.36: - resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==} + node-releases@2.0.37: + resolution: {integrity: sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==} nullthrows@1.1.1: resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} @@ -1026,8 +1038,8 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} postcss-value-parser@4.2.0: @@ -1284,11 +1296,11 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': optional: true - '@parcel/bundler-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/bundler-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: '@parcel/diagnostic': 2.16.4 '@parcel/graph': 3.6.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/rust': 2.16.4 '@parcel/utils': 2.16.4 nullthrows: 1.1.1 @@ -1296,10 +1308,10 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/cache@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/cache@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/core': 2.16.4(@swc/helpers@0.5.19) - '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/core': 2.16.4(@swc/helpers@0.5.20) + '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/logger': 2.16.4 '@parcel/utils': 2.16.4 lmdb: 2.8.5 @@ -1310,77 +1322,77 @@ snapshots: dependencies: chalk: 4.1.2 - '@parcel/compressor-raw@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/compressor-raw@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/config-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))(@swc/helpers@0.5.19)': - dependencies: - '@parcel/bundler-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/compressor-raw': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/core': 2.16.4(@swc/helpers@0.5.19) - '@parcel/namer-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/optimizer-css': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/optimizer-html': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/optimizer-image': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/optimizer-svg': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/optimizer-swc': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))(@swc/helpers@0.5.19) - '@parcel/packager-css': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/packager-html': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/packager-js': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/packager-raw': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/packager-svg': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/packager-wasm': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/reporter-dev-server': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/resolver-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/runtime-browser-hmr': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/runtime-js': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/runtime-rsc': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/runtime-service-worker': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/transformer-babel': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/transformer-css': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/transformer-html': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/transformer-image': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/transformer-js': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/transformer-json': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/transformer-node': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/transformer-postcss': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/transformer-posthtml': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/transformer-raw': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/transformer-react-refresh-wrap': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/transformer-svg': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/config-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(@swc/helpers@0.5.20)': + dependencies: + '@parcel/bundler-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/compressor-raw': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/core': 2.16.4(@swc/helpers@0.5.20) + '@parcel/namer-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/optimizer-css': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/optimizer-html': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/optimizer-image': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/optimizer-svg': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/optimizer-swc': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(@swc/helpers@0.5.20) + '@parcel/packager-css': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/packager-html': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/packager-js': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/packager-raw': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/packager-svg': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/packager-wasm': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/reporter-dev-server': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/resolver-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/runtime-browser-hmr': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/runtime-js': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/runtime-rsc': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/runtime-service-worker': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/transformer-babel': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/transformer-css': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/transformer-html': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/transformer-image': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/transformer-js': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/transformer-json': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/transformer-node': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/transformer-postcss': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/transformer-posthtml': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/transformer-raw': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/transformer-react-refresh-wrap': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/transformer-svg': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) transitivePeerDependencies: - '@swc/helpers' - napi-wasm - '@parcel/core@2.16.4(@swc/helpers@0.5.19)': + '@parcel/core@2.16.4(@swc/helpers@0.5.20)': dependencies: '@mischnic/json-sourcemap': 0.1.1 - '@parcel/cache': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/cache': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/diagnostic': 2.16.4 '@parcel/events': 2.16.4 '@parcel/feature-flags': 2.16.4 - '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/graph': 3.6.4 '@parcel/logger': 2.16.4 - '@parcel/package-manager': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))(@swc/helpers@0.5.19) - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/package-manager': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(@swc/helpers@0.5.20) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/profiler': 2.16.4 '@parcel/rust': 2.16.4 '@parcel/source-map': 2.1.1 - '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/utils': 2.16.4 - '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) base-x: 3.0.11 - browserslist: 4.28.1 + browserslist: 4.28.2 clone: 2.1.2 dotenv: 16.6.1 dotenv-expand: 11.0.7 json5: 2.2.3 - msgpackr: 1.11.8 + msgpackr: 1.11.9 nullthrows: 1.1.1 semver: 7.7.4 transitivePeerDependencies: @@ -1398,15 +1410,15 @@ snapshots: '@parcel/feature-flags@2.16.4': {} - '@parcel/fs@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/fs@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/core': 2.16.4(@swc/helpers@0.5.19) + '@parcel/core': 2.16.4(@swc/helpers@0.5.20) '@parcel/feature-flags': 2.16.4 '@parcel/rust': 2.16.4 '@parcel/types-internal': 2.16.4 '@parcel/utils': 2.16.4 '@parcel/watcher': 2.5.6 - '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) transitivePeerDependencies: - napi-wasm @@ -1424,20 +1436,20 @@ snapshots: dependencies: chalk: 4.1.2 - '@parcel/namer-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/namer-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/node-resolver-core@3.7.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/node-resolver-core@3.7.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: '@mischnic/json-sourcemap': 0.1.1 '@parcel/diagnostic': 2.16.4 - '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/rust': 2.16.4 '@parcel/utils': 2.16.4 nullthrows: 1.1.1 @@ -1446,106 +1458,106 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/optimizer-css@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/optimizer-css@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 - browserslist: 4.28.1 - lightningcss: 1.31.1 + browserslist: 4.28.2 + lightningcss: 1.32.0 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/optimizer-html@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/optimizer-html@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/rust': 2.16.4 '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/optimizer-image@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/optimizer-image@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/core': 2.16.4(@swc/helpers@0.5.19) + '@parcel/core': 2.16.4(@swc/helpers@0.5.20) '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/rust': 2.16.4 '@parcel/utils': 2.16.4 - '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) transitivePeerDependencies: - napi-wasm - '@parcel/optimizer-svg@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/optimizer-svg@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/rust': 2.16.4 '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/optimizer-swc@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))(@swc/helpers@0.5.19)': + '@parcel/optimizer-swc@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(@swc/helpers@0.5.20)': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 - '@swc/core': 1.15.18(@swc/helpers@0.5.19) + '@swc/core': 1.15.21(@swc/helpers@0.5.20) nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - '@swc/helpers' - napi-wasm - '@parcel/package-manager@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))(@swc/helpers@0.5.19)': + '@parcel/package-manager@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(@swc/helpers@0.5.20)': dependencies: - '@parcel/core': 2.16.4(@swc/helpers@0.5.19) + '@parcel/core': 2.16.4(@swc/helpers@0.5.20) '@parcel/diagnostic': 2.16.4 - '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/logger': 2.16.4 - '@parcel/node-resolver-core': 3.7.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/node-resolver-core': 3.7.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/utils': 2.16.4 - '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@swc/core': 1.15.18(@swc/helpers@0.5.19) + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@swc/core': 1.15.21(@swc/helpers@0.5.20) semver: 7.7.4 transitivePeerDependencies: - '@swc/helpers' - napi-wasm - '@parcel/packager-css@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/packager-css@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 - lightningcss: 1.31.1 + lightningcss: 1.32.0 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/packager-html@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/packager-html@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/rust': 2.16.4 - '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/packager-js@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/packager-js@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/rust': 2.16.4 '@parcel/source-map': 2.1.1 - '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/utils': 2.16.4 globals: 13.24.0 nullthrows: 1.1.1 @@ -1553,33 +1565,33 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/packager-raw@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/packager-raw@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/packager-svg@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/packager-svg@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/rust': 2.16.4 - '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/packager-wasm@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/packager-wasm@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/plugin@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/plugin@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) transitivePeerDependencies: - '@parcel/core' - napi-wasm @@ -1591,10 +1603,10 @@ snapshots: '@parcel/types-internal': 2.16.4 chrome-trace-event: 1.0.4 - '@parcel/reporter-cli@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/reporter-cli@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/utils': 2.16.4 chalk: 4.1.2 term-size: 2.2.1 @@ -1602,19 +1614,19 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/reporter-dev-server@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/reporter-dev-server@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: '@parcel/codeframe': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/reporter-tracer@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/reporter-tracer@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/utils': 2.16.4 chrome-trace-event: 1.0.4 nullthrows: 1.1.1 @@ -1622,35 +1634,35 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/resolver-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/resolver-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/node-resolver-core': 3.7.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/node-resolver-core': 3.7.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/runtime-browser-hmr@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/runtime-browser-hmr@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/runtime-js@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/runtime-js@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/utils': 2.16.4 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/runtime-rsc@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/runtime-rsc@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/rust': 2.16.4 '@parcel/utils': 2.16.4 nullthrows: 1.1.1 @@ -1658,9 +1670,9 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/runtime-service-worker@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/runtime-service-worker@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/utils': 2.16.4 nullthrows: 1.1.1 transitivePeerDependencies: @@ -1706,13 +1718,13 @@ snapshots: dependencies: detect-libc: 1.0.3 - '@parcel/transformer-babel@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/transformer-babel@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 - browserslist: 4.28.1 + browserslist: 4.28.2 json5: 2.2.3 nullthrows: 1.1.1 semver: 7.7.4 @@ -1720,74 +1732,74 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/transformer-css@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/transformer-css@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 - browserslist: 4.28.1 - lightningcss: 1.31.1 + browserslist: 4.28.2 + lightningcss: 1.32.0 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-html@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/transformer-html@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/rust': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-image@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/transformer-image@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/core': 2.16.4(@swc/helpers@0.5.19) - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/core': 2.16.4(@swc/helpers@0.5.20) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/utils': 2.16.4 - '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) nullthrows: 1.1.1 transitivePeerDependencies: - napi-wasm - '@parcel/transformer-js@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/transformer-js@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/core': 2.16.4(@swc/helpers@0.5.19) + '@parcel/core': 2.16.4(@swc/helpers@0.5.20) '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/rust': 2.16.4 '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 - '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@swc/helpers': 0.5.19 - browserslist: 4.28.1 + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@swc/helpers': 0.5.20 + browserslist: 4.28.2 nullthrows: 1.1.1 regenerator-runtime: 0.14.1 semver: 7.7.4 transitivePeerDependencies: - napi-wasm - '@parcel/transformer-json@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/transformer-json@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) json5: 2.2.3 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-node@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/transformer-node@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-postcss@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/transformer-postcss@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/rust': 2.16.4 '@parcel/utils': 2.16.4 clone: 2.1.2 @@ -1798,35 +1810,35 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/transformer-posthtml@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/transformer-posthtml@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-raw@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/transformer-raw@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-react-refresh-wrap@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/transformer-react-refresh-wrap@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: '@parcel/error-overlay': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/utils': 2.16.4 react-refresh: 0.16.0 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-svg@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/transformer-svg@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/rust': 2.16.4 transitivePeerDependencies: - '@parcel/core' @@ -1839,10 +1851,10 @@ snapshots: '@parcel/source-map': 2.1.1 utility-types: 3.11.0 - '@parcel/types@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/types@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: '@parcel/types-internal': 2.16.4 - '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) transitivePeerDependencies: - '@parcel/core' - napi-wasm @@ -1904,7 +1916,7 @@ snapshots: detect-libc: 2.1.2 is-glob: 4.0.3 node-addon-api: 7.1.1 - picomatch: 4.0.3 + picomatch: 4.0.4 optionalDependencies: '@parcel/watcher-android-arm64': 2.5.6 '@parcel/watcher-darwin-arm64': 2.5.6 @@ -1920,9 +1932,9 @@ snapshots: '@parcel/watcher-win32-ia32': 2.5.6 '@parcel/watcher-win32-x64': 2.5.6 - '@parcel/workers@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))': + '@parcel/workers@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': dependencies: - '@parcel/core': 2.16.4(@swc/helpers@0.5.19) + '@parcel/core': 2.16.4(@swc/helpers@0.5.20) '@parcel/diagnostic': 2.16.4 '@parcel/logger': 2.16.4 '@parcel/profiler': 2.16.4 @@ -1937,7 +1949,7 @@ snapshots: '@patternfly/react-styles': 6.4.0 '@patternfly/react-tokens': 6.4.0 hoist-non-react-statics: 3.3.2 - lodash: 4.17.23 + lodash: 4.18.1 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) tslib: 2.8.1 @@ -1964,60 +1976,68 @@ snapshots: '@patternfly/react-tokens@6.4.0': {} - '@swc/core-darwin-arm64@1.15.18': + '@swc/core-darwin-arm64@1.15.21': + optional: true + + '@swc/core-darwin-x64@1.15.21': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.15.21': optional: true - '@swc/core-darwin-x64@1.15.18': + '@swc/core-linux-arm64-gnu@1.15.21': optional: true - '@swc/core-linux-arm-gnueabihf@1.15.18': + '@swc/core-linux-arm64-musl@1.15.21': optional: true - '@swc/core-linux-arm64-gnu@1.15.18': + '@swc/core-linux-ppc64-gnu@1.15.21': optional: true - '@swc/core-linux-arm64-musl@1.15.18': + '@swc/core-linux-s390x-gnu@1.15.21': optional: true - '@swc/core-linux-x64-gnu@1.15.18': + '@swc/core-linux-x64-gnu@1.15.21': optional: true - '@swc/core-linux-x64-musl@1.15.18': + '@swc/core-linux-x64-musl@1.15.21': optional: true - '@swc/core-win32-arm64-msvc@1.15.18': + '@swc/core-win32-arm64-msvc@1.15.21': optional: true - '@swc/core-win32-ia32-msvc@1.15.18': + '@swc/core-win32-ia32-msvc@1.15.21': optional: true - '@swc/core-win32-x64-msvc@1.15.18': + '@swc/core-win32-x64-msvc@1.15.21': optional: true - '@swc/core@1.15.18(@swc/helpers@0.5.19)': + '@swc/core@1.15.21(@swc/helpers@0.5.20)': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.25 + '@swc/types': 0.1.26 optionalDependencies: - '@swc/core-darwin-arm64': 1.15.18 - '@swc/core-darwin-x64': 1.15.18 - '@swc/core-linux-arm-gnueabihf': 1.15.18 - '@swc/core-linux-arm64-gnu': 1.15.18 - '@swc/core-linux-arm64-musl': 1.15.18 - '@swc/core-linux-x64-gnu': 1.15.18 - '@swc/core-linux-x64-musl': 1.15.18 - '@swc/core-win32-arm64-msvc': 1.15.18 - '@swc/core-win32-ia32-msvc': 1.15.18 - '@swc/core-win32-x64-msvc': 1.15.18 - '@swc/helpers': 0.5.19 + '@swc/core-darwin-arm64': 1.15.21 + '@swc/core-darwin-x64': 1.15.21 + '@swc/core-linux-arm-gnueabihf': 1.15.21 + '@swc/core-linux-arm64-gnu': 1.15.21 + '@swc/core-linux-arm64-musl': 1.15.21 + '@swc/core-linux-ppc64-gnu': 1.15.21 + '@swc/core-linux-s390x-gnu': 1.15.21 + '@swc/core-linux-x64-gnu': 1.15.21 + '@swc/core-linux-x64-musl': 1.15.21 + '@swc/core-win32-arm64-msvc': 1.15.21 + '@swc/core-win32-ia32-msvc': 1.15.21 + '@swc/core-win32-x64-msvc': 1.15.21 + '@swc/helpers': 0.5.20 '@swc/counter@0.1.3': {} - '@swc/helpers@0.5.19': + '@swc/helpers@0.5.20': dependencies: tslib: 2.8.1 - '@swc/types@0.1.25': + '@swc/types@0.1.26': dependencies: '@swc/counter': 0.1.3 @@ -2057,21 +2077,21 @@ snapshots: dependencies: safe-buffer: 5.2.1 - baseline-browser-mapping@2.10.0: {} + baseline-browser-mapping@2.10.13: {} - brace-expansion@5.0.4: + brace-expansion@5.0.5: dependencies: balanced-match: 4.0.4 - browserslist@4.28.1: + browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.10.0 - caniuse-lite: 1.0.30001776 - electron-to-chromium: 1.5.307 - node-releases: 2.0.36 - update-browserslist-db: 1.2.3(browserslist@4.28.1) + baseline-browser-mapping: 2.10.13 + caniuse-lite: 1.0.30001784 + electron-to-chromium: 1.5.331 + node-releases: 2.0.37 + update-browserslist-db: 1.2.3(browserslist@4.28.2) - caniuse-lite@1.0.30001776: {} + caniuse-lite@1.0.30001784: {} chalk@4.1.2: dependencies: @@ -2144,7 +2164,7 @@ snapshots: dotenv@16.6.1: {} - electron-to-chromium@1.5.307: {} + electron-to-chromium@1.5.331: {} escalade@3.2.0: {} @@ -2152,7 +2172,7 @@ snapshots: glob@13.0.6: dependencies: - minimatch: 10.2.4 + minimatch: 10.2.5 minipass: 7.1.3 path-scurry: 2.0.2 @@ -2178,54 +2198,54 @@ snapshots: json5@2.2.3: {} - lightningcss-android-arm64@1.31.1: + lightningcss-android-arm64@1.32.0: optional: true - lightningcss-darwin-arm64@1.31.1: + lightningcss-darwin-arm64@1.32.0: optional: true - lightningcss-darwin-x64@1.31.1: + lightningcss-darwin-x64@1.32.0: optional: true - lightningcss-freebsd-x64@1.31.1: + lightningcss-freebsd-x64@1.32.0: optional: true - lightningcss-linux-arm-gnueabihf@1.31.1: + lightningcss-linux-arm-gnueabihf@1.32.0: optional: true - lightningcss-linux-arm64-gnu@1.31.1: + lightningcss-linux-arm64-gnu@1.32.0: optional: true - lightningcss-linux-arm64-musl@1.31.1: + lightningcss-linux-arm64-musl@1.32.0: optional: true - lightningcss-linux-x64-gnu@1.31.1: + lightningcss-linux-x64-gnu@1.32.0: optional: true - lightningcss-linux-x64-musl@1.31.1: + lightningcss-linux-x64-musl@1.32.0: optional: true - lightningcss-win32-arm64-msvc@1.31.1: + lightningcss-win32-arm64-msvc@1.32.0: optional: true - lightningcss-win32-x64-msvc@1.31.1: + lightningcss-win32-x64-msvc@1.32.0: optional: true - lightningcss@1.31.1: + lightningcss@1.32.0: dependencies: detect-libc: 2.1.2 optionalDependencies: - lightningcss-android-arm64: 1.31.1 - lightningcss-darwin-arm64: 1.31.1 - lightningcss-darwin-x64: 1.31.1 - lightningcss-freebsd-x64: 1.31.1 - lightningcss-linux-arm-gnueabihf: 1.31.1 - lightningcss-linux-arm64-gnu: 1.31.1 - lightningcss-linux-arm64-musl: 1.31.1 - lightningcss-linux-x64-gnu: 1.31.1 - lightningcss-linux-x64-musl: 1.31.1 - lightningcss-win32-arm64-msvc: 1.31.1 - lightningcss-win32-x64-msvc: 1.31.1 + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 lit-element@4.2.2: dependencies: @@ -2245,7 +2265,7 @@ snapshots: lmdb@2.8.5: dependencies: - msgpackr: 1.11.8 + msgpackr: 1.11.9 node-addon-api: 6.1.0 node-gyp-build-optional-packages: 5.1.1 ordered-binary: 1.6.1 @@ -2258,13 +2278,13 @@ snapshots: '@lmdb/lmdb-linux-x64': 2.8.5 '@lmdb/lmdb-win32-x64': 2.8.5 - lodash@4.17.23: {} + lodash@4.18.1: {} - lru-cache@11.2.6: {} + lru-cache@11.2.7: {} - minimatch@10.2.4: + minimatch@10.2.5: dependencies: - brace-expansion: 5.0.4 + brace-expansion: 5.0.5 minipass@7.1.3: {} @@ -2280,7 +2300,7 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 optional: true - msgpackr@1.11.8: + msgpackr@1.11.9: optionalDependencies: msgpackr-extract: 3.0.3 @@ -2297,7 +2317,7 @@ snapshots: detect-libc: 2.1.2 optional: true - node-releases@2.0.36: {} + node-releases@2.0.37: {} nullthrows@1.1.1: {} @@ -2305,19 +2325,19 @@ snapshots: package-json-from-dist@1.0.1: {} - parcel@2.16.4(@swc/helpers@0.5.19): + parcel@2.16.4(@swc/helpers@0.5.20): dependencies: - '@parcel/config-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))(@swc/helpers@0.5.19) - '@parcel/core': 2.16.4(@swc/helpers@0.5.19) + '@parcel/config-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(@swc/helpers@0.5.20) + '@parcel/core': 2.16.4(@swc/helpers@0.5.20) '@parcel/diagnostic': 2.16.4 '@parcel/events': 2.16.4 '@parcel/feature-flags': 2.16.4 - '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/logger': 2.16.4 - '@parcel/package-manager': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19))(@swc/helpers@0.5.19) - '@parcel/reporter-cli': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/reporter-dev-server': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) - '@parcel/reporter-tracer': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.19)) + '@parcel/package-manager': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(@swc/helpers@0.5.20) + '@parcel/reporter-cli': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/reporter-dev-server': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/reporter-tracer': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) '@parcel/utils': 2.16.4 chalk: 4.1.2 commander: 12.1.0 @@ -2328,12 +2348,12 @@ snapshots: path-scurry@2.0.2: dependencies: - lru-cache: 11.2.6 + lru-cache: 11.2.7 minipass: 7.1.3 picocolors@1.1.1: {} - picomatch@4.0.3: {} + picomatch@4.0.4: {} postcss-value-parser@4.2.0: {} @@ -2373,9 +2393,9 @@ snapshots: type-fest@0.20.2: {} - update-browserslist-db@1.2.3(browserslist@4.28.1): + update-browserslist-db@1.2.3(browserslist@4.28.2): dependencies: - browserslist: 4.28.1 + browserslist: 4.28.2 escalade: 3.2.0 picocolors: 1.1.1 @@ -2383,41 +2403,41 @@ snapshots: victory-area@37.3.6(react@19.2.4): dependencies: - lodash: 4.17.23 + lodash: 4.18.1 react: 19.2.4 victory-core: 37.3.6(react@19.2.4) victory-vendor: 37.3.6 victory-axis@37.3.6(react@19.2.4): dependencies: - lodash: 4.17.23 + lodash: 4.18.1 react: 19.2.4 victory-core: 37.3.6(react@19.2.4) victory-bar@37.3.6(react@19.2.4): dependencies: - lodash: 4.17.23 + lodash: 4.18.1 react: 19.2.4 victory-core: 37.3.6(react@19.2.4) victory-vendor: 37.3.6 victory-box-plot@37.3.6(react@19.2.4): dependencies: - lodash: 4.17.23 + lodash: 4.18.1 react: 19.2.4 victory-core: 37.3.6(react@19.2.4) victory-vendor: 37.3.6 victory-brush-container@37.3.6(react@19.2.4): dependencies: - lodash: 4.17.23 + lodash: 4.18.1 react: 19.2.4 react-fast-compare: 3.2.2 victory-core: 37.3.6(react@19.2.4) victory-chart@37.3.6(react@19.2.4): dependencies: - lodash: 4.17.23 + lodash: 4.18.1 react: 19.2.4 react-fast-compare: 3.2.2 victory-axis: 37.3.6(react@19.2.4) @@ -2427,14 +2447,14 @@ snapshots: victory-core@37.3.6(react@19.2.4): dependencies: - lodash: 4.17.23 + lodash: 4.18.1 react: 19.2.4 react-fast-compare: 3.2.2 victory-vendor: 37.3.6 victory-create-container@37.3.6(react@19.2.4): dependencies: - lodash: 4.17.23 + lodash: 4.18.1 react: 19.2.4 victory-brush-container: 37.3.6(react@19.2.4) victory-core: 37.3.6(react@19.2.4) @@ -2445,13 +2465,13 @@ snapshots: victory-cursor-container@37.3.6(react@19.2.4): dependencies: - lodash: 4.17.23 + lodash: 4.18.1 react: 19.2.4 victory-core: 37.3.6(react@19.2.4) victory-group@37.3.6(react@19.2.4): dependencies: - lodash: 4.17.23 + lodash: 4.18.1 react: 19.2.4 react-fast-compare: 3.2.2 victory-core: 37.3.6(react@19.2.4) @@ -2459,53 +2479,53 @@ snapshots: victory-legend@37.3.6(react@19.2.4): dependencies: - lodash: 4.17.23 + lodash: 4.18.1 react: 19.2.4 victory-core: 37.3.6(react@19.2.4) victory-line@37.3.6(react@19.2.4): dependencies: - lodash: 4.17.23 + lodash: 4.18.1 react: 19.2.4 victory-core: 37.3.6(react@19.2.4) victory-vendor: 37.3.6 victory-pie@37.3.6(react@19.2.4): dependencies: - lodash: 4.17.23 + lodash: 4.18.1 react: 19.2.4 victory-core: 37.3.6(react@19.2.4) victory-vendor: 37.3.6 victory-polar-axis@37.3.6(react@19.2.4): dependencies: - lodash: 4.17.23 + lodash: 4.18.1 react: 19.2.4 victory-core: 37.3.6(react@19.2.4) victory-scatter@37.3.6(react@19.2.4): dependencies: - lodash: 4.17.23 + lodash: 4.18.1 react: 19.2.4 victory-core: 37.3.6(react@19.2.4) victory-selection-container@37.3.6(react@19.2.4): dependencies: - lodash: 4.17.23 + lodash: 4.18.1 react: 19.2.4 victory-core: 37.3.6(react@19.2.4) victory-shared-events@37.3.6(react@19.2.4): dependencies: json-stringify-safe: 5.0.1 - lodash: 4.17.23 + lodash: 4.18.1 react: 19.2.4 react-fast-compare: 3.2.2 victory-core: 37.3.6(react@19.2.4) victory-stack@37.3.6(react@19.2.4): dependencies: - lodash: 4.17.23 + lodash: 4.18.1 react: 19.2.4 react-fast-compare: 3.2.2 victory-core: 37.3.6(react@19.2.4) @@ -2513,7 +2533,7 @@ snapshots: victory-tooltip@37.3.6(react@19.2.4): dependencies: - lodash: 4.17.23 + lodash: 4.18.1 react: 19.2.4 victory-core: 37.3.6(react@19.2.4) @@ -2537,7 +2557,7 @@ snapshots: victory-voronoi-container@37.3.6(react@19.2.4): dependencies: delaunay-find: 0.0.6 - lodash: 4.17.23 + lodash: 4.18.1 react: 19.2.4 react-fast-compare: 3.2.2 victory-core: 37.3.6(react@19.2.4) @@ -2545,7 +2565,7 @@ snapshots: victory-zoom-container@37.3.6(react@19.2.4): dependencies: - lodash: 4.17.23 + lodash: 4.18.1 react: 19.2.4 victory-core: 37.3.6(react@19.2.4) From a70ea13cdf451005bc67dbfe7239e2dbfbeb39fb Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 2 Apr 2026 12:00:17 +0200 Subject: [PATCH 094/430] Prepare next release --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8532eb4c6..35954520f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +### Fixed + +- Fix vulnerabilities in the NPM dependencies of the charts module. + ## [0.7.0] - 2026-04-02 > [!IMPORTANT] From 6c837a7c45a0fd30c426fd5f69ab9a7ccea6ae78 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 2 Apr 2026 12:00:36 +0200 Subject: [PATCH 095/430] Release 0.7.1 --- CHANGELOG.md | 5 ++++- README.md | 2 +- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 22 files changed, 25 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 35954520f..18a5cfc51 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +## [0.7.1] - 2026-04-02 + ### Fixed - Fix vulnerabilities in the NPM dependencies of the charts module. @@ -952,7 +954,8 @@ Stay tuned for more to come... -[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.0...HEAD +[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.1...HEAD +[0.7.1]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.0...v0.7.1 [0.7.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.16...v0.7.0 [0.6.16]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.15...v0.6.16 [0.6.15]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.14...v0.6.15 diff --git a/README.md b/README.md index 214d29c1b..6f37c1196 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.7.0 + 0.7.1 pom import diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 808b763de..df7e2c2fc 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.1-SNAPSHOT + 0.7.1 ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 4c2a8e074..7b4de657f 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.7.1-SNAPSHOT + 0.7.1 pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index 55046a2e8..1e465eb7e 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.1-SNAPSHOT + 0.7.1 ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index d456862d8..3b69c1cd5 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.7.1-SNAPSHOT", + "version": "0.7.1", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index fb7e11bc6..739c28ec3 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.1-SNAPSHOT + 0.7.1 ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index c6539dc81..638f81f0d 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.1-SNAPSHOT + 0.7.1 ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 469be0f90..f56278f49 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.1-SNAPSHOT + 0.7.1 ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 8176f9b0e..cac4a4f01 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.7.1-SNAPSHOT", + "version": "0.7.1", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index e6a2fced3..76b79049a 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.1-SNAPSHOT + 0.7.1 ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 08e141f5e..4af81fdba 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.1-SNAPSHOT + 0.7.1 ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index f38401a65..005c1ce35 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.7.1-SNAPSHOT", + "version": "0.7.1", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index 6f51011ce..c59983b48 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.1-SNAPSHOT + 0.7.1 ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 2998a0c11..bae8bb5f4 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.1-SNAPSHOT + 0.7.1 ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index 888159473..f1ee06c71 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.1-SNAPSHOT + 0.7.1 ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 1f112fb36..a83e3781c 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.1-SNAPSHOT + 0.7.1 ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index a57ba6185..29b4b911b 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.1-SNAPSHOT + 0.7.1 ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index c5a300b08..f5e12412c 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.7.1-SNAPSHOT + 0.7.1 pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index 3953f6ec5..c86ca957a 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.1-SNAPSHOT + 0.7.1 ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 4ecaadc70..103e65acd 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.7.1-SNAPSHOT + 0.7.1 pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 6d65d85ff..2ee5a8b7c 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.1-SNAPSHOT + 0.7.1 ../code-parent/pom.xml From a1c760eff522207f2326364b3bc1c10d0e2fd826 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 2 Apr 2026 12:00:45 +0200 Subject: [PATCH 096/430] Next is 0.7.2 --- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apidoc/pom.xml b/apidoc/pom.xml index df7e2c2fc..e1c240a64 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.1 + 0.7.2-SNAPSHOT ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 7b4de657f..6bed0ebd1 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.7.1 + 0.7.2-SNAPSHOT pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index 1e465eb7e..8870f9fa4 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.1 + 0.7.2-SNAPSHOT ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 3b69c1cd5..772d2b7c9 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.7.1", + "version": "0.7.2-SNAPSHOT", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 739c28ec3..674170bbf 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.1 + 0.7.2-SNAPSHOT ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 638f81f0d..521449ac9 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.1 + 0.7.2-SNAPSHOT ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index f56278f49..6cd877989 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.1 + 0.7.2-SNAPSHOT ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index cac4a4f01..0dde83c3b 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.7.1", + "version": "0.7.2-SNAPSHOT", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 76b79049a..79cc1b09b 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.1 + 0.7.2-SNAPSHOT ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 4af81fdba..299963376 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.1 + 0.7.2-SNAPSHOT ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 005c1ce35..0e0c439e0 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.7.1", + "version": "0.7.2-SNAPSHOT", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index c59983b48..bccd9a1e3 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.1 + 0.7.2-SNAPSHOT ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index bae8bb5f4..90eb3bd06 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.1 + 0.7.2-SNAPSHOT ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index f1ee06c71..acc6b31ac 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.1 + 0.7.2-SNAPSHOT ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index a83e3781c..a6ad22fb6 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.1 + 0.7.2-SNAPSHOT ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 29b4b911b..c9c0f5570 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.1 + 0.7.2-SNAPSHOT ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index f5e12412c..277802950 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.7.1 + 0.7.2-SNAPSHOT pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index c86ca957a..ee854de1e 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.1 + 0.7.2-SNAPSHOT ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 103e65acd..c55a2c051 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.7.1 + 0.7.2-SNAPSHOT pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 2ee5a8b7c..720d05a6c 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.1 + 0.7.2-SNAPSHOT ../code-parent/pom.xml From eebed36cbae86e8433af30e7002dddb6e87f9208 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 2 Apr 2026 12:56:10 +0200 Subject: [PATCH 097/430] Remove the `@Deprecated` annotation from the `org.patternfly.popper` package --- CHANGELOG.md | 4 ++++ core/src/main/java/org/patternfly/popper/package-info.java | 1 - 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 18a5cfc51..5b5968a9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +### Removed + +- Remove the `@Deprecated` annotation from the `org.patternfly.popper` package (J2CL doesn't like annotations on a package). + ## [0.7.1] - 2026-04-02 ### Fixed diff --git a/core/src/main/java/org/patternfly/popper/package-info.java b/core/src/main/java/org/patternfly/popper/package-info.java index 4e9f92165..aa93c739c 100644 --- a/core/src/main/java/org/patternfly/popper/package-info.java +++ b/core/src/main/java/org/patternfly/popper/package-info.java @@ -22,5 +22,4 @@ * * @deprecated Use {@link org.patternfly.overlay} instead. */ -@Deprecated package org.patternfly.popper; \ No newline at end of file From 35caf383bd2e9dd235929e443d302e840c317182 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 2 Apr 2026 12:56:32 +0200 Subject: [PATCH 098/430] Release 0.7.2 --- CHANGELOG.md | 5 ++++- README.md | 2 +- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 22 files changed, 25 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b5968a9f..21be00280 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +## [0.7.2] - 2026-04-02 + ### Removed - Remove the `@Deprecated` annotation from the `org.patternfly.popper` package (J2CL doesn't like annotations on a package). @@ -958,7 +960,8 @@ Stay tuned for more to come... -[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.1...HEAD +[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.2...HEAD +[0.7.2]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.1...v0.7.2 [0.7.1]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.0...v0.7.1 [0.7.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.16...v0.7.0 [0.6.16]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.15...v0.6.16 diff --git a/README.md b/README.md index 6f37c1196..b3bb1dc6b 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.7.1 + 0.7.2 pom import diff --git a/apidoc/pom.xml b/apidoc/pom.xml index e1c240a64..72b1fb3fb 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.2-SNAPSHOT + 0.7.2 ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 6bed0ebd1..10164343e 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.7.2-SNAPSHOT + 0.7.2 pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index 8870f9fa4..bf989fe94 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.2-SNAPSHOT + 0.7.2 ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 772d2b7c9..916f9550c 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.7.2-SNAPSHOT", + "version": "0.7.2", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 674170bbf..6d7726617 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.2-SNAPSHOT + 0.7.2 ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 521449ac9..1a096e5a7 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.2-SNAPSHOT + 0.7.2 ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 6cd877989..24351ab9d 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.2-SNAPSHOT + 0.7.2 ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 0dde83c3b..9b2b44202 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.7.2-SNAPSHOT", + "version": "0.7.2", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 79cc1b09b..1964c63a8 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.2-SNAPSHOT + 0.7.2 ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 299963376..8b89898c0 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.2-SNAPSHOT + 0.7.2 ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 0e0c439e0..769ffb9c0 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.7.2-SNAPSHOT", + "version": "0.7.2", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index bccd9a1e3..a2cb01274 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.2-SNAPSHOT + 0.7.2 ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 90eb3bd06..73a5d4003 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.2-SNAPSHOT + 0.7.2 ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index acc6b31ac..cd42779ec 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.2-SNAPSHOT + 0.7.2 ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index a6ad22fb6..e98c81f4a 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.2-SNAPSHOT + 0.7.2 ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index c9c0f5570..31a4b068e 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.2-SNAPSHOT + 0.7.2 ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 277802950..0f1b04a90 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.7.2-SNAPSHOT + 0.7.2 pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index ee854de1e..d348102ed 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.2-SNAPSHOT + 0.7.2 ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index c55a2c051..ba38a58ce 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.7.2-SNAPSHOT + 0.7.2 pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 720d05a6c..2bd406ac6 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.2-SNAPSHOT + 0.7.2 ../code-parent/pom.xml From e2af554e637e2b93c7b48a66e879a1ed7f91c08a Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 2 Apr 2026 12:56:41 +0200 Subject: [PATCH 099/430] Next is 0.7.3 --- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 72b1fb3fb..fe38688a3 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.2 + 0.7.3-SNAPSHOT ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 10164343e..0be648ee3 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.7.2 + 0.7.3-SNAPSHOT pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index bf989fe94..c78a93f48 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.2 + 0.7.3-SNAPSHOT ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 916f9550c..5349c0521 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.7.2", + "version": "0.7.3-SNAPSHOT", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 6d7726617..e5639ad63 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.2 + 0.7.3-SNAPSHOT ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 1a096e5a7..a576d1c44 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.2 + 0.7.3-SNAPSHOT ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 24351ab9d..e1a6cafbb 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.2 + 0.7.3-SNAPSHOT ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 9b2b44202..d19dba12c 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.7.2", + "version": "0.7.3-SNAPSHOT", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 1964c63a8..0db3b3637 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.2 + 0.7.3-SNAPSHOT ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 8b89898c0..8d71072b7 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.2 + 0.7.3-SNAPSHOT ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 769ffb9c0..174cb5c35 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.7.2", + "version": "0.7.3-SNAPSHOT", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index a2cb01274..f0c153f50 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.2 + 0.7.3-SNAPSHOT ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 73a5d4003..bd643a88e 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.2 + 0.7.3-SNAPSHOT ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index cd42779ec..2a453859d 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.2 + 0.7.3-SNAPSHOT ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index e98c81f4a..781dcc06a 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.2 + 0.7.3-SNAPSHOT ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 31a4b068e..e106efdee 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.2 + 0.7.3-SNAPSHOT ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 0f1b04a90..5a1a8bdb0 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.7.2 + 0.7.3-SNAPSHOT pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index d348102ed..d55698ef8 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.2 + 0.7.3-SNAPSHOT ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index ba38a58ce..594cab776 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.7.2 + 0.7.3-SNAPSHOT pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 2bd406ac6..3af6378a5 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.2 + 0.7.3-SNAPSHOT ../code-parent/pom.xml From d454b1d3e60e24e75108b18e5a265e101b608c37 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 2 Apr 2026 12:59:26 +0200 Subject: [PATCH 100/430] Release 0.7.3 --- CHANGELOG.md | 5 ++++- README.md | 2 +- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 22 files changed, 25 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 21be00280..2f3d0c852 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +## [0.7.3] - 2026-04-02 + ## [0.7.2] - 2026-04-02 ### Removed @@ -960,7 +962,8 @@ Stay tuned for more to come... -[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.2...HEAD +[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.3...HEAD +[0.7.3]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.2...v0.7.3 [0.7.2]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.1...v0.7.2 [0.7.1]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.0...v0.7.1 [0.7.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.6.16...v0.7.0 diff --git a/README.md b/README.md index b3bb1dc6b..dd915686f 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.7.2 + 0.7.3 pom import diff --git a/apidoc/pom.xml b/apidoc/pom.xml index fe38688a3..56ed7da35 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.3-SNAPSHOT + 0.7.3 ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 0be648ee3..d738751b1 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.7.3-SNAPSHOT + 0.7.3 pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index c78a93f48..3ed4f3603 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.3-SNAPSHOT + 0.7.3 ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 5349c0521..74ed5c3a1 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.7.3-SNAPSHOT", + "version": "0.7.3", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index e5639ad63..292e4b236 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.3-SNAPSHOT + 0.7.3 ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index a576d1c44..7ae967432 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.3-SNAPSHOT + 0.7.3 ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index e1a6cafbb..bb8e6bde1 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.3-SNAPSHOT + 0.7.3 ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index d19dba12c..f7f132e3c 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.7.3-SNAPSHOT", + "version": "0.7.3", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 0db3b3637..ada8f902f 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.3-SNAPSHOT + 0.7.3 ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 8d71072b7..c1f019eba 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.3-SNAPSHOT + 0.7.3 ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 174cb5c35..99a6a1c03 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.7.3-SNAPSHOT", + "version": "0.7.3", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index f0c153f50..599c5a7f7 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.3-SNAPSHOT + 0.7.3 ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index bd643a88e..7267ecd2b 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.3-SNAPSHOT + 0.7.3 ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index 2a453859d..b671f2a84 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.3-SNAPSHOT + 0.7.3 ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 781dcc06a..678d3ac72 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.3-SNAPSHOT + 0.7.3 ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index e106efdee..03656dfc2 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.3-SNAPSHOT + 0.7.3 ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 5a1a8bdb0..a7b7e5ffd 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.7.3-SNAPSHOT + 0.7.3 pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index d55698ef8..f48175db4 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.3-SNAPSHOT + 0.7.3 ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 594cab776..d92e91000 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.7.3-SNAPSHOT + 0.7.3 pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 3af6378a5..5511e0661 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.3-SNAPSHOT + 0.7.3 ../code-parent/pom.xml From 6f3416709324c145df4b87ffc1ef0bfb204582a1 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 2 Apr 2026 12:59:36 +0200 Subject: [PATCH 101/430] Next is 0.7.4 --- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 56ed7da35..e60d1689c 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.3 + 0.7.4-SNAPSHOT ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index d738751b1..d1c2ddcfa 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.7.3 + 0.7.4-SNAPSHOT pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index 3ed4f3603..6a0c80219 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.3 + 0.7.4-SNAPSHOT ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 74ed5c3a1..c6cfebc48 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.7.3", + "version": "0.7.4-SNAPSHOT", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 292e4b236..56e67d55e 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.3 + 0.7.4-SNAPSHOT ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 7ae967432..8a57cc17c 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.3 + 0.7.4-SNAPSHOT ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index bb8e6bde1..0226cb9d5 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.3 + 0.7.4-SNAPSHOT ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index f7f132e3c..02be2e7f9 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.7.3", + "version": "0.7.4-SNAPSHOT", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index ada8f902f..f8a68c11b 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.3 + 0.7.4-SNAPSHOT ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index c1f019eba..6626804ec 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.3 + 0.7.4-SNAPSHOT ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 99a6a1c03..e7b64c936 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.7.3", + "version": "0.7.4-SNAPSHOT", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index 599c5a7f7..b695c285e 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.3 + 0.7.4-SNAPSHOT ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 7267ecd2b..4ac9c2f49 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.3 + 0.7.4-SNAPSHOT ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index b671f2a84..3c385b3e0 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.3 + 0.7.4-SNAPSHOT ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 678d3ac72..daa0917e3 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.3 + 0.7.4-SNAPSHOT ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 03656dfc2..59a88c7f0 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.3 + 0.7.4-SNAPSHOT ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index a7b7e5ffd..33e3cbc0f 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.7.3 + 0.7.4-SNAPSHOT pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index f48175db4..4cd317dfe 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.3 + 0.7.4-SNAPSHOT ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index d92e91000..631cfcc9c 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.7.3 + 0.7.4-SNAPSHOT pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 5511e0661..741d8a21a 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.3 + 0.7.4-SNAPSHOT ../code-parent/pom.xml From 78d49237ce839ddc8ba3683d5fea251d9d54b619 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 2 Apr 2026 13:01:25 +0200 Subject: [PATCH 102/430] Updated changelog --- CHANGELOG.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f3d0c852..7b8c9a415 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,12 +8,15 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [0.7.3] - 2026-04-02 -## [0.7.2] - 2026-04-02 - ### Removed - Remove the `@Deprecated` annotation from the `org.patternfly.popper` package (J2CL doesn't like annotations on a package). +## [0.7.2] - 2026-04-02 + +> [!WARNING] +> Not an official release. Please don't use! + ## [0.7.1] - 2026-04-02 ### Fixed From 1ff38c72d425b3ee65573035130f505b7c0e6c9b Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 2 Apr 2026 17:16:35 +0200 Subject: [PATCH 103/430] Documentation --- README.md | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index dd915686f..29da0b1d5 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,7 @@ depending on your stack. If you're using GWT, inherit from `org.patternfly.Patte ## JavaScript Dependencies -PatternFly Java has **no JavaScript** dependencies. Everything necessary is included in the code base for both GWT and J2CL. The only exception is the charts package, which wraps PatternFly React Chart components as web components so they can be used from Java. +PatternFly Java has **no JavaScript** dependencies. Everything necessary is included in the code base for both GWT and J2CL. The only exception is the chart package, which wraps PatternFly React Chart components as web components so they can be used from Java. ``` npm install @patternfly-java/charts @@ -124,6 +124,57 @@ npm install @patternfly-java/finder import "@patternfly-java/finder"; ``` +# Differences to PatternFly + +PatternFly Java provides the same look and feel as [PatternFly](https://www.patternfly.org/) but replaces React's declarative component model with Java's fluent builder API. Here are the key differences: + +## API Style + +Where PatternFly React uses JSX with props: + +```jsx + + Title + Body + Footer + +``` + +PatternFly Java uses static factory methods, fluent chaining, and explicit `add` methods: + +```java +card().flat().rounded().large() + .addHeader(cardHeader().addTitle(cardTitle("Title"))) + .addBody(cardBody().textContent("Body")) + .addFooter(cardFooter().textContent("Footer")); +``` + +## Event Handling + +React uses callback props (`onChange`, `onSelect`). PatternFly Java uses type-safe functional interfaces with an `on()` naming convention. Handlers receive both the event and the component: + +```java +button("Click me").onClick((event, button) -> { /* ... */ }); +``` + +## CSS and Styling + +PatternFly Java does **not** bundle PatternFly stylesheets — you must provide them yourself. CSS classes are applied programmatically via helper methods rather than `className` props. Design tokens are available as type-safe enum constants (see [Tokens](#tokens)). + +## Popups and Overlays + +PatternFly React uses [PopperJS](https://popper.js.org/docs/v2/) for positioning dropdowns, tooltips, and popovers. PatternFly Java uses the native [Popover API](https://developer.mozilla.org/en-US/docs/Web/API/Popover_API) with [CSS Anchor Positioning](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_anchor_positioning) instead, eliminating the need for any JavaScript positioning library. + +## Charts + +Charts are the one exception to the "no JavaScript" rule. PatternFly Java wraps PatternFly React chart components as web components, providing a Java API on top. This requires the `@patternfly-java/charts` NPM package. + +## Extensions + +PatternFly Java includes extensions that have no equivalent in PatternFly React: + +- **Finder**: A multi-column navigation component for browsing hierarchical data, with its own CSS styles. + # Modules PatternFly Java consists of these Maven modules (a-z): From ecf024b54e40fe8dc67c4b286994c94113966182 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Wed, 8 Apr 2026 18:54:50 +0200 Subject: [PATCH 104/430] Fix showcase jobs --- .github/workflows/release.yml | 6 ++++++ .github/workflows/showcase.yml | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e79b763a0..9cde305ae 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -105,6 +105,12 @@ jobs: - uses: actions/checkout@v6 with: persist-credentials: false + - uses: actions/setup-node@v6 + with: + node-version: 25 + - run: corepack enable + - run: pnpm install + working-directory: charts/npm - uses: actions/setup-java@v5 with: java-version: 25 diff --git a/.github/workflows/showcase.yml b/.github/workflows/showcase.yml index f6009eba1..8eeec6711 100644 --- a/.github/workflows/showcase.yml +++ b/.github/workflows/showcase.yml @@ -16,6 +16,12 @@ jobs: - uses: actions/checkout@v6 with: persist-credentials: false + - uses: actions/setup-node@v6 + with: + node-version: 25 + - run: corepack enable + - run: pnpm install + working-directory: charts/npm - uses: actions/setup-java@v5 with: java-version: 25 From 1660d8cc5e327c7c79dc6d5b6ef9d08b4f28893a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Apr 2026 20:45:55 +0000 Subject: [PATCH 105/430] Bump basic-ftp from 5.2.0 to 5.2.1 in /showcase Bumps [basic-ftp](https://github.com/patrickjuchli/basic-ftp) from 5.2.0 to 5.2.1. - [Release notes](https://github.com/patrickjuchli/basic-ftp/releases) - [Changelog](https://github.com/patrickjuchli/basic-ftp/blob/master/CHANGELOG.md) - [Commits](https://github.com/patrickjuchli/basic-ftp/compare/v5.2.0...v5.2.1) --- updated-dependencies: - dependency-name: basic-ftp dependency-version: 5.2.1 dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- showcase/package.json | 2 +- showcase/pnpm-lock.yaml | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/showcase/package.json b/showcase/package.json index 1398a4ae2..f14444635 100644 --- a/showcase/package.json +++ b/showcase/package.json @@ -29,7 +29,7 @@ "@parcel/reporter-cli": "^2.16.4", "@parcel/resolver-glob": "^2.16.4", "@parcel/transformer-css": "^2.16.4", - "basic-ftp": "^5.2.0", + "basic-ftp": "^5.2.1", "concurrently": "^9.2.1", "express": "^5.2.1", "http-proxy-middleware": "^3.0.5", diff --git a/showcase/pnpm-lock.yaml b/showcase/pnpm-lock.yaml index 6acd3cdc5..a35f258dc 100644 --- a/showcase/pnpm-lock.yaml +++ b/showcase/pnpm-lock.yaml @@ -34,8 +34,8 @@ importers: specifier: ^2.16.4 version: 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) basic-ftp: - specifier: ^5.2.0 - version: 5.2.0 + specifier: ^5.2.1 + version: 5.2.1 concurrently: specifier: ^9.2.1 version: 9.2.1 @@ -749,8 +749,8 @@ packages: resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} engines: {node: '>= 0.8'} - basic-ftp@5.2.0: - resolution: {integrity: sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw==} + basic-ftp@5.2.1: + resolution: {integrity: sha512-0yaL8JdxTknKDILitVpfYfV2Ob6yb3udX/hK97M7I3jOeznBNxQPtVvTUtnhUkyHlxFWyr5Lvknmgzoc7jf+1Q==} engines: {node: '>=10.0.0'} body-parser@2.2.2: @@ -2654,7 +2654,7 @@ snapshots: dependencies: safe-buffer: 5.1.2 - basic-ftp@5.2.0: {} + basic-ftp@5.2.1: {} body-parser@2.2.2: dependencies: @@ -2977,7 +2977,7 @@ snapshots: get-uri@6.0.5: dependencies: - basic-ftp: 5.2.0 + basic-ftp: 5.2.1 data-uri-to-buffer: 6.0.2 debug: 4.4.3 transitivePeerDependencies: From 8cd068b9732430b09760bfe6b3a5e46a47e35a4f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Apr 2026 21:55:19 +0000 Subject: [PATCH 106/430] Bump basic-ftp from 5.2.1 to 5.2.2 in /showcase Bumps [basic-ftp](https://github.com/patrickjuchli/basic-ftp) from 5.2.1 to 5.2.2. - [Release notes](https://github.com/patrickjuchli/basic-ftp/releases) - [Changelog](https://github.com/patrickjuchli/basic-ftp/blob/master/CHANGELOG.md) - [Commits](https://github.com/patrickjuchli/basic-ftp/compare/v5.2.1...v5.2.2) --- updated-dependencies: - dependency-name: basic-ftp dependency-version: 5.2.2 dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- showcase/package.json | 2 +- showcase/pnpm-lock.yaml | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/showcase/package.json b/showcase/package.json index f14444635..335d3ba1a 100644 --- a/showcase/package.json +++ b/showcase/package.json @@ -29,7 +29,7 @@ "@parcel/reporter-cli": "^2.16.4", "@parcel/resolver-glob": "^2.16.4", "@parcel/transformer-css": "^2.16.4", - "basic-ftp": "^5.2.1", + "basic-ftp": "^5.2.2", "concurrently": "^9.2.1", "express": "^5.2.1", "http-proxy-middleware": "^3.0.5", diff --git a/showcase/pnpm-lock.yaml b/showcase/pnpm-lock.yaml index a35f258dc..42b891593 100644 --- a/showcase/pnpm-lock.yaml +++ b/showcase/pnpm-lock.yaml @@ -34,8 +34,8 @@ importers: specifier: ^2.16.4 version: 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) basic-ftp: - specifier: ^5.2.1 - version: 5.2.1 + specifier: ^5.2.2 + version: 5.2.2 concurrently: specifier: ^9.2.1 version: 9.2.1 @@ -749,8 +749,8 @@ packages: resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} engines: {node: '>= 0.8'} - basic-ftp@5.2.1: - resolution: {integrity: sha512-0yaL8JdxTknKDILitVpfYfV2Ob6yb3udX/hK97M7I3jOeznBNxQPtVvTUtnhUkyHlxFWyr5Lvknmgzoc7jf+1Q==} + basic-ftp@5.2.2: + resolution: {integrity: sha512-1tDrzKsdCg70WGvbFss/ulVAxupNauGnOlgpyjKzeQxzyllBLS0CGLV7tjIXTK3ZQA9/FBEm9qyFFN1bciA6pw==} engines: {node: '>=10.0.0'} body-parser@2.2.2: @@ -2654,7 +2654,7 @@ snapshots: dependencies: safe-buffer: 5.1.2 - basic-ftp@5.2.1: {} + basic-ftp@5.2.2: {} body-parser@2.2.2: dependencies: @@ -2977,7 +2977,7 @@ snapshots: get-uri@6.0.5: dependencies: - basic-ftp: 5.2.1 + basic-ftp: 5.2.2 data-uri-to-buffer: 6.0.2 debug: 4.4.3 transitivePeerDependencies: From 631878973f0e57e3b6297ac7666a9f3de0649198 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Sat, 11 Apr 2026 14:11:29 +0200 Subject: [PATCH 107/430] Update NPM packages --- showcase/package.json | 4 +- showcase/pnpm-lock.yaml | 582 ++++++++++++++++++++-------------------- 2 files changed, 293 insertions(+), 293 deletions(-) diff --git a/showcase/package.json b/showcase/package.json index 1398a4ae2..c6cda9ce9 100644 --- a/showcase/package.json +++ b/showcase/package.json @@ -29,7 +29,7 @@ "@parcel/reporter-cli": "^2.16.4", "@parcel/resolver-glob": "^2.16.4", "@parcel/transformer-css": "^2.16.4", - "basic-ftp": "^5.2.0", + "basic-ftp": "^5.2.2", "concurrently": "^9.2.1", "express": "^5.2.1", "http-proxy-middleware": "^3.0.5", @@ -38,7 +38,7 @@ "parcel": "^2.16.4", "parcel-resolver-ignore": "^2.2.1", "puppeteer": "^24.40.0", - "wait-on": "^9.0.4" + "wait-on": "^9.0.5" }, "packageManager": "pnpm@11.0.0-dev.1005+sha512.91f84a392eea348ea4852a182912d2520273a4336f933b78cc44bc931eb999923c097e9433a9b355adc1f725725ea99082fc9f032a559df832632e764c92c798" } diff --git a/showcase/pnpm-lock.yaml b/showcase/pnpm-lock.yaml index 6acd3cdc5..e895dcc9a 100644 --- a/showcase/pnpm-lock.yaml +++ b/showcase/pnpm-lock.yaml @@ -20,22 +20,22 @@ importers: devDependencies: '@parcel/config-default': specifier: ^2.16.4 - version: 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(@swc/helpers@0.5.20) + version: 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))(@swc/helpers@0.5.21) '@parcel/core': specifier: ^2.16.4 - version: 2.16.4(@swc/helpers@0.5.20) + version: 2.16.4(@swc/helpers@0.5.21) '@parcel/reporter-cli': specifier: ^2.16.4 - version: 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + version: 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/resolver-glob': specifier: ^2.16.4 - version: 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + version: 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/transformer-css': specifier: ^2.16.4 - version: 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + version: 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) basic-ftp: - specifier: ^5.2.0 - version: 5.2.0 + specifier: ^5.2.2 + version: 5.2.2 concurrently: specifier: ^9.2.1 version: 9.2.1 @@ -53,16 +53,16 @@ importers: version: 11.0.0 parcel: specifier: ^2.16.4 - version: 2.16.4(@swc/helpers@0.5.20) + version: 2.16.4(@swc/helpers@0.5.21) parcel-resolver-ignore: specifier: ^2.2.1 - version: 2.2.1(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + version: 2.2.1(@parcel/core@2.16.4(@swc/helpers@0.5.21)) puppeteer: specifier: ^24.40.0 version: 24.40.0 wait-on: - specifier: ^9.0.4 - version: 9.0.4 + specifier: ^9.0.5 + version: 9.0.5 packages: @@ -97,8 +97,8 @@ packages: '@hapi/topo@6.0.2': resolution: {integrity: sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg==} - '@lezer/common@1.5.1': - resolution: {integrity: sha512-6YRVG9vBkaY7p1IVxL4s44n5nUnaNnGM2/AckNgYOnxTG2kWh1vR8BMxPseWPjRNpb5VtXnMpeYAEAADoRV1Iw==} + '@lezer/common@1.5.2': + resolution: {integrity: sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ==} '@lezer/lr@1.4.8': resolution: {integrity: sha512-bPWa0Pgx69ylNlMlPvBPryqeLYQjyJjqPx+Aupm5zydLIF3NE+6MMLT8Yi23Bd9cif9VS00aUebn+6fDIGBcDA==} @@ -554,80 +554,80 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - '@swc/core-darwin-arm64@1.15.21': - resolution: {integrity: sha512-SA8SFg9dp0qKRH8goWsax6bptFE2EdmPf2YRAQW9WoHGf3XKM1bX0nd5UdwxmC5hXsBUZAYf7xSciCler6/oyA==} + '@swc/core-darwin-arm64@1.15.24': + resolution: {integrity: sha512-uM5ZGfFXjtvtJ+fe448PVBEbn/CSxS3UAyLj3O9xOqKIWy3S6hPTXSPbszxkSsGDYKi+YFhzAsR4r/eXLxEQ0g==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.15.21': - resolution: {integrity: sha512-//fOVntgowz9+V90lVsNCtyyrtbHp3jWH6Rch7MXHXbcvbLmbCTmssl5DeedUWLLGiAAW1wksBdqdGYOTjaNLw==} + '@swc/core-darwin-x64@1.15.24': + resolution: {integrity: sha512-fMIb/Zfn929pw25VMBhV7Ji2Dl+lCWtUPNdYJQYOke+00E5fcQ9ynxtP8+qhUo/HZc+mYQb1gJxwHM9vty+lXg==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.15.21': - resolution: {integrity: sha512-meNI4Sh6h9h8DvIfEc0l5URabYMSuNvyisLmG6vnoYAS43s8ON3NJR8sDHvdP7NJTrLe0q/x2XCn6yL/BeHcZg==} + '@swc/core-linux-arm-gnueabihf@1.15.24': + resolution: {integrity: sha512-vOkjsyjjxnoYx3hMEWcGxQrMgnNrRm6WAegBXrN8foHtDAR+zpdhpGF5a4lj1bNPgXAvmysjui8cM1ov/Clkaw==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.15.21': - resolution: {integrity: sha512-QrXlNQnHeXqU2EzLlnsPoWEh8/GtNJLvfMiPsDhk+ht6Xv8+vhvZ5YZ/BokNWSIZiWPKLAqR0M7T92YF5tmD3g==} + '@swc/core-linux-arm64-gnu@1.15.24': + resolution: {integrity: sha512-h/oNu+upkXJ6Cicnq7YGVj9PkdfarLCdQa8l/FlHYvfv8CEiMaeeTnpLU7gSBH/rGxosM6Qkfa/J9mThGF9CLA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.15.21': - resolution: {integrity: sha512-8/yGCMO333ultDaMQivE5CjO6oXDPeeg1IV4sphojPkb0Pv0i6zvcRIkgp60xDB+UxLr6VgHgt+BBgqS959E9g==} + '@swc/core-linux-arm64-musl@1.15.24': + resolution: {integrity: sha512-ZpF/pRe1guk6sKzQI9D1jAORtjTdNlyeXn9GDz8ophof/w2WhojRblvSDJaGe7rJjcPN8AaOkhwdRUh7q8oYIg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-ppc64-gnu@1.15.21': - resolution: {integrity: sha512-ucW0HzPx0s1dgRvcvuLSPSA/2Kk/VYTv9st8qe1Kc22Gu0Q0rH9+6TcBTmMuNIp0Xs4BPr1uBttmbO1wEGI49Q==} + '@swc/core-linux-ppc64-gnu@1.15.24': + resolution: {integrity: sha512-QZEsZfisHTSJlmyChgDFNmKPb3W6Lhbfo/O76HhIngfEdnQNmukS38/VSe1feho+xkV5A5hETyCbx3sALBZKAQ==} engines: {node: '>=10'} cpu: [ppc64] os: [linux] - '@swc/core-linux-s390x-gnu@1.15.21': - resolution: {integrity: sha512-ulTnOGc5I7YRObE/9NreAhQg94QkiR5qNhhcUZ1iFAYjzg/JGAi1ch+s/Ixe61pMIr8bfVrF0NOaB0f8wjaAfA==} + '@swc/core-linux-s390x-gnu@1.15.24': + resolution: {integrity: sha512-DLdJKVsJgglqQrJBuoUYNmzm3leI7kUZhLbZGHv42onfKsGf6JDS3+bzCUQfte/XOqDjh/tmmn1DR/CF/tCJFw==} engines: {node: '>=10'} cpu: [s390x] os: [linux] - '@swc/core-linux-x64-gnu@1.15.21': - resolution: {integrity: sha512-D0RokxtM+cPvSqJIKR6uja4hbD+scI9ezo95mBhfSyLUs9wnPPl26sLp1ZPR/EXRdYm3F3S6RUtVi+8QXhT24Q==} + '@swc/core-linux-x64-gnu@1.15.24': + resolution: {integrity: sha512-IpLYfposPA/XLxYOKpRfeccl1p5dDa3+okZDHHTchBkXEaVCnq5MADPmIWwIYj1tudt7hORsEHccG5no6IUQRw==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.15.21': - resolution: {integrity: sha512-nER8u7VeRfmU6fMDzl1NQAbbB/G7O2avmvCOwIul1uGkZ2/acbPH+DCL9h5+0yd/coNcxMBTL6NGepIew+7C2w==} + '@swc/core-linux-x64-musl@1.15.24': + resolution: {integrity: sha512-JHy3fMSc0t/EPWgo74+OK5TGr51aElnzqfUPaiRf2qJ/BfX5CUCfMiWVBuhI7qmVMBnk1jTRnL/xZnOSHDPLYg==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.15.21': - resolution: {integrity: sha512-+/AgNBnjYugUA8C0Do4YzymgvnGbztv7j8HKSQLvR/DQgZPoXQ2B3PqB2mTtGh/X5DhlJWiqnunN35JUgWcAeQ==} + '@swc/core-win32-arm64-msvc@1.15.24': + resolution: {integrity: sha512-Txj+qUH1z2bUd1P3JvwByfjKFti3cptlAxhWgmunBUUxy/IW3CXLZ6l6Gk4liANadKkU71nIU1X30Z5vpMT3BA==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.15.21': - resolution: {integrity: sha512-IkSZj8PX/N4HcaFhMQtzmkV8YSnuNoJ0E6OvMwFiOfejPhiKXvl7CdDsn1f4/emYEIDO3fpgZW9DTaCRMDxaDA==} + '@swc/core-win32-ia32-msvc@1.15.24': + resolution: {integrity: sha512-15D/nl3XwrhFpMv+MADFOiVwv3FvH9j8c6Rf8EXBT3Q5LoMh8YnDnSgPYqw1JzPnksvsBX6QPXLiPqmcR/Z4qQ==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.15.21': - resolution: {integrity: sha512-zUyWso7OOENB6e1N1hNuNn8vbvLsTdKQ5WKLgt/JcBNfJhKy/6jmBmqI3GXk/MyvQKd5SLvP7A0F36p7TeDqvw==} + '@swc/core-win32-x64-msvc@1.15.24': + resolution: {integrity: sha512-PR0PlTlPra2JbaDphrOAzm6s0v9rA0F17YzB+XbWD95B4g2cWcZY9LAeTa4xll70VLw9Jr7xBrlohqlQmelMFQ==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.15.21': - resolution: {integrity: sha512-fkk7NJcBscrR3/F8jiqlMptRHP650NxqDnspBMrRe5d8xOoCy9MLL5kOBLFXjFLfMo3KQQHhk+/jUULOMlR1uQ==} + '@swc/core@1.15.24': + resolution: {integrity: sha512-5Hj8aNasue7yusUt8LGCUe/AjM7RMAce8ZoyDyiFwx7Al+GbYKL+yE7g4sJk8vEr1dKIkTRARkNIJENc4CjkBQ==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '>=0.5.17' @@ -638,8 +638,8 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/helpers@0.5.20': - resolution: {integrity: sha512-2egEBHUMasdypIzrprsu8g+OEVd7Vp2MM3a2eVlM/cyFYto0nGz5BX5BTgh/ShZZI9ed+ozEq+Ngt+rgmUs8tw==} + '@swc/helpers@0.5.21': + resolution: {integrity: sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==} '@swc/types@0.1.26': resolution: {integrity: sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw==} @@ -650,8 +650,8 @@ packages: '@types/http-proxy@1.17.17': resolution: {integrity: sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==} - '@types/node@25.5.0': - resolution: {integrity: sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==} + '@types/node@25.6.0': + resolution: {integrity: sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==} '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} @@ -685,8 +685,8 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - axios@1.14.0: - resolution: {integrity: sha512-3Y8yrqLSwjuzpXuZ0oIYZ/XGgLwUIBU3uLvbcpb0pidD9ctpShJd43KSlEEkVQg6DS0G9NKyzOvBfUtDKEyHvQ==} + axios@1.15.0: + resolution: {integrity: sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==} b4a@1.8.0: resolution: {integrity: sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==} @@ -704,8 +704,8 @@ packages: bare-abort-controller: optional: true - bare-fs@4.5.6: - resolution: {integrity: sha512-1QovqDrR80Pmt5HPAsMsXTCFcDYr+NSUKW6nd6WO5v0JBmnItc/irNRzm2KOQ5oZ69P37y+AMujNyNtG+1Rggw==} + bare-fs@4.7.0: + resolution: {integrity: sha512-xzqKsCFxAek9aezYhjJuJRXBIaYlg/0OGDTZp+T8eYmYMlm66cs6cYko02drIyjN2CBbi+I6L7YfXyqpqtKRXA==} engines: {bare: '>=1.16.0'} peerDependencies: bare-buffer: '*' @@ -713,15 +713,15 @@ packages: bare-buffer: optional: true - bare-os@3.8.6: - resolution: {integrity: sha512-l8xaNWWb/bXuzgsrlF5jaa5QYDJ9S0ddd54cP6CH+081+5iPrbJiCfBWQqrWYzmUhCbsH+WR6qxo9MeHVCr0MQ==} + bare-os@3.8.7: + resolution: {integrity: sha512-G4Gr1UsGeEy2qtDTZwL7JFLo2wapUarz7iTMcYcMFdS89AIQuBoyjgXZz0Utv7uHs3xA9LckhVbeBi8lEQrC+w==} engines: {bare: '>=1.14.0'} bare-path@3.0.0: resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - bare-stream@2.12.0: - resolution: {integrity: sha512-w28i8lkBgREV3rPXGbgK+BO66q+ZpKqRWrZLiCdmmUlLPrQ45CzkvRhN+7lnv00Gpi2zy5naRxnUFAxCECDm9g==} + bare-stream@2.13.0: + resolution: {integrity: sha512-3zAJRZMDFGjdn+RVnNpF9kuELw+0Fl3lpndM4NcEOhb9zwtSo/deETfuIwMSE5BXanA0FrN1qVjffGwAg2Y7EA==} peerDependencies: bare-abort-controller: '*' bare-buffer: '*' @@ -740,8 +740,8 @@ packages: base-x@3.0.11: resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - baseline-browser-mapping@2.10.13: - resolution: {integrity: sha512-BL2sTuHOdy0YT1lYieUxTw/QMtPBC3pmlJC6xk8BBYVv6vcw3SGdKemQ+Xsx9ik2F/lYDO9tqsFQH1r9PFuHKw==} + baseline-browser-mapping@2.10.17: + resolution: {integrity: sha512-HdrkN8eVG2CXxeifv/VdJ4A4RSra1DTW8dc/hdxzhGHN8QePs6gKaWM9pHPcpCoxYZJuOZ8drHmbdpLHjCYjLA==} engines: {node: '>=6.0.0'} hasBin: true @@ -749,8 +749,8 @@ packages: resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} engines: {node: '>= 0.8'} - basic-ftp@5.2.0: - resolution: {integrity: sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw==} + basic-ftp@5.2.2: + resolution: {integrity: sha512-1tDrzKsdCg70WGvbFss/ulVAxupNauGnOlgpyjKzeQxzyllBLS0CGLV7tjIXTK3ZQA9/FBEm9qyFFN1bciA6pw==} engines: {node: '>=10.0.0'} body-parser@2.2.2: @@ -789,8 +789,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001784: - resolution: {integrity: sha512-WU346nBTklUV9YfUl60fqRbU5ZqyXlqvo1SgigE1OAXK5bFL8LL9q1K7aap3N739l4BvNqnkm3YrGHiY9sfUQw==} + caniuse-lite@1.0.30001787: + resolution: {integrity: sha512-mNcrMN9KeI68u7muanUpEejSLghOKlVhRqS/Za2IeyGllJ9I9otGpR9g3nsw7n4W378TE/LyIteA0+/FOZm4Kg==} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -833,8 +833,8 @@ packages: engines: {node: '>=18'} hasBin: true - content-disposition@1.0.1: - resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==} + content-disposition@1.1.0: + resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} engines: {node: '>=18'} content-type@1.0.5: @@ -926,8 +926,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.331: - resolution: {integrity: sha512-IbxXrsTlD3hRodkLnbxAPP4OuJYdWCeM3IOdT+CpcMoIwIoDfCmRpEtSPfwBXxVkg9xmBeY7Lz2Eo2TDn/HC3Q==} + electron-to-chromium@1.5.335: + resolution: {integrity: sha512-q9n5T4BR4Xwa2cwbrwcsDJtHD/enpQ5S1xF1IAtdqf5AAgqDFmR/aakqH3ChFdqd/QXJhS3rnnXFtexU7rax6Q==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1356,8 +1356,8 @@ packages: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} - netmask@2.0.2: - resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + netmask@2.1.1: + resolution: {integrity: sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==} engines: {node: '>= 0.4.0'} node-addon-api@6.1.0: @@ -1490,8 +1490,8 @@ packages: engines: {node: '>=18'} hasBin: true - qs@6.15.0: - resolution: {integrity: sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==} + qs@6.15.1: + resolution: {integrity: sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==} engines: {node: '>=0.6'} range-parser@1.2.1: @@ -1563,8 +1563,8 @@ packages: resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} engines: {node: '>= 0.4'} - side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} engines: {node: '>= 0.4'} side-channel-map@1.0.1: @@ -1660,8 +1660,8 @@ packages: typed-query-selector@2.12.1: resolution: {integrity: sha512-uzR+FzI8qrUEIu96oaeBJmd9E7CFEiQ3goA5qCVgc4s5llSubcfGHq9yUstZx/k4s9dXHVKsE35YWoFyvEqEHA==} - undici-types@7.18.2: - resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + undici-types@7.19.2: + resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} union@0.5.0: resolution: {integrity: sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==} @@ -1688,8 +1688,8 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - wait-on@9.0.4: - resolution: {integrity: sha512-k8qrgfwrPVJXTeFY8tl6BxVHiclK11u72DVKhpybHfUL/K6KM4bdyK9EhIVYGytB5MJe/3lq4Tf0hrjM+pvJZQ==} + wait-on@9.0.5: + resolution: {integrity: sha512-qgnbHDfDTRIp73ANEJNRW/7kn8CrDUcvZz18xotJQku/P4saTGkbIzvnMZebPmVvVNUiRq1qWAPyqCH+W4H8KA==} engines: {node: '>=20.0.0'} hasBin: true @@ -1773,11 +1773,11 @@ snapshots: dependencies: '@hapi/hoek': 11.0.7 - '@lezer/common@1.5.1': {} + '@lezer/common@1.5.2': {} '@lezer/lr@1.4.8': dependencies: - '@lezer/common': 1.5.1 + '@lezer/common': 1.5.2 '@lmdb/lmdb-darwin-arm64@2.8.5': optional: true @@ -1799,7 +1799,7 @@ snapshots: '@mischnic/json-sourcemap@0.1.1': dependencies: - '@lezer/common': 1.5.1 + '@lezer/common': 1.5.2 '@lezer/lr': 1.4.8 json5: 2.2.3 @@ -1821,11 +1821,11 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': optional: true - '@parcel/bundler-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/bundler-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: '@parcel/diagnostic': 2.16.4 '@parcel/graph': 3.6.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/rust': 2.16.4 '@parcel/utils': 2.16.4 nullthrows: 1.1.1 @@ -1833,10 +1833,10 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/cache@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/cache@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/core': 2.16.4(@swc/helpers@0.5.20) - '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/core': 2.16.4(@swc/helpers@0.5.21) + '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/logger': 2.16.4 '@parcel/utils': 2.16.4 lmdb: 2.8.5 @@ -1847,70 +1847,70 @@ snapshots: dependencies: chalk: 4.1.2 - '@parcel/compressor-raw@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/compressor-raw@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/config-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(@swc/helpers@0.5.20)': - dependencies: - '@parcel/bundler-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/compressor-raw': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/core': 2.16.4(@swc/helpers@0.5.20) - '@parcel/namer-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/optimizer-css': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/optimizer-html': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/optimizer-image': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/optimizer-svg': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/optimizer-swc': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(@swc/helpers@0.5.20) - '@parcel/packager-css': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/packager-html': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/packager-js': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/packager-raw': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/packager-svg': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/packager-wasm': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/reporter-dev-server': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/resolver-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/runtime-browser-hmr': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/runtime-js': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/runtime-rsc': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/runtime-service-worker': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/transformer-babel': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/transformer-css': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/transformer-html': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/transformer-image': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/transformer-js': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/transformer-json': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/transformer-node': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/transformer-postcss': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/transformer-posthtml': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/transformer-raw': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/transformer-react-refresh-wrap': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/transformer-svg': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/config-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))(@swc/helpers@0.5.21)': + dependencies: + '@parcel/bundler-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/compressor-raw': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/core': 2.16.4(@swc/helpers@0.5.21) + '@parcel/namer-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/optimizer-css': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/optimizer-html': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/optimizer-image': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/optimizer-svg': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/optimizer-swc': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))(@swc/helpers@0.5.21) + '@parcel/packager-css': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/packager-html': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/packager-js': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/packager-raw': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/packager-svg': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/packager-wasm': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/reporter-dev-server': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/resolver-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/runtime-browser-hmr': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/runtime-js': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/runtime-rsc': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/runtime-service-worker': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/transformer-babel': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/transformer-css': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/transformer-html': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/transformer-image': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/transformer-js': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/transformer-json': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/transformer-node': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/transformer-postcss': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/transformer-posthtml': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/transformer-raw': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/transformer-react-refresh-wrap': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/transformer-svg': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) transitivePeerDependencies: - '@swc/helpers' - napi-wasm - '@parcel/core@2.16.4(@swc/helpers@0.5.20)': + '@parcel/core@2.16.4(@swc/helpers@0.5.21)': dependencies: '@mischnic/json-sourcemap': 0.1.1 - '@parcel/cache': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/cache': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/diagnostic': 2.16.4 '@parcel/events': 2.16.4 '@parcel/feature-flags': 2.16.4 - '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/graph': 3.6.4 '@parcel/logger': 2.16.4 - '@parcel/package-manager': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(@swc/helpers@0.5.20) - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/package-manager': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))(@swc/helpers@0.5.21) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/profiler': 2.16.4 '@parcel/rust': 2.16.4 '@parcel/source-map': 2.1.1 - '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/utils': 2.16.4 - '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) base-x: 3.0.11 browserslist: 4.28.2 clone: 2.1.2 @@ -1935,15 +1935,15 @@ snapshots: '@parcel/feature-flags@2.16.4': {} - '@parcel/fs@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/fs@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/core': 2.16.4(@swc/helpers@0.5.20) + '@parcel/core': 2.16.4(@swc/helpers@0.5.21) '@parcel/feature-flags': 2.16.4 '@parcel/rust': 2.16.4 '@parcel/types-internal': 2.16.4 '@parcel/utils': 2.16.4 '@parcel/watcher': 2.5.6 - '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) transitivePeerDependencies: - napi-wasm @@ -1961,20 +1961,20 @@ snapshots: dependencies: chalk: 4.1.2 - '@parcel/namer-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/namer-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/node-resolver-core@3.7.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/node-resolver-core@3.7.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: '@mischnic/json-sourcemap': 0.1.1 '@parcel/diagnostic': 2.16.4 - '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/rust': 2.16.4 '@parcel/utils': 2.16.4 nullthrows: 1.1.1 @@ -1983,10 +1983,10 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/optimizer-css@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/optimizer-css@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 browserslist: 4.28.2 @@ -1996,68 +1996,68 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/optimizer-html@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/optimizer-html@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/rust': 2.16.4 '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/optimizer-image@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/optimizer-image@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/core': 2.16.4(@swc/helpers@0.5.20) + '@parcel/core': 2.16.4(@swc/helpers@0.5.21) '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/rust': 2.16.4 '@parcel/utils': 2.16.4 - '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) transitivePeerDependencies: - napi-wasm - '@parcel/optimizer-svg@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/optimizer-svg@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/rust': 2.16.4 '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/optimizer-swc@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(@swc/helpers@0.5.20)': + '@parcel/optimizer-swc@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))(@swc/helpers@0.5.21)': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 - '@swc/core': 1.15.21(@swc/helpers@0.5.20) + '@swc/core': 1.15.24(@swc/helpers@0.5.21) nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - '@swc/helpers' - napi-wasm - '@parcel/package-manager@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(@swc/helpers@0.5.20)': + '@parcel/package-manager@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))(@swc/helpers@0.5.21)': dependencies: - '@parcel/core': 2.16.4(@swc/helpers@0.5.20) + '@parcel/core': 2.16.4(@swc/helpers@0.5.21) '@parcel/diagnostic': 2.16.4 - '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/logger': 2.16.4 - '@parcel/node-resolver-core': 3.7.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/node-resolver-core': 3.7.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/utils': 2.16.4 - '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@swc/core': 1.15.21(@swc/helpers@0.5.20) + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@swc/core': 1.15.24(@swc/helpers@0.5.21) semver: 7.7.4 transitivePeerDependencies: - '@swc/helpers' - napi-wasm - '@parcel/packager-css@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/packager-css@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 lightningcss: 1.32.0 @@ -2066,23 +2066,23 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/packager-html@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/packager-html@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/rust': 2.16.4 - '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/packager-js@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/packager-js@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/rust': 2.16.4 '@parcel/source-map': 2.1.1 - '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/utils': 2.16.4 globals: 13.24.0 nullthrows: 1.1.1 @@ -2090,33 +2090,33 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/packager-raw@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/packager-raw@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/packager-svg@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/packager-svg@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/rust': 2.16.4 - '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/packager-wasm@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/packager-wasm@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/plugin@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/plugin@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) transitivePeerDependencies: - '@parcel/core' - napi-wasm @@ -2128,10 +2128,10 @@ snapshots: '@parcel/types-internal': 2.16.4 chrome-trace-event: 1.0.4 - '@parcel/reporter-cli@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/reporter-cli@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/types': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/utils': 2.16.4 chalk: 4.1.2 term-size: 2.2.1 @@ -2139,19 +2139,19 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/reporter-dev-server@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/reporter-dev-server@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: '@parcel/codeframe': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/reporter-tracer@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/reporter-tracer@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/utils': 2.16.4 chrome-trace-event: 1.0.4 nullthrows: 1.1.1 @@ -2159,46 +2159,46 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/resolver-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/resolver-default@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/node-resolver-core': 3.7.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/node-resolver-core': 3.7.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/resolver-glob@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/resolver-glob@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/node-resolver-core': 3.7.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/node-resolver-core': 3.7.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/utils': 2.16.4 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/runtime-browser-hmr@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/runtime-browser-hmr@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/runtime-js@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/runtime-js@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/utils': 2.16.4 nullthrows: 1.1.1 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/runtime-rsc@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/runtime-rsc@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/rust': 2.16.4 '@parcel/utils': 2.16.4 nullthrows: 1.1.1 @@ -2206,9 +2206,9 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/runtime-service-worker@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/runtime-service-worker@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/utils': 2.16.4 nullthrows: 1.1.1 transitivePeerDependencies: @@ -2254,10 +2254,10 @@ snapshots: dependencies: detect-libc: 1.0.3 - '@parcel/transformer-babel@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/transformer-babel@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 browserslist: 4.28.2 @@ -2268,10 +2268,10 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/transformer-css@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/transformer-css@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 browserslist: 4.28.2 @@ -2281,35 +2281,35 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/transformer-html@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/transformer-html@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/rust': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-image@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/transformer-image@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/core': 2.16.4(@swc/helpers@0.5.20) - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/core': 2.16.4(@swc/helpers@0.5.21) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/utils': 2.16.4 - '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) nullthrows: 1.1.1 transitivePeerDependencies: - napi-wasm - '@parcel/transformer-js@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/transformer-js@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/core': 2.16.4(@swc/helpers@0.5.20) + '@parcel/core': 2.16.4(@swc/helpers@0.5.21) '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/rust': 2.16.4 '@parcel/source-map': 2.1.1 '@parcel/utils': 2.16.4 - '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@swc/helpers': 0.5.20 + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@swc/helpers': 0.5.21 browserslist: 4.28.2 nullthrows: 1.1.1 regenerator-runtime: 0.14.1 @@ -2317,25 +2317,25 @@ snapshots: transitivePeerDependencies: - napi-wasm - '@parcel/transformer-json@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/transformer-json@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) json5: 2.2.3 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-node@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/transformer-node@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-postcss@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/transformer-postcss@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/rust': 2.16.4 '@parcel/utils': 2.16.4 clone: 2.1.2 @@ -2346,35 +2346,35 @@ snapshots: - '@parcel/core' - napi-wasm - '@parcel/transformer-posthtml@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/transformer-posthtml@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/utils': 2.16.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-raw@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/transformer-raw@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-react-refresh-wrap@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/transformer-react-refresh-wrap@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: '@parcel/error-overlay': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/utils': 2.16.4 react-refresh: 0.16.0 transitivePeerDependencies: - '@parcel/core' - napi-wasm - '@parcel/transformer-svg@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/transformer-svg@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: '@parcel/diagnostic': 2.16.4 - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/rust': 2.16.4 transitivePeerDependencies: - '@parcel/core' @@ -2387,10 +2387,10 @@ snapshots: '@parcel/source-map': 2.1.1 utility-types: 3.11.0 - '@parcel/types@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/types@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: '@parcel/types-internal': 2.16.4 - '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/workers': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) transitivePeerDependencies: - '@parcel/core' - napi-wasm @@ -2468,9 +2468,9 @@ snapshots: '@parcel/watcher-win32-ia32': 2.5.6 '@parcel/watcher-win32-x64': 2.5.6 - '@parcel/workers@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))': + '@parcel/workers@2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))': dependencies: - '@parcel/core': 2.16.4(@swc/helpers@0.5.20) + '@parcel/core': 2.16.4(@swc/helpers@0.5.21) '@parcel/diagnostic': 2.16.4 '@parcel/logger': 2.16.4 '@parcel/profiler': 2.16.4 @@ -2499,64 +2499,64 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@swc/core-darwin-arm64@1.15.21': + '@swc/core-darwin-arm64@1.15.24': optional: true - '@swc/core-darwin-x64@1.15.21': + '@swc/core-darwin-x64@1.15.24': optional: true - '@swc/core-linux-arm-gnueabihf@1.15.21': + '@swc/core-linux-arm-gnueabihf@1.15.24': optional: true - '@swc/core-linux-arm64-gnu@1.15.21': + '@swc/core-linux-arm64-gnu@1.15.24': optional: true - '@swc/core-linux-arm64-musl@1.15.21': + '@swc/core-linux-arm64-musl@1.15.24': optional: true - '@swc/core-linux-ppc64-gnu@1.15.21': + '@swc/core-linux-ppc64-gnu@1.15.24': optional: true - '@swc/core-linux-s390x-gnu@1.15.21': + '@swc/core-linux-s390x-gnu@1.15.24': optional: true - '@swc/core-linux-x64-gnu@1.15.21': + '@swc/core-linux-x64-gnu@1.15.24': optional: true - '@swc/core-linux-x64-musl@1.15.21': + '@swc/core-linux-x64-musl@1.15.24': optional: true - '@swc/core-win32-arm64-msvc@1.15.21': + '@swc/core-win32-arm64-msvc@1.15.24': optional: true - '@swc/core-win32-ia32-msvc@1.15.21': + '@swc/core-win32-ia32-msvc@1.15.24': optional: true - '@swc/core-win32-x64-msvc@1.15.21': + '@swc/core-win32-x64-msvc@1.15.24': optional: true - '@swc/core@1.15.21(@swc/helpers@0.5.20)': + '@swc/core@1.15.24(@swc/helpers@0.5.21)': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.26 optionalDependencies: - '@swc/core-darwin-arm64': 1.15.21 - '@swc/core-darwin-x64': 1.15.21 - '@swc/core-linux-arm-gnueabihf': 1.15.21 - '@swc/core-linux-arm64-gnu': 1.15.21 - '@swc/core-linux-arm64-musl': 1.15.21 - '@swc/core-linux-ppc64-gnu': 1.15.21 - '@swc/core-linux-s390x-gnu': 1.15.21 - '@swc/core-linux-x64-gnu': 1.15.21 - '@swc/core-linux-x64-musl': 1.15.21 - '@swc/core-win32-arm64-msvc': 1.15.21 - '@swc/core-win32-ia32-msvc': 1.15.21 - '@swc/core-win32-x64-msvc': 1.15.21 - '@swc/helpers': 0.5.20 + '@swc/core-darwin-arm64': 1.15.24 + '@swc/core-darwin-x64': 1.15.24 + '@swc/core-linux-arm-gnueabihf': 1.15.24 + '@swc/core-linux-arm64-gnu': 1.15.24 + '@swc/core-linux-arm64-musl': 1.15.24 + '@swc/core-linux-ppc64-gnu': 1.15.24 + '@swc/core-linux-s390x-gnu': 1.15.24 + '@swc/core-linux-x64-gnu': 1.15.24 + '@swc/core-linux-x64-musl': 1.15.24 + '@swc/core-win32-arm64-msvc': 1.15.24 + '@swc/core-win32-ia32-msvc': 1.15.24 + '@swc/core-win32-x64-msvc': 1.15.24 + '@swc/helpers': 0.5.21 '@swc/counter@0.1.3': {} - '@swc/helpers@0.5.20': + '@swc/helpers@0.5.21': dependencies: tslib: 2.8.1 @@ -2568,15 +2568,15 @@ snapshots: '@types/http-proxy@1.17.17': dependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 - '@types/node@25.5.0': + '@types/node@25.6.0': dependencies: - undici-types: 7.18.2 + undici-types: 7.19.2 '@types/yauzl@2.10.3': dependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 optional: true accepts@2.0.0: @@ -2602,7 +2602,7 @@ snapshots: asynckit@0.4.0: {} - axios@1.14.0: + axios@1.15.0: dependencies: follow-redirects: 1.15.11(debug@4.4.3) form-data: 4.0.5 @@ -2614,24 +2614,24 @@ snapshots: bare-events@2.8.2: {} - bare-fs@4.5.6: + bare-fs@4.7.0: dependencies: bare-events: 2.8.2 bare-path: 3.0.0 - bare-stream: 2.12.0(bare-events@2.8.2) + bare-stream: 2.13.0(bare-events@2.8.2) bare-url: 2.4.0 fast-fifo: 1.3.2 transitivePeerDependencies: - bare-abort-controller - react-native-b4a - bare-os@3.8.6: {} + bare-os@3.8.7: {} bare-path@3.0.0: dependencies: - bare-os: 3.8.6 + bare-os: 3.8.7 - bare-stream@2.12.0(bare-events@2.8.2): + bare-stream@2.13.0(bare-events@2.8.2): dependencies: streamx: 2.25.0 teex: 1.0.1 @@ -2648,13 +2648,13 @@ snapshots: dependencies: safe-buffer: 5.2.1 - baseline-browser-mapping@2.10.13: {} + baseline-browser-mapping@2.10.17: {} basic-auth@2.0.1: dependencies: safe-buffer: 5.1.2 - basic-ftp@5.2.0: {} + basic-ftp@5.2.2: {} body-parser@2.2.2: dependencies: @@ -2664,7 +2664,7 @@ snapshots: http-errors: 2.0.1 iconv-lite: 0.7.2 on-finished: 2.4.1 - qs: 6.15.0 + qs: 6.15.1 raw-body: 3.0.2 type-is: 2.0.1 transitivePeerDependencies: @@ -2676,9 +2676,9 @@ snapshots: browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.10.13 - caniuse-lite: 1.0.30001784 - electron-to-chromium: 1.5.331 + baseline-browser-mapping: 2.10.17 + caniuse-lite: 1.0.30001787 + electron-to-chromium: 1.5.335 node-releases: 2.0.37 update-browserslist-db: 1.2.3(browserslist@4.28.2) @@ -2702,7 +2702,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001784: {} + caniuse-lite@1.0.30001787: {} chalk@4.1.2: dependencies: @@ -2746,7 +2746,7 @@ snapshots: tree-kill: 1.2.2 yargs: 17.7.2 - content-disposition@1.0.1: {} + content-disposition@1.1.0: {} content-type@1.0.5: {} @@ -2808,7 +2808,7 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.331: {} + electron-to-chromium@1.5.335: {} emoji-regex@8.0.0: {} @@ -2871,7 +2871,7 @@ snapshots: dependencies: accepts: 2.0.0 body-parser: 2.2.2 - content-disposition: 1.0.1 + content-disposition: 1.1.0 content-type: 1.0.5 cookie: 0.7.2 cookie-signature: 1.2.2 @@ -2889,7 +2889,7 @@ snapshots: once: 1.4.0 parseurl: 1.3.3 proxy-addr: 2.0.7 - qs: 6.15.0 + qs: 6.15.1 range-parser: 1.2.1 router: 2.2.0 send: 1.2.1 @@ -2977,7 +2977,7 @@ snapshots: get-uri@6.0.5: dependencies: - basic-ftp: 5.2.0 + basic-ftp: 5.2.2 data-uri-to-buffer: 6.0.2 debug: 4.4.3 transitivePeerDependencies: @@ -3255,7 +3255,7 @@ snapshots: negotiator@1.0.0: {} - netmask@2.0.2: {} + netmask@2.1.1: {} node-addon-api@6.1.0: {} @@ -3313,28 +3313,28 @@ snapshots: pac-resolver@7.0.1: dependencies: degenerator: 5.0.1 - netmask: 2.0.2 + netmask: 2.1.1 - parcel-resolver-ignore@2.2.1(@parcel/core@2.16.4(@swc/helpers@0.5.20)): + parcel-resolver-ignore@2.2.1(@parcel/core@2.16.4(@swc/helpers@0.5.21)): dependencies: - '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/plugin': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) transitivePeerDependencies: - '@parcel/core' - napi-wasm - parcel@2.16.4(@swc/helpers@0.5.20): + parcel@2.16.4(@swc/helpers@0.5.21): dependencies: - '@parcel/config-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(@swc/helpers@0.5.20) - '@parcel/core': 2.16.4(@swc/helpers@0.5.20) + '@parcel/config-default': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))(@swc/helpers@0.5.21) + '@parcel/core': 2.16.4(@swc/helpers@0.5.21) '@parcel/diagnostic': 2.16.4 '@parcel/events': 2.16.4 '@parcel/feature-flags': 2.16.4 - '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/fs': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/logger': 2.16.4 - '@parcel/package-manager': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20))(@swc/helpers@0.5.20) - '@parcel/reporter-cli': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/reporter-dev-server': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) - '@parcel/reporter-tracer': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.20)) + '@parcel/package-manager': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21))(@swc/helpers@0.5.21) + '@parcel/reporter-cli': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/reporter-dev-server': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) + '@parcel/reporter-tracer': 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) '@parcel/utils': 2.16.4 chalk: 4.1.2 commander: 12.1.0 @@ -3440,7 +3440,7 @@ snapshots: - typescript - utf-8-validate - qs@6.15.0: + qs@6.15.1: dependencies: side-channel: 1.1.0 @@ -3518,7 +3518,7 @@ snapshots: shell-quote@1.8.3: {} - side-channel-list@1.0.0: + side-channel-list@1.0.1: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 @@ -3542,7 +3542,7 @@ snapshots: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 - side-channel-list: 1.0.0 + side-channel-list: 1.0.1 side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 @@ -3598,7 +3598,7 @@ snapshots: pump: 3.0.4 tar-stream: 3.1.8 optionalDependencies: - bare-fs: 4.5.6 + bare-fs: 4.7.0 bare-path: 3.0.0 transitivePeerDependencies: - bare-abort-controller @@ -3608,7 +3608,7 @@ snapshots: tar-stream@3.1.8: dependencies: b4a: 1.8.0 - bare-fs: 4.5.6 + bare-fs: 4.7.0 fast-fifo: 1.3.2 streamx: 2.25.0 transitivePeerDependencies: @@ -3651,11 +3651,11 @@ snapshots: typed-query-selector@2.12.1: {} - undici-types@7.18.2: {} + undici-types@7.19.2: {} union@0.5.0: dependencies: - qs: 6.15.0 + qs: 6.15.1 unpipe@1.0.0: {} @@ -3671,9 +3671,9 @@ snapshots: vary@1.1.2: {} - wait-on@9.0.4: + wait-on@9.0.5: dependencies: - axios: 1.14.0 + axios: 1.15.0 joi: 18.1.2 lodash: 4.18.1 minimist: 1.2.8 From 69dc895222d9ea4d322b33a3afc5165ca2eb001f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Apr 2026 06:04:02 +0000 Subject: [PATCH 108/430] Bump softprops/action-gh-release from 2.6.1 to 3.0.0 Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2.6.1 to 3.0.0. - [Release notes](https://github.com/softprops/action-gh-release/releases) - [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/softprops/action-gh-release/compare/v2.6.1...v3.0.0) --- updated-dependencies: - dependency-name: softprops/action-gh-release dependency-version: 3.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9cde305ae..80c2229c6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -177,7 +177,7 @@ jobs: with: path: ./CHANGELOG.md version: ${{ steps.get-version.outputs.version-without-v }} - - uses: softprops/action-gh-release@v2.6.1 + - uses: softprops/action-gh-release@v3.0.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: From 1a2e1014241cc41bf205769ab2616d3332f5ca1c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Apr 2026 06:04:41 +0000 Subject: [PATCH 109/430] Bump org.jboss:jboss-parent from 52 to 53 Bumps [org.jboss:jboss-parent](https://github.com/jboss/jboss-parent-pom) from 52 to 53. - [Release notes](https://github.com/jboss/jboss-parent-pom/releases) - [Commits](https://github.com/jboss/jboss-parent-pom/commits) --- updated-dependencies: - dependency-name: org.jboss:jboss-parent dependency-version: '53' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 33e3cbc0f..50d82a0d3 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ org.jboss jboss-parent - 52 + 53 org.patternfly From 524ec046abd3aa5da79f79439116a9448bb51e39 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 21 Apr 2026 09:44:49 +0200 Subject: [PATCH 110/430] Fix Javadoc format issues --- .../java/org/patternfly/component/menu/MenuToggle.java | 3 +-- .../patternfly/component/timestamp/TimestampFormat.java | 7 ++----- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/components/src/main/java/org/patternfly/component/menu/MenuToggle.java b/components/src/main/java/org/patternfly/component/menu/MenuToggle.java index 4369c048e..1f38e3c37 100644 --- a/components/src/main/java/org/patternfly/component/menu/MenuToggle.java +++ b/components/src/main/java/org/patternfly/component/menu/MenuToggle.java @@ -66,8 +66,7 @@ * implementations. Using a menu toggle with a menu enables you to create custom component configurations not supported by the * standard dropdown or select components. * - * @see https://www.patternfly.org/components/menus/menu-toggle + * @see https://www.patternfly.org/components/menus/menu-toggle */ public class MenuToggle extends BaseComponent implements ComponentIcon, diff --git a/components/src/main/java/org/patternfly/component/timestamp/TimestampFormat.java b/components/src/main/java/org/patternfly/component/timestamp/TimestampFormat.java index ebf0ba1d2..52bec6042 100644 --- a/components/src/main/java/org/patternfly/component/timestamp/TimestampFormat.java +++ b/components/src/main/java/org/patternfly/component/timestamp/TimestampFormat.java @@ -17,17 +17,14 @@ /** * Enum representing various timestamp formats–for {@code dateStyle} and - * {@code timeStyle}–based on the Intl.DateTimeFormat + * {@code timeStyle}–based on the Intl.DateTimeFormat * API. - * *

    * The formats correspond to the standard JavaScript Intl.DateTimeFormat * options: *

    *
      - *
    • {@code full} - Tuesday, August 9, 2022 | 11:25:00 AM Eastern - * Daylight Time
    • + *
    • {@code full} - Tuesday, August 9, 2022 | 11:25:00 AM Eastern Daylight Time
    • *
    • {@code long} - August 9, 2022 | 11:25:00 AM EDT
    • *
    • {@code medium} - Aug 9, 2022 | 11:25:00 AM
    • *
    • {@code short} - 8/9/22 | 11:25 AM
    • From dbc4083ca66c30cebe0dadefb4d3f8a0e225f5e0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Apr 2026 06:05:18 +0000 Subject: [PATCH 111/430] Bump com.fasterxml.jackson.core:jackson-databind from 2.21.2 to 2.21.3 Bumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.21.2 to 2.21.3. - [Commits](https://github.com/FasterXML/jackson/commits) --- updated-dependencies: - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-version: 2.21.3 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- core/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/pom.xml b/core/pom.xml index f8a68c11b..fb051aa4f 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -33,7 +33,7 @@ PatternFly Java core components and layouts - 2.21.2 + 2.21.3 From e10c68882af85a5491b6030dc70dc0b31a99f688 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 May 2026 06:06:42 +0000 Subject: [PATCH 112/430] Bump org.kie.j2cl.tools:j2cl-maven-plugin from 0.23.6 to 0.23.7 Bumps [org.kie.j2cl.tools:j2cl-maven-plugin](https://github.com/vertispan/j2clmavenplugin) from 0.23.6 to 0.23.7. - [Release notes](https://github.com/vertispan/j2clmavenplugin/releases) - [Changelog](https://github.com/Vertispan/j2clmavenplugin/blob/main/RELEASE.md) - [Commits](https://github.com/vertispan/j2clmavenplugin/commits) --- updated-dependencies: - dependency-name: org.kie.j2cl.tools:j2cl-maven-plugin dependency-version: 0.23.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 50d82a0d3..50794e5b8 100644 --- a/pom.xml +++ b/pom.xml @@ -94,7 +94,7 @@ 0.2.0 2.0.0 1.2.0 - 0.23.6 + 0.23.7 1.13.0 3.12.0 2.1.1 From 1534f3f2e0f33267f7f34ea1cf6a77459164cdde Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Fri, 8 May 2026 08:42:33 +0200 Subject: [PATCH 113/430] Fix NPM vulnerabilities --- showcase/pnpm-lock.yaml | 46 +++++++++++++++++++++--------------- showcase/pnpm-workspace.yaml | 24 +++++++------------ 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/showcase/pnpm-lock.yaml b/showcase/pnpm-lock.yaml index e895dcc9a..61566dea1 100644 --- a/showcase/pnpm-lock.yaml +++ b/showcase/pnpm-lock.yaml @@ -4,6 +4,14 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + axios@>=1.0.0 <1.15.1: '>=1.15.1' + axios@>=1.0.0 <1.15.2: '>=1.15.2' + basic-ftp@<=5.2.2: '>=5.3.0' + basic-ftp@<=5.3.0: '>=5.3.1' + follow-redirects@<=1.15.11: '>=1.16.0' + ip-address@<=10.1.0: '>=10.1.1' + importers: .: @@ -34,8 +42,8 @@ importers: specifier: ^2.16.4 version: 2.16.4(@parcel/core@2.16.4(@swc/helpers@0.5.21)) basic-ftp: - specifier: ^5.2.2 - version: 5.2.2 + specifier: '>=5.3.1' + version: 6.0.1 concurrently: specifier: ^9.2.1 version: 9.2.1 @@ -685,8 +693,8 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - axios@1.15.0: - resolution: {integrity: sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==} + axios@1.16.0: + resolution: {integrity: sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==} b4a@1.8.0: resolution: {integrity: sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==} @@ -749,8 +757,8 @@ packages: resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} engines: {node: '>= 0.8'} - basic-ftp@5.2.2: - resolution: {integrity: sha512-1tDrzKsdCg70WGvbFss/ulVAxupNauGnOlgpyjKzeQxzyllBLS0CGLV7tjIXTK3ZQA9/FBEm9qyFFN1bciA6pw==} + basic-ftp@6.0.1: + resolution: {integrity: sha512-3ilxa3n4276wGQp/ImRAuz4ALdsj/2Wd3FqoZBZlajDYnByCZ0JMb4+26Rde0wGXIbM0G2HWSfr/Fi8b21KX8g==} engines: {node: '>=10.0.0'} body-parser@2.2.2: @@ -1020,8 +1028,8 @@ packages: resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} engines: {node: '>= 18.0.0'} - follow-redirects@1.15.11: - resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -1144,8 +1152,8 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - ip-address@10.1.0: - resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} + ip-address@10.2.0: + resolution: {integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==} engines: {node: '>= 12'} ipaddr.js@1.9.1: @@ -2602,9 +2610,9 @@ snapshots: asynckit@0.4.0: {} - axios@1.15.0: + axios@1.16.0: dependencies: - follow-redirects: 1.15.11(debug@4.4.3) + follow-redirects: 1.16.0(debug@4.4.3) form-data: 4.0.5 proxy-from-env: 2.1.0 transitivePeerDependencies: @@ -2654,7 +2662,7 @@ snapshots: dependencies: safe-buffer: 5.1.2 - basic-ftp@5.2.2: {} + basic-ftp@6.0.1: {} body-parser@2.2.2: dependencies: @@ -2931,7 +2939,7 @@ snapshots: transitivePeerDependencies: - supports-color - follow-redirects@1.15.11(debug@4.4.3): + follow-redirects@1.16.0(debug@4.4.3): optionalDependencies: debug: 4.4.3 @@ -2977,7 +2985,7 @@ snapshots: get-uri@6.0.5: dependencies: - basic-ftp: 5.2.2 + basic-ftp: 6.0.1 data-uri-to-buffer: 6.0.2 debug: 4.4.3 transitivePeerDependencies: @@ -3038,7 +3046,7 @@ snapshots: http-proxy@1.18.1(debug@4.4.3): dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.11(debug@4.4.3) + follow-redirects: 1.16.0(debug@4.4.3) requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -3084,7 +3092,7 @@ snapshots: inherits@2.0.4: {} - ip-address@10.1.0: {} + ip-address@10.2.0: {} ipaddr.js@1.9.1: {} @@ -3558,7 +3566,7 @@ snapshots: socks@2.8.7: dependencies: - ip-address: 10.1.0 + ip-address: 10.2.0 smart-buffer: 4.2.0 source-map@0.6.1: @@ -3673,7 +3681,7 @@ snapshots: wait-on@9.0.5: dependencies: - axios: 1.15.0 + axios: 1.16.0 joi: 18.1.2 lodash: 4.18.1 minimist: 1.2.8 diff --git a/showcase/pnpm-workspace.yaml b/showcase/pnpm-workspace.yaml index ae7844941..7f54ece4f 100644 --- a/showcase/pnpm-workspace.yaml +++ b/showcase/pnpm-workspace.yaml @@ -1,19 +1,3 @@ -# -# Copyright 2023 Red Hat -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - ignoredBuiltDependencies: - '@swc/core' - lmdb @@ -22,3 +6,11 @@ ignoredBuiltDependencies: onlyBuiltDependencies: - '@parcel/watcher' + +overrides: + axios@>=1.0.0 <1.15.1: '>=1.15.1' + axios@>=1.0.0 <1.15.2: '>=1.15.2' + basic-ftp@<=5.2.2: '>=5.3.0' + basic-ftp@<=5.3.0: '>=5.3.1' + follow-redirects@<=1.15.11: '>=1.16.0' + ip-address@<=10.1.0: '>=10.1.1' From 8e56a8c842aabe57324233e2ca80527e075fed44 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Sun, 10 May 2026 17:00:05 +0200 Subject: [PATCH 114/430] feat: Add Menu.load() and make Menu.reload() return Promise Add a public load() method to Menu for loading async menu items. Change reload() from void to Promise for async support. Remove internal loadAll() method, replaced by the public load(). Update changelog with recent changes. --- CHANGELOG.md | 17 ++++++++ .../org/patternfly/component/menu/Menu.java | 43 ++++++++++--------- .../component/menu/MenuToggleMenu.java | 2 +- .../component/menu/PopperMenuToggleMenu.java | 2 +- 4 files changed, 42 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b8c9a415..459fda65d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,23 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +### Added + +- Add `Menu.load()` method to load async menu items + +### Changed + +- Change `Menu.reload()` return type from `void` to `Promise` for async support +- Bump `j2cl-maven-plugin` from 0.23.6 to 0.23.7 +- Bump `jackson-databind` from 2.21.2 to 2.21.3 +- Bump `jboss-parent` from 52 to 53 + +### Fixed + +- Fix NPM vulnerabilities +- Fix Javadoc format issues +- Fix showcase CI jobs + ## [0.7.3] - 2026-04-02 ### Removed diff --git a/components/src/main/java/org/patternfly/component/menu/Menu.java b/components/src/main/java/org/patternfly/component/menu/Menu.java index b1c6aef9d..06b65154f 100644 --- a/components/src/main/java/org/patternfly/component/menu/Menu.java +++ b/components/src/main/java/org/patternfly/component/menu/Menu.java @@ -294,17 +294,37 @@ public List items() { return items; } - public void reload() { + @SuppressWarnings({"unchecked", "RedundantSuppression"}) + public Promise load() { if (content != null) { + List>> promises = new ArrayList<>(); for (MenuGroup group : content.groups) { if (group.list != null) { - group.list.reload(); + promises.add(group.list.load()); } } if (content.list != null) { - content.list.reload(); + promises.add(content.list.load()); } + return Promise.all(promises.toArray(new Promise[0])).then((__) -> Promise.resolve((Void) null)); } + return Promise.resolve((Void) null); + } + + public Promise reload() { + if (content != null) { + List>> promises = new ArrayList<>(); + for (MenuGroup group : content.groups) { + if (group.list != null) { + promises.add(group.list.reload()); + } + } + if (content.list != null) { + promises.add(content.list.reload()); + } + return Promise.all(promises.toArray(new Promise[0])).then((__) -> Promise.resolve((Void) null)); + } + return Promise.resolve((Void) null); } public void select(String identifier) { @@ -468,23 +488,6 @@ private void unselectAllInGroup(MenuItem item) { } } - @SuppressWarnings({"unchecked", "RedundantSuppression"}) - Promise loadAll() { - if (content != null) { - List>> promises = new ArrayList<>(); - for (MenuGroup group : content.groups) { - if (group.list != null && group.list.status() == pending) { - promises.add(group.list.load()); - } - } - if (content.list != null && content.list.status() == pending) { - promises.add(content.list.load()); - } - return Promise.all(promises.toArray(new Promise[0])).then((__) -> Promise.resolve((Void) null)); - } - return Promise.resolve((Void) null); - } - // ------------------------------------------------------ keyboard navigation private void keyHandler(KeyboardEvent event) { diff --git a/components/src/main/java/org/patternfly/component/menu/MenuToggleMenu.java b/components/src/main/java/org/patternfly/component/menu/MenuToggleMenu.java index 7e4fb8b62..694196982 100644 --- a/components/src/main/java/org/patternfly/component/menu/MenuToggleMenu.java +++ b/components/src/main/java/org/patternfly/component/menu/MenuToggleMenu.java @@ -244,7 +244,7 @@ public void expand(boolean fireEvent) { toggleHandler.forEach(th -> th.onToggle(new Event(""), that(), true)); } if (menu.hasAsyncItems()) { - menu.loadAll().then(__ -> { + menu.load().then(__ -> { loadedHandler.forEach(th -> th.handle(new Event(""), that())); return null; }); diff --git a/components/src/main/java/org/patternfly/component/menu/PopperMenuToggleMenu.java b/components/src/main/java/org/patternfly/component/menu/PopperMenuToggleMenu.java index b18431cb9..738c8fbe8 100644 --- a/components/src/main/java/org/patternfly/component/menu/PopperMenuToggleMenu.java +++ b/components/src/main/java/org/patternfly/component/menu/PopperMenuToggleMenu.java @@ -255,7 +255,7 @@ public void expand(boolean fireEvent) { toggleHandler.forEach(th -> th.onToggle(new Event(""), that(), true)); } if (menu.hasAsyncItems()) { - menu.loadAll().then(__ -> { + menu.load().then(__ -> { loadedHandler.forEach(th -> th.handle(new Event(""), that())); return null; }); From c704a5de8da48faa1fef2a4f6d0307a9566e191a Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Sun, 10 May 2026 17:01:21 +0200 Subject: [PATCH 115/430] Release 0.7.4 --- CHANGELOG.md | 5 ++++- README.md | 2 +- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 22 files changed, 25 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 459fda65d..a12f17a4f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +## [0.7.4] - 2026-05-10 + ### Added - Add `Menu.load()` method to load async menu items @@ -982,7 +984,8 @@ Stay tuned for more to come... -[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.3...HEAD +[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.4...HEAD +[0.7.4]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.3...v0.7.4 [0.7.3]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.2...v0.7.3 [0.7.2]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.1...v0.7.2 [0.7.1]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.0...v0.7.1 diff --git a/README.md b/README.md index 29da0b1d5..25434a007 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.7.3 + 0.7.4 pom import diff --git a/apidoc/pom.xml b/apidoc/pom.xml index e60d1689c..5036329a1 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.4-SNAPSHOT + 0.7.4 ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index d1c2ddcfa..937841a66 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.7.4-SNAPSHOT + 0.7.4 pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index 6a0c80219..d9b68d751 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.4-SNAPSHOT + 0.7.4 ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index c6cfebc48..95afc6fd1 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.7.4-SNAPSHOT", + "version": "0.7.4", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 56e67d55e..0cf5e8bbe 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.4-SNAPSHOT + 0.7.4 ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 8a57cc17c..d119eed52 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.4-SNAPSHOT + 0.7.4 ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 0226cb9d5..65dfe9bc9 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.4-SNAPSHOT + 0.7.4 ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 02be2e7f9..13d4319b4 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.7.4-SNAPSHOT", + "version": "0.7.4", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index fb051aa4f..749382698 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.4-SNAPSHOT + 0.7.4 ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 6626804ec..4a7d79eb9 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.4-SNAPSHOT + 0.7.4 ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index e7b64c936..79c2918cf 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.7.4-SNAPSHOT", + "version": "0.7.4", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index b695c285e..8e2330c07 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.4-SNAPSHOT + 0.7.4 ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 4ac9c2f49..75ca029a6 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.4-SNAPSHOT + 0.7.4 ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index 3c385b3e0..09d105fc2 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.4-SNAPSHOT + 0.7.4 ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index daa0917e3..978045a1b 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.4-SNAPSHOT + 0.7.4 ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 59a88c7f0..04ef0d8a7 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.4-SNAPSHOT + 0.7.4 ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 50794e5b8..5f1b1ae22 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.7.4-SNAPSHOT + 0.7.4 pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index 4cd317dfe..4828fb4a2 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.4-SNAPSHOT + 0.7.4 ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 631cfcc9c..a8edfe83f 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.7.4-SNAPSHOT + 0.7.4 pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 741d8a21a..b54b235a4 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.4-SNAPSHOT + 0.7.4 ../code-parent/pom.xml From af7fc5ced7ec5240332700b0d329cfebef1daf05 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Sun, 10 May 2026 17:01:30 +0200 Subject: [PATCH 116/430] Next is 0.7.5 --- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 5036329a1..ef07fe12e 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.4 + 0.7.5-SNAPSHOT ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 937841a66..07b383af0 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.7.4 + 0.7.5-SNAPSHOT pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index d9b68d751..b6d7d873f 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.4 + 0.7.5-SNAPSHOT ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 95afc6fd1..18073c1ba 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.7.4", + "version": "0.7.5-SNAPSHOT", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 0cf5e8bbe..329812439 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.4 + 0.7.5-SNAPSHOT ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index d119eed52..5d8f163e1 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.4 + 0.7.5-SNAPSHOT ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 65dfe9bc9..cdea51017 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.4 + 0.7.5-SNAPSHOT ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 13d4319b4..ad93a5396 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.7.4", + "version": "0.7.5-SNAPSHOT", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 749382698..f0f8f2f45 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.4 + 0.7.5-SNAPSHOT ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 4a7d79eb9..22216ab1d 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.4 + 0.7.5-SNAPSHOT ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 79c2918cf..1075a829f 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.7.4", + "version": "0.7.5-SNAPSHOT", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index 8e2330c07..4494ed11a 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.4 + 0.7.5-SNAPSHOT ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 75ca029a6..81d6e1a9a 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.4 + 0.7.5-SNAPSHOT ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index 09d105fc2..0fdd82411 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.4 + 0.7.5-SNAPSHOT ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 978045a1b..7ba566264 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.4 + 0.7.5-SNAPSHOT ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 04ef0d8a7..7ce805d6b 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.4 + 0.7.5-SNAPSHOT ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 5f1b1ae22..57d30b8a6 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.7.4 + 0.7.5-SNAPSHOT pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index 4828fb4a2..cb3923771 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.4 + 0.7.5-SNAPSHOT ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index a8edfe83f..4c8416000 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.7.4 + 0.7.5-SNAPSHOT pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index b54b235a4..068d4edbc 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.4 + 0.7.5-SNAPSHOT ../code-parent/pom.xml From c08f45e2005342096314de62747b56ec1263801b Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Sun, 10 May 2026 17:13:39 +0200 Subject: [PATCH 117/430] fix: Fix format string bug, variable assignment bug, and null guard Fix '$s' format specifier in Validation.verifyEnum() (should be '%s'). Fix VariableAssignments.HTMLElement using variable.name instead of the computed property name that includes breakpoint suffixes. Add null guard in Overlay.recalculatePlacement() to prevent NPE. --- core/src/main/java/org/patternfly/core/Validation.java | 4 ++-- core/src/main/java/org/patternfly/overlay/Overlay.java | 3 +++ .../main/java/org/patternfly/style/VariableAssignments.java | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/org/patternfly/core/Validation.java b/core/src/main/java/org/patternfly/core/Validation.java index 46506b940..190016dd8 100644 --- a/core/src/main/java/org/patternfly/core/Validation.java +++ b/core/src/main/java/org/patternfly/core/Validation.java @@ -40,8 +40,8 @@ public static > boolean verifyEnum(Element element, String pro E... otherAllowedValues) { EnumSet allowed = EnumSet.of(firstAllowedValue, otherAllowedValues); if (!allowed.contains(value)) { - logger.warn("Unsupported value for '%s' in element %o. Given: %s, allowed $s.", - property, element, value.name(), allowed.stream().map(Enum::name).collect(joining())); + logger.warn("Unsupported value for '%s' in element %o. Given: %s, allowed %s.", + property, element, value.name(), allowed.stream().map(Enum::name).collect(joining(", "))); return false; } return true; diff --git a/core/src/main/java/org/patternfly/overlay/Overlay.java b/core/src/main/java/org/patternfly/overlay/Overlay.java index b42812b6b..4efa274e6 100644 --- a/core/src/main/java/org/patternfly/overlay/Overlay.java +++ b/core/src/main/java/org/patternfly/overlay/Overlay.java @@ -436,6 +436,9 @@ private void internalHide(Event event) { // ------------------------------------------------------ placement calculation (cssPositioning == false) private void recalculatePlacement() { + if (trigger == null) { + return; + } Placement best = bestPlacement(); if (!overlayElement.classList.contains(best.modifier())) { logger.debug("Best placement for %s is now %s", id, best.name()); diff --git a/core/src/main/java/org/patternfly/style/VariableAssignments.java b/core/src/main/java/org/patternfly/style/VariableAssignments.java index c932b7611..4867dbcb6 100644 --- a/core/src/main/java/org/patternfly/style/VariableAssignments.java +++ b/core/src/main/java/org/patternfly/style/VariableAssignments.java @@ -62,7 +62,7 @@ public void set(Breakpoints breakpoints, Function stringValue) for (Tuple breakpoint : breakpoints) { String property = breakpoint.key == default_ ? variable.name : variable.name + "-on-" + breakpoint.key.value; String value = stringValue.apply(breakpoint.value); - element.style.setProperty(variable.name, value); + element.style.setProperty(property, value); } } } From 7e344cf2da70d69272c33a1ef9b11888a290ee70 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Sun, 10 May 2026 17:30:27 +0200 Subject: [PATCH 118/430] refactor: Address code review findings in core module - Reduce Tuples factory duplication from 10 overloads to varargs - Reduce Breakpoints factory internal duplication using List.of() - Extract shared breakpoint logic in VariableAssignments to eliminate triplication - Protect DataProvider collections from external mutation via unmodifiableCollection - Enhance PopperBuilder @Deprecated with since and forRemoval metadata - Document unchecked cast contract on Filter.get() --- .../main/java/org/patternfly/core/Tuples.java | 164 +----------------- .../patternfly/dataprovider/DataProvider.java | 7 +- .../java/org/patternfly/filter/Filter.java | 4 +- .../org/patternfly/popper/PopperBuilder.java | 2 +- .../org/patternfly/style/Breakpoints.java | 48 ++--- .../patternfly/style/VariableAssignments.java | 67 ++++--- 6 files changed, 55 insertions(+), 237 deletions(-) diff --git a/core/src/main/java/org/patternfly/core/Tuples.java b/core/src/main/java/org/patternfly/core/Tuples.java index 31f656276..970c28e8c 100644 --- a/core/src/main/java/org/patternfly/core/Tuples.java +++ b/core/src/main/java/org/patternfly/core/Tuples.java @@ -21,6 +21,7 @@ import java.util.stream.Stream; import java.util.stream.StreamSupport; +import static java.util.Arrays.asList; import static java.util.stream.Collectors.joining; import static org.patternfly.core.Tuple.tuple; @@ -28,166 +29,9 @@ public class Tuples implements Iterable> { // ------------------------------------------------------ factory - public static Tuples tuples(K key, V value) { - List> tuples = new ArrayList<>(); - tuples.add(new Tuple<>(key, value)); - return new Tuples<>(tuples); - } - - public static Tuples tuples( - K key1, V value1, - K key2, V value2) { - List> tuples = new ArrayList<>(); - tuples.add(new Tuple<>(key1, value1)); - tuples.add(new Tuple<>(key2, value2)); - return new Tuples<>(tuples); - } - - public static Tuples tuples( - K key1, V value1, - K key2, V value2, - K key3, V value3) { - List> tuples = new ArrayList<>(); - tuples.add(new Tuple<>(key1, value1)); - tuples.add(new Tuple<>(key2, value2)); - tuples.add(new Tuple<>(key3, value3)); - return new Tuples<>(tuples); - } - - public static Tuples tuples( - K key1, V value1, - K key2, V value2, - K key3, V value3, - K key4, V value4) { - List> tuples = new ArrayList<>(); - tuples.add(new Tuple<>(key1, value1)); - tuples.add(new Tuple<>(key2, value2)); - tuples.add(new Tuple<>(key3, value3)); - tuples.add(new Tuple<>(key4, value4)); - return new Tuples<>(tuples); - } - - public static Tuples tuples( - K key1, V value1, - K key2, V value2, - K key3, V value3, - K key4, V value4, - K key5, V value5) { - List> tuples = new ArrayList<>(); - tuples.add(new Tuple<>(key1, value1)); - tuples.add(new Tuple<>(key2, value2)); - tuples.add(new Tuple<>(key3, value3)); - tuples.add(new Tuple<>(key4, value4)); - tuples.add(new Tuple<>(key5, value5)); - return new Tuples<>(tuples); - } - - public static Tuples tuples( - K key1, V value1, - K key2, V value2, - K key3, V value3, - K key4, V value4, - K key5, V value5, - K key6, V value6) { - List> tuples = new ArrayList<>(); - tuples.add(new Tuple<>(key1, value1)); - tuples.add(new Tuple<>(key2, value2)); - tuples.add(new Tuple<>(key3, value3)); - tuples.add(new Tuple<>(key4, value4)); - tuples.add(new Tuple<>(key5, value5)); - tuples.add(new Tuple<>(key6, value6)); - return new Tuples<>(tuples); - } - - public static Tuples tuples( - K key1, V value1, - K key2, V value2, - K key3, V value3, - K key4, V value4, - K key5, V value5, - K key6, V value6, - K key7, V value7) { - List> tuples = new ArrayList<>(); - tuples.add(new Tuple<>(key1, value1)); - tuples.add(new Tuple<>(key2, value2)); - tuples.add(new Tuple<>(key3, value3)); - tuples.add(new Tuple<>(key4, value4)); - tuples.add(new Tuple<>(key5, value5)); - tuples.add(new Tuple<>(key6, value6)); - tuples.add(new Tuple<>(key7, value7)); - return new Tuples<>(tuples); - } - - public static Tuples tuples( - K key1, V value1, - K key2, V value2, - K key3, V value3, - K key4, V value4, - K key5, V value5, - K key6, V value6, - K key7, V value7, - K key8, V value8) { - //noinspection DuplicatedCode - List> tuples = new ArrayList<>(); - tuples.add(new Tuple<>(key1, value1)); - tuples.add(new Tuple<>(key2, value2)); - tuples.add(new Tuple<>(key3, value3)); - tuples.add(new Tuple<>(key4, value4)); - tuples.add(new Tuple<>(key5, value5)); - tuples.add(new Tuple<>(key6, value6)); - tuples.add(new Tuple<>(key7, value7)); - tuples.add(new Tuple<>(key8, value8)); - return new Tuples<>(tuples); - } - - public static Tuples tuples( - K key1, V value1, - K key2, V value2, - K key3, V value3, - K key4, V value4, - K key5, V value5, - K key6, V value6, - K key7, V value7, - K key8, V value8, - K key9, V value9) { - //noinspection DuplicatedCode - List> tuples = new ArrayList<>(); - tuples.add(new Tuple<>(key1, value1)); - tuples.add(new Tuple<>(key2, value2)); - tuples.add(new Tuple<>(key3, value3)); - tuples.add(new Tuple<>(key4, value4)); - tuples.add(new Tuple<>(key5, value5)); - tuples.add(new Tuple<>(key6, value6)); - tuples.add(new Tuple<>(key7, value7)); - tuples.add(new Tuple<>(key8, value8)); - tuples.add(new Tuple<>(key9, value9)); - return new Tuples<>(tuples); - } - - public static Tuples tuples( - K key1, V value1, - K key2, V value2, - K key3, V value3, - K key4, V value4, - K key5, V value5, - K key6, V value6, - K key7, V value7, - K key8, V value8, - K key9, V value9, - K key10, V value10) { - //noinspection DuplicatedCode - List> tuples = new ArrayList<>(); - tuples.add(new Tuple<>(key1, value1)); - tuples.add(new Tuple<>(key2, value2)); - tuples.add(new Tuple<>(key3, value3)); - tuples.add(new Tuple<>(key4, value4)); - tuples.add(new Tuple<>(key5, value5)); - tuples.add(new Tuple<>(key6, value6)); - tuples.add(new Tuple<>(key7, value7)); - tuples.add(new Tuple<>(key8, value8)); - tuples.add(new Tuple<>(key9, value9)); - tuples.add(new Tuple<>(key10, value10)); - return new Tuples<>(tuples); + @SafeVarargs + public static Tuples tuples(Tuple... tuples) { + return new Tuples<>(asList(tuples)); } public static Tuples tuples(List> tuples) { diff --git a/core/src/main/java/org/patternfly/dataprovider/DataProvider.java b/core/src/main/java/org/patternfly/dataprovider/DataProvider.java index 1ab7408ef..25b6b86c0 100644 --- a/core/src/main/java/org/patternfly/dataprovider/DataProvider.java +++ b/core/src/main/java/org/patternfly/dataprovider/DataProvider.java @@ -32,6 +32,7 @@ import static java.lang.Math.min; import static java.util.Collections.emptyList; +import static java.util.Collections.unmodifiableCollection; import static java.util.function.Function.identity; import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toMap; @@ -112,15 +113,15 @@ public Function getIdentifier() { } public Iterable getAllItems() { - return allItems.values(); + return unmodifiableCollection(allItems.values()); } public Iterable getFilteredItems() { - return filteredItems.values(); + return unmodifiableCollection(filteredItems.values()); } public Iterable getVisibleItems() { - return visibleItems.values(); + return unmodifiableCollection(visibleItems.values()); } // ------------------------------------------------------ selection diff --git a/core/src/main/java/org/patternfly/filter/Filter.java b/core/src/main/java/org/patternfly/filter/Filter.java index de87821bb..3fcbdcf3e 100644 --- a/core/src/main/java/org/patternfly/filter/Filter.java +++ b/core/src/main/java/org/patternfly/filter/Filter.java @@ -165,7 +165,9 @@ public boolean defined(String name) { } /** - * Retrieves the filter attribute associated with the given name. + * Retrieves the filter attribute associated with the given name. The caller must ensure that {@code V} matches the type used + * when the attribute was {@linkplain #add(FilterAttribute) added}; a mismatch will cause a {@link ClassCastException} at the + * call site. * * @param name the name of the filter attribute to retrieve * @param the type of the value for the filter attribute diff --git a/core/src/main/java/org/patternfly/popper/PopperBuilder.java b/core/src/main/java/org/patternfly/popper/PopperBuilder.java index 9e0f27ec6..eeaff4107 100644 --- a/core/src/main/java/org/patternfly/popper/PopperBuilder.java +++ b/core/src/main/java/org/patternfly/popper/PopperBuilder.java @@ -43,7 +43,7 @@ import static org.jboss.elemento.Key.Escape; import static org.patternfly.popper.PopperPlacement.auto; -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) public class PopperBuilder { private static final Logger logger = Logger.getLogger(PopperBuilder.class.getName()); diff --git a/core/src/main/java/org/patternfly/style/Breakpoints.java b/core/src/main/java/org/patternfly/style/Breakpoints.java index 4f47467e7..2ecba51d4 100644 --- a/core/src/main/java/org/patternfly/style/Breakpoints.java +++ b/core/src/main/java/org/patternfly/style/Breakpoints.java @@ -15,7 +15,6 @@ */ package org.patternfly.style; -import java.util.ArrayList; import java.util.List; import java.util.function.Function; @@ -91,11 +90,8 @@ public static Breakpoints breakpoints() { /** * Creates a new instance of {@link Breakpoints} with a single tuple containing the given breakpoint and value. */ - public static Breakpoints breakpoints( - Breakpoint breakpoint, V value) { - List> tuples = new ArrayList<>(); - tuples.add(tuple(breakpoint, value)); - return new Breakpoints<>(tuples); + public static Breakpoints breakpoints(Breakpoint breakpoint, V value) { + return new Breakpoints<>(List.of(tuple(breakpoint, value))); } /** @@ -104,10 +100,7 @@ public static Breakpoints breakpoints( public static Breakpoints breakpoints( Breakpoint breakpoint1, V value1, Breakpoint breakpoint2, V value2) { - List> tuples = new ArrayList<>(); - tuples.add(tuple(breakpoint1, value1)); - tuples.add(tuple(breakpoint2, value2)); - return new Breakpoints<>(tuples); + return new Breakpoints<>(List.of(tuple(breakpoint1, value1), tuple(breakpoint2, value2))); } /** @@ -117,11 +110,8 @@ public static Breakpoints breakpoints( Breakpoint breakpoint1, V value1, Breakpoint breakpoint2, V value2, Breakpoint breakpoint3, V value3) { - List> tuples = new ArrayList<>(); - tuples.add(tuple(breakpoint1, value1)); - tuples.add(tuple(breakpoint2, value2)); - tuples.add(tuple(breakpoint3, value3)); - return new Breakpoints<>(tuples); + return new Breakpoints<>(List.of(tuple(breakpoint1, value1), tuple(breakpoint2, value2), + tuple(breakpoint3, value3))); } /** @@ -132,12 +122,8 @@ public static Breakpoints breakpoints( Breakpoint breakpoint2, V value2, Breakpoint breakpoint3, V value3, Breakpoint breakpoint4, V value4) { - List> tuples = new ArrayList<>(); - tuples.add(tuple(breakpoint1, value1)); - tuples.add(tuple(breakpoint2, value2)); - tuples.add(tuple(breakpoint3, value3)); - tuples.add(tuple(breakpoint4, value4)); - return new Breakpoints<>(tuples); + return new Breakpoints<>(List.of(tuple(breakpoint1, value1), tuple(breakpoint2, value2), + tuple(breakpoint3, value3), tuple(breakpoint4, value4))); } /** @@ -149,13 +135,8 @@ public static Breakpoints breakpoints( Breakpoint breakpoint3, V value3, Breakpoint breakpoint4, V value4, Breakpoint breakpoint5, V value5) { - List> tuples = new ArrayList<>(); - tuples.add(tuple(breakpoint1, value1)); - tuples.add(tuple(breakpoint2, value2)); - tuples.add(tuple(breakpoint3, value3)); - tuples.add(tuple(breakpoint4, value4)); - tuples.add(tuple(breakpoint5, value5)); - return new Breakpoints<>(tuples); + return new Breakpoints<>(List.of(tuple(breakpoint1, value1), tuple(breakpoint2, value2), + tuple(breakpoint3, value3), tuple(breakpoint4, value4), tuple(breakpoint5, value5))); } /** @@ -168,14 +149,9 @@ public static Breakpoints breakpoints( Breakpoint breakpoint4, V value4, Breakpoint breakpoint5, V value5, Breakpoint breakpoint6, V value6) { - List> tuples = new ArrayList<>(); - tuples.add(tuple(breakpoint1, value1)); - tuples.add(tuple(breakpoint2, value2)); - tuples.add(tuple(breakpoint3, value3)); - tuples.add(tuple(breakpoint4, value4)); - tuples.add(tuple(breakpoint5, value5)); - tuples.add(tuple(breakpoint6, value6)); - return new Breakpoints<>(tuples); + return new Breakpoints<>(List.of(tuple(breakpoint1, value1), tuple(breakpoint2, value2), + tuple(breakpoint3, value3), tuple(breakpoint4, value4), tuple(breakpoint5, value5), + tuple(breakpoint6, value6))); } /** diff --git a/core/src/main/java/org/patternfly/style/VariableAssignments.java b/core/src/main/java/org/patternfly/style/VariableAssignments.java index 4867dbcb6..1b30ba549 100644 --- a/core/src/main/java/org/patternfly/style/VariableAssignments.java +++ b/core/src/main/java/org/patternfly/style/VariableAssignments.java @@ -15,6 +15,7 @@ */ package org.patternfly.style; +import java.util.function.BiConsumer; import java.util.function.Function; import org.jboss.elemento.HTMLElementStyleMethods; @@ -27,6 +28,30 @@ public class VariableAssignments { + static String propertyName(Variable variable, Breakpoint breakpoint) { + return breakpoint == default_ ? variable.name : variable.name + "-on-" + breakpoint.value; + } + + static Function resolveStringValue(Breakpoints breakpoints, Function explicit) { + if (explicit != null) { + return explicit; + } + if (breakpoints.typedModifier()) { + return v -> ((TypedModifier) v).value(); + } + return String::valueOf; + } + + static void applyBreakpoints(Variable variable, Breakpoints breakpoints, + Function stringValue, BiConsumer applier) { + if (variable.valid && breakpoints != null && !breakpoints.isEmpty()) { + Function fn = resolveStringValue(breakpoints, stringValue); + for (Tuple breakpoint : breakpoints) { + applier.accept(propertyName(variable, breakpoint.key), fn.apply(breakpoint.value)); + } + } + } + public static class HTMLElement { private final Variable variable; @@ -50,21 +75,11 @@ public void set(String value) { } public void set(Breakpoints breakpoints) { - if (breakpoints.typedModifier()) { - set(breakpoints, v -> ((TypedModifier) v).value()); - } else { - set(breakpoints, String::valueOf); - } + set(breakpoints, null); } public void set(Breakpoints breakpoints, Function stringValue) { - if (variable.valid && breakpoints != null && !breakpoints.isEmpty()) { - for (Tuple breakpoint : breakpoints) { - String property = breakpoint.key == default_ ? variable.name : variable.name + "-on-" + breakpoint.key.value; - String value = stringValue.apply(breakpoint.value); - element.style.setProperty(property, value); - } - } + applyBreakpoints(variable, breakpoints, stringValue, element.style::setProperty); } } @@ -93,21 +108,11 @@ public B set(String value) { } public B set(Breakpoints breakpoints) { - if (breakpoints.typedModifier()) { - return set(breakpoints, v -> ((TypedModifier) v).value()); - } else { - return set(breakpoints, String::valueOf); - } + return set(breakpoints, null); } public B set(Breakpoints breakpoints, Function stringValue) { - if (variable.valid && breakpoints != null && !breakpoints.isEmpty()) { - for (Tuple breakpoint : breakpoints) { - String property = breakpoint.key == default_ ? variable.name : variable.name + "-on-" + breakpoint.key.value; - String value = stringValue.apply(breakpoint.value); - element.style(property, value); - } - } + applyBreakpoints(variable, breakpoints, stringValue, element::style); return element.that(); } } @@ -137,21 +142,11 @@ public B set(String value) { } public B set(Breakpoints breakpoints) { - if (breakpoints.typedModifier()) { - return set(breakpoints, v -> ((TypedModifier) v).value()); - } else { - return set(breakpoints, String::valueOf); - } + return set(breakpoints, null); } public B set(Breakpoints breakpoints, Function stringValue) { - if (variable.valid && breakpoints != null && !breakpoints.isEmpty()) { - for (Tuple breakpoint : breakpoints) { - String property = breakpoint.key == default_ ? variable.name : variable.name + "-on-" + breakpoint.key.value; - String value = stringValue.apply(breakpoint.value); - element.style(property, value); - } - } + applyBreakpoints(variable, breakpoints, stringValue, element::style); return element.that(); } } From cbea6a1b65ca7255c03fc4faa0b24dd10dbb2ad9 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Sun, 10 May 2026 17:47:42 +0200 Subject: [PATCH 119/430] chore: Add since and forRemoval attributes to all @Deprecated annotations All bare @Deprecated annotations on Popper.js-based classes and components now include since="0.7.0" and forRemoval=true to clearly communicate the deprecation timeline. --- CHANGELOG.md | 9 +++++++++ .../org/patternfly/component/ComponentType.java | 14 +++++++------- .../patternfly/component/menu/PopperDropdown.java | 2 +- .../component/menu/PopperMenuToggleMenu.java | 2 +- .../component/menu/PopperMultiMenuToggleMenu.java | 2 +- .../component/menu/PopperMultiSelect.java | 2 +- .../component/menu/PopperMultiTypeahead.java | 2 +- .../component/menu/PopperSingleMenuToggleMenu.java | 2 +- .../component/menu/PopperSingleSelect.java | 2 +- .../component/menu/PopperSingleTypeahead.java | 2 +- .../patternfly/component/menu/PopperTypeahead.java | 2 +- .../component/menu/TypeaheadSupport.java | 6 +++--- .../component/popover/PopperPopover.java | 2 +- .../component/popover/PopperPopoverBody.java | 2 +- .../component/popover/PopperPopoverFooter.java | 2 +- .../component/popover/PopperPopoverHeader.java | 2 +- .../popover/PopperPopoverSubComponent.java | 2 +- .../component/tooltip/PopperTooltip.java | 2 +- .../java/org/patternfly/popper/FirstUpdateFn.java | 2 +- .../main/java/org/patternfly/popper/Modifier.java | 2 +- .../org/patternfly/popper/ModifierArguments.java | 2 +- .../java/org/patternfly/popper/ModifierFn.java | 2 +- .../org/patternfly/popper/ModifierOptions.java | 2 +- .../java/org/patternfly/popper/ModifierPhase.java | 2 +- .../main/java/org/patternfly/popper/Modifiers.java | 2 +- .../main/java/org/patternfly/popper/Options.java | 2 +- .../main/java/org/patternfly/popper/Popper.java | 2 +- .../java/org/patternfly/popper/PopperError.java | 2 +- .../java/org/patternfly/popper/PopperImpl.java | 2 +- .../main/java/org/patternfly/popper/PopperJs.java | 2 +- .../org/patternfly/popper/PopperPlacement.java | 2 +- core/src/main/java/org/patternfly/popper/Rect.java | 2 +- .../src/main/java/org/patternfly/popper/State.java | 2 +- .../java/org/patternfly/popper/StateElements.java | 2 +- .../java/org/patternfly/popper/StateRects.java | 2 +- .../org/patternfly/popper/StyleDefinitions.java | 2 +- .../java/org/patternfly/popper/TriggerAction.java | 2 +- .../org/patternfly/popper/UpdateOptionsFn.java | 2 +- 38 files changed, 54 insertions(+), 45 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a12f17a4f..b2587a19e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,15 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +### Changed + +- Add `since` and `forRemoval` attributes to all `@Deprecated` annotations on Popper.js-based classes and components +- Improve null safety, reduce code duplication, and address code review findings in core module + +### Fixed + +- Fix format string bug, variable assignment bug, and null guard in core module + ## [0.7.4] - 2026-05-10 ### Added diff --git a/components/src/main/java/org/patternfly/component/ComponentType.java b/components/src/main/java/org/patternfly/component/ComponentType.java index 3a3118512..d5aedc156 100644 --- a/components/src/main/java/org/patternfly/component/ComponentType.java +++ b/components/src/main/java/org/patternfly/component/ComponentType.java @@ -115,25 +115,25 @@ public enum ComponentType { Panel("pnl", "PF6/Component/Panel"), - @Deprecated + @Deprecated(since = "0.7.0", forRemoval = true) PopperDropdown("pdd", "PF6/Component/PopperDropdown"), - @Deprecated + @Deprecated(since = "0.7.0", forRemoval = true) PopperMultiSelect("pmsl", "PF6/Component/PopperMultiSelect"), - @Deprecated + @Deprecated(since = "0.7.0", forRemoval = true) PopperMultiTypeahead("pmty", "PF6/Component/PopperMultiTypeahead"), - @Deprecated + @Deprecated(since = "0.7.0", forRemoval = true) PopperPopover("ppvr", "PF6/Component/PopperPopover"), - @Deprecated + @Deprecated(since = "0.7.0", forRemoval = true) PopperSingleSelect("pssl", "PF6/Component/PopperSingleSelect"), - @Deprecated + @Deprecated(since = "0.7.0", forRemoval = true) PopperSingleTypeahead("psty", "PF6/Component/PopperSingleTypeahead"), - @Deprecated + @Deprecated(since = "0.7.0", forRemoval = true) PopperTooltip("ptt", "PF6/Component/PopperTooltip"), Popover("pvr", "PF6/Component/Popover"), diff --git a/components/src/main/java/org/patternfly/component/menu/PopperDropdown.java b/components/src/main/java/org/patternfly/component/menu/PopperDropdown.java index 5444a5c77..11c5e20c3 100644 --- a/components/src/main/java/org/patternfly/component/menu/PopperDropdown.java +++ b/components/src/main/java/org/patternfly/component/menu/PopperDropdown.java @@ -26,7 +26,7 @@ * * @deprecated This implementation uses the Popper.js API, which is due to be removed soon. Use {@link Dropdown} instead. */ -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) public class PopperDropdown extends PopperMenuToggleMenu { // ------------------------------------------------------ factory diff --git a/components/src/main/java/org/patternfly/component/menu/PopperMenuToggleMenu.java b/components/src/main/java/org/patternfly/component/menu/PopperMenuToggleMenu.java index 738c8fbe8..393d53ddf 100644 --- a/components/src/main/java/org/patternfly/component/menu/PopperMenuToggleMenu.java +++ b/components/src/main/java/org/patternfly/component/menu/PopperMenuToggleMenu.java @@ -70,7 +70,7 @@ *

      * The component delegates to the {@link MenuToggle} component. The {@link Menu} is managed by a {@link Popper} instance. */ -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) abstract class PopperMenuToggleMenu> extends ComponentDelegate implements Disabled, Expandable, diff --git a/components/src/main/java/org/patternfly/component/menu/PopperMultiMenuToggleMenu.java b/components/src/main/java/org/patternfly/component/menu/PopperMultiMenuToggleMenu.java index 848f8e412..e37301bad 100644 --- a/components/src/main/java/org/patternfly/component/menu/PopperMultiMenuToggleMenu.java +++ b/components/src/main/java/org/patternfly/component/menu/PopperMultiMenuToggleMenu.java @@ -35,7 +35,7 @@ * * @param the type of the builder for this component */ -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) abstract class PopperMultiMenuToggleMenu> extends PopperMenuToggleMenu { // ------------------------------------------------------ instance diff --git a/components/src/main/java/org/patternfly/component/menu/PopperMultiSelect.java b/components/src/main/java/org/patternfly/component/menu/PopperMultiSelect.java index ce0349785..e8fee861b 100644 --- a/components/src/main/java/org/patternfly/component/menu/PopperMultiSelect.java +++ b/components/src/main/java/org/patternfly/component/menu/PopperMultiSelect.java @@ -28,7 +28,7 @@ * * @deprecated This implementation uses the Popper.js API, which is due to be removed soon. Use {@link MultiSelect} instead. */ -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) public class PopperMultiSelect extends PopperMultiMenuToggleMenu { // ------------------------------------------------------ factory diff --git a/components/src/main/java/org/patternfly/component/menu/PopperMultiTypeahead.java b/components/src/main/java/org/patternfly/component/menu/PopperMultiTypeahead.java index c3b5ca6f2..69b13efb9 100644 --- a/components/src/main/java/org/patternfly/component/menu/PopperMultiTypeahead.java +++ b/components/src/main/java/org/patternfly/component/menu/PopperMultiTypeahead.java @@ -38,7 +38,7 @@ * * @deprecated This implementation uses the Popper.js API, which is due to be removed soon. Use {@link MultiTypeahead} instead. */ -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) public class PopperMultiTypeahead extends PopperMultiMenuToggleMenu implements PopperTypeahead { diff --git a/components/src/main/java/org/patternfly/component/menu/PopperSingleMenuToggleMenu.java b/components/src/main/java/org/patternfly/component/menu/PopperSingleMenuToggleMenu.java index bb0824462..ef6c48c4f 100644 --- a/components/src/main/java/org/patternfly/component/menu/PopperSingleMenuToggleMenu.java +++ b/components/src/main/java/org/patternfly/component/menu/PopperSingleMenuToggleMenu.java @@ -33,7 +33,7 @@ * * @param the type of the builder for this component */ -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) abstract class PopperSingleMenuToggleMenu> extends PopperMenuToggleMenu { // ------------------------------------------------------ instance diff --git a/components/src/main/java/org/patternfly/component/menu/PopperSingleSelect.java b/components/src/main/java/org/patternfly/component/menu/PopperSingleSelect.java index 4d2f9a20b..702cf7bca 100644 --- a/components/src/main/java/org/patternfly/component/menu/PopperSingleSelect.java +++ b/components/src/main/java/org/patternfly/component/menu/PopperSingleSelect.java @@ -23,7 +23,7 @@ * * @deprecated This implementation uses the Popper.js API, which is due to be removed soon. Use {@link SingleSelect} instead. */ -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) public class PopperSingleSelect extends PopperSingleMenuToggleMenu { // ------------------------------------------------------ factory diff --git a/components/src/main/java/org/patternfly/component/menu/PopperSingleTypeahead.java b/components/src/main/java/org/patternfly/component/menu/PopperSingleTypeahead.java index f2db33454..e8f0f1653 100644 --- a/components/src/main/java/org/patternfly/component/menu/PopperSingleTypeahead.java +++ b/components/src/main/java/org/patternfly/component/menu/PopperSingleTypeahead.java @@ -35,7 +35,7 @@ * * @deprecated This implementation uses the Popper.js API, which is due to be removed soon. Use {@link SingleTypeahead} instead. */ -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) public class PopperSingleTypeahead extends PopperSingleMenuToggleMenu implements PopperTypeahead { diff --git a/components/src/main/java/org/patternfly/component/menu/PopperTypeahead.java b/components/src/main/java/org/patternfly/component/menu/PopperTypeahead.java index 07c35efe4..19f517bce 100644 --- a/components/src/main/java/org/patternfly/component/menu/PopperTypeahead.java +++ b/components/src/main/java/org/patternfly/component/menu/PopperTypeahead.java @@ -27,7 +27,7 @@ * * @param A type that extends {@link PopperMenuToggleMenu}, representing the specific implementation of the typeahead. */ -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) public interface PopperTypeahead> { /** diff --git a/components/src/main/java/org/patternfly/component/menu/TypeaheadSupport.java b/components/src/main/java/org/patternfly/component/menu/TypeaheadSupport.java index 972c9c19c..488f77671 100644 --- a/components/src/main/java/org/patternfly/component/menu/TypeaheadSupport.java +++ b/components/src/main/java/org/patternfly/component/menu/TypeaheadSupport.java @@ -93,7 +93,7 @@ static void allowNewItems(MenuToggleMenu mtm, Typeahead typeahead, // ------------------------------------------------------ deprecated - @Deprecated + @Deprecated(since = "0.7.0", forRemoval = true) static void typeaheadDefaults(PopperMenuToggleMenu mtm) { mtm.menuToggle.searchInput().input() .attr(role, combobox) @@ -120,7 +120,7 @@ static void typeaheadDefaults(PopperMenuToggleMenu mtm) { }); } - @Deprecated + @Deprecated(since = "0.7.0", forRemoval = true) static void allowNewItems(PopperMenuToggleMenu mtm, PopperTypeahead typeahead, Function prompt, Function> createItem) { typeahead.onNoResults((menuList, text) -> createNewMenuItem(prompt.apply(text)) @@ -137,7 +137,7 @@ static void allowNewItems(PopperMenuToggleMenu mtm, PopperTypeahead typeah }))); } - @Deprecated + @Deprecated(since = "0.7.0", forRemoval = true) static boolean shouldExpandOnKeyup(PopperMenuToggleMenu mtm, Event event) { if (Enter.match(event) || Escape.match(event) || Tab.match(event)) { return false; diff --git a/components/src/main/java/org/patternfly/component/popover/PopperPopover.java b/components/src/main/java/org/patternfly/component/popover/PopperPopover.java index ef7bd77b8..2cd4fdb7e 100644 --- a/components/src/main/java/org/patternfly/component/popover/PopperPopover.java +++ b/components/src/main/java/org/patternfly/component/popover/PopperPopover.java @@ -83,7 +83,7 @@ * * @deprecated This implementation uses the Popper.js API, which is due to be removed soon. Use {@link Popover} instead. */ -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) public class PopperPopover extends BaseComponent implements Closeable, NoPadding, diff --git a/components/src/main/java/org/patternfly/component/popover/PopperPopoverBody.java b/components/src/main/java/org/patternfly/component/popover/PopperPopoverBody.java index a423f9693..05f61b923 100644 --- a/components/src/main/java/org/patternfly/component/popover/PopperPopoverBody.java +++ b/components/src/main/java/org/patternfly/component/popover/PopperPopoverBody.java @@ -26,7 +26,7 @@ import static org.patternfly.style.Classes.component; import static org.patternfly.style.Classes.popover; -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) public class PopperPopoverBody extends PopperPopoverSubComponent implements ElementTextMethods { diff --git a/components/src/main/java/org/patternfly/component/popover/PopperPopoverFooter.java b/components/src/main/java/org/patternfly/component/popover/PopperPopoverFooter.java index 864ce3761..8b103d27b 100644 --- a/components/src/main/java/org/patternfly/component/popover/PopperPopoverFooter.java +++ b/components/src/main/java/org/patternfly/component/popover/PopperPopoverFooter.java @@ -24,7 +24,7 @@ import static org.patternfly.style.Classes.footer; import static org.patternfly.style.Classes.popover; -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) public class PopperPopoverFooter extends PopperPopoverSubComponent implements ElementTextMethods { diff --git a/components/src/main/java/org/patternfly/component/popover/PopperPopoverHeader.java b/components/src/main/java/org/patternfly/component/popover/PopperPopoverHeader.java index 2ce5c7be5..47b73f4fe 100644 --- a/components/src/main/java/org/patternfly/component/popover/PopperPopoverHeader.java +++ b/components/src/main/java/org/patternfly/component/popover/PopperPopoverHeader.java @@ -37,7 +37,7 @@ import static org.patternfly.style.Classes.text; import static org.patternfly.style.Classes.title; -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) public class PopperPopoverHeader extends PopperPopoverSubComponent implements ElementContainerDelegate, ElementTextDelegate { diff --git a/components/src/main/java/org/patternfly/component/popover/PopperPopoverSubComponent.java b/components/src/main/java/org/patternfly/component/popover/PopperPopoverSubComponent.java index 527fe6864..31ebe0e40 100644 --- a/components/src/main/java/org/patternfly/component/popover/PopperPopoverSubComponent.java +++ b/components/src/main/java/org/patternfly/component/popover/PopperPopoverSubComponent.java @@ -21,7 +21,7 @@ import elemental2.dom.HTMLElement; -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) abstract class PopperPopoverSubComponent> extends SubComponent { PopperPopoverSubComponent(String name, E element) { diff --git a/components/src/main/java/org/patternfly/component/tooltip/PopperTooltip.java b/components/src/main/java/org/patternfly/component/tooltip/PopperTooltip.java index 01b3c5671..8e897274f 100644 --- a/components/src/main/java/org/patternfly/component/tooltip/PopperTooltip.java +++ b/components/src/main/java/org/patternfly/component/tooltip/PopperTooltip.java @@ -71,7 +71,7 @@ * * @deprecated This implementation uses the Popper.js API, which is due to be removed soon. Use {@link Tooltip} instead. */ -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) public class PopperTooltip extends BaseComponent implements Attachable, Closeable, diff --git a/core/src/main/java/org/patternfly/popper/FirstUpdateFn.java b/core/src/main/java/org/patternfly/popper/FirstUpdateFn.java index 5ae6b5270..6283c8ccb 100644 --- a/core/src/main/java/org/patternfly/popper/FirstUpdateFn.java +++ b/core/src/main/java/org/patternfly/popper/FirstUpdateFn.java @@ -17,7 +17,7 @@ import jsinterop.annotations.JsFunction; -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) @JsFunction @FunctionalInterface public interface FirstUpdateFn { diff --git a/core/src/main/java/org/patternfly/popper/Modifier.java b/core/src/main/java/org/patternfly/popper/Modifier.java index e28aaacac..d3369c016 100644 --- a/core/src/main/java/org/patternfly/popper/Modifier.java +++ b/core/src/main/java/org/patternfly/popper/Modifier.java @@ -19,7 +19,7 @@ import static jsinterop.annotations.JsPackage.GLOBAL; -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) @JsType(isNative = true, namespace = GLOBAL, name = "Object") public class Modifier { diff --git a/core/src/main/java/org/patternfly/popper/ModifierArguments.java b/core/src/main/java/org/patternfly/popper/ModifierArguments.java index f004f8d3f..077b9b1ef 100644 --- a/core/src/main/java/org/patternfly/popper/ModifierArguments.java +++ b/core/src/main/java/org/patternfly/popper/ModifierArguments.java @@ -19,7 +19,7 @@ import static jsinterop.annotations.JsPackage.GLOBAL; -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) @JsType(isNative = true, namespace = GLOBAL, name = "Object") public class ModifierArguments { diff --git a/core/src/main/java/org/patternfly/popper/ModifierFn.java b/core/src/main/java/org/patternfly/popper/ModifierFn.java index 1037fd8eb..d87164a80 100644 --- a/core/src/main/java/org/patternfly/popper/ModifierFn.java +++ b/core/src/main/java/org/patternfly/popper/ModifierFn.java @@ -17,7 +17,7 @@ import jsinterop.annotations.JsFunction; -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) @JsFunction @FunctionalInterface public interface ModifierFn { diff --git a/core/src/main/java/org/patternfly/popper/ModifierOptions.java b/core/src/main/java/org/patternfly/popper/ModifierOptions.java index ee5be490f..6f77a84a5 100644 --- a/core/src/main/java/org/patternfly/popper/ModifierOptions.java +++ b/core/src/main/java/org/patternfly/popper/ModifierOptions.java @@ -19,7 +19,7 @@ import static jsinterop.annotations.JsPackage.GLOBAL; -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) @JsType(isNative = true, namespace = GLOBAL, name = "Object") public class ModifierOptions { diff --git a/core/src/main/java/org/patternfly/popper/ModifierPhase.java b/core/src/main/java/org/patternfly/popper/ModifierPhase.java index 7d05ab996..57acc6a2d 100644 --- a/core/src/main/java/org/patternfly/popper/ModifierPhase.java +++ b/core/src/main/java/org/patternfly/popper/ModifierPhase.java @@ -15,7 +15,7 @@ */ package org.patternfly.popper; -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) public enum ModifierPhase { beforeRead, diff --git a/core/src/main/java/org/patternfly/popper/Modifiers.java b/core/src/main/java/org/patternfly/popper/Modifiers.java index fc7fc3573..2f9f1be12 100644 --- a/core/src/main/java/org/patternfly/popper/Modifiers.java +++ b/core/src/main/java/org/patternfly/popper/Modifiers.java @@ -20,7 +20,7 @@ import static org.patternfly.popper.PopperPlacement.auto; -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) public interface Modifiers { static Modifier widths() { diff --git a/core/src/main/java/org/patternfly/popper/Options.java b/core/src/main/java/org/patternfly/popper/Options.java index ab5d2b0e8..d22d9e59b 100644 --- a/core/src/main/java/org/patternfly/popper/Options.java +++ b/core/src/main/java/org/patternfly/popper/Options.java @@ -20,7 +20,7 @@ import static jsinterop.annotations.JsPackage.GLOBAL; -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) @JsType(isNative = true, namespace = GLOBAL, name = "Object") public class Options { diff --git a/core/src/main/java/org/patternfly/popper/Popper.java b/core/src/main/java/org/patternfly/popper/Popper.java index b2e1244a9..592ebfae3 100644 --- a/core/src/main/java/org/patternfly/popper/Popper.java +++ b/core/src/main/java/org/patternfly/popper/Popper.java @@ -19,7 +19,7 @@ import elemental2.promise.Promise; -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) public interface Popper { int UNDEFINED = -1; diff --git a/core/src/main/java/org/patternfly/popper/PopperError.java b/core/src/main/java/org/patternfly/popper/PopperError.java index 349d2ac89..d190d04e9 100644 --- a/core/src/main/java/org/patternfly/popper/PopperError.java +++ b/core/src/main/java/org/patternfly/popper/PopperError.java @@ -20,7 +20,7 @@ import elemental2.promise.Promise; -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) public class PopperError implements Popper { private static final Logger logger = Logger.getLogger(PopperError.class.getName()); diff --git a/core/src/main/java/org/patternfly/popper/PopperImpl.java b/core/src/main/java/org/patternfly/popper/PopperImpl.java index 39100f088..791860d35 100644 --- a/core/src/main/java/org/patternfly/popper/PopperImpl.java +++ b/core/src/main/java/org/patternfly/popper/PopperImpl.java @@ -31,7 +31,7 @@ /** * Wrapper around {@link PopperJs} */ -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) public class PopperImpl implements Popper { private final PopperJs popper; diff --git a/core/src/main/java/org/patternfly/popper/PopperJs.java b/core/src/main/java/org/patternfly/popper/PopperJs.java index c80930f28..41add12a7 100644 --- a/core/src/main/java/org/patternfly/popper/PopperJs.java +++ b/core/src/main/java/org/patternfly/popper/PopperJs.java @@ -27,7 +27,7 @@ * * @see https://popper.js.org/docs/v2/ */ -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) @JsType(isNative = true, name = "Popper", namespace = GLOBAL) class PopperJs { diff --git a/core/src/main/java/org/patternfly/popper/PopperPlacement.java b/core/src/main/java/org/patternfly/popper/PopperPlacement.java index c20479ea8..3baf7a95c 100644 --- a/core/src/main/java/org/patternfly/popper/PopperPlacement.java +++ b/core/src/main/java/org/patternfly/popper/PopperPlacement.java @@ -27,7 +27,7 @@ * @deprecated Use {@link org.patternfly.style.Placement} instead. This class exists only to support the deprecated Popper.js * based components. */ -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) public enum PopperPlacement implements TypedModifier { auto("auto", ""), diff --git a/core/src/main/java/org/patternfly/popper/Rect.java b/core/src/main/java/org/patternfly/popper/Rect.java index a92e47960..1309919eb 100644 --- a/core/src/main/java/org/patternfly/popper/Rect.java +++ b/core/src/main/java/org/patternfly/popper/Rect.java @@ -19,7 +19,7 @@ import static jsinterop.annotations.JsPackage.GLOBAL; -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) @JsType(isNative = true, namespace = GLOBAL, name = "Object") public class Rect { diff --git a/core/src/main/java/org/patternfly/popper/State.java b/core/src/main/java/org/patternfly/popper/State.java index 8264cfd44..c89e07237 100644 --- a/core/src/main/java/org/patternfly/popper/State.java +++ b/core/src/main/java/org/patternfly/popper/State.java @@ -19,7 +19,7 @@ import static jsinterop.annotations.JsPackage.GLOBAL; -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) @JsType(isNative = true, namespace = GLOBAL, name = "Object") public class State { diff --git a/core/src/main/java/org/patternfly/popper/StateElements.java b/core/src/main/java/org/patternfly/popper/StateElements.java index 119efa684..5d26720af 100644 --- a/core/src/main/java/org/patternfly/popper/StateElements.java +++ b/core/src/main/java/org/patternfly/popper/StateElements.java @@ -20,7 +20,7 @@ import static jsinterop.annotations.JsPackage.GLOBAL; -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) @JsType(isNative = true, namespace = GLOBAL, name = "Object") public class StateElements { diff --git a/core/src/main/java/org/patternfly/popper/StateRects.java b/core/src/main/java/org/patternfly/popper/StateRects.java index fc9794e4e..ebce949a1 100644 --- a/core/src/main/java/org/patternfly/popper/StateRects.java +++ b/core/src/main/java/org/patternfly/popper/StateRects.java @@ -19,7 +19,7 @@ import static jsinterop.annotations.JsPackage.GLOBAL; -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) @JsType(isNative = true, namespace = GLOBAL, name = "Object") public class StateRects { diff --git a/core/src/main/java/org/patternfly/popper/StyleDefinitions.java b/core/src/main/java/org/patternfly/popper/StyleDefinitions.java index 116dcb6b7..f70ac0850 100644 --- a/core/src/main/java/org/patternfly/popper/StyleDefinitions.java +++ b/core/src/main/java/org/patternfly/popper/StyleDefinitions.java @@ -20,7 +20,7 @@ import static jsinterop.annotations.JsPackage.GLOBAL; -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) @JsType(isNative = true, namespace = GLOBAL, name = "Object") public class StyleDefinitions { diff --git a/core/src/main/java/org/patternfly/popper/TriggerAction.java b/core/src/main/java/org/patternfly/popper/TriggerAction.java index fcc408484..186e0ddf0 100644 --- a/core/src/main/java/org/patternfly/popper/TriggerAction.java +++ b/core/src/main/java/org/patternfly/popper/TriggerAction.java @@ -15,7 +15,7 @@ */ package org.patternfly.popper; -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) public enum TriggerAction { mouseenter, diff --git a/core/src/main/java/org/patternfly/popper/UpdateOptionsFn.java b/core/src/main/java/org/patternfly/popper/UpdateOptionsFn.java index 10857681f..d0ff58e34 100644 --- a/core/src/main/java/org/patternfly/popper/UpdateOptionsFn.java +++ b/core/src/main/java/org/patternfly/popper/UpdateOptionsFn.java @@ -17,7 +17,7 @@ import jsinterop.annotations.JsFunction; -@Deprecated +@Deprecated(since = "0.7.0", forRemoval = true) @JsFunction @FunctionalInterface public interface UpdateOptionsFn { From affa79021071ae74855a03fe6b0f97d276bd1aed Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 19 May 2026 16:24:57 +0200 Subject: [PATCH 120/430] fix: Fix OUIA implementation to follow the spec Fix attribute names to use data-ouia-component-type and data-ouia-component-id instead of data-ouia-type and data-ouia-id. Stop setting a shared component type ID as the OUIA component ID. Add ouiaId(String) method so application code can set stable, deterministic IDs for UI automation. --- CHANGELOG.md | 6 ++++ .../patternfly/component/BaseComponent.java | 7 +++- .../component/BaseComponentSVG.java | 7 +++- .../component/ComponentDelegate.java | 7 +++- .../main/java/org/patternfly/core/Ouia.java | 34 ++++++++++++++----- 5 files changed, 50 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b2587a19e..a8540c46d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +### Added + +- Add `ouiaId(String)` method to `BaseComponent`, `BaseComponentSVG`, and `ComponentDelegate` for setting stable, deterministic OUIA component IDs + ### Changed - Add `since` and `forRemoval` attributes to all `@Deprecated` annotations on Popper.js-based classes and components @@ -13,6 +17,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ### Fixed +- Fix OUIA attribute names to match the spec (`data-ouia-component-type` and `data-ouia-component-id` instead of `data-ouia-type` and `data-ouia-id`) +- Fix OUIA component ID no longer set to the shared `ComponentType.id` — `data-ouia-component-id` is now only set when explicitly provided via `ouiaId(String)` - Fix format string bug, variable assignment bug, and null guard in core module ## [0.7.4] - 2026-05-10 diff --git a/components/src/main/java/org/patternfly/component/BaseComponent.java b/components/src/main/java/org/patternfly/component/BaseComponent.java index 608dc5ee2..dcab8e6cb 100644 --- a/components/src/main/java/org/patternfly/component/BaseComponent.java +++ b/components/src/main/java/org/patternfly/component/BaseComponent.java @@ -54,7 +54,12 @@ public abstract class BaseComponent Date: Tue, 19 May 2026 16:26:17 +0200 Subject: [PATCH 121/430] Add review for later --- showcase/pnpm-workspace.yaml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/showcase/pnpm-workspace.yaml b/showcase/pnpm-workspace.yaml index 7f54ece4f..1a4efe054 100644 --- a/showcase/pnpm-workspace.yaml +++ b/showcase/pnpm-workspace.yaml @@ -1,3 +1,19 @@ +# +# Copyright 2023 Red Hat +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + ignoredBuiltDependencies: - '@swc/core' - lmdb From b8b446e6ccb4796dcf9a2639d6037854c7e92ec3 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 19 May 2026 16:26:27 +0200 Subject: [PATCH 122/430] Add review for later --- components/REVIEW.md | 156 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 components/REVIEW.md diff --git a/components/REVIEW.md b/components/REVIEW.md new file mode 100644 index 000000000..0adf29540 --- /dev/null +++ b/components/REVIEW.md @@ -0,0 +1,156 @@ +# Code Review: `org.patternfly.component` Package + +**Date:** 2026-05-10 +**Scope:** All 33 Java files in `org.patternfly.component` (top-level package only, not individual component sub-packages) +**Method:** Manual review using Claude Code (Opus 4.6), reading every file in the package +**Branch:** `main` (commit `cbea6a1b`) + +--- + +## HIGH Severity + +### H1 — `KicHandler` NPE when constructed with `HTMLTextAreaElement` + +**File:** `KicHandler.java:69,79,89,99` + +All four event registration methods (`onKeydown`, `onKeyup`, `onInput`, `onChange`) unconditionally call `inputElement.addEventListener(...)`. When the `KicHandler` is constructed with an `HTMLTextAreaElement`, `inputElement` is `null`, so any of these methods will throw a `NullPointerException`. Only the `value()` method correctly handles both element types. + +**Fix:** Use a local variable or helper that resolves the correct element (`inputElement` or `textAreaElement`) and attach listeners to that element instead. + +--- + +### H2 — `ComponentStore` static maps may leak component references + +**File:** `ComponentStore.java:43-45` + +Three static `HashMap`s (`components`, `componentDelegates`, `subComponents`) hold references to all stored components. Entries are removed via `onDetach` callbacks (DOM `MutationObserver`). If a component's DOM element is removed without triggering a detach event (e.g., parent's `innerHTML = ""`, or the observer is not connected), the map retains stale references indefinitely. In a long-running SPA this constitutes a memory leak. + +**Fix:** Consider periodic cleanup, weak references, or documenting the requirement that removal must go through proper Elemento detach paths. + +--- + +### H3 — `BaseComponent` / `BaseComponentSVG` near-duplication + +**Files:** `BaseComponent.java`, `BaseComponentSVG.java` + +Both classes implement the same pattern: store `componentType` + `element`, call `ouia()` in the constructor, implement `componentType()` and `element()`. The only difference is `HTMLElement` vs `SVGElement` and the set of mixin interfaces. `BaseComponentSVG` also lacks `registerComponent()`, `storeComponent()`, and `lookupComponent()` methods — it's unclear whether this is intentional or an oversight. + +**Fix:** Extract shared constructor logic/accessors into a common helper or composition pattern. Evaluate whether `BaseComponentSVG` should also support the component store. + +--- + +## MEDIUM Severity + +### M1 — `ScrollButtons.updateScrollState()` doesn't cancel previous timeout (broken debounce) + +**File:** `ScrollButtons.java:146` + +Each call to `updateScrollState()` creates a new `setTimeout` without clearing the previous `scrollTimeout`. Rapid scrolling queues up many overlapping timeout callbacks. The field name `scrollTimeout` and the `clearTimeout` call in `detach()` suggest debouncing was intended. + +**Fix:** Add `clearTimeout(scrollTimeout);` at the top of `updateScrollState()`. + +--- + +### M2 — `ComponentDelegate.element()` returns `null` instead of failing fast + +**File:** `ComponentDelegate.java:66-69` + +When `delegate` is null, `element()` logs an error but still returns `null`. Any caller that chains (e.g., `.element().classList`) gets an NPE with no clear cause. + +**Fix:** Throw `IllegalStateException` instead of returning null, since a delegate-less `ComponentDelegate` is always a programming error. + +--- + +### M3 — `Ordered.defaultOrder()` comparator violates the `Comparator` contract + +**File:** `Ordered.java:86-95` + +When `s2` has a `DATA_ORDER` attribute but `s1` doesn't, the comparator returns `0` (equal). It should return `1` (s1 sorts after s2) for symmetry. A comparator where `compare(a,b) = -1` but `compare(b,a) = 0` breaks the contract and can cause incorrect `TreeSet` behavior. + +**Fix:** Add an `else if (s2.element().dataset.has(DATA_ORDER))` branch returning `1`. + +--- + +### M4 — Two overlapping component registries with unclear boundaries + +**Files:** `ComponentStore.java`, `ComponentRegistry.java` + +`ComponentStore` provides DOM-traversal-based lookup using data attributes and `closest()`. `ComponentRegistry` provides type-keyed singleton lookup via a static map. Both are used for parent-child component wiring, but the distinction is not documented. `ComponentStore` is package-private; `ComponentRegistry` is public. + +**Fix:** Add Javadoc clarifying when to use each, or consider consolidating if the separation isn't load-bearing. + +--- + +### M5 — `ComponentRegistry` singleton has no cleanup/unregister mechanism + +**File:** `ComponentRegistry.java:50-51` + +Components registered via `registerComponent()` are never unregistered. Unlike `ComponentStore` (which uses `onDetach`), `ComponentRegistry` has no removal path. If a Page or Masthead is replaced, the old reference is silently overwritten for top-level components, but sub-component entries keyed by `type+name` can accumulate. + +**Fix:** Add `unregisterComponent()` / `unregisterSubComponent()` methods, or tie lifecycle to `onDetach`. + +--- + +### M6 — `KicHandler` event registration pattern repeated 4 times + +**File:** `KicHandler.java:65-101` + +`onKeydown`, `onKeyup`, `onInput`, `onChange` all follow the identical pattern: check if first handler, add to list, conditionally register DOM listener. This is a DRY violation. + +**Fix:** Extract a private helper method like `registerHandler(List, EventType)`. + +--- + +## LOW Severity + +### L1 — `TemplateComponent` passes `null` as `ComponentType` + +**File:** `TemplateComponent.java:43` + +`super((ComponentType) null, div().element())` will throw `NullPointerException` from `requireNonNull` in `BaseComponent`'s constructor. This is a copy-paste template shipped in the compiled artifact. + +**Fix:** Either exclude from the build, move to a test/resource directory, or assign a placeholder `ComponentType`. + +--- + +### L2 — `Severity.asValidationStatus()` has unreachable code + +**File:** `Severity.java:59-72` + +The old-style `switch` (with `//noinspection EnhancedSwitchMigration`) covers all enum values, making the final `return ValidationStatus.default_` dead code. A modern switch expression would make exhaustiveness explicit. + +--- + +### L3 — Redundant `public` on `Validatable` interface method + +**File:** `Validatable.java:26` + +`public void resetValidation()` — interface methods are implicitly public. Minor style inconsistency with the rest of the codebase. + +--- + +### L4 — Hardcoded English strings + +**Files:** `ScrollButtons.java:86,93` (`"Scroll back"`, `"Scroll forward"`), `ComponentProgress.java:55` (`"Loading..."`) + +ARIA labels and progress text are hardcoded in English. Not a problem today but would need extraction if i18n is ever required. + +--- + +### L5 — `ComponentType.id` uniqueness not enforced + +**File:** `ComponentType.java` + +The `id` field (e.g., `"ac"`, `"al"`, `"at"`) is used as a key in dataset attributes and store lookups. Uniqueness is guaranteed only by visual inspection. A collision would cause silent lookup failures. + +**Fix:** Add a unit test or static initializer that validates all `id` values are unique. + +--- + +## Summary + +| Severity | Count | Key Items | +|----------|-------|-----------| +| HIGH | 3 | `KicHandler` NPE (H1), `ComponentStore` leak (H2), base class duplication (H3) | +| MEDIUM | 6 | Broken debounce (M1), null delegate (M2), comparator contract (M3), registry overlap (M4), no cleanup (M5), DRY violation (M6) | +| LOW | 5 | Template crash (L1), dead code (L2), redundant public (L3), hardcoded strings (L4), id uniqueness (L5) | From bfb909540484ea623bed98b764d76e5a3d40f42b Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 19 May 2026 16:26:59 +0200 Subject: [PATCH 123/430] Release 0.7.5 --- CHANGELOG.md | 5 ++++- README.md | 2 +- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 22 files changed, 25 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a8540c46d..9a8290ca3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +## [0.7.5] - 2026-05-19 + ### Added - Add `ouiaId(String)` method to `BaseComponent`, `BaseComponentSVG`, and `ComponentDelegate` for setting stable, deterministic OUIA component IDs @@ -999,7 +1001,8 @@ Stay tuned for more to come... -[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.4...HEAD +[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.5...HEAD +[0.7.5]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.4...v0.7.5 [0.7.4]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.3...v0.7.4 [0.7.3]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.2...v0.7.3 [0.7.2]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.1...v0.7.2 diff --git a/README.md b/README.md index 25434a007..a75fad091 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.7.4 + 0.7.5 pom import diff --git a/apidoc/pom.xml b/apidoc/pom.xml index ef07fe12e..f2d14dae0 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.5-SNAPSHOT + 0.7.5 ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 07b383af0..8c3904cc8 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.7.5-SNAPSHOT + 0.7.5 pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index b6d7d873f..80576ab96 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.5-SNAPSHOT + 0.7.5 ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 18073c1ba..dadbb1187 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.7.5-SNAPSHOT", + "version": "0.7.5", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 329812439..825112b27 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.5-SNAPSHOT + 0.7.5 ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 5d8f163e1..5c0cf36df 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.5-SNAPSHOT + 0.7.5 ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index cdea51017..fb1398482 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.5-SNAPSHOT + 0.7.5 ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index ad93a5396..24cf94d1f 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.7.5-SNAPSHOT", + "version": "0.7.5", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index f0f8f2f45..aa5aef1b4 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.5-SNAPSHOT + 0.7.5 ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 22216ab1d..4cb738e1d 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.5-SNAPSHOT + 0.7.5 ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 1075a829f..2da20e97a 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.7.5-SNAPSHOT", + "version": "0.7.5", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index 4494ed11a..a5a36f8a8 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.5-SNAPSHOT + 0.7.5 ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 81d6e1a9a..9add7d38a 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.5-SNAPSHOT + 0.7.5 ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index 0fdd82411..ab9ce2180 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.5-SNAPSHOT + 0.7.5 ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 7ba566264..23ffea8cb 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.5-SNAPSHOT + 0.7.5 ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 7ce805d6b..c1cd10c91 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.5-SNAPSHOT + 0.7.5 ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 57d30b8a6..61ff8088e 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.7.5-SNAPSHOT + 0.7.5 pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index cb3923771..df9ae1215 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.5-SNAPSHOT + 0.7.5 ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 4c8416000..2a35a1d44 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.7.5-SNAPSHOT + 0.7.5 pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 068d4edbc..01804d763 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.5-SNAPSHOT + 0.7.5 ../code-parent/pom.xml From 07cb2a0feabc9f65cdddf9c5024b8cf6b4ea66b6 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 19 May 2026 16:27:11 +0200 Subject: [PATCH 124/430] Next is 0.7.6 --- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apidoc/pom.xml b/apidoc/pom.xml index f2d14dae0..1779503d8 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.5 + 0.7.6-SNAPSHOT ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 8c3904cc8..065819afd 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.7.5 + 0.7.6-SNAPSHOT pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index 80576ab96..4414ca6f3 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.5 + 0.7.6-SNAPSHOT ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index dadbb1187..ee14cd0c1 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.7.5", + "version": "0.7.6-SNAPSHOT", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 825112b27..6b6428d47 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.5 + 0.7.6-SNAPSHOT ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 5c0cf36df..026e18e9a 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.5 + 0.7.6-SNAPSHOT ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index fb1398482..26a6ccbde 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.5 + 0.7.6-SNAPSHOT ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 24cf94d1f..b9473116f 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.7.5", + "version": "0.7.6-SNAPSHOT", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index aa5aef1b4..4cac6d94b 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.5 + 0.7.6-SNAPSHOT ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 4cb738e1d..adf4d6ff4 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.5 + 0.7.6-SNAPSHOT ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 2da20e97a..36502f19f 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.7.5", + "version": "0.7.6-SNAPSHOT", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index a5a36f8a8..1f00aa434 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.5 + 0.7.6-SNAPSHOT ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 9add7d38a..0ae902a50 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.5 + 0.7.6-SNAPSHOT ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index ab9ce2180..1b09d2528 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.5 + 0.7.6-SNAPSHOT ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 23ffea8cb..631ec9d4f 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.5 + 0.7.6-SNAPSHOT ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index c1cd10c91..7f39d1c12 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.5 + 0.7.6-SNAPSHOT ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 61ff8088e..fde6caf73 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.7.5 + 0.7.6-SNAPSHOT pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index df9ae1215..8fa8330b7 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.5 + 0.7.6-SNAPSHOT ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 2a35a1d44..302a2c43a 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.7.5 + 0.7.6-SNAPSHOT pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 01804d763..a4ae68dd6 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.5 + 0.7.6-SNAPSHOT ../code-parent/pom.xml From 2e212ca425c97360f6edb8b245b1e0a01d1fd171 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 19 May 2026 17:10:07 +0200 Subject: [PATCH 125/430] feat: Make data-ouia-safe spec-compliant with dynamic state tracking Add ouiaSafe() and ouiaTransition() methods to Ouia for tracking component safe state. Spinner and Skeleton are always unsafe. Button and Icon toggle safe state based on progress. Expandable components set unsafe during transitions and restore via transitionend with a 300ms fallback timeout. --- CHANGELOG.md | 10 ++++++ .../org/patternfly/component/Expandable.java | 3 ++ .../patternfly/component/button/Button.java | 2 ++ .../patternfly/component/drawer/Drawer.java | 3 ++ .../expandable/ExpandableSection.java | 3 ++ .../org/patternfly/component/icon/Icon.java | 2 ++ .../component/page/PageSidebar.java | 3 ++ .../component/skeleton/Skeleton.java | 2 ++ .../patternfly/component/spinner/Spinner.java | 3 ++ .../main/java/org/patternfly/core/Ouia.java | 36 +++++++++++++++++++ 10 files changed, 67 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a8290ca3..d632aaa9d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,16 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +### Added + +- Add `ouiaSafe(HTMLElement, boolean)`, `ouiaSafe(SVGElement, boolean)`, and `ouiaTransition(HTMLElement)` methods to `Ouia` for dynamic `data-ouia-safe` state tracking + +### Changed + +- Change `Spinner` and `Skeleton` to always set `data-ouia-safe="false"` (loading/placeholder components are never safe) +- Change `Button` and `Icon` to toggle `data-ouia-safe` based on progress state +- Change `Expandable` static helpers and self-managed expandable components (`Drawer`, `ExpandableSection`, `PageSidebar`) to set `data-ouia-safe="false"` during transitions and restore it via `transitionend` with a 300ms fallback timeout + ## [0.7.5] - 2026-05-19 ### Added diff --git a/components/src/main/java/org/patternfly/component/Expandable.java b/components/src/main/java/org/patternfly/component/Expandable.java index 626732264..a5ed044fe 100644 --- a/components/src/main/java/org/patternfly/component/Expandable.java +++ b/components/src/main/java/org/patternfly/component/Expandable.java @@ -23,6 +23,7 @@ import elemental2.dom.Element; import elemental2.dom.HTMLElement; +import static org.patternfly.core.Ouia.ouiaTransition; import static org.patternfly.style.Classes.modifier; /** @@ -39,6 +40,7 @@ static void collapse(HTMLElement root, HTMLElement toggle, HTMLElement menu) { static void collapse(HTMLElement root, HTMLElement toggle, HTMLElement menu, boolean force) { if (force || expanded(root)) { + ouiaTransition(root); root.classList.remove(modifier(Classes.expanded)); if (toggle != null) { toggle.setAttribute(Aria.expanded, false); @@ -55,6 +57,7 @@ static void expand(HTMLElement root, HTMLElement toggle, HTMLElement menu) { static void expand(HTMLElement root, HTMLElement toggle, HTMLElement menu, boolean force) { if (force || !expanded(root)) { + ouiaTransition(root); root.classList.add(modifier(Classes.expanded)); if (toggle != null) { toggle.setAttribute(Aria.expanded, true); diff --git a/components/src/main/java/org/patternfly/component/button/Button.java b/components/src/main/java/org/patternfly/component/button/Button.java index 6b8071467..8f1a18f7e 100644 --- a/components/src/main/java/org/patternfly/component/button/Button.java +++ b/components/src/main/java/org/patternfly/component/button/Button.java @@ -53,6 +53,7 @@ import static org.jboss.elemento.Elements.span; import static org.jboss.elemento.EventType.click; import static org.patternfly.component.spinner.Spinner.spinner; +import static org.patternfly.core.Ouia.ouiaSafe; import static org.patternfly.style.Classes.block; import static org.patternfly.style.Classes.button; import static org.patternfly.style.Classes.component; @@ -308,6 +309,7 @@ public Button progress(boolean inProgress, String label, Consumer spinn } else { element().classList.remove(modifier(Classes.inProgress)); } + ouiaSafe(element(), !inProgress); return this; } diff --git a/components/src/main/java/org/patternfly/component/drawer/Drawer.java b/components/src/main/java/org/patternfly/component/drawer/Drawer.java index ba0c5272f..fc875a7f8 100644 --- a/components/src/main/java/org/patternfly/component/drawer/Drawer.java +++ b/components/src/main/java/org/patternfly/component/drawer/Drawer.java @@ -29,6 +29,7 @@ import elemental2.dom.HTMLElement; import static org.jboss.elemento.Elements.div; +import static org.patternfly.core.Ouia.ouiaTransition; import static org.patternfly.style.Classes.component; import static org.patternfly.style.Classes.drawer; import static org.patternfly.style.Classes.expanded; @@ -132,6 +133,7 @@ public Drawer onToggle(ToggleHandler toggleHandler) { @Override public void collapse(boolean fireEvent) { + ouiaTransition(element()); element().classList.remove(modifier(expanded)); if (panel != null) { panel.element().hidden = true; @@ -143,6 +145,7 @@ public void collapse(boolean fireEvent) { @Override public void expand(boolean fireEvent) { + ouiaTransition(element()); element().classList.add(modifier(expanded)); if (panel != null) { panel.element().hidden = false; diff --git a/components/src/main/java/org/patternfly/component/expandable/ExpandableSection.java b/components/src/main/java/org/patternfly/component/expandable/ExpandableSection.java index 2e37a97ea..a3030bc40 100644 --- a/components/src/main/java/org/patternfly/component/expandable/ExpandableSection.java +++ b/components/src/main/java/org/patternfly/component/expandable/ExpandableSection.java @@ -43,6 +43,7 @@ import static org.jboss.elemento.Elements.div; import static org.patternfly.core.Aria.controls; import static org.patternfly.core.Aria.labelledBy; +import static org.patternfly.core.Ouia.ouiaTransition; import static org.patternfly.style.Classes.component; import static org.patternfly.style.Classes.expandTop; import static org.patternfly.style.Classes.expandableSection; @@ -220,6 +221,7 @@ public ExpandableSection onToggle(ToggleHandler toggleHandler @Override public void collapse(boolean fireEvent) { + ouiaTransition(element()); element().classList.remove(modifier(expanded)); if (toggle != null) { toggle.collapse(directionUp); @@ -237,6 +239,7 @@ public void collapse(boolean fireEvent) { @Override public void expand(boolean fireEvent) { + ouiaTransition(element()); element().classList.add(modifier(expanded)); if (toggle != null) { toggle.expand(directionUp); diff --git a/components/src/main/java/org/patternfly/component/icon/Icon.java b/components/src/main/java/org/patternfly/component/icon/Icon.java index f7c043b14..ced4bbaf6 100644 --- a/components/src/main/java/org/patternfly/component/icon/Icon.java +++ b/components/src/main/java/org/patternfly/component/icon/Icon.java @@ -33,6 +33,7 @@ import static org.jboss.elemento.Elements.failSafeRemoveFromParent; import static org.jboss.elemento.Elements.span; import static org.patternfly.component.spinner.Spinner.spinner; +import static org.patternfly.core.Ouia.ouiaSafe; import static org.patternfly.style.Classes.component; import static org.patternfly.style.Classes.icon; import static org.patternfly.style.Classes.modifier; @@ -137,6 +138,7 @@ public Icon progress(boolean inProgress, String label, Consumer spinner } else { element().classList.remove(modifier(Classes.inProgress)); } + ouiaSafe(element(), !inProgress); return this; } diff --git a/components/src/main/java/org/patternfly/component/page/PageSidebar.java b/components/src/main/java/org/patternfly/component/page/PageSidebar.java index b8b387b73..eafaddc7c 100644 --- a/components/src/main/java/org/patternfly/component/page/PageSidebar.java +++ b/components/src/main/java/org/patternfly/component/page/PageSidebar.java @@ -26,6 +26,7 @@ import static org.jboss.elemento.Elements.aside; import static org.patternfly.core.Aria.hidden; +import static org.patternfly.core.Ouia.ouiaTransition; import static org.patternfly.style.Classes.collapsed; import static org.patternfly.style.Classes.component; import static org.patternfly.style.Classes.expanded; @@ -95,6 +96,7 @@ public PageSidebar onToggle(ToggleHandler toggleHandler) { @Override public void collapse(boolean fireEvent) { if (!keepExpanded) { + ouiaTransition(element()); element().classList.remove(modifier(expanded)); element().classList.add(modifier(collapsed)); aria(hidden, true); @@ -106,6 +108,7 @@ public void collapse(boolean fireEvent) { @Override public void expand(boolean fireEvent) { + ouiaTransition(element()); element().classList.remove(modifier(collapsed)); element().classList.add(modifier(expanded)); aria(hidden, false); diff --git a/components/src/main/java/org/patternfly/component/skeleton/Skeleton.java b/components/src/main/java/org/patternfly/component/skeleton/Skeleton.java index aaccd54f5..ed69877ae 100644 --- a/components/src/main/java/org/patternfly/component/skeleton/Skeleton.java +++ b/components/src/main/java/org/patternfly/component/skeleton/Skeleton.java @@ -22,6 +22,7 @@ import elemental2.dom.HTMLElement; import static org.jboss.elemento.Elements.div; +import static org.patternfly.core.Ouia.ouiaSafe; import static org.jboss.elemento.Elements.span; import static org.patternfly.style.Classes.component; import static org.patternfly.style.Classes.modifier; @@ -50,6 +51,7 @@ public static Skeleton skeleton() { Skeleton() { super(ComponentType.Skeleton, div().css(component(skeleton)).element()); + ouiaSafe(element(), false); } // ------------------------------------------------------ builder diff --git a/components/src/main/java/org/patternfly/component/spinner/Spinner.java b/components/src/main/java/org/patternfly/component/spinner/Spinner.java index 428092a69..81b137235 100644 --- a/components/src/main/java/org/patternfly/component/spinner/Spinner.java +++ b/components/src/main/java/org/patternfly/component/spinner/Spinner.java @@ -22,6 +22,8 @@ import org.patternfly.style.Modifiers.Inline; import org.patternfly.style.Size; +import static org.patternfly.core.Ouia.ouiaSafe; + import static org.jboss.elemento.svg.SVG.circle; import static org.jboss.elemento.svg.SVG.svg; import static org.patternfly.core.Attributes.role; @@ -71,6 +73,7 @@ protected Spinner(Size size, String label) { .attr("r", 45) .attr("fill", "none")) .element()); + ouiaSafe(element(), false); if (size != null) { css(size.modifier()); } diff --git a/core/src/main/java/org/patternfly/core/Ouia.java b/core/src/main/java/org/patternfly/core/Ouia.java index 263ed8de7..cd961bd36 100644 --- a/core/src/main/java/org/patternfly/core/Ouia.java +++ b/core/src/main/java/org/patternfly/core/Ouia.java @@ -17,10 +17,14 @@ import org.jboss.elemento.svg.SVGElement; +import elemental2.dom.Event; +import elemental2.dom.EventListener; import elemental2.dom.HTMLElement; import elemental2.webstorage.Storage; import elemental2.webstorage.WebStorageWindow; +import static elemental2.dom.DomGlobal.clearTimeout; +import static elemental2.dom.DomGlobal.setTimeout; import static elemental2.dom.DomGlobal.window; /** @@ -66,6 +70,38 @@ public static void ouia(SVGElement element, String componentId, String component } } + public static void ouiaSafe(HTMLElement element, boolean safe) { + if (element != null && isSupported()) { + element.dataset.set("ouiaSafe", String.valueOf(safe)); + } + } + + public static void ouiaSafe(SVGElement element, boolean safe) { + if (element != null && isSupported()) { + element.dataset.set("ouiaSafe", String.valueOf(safe)); + } + } + + /** + * Marks the element as unsafe ({@code data-ouia-safe="false"}) and restores it to safe after the CSS transition ends. A + * fallback timeout ensures the element is marked safe even if no CSS transition is defined. + */ + public static void ouiaTransition(HTMLElement element) { + if (element != null && isSupported()) { + ouiaSafe(element, false); + double[] guard = {0}; + guard[0] = setTimeout(e -> ouiaSafe(element, true), 300); + element.addEventListener("transitionend", new EventListener() { + @Override + public void handleEvent(Event evt) { + clearTimeout(guard[0]); + ouiaSafe(element, true); + element.removeEventListener("transitionend", this); + } + }); + } + } + private static boolean isSupported() { Storage localStorage = WebStorageWindow.of(window).localStorage; if (localStorage != null) { From 08e99d6711c575896ac3de1e4715664b348e1288 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 19 May 2026 17:11:00 +0200 Subject: [PATCH 126/430] Release 0.7.6 --- CHANGELOG.md | 5 ++++- README.md | 2 +- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 22 files changed, 25 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d632aaa9d..773ef044d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +## [0.7.6] - 2026-05-19 + ### Added - Add `ouiaSafe(HTMLElement, boolean)`, `ouiaSafe(SVGElement, boolean)`, and `ouiaTransition(HTMLElement)` methods to `Ouia` for dynamic `data-ouia-safe` state tracking @@ -1011,7 +1013,8 @@ Stay tuned for more to come... -[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.5...HEAD +[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.6...HEAD +[0.7.6]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.5...v0.7.6 [0.7.5]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.4...v0.7.5 [0.7.4]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.3...v0.7.4 [0.7.3]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.2...v0.7.3 diff --git a/README.md b/README.md index a75fad091..adeba1a19 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.7.5 + 0.7.6 pom import diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 1779503d8..a51f46275 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.6-SNAPSHOT + 0.7.6 ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 065819afd..cc640d925 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.7.6-SNAPSHOT + 0.7.6 pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index 4414ca6f3..acc24332a 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.6-SNAPSHOT + 0.7.6 ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index ee14cd0c1..0c9be2bdd 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.7.6-SNAPSHOT", + "version": "0.7.6", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 6b6428d47..0253efba2 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.6-SNAPSHOT + 0.7.6 ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 026e18e9a..1df9b918f 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.6-SNAPSHOT + 0.7.6 ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 26a6ccbde..b5a9dfa0b 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.6-SNAPSHOT + 0.7.6 ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index b9473116f..da2915a1a 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.7.6-SNAPSHOT", + "version": "0.7.6", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 4cac6d94b..46489cff5 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.6-SNAPSHOT + 0.7.6 ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index adf4d6ff4..964211b53 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.6-SNAPSHOT + 0.7.6 ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 36502f19f..1e1f59c1b 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.7.6-SNAPSHOT", + "version": "0.7.6", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index 1f00aa434..e3b3dbab2 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.6-SNAPSHOT + 0.7.6 ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 0ae902a50..7f6f6d2db 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.6-SNAPSHOT + 0.7.6 ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index 1b09d2528..67b116ed0 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.6-SNAPSHOT + 0.7.6 ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 631ec9d4f..fa8bf8815 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.6-SNAPSHOT + 0.7.6 ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 7f39d1c12..d13956a48 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.6-SNAPSHOT + 0.7.6 ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index fde6caf73..100c78625 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.7.6-SNAPSHOT + 0.7.6 pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index 8fa8330b7..2e86ec376 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.6-SNAPSHOT + 0.7.6 ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 302a2c43a..740e45dc6 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.7.6-SNAPSHOT + 0.7.6 pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index a4ae68dd6..23b880a70 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.6-SNAPSHOT + 0.7.6 ../code-parent/pom.xml From f7ad2e7a76d3975bac963ea2406f2e7806e33a85 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 19 May 2026 17:11:10 +0200 Subject: [PATCH 127/430] Next is 0.7.7 --- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apidoc/pom.xml b/apidoc/pom.xml index a51f46275..267e43379 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.6 + 0.7.7-SNAPSHOT ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index cc640d925..4844a1dc4 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.7.6 + 0.7.7-SNAPSHOT pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index acc24332a..d61efb7c3 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.6 + 0.7.7-SNAPSHOT ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 0c9be2bdd..7a7d93b60 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.7.6", + "version": "0.7.7-SNAPSHOT", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 0253efba2..d2dbbb9d9 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.6 + 0.7.7-SNAPSHOT ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 1df9b918f..1925f36be 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.6 + 0.7.7-SNAPSHOT ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index b5a9dfa0b..647a05d63 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.6 + 0.7.7-SNAPSHOT ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index da2915a1a..741521e29 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.7.6", + "version": "0.7.7-SNAPSHOT", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 46489cff5..df2572374 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.6 + 0.7.7-SNAPSHOT ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 964211b53..d734d8f4c 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.6 + 0.7.7-SNAPSHOT ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 1e1f59c1b..68440c40f 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.7.6", + "version": "0.7.7-SNAPSHOT", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index e3b3dbab2..bc4350aef 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.6 + 0.7.7-SNAPSHOT ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 7f6f6d2db..9835e91fd 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.6 + 0.7.7-SNAPSHOT ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index 67b116ed0..f8c96aded 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.6 + 0.7.7-SNAPSHOT ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index fa8bf8815..679433fa2 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.6 + 0.7.7-SNAPSHOT ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index d13956a48..502a8716b 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.6 + 0.7.7-SNAPSHOT ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 100c78625..c2bfe7f40 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.7.6 + 0.7.7-SNAPSHOT pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index 2e86ec376..19d2c6eae 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.6 + 0.7.7-SNAPSHOT ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 740e45dc6..bd3c4a1d5 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.7.6 + 0.7.7-SNAPSHOT pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 23b880a70..6660688cc 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.6 + 0.7.7-SNAPSHOT ../code-parent/pom.xml From d3b8b504697152acf4d22d31592ea4b6d3de47df Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 19 May 2026 17:22:22 +0200 Subject: [PATCH 128/430] Code format --- .../main/java/org/patternfly/component/skeleton/Skeleton.java | 2 +- .../main/java/org/patternfly/component/spinner/Spinner.java | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/components/src/main/java/org/patternfly/component/skeleton/Skeleton.java b/components/src/main/java/org/patternfly/component/skeleton/Skeleton.java index ed69877ae..ea715e80b 100644 --- a/components/src/main/java/org/patternfly/component/skeleton/Skeleton.java +++ b/components/src/main/java/org/patternfly/component/skeleton/Skeleton.java @@ -22,8 +22,8 @@ import elemental2.dom.HTMLElement; import static org.jboss.elemento.Elements.div; -import static org.patternfly.core.Ouia.ouiaSafe; import static org.jboss.elemento.Elements.span; +import static org.patternfly.core.Ouia.ouiaSafe; import static org.patternfly.style.Classes.component; import static org.patternfly.style.Classes.modifier; import static org.patternfly.style.Classes.screenReader; diff --git a/components/src/main/java/org/patternfly/component/spinner/Spinner.java b/components/src/main/java/org/patternfly/component/spinner/Spinner.java index 81b137235..6c9510f1f 100644 --- a/components/src/main/java/org/patternfly/component/spinner/Spinner.java +++ b/components/src/main/java/org/patternfly/component/spinner/Spinner.java @@ -22,11 +22,10 @@ import org.patternfly.style.Modifiers.Inline; import org.patternfly.style.Size; -import static org.patternfly.core.Ouia.ouiaSafe; - import static org.jboss.elemento.svg.SVG.circle; import static org.jboss.elemento.svg.SVG.svg; import static org.patternfly.core.Attributes.role; +import static org.patternfly.core.Ouia.ouiaSafe; import static org.patternfly.core.Roles.progressbar; import static org.patternfly.style.Classes.component; import static org.patternfly.style.Classes.path; From 21eb92c33ff9b940af07fd701bb70adcfee91f06 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 19 May 2026 19:05:06 +0200 Subject: [PATCH 129/430] fix: Remove since/forRemoval from @Deprecated annotations for J2CL compatibility J2CL doesn't support the since and forRemoval attributes on @Deprecated (added in Java 9). Deprecation info is preserved in Javadoc @deprecated tags. --- CHANGELOG.md | 4 ++++ .../org/patternfly/component/ComponentType.java | 14 +++++++------- .../patternfly/component/menu/PopperDropdown.java | 2 +- .../component/menu/PopperMenuToggleMenu.java | 2 +- .../component/menu/PopperMultiMenuToggleMenu.java | 2 +- .../component/menu/PopperMultiSelect.java | 2 +- .../component/menu/PopperMultiTypeahead.java | 2 +- .../component/menu/PopperSingleMenuToggleMenu.java | 2 +- .../component/menu/PopperSingleSelect.java | 2 +- .../component/menu/PopperSingleTypeahead.java | 2 +- .../patternfly/component/menu/PopperTypeahead.java | 2 +- .../component/menu/TypeaheadSupport.java | 6 +++--- .../component/popover/PopperPopover.java | 2 +- .../component/popover/PopperPopoverBody.java | 2 +- .../component/popover/PopperPopoverFooter.java | 2 +- .../component/popover/PopperPopoverHeader.java | 2 +- .../popover/PopperPopoverSubComponent.java | 2 +- .../component/tooltip/PopperTooltip.java | 2 +- .../java/org/patternfly/popper/FirstUpdateFn.java | 2 +- .../main/java/org/patternfly/popper/Modifier.java | 2 +- .../org/patternfly/popper/ModifierArguments.java | 2 +- .../java/org/patternfly/popper/ModifierFn.java | 2 +- .../org/patternfly/popper/ModifierOptions.java | 2 +- .../java/org/patternfly/popper/ModifierPhase.java | 2 +- .../main/java/org/patternfly/popper/Modifiers.java | 2 +- .../main/java/org/patternfly/popper/Options.java | 2 +- .../main/java/org/patternfly/popper/Popper.java | 2 +- .../java/org/patternfly/popper/PopperBuilder.java | 2 +- .../java/org/patternfly/popper/PopperError.java | 2 +- .../java/org/patternfly/popper/PopperImpl.java | 2 +- .../main/java/org/patternfly/popper/PopperJs.java | 2 +- .../org/patternfly/popper/PopperPlacement.java | 2 +- core/src/main/java/org/patternfly/popper/Rect.java | 2 +- .../src/main/java/org/patternfly/popper/State.java | 2 +- .../java/org/patternfly/popper/StateElements.java | 2 +- .../java/org/patternfly/popper/StateRects.java | 2 +- .../org/patternfly/popper/StyleDefinitions.java | 2 +- .../java/org/patternfly/popper/TriggerAction.java | 2 +- .../org/patternfly/popper/UpdateOptionsFn.java | 2 +- 39 files changed, 50 insertions(+), 46 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 773ef044d..8a15ffd42 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +### Changed + +- Remove `since` and `forRemoval` attributes from `@Deprecated` annotations on Popper.js-based classes and components for J2CL compatibility (deprecation info remains in Javadoc `@deprecated` tags) + ## [0.7.6] - 2026-05-19 ### Added diff --git a/components/src/main/java/org/patternfly/component/ComponentType.java b/components/src/main/java/org/patternfly/component/ComponentType.java index d5aedc156..3a3118512 100644 --- a/components/src/main/java/org/patternfly/component/ComponentType.java +++ b/components/src/main/java/org/patternfly/component/ComponentType.java @@ -115,25 +115,25 @@ public enum ComponentType { Panel("pnl", "PF6/Component/Panel"), - @Deprecated(since = "0.7.0", forRemoval = true) + @Deprecated PopperDropdown("pdd", "PF6/Component/PopperDropdown"), - @Deprecated(since = "0.7.0", forRemoval = true) + @Deprecated PopperMultiSelect("pmsl", "PF6/Component/PopperMultiSelect"), - @Deprecated(since = "0.7.0", forRemoval = true) + @Deprecated PopperMultiTypeahead("pmty", "PF6/Component/PopperMultiTypeahead"), - @Deprecated(since = "0.7.0", forRemoval = true) + @Deprecated PopperPopover("ppvr", "PF6/Component/PopperPopover"), - @Deprecated(since = "0.7.0", forRemoval = true) + @Deprecated PopperSingleSelect("pssl", "PF6/Component/PopperSingleSelect"), - @Deprecated(since = "0.7.0", forRemoval = true) + @Deprecated PopperSingleTypeahead("psty", "PF6/Component/PopperSingleTypeahead"), - @Deprecated(since = "0.7.0", forRemoval = true) + @Deprecated PopperTooltip("ptt", "PF6/Component/PopperTooltip"), Popover("pvr", "PF6/Component/Popover"), diff --git a/components/src/main/java/org/patternfly/component/menu/PopperDropdown.java b/components/src/main/java/org/patternfly/component/menu/PopperDropdown.java index 11c5e20c3..5444a5c77 100644 --- a/components/src/main/java/org/patternfly/component/menu/PopperDropdown.java +++ b/components/src/main/java/org/patternfly/component/menu/PopperDropdown.java @@ -26,7 +26,7 @@ * * @deprecated This implementation uses the Popper.js API, which is due to be removed soon. Use {@link Dropdown} instead. */ -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated public class PopperDropdown extends PopperMenuToggleMenu { // ------------------------------------------------------ factory diff --git a/components/src/main/java/org/patternfly/component/menu/PopperMenuToggleMenu.java b/components/src/main/java/org/patternfly/component/menu/PopperMenuToggleMenu.java index 393d53ddf..738c8fbe8 100644 --- a/components/src/main/java/org/patternfly/component/menu/PopperMenuToggleMenu.java +++ b/components/src/main/java/org/patternfly/component/menu/PopperMenuToggleMenu.java @@ -70,7 +70,7 @@ *

      * The component delegates to the {@link MenuToggle} component. The {@link Menu} is managed by a {@link Popper} instance. */ -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated abstract class PopperMenuToggleMenu> extends ComponentDelegate implements Disabled, Expandable, diff --git a/components/src/main/java/org/patternfly/component/menu/PopperMultiMenuToggleMenu.java b/components/src/main/java/org/patternfly/component/menu/PopperMultiMenuToggleMenu.java index e37301bad..848f8e412 100644 --- a/components/src/main/java/org/patternfly/component/menu/PopperMultiMenuToggleMenu.java +++ b/components/src/main/java/org/patternfly/component/menu/PopperMultiMenuToggleMenu.java @@ -35,7 +35,7 @@ * * @param the type of the builder for this component */ -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated abstract class PopperMultiMenuToggleMenu> extends PopperMenuToggleMenu { // ------------------------------------------------------ instance diff --git a/components/src/main/java/org/patternfly/component/menu/PopperMultiSelect.java b/components/src/main/java/org/patternfly/component/menu/PopperMultiSelect.java index e8fee861b..ce0349785 100644 --- a/components/src/main/java/org/patternfly/component/menu/PopperMultiSelect.java +++ b/components/src/main/java/org/patternfly/component/menu/PopperMultiSelect.java @@ -28,7 +28,7 @@ * * @deprecated This implementation uses the Popper.js API, which is due to be removed soon. Use {@link MultiSelect} instead. */ -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated public class PopperMultiSelect extends PopperMultiMenuToggleMenu { // ------------------------------------------------------ factory diff --git a/components/src/main/java/org/patternfly/component/menu/PopperMultiTypeahead.java b/components/src/main/java/org/patternfly/component/menu/PopperMultiTypeahead.java index 69b13efb9..c3b5ca6f2 100644 --- a/components/src/main/java/org/patternfly/component/menu/PopperMultiTypeahead.java +++ b/components/src/main/java/org/patternfly/component/menu/PopperMultiTypeahead.java @@ -38,7 +38,7 @@ * * @deprecated This implementation uses the Popper.js API, which is due to be removed soon. Use {@link MultiTypeahead} instead. */ -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated public class PopperMultiTypeahead extends PopperMultiMenuToggleMenu implements PopperTypeahead { diff --git a/components/src/main/java/org/patternfly/component/menu/PopperSingleMenuToggleMenu.java b/components/src/main/java/org/patternfly/component/menu/PopperSingleMenuToggleMenu.java index ef6c48c4f..bb0824462 100644 --- a/components/src/main/java/org/patternfly/component/menu/PopperSingleMenuToggleMenu.java +++ b/components/src/main/java/org/patternfly/component/menu/PopperSingleMenuToggleMenu.java @@ -33,7 +33,7 @@ * * @param the type of the builder for this component */ -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated abstract class PopperSingleMenuToggleMenu> extends PopperMenuToggleMenu { // ------------------------------------------------------ instance diff --git a/components/src/main/java/org/patternfly/component/menu/PopperSingleSelect.java b/components/src/main/java/org/patternfly/component/menu/PopperSingleSelect.java index 702cf7bca..4d2f9a20b 100644 --- a/components/src/main/java/org/patternfly/component/menu/PopperSingleSelect.java +++ b/components/src/main/java/org/patternfly/component/menu/PopperSingleSelect.java @@ -23,7 +23,7 @@ * * @deprecated This implementation uses the Popper.js API, which is due to be removed soon. Use {@link SingleSelect} instead. */ -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated public class PopperSingleSelect extends PopperSingleMenuToggleMenu { // ------------------------------------------------------ factory diff --git a/components/src/main/java/org/patternfly/component/menu/PopperSingleTypeahead.java b/components/src/main/java/org/patternfly/component/menu/PopperSingleTypeahead.java index e8f0f1653..f2db33454 100644 --- a/components/src/main/java/org/patternfly/component/menu/PopperSingleTypeahead.java +++ b/components/src/main/java/org/patternfly/component/menu/PopperSingleTypeahead.java @@ -35,7 +35,7 @@ * * @deprecated This implementation uses the Popper.js API, which is due to be removed soon. Use {@link SingleTypeahead} instead. */ -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated public class PopperSingleTypeahead extends PopperSingleMenuToggleMenu implements PopperTypeahead { diff --git a/components/src/main/java/org/patternfly/component/menu/PopperTypeahead.java b/components/src/main/java/org/patternfly/component/menu/PopperTypeahead.java index 19f517bce..07c35efe4 100644 --- a/components/src/main/java/org/patternfly/component/menu/PopperTypeahead.java +++ b/components/src/main/java/org/patternfly/component/menu/PopperTypeahead.java @@ -27,7 +27,7 @@ * * @param A type that extends {@link PopperMenuToggleMenu}, representing the specific implementation of the typeahead. */ -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated public interface PopperTypeahead> { /** diff --git a/components/src/main/java/org/patternfly/component/menu/TypeaheadSupport.java b/components/src/main/java/org/patternfly/component/menu/TypeaheadSupport.java index 488f77671..972c9c19c 100644 --- a/components/src/main/java/org/patternfly/component/menu/TypeaheadSupport.java +++ b/components/src/main/java/org/patternfly/component/menu/TypeaheadSupport.java @@ -93,7 +93,7 @@ static void allowNewItems(MenuToggleMenu mtm, Typeahead typeahead, // ------------------------------------------------------ deprecated - @Deprecated(since = "0.7.0", forRemoval = true) + @Deprecated static void typeaheadDefaults(PopperMenuToggleMenu mtm) { mtm.menuToggle.searchInput().input() .attr(role, combobox) @@ -120,7 +120,7 @@ static void typeaheadDefaults(PopperMenuToggleMenu mtm) { }); } - @Deprecated(since = "0.7.0", forRemoval = true) + @Deprecated static void allowNewItems(PopperMenuToggleMenu mtm, PopperTypeahead typeahead, Function prompt, Function> createItem) { typeahead.onNoResults((menuList, text) -> createNewMenuItem(prompt.apply(text)) @@ -137,7 +137,7 @@ static void allowNewItems(PopperMenuToggleMenu mtm, PopperTypeahead typeah }))); } - @Deprecated(since = "0.7.0", forRemoval = true) + @Deprecated static boolean shouldExpandOnKeyup(PopperMenuToggleMenu mtm, Event event) { if (Enter.match(event) || Escape.match(event) || Tab.match(event)) { return false; diff --git a/components/src/main/java/org/patternfly/component/popover/PopperPopover.java b/components/src/main/java/org/patternfly/component/popover/PopperPopover.java index 2cd4fdb7e..ef7bd77b8 100644 --- a/components/src/main/java/org/patternfly/component/popover/PopperPopover.java +++ b/components/src/main/java/org/patternfly/component/popover/PopperPopover.java @@ -83,7 +83,7 @@ * * @deprecated This implementation uses the Popper.js API, which is due to be removed soon. Use {@link Popover} instead. */ -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated public class PopperPopover extends BaseComponent implements Closeable, NoPadding, diff --git a/components/src/main/java/org/patternfly/component/popover/PopperPopoverBody.java b/components/src/main/java/org/patternfly/component/popover/PopperPopoverBody.java index 05f61b923..a423f9693 100644 --- a/components/src/main/java/org/patternfly/component/popover/PopperPopoverBody.java +++ b/components/src/main/java/org/patternfly/component/popover/PopperPopoverBody.java @@ -26,7 +26,7 @@ import static org.patternfly.style.Classes.component; import static org.patternfly.style.Classes.popover; -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated public class PopperPopoverBody extends PopperPopoverSubComponent implements ElementTextMethods { diff --git a/components/src/main/java/org/patternfly/component/popover/PopperPopoverFooter.java b/components/src/main/java/org/patternfly/component/popover/PopperPopoverFooter.java index 8b103d27b..864ce3761 100644 --- a/components/src/main/java/org/patternfly/component/popover/PopperPopoverFooter.java +++ b/components/src/main/java/org/patternfly/component/popover/PopperPopoverFooter.java @@ -24,7 +24,7 @@ import static org.patternfly.style.Classes.footer; import static org.patternfly.style.Classes.popover; -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated public class PopperPopoverFooter extends PopperPopoverSubComponent implements ElementTextMethods { diff --git a/components/src/main/java/org/patternfly/component/popover/PopperPopoverHeader.java b/components/src/main/java/org/patternfly/component/popover/PopperPopoverHeader.java index 47b73f4fe..2ce5c7be5 100644 --- a/components/src/main/java/org/patternfly/component/popover/PopperPopoverHeader.java +++ b/components/src/main/java/org/patternfly/component/popover/PopperPopoverHeader.java @@ -37,7 +37,7 @@ import static org.patternfly.style.Classes.text; import static org.patternfly.style.Classes.title; -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated public class PopperPopoverHeader extends PopperPopoverSubComponent implements ElementContainerDelegate, ElementTextDelegate { diff --git a/components/src/main/java/org/patternfly/component/popover/PopperPopoverSubComponent.java b/components/src/main/java/org/patternfly/component/popover/PopperPopoverSubComponent.java index 31ebe0e40..527fe6864 100644 --- a/components/src/main/java/org/patternfly/component/popover/PopperPopoverSubComponent.java +++ b/components/src/main/java/org/patternfly/component/popover/PopperPopoverSubComponent.java @@ -21,7 +21,7 @@ import elemental2.dom.HTMLElement; -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated abstract class PopperPopoverSubComponent> extends SubComponent { PopperPopoverSubComponent(String name, E element) { diff --git a/components/src/main/java/org/patternfly/component/tooltip/PopperTooltip.java b/components/src/main/java/org/patternfly/component/tooltip/PopperTooltip.java index 8e897274f..01b3c5671 100644 --- a/components/src/main/java/org/patternfly/component/tooltip/PopperTooltip.java +++ b/components/src/main/java/org/patternfly/component/tooltip/PopperTooltip.java @@ -71,7 +71,7 @@ * * @deprecated This implementation uses the Popper.js API, which is due to be removed soon. Use {@link Tooltip} instead. */ -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated public class PopperTooltip extends BaseComponent implements Attachable, Closeable, diff --git a/core/src/main/java/org/patternfly/popper/FirstUpdateFn.java b/core/src/main/java/org/patternfly/popper/FirstUpdateFn.java index 6283c8ccb..5ae6b5270 100644 --- a/core/src/main/java/org/patternfly/popper/FirstUpdateFn.java +++ b/core/src/main/java/org/patternfly/popper/FirstUpdateFn.java @@ -17,7 +17,7 @@ import jsinterop.annotations.JsFunction; -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated @JsFunction @FunctionalInterface public interface FirstUpdateFn { diff --git a/core/src/main/java/org/patternfly/popper/Modifier.java b/core/src/main/java/org/patternfly/popper/Modifier.java index d3369c016..e28aaacac 100644 --- a/core/src/main/java/org/patternfly/popper/Modifier.java +++ b/core/src/main/java/org/patternfly/popper/Modifier.java @@ -19,7 +19,7 @@ import static jsinterop.annotations.JsPackage.GLOBAL; -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated @JsType(isNative = true, namespace = GLOBAL, name = "Object") public class Modifier { diff --git a/core/src/main/java/org/patternfly/popper/ModifierArguments.java b/core/src/main/java/org/patternfly/popper/ModifierArguments.java index 077b9b1ef..f004f8d3f 100644 --- a/core/src/main/java/org/patternfly/popper/ModifierArguments.java +++ b/core/src/main/java/org/patternfly/popper/ModifierArguments.java @@ -19,7 +19,7 @@ import static jsinterop.annotations.JsPackage.GLOBAL; -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated @JsType(isNative = true, namespace = GLOBAL, name = "Object") public class ModifierArguments { diff --git a/core/src/main/java/org/patternfly/popper/ModifierFn.java b/core/src/main/java/org/patternfly/popper/ModifierFn.java index d87164a80..1037fd8eb 100644 --- a/core/src/main/java/org/patternfly/popper/ModifierFn.java +++ b/core/src/main/java/org/patternfly/popper/ModifierFn.java @@ -17,7 +17,7 @@ import jsinterop.annotations.JsFunction; -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated @JsFunction @FunctionalInterface public interface ModifierFn { diff --git a/core/src/main/java/org/patternfly/popper/ModifierOptions.java b/core/src/main/java/org/patternfly/popper/ModifierOptions.java index 6f77a84a5..ee5be490f 100644 --- a/core/src/main/java/org/patternfly/popper/ModifierOptions.java +++ b/core/src/main/java/org/patternfly/popper/ModifierOptions.java @@ -19,7 +19,7 @@ import static jsinterop.annotations.JsPackage.GLOBAL; -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated @JsType(isNative = true, namespace = GLOBAL, name = "Object") public class ModifierOptions { diff --git a/core/src/main/java/org/patternfly/popper/ModifierPhase.java b/core/src/main/java/org/patternfly/popper/ModifierPhase.java index 57acc6a2d..7d05ab996 100644 --- a/core/src/main/java/org/patternfly/popper/ModifierPhase.java +++ b/core/src/main/java/org/patternfly/popper/ModifierPhase.java @@ -15,7 +15,7 @@ */ package org.patternfly.popper; -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated public enum ModifierPhase { beforeRead, diff --git a/core/src/main/java/org/patternfly/popper/Modifiers.java b/core/src/main/java/org/patternfly/popper/Modifiers.java index 2f9f1be12..fc7fc3573 100644 --- a/core/src/main/java/org/patternfly/popper/Modifiers.java +++ b/core/src/main/java/org/patternfly/popper/Modifiers.java @@ -20,7 +20,7 @@ import static org.patternfly.popper.PopperPlacement.auto; -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated public interface Modifiers { static Modifier widths() { diff --git a/core/src/main/java/org/patternfly/popper/Options.java b/core/src/main/java/org/patternfly/popper/Options.java index d22d9e59b..ab5d2b0e8 100644 --- a/core/src/main/java/org/patternfly/popper/Options.java +++ b/core/src/main/java/org/patternfly/popper/Options.java @@ -20,7 +20,7 @@ import static jsinterop.annotations.JsPackage.GLOBAL; -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated @JsType(isNative = true, namespace = GLOBAL, name = "Object") public class Options { diff --git a/core/src/main/java/org/patternfly/popper/Popper.java b/core/src/main/java/org/patternfly/popper/Popper.java index 592ebfae3..b2e1244a9 100644 --- a/core/src/main/java/org/patternfly/popper/Popper.java +++ b/core/src/main/java/org/patternfly/popper/Popper.java @@ -19,7 +19,7 @@ import elemental2.promise.Promise; -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated public interface Popper { int UNDEFINED = -1; diff --git a/core/src/main/java/org/patternfly/popper/PopperBuilder.java b/core/src/main/java/org/patternfly/popper/PopperBuilder.java index eeaff4107..9e0f27ec6 100644 --- a/core/src/main/java/org/patternfly/popper/PopperBuilder.java +++ b/core/src/main/java/org/patternfly/popper/PopperBuilder.java @@ -43,7 +43,7 @@ import static org.jboss.elemento.Key.Escape; import static org.patternfly.popper.PopperPlacement.auto; -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated public class PopperBuilder { private static final Logger logger = Logger.getLogger(PopperBuilder.class.getName()); diff --git a/core/src/main/java/org/patternfly/popper/PopperError.java b/core/src/main/java/org/patternfly/popper/PopperError.java index d190d04e9..349d2ac89 100644 --- a/core/src/main/java/org/patternfly/popper/PopperError.java +++ b/core/src/main/java/org/patternfly/popper/PopperError.java @@ -20,7 +20,7 @@ import elemental2.promise.Promise; -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated public class PopperError implements Popper { private static final Logger logger = Logger.getLogger(PopperError.class.getName()); diff --git a/core/src/main/java/org/patternfly/popper/PopperImpl.java b/core/src/main/java/org/patternfly/popper/PopperImpl.java index 791860d35..39100f088 100644 --- a/core/src/main/java/org/patternfly/popper/PopperImpl.java +++ b/core/src/main/java/org/patternfly/popper/PopperImpl.java @@ -31,7 +31,7 @@ /** * Wrapper around {@link PopperJs} */ -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated public class PopperImpl implements Popper { private final PopperJs popper; diff --git a/core/src/main/java/org/patternfly/popper/PopperJs.java b/core/src/main/java/org/patternfly/popper/PopperJs.java index 41add12a7..c80930f28 100644 --- a/core/src/main/java/org/patternfly/popper/PopperJs.java +++ b/core/src/main/java/org/patternfly/popper/PopperJs.java @@ -27,7 +27,7 @@ * * @see https://popper.js.org/docs/v2/ */ -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated @JsType(isNative = true, name = "Popper", namespace = GLOBAL) class PopperJs { diff --git a/core/src/main/java/org/patternfly/popper/PopperPlacement.java b/core/src/main/java/org/patternfly/popper/PopperPlacement.java index 3baf7a95c..c20479ea8 100644 --- a/core/src/main/java/org/patternfly/popper/PopperPlacement.java +++ b/core/src/main/java/org/patternfly/popper/PopperPlacement.java @@ -27,7 +27,7 @@ * @deprecated Use {@link org.patternfly.style.Placement} instead. This class exists only to support the deprecated Popper.js * based components. */ -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated public enum PopperPlacement implements TypedModifier { auto("auto", ""), diff --git a/core/src/main/java/org/patternfly/popper/Rect.java b/core/src/main/java/org/patternfly/popper/Rect.java index 1309919eb..a92e47960 100644 --- a/core/src/main/java/org/patternfly/popper/Rect.java +++ b/core/src/main/java/org/patternfly/popper/Rect.java @@ -19,7 +19,7 @@ import static jsinterop.annotations.JsPackage.GLOBAL; -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated @JsType(isNative = true, namespace = GLOBAL, name = "Object") public class Rect { diff --git a/core/src/main/java/org/patternfly/popper/State.java b/core/src/main/java/org/patternfly/popper/State.java index c89e07237..8264cfd44 100644 --- a/core/src/main/java/org/patternfly/popper/State.java +++ b/core/src/main/java/org/patternfly/popper/State.java @@ -19,7 +19,7 @@ import static jsinterop.annotations.JsPackage.GLOBAL; -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated @JsType(isNative = true, namespace = GLOBAL, name = "Object") public class State { diff --git a/core/src/main/java/org/patternfly/popper/StateElements.java b/core/src/main/java/org/patternfly/popper/StateElements.java index 5d26720af..119efa684 100644 --- a/core/src/main/java/org/patternfly/popper/StateElements.java +++ b/core/src/main/java/org/patternfly/popper/StateElements.java @@ -20,7 +20,7 @@ import static jsinterop.annotations.JsPackage.GLOBAL; -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated @JsType(isNative = true, namespace = GLOBAL, name = "Object") public class StateElements { diff --git a/core/src/main/java/org/patternfly/popper/StateRects.java b/core/src/main/java/org/patternfly/popper/StateRects.java index ebce949a1..fc9794e4e 100644 --- a/core/src/main/java/org/patternfly/popper/StateRects.java +++ b/core/src/main/java/org/patternfly/popper/StateRects.java @@ -19,7 +19,7 @@ import static jsinterop.annotations.JsPackage.GLOBAL; -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated @JsType(isNative = true, namespace = GLOBAL, name = "Object") public class StateRects { diff --git a/core/src/main/java/org/patternfly/popper/StyleDefinitions.java b/core/src/main/java/org/patternfly/popper/StyleDefinitions.java index f70ac0850..116dcb6b7 100644 --- a/core/src/main/java/org/patternfly/popper/StyleDefinitions.java +++ b/core/src/main/java/org/patternfly/popper/StyleDefinitions.java @@ -20,7 +20,7 @@ import static jsinterop.annotations.JsPackage.GLOBAL; -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated @JsType(isNative = true, namespace = GLOBAL, name = "Object") public class StyleDefinitions { diff --git a/core/src/main/java/org/patternfly/popper/TriggerAction.java b/core/src/main/java/org/patternfly/popper/TriggerAction.java index 186e0ddf0..fcc408484 100644 --- a/core/src/main/java/org/patternfly/popper/TriggerAction.java +++ b/core/src/main/java/org/patternfly/popper/TriggerAction.java @@ -15,7 +15,7 @@ */ package org.patternfly.popper; -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated public enum TriggerAction { mouseenter, diff --git a/core/src/main/java/org/patternfly/popper/UpdateOptionsFn.java b/core/src/main/java/org/patternfly/popper/UpdateOptionsFn.java index d0ff58e34..10857681f 100644 --- a/core/src/main/java/org/patternfly/popper/UpdateOptionsFn.java +++ b/core/src/main/java/org/patternfly/popper/UpdateOptionsFn.java @@ -17,7 +17,7 @@ import jsinterop.annotations.JsFunction; -@Deprecated(since = "0.7.0", forRemoval = true) +@Deprecated @JsFunction @FunctionalInterface public interface UpdateOptionsFn { From 58657101a141736fc62b140ce02c9945dd3562a5 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 19 May 2026 19:05:41 +0200 Subject: [PATCH 130/430] Release 0.7.7 --- CHANGELOG.md | 5 ++++- README.md | 2 +- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 22 files changed, 25 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a15ffd42..24fe85fc0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +## [0.7.7] - 2026-05-19 + ### Changed - Remove `since` and `forRemoval` attributes from `@Deprecated` annotations on Popper.js-based classes and components for J2CL compatibility (deprecation info remains in Javadoc `@deprecated` tags) @@ -1017,7 +1019,8 @@ Stay tuned for more to come... -[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.6...HEAD +[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.7...HEAD +[0.7.7]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.6...v0.7.7 [0.7.6]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.5...v0.7.6 [0.7.5]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.4...v0.7.5 [0.7.4]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.3...v0.7.4 diff --git a/README.md b/README.md index adeba1a19..fbecf8bc7 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.7.6 + 0.7.7 pom import diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 267e43379..44b17a8de 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.7-SNAPSHOT + 0.7.7 ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 4844a1dc4..593c3a595 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.7.7-SNAPSHOT + 0.7.7 pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index d61efb7c3..04681cad9 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.7-SNAPSHOT + 0.7.7 ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 7a7d93b60..6f1db1319 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.7.7-SNAPSHOT", + "version": "0.7.7", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index d2dbbb9d9..1e232210f 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.7-SNAPSHOT + 0.7.7 ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 1925f36be..47504f932 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.7-SNAPSHOT + 0.7.7 ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 647a05d63..85c07b49d 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.7-SNAPSHOT + 0.7.7 ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 741521e29..f997f7478 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.7.7-SNAPSHOT", + "version": "0.7.7", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index df2572374..b997eee45 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.7-SNAPSHOT + 0.7.7 ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index d734d8f4c..65bdcd183 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.7-SNAPSHOT + 0.7.7 ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 68440c40f..afe25cdfd 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.7.7-SNAPSHOT", + "version": "0.7.7", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index bc4350aef..16dbee8ac 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.7-SNAPSHOT + 0.7.7 ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 9835e91fd..fdf04b6b0 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.7-SNAPSHOT + 0.7.7 ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index f8c96aded..e92e1a1f9 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.7-SNAPSHOT + 0.7.7 ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 679433fa2..51afc4478 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.7-SNAPSHOT + 0.7.7 ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 502a8716b..524e4c7db 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.7-SNAPSHOT + 0.7.7 ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index c2bfe7f40..0ad1ab741 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.7.7-SNAPSHOT + 0.7.7 pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index 19d2c6eae..b974c7e79 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.7-SNAPSHOT + 0.7.7 ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index bd3c4a1d5..eb1cc1e4f 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.7.7-SNAPSHOT + 0.7.7 pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 6660688cc..a9078baa9 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.7-SNAPSHOT + 0.7.7 ../code-parent/pom.xml From db7058e0219307aa779fcb0d3ba99dc920651a26 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 19 May 2026 19:05:52 +0200 Subject: [PATCH 131/430] Next is 0.7.8 --- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 44b17a8de..19be09a0a 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.7 + 0.7.8-SNAPSHOT ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 593c3a595..611441970 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.7.7 + 0.7.8-SNAPSHOT pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index 04681cad9..4caf3c3bd 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.7 + 0.7.8-SNAPSHOT ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 6f1db1319..09d774cdf 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.7.7", + "version": "0.7.8-SNAPSHOT", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 1e232210f..1780dff5a 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.7 + 0.7.8-SNAPSHOT ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 47504f932..1788b1f71 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.7 + 0.7.8-SNAPSHOT ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 85c07b49d..9855928b2 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.7 + 0.7.8-SNAPSHOT ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index f997f7478..3785b8180 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.7.7", + "version": "0.7.8-SNAPSHOT", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index b997eee45..87e62f3f6 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.7 + 0.7.8-SNAPSHOT ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 65bdcd183..2c8ef0fbc 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.7 + 0.7.8-SNAPSHOT ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index afe25cdfd..548a99a01 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.7.7", + "version": "0.7.8-SNAPSHOT", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index 16dbee8ac..57abdefec 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.7 + 0.7.8-SNAPSHOT ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index fdf04b6b0..acf2ca18a 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.7 + 0.7.8-SNAPSHOT ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index e92e1a1f9..3338164a5 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.7 + 0.7.8-SNAPSHOT ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 51afc4478..df5cdeda2 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.7 + 0.7.8-SNAPSHOT ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 524e4c7db..0f40be429 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.7 + 0.7.8-SNAPSHOT ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 0ad1ab741..ef83cf267 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.7.7 + 0.7.8-SNAPSHOT pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index b974c7e79..24a0ed174 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.7 + 0.7.8-SNAPSHOT ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index eb1cc1e4f..f40ea6d08 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.7.7 + 0.7.8-SNAPSHOT pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index a9078baa9..358278aad 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.7 + 0.7.8-SNAPSHOT ../code-parent/pom.xml From 24146d18ac2829db3014dc5b0553e26548575d53 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Tue, 19 May 2026 20:15:46 +0200 Subject: [PATCH 132/430] feat: Add OUIA support to all sub-components Every sub-component now renders data-ouia-component-type (e.g., PF6/Component/Card/CardHeader) and data-ouia-safe="true", with an ouiaId(String) method for setting data-ouia-component-id. This brings sub-components to parity with BaseComponent's existing OUIA support. --- CHANGELOG.md | 4 ++++ .../patternfly/component/ComponentStore.java | 4 ++-- .../patternfly/component/SubComponent.java | 19 ++++++++++++++----- .../component/accordion/AccordionItem.java | 5 +++-- .../accordion/AccordionItemBody.java | 5 +++-- .../accordion/AccordionSubComponent.java | 4 ++-- .../component/alert/AlertActionGroup.java | 5 +++-- .../component/alert/AlertDescription.java | 5 +++-- .../component/alert/AlertSubComponent.java | 4 ++-- .../component/breadcrumb/BreadcrumbItem.java | 5 +++-- .../breadcrumb/BreadcrumbSubComponent.java | 4 ++-- .../component/card/CardActions.java | 5 +++-- .../patternfly/component/card/CardBody.java | 5 +++-- .../component/card/CardExpandableContent.java | 5 +++-- .../patternfly/component/card/CardFooter.java | 5 +++-- .../patternfly/component/card/CardHeader.java | 5 +++-- .../component/card/CardSelectableActions.java | 5 +++-- .../component/card/CardSubComponent.java | 4 ++-- .../patternfly/component/card/CardTitle.java | 5 +++-- .../component/codeblock/CodeBlockAction.java | 5 +++-- .../component/codeblock/CodeBlockActions.java | 5 +++-- .../component/codeblock/CodeBlockHeader.java | 5 +++-- .../codeblock/CodeBlockSubComponent.java | 4 ++-- .../component/drawer/DrawerBody.java | 5 +++-- .../component/drawer/DrawerCloseButton.java | 5 +++-- .../component/drawer/DrawerContent.java | 5 +++-- .../component/drawer/DrawerPanel.java | 5 +++-- .../component/drawer/DrawerPanelHead.java | 5 +++-- .../component/drawer/DrawerSection.java | 5 +++-- .../component/drawer/DrawerSubComponent.java | 4 ++-- .../emptystate/EmptyStateActions.java | 5 +++-- .../component/emptystate/EmptyStateBody.java | 5 +++-- .../emptystate/EmptyStateFooter.java | 5 +++-- .../emptystate/EmptyStateSubComponent.java | 4 ++-- .../expandable/ExpandableSectionContent.java | 5 +++-- .../ExpandableSectionSubComponent.java | 4 ++-- .../expandable/ExpandableSectionToggle.java | 5 +++-- .../component/form/CheckboxBody.java | 5 +++-- .../component/form/CheckboxDescription.java | 5 +++-- .../component/form/CheckboxSubComponent.java | 4 ++-- .../component/form/FormActionGroup.java | 5 +++-- .../patternfly/component/form/FormAlert.java | 5 +++-- .../component/form/FormFieldGroup.java | 9 +++++---- .../component/form/FormFieldGroupBody.java | 5 +++-- .../component/form/FormFieldGroupHeader.java | 5 +++-- .../patternfly/component/form/FormGroup.java | 7 ++++--- .../component/form/FormGroupControl.java | 7 ++++--- .../component/form/FormGroupLabel.java | 7 ++++--- .../component/form/FormSection.java | 5 +++-- .../component/form/FormSelectOption.java | 5 +++-- .../component/form/FormSelectOptionGroup.java | 5 +++-- .../form/FormSelectSubComponent.java | 4 ++-- .../component/form/FormSubComponent.java | 4 ++-- .../patternfly/component/form/RadioBody.java | 5 +++-- .../component/form/RadioDescription.java | 5 +++-- .../component/form/RadioSubComponent.java | 4 ++-- .../component/help/HelperTextItem.java | 5 +++-- .../help/HelperTextSubComponent.java | 4 ++-- .../component/hint/HintActions.java | 5 +++-- .../patternfly/component/hint/HintBody.java | 5 +++-- .../patternfly/component/hint/HintFooter.java | 5 +++-- .../component/hint/HintSubComponent.java | 4 ++-- .../patternfly/component/hint/HintTitle.java | 5 +++-- .../component/inputgroup/InputGroupItem.java | 5 +++-- .../inputgroup/InputGroupSubComponent.java | 4 ++-- .../component/inputgroup/InputGroupText.java | 5 +++-- .../component/jumplinks/JumpLinksItem.java | 5 +++-- .../component/jumplinks/JumpLinksList.java | 5 +++-- .../jumplinks/JumpLinksSubComponent.java | 4 ++-- .../component/list/ActionListGroup.java | 7 ++++--- .../component/list/ActionListItem.java | 7 ++++--- .../list/ActionListSubComponent.java | 4 ++-- .../component/list/DataListAction.java | 5 +++-- .../component/list/DataListCell.java | 5 +++-- .../list/DataListExpandableContent.java | 5 +++-- .../component/list/DataListItem.java | 5 +++-- .../component/list/DataListSubComponent.java | 4 ++-- .../list/DescriptionListDescription.java | 5 +++-- .../component/list/DescriptionListGroup.java | 7 ++++--- .../list/DescriptionListSubComponent.java | 4 ++-- .../component/list/DescriptionListTerm.java | 5 +++-- .../patternfly/component/list/ListItem.java | 7 ++++--- .../component/list/ListSubComponent.java | 4 ++-- .../component/list/SimpleListGroup.java | 7 ++++--- .../component/list/SimpleListItem.java | 5 +++-- .../list/SimpleListSubComponent.java | 4 ++-- .../component/menu/MenuContent.java | 5 +++-- .../patternfly/component/menu/MenuFooter.java | 5 +++-- .../patternfly/component/menu/MenuGroup.java | 5 +++-- .../patternfly/component/menu/MenuHeader.java | 5 +++-- .../patternfly/component/menu/MenuItem.java | 9 +++++---- .../component/menu/MenuItemAction.java | 7 ++++--- .../patternfly/component/menu/MenuList.java | 11 ++++++----- .../patternfly/component/menu/MenuSearch.java | 5 +++-- .../component/menu/MenuSubComponent.java | 4 ++-- .../component/menu/MenuToggleAction.java | 5 +++-- .../menu/MenuToggleSubComponent.java | 4 ++-- .../patternfly/component/modal/ModalBody.java | 5 +++-- .../component/modal/ModalFooter.java | 5 +++-- .../component/modal/ModalHeader.java | 5 +++-- .../modal/ModalHeaderDescription.java | 5 +++-- .../component/modal/ModalHeaderTitle.java | 5 +++-- .../component/modal/ModalSubComponent.java | 4 ++-- .../navigation/ExpandableNavigationGroup.java | 5 +++-- .../component/navigation/NavigationGroup.java | 5 +++-- .../component/navigation/NavigationItem.java | 5 +++-- .../navigation/NavigationLinkText.java | 5 +++-- .../navigation/NavigationSubComponent.java | 4 ++-- .../notification/NotificationDrawerBody.java | 5 +++-- .../NotificationDrawerHeader.java | 5 +++-- .../notification/NotificationDrawerItem.java | 5 +++-- .../NotificationDrawerItemBody.java | 5 +++-- .../notification/NotificationDrawerList.java | 5 +++-- .../NotificationDrawerSubComponent.java | 4 ++-- .../component/page/MastheadBrand.java | 5 +++-- .../component/page/MastheadContent.java | 5 +++-- .../component/page/MastheadLogo.java | 5 +++-- .../component/page/MastheadMain.java | 5 +++-- .../component/page/MastheadSubComponent.java | 4 ++-- .../component/page/MastheadToggle.java | 5 +++-- .../component/page/PageBreadcrumb.java | 5 +++-- .../patternfly/component/page/PageGroup.java | 5 +++-- .../patternfly/component/page/PageMain.java | 5 +++-- .../component/page/PageNavigation.java | 5 +++-- .../component/page/PageSection.java | 5 +++-- .../component/page/PageSectionBuilder.java | 4 ++-- .../component/page/PageSidebar.java | 5 +++-- .../component/page/PageSidebarBody.java | 5 +++-- .../component/page/PageSubComponent.java | 4 ++-- .../patternfly/component/page/PageTabs.java | 5 +++-- .../patternfly/component/page/PageWizard.java | 5 +++-- .../component/panel/PanelFooter.java | 5 +++-- .../component/panel/PanelHeader.java | 5 +++-- .../patternfly/component/panel/PanelMain.java | 5 +++-- .../component/panel/PanelSubComponent.java | 4 ++-- .../component/popover/PopoverBody.java | 5 +++-- .../component/popover/PopoverFooter.java | 5 +++-- .../component/popover/PopoverHeader.java | 5 +++-- .../popover/PopoverSubComponent.java | 4 ++-- .../component/popover/PopperPopoverBody.java | 5 +++-- .../popover/PopperPopoverFooter.java | 5 +++-- .../popover/PopperPopoverHeader.java | 5 +++-- .../popover/PopperPopoverSubComponent.java | 4 ++-- .../progressstepper/ProgressStep.java | 5 +++-- .../component/slider/SliderActions.java | 5 +++-- .../component/slider/SliderSubComponent.java | 4 ++-- .../org/patternfly/component/table/Cell.java | 4 ++-- .../component/table/TableCaption.java | 5 +++-- .../component/table/TableSubComponent.java | 4 ++-- .../patternfly/component/table/TableText.java | 5 +++-- .../org/patternfly/component/table/Tbody.java | 5 +++-- .../org/patternfly/component/table/Td.java | 15 ++++++++------- .../org/patternfly/component/table/Th.java | 11 ++++++----- .../org/patternfly/component/table/Thead.java | 5 +++-- .../patternfly/component/table/TitleCell.java | 7 ++++--- .../org/patternfly/component/table/Tr.java | 9 +++++---- .../component/tabs/OverflowTab.java | 5 +++-- .../org/patternfly/component/tabs/Tab.java | 5 +++-- .../patternfly/component/tabs/TabContent.java | 5 +++-- .../component/tabs/TabContentBody.java | 5 +++-- .../component/tabs/TabSubComponent.java | 4 ++-- .../patternfly/component/tabs/TabsToggle.java | 5 +++-- .../TextInputGroupSubComponent.java | 4 ++-- .../TextInputGroupUtilities.java | 5 +++-- .../togglegroup/ToggleGroupItem.java | 5 +++-- .../togglegroup/ToggleGroupSubComponent.java | 4 ++-- .../component/toolbar/ToolbarContent.java | 5 +++-- .../toolbar/ToolbarFilterContent.java | 5 +++-- .../toolbar/ToolbarFilterLabelGroup.java | 5 +++-- .../component/toolbar/ToolbarGroup.java | 5 +++-- .../component/toolbar/ToolbarItem.java | 5 +++-- .../toolbar/ToolbarSubComponent.java | 4 ++-- .../component/toolbar/ToolbarToggleGroup.java | 5 +++-- .../component/tree/TreeViewItem.java | 9 +++++---- .../component/tree/TreeViewSubComponent.java | 4 ++-- .../component/wizard/WizardFooter.java | 5 +++-- .../component/wizard/WizardHeader.java | 5 +++-- .../wizard/WizardHeaderDescription.java | 5 +++-- .../component/wizard/WizardHeaderTitle.java | 5 +++-- .../component/wizard/WizardNav.java | 5 +++-- .../component/wizard/WizardNavItem.java | 5 +++-- .../component/wizard/WizardStep.java | 5 +++-- .../component/wizard/WizardSubComponent.java | 4 ++-- .../codeeditor/CodeEditorAction.java | 5 +++-- .../codeeditor/CodeEditorActions.java | 5 +++-- .../codeeditor/CodeEditorHeader.java | 5 +++-- .../codeeditor/CodeEditorHeaderMain.java | 5 +++-- .../extension/codeeditor/CodeEditorLink.java | 5 +++-- .../extension/codeeditor/CodeEditorLinks.java | 5 +++-- .../codeeditor/CodeEditorSubComponent.java | 4 ++-- .../extension/codeeditor/CodeEditorTab.java | 5 +++-- .../codeeditor/CodeEditorTabIcon.java | 5 +++-- .../codeeditor/CodeEditorTabText.java | 5 +++-- .../extension/finder/FinderColumn.java | 7 ++++--- .../extension/finder/FinderColumnActions.java | 5 +++-- .../extension/finder/FinderColumnHeader.java | 5 +++-- .../extension/finder/FinderColumnSearch.java | 9 +++++---- .../extension/finder/FinderItem.java | 11 ++++++----- .../extension/finder/FinderItemActions.java | 5 +++-- .../finder/FinderItemDescription.java | 5 +++-- .../extension/finder/FinderPreview.java | 5 +++-- .../extension/finder/FinderSubComponent.java | 4 ++-- 202 files changed, 609 insertions(+), 440 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 24fe85fc0..53d218d4c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +### Added + +- Add OUIA support to all sub-components: every sub-component now renders `data-ouia-component-type` (e.g., `PF6/Component/Card/CardHeader`) and `data-ouia-safe="true"`, with an `ouiaId(String)` method for setting `data-ouia-component-id` + ## [0.7.7] - 2026-05-19 ### Changed diff --git a/components/src/main/java/org/patternfly/component/ComponentStore.java b/components/src/main/java/org/patternfly/component/ComponentStore.java index 9a7a3e87a..eb870e23b 100644 --- a/components/src/main/java/org/patternfly/component/ComponentStore.java +++ b/components/src/main/java/org/patternfly/component/ComponentStore.java @@ -76,10 +76,10 @@ static > void storeComponent static > void storeSubComponent(SubComponent subComponent) { String uuid = uuid(); subComponents.put(uuid, subComponent); - subComponent.element().dataset.set(key(subComponent.componentType, subComponent.name), uuid); + subComponent.element().dataset.set(key(subComponent.componentType, subComponent.subComponentId), uuid); onDetach(subComponent.element(), mr -> remove(uuid, "sub component", subComponents::remove)); if (logger.isEnabled(DEBUG)) { - logger.debug("Store subcomponent %s/%s as %s on %o%s", subComponent.componentType.componentName, subComponent.name, + logger.debug("Store subcomponent %s/%s as %s on %o%s", subComponent.componentType.componentName, subComponent.subComponentId, uuid, subComponent.element(), count()); } } diff --git a/components/src/main/java/org/patternfly/component/SubComponent.java b/components/src/main/java/org/patternfly/component/SubComponent.java index 59c2a2e8d..8220746bd 100644 --- a/components/src/main/java/org/patternfly/component/SubComponent.java +++ b/components/src/main/java/org/patternfly/component/SubComponent.java @@ -33,6 +33,7 @@ import static java.util.Objects.requireNonNull; import static org.patternfly.component.ComponentRegistry.componentRegistry; +import static org.patternfly.core.Ouia.ouia; public abstract class SubComponent> implements ElementAttributeMethods, @@ -48,17 +49,25 @@ public abstract class SubComponent { final ComponentType componentType; - final String name; + final String subComponentId; + final String subComponentName; private final E element; - protected SubComponent(ComponentType componentType, String name, E element) { + protected SubComponent(ComponentType componentType, String subComponentId, String subComponentName, E element) { this.componentType = requireNonNull(componentType, "component type required"); - this.name = requireNonNull(name, "name required"); + this.subComponentId = requireNonNull(subComponentId, "sub-component ID required"); + this.subComponentName = requireNonNull(subComponentName, "sub-component name required"); this.element = requireNonNull(element, "element required"); + ouia(element, componentType.componentName + "/" + subComponentName); + } + + public B ouiaId(String id) { + ouia(element(), id, componentType.componentName + "/" + subComponentName); + return that(); } protected String subComponentId() { - return Id.build(componentType.id, name); + return Id.build(componentType.id, subComponentId); } @Override @@ -67,7 +76,7 @@ public E element() { } public B registerSubComponent() { - componentRegistry().registerSubComponent(componentType, name, this); + componentRegistry().registerSubComponent(componentType, subComponentId, this); return that(); } diff --git a/components/src/main/java/org/patternfly/component/accordion/AccordionItem.java b/components/src/main/java/org/patternfly/component/accordion/AccordionItem.java index 6513c45a2..995167590 100644 --- a/components/src/main/java/org/patternfly/component/accordion/AccordionItem.java +++ b/components/src/main/java/org/patternfly/component/accordion/AccordionItem.java @@ -81,7 +81,8 @@ public static AccordionItem accordionItem(String identifier, String text) { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "aci"; + public static final String SUB_COMPONENT_ID = "aci"; + public static final String SUB_COMPONENT_NAME = "AccordionItem"; private final String identifier; private final Map data; private final HTMLElement textElement; @@ -92,7 +93,7 @@ public static AccordionItem accordionItem(String identifier, String text) { private HTMLElement contentElement; AccordionItem(String identifier) { - super(SUB_COMPONENT_NAME, div().css(component(accordion, item)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(accordion, item)).element()); this.identifier = identifier; this.data = new HashMap<>(); this.expanded = false; diff --git a/components/src/main/java/org/patternfly/component/accordion/AccordionItemBody.java b/components/src/main/java/org/patternfly/component/accordion/AccordionItemBody.java index 5167a601f..62bc8ca82 100644 --- a/components/src/main/java/org/patternfly/component/accordion/AccordionItemBody.java +++ b/components/src/main/java/org/patternfly/component/accordion/AccordionItemBody.java @@ -36,10 +36,11 @@ public static AccordionItemBody accordionItemBody() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "acicb"; + public static final String SUB_COMPONENT_ID = "acicb"; + public static final String SUB_COMPONENT_NAME = "AccordionItemBody"; AccordionItemBody() { - super(SUB_COMPONENT_NAME, div().css(component(accordion, expandableContent, body)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(accordion, expandableContent, body)).element()); } // ------------------------------------------------------ builder diff --git a/components/src/main/java/org/patternfly/component/accordion/AccordionSubComponent.java b/components/src/main/java/org/patternfly/component/accordion/AccordionSubComponent.java index e9dddad28..f6d7730ae 100644 --- a/components/src/main/java/org/patternfly/component/accordion/AccordionSubComponent.java +++ b/components/src/main/java/org/patternfly/component/accordion/AccordionSubComponent.java @@ -23,7 +23,7 @@ abstract class AccordionSubComponent> extends SubComponent { - AccordionSubComponent(String name, E element) { - super(ComponentType.Accordion, name, element); + AccordionSubComponent(String subComponentId, String subComponentName, E element) { + super(ComponentType.Accordion, subComponentId, subComponentName, element); } } diff --git a/components/src/main/java/org/patternfly/component/alert/AlertActionGroup.java b/components/src/main/java/org/patternfly/component/alert/AlertActionGroup.java index a9704e55c..368549ad3 100644 --- a/components/src/main/java/org/patternfly/component/alert/AlertActionGroup.java +++ b/components/src/main/java/org/patternfly/component/alert/AlertActionGroup.java @@ -37,10 +37,11 @@ public static AlertActionGroup alertActionGroup() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "aag"; + public static final String SUB_COMPONENT_ID = "aag"; + public static final String SUB_COMPONENT_NAME = "AlertActionGroup"; AlertActionGroup() { - super(SUB_COMPONENT_NAME, div().css(component(Classes.alert, actionGroup)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(Classes.alert, actionGroup)).element()); } // ------------------------------------------------------ add diff --git a/components/src/main/java/org/patternfly/component/alert/AlertDescription.java b/components/src/main/java/org/patternfly/component/alert/AlertDescription.java index 0fe8de3da..004a524f4 100644 --- a/components/src/main/java/org/patternfly/component/alert/AlertDescription.java +++ b/components/src/main/java/org/patternfly/component/alert/AlertDescription.java @@ -39,10 +39,11 @@ public static AlertDescription alertDescription(String text) { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "ad"; + public static final String SUB_COMPONENT_ID = "ad"; + public static final String SUB_COMPONENT_NAME = "AlertDescription"; AlertDescription() { - super(SUB_COMPONENT_NAME, div().css(component(alert, description)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(alert, description)).element()); } // ------------------------------------------------------ builder diff --git a/components/src/main/java/org/patternfly/component/alert/AlertSubComponent.java b/components/src/main/java/org/patternfly/component/alert/AlertSubComponent.java index 58730cf45..5dfff27d9 100644 --- a/components/src/main/java/org/patternfly/component/alert/AlertSubComponent.java +++ b/components/src/main/java/org/patternfly/component/alert/AlertSubComponent.java @@ -23,7 +23,7 @@ abstract class AlertSubComponent> extends SubComponent { - AlertSubComponent(String name, E element) { - super(ComponentType.Alert, name, element); + AlertSubComponent(String subComponentId, String subComponentName, E element) { + super(ComponentType.Alert, subComponentId, subComponentName, element); } } diff --git a/components/src/main/java/org/patternfly/component/breadcrumb/BreadcrumbItem.java b/components/src/main/java/org/patternfly/component/breadcrumb/BreadcrumbItem.java index a8c58eaf2..6519b7ab7 100644 --- a/components/src/main/java/org/patternfly/component/breadcrumb/BreadcrumbItem.java +++ b/components/src/main/java/org/patternfly/component/breadcrumb/BreadcrumbItem.java @@ -64,14 +64,15 @@ public static BreadcrumbItem breadcrumbItem(String identifier, String text, Stri // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "bci"; + public static final String SUB_COMPONENT_ID = "bci"; + public static final String SUB_COMPONENT_NAME = "BreadcrumbItem"; private final String identifier; private final Map data; private final HTMLElement textElement; private HTMLAnchorElement anchorElement; BreadcrumbItem(String identifier) { - super(SUB_COMPONENT_NAME, li().css(component(breadcrumb, item)) + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, li().css(component(breadcrumb, item)) .data(Dataset.identifier, identifier) .element()); this.identifier = identifier; diff --git a/components/src/main/java/org/patternfly/component/breadcrumb/BreadcrumbSubComponent.java b/components/src/main/java/org/patternfly/component/breadcrumb/BreadcrumbSubComponent.java index e18d25930..99edd0a99 100644 --- a/components/src/main/java/org/patternfly/component/breadcrumb/BreadcrumbSubComponent.java +++ b/components/src/main/java/org/patternfly/component/breadcrumb/BreadcrumbSubComponent.java @@ -23,7 +23,7 @@ abstract class BreadcrumbSubComponent> extends SubComponent { - BreadcrumbSubComponent(String name, E element) { - super(ComponentType.Breadcrumb, name, element); + BreadcrumbSubComponent(String subComponentId, String subComponentName, E element) { + super(ComponentType.Breadcrumb, subComponentId, subComponentName, element); } } diff --git a/components/src/main/java/org/patternfly/component/card/CardActions.java b/components/src/main/java/org/patternfly/component/card/CardActions.java index 21656e1a0..7579c5f4c 100644 --- a/components/src/main/java/org/patternfly/component/card/CardActions.java +++ b/components/src/main/java/org/patternfly/component/card/CardActions.java @@ -37,13 +37,14 @@ public static CardActions cardActions() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "ca"; + public static final String SUB_COMPONENT_ID = "ca"; + public static final String SUB_COMPONENT_NAME = "CardActions"; CardSelectableActions selectableActions; private Card card; CardActions() { - super(SUB_COMPONENT_NAME, div().css(component(Classes.card, actions)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(Classes.card, actions)).element()); } // ------------------------------------------------------ add diff --git a/components/src/main/java/org/patternfly/component/card/CardBody.java b/components/src/main/java/org/patternfly/component/card/CardBody.java index b05338e8f..f856a9193 100644 --- a/components/src/main/java/org/patternfly/component/card/CardBody.java +++ b/components/src/main/java/org/patternfly/component/card/CardBody.java @@ -37,10 +37,11 @@ public static CardBody cardBody() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "cb"; + public static final String SUB_COMPONENT_ID = "cb"; + public static final String SUB_COMPONENT_NAME = "CardBody"; CardBody() { - super(SUB_COMPONENT_NAME, div().css(component(card, body)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(card, body)).element()); } // ------------------------------------------------------ builder diff --git a/components/src/main/java/org/patternfly/component/card/CardExpandableContent.java b/components/src/main/java/org/patternfly/component/card/CardExpandableContent.java index 3d0d84db0..f48321588 100644 --- a/components/src/main/java/org/patternfly/component/card/CardExpandableContent.java +++ b/components/src/main/java/org/patternfly/component/card/CardExpandableContent.java @@ -35,10 +35,11 @@ public static CardExpandableContent cardExpandableContent() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "cec"; + public static final String SUB_COMPONENT_ID = "cec"; + public static final String SUB_COMPONENT_NAME = "CardExpandableContent"; CardExpandableContent() { - super(SUB_COMPONENT_NAME, div().css(component(card, expandableContent)) + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(card, expandableContent)) .apply(e -> e.hidden = true) .element()); } diff --git a/components/src/main/java/org/patternfly/component/card/CardFooter.java b/components/src/main/java/org/patternfly/component/card/CardFooter.java index 086985470..8da7159cf 100644 --- a/components/src/main/java/org/patternfly/component/card/CardFooter.java +++ b/components/src/main/java/org/patternfly/component/card/CardFooter.java @@ -35,10 +35,11 @@ public static CardFooter cardFooter() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "cf"; + public static final String SUB_COMPONENT_ID = "cf"; + public static final String SUB_COMPONENT_NAME = "CardFooter"; CardFooter() { - super(SUB_COMPONENT_NAME, div().css(component(card, footer)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(card, footer)).element()); } // ------------------------------------------------------ builder diff --git a/components/src/main/java/org/patternfly/component/card/CardHeader.java b/components/src/main/java/org/patternfly/component/card/CardHeader.java index e7a7aa5a7..90c2b4c13 100644 --- a/components/src/main/java/org/patternfly/component/card/CardHeader.java +++ b/components/src/main/java/org/patternfly/component/card/CardHeader.java @@ -55,7 +55,8 @@ public static CardHeader cardHeader() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "ch"; + public static final String SUB_COMPONENT_ID = "ch"; + public static final String SUB_COMPONENT_NAME = "CardHeader"; Button toggleButton; CardActions actions; @@ -63,7 +64,7 @@ public static CardHeader cardHeader() { private CardTitle title; CardHeader() { - super(SUB_COMPONENT_NAME, div().css(component(Classes.card, header)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(Classes.card, header)).element()); element().appendChild(mainElement = div().css(component(Classes.card, header, main)).element()); Attachable.register(this, this); } diff --git a/components/src/main/java/org/patternfly/component/card/CardSelectableActions.java b/components/src/main/java/org/patternfly/component/card/CardSelectableActions.java index ae0fe71c1..14767bcdc 100644 --- a/components/src/main/java/org/patternfly/component/card/CardSelectableActions.java +++ b/components/src/main/java/org/patternfly/component/card/CardSelectableActions.java @@ -50,13 +50,14 @@ public static CardSelectableActions cardSelectableActions() { // ------------------------------------------------------ instance private static final Logger logger = Logger.getLogger(CardSelectableActions.class.getName()); - public static final String SUB_COMPONENT_NAME = "csa"; + public static final String SUB_COMPONENT_ID = "csa"; + public static final String SUB_COMPONENT_NAME = "CardSelectableActions"; Checkbox checkbox; Radio radio; CardSelectableActions() { - super(SUB_COMPONENT_NAME, div().css(component(Classes.card, selectable, actions)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(Classes.card, selectable, actions)).element()); Attachable.register(this, this); } diff --git a/components/src/main/java/org/patternfly/component/card/CardSubComponent.java b/components/src/main/java/org/patternfly/component/card/CardSubComponent.java index 0e83e31fc..e2c32e712 100644 --- a/components/src/main/java/org/patternfly/component/card/CardSubComponent.java +++ b/components/src/main/java/org/patternfly/component/card/CardSubComponent.java @@ -23,7 +23,7 @@ abstract class CardSubComponent> extends SubComponent { - CardSubComponent(String name, E element) { - super(ComponentType.Card, name, element); + CardSubComponent(String subComponentId, String subComponentName, E element) { + super(ComponentType.Card, subComponentId, subComponentName, element); } } diff --git a/components/src/main/java/org/patternfly/component/card/CardTitle.java b/components/src/main/java/org/patternfly/component/card/CardTitle.java index 6c4a41fe4..38b4b1289 100644 --- a/components/src/main/java/org/patternfly/component/card/CardTitle.java +++ b/components/src/main/java/org/patternfly/component/card/CardTitle.java @@ -53,12 +53,13 @@ public static CardTitle cardTitle(String text, int level) { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "ct"; + public static final String SUB_COMPONENT_ID = "ct"; + public static final String SUB_COMPONENT_NAME = "CardTitle"; private final HTMLElement titleText; CardTitle(String text, int level) { - super(SUB_COMPONENT_NAME, div().css(component(card, title)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(card, title)).element()); if (level > 0) { element().appendChild(titleText = h(level).css(component(card, title, Classes.text)).element()); } else { diff --git a/components/src/main/java/org/patternfly/component/codeblock/CodeBlockAction.java b/components/src/main/java/org/patternfly/component/codeblock/CodeBlockAction.java index b8b65b7ee..58d97e2e8 100644 --- a/components/src/main/java/org/patternfly/component/codeblock/CodeBlockAction.java +++ b/components/src/main/java/org/patternfly/component/codeblock/CodeBlockAction.java @@ -72,11 +72,12 @@ public static CodeBlockAction codeBlockCopyToClipboardAction(String copyText, St // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "cba"; + public static final String SUB_COMPONENT_ID = "cba"; + public static final String SUB_COMPONENT_NAME = "CodeBlockAction"; private final Button button; CodeBlockAction(Element icon) { - super(SUB_COMPONENT_NAME, div().css(component(Classes.codeBlock, actions, item)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(Classes.codeBlock, actions, item)).element()); add(button = button().plain().icon(icon)); } diff --git a/components/src/main/java/org/patternfly/component/codeblock/CodeBlockActions.java b/components/src/main/java/org/patternfly/component/codeblock/CodeBlockActions.java index eb5a2946e..5c9b447c3 100644 --- a/components/src/main/java/org/patternfly/component/codeblock/CodeBlockActions.java +++ b/components/src/main/java/org/patternfly/component/codeblock/CodeBlockActions.java @@ -32,10 +32,11 @@ public static CodeBlockActions codeBlockActions() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "cbas"; + public static final String SUB_COMPONENT_ID = "cbas"; + public static final String SUB_COMPONENT_NAME = "CodeBlockActions"; CodeBlockActions() { - super(SUB_COMPONENT_NAME, div().css(component(Classes.codeBlock, Classes.actions)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(Classes.codeBlock, Classes.actions)).element()); } // ------------------------------------------------------ add diff --git a/components/src/main/java/org/patternfly/component/codeblock/CodeBlockHeader.java b/components/src/main/java/org/patternfly/component/codeblock/CodeBlockHeader.java index d39bf6426..aa7e62467 100644 --- a/components/src/main/java/org/patternfly/component/codeblock/CodeBlockHeader.java +++ b/components/src/main/java/org/patternfly/component/codeblock/CodeBlockHeader.java @@ -33,12 +33,13 @@ public static CodeBlockHeader codeBlockHeader() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "cbh"; + public static final String SUB_COMPONENT_ID = "cbh"; + public static final String SUB_COMPONENT_NAME = "CodeBlockHeader"; CodeBlockActions actions; CodeBlockHeader() { - super(SUB_COMPONENT_NAME, div().css(component(Classes.codeBlock, header)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(Classes.codeBlock, header)).element()); } // ------------------------------------------------------ add diff --git a/components/src/main/java/org/patternfly/component/codeblock/CodeBlockSubComponent.java b/components/src/main/java/org/patternfly/component/codeblock/CodeBlockSubComponent.java index a445a2908..acf8430d4 100644 --- a/components/src/main/java/org/patternfly/component/codeblock/CodeBlockSubComponent.java +++ b/components/src/main/java/org/patternfly/component/codeblock/CodeBlockSubComponent.java @@ -23,7 +23,7 @@ abstract class CodeBlockSubComponent> extends SubComponent { - CodeBlockSubComponent(String name, E element) { - super(ComponentType.CodeBlock, name, element); + CodeBlockSubComponent(String subComponentId, String subComponentName, E element) { + super(ComponentType.CodeBlock, subComponentId, subComponentName, element); } } diff --git a/components/src/main/java/org/patternfly/component/drawer/DrawerBody.java b/components/src/main/java/org/patternfly/component/drawer/DrawerBody.java index 912ae0efd..976b842b7 100644 --- a/components/src/main/java/org/patternfly/component/drawer/DrawerBody.java +++ b/components/src/main/java/org/patternfly/component/drawer/DrawerBody.java @@ -42,10 +42,11 @@ public static DrawerBody drawerBody() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "db"; + public static final String SUB_COMPONENT_ID = "db"; + public static final String SUB_COMPONENT_NAME = "DrawerBody"; DrawerBody() { - super(SUB_COMPONENT_NAME, div().css(component(drawer, body)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(drawer, body)).element()); } // ------------------------------------------------------ builder diff --git a/components/src/main/java/org/patternfly/component/drawer/DrawerCloseButton.java b/components/src/main/java/org/patternfly/component/drawer/DrawerCloseButton.java index 91fe0fe41..85d077816 100644 --- a/components/src/main/java/org/patternfly/component/drawer/DrawerCloseButton.java +++ b/components/src/main/java/org/patternfly/component/drawer/DrawerCloseButton.java @@ -37,10 +37,11 @@ public static DrawerCloseButton drawerCloseButton() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "dcbtn"; + public static final String SUB_COMPONENT_ID = "dcbtn"; + public static final String SUB_COMPONENT_NAME = "DrawerCloseButton"; DrawerCloseButton() { - super(SUB_COMPONENT_NAME, div().css(component(drawer, actions)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(drawer, actions)).element()); add(div().css(component(drawer, close)) .add(button().plain().icon(times()) .aria(label, "Close drawer panel") diff --git a/components/src/main/java/org/patternfly/component/drawer/DrawerContent.java b/components/src/main/java/org/patternfly/component/drawer/DrawerContent.java index 48847bff9..91e9fe998 100644 --- a/components/src/main/java/org/patternfly/component/drawer/DrawerContent.java +++ b/components/src/main/java/org/patternfly/component/drawer/DrawerContent.java @@ -36,10 +36,11 @@ public static DrawerContent drawerContent() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "dc"; + public static final String SUB_COMPONENT_ID = "dc"; + public static final String SUB_COMPONENT_NAME = "DrawerContent"; DrawerContent() { - super(SUB_COMPONENT_NAME, div().css(component(drawer, content)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(drawer, content)).element()); } // ------------------------------------------------------ add diff --git a/components/src/main/java/org/patternfly/component/drawer/DrawerPanel.java b/components/src/main/java/org/patternfly/component/drawer/DrawerPanel.java index b6b96aa97..4c004982a 100644 --- a/components/src/main/java/org/patternfly/component/drawer/DrawerPanel.java +++ b/components/src/main/java/org/patternfly/component/drawer/DrawerPanel.java @@ -93,7 +93,8 @@ public static DrawerPanel drawerPanel() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "dp"; + public static final String SUB_COMPONENT_ID = "dp"; + public static final String SUB_COMPONENT_NAME = "DrawerPanel"; private int increment; private boolean resizable; private boolean isResizing; @@ -112,7 +113,7 @@ public static DrawerPanel drawerPanel() { private final List> resizeHandler; DrawerPanel() { - super(SUB_COMPONENT_NAME, div().css(component(Classes.drawer, panel)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(Classes.drawer, panel)).element()); this.increment = 5; this.resizable = false; this.isResizing = false; diff --git a/components/src/main/java/org/patternfly/component/drawer/DrawerPanelHead.java b/components/src/main/java/org/patternfly/component/drawer/DrawerPanelHead.java index adb4b9ca7..c0fc723a5 100644 --- a/components/src/main/java/org/patternfly/component/drawer/DrawerPanelHead.java +++ b/components/src/main/java/org/patternfly/component/drawer/DrawerPanelHead.java @@ -38,10 +38,11 @@ public static DrawerPanelHead drawerPanelHead() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "dph"; + public static final String SUB_COMPONENT_ID = "dph"; + public static final String SUB_COMPONENT_NAME = "DrawerPanelHead"; DrawerPanelHead() { - super(SUB_COMPONENT_NAME, div().css(component(drawer, head)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(drawer, head)).element()); } // ------------------------------------------------------ add diff --git a/components/src/main/java/org/patternfly/component/drawer/DrawerSection.java b/components/src/main/java/org/patternfly/component/drawer/DrawerSection.java index 9f3d6c5d8..c56bc89af 100644 --- a/components/src/main/java/org/patternfly/component/drawer/DrawerSection.java +++ b/components/src/main/java/org/patternfly/component/drawer/DrawerSection.java @@ -38,10 +38,11 @@ public static DrawerSection drawerSection() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "ds"; + public static final String SUB_COMPONENT_ID = "ds"; + public static final String SUB_COMPONENT_NAME = "DrawerSection"; DrawerSection() { - super(SUB_COMPONENT_NAME, div().css(component(drawer, section)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(drawer, section)).element()); } // ------------------------------------------------------ builder diff --git a/components/src/main/java/org/patternfly/component/drawer/DrawerSubComponent.java b/components/src/main/java/org/patternfly/component/drawer/DrawerSubComponent.java index c5c708a00..3948837d8 100644 --- a/components/src/main/java/org/patternfly/component/drawer/DrawerSubComponent.java +++ b/components/src/main/java/org/patternfly/component/drawer/DrawerSubComponent.java @@ -23,7 +23,7 @@ abstract class DrawerSubComponent> extends SubComponent { - DrawerSubComponent(String name, E element) { - super(ComponentType.Drawer, name, element); + DrawerSubComponent(String subComponentId, String subComponentName, E element) { + super(ComponentType.Drawer, subComponentId, subComponentName, element); } } diff --git a/components/src/main/java/org/patternfly/component/emptystate/EmptyStateActions.java b/components/src/main/java/org/patternfly/component/emptystate/EmptyStateActions.java index f0f21cfcc..2fe4f0997 100644 --- a/components/src/main/java/org/patternfly/component/emptystate/EmptyStateActions.java +++ b/components/src/main/java/org/patternfly/component/emptystate/EmptyStateActions.java @@ -32,10 +32,11 @@ public static EmptyStateActions emptyStateActions() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "esa"; + public static final String SUB_COMPONENT_ID = "esa"; + public static final String SUB_COMPONENT_NAME = "EmptyStateActions"; EmptyStateActions() { - super(SUB_COMPONENT_NAME, div().css(component(emptyState, actions)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(emptyState, actions)).element()); } // ------------------------------------------------------ builder diff --git a/components/src/main/java/org/patternfly/component/emptystate/EmptyStateBody.java b/components/src/main/java/org/patternfly/component/emptystate/EmptyStateBody.java index 3d06106e2..d0f259d47 100644 --- a/components/src/main/java/org/patternfly/component/emptystate/EmptyStateBody.java +++ b/components/src/main/java/org/patternfly/component/emptystate/EmptyStateBody.java @@ -35,10 +35,11 @@ public static EmptyStateBody emptyStateBody() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "esb"; + public static final String SUB_COMPONENT_ID = "esb"; + public static final String SUB_COMPONENT_NAME = "EmptyStateBody"; EmptyStateBody() { - super(SUB_COMPONENT_NAME, div().css(component(emptyState, body)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(emptyState, body)).element()); } // ------------------------------------------------------ builder diff --git a/components/src/main/java/org/patternfly/component/emptystate/EmptyStateFooter.java b/components/src/main/java/org/patternfly/component/emptystate/EmptyStateFooter.java index 9b177923e..3f04528c2 100644 --- a/components/src/main/java/org/patternfly/component/emptystate/EmptyStateFooter.java +++ b/components/src/main/java/org/patternfly/component/emptystate/EmptyStateFooter.java @@ -35,10 +35,11 @@ public static EmptyStateFooter emptyStateFooter() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "esb"; + public static final String SUB_COMPONENT_ID = "esb"; + public static final String SUB_COMPONENT_NAME = "EmptyStateFooter"; EmptyStateFooter() { - super(SUB_COMPONENT_NAME, div().css(component(emptyState, footer)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(emptyState, footer)).element()); } // ------------------------------------------------------ add diff --git a/components/src/main/java/org/patternfly/component/emptystate/EmptyStateSubComponent.java b/components/src/main/java/org/patternfly/component/emptystate/EmptyStateSubComponent.java index a5de6745f..9416f3adc 100644 --- a/components/src/main/java/org/patternfly/component/emptystate/EmptyStateSubComponent.java +++ b/components/src/main/java/org/patternfly/component/emptystate/EmptyStateSubComponent.java @@ -23,7 +23,7 @@ abstract class EmptyStateSubComponent> extends SubComponent { - EmptyStateSubComponent(String name, E element) { - super(ComponentType.EmptyState, name, element); + EmptyStateSubComponent(String subComponentId, String subComponentName, E element) { + super(ComponentType.EmptyState, subComponentId, subComponentName, element); } } diff --git a/components/src/main/java/org/patternfly/component/expandable/ExpandableSectionContent.java b/components/src/main/java/org/patternfly/component/expandable/ExpandableSectionContent.java index d37ff5953..8b2252c79 100644 --- a/components/src/main/java/org/patternfly/component/expandable/ExpandableSectionContent.java +++ b/components/src/main/java/org/patternfly/component/expandable/ExpandableSectionContent.java @@ -36,10 +36,11 @@ public static ExpandableSectionContent expandableSectionContent() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "esc"; + public static final String SUB_COMPONENT_ID = "esc"; + public static final String SUB_COMPONENT_NAME = "ExpandableSectionContent"; ExpandableSectionContent() { - super(SUB_COMPONENT_NAME, div().css(component(expandableSection, content)) + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(expandableSection, content)) .apply(e -> e.hidden = true) .role(region) .element()); diff --git a/components/src/main/java/org/patternfly/component/expandable/ExpandableSectionSubComponent.java b/components/src/main/java/org/patternfly/component/expandable/ExpandableSectionSubComponent.java index 9f3140e75..014ebda89 100644 --- a/components/src/main/java/org/patternfly/component/expandable/ExpandableSectionSubComponent.java +++ b/components/src/main/java/org/patternfly/component/expandable/ExpandableSectionSubComponent.java @@ -23,7 +23,7 @@ abstract class ExpandableSectionSubComponent> extends SubComponent { - ExpandableSectionSubComponent(String name, E element) { - super(ComponentType.ExpandableSection, name, element); + ExpandableSectionSubComponent(String subComponentId, String subComponentName, E element) { + super(ComponentType.ExpandableSection, subComponentId, subComponentName, element); } } diff --git a/components/src/main/java/org/patternfly/component/expandable/ExpandableSectionToggle.java b/components/src/main/java/org/patternfly/component/expandable/ExpandableSectionToggle.java index c5f7c8374..d0ff9138d 100644 --- a/components/src/main/java/org/patternfly/component/expandable/ExpandableSectionToggle.java +++ b/components/src/main/java/org/patternfly/component/expandable/ExpandableSectionToggle.java @@ -55,7 +55,8 @@ public static ExpandableSectionToggle expandableSectionToggle(String moreText, S // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "est"; + public static final String SUB_COMPONENT_ID = "est"; + public static final String SUB_COMPONENT_NAME = "ExpandableSectionToggle"; final Button button; final HTMLElement iconContainer; @@ -63,7 +64,7 @@ public static ExpandableSectionToggle expandableSectionToggle(String moreText, S private final String lessText; ExpandableSectionToggle(String moreText, String lessText) { - super(SUB_COMPONENT_NAME, div().css(component(expandableSection, toggle)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(expandableSection, toggle)).element()); this.moreText = moreText; this.lessText = lessText; this.iconContainer = span().css(component(expandableSection, toggle, icon)) diff --git a/components/src/main/java/org/patternfly/component/form/CheckboxBody.java b/components/src/main/java/org/patternfly/component/form/CheckboxBody.java index 38a5bddd9..89afc447f 100644 --- a/components/src/main/java/org/patternfly/component/form/CheckboxBody.java +++ b/components/src/main/java/org/patternfly/component/form/CheckboxBody.java @@ -39,10 +39,11 @@ public static CheckboxBody checkboxBody(String text) { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "cbb"; + public static final String SUB_COMPONENT_ID = "cbb"; + public static final String SUB_COMPONENT_NAME = "CheckboxBody"; CheckboxBody(String text) { - super(SUB_COMPONENT_NAME, span().css(component(check, body)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, span().css(component(check, body)).element()); if (text != null) { element().textContent = text; } diff --git a/components/src/main/java/org/patternfly/component/form/CheckboxDescription.java b/components/src/main/java/org/patternfly/component/form/CheckboxDescription.java index 3b9f8d2d2..55d002213 100644 --- a/components/src/main/java/org/patternfly/component/form/CheckboxDescription.java +++ b/components/src/main/java/org/patternfly/component/form/CheckboxDescription.java @@ -39,10 +39,11 @@ public static CheckboxDescription checkboxDescription(String description) { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "cbd"; + public static final String SUB_COMPONENT_ID = "cbd"; + public static final String SUB_COMPONENT_NAME = "CheckboxDescription"; CheckboxDescription(String description) { - super(SUB_COMPONENT_NAME, span().css(component(check, Classes.description)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, span().css(component(check, Classes.description)).element()); if (description != null) { element().textContent = description; } diff --git a/components/src/main/java/org/patternfly/component/form/CheckboxSubComponent.java b/components/src/main/java/org/patternfly/component/form/CheckboxSubComponent.java index a280b1204..2019a88fe 100644 --- a/components/src/main/java/org/patternfly/component/form/CheckboxSubComponent.java +++ b/components/src/main/java/org/patternfly/component/form/CheckboxSubComponent.java @@ -23,7 +23,7 @@ abstract class CheckboxSubComponent> extends SubComponent { - CheckboxSubComponent(String name, E element) { - super(ComponentType.Checkbox, name, element); + CheckboxSubComponent(String subComponentId, String subComponentName, E element) { + super(ComponentType.Checkbox, subComponentId, subComponentName, element); } } diff --git a/components/src/main/java/org/patternfly/component/form/FormActionGroup.java b/components/src/main/java/org/patternfly/component/form/FormActionGroup.java index 0fbea75de..23637fe4a 100644 --- a/components/src/main/java/org/patternfly/component/form/FormActionGroup.java +++ b/components/src/main/java/org/patternfly/component/form/FormActionGroup.java @@ -36,12 +36,13 @@ public static FormActionGroup formActionGroup() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "fag"; + public static final String SUB_COMPONENT_ID = "fag"; + public static final String SUB_COMPONENT_NAME = "FormActionGroup"; private final HTMLElement actionsContainer; FormActionGroup() { - super(SUB_COMPONENT_NAME, div().css(component(Classes.form, group), modifier(action)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(Classes.form, group), modifier(action)).element()); add(div().css(component(Classes.form, group, Classes.control)) // no need for a real FormGroupControl subcomponent .add(actionsContainer = div().css(component(Classes.form, Classes.actions)).element())); } diff --git a/components/src/main/java/org/patternfly/component/form/FormAlert.java b/components/src/main/java/org/patternfly/component/form/FormAlert.java index 35c776fc8..57f77f8ff 100644 --- a/components/src/main/java/org/patternfly/component/form/FormAlert.java +++ b/components/src/main/java/org/patternfly/component/form/FormAlert.java @@ -34,10 +34,11 @@ public static FormAlert formAlert() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "fa"; + public static final String SUB_COMPONENT_ID = "fa"; + public static final String SUB_COMPONENT_NAME = "FormAlert"; FormAlert() { - super(SUB_COMPONENT_NAME, div().css(component(Classes.form, alert)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(Classes.form, alert)).element()); } // ------------------------------------------------------ add diff --git a/components/src/main/java/org/patternfly/component/form/FormFieldGroup.java b/components/src/main/java/org/patternfly/component/form/FormFieldGroup.java index b877f816e..bb3de4338 100644 --- a/components/src/main/java/org/patternfly/component/form/FormFieldGroup.java +++ b/components/src/main/java/org/patternfly/component/form/FormFieldGroup.java @@ -66,7 +66,8 @@ public static FormFieldGroup formFieldGroup(boolean expandable) { // ------------------------------------------------------ instance private static final Logger logger = Logger.getLogger(FormFieldGroup.class.getName()); - public static final String SUB_COMPONENT_NAME = "ffg"; + public static final String SUB_COMPONENT_ID = "ffg"; + public static final String SUB_COMPONENT_NAME = "FormFieldGroup"; private final String titleId; private boolean expandable; @@ -76,10 +77,10 @@ public static FormFieldGroup formFieldGroup(boolean expandable) { private ToggleHandler toggleHandler; FormFieldGroup(boolean expandable) { - super(SUB_COMPONENT_NAME, div().css(component(form, fieldGroup)) + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(form, fieldGroup)) .attr(role, group) .element()); - this.titleId = Id.unique(ComponentType.Form.id, SUB_COMPONENT_NAME, "title"); + this.titleId = Id.unique(ComponentType.Form.id, SUB_COMPONENT_ID, "title"); this.expandable = false; storeSubComponent(); Attachable.register(this, this); @@ -129,7 +130,7 @@ public FormFieldGroup expandable() { public FormFieldGroup expandable(ToggleHandler toggleHandler) { if (!expandable) { - String toggleId = Id.unique(ComponentType.Form.id, SUB_COMPONENT_NAME, "toggle"); + String toggleId = Id.unique(ComponentType.Form.id, SUB_COMPONENT_ID, "toggle"); insertFirst(element(), div().css(component(form, fieldGroup, toggle)) .add(div().css(component(form, fieldGroup, toggle, Classes.button)) .add(toggleButton = button().plain() diff --git a/components/src/main/java/org/patternfly/component/form/FormFieldGroupBody.java b/components/src/main/java/org/patternfly/component/form/FormFieldGroupBody.java index d36056939..8a38bf4d7 100644 --- a/components/src/main/java/org/patternfly/component/form/FormFieldGroupBody.java +++ b/components/src/main/java/org/patternfly/component/form/FormFieldGroupBody.java @@ -33,10 +33,11 @@ public static FormFieldGroupBody formFieldGroupBody() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "ffgb"; + public static final String SUB_COMPONENT_ID = "ffgb"; + public static final String SUB_COMPONENT_NAME = "FormFieldGroupBody"; FormFieldGroupBody() { - super(SUB_COMPONENT_NAME, div().css(component(form, fieldGroup, body)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(form, fieldGroup, body)).element()); } // ------------------------------------------------------ add diff --git a/components/src/main/java/org/patternfly/component/form/FormFieldGroupHeader.java b/components/src/main/java/org/patternfly/component/form/FormFieldGroupHeader.java index 10b35dfed..fc37f87ab 100644 --- a/components/src/main/java/org/patternfly/component/form/FormFieldGroupHeader.java +++ b/components/src/main/java/org/patternfly/component/form/FormFieldGroupHeader.java @@ -42,14 +42,15 @@ public static FormFieldGroupHeader formFieldGroupHeader() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "ffgh"; + public static final String SUB_COMPONENT_ID = "ffgh"; + public static final String SUB_COMPONENT_NAME = "FormFieldGroupHeader"; private final HTMLElement mainContainer; private HTMLElement actionContainer; HTMLElement titleElement; private HTMLElement descriptionElement; FormFieldGroupHeader() { - super(SUB_COMPONENT_NAME, div().css(component(form, fieldGroup, header)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(form, fieldGroup, header)).element()); add(mainContainer = div().css(component(form, fieldGroup, header, main)).element()); } diff --git a/components/src/main/java/org/patternfly/component/form/FormGroup.java b/components/src/main/java/org/patternfly/component/form/FormGroup.java index aaec91447..b1912d57c 100644 --- a/components/src/main/java/org/patternfly/component/form/FormGroup.java +++ b/components/src/main/java/org/patternfly/component/form/FormGroup.java @@ -39,7 +39,7 @@ public class FormGroup extends FormSubComponent implemen // ------------------------------------------------------ factory public static FormGroup formGroup() { - return new FormGroup(Id.unique(ComponentType.Form.id, SUB_COMPONENT_NAME)); + return new FormGroup(Id.unique(ComponentType.Form.id, SUB_COMPONENT_ID)); } public static FormGroup formGroup(String identifier) { @@ -48,7 +48,8 @@ public static FormGroup formGroup(String identifier) { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "fg"; + public static final String SUB_COMPONENT_ID = "fg"; + public static final String SUB_COMPONENT_NAME = "FormGroup"; boolean required; FormGroupRole role; @@ -56,7 +57,7 @@ public static FormGroup formGroup(String identifier) { private final Map data; FormGroup(String identifier) { - super(SUB_COMPONENT_NAME, div().css(component(Classes.form, group)) + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(Classes.form, group)) .data(Dataset.identifier, identifier) .element()); this.identifier = identifier; diff --git a/components/src/main/java/org/patternfly/component/form/FormGroupControl.java b/components/src/main/java/org/patternfly/component/form/FormGroupControl.java index 0b5f551b3..7bd4b4c90 100644 --- a/components/src/main/java/org/patternfly/component/form/FormGroupControl.java +++ b/components/src/main/java/org/patternfly/component/form/FormGroupControl.java @@ -51,14 +51,15 @@ public static FormGroupControl formGroupControl() { // ------------------------------------------------------ instance private static final Logger logger = Logger.getLogger(FormGroupControl.class.getName()); - public static final String SUB_COMPONENT_NAME = "fgc"; + public static final String SUB_COMPONENT_ID = "fgc"; + public static final String SUB_COMPONENT_NAME = "FormGroupControl"; private FormControl control; private final List checkboxes; private final List radios; FormGroupControl() { - super(ComponentType.Form, SUB_COMPONENT_NAME, div().css(component(Classes.form, group, Classes.control)).element()); + super(ComponentType.Form, SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(Classes.form, group, Classes.control)).element()); this.checkboxes = new ArrayList<>(); this.radios = new ArrayList<>(); Attachable.register(this, this); @@ -66,7 +67,7 @@ public static FormGroupControl formGroupControl() { @Override public void attach(MutationRecord mutationRecord) { - FormGroup formGroup = lookupSubComponent(FormGroup.SUB_COMPONENT_NAME); + FormGroup formGroup = lookupSubComponent(FormGroup.SUB_COMPONENT_ID); if (control != null && !formGroup.identifier().equals(control.id)) { logger.error("The identifier of the form group %o is different to the id of its control %o: '%s' != '%s'", diff --git a/components/src/main/java/org/patternfly/component/form/FormGroupLabel.java b/components/src/main/java/org/patternfly/component/form/FormGroupLabel.java index b302b54d4..5535a111e 100644 --- a/components/src/main/java/org/patternfly/component/form/FormGroupLabel.java +++ b/components/src/main/java/org/patternfly/component/form/FormGroupLabel.java @@ -64,13 +64,14 @@ public static FormGroupLabel formGroupLabel(String label) { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "fgl"; + public static final String SUB_COMPONENT_ID = "fgl"; + public static final String SUB_COMPONENT_NAME = "FormGroupLabel"; private final HTMLElement textElement; private HTMLElement labelElement; FormGroupLabel(String label) { - super(SUB_COMPONENT_NAME, div().css(component(form, group, Classes.label)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(form, group, Classes.label)).element()); add(labelElement = Elements.label().css(component(form, Classes.label)) .add(textElement = span().css(component(form, Classes.label, text)) .text(label) @@ -81,7 +82,7 @@ public static FormGroupLabel formGroupLabel(String label) { @Override public void attach(MutationRecord mutationRecord) { - FormGroup formGroup = lookupSubComponent(FormGroup.SUB_COMPONENT_NAME); + FormGroup formGroup = lookupSubComponent(FormGroup.SUB_COMPONENT_ID); if (formGroup.role != null) { HTMLElement pseudoLabelElement = span().css(component(form, Classes.label)).element(); diff --git a/components/src/main/java/org/patternfly/component/form/FormSection.java b/components/src/main/java/org/patternfly/component/form/FormSection.java index d769e9d95..e54109338 100644 --- a/components/src/main/java/org/patternfly/component/form/FormSection.java +++ b/components/src/main/java/org/patternfly/component/form/FormSection.java @@ -52,11 +52,12 @@ public static FormSection formSection(String title, HTML // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "fs"; + public static final String SUB_COMPONENT_ID = "fs"; + public static final String SUB_COMPONENT_NAME = "FormSection"; private final HTMLContainerBuilder titleElement; FormSection(HTMLContainerBuilder titleElement) { - super(SUB_COMPONENT_NAME, div().css(component(form, section)) + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(form, section)) .attr(role, group) .element()); this.titleElement = titleElement == null ? div() : titleElement; diff --git a/components/src/main/java/org/patternfly/component/form/FormSelectOption.java b/components/src/main/java/org/patternfly/component/form/FormSelectOption.java index f7ba877f9..4f4f61cab 100644 --- a/components/src/main/java/org/patternfly/component/form/FormSelectOption.java +++ b/components/src/main/java/org/patternfly/component/form/FormSelectOption.java @@ -39,10 +39,11 @@ public static FormSelectOption formSelectOption(String label, String value) { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "fso"; + public static final String SUB_COMPONENT_ID = "fso"; + public static final String SUB_COMPONENT_NAME = "FormSelectOption"; public FormSelectOption(String label, String value) { - super(SUB_COMPONENT_NAME, option().apply(o -> { + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, option().apply(o -> { o.label = label; o.value = value; }).element()); diff --git a/components/src/main/java/org/patternfly/component/form/FormSelectOptionGroup.java b/components/src/main/java/org/patternfly/component/form/FormSelectOptionGroup.java index 1a7b290fc..e5fbf4333 100644 --- a/components/src/main/java/org/patternfly/component/form/FormSelectOptionGroup.java +++ b/components/src/main/java/org/patternfly/component/form/FormSelectOptionGroup.java @@ -34,10 +34,11 @@ public static FormSelectOptionGroup formSelectOptionGroup(String label) { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "fsog"; + public static final String SUB_COMPONENT_ID = "fsog"; + public static final String SUB_COMPONENT_NAME = "FormSelectOptionGroup"; FormSelectOptionGroup(String label) { - super(SUB_COMPONENT_NAME, optgroup() + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, optgroup() .apply(og -> og.label = label) .element()); } diff --git a/components/src/main/java/org/patternfly/component/form/FormSelectSubComponent.java b/components/src/main/java/org/patternfly/component/form/FormSelectSubComponent.java index 7f2b57945..4929c53bd 100644 --- a/components/src/main/java/org/patternfly/component/form/FormSelectSubComponent.java +++ b/components/src/main/java/org/patternfly/component/form/FormSelectSubComponent.java @@ -23,7 +23,7 @@ abstract class FormSelectSubComponent> extends SubComponent { - FormSelectSubComponent(String name, E element) { - super(ComponentType.FormSelect, name, element); + FormSelectSubComponent(String subComponentId, String subComponentName, E element) { + super(ComponentType.FormSelect, subComponentId, subComponentName, element); } } diff --git a/components/src/main/java/org/patternfly/component/form/FormSubComponent.java b/components/src/main/java/org/patternfly/component/form/FormSubComponent.java index 0029893f1..d41c4da11 100644 --- a/components/src/main/java/org/patternfly/component/form/FormSubComponent.java +++ b/components/src/main/java/org/patternfly/component/form/FormSubComponent.java @@ -23,7 +23,7 @@ abstract class FormSubComponent> extends SubComponent { - FormSubComponent(String name, E element) { - super(ComponentType.Form, name, element); + FormSubComponent(String subComponentId, String subComponentName, E element) { + super(ComponentType.Form, subComponentId, subComponentName, element); } } diff --git a/components/src/main/java/org/patternfly/component/form/RadioBody.java b/components/src/main/java/org/patternfly/component/form/RadioBody.java index b0ef8b0cf..481dc1577 100644 --- a/components/src/main/java/org/patternfly/component/form/RadioBody.java +++ b/components/src/main/java/org/patternfly/component/form/RadioBody.java @@ -38,10 +38,11 @@ public static RadioBody radioBody(String text) { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "rb"; + public static final String SUB_COMPONENT_ID = "rb"; + public static final String SUB_COMPONENT_NAME = "RadioBody"; RadioBody(String text) { - super(SUB_COMPONENT_NAME, span().css(component(radio, body)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, span().css(component(radio, body)).element()); if (text != null) { element().textContent = text; } diff --git a/components/src/main/java/org/patternfly/component/form/RadioDescription.java b/components/src/main/java/org/patternfly/component/form/RadioDescription.java index e7c6d3006..936bbbdef 100644 --- a/components/src/main/java/org/patternfly/component/form/RadioDescription.java +++ b/components/src/main/java/org/patternfly/component/form/RadioDescription.java @@ -39,10 +39,11 @@ public static RadioDescription radioDescription(String description) { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "rd"; + public static final String SUB_COMPONENT_ID = "rd"; + public static final String SUB_COMPONENT_NAME = "RadioDescription"; RadioDescription(String description) { - super(SUB_COMPONENT_NAME, span().css(component(radio, Classes.description)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, span().css(component(radio, Classes.description)).element()); if (description != null) { element().textContent = description; } diff --git a/components/src/main/java/org/patternfly/component/form/RadioSubComponent.java b/components/src/main/java/org/patternfly/component/form/RadioSubComponent.java index fb47296df..c7adb603a 100644 --- a/components/src/main/java/org/patternfly/component/form/RadioSubComponent.java +++ b/components/src/main/java/org/patternfly/component/form/RadioSubComponent.java @@ -23,7 +23,7 @@ abstract class RadioSubComponent> extends SubComponent { - RadioSubComponent(String name, E element) { - super(ComponentType.Radio, name, element); + RadioSubComponent(String subComponentId, String subComponentName, E element) { + super(ComponentType.Radio, subComponentId, subComponentName, element); } } diff --git a/components/src/main/java/org/patternfly/component/help/HelperTextItem.java b/components/src/main/java/org/patternfly/component/help/HelperTextItem.java index 9739da479..d21fd00ec 100644 --- a/components/src/main/java/org/patternfly/component/help/HelperTextItem.java +++ b/components/src/main/java/org/patternfly/component/help/HelperTextItem.java @@ -79,7 +79,8 @@ public static HelperTextItem helperTextItem(HTMLContaine // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "hti"; + public static final String SUB_COMPONENT_ID = "hti"; + public static final String SUB_COMPONENT_NAME = "HelperTextItem"; private final HTMLElement textElement; private boolean customScreenReaderText; @@ -88,7 +89,7 @@ public static HelperTextItem helperTextItem(HTMLContaine private HTMLElement iconContainer; HelperTextItem(HTMLContainerBuilder builder) { - super(SUB_COMPONENT_NAME, builder.css(component(helperText, item)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, builder.css(component(helperText, item)).element()); this.customScreenReaderText = false; element().appendChild(textElement = span().css(component(helperText, item, Classes.text)).element()); } diff --git a/components/src/main/java/org/patternfly/component/help/HelperTextSubComponent.java b/components/src/main/java/org/patternfly/component/help/HelperTextSubComponent.java index a3679aaf3..b1d09bb3e 100644 --- a/components/src/main/java/org/patternfly/component/help/HelperTextSubComponent.java +++ b/components/src/main/java/org/patternfly/component/help/HelperTextSubComponent.java @@ -23,7 +23,7 @@ abstract class HelperTextSubComponent> extends SubComponent { - HelperTextSubComponent(String name, E element) { - super(ComponentType.HelperText, name, element); + HelperTextSubComponent(String subComponentId, String subComponentName, E element) { + super(ComponentType.HelperText, subComponentId, subComponentName, element); } } diff --git a/components/src/main/java/org/patternfly/component/hint/HintActions.java b/components/src/main/java/org/patternfly/component/hint/HintActions.java index b70ee33e5..92f7b0733 100644 --- a/components/src/main/java/org/patternfly/component/hint/HintActions.java +++ b/components/src/main/java/org/patternfly/component/hint/HintActions.java @@ -35,10 +35,11 @@ public static HintActions hintActions() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "ha"; + public static final String SUB_COMPONENT_ID = "ha"; + public static final String SUB_COMPONENT_NAME = "HintActions"; HintActions() { - super(SUB_COMPONENT_NAME, div().css(component(hint, actions)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(hint, actions)).element()); } // ------------------------------------------------------ builder diff --git a/components/src/main/java/org/patternfly/component/hint/HintBody.java b/components/src/main/java/org/patternfly/component/hint/HintBody.java index 74499920d..d59d5e841 100644 --- a/components/src/main/java/org/patternfly/component/hint/HintBody.java +++ b/components/src/main/java/org/patternfly/component/hint/HintBody.java @@ -35,10 +35,11 @@ public static HintBody hintBody() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "hb"; + public static final String SUB_COMPONENT_ID = "hb"; + public static final String SUB_COMPONENT_NAME = "HintBody"; HintBody() { - super(SUB_COMPONENT_NAME, div().css(component(hint, body)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(hint, body)).element()); } // ------------------------------------------------------ builder diff --git a/components/src/main/java/org/patternfly/component/hint/HintFooter.java b/components/src/main/java/org/patternfly/component/hint/HintFooter.java index ad258dc7b..3d59e2678 100644 --- a/components/src/main/java/org/patternfly/component/hint/HintFooter.java +++ b/components/src/main/java/org/patternfly/component/hint/HintFooter.java @@ -32,10 +32,11 @@ public static HintFooter hintFooter() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "hf"; + public static final String SUB_COMPONENT_ID = "hf"; + public static final String SUB_COMPONENT_NAME = "HintFooter"; HintFooter() { - super(SUB_COMPONENT_NAME, div().css(component(hint, footer)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(hint, footer)).element()); } // ------------------------------------------------------ builder diff --git a/components/src/main/java/org/patternfly/component/hint/HintSubComponent.java b/components/src/main/java/org/patternfly/component/hint/HintSubComponent.java index e4d75f59b..3792b4a7c 100644 --- a/components/src/main/java/org/patternfly/component/hint/HintSubComponent.java +++ b/components/src/main/java/org/patternfly/component/hint/HintSubComponent.java @@ -23,7 +23,7 @@ abstract class HintSubComponent> extends SubComponent { - HintSubComponent(String name, E element) { - super(ComponentType.Hint, name, element); + HintSubComponent(String subComponentId, String subComponentName, E element) { + super(ComponentType.Hint, subComponentId, subComponentName, element); } } diff --git a/components/src/main/java/org/patternfly/component/hint/HintTitle.java b/components/src/main/java/org/patternfly/component/hint/HintTitle.java index 36cb4c9fc..ff5f81354 100644 --- a/components/src/main/java/org/patternfly/component/hint/HintTitle.java +++ b/components/src/main/java/org/patternfly/component/hint/HintTitle.java @@ -35,10 +35,11 @@ public static HintTitle hintTitle() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "ht"; + public static final String SUB_COMPONENT_ID = "ht"; + public static final String SUB_COMPONENT_NAME = "HintTitle"; HintTitle() { - super(SUB_COMPONENT_NAME, div().css(component(hint, title)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(hint, title)).element()); } // ------------------------------------------------------ builder diff --git a/components/src/main/java/org/patternfly/component/inputgroup/InputGroupItem.java b/components/src/main/java/org/patternfly/component/inputgroup/InputGroupItem.java index f72418811..a48edbedf 100644 --- a/components/src/main/java/org/patternfly/component/inputgroup/InputGroupItem.java +++ b/components/src/main/java/org/patternfly/component/inputgroup/InputGroupItem.java @@ -40,14 +40,15 @@ public static InputGroupItem inputGroupItem() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "igi"; + public static final String SUB_COMPONENT_ID = "igi"; + public static final String SUB_COMPONENT_NAME = "InputGroupItem"; private Disabled componentImplementingDisabled; private FormControl formControl; private Dropdown dropdown; private Button button; InputGroupItem() { - super(SUB_COMPONENT_NAME, div().css(component(inputGroup, item)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(inputGroup, item)).element()); } // ------------------------------------------------------ add diff --git a/components/src/main/java/org/patternfly/component/inputgroup/InputGroupSubComponent.java b/components/src/main/java/org/patternfly/component/inputgroup/InputGroupSubComponent.java index d29d0cd16..f65eb1a70 100644 --- a/components/src/main/java/org/patternfly/component/inputgroup/InputGroupSubComponent.java +++ b/components/src/main/java/org/patternfly/component/inputgroup/InputGroupSubComponent.java @@ -23,7 +23,7 @@ abstract class InputGroupSubComponent> extends SubComponent { - InputGroupSubComponent(String name, E element) { - super(ComponentType.InputGroup, name, element); + InputGroupSubComponent(String subComponentId, String subComponentName, E element) { + super(ComponentType.InputGroup, subComponentId, subComponentName, element); } } diff --git a/components/src/main/java/org/patternfly/component/inputgroup/InputGroupText.java b/components/src/main/java/org/patternfly/component/inputgroup/InputGroupText.java index f576b63a8..4fa8bcb8c 100644 --- a/components/src/main/java/org/patternfly/component/inputgroup/InputGroupText.java +++ b/components/src/main/java/org/patternfly/component/inputgroup/InputGroupText.java @@ -51,11 +51,12 @@ public static InputGroupText inputGroupText(String text) { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "igt"; + public static final String SUB_COMPONENT_ID = "igt"; + public static final String SUB_COMPONENT_NAME = "InputGroupText"; private final HTMLElement textElement; InputGroupText(String text) { - super(SUB_COMPONENT_NAME, div().css(component(inputGroup, item), modifier(box)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(inputGroup, item), modifier(box)).element()); element().appendChild(this.textElement = span().css(component(inputGroup, Classes.text)).element()); if (text != null) { text(text); diff --git a/components/src/main/java/org/patternfly/component/jumplinks/JumpLinksItem.java b/components/src/main/java/org/patternfly/component/jumplinks/JumpLinksItem.java index 3770d8e24..2ff776cb2 100644 --- a/components/src/main/java/org/patternfly/component/jumplinks/JumpLinksItem.java +++ b/components/src/main/java/org/patternfly/component/jumplinks/JumpLinksItem.java @@ -65,7 +65,8 @@ public static JumpLinksItem jumpLinksItem(String identifier, String text, String // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "jli"; + public static final String SUB_COMPONENT_ID = "jli"; + public static final String SUB_COMPONENT_NAME = "JumpLinksItem"; private final String identifier; private final Map data; private final Button button; @@ -73,7 +74,7 @@ public static JumpLinksItem jumpLinksItem(String identifier, String text, String JumpLinksList list; JumpLinksItem(String identifier) { - super(SUB_COMPONENT_NAME, li().css(component(jumpLinks, item)) + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, li().css(component(jumpLinks, item)) .data(Dataset.identifier, identifier) .element()); this.identifier = identifier; diff --git a/components/src/main/java/org/patternfly/component/jumplinks/JumpLinksList.java b/components/src/main/java/org/patternfly/component/jumplinks/JumpLinksList.java index 056fd4e68..ce99c8794 100644 --- a/components/src/main/java/org/patternfly/component/jumplinks/JumpLinksList.java +++ b/components/src/main/java/org/patternfly/component/jumplinks/JumpLinksList.java @@ -47,12 +47,13 @@ public static JumpLinksList jumpLinksList() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "jll"; + public static final String SUB_COMPONENT_ID = "jll"; + public static final String SUB_COMPONENT_NAME = "JumpLinksList"; final Map items; private final AurHandler aur; JumpLinksList() { - super(SUB_COMPONENT_NAME, ul().css(component(jumpLinks, Classes.list)) + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, ul().css(component(jumpLinks, Classes.list)) .attr(role, Roles.list) .element()); this.items = new HashMap<>(); diff --git a/components/src/main/java/org/patternfly/component/jumplinks/JumpLinksSubComponent.java b/components/src/main/java/org/patternfly/component/jumplinks/JumpLinksSubComponent.java index 8aababc50..604d5b435 100644 --- a/components/src/main/java/org/patternfly/component/jumplinks/JumpLinksSubComponent.java +++ b/components/src/main/java/org/patternfly/component/jumplinks/JumpLinksSubComponent.java @@ -23,7 +23,7 @@ abstract class JumpLinksSubComponent> extends SubComponent { - JumpLinksSubComponent(String name, E element) { - super(ComponentType.JumpLinks, name, element); + JumpLinksSubComponent(String subComponentId, String subComponentName, E element) { + super(ComponentType.JumpLinks, subComponentId, subComponentName, element); } } diff --git a/components/src/main/java/org/patternfly/component/list/ActionListGroup.java b/components/src/main/java/org/patternfly/component/list/ActionListGroup.java index 2fc7767f6..7f89cd2cb 100644 --- a/components/src/main/java/org/patternfly/component/list/ActionListGroup.java +++ b/components/src/main/java/org/patternfly/component/list/ActionListGroup.java @@ -49,7 +49,7 @@ public class ActionListGroup extends ActionListSubComponent data; private final Map items; private final AurHandler aur; ActionListGroup(String identifier) { - super(SUB_COMPONENT_NAME, div().css(component(actionList, group)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(actionList, group)).element()); this.identifier = identifier; this.data = new HashMap<>(); this.items = new LinkedHashMap<>(); diff --git a/components/src/main/java/org/patternfly/component/list/ActionListItem.java b/components/src/main/java/org/patternfly/component/list/ActionListItem.java index 7416af7d5..a1ea2424d 100644 --- a/components/src/main/java/org/patternfly/component/list/ActionListItem.java +++ b/components/src/main/java/org/patternfly/component/list/ActionListItem.java @@ -38,7 +38,7 @@ public class ActionListItem extends ActionListSubComponent data; ActionListItem(String identifier) { - super(SUB_COMPONENT_NAME, div().css(component(actionList, item)) + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(actionList, item)) .data(Dataset.identifier, identifier) .element()); this.identifier = identifier; diff --git a/components/src/main/java/org/patternfly/component/list/ActionListSubComponent.java b/components/src/main/java/org/patternfly/component/list/ActionListSubComponent.java index 87d171e49..74f6dd1bb 100644 --- a/components/src/main/java/org/patternfly/component/list/ActionListSubComponent.java +++ b/components/src/main/java/org/patternfly/component/list/ActionListSubComponent.java @@ -23,7 +23,7 @@ abstract class ActionListSubComponent> extends SubComponent { - ActionListSubComponent(String name, E element) { - super(ComponentType.ActionList, name, element); + ActionListSubComponent(String subComponentId, String subComponentName, E element) { + super(ComponentType.ActionList, subComponentId, subComponentName, element); } } diff --git a/components/src/main/java/org/patternfly/component/list/DataListAction.java b/components/src/main/java/org/patternfly/component/list/DataListAction.java index b26673a06..3a7a1942d 100644 --- a/components/src/main/java/org/patternfly/component/list/DataListAction.java +++ b/components/src/main/java/org/patternfly/component/list/DataListAction.java @@ -47,12 +47,13 @@ public static DataListAction dataListAction(boolean plainButtonAction) { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "dla"; + public static final String SUB_COMPONENT_ID = "dla"; + public static final String SUB_COMPONENT_NAME = "DataListAction"; private final boolean plainButtonAction; private final HTMLElement delegate; DataListAction(boolean plainButtonAction) { - super(SUB_COMPONENT_NAME, div().css(component(dataList, item, action)) + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(dataList, item, action)) .element()); this.plainButtonAction = plainButtonAction; if (plainButtonAction) { diff --git a/components/src/main/java/org/patternfly/component/list/DataListCell.java b/components/src/main/java/org/patternfly/component/list/DataListCell.java index 16ae19f5b..3f0f9d2f1 100644 --- a/components/src/main/java/org/patternfly/component/list/DataListCell.java +++ b/components/src/main/java/org/patternfly/component/list/DataListCell.java @@ -52,11 +52,12 @@ public static DataListCell dataListCell() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "dlc"; + public static final String SUB_COMPONENT_ID = "dlc"; + public static final String SUB_COMPONENT_NAME = "DataListCell"; private Element icon; DataListCell() { - super(SUB_COMPONENT_NAME, div().css(component(dataList, cell)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(dataList, cell)).element()); } // ------------------------------------------------------ builder diff --git a/components/src/main/java/org/patternfly/component/list/DataListExpandableContent.java b/components/src/main/java/org/patternfly/component/list/DataListExpandableContent.java index 9028d5081..e2a3c29b2 100644 --- a/components/src/main/java/org/patternfly/component/list/DataListExpandableContent.java +++ b/components/src/main/java/org/patternfly/component/list/DataListExpandableContent.java @@ -44,11 +44,12 @@ public static DataListExpandableContent dataListExpandableContent() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "dlc"; + public static final String SUB_COMPONENT_ID = "dlc"; + public static final String SUB_COMPONENT_NAME = "DataListExpandableContent"; private final HTMLElement body; DataListExpandableContent() { - super(SUB_COMPONENT_NAME, section().css(component(dataList, expandable, content)) + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, section().css(component(dataList, expandable, content)) .element()); element().appendChild(body = div().css(component(dataList, expandable, content, Classes.body)).element()); } diff --git a/components/src/main/java/org/patternfly/component/list/DataListItem.java b/components/src/main/java/org/patternfly/component/list/DataListItem.java index 1e29ed36f..009ea4859 100644 --- a/components/src/main/java/org/patternfly/component/list/DataListItem.java +++ b/components/src/main/java/org/patternfly/component/list/DataListItem.java @@ -67,7 +67,8 @@ public static DataListItem dataListItem(String identifier) { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "dli"; + public static final String SUB_COMPONENT_ID = "dli"; + public static final String SUB_COMPONENT_NAME = "DataListItem"; private final String identifier; private final Map data; private final HTMLElement rowElement; @@ -79,7 +80,7 @@ public static DataListItem dataListItem(String identifier) { private ToggleHandler toggleHandler; DataListItem(String identifier) { - super(SUB_COMPONENT_NAME, li().css(component(dataList, item)) + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, li().css(component(dataList, item)) .aria(labelledBy, identifier) .data(Dataset.identifier, identifier) .element()); diff --git a/components/src/main/java/org/patternfly/component/list/DataListSubComponent.java b/components/src/main/java/org/patternfly/component/list/DataListSubComponent.java index 3acf1d95d..b00018ab4 100644 --- a/components/src/main/java/org/patternfly/component/list/DataListSubComponent.java +++ b/components/src/main/java/org/patternfly/component/list/DataListSubComponent.java @@ -23,7 +23,7 @@ abstract class DataListSubComponent> extends SubComponent { - DataListSubComponent(String name, E element) { - super(ComponentType.DataList, name, element); + DataListSubComponent(String subComponentId, String subComponentName, E element) { + super(ComponentType.DataList, subComponentId, subComponentName, element); } } diff --git a/components/src/main/java/org/patternfly/component/list/DescriptionListDescription.java b/components/src/main/java/org/patternfly/component/list/DescriptionListDescription.java index 47d122b8d..fa109fdef 100644 --- a/components/src/main/java/org/patternfly/component/list/DescriptionListDescription.java +++ b/components/src/main/java/org/patternfly/component/list/DescriptionListDescription.java @@ -44,12 +44,13 @@ public static DescriptionListDescription descriptionListDescription(String text) // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "dlg"; + public static final String SUB_COMPONENT_ID = "dlg"; + public static final String SUB_COMPONENT_NAME = "DescriptionListDescription"; private final HTMLElement textElement; DescriptionListDescription(String text) { - super(SUB_COMPONENT_NAME, dd().css(component(descriptionList, description)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, dd().css(component(descriptionList, description)).element()); element().appendChild(textElement = div().css(component(descriptionList, Classes.text)).element()); if (text != null) { text(text); diff --git a/components/src/main/java/org/patternfly/component/list/DescriptionListGroup.java b/components/src/main/java/org/patternfly/component/list/DescriptionListGroup.java index 81893f6ab..481eb3eef 100644 --- a/components/src/main/java/org/patternfly/component/list/DescriptionListGroup.java +++ b/components/src/main/java/org/patternfly/component/list/DescriptionListGroup.java @@ -38,7 +38,7 @@ public class DescriptionListGroup extends DescriptionListSubComponent data; DescriptionListGroup(String identifier) { - super(SUB_COMPONENT_NAME, div().css(component(descriptionList, group)) + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(descriptionList, group)) .data(Dataset.identifier, identifier) .element()); this.identifier = identifier; diff --git a/components/src/main/java/org/patternfly/component/list/DescriptionListSubComponent.java b/components/src/main/java/org/patternfly/component/list/DescriptionListSubComponent.java index ec70b6432..aab0c1cb1 100644 --- a/components/src/main/java/org/patternfly/component/list/DescriptionListSubComponent.java +++ b/components/src/main/java/org/patternfly/component/list/DescriptionListSubComponent.java @@ -23,7 +23,7 @@ abstract class DescriptionListSubComponent> extends SubComponent { - DescriptionListSubComponent(String name, E element) { - super(ComponentType.DescriptionList, name, element); + DescriptionListSubComponent(String subComponentId, String subComponentName, E element) { + super(ComponentType.DescriptionList, subComponentId, subComponentName, element); } } diff --git a/components/src/main/java/org/patternfly/component/list/DescriptionListTerm.java b/components/src/main/java/org/patternfly/component/list/DescriptionListTerm.java index 1caac23a8..84bca329d 100644 --- a/components/src/main/java/org/patternfly/component/list/DescriptionListTerm.java +++ b/components/src/main/java/org/patternfly/component/list/DescriptionListTerm.java @@ -55,12 +55,13 @@ public static DescriptionListTerm descriptionListTerm(String text) { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "dlg"; + public static final String SUB_COMPONENT_ID = "dlg"; + public static final String SUB_COMPONENT_NAME = "DescriptionListTerm"; private final HTMLElement textElement; private HTMLElement iconContainer; DescriptionListTerm(String text) { - super(SUB_COMPONENT_NAME, dt().css(component(descriptionList, term)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, dt().css(component(descriptionList, term)).element()); element().appendChild(textElement = span().css(component(descriptionList, Classes.text)).element()); if (text != null) { text(text); diff --git a/components/src/main/java/org/patternfly/component/list/ListItem.java b/components/src/main/java/org/patternfly/component/list/ListItem.java index fc8b8ba5f..ecfdfbf51 100644 --- a/components/src/main/java/org/patternfly/component/list/ListItem.java +++ b/components/src/main/java/org/patternfly/component/list/ListItem.java @@ -48,7 +48,7 @@ public class ListItem extends ListSubComponent implemen // ------------------------------------------------------ factory public static ListItem listItem() { - return new ListItem(Id.unique(ComponentType.List.id, SUB_COMPONENT_NAME)); + return new ListItem(Id.unique(ComponentType.List.id, SUB_COMPONENT_ID)); } public static ListItem listItem(String identifier) { @@ -57,13 +57,14 @@ public static ListItem listItem(String identifier) { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "li"; + public static final String SUB_COMPONENT_ID = "li"; + public static final String SUB_COMPONENT_NAME = "ListItem"; private final String identifier; private final Map data; private HTMLElement iconContainer; ListItem(String identifier) { - super(SUB_COMPONENT_NAME, li().data(Dataset.identifier, identifier).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, li().data(Dataset.identifier, identifier).element()); this.identifier = identifier; this.data = new HashMap<>(); } diff --git a/components/src/main/java/org/patternfly/component/list/ListSubComponent.java b/components/src/main/java/org/patternfly/component/list/ListSubComponent.java index 61bc02f5c..972e8a40f 100644 --- a/components/src/main/java/org/patternfly/component/list/ListSubComponent.java +++ b/components/src/main/java/org/patternfly/component/list/ListSubComponent.java @@ -23,7 +23,7 @@ abstract class ListSubComponent> extends SubComponent { - ListSubComponent(String name, E element) { - super(ComponentType.List, name, element); + ListSubComponent(String subComponentId, String subComponentName, E element) { + super(ComponentType.List, subComponentId, subComponentName, element); } } diff --git a/components/src/main/java/org/patternfly/component/list/SimpleListGroup.java b/components/src/main/java/org/patternfly/component/list/SimpleListGroup.java index 648b274fb..df4576a45 100644 --- a/components/src/main/java/org/patternfly/component/list/SimpleListGroup.java +++ b/components/src/main/java/org/patternfly/component/list/SimpleListGroup.java @@ -62,7 +62,8 @@ public static SimpleListGroup simpleListGroup(String text) { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "slg"; + public static final String SUB_COMPONENT_ID = "slg"; + public static final String SUB_COMPONENT_NAME = "SimpleListGroup"; final Map items; private final HTMLElement headerElement; private final HTMLContainerBuilder ul; @@ -70,10 +71,10 @@ public static SimpleListGroup simpleListGroup(String text) { private Comparator comparator; SimpleListGroup() { - super(SUB_COMPONENT_NAME, section().css(component(simpleList, Classes.section)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, section().css(component(simpleList, Classes.section)).element()); this.items = new LinkedHashMap<>(); this.aur = new AurHandler<>(this); - String headerId = Id.unique(SUB_COMPONENT_NAME); + String headerId = Id.unique(SUB_COMPONENT_ID); element().appendChild(headerElement = h(2).css(component(simpleList, title)) .id(headerId) .aria(Aria.hidden, true) diff --git a/components/src/main/java/org/patternfly/component/list/SimpleListItem.java b/components/src/main/java/org/patternfly/component/list/SimpleListItem.java index 5c365a71a..c4bf496ab 100644 --- a/components/src/main/java/org/patternfly/component/list/SimpleListItem.java +++ b/components/src/main/java/org/patternfly/component/list/SimpleListItem.java @@ -74,7 +74,8 @@ public static SimpleListItem simpleListItem(String ident // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "sli"; + public static final String SUB_COMPONENT_ID = "sli"; + public static final String SUB_COMPONENT_NAME = "SimpleListItem"; private static final Logger logger = Logger.getLogger(SimpleListItem.class.getName()); private final String identifier; @@ -83,7 +84,7 @@ public static SimpleListItem simpleListItem(String ident private final HTMLAnchorElement anchorElement; SimpleListItem(String identifier, HTMLContainerBuilder builder) { - super(SUB_COMPONENT_NAME, li().css(component(simpleList, item)) + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, li().css(component(simpleList, item)) .data(Dataset.identifier, identifier) .element()); this.identifier = identifier; diff --git a/components/src/main/java/org/patternfly/component/list/SimpleListSubComponent.java b/components/src/main/java/org/patternfly/component/list/SimpleListSubComponent.java index dd4e30823..0e218a63c 100644 --- a/components/src/main/java/org/patternfly/component/list/SimpleListSubComponent.java +++ b/components/src/main/java/org/patternfly/component/list/SimpleListSubComponent.java @@ -23,7 +23,7 @@ abstract class SimpleListSubComponent> extends SubComponent { - SimpleListSubComponent(String name, E element) { - super(ComponentType.SimpleList, name, element); + SimpleListSubComponent(String subComponentId, String subComponentName, E element) { + super(ComponentType.SimpleList, subComponentId, subComponentName, element); } } diff --git a/components/src/main/java/org/patternfly/component/menu/MenuContent.java b/components/src/main/java/org/patternfly/component/menu/MenuContent.java index 4dc633863..d8561e9c8 100644 --- a/components/src/main/java/org/patternfly/component/menu/MenuContent.java +++ b/components/src/main/java/org/patternfly/component/menu/MenuContent.java @@ -55,7 +55,8 @@ public static MenuContent menuContent() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "mc"; + public static final String SUB_COMPONENT_ID = "mc"; + public static final String SUB_COMPONENT_NAME = "MenuContent"; MenuList list; final List groups; @@ -64,7 +65,7 @@ public static MenuContent menuContent() { private Divider favoritesDivider; MenuContent() { - super(SUB_COMPONENT_NAME, div().css(component(Classes.menu, content)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(Classes.menu, content)).element()); this.groups = new ArrayList<>(); Attachable.register(this, this); } diff --git a/components/src/main/java/org/patternfly/component/menu/MenuFooter.java b/components/src/main/java/org/patternfly/component/menu/MenuFooter.java index 2e23fb0f1..0fb962f9d 100644 --- a/components/src/main/java/org/patternfly/component/menu/MenuFooter.java +++ b/components/src/main/java/org/patternfly/component/menu/MenuFooter.java @@ -41,10 +41,11 @@ public static MenuFooter menuFooter(String text) { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "mf"; + public static final String SUB_COMPONENT_ID = "mf"; + public static final String SUB_COMPONENT_NAME = "MenuFooter"; MenuFooter() { - super(ComponentType.Menu, SUB_COMPONENT_NAME, div().css(component(menu, footer)).element()); + super(ComponentType.Menu, SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(menu, footer)).element()); } // ------------------------------------------------------ builder diff --git a/components/src/main/java/org/patternfly/component/menu/MenuGroup.java b/components/src/main/java/org/patternfly/component/menu/MenuGroup.java index e17371567..7ea405737 100644 --- a/components/src/main/java/org/patternfly/component/menu/MenuGroup.java +++ b/components/src/main/java/org/patternfly/component/menu/MenuGroup.java @@ -43,13 +43,14 @@ public static MenuGroup menuGroup(String text) { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "mg"; + public static final String SUB_COMPONENT_ID = "mg"; + public static final String SUB_COMPONENT_NAME = "MenuGroup"; MenuList list; private final HTMLElement textElement; MenuGroup() { - super(SUB_COMPONENT_NAME, section().css(component(Classes.menu, group)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, section().css(component(Classes.menu, group)).element()); this.textElement = h(3).css(component(Classes.menu, group, title)).element(); } diff --git a/components/src/main/java/org/patternfly/component/menu/MenuHeader.java b/components/src/main/java/org/patternfly/component/menu/MenuHeader.java index 1586a339c..89d20d2cd 100644 --- a/components/src/main/java/org/patternfly/component/menu/MenuHeader.java +++ b/components/src/main/java/org/patternfly/component/menu/MenuHeader.java @@ -39,10 +39,11 @@ public static MenuHeader menuHeader(String text) { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "mh"; + public static final String SUB_COMPONENT_ID = "mh"; + public static final String SUB_COMPONENT_NAME = "MenuHeader"; MenuHeader() { - super(SUB_COMPONENT_NAME, div().css(component(menu, header)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(menu, header)).element()); } // ------------------------------------------------------ builder diff --git a/components/src/main/java/org/patternfly/component/menu/MenuItem.java b/components/src/main/java/org/patternfly/component/menu/MenuItem.java index 5d1c895cb..661dcce8b 100644 --- a/components/src/main/java/org/patternfly/component/menu/MenuItem.java +++ b/components/src/main/java/org/patternfly/component/menu/MenuItem.java @@ -152,7 +152,8 @@ static MenuItem createNewMenuItem(String text) { private static final Logger logger = Logger.getLogger(MenuItem.class.getName()); private static final String CREATE_NEW_MARKER = "createNew"; - public static final String SUB_COMPONENT_NAME = "mi"; + public static final String SUB_COMPONENT_ID = "mi"; + public static final String SUB_COMPONENT_NAME = "MenuItem"; final MenuItemType itemType; private final String identifier; @@ -175,7 +176,7 @@ static MenuItem createNewMenuItem(String text) { private HTMLElement selectIcon; MenuItem(String identifier, String text, MenuItemType itemType, AsyncItems loadItems) { - super(SUB_COMPONENT_NAME, li().css(component(Classes.menu, list, item)) + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, li().css(component(Classes.menu, list, item)) .attr(role, none) .data(Dataset.identifier, identifier) .element()); @@ -242,7 +243,7 @@ static MenuItem createNewMenuItem(String text) { // constructor must only be used to clone an item as a favorite item! MenuItem(Menu menu, MenuItem sourceItem) { - super(SUB_COMPONENT_NAME, ((HTMLElement) sourceItem.element().cloneNode(true))); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, ((HTMLElement) sourceItem.element().cloneNode(true))); this.identifier = Id.build(sourceItem.identifier, "favorite"); this.itemType = sourceItem.itemType; this.data = new HashMap<>(); @@ -567,7 +568,7 @@ private boolean isAriaDisabled(HTMLElement element) { private void loadItems(AsyncItems loadItems) { itemElement.addEventListener(click.name, e -> { clearTimeout(loadingTimeout); - MenuList menuList = lookupSubComponent(MenuList.SUB_COMPONENT_NAME); + MenuList menuList = lookupSubComponent(MenuList.SUB_COMPONENT_ID); loadingTimeout = setTimeout(__ -> startLoading(), LOADING_TIMEOUT); loadItems.apply(menuList).then(loadedItems -> { stopLoading(); diff --git a/components/src/main/java/org/patternfly/component/menu/MenuItemAction.java b/components/src/main/java/org/patternfly/component/menu/MenuItemAction.java index cb558aa04..2cceab159 100644 --- a/components/src/main/java/org/patternfly/component/menu/MenuItemAction.java +++ b/components/src/main/java/org/patternfly/component/menu/MenuItemAction.java @@ -61,7 +61,8 @@ public static MenuItemAction menuItemAction(String identifier, Element icon) { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "mia"; + public static final String SUB_COMPONENT_ID = "mia"; + public static final String SUB_COMPONENT_NAME = "MenuItemAction"; private final String identifier; private final List> handler; @@ -69,7 +70,7 @@ public static MenuItemAction menuItemAction(String identifier, Element icon) { public MenuItem menuItem; MenuItemAction(String identifier, Element icon, boolean favorite) { - super(SUB_COMPONENT_NAME, div().css(component(menu, item, Classes.action)) + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(menu, item, Classes.action)) .data(Dataset.identifier, identifier) .element()); this.identifier = identifier; @@ -87,7 +88,7 @@ public static MenuItemAction menuItemAction(String identifier, Element icon) { // constructor must only be used to clone an item action of a favorite item! MenuItemAction(MenuItem sourceItem, MenuItemAction sourceItemAction, HTMLElement rootElement) { - super(SUB_COMPONENT_NAME, rootElement); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, rootElement); this.identifier = Id.build(sourceItemAction.identifier, "favorite"); this.handler = new ArrayList<>(); this.handler.addAll(sourceItemAction.handler); diff --git a/components/src/main/java/org/patternfly/component/menu/MenuList.java b/components/src/main/java/org/patternfly/component/menu/MenuList.java index cd841af8f..3a7c889ef 100644 --- a/components/src/main/java/org/patternfly/component/menu/MenuList.java +++ b/components/src/main/java/org/patternfly/component/menu/MenuList.java @@ -77,16 +77,17 @@ public static MenuList menuList() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "ml"; + public static final String SUB_COMPONENT_ID = "ml"; + public static final String SUB_COMPONENT_NAME = "MenuList"; private static final Logger logger = Logger.getLogger(MenuList.class.getName()); // TODO Customize loading, no items and error handling private static final Supplier loading = () -> skeletonMenuItem( - Id.unique(ComponentType.Menu.id, SUB_COMPONENT_NAME, "loading"), "Loading items..."); + Id.unique(ComponentType.Menu.id, SUB_COMPONENT_ID, "loading"), "Loading items..."); private static final Supplier noItems = () -> menuItem( - Id.unique(ComponentType.Menu.id, SUB_COMPONENT_NAME, "no-items"), "No items found") + Id.unique(ComponentType.Menu.id, SUB_COMPONENT_ID, "no-items"), "No items found") .disabled(); private static final Supplier error = () -> menuItem( - Id.unique(ComponentType.Menu.id, SUB_COMPONENT_NAME, "error"), "Error") + Id.unique(ComponentType.Menu.id, SUB_COMPONENT_ID, "error"), "Error") .icon(exclamationCircle()); final Map items; @@ -99,7 +100,7 @@ public static MenuList menuList() { private Comparator comparator; MenuList() { - super(SUB_COMPONENT_NAME, ul().css(component(menu, list)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, ul().css(component(menu, list)).element()); this.items = new LinkedHashMap<>(); this.aur = new AurHandler<>(this); this.status = static_; diff --git a/components/src/main/java/org/patternfly/component/menu/MenuSearch.java b/components/src/main/java/org/patternfly/component/menu/MenuSearch.java index e1f71783a..0157376a7 100644 --- a/components/src/main/java/org/patternfly/component/menu/MenuSearch.java +++ b/components/src/main/java/org/patternfly/component/menu/MenuSearch.java @@ -43,7 +43,8 @@ public static MenuSearch menuSearch() { // ------------------------------------------------------ instance private static final Logger logger = Logger.getLogger(MenuSearch.class.getName()); - public static final String SUB_COMPONENT_NAME = "ms"; + public static final String SUB_COMPONENT_ID = "ms"; + public static final String SUB_COMPONENT_NAME = "MenuSearch"; private final HTMLElement inputContainer; private SearchInput searchInput; @@ -51,7 +52,7 @@ public static MenuSearch menuSearch() { private NoResults noResults; MenuSearch() { - super(SUB_COMPONENT_NAME, div().css(component(Classes.menu, search)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(Classes.menu, search)).element()); this.searchFilter = SearchFilter.contains(); this.noResults = NoResults.noResults(); element().appendChild(inputContainer = div().css(component(Classes.menu, search, input)).element()); diff --git a/components/src/main/java/org/patternfly/component/menu/MenuSubComponent.java b/components/src/main/java/org/patternfly/component/menu/MenuSubComponent.java index 6e06442d0..637a70cbb 100644 --- a/components/src/main/java/org/patternfly/component/menu/MenuSubComponent.java +++ b/components/src/main/java/org/patternfly/component/menu/MenuSubComponent.java @@ -23,7 +23,7 @@ abstract class MenuSubComponent> extends SubComponent { - MenuSubComponent(String name, E element) { - super(ComponentType.Menu, name, element); + MenuSubComponent(String subComponentId, String subComponentName, E element) { + super(ComponentType.Menu, subComponentId, subComponentName, element); } } diff --git a/components/src/main/java/org/patternfly/component/menu/MenuToggleAction.java b/components/src/main/java/org/patternfly/component/menu/MenuToggleAction.java index c03fa98f9..dc6c3f2bb 100644 --- a/components/src/main/java/org/patternfly/component/menu/MenuToggleAction.java +++ b/components/src/main/java/org/patternfly/component/menu/MenuToggleAction.java @@ -45,10 +45,11 @@ public static MenuToggleAction menuToggleAction(String text) { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "mta"; + public static final String SUB_COMPONENT_ID = "mta"; + public static final String SUB_COMPONENT_NAME = "MenuToggleAction"; MenuToggleAction() { - super(SUB_COMPONENT_NAME, button(ButtonType.button).css(component(menuToggle, button)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, button(ButtonType.button).css(component(menuToggle, button)).element()); } // ------------------------------------------------------ builder diff --git a/components/src/main/java/org/patternfly/component/menu/MenuToggleSubComponent.java b/components/src/main/java/org/patternfly/component/menu/MenuToggleSubComponent.java index 9f3e2ff44..9e858c3e6 100644 --- a/components/src/main/java/org/patternfly/component/menu/MenuToggleSubComponent.java +++ b/components/src/main/java/org/patternfly/component/menu/MenuToggleSubComponent.java @@ -23,7 +23,7 @@ abstract class MenuToggleSubComponent> extends SubComponent { - MenuToggleSubComponent(String name, E element) { - super(ComponentType.MenuToggle, name, element); + MenuToggleSubComponent(String subComponentId, String subComponentName, E element) { + super(ComponentType.MenuToggle, subComponentId, subComponentName, element); } } diff --git a/components/src/main/java/org/patternfly/component/modal/ModalBody.java b/components/src/main/java/org/patternfly/component/modal/ModalBody.java index a72c30754..df144652b 100644 --- a/components/src/main/java/org/patternfly/component/modal/ModalBody.java +++ b/components/src/main/java/org/patternfly/component/modal/ModalBody.java @@ -35,10 +35,11 @@ public static ModalBody modalBody() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "mb"; + public static final String SUB_COMPONENT_ID = "mb"; + public static final String SUB_COMPONENT_NAME = "ModalBody"; ModalBody() { - super(SUB_COMPONENT_NAME, div().css(component(modalBox, body)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(modalBox, body)).element()); } // ------------------------------------------------------ builder diff --git a/components/src/main/java/org/patternfly/component/modal/ModalFooter.java b/components/src/main/java/org/patternfly/component/modal/ModalFooter.java index 9d4f6d47a..330ebcfd1 100644 --- a/components/src/main/java/org/patternfly/component/modal/ModalFooter.java +++ b/components/src/main/java/org/patternfly/component/modal/ModalFooter.java @@ -40,11 +40,12 @@ public static ModalFooter modalFooter() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "mf"; + public static final String SUB_COMPONENT_ID = "mf"; + public static final String SUB_COMPONENT_NAME = "ModalFooter"; private final List buttons; ModalFooter() { - super(SUB_COMPONENT_NAME, footer().css(component(modalBox, footer)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, footer().css(component(modalBox, footer)).element()); this.buttons = new ArrayList<>(); Attachable.register(this, this); } diff --git a/components/src/main/java/org/patternfly/component/modal/ModalHeader.java b/components/src/main/java/org/patternfly/component/modal/ModalHeader.java index f0cb5258a..620ee1dcd 100644 --- a/components/src/main/java/org/patternfly/component/modal/ModalHeader.java +++ b/components/src/main/java/org/patternfly/component/modal/ModalHeader.java @@ -46,12 +46,13 @@ public static ModalHeader modalHeader() { // ------------------------------------------------------ instance private static final Logger logger = Logger.getLogger(ModalHeader.class.getName()); - public static final String SUB_COMPONENT_NAME = "mh"; + public static final String SUB_COMPONENT_ID = "mh"; + public static final String SUB_COMPONENT_NAME = "ModalHeader"; ModalHeaderTitle title; private HTMLElement mainContainer; ModalHeader() { - super(SUB_COMPONENT_NAME, header().css(component(modalBox, header)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, header().css(component(modalBox, header)).element()); } // ------------------------------------------------------ add diff --git a/components/src/main/java/org/patternfly/component/modal/ModalHeaderDescription.java b/components/src/main/java/org/patternfly/component/modal/ModalHeaderDescription.java index 6809b3b60..1a6b4aa25 100644 --- a/components/src/main/java/org/patternfly/component/modal/ModalHeaderDescription.java +++ b/components/src/main/java/org/patternfly/component/modal/ModalHeaderDescription.java @@ -35,10 +35,11 @@ public static ModalHeaderDescription modalHeaderDescription() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "mhd"; + public static final String SUB_COMPONENT_ID = "mhd"; + public static final String SUB_COMPONENT_NAME = "ModalHeaderDescription"; ModalHeaderDescription() { - super(SUB_COMPONENT_NAME, div().css(component(modalBox, description)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(modalBox, description)).element()); } // ------------------------------------------------------ builder diff --git a/components/src/main/java/org/patternfly/component/modal/ModalHeaderTitle.java b/components/src/main/java/org/patternfly/component/modal/ModalHeaderTitle.java index 3a4770e4e..f612857ab 100644 --- a/components/src/main/java/org/patternfly/component/modal/ModalHeaderTitle.java +++ b/components/src/main/java/org/patternfly/component/modal/ModalHeaderTitle.java @@ -47,13 +47,14 @@ public static ModalHeaderTitle modalHeaderTitle() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "mht"; + public static final String SUB_COMPONENT_ID = "mht"; + public static final String SUB_COMPONENT_NAME = "ModalHeaderTitle"; private final HTMLElement textElement; Severity severity; private HTMLElement failSafeIconElement; ModalHeaderTitle() { - super(SUB_COMPONENT_NAME, h(1).css(component(modalBox, title)) + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, h(1).css(component(modalBox, title)) .element()); add(textElement = span().css(component(modalBox, title, Classes.text)).element()); } diff --git a/components/src/main/java/org/patternfly/component/modal/ModalSubComponent.java b/components/src/main/java/org/patternfly/component/modal/ModalSubComponent.java index 1ed3e7858..7490aeb30 100644 --- a/components/src/main/java/org/patternfly/component/modal/ModalSubComponent.java +++ b/components/src/main/java/org/patternfly/component/modal/ModalSubComponent.java @@ -23,7 +23,7 @@ abstract class ModalSubComponent> extends SubComponent { - ModalSubComponent(String name, E element) { - super(ComponentType.Modal, name, element); + ModalSubComponent(String subComponentId, String subComponentName, E element) { + super(ComponentType.Modal, subComponentId, subComponentName, element); } } diff --git a/components/src/main/java/org/patternfly/component/navigation/ExpandableNavigationGroup.java b/components/src/main/java/org/patternfly/component/navigation/ExpandableNavigationGroup.java index ca4f206d1..db663d888 100644 --- a/components/src/main/java/org/patternfly/component/navigation/ExpandableNavigationGroup.java +++ b/components/src/main/java/org/patternfly/component/navigation/ExpandableNavigationGroup.java @@ -96,7 +96,8 @@ public static ExpandableNavigationGroup expandableNavigationGroup(String identif // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "eng"; + public static final String SUB_COMPONENT_ID = "eng"; + public static final String SUB_COMPONENT_NAME = "ExpandableNavigationGroup"; final List> toggleHandler; private final String identifier; @@ -108,7 +109,7 @@ public static ExpandableNavigationGroup expandableNavigationGroup(String identif private final AurHandler aur; ExpandableNavigationGroup(String identifier) { - super(SUB_COMPONENT_NAME, li().css(component(nav, item), modifier(expandable)) + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, li().css(component(nav, item), modifier(expandable)) .data(Dataset.identifier, identifier) .element()); this.identifier = identifier; diff --git a/components/src/main/java/org/patternfly/component/navigation/NavigationGroup.java b/components/src/main/java/org/patternfly/component/navigation/NavigationGroup.java index b53deb76d..9742d0dfa 100644 --- a/components/src/main/java/org/patternfly/component/navigation/NavigationGroup.java +++ b/components/src/main/java/org/patternfly/component/navigation/NavigationGroup.java @@ -73,7 +73,8 @@ public static NavigationGroup navigationGroup(String identifier, String text) { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "ng"; + public static final String SUB_COMPONENT_ID = "ng"; + public static final String SUB_COMPONENT_NAME = "NavigationGroup"; private final String identifier; private final Map items; @@ -82,7 +83,7 @@ public static NavigationGroup navigationGroup(String identifier, String text) { private final AurHandler aur; NavigationGroup(String identifier) { - super(SUB_COMPONENT_NAME, section().css(component(nav, section)) + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, section().css(component(nav, section)) .data(Dataset.identifier, identifier) .element()); this.identifier = identifier; diff --git a/components/src/main/java/org/patternfly/component/navigation/NavigationItem.java b/components/src/main/java/org/patternfly/component/navigation/NavigationItem.java index a3d010d0f..2ffdfd71b 100644 --- a/components/src/main/java/org/patternfly/component/navigation/NavigationItem.java +++ b/components/src/main/java/org/patternfly/component/navigation/NavigationItem.java @@ -71,7 +71,8 @@ public static NavigationItem navigationItem(String identifier, String text, Stri // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "ni"; + public static final String SUB_COMPONENT_ID = "ni"; + public static final String SUB_COMPONENT_NAME = "NavigationItem"; final HTMLAnchorElement anchorElement; private final String identifier; @@ -80,7 +81,7 @@ public static NavigationItem navigationItem(String identifier, String text, Stri private HTMLElement iconContainer; NavigationItem(String identifier) { - super(SUB_COMPONENT_NAME, li().css(component(nav, item)) + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, li().css(component(nav, item)) .data(Dataset.identifier, identifier) .element()); this.identifier = identifier; diff --git a/components/src/main/java/org/patternfly/component/navigation/NavigationLinkText.java b/components/src/main/java/org/patternfly/component/navigation/NavigationLinkText.java index a4ed12ba6..35bcb4ded 100644 --- a/components/src/main/java/org/patternfly/component/navigation/NavigationLinkText.java +++ b/components/src/main/java/org/patternfly/component/navigation/NavigationLinkText.java @@ -36,10 +36,11 @@ public static NavigationLinkText navigationLinkText() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "nlt"; + public static final String SUB_COMPONENT_ID = "nlt"; + public static final String SUB_COMPONENT_NAME = "NavigationLinkText"; NavigationLinkText() { - super(SUB_COMPONENT_NAME, span().css(component(nav, link, text)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, span().css(component(nav, link, text)).element()); } // ------------------------------------------------------ builder diff --git a/components/src/main/java/org/patternfly/component/navigation/NavigationSubComponent.java b/components/src/main/java/org/patternfly/component/navigation/NavigationSubComponent.java index 8a7fd4e91..a7ffe8c0a 100644 --- a/components/src/main/java/org/patternfly/component/navigation/NavigationSubComponent.java +++ b/components/src/main/java/org/patternfly/component/navigation/NavigationSubComponent.java @@ -23,7 +23,7 @@ abstract class NavigationSubComponent> extends SubComponent { - NavigationSubComponent(String name, E element) { - super(ComponentType.Navigation, name, element); + NavigationSubComponent(String subComponentId, String subComponentName, E element) { + super(ComponentType.Navigation, subComponentId, subComponentName, element); } } diff --git a/components/src/main/java/org/patternfly/component/notification/NotificationDrawerBody.java b/components/src/main/java/org/patternfly/component/notification/NotificationDrawerBody.java index 45ee93ccc..3d8611edf 100644 --- a/components/src/main/java/org/patternfly/component/notification/NotificationDrawerBody.java +++ b/components/src/main/java/org/patternfly/component/notification/NotificationDrawerBody.java @@ -35,12 +35,13 @@ public static NotificationDrawerBody notificationDrawerBody() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "ndb"; + public static final String SUB_COMPONENT_ID = "ndb"; + public static final String SUB_COMPONENT_NAME = "NotificationDrawerBody"; private NotificationDrawerList list; private EmptyState emptyState; NotificationDrawerBody() { - super(SUB_COMPONENT_NAME, div().css(component(notificationDrawer, body)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(notificationDrawer, body)).element()); } // ------------------------------------------------------ add diff --git a/components/src/main/java/org/patternfly/component/notification/NotificationDrawerHeader.java b/components/src/main/java/org/patternfly/component/notification/NotificationDrawerHeader.java index 46e26634e..4e28dd0f3 100644 --- a/components/src/main/java/org/patternfly/component/notification/NotificationDrawerHeader.java +++ b/components/src/main/java/org/patternfly/component/notification/NotificationDrawerHeader.java @@ -47,13 +47,14 @@ public static NotificationDrawerHeader notificationDrawerHeader() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "ndh"; + public static final String SUB_COMPONENT_ID = "ndh"; + public static final String SUB_COMPONENT_NAME = "NotificationDrawerHeader"; private final HTMLElement textElement; private final HTMLElement statusElement; private final HTMLElement closeElement; NotificationDrawerHeader() { - super(SUB_COMPONENT_NAME, div().css(component(notificationDrawer, header)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(notificationDrawer, header)).element()); add(textElement = h(1, "Notifications").css(component(notificationDrawer, header, title)).element()); add(statusElement = span().css(component(notificationDrawer, header, status)).element()); add(div().css(component(notificationDrawer, header, action)) diff --git a/components/src/main/java/org/patternfly/component/notification/NotificationDrawerItem.java b/components/src/main/java/org/patternfly/component/notification/NotificationDrawerItem.java index 40c8467b0..1b3282aa7 100644 --- a/components/src/main/java/org/patternfly/component/notification/NotificationDrawerItem.java +++ b/components/src/main/java/org/patternfly/component/notification/NotificationDrawerItem.java @@ -66,7 +66,8 @@ public static NotificationDrawerItem notificationDrawerItem(Severity type, Strin // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "ndi"; + public static final String SUB_COMPONENT_ID = "ndi"; + public static final String SUB_COMPONENT_NAME = "NotificationDrawerItem"; private final String identifier; private final Map data; private final HTMLElement screenReaderElement; @@ -76,7 +77,7 @@ public static NotificationDrawerItem notificationDrawerItem(Severity type, Strin private HTMLElement timestampElement; NotificationDrawerItem(Severity severity, String identifier, String title) { - super(SUB_COMPONENT_NAME, li().css(component(notificationDrawer, list, item), severity.status.modifier()) + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, li().css(component(notificationDrawer, list, item), severity.status.modifier()) .attr(tabindex, 0) .data(Dataset.identifier, identifier) .element()); diff --git a/components/src/main/java/org/patternfly/component/notification/NotificationDrawerItemBody.java b/components/src/main/java/org/patternfly/component/notification/NotificationDrawerItemBody.java index 25fcaf964..4bb991ce0 100644 --- a/components/src/main/java/org/patternfly/component/notification/NotificationDrawerItemBody.java +++ b/components/src/main/java/org/patternfly/component/notification/NotificationDrawerItemBody.java @@ -41,10 +41,11 @@ public static NotificationDrawerItemBody notificationDrawerItemBody(String text) // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "ndib"; + public static final String SUB_COMPONENT_ID = "ndib"; + public static final String SUB_COMPONENT_NAME = "NotificationDrawerItemBody"; NotificationDrawerItemBody() { - super(SUB_COMPONENT_NAME, div().css(component(notificationDrawer, list, item, description)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(notificationDrawer, list, item, description)).element()); } // ------------------------------------------------------ builder diff --git a/components/src/main/java/org/patternfly/component/notification/NotificationDrawerList.java b/components/src/main/java/org/patternfly/component/notification/NotificationDrawerList.java index 530c058a8..015fb1407 100644 --- a/components/src/main/java/org/patternfly/component/notification/NotificationDrawerList.java +++ b/components/src/main/java/org/patternfly/component/notification/NotificationDrawerList.java @@ -47,12 +47,13 @@ public static NotificationDrawerList notificationDrawerList() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "ndl"; + public static final String SUB_COMPONENT_ID = "ndl"; + public static final String SUB_COMPONENT_NAME = "NotificationDrawerList"; final Map items; private final AurHandler aur; NotificationDrawerList() { - super(SUB_COMPONENT_NAME, ul().css(component(notificationDrawer, Classes.list)) + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, ul().css(component(notificationDrawer, Classes.list)) .role(list) .element()); this.items = new LinkedHashMap<>(); diff --git a/components/src/main/java/org/patternfly/component/notification/NotificationDrawerSubComponent.java b/components/src/main/java/org/patternfly/component/notification/NotificationDrawerSubComponent.java index 732d1f27c..0b454a431 100644 --- a/components/src/main/java/org/patternfly/component/notification/NotificationDrawerSubComponent.java +++ b/components/src/main/java/org/patternfly/component/notification/NotificationDrawerSubComponent.java @@ -23,7 +23,7 @@ abstract class NotificationDrawerSubComponent> extends SubComponent { - NotificationDrawerSubComponent(String name, E element) { - super(ComponentType.NotificationDrawer, name, element); + NotificationDrawerSubComponent(String subComponentId, String subComponentName, E element) { + super(ComponentType.NotificationDrawer, subComponentId, subComponentName, element); } } diff --git a/components/src/main/java/org/patternfly/component/page/MastheadBrand.java b/components/src/main/java/org/patternfly/component/page/MastheadBrand.java index aebaddcd9..fb39e8a3c 100644 --- a/components/src/main/java/org/patternfly/component/page/MastheadBrand.java +++ b/components/src/main/java/org/patternfly/component/page/MastheadBrand.java @@ -38,10 +38,11 @@ public static MastheadBrand mastheadBrand() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "mhb"; + public static final String SUB_COMPONENT_ID = "mhb"; + public static final String SUB_COMPONENT_NAME = "MastheadBrand"; MastheadBrand() { - super(SUB_COMPONENT_NAME, div().css(component(masthead, brand)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(masthead, brand)).element()); } // ------------------------------------------------------ add diff --git a/components/src/main/java/org/patternfly/component/page/MastheadContent.java b/components/src/main/java/org/patternfly/component/page/MastheadContent.java index 81372fd72..20ec0e00b 100644 --- a/components/src/main/java/org/patternfly/component/page/MastheadContent.java +++ b/components/src/main/java/org/patternfly/component/page/MastheadContent.java @@ -44,10 +44,11 @@ public static MastheadContent mastheadContent() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "mhc"; + public static final String SUB_COMPONENT_ID = "mhc"; + public static final String SUB_COMPONENT_NAME = "MastheadContent"; MastheadContent() { - super(SUB_COMPONENT_NAME, div().css(component(masthead, content)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(masthead, content)).element()); } // ------------------------------------------------------ add diff --git a/components/src/main/java/org/patternfly/component/page/MastheadLogo.java b/components/src/main/java/org/patternfly/component/page/MastheadLogo.java index 9a011146e..22ae26e7a 100644 --- a/components/src/main/java/org/patternfly/component/page/MastheadLogo.java +++ b/components/src/main/java/org/patternfly/component/page/MastheadLogo.java @@ -38,10 +38,11 @@ public static MastheadLogo mastheadLogo(String href) { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "mhl"; + public static final String SUB_COMPONENT_ID = "mhl"; + public static final String SUB_COMPONENT_NAME = "MastheadLogo"; MastheadLogo(String href) { - super(SUB_COMPONENT_NAME, a(href).css(component(masthead, logo)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, a(href).css(component(masthead, logo)).element()); } // ------------------------------------------------------ builder diff --git a/components/src/main/java/org/patternfly/component/page/MastheadMain.java b/components/src/main/java/org/patternfly/component/page/MastheadMain.java index 22a41b5f0..f04432d40 100644 --- a/components/src/main/java/org/patternfly/component/page/MastheadMain.java +++ b/components/src/main/java/org/patternfly/component/page/MastheadMain.java @@ -41,10 +41,11 @@ public static MastheadMain mastheadMain() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "mhm"; + public static final String SUB_COMPONENT_ID = "mhm"; + public static final String SUB_COMPONENT_NAME = "MastheadMain"; MastheadMain() { - super(SUB_COMPONENT_NAME, div().css(component(masthead, main)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(masthead, main)).element()); } // ------------------------------------------------------ add diff --git a/components/src/main/java/org/patternfly/component/page/MastheadSubComponent.java b/components/src/main/java/org/patternfly/component/page/MastheadSubComponent.java index 94c5d90ad..18b283008 100644 --- a/components/src/main/java/org/patternfly/component/page/MastheadSubComponent.java +++ b/components/src/main/java/org/patternfly/component/page/MastheadSubComponent.java @@ -23,7 +23,7 @@ abstract class MastheadSubComponent> extends SubComponent { - MastheadSubComponent(String name, E element) { - super(ComponentType.Masthead, name, element); + MastheadSubComponent(String subComponentId, String subComponentName, E element) { + super(ComponentType.Masthead, subComponentId, subComponentName, element); } } diff --git a/components/src/main/java/org/patternfly/component/page/MastheadToggle.java b/components/src/main/java/org/patternfly/component/page/MastheadToggle.java index dad586946..2a55b994f 100644 --- a/components/src/main/java/org/patternfly/component/page/MastheadToggle.java +++ b/components/src/main/java/org/patternfly/component/page/MastheadToggle.java @@ -49,12 +49,13 @@ public static MastheadToggle mastheadToggle() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "mht"; + public static final String SUB_COMPONENT_ID = "mht"; + public static final String SUB_COMPONENT_NAME = "MastheadToggle"; private final Button toggleButton; MastheadToggle() { - super(SUB_COMPONENT_NAME, div().css(component(masthead, toggle)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(masthead, toggle)).element()); add(toggleButton = button() .plain() .icon(bars()) diff --git a/components/src/main/java/org/patternfly/component/page/PageBreadcrumb.java b/components/src/main/java/org/patternfly/component/page/PageBreadcrumb.java index 3f3496193..cdc17fc06 100644 --- a/components/src/main/java/org/patternfly/component/page/PageBreadcrumb.java +++ b/components/src/main/java/org/patternfly/component/page/PageBreadcrumb.java @@ -42,10 +42,11 @@ public static PageBreadcrumb pageBreadcrumb() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "pb"; + public static final String SUB_COMPONENT_ID = "pb"; + public static final String SUB_COMPONENT_NAME = "PageBreadcrumb"; PageBreadcrumb() { - super(SUB_COMPONENT_NAME, section().css(component(page, main, breadcrumb)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, section().css(component(page, main, breadcrumb)).element()); } // ------------------------------------------------------ add diff --git a/components/src/main/java/org/patternfly/component/page/PageGroup.java b/components/src/main/java/org/patternfly/component/page/PageGroup.java index bce82e9e1..48f8bdb74 100644 --- a/components/src/main/java/org/patternfly/component/page/PageGroup.java +++ b/components/src/main/java/org/patternfly/component/page/PageGroup.java @@ -54,10 +54,11 @@ public static PageGroup pageGroup() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "pg"; + public static final String SUB_COMPONENT_ID = "pg"; + public static final String SUB_COMPONENT_NAME = "PageGroup"; PageGroup() { - super(ComponentType.Page, SUB_COMPONENT_NAME, div().css(component(page, main, group)).element()); + super(ComponentType.Page, SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(page, main, group)).element()); } // ------------------------------------------------------ add diff --git a/components/src/main/java/org/patternfly/component/page/PageMain.java b/components/src/main/java/org/patternfly/component/page/PageMain.java index fcce37318..3412f93d2 100644 --- a/components/src/main/java/org/patternfly/component/page/PageMain.java +++ b/components/src/main/java/org/patternfly/component/page/PageMain.java @@ -59,11 +59,12 @@ public static PageMain pageMain(String id) { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "pm"; + public static final String SUB_COMPONENT_ID = "pm"; + public static final String SUB_COMPONENT_NAME = "PageMain"; private final HTMLContainerBuilder mc; PageMain(String id) { - super(SUB_COMPONENT_NAME, div().css(component(page, main, container)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(page, main, container)).element()); this.mc = main().css(component(page, main)) .id(id) .attr(role, Roles.main) diff --git a/components/src/main/java/org/patternfly/component/page/PageNavigation.java b/components/src/main/java/org/patternfly/component/page/PageNavigation.java index d8127a8c9..f9ce71230 100644 --- a/components/src/main/java/org/patternfly/component/page/PageNavigation.java +++ b/components/src/main/java/org/patternfly/component/page/PageNavigation.java @@ -41,10 +41,11 @@ public static PageNavigation pageNavigation() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "pn"; + public static final String SUB_COMPONENT_ID = "pn"; + public static final String SUB_COMPONENT_NAME = "PageNavigation"; PageNavigation() { - super(SUB_COMPONENT_NAME, section().css(component(page, main, nav)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, section().css(component(page, main, nav)).element()); } // ------------------------------------------------------ add diff --git a/components/src/main/java/org/patternfly/component/page/PageSection.java b/components/src/main/java/org/patternfly/component/page/PageSection.java index 8afa13e51..2bf16cd94 100644 --- a/components/src/main/java/org/patternfly/component/page/PageSection.java +++ b/components/src/main/java/org/patternfly/component/page/PageSection.java @@ -49,11 +49,12 @@ public static PageSection pageSection() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "ps"; + public static final String SUB_COMPONENT_ID = "ps"; + public static final String SUB_COMPONENT_NAME = "PageSection"; private final HTMLElement container; PageSection() { - super(SUB_COMPONENT_NAME, section().css(component(page, main, section)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, section().css(component(page, main, section)).element()); element().appendChild(container = div().css(component(page, main, body)).element()); } diff --git a/components/src/main/java/org/patternfly/component/page/PageSectionBuilder.java b/components/src/main/java/org/patternfly/component/page/PageSectionBuilder.java index aa3439d15..be5c72772 100644 --- a/components/src/main/java/org/patternfly/component/page/PageSectionBuilder.java +++ b/components/src/main/java/org/patternfly/component/page/PageSectionBuilder.java @@ -36,8 +36,8 @@ public abstract class PageSectionBuilder> extends PageSubComponent implements PageSectionLike { - PageSectionBuilder(String name, E element) { - super(name, element); + PageSectionBuilder(String subComponentId, String subComponentName, E element) { + super(subComponentId, subComponentName, element); } // ------------------------------------------------------ builder diff --git a/components/src/main/java/org/patternfly/component/page/PageSidebar.java b/components/src/main/java/org/patternfly/component/page/PageSidebar.java index eafaddc7c..ca978e98b 100644 --- a/components/src/main/java/org/patternfly/component/page/PageSidebar.java +++ b/components/src/main/java/org/patternfly/component/page/PageSidebar.java @@ -50,13 +50,14 @@ public static PageSidebar pageSidebar() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "psb"; + public static final String SUB_COMPONENT_ID = "psb"; + public static final String SUB_COMPONENT_NAME = "PageSidebar"; private boolean keepExpanded; private final List> toggleHandler; PageSidebar() { - super(SUB_COMPONENT_NAME, aside().css(component(page, sidebar), modifier(expanded)) + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, aside().css(component(page, sidebar), modifier(expanded)) .aria(hidden, false) .element()); this.keepExpanded = false; diff --git a/components/src/main/java/org/patternfly/component/page/PageSidebarBody.java b/components/src/main/java/org/patternfly/component/page/PageSidebarBody.java index de42a6654..1a11f324f 100644 --- a/components/src/main/java/org/patternfly/component/page/PageSidebarBody.java +++ b/components/src/main/java/org/patternfly/component/page/PageSidebarBody.java @@ -52,10 +52,11 @@ public static PageSidebarBody pageSidebarBody() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "psbb"; + public static final String SUB_COMPONENT_ID = "psbb"; + public static final String SUB_COMPONENT_NAME = "PageSidebarBody"; PageSidebarBody() { - super(SUB_COMPONENT_NAME, div().css(component(page, sidebar, body)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(page, sidebar, body)).element()); } // ------------------------------------------------------ add diff --git a/components/src/main/java/org/patternfly/component/page/PageSubComponent.java b/components/src/main/java/org/patternfly/component/page/PageSubComponent.java index 2868538fa..f9408d47d 100644 --- a/components/src/main/java/org/patternfly/component/page/PageSubComponent.java +++ b/components/src/main/java/org/patternfly/component/page/PageSubComponent.java @@ -23,7 +23,7 @@ abstract class PageSubComponent> extends SubComponent { - PageSubComponent(String name, E element) { - super(ComponentType.Page, name, element); + PageSubComponent(String subComponentId, String subComponentName, E element) { + super(ComponentType.Page, subComponentId, subComponentName, element); } } diff --git a/components/src/main/java/org/patternfly/component/page/PageTabs.java b/components/src/main/java/org/patternfly/component/page/PageTabs.java index 53ca071d5..d02328d20 100644 --- a/components/src/main/java/org/patternfly/component/page/PageTabs.java +++ b/components/src/main/java/org/patternfly/component/page/PageTabs.java @@ -41,10 +41,11 @@ public static PageTabs pageTabs() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "pt"; + public static final String SUB_COMPONENT_ID = "pt"; + public static final String SUB_COMPONENT_NAME = "PageTabs"; PageTabs() { - super(SUB_COMPONENT_NAME, section().css(component(page, main, tabs)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, section().css(component(page, main, tabs)).element()); } // ------------------------------------------------------ add diff --git a/components/src/main/java/org/patternfly/component/page/PageWizard.java b/components/src/main/java/org/patternfly/component/page/PageWizard.java index 0de93ad9c..c9593502f 100644 --- a/components/src/main/java/org/patternfly/component/page/PageWizard.java +++ b/components/src/main/java/org/patternfly/component/page/PageWizard.java @@ -38,10 +38,11 @@ public static PageWizard pageWizard() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "pw"; + public static final String SUB_COMPONENT_ID = "pw"; + public static final String SUB_COMPONENT_NAME = "PageWizard"; PageWizard() { - super(SUB_COMPONENT_NAME, section().css(component(page, main, wizard)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, section().css(component(page, main, wizard)).element()); } // ------------------------------------------------------ add diff --git a/components/src/main/java/org/patternfly/component/panel/PanelFooter.java b/components/src/main/java/org/patternfly/component/panel/PanelFooter.java index 4aa05cbc6..2fb2eeb62 100644 --- a/components/src/main/java/org/patternfly/component/panel/PanelFooter.java +++ b/components/src/main/java/org/patternfly/component/panel/PanelFooter.java @@ -35,10 +35,11 @@ public static PanelFooter panelFooter() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "pf"; + public static final String SUB_COMPONENT_ID = "pf"; + public static final String SUB_COMPONENT_NAME = "PanelFooter"; PanelFooter() { - super(SUB_COMPONENT_NAME, div().css(component(panel, footer)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(panel, footer)).element()); } // ------------------------------------------------------ builder diff --git a/components/src/main/java/org/patternfly/component/panel/PanelHeader.java b/components/src/main/java/org/patternfly/component/panel/PanelHeader.java index f19e87580..9d34de33c 100644 --- a/components/src/main/java/org/patternfly/component/panel/PanelHeader.java +++ b/components/src/main/java/org/patternfly/component/panel/PanelHeader.java @@ -37,12 +37,13 @@ public static PanelHeader panelHeader() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "ph"; + public static final String SUB_COMPONENT_ID = "ph"; + public static final String SUB_COMPONENT_NAME = "PanelHeader"; final String headerId; PanelHeader() { - super(SUB_COMPONENT_NAME, div().css(component(panel, header)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(panel, header)).element()); headerId = Id.unique(ComponentType.Panel.id, "header"); element().id = headerId; } diff --git a/components/src/main/java/org/patternfly/component/panel/PanelMain.java b/components/src/main/java/org/patternfly/component/panel/PanelMain.java index 36ced54ab..4fa00368e 100644 --- a/components/src/main/java/org/patternfly/component/panel/PanelMain.java +++ b/components/src/main/java/org/patternfly/component/panel/PanelMain.java @@ -40,11 +40,12 @@ public static PanelMain panelMain() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "pm"; + public static final String SUB_COMPONENT_ID = "pm"; + public static final String SUB_COMPONENT_NAME = "PanelMain"; private final HTMLDivElement bodyElement; PanelMain() { - super(SUB_COMPONENT_NAME, div().css(component(panel, main)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(panel, main)).element()); element().appendChild(bodyElement = div().css(component(panel, main, body)) .element()); } diff --git a/components/src/main/java/org/patternfly/component/panel/PanelSubComponent.java b/components/src/main/java/org/patternfly/component/panel/PanelSubComponent.java index e04c216dd..2e0665073 100644 --- a/components/src/main/java/org/patternfly/component/panel/PanelSubComponent.java +++ b/components/src/main/java/org/patternfly/component/panel/PanelSubComponent.java @@ -23,7 +23,7 @@ abstract class PanelSubComponent> extends SubComponent { - PanelSubComponent(String name, E element) { - super(ComponentType.Panel, name, element); + PanelSubComponent(String subComponentId, String subComponentName, E element) { + super(ComponentType.Panel, subComponentId, subComponentName, element); } } diff --git a/components/src/main/java/org/patternfly/component/popover/PopoverBody.java b/components/src/main/java/org/patternfly/component/popover/PopoverBody.java index e44de7908..190033364 100644 --- a/components/src/main/java/org/patternfly/component/popover/PopoverBody.java +++ b/components/src/main/java/org/patternfly/component/popover/PopoverBody.java @@ -37,12 +37,13 @@ public static PopoverBody popoverBody() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "npb"; + public static final String SUB_COMPONENT_ID = "npb"; + public static final String SUB_COMPONENT_NAME = "PopoverBody"; final String id; PopoverBody() { - super(SUB_COMPONENT_NAME, div().css(component(popover, body)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(popover, body)).element()); id(id = Id.unique(ComponentType.Popover.id, "body")); } diff --git a/components/src/main/java/org/patternfly/component/popover/PopoverFooter.java b/components/src/main/java/org/patternfly/component/popover/PopoverFooter.java index b6bbcf747..ce048d7a8 100644 --- a/components/src/main/java/org/patternfly/component/popover/PopoverFooter.java +++ b/components/src/main/java/org/patternfly/component/popover/PopoverFooter.java @@ -35,10 +35,11 @@ public static PopoverFooter popoverFooter() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "npf"; + public static final String SUB_COMPONENT_ID = "npf"; + public static final String SUB_COMPONENT_NAME = "PopoverFooter"; PopoverFooter() { - super(SUB_COMPONENT_NAME, div().css(component(popover, footer)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(popover, footer)).element()); } // ------------------------------------------------------ builder diff --git a/components/src/main/java/org/patternfly/component/popover/PopoverHeader.java b/components/src/main/java/org/patternfly/component/popover/PopoverHeader.java index 39b8d87b3..92eb9f30a 100644 --- a/components/src/main/java/org/patternfly/component/popover/PopoverHeader.java +++ b/components/src/main/java/org/patternfly/component/popover/PopoverHeader.java @@ -49,14 +49,15 @@ public static PopoverHeader popoverHeader() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "nph"; + public static final String SUB_COMPONENT_ID = "nph"; + public static final String SUB_COMPONENT_NAME = "PopoverHeader"; final String headerId; final HTMLHeadingElement headerElement; private HTMLElement iconContainer; PopoverHeader() { - super(SUB_COMPONENT_NAME, header().css(component(popover, Classes.header)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, header().css(component(popover, Classes.header)).element()); headerId = Id.unique(ComponentType.Popover.id, "header"); element().appendChild(div().css(component(popover, title)) .id(headerId) diff --git a/components/src/main/java/org/patternfly/component/popover/PopoverSubComponent.java b/components/src/main/java/org/patternfly/component/popover/PopoverSubComponent.java index b668fc220..e0812dad2 100644 --- a/components/src/main/java/org/patternfly/component/popover/PopoverSubComponent.java +++ b/components/src/main/java/org/patternfly/component/popover/PopoverSubComponent.java @@ -23,7 +23,7 @@ abstract class PopoverSubComponent> extends SubComponent { - PopoverSubComponent(String name, E element) { - super(ComponentType.Popover, name, element); + PopoverSubComponent(String subComponentId, String subComponentName, E element) { + super(ComponentType.Popover, subComponentId, subComponentName, element); } } \ No newline at end of file diff --git a/components/src/main/java/org/patternfly/component/popover/PopperPopoverBody.java b/components/src/main/java/org/patternfly/component/popover/PopperPopoverBody.java index a423f9693..0a30c596c 100644 --- a/components/src/main/java/org/patternfly/component/popover/PopperPopoverBody.java +++ b/components/src/main/java/org/patternfly/component/popover/PopperPopoverBody.java @@ -38,12 +38,13 @@ public static PopperPopoverBody popoverBody() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "pb"; + public static final String SUB_COMPONENT_ID = "pb"; + public static final String SUB_COMPONENT_NAME = "PopperPopoverBody"; final String id; PopperPopoverBody() { - super(SUB_COMPONENT_NAME, div().css(component(popover, body)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(popover, body)).element()); id(id = Id.unique(ComponentType.PopperPopover.id, "body")); } diff --git a/components/src/main/java/org/patternfly/component/popover/PopperPopoverFooter.java b/components/src/main/java/org/patternfly/component/popover/PopperPopoverFooter.java index 864ce3761..32bfe6889 100644 --- a/components/src/main/java/org/patternfly/component/popover/PopperPopoverFooter.java +++ b/components/src/main/java/org/patternfly/component/popover/PopperPopoverFooter.java @@ -36,10 +36,11 @@ public static PopperPopoverFooter popoverFooter() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "pf"; + public static final String SUB_COMPONENT_ID = "pf"; + public static final String SUB_COMPONENT_NAME = "PopperPopoverFooter"; PopperPopoverFooter() { - super(SUB_COMPONENT_NAME, div().css(component(popover, footer)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, div().css(component(popover, footer)).element()); } // ------------------------------------------------------ builder diff --git a/components/src/main/java/org/patternfly/component/popover/PopperPopoverHeader.java b/components/src/main/java/org/patternfly/component/popover/PopperPopoverHeader.java index 2ce5c7be5..d241ed23e 100644 --- a/components/src/main/java/org/patternfly/component/popover/PopperPopoverHeader.java +++ b/components/src/main/java/org/patternfly/component/popover/PopperPopoverHeader.java @@ -50,14 +50,15 @@ public static PopperPopoverHeader popoverHeader() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "ph"; + public static final String SUB_COMPONENT_ID = "ph"; + public static final String SUB_COMPONENT_NAME = "PopperPopoverHeader"; final String headerId; final HTMLHeadingElement headerElement; private HTMLElement iconContainer; PopperPopoverHeader() { - super(SUB_COMPONENT_NAME, header().css(component(popover, Classes.header)).element()); + super(SUB_COMPONENT_ID, SUB_COMPONENT_NAME, header().css(component(popover, Classes.header)).element()); headerId = Id.unique(ComponentType.PopperPopover.id, "header"); element().appendChild(div().css(component(popover, title)) .id(headerId) diff --git a/components/src/main/java/org/patternfly/component/popover/PopperPopoverSubComponent.java b/components/src/main/java/org/patternfly/component/popover/PopperPopoverSubComponent.java index 527fe6864..894782bfa 100644 --- a/components/src/main/java/org/patternfly/component/popover/PopperPopoverSubComponent.java +++ b/components/src/main/java/org/patternfly/component/popover/PopperPopoverSubComponent.java @@ -24,7 +24,7 @@ @Deprecated abstract class PopperPopoverSubComponent> extends SubComponent { - PopperPopoverSubComponent(String name, E element) { - super(ComponentType.PopperPopover, name, element); + PopperPopoverSubComponent(String subComponentId, String subComponentName, E element) { + super(ComponentType.PopperPopover, subComponentId, subComponentName, element); } } diff --git a/components/src/main/java/org/patternfly/component/progressstepper/ProgressStep.java b/components/src/main/java/org/patternfly/component/progressstepper/ProgressStep.java index 605201ad4..6910c33e5 100644 --- a/components/src/main/java/org/patternfly/component/progressstepper/ProgressStep.java +++ b/components/src/main/java/org/patternfly/component/progressstepper/ProgressStep.java @@ -65,7 +65,8 @@ public static ProgressStep progressStep(String identifier, String text) { // ------------------------------------------------------- instance - public static final String SUB_COMPONENT_NAME = "pss"; // progress stepper step + public static final String SUB_COMPONENT_ID = "pss"; // progress stepper step + public static final String SUB_COMPONENT_NAME = "ProgressStep"; private static final Logger logger = Logger.getLogger(ProgressStep.class.getName()); private static final String STEP = "step"; private static final String STEP_CONNECTOR = "step-connector"; @@ -89,7 +90,7 @@ public static ProgressStep progressStep(String identifier, String text) { private Popover popover; ProgressStep(String identifier) { - super(ComponentType.ProgressStepper, SUB_COMPONENT_NAME, li().element()); + super(ComponentType.ProgressStepper, SUB_COMPONENT_ID, SUB_COMPONENT_NAME, li().element()); this.identifier = identifier; HTMLContainerBuilder stepConnector = div().css(component(progressStepper, STEP_CONNECTOR)); diff --git a/components/src/main/java/org/patternfly/component/slider/SliderActions.java b/components/src/main/java/org/patternfly/component/slider/SliderActions.java index 2634cec04..958cb1d77 100644 --- a/components/src/main/java/org/patternfly/component/slider/SliderActions.java +++ b/components/src/main/java/org/patternfly/component/slider/SliderActions.java @@ -37,11 +37,12 @@ public static SliderActions sliderActions() { // ------------------------------------------------------ instance - public static final String SUB_COMPONENT_NAME = "sa"; + public static final String SUB_COMPONENT_ID = "sa"; + public static final String SUB_COMPONENT_NAME = "SliderActions"; private final List

    * *

    Component Infrastructure

    diff --git a/layouts/src/main/java/org/patternfly/layout/BaseLayout.java b/layouts/src/main/java/org/patternfly/layout/BaseLayout.java index 9382bb67c..2f5ec754b 100644 --- a/layouts/src/main/java/org/patternfly/layout/BaseLayout.java +++ b/layouts/src/main/java/org/patternfly/layout/BaseLayout.java @@ -28,15 +28,16 @@ import org.jboss.elemento.HTMLElementStyleMethods; import org.jboss.elemento.HTMLElementVisibilityMethods; import org.jboss.elemento.TypedBuilder; +import org.patternfly.core.OuiaSupport; import elemental2.dom.HTMLElement; import jsinterop.base.Js; import static java.util.Objects.requireNonNull; -import static org.patternfly.core.Ouia.ouia; public abstract class BaseLayout> implements Layout, + OuiaSupport, ElementAttributeMethods, ElementClassListMethods, ElementContainerMethods, @@ -56,7 +57,12 @@ public abstract class BaseLayout Date: Wed, 20 May 2026 09:22:19 +0200 Subject: [PATCH 137/430] docs: Add Javadoc to public Ouia methods --- CHANGELOG.md | 1 + core/src/main/java/org/patternfly/core/Ouia.java | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c662bb134..d2b6f5f6c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - Add `OuiaSupport` interface in `core` module for custom components to participate in OUIA without extending PatternFly Java base classes; `BaseComponent`, `SubComponent`, `ComponentDelegate`, `BaseLayout`, and `BaseChart` now implement this interface - Replace direct `Ouia` static method calls with `OuiaSupport` default methods in `Button`, `Icon`, `Skeleton`, `Drawer`, `PageSidebar`, and `ExpandableSection` +- Add Javadoc to all public methods in `Ouia` ## [0.7.8] - 2026-05-19 diff --git a/core/src/main/java/org/patternfly/core/Ouia.java b/core/src/main/java/org/patternfly/core/Ouia.java index cd961bd36..3b0a1bb3d 100644 --- a/core/src/main/java/org/patternfly/core/Ouia.java +++ b/core/src/main/java/org/patternfly/core/Ouia.java @@ -36,6 +36,7 @@ */ public final class Ouia { + /** Sets {@code data-ouia-component-type} and {@code data-ouia-safe="true"} on the given HTML element. */ public static void ouia(HTMLElement element, String componentType) { if (element != null && componentType != null && isSupported()) { element.dataset.set("ouiaComponentType", componentType); @@ -43,6 +44,7 @@ public static void ouia(HTMLElement element, String componentType) { } } + /** Sets {@code data-ouia-component-id}, {@code data-ouia-component-type}, and {@code data-ouia-safe="true"} on the given HTML element. */ public static void ouia(HTMLElement element, String componentId, String componentType) { if (element != null && componentType != null && isSupported()) { if (componentId != null) { @@ -53,6 +55,7 @@ public static void ouia(HTMLElement element, String componentId, String componen } } + /** Sets {@code data-ouia-component-type} and {@code data-ouia-safe="true"} on the given SVG element. */ public static void ouia(SVGElement element, String componentType) { if (element != null && componentType != null && isSupported()) { element.dataset.set("ouiaComponentType", componentType); @@ -60,6 +63,7 @@ public static void ouia(SVGElement element, String componentType) { } } + /** Sets {@code data-ouia-component-id}, {@code data-ouia-component-type}, and {@code data-ouia-safe="true"} on the given SVG element. */ public static void ouia(SVGElement element, String componentId, String componentType) { if (element != null && componentType != null && isSupported()) { if (componentId != null) { @@ -70,12 +74,14 @@ public static void ouia(SVGElement element, String componentId, String component } } + /** Sets {@code data-ouia-safe} to the given value on the given HTML element. */ public static void ouiaSafe(HTMLElement element, boolean safe) { if (element != null && isSupported()) { element.dataset.set("ouiaSafe", String.valueOf(safe)); } } + /** Sets {@code data-ouia-safe} to the given value on the given SVG element. */ public static void ouiaSafe(SVGElement element, boolean safe) { if (element != null && isSupported()) { element.dataset.set("ouiaSafe", String.valueOf(safe)); From b144d7aba71712fd94dcb63d1a01a73cdeb657c4 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Wed, 20 May 2026 09:24:15 +0200 Subject: [PATCH 138/430] Release 0.8.0 --- CHANGELOG.md | 5 ++++- README.md | 2 +- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 22 files changed, 25 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d2b6f5f6c..deedde575 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +## [0.8.0] - 2026-05-20 + ### Added - Add `OuiaSupport` interface in `core` module for custom components to participate in OUIA without extending PatternFly Java base classes; `BaseComponent`, `SubComponent`, `ComponentDelegate`, `BaseLayout`, and `BaseChart` now implement this interface @@ -1031,7 +1033,8 @@ Stay tuned for more to come... -[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.8...HEAD +[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.8.0...HEAD +[0.8.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.8...v0.8.0 [0.7.8]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.7...v0.7.8 [0.7.7]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.6...v0.7.7 [0.7.6]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.5...v0.7.6 diff --git a/README.md b/README.md index 3bbefd93e..36de81540 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.7.8 + 0.8.0 pom import diff --git a/apidoc/pom.xml b/apidoc/pom.xml index a48057cde..fe202c9f5 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.9-SNAPSHOT + 0.8.0 ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 8e36a85f3..1c0e12553 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.7.9-SNAPSHOT + 0.8.0 pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index c06151254..fe9069eaf 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.9-SNAPSHOT + 0.8.0 ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 4bacda2a2..ea50426fd 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.7.9-SNAPSHOT", + "version": "0.8.0", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 7ede12f12..fcb0ae9b2 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.9-SNAPSHOT + 0.8.0 ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 52ea1482e..35141a931 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.7.9-SNAPSHOT + 0.8.0 ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 1f8658057..f569d8a3e 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.9-SNAPSHOT + 0.8.0 ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index f56190ea6..0721975f9 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.7.9-SNAPSHOT", + "version": "0.8.0", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 57d7c7d68..7527cc087 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.9-SNAPSHOT + 0.8.0 ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 7a6b6f0ae..869cee955 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.9-SNAPSHOT + 0.8.0 ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 2841604d8..f6f5a9f3e 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.7.9-SNAPSHOT", + "version": "0.8.0", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index 2d1d32cae..4ea3b3c7c 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.9-SNAPSHOT + 0.8.0 ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 62972abe1..3df9f2b51 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.9-SNAPSHOT + 0.8.0 ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index d42afcf4d..5ad093c9d 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.9-SNAPSHOT + 0.8.0 ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 993c3115d..b56782e70 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.9-SNAPSHOT + 0.8.0 ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 909ad6368..e57376400 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.9-SNAPSHOT + 0.8.0 ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 8d734c4f5..0f6a421c4 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.7.9-SNAPSHOT + 0.8.0 pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index 8799bdbb0..53908da08 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.9-SNAPSHOT + 0.8.0 ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 1507e6695..02a20f63c 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.7.9-SNAPSHOT + 0.8.0 pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 2485e07df..97c5204db 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.7.9-SNAPSHOT + 0.8.0 ../code-parent/pom.xml From c9575851abcf248be5d287cf5f3cbb593c70f8f1 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Wed, 20 May 2026 09:24:28 +0200 Subject: [PATCH 139/430] Next is 0.8.1 --- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apidoc/pom.xml b/apidoc/pom.xml index fe202c9f5..a90c965f4 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.0 + 0.8.1-SNAPSHOT ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 1c0e12553..c5d27a43f 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.8.0 + 0.8.1-SNAPSHOT pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index fe9069eaf..cc022dc5f 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.8.0 + 0.8.1-SNAPSHOT ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index ea50426fd..b7383cba7 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.8.0", + "version": "0.8.1-SNAPSHOT", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index fcb0ae9b2..d0b11f238 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.0 + 0.8.1-SNAPSHOT ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 35141a931..e118ef1df 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.8.0 + 0.8.1-SNAPSHOT ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index f569d8a3e..7b9a91c54 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.0 + 0.8.1-SNAPSHOT ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 0721975f9..f9f49817d 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.8.0", + "version": "0.8.1-SNAPSHOT", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 7527cc087..831205ed1 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.0 + 0.8.1-SNAPSHOT ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 869cee955..1f7073c38 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.0 + 0.8.1-SNAPSHOT ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index f6f5a9f3e..38de478e4 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.8.0", + "version": "0.8.1-SNAPSHOT", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index 4ea3b3c7c..2180ea606 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.0 + 0.8.1-SNAPSHOT ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 3df9f2b51..8851aff17 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.0 + 0.8.1-SNAPSHOT ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index 5ad093c9d..1fb6e0283 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.0 + 0.8.1-SNAPSHOT ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index b56782e70..fd06c5fe2 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.0 + 0.8.1-SNAPSHOT ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index e57376400..e3d4f6bdd 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.0 + 0.8.1-SNAPSHOT ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 0f6a421c4..f5e95b955 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.8.0 + 0.8.1-SNAPSHOT pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index 53908da08..1761c48b9 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.0 + 0.8.1-SNAPSHOT ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 02a20f63c..e68082e83 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.8.0 + 0.8.1-SNAPSHOT pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 97c5204db..f7867757f 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.0 + 0.8.1-SNAPSHOT ../code-parent/pom.xml From 8b1c6efa75be94bb574dff5aa4574bc3b2f5759f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 May 2026 07:26:47 +0000 Subject: [PATCH 140/430] Bump brace-expansion from 5.0.5 to 5.0.6 in /charts/npm Bumps [brace-expansion](https://github.com/juliangruber/brace-expansion) from 5.0.5 to 5.0.6. - [Release notes](https://github.com/juliangruber/brace-expansion/releases) - [Commits](https://github.com/juliangruber/brace-expansion/compare/v5.0.5...v5.0.6) --- updated-dependencies: - dependency-name: brace-expansion dependency-version: 5.0.6 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- charts/npm/pnpm-lock.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/charts/npm/pnpm-lock.yaml b/charts/npm/pnpm-lock.yaml index ce8637a12..ddd4da332 100644 --- a/charts/npm/pnpm-lock.yaml +++ b/charts/npm/pnpm-lock.yaml @@ -747,8 +747,8 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - brace-expansion@5.0.5: - resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} engines: {node: 18 || 20 || >=22} browserslist@4.28.2: @@ -2079,7 +2079,7 @@ snapshots: baseline-browser-mapping@2.10.13: {} - brace-expansion@5.0.5: + brace-expansion@5.0.6: dependencies: balanced-match: 4.0.4 @@ -2284,7 +2284,7 @@ snapshots: minimatch@10.2.5: dependencies: - brace-expansion: 5.0.5 + brace-expansion: 5.0.6 minipass@7.1.3: {} From bf1b8d2b142b6848dd63006b21122ecc65bfd240 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Wed, 20 May 2026 15:44:08 +0200 Subject: [PATCH 141/430] Use OIDC to publish NPM packages --- .github/workflows/release.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 80c2229c6..f831e99b3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -7,6 +7,7 @@ on: permissions: contents: write + id-token: write jobs: deploy-bom: @@ -77,23 +78,21 @@ jobs: - uses: actions/setup-node@v6 with: node-version: 25 + registry-url: 'https://registry.npmjs.org' + - run: npm install -g npm@latest - run: corepack enable - - name: Configure NPM Authentication - run: echo "//registry.npmjs.org/:_authToken=${NODE_AUTH_TOKEN}" > ~/.npmrc - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - name: Publish @patternfly-java/core working-directory: core/npm - run: pnpm publish --access public --no-git-checks + run: npm publish --access public - name: Publish @patternfly-java/finder working-directory: extensions/finder/npm - run: pnpm publish --access public --no-git-checks + run: npm publish --access public - name: Publish @patternfly-java/charts working-directory: charts/npm run: | pnpm install pnpm run build - pnpm publish --access public --no-git-checks + npm publish --access public publish-showcase: name: Publish Showcase From 51c0b5595f1ae81bccce981014d7dd3efb615bfc Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Wed, 20 May 2026 15:46:00 +0200 Subject: [PATCH 142/430] docs: Document OIDC change in changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index deedde575..65f8c2248 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +### Changed + +- Use OIDC to publish NPM packages in release workflow + ## [0.8.0] - 2026-05-20 ### Added From eaf55a3e2fc2a485a3dfe83bb74c2154611d310b Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Wed, 20 May 2026 15:46:39 +0200 Subject: [PATCH 143/430] Release 0.8.1 --- CHANGELOG.md | 5 ++++- README.md | 2 +- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 22 files changed, 25 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 65f8c2248..390ddbe7d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +## [0.8.1] - 2026-05-20 + ### Changed - Use OIDC to publish NPM packages in release workflow @@ -1037,7 +1039,8 @@ Stay tuned for more to come... -[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.8.0...HEAD +[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.8.1...HEAD +[0.8.1]: https://github.com/patternfly-java/patternfly-java/compare/v0.8.0...v0.8.1 [0.8.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.8...v0.8.0 [0.7.8]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.7...v0.7.8 [0.7.7]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.6...v0.7.7 diff --git a/README.md b/README.md index 36de81540..52c37e57c 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.8.0 + 0.8.1 pom import diff --git a/apidoc/pom.xml b/apidoc/pom.xml index a90c965f4..c636fe055 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.1-SNAPSHOT + 0.8.1 ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index c5d27a43f..bcfbbe2fb 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.8.1-SNAPSHOT + 0.8.1 pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index cc022dc5f..f4e9f3397 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.8.1-SNAPSHOT + 0.8.1 ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index b7383cba7..e9e3e4c0d 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.8.1-SNAPSHOT", + "version": "0.8.1", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index d0b11f238..54a31722a 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.1-SNAPSHOT + 0.8.1 ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index e118ef1df..a46ec22c2 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.8.1-SNAPSHOT + 0.8.1 ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 7b9a91c54..5ede335bf 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.1-SNAPSHOT + 0.8.1 ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index f9f49817d..bd0b7ce47 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.8.1-SNAPSHOT", + "version": "0.8.1", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 831205ed1..6225fd97f 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.1-SNAPSHOT + 0.8.1 ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 1f7073c38..24bc7a14e 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.1-SNAPSHOT + 0.8.1 ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 38de478e4..b9881b9ff 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.8.1-SNAPSHOT", + "version": "0.8.1", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index 2180ea606..90410d2dd 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.1-SNAPSHOT + 0.8.1 ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 8851aff17..16f1c9349 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.1-SNAPSHOT + 0.8.1 ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index 1fb6e0283..d63eb9801 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.1-SNAPSHOT + 0.8.1 ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index fd06c5fe2..0ab663250 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.1-SNAPSHOT + 0.8.1 ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index e3d4f6bdd..10b157176 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.1-SNAPSHOT + 0.8.1 ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index f5e95b955..13a94c983 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.8.1-SNAPSHOT + 0.8.1 pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index 1761c48b9..f33b4c4cd 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.1-SNAPSHOT + 0.8.1 ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index e68082e83..dcf3645f1 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.8.1-SNAPSHOT + 0.8.1 pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index f7867757f..adeab1cf1 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.1-SNAPSHOT + 0.8.1 ../code-parent/pom.xml From 155c10d2f3e4a7973e88461c98495138d5b9c90a Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Wed, 20 May 2026 15:46:49 +0200 Subject: [PATCH 144/430] Next is 0.8.2 --- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apidoc/pom.xml b/apidoc/pom.xml index c636fe055..6dec526d3 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.1 + 0.8.2-SNAPSHOT ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index bcfbbe2fb..61398692a 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.8.1 + 0.8.2-SNAPSHOT pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index f4e9f3397..787d9b5be 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.8.1 + 0.8.2-SNAPSHOT ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index e9e3e4c0d..1b0db5047 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.8.1", + "version": "0.8.2-SNAPSHOT", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 54a31722a..873adeaaf 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.1 + 0.8.2-SNAPSHOT ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index a46ec22c2..2ed17e911 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.8.1 + 0.8.2-SNAPSHOT ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 5ede335bf..24dd5e503 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.1 + 0.8.2-SNAPSHOT ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index bd0b7ce47..44b357607 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.8.1", + "version": "0.8.2-SNAPSHOT", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 6225fd97f..64d713934 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.1 + 0.8.2-SNAPSHOT ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 24bc7a14e..b2919a339 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.1 + 0.8.2-SNAPSHOT ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index b9881b9ff..c220bf823 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.8.1", + "version": "0.8.2-SNAPSHOT", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index 90410d2dd..807dafd5f 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.1 + 0.8.2-SNAPSHOT ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 16f1c9349..f28f09814 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.1 + 0.8.2-SNAPSHOT ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index d63eb9801..7c9ac35e2 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.1 + 0.8.2-SNAPSHOT ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 0ab663250..700a4fcc2 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.1 + 0.8.2-SNAPSHOT ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 10b157176..7e4461138 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.1 + 0.8.2-SNAPSHOT ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 13a94c983..5e8d73123 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.8.1 + 0.8.2-SNAPSHOT pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index f33b4c4cd..d104d3499 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.1 + 0.8.2-SNAPSHOT ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index dcf3645f1..203e758ee 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.8.1 + 0.8.2-SNAPSHOT pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index adeab1cf1..2cb553cc1 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.1 + 0.8.2-SNAPSHOT ../code-parent/pom.xml From d8dcc5f75587682d9b2b912abd469270d18630a9 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Wed, 20 May 2026 16:03:07 +0200 Subject: [PATCH 145/430] Fix release workflow --- .github/workflows/release.yml | 1 - CHANGELOG.md | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f831e99b3..0c18a413a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -78,7 +78,6 @@ jobs: - uses: actions/setup-node@v6 with: node-version: 25 - registry-url: 'https://registry.npmjs.org' - run: npm install -g npm@latest - run: corepack enable - name: Publish @patternfly-java/core diff --git a/CHANGELOG.md b/CHANGELOG.md index 390ddbe7d..ba72870b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +### Fixed + +- Fix release workflow + ## [0.8.1] - 2026-05-20 ### Changed From 9bc0092c888eb2c17728bfeb0f3da850c540418f Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Wed, 20 May 2026 16:03:34 +0200 Subject: [PATCH 146/430] Release 0.8.2 --- CHANGELOG.md | 5 ++++- README.md | 2 +- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 22 files changed, 25 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ba72870b2..022a5ce0f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +## [0.8.2] - 2026-05-20 + ### Fixed - Fix release workflow @@ -1043,7 +1045,8 @@ Stay tuned for more to come... -[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.8.1...HEAD +[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.8.2...HEAD +[0.8.2]: https://github.com/patternfly-java/patternfly-java/compare/v0.8.1...v0.8.2 [0.8.1]: https://github.com/patternfly-java/patternfly-java/compare/v0.8.0...v0.8.1 [0.8.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.8...v0.8.0 [0.7.8]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.7...v0.7.8 diff --git a/README.md b/README.md index 52c37e57c..1c977968d 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.8.1 + 0.8.2 pom import diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 6dec526d3..7d08ecbec 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.2-SNAPSHOT + 0.8.2 ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 61398692a..264ad6f62 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.8.2-SNAPSHOT + 0.8.2 pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index 787d9b5be..009dc3fca 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.8.2-SNAPSHOT + 0.8.2 ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 1b0db5047..2ea650ba5 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.8.2-SNAPSHOT", + "version": "0.8.2", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 873adeaaf..c2c65da5a 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.2-SNAPSHOT + 0.8.2 ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 2ed17e911..f535a63ce 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.8.2-SNAPSHOT + 0.8.2 ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 24dd5e503..ed9c25ff5 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.2-SNAPSHOT + 0.8.2 ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 44b357607..d07575a90 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.8.2-SNAPSHOT", + "version": "0.8.2", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 64d713934..c984317f1 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.2-SNAPSHOT + 0.8.2 ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index b2919a339..1b0c0e504 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.2-SNAPSHOT + 0.8.2 ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index c220bf823..92823afd6 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.8.2-SNAPSHOT", + "version": "0.8.2", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index 807dafd5f..a2ee82230 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.2-SNAPSHOT + 0.8.2 ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index f28f09814..5b6ce4acd 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.2-SNAPSHOT + 0.8.2 ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index 7c9ac35e2..f8ffb7bc5 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.2-SNAPSHOT + 0.8.2 ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 700a4fcc2..10aabd891 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.2-SNAPSHOT + 0.8.2 ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 7e4461138..41a1a1f5c 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.2-SNAPSHOT + 0.8.2 ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 5e8d73123..6f40ab666 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.8.2-SNAPSHOT + 0.8.2 pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index d104d3499..7739d4442 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.2-SNAPSHOT + 0.8.2 ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 203e758ee..99cbbe94a 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.8.2-SNAPSHOT + 0.8.2 pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 2cb553cc1..7cafbf72f 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.2-SNAPSHOT + 0.8.2 ../code-parent/pom.xml From 16f10541688839bb294d2eb5fca5480d2fc4d663 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Wed, 20 May 2026 16:03:45 +0200 Subject: [PATCH 147/430] Next is 0.8.3 --- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 7d08ecbec..d91209029 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.2 + 0.8.3-SNAPSHOT ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 264ad6f62..2c19c7681 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.8.2 + 0.8.3-SNAPSHOT pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index 009dc3fca..bb181cd8f 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.8.2 + 0.8.3-SNAPSHOT ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 2ea650ba5..07d690dce 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.8.2", + "version": "0.8.3-SNAPSHOT", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index c2c65da5a..1aaf4e7ab 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.2 + 0.8.3-SNAPSHOT ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index f535a63ce..32dd659df 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.8.2 + 0.8.3-SNAPSHOT ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index ed9c25ff5..9d8dc76bc 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.2 + 0.8.3-SNAPSHOT ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index d07575a90..98901f9fc 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.8.2", + "version": "0.8.3-SNAPSHOT", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index c984317f1..4f02d6cc7 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.2 + 0.8.3-SNAPSHOT ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 1b0c0e504..7c40f7e37 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.2 + 0.8.3-SNAPSHOT ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 92823afd6..3481063ab 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.8.2", + "version": "0.8.3-SNAPSHOT", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index a2ee82230..e8824355b 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.2 + 0.8.3-SNAPSHOT ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 5b6ce4acd..86591db3d 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.2 + 0.8.3-SNAPSHOT ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index f8ffb7bc5..6e1a03996 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.2 + 0.8.3-SNAPSHOT ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 10aabd891..d209869b6 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.2 + 0.8.3-SNAPSHOT ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 41a1a1f5c..bd439fe2d 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.2 + 0.8.3-SNAPSHOT ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 6f40ab666..2a7cad649 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.8.2 + 0.8.3-SNAPSHOT pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index 7739d4442..b7d4ca21e 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.2 + 0.8.3-SNAPSHOT ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 99cbbe94a..440ac6353 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.8.2 + 0.8.3-SNAPSHOT pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 7cafbf72f..f0be7196d 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.2 + 0.8.3-SNAPSHOT ../code-parent/pom.xml From c48224a4109c9a33347cf1ffac2d096df3a4a421 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 May 2026 14:05:41 +0000 Subject: [PATCH 148/430] Bump org.junit:junit-bom from 6.0.3 to 6.1.0 Bumps [org.junit:junit-bom](https://github.com/junit-team/junit-framework) from 6.0.3 to 6.1.0. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/compare/r6.0.3...r6.1.0) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-version: 6.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2a7cad649..106c9c1b9 100644 --- a/pom.xml +++ b/pom.xml @@ -84,7 +84,7 @@ 2.13.0 1.0.0-RC1 1.0.0-RC1 - 6.0.3 + 6.1.0 v25.8.1 6.4.0 From fd39c10b75184123a2cb0eb1aa66358225dd6b1e Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Wed, 20 May 2026 16:37:56 +0200 Subject: [PATCH 149/430] fix: Use explicit tuple() pairs in showcase Tuples.tuples() calls The tuples() method requires Tuple... varargs, not interleaved (K, V, K, V) arguments. Wrapped all arguments in tuple() calls in FormControlComponent and ProgressComponent. --- CHANGELOG.md | 4 ++++ .../component/FormControlComponent.java | 17 +++++++------- .../showcase/component/ProgressComponent.java | 23 ++++++++++--------- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 022a5ce0f..91d2c6b21 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +### Fixed + +- Fix `Tuples.tuples()` calls in showcase components to use explicit `tuple()` pairs + ## [0.8.2] - 2026-05-20 ### Fixed diff --git a/showcase/src/main/java/org/patternfly/showcase/component/FormControlComponent.java b/showcase/src/main/java/org/patternfly/showcase/component/FormControlComponent.java index 40fc2626c..8b17c9a38 100644 --- a/showcase/src/main/java/org/patternfly/showcase/component/FormControlComponent.java +++ b/showcase/src/main/java/org/patternfly/showcase/component/FormControlComponent.java @@ -39,6 +39,7 @@ import static org.patternfly.component.form.TextAreaResize.horizontal; import static org.patternfly.component.form.TextAreaResize.vertical; import static org.patternfly.component.form.TextInput.textInput; +import static org.patternfly.core.Tuple.tuple; import static org.patternfly.core.Tuples.tuples; import static org.patternfly.icon.IconSets.fas.calendar; import static org.patternfly.icon.IconSets.fas.clock; @@ -93,16 +94,16 @@ public FormControlComponent() { String[] values0 = {"Mr", "Miss", "Mrs", "Ms", "Dr", "Other"}; Tuples> groups0 = tuples( - "Group 1", tuples( - "The first option", false, - "Option groups (second option selected)", false), - "Group 2", tuples( - "The third option", false, - "The fourth option", true)); + tuple("Group 1", tuples( + tuple("The first option", false), + tuple("Option groups (second option selected)", false))), + tuple("Group 2", tuples( + tuple("The third option", false), + tuple("The fourth option", true)))); Tuples> groups1 = tuples( - "Group 1", asList("The first option", "The second option"), - "Group 2", asList("The third option", "The fourth option")); + tuple("Group 1", asList("The first option", "The second option")), + tuple("Group 2", asList("The third option", "The fourth option"))); return div() .add(formSelect("form-select-0") diff --git a/showcase/src/main/java/org/patternfly/showcase/component/ProgressComponent.java b/showcase/src/main/java/org/patternfly/showcase/component/ProgressComponent.java index caa4dc50c..63d8a9435 100644 --- a/showcase/src/main/java/org/patternfly/showcase/component/ProgressComponent.java +++ b/showcase/src/main/java/org/patternfly/showcase/component/ProgressComponent.java @@ -40,6 +40,7 @@ import static org.patternfly.component.progress.MeasureLocation.none; import static org.patternfly.component.progress.MeasureLocation.outside; import static org.patternfly.component.progress.Progress.progress; +import static org.patternfly.core.Tuple.tuple; import static org.patternfly.core.Tuples.tuples; import static org.patternfly.showcase.ApiDoc.Type.component; import static org.patternfly.showcase.ApiDoc.Type.modifier; @@ -224,13 +225,13 @@ public ProgressComponent() { addSnippet(new Snippet("progress-step-instruction", "Progress with step instructions", code("progress-step-instruction"), () -> { // @code-start:progress-step-instruction - Tuples instructions = tuples( - 0, "Preparing", - 1, "Collecting files", - 2, "Copying files", - 3, "Verifying files", - 4, "Restarting server", - 5, "Cleanup"); + Tuples instructions = Tuples.tuples( + tuple(0, "Preparing"), + tuple(1, "Collecting files"), + tuple(2, "Copying files"), + tuple(3, "Verifying files"), + tuple(4, "Restarting server"), + tuple(5, "Cleanup")); return div() .add(progress() .label((min, max, step, value) -> "Step " + value + ": " + instructions.value(value)) @@ -274,10 +275,10 @@ public ProgressComponent() { code("progress-helper-text"), () -> { // @code-start:progress-helper-text Tuples status = tuples( - info, "Default variant", - success, "Success variant", - warning, "Warning variant", - danger, "Danger variant" + tuple(info, "Default variant"), + tuple(success, "Success variant"), + tuple(warning, "Warning variant"), + tuple(danger, "Danger variant") ); Progress progress = progress(); HelperText helperText = helperText("Default variant is being displayed"); From 271bf6a0c9771c5bc43fcdb0c028bb15efe6e43c Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Wed, 20 May 2026 16:44:50 +0200 Subject: [PATCH 150/430] Release 0.8.3 --- CHANGELOG.md | 5 ++++- README.md | 2 +- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 22 files changed, 25 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 91d2c6b21..b52df26ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +## [0.8.3] - 2026-05-20 + ### Fixed - Fix `Tuples.tuples()` calls in showcase components to use explicit `tuple()` pairs @@ -1049,7 +1051,8 @@ Stay tuned for more to come... -[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.8.2...HEAD +[Unreleased]: https://github.com/patternfly-java/patternfly-java/compare/v0.8.3...HEAD +[0.8.3]: https://github.com/patternfly-java/patternfly-java/compare/v0.8.2...v0.8.3 [0.8.2]: https://github.com/patternfly-java/patternfly-java/compare/v0.8.1...v0.8.2 [0.8.1]: https://github.com/patternfly-java/patternfly-java/compare/v0.8.0...v0.8.1 [0.8.0]: https://github.com/patternfly-java/patternfly-java/compare/v0.7.8...v0.8.0 diff --git a/README.md b/README.md index 1c977968d..bd2f1d2a9 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.8.2 + 0.8.3 pom import diff --git a/apidoc/pom.xml b/apidoc/pom.xml index d91209029..8b7177604 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.3-SNAPSHOT + 0.8.3 ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 2c19c7681..684b0615a 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.8.3-SNAPSHOT + 0.8.3 pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index bb181cd8f..caa97724d 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.8.3-SNAPSHOT + 0.8.3 ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 07d690dce..6fc130f0f 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.8.3-SNAPSHOT", + "version": "0.8.3", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 1aaf4e7ab..004d9d36b 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.3-SNAPSHOT + 0.8.3 ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 32dd659df..260635874 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.8.3-SNAPSHOT + 0.8.3 ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 9d8dc76bc..6cbbaab05 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.3-SNAPSHOT + 0.8.3 ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index 98901f9fc..f383c0610 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.8.3-SNAPSHOT", + "version": "0.8.3", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 4f02d6cc7..4d9a5857b 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.3-SNAPSHOT + 0.8.3 ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index 7c40f7e37..c439d0b49 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.3-SNAPSHOT + 0.8.3 ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 3481063ab..91968a456 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.8.3-SNAPSHOT", + "version": "0.8.3", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index e8824355b..4eda0b785 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.3-SNAPSHOT + 0.8.3 ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 86591db3d..2a72104c2 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.3-SNAPSHOT + 0.8.3 ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index 6e1a03996..a69eb4492 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.3-SNAPSHOT + 0.8.3 ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index d209869b6..5d668b8d3 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.3-SNAPSHOT + 0.8.3 ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index bd439fe2d..2ea432195 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.3-SNAPSHOT + 0.8.3 ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 106c9c1b9..6ad20383b 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.8.3-SNAPSHOT + 0.8.3 pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index b7d4ca21e..0ee0da77c 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.3-SNAPSHOT + 0.8.3 ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index 440ac6353..df1453ed8 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.8.3-SNAPSHOT + 0.8.3 pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index f0be7196d..6e8be2458 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.3-SNAPSHOT + 0.8.3 ../code-parent/pom.xml From e4cf93121f06cf7119d4464ad1c19d6c1c75ef73 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Wed, 20 May 2026 16:45:00 +0200 Subject: [PATCH 151/430] Next is 0.8.4 --- apidoc/pom.xml | 2 +- bom/pom.xml | 2 +- build-config/pom.xml | 2 +- charts/npm/package.json | 2 +- charts/pom.xml | 2 +- code-parent/pom.xml | 2 +- components/pom.xml | 2 +- core/npm/package.json | 2 +- core/pom.xml | 2 +- extensions/codeeditor/pom.xml | 2 +- extensions/finder/npm/package.json | 2 +- extensions/finder/pom.xml | 2 +- gwt/pom.xml | 2 +- icons/pom.xml | 2 +- j2cl/pom.xml | 2 +- layouts/pom.xml | 2 +- pom.xml | 2 +- showcase/pom.xml | 2 +- showcase/src/doc/get-started.md | 2 +- tokens/pom.xml | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apidoc/pom.xml b/apidoc/pom.xml index 8b7177604..3a4441f38 100644 --- a/apidoc/pom.xml +++ b/apidoc/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.3 + 0.8.4-SNAPSHOT ../code-parent/pom.xml diff --git a/bom/pom.xml b/bom/pom.xml index 684b0615a..473875f9d 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -29,7 +29,7 @@ org.patternfly patternfly-java-bom - 0.8.3 + 0.8.4-SNAPSHOT pom PatternFly Java BOM Bill of materials diff --git a/build-config/pom.xml b/build-config/pom.xml index caa97724d..32147d534 100644 --- a/build-config/pom.xml +++ b/build-config/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.8.3 + 0.8.4-SNAPSHOT ../pom.xml diff --git a/charts/npm/package.json b/charts/npm/package.json index 6fc130f0f..243a4243c 100644 --- a/charts/npm/package.json +++ b/charts/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/charts", "private": false, - "version": "0.8.3", + "version": "0.8.4-SNAPSHOT", "description": "Web Components wrapper around PatternFly React Charts", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/charts/pom.xml b/charts/pom.xml index 004d9d36b..0727995cd 100644 --- a/charts/pom.xml +++ b/charts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.3 + 0.8.4-SNAPSHOT ../code-parent/pom.xml diff --git a/code-parent/pom.xml b/code-parent/pom.xml index 260635874..e835c17a7 100644 --- a/code-parent/pom.xml +++ b/code-parent/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-parent - 0.8.3 + 0.8.4-SNAPSHOT ../pom.xml diff --git a/components/pom.xml b/components/pom.xml index 6cbbaab05..a80e41fbe 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.3 + 0.8.4-SNAPSHOT ../code-parent/pom.xml diff --git a/core/npm/package.json b/core/npm/package.json index f383c0610..f245f154c 100644 --- a/core/npm/package.json +++ b/core/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/core", "private": false, - "version": "0.8.3", + "version": "0.8.4-SNAPSHOT", "description": "CSS for PatternFly Java.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/core/pom.xml b/core/pom.xml index 4d9a5857b..ee0e78d0d 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.3 + 0.8.4-SNAPSHOT ../code-parent/pom.xml diff --git a/extensions/codeeditor/pom.xml b/extensions/codeeditor/pom.xml index c439d0b49..c3bfc9b8b 100644 --- a/extensions/codeeditor/pom.xml +++ b/extensions/codeeditor/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.3 + 0.8.4-SNAPSHOT ../../code-parent/pom.xml diff --git a/extensions/finder/npm/package.json b/extensions/finder/npm/package.json index 91968a456..f4393401d 100644 --- a/extensions/finder/npm/package.json +++ b/extensions/finder/npm/package.json @@ -1,7 +1,7 @@ { "name": "@patternfly-java/finder", "private": false, - "version": "0.8.3", + "version": "0.8.4-SNAPSHOT", "description": "CSS for the PatternFly Java finder extension.", "homepage": "https://patternfly-java.github.io/", "repository": { diff --git a/extensions/finder/pom.xml b/extensions/finder/pom.xml index 4eda0b785..2b8c1a299 100644 --- a/extensions/finder/pom.xml +++ b/extensions/finder/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.3 + 0.8.4-SNAPSHOT ../../code-parent/pom.xml diff --git a/gwt/pom.xml b/gwt/pom.xml index 2a72104c2..0ba0ef245 100644 --- a/gwt/pom.xml +++ b/gwt/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.3 + 0.8.4-SNAPSHOT ../code-parent/pom.xml diff --git a/icons/pom.xml b/icons/pom.xml index a69eb4492..30b70a2ea 100644 --- a/icons/pom.xml +++ b/icons/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.3 + 0.8.4-SNAPSHOT ../code-parent/pom.xml diff --git a/j2cl/pom.xml b/j2cl/pom.xml index 5d668b8d3..fe09ff88b 100644 --- a/j2cl/pom.xml +++ b/j2cl/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.3 + 0.8.4-SNAPSHOT ../code-parent/pom.xml diff --git a/layouts/pom.xml b/layouts/pom.xml index 2ea432195..320a0d81e 100644 --- a/layouts/pom.xml +++ b/layouts/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.3 + 0.8.4-SNAPSHOT ../code-parent/pom.xml diff --git a/pom.xml b/pom.xml index 6ad20383b..436dccd8c 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ org.patternfly patternfly-java-parent - 0.8.3 + 0.8.4-SNAPSHOT pom PatternFly Java Parent Java implementation of PatternFly diff --git a/showcase/pom.xml b/showcase/pom.xml index 0ee0da77c..3cbad5ad3 100644 --- a/showcase/pom.xml +++ b/showcase/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.3 + 0.8.4-SNAPSHOT ../code-parent/pom.xml diff --git a/showcase/src/doc/get-started.md b/showcase/src/doc/get-started.md index df1453ed8..ca6501bcb 100644 --- a/showcase/src/doc/get-started.md +++ b/showcase/src/doc/get-started.md @@ -8,7 +8,7 @@ PatternFly Java is available on [Maven Central](https://central.sonatype.com/sea org.patternfly patternfly-java-bom - 0.8.3 + 0.8.4-SNAPSHOT pom import diff --git a/tokens/pom.xml b/tokens/pom.xml index 6e8be2458..9b8e21237 100644 --- a/tokens/pom.xml +++ b/tokens/pom.xml @@ -23,7 +23,7 @@ org.patternfly patternfly-java-code-parent - 0.8.3 + 0.8.4-SNAPSHOT ../code-parent/pom.xml From a06812de95ec84421f35478823bd7ca8e17dbf40 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Thu, 21 May 2026 16:11:04 +0200 Subject: [PATCH 152/430] Set node version to latest LTS (24) --- .github/workflows/release.yml | 4 ++-- .github/workflows/showcase.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0c18a413a..4e17726da 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -77,7 +77,7 @@ jobs: - uses: actions/checkout@v6 - uses: actions/setup-node@v6 with: - node-version: 25 + node-version: 24 - run: npm install -g npm@latest - run: corepack enable - name: Publish @patternfly-java/core @@ -105,7 +105,7 @@ jobs: persist-credentials: false - uses: actions/setup-node@v6 with: - node-version: 25 + node-version: 24 - run: corepack enable - run: pnpm install working-directory: charts/npm diff --git a/.github/workflows/showcase.yml b/.github/workflows/showcase.yml index 8eeec6711..bade85527 100644 --- a/.github/workflows/showcase.yml +++ b/.github/workflows/showcase.yml @@ -18,7 +18,7 @@ jobs: persist-credentials: false - uses: actions/setup-node@v6 with: - node-version: 25 + node-version: 24 - run: corepack enable - run: pnpm install working-directory: charts/npm From 85b8e63f706f98446e8f8a171f6f876c3481e982 Mon Sep 17 00:00:00 2001 From: Harald Pehl Date: Wed, 27 May 2026 17:55:53 +0200 Subject: [PATCH 153/430] feat: Add Red Hat brand icon sets and migrate components from FontAwesome Add rhUi (547), rhMicrons (35), and rhStandard (554) icon sets from @patternfly/react-icons 6.5.1, bringing total icons from 1,752 to 2,888. All component icon references updated from FontAwesome to RH equivalents (close, carets, status icons, utility icons) to align with PatternFly 6.5. --- CHANGELOG.md | 12 + CLAUDE.md | 2 +- PF-6.5-UPGRADE.md | 220 ++++ README.md | 5 +- .../patternfly/component/ScrollButtons.java | 8 +- .../org/patternfly/component/Severity.java | 10 +- .../component/ValidationStatus.java | 8 +- .../component/accordion/AccordionItem.java | 6 +- .../org/patternfly/component/alert/Alert.java | 8 +- .../component/backtotop/BackToTop.java | 4 +- .../component/breadcrumb/BreadcrumbItem.java | 4 +- .../patternfly/component/card/CardHeader.java | 4 +- .../component/codeblock/CodeBlockAction.java | 2 +- .../component/drawer/DrawerCloseButton.java | 5 +- .../expandable/ExpandableSectionToggle.java | 4 +- .../component/form/FormFieldGroup.java | 4 +- .../component/form/FormGroupLabel.java | 4 +- .../patternfly/component/form/FormSelect.java | 2 +- .../component/icon/package-info.java | 14 +- .../component/jumplinks/JumpLinks.java | 4 +- .../org/patternfly/component/label/Label.java | 4 +- .../component/label/LabelGroup.java | 4 +- .../component/label/package-info.java | 4 +- .../component/list/DataListItem.java | 4 +- .../component/menu/MenuContent.java | 4 +- .../patternfly/component/menu/MenuItem.java | 6 +- .../patternfly/component/menu/MenuList.java | 4 +- .../patternfly/component/menu/MenuToggle.java | 2 +- .../org/patternfly/component/modal/Modal.java | 4 +- .../navigation/ExpandableNavigationGroup.java | 4 +- .../NotificationDrawerHeader.java | 4 +- .../component/page/MastheadToggle.java | 4 +- .../patternfly/component/popover/Popover.java | 4 +- .../component/popover/PopperPopover.java | 4 +- .../component/progress/Progress.java | 12 +- .../progressstepper/ProgressStepVariant.java | 12 +- .../patternfly/component/switch_/Switch.java | 2 +- .../patternfly/component/table/TitleCell.java | 8 +- .../org/patternfly/component/table/Tr.java | 4 +- .../component/tabs/OverflowTab.java | 4 +- .../org/patternfly/component/tabs/Tab.java | 4 +- .../org/patternfly/component/tabs/Tabs.java | 4 +- .../patternfly/component/tabs/TabsToggle.java | 4 +- .../textinputgroup/BaseSearchInput.java | 4 +- .../textinputgroup/package-info.java | 4 +- .../component/togglegroup/package-info.java | 2 +- .../component/toolbar/ToolbarToggleGroup.java | 2 +- .../component/tree/TreeViewItem.java | 12 +- .../component/wizard/WizardHeader.java | 5 +- icons/package.json | 4 +- icons/pnpm-lock.yaml | 20 +- .../java/org/patternfly/icon/IconSpecs.java | 1168 ++++++++++++++++- .../org/patternfly/icon/PredefinedIcon.java | 3 + .../org/patternfly/icon/package-info.java | 3 + icons/src/scripts/generate.mjs | 27 +- icons/src/scripts/rhIcons.mjs | 49 + showcase/src/doc/icons.md | 5 +- 57 files changed, 1613 insertions(+), 135 deletions(-) create mode 100644 PF-6.5-UPGRADE.md create mode 100644 icons/src/scripts/rhIcons.mjs diff --git a/CHANGELOG.md b/CHANGELOG.md index b52df26ab..3b48be1f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,18 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +### Added + +- Add Red Hat brand icon sets (rhUi, rhMicrons, rhStandard) with 1,136 new icons alongside existing FontAwesome icons +- Add `rhIcons.mjs` adapter script for RH icon generation with multi-path SVG flattening +- Add dynamic lookup support for `rhUi`, `rhMicrons`, and `rhStandard` prefixes in `PredefinedIcon.predefinedIcon(String)` + +### Changed + +- Replace FontAwesome icons with Red Hat brand icons across all components (close, carets, status icons, utility icons) +- Update `Severity` and `ValidationStatus` enums to use rhUi status icons +- Update `@patternfly/react-icons` from 6.2.2 to 6.5.1 and `@patternfly/patternfly` from 6.2.3 to 6.5.2 + ## [0.8.3] - 2026-05-20 ### Fixed diff --git a/CLAUDE.md b/CLAUDE.md index f3730731e..b3eb322c2 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -27,7 +27,7 @@ Uses Maven Wrapper (`mvnw`). Requires Java 21+ and Maven 3.9.9+. - **core** - Core classes, handlers, styles, utilities (`org.patternfly.core`, `org.patternfly.style`, `org.patternfly.handler`) - **components** - All UI components (`org.patternfly.component.*`) — 50+ component packages - **layouts** - Page layouts (Page, Sidebar, etc.) -- **icons** - IconSets (FontAwesome, PatternFly icons) +- **icons** - IconSets (FontAwesome, PatternFly, Red Hat icons) - **tokens** - PatternFly design tokens as enum constants - **charts** - Chart web components wrapper (NPM package) - **extensions/codeeditor**, **extensions/finder** - Extensions diff --git a/PF-6.5-UPGRADE.md b/PF-6.5-UPGRADE.md new file mode 100644 index 000000000..c6bff2b49 --- /dev/null +++ b/PF-6.5-UPGRADE.md @@ -0,0 +1,220 @@ +# PatternFly 6.5 Upgrade Checklist + +Upgrade from PatternFly 6.4.0 → 6.5.x. +Source: [Release Highlights](https://www.patternfly.org/releases/release-highlights), [patternfly/patternfly v6.5.0](https://github.com/patternfly/patternfly/releases/tag/v6.5.0), [patternfly/react v6.5.0](https://github.com/patternfly/patternfly-react/releases/tag/v6.5.0) + +Items marked ⚠️ are potentially breaking or high-impact. Items marked 🆕 are entirely new. Items marked 🔧 are modifications to existing components. + +--- + +## 1 — Theming & Global Changes + +These are cross-cutting concerns that affect many components. + +- [ ] 🆕 **Project Felt theme support** — New theme variant applied via a single CSS class. Evaluate whether PatternFly Java needs a theme API or just CSS class application support. +- [ ] 🆕 **Glass mode** — New contrast mode adding transparency/depth to components. Multiple components gained glass-related modifiers (`isGlass`, `noGlass`, `isNoPlainOnGlass`). Needs a `glass` modifier in `Classes`/`Modifiers` and per-component support (see component sections below). +- [ ] 🔧 **High contrast mode (full release)** — Graduated from beta. Enabled via a CSS class. Verify PatternFly Java can apply it. +- [ ] 🔧 **Link style changes** — Links now have subtle gray dotted underline that becomes active on hover/focus. CSS-only change, verify no Java impact. +- [ ] 🔧 **Navigation active item style** — Active items now use a vertical "accent" line. CSS-only, but verify nav component markup is compatible. +- [ ] 🔧 **Control borders** — More boldly outlined. CSS-only change. +- [ ] 🆕 **Global SCSS variable for image path** — `$pf-v6-global--image-path` added (#8400). May affect how the Java showcase or build references PF assets. + +--- + +## 2 — New Components + +- [ ] 🆕 **Hero component** (beta) — New card-like component for attention-grabbing callouts. Decide whether to implement. +- [ ] 🆕 **CardDescription** — New sub-component for Card (#7921, #12105). Add `CardDescription` class and `addDescription()` to Card. +- [ ] 🆕 **Compass component** (beta) — Conversational/generative UI layout with CompassMainHeader, CompassMainFooter, CompassNav, CompassPanel. Large new component set. Decide whether to implement (likely defer — beta + AI-specific). +- [ ] 🆕 **Docked Navigation** — Space-saving nav that minimizes to icons (#8020, #8149). New layout paradigm. Decide whether to implement. + +--- + +## 3 — New Variants & Modifiers on Existing Components + +### Button +- [ ] 🔧 **Circle variant** — New `.pf-m-circle` modifier (#7922, #12092). Add `circle()` method or variant enum value. +- [ ] 🔧 **Plain variant** — New `.pf-m-plain` on button (#8305). Button may already support `plain()` via `Modifiers.Plain` — verify it applies correctly with new styling. + +### ActionList +- [ ] 🔧 **Vertical variant** — New `.pf-m-vertical` modifier (#7920, #12090). Add `vertical()` or `isVertical()` method. `Modifiers.Vertical` interface exists — implement it on ActionList. + +### Table +- [ ] 🔧 **Plain variant** — New `isPlain` prop (#7925, #12112). Add `plain()` support via `Modifiers.Plain`. +- [ ] 🔧 **Container queries support** — (#8054). CSS-only, verify markup compatibility. +- [ ] 🔧 **Dynamic sticky styling** — (#8321, #12348). New sticky behavior for table headers. Evaluate if Java API changes needed. +- [ ] 🔧 **Indeterminate checkbox for select-all header** — (#12411). Add support for indeterminate state on select-all checkbox. + +### DataList +- [ ] 🔧 **Plain variant** — New `isPlain` prop (#7929, #12112). Add `plain()` support. +- [ ] 🔧 **`isNoPlainOnGlass` prop** — (#12292). Add glass-related modifier. + +### Tabs +- [ ] 🔧 **Nav variant** — New `.pf-m-nav` modifier (#7924, #12111). Add nav variant support. +- [ ] 🔧 **`tabListAriaLabel` prop** — (#12193). Add aria-label support for tab list. +- [ ] 🔧 **Updated `aria-selected` and label attributes** — (#7975). Verify current implementation matches new behavior. + +### Drawer +- [ ] 🔧 **Pill variant** — New `.pf-m-pill` modifier (#7945, #12091). Add `pill()` method. +- [ ] 🔧 **Glass panel support** — `noGlass` / glass props (#7963, #12125, #12305). Add glass-related methods. +- [ ] 🔧 **Plain variant on DrawerSection** — (#8318). Add `plain()` to drawer section. +- [ ] 🔧 **`inert` attribute when closed** — (#12027). Add `inert` attribute to DrawerPanelContent when drawer is closed. +- [ ] 🔧 **Splitter restyled** — (#8198). CSS-only, verify compatibility. + +### Wizard +- [ ] ⚠️ **Warning step status** — (#12041). `ValidationStatus.warning` already exists in PatternFly Java — verify the wizard step properly supports it with correct icon. +- [ ] 🔧 **Plain styling** — (#8215, #12289). Add `plain()` support to Wizard. + +### Progress +- [ ] 🔧 **`hideStatusIcon` flag** — (#12038). Add method to hide the status icon. +- [ ] 🔧 **Fixed danger icon** — (#7900, #12073). Verify PatternFly Java uses `fa-exclamation-circle` for danger status. + +### ExpandableSection +- [ ] 🔧 **Aria labeling props** — (#12071). Add aria label support. +- [ ] 🔧 **Functional `toggleContent`** — (#12063). Allow function-based toggle content. +- [ ] 🔧 **More control over toggle icon** — (#12051). Add icon customization to toggle. + +### Banner +- [ ] 🔧 **Pill variant** — New `.pf-m-pill` modifier (#8353). Add `pill()` method. + +### Accordion +- [ ] 🔧 **`isPlain` and `isNoPlainOnGlass` props** — (#12288). Add `plain()` and glass-related modifier. + +### ToggleGroup +- [ ] 🔧 **Full width variant** — `.pf-m-full-width` (#8326, #12374). `Modifiers.FullWidth` already exists — implement it on ToggleGroup. + +### Pagination +- [ ] 🔧 **Dynamic sticky style** — (#8320, #12388). New sticky behavior. +- [ ] 🔧 **Plain variant** — (#8320, #12388). Add `plain()` support. + +### Toolbar +- [ ] 🔧 **Dynamic sticky support** — (#8321, #12375). New sticky behavior for toolbars. +- [ ] 🔧 **Responsive height via breakpoints** — (#8295, #12347). Add breakpoint-based height. + +### Card +- [ ] 🔧 **`isGlass` prop** — (#12290). Add `glass()` method. +- [ ] ⚠️ **Card header wrap** — Card header wrap examples now require `.pf-v6-c-card__header-main` wrapper (#7897). Verify card header structure. +- [ ] 🔧 **Clickable/selectable plain card border update** — (#8301). CSS-only, verify compatibility. + +### Panel +- [ ] 🔧 **Updated for Compass usage** — (#8303, #12372). Panel gained compass-related features. Evaluate impact. + +### Page +- [ ] 🔧 **Glass mode support for sticky sections** — (#8345, #12293). Add glass styling support. +- [ ] 🔧 **Dynamic sticky section support** — (#12409). New sticky behavior for page sections. +- [ ] 🔧 **Responsive docked nav support** — (#12327). Add support for docked navigation in page layout. + +### NotificationBadge +- [ ] 🔧 **Plain variant** — (#12139). Add `plain()` support. + +### TreeView +- [ ] 🔧 **Disabled visual appearance** — (#8030, #12140). Already implemented in Java (`TreeViewItem.disabled()`), but verify the CSS class `.pf-m-disabled` on `
  • ` matches new PatternFly behavior. + +### MenuToggle +- [ ] 🔧 **Form styling support** — (#12326). Add styling for use within forms. + +### ClipboardCopy +- [ ] 🔧 **Text input callbacks and props** — (#12180). Add callback support for text input changes. + +### CalendarMonth +- [ ] 🔧 **Select `appendTo` passthrough** — (#12391). Add container option for select dropdown. + +### Label +- [ ] 🔧 **`LabelColor` and `LabelStatus` enums** — (#12338). Add typed enums if not already present. +- [ ] 🔧 **Render add-variant as button** — (#12192). Verify add-label variant renders as `\n
    \n \n
    \n \n \n
    \n

    Title

    \n
    \n
    Body
    \n
    Footer
    \n" + }, + { + "slug": "with-title-in-head", + "title": "With title in head", + "html": "
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    This is a really really really really really really really really really really long title

    \n
    \n
    \n
    \n
    Body
    \n
    Footer
    \n
    " + }, + { + "slug": "with-subtitle", + "title": "With subtitle", + "html": "
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    This is a really really really really really really really really really really long title

    \n
    This is a card subtitle.
    \n
    \n
    \n
    \n
    Body
    \n
    Footer
    \n
    \n
    \n
    \n
    \n
    \n \n PatternFly\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    Title

    \n
    Subtitle
    \n
    \n
    Body
    \n
    Footer
    \n
    " + }, + { + "slug": "with-only-actions-in-head-no-titlefooter", + "title": "With only actions in head (no title/footer)", + "html": "
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    This is the card body. There are only actions in the card head.
    \n
    " + }, + { + "slug": "card-with-header-that-wraps", + "title": "Card with header that wraps", + "html": "
    \n
    \n
    \n \n\n \n\n \n
    \n
    \n
    \n

    This is a longer card title that takes up more space

    \n
    \n
    \n
    \n
    This is the card body
    \n
    " + }, + { + "slug": "actions-with-no-offset", + "title": "Actions with no offset", + "html": "
    \n
    \n
    \n \n
    \n
    \n

    This is a card title

    \n
    \n
    \n
    Body
    \n
    Footer
    \n
    " + }, + { + "slug": "with-only-image-in-head", + "title": "With only image in head", + "html": "
    \n
    \n
    \n \n PatternFly\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n
    \n
    \n

    Title

    \n
    \n
    Body
    \n
    Footer
    \n
    " + }, + { + "slug": "with-no-footer", + "title": "With no footer", + "html": "" + }, + { + "slug": "with-no-title", + "title": "With no title", + "html": "
    \n
    This card has no title
    \n
    Footer
    \n
    " + }, + { + "slug": "with-only-a-content-section", + "title": "With only a content section", + "html": "
    \n
    Body
    \n
    " + }, + { + "slug": "with-multiple-body-sections", + "title": "With multiple body sections", + "html": "
    \n
    \n

    Title

    \n
    \n
    Body
    \n
    Body
    \n
    Body
    \n
    Footer
    \n
    " + }, + { + "slug": "with-only-one-body-that-fills", + "title": "With only one body that fills", + "html": "
    \n
    \n

    Title

    \n
    \n
    Body pf-m-no-fill
    \n
    Body pf-m-no-fill
    \n
    Body
    \n
    Footer
    \n
    " + }, + { + "slug": "compact", + "title": "Compact", + "html": "
    \n
    \n

    Title

    \n
    \n
    Body
    \n
    Footer
    \n
    " + }, + { + "slug": "large", + "title": "Large", + "html": "
    \n
    \n

    Title

    \n
    \n
    Body
    \n
    Footer
    \n
    " + }, + { + "slug": "selectable", + "title": "Selectable", + "html": "" + }, + { + "slug": "selectable-secondary-style", + "title": "Selectable secondary style", + "html": "" + }, + { + "slug": "single-selectable", + "title": "Single selectable", + "html": "" + }, + { + "slug": "actionable-button", + "title": "Actionable (button)", + "html": "" + }, + { + "slug": "actionable-link", + "title": "Actionable (link)", + "html": "" + }, + { + "slug": "actionable-secondary-style", + "title": "Actionable secondary style", + "html": "" + }, + { + "slug": "actionable-and-selectable", + "title": "Actionable and selectable", + "html": "" + }, + { + "slug": "actionable-and-selectable-secondary-style", + "title": "Actionable and selectable secondary style", + "html": "" + }, + { + "slug": "secondary", + "title": "Secondary", + "html": "
    \n
    \n

    Title

    \n
    \n
    Body
    \n
    Footer
    \n
    " + }, + { + "slug": "plain", + "title": "Plain", + "html": "
    \n
    \n

    Title

    \n
    \n
    Body
    \n
    Footer
    \n
    " + }, + { + "slug": "expandable", + "title": "Expandable", + "html": "
    \n
    \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    Title

    \n
    \n
    \n
    \n
    " + }, + { + "slug": "expandable-with-image", + "title": "Expandable with image", + "html": "
    \n
    \n
    \n \n
    \n
    \n \"PatternFly\n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    " + }, + { + "slug": "expanded", + "title": "Expanded", + "html": "
    \n
    \n
    \n \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n

    Title

    \n
    \n
    \n
    \n
    Body
    \n
    Footer
    \n
    \n
    " + }, + { + "slug": "full-height-card", + "title": "Full height card", + "html": "
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    Title

    \n
    \n
    \n
    \n
    Body
    \n
    Footer
    \n
    " + }, + { + "slug": "expandable-toggle-on-right", + "title": "Expandable toggle on right", + "html": "
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
    \n

    Title

    \n
    \n
    \n
    \n \n
    \n
    \n
    " + }, + { + "slug": "card-with-dividers-between-sections", + "title": "Card with dividers between sections", + "html": "
    \n
    \n

    Title

    \n
    \n
    \n
    Body
    \n
    \n
    Body
    \n
    \n
    Footer
    \n
    " + } + ], + "snippets": [ + { + "id": "card-basic", + "title": "Basic cards", + "html": "
    Title
    Body
    Footer
    " + }, + { + "id": "card-modifiers", + "title": "Modifiers", + "html": "
    Title
    Body
    Footer
    " + }, + { + "id": "card-subtitle", + "title": "With subtitle", + "html": "
    Title
    This is a card subtitle.
    Body
    Footer
    " + }, + { + "id": "card-header-image", + "title": "Header images and actions", + "html": "
    \"PatternFly\"
    Title
    Body
    Footer
    " + }, + { + "id": "card-title-inline", + "title": "Title inline with images and actions", + "html": "
    This is a really really really really really really really really really really long header
    Body
    Footer
    " + }, + { + "id": "card-header-no-title", + "title": "Card header without title", + "html": "
    This is the card body. There are only actions in the card head.
    " + }, + { + "id": "card-heading", + "title": "With HTML heading element", + "html": "

    Title within an <h4> element

    Body
    Footer
    " + }, + { + "id": "card-multiple-bodies", + "title": "With multiple body sections", + "html": "
    Title
    Body
    Body
    Body
    Footer
    " + }, + { + "id": "card-primary-body-fill", + "title": "With a primary body section that fills", + "html": "
    Title
    Body pf-m-no-fill
    Body pf-m-no-fill
    Body
    Footer
    " + }, + { + "id": "card-selectable", + "title": "Selectable", + "html": "
    First card
    This card is selectable.
    Second card
    This card is selectable.
    Third card
    This card is selectable but disabled.
    " + }, + { + "id": "card-single-selectable", + "title": "Single selectable", + "html": "
    First card
    This card is single selectable.
    Second card
    This card is single selectable.
    Third card
    This card is single selectable but disabled.
    " + }, + { + "id": "card-clickable", + "title": "Clickable", + "html": "
    First card
    This card performs an action on click.
    Second card
    This card can navigate to a link on click.
    Third card
    This card is single clickable but disabled.
    " + }, + { + "id": "card-clickable-selectable", + "title": "Clickable and selectable", + "html": "
    This card performs an action upon clicking the card title and is selectable.
    Second card
    This card is selectable and has a link in the card body that navigates to PatternFly.
    Third card
    This card is clickable and selectable, but disabled.
    " + }, + { + "id": "card-expandable", + "title": "Expandable cards", + "html": "
    Title

    Title
    " + }, + { + "id": "card-expandable-image", + "title": "Expandable with icon", + "html": "
    \"PatternFly
    " + }, + { + "id": "card-secondary", + "title": "Secondary", + "html": "
    Title
    Body
    Footer
    " + }, + { + "id": "card-dividers", + "title": "With dividers between sections", + "html": "
    Title

    Body

    Body

    Footer
    " + } + ], + "matches": [ + { + "pfVariation": { + "slug": "basic", + "title": "Basic" + }, + "pfjSnippet": { + "id": "card-basic", + "title": "Basic cards" + }, + "matchType": "semantic", + "status": "matched" + }, + { + "pfVariation": { + "slug": "with-image-and-action", + "title": "With image and action" + }, + "pfjSnippet": { + "id": "card-header-image", + "title": "Header images and actions" + }, + "matchType": "semantic", + "status": "matched" + }, + { + "pfVariation": { + "slug": "with-title-in-head", + "title": "With title in head" + }, + "pfjSnippet": { + "id": "card-subtitle", + "title": "With subtitle" + }, + "matchType": "semantic", + "status": "matched" + }, + { + "pfVariation": { + "slug": "card-with-header-that-wraps", + "title": "Card with header that wraps" + }, + "pfjSnippet": { + "id": "card-header-no-title", + "title": "Card header without title" + }, + "matchType": "semantic", + "status": "matched" + }, + { + "pfVariation": { + "slug": "with-only-a-content-section", + "title": "With only a content section" + }, + "pfjSnippet": { + "id": "card-dividers", + "title": "With dividers between sections" + }, + "matchType": "semantic", + "status": "matched" + }, + { + "pfVariation": { + "slug": "with-multiple-body-sections", + "title": "With multiple body sections" + }, + "pfjSnippet": { + "id": "card-multiple-bodies", + "title": "With multiple body sections" + }, + "matchType": "exact", + "status": "matched" + }, + { + "pfVariation": { + "slug": "with-only-one-body-that-fills", + "title": "With only one body that fills" + }, + "pfjSnippet": { + "id": "card-primary-body-fill", + "title": "With a primary body section that fills" + }, + "matchType": "semantic", + "status": "matched" + }, + { + "pfVariation": { + "slug": "selectable", + "title": "Selectable" + }, + "pfjSnippet": { + "id": "card-selectable", + "title": "Selectable" + }, + "matchType": "exact", + "status": "matched" + }, + { + "pfVariation": { + "slug": "selectable-secondary-style", + "title": "Selectable secondary style" + }, + "pfjSnippet": { + "id": "card-secondary", + "title": "Secondary" + }, + "matchType": "semantic", + "status": "matched" + }, + { + "pfVariation": { + "slug": "single-selectable", + "title": "Single selectable" + }, + "pfjSnippet": { + "id": "card-single-selectable", + "title": "Single selectable" + }, + "matchType": "exact", + "status": "matched" + }, + { + "pfVariation": { + "slug": "actionable-and-selectable", + "title": "Actionable and selectable" + }, + "pfjSnippet": { + "id": "card-clickable-selectable", + "title": "Clickable and selectable" + }, + "matchType": "semantic", + "status": "matched" + }, + { + "pfVariation": { + "slug": "expandable", + "title": "Expandable" + }, + "pfjSnippet": { + "id": "card-expandable", + "title": "Expandable cards" + }, + "matchType": "semantic", + "status": "matched" + }, + { + "pfVariation": { + "slug": "expandable-with-image", + "title": "Expandable with image" + }, + "pfjSnippet": { + "id": "card-expandable-image", + "title": "Expandable with icon" + }, + "matchType": "semantic", + "status": "matched" + }, + { + "pfVariation": { + "slug": "with-subtitle", + "title": "With subtitle" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "with-only-actions-in-head-no-titlefooter", + "title": "With only actions in head (no title/footer)" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "actions-with-no-offset", + "title": "Actions with no offset" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "with-only-image-in-head", + "title": "With only image in head" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "with-no-footer", + "title": "With no footer" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "with-no-title", + "title": "With no title" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "compact", + "title": "Compact" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "large", + "title": "Large" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "actionable-button", + "title": "Actionable (button)" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "actionable-link", + "title": "Actionable (link)" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "actionable-secondary-style", + "title": "Actionable secondary style" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "actionable-and-selectable-secondary-style", + "title": "Actionable and selectable secondary style" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "secondary", + "title": "Secondary" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "plain", + "title": "Plain" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "expanded", + "title": "Expanded" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "full-height-card", + "title": "Full height card" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "expandable-toggle-on-right", + "title": "Expandable toggle on right" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "card-with-dividers-between-sections", + "title": "Card with dividers between sections" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + } + ], + "comparisons": [ + { + "status": "differences_found", + "missingClasses": [], + "extraClasses": [], + "structuralDiffs": [ + "PF has

    \u2014 missing in PFJ", + "PFJ has
    \u2014 not in PF" + ], + "attributeDiffs": [], + "iconDiffs": [], + "variation": "Basic" + }, + { + "status": "differences_found", + "missingClasses": [], + "extraClasses": [ + { + "class": "pf-m-bottom-left", + "element": "
    ", + "context": "present in PFJ, absent in PF" + }, + { + "class": "pf-m-css-positioning", + "element": "
    ", + "context": "present in PFJ, absent in PF" + }, + { + "class": "pf-m-disabled", + "element": "
  • ", + "context": "present in PFJ, absent in PF" + }, + { + "class": "pf-v6-c-brand", + "element": "", + "context": "present in PFJ, absent in PF" + }, + { + "class": "pf-v6-c-check__label", + "element": "
  • ", + "context": "present in PFJ, absent in PF" + }, + { + "class": "pf-v6-c-menu", + "element": "
    ", + "context": "present in PFJ, absent in PF" + }, + { + "class": "pf-v6-c-menu__content", + "element": "
    ", + "context": "present in PFJ, absent in PF" + }, + { + "class": "pf-v6-c-menu__item", + "element": "\n
    \n
    \n \n
    \n
    \n
  • \n
    \n
    apiVersion: helm.openshift.io/v1beta1/\nkind: HelmChartRepository\nmetadata:\nname: azure-sample-repo\nspec:\nconnectionConfig:\nurl: https://raw.githubusercontent.com/Azure-Samples/helm-charts/master/docs\n
    \n
    \n
    " + }, + { + "slug": "expandable", + "title": "Expandable", + "html": "
    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    apiVersion: helm.openshift.io/v1beta1/\nkind: HelmChartRepository\nmetadata:\nname: azure-sample-repo
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    " + }, + { + "slug": "expandable-expanded", + "title": "Expandable expanded", + "html": "
    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    apiVersion: helm.openshift.io/v1beta1/\nkind: HelmChartRepository\nmetadata:\nname: azure-sample-repo
    \n spec:\n connectionConfig:\n url: https://raw.githubusercontent.com/Azure-Samples/helm-charts/master/docs
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    " + } + ], + "snippets": [ + { + "id": "code-block-basic", + "title": "Basic", + "html": "
    Copy to clipboard
    apiVersion: helm.openshift.io/v1beta1/\nkind: HelmChartRepository\nmetadata:\nname: azure-sample-repo0oooo00ooo\nspec:\nconnectionConfig:\nurl: https://raw.githubusercontent.com/Azure-Samples/helm-charts/master/docs
    " + }, + { + "id": "code-block-expandable", + "title": "Expandable", + "html": "
    Copy to clipboard
    apiVersion: helm.openshift.io/v1beta1/\nkind: HelmChartRepository\nmetadata:
    " + } + ], + "matches": [ + { + "pfVariation": { + "slug": "basic", + "title": "Basic" + }, + "pfjSnippet": { + "id": "code-block-basic", + "title": "Basic" + }, + "matchType": "exact", + "status": "matched" + }, + { + "pfVariation": { + "slug": "expandable", + "title": "Expandable" + }, + "pfjSnippet": { + "id": "code-block-expandable", + "title": "Expandable" + }, + "matchType": "exact", + "status": "matched" + }, + { + "pfVariation": { + "slug": "expandable-expanded", + "title": "Expandable expanded" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + } + ], + "comparisons": [ + { + "status": "differences_found", + "missingClasses": [], + "extraClasses": [ + { + "class": "pf-m-css-positioning", + "element": "
    ", + "context": "present in PFJ, absent in PF" + }, + { + "class": "pf-m-top", + "element": "
    ", + "context": "present in PFJ, absent in PF" + }, + { + "class": "pf-v6-c-tooltip", + "element": "
    ", + "context": "present in PFJ, absent in PF" + }, + { + "class": "pf-v6-c-tooltip__arrow", + "element": "
    ", + "context": "present in PFJ, absent in PF" + }, + { + "class": "pf-v6-c-tooltip__content", + "element": "
    ", + "context": "present in PFJ, absent in PF" + } + ], + "structuralDiffs": [ + "PFJ has
    \u2014 not in PF" + ], + "attributeDiffs": [ + "aria-label=\"Copy to clipboard basic example code content\" on \n
    \n
    \n
    \n
    This is a helpful description of the drawer panel.
    \n
    Drawer panel body content
    \n
    \n
    \n
    " + }, + { + "slug": "expanded-panel-on-right", + "title": "Expanded panel on right", + "html": "
    \n
    \n
    \n
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pretium est a porttitor vehicula. Quisque vel commodo urna. Morbi mattis rutrum ante, id vehicula ex accumsan ut. Morbi viverra, eros vel porttitor facilisis, eros purus aliquet erat, nec lobortis felis elit pulvinar sem. Vivamus vulputate, risus eget commodo eleifend, eros nibh porta quam, vitae lacinia leo libero at magna. Maecenas aliquam sagittis orci, et posuere nisi ultrices sit amet. Aliquam ex odio, malesuada sed posuere quis, pellentesque at mauris. Phasellus venenatis massa ex, eget pulvinar libero auctor pretium. Aliquam erat volutpat. Duis euismod justo in quam ullamcorper, in commodo massa vulputate.
    \n
    \n
    \n
    \n Drawer panel header content\n
    \n
    \n \n
    \n
    \n
    \n
    This is a helpful description of the drawer panel.
    \n
    Drawer panel body content
    \n
    \n
    \n
    " + }, + { + "slug": "closed-panel-on-left", + "title": "Closed panel on left", + "html": "
    \n
    \n
    \n
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pretium est a porttitor vehicula. Quisque vel commodo urna. Morbi mattis rutrum ante, id vehicula ex accumsan ut. Morbi viverra, eros vel porttitor facilisis, eros purus aliquet erat, nec lobortis felis elit pulvinar sem. Vivamus vulputate, risus eget commodo eleifend, eros nibh porta quam, vitae lacinia leo libero at magna. Maecenas aliquam sagittis orci, et posuere nisi ultrices sit amet. Aliquam ex odio, malesuada sed posuere quis, pellentesque at mauris. Phasellus venenatis massa ex, eget pulvinar libero auctor pretium. Aliquam erat volutpat. Duis euismod justo in quam ullamcorper, in commodo massa vulputate.
    \n
    \n \n
    \n
    " + }, + { + "slug": "expanded-panel-on-left", + "title": "Expanded panel on left", + "html": "
    \n
    \n
    \n
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pretium est a porttitor vehicula. Quisque vel commodo urna. Morbi mattis rutrum ante, id vehicula ex accumsan ut. Morbi viverra, eros vel porttitor facilisis, eros purus aliquet erat, nec lobortis felis elit pulvinar sem. Vivamus vulputate, risus eget commodo eleifend, eros nibh porta quam, vitae lacinia leo libero at magna. Maecenas aliquam sagittis orci, et posuere nisi ultrices sit amet. Aliquam ex odio, malesuada sed posuere quis, pellentesque at mauris. Phasellus venenatis massa ex, eget pulvinar libero auctor pretium. Aliquam erat volutpat. Duis euismod justo in quam ullamcorper, in commodo massa vulputate.
    \n
    \n
    \n
    \n Drawer panel header content\n
    \n
    \n \n
    \n
    \n
    \n
    This is a helpful description of the drawer panel.
    \n
    Drawer panel body content
    \n
    \n
    \n
    " + }, + { + "slug": "closed-panel-on-bottom", + "title": "Closed panel on bottom", + "html": "
    \n
    \n
    \n
    \n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pretium est a porttitor vehicula. Quisque vel commodo urna. Morbi mattis rutrum ante, id vehicula ex accumsan ut. Morbi viverra, eros vel porttitor facilisis, eros purus aliquet erat, nec lobortis felis elit pulvinar sem. Vivamus vulputate, risus eget commodo eleifend, eros nibh porta quam, vitae lacinia leo libero at magna. Maecenas aliquam sagittis orci, et posuere nisi ultrices sit amet. Aliquam ex odio, malesuada sed posuere quis, pellentesque at mauris. Phasellus venenatis massa ex, eget pulvinar libero auctor pretium. Aliquam erat volutpat. Duis euismod justo in quam ullamcorper, in commodo massa vulputate.\n
    \n
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pretium est a porttitor vehicula. Quisque vel commodo urna. Morbi mattis rutrum ante, id vehicula ex accumsan ut. Morbi viverra, eros vel porttitor facilisis, eros purus aliquet erat, nec lobortis felis elit pulvinar sem. Vivamus vulputate, risus eget commodo eleifend, eros nibh porta quam, vitae lacinia leo libero at magna. Maecenas aliquam sagittis orci, et posuere nisi ultrices sit amet. Aliquam ex odio, malesuada sed posuere quis, pellentesque at mauris. Phasellus venenatis massa ex, eget pulvinar libero auctor pretium. Aliquam erat volutpat. Duis euismod justo in quam ullamcorper, in commodo massa vulputate.\n
    \n
    \n \n
    \n
    " + }, + { + "slug": "expanded-panel-on-bottom", + "title": "Expanded panel on bottom", + "html": "
    \n
    \n
    \n
    \n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pretium est a porttitor vehicula. Quisque vel commodo urna. Morbi mattis rutrum ante, id vehicula ex accumsan ut. Morbi viverra, eros vel porttitor facilisis, eros purus aliquet erat, nec lobortis felis elit pulvinar sem. Vivamus vulputate, risus eget commodo eleifend, eros nibh porta quam, vitae lacinia leo libero at magna. Maecenas aliquam sagittis orci, et posuere nisi ultrices sit amet. Aliquam ex odio, malesuada sed posuere quis, pellentesque at mauris. Phasellus venenatis massa ex, eget pulvinar libero auctor pretium. Aliquam erat volutpat. Duis euismod justo in quam ullamcorper, in commodo massa vulputate.\n
    \n
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pretium est a porttitor vehicula. Quisque vel commodo urna. Morbi mattis rutrum ante, id vehicula ex accumsan ut. Morbi viverra, eros vel porttitor facilisis, eros purus aliquet erat, nec lobortis felis elit pulvinar sem. Vivamus vulputate, risus eget commodo eleifend, eros nibh porta quam, vitae lacinia leo libero at magna. Maecenas aliquam sagittis orci, et posuere nisi ultrices sit amet. Aliquam ex odio, malesuada sed posuere quis, pellentesque at mauris. Phasellus venenatis massa ex, eget pulvinar libero auctor pretium. Aliquam erat volutpat. Duis euismod justo in quam ullamcorper, in commodo massa vulputate.\n
    \n
    \n\n
    \n
    \n Drawer panel header content\n
    \n
    \n \n
    \n
    \n
    \n
    This is a helpful description of the drawer panel.
    \n
    Drawer panel body content
    \n
    \n
    \n
    " + }, + { + "slug": "expanded-inline-panel", + "title": "Expanded inline panel", + "html": "
    \n
    \n
    \n
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pretium est a porttitor vehicula. Quisque vel commodo urna. Morbi mattis rutrum ante, id vehicula ex accumsan ut. Morbi viverra, eros vel porttitor facilisis, eros purus aliquet erat, nec lobortis felis elit pulvinar sem. Vivamus vulputate, risus eget commodo eleifend, eros nibh porta quam, vitae lacinia leo libero at magna. Maecenas aliquam sagittis orci, et posuere nisi ultrices sit amet. Aliquam ex odio, malesuada sed posuere quis, pellentesque at mauris. Phasellus venenatis massa ex, eget pulvinar libero auctor pretium. Aliquam erat volutpat. Duis euismod justo in quam ullamcorper, in commodo massa vulputate.
    \n
    \n
    \n
    \n Drawer panel header content\n
    \n
    \n \n
    \n
    \n
    \n
    This is a helpful description of the drawer panel.
    \n
    Drawer panel body content
    \n
    \n
    \n
    " + }, + { + "slug": "expanded-inline-panel-on-left", + "title": "Expanded inline panel on left", + "html": "
    \n
    \n
    \n
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pretium est a porttitor vehicula. Quisque vel commodo urna. Morbi mattis rutrum ante, id vehicula ex accumsan ut. Morbi viverra, eros vel porttitor facilisis, eros purus aliquet erat, nec lobortis felis elit pulvinar sem. Vivamus vulputate, risus eget commodo eleifend, eros nibh porta quam, vitae lacinia leo libero at magna. Maecenas aliquam sagittis orci, et posuere nisi ultrices sit amet. Aliquam ex odio, malesuada sed posuere quis, pellentesque at mauris. Phasellus venenatis massa ex, eget pulvinar libero auctor pretium. Aliquam erat volutpat. Duis euismod justo in quam ullamcorper, in commodo massa vulputate.
    \n
    \n
    \n
    \n Drawer panel header content\n
    \n
    \n \n
    \n
    \n
    \n
    This is a helpful description of the drawer panel.
    \n
    Drawer panel body content
    \n
    \n
    \n
    " + }, + { + "slug": "static", + "title": "Static", + "html": "
    \n
    \n
    \n
    Static drawers don't have interactive elements. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pretium est a porttitor vehicula. Quisque vel commodo urna. Morbi mattis rutrum ante, id vehicula ex accumsan ut. Morbi viverra, eros vel porttitor facilisis, eros purus aliquet erat, nec lobortis felis elit pulvinar sem. Vivamus vulputate, risus eget commodo eleifend, eros nibh porta quam, vitae lacinia leo libero at magna. Maecenas aliquam sagittis orci, et posuere nisi ultrices sit amet. Aliquam ex odio, malesuada sed posuere quis, pellentesque at mauris. Phasellus venenatis massa ex, eget pulvinar libero auctor pretium. Aliquam erat volutpat. Duis euismod justo in quam ullamcorper, in commodo massa vulputate.
    \n
    \n
    \n
    \n Drawer panel header content\n
    \n
    \n \n
    \n
    \n
    \n
    This is a helpful description of the drawer panel.
    \n
    Drawer panel body content
    \n
    \n
    \n
    " + }, + { + "slug": "stacked-content-body-elements", + "title": "Stacked content body elements", + "html": "
    \n
    \n
    \n
    content-body
    \n
    content-body with padding
    \n
    content-body
    \n
    \n\n
    \n
    \n Drawer panel header content\n
    \n
    \n \n
    \n
    \n
    \n
    Drawer panel body content
    \n
    Drawer panel body content with no padding
    \n
    Drawer panel body content
    \n
    \n
    \n
    " + }, + { + "slug": "modified-content-body-padding", + "title": "Modified content body padding", + "html": "
    \n
    \n
    \n
    \n Drawer content padding. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pretium est a porttitor vehicula. Quisque vel commodo urna. Morbi mattis rutrum ante, id vehicula ex accumsan ut. Morbi viverra, eros vel porttitor facilisis, eros purus aliquet erat, nec lobortis felis elit pulvinar sem. Vivamus vulputate, risus eget commodo eleifend, eros nibh porta quam, vitae lacinia leo libero at magna. Maecenas aliquam sagittis orci, et posuere nisi ultrices sit amet. Aliquam ex odio, malesuada sed posuere quis, pellentesque at mauris. Phasellus venenatis massa ex, eget pulvinar libero auctor pretium. Aliquam erat volutpat. Duis euismod justo in quam ullamcorper, in commodo massa vulputate.\n
    \n
    \n
    \n
    \n Drawer panel header content\n
    \n
    \n \n
    \n
    \n
    \n
    This is a helpful description of the drawer panel.
    \n
    Drawer panel body content
    \n
    \n
    \n
    " + }, + { + "slug": "modified-panel-body-padding", + "title": "Modified panel body padding", + "html": "
    \n
    \n
    \n
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pretium est a porttitor vehicula. Quisque vel commodo urna. Morbi mattis rutrum ante, id vehicula ex accumsan ut. Morbi viverra, eros vel porttitor facilisis, eros purus aliquet erat, nec lobortis felis elit pulvinar sem. Vivamus vulputate, risus eget commodo eleifend, eros nibh porta quam, vitae lacinia leo libero at magna. Maecenas aliquam sagittis orci, et posuere nisi ultrices sit amet. Aliquam ex odio, malesuada sed posuere quis, pellentesque at mauris. Phasellus venenatis massa ex, eget pulvinar libero auctor pretium. Aliquam erat volutpat. Duis euismod justo in quam ullamcorper, in commodo massa vulputate.
    \n
    \n
    \n
    \n Drawer panel header content\n
    \n
    \n \n
    \n
    \n
    \n
    Drawer panel body content
    \n
    Drawer panel body content with modified inline start padding
    \n
    \n
    \n
    " + }, + { + "slug": "modified-panel-width", + "title": "Modified panel width", + "html": "
    \n
    \n
    \n
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pretium est a porttitor vehicula. Quisque vel commodo urna. Morbi mattis rutrum ante, id vehicula ex accumsan ut. Morbi viverra, eros vel porttitor facilisis, eros purus aliquet erat, nec lobortis felis elit pulvinar sem. Vivamus vulputate, risus eget commodo eleifend, eros nibh porta quam, vitae lacinia leo libero at magna. Maecenas aliquam sagittis orci, et posuere nisi ultrices sit amet. Aliquam ex odio, malesuada sed posuere quis, pellentesque at mauris. Phasellus venenatis massa ex, eget pulvinar libero auctor pretium. Aliquam erat volutpat. Duis euismod justo in quam ullamcorper, in commodo massa vulputate.
    \n
    \n
    \n
    \n Drawer panel header content\n
    \n
    \n \n
    \n
    \n
    \n
    This is a helpful description of the drawer panel.
    \n
    Drawer panel body content
    \n
    \n
    \n
    " + }, + { + "slug": "additional-section-above-main", + "title": "Additional section above main", + "html": "
    \n
    drawer-section
    \n
    \n
    \n
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pretium est a porttitor vehicula. Quisque vel commodo urna. Morbi mattis rutrum ante, id vehicula ex accumsan ut. Morbi viverra, eros vel porttitor facilisis, eros purus aliquet erat, nec lobortis felis elit pulvinar sem. Vivamus vulputate, risus eget commodo eleifend, eros nibh porta quam, vitae lacinia leo libero at magna. Maecenas aliquam sagittis orci, et posuere nisi ultrices sit amet. Aliquam ex odio, malesuada sed posuere quis, pellentesque at mauris. Phasellus venenatis massa ex, eget pulvinar libero auctor pretium. Aliquam erat volutpat. Duis euismod justo in quam ullamcorper, in commodo massa vulputate.
    \n
    \n
    \n
    \n Drawer panel header content\n
    \n
    \n \n
    \n
    \n
    \n
    This is a helpful description of the drawer panel.
    \n
    Drawer panel body content
    \n
    \n
    \n
    " + }, + { + "slug": "resizable-panel", + "title": "Resizable panel", + "html": "
    \n
    \n
    \n
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pretium est a porttitor vehicula. Quisque vel commodo urna. Morbi mattis rutrum ante, id vehicula ex accumsan ut. Morbi viverra, eros vel porttitor facilisis, eros purus aliquet erat, nec lobortis felis elit pulvinar sem. Vivamus vulputate, risus eget commodo eleifend, eros nibh porta quam, vitae lacinia leo libero at magna. Maecenas aliquam sagittis orci, et posuere nisi ultrices sit amet. Aliquam ex odio, malesuada sed posuere quis, pellentesque at mauris. Phasellus venenatis massa ex, eget pulvinar libero auctor pretium. Aliquam erat volutpat. Duis euismod justo in quam ullamcorper, in commodo massa vulputate.
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n Drawer panel header content\n
    \n
    \n \n
    \n
    \n
    \n
    This is a helpful description of the drawer panel.
    \n
    Drawer panel body content
    \n
    \n
    \n
    \n
    " + }, + { + "slug": "resizable-left-panel", + "title": "Resizable left panel", + "html": "
    \n
    \n
    \n
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pretium est a porttitor vehicula. Quisque vel commodo urna. Morbi mattis rutrum ante, id vehicula ex accumsan ut. Morbi viverra, eros vel porttitor facilisis, eros purus aliquet erat, nec lobortis felis elit pulvinar sem. Vivamus vulputate, risus eget commodo eleifend, eros nibh porta quam, vitae lacinia leo libero at magna. Maecenas aliquam sagittis orci, et posuere nisi ultrices sit amet. Aliquam ex odio, malesuada sed posuere quis, pellentesque at mauris. Phasellus venenatis massa ex, eget pulvinar libero auctor pretium. Aliquam erat volutpat. Duis euismod justo in quam ullamcorper, in commodo massa vulputate.
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n Drawer panel header content\n
    \n
    \n \n
    \n
    \n
    \n
    This is a helpful description of the drawer panel.
    \n
    Drawer panel body content
    \n
    \n
    \n
    \n
    " + }, + { + "slug": "resizable-bottom-panel", + "title": "Resizable bottom panel", + "html": "
    \n
    \n
    \n
    \n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pretium est a porttitor vehicula. Quisque vel commodo urna. Morbi mattis rutrum ante, id vehicula ex accumsan ut. Morbi viverra, eros vel porttitor facilisis, eros purus aliquet erat, nec lobortis felis elit pulvinar sem. Vivamus vulputate, risus eget commodo eleifend, eros nibh porta quam, vitae lacinia leo libero at magna. Maecenas aliquam sagittis orci, et posuere nisi ultrices sit amet. Aliquam ex odio, malesuada sed posuere quis, pellentesque at mauris. Phasellus venenatis massa ex, eget pulvinar libero auctor pretium. Aliquam erat volutpat. Duis euismod justo in quam ullamcorper, in commodo massa vulputate.\n
    \n
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pretium est a porttitor vehicula. Quisque vel commodo urna. Morbi mattis rutrum ante, id vehicula ex accumsan ut. Morbi viverra, eros vel porttitor facilisis, eros purus aliquet erat, nec lobortis felis elit pulvinar sem. Vivamus vulputate, risus eget commodo eleifend, eros nibh porta quam, vitae lacinia leo libero at magna. Maecenas aliquam sagittis orci, et posuere nisi ultrices sit amet. Aliquam ex odio, malesuada sed posuere quis, pellentesque at mauris. Phasellus venenatis massa ex, eget pulvinar libero auctor pretium. Aliquam erat volutpat. Duis euismod justo in quam ullamcorper, in commodo massa vulputate.\n
    \n
    \n\n
    \n
    \n
    \n
    \n
    \n
    \n Drawer panel header content\n
    \n
    \n \n
    \n
    \n
    \n
    This is a helpful description of the drawer panel.
    \n
    Drawer panel body content
    \n
    \n
    \n
    \n
    " + }, + { + "slug": "resizable-inline-panel", + "title": "Resizable inline panel", + "html": "
    \n
    \n
    \n
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pretium est a porttitor vehicula. Quisque vel commodo urna. Morbi mattis rutrum ante, id vehicula ex accumsan ut. Morbi viverra, eros vel porttitor facilisis, eros purus aliquet erat, nec lobortis felis elit pulvinar sem. Vivamus vulputate, risus eget commodo eleifend, eros nibh porta quam, vitae lacinia leo libero at magna. Maecenas aliquam sagittis orci, et posuere nisi ultrices sit amet. Aliquam ex odio, malesuada sed posuere quis, pellentesque at mauris. Phasellus venenatis massa ex, eget pulvinar libero auctor pretium. Aliquam erat volutpat. Duis euismod justo in quam ullamcorper, in commodo massa vulputate.
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n Drawer panel header content\n
    \n
    \n \n
    \n
    \n
    \n
    This is a helpful description of the drawer panel.
    \n
    Drawer panel body content
    \n
    \n
    \n
    \n
    " + }, + { + "slug": "panel-with-secondary-background", + "title": "Panel with secondary background", + "html": "
    \n
    \n
    \n
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pretium est a porttitor vehicula. Quisque vel commodo urna. Morbi mattis rutrum ante, id vehicula ex accumsan ut. Morbi viverra, eros vel porttitor facilisis, eros purus aliquet erat, nec lobortis felis elit pulvinar sem. Vivamus vulputate, risus eget commodo eleifend, eros nibh porta quam, vitae lacinia leo libero at magna. Maecenas aliquam sagittis orci, et posuere nisi ultrices sit amet. Aliquam ex odio, malesuada sed posuere quis, pellentesque at mauris. Phasellus venenatis massa ex, eget pulvinar libero auctor pretium. Aliquam erat volutpat. Duis euismod justo in quam ullamcorper, in commodo massa vulputate.
    \n
    \n
    \n
    \n Drawer panel header content\n
    \n
    \n \n
    \n
    \n
    \n
    This is a helpful description of the drawer panel.
    \n
    Drawer panel body content
    \n
    \n
    \n
    " + }, + { + "slug": "pill", + "title": "Pill", + "html": "
    \n
    \n
    \n
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pretium est a porttitor vehicula. Quisque vel commodo urna. Morbi mattis rutrum ante, id vehicula ex accumsan ut. Morbi viverra, eros vel porttitor facilisis, eros purus aliquet erat, nec lobortis felis elit pulvinar sem. Vivamus vulputate, risus eget commodo eleifend, eros nibh porta quam, vitae lacinia leo libero at magna. Maecenas aliquam sagittis orci, et posuere nisi ultrices sit amet. Aliquam ex odio, malesuada sed posuere quis, pellentesque at mauris. Phasellus venenatis massa ex, eget pulvinar libero auctor pretium. Aliquam erat volutpat. Duis euismod justo in quam ullamcorper, in commodo massa vulputate.
    \n
    \n
    \n
    \n Drawer panel header content\n
    \n
    \n \n
    \n
    \n
    \n
    This is a helpful description of the drawer panel.
    \n
    Drawer panel body content
    \n
    \n
    \n
    " + }, + { + "slug": "resizable-pill", + "title": "Resizable Pill", + "html": "
    \n
    \n
    \n
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pretium est a porttitor vehicula. Quisque vel commodo urna. Morbi mattis rutrum ante, id vehicula ex accumsan ut. Morbi viverra, eros vel porttitor facilisis, eros purus aliquet erat, nec lobortis felis elit pulvinar sem. Vivamus vulputate, risus eget commodo eleifend, eros nibh porta quam, vitae lacinia leo libero at magna. Maecenas aliquam sagittis orci, et posuere nisi ultrices sit amet. Aliquam ex odio, malesuada sed posuere quis, pellentesque at mauris. Phasellus venenatis massa ex, eget pulvinar libero auctor pretium. Aliquam erat volutpat. Duis euismod justo in quam ullamcorper, in commodo massa vulputate.
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n Drawer panel header content\n
    \n
    \n \n
    \n
    \n
    \n
    This is a helpful description of the drawer panel.
    \n
    Drawer panel body content
    \n
    \n
    \n
    \n
    " + }, + { + "slug": "pill-inline", + "title": "Pill inline", + "html": "
    \n
    \n
    \n
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pretium est a porttitor vehicula. Quisque vel commodo urna. Morbi mattis rutrum ante, id vehicula ex accumsan ut. Morbi viverra, eros vel porttitor facilisis, eros purus aliquet erat, nec lobortis felis elit pulvinar sem. Vivamus vulputate, risus eget commodo eleifend, eros nibh porta quam, vitae lacinia leo libero at magna. Maecenas aliquam sagittis orci, et posuere nisi ultrices sit amet. Aliquam ex odio, malesuada sed posuere quis, pellentesque at mauris. Phasellus venenatis massa ex, eget pulvinar libero auctor pretium. Aliquam erat volutpat. Duis euismod justo in quam ullamcorper, in commodo massa vulputate.
    \n
    \n
    \n
    \n Drawer panel header content\n
    \n
    \n \n
    \n
    \n
    \n
    This is a helpful description of the drawer panel.
    \n
    Drawer panel body content
    \n
    \n
    \n
    " + } + ], + "snippets": [], + "matches": [ + { + "pfVariation": { + "slug": "closed-panel-on-right-default", + "title": "Closed panel on right (default)" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "expanded-panel-on-right", + "title": "Expanded panel on right" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "closed-panel-on-left", + "title": "Closed panel on left" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "expanded-panel-on-left", + "title": "Expanded panel on left" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "closed-panel-on-bottom", + "title": "Closed panel on bottom" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "expanded-panel-on-bottom", + "title": "Expanded panel on bottom" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "expanded-inline-panel", + "title": "Expanded inline panel" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "expanded-inline-panel-on-left", + "title": "Expanded inline panel on left" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "static", + "title": "Static" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "stacked-content-body-elements", + "title": "Stacked content body elements" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "modified-content-body-padding", + "title": "Modified content body padding" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "modified-panel-body-padding", + "title": "Modified panel body padding" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "modified-panel-width", + "title": "Modified panel width" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "additional-section-above-main", + "title": "Additional section above main" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "resizable-panel", + "title": "Resizable panel" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "resizable-left-panel", + "title": "Resizable left panel" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "resizable-bottom-panel", + "title": "Resizable bottom panel" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "resizable-inline-panel", + "title": "Resizable inline panel" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "panel-with-secondary-background", + "title": "Panel with secondary background" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "pill", + "title": "Pill" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "resizable-pill", + "title": "Resizable Pill" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "pill-inline", + "title": "Pill inline" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + } + ], + "comparisons": [], + "actionItems": [ + { + "number": 1, + "type": "add_variation", + "title": "Closed panel on right (default)", + "description": "implement Closed panel on right (default) variation in PFJ", + "category": "missing_variations" + }, + { + "number": 2, + "type": "add_variation", + "title": "Expanded panel on right", + "description": "implement Expanded panel on right variation in PFJ", + "category": "missing_variations" + }, + { + "number": 3, + "type": "add_variation", + "title": "Closed panel on left", + "description": "implement Closed panel on left variation in PFJ", + "category": "missing_variations" + }, + { + "number": 4, + "type": "add_variation", + "title": "Expanded panel on left", + "description": "implement Expanded panel on left variation in PFJ", + "category": "missing_variations" + }, + { + "number": 5, + "type": "add_variation", + "title": "Closed panel on bottom", + "description": "implement Closed panel on bottom variation in PFJ", + "category": "missing_variations" + }, + { + "number": 6, + "type": "add_variation", + "title": "Expanded panel on bottom", + "description": "implement Expanded panel on bottom variation in PFJ", + "category": "missing_variations" + }, + { + "number": 7, + "type": "add_variation", + "title": "Expanded inline panel", + "description": "implement Expanded inline panel variation in PFJ", + "category": "missing_variations" + }, + { + "number": 8, + "type": "add_variation", + "title": "Expanded inline panel on left", + "description": "implement Expanded inline panel on left variation in PFJ", + "category": "missing_variations" + }, + { + "number": 9, + "type": "add_variation", + "title": "Static", + "description": "implement Static variation in PFJ", + "category": "missing_variations" + }, + { + "number": 10, + "type": "add_variation", + "title": "Stacked content body elements", + "description": "implement Stacked content body elements variation in PFJ", + "category": "missing_variations" + }, + { + "number": 11, + "type": "add_variation", + "title": "Modified content body padding", + "description": "implement Modified content body padding variation in PFJ", + "category": "missing_variations" + }, + { + "number": 12, + "type": "add_variation", + "title": "Modified panel body padding", + "description": "implement Modified panel body padding variation in PFJ", + "category": "missing_variations" + }, + { + "number": 13, + "type": "add_variation", + "title": "Modified panel width", + "description": "implement Modified panel width variation in PFJ", + "category": "missing_variations" + }, + { + "number": 14, + "type": "add_variation", + "title": "Additional section above main", + "description": "implement Additional section above main variation in PFJ", + "category": "missing_variations" + }, + { + "number": 15, + "type": "add_variation", + "title": "Resizable panel", + "description": "implement Resizable panel variation in PFJ", + "category": "missing_variations" + }, + { + "number": 16, + "type": "add_variation", + "title": "Resizable left panel", + "description": "implement Resizable left panel variation in PFJ", + "category": "missing_variations" + }, + { + "number": 17, + "type": "add_variation", + "title": "Resizable bottom panel", + "description": "implement Resizable bottom panel variation in PFJ", + "category": "missing_variations" + }, + { + "number": 18, + "type": "add_variation", + "title": "Resizable inline panel", + "description": "implement Resizable inline panel variation in PFJ", + "category": "missing_variations" + }, + { + "number": 19, + "type": "add_variation", + "title": "Panel with secondary background", + "description": "implement Panel with secondary background variation in PFJ", + "category": "missing_variations" + }, + { + "number": 20, + "type": "add_variation", + "title": "Pill", + "description": "implement Pill variation in PFJ", + "category": "missing_variations" + }, + { + "number": 21, + "type": "add_variation", + "title": "Resizable Pill", + "description": "implement Resizable Pill variation in PFJ", + "category": "missing_variations" + }, + { + "number": 22, + "type": "add_variation", + "title": "Pill inline", + "description": "implement Pill inline variation in PFJ", + "category": "missing_variations" + } + ] +} \ No newline at end of file diff --git a/docs/pf-compare/drawer.md b/docs/pf-compare/drawer.md new file mode 100644 index 000000000..4fdf4c690 --- /dev/null +++ b/docs/pf-compare/drawer.md @@ -0,0 +1,91 @@ +--- +component: drawer +date: 2026-06-02 +pf_version: Release 6.5.1 +pf_url: https://www.patternfly.org/components/drawer/html +pfj_url: http://localhost:1234/components/drawer +completeness: + pf_total: 22 + pfj_total: 0 + matched: 0 + missing_in_pfj: + - closed-panel-on-right-default + - expanded-panel-on-right + - closed-panel-on-left + - expanded-panel-on-left + - closed-panel-on-bottom + - expanded-panel-on-bottom + - expanded-inline-panel + - expanded-inline-panel-on-left + - static + - stacked-content-body-elements + - modified-content-body-padding + - modified-panel-body-padding + - modified-panel-width + - additional-section-above-main + - resizable-panel + - resizable-left-panel + - resizable-bottom-panel + - resizable-inline-panel + - panel-with-secondary-background + - pill + - resizable-pill + - pill-inline + extra_in_pfj: [] +--- + +# PF Compare: drawer + +## Completeness + +| # | PF Variation | PFJ Snippet | Status | +|---|---|---|---| +| 1 | Closed panel on right (default) | --- | missing_in_pfj | +| 2 | Expanded panel on right | --- | missing_in_pfj | +| 3 | Closed panel on left | --- | missing_in_pfj | +| 4 | Expanded panel on left | --- | missing_in_pfj | +| 5 | Closed panel on bottom | --- | missing_in_pfj | +| 6 | Expanded panel on bottom | --- | missing_in_pfj | +| 7 | Expanded inline panel | --- | missing_in_pfj | +| 8 | Expanded inline panel on left | --- | missing_in_pfj | +| 9 | Static | --- | missing_in_pfj | +| 10 | Stacked content body elements | --- | missing_in_pfj | +| 11 | Modified content body padding | --- | missing_in_pfj | +| 12 | Modified panel body padding | --- | missing_in_pfj | +| 13 | Modified panel width | --- | missing_in_pfj | +| 14 | Additional section above main | --- | missing_in_pfj | +| 15 | Resizable panel | --- | missing_in_pfj | +| 16 | Resizable left panel | --- | missing_in_pfj | +| 17 | Resizable bottom panel | --- | missing_in_pfj | +| 18 | Resizable inline panel | --- | missing_in_pfj | +| 19 | Panel with secondary background | --- | missing_in_pfj | +| 20 | Pill | --- | missing_in_pfj | +| 21 | Resizable Pill | --- | missing_in_pfj | +| 22 | Pill inline | --- | missing_in_pfj | + +## DOM Comparison + +## Action Items + +1. **Add variation:** Closed panel on right (default) — implement Closed panel on right (default) variation in PFJ +2. **Add variation:** Expanded panel on right — implement Expanded panel on right variation in PFJ +3. **Add variation:** Closed panel on left — implement Closed panel on left variation in PFJ +4. **Add variation:** Expanded panel on left — implement Expanded panel on left variation in PFJ +5. **Add variation:** Closed panel on bottom — implement Closed panel on bottom variation in PFJ +6. **Add variation:** Expanded panel on bottom — implement Expanded panel on bottom variation in PFJ +7. **Add variation:** Expanded inline panel — implement Expanded inline panel variation in PFJ +8. **Add variation:** Expanded inline panel on left — implement Expanded inline panel on left variation in PFJ +9. **Add variation:** Static — implement Static variation in PFJ +10. **Add variation:** Stacked content body elements — implement Stacked content body elements variation in PFJ +11. **Add variation:** Modified content body padding — implement Modified content body padding variation in PFJ +12. **Add variation:** Modified panel body padding — implement Modified panel body padding variation in PFJ +13. **Add variation:** Modified panel width — implement Modified panel width variation in PFJ +14. **Add variation:** Additional section above main — implement Additional section above main variation in PFJ +15. **Add variation:** Resizable panel — implement Resizable panel variation in PFJ +16. **Add variation:** Resizable left panel — implement Resizable left panel variation in PFJ +17. **Add variation:** Resizable bottom panel — implement Resizable bottom panel variation in PFJ +18. **Add variation:** Resizable inline panel — implement Resizable inline panel variation in PFJ +19. **Add variation:** Panel with secondary background — implement Panel with secondary background variation in PFJ +20. **Add variation:** Pill — implement Pill variation in PFJ +21. **Add variation:** Resizable Pill — implement Resizable Pill variation in PFJ +22. **Add variation:** Pill inline — implement Pill inline variation in PFJ diff --git a/docs/pf-compare/empty-state.json b/docs/pf-compare/empty-state.json new file mode 100644 index 000000000..558db437a --- /dev/null +++ b/docs/pf-compare/empty-state.json @@ -0,0 +1,278 @@ +{ + "component": "empty-state", + "date": "2026-06-02", + "pfVersion": "Release 6.5.1", + "pfUrl": "https://www.patternfly.org/components/empty-state/html", + "pfjUrl": "http://localhost:1234/components/empty-state", + "completeness": { + "pfTotal": 6, + "pfjTotal": 8, + "matched": 6, + "missingInPfj": [], + "extraInPfj": [ + "empty-state-spinner", + "empty-state-no-match" + ] + }, + "variations": [ + { + "slug": "basic", + "title": "Basic", + "html": "
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n

    Empty state

    \n
    \n
    \n\n
    This represents an the empty state pattern in PatternFly. Hopefully it's simple enough to use but flexible enough to meet a variety of needs.
    \n\n
    \n
    \n \n
    \n
    \n \n \n \n \n \n \n
    \n
    \n
    \n
    " + }, + { + "slug": "extra-small", + "title": "Extra small", + "html": "
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n

    Empty state

    \n
    \n
    \n\n
    This represents an the empty state pattern in PatternFly. The icon is optional.
    \n\n
    \n
    \n \n \n \n \n \n \n
    \n
    \n
    \n
    " + }, + { + "slug": "small", + "title": "Small", + "html": "
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n

    Empty state

    \n
    \n
    \n\n
    This represents an the empty state pattern in PatternFly. Hopefully it's simple enough to use but flexible enough to meet a variety of needs.
    \n\n
    \n
    \n \n
    \n\n
    \n \n \n \n \n \n \n
    \n
    \n
    \n
    " + }, + { + "slug": "large", + "title": "Large", + "html": "
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n

    Empty state

    \n
    \n
    \n\n
    This represents an the empty state pattern in PatternFly. Hopefully it's simple enough to use but flexible enough to meet a variety of needs.
    \n\n
    \n
    \n \n
    \n
    \n \n \n \n \n \n \n
    \n
    \n
    \n
    " + }, + { + "slug": "extra-large", + "title": "Extra large", + "html": "
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n

    Empty state

    \n
    \n
    \n\n
    This represents an the empty state pattern in PatternFly. Hopefully it's simple enough to use but flexible enough to meet a variety of needs.
    \n
    \n
    \n \n
    \n
    \n \n \n \n \n \n \n
    \n
    \n
    \n
    " + }, + { + "slug": "with-status", + "title": "With status", + "html": "
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n

    You're all set

    \n
    \n
    \n\n
    This represents an the empty state pattern in PatternFly. Hopefully it's simple enough to use but flexible enough to meet a variety of needs.
    \n\n
    \n
    \n \n
    \n
    \n \n \n \n \n \n \n
    \n
    \n
    \n
    " + } + ], + "snippets": [ + { + "id": "empty-state-basic", + "title": "Basic", + "html": "

    Empty State

    This represents an the empty state pattern in PatternFly. Hopefully it's simple enough to use but flexible enough to meet a variety of needs.
    " + }, + { + "id": "empty-state-xs", + "title": "Extra small", + "html": "

    Empty State

    This represents an the empty state pattern in PatternFly. Hopefully it's simple enough to use but flexible enough to meet a variety of needs.
    " + }, + { + "id": "empty-state-small", + "title": "Small", + "html": "

    Empty State

    This represents an the empty state pattern in PatternFly. Hopefully it's simple enough to use but flexible enough to meet a variety of needs.
    " + }, + { + "id": "empty-state-large", + "title": "Large", + "html": "

    Empty State

    This represents an the empty state pattern in PatternFly. Hopefully it's simple enough to use but flexible enough to meet a variety of needs.
    " + }, + { + "id": "empty-state-xl", + "title": "Extra large", + "html": "

    Empty State

    This represents an the empty state pattern in PatternFly. Hopefully it's simple enough to use but flexible enough to meet a variety of needs.
    " + }, + { + "id": "empty-state-status", + "title": "With status", + "html": "

    You're all set!

    This represents an the empty state pattern in PatternFly. Hopefully it's simple enough to use but flexible enough to meet a variety of needs.
    " + }, + { + "id": "empty-state-spinner", + "title": "Spinner", + "html": "

    Loading...

    " + }, + { + "id": "empty-state-no-match", + "title": "No match found", + "html": "

    No results found

    No results match the filter criteria. Clear all filters and try again.
    " + } + ], + "matches": [ + { + "pfVariation": { + "slug": "basic", + "title": "Basic" + }, + "pfjSnippet": { + "id": "empty-state-basic", + "title": "Basic" + }, + "matchType": "exact", + "status": "matched" + }, + { + "pfVariation": { + "slug": "extra-small", + "title": "Extra small" + }, + "pfjSnippet": { + "id": "empty-state-xs", + "title": "Extra small" + }, + "matchType": "exact", + "status": "matched" + }, + { + "pfVariation": { + "slug": "small", + "title": "Small" + }, + "pfjSnippet": { + "id": "empty-state-small", + "title": "Small" + }, + "matchType": "exact", + "status": "matched" + }, + { + "pfVariation": { + "slug": "large", + "title": "Large" + }, + "pfjSnippet": { + "id": "empty-state-large", + "title": "Large" + }, + "matchType": "exact", + "status": "matched" + }, + { + "pfVariation": { + "slug": "extra-large", + "title": "Extra large" + }, + "pfjSnippet": { + "id": "empty-state-xl", + "title": "Extra large" + }, + "matchType": "exact", + "status": "matched" + }, + { + "pfVariation": { + "slug": "with-status", + "title": "With status" + }, + "pfjSnippet": { + "id": "empty-state-status", + "title": "With status" + }, + "matchType": "exact", + "status": "matched" + } + ], + "comparisons": [ + { + "status": "ok", + "missingClasses": [], + "extraClasses": [], + "structuralDiffs": [], + "attributeDiffs": [], + "iconDiffs": [], + "variation": "Basic" + }, + { + "status": "differences_found", + "missingClasses": [ + { + "class": "pf-m-small", + "element": "\n
    \n \n" + }, + { + "slug": "expanded", + "title": "Expanded", + "html": "
    \n
    \n \n
    \n
    This content is visible only when the component is expanded.
    \n
    " + }, + { + "slug": "indented", + "title": "Indented", + "html": "
    \n
    \n \n
    \n
    This content is visible only when the component is expanded.
    \n
    " + }, + { + "slug": "disclosure-variation-hidden", + "title": "Disclosure variation (hidden)", + "html": "
    \n
    \n \n
    \n \n
    " + }, + { + "slug": "disclosure-variation-expanded", + "title": "Disclosure variation (expanded)", + "html": "
    \n
    \n \n
    \n
    This content is visible only when the component is expanded.
    \n
    " + }, + { + "slug": "disclosure-variation-indented", + "title": "Disclosure variation (indented)", + "html": "
    \n
    \n \n
    \n
    This content is visible only when the component is expanded.
    \n
    " + }, + { + "slug": "detached", + "title": "Detached", + "html": "
    \n
    \n
    \n
    This content is visible only when the component is expanded.
    \n
    \n
    \n\n
    \n
    \n
    \n \n
    \n
    \n
    \n
    " + }, + { + "slug": "truncate-expansion-hidden", + "title": "Truncate expansion (hidden)", + "html": "
    \n
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus finibus, diam vitae eleifend consequat, metus sapien posuere quam, ut tincidunt nunc enim eget sapien. Mauris ac dui imperdiet dolor dignissim efficitur laoreet quis erat. Proin turpis leo, malesuada eget urna et, tristique mollis odio. Ut mattis nulla lorem, elementum hendrerit nunc molestie vitae. Proin massa sem, bibendum id urna in, viverra porta neque. Ut ut mi ac lacus rhoncus mollis id quis sem. Suspendisse non justo elementum, dictum eros nec, hendrerit sapien. Mauris aliquet, est sit amet tincidunt vehicula, purus est hendrerit arcu, vitae egestas odio lorem ut lacus. In et neque non metus viverra rhoncus quis non purus. Integer id venenatis tortor. Nulla sollicitudin convallis tellus, at porta eros volutpat in. Curabitur rhoncus rhoncus nisi, sit amet tincidunt dolor efficitur vitae. Integer purus neque, porta non odio lobortis, accumsan elementum risus. Pellentesque viverra id lacus a cursus. Etiam eu pulvinar risus. Etiam ultrices nec urna id consequat.
    \n
    \n \n
    \n
    " + }, + { + "slug": "truncate-expansion-expanded", + "title": "Truncate expansion (expanded)", + "html": "
    \n
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus finibus, diam vitae eleifend consequat, metus sapien posuere quam, ut tincidunt nunc enim eget sapien. Mauris ac dui imperdiet dolor dignissim efficitur laoreet quis erat. Proin turpis leo, malesuada eget urna et, tristique mollis odio. Ut mattis nulla lorem, elementum hendrerit nunc molestie vitae. Proin massa sem, bibendum id urna in, viverra porta neque. Ut ut mi ac lacus rhoncus mollis id quis sem. Suspendisse non justo elementum, dictum eros nec, hendrerit sapien. Mauris aliquet, est sit amet tincidunt vehicula, purus est hendrerit arcu, vitae egestas odio lorem ut lacus. In et neque non metus viverra rhoncus quis non purus. Integer id venenatis tortor. Nulla sollicitudin convallis tellus, at porta eros volutpat in. Curabitur rhoncus rhoncus nisi, sit amet tincidunt dolor efficitur vitae. Integer purus neque, porta non odio lobortis, accumsan elementum risus. Pellentesque viverra id lacus a cursus. Etiam eu pulvinar risus. Etiam ultrices nec urna id consequat.
    \n
    \n \n
    \n
    " + } + ], + "snippets": [ + { + "id": "es-basic", + "title": "Basic", + "html": "
    " + }, + { + "id": "es-dynamic-text", + "title": "Basic with dynamic toggle text", + "html": "
    " + }, + { + "id": "es-detached-before", + "title": "Detached (before)", + "html": "
    " + }, + { + "id": "es-detached-after", + "title": "Detached (after)", + "html": "
    " + }, + { + "id": "es-disclosure", + "title": "Disclosure variation", + "html": "
    " + }, + { + "id": "es-indented", + "title": "Indented", + "html": "
    " + }, + { + "id": "es-custom-toggle", + "title": "With custom toggle content", + "html": "
    " + }, + { + "id": "es-truncate", + "title": "Truncate", + "html": "
    " + } + ], + "matches": [ + { + "pfVariation": { + "slug": "hidden", + "title": "Hidden" + }, + "pfjSnippet": { + "id": "es-indented", + "title": "Indented" + }, + "matchType": "semantic", + "status": "matched" + }, + { + "pfVariation": { + "slug": "disclosure-variation-hidden", + "title": "Disclosure variation (hidden)" + }, + "pfjSnippet": { + "id": "es-disclosure", + "title": "Disclosure variation" + }, + "matchType": "semantic", + "status": "matched" + }, + { + "pfVariation": { + "slug": "detached", + "title": "Detached" + }, + "pfjSnippet": { + "id": "es-detached-before", + "title": "Detached (before)" + }, + "matchType": "semantic", + "status": "matched" + }, + { + "pfVariation": { + "slug": "truncate-expansion-hidden", + "title": "Truncate expansion (hidden)" + }, + "pfjSnippet": { + "id": "es-truncate", + "title": "Truncate" + }, + "matchType": "semantic", + "status": "matched" + }, + { + "pfVariation": { + "slug": "expanded", + "title": "Expanded" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "indented", + "title": "Indented" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "disclosure-variation-expanded", + "title": "Disclosure variation (expanded)" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "disclosure-variation-indented", + "title": "Disclosure variation (indented)" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "truncate-expansion-expanded", + "title": "Truncate expansion (expanded)" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + } + ], + "comparisons": [ + { + "status": "differences_found", + "missingClasses": [ + { + "class": "pf-m-start", + "element": "", + "context": "present in PF, absent in PFJ" + } + ], + "extraClasses": [ + { + "class": "pf-m-indented", + "element": "
    ", + "context": "present in PFJ, absent in PF" + } + ], + "structuralDiffs": [ + "PF has \n \n
    \n \n" + }, + { + "slug": "field-group-non-expandable", + "title": "Field group (non-expandable)", + "html": "
    \n
    \n
    \n
    \n
    \n
    Field group Title
    \n
    \n
    Field group description text
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
     \n \n \n \n \n \n \n \n
    \n
    \n \n \n \n
    \n
    \n
    \n
     \n \n \n \n \n \n \n \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n
    " + }, + { + "slug": "expandable-and-nested-field-groups", + "title": "Expandable and nested field groups", + "html": "
    \n
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n\n
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n\n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    Field group 1
    \n
    \n
    Field group 1 description text
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    Nested field group 1
    \n
    \n
    Nested field group 1 description text
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
     \n \n \n \n \n \n \n \n
    \n
    \n \n \n \n
    \n
    \n
    \n
     \n \n \n \n \n \n \n \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    Nested field group 2
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
     \n \n \n \n \n \n \n \n
    \n
    \n \n \n \n
    \n
    \n
    \n
     \n \n \n \n \n \n \n \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    Nested field group 3
    \n
    \n
    Nested field group 3 description text
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
     \n \n \n \n \n \n \n \n
    \n
    \n \n \n \n
    \n
    \n
    \n
     \n \n \n \n \n \n \n \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n\n
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    Field group 2
    \n
    \n
    Field group 2 description text
    \n
    \n
    \n
    \n
    \n
     \n \n \n \n \n \n \n \n
    \n
    \n \n \n \n
    \n
    \n
    \n
     \n \n \n \n \n \n \n \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    Nested field group 3
    \n
    \n
    \n
    \n
    \n
    \n
     \n \n \n \n \n \n \n \n
    \n
    \n \n \n \n
    \n
    \n
    \n
     \n \n \n \n \n \n \n \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    Field group 3
    \n
    \n
    Field group 3 description text
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n\n
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n\n
    \n
    \n
    \n
    \n
    Nested field group 1 (non-expandable)
    \n
    \n
    \n
    \n
    \n
    \n
     \n \n \n \n \n \n \n \n
    \n
    \n \n \n \n
    \n
    \n
    \n
     \n \n \n \n \n \n \n \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n
    \n
    Nested field group 2 (non-expandable)
    \n
    \n
    Field group 2 description text
    \n
    \n
    \n
    \n
    \n
     \n \n \n \n \n \n \n \n
    \n
    \n \n \n \n
    \n
    \n
    \n
     \n \n \n \n \n \n \n \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n
    \n
    Field group 4 (non-expandable)
    \n
    \n
    Field group 4 description text
    \n
    \n
    \n
    \n
    \n
     \n \n \n \n \n \n \n \n
    \n
    \n \n \n \n
    \n
    \n
    \n
     \n \n \n \n \n \n \n \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n\n
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n\n
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n
    " + } + ], + "snippets": [], + "matches": [ + { + "pfVariation": { + "slug": "vertically-aligned-labels", + "title": "Vertically aligned labels" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "horizontally-aligned-labels", + "title": "Horizontally aligned labels" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "horizontal-layout-at-a-custom-breakpoint", + "title": "Horizontal layout at a custom breakpoint" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "form-sections", + "title": "Form sections" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "help-text", + "title": "Help text" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "label-with-additional-info", + "title": "Label with additional info" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "label-with-additional-info-horizontal-form", + "title": "Label with additional info (horizontal form)" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "action-group", + "title": "Action group" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "field-group-non-expandable", + "title": "Field group (non-expandable)" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + }, + { + "pfVariation": { + "slug": "expandable-and-nested-field-groups", + "title": "Expandable and nested field groups" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + } + ], + "comparisons": [], + "actionItems": [ + { + "number": 1, + "type": "add_variation", + "title": "Vertically aligned labels", + "description": "implement Vertically aligned labels variation in PFJ", + "category": "missing_variations" + }, + { + "number": 2, + "type": "add_variation", + "title": "Horizontally aligned labels", + "description": "implement Horizontally aligned labels variation in PFJ", + "category": "missing_variations" + }, + { + "number": 3, + "type": "add_variation", + "title": "Horizontal layout at a custom breakpoint", + "description": "implement Horizontal layout at a custom breakpoint variation in PFJ", + "category": "missing_variations" + }, + { + "number": 4, + "type": "add_variation", + "title": "Form sections", + "description": "implement Form sections variation in PFJ", + "category": "missing_variations" + }, + { + "number": 5, + "type": "add_variation", + "title": "Help text", + "description": "implement Help text variation in PFJ", + "category": "missing_variations" + }, + { + "number": 6, + "type": "add_variation", + "title": "Label with additional info", + "description": "implement Label with additional info variation in PFJ", + "category": "missing_variations" + }, + { + "number": 7, + "type": "add_variation", + "title": "Label with additional info (horizontal form)", + "description": "implement Label with additional info (horizontal form) variation in PFJ", + "category": "missing_variations" + }, + { + "number": 8, + "type": "add_variation", + "title": "Action group", + "description": "implement Action group variation in PFJ", + "category": "missing_variations" + }, + { + "number": 9, + "type": "add_variation", + "title": "Field group (non-expandable)", + "description": "implement Field group (non-expandable) variation in PFJ", + "category": "missing_variations" + }, + { + "number": 10, + "type": "add_variation", + "title": "Expandable and nested field groups", + "description": "implement Expandable and nested field groups variation in PFJ", + "category": "missing_variations" + } + ] +} \ No newline at end of file diff --git a/docs/pf-compare/form.md b/docs/pf-compare/form.md new file mode 100644 index 000000000..c88032b8f --- /dev/null +++ b/docs/pf-compare/form.md @@ -0,0 +1,55 @@ +--- +component: form +date: 2026-06-02 +pf_version: Release 6.5.1 +pf_url: https://www.patternfly.org/components/forms/form/html +pfj_url: http://localhost:1234/components/form +completeness: + pf_total: 10 + pfj_total: 0 + matched: 0 + missing_in_pfj: + - vertically-aligned-labels + - horizontally-aligned-labels + - horizontal-layout-at-a-custom-breakpoint + - form-sections + - help-text + - label-with-additional-info + - label-with-additional-info-horizontal-form + - action-group + - field-group-non-expandable + - expandable-and-nested-field-groups + extra_in_pfj: [] +--- + +# PF Compare: form + +## Completeness + +| # | PF Variation | PFJ Snippet | Status | +|---|---|---|---| +| 1 | Vertically aligned labels | --- | missing_in_pfj | +| 2 | Horizontally aligned labels | --- | missing_in_pfj | +| 3 | Horizontal layout at a custom breakpoint | --- | missing_in_pfj | +| 4 | Form sections | --- | missing_in_pfj | +| 5 | Help text | --- | missing_in_pfj | +| 6 | Label with additional info | --- | missing_in_pfj | +| 7 | Label with additional info (horizontal form) | --- | missing_in_pfj | +| 8 | Action group | --- | missing_in_pfj | +| 9 | Field group (non-expandable) | --- | missing_in_pfj | +| 10 | Expandable and nested field groups | --- | missing_in_pfj | + +## DOM Comparison + +## Action Items + +1. **Add variation:** Vertically aligned labels — implement Vertically aligned labels variation in PFJ +2. **Add variation:** Horizontally aligned labels — implement Horizontally aligned labels variation in PFJ +3. **Add variation:** Horizontal layout at a custom breakpoint — implement Horizontal layout at a custom breakpoint variation in PFJ +4. **Add variation:** Form sections — implement Form sections variation in PFJ +5. **Add variation:** Help text — implement Help text variation in PFJ +6. **Add variation:** Label with additional info — implement Label with additional info variation in PFJ +7. **Add variation:** Label with additional info (horizontal form) — implement Label with additional info (horizontal form) variation in PFJ +8. **Add variation:** Action group — implement Action group variation in PFJ +9. **Add variation:** Field group (non-expandable) — implement Field group (non-expandable) variation in PFJ +10. **Add variation:** Expandable and nested field groups — implement Expandable and nested field groups variation in PFJ diff --git a/docs/pf-compare/helper-text.json b/docs/pf-compare/helper-text.json new file mode 100644 index 000000000..fe811595d --- /dev/null +++ b/docs/pf-compare/helper-text.json @@ -0,0 +1,430 @@ +{ + "component": "helper-text", + "date": "2026-06-02", + "pfVersion": "Release 6.5.1", + "pfUrl": "https://www.patternfly.org/components/helper-text/html", + "pfjUrl": "http://localhost:1234/components/helper-text", + "completeness": { + "pfTotal": 4, + "pfjTotal": 5, + "matched": 3, + "missingInPfj": [ + "basic" + ], + "extraInPfj": [ + "helper-text-static", + "helper-text-static-custom-icon" + ] + }, + "variations": [ + { + "slug": "basic", + "title": "Basic", + "html": "
    \n
    \n This is default helper text\n
    \n
    \n
    \n
    \n \n \n \n \n Indeterminate:\n This is indeterminate helper text\n \n
    \n
    \n
    \n
    \n \n \n \n \n Warning:\n This is warning helper text\n \n
    \n
    \n
    \n
    \n \n \n \n \n Success:\n This is success helper text\n \n
    \n
    \n
    \n
    \n \n \n \n \n Error:\n This is error helper text\n \n
    \n
    " + }, + { + "slug": "multiple-items", + "title": "Multiple items", + "html": "
      \n
    • \n This is default helper text\n
    • \n
    • \n This is another default helper text in the same block\n
    • \n
    • \n And this is more default text in the same block\n
    • \n
    " + }, + { + "slug": "dynamic", + "title": "Dynamic", + "html": "
    \n
    \n This is default helper text\n
    \n
    \n
    \n
    \n \n \n \n \n Indeterminate:\n This is indeterminate helper text\n \n
    \n
    \n
    \n
    \n \n \n \n \n Warning:\n This is warning helper text\n \n
    \n
    \n
    \n
    \n \n \n \n \n Success:\n This is success helper text\n \n
    \n
    \n
    \n
    \n \n \n \n \n Error:\n This is error helper text\n \n
    \n
    " + }, + { + "slug": "dynamic-list", + "title": "Dynamic list", + "html": "
      \n
    • \n \n \n \n \n Success:\n Must be at least 14 characters\n \n
    • \n
    • \n \n \n \n \n Error:\n Cannot contain any variation of the word \"redhat\"\n \n
    • \n
    • \n \n \n \n \n Success:\n Must include at least 3 of the following: lowercase letter, uppercase letters, numbers, symbols\n \n
    • \n
    " + } + ], + "snippets": [ + { + "id": "helper-text-static", + "title": "Static", + "html": "
    This is default helper text: default_ status;
    This is indeterminate helper text: indeterminate status;
    This is warning helper text: warning status;
    This is success helper text: success status;
    This is error helper text: error status;
    " + }, + { + "id": "helper-text-static-custom-icon", + "title": "Static with custom icons", + "html": "
    This is default helper text: default_ status;
    This is indeterminate helper text: indeterminate status;
    This is warning helper text: warning status;
    This is success helper text: success status;
    This is error helper text: error status;
    " + }, + { + "id": "helper-text-multiple-static", + "title": "Multiple static", + "html": "
    This is default helper text: default_ status;
    This is another default helper text in the same block: default_ status;
    And this is more default text in the same block: default_ status;
    " + }, + { + "id": "helper-text-dynamic", + "title": "Dynamic", + "html": "
    This is default helper text: default_ status;
    This is indeterminate helper text: indeterminate status;
    This is warning helper text: warning status;
    This is success helper text: success status;
    This is error helper text: error status;
    This is error helper text with a custom icon: error status;
    This is error helper text with no icon: error status;
    " + }, + { + "id": "helper-text-dynamic-list", + "title": "Dynamic list", + "html": "
    • Must be at least 14 characters: success status;
    • Cannot contain any variation of the word 'redhat': error status;
    • Must include at least 3 of the following: lowercase letter, uppercase letters, numbers, symbols: success status;
    " + } + ], + "matches": [ + { + "pfVariation": { + "slug": "multiple-items", + "title": "Multiple items" + }, + "pfjSnippet": { + "id": "helper-text-multiple-static", + "title": "Multiple static" + }, + "matchType": "semantic", + "status": "matched" + }, + { + "pfVariation": { + "slug": "dynamic", + "title": "Dynamic" + }, + "pfjSnippet": { + "id": "helper-text-dynamic", + "title": "Dynamic" + }, + "matchType": "exact", + "status": "matched" + }, + { + "pfVariation": { + "slug": "dynamic-list", + "title": "Dynamic list" + }, + "pfjSnippet": { + "id": "helper-text-dynamic-list", + "title": "Dynamic list" + }, + "matchType": "exact", + "status": "matched" + }, + { + "pfVariation": { + "slug": "basic", + "title": "Basic" + }, + "pfjSnippet": null, + "matchType": "none", + "status": "missing_in_pfj" + } + ], + "comparisons": [ + { + "status": "differences_found", + "missingClasses": [], + "extraClasses": [ + { + "class": "pf-v6-screen-reader", + "element": "", + "context": "present in PFJ, absent in PF" + } + ], + "structuralDiffs": [ + "PF has
  • \u2014 missing in PFJ", + "PF has