diff --git a/cypress/composables/credentialsComposables.ts b/cypress/composables/credentialsComposables.ts
index 6f68e78343..52e2f714ff 100644
--- a/cypress/composables/credentialsComposables.ts
+++ b/cypress/composables/credentialsComposables.ts
@@ -68,8 +68,7 @@ export function getCredentialSaveButton() {
*/
export function setCredentialName(name: string) {
- cy.getByTestId('credential-name').click();
- cy.getByTestId('credential-name').find('input').clear();
+ cy.getByTestId('credential-name').find('span[data-test-id=inline-edit-preview]').click();
cy.getByTestId('credential-name').type(name);
}
export function saveCredential() {
diff --git a/cypress/composables/folders.ts b/cypress/composables/folders.ts
index ae53499d8b..04ec8ce6df 100644
--- a/cypress/composables/folders.ts
+++ b/cypress/composables/folders.ts
@@ -325,7 +325,7 @@ export function renameFolderFromListActions(folderName: string, newName: string)
getListActionsToggle().click();
getListActionItem('rename').click();
getInlineEditInput().should('be.visible');
- getInlineEditInput().type(newName, { delay: 50 });
+ getInlineEditInput().type(`${newName}{enter}`, { delay: 50 });
successToast().should('exist');
}
diff --git a/cypress/e2e/10-settings-log-streaming.cy.ts b/cypress/e2e/10-settings-log-streaming.cy.ts
index 1954543ca0..63f8d6823f 100644
--- a/cypress/e2e/10-settings-log-streaming.cy.ts
+++ b/cypress/e2e/10-settings-log-streaming.cy.ts
@@ -57,9 +57,9 @@ describe('Log Streaming Settings', () => {
settingsLogStreamingPage.getters
.getDestinationNameInput()
- .find('input')
- .clear()
- .type('Destination 0');
+ .find('span[data-test-id=inline-edit-preview]')
+ .click();
+ cy.getByTestId('inline-edit-input').type('Destination 0');
settingsLogStreamingPage.getters.getDestinationSaveButton().click();
cy.wait(100);
getVisibleModalOverlay().click(1, 1);
@@ -84,9 +84,9 @@ describe('Log Streaming Settings', () => {
settingsLogStreamingPage.getters.getDestinationNameInput().click();
settingsLogStreamingPage.getters
.getDestinationNameInput()
- .find('input')
- .clear()
- .type('Destination 1');
+ .find('span[data-test-id=inline-edit-preview]')
+ .click();
+ cy.getByTestId('inline-edit-input').type('Destination 1');
settingsLogStreamingPage.getters.getDestinationSaveButton().should('not.have.attr', 'disabled');
settingsLogStreamingPage.getters.getDestinationSaveButton().click();
cy.wait(100);
diff --git a/cypress/pages/modals/credentials-modal.ts b/cypress/pages/modals/credentials-modal.ts
index 592a396161..f296d5c3f5 100644
--- a/cypress/pages/modals/credentials-modal.ts
+++ b/cypress/pages/modals/credentials-modal.ts
@@ -21,6 +21,8 @@ export class CredentialsModal extends BasePage {
connectionParameter: (fieldName: string) =>
this.getters.credentialInputs().find(`:contains('${fieldName}') .n8n-input input`),
name: () => cy.getByTestId('credential-name'),
+ namePreview: () =>
+ cy.getByTestId('credential-name').find('span[data-test-id=inline-edit-preview]'),
nameInput: () => cy.getByTestId('credential-name').find('input'),
deleteButton: () => cy.getByTestId('credential-delete-button'),
closeButton: () => this.getters.editCredentialModal().find('.el-dialog__close').first(),
@@ -43,7 +45,7 @@ export class CredentialsModal extends BasePage {
getVisibleSelect().contains(email.toLowerCase()).click();
},
setName: (name: string) => {
- this.getters.name().click();
+ this.getters.name().getByTestId('inline-edit-preview').click();
this.getters.nameInput().clear().type(name);
},
save: (test = false) => {
@@ -93,7 +95,7 @@ export class CredentialsModal extends BasePage {
this.actions.fillCredentialsForm(closeModal);
},
renameCredential: (newName: string) => {
- this.getters.nameInput().type('{selectall}');
+ this.getters.namePreview().click();
this.getters.nameInput().type(newName);
this.getters.nameInput().type('{enter}');
},
diff --git a/cypress/pages/template-credential-setup.ts b/cypress/pages/template-credential-setup.ts
index 73b1b59911..70542ac75e 100644
--- a/cypress/pages/template-credential-setup.ts
+++ b/cypress/pages/template-credential-setup.ts
@@ -9,6 +9,10 @@ export const getters = {
skipLink: () => cy.get('a:contains("Skip")'),
title: (title: string) => cy.get(`h1:contains(${title})`),
infoCallout: () => cy.getByTestId('info-callout'),
+
+ namePreview: () =>
+ cy.getByTestId('credential-name').find('span[data-test-id=inline-edit-preview]'),
+ nameInput: () => cy.getByTestId('credential-name').find('input'),
};
export const visitTemplateCredentialSetupPage = (templateId: number) => {
@@ -22,7 +26,8 @@ export const visitTemplateCredentialSetupPage = (templateId: number) => {
*/
export const fillInDummyCredentialsForApp = (appName: string) => {
formStep.getCreateAppCredentialsButton(appName).click();
- credentialsModal.getters.editCredentialModal().find('input:first()').type('test');
+ credentialsModal.getters.namePreview().click();
+ credentialsModal.getters.nameInput().type('test');
credentialsModal.actions.save(false);
credentialsModal.actions.close();
};
diff --git a/cypress/pages/workflow.ts b/cypress/pages/workflow.ts
index af0a4dd2f2..91c3555ebf 100644
--- a/cypress/pages/workflow.ts
+++ b/cypress/pages/workflow.ts
@@ -319,7 +319,6 @@ export class WorkflowPage extends BasePage {
cy.get('body').type('{del}');
},
setWorkflowName: (name: string) => {
- this.getters.workflowNameInput().should('be.disabled');
this.getters.workflowNameInput().parent().click();
this.getters.workflowNameInput().should('be.enabled');
this.getters.workflowNameInput().clear().type(name).type('{enter}');
diff --git a/packages/frontend/@n8n/design-system/.storybook/storybook.scss b/packages/frontend/@n8n/design-system/.storybook/storybook.scss
index 16aaf700f4..f5e9850528 100644
--- a/packages/frontend/@n8n/design-system/.storybook/storybook.scss
+++ b/packages/frontend/@n8n/design-system/.storybook/storybook.scss
@@ -19,3 +19,9 @@
body {
padding: 0 !important;
}
+
+.story {
+ padding: 2rem;
+ display: flex;
+ gap: 1rem;
+}
diff --git a/packages/frontend/@n8n/design-system/package.json b/packages/frontend/@n8n/design-system/package.json
index 38a0789570..6140cf7ae8 100644
--- a/packages/frontend/@n8n/design-system/package.json
+++ b/packages/frontend/@n8n/design-system/package.json
@@ -20,9 +20,9 @@
},
"devDependencies": {
"@n8n/eslint-config": "workspace:*",
+ "@n8n/storybook": "workspace:*",
"@n8n/typescript-config": "workspace:*",
"@n8n/vitest-config": "workspace:*",
- "@n8n/storybook": "workspace:*",
"@testing-library/jest-dom": "catalog:frontend",
"@testing-library/user-event": "catalog:frontend",
"@testing-library/vue": "catalog:frontend",
@@ -45,11 +45,11 @@
"vue-tsc": "catalog:frontend"
},
"dependencies": {
- "@n8n/composables": "workspace:*",
- "@n8n/utils": "workspace:*",
"@fortawesome/fontawesome-svg-core": "^1.2.36",
"@fortawesome/free-solid-svg-icons": "^5.15.4",
"@fortawesome/vue-fontawesome": "^3.0.3",
+ "@n8n/composables": "workspace:*",
+ "@n8n/utils": "workspace:*",
"@tanstack/vue-table": "^8.21.2",
"element-plus": "catalog:frontend",
"is-emoji-supported": "^0.0.5",
@@ -59,6 +59,7 @@
"markdown-it-link-attributes": "^4.0.1",
"markdown-it-task-lists": "^2.1.1",
"parse-diff": "^0.11.1",
+ "reka-ui": "^2.2.1",
"sanitize-html": "2.12.1",
"vue": "catalog:frontend",
"vue-boring-avatars": "^1.3.0",
diff --git a/packages/frontend/@n8n/design-system/src/components/N8nInlineTextEdit/InlineTextEdit.stories.ts b/packages/frontend/@n8n/design-system/src/components/N8nInlineTextEdit/InlineTextEdit.stories.ts
new file mode 100644
index 0000000000..4a4903476d
--- /dev/null
+++ b/packages/frontend/@n8n/design-system/src/components/N8nInlineTextEdit/InlineTextEdit.stories.ts
@@ -0,0 +1,32 @@
+import type { StoryFn } from '@storybook/vue3';
+
+import InlineTextEdit from './InlineTextEdit.vue';
+
+export default {
+ title: 'Atoms/InlineTextEdit',
+ component: InlineTextEdit,
+};
+
+const Template: StoryFn = (args, { argTypes }) => ({
+ setup: () => ({ args }),
+ props: Object.keys(argTypes),
+ components: {
+ InlineTextEdit,
+ },
+ template: `
+
+
+
+ `,
+});
+
+export const primary = Template.bind({});
+primary.args = {
+ modelValue: 'Test',
+};
+
+export const placeholder = Template.bind({});
+placeholder.args = {
+ modelValue: '',
+ placeholder: 'Enter workflow name',
+};
diff --git a/packages/frontend/@n8n/design-system/src/components/N8nInlineTextEdit/InlineTextEdit.test.ts b/packages/frontend/@n8n/design-system/src/components/N8nInlineTextEdit/InlineTextEdit.test.ts
new file mode 100644
index 0000000000..94aef2b650
--- /dev/null
+++ b/packages/frontend/@n8n/design-system/src/components/N8nInlineTextEdit/InlineTextEdit.test.ts
@@ -0,0 +1,65 @@
+import userEvent from '@testing-library/user-event';
+
+import { createComponentRenderer } from '@n8n/design-system/__tests__/render';
+
+import N8nInlineTextEdit from './InlineTextEdit.vue';
+
+const renderComponent = createComponentRenderer(N8nInlineTextEdit);
+
+describe('N8nInlineTextEdit', () => {
+ it('should render correctly', () => {
+ const wrapper = renderComponent({
+ props: {
+ modelValue: 'Test Value',
+ },
+ });
+
+ expect(wrapper.html()).toMatchSnapshot();
+ });
+
+ it('value should update on enter', async () => {
+ const wrapper = renderComponent({
+ props: {
+ modelValue: 'Test Value',
+ },
+ });
+ const input = wrapper.getByTestId('inline-edit-input');
+ const preview = wrapper.getByTestId('inline-edit-preview');
+
+ await wrapper.rerender({ modelValue: 'New Value' });
+ await userEvent.type(input, 'Updated Value');
+ await userEvent.keyboard('{Enter}');
+
+ expect(preview).toHaveTextContent('Updated Value');
+ });
+
+ it('should not update value on blur if input is empty', async () => {
+ const wrapper = renderComponent({
+ props: {
+ modelValue: 'Test Value',
+ },
+ });
+ const input = wrapper.getByTestId('inline-edit-input');
+ const preview = wrapper.getByTestId('inline-edit-preview');
+
+ await userEvent.clear(input);
+ await userEvent.tab(); // Simulate blur
+
+ expect(preview).toHaveTextContent('Test Value');
+ });
+
+ it('should not update on escape key press', async () => {
+ const wrapper = renderComponent({
+ props: {
+ modelValue: 'Test Value',
+ },
+ });
+ const input = wrapper.getByTestId('inline-edit-input');
+ const preview = wrapper.getByTestId('inline-edit-preview');
+
+ await userEvent.type(input, 'Updated Value');
+ await userEvent.keyboard('{Escape}');
+
+ expect(preview).toHaveTextContent('Test Value');
+ });
+});
diff --git a/packages/frontend/@n8n/design-system/src/components/N8nInlineTextEdit/InlineTextEdit.vue b/packages/frontend/@n8n/design-system/src/components/N8nInlineTextEdit/InlineTextEdit.vue
new file mode 100644
index 0000000000..7f97e91e55
--- /dev/null
+++ b/packages/frontend/@n8n/design-system/src/components/N8nInlineTextEdit/InlineTextEdit.vue
@@ -0,0 +1,193 @@
+
+
+
+
+
+
+ {{ temp }}
+
+
+
+
+
+
+
+
diff --git a/packages/frontend/@n8n/design-system/src/components/N8nInlineTextEdit/__snapshots__/InlineTextEdit.test.ts.snap b/packages/frontend/@n8n/design-system/src/components/N8nInlineTextEdit/__snapshots__/InlineTextEdit.test.ts.snap
new file mode 100644
index 0000000000..29d75692d7
--- /dev/null
+++ b/packages/frontend/@n8n/design-system/src/components/N8nInlineTextEdit/__snapshots__/InlineTextEdit.test.ts.snap
@@ -0,0 +1,8 @@
+// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
+
+exports[`N8nInlineTextEdit > should render correctly 1`] = `
+"
+
Test ValueTest Value
+
+
"
+`;
diff --git a/packages/frontend/@n8n/design-system/src/components/N8nInlineTextEdit/index.ts b/packages/frontend/@n8n/design-system/src/components/N8nInlineTextEdit/index.ts
new file mode 100644
index 0000000000..3d877b4585
--- /dev/null
+++ b/packages/frontend/@n8n/design-system/src/components/N8nInlineTextEdit/index.ts
@@ -0,0 +1,3 @@
+import InlineRename from './InlineTextEdit.vue';
+
+export default InlineRename;
diff --git a/packages/frontend/@n8n/design-system/src/components/index.ts b/packages/frontend/@n8n/design-system/src/components/index.ts
index 796c657db0..8920758048 100644
--- a/packages/frontend/@n8n/design-system/src/components/index.ts
+++ b/packages/frontend/@n8n/design-system/src/components/index.ts
@@ -60,3 +60,4 @@ export { default as N8nIconPicker } from './N8nIconPicker';
export { default as N8nBreadcrumbs } from './N8nBreadcrumbs';
export { default as N8nTableBase } from './TableBase';
export { default as N8nDataTableServer } from './N8nDataTableServer';
+export { default as N8nInlineTextEdit } from './N8nInlineTextEdit';
diff --git a/packages/frontend/editor-ui/src/components/CredentialEdit/CredentialEdit.vue b/packages/frontend/editor-ui/src/components/CredentialEdit/CredentialEdit.vue
index 9e315a07a3..012242bc61 100644
--- a/packages/frontend/editor-ui/src/components/CredentialEdit/CredentialEdit.vue
+++ b/packages/frontend/editor-ui/src/components/CredentialEdit/CredentialEdit.vue
@@ -1,5 +1,5 @@
@@ -1083,16 +1086,21 @@ function resetCredentialData(): void {
-
+
+
+ {{
+ credentialType.displayName
+ }}
+
-import { computed } from 'vue';
-
-type Props = {
- modelValue: string;
- placeholder?: string;
- staticSize?: boolean;
-};
-
-const props = withDefaults(defineProps(), { staticSize: false, placeholder: '' });
-
-const hiddenValue = computed(() => {
- let value = props.modelValue.replace(/\s/g, '.'); // force input to expand on space chars
- if (!value) {
- value = props.placeholder;
- }
-
- return `${value}`; // adjust for padding
-});
-
-
-
-
-
-
-
-
-
-
diff --git a/packages/frontend/editor-ui/src/components/ExpandableInput/ExpandableInputEdit.vue b/packages/frontend/editor-ui/src/components/ExpandableInput/ExpandableInputEdit.vue
deleted file mode 100644
index 01ab8a0f00..0000000000
--- a/packages/frontend/editor-ui/src/components/ExpandableInput/ExpandableInputEdit.vue
+++ /dev/null
@@ -1,88 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/packages/frontend/editor-ui/src/components/ExpandableInput/ExpandableInputPreview.vue b/packages/frontend/editor-ui/src/components/ExpandableInput/ExpandableInputPreview.vue
deleted file mode 100644
index a502c120ed..0000000000
--- a/packages/frontend/editor-ui/src/components/ExpandableInput/ExpandableInputPreview.vue
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/packages/frontend/editor-ui/src/components/InlineTextEdit.vue b/packages/frontend/editor-ui/src/components/InlineTextEdit.vue
deleted file mode 100644
index 76442eb7ae..0000000000
--- a/packages/frontend/editor-ui/src/components/InlineTextEdit.vue
+++ /dev/null
@@ -1,129 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/packages/frontend/editor-ui/src/components/MainHeader/WorkflowDetails.test.ts b/packages/frontend/editor-ui/src/components/MainHeader/WorkflowDetails.test.ts
index 441d067820..907a0061f9 100644
--- a/packages/frontend/editor-ui/src/components/MainHeader/WorkflowDetails.test.ts
+++ b/packages/frontend/editor-ui/src/components/MainHeader/WorkflowDetails.test.ts
@@ -135,8 +135,7 @@ describe('WorkflowDetails', () => {
},
});
- const workflowName = getByTestId('workflow-name-input');
- const workflowNameInput = workflowName.querySelector('input');
+ const workflowNameInput = getByTestId('inline-edit-input');
expect(workflowNameInput).toHaveValue('Test Workflow');
expect(getByText('tag1')).toBeInTheDocument();
diff --git a/packages/frontend/editor-ui/src/components/MainHeader/WorkflowDetails.vue b/packages/frontend/editor-ui/src/components/MainHeader/WorkflowDetails.vue
index 3891974ec4..e9eb452963 100644
--- a/packages/frontend/editor-ui/src/components/MainHeader/WorkflowDetails.vue
+++ b/packages/frontend/editor-ui/src/components/MainHeader/WorkflowDetails.vue
@@ -1,14 +1,4 @@
-
+
-
-
-
{{
- i18n.baseText('ndv.title.renameNode')
- }}
-
-
-
-
-
-
-
-
- {{ modelValue }}
-
-
-
-
-
-
+
+
+
@@ -93,62 +52,18 @@ function onRename() {
font-weight: var(--font-weight-medium);
display: flex;
font-size: var(--font-size-m);
- line-height: var(--font-line-height-compact);
- overflow-wrap: anywhere;
- padding-right: var(--spacing-s);
- overflow: hidden;
-}
-
-.title {
- max-height: 100px;
- display: -webkit-box;
- -webkit-line-clamp: 5;
- -webkit-box-orient: vertical;
+ margin-right: var(--spacing-s);
color: var(--color-text-dark);
+ width: 100%;
}
-.hoverable {
- &:hover {
- cursor: pointer;
- .editIcon {
- display: inline-block;
- }
- }
+.textWrapper {
+ display: flex;
+ flex-grow: 1;
}
.iconWrapper {
display: inline-flex;
margin-right: var(--spacing-2xs);
}
-
-.editIcon {
- display: none;
- font-size: var(--font-size-xs);
- color: var(--color-text-base);
- position: absolute;
- bottom: 0;
-}
-
-.editIconContainer {
- display: inline-block;
- position: relative;
- width: 0;
-}
-
-.editButtons {
- text-align: right;
- margin-top: var(--spacing-s);
-
- > * {
- margin-left: var(--spacing-4xs);
- }
-}
-
-.editContainer {
- text-align: left;
-
- > *:first-child {
- margin-bottom: var(--spacing-4xs);
- }
-}
diff --git a/packages/frontend/editor-ui/src/components/SettingsLogStreaming/EventDestinationSettingsModal.ee.vue b/packages/frontend/editor-ui/src/components/SettingsLogStreaming/EventDestinationSettingsModal.ee.vue
index ecf98f52fd..e4f5ea2e47 100644
--- a/packages/frontend/editor-ui/src/components/SettingsLogStreaming/EventDestinationSettingsModal.ee.vue
+++ b/packages/frontend/editor-ui/src/components/SettingsLogStreaming/EventDestinationSettingsModal.ee.vue
@@ -1,8 +1,9 @@
@@ -377,15 +382,17 @@ function callEventBus(event: string, data: unknown) {
-
-
+
+ {{
+ !isTypeAbstract ? i18n.baseText(typeLabelName) : 'Select type'
+ }}
(null);
const showCardsBadge = ref(false);
-const isNameEditEnabled = ref(false);
-
/**
* Folder actions
* These can appear on the list header, and then they are applied to current folder
@@ -1413,17 +1412,16 @@ const onCreateWorkflowClick = () => {
});
};
-const onNameToggle = () => {
- isNameEditEnabled.value = !isNameEditEnabled.value;
-};
+const renameInput = useTemplateRef('renameInput');
+function onNameToggle() {
+ setTimeout(() => {
+ if (renameInput.value?.forceFocus) {
+ renameInput.value.forceFocus();
+ }
+ }, 0);
+}
-const onNameSubmit = async ({
- name,
- onSubmit,
-}: {
- name: string;
- onSubmit: (saved: boolean) => void;
-}) => {
+const onNameSubmit = async (name: string) => {
if (!currentFolder.value || !currentProject.value) return;
const newName = name.trim();
@@ -1434,14 +1432,11 @@ const onNameSubmit = async ({
type: 'error',
});
- onSubmit(false);
return;
}
if (newName === currentFolder.value.name) {
- isNameEditEnabled.value = false;
-
- onSubmit(true);
+ renameInput.value?.forceCancel();
return;
}
@@ -1452,7 +1447,7 @@ const onNameSubmit = async ({
message: validationResult,
type: 'error',
});
- onSubmit(false);
+ renameInput.value?.forceCancel();
return;
} else {
try {
@@ -1467,11 +1462,9 @@ const onNameSubmit = async ({
telemetry.track('User renamed folder', {
folder_id: currentFolder.value.id,
});
- isNameEditEnabled.value = false;
- onSubmit(true);
} catch (error) {
toast.showError(error, i18n.baseText('folders.rename.error.title'));
- onSubmit(false);
+ renameInput.value?.forceCancel();
}
}
};
@@ -1605,17 +1598,16 @@ const onNameSubmit = async ({
>
/
-
@@ -1938,12 +1930,13 @@ const onNameSubmit = async ({
.path-separator {
font-size: var(--font-size-xl);
color: var(--color-foreground-base);
- margin: var(--spacing-4xs);
+ padding: var(--spacing-3xs) var(--spacing-4xs) var(--spacing-4xs);
}
.name {
color: $custom-font-dark;
font-size: var(--font-size-s);
+ padding: var(--spacing-3xs) var(--spacing-4xs) var(--spacing-4xs);
}
.pointer-disabled {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index e5cf8af8b3..d1e9aeb964 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -1789,6 +1789,9 @@ importers:
parse-diff:
specifier: ^0.11.1
version: 0.11.1
+ reka-ui:
+ specifier: ^2.2.1
+ version: 2.2.1(typescript@5.8.2)(vue@3.5.13(typescript@5.8.2))
sanitize-html:
specifier: 2.12.1
version: 2.12.1
@@ -4006,9 +4009,21 @@ packages:
'@floating-ui/core@1.3.1':
resolution: {integrity: sha512-Bu+AMaXNjrpjh41znzHqaz3r2Nr8hHuHZT6V2LBKMhyMl0FgKA62PNYbqnfgmzOhoWZj70Zecisbo4H1rotP5g==}
+ '@floating-ui/core@1.7.0':
+ resolution: {integrity: sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==}
+
'@floating-ui/dom@1.4.5':
resolution: {integrity: sha512-96KnRWkRnuBSSFbj0sFGwwOUd8EkiecINVl0O9wiZlZ64EkpyAOG3Xc2vKKNJmru0Z7RqWNymA+6b8OZqjgyyw==}
+ '@floating-ui/dom@1.7.0':
+ resolution: {integrity: sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==}
+
+ '@floating-ui/utils@0.2.9':
+ resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==}
+
+ '@floating-ui/vue@1.1.6':
+ resolution: {integrity: sha512-XFlUzGHGv12zbgHNk5FN2mUB7ROul3oG2ENdTpWdE+qMFxyNxWSRmsoyhiEnpmabNm6WnUvR1OvJfUfN4ojC1A==}
+
'@fortawesome/fontawesome-common-types@0.2.36':
resolution: {integrity: sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==}
engines: {node: '>=6'}
@@ -4245,6 +4260,12 @@ packages:
cpu: [x64]
os: [win32]
+ '@internationalized/date@3.8.1':
+ resolution: {integrity: sha512-PgVE6B6eIZtzf9Gu5HvJxRK3ufUFz9DhspELuhW/N0GuMGMTLvPQNRkHP2hTuP9lblOk+f+1xi96sPiPXANXAA==}
+
+ '@internationalized/number@3.6.2':
+ resolution: {integrity: sha512-E5QTOlMg9wo5OrKdHD6edo1JJlIoOsylh0+mbf0evi1tHJwMZfJSaBpGtnJV9N7w3jeiioox9EG/EWRWPh82vg==}
+
'@intlify/core-base@11.1.2':
resolution: {integrity: sha512-nmG512G8QOABsserleechwHGZxzKSAlggGf9hQX0nltvSwyKNVuB/4o6iFeG2OnjXK253r8p8eSDOZf8PgFdWw==}
engines: {node: '>= 16'}
@@ -6195,6 +6216,9 @@ packages:
resolution: {integrity: sha512-gB3NukbIcYzRtPoE6dx9svQYPodxvnfQlaaQd8N/z87E6WaMfRE7o5HwB+LZ+KeM0nsNAq1n4TmBtfz1VCUR+Q==}
engines: {node: '>=8'}
+ '@swc/helpers@0.5.17':
+ resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==}
+
'@sxzz/popperjs-es@2.11.7':
resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==}
@@ -6202,12 +6226,20 @@ packages:
resolution: {integrity: sha512-uvXk/U4cBiFMxt+p9/G7yUWI/UbHYbyghLCjlpWZ3mLeIZiUBSKcUnw9UnKkdRz7Z/N4UBuFLWQdJCjUe7HjvA==}
engines: {node: '>=12'}
+ '@tanstack/virtual-core@3.13.9':
+ resolution: {integrity: sha512-3jztt0jpaoJO5TARe2WIHC1UQC3VMLAFUW5mmMo0yrkwtDB2AQP0+sh10BVUpWrnvHjSLvzFizydtEGLCJKFoQ==}
+
'@tanstack/vue-table@8.21.2':
resolution: {integrity: sha512-KBgOWxha/x4m1EdhVWxOpqHb661UjqAxzPcmXR3QiA7aShZ547x19Gw0UJX9we+m+tVcPuLRZ61JsYW47QZFfQ==}
engines: {node: '>=12'}
peerDependencies:
vue: '>=3.2'
+ '@tanstack/vue-virtual@3.13.9':
+ resolution: {integrity: sha512-HsvHaOo+o52cVcPhomKDZ3CMpTF/B2qg+BhPHIQJwzn4VIqDyt/rRVqtIomG6jE83IFsE2vlr6cmx7h3dHA0SA==}
+ peerDependencies:
+ vue: ^2.7.0 || ^3.0.0
+
'@techteamer/ocsp@1.0.1':
resolution: {integrity: sha512-q4pW5wAC6Pc3JI8UePwE37CkLQ5gDGZMgjSX4MEEm4D4Di59auDQ8UNIDzC4gRnPNmmcwjpPxozq8p5pjiOmOw==}
@@ -6689,6 +6721,9 @@ packages:
'@types/web-bluetooth@0.0.20':
resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==}
+ '@types/web-bluetooth@0.0.21':
+ resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==}
+
'@types/webidl-conversions@7.0.0':
resolution: {integrity: sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==}
@@ -7008,18 +7043,27 @@ packages:
'@vueuse/core@10.11.0':
resolution: {integrity: sha512-x3sD4Mkm7PJ+pcq3HX8PLPBadXCAlSDR/waK87dz0gQE+qJnaaFhc/dZVfJz+IUYzTMVGum2QlR7ImiJQN4s6g==}
+ '@vueuse/core@12.8.2':
+ resolution: {integrity: sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==}
+
'@vueuse/core@9.13.0':
resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==}
'@vueuse/metadata@10.11.0':
resolution: {integrity: sha512-kQX7l6l8dVWNqlqyN3ePW3KmjCQO3ZMgXuBMddIu83CmucrsBfXlH+JoviYyRBws/yLTQO8g3Pbw+bdIoVm4oQ==}
+ '@vueuse/metadata@12.8.2':
+ resolution: {integrity: sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==}
+
'@vueuse/metadata@9.13.0':
resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==}
'@vueuse/shared@10.11.0':
resolution: {integrity: sha512-fyNoIXEq3PfX1L3NkNhtVQUSRtqYwJtJg+Bp9rIzculIZWHTkKSysujrOk2J+NrRulLTQH9+3gGSfYLWSEWU1A==}
+ '@vueuse/shared@12.8.2':
+ resolution: {integrity: sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==}
+
'@vueuse/shared@9.13.0':
resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==}
@@ -7239,6 +7283,10 @@ packages:
argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+ aria-hidden@1.2.6:
+ resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==}
+ engines: {node: '>=10'}
+
aria-query@5.1.3:
resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==}
@@ -8368,6 +8416,9 @@ packages:
resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
engines: {node: '>= 0.4'}
+ defu@6.1.4:
+ resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
+
delayed-stream@1.0.0:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'}
@@ -11483,6 +11534,9 @@ packages:
obuf@1.1.2:
resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==}
+ ohash@2.0.11:
+ resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==}
+
ollama@0.5.9:
resolution: {integrity: sha512-F/KZuDRC+ZsVCuMvcOYuQ6zj42/idzCkkuknGyyGVmNStMZ/sU3jQpvhnl4SyC0+zBzLiKNZJnJeuPFuieWZvQ==}
@@ -12381,6 +12435,11 @@ packages:
reinterval@1.1.0:
resolution: {integrity: sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ==}
+ reka-ui@2.2.1:
+ resolution: {integrity: sha512-oLHiyBn6gTIQGnTnv8G5LQuFp9j8HuUNl0qdnW3XPhFb/07hrxzFpjo2kt/jxOZive+n/XWDbOjSj2h9Hih3qA==}
+ peerDependencies:
+ vue: '>= 3.2.0'
+
relateurl@0.2.7:
resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==}
engines: {node: '>= 0.10'}
@@ -16579,10 +16638,30 @@ snapshots:
'@floating-ui/core@1.3.1': {}
+ '@floating-ui/core@1.7.0':
+ dependencies:
+ '@floating-ui/utils': 0.2.9
+
'@floating-ui/dom@1.4.5':
dependencies:
'@floating-ui/core': 1.3.1
+ '@floating-ui/dom@1.7.0':
+ dependencies:
+ '@floating-ui/core': 1.7.0
+ '@floating-ui/utils': 0.2.9
+
+ '@floating-ui/utils@0.2.9': {}
+
+ '@floating-ui/vue@1.1.6(vue@3.5.13(typescript@5.8.2))':
+ dependencies:
+ '@floating-ui/dom': 1.7.0
+ '@floating-ui/utils': 0.2.9
+ vue-demi: 0.14.10(vue@3.5.13(typescript@5.8.2))
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - vue
+
'@fortawesome/fontawesome-common-types@0.2.36': {}
'@fortawesome/fontawesome-common-types@6.2.0': {}
@@ -16826,6 +16905,14 @@ snapshots:
'@img/sharp-win32-x64@0.33.5':
optional: true
+ '@internationalized/date@3.8.1':
+ dependencies:
+ '@swc/helpers': 0.5.17
+
+ '@internationalized/number@3.6.2':
+ dependencies:
+ '@swc/helpers': 0.5.17
+
'@intlify/core-base@11.1.2':
dependencies:
'@intlify/message-compiler': 11.1.2
@@ -19159,15 +19246,26 @@ snapshots:
'@supercharge/promise-pool@3.1.0': {}
+ '@swc/helpers@0.5.17':
+ dependencies:
+ tslib: 2.8.1
+
'@sxzz/popperjs-es@2.11.7': {}
'@tanstack/table-core@8.21.2': {}
+ '@tanstack/virtual-core@3.13.9': {}
+
'@tanstack/vue-table@8.21.2(vue@3.5.13(typescript@5.8.2))':
dependencies:
'@tanstack/table-core': 8.21.2
vue: 3.5.13(typescript@5.8.2)
+ '@tanstack/vue-virtual@3.13.9(vue@3.5.13(typescript@5.8.2))':
+ dependencies:
+ '@tanstack/virtual-core': 3.13.9
+ vue: 3.5.13(typescript@5.8.2)
+
'@techteamer/ocsp@1.0.1':
dependencies:
asn1.js: 5.4.1
@@ -19717,6 +19815,8 @@ snapshots:
'@types/web-bluetooth@0.0.20': {}
+ '@types/web-bluetooth@0.0.21': {}
+
'@types/webidl-conversions@7.0.0': {}
'@types/whatwg-url@11.0.4':
@@ -20185,6 +20285,15 @@ snapshots:
- '@vue/composition-api'
- vue
+ '@vueuse/core@12.8.2(typescript@5.8.2)':
+ dependencies:
+ '@types/web-bluetooth': 0.0.21
+ '@vueuse/metadata': 12.8.2
+ '@vueuse/shared': 12.8.2(typescript@5.8.2)
+ vue: 3.5.13(typescript@5.8.2)
+ transitivePeerDependencies:
+ - typescript
+
'@vueuse/core@9.13.0(vue@3.5.13(typescript@5.8.2))':
dependencies:
'@types/web-bluetooth': 0.0.16
@@ -20197,6 +20306,8 @@ snapshots:
'@vueuse/metadata@10.11.0': {}
+ '@vueuse/metadata@12.8.2': {}
+
'@vueuse/metadata@9.13.0': {}
'@vueuse/shared@10.11.0(vue@3.5.13(typescript@5.8.2))':
@@ -20206,6 +20317,12 @@ snapshots:
- '@vue/composition-api'
- vue
+ '@vueuse/shared@12.8.2(typescript@5.8.2)':
+ dependencies:
+ vue: 3.5.13(typescript@5.8.2)
+ transitivePeerDependencies:
+ - typescript
+
'@vueuse/shared@9.13.0(vue@3.5.13(typescript@5.8.2))':
dependencies:
vue-demi: 0.14.10(vue@3.5.13(typescript@5.8.2))
@@ -20431,6 +20548,10 @@ snapshots:
argparse@2.0.1: {}
+ aria-hidden@1.2.6:
+ dependencies:
+ tslib: 2.8.1
+
aria-query@5.1.3:
dependencies:
deep-equal: 2.2.0
@@ -21755,6 +21876,8 @@ snapshots:
has-property-descriptors: 1.0.2
object-keys: 1.1.1
+ defu@6.1.4: {}
+
delayed-stream@1.0.0: {}
delegates@1.0.0:
@@ -25787,6 +25910,8 @@ snapshots:
obuf@1.1.2: {}
+ ohash@2.0.11: {}
+
ollama@0.5.9:
dependencies:
whatwg-fetch: 3.6.20
@@ -26774,6 +26899,23 @@ snapshots:
reinterval@1.1.0: {}
+ reka-ui@2.2.1(typescript@5.8.2)(vue@3.5.13(typescript@5.8.2)):
+ dependencies:
+ '@floating-ui/dom': 1.7.0
+ '@floating-ui/vue': 1.1.6(vue@3.5.13(typescript@5.8.2))
+ '@internationalized/date': 3.8.1
+ '@internationalized/number': 3.6.2
+ '@tanstack/vue-virtual': 3.13.9(vue@3.5.13(typescript@5.8.2))
+ '@vueuse/core': 12.8.2(typescript@5.8.2)
+ '@vueuse/shared': 12.8.2(typescript@5.8.2)
+ aria-hidden: 1.2.6
+ defu: 6.1.4
+ ohash: 2.0.11
+ vue: 3.5.13(typescript@5.8.2)
+ transitivePeerDependencies:
+ - '@vue/composition-api'
+ - typescript
+
relateurl@0.2.7: {}
remove-trailing-slash@0.1.1: {}