diff --git a/package.json b/package.json
index 4c9c2378c1..020540c476 100644
--- a/package.json
+++ b/package.json
@@ -49,6 +49,7 @@
"packages/components/buttons/*",
"packages/components/dropdowns/*",
"packages/components/fields/*",
+ "packages/components/filters/*",
"packages/components/inputs/*",
"packages/components/spacings/*",
"presets/*",
@@ -62,6 +63,7 @@
"packages/components/buttons/*",
"packages/components/dropdowns/*",
"packages/components/fields/*",
+ "packages/components/filters/*",
"packages/components/inputs/*",
"packages/components/spacings/*",
"presets/*"
diff --git a/packages/components/filters/filter-menu/LICENSE b/packages/components/filters/filter-menu/LICENSE
new file mode 100644
index 0000000000..cdf0ab5ed5
--- /dev/null
+++ b/packages/components/filters/filter-menu/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 commercetools GmbH
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/packages/components/filters/filter-menu/README.md b/packages/components/filters/filter-menu/README.md
new file mode 100644
index 0000000000..44f82a1a61
--- /dev/null
+++ b/packages/components/filters/filter-menu/README.md
@@ -0,0 +1,49 @@
+
+
+
+# FilterMenu
+
+## Description
+
+This component should be used to display an active filter in the `FiltersList`.
+
+It displays each selected filter option in the menu trigger, and allows for selecting options in the menu body.
+
+This description is a stub and should be expanded as development continues.
+
+## Installation
+
+```
+yarn add @commercetools-uikit/filter-menu
+```
+
+```
+npm --save install @commercetools-uikit/filter-menu
+```
+
+Additionally install the peer dependencies (if not present)
+
+```
+yarn add react
+```
+
+```
+npm --save install react
+```
+
+## Usage
+
+```jsx
+import FilterMenu from '@commercetools-uikit/filter-menu';
+
+/**TODO: EXPAND THIS */
+const Example = () => ;
+
+export default Example;
+```
+
+## Properties
+
+| Props | Type | Required | Default | Description |
+| ------- | -------- | :------: | ------- | ------------------- |
+| `label` | `string` | | | This is a stub prop |
diff --git a/packages/components/filters/filter-menu/docs/description.md b/packages/components/filters/filter-menu/docs/description.md
new file mode 100644
index 0000000000..60e70db96e
--- /dev/null
+++ b/packages/components/filters/filter-menu/docs/description.md
@@ -0,0 +1,5 @@
+This component should be used to display an active filter in the `FiltersList`.
+
+It displays each selected filter option in the menu trigger, and allows for selecting options in the menu body.
+
+This description is a stub and should be expanded as development continues.
diff --git a/packages/components/filters/filter-menu/docs/usage-example.js b/packages/components/filters/filter-menu/docs/usage-example.js
new file mode 100644
index 0000000000..9a0d4340d0
--- /dev/null
+++ b/packages/components/filters/filter-menu/docs/usage-example.js
@@ -0,0 +1,6 @@
+import FilterMenu from '@commercetools-uikit/filter-menu';
+
+/**TODO: EXPAND THIS */
+const Example = () => ;
+
+export default Example;
diff --git a/packages/components/filters/filter-menu/index.ts b/packages/components/filters/filter-menu/index.ts
new file mode 100644
index 0000000000..2e6947f31a
--- /dev/null
+++ b/packages/components/filters/filter-menu/index.ts
@@ -0,0 +1,6 @@
+// This file exists because we want jest to use our non-compiled code to run tests
+// if this file is missing, and you have a `module` or `main` that points to a non-existing file
+// (ie, a bundle that hasn't been built yet) then jest will fail if the bundle is not yet built.
+// all apps should export all their named exports from their root index.js
+export { default } from './src';
+export * from './src';
diff --git a/packages/components/filters/filter-menu/package.json b/packages/components/filters/filter-menu/package.json
new file mode 100644
index 0000000000..81b98ae157
--- /dev/null
+++ b/packages/components/filters/filter-menu/package.json
@@ -0,0 +1,36 @@
+{
+ "name": "@commercetools-uikit/filter-menu",
+ "description": "The `FilterMenu` is the menu that displays the available and selected options for a specific filter in the `FiltersList`.",
+ "version": "19.11.0",
+ "bugs": "https://github.com/commercetools/ui-kit/issues",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/commercetools/ui-kit.git",
+ "directory": "packages/components/filters/filter-menu"
+ },
+ "homepage": "https://uikit.commercetools.com",
+ "keywords": ["javascript", "typescript", "design-system", "react", "uikit"],
+ "license": "MIT",
+ "publishConfig": {
+ "access": "public"
+ },
+ "sideEffects": false,
+ "main": "dist/commercetools-uikit-filter-menu.cjs.js",
+ "module": "dist/commercetools-uikit-filter-menu.esm.js",
+ "files": ["dist"],
+ "dependencies": {
+ "@babel/runtime": "^7.20.13",
+ "@babel/runtime-corejs3": "^7.20.13",
+ "@commercetools-uikit/dropdown-menu": "workspace:^",
+ "@emotion/react": "^11.10.5",
+ "@emotion/styled": "^11.10.5",
+ "prop-types": "15.8.1",
+ "react-intl": "^6.3.2"
+ },
+ "devDependencies": {
+ "react": "17.0.2"
+ },
+ "peerDependencies": {
+ "react": "17.x"
+ }
+}
diff --git a/packages/components/filters/filter-menu/src/badge/badge.spec.tsx b/packages/components/filters/filter-menu/src/badge/badge.spec.tsx
new file mode 100644
index 0000000000..bea614b3e1
--- /dev/null
+++ b/packages/components/filters/filter-menu/src/badge/badge.spec.tsx
@@ -0,0 +1,12 @@
+import { screen, render } from '../../../../../../test/test-utils';
+import Badge from './badge';
+
+/**
+ * THIS IS A PLACEHOLDER, PLEASE UPDATE IT
+ */
+describe('FilterMenu Badge', () => {
+ it('should render the badge', async () => {
+ await render();
+ await screen.findByText('badge');
+ });
+});
diff --git a/packages/components/filters/filter-menu/src/badge/badge.tsx b/packages/components/filters/filter-menu/src/badge/badge.tsx
new file mode 100644
index 0000000000..8001f5f052
--- /dev/null
+++ b/packages/components/filters/filter-menu/src/badge/badge.tsx
@@ -0,0 +1,5 @@
+function Badge() {
+ return
badge
;
+}
+
+export default Badge;
diff --git a/packages/components/filters/filter-menu/src/badge/index.ts b/packages/components/filters/filter-menu/src/badge/index.ts
new file mode 100644
index 0000000000..7c74794fdd
--- /dev/null
+++ b/packages/components/filters/filter-menu/src/badge/index.ts
@@ -0,0 +1 @@
+export { default as Badge } from './badge';
diff --git a/packages/components/filters/filter-menu/src/chip/chip.spec.tsx b/packages/components/filters/filter-menu/src/chip/chip.spec.tsx
new file mode 100644
index 0000000000..b2701dde41
--- /dev/null
+++ b/packages/components/filters/filter-menu/src/chip/chip.spec.tsx
@@ -0,0 +1,12 @@
+import { screen, render } from '../../../../../../test/test-utils';
+import Chip from './chip';
+
+/**
+ * THIS IS A PLACEHOLDER, PLEASE UPDATE IT
+ */
+describe('FilterMenu Chip', () => {
+ it('should render the chip', async () => {
+ await render();
+ await screen.findByText('chip');
+ });
+});
diff --git a/packages/components/filters/filter-menu/src/chip/chip.tsx b/packages/components/filters/filter-menu/src/chip/chip.tsx
new file mode 100644
index 0000000000..0983398fdc
--- /dev/null
+++ b/packages/components/filters/filter-menu/src/chip/chip.tsx
@@ -0,0 +1,5 @@
+function Chip() {
+ return
chip
;
+}
+
+export default Chip;
diff --git a/packages/components/filters/filter-menu/src/chip/index.ts b/packages/components/filters/filter-menu/src/chip/index.ts
new file mode 100644
index 0000000000..458f31eb08
--- /dev/null
+++ b/packages/components/filters/filter-menu/src/chip/index.ts
@@ -0,0 +1 @@
+export { default as Chip } from './chip';
diff --git a/packages/components/filters/filter-menu/src/export-types.ts b/packages/components/filters/filter-menu/src/export-types.ts
new file mode 100644
index 0000000000..6cea38eeec
--- /dev/null
+++ b/packages/components/filters/filter-menu/src/export-types.ts
@@ -0,0 +1 @@
+export type { TFilterMenuProps } from './filter-menu';
diff --git a/packages/components/filters/filter-menu/src/filter-menu.readme.mdx b/packages/components/filters/filter-menu/src/filter-menu.readme.mdx
new file mode 100644
index 0000000000..4bb67a431e
--- /dev/null
+++ b/packages/components/filters/filter-menu/src/filter-menu.readme.mdx
@@ -0,0 +1,6 @@
+import { Meta, Markdown } from '@storybook/blocks';
+import ReadMe from './../README.md?raw'
+
+
+
+{ReadMe}
diff --git a/packages/components/filters/filter-menu/src/filter-menu.spec.tsx b/packages/components/filters/filter-menu/src/filter-menu.spec.tsx
new file mode 100644
index 0000000000..463b48a90e
--- /dev/null
+++ b/packages/components/filters/filter-menu/src/filter-menu.spec.tsx
@@ -0,0 +1,12 @@
+import { screen, render } from '../../../../../test/test-utils';
+import FilterMenu from './filter-menu';
+
+/**
+ * THIS IS A PLACEHOLDER, PLEASE UPDATE IT
+ */
+describe('FilterMenu FilterMenu', () => {
+ it('should render the filter-menu', async () => {
+ await render();
+ await screen.findByText('filter menu');
+ });
+});
diff --git a/packages/components/filters/filter-menu/src/filter-menu.stories.tsx b/packages/components/filters/filter-menu/src/filter-menu.stories.tsx
new file mode 100644
index 0000000000..833d9693a7
--- /dev/null
+++ b/packages/components/filters/filter-menu/src/filter-menu.stories.tsx
@@ -0,0 +1,22 @@
+import type { Meta, StoryObj } from '@storybook/react';
+import FilterMenu from './filter-menu';
+
+const meta: Meta = {
+ title: 'components/Filters/FilterMenu',
+ component: FilterMenu,
+ tags: ['local-dev'],
+ argTypes: {
+ label: {
+ control: 'text',
+ },
+ },
+};
+export default meta;
+
+type Story = StoryObj;
+
+export const BasicExample: Story = {
+ args: {
+ label: 'A label text',
+ },
+};
diff --git a/packages/components/filters/filter-menu/src/filter-menu.tsx b/packages/components/filters/filter-menu/src/filter-menu.tsx
new file mode 100644
index 0000000000..806723e49b
--- /dev/null
+++ b/packages/components/filters/filter-menu/src/filter-menu.tsx
@@ -0,0 +1,21 @@
+import DropdownMenu from '@commercetools-uikit/dropdown-menu';
+import { Footer } from './footer';
+import { Header } from './header';
+import { TriggerButton } from './trigger-button';
+
+export type TFilterMenuProps = {
+ /**
+ * This is a stub prop!
+ */
+ label: string;
+};
+function FilterMenu(props: TFilterMenuProps) {
+ return (
+ }>
+
+
+
+ );
+}
+
+export default FilterMenu;
diff --git a/packages/components/filters/filter-menu/src/filter-menu.visualroute.jsx b/packages/components/filters/filter-menu/src/filter-menu.visualroute.jsx
new file mode 100644
index 0000000000..3b948ff0c4
--- /dev/null
+++ b/packages/components/filters/filter-menu/src/filter-menu.visualroute.jsx
@@ -0,0 +1,11 @@
+import { Suite, Spec } from '../../../../../test/percy';
+
+export const routePath = '/filter-menu';
+
+export const component = () => (
+
+
+ {/**ACTUAL TEST GOES HERE */}
+
+
+);
diff --git a/packages/components/filters/filter-menu/src/filter-menu.visualspec.js b/packages/components/filters/filter-menu/src/filter-menu.visualspec.js
new file mode 100644
index 0000000000..c51426bc14
--- /dev/null
+++ b/packages/components/filters/filter-menu/src/filter-menu.visualspec.js
@@ -0,0 +1,12 @@
+import percySnapshot from '@percy/puppeteer';
+import { getDocument, queries } from 'pptr-testing-library';
+
+describe('FilterMenu', () => {
+ beforeAll(async () => {
+ await page.goto(`${globalThis.HOST}/filter-menu`);
+ });
+
+ it.skip('Default', async () => {
+ // THIS IS A STUB
+ });
+});
diff --git a/packages/components/filters/filter-menu/src/footer/footer.spec.tsx b/packages/components/filters/filter-menu/src/footer/footer.spec.tsx
new file mode 100644
index 0000000000..41000e6dc9
--- /dev/null
+++ b/packages/components/filters/filter-menu/src/footer/footer.spec.tsx
@@ -0,0 +1,12 @@
+import { screen, render } from '../../../../../../test/test-utils';
+import Footer from './footer';
+
+/**
+ * THIS IS A PLACEHOLDER, PLEASE UPDATE IT
+ */
+describe('FilterMenu Footer', () => {
+ it('should render the footer', async () => {
+ await render();
+ await screen.findByText('footer');
+ });
+});
diff --git a/packages/components/filters/filter-menu/src/footer/footer.tsx b/packages/components/filters/filter-menu/src/footer/footer.tsx
new file mode 100644
index 0000000000..783ca8f960
--- /dev/null
+++ b/packages/components/filters/filter-menu/src/footer/footer.tsx
@@ -0,0 +1,5 @@
+function Footer() {
+ return
footer
;
+}
+
+export default Footer;
diff --git a/packages/components/filters/filter-menu/src/footer/index.ts b/packages/components/filters/filter-menu/src/footer/index.ts
new file mode 100644
index 0000000000..13f355b594
--- /dev/null
+++ b/packages/components/filters/filter-menu/src/footer/index.ts
@@ -0,0 +1 @@
+export { default as Footer } from './footer';
diff --git a/packages/components/filters/filter-menu/src/header/header.spec.tsx b/packages/components/filters/filter-menu/src/header/header.spec.tsx
new file mode 100644
index 0000000000..940e935dd4
--- /dev/null
+++ b/packages/components/filters/filter-menu/src/header/header.spec.tsx
@@ -0,0 +1,12 @@
+import { screen, render } from '../../../../../../test/test-utils';
+import Header from './header';
+
+/**
+ * THIS IS A PLACEHOLDER, PLEASE UPDATE IT
+ */
+describe('FilterMenu Header', () => {
+ it('should render the header', async () => {
+ await render();
+ await screen.findByText('header');
+ });
+});
diff --git a/packages/components/filters/filter-menu/src/header/header.tsx b/packages/components/filters/filter-menu/src/header/header.tsx
new file mode 100644
index 0000000000..ceff9d9512
--- /dev/null
+++ b/packages/components/filters/filter-menu/src/header/header.tsx
@@ -0,0 +1,5 @@
+function Header() {
+ return
header
;
+}
+
+export default Header;
diff --git a/packages/components/filters/filter-menu/src/header/index.ts b/packages/components/filters/filter-menu/src/header/index.ts
new file mode 100644
index 0000000000..7899000d7d
--- /dev/null
+++ b/packages/components/filters/filter-menu/src/header/index.ts
@@ -0,0 +1 @@
+export { default as Header } from './header';
diff --git a/packages/components/filters/filter-menu/src/index.ts b/packages/components/filters/filter-menu/src/index.ts
new file mode 100644
index 0000000000..4db1cb5703
--- /dev/null
+++ b/packages/components/filters/filter-menu/src/index.ts
@@ -0,0 +1,2 @@
+export { default } from './filter-menu';
+export { default as version } from './version';
diff --git a/packages/components/filters/filter-menu/src/trigger-button/index.ts b/packages/components/filters/filter-menu/src/trigger-button/index.ts
new file mode 100644
index 0000000000..fa7d4eedfb
--- /dev/null
+++ b/packages/components/filters/filter-menu/src/trigger-button/index.ts
@@ -0,0 +1 @@
+export { default as TriggerButton } from './trigger-button';
diff --git a/packages/components/filters/filter-menu/src/trigger-button/trigger-button.spec.tsx b/packages/components/filters/filter-menu/src/trigger-button/trigger-button.spec.tsx
new file mode 100644
index 0000000000..3ac85f91fa
--- /dev/null
+++ b/packages/components/filters/filter-menu/src/trigger-button/trigger-button.spec.tsx
@@ -0,0 +1,12 @@
+import { screen, render } from '../../../../../../test/test-utils';
+import TriggerButton from './trigger-button';
+
+/**
+ * THIS IS A PLACEHOLDER, PLEASE UPDATE IT
+ */
+describe('FilterMenu Trigger Button', () => {
+ it('should render the trigger button', async () => {
+ await render();
+ await screen.findByText(/trigger button/i);
+ });
+});
diff --git a/packages/components/filters/filter-menu/src/trigger-button/trigger-button.tsx b/packages/components/filters/filter-menu/src/trigger-button/trigger-button.tsx
new file mode 100644
index 0000000000..9fdd4ae42c
--- /dev/null
+++ b/packages/components/filters/filter-menu/src/trigger-button/trigger-button.tsx
@@ -0,0 +1,18 @@
+import { Badge } from '../badge';
+import { Chip } from '../chip';
+
+export type TFilterMenuTriggerButtonProps = {
+ label: string;
+};
+
+const TriggerButton = (props: TFilterMenuTriggerButtonProps) => {
+ return (
+
+ );
+};
+
+export default TriggerButton;
diff --git a/packages/components/filters/filter-menu/src/version.ts b/packages/components/filters/filter-menu/src/version.ts
new file mode 100644
index 0000000000..f3a49fe847
--- /dev/null
+++ b/packages/components/filters/filter-menu/src/version.ts
@@ -0,0 +1,2 @@
+// NOTE: This string will be replaced on build time with the package version.
+export default '__@UI_KIT_PACKAGE/VERSION_OF_RELEASE__';
diff --git a/packages/components/filters/filters-list/LICENSE b/packages/components/filters/filters-list/LICENSE
new file mode 100644
index 0000000000..a1f9136d89
--- /dev/null
+++ b/packages/components/filters/filters-list/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 commercetools GmbH
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/packages/components/filters/filters-list/README.md b/packages/components/filters/filters-list/README.md
new file mode 100644
index 0000000000..2ff832b061
--- /dev/null
+++ b/packages/components/filters/filters-list/README.md
@@ -0,0 +1,47 @@
+
+
+
+# FiltersList
+
+## Description
+
+The FiltersList component displays all active filters. It also allows for adding and removing filters.
+
+This description is a stub and shold be expanded as development continues.
+
+## Installation
+
+```
+yarn add @commercetools-uikit/filters-list
+```
+
+```
+npm --save install @commercetools-uikit/filters-list
+```
+
+Additionally install the peer dependencies (if not present)
+
+```
+yarn add react
+```
+
+```
+npm --save install react
+```
+
+## Usage
+
+```jsx
+import FiltersList from '@commercetools-uikit/filters-list';
+
+/**TODO: EXPAND THIS */
+const Example = () => ;
+
+export default Example;
+```
+
+## Properties
+
+| Props | Type | Required | Default | Description |
+| ------- | -------- | :------: | ------- | ------------------- |
+| `label` | `string` | | | This is a stub prop |
diff --git a/packages/components/filters/filters-list/docs/description.md b/packages/components/filters/filters-list/docs/description.md
new file mode 100644
index 0000000000..485a86f9eb
--- /dev/null
+++ b/packages/components/filters/filters-list/docs/description.md
@@ -0,0 +1,3 @@
+The FiltersList component displays all active filters. It also allows for adding and removing filters.
+
+This description is a stub and shold be expanded as development continues.
diff --git a/packages/components/filters/filters-list/docs/usage-example.js b/packages/components/filters/filters-list/docs/usage-example.js
new file mode 100644
index 0000000000..77df559ad6
--- /dev/null
+++ b/packages/components/filters/filters-list/docs/usage-example.js
@@ -0,0 +1,6 @@
+import FiltersList from '@commercetools-uikit/filters-list';
+
+/**TODO: EXPAND THIS */
+const Example = () => ;
+
+export default Example;
diff --git a/packages/components/filters/filters-list/index.ts b/packages/components/filters/filters-list/index.ts
new file mode 100644
index 0000000000..2e6947f31a
--- /dev/null
+++ b/packages/components/filters/filters-list/index.ts
@@ -0,0 +1,6 @@
+// This file exists because we want jest to use our non-compiled code to run tests
+// if this file is missing, and you have a `module` or `main` that points to a non-existing file
+// (ie, a bundle that hasn't been built yet) then jest will fail if the bundle is not yet built.
+// all apps should export all their named exports from their root index.js
+export { default } from './src';
+export * from './src';
diff --git a/packages/components/filters/filters-list/package.json b/packages/components/filters/filters-list/package.json
new file mode 100644
index 0000000000..dbe955932c
--- /dev/null
+++ b/packages/components/filters/filters-list/package.json
@@ -0,0 +1,35 @@
+{
+ "name": "@commercetools-uikit/filters-list",
+ "description": "The `FiltersList` displays all active filters.",
+ "version": "19.11.0",
+ "bugs": "https://github.com/commercetools/ui-kit/issues",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/commercetools/ui-kit.git",
+ "directory": "packages/components/filters/filters-list"
+ },
+ "homepage": "https://uikit.commercetools.com",
+ "keywords": ["javascript", "typescript", "design-system", "react", "uikit"],
+ "license": "MIT",
+ "publishConfig": {
+ "access": "public"
+ },
+ "sideEffects": false,
+ "main": "dist/commercetools-uikit-filters-list.cjs.js",
+ "module": "dist/commercetools-uikit-filters-list.esm.js",
+ "files": ["dist"],
+ "dependencies": {
+ "@babel/runtime": "^7.20.13",
+ "@babel/runtime-corejs3": "^7.20.13",
+ "@emotion/react": "^11.10.5",
+ "@emotion/styled": "^11.10.5",
+ "prop-types": "15.8.1",
+ "react-intl": "^6.3.2"
+ },
+ "devDependencies": {
+ "react": "17.0.2"
+ },
+ "peerDependencies": {
+ "react": "17.x"
+ }
+}
diff --git a/packages/components/filters/filters-list/src/export-types.ts b/packages/components/filters/filters-list/src/export-types.ts
new file mode 100644
index 0000000000..88226c514d
--- /dev/null
+++ b/packages/components/filters/filters-list/src/export-types.ts
@@ -0,0 +1 @@
+export type { TFiltersListProps } from './filters-list';
diff --git a/packages/components/filters/filters-list/src/filters-list.readme.mdx b/packages/components/filters/filters-list/src/filters-list.readme.mdx
new file mode 100644
index 0000000000..346090b28e
--- /dev/null
+++ b/packages/components/filters/filters-list/src/filters-list.readme.mdx
@@ -0,0 +1,6 @@
+import { Meta, Markdown } from '@storybook/blocks';
+import ReadMe from './../README.md?raw'
+
+
+
+{ReadMe}
diff --git a/packages/components/filters/filters-list/src/filters-list.spec.tsx b/packages/components/filters/filters-list/src/filters-list.spec.tsx
new file mode 100644
index 0000000000..a437b3dd4d
--- /dev/null
+++ b/packages/components/filters/filters-list/src/filters-list.spec.tsx
@@ -0,0 +1,12 @@
+import { screen, render } from '../../../../../test/test-utils';
+import FiltersList from './filters-list';
+
+/**
+ * THIS IS A PLACEHOLDER, PLEASE UPDATE IT
+ */
+describe('FilterMenu FiltersList', () => {
+ it('should render the filters-list', async () => {
+ await render();
+ await screen.findByText('filters list');
+ });
+});
diff --git a/packages/components/filters/filters-list/src/filters-list.stories.tsx b/packages/components/filters/filters-list/src/filters-list.stories.tsx
new file mode 100644
index 0000000000..7aa0a77695
--- /dev/null
+++ b/packages/components/filters/filters-list/src/filters-list.stories.tsx
@@ -0,0 +1,22 @@
+import type { Meta, StoryObj } from '@storybook/react';
+import FiltersList from './filters-list';
+
+const meta: Meta = {
+ title: 'components/Filters/FiltersList',
+ component: FiltersList,
+ tags: ['local-dev'],
+ argTypes: {
+ label: {
+ control: 'text',
+ },
+ },
+};
+export default meta;
+
+type Story = StoryObj;
+
+export const BasicExample: Story = {
+ args: {
+ label: 'A list of filters',
+ },
+};
diff --git a/packages/components/filters/filters-list/src/filters-list.tsx b/packages/components/filters/filters-list/src/filters-list.tsx
new file mode 100644
index 0000000000..0d57a3498f
--- /dev/null
+++ b/packages/components/filters/filters-list/src/filters-list.tsx
@@ -0,0 +1,11 @@
+export type TFiltersListProps = {
+ /**
+ * This is a stub prop
+ */
+ label?: string;
+};
+
+function FiltersList(props: TFiltersListProps) {
+ return
{props.label}
;
+}
+export default FiltersList;
diff --git a/packages/components/filters/filters-list/src/filters-list.visualroute.jsx b/packages/components/filters/filters-list/src/filters-list.visualroute.jsx
new file mode 100644
index 0000000000..3961bd048f
--- /dev/null
+++ b/packages/components/filters/filters-list/src/filters-list.visualroute.jsx
@@ -0,0 +1,11 @@
+import { Suite, Spec } from '../../../../../test/percy';
+
+export const routePath = '/filters-list';
+
+export const component = () => (
+
+
+ {/**ACTUAL TEST GOES HERE */}
+
+
+);
diff --git a/packages/components/filters/filters-list/src/filters-list.visualspec.js b/packages/components/filters/filters-list/src/filters-list.visualspec.js
new file mode 100644
index 0000000000..49b5ab525f
--- /dev/null
+++ b/packages/components/filters/filters-list/src/filters-list.visualspec.js
@@ -0,0 +1,12 @@
+import percySnapshot from '@percy/puppeteer';
+import { getDocument, queries } from 'pptr-testing-library';
+
+describe('FiltersList', () => {
+ beforeAll(async () => {
+ await page.goto(`${globalThis.HOST}/filters-list`);
+ });
+
+ it.skip('Default', async () => {
+ // THIS IS A STUB
+ });
+});
diff --git a/packages/components/filters/filters-list/src/index.ts b/packages/components/filters/filters-list/src/index.ts
new file mode 100644
index 0000000000..3ed39b7405
--- /dev/null
+++ b/packages/components/filters/filters-list/src/index.ts
@@ -0,0 +1,2 @@
+export { default } from './filters-list';
+export { default as version } from './version';
diff --git a/packages/components/filters/filters-list/src/version.ts b/packages/components/filters/filters-list/src/version.ts
new file mode 100644
index 0000000000..f3a49fe847
--- /dev/null
+++ b/packages/components/filters/filters-list/src/version.ts
@@ -0,0 +1,2 @@
+// NOTE: This string will be replaced on build time with the package version.
+export default '__@UI_KIT_PACKAGE/VERSION_OF_RELEASE__';
diff --git a/storybook/.storybook/manager.ts b/storybook/.storybook/manager.ts
index 400fbffb61..69e5ba309a 100644
--- a/storybook/.storybook/manager.ts
+++ b/storybook/.storybook/manager.ts
@@ -3,4 +3,18 @@ import { cocoTheme } from './theme';
addons.setConfig({
theme: cocoTheme,
+ sidebar: {
+ filters: {
+ // if the item is tagged with local-dev-only, don't show it in the sidebar in production
+ // see: https://github.com/storybookjs/storybook/issues/9209#issuecomment-1866309500
+ // this cannot be done with `!dev` tag because the Storybook.Meta tag array will only take string literals
+ // see: https://github.com/storybookjs/storybook/discussions/24192
+ patterns: (item) => {
+ if (process.env.NODE_ENV === 'production') {
+ return !item.tags?.includes('local-dev');
+ }
+ return true;
+ },
+ },
+ },
});
diff --git a/storybook/README.md b/storybook/README.md
index 708d4f60fb..60765de3ba 100644
--- a/storybook/README.md
+++ b/storybook/README.md
@@ -20,6 +20,30 @@ yarn start
This will open storybook in your browser. You can now start adding new components or modifying existing ones.
+### Using Storybook as a component playground for local development
+
+When building a new component, storybook can be used to provide a "component playground" that builds a story that is only displayed while running storybook locally. This can be very useful for quick iteration and debugging.
+
+In order to specify that a story should only be available locally, add a `'local-dev'` tag to the `tags` option in the story's `meta` configuration.
+
+For example
+
+```tsx
+import type { Meta, StoryObj } from '@storybook/react';
+
+const meta: Meta = {
+ ...
+ tags: ['local-dev'],
+ ...
+};
+
+...
+
+export default meta;
+```
+
+When the component is ready to be released, remove the `local-dev` tag for the story in order for it to show up in the production storybook documentation.
+
## Creating a build
To create a storybook production-build, run the following command:
diff --git a/yarn.lock b/yarn.lock
index cbaa475f62..39e770313e 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2943,7 +2943,7 @@ __metadata:
languageName: unknown
linkType: soft
-"@commercetools-uikit/dropdown-menu@19.11.0, @commercetools-uikit/dropdown-menu@workspace:packages/components/dropdowns/dropdown-menu":
+"@commercetools-uikit/dropdown-menu@19.11.0, @commercetools-uikit/dropdown-menu@workspace:^, @commercetools-uikit/dropdown-menu@workspace:packages/components/dropdowns/dropdown-menu":
version: 0.0.0-use.local
resolution: "@commercetools-uikit/dropdown-menu@workspace:packages/components/dropdowns/dropdown-menu"
dependencies:
@@ -3062,6 +3062,39 @@ __metadata:
languageName: unknown
linkType: soft
+"@commercetools-uikit/filter-menu@workspace:packages/components/filters/filter-menu":
+ version: 0.0.0-use.local
+ resolution: "@commercetools-uikit/filter-menu@workspace:packages/components/filters/filter-menu"
+ dependencies:
+ "@babel/runtime": ^7.20.13
+ "@babel/runtime-corejs3": ^7.20.13
+ "@commercetools-uikit/dropdown-menu": "workspace:^"
+ "@emotion/react": ^11.10.5
+ "@emotion/styled": ^11.10.5
+ prop-types: 15.8.1
+ react: 17.0.2
+ react-intl: ^6.3.2
+ peerDependencies:
+ react: 17.x
+ languageName: unknown
+ linkType: soft
+
+"@commercetools-uikit/filters-list@workspace:packages/components/filters/filters-list":
+ version: 0.0.0-use.local
+ resolution: "@commercetools-uikit/filters-list@workspace:packages/components/filters/filters-list"
+ dependencies:
+ "@babel/runtime": ^7.20.13
+ "@babel/runtime-corejs3": ^7.20.13
+ "@emotion/react": ^11.10.5
+ "@emotion/styled": ^11.10.5
+ prop-types: 15.8.1
+ react: 17.0.2
+ react-intl: ^6.3.2
+ peerDependencies:
+ react: 17.x
+ languageName: unknown
+ linkType: soft
+
"@commercetools-uikit/flat-button@19.11.0, @commercetools-uikit/flat-button@workspace:packages/components/buttons/flat-button":
version: 0.0.0-use.local
resolution: "@commercetools-uikit/flat-button@workspace:packages/components/buttons/flat-button"