diff --git a/cypress/composables/workflow.ts b/cypress/composables/workflow.ts index c3ee945c0d..f13918c75f 100644 --- a/cypress/composables/workflow.ts +++ b/cypress/composables/workflow.ts @@ -92,7 +92,7 @@ export function getNodeByName(name: string) { export function getNodesWithSpinner() { return cy .getByTestId('canvas-node') - .filter((_, el) => Cypress.$(el).find('[data-icon=sync-alt]').length > 0); + .filter((_, el) => Cypress.$(el).find('[data-icon=refresh-cw]').length > 0); } export function getWaitingNodes() { diff --git a/cypress/e2e/19-execution.cy.ts b/cypress/e2e/19-execution.cy.ts index c8836051ed..acb476734b 100644 --- a/cypress/e2e/19-execution.cy.ts +++ b/cypress/e2e/19-execution.cy.ts @@ -41,33 +41,33 @@ describe('Execution', () => { // Check canvas nodes after 1st step (workflow passed the manual trigger node workflowPage.getters .canvasNodeByName('Manual') - .within(() => cy.get('.fa-check')) + .within(() => cy.get('svg[data-icon=check]')) .should('exist'); workflowPage.getters .canvasNodeByName('Wait') - .within(() => cy.get('.fa-check').should('not.exist')); + .within(() => cy.get('svg[data-icon=check]').should('not.exist')); workflowPage.getters .canvasNodeByName('Wait') - .within(() => cy.get('.fa-sync-alt')) + .within(() => cy.get('svg[data-icon=refresh-cw]')) .should('exist'); workflowPage.getters .canvasNodeByName('Set') - .within(() => cy.get('.fa-check').should('not.exist')); + .within(() => cy.get('svg[data-icon=check]').should('not.exist')); cy.wait(2000); // Check canvas nodes after 2nd step (waiting node finished its execution and the http request node is about to start) workflowPage.getters .canvasNodeByName('Manual') - .within(() => cy.get('.fa-check')) + .within(() => cy.get('svg[data-icon=check]')) .should('exist'); workflowPage.getters .canvasNodeByName('Wait') - .within(() => cy.get('.fa-check')) + .within(() => cy.get('svg[data-icon=check]')) .should('exist'); workflowPage.getters .canvasNodeByName('Set') - .within(() => cy.get('.fa-check')) + .within(() => cy.get('svg[data-icon=check]')) .should('exist'); successToast().should('be.visible'); @@ -101,18 +101,18 @@ describe('Execution', () => { // Check canvas nodes after 1st step (workflow passed the manual trigger node workflowPage.getters .canvasNodeByName('Manual') - .within(() => cy.get('.fa-check')) + .within(() => cy.get('svg[data-icon=check]')) .should('exist'); workflowPage.getters .canvasNodeByName('Wait') - .within(() => cy.get('.fa-check').should('not.exist')); + .within(() => cy.get('svg[data-icon=check]').should('not.exist')); workflowPage.getters .canvasNodeByName('Wait') - .within(() => cy.get('.fa-sync-alt')) + .within(() => cy.get('svg[data-icon=refresh-cw]')) .should('exist'); workflowPage.getters .canvasNodeByName('Set') - .within(() => cy.get('.fa-check').should('not.exist')); + .within(() => cy.get('svg[data-icon=check]').should('not.exist')); successToast().should('be.visible'); clearNotifications(); @@ -123,16 +123,16 @@ describe('Execution', () => { // Check canvas nodes after workflow stopped workflowPage.getters .canvasNodeByName('Manual') - .within(() => cy.get('.fa-check')) + .within(() => cy.get('svg[data-icon=check]')) .should('exist'); workflowPage.getters .canvasNodeByName('Wait') - .within(() => cy.get('.fa-sync-alt').should('not.exist')); + .within(() => cy.get('svg[data-icon=refresh-cw]').should('not.exist')); workflowPage.getters .canvasNodeByName('Set') - .within(() => cy.get('.fa-check').should('not.exist')); + .within(() => cy.get('svg[data-icon=check]').should('not.exist')); successToast().should('be.visible'); @@ -181,29 +181,29 @@ describe('Execution', () => { // Check canvas nodes after 1st step (workflow passed the manual trigger node workflowPage.getters .canvasNodeByName('Webhook') - .within(() => cy.get('.fa-check')) + .within(() => cy.get('svg[data-icon=check]')) .should('exist'); workflowPage.getters .canvasNodeByName('Wait') - .within(() => cy.get('.fa-check').should('not.exist')); + .within(() => cy.get('svg[data-icon=check]').should('not.exist')); workflowPage.getters .canvasNodeByName('Wait') - .within(() => cy.get('.fa-sync-alt')) + .within(() => cy.get('svg[data-icon=refresh-cw]')) .should('exist'); workflowPage.getters .canvasNodeByName('Set') - .within(() => cy.get('.fa-check').should('not.exist')); + .within(() => cy.get('svg[data-icon=check]').should('not.exist')); cy.wait(2000); // Check canvas nodes after 2nd step (waiting node finished its execution and the http request node is about to start) workflowPage.getters .canvasNodeByName('Webhook') - .within(() => cy.get('.fa-check')) + .within(() => cy.get('svg[data-icon=check]')) .should('exist'); workflowPage.getters .canvasNodeByName('Set') - .within(() => cy.get('.fa-check')) + .within(() => cy.get('svg[data-icon=check]')) .should('exist'); successToast().should('be.visible'); @@ -578,11 +578,11 @@ describe('Execution', () => { // Check that the previous nodes executed successfully workflowPage.getters .canvasNodeByName('DebugHelper') - .within(() => cy.get('.fa-check')) + .within(() => cy.get('svg[data-icon=check]')) .should('exist'); workflowPage.getters .canvasNodeByName('Filter') - .within(() => cy.get('.fa-check')) + .within(() => cy.get('svg[data-icon=check]')) .should('exist'); errorToast().should('contain', 'Problem in node ‘Telegram‘'); @@ -596,7 +596,7 @@ describe('Execution', () => { workflowPage.getters .canvasNodeByName('Edit Fields') - .within(() => cy.get('.fa-check')) + .within(() => cy.get('svg[data-icon=check]')) .should('exist'); workflowPage.getters.canvasNodeByName('Edit Fields').dblclick(); diff --git a/cypress/e2e/39-projects.cy.ts b/cypress/e2e/39-projects.cy.ts index 5d46f58621..ef974ff41f 100644 --- a/cypress/e2e/39-projects.cy.ts +++ b/cypress/e2e/39-projects.cy.ts @@ -342,14 +342,14 @@ describe('Projects', { disableAutoLogin: true }, () => { }); it('should set and update project icon', () => { - const DEFAULT_ICON = 'fa-layer-group'; + const DEFAULT_ICON = 'layers'; const NEW_PROJECT_NAME = 'Test Project'; cy.signinAsAdmin(); cy.visit(workflowsPage.url); projects.createProject(NEW_PROJECT_NAME); // New project should have default icon - projects.getIconPickerButton().find('svg').should('have.class', DEFAULT_ICON); + projects.getIconPickerButton().find('svg').should('have.attr', 'data-icon', DEFAULT_ICON); // Choose another icon projects.getIconPickerButton().click(); projects.getIconPickerTab('Emojis').click(); diff --git a/packages/frontend/@n8n/chat/src/components/MessagesList.vue b/packages/frontend/@n8n/chat/src/components/MessagesList.vue index b96be9dcc7..2dcf3cb2d9 100644 --- a/packages/frontend/@n8n/chat/src/components/MessagesList.vue +++ b/packages/frontend/@n8n/chat/src/components/MessagesList.vue @@ -36,7 +36,7 @@ watch( class="empty-container" >
- + {{ emptyText }} diff --git a/packages/frontend/@n8n/chat/src/env.d.ts b/packages/frontend/@n8n/chat/src/env.d.ts index 1e9445333b..a7f03e8558 100644 --- a/packages/frontend/@n8n/chat/src/env.d.ts +++ b/packages/frontend/@n8n/chat/src/env.d.ts @@ -15,3 +15,10 @@ declare module 'markdown-it-task-lists' { export = markdownItTaskLists; } + +declare module '~icons/*' { + import type { FunctionalComponent, SVGAttributes } from 'vue'; + + const component: FunctionalComponent; + export default component; +} diff --git a/packages/frontend/@n8n/design-system/package.json b/packages/frontend/@n8n/design-system/package.json index a9088571a3..ceef2a463d 100644 --- a/packages/frontend/@n8n/design-system/package.json +++ b/packages/frontend/@n8n/design-system/package.json @@ -39,8 +39,8 @@ "postcss": "^8.4.38", "sass": "^1.64.1", "tailwindcss": "^3.4.3", - "unplugin-icons": "^0.19.0", - "unplugin-vue-components": "^0.27.2", + "unplugin-icons": "catalog:frontend", + "unplugin-vue-components": "catalog:frontend", "vite": "catalog:", "vitest": "catalog:", "vitest-mock-extended": "catalog:", diff --git a/packages/frontend/@n8n/design-system/src/components/AskAssistantChat/AskAssistantChat.vue b/packages/frontend/@n8n/design-system/src/components/AskAssistantChat/AskAssistantChat.vue index 541dee2a12..f80d4f860d 100644 --- a/packages/frontend/@n8n/design-system/src/components/AskAssistantChat/AskAssistantChat.vue +++ b/packages/frontend/@n8n/design-system/src/components/AskAssistantChat/AskAssistantChat.vue @@ -294,7 +294,7 @@ function onSubmitFeedback(feedback: string) { /> does not render retry button if no error is present
@@ -181,7 +180,7 @@ exports[`AskAssistantChat > does not render retry button if no error is present class="sendButton" data-test-id="send-message-button" disabled="true" - icon="paper-plane" + icon="send" loading="false" outline="false" size="large" @@ -263,7 +262,6 @@ exports[`AskAssistantChat > renders chat with messages correctly 1`] = ` @@ -614,7 +612,7 @@ exports[`AskAssistantChat > renders chat with messages correctly 1`] = ` data-test-id="replace-code-button" disabled="false" element="button" - icon="refresh" + icon="refresh-cw" label="" loading="false" outline="false" @@ -918,7 +916,7 @@ Testing more code data-test-id="replace-code-button" disabled="false" element="button" - icon="refresh" + icon="refresh-cw" label="" loading="false" outline="false" @@ -999,7 +997,7 @@ Testing more code class="sendButton" data-test-id="send-message-button" disabled="true" - icon="paper-plane" + icon="send" loading="false" outline="false" size="large" @@ -1081,7 +1079,6 @@ exports[`AskAssistantChat > renders default placeholder chat correctly 1`] = ` @@ -1186,7 +1183,7 @@ exports[`AskAssistantChat > renders default placeholder chat correctly 1`] = ` class="sendButton" data-test-id="send-message-button" disabled="true" - icon="paper-plane" + icon="send" loading="false" outline="false" size="large" @@ -1268,7 +1265,6 @@ exports[`AskAssistantChat > renders end of session chat correctly 1`] = ` @@ -1457,7 +1453,7 @@ exports[`AskAssistantChat > renders end of session chat correctly 1`] = ` class="sendButton" data-test-id="send-message-button" disabled="true" - icon="paper-plane" + icon="send" loading="false" outline="false" size="large" @@ -1539,7 +1535,6 @@ exports[`AskAssistantChat > renders error message correctly with retry button 1` @@ -1615,7 +1610,7 @@ exports[`AskAssistantChat > renders error message correctly with retry button 1` > @@ -1663,7 +1658,7 @@ exports[`AskAssistantChat > renders error message correctly with retry button 1` class="sendButton" data-test-id="send-message-button" disabled="true" - icon="paper-plane" + icon="send" loading="false" outline="false" size="large" @@ -1745,7 +1740,6 @@ exports[`AskAssistantChat > renders message with code snippet 1`] = ` @@ -1927,7 +1921,7 @@ catch(e) { class="sendButton" data-test-id="send-message-button" disabled="true" - icon="paper-plane" + icon="send" loading="false" outline="false" size="large" @@ -2009,7 +2003,6 @@ exports[`AskAssistantChat > renders streaming chat correctly 1`] = ` @@ -2124,7 +2117,7 @@ exports[`AskAssistantChat > renders streaming chat correctly 1`] = ` class="sendButton" data-test-id="send-message-button" disabled="true" - icon="paper-plane" + icon="send" loading="false" outline="false" size="large" diff --git a/packages/frontend/@n8n/design-system/src/components/AskAssistantChat/messages/ErrorMessage.vue b/packages/frontend/@n8n/design-system/src/components/AskAssistantChat/messages/ErrorMessage.vue index 290c8a0520..cf1288fc8e 100644 --- a/packages/frontend/@n8n/design-system/src/components/AskAssistantChat/messages/ErrorMessage.vue +++ b/packages/frontend/@n8n/design-system/src/components/AskAssistantChat/messages/ErrorMessage.vue @@ -22,7 +22,7 @@ const { t } = useI18n();

- + {{ message.content }}

{
- + {{ t('codeDiff.couldNotReplace') }}
@@ -131,7 +131,7 @@ const diffs = computed(() => { v-else :type="replacing ? 'secondary' : 'primary'" size="mini" - icon="refresh" + icon="refresh-cw" data-test-id="replace-code-button" :disabled="!content || streaming" :loading="replacing" diff --git a/packages/frontend/@n8n/design-system/src/components/CodeDiff/__snapshots__/CodeDiff.test.ts.snap b/packages/frontend/@n8n/design-system/src/components/CodeDiff/__snapshots__/CodeDiff.test.ts.snap index 6fdaa70094..725c9764fc 100644 --- a/packages/frontend/@n8n/design-system/src/components/CodeDiff/__snapshots__/CodeDiff.test.ts.snap +++ b/packages/frontend/@n8n/design-system/src/components/CodeDiff/__snapshots__/CodeDiff.test.ts.snap @@ -276,7 +276,7 @@ exports[`CodeDiff > renders code diff correctly 1`] = ` data-test-id="replace-code-button" disabled="false" element="button" - icon="refresh" + icon="refresh-cw" label="" loading="false" outline="false" @@ -543,8 +543,7 @@ exports[`CodeDiff > renders error state correctly 1`] = ` renders replaced code diff correctly 1`] = ` data-test-id="undo-replace-button" disabled="false" element="button" - icon="undo" + icon="undo-2" label="" loading="false" outline="false" @@ -827,7 +826,6 @@ exports[`CodeDiff > renders replaced code diff correctly 1`] = ` class="ml-xs" color="success" icon="check" - size="medium" spin="false" /> renders replacing code diff correctly 1`] = ` data-test-id="replace-code-button" disabled="false" element="button" - icon="refresh" + icon="refresh-cw" label="" loading="true" outline="false" diff --git a/packages/frontend/@n8n/design-system/src/components/N8nActionBox/ActionBox.vue b/packages/frontend/@n8n/design-system/src/components/N8nActionBox/ActionBox.vue index 3cc40d1368..61da75049e 100644 --- a/packages/frontend/@n8n/design-system/src/components/N8nActionBox/ActionBox.vue +++ b/packages/frontend/@n8n/design-system/src/components/N8nActionBox/ActionBox.vue @@ -5,6 +5,7 @@ import type { ButtonType } from '@n8n/design-system/types/button'; import N8nButton from '../N8nButton'; import N8nCallout, { type CalloutTheme } from '../N8nCallout'; import N8nHeading from '../N8nHeading'; +import { type IconName } from '../N8nIcon/icons'; import N8nText from '../N8nText'; interface ActionBoxProps { @@ -13,11 +14,11 @@ interface ActionBoxProps { buttonText?: string; buttonType?: ButtonType; buttonDisabled?: boolean; - buttonIcon?: string; + buttonIcon?: IconName; description?: string; calloutText?: string; calloutTheme?: CalloutTheme; - calloutIcon?: string; + calloutIcon?: IconName; } defineOptions({ name: 'N8nActionBox' }); diff --git a/packages/frontend/@n8n/design-system/src/components/N8nActionDropdown/ActionDropdown.stories.ts b/packages/frontend/@n8n/design-system/src/components/N8nActionDropdown/ActionDropdown.stories.ts index 1de5c76fe1..006b29be70 100644 --- a/packages/frontend/@n8n/design-system/src/components/N8nActionDropdown/ActionDropdown.stories.ts +++ b/packages/frontend/@n8n/design-system/src/components/N8nActionDropdown/ActionDropdown.stories.ts @@ -51,7 +51,7 @@ defaultActionDropdown.args = { export const customStyling = template.bind({}); customStyling.args = { - activatorIcon: 'bars', + activatorIcon: 'menu', items: [ { id: 'item1', @@ -67,7 +67,7 @@ customStyling.args = { { id: 'item3', label: 'Action 3', - icon: 'heart', + icon: 'home', divided: true, }, ], diff --git a/packages/frontend/@n8n/design-system/src/components/N8nActionDropdown/ActionDropdown.test.ts b/packages/frontend/@n8n/design-system/src/components/N8nActionDropdown/ActionDropdown.test.ts index be6a810d14..9329a80f9a 100644 --- a/packages/frontend/@n8n/design-system/src/components/N8nActionDropdown/ActionDropdown.test.ts +++ b/packages/frontend/@n8n/design-system/src/components/N8nActionDropdown/ActionDropdown.test.ts @@ -43,7 +43,7 @@ describe('components', () => { { id: 'item3', label: 'Action 3', - icon: 'heart', + icon: 'house', divided: true, }, ], diff --git a/packages/frontend/@n8n/design-system/src/components/N8nActionDropdown/ActionDropdown.vue b/packages/frontend/@n8n/design-system/src/components/N8nActionDropdown/ActionDropdown.vue index 17d7ce595a..2a32ded027 100644 --- a/packages/frontend/@n8n/design-system/src/components/N8nActionDropdown/ActionDropdown.vue +++ b/packages/frontend/@n8n/design-system/src/components/N8nActionDropdown/ActionDropdown.vue @@ -12,6 +12,7 @@ import type { ActionDropdownItem, IconSize, ButtonSize } from '@n8n/design-syste import N8nBadge from '../N8nBadge'; import N8nIcon from '../N8nIcon'; +import { type IconName } from '../N8nIcon/icons'; import N8nIconButton from '../N8nIconButton'; import { N8nKeyboardShortcut } from '../N8nKeyboardShortcut'; @@ -20,7 +21,7 @@ const TRIGGER = ['click', 'hover'] as const; interface ActionDropdownProps { items: ActionDropdownItem[]; placement?: Placement; - activatorIcon?: string; + activatorIcon?: IconName; activatorSize?: ButtonSize; iconSize?: IconSize; trigger?: (typeof TRIGGER)[number]; @@ -31,7 +32,7 @@ interface ActionDropdownProps { const props = withDefaults(defineProps(), { placement: 'bottom', - activatorIcon: 'ellipsis-h', + activatorIcon: 'ellipsis', activatorSize: 'medium', iconSize: 'medium', trigger: 'click', diff --git a/packages/frontend/@n8n/design-system/src/components/N8nActionToggle/ActionToggle.vue b/packages/frontend/@n8n/design-system/src/components/N8nActionToggle/ActionToggle.vue index eef65f7a8c..cb83c62144 100644 --- a/packages/frontend/@n8n/design-system/src/components/N8nActionToggle/ActionToggle.vue +++ b/packages/frontend/@n8n/design-system/src/components/N8nActionToggle/ActionToggle.vue @@ -89,7 +89,7 @@ defineExpose({ @@ -120,7 +120,7 @@ defineExpose({
diff --git a/packages/frontend/@n8n/design-system/src/components/N8nAlert/Alert.test.ts b/packages/frontend/@n8n/design-system/src/components/N8nAlert/Alert.test.ts index 9324e1054a..6f77f6d58a 100644 --- a/packages/frontend/@n8n/design-system/src/components/N8nAlert/Alert.test.ts +++ b/packages/frontend/@n8n/design-system/src/components/N8nAlert/Alert.test.ts @@ -1,7 +1,6 @@ import { render, screen } from '@testing-library/vue'; import N8nAlert from './Alert.vue'; -import N8nIcon from '../N8nIcon'; describe('components', () => { describe('N8nAlert', () => { @@ -21,11 +20,14 @@ describe('components', () => { title: 'Title', default: 'Message', aside: '', - icon: '', + icon: '', }, global: { components: { - 'n8n-icon': N8nIcon, + 'n8n-icon': { + template: '', + props: ['icon'], + }, }, }, }); diff --git a/packages/frontend/@n8n/design-system/src/components/N8nAlert/Alert.vue b/packages/frontend/@n8n/design-system/src/components/N8nAlert/Alert.vue index 620bd64c35..fcda1335d9 100644 --- a/packages/frontend/@n8n/design-system/src/components/N8nAlert/Alert.vue +++ b/packages/frontend/@n8n/design-system/src/components/N8nAlert/Alert.vue @@ -23,13 +23,13 @@ const props = withDefaults(defineProps(), { const icon = computed(() => { switch (props.type) { case 'success': - return 'check-circle'; + return 'circle-check'; case 'warning': - return 'exclamation-triangle'; + return 'triangle-alert'; case 'error': - return 'times-circle'; + return 'circle-x'; default: - return 'info-circle'; + return 'info'; } }); diff --git a/packages/frontend/@n8n/design-system/src/components/N8nBreadcrumbs/Breadcrumbs.stories.ts b/packages/frontend/@n8n/design-system/src/components/N8nBreadcrumbs/Breadcrumbs.stories.ts index 932c64af24..42dc22ec24 100644 --- a/packages/frontend/@n8n/design-system/src/components/N8nBreadcrumbs/Breadcrumbs.stories.ts +++ b/packages/frontend/@n8n/design-system/src/components/N8nBreadcrumbs/Breadcrumbs.stories.ts @@ -141,7 +141,7 @@ const withSlotsTemplate: StoryFn = (args, { argTypes }) => ({ template: ` diff --git a/packages/frontend/@n8n/design-system/src/components/N8nButton/Button.stories.ts b/packages/frontend/@n8n/design-system/src/components/N8nButton/Button.stories.ts index 3aef3d5a05..922116b225 100644 --- a/packages/frontend/@n8n/design-system/src/components/N8nButton/Button.stories.ts +++ b/packages/frontend/@n8n/design-system/src/components/N8nButton/Button.stories.ts @@ -149,7 +149,7 @@ Text.args = { export const WithIcon = AllSizesTemplate.bind({}); WithIcon.args = { label: 'Button', - icon: 'plus-circle', + icon: 'circle-plus', }; export const Square = AllColorsAndSizesTemplate.bind({}); diff --git a/packages/frontend/@n8n/design-system/src/components/N8nButton/Button.test.ts b/packages/frontend/@n8n/design-system/src/components/N8nButton/Button.test.ts index 5b224594b2..80df349f79 100644 --- a/packages/frontend/@n8n/design-system/src/components/N8nButton/Button.test.ts +++ b/packages/frontend/@n8n/design-system/src/components/N8nButton/Button.test.ts @@ -39,7 +39,7 @@ describe('components', () => { it('should render icon button', () => { const wrapper = render(N8nButton, { props: { - icon: 'plus-circle', + icon: 'circle-plus', }, slots, global: { diff --git a/packages/frontend/@n8n/design-system/src/components/N8nButton/__snapshots__/Button.test.ts.snap b/packages/frontend/@n8n/design-system/src/components/N8nButton/__snapshots__/Button.test.ts.snap index 471068c333..5c2f13a3d9 100644 --- a/packages/frontend/@n8n/design-system/src/components/N8nButton/__snapshots__/Button.test.ts.snap +++ b/packages/frontend/@n8n/design-system/src/components/N8nButton/__snapshots__/Button.test.ts.snap @@ -1,6 +1,6 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`components > N8nButton > props > icon > should render icon button 1`] = `""`; +exports[`components > N8nButton > props > icon > should render icon button 1`] = `""`; exports[`components > N8nButton > props > loading > should render loading spinner 1`] = `""`; diff --git a/packages/frontend/@n8n/design-system/src/components/N8nCallout/Callout.stories.ts b/packages/frontend/@n8n/design-system/src/components/N8nCallout/Callout.stories.ts index 9d30101ff1..07f3a8590f 100644 --- a/packages/frontend/@n8n/design-system/src/components/N8nCallout/Callout.stories.ts +++ b/packages/frontend/@n8n/design-system/src/components/N8nCallout/Callout.stories.ts @@ -73,7 +73,7 @@ defaultCallout.args = { export const customCallout = template.bind({}); customCallout.args = { theme: 'custom', - icon: 'code-branch', + icon: 'git-branch', default: ` This is a custom callout. `, @@ -87,7 +87,7 @@ customCallout.args = { export const secondaryCallout = template.bind({}); secondaryCallout.args = { theme: 'secondary', - icon: 'thumbtack', + icon: 'pin', default: ` This data is pinned. `, diff --git a/packages/frontend/@n8n/design-system/src/components/N8nCallout/Callout.test.ts b/packages/frontend/@n8n/design-system/src/components/N8nCallout/Callout.test.ts index e308a73828..d6ae009f40 100644 --- a/packages/frontend/@n8n/design-system/src/components/N8nCallout/Callout.test.ts +++ b/packages/frontend/@n8n/design-system/src/components/N8nCallout/Callout.test.ts @@ -78,7 +78,7 @@ describe('components', () => { const wrapper = render(N8nCallout, { props: { theme: 'custom', - icon: 'code-branch', + icon: 'git-branch', }, global: { stubs: ['n8n-icon', 'n8n-text'], @@ -93,7 +93,7 @@ describe('components', () => { const wrapper = render(N8nCallout, { props: { theme: 'custom', - icon: 'code-branch', + icon: 'git-branch', }, global: { stubs: ['n8n-icon', 'n8n-text', 'n8n-link'], diff --git a/packages/frontend/@n8n/design-system/src/components/N8nCallout/Callout.vue b/packages/frontend/@n8n/design-system/src/components/N8nCallout/Callout.vue index 3d755c17cb..a4a6ce054e 100644 --- a/packages/frontend/@n8n/design-system/src/components/N8nCallout/Callout.vue +++ b/packages/frontend/@n8n/design-system/src/components/N8nCallout/Callout.vue @@ -4,18 +4,19 @@ import { computed, useCssModule } from 'vue'; import type { IconSize, CalloutTheme } from '@n8n/design-system/types'; import N8nIcon from '../N8nIcon'; +import { type IconName } from '../N8nIcon/icons'; import N8nText from '../N8nText'; -const CALLOUT_DEFAULT_ICONS: Record = { - info: 'info-circle', - success: 'check-circle', - warning: 'exclamation-triangle', - danger: 'exclamation-triangle', +const CALLOUT_DEFAULT_ICONS: Record = { + info: 'info', + success: 'circle-check', + warning: 'triangle-alert', + danger: 'triangle-alert', }; interface CalloutProps { theme: CalloutTheme; - icon?: string; + icon?: IconName; iconSize?: IconSize; iconless?: boolean; slim?: boolean; diff --git a/packages/frontend/@n8n/design-system/src/components/N8nCallout/__snapshots__/Callout.test.ts.snap b/packages/frontend/@n8n/design-system/src/components/N8nCallout/__snapshots__/Callout.test.ts.snap index 0ba2bec217..327854b6a5 100644 --- a/packages/frontend/@n8n/design-system/src/components/N8nCallout/__snapshots__/Callout.test.ts.snap +++ b/packages/frontend/@n8n/design-system/src/components/N8nCallout/__snapshots__/Callout.test.ts.snap @@ -4,7 +4,7 @@ exports[`components > N8nCallout > should render additional slots correctly 1`] "`, - ); + expect(html()).toMatchSnapshot(); }); it('should not render container if no possible connections', async () => { diff --git a/packages/frontend/editor-ui/src/components/Node/NodeCreation.vue b/packages/frontend/editor-ui/src/components/Node/NodeCreation.vue index db7e7dc841..8a0acba366 100644 --- a/packages/frontend/editor-ui/src/components/Node/NodeCreation.vue +++ b/packages/frontend/editor-ui/src/components/Node/NodeCreation.vue @@ -109,7 +109,7 @@ function nodeTypeSelected(value: NodeTypeSelectedPayload[]) { @@ -131,14 +131,14 @@ function nodeTypeSelected(value: NodeTypeSelectedPayload[]) { v-if="experimentalNdvStore.isEnabled" type="tertiary" size="large" - icon="expand" + icon="maximize-2" @click="experimentalNdvStore.expandAllNodes" />
diff --git a/packages/frontend/editor-ui/src/components/Node/NodeCreator/CategoryItem.test.ts b/packages/frontend/editor-ui/src/components/Node/NodeCreator/CategoryItem.test.ts index 4d64abb728..b5591e8046 100644 --- a/packages/frontend/editor-ui/src/components/Node/NodeCreator/CategoryItem.test.ts +++ b/packages/frontend/editor-ui/src/components/Node/NodeCreator/CategoryItem.test.ts @@ -27,8 +27,8 @@ describe('CategoryItem', () => { props: { name: 'Category Test', isTrigger: true }, }); - expect(container.querySelector('[data-icon="bolt"]')).toBeInTheDocument(); + expect(container.querySelector('[data-icon="zap"]')).toBeInTheDocument(); await rerender({ isTrigger: false }); - expect(container.querySelector('[data-icon="bolt"]')).not.toBeInTheDocument(); + expect(container.querySelector('[data-icon="zap"]')).not.toBeInTheDocument(); }); }); diff --git a/packages/frontend/editor-ui/src/components/Node/NodeCreator/ItemTypes/CategoryItem.vue b/packages/frontend/editor-ui/src/components/Node/NodeCreator/ItemTypes/CategoryItem.vue index ead3d49232..b7f487531d 100644 --- a/packages/frontend/editor-ui/src/components/Node/NodeCreator/ItemTypes/CategoryItem.vue +++ b/packages/frontend/editor-ui/src/components/Node/NodeCreator/ItemTypes/CategoryItem.vue @@ -28,11 +28,11 @@ const categoryName = computed(() => {
- + - - + +
@@ -72,10 +72,4 @@ const categoryName = computed(() => { flex-grow: 1; color: var(--color-text-dark); } - -.arrow { - font-size: var(--font-size-2xs); - width: 12px; - color: $node-creator-arrow-color; -} diff --git a/packages/frontend/editor-ui/src/components/Node/NodeCreator/ItemTypes/LinkItem.vue b/packages/frontend/editor-ui/src/components/Node/NodeCreator/ItemTypes/LinkItem.vue index b5c3dc55a2..cb2ae243bf 100644 --- a/packages/frontend/editor-ui/src/components/Node/NodeCreator/ItemTypes/LinkItem.vue +++ b/packages/frontend/editor-ui/src/components/Node/NodeCreator/ItemTypes/LinkItem.vue @@ -18,7 +18,13 @@ defineProps(); :show-action-arrow="true" > diff --git a/packages/frontend/editor-ui/src/components/Node/NodeCreator/ItemTypes/NodeItem.vue b/packages/frontend/editor-ui/src/components/Node/NodeCreator/ItemTypes/NodeItem.vue index 92e2f85af4..9158dfec88 100644 --- a/packages/frontend/editor-ui/src/components/Node/NodeCreator/ItemTypes/NodeItem.vue +++ b/packages/frontend/editor-ui/src/components/Node/NodeCreator/ItemTypes/NodeItem.vue @@ -212,7 +212,7 @@ function onCommunityNodeTooltipClick(event: MouseEvent) { @click="onCommunityNodeTooltipClick" /> - + diff --git a/packages/frontend/editor-ui/src/components/Node/NodeCreator/ItemTypes/SubcategoryItem.vue b/packages/frontend/editor-ui/src/components/Node/NodeCreator/ItemTypes/SubcategoryItem.vue index c56d152a0b..3aac7c2855 100644 --- a/packages/frontend/editor-ui/src/components/Node/NodeCreator/ItemTypes/SubcategoryItem.vue +++ b/packages/frontend/editor-ui/src/components/Node/NodeCreator/ItemTypes/SubcategoryItem.vue @@ -30,6 +30,7 @@ const subcategoryName = computed(() => camelCase(props.item.subcategory || props :name="item.icon" :circle="false" :show-tooltip="false" + :use-updated-icons="true" v-bind="item.iconProps" /> diff --git a/packages/frontend/editor-ui/src/components/Node/NodeCreator/ItemTypes/ViewItem.vue b/packages/frontend/editor-ui/src/components/Node/NodeCreator/ItemTypes/ViewItem.vue index 4759a0b45c..e2fe596746 100644 --- a/packages/frontend/editor-ui/src/components/Node/NodeCreator/ItemTypes/ViewItem.vue +++ b/packages/frontend/editor-ui/src/components/Node/NodeCreator/ItemTypes/ViewItem.vue @@ -18,7 +18,13 @@ defineProps(); :show-action-arrow="true" > diff --git a/packages/frontend/editor-ui/src/components/Node/NodeCreator/NodeCreator.vue b/packages/frontend/editor-ui/src/components/Node/NodeCreator/NodeCreator.vue index d74bcd9e90..a3e0dfc004 100644 --- a/packages/frontend/editor-ui/src/components/Node/NodeCreator/NodeCreator.vue +++ b/packages/frontend/editor-ui/src/components/Node/NodeCreator/NodeCreator.vue @@ -165,7 +165,7 @@ onBeforeUnmount(() => { v-if="active" :class="$style.close" type="secondary" - icon="times" + icon="x" aria-label="Close Node Creator" @click="emit('closeNodeCreator')" /> diff --git a/packages/frontend/editor-ui/src/components/Node/NodeCreator/NodesListPanel.test.ts b/packages/frontend/editor-ui/src/components/Node/NodeCreator/NodesListPanel.test.ts index eb4ba31cbb..82927d40db 100644 --- a/packages/frontend/editor-ui/src/components/Node/NodeCreator/NodesListPanel.test.ts +++ b/packages/frontend/editor-ui/src/components/Node/NodeCreator/NodesListPanel.test.ts @@ -249,7 +249,7 @@ describe('NodesListPanel', () => { expect(screen.queryAllByTestId('item-iterator-item')).toHaveLength(0); expect(screen.queryByText("We didn't make that... yet")).toBeInTheDocument(); - await fireEvent.click(container.querySelector('.clear')!); + await fireEvent.click(container.querySelector('svg[data-icon=circle-x]')!); await nextTick(); expect(screen.queryAllByTestId('item-iterator-item')).toHaveLength(9); }); diff --git a/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeDetails.vue b/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeDetails.vue index 2ebf7e1574..ecc001f8bb 100644 --- a/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeDetails.vue +++ b/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeDetails.vue @@ -130,11 +130,7 @@ const onInstall = async () => {
- + {{ i18n.baseText('communityNodeDetails.installed') }} diff --git a/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeDocsLink.vue b/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeDocsLink.vue index cc59d7041f..b4578fe335 100644 --- a/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeDocsLink.vue +++ b/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeDocsLink.vue @@ -25,7 +25,7 @@ const openCommunityNodeDocsPage = () => { {{ i18n.baseText('communityNodesDocsLink.title') }} - + diff --git a/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeInfo.vue b/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeInfo.vue index 9b38f452e2..7ea07d0762 100644 --- a/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeInfo.vue +++ b/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeInfo.vue @@ -126,7 +126,7 @@ onMounted(async () => {
- + {{ i18n.baseText('communityNodeInfo.unverified.label') }} @@ -134,21 +134,21 @@ onMounted(async () => {
- + {{ i18n.baseText('communityNodeInfo.downloads', { interpolate: { downloads } }) }}
- + {{ i18n.baseText('communityNodeInfo.publishedBy', { interpolate: { publisherName } }) }}
- +
{{ i18n.baseText('communityNodeInfo.contact.admin') }} diff --git a/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeInstallHint.vue b/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeInstallHint.vue index fc9523de2a..a1e8e79789 100644 --- a/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeInstallHint.vue +++ b/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeInstallHint.vue @@ -15,7 +15,7 @@ defineProps(); diff --git a/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/NoResults.vue b/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/NoResults.vue index 36a25fe27e..60cf7738f7 100644 --- a/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/NoResults.vue +++ b/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/NoResults.vue @@ -53,9 +53,9 @@ const i18n = useI18n(); {{ i18n.baseText('nodeCreator.noResults.requestTheNode') }}  - diff --git a/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/NodesListPanel.vue b/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/NodesListPanel.vue index 8bc943f8d2..96c4c50ac0 100644 --- a/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/NodesListPanel.vue +++ b/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/NodesListPanel.vue @@ -184,7 +184,7 @@ function onBackButton() { :class="$style.backButton" @click="onBackButton" > - +

@@ -275,12 +276,11 @@ function onBackButton() { background: transparent; border: none; cursor: pointer; - padding: 0 var(--spacing-xs) 0 0; + padding: var(--spacing-2xs) var(--spacing-xs) 0 0; } .backButtonIcon { color: $node-creator-arrow-color; - height: 16px; padding: 0; } .nodeIcon { diff --git a/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/SearchBar.vue b/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/SearchBar.vue index d7a9f224bf..5b4269941a 100644 --- a/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/SearchBar.vue +++ b/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/SearchBar.vue @@ -53,7 +53,7 @@ defineExpose({ @@ -143,4 +141,8 @@ defineExpose({ fill: $node-creator-search-clear-background-color-hover; } } + +.clickable { + cursor: pointer; +} diff --git a/packages/frontend/editor-ui/src/components/Node/NodeCreator/Renderers/CategorizedItemsRenderer.vue b/packages/frontend/editor-ui/src/components/Node/NodeCreator/Renderers/CategorizedItemsRenderer.vue index 4a17c220b7..7636df0eac 100644 --- a/packages/frontend/editor-ui/src/components/Node/NodeCreator/Renderers/CategorizedItemsRenderer.vue +++ b/packages/frontend/editor-ui/src/components/Node/NodeCreator/Renderers/CategorizedItemsRenderer.vue @@ -113,7 +113,7 @@ registerKeyHook(`CategoryLeft_${props.category}`, { > - + diff --git a/packages/frontend/editor-ui/src/components/Node/NodeCreator/__tests__/utils.ts b/packages/frontend/editor-ui/src/components/Node/NodeCreator/__tests__/utils.ts index 69ae1591ac..033055feee 100644 --- a/packages/frontend/editor-ui/src/components/Node/NodeCreator/__tests__/utils.ts +++ b/packages/frontend/editor-ui/src/components/Node/NodeCreator/__tests__/utils.ts @@ -55,7 +55,7 @@ const mockSubcategoryItemProps = ( ): SubcategoryItemProps => ({ description: 'Sample description', iconType: 'sampleIconType', - icon: 'sampleIcon', + icon: 'smile', title: 'Sample title', subcategory: 'sampleSubcategory', defaults: { color: '#ffffff' }, diff --git a/packages/frontend/editor-ui/src/components/Node/NodeCreator/viewsData.ts b/packages/frontend/editor-ui/src/components/Node/NodeCreator/viewsData.ts index 838eaeab72..24b5004d74 100644 --- a/packages/frontend/editor-ui/src/components/Node/NodeCreator/viewsData.ts +++ b/packages/frontend/editor-ui/src/components/Node/NodeCreator/viewsData.ts @@ -255,7 +255,7 @@ export function AINodesView(_nodes: SimplifiedNodeType[]): NodeView { properties: { title: AI_CATEGORY_DOCUMENT_LOADERS, info: getSubcategoryInfo(AI_CATEGORY_DOCUMENT_LOADERS), - icon: 'file-import', + icon: 'file-input', ...getAISubcategoryProperties(NodeConnectionTypes.AiDocument), }, }, @@ -343,7 +343,7 @@ export function AINodesView(_nodes: SimplifiedNodeType[]): NodeView { properties: { title: AI_CATEGORY_VECTOR_STORES, info: getSubcategoryInfo(AI_CATEGORY_VECTOR_STORES), - icon: 'project-diagram', + icon: 'waypoints', ...getAISubcategoryProperties(NodeConnectionTypes.AiVectorStore), }, }, @@ -571,7 +571,7 @@ export function RegularView(nodes: SimplifiedNodeType[]) { category: CORE_NODES_CATEGORY, properties: { title: FLOWS_CONTROL_SUBCATEGORY, - icon: 'code-branch', + icon: 'git-branch', sections: [ { key: 'popular', diff --git a/packages/frontend/editor-ui/src/components/NodeCredentials.vue b/packages/frontend/editor-ui/src/components/NodeCredentials.vue index 32fc6e79ce..f546d1cce8 100644 --- a/packages/frontend/editor-ui/src/components/NodeCredentials.vue +++ b/packages/frontend/editor-ui/src/components/NodeCredentials.vue @@ -582,7 +582,7 @@ async function onClickCreateCredential(type: ICredentialType | INodeCredentialDe :items="getIssues(type.name)" /> - +

diff --git a/packages/frontend/editor-ui/src/components/NodeDetailsView.vue b/packages/frontend/editor-ui/src/components/NodeDetailsView.vue index 12f438c24d..29e34e647e 100644 --- a/packages/frontend/editor-ui/src/components/NodeDetailsView.vue +++ b/packages/frontend/editor-ui/src/components/NodeDetailsView.vue @@ -870,7 +870,7 @@ onBeforeUnmount(() => { target="_blank" @click="onFeatureRequestClick" > - + {{ i18n.baseText('ndv.featureRequest') }} diff --git a/packages/frontend/editor-ui/src/components/NodeExecuteButton.vue b/packages/frontend/editor-ui/src/components/NodeExecuteButton.vue index 0262290b6f..2df78f31a5 100644 --- a/packages/frontend/editor-ui/src/components/NodeExecuteButton.vue +++ b/packages/frontend/editor-ui/src/components/NodeExecuteButton.vue @@ -31,6 +31,7 @@ import { generateCodeForAiTransform } from '@/components/ButtonParameter/utils'; import { needsAgentInput } from '@/utils/nodes/nodeTransforms'; import { useUIStore } from '@/stores/ui.store'; import type { ButtonType } from '@n8n/design-system'; +import { type IconName } from '@n8n/design-system/components/N8nIcon/icons'; const NODE_TEST_STEP_POPUP_COUNT_KEY = 'N8N_NODE_TEST_STEP_POPUP_COUNT'; const MAX_POPUP_COUNT = 10; @@ -221,9 +222,9 @@ const isLoading = computed( (isNodeRunning.value && !isListeningForEvents.value && !isListeningForWorkflowEvents.value), ); -const buttonIcon = computed(() => { +const buttonIcon = computed((): IconName | undefined => { if (shouldGenerateCode.value) return 'terminal'; - if (!isListeningForEvents.value && !props.hideIcon) return 'flask'; + if (!isListeningForEvents.value && !props.hideIcon) return 'flask-conical'; return undefined; }); diff --git a/packages/frontend/editor-ui/src/components/NodeSettings.vue b/packages/frontend/editor-ui/src/components/NodeSettings.vue index c28edf6ae1..35210cd404 100644 --- a/packages/frontend/editor-ui/src/components/NodeSettings.vue +++ b/packages/frontend/editor-ui/src/components/NodeSettings.vue @@ -801,7 +801,7 @@ function handleWheelEvent(event: WheelEvent) {

- +

diff --git a/packages/frontend/editor-ui/src/components/NodeSettingsTabs.vue b/packages/frontend/editor-ui/src/components/NodeSettingsTabs.vue index 8b0e213717..cb008def39 100644 --- a/packages/frontend/editor-ui/src/components/NodeSettingsTabs.vue +++ b/packages/frontend/editor-ui/src/components/NodeSettingsTabs.vue @@ -95,7 +95,7 @@ const options = computed(() => { if (isCommunityNode.value) { options.push({ - icon: 'cube', + icon: 'box', value: 'communityNode', align: 'right', tooltip: i18n.baseText('generic.communityNode.tooltip', { diff --git a/packages/frontend/editor-ui/src/components/NodeWebhooks.vue b/packages/frontend/editor-ui/src/components/NodeWebhooks.vue index 368cb2be3a..9c3f553aee 100644 --- a/packages/frontend/editor-ui/src/components/NodeWebhooks.vue +++ b/packages/frontend/editor-ui/src/components/NodeWebhooks.vue @@ -188,7 +188,7 @@ watch( :title="isMinimized ? baseText.clickToDisplay : baseText.clickToHide" @click="isMinimized = !isMinimized" > - + {{ baseText.toggleTitle }}
diff --git a/packages/frontend/editor-ui/src/components/PanelDragButton.vue b/packages/frontend/editor-ui/src/components/PanelDragButton.vue index c89f3e27f7..2f2cd51e96 100644 --- a/packages/frontend/editor-ui/src/components/PanelDragButton.vue +++ b/packages/frontend/editor-ui/src/components/PanelDragButton.vue @@ -40,13 +40,13 @@ const onDragStart = () => { v-if="canMoveLeft" :class="{ [$style.leftArrow]: true, [$style.visible]: isDragging }" > - + - +
diff --git a/packages/frontend/editor-ui/src/components/ParameterInput.vue b/packages/frontend/editor-ui/src/components/ParameterInput.vue index b92e9313ee..579688a706 100644 --- a/packages/frontend/editor-ui/src/components/ParameterInput.vue +++ b/packages/frontend/editor-ui/src/components/ParameterInput.vue @@ -1399,7 +1399,7 @@ onUpdated(async () => { {