From 52fdff29de8db875aaa5b62027c2411f8c99f985 Mon Sep 17 00:00:00 2001 From: Anton Reshetov Date: Fri, 23 May 2025 15:35:10 +0300 Subject: [PATCH 01/31] feat(devtools): add text case converter component --- package.json | 1 + pnpm-lock.yaml | 8 ++ src/main/menu/main.ts | 9 ++ src/main/types/ipc.ts | 1 + .../devtools/converters/CaseConverter.vue | 127 ++++++++++++++++++ src/renderer/ipc/listeners/main-menu.ts | 4 + src/renderer/router/index.ts | 15 +++ src/renderer/views/Devtools.vue | 46 +++++++ 8 files changed, 211 insertions(+) create mode 100644 src/renderer/components/devtools/converters/CaseConverter.vue create mode 100644 src/renderer/views/Devtools.vue diff --git a/package.json b/package.json index 77d35d60..cc1c796f 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "@elysiajs/swagger": "^1.2.2", "@vueuse/core": "^12.7.0", "better-sqlite3": "^11.8.1", + "change-case": "^5.4.4", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "codemirror": "^5.65.18", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c7da8719..273cb2ae 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,6 +23,9 @@ importers: better-sqlite3: specifier: ^11.8.1 version: 11.8.1 + change-case: + specifier: ^5.4.4 + version: 5.4.4 class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -1649,6 +1652,9 @@ packages: resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + change-case@5.4.4: + resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} + character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} @@ -6556,6 +6562,8 @@ snapshots: chalk@5.4.1: {} + change-case@5.4.4: {} + character-entities@2.0.2: {} cheerio-select@2.1.0: diff --git a/src/main/menu/main.ts b/src/main/menu/main.ts index c35f8675..40f59d30 100644 --- a/src/main/menu/main.ts +++ b/src/main/menu/main.ts @@ -50,6 +50,15 @@ const appMenuItems: MenuConfig[] = [ type: 'separator' as any, platforms: ['darwin'], }, + { + id: 'devtools', + label: i18n.t('menu:app.devtools'), + accelerator: 'CommandOrControl+.', + click: () => send('main-menu:goto-devtools'), + }, + { + type: 'separator' as any, + }, { label: i18n.t('menu:app.hide'), platforms: ['darwin'], diff --git a/src/main/types/ipc.ts b/src/main/types/ipc.ts index 54e8ecfc..48c78cd0 100644 --- a/src/main/types/ipc.ts +++ b/src/main/types/ipc.ts @@ -11,6 +11,7 @@ type MainMenuAction = | 'font-size-reset' | 'format' | 'goto-preferences' + | 'goto-devtools' | 'new-folder' | 'new-fragment' | 'new-snippet' diff --git a/src/renderer/components/devtools/converters/CaseConverter.vue b/src/renderer/components/devtools/converters/CaseConverter.vue new file mode 100644 index 00000000..14ffd6a3 --- /dev/null +++ b/src/renderer/components/devtools/converters/CaseConverter.vue @@ -0,0 +1,127 @@ + + + diff --git a/src/renderer/ipc/listeners/main-menu.ts b/src/renderer/ipc/listeners/main-menu.ts index 09b4ac00..b2a33506 100644 --- a/src/renderer/ipc/listeners/main-menu.ts +++ b/src/renderer/ipc/listeners/main-menu.ts @@ -16,6 +16,10 @@ export function registerMainMenuListeners() { router.push({ name: RouterName.preferences }) }) + ipc.on('main-menu:goto-devtools', () => { + router.push({ name: RouterName.devtools }) + }) + ipc.on('main-menu:new-snippet', () => { createSnippetAndSelect() }) diff --git a/src/renderer/router/index.ts b/src/renderer/router/index.ts index 93c00b30..9b8b243a 100644 --- a/src/renderer/router/index.ts +++ b/src/renderer/router/index.ts @@ -8,6 +8,8 @@ export const RouterName = { preferencesAppearance: 'preferences/appearance', preferencesEditor: 'preferences/editor', markdownPresentation: 'markdown-presentation', + devtools: 'devtools', + devtoolsTextCaseConverter: 'devtools/text/case-converter', } const routes = [ @@ -48,6 +50,19 @@ const routes = [ name: RouterName.markdownPresentation, component: () => import('@/views/MarkdownPresentation.vue'), }, + { + path: '/devtools', + name: RouterName.devtools, + component: () => import('@/views/Devtools.vue'), + children: [ + { + path: 'text/case-converter', + name: RouterName.devtoolsTextCaseConverter, + component: () => + import('~/renderer/components/devtools/converters/CaseConverter.vue'), + }, + ], + }, ] export const router = createRouter({ diff --git a/src/renderer/views/Devtools.vue b/src/renderer/views/Devtools.vue new file mode 100644 index 00000000..d475e57d --- /dev/null +++ b/src/renderer/views/Devtools.vue @@ -0,0 +1,46 @@ + + + From 756d373e2a6d6012041180e16aa0d2835e3694f2 Mon Sep 17 00:00:00 2001 From: Anton Reshetov Date: Fri, 23 May 2025 15:38:01 +0300 Subject: [PATCH 02/31] feat(ui): add Heading component for dynamic headings with optional description --- .../components/ui/heading/Heading.vue | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/renderer/components/ui/heading/Heading.vue diff --git a/src/renderer/components/ui/heading/Heading.vue b/src/renderer/components/ui/heading/Heading.vue new file mode 100644 index 00000000..81032615 --- /dev/null +++ b/src/renderer/components/ui/heading/Heading.vue @@ -0,0 +1,35 @@ + + + From 904655c97ae0511a3eebe3d563f24817f0fb8921 Mon Sep 17 00:00:00 2001 From: Anton Reshetov Date: Fri, 23 May 2025 15:38:38 +0300 Subject: [PATCH 03/31] feat(ui): add readonly prop to Input component for improved accessibility --- src/renderer/components/ui/input/Input.vue | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/ui/input/Input.vue b/src/renderer/components/ui/input/Input.vue index 53bf8fb0..c6dd8a1f 100644 --- a/src/renderer/components/ui/input/Input.vue +++ b/src/renderer/components/ui/input/Input.vue @@ -13,6 +13,7 @@ interface Props { focus?: boolean select?: boolean disabled?: boolean + readonly?: boolean } defineOptions({ @@ -59,11 +60,12 @@ watchEffect(() => { cn(variants({ variant }), props.class), { 'pr-9': clearable && model }, { 'text-text-muted cursor-not-allowed': disabled }, + { 'text-text-muted': readonly }, ]" :placeholder="placeholder" :type="type" v-bind="attrs" - :disabled="disabled" + :disabled="disabled || readonly" > Date: Sat, 24 May 2025 07:49:10 +0300 Subject: [PATCH 04/31] feat(devtools): add text to unicode converter component --- .../devtools/converters/TextToUnicode.vue | 108 ++++++++++++++++++ src/renderer/router/index.ts | 7 ++ src/renderer/views/Devtools.vue | 6 +- 3 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 src/renderer/components/devtools/converters/TextToUnicode.vue diff --git a/src/renderer/components/devtools/converters/TextToUnicode.vue b/src/renderer/components/devtools/converters/TextToUnicode.vue new file mode 100644 index 00000000..d72ce9cb --- /dev/null +++ b/src/renderer/components/devtools/converters/TextToUnicode.vue @@ -0,0 +1,108 @@ + + + diff --git a/src/renderer/router/index.ts b/src/renderer/router/index.ts index 9b8b243a..73c7810f 100644 --- a/src/renderer/router/index.ts +++ b/src/renderer/router/index.ts @@ -10,6 +10,7 @@ export const RouterName = { markdownPresentation: 'markdown-presentation', devtools: 'devtools', devtoolsTextCaseConverter: 'devtools/text/case-converter', + devtoolsTextToUnicode: 'devtools/text/to-unicode', } const routes = [ @@ -61,6 +62,12 @@ const routes = [ component: () => import('~/renderer/components/devtools/converters/CaseConverter.vue'), }, + { + path: 'text/to-unicode', + name: RouterName.devtoolsTextToUnicode, + component: () => + import('~/renderer/components/devtools/converters/TextToUnicode.vue'), + }, ], }, ] diff --git a/src/renderer/views/Devtools.vue b/src/renderer/views/Devtools.vue index d475e57d..5131ac1b 100644 --- a/src/renderer/views/Devtools.vue +++ b/src/renderer/views/Devtools.vue @@ -11,9 +11,13 @@ const isActiveRoute = computed(() => { const nav = [ { - label: i18n.t('devtools:textTools.caseConverter'), + label: i18n.t('devtools:converters.caseConverter.label'), name: RouterName.devtoolsTextCaseConverter, }, + { + label: i18n.t('devtools:converters.textToUnicode.label'), + name: RouterName.devtoolsTextToUnicode, + }, ] From dc974bbcfc0e2653da4e2064f4a00471b1c487be Mon Sep 17 00:00:00 2001 From: Anton Reshetov Date: Sat, 24 May 2025 07:49:33 +0300 Subject: [PATCH 05/31] chore: clean --- src/renderer/components/devtools/converters/CaseConverter.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/src/renderer/components/devtools/converters/CaseConverter.vue b/src/renderer/components/devtools/converters/CaseConverter.vue index 14ffd6a3..bbcfc1ca 100644 --- a/src/renderer/components/devtools/converters/CaseConverter.vue +++ b/src/renderer/components/devtools/converters/CaseConverter.vue @@ -82,7 +82,6 @@ const output = computed(() => { :title="title" :description="description" /> -
Date: Sat, 24 May 2025 07:49:49 +0300 Subject: [PATCH 06/31] feat(ui): enhance Input component to support textarea type and rows prop --- src/renderer/components/ui/input/Input.vue | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/ui/input/Input.vue b/src/renderer/components/ui/input/Input.vue index c6dd8a1f..ab6cc594 100644 --- a/src/renderer/components/ui/input/Input.vue +++ b/src/renderer/components/ui/input/Input.vue @@ -9,11 +9,12 @@ interface Props { class?: string placeholder?: string clearable?: boolean - type?: 'text' | 'number' + type?: 'text' | 'textarea' | 'number' focus?: boolean select?: boolean disabled?: boolean readonly?: boolean + rows?: number } defineOptions({ @@ -52,8 +53,9 @@ watchEffect(() => {