diff --git a/packages/design-system/src/components/N8nColorPicker/ColorPicker.stories.ts b/packages/design-system/src/components/N8nColorPicker/ColorPicker.stories.ts
new file mode 100644
index 000000000..65ac0d6df
--- /dev/null
+++ b/packages/design-system/src/components/N8nColorPicker/ColorPicker.stories.ts
@@ -0,0 +1,59 @@
+import { action } from '@storybook/addon-actions';
+import type { StoryFn } from '@storybook/vue';
+import N8nColorPicker from './ColorPicker.vue';
+
+export default {
+ title: 'Atoms/ColorPicker',
+ component: N8nColorPicker,
+ argTypes: {
+ disabled: {
+ control: 'boolean',
+ },
+ size: {
+ control: 'select',
+ options: ['mini', 'small', 'medium', 'large'],
+ },
+ showAlpha: {
+ control: 'boolean',
+ },
+ colorFormat: {
+ control: 'select',
+ options: ['hsl', 'hsv', 'hex', 'rgb'],
+ },
+ popperClass: {
+ control: 'text',
+ },
+ predefine: {
+ control: 'array',
+ },
+ },
+};
+
+const methods = {
+ onChange: action('change'),
+ onActiveChange: action('active-change'),
+ onInput: action('input'),
+};
+
+const DefaultTemplate: StoryFn = (args, { argTypes }) => ({
+ props: Object.keys(argTypes),
+ components: {
+ N8nColorPicker,
+ },
+ data: () => ({
+ color: null,
+ }),
+ template:
+ '',
+ methods,
+});
+
+export const Default = DefaultTemplate.bind({});
+Default.args = {
+ disabled: false,
+ size: 'medium',
+ showAlpha: false,
+ colorFormat: '',
+ popperClass: '',
+ showInput: true,
+};
diff --git a/packages/design-system/src/components/N8nColorPicker/ColorPicker.vue b/packages/design-system/src/components/N8nColorPicker/ColorPicker.vue
new file mode 100644
index 000000000..5a52c6d10
--- /dev/null
+++ b/packages/design-system/src/components/N8nColorPicker/ColorPicker.vue
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/design-system/src/components/N8nColorPicker/__tests__/ColorPicker.spec.ts b/packages/design-system/src/components/N8nColorPicker/__tests__/ColorPicker.spec.ts
new file mode 100644
index 000000000..0367928bc
--- /dev/null
+++ b/packages/design-system/src/components/N8nColorPicker/__tests__/ColorPicker.spec.ts
@@ -0,0 +1,16 @@
+import { render } from '@testing-library/vue';
+import N8nColorPicker from '../ColorPicker.vue';
+
+describe('components', () => {
+ describe('N8nColorPicker', () => {
+ it('should render with input', () => {
+ const { container } = render(N8nColorPicker);
+ expect(container).toMatchSnapshot();
+ });
+
+ it('should render without input', () => {
+ const { container } = render(N8nColorPicker, { props: { showInput: false } });
+ expect(container).toMatchSnapshot();
+ });
+ });
+});
diff --git a/packages/design-system/src/components/N8nColorPicker/__tests__/__snapshots__/ColorPicker.spec.ts.snap b/packages/design-system/src/components/N8nColorPicker/__tests__/__snapshots__/ColorPicker.spec.ts.snap
new file mode 100644
index 000000000..1e4756cfe
--- /dev/null
+++ b/packages/design-system/src/components/N8nColorPicker/__tests__/__snapshots__/ColorPicker.spec.ts.snap
@@ -0,0 +1,269 @@
+// Vitest Snapshot v1
+
+exports[`components > N8nColorPicker > should render with input 1`] = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`components > N8nColorPicker > should render without input 1`] = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
diff --git a/packages/design-system/src/components/N8nColorPicker/index.ts b/packages/design-system/src/components/N8nColorPicker/index.ts
new file mode 100644
index 000000000..f9bdd8901
--- /dev/null
+++ b/packages/design-system/src/components/N8nColorPicker/index.ts
@@ -0,0 +1,3 @@
+import N8nColorPicker from './ColorPicker.vue';
+
+export default N8nColorPicker;
diff --git a/packages/design-system/src/components/index.ts b/packages/design-system/src/components/index.ts
index 32fdfd9e0..3aa18cf0b 100644
--- a/packages/design-system/src/components/index.ts
+++ b/packages/design-system/src/components/index.ts
@@ -48,3 +48,4 @@ export { default as N8nUsersList } from './N8nUsersList';
export { default as N8nResizeWrapper } from './N8nResizeWrapper';
export { default as N8nRecycleScroller } from './N8nRecycleScroller';
export { default as N8nCheckbox } from './N8nCheckbox';
+export { default as N8nColorPicker } from './N8nColorPicker';
diff --git a/packages/design-system/src/plugin.ts b/packages/design-system/src/plugin.ts
index 71d7ff4df..2166c6dc3 100644
--- a/packages/design-system/src/plugin.ts
+++ b/packages/design-system/src/plugin.ts
@@ -51,6 +51,7 @@ import {
N8nResizeWrapper,
N8nRecycleScroller,
N8nCheckbox,
+ N8nColorPicker,
} from './components';
export const N8nPlugin: PluginObject<{}> = {
@@ -105,5 +106,6 @@ export const N8nPlugin: PluginObject<{}> = {
app.component('n8n-resize-wrapper', N8nResizeWrapper);
app.component('n8n-recycle-scroller', N8nRecycleScroller);
app.component('n8n-checkbox', N8nCheckbox);
+ app.component('n8n-color-picker', N8nColorPicker);
},
};