From 58deb857d382f902a2c54283ab9d66c641748b85 Mon Sep 17 00:00:00 2001 From: Suguru Inoue Date: Wed, 30 Jul 2025 13:18:35 +0200 Subject: [PATCH] chore(editor): Support new props in TabOptions (#17822) --- .../src/components/N8nTabs/Tabs.stories.ts | 69 ++++++++++++++++++ .../src/components/N8nTabs/Tabs.vue | 71 +++++++++++++++---- .../@n8n/design-system/src/types/tabs.ts | 2 + 3 files changed, 128 insertions(+), 14 deletions(-) diff --git a/packages/frontend/@n8n/design-system/src/components/N8nTabs/Tabs.stories.ts b/packages/frontend/@n8n/design-system/src/components/N8nTabs/Tabs.stories.ts index 756505f722..dbe6d18595 100644 --- a/packages/frontend/@n8n/design-system/src/components/N8nTabs/Tabs.stories.ts +++ b/packages/frontend/@n8n/design-system/src/components/N8nTabs/Tabs.stories.ts @@ -2,6 +2,7 @@ import { action } from '@storybook/addon-actions'; import type { StoryFn } from '@storybook/vue3'; import N8nTabs from './Tabs.vue'; +import type { TabOptions } from '../../types/tabs'; export default { title: 'Atoms/Tabs', @@ -56,3 +57,71 @@ Example.args = { }, ], }; + +const options: Array> = [ + { + label: 'First', + value: 'first', + }, + { + label: 'Second', + value: 'second', + }, + { + label: 'External Link', + value: 'external', + href: 'https://github.com/', + }, + { + label: 'Danger', + value: 'danger', + variant: 'danger', + icon: 'triangle-alert', + }, + { + label: 'Right Icon', + value: 'rightIcon', + icon: 'circle', + iconPosition: 'right', + }, + { + value: 'iconOnly', + tooltip: 'Icon only tab', + icon: 'circle', + }, + { + label: 'Notification', + value: 'notification', + notification: true, + }, + { + label: 'Settings', + value: 'settings', + icon: 'cog', + align: 'right', + }, +]; + +export const TabVariants = Template.bind({}); +TabVariants.args = { + options, +}; + +export const WithSmallSize = Template.bind({}); +WithSmallSize.args = { + options, + size: 'small', +}; + +export const WithModernVariant = Template.bind({}); +WithModernVariant.args = { + variant: 'modern', + options, +}; + +export const WithSmallAndModern = Template.bind({}); +WithSmallAndModern.args = { + variant: 'modern', + options, + size: 'small', +}; diff --git a/packages/frontend/@n8n/design-system/src/components/N8nTabs/Tabs.vue b/packages/frontend/@n8n/design-system/src/components/N8nTabs/Tabs.vue index ab5ed10a59..c535a9db71 100644 --- a/packages/frontend/@n8n/design-system/src/components/N8nTabs/Tabs.vue +++ b/packages/frontend/@n8n/design-system/src/components/N8nTabs/Tabs.vue @@ -92,7 +92,7 @@ const scrollRight = () => scroll(50); :key="option.value" :class="{ [$style.alignRight]: option.align === 'right' }" > - + @@ -100,35 +100,57 @@ const scrollRight = () => scroll(50); v-if="option.href" target="_blank" :href="option.href" - :class="[$style.link, $style.tab]" + rel="noopener noreferrer" + :class="[$style.link, $style.tab, option.label ? '' : $style.noText]" @click="() => handleTabClick(option.value)" >
{{ option.label }} - - - +
{{ option.label }}
- - {{ option.label }} -
+ + + {{ option.label }} +
+ +
@@ -170,7 +192,9 @@ const scrollRight = () => scroll(50); .tab { --active-tab-border-width: 2px; - display: block; + display: flex; + align-items: center; + gap: var(--spacing-4xs); padding: 0 var(--spacing-s); padding-bottom: calc(var(--spacing-2xs) + var(--active-tab-border-width)); font-size: var(--font-size-s); @@ -223,6 +247,23 @@ const scrollRight = () => scroll(50); .external { display: inline-block; margin-left: var(--spacing-5xs); + + .noText & { + display: block; + margin-left: 0; + } +} + +.noText .icon { + display: block; +} + +.dangerTab { + color: var(--color-danger); + + &:hover { + color: var(--color-danger); + } } .button { @@ -248,7 +289,9 @@ const scrollRight = () => scroll(50); align-items: center; justify-content: center; - div { + &:after { + content: ''; + display: block; height: 0.3em; width: 0.3em; background-color: var(--color-primary); diff --git a/packages/frontend/@n8n/design-system/src/types/tabs.ts b/packages/frontend/@n8n/design-system/src/types/tabs.ts index 5d85d06af3..064ff96473 100644 --- a/packages/frontend/@n8n/design-system/src/types/tabs.ts +++ b/packages/frontend/@n8n/design-system/src/types/tabs.ts @@ -6,6 +6,8 @@ export interface TabOptions { value: Value; label?: string; icon?: IconName; + iconPosition?: 'left' | 'right'; + variant?: 'default' | 'danger'; href?: string; tooltip?: string; align?: 'left' | 'right';