diff --git a/components.d.ts b/components.d.ts
index 3e65c3cc..3bd43bbd 100644
--- a/components.d.ts
+++ b/components.d.ts
@@ -91,6 +91,7 @@ declare module '@vue/runtime-core' {
IbanValidatorAndParser: typeof import('./src/tools/iban-validator-and-parser/iban-validator-and-parser.vue')['default']
'IconMdi:brushVariant': typeof import('~icons/mdi/brush-variant')['default']
'IconMdi:kettleSteamOutline': typeof import('~icons/mdi/kettle-steam-outline')['default']
+ IconMdiArrowDown: typeof import('~icons/mdi/arrow-down')['default']
IconMdiChevronDown: typeof import('~icons/mdi/chevron-down')['default']
IconMdiChevronRight: typeof import('~icons/mdi/chevron-right')['default']
IconMdiClose: typeof import('~icons/mdi/close')['default']
@@ -131,17 +132,27 @@ declare module '@vue/runtime-core' {
MimeTypes: typeof import('./src/tools/mime-types/mime-types.vue')['default']
NavbarButtons: typeof import('./src/components/NavbarButtons.vue')['default']
NCheckbox: typeof import('naive-ui')['NCheckbox']
+ NCode: typeof import('naive-ui')['NCode']
NCollapseTransition: typeof import('naive-ui')['NCollapseTransition']
NConfigProvider: typeof import('naive-ui')['NConfigProvider']
NDivider: typeof import('naive-ui')['NDivider']
NEllipsis: typeof import('naive-ui')['NEllipsis']
+ NForm: typeof import('naive-ui')['NForm']
+ NFormItem: typeof import('naive-ui')['NFormItem']
+ NGi: typeof import('naive-ui')['NGi']
+ NGrid: typeof import('naive-ui')['NGrid']
NH1: typeof import('naive-ui')['NH1']
NH3: typeof import('naive-ui')['NH3']
NIcon: typeof import('naive-ui')['NIcon']
+ NInputNumber: typeof import('naive-ui')['NInputNumber']
NLayout: typeof import('naive-ui')['NLayout']
NLayoutSider: typeof import('naive-ui')['NLayoutSider']
NMenu: typeof import('naive-ui')['NMenu']
+ NScrollbar: typeof import('naive-ui')['NScrollbar']
+ NSlider: typeof import('naive-ui')['NSlider']
NSpace: typeof import('naive-ui')['NSpace']
+ NSpin: typeof import('naive-ui')['NSpin']
+ NSwitch: typeof import('naive-ui')['NSwitch']
NTable: typeof import('naive-ui')['NTable']
NumeronymGenerator: typeof import('./src/tools/numeronym-generator/numeronym-generator.vue')['default']
OtpCodeGeneratorAndValidator: typeof import('./src/tools/otp-code-generator-and-validator/otp-code-generator-and-validator.vue')['default']
@@ -155,6 +166,7 @@ declare module '@vue/runtime-core' {
RegexMemo: typeof import('./src/tools/regex-memo/regex-memo.vue')['default']
'RegexMemo.content': typeof import('./src/tools/regex-memo/regex-memo.content.md')['default']
RegexTester: typeof import('./src/tools/regex-tester/regex-tester.vue')['default']
+ RemoveDuplicateTextRows: typeof import('./src/tools/remove-duplicate-text-rows/remove-duplicate-text-rows.vue')['default']
ResultRow: typeof import('./src/tools/ipv4-range-expander/result-row.vue')['default']
RomanNumeralConverter: typeof import('./src/tools/roman-numeral-converter/roman-numeral-converter.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']
diff --git a/src/tools/index.ts b/src/tools/index.ts
index 388cfaf4..2fdc78ec 100644
--- a/src/tools/index.ts
+++ b/src/tools/index.ts
@@ -1,6 +1,7 @@
import { tool as base64FileConverter } from './base64-file-converter';
import { tool as base64StringConverter } from './base64-string-converter';
import { tool as basicAuthGenerator } from './basic-auth-generator';
+import { tool as removeDuplicateTextRows } from './remove-duplicate-text-rows';
import { tool as emailNormalizer } from './email-normalizer';
import { tool as asciiTextDrawer } from './ascii-text-drawer';
@@ -184,6 +185,7 @@ export const toolsByCategory: ToolCategory[] = [
textDiff,
numeronymGenerator,
asciiTextDrawer,
+ removeDuplicateTextRows,
],
},
{
diff --git a/src/tools/remove-duplicate-text-rows/index.ts b/src/tools/remove-duplicate-text-rows/index.ts
new file mode 100644
index 00000000..d3d522c8
--- /dev/null
+++ b/src/tools/remove-duplicate-text-rows/index.ts
@@ -0,0 +1,12 @@
+import { Copy } from '@vicons/tabler';
+import { defineTool } from '../tool';
+
+export const tool = defineTool({
+ name: 'Remove duplicate text',
+ path: '/remove-duplicate-text',
+ description: 'Remove duplicate rows from a list of text rows.',
+ keywords: ['remove', 'duplicate', 'text', 'rows', 'delete', 'unique', 'distinct'],
+ component: () => import('./remove-duplicate-text-rows.vue'),
+ icon: Copy,
+ createdAt: new Date('2024-10-01'),
+});
diff --git a/src/tools/remove-duplicate-text-rows/remove-duplicate-text-rows.vue b/src/tools/remove-duplicate-text-rows/remove-duplicate-text-rows.vue
new file mode 100644
index 00000000..2bb482e5
--- /dev/null
+++ b/src/tools/remove-duplicate-text-rows/remove-duplicate-text-rows.vue
@@ -0,0 +1,106 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+