From ce71345bef3c7712231bddefe06ac7330a427e84 Mon Sep 17 00:00:00 2001 From: ujiro99 Date: Mon, 13 Jul 2026 12:04:23 +0900 Subject: [PATCH 01/13] Add: Option to keep the selection menu open on tab/window change Adds startupMethod.keepMenuOpenOnTabChange, letting users keep the selection menu and selected text visible after running a command opens a new tab/window, so they can return and run another command on the same selection. Closes #365 --- .../public/_locales/de/messages.json | 6 +++ .../public/_locales/en/messages.json | 7 +++ .../public/_locales/es/messages.json | 6 +++ .../public/_locales/fr/messages.json | 6 +++ .../public/_locales/hi/messages.json | 6 +++ .../public/_locales/id/messages.json | 6 +++ .../public/_locales/it/messages.json | 6 +++ .../public/_locales/ja/messages.json | 6 +++ .../public/_locales/ko/messages.json | 6 +++ .../public/_locales/ms/messages.json | 6 +++ .../public/_locales/pt_BR/messages.json | 6 +++ .../public/_locales/pt_PT/messages.json | 6 +++ .../public/_locales/ru/messages.json | 6 +++ .../public/_locales/zh_CN/messages.json | 6 +++ packages/extension/src/background_script.ts | 22 +++++---- .../src/components/option/SettingForm.tsx | 46 +++++++++++-------- .../src/services/option/defaultSettings.ts | 6 ++- .../src/services/settings/settings.ts | 16 +++++++ packages/extension/src/types/index.ts | 5 ++ 19 files changed, 152 insertions(+), 28 deletions(-) diff --git a/packages/extension/public/_locales/de/messages.json b/packages/extension/public/_locales/de/messages.json index f84095b3..a2bf3924 100644 --- a/packages/extension/public/_locales/de/messages.json +++ b/packages/extension/public/_locales/de/messages.json @@ -131,6 +131,12 @@ "Option_startupMethod_keyboard_placeholder": { "message": "Taste auswählen" }, + "Option_keepMenuOpenOnTabChange": { + "message": "Menü bei Tab-Wechsel geöffnet lassen" + }, + "Option_keepMenuOpenOnTabChange_desc": { + "message": "Behält das Auswahlmenü und den ausgewählten Text bei, wenn Sie nach dem Ausführen eines Befehls den Tab oder das Fenster wechseln, sodass Sie zurückkehren und einen weiteren Befehl für dieselbe Auswahl ausführen können." + }, "Option_keyboardParam_Control_windows": { "message": "Strg" }, diff --git a/packages/extension/public/_locales/en/messages.json b/packages/extension/public/_locales/en/messages.json index cb6491b6..21f4ea87 100644 --- a/packages/extension/public/_locales/en/messages.json +++ b/packages/extension/public/_locales/en/messages.json @@ -133,6 +133,13 @@ "Option_startupMethod_keyboard_placeholder": { "message": "Select a key" }, + "Option_keepMenuOpenOnTabChange": { + "message": "Keep Menu Open on Tab Change", + "description": "Toggle label. When enabled, switching tabs/windows after running a command does not close the selection menu." + }, + "Option_keepMenuOpenOnTabChange_desc": { + "message": "Keep the selection menu and selected text when you switch tabs or windows after running a command, so you can come back and run another command on the same selection." + }, "Option_keyboardParam_Control_windows": { "message": "Ctrl" }, diff --git a/packages/extension/public/_locales/es/messages.json b/packages/extension/public/_locales/es/messages.json index d77437ae..18a4d354 100644 --- a/packages/extension/public/_locales/es/messages.json +++ b/packages/extension/public/_locales/es/messages.json @@ -131,6 +131,12 @@ "Option_startupMethod_keyboard_placeholder": { "message": "Seleccione una tecla" }, + "Option_keepMenuOpenOnTabChange": { + "message": "Mantener el menú abierto al cambiar de pestaña" + }, + "Option_keepMenuOpenOnTabChange_desc": { + "message": "Mantiene el menú de selección y el texto seleccionado al cambiar de pestaña o ventana después de ejecutar un comando, para poder volver y ejecutar otro comando sobre la misma selección." + }, "Option_keyboardParam_Control_windows": { "message": "Ctrl" }, diff --git a/packages/extension/public/_locales/fr/messages.json b/packages/extension/public/_locales/fr/messages.json index 5a802621..b79fe81e 100644 --- a/packages/extension/public/_locales/fr/messages.json +++ b/packages/extension/public/_locales/fr/messages.json @@ -131,6 +131,12 @@ "Option_startupMethod_keyboard_placeholder": { "message": "Sélectionner une touche" }, + "Option_keepMenuOpenOnTabChange": { + "message": "Garder le menu ouvert lors du changement d'onglet" + }, + "Option_keepMenuOpenOnTabChange_desc": { + "message": "Conserve le menu de sélection et le texte sélectionné lorsque vous changez d'onglet ou de fenêtre après avoir exécuté une commande, afin de pouvoir revenir et exécuter une autre commande sur la même sélection." + }, "Option_keyboardParam_Control_windows": { "message": "Ctrl" }, diff --git a/packages/extension/public/_locales/hi/messages.json b/packages/extension/public/_locales/hi/messages.json index 6d030594..7521c4a9 100644 --- a/packages/extension/public/_locales/hi/messages.json +++ b/packages/extension/public/_locales/hi/messages.json @@ -131,6 +131,12 @@ "Option_startupMethod_keyboard_placeholder": { "message": "कुंजी चुनें" }, + "Option_keepMenuOpenOnTabChange": { + "message": "टैब बदलने पर मेनू खुला रखें" + }, + "Option_keepMenuOpenOnTabChange_desc": { + "message": "कमांड चलाने के बाद टैब या विंडो बदलने पर भी चयन मेनू और चयनित टेक्स्ट को बनाए रखता है, ताकि आप वापस आकर उसी चयन पर दूसरा कमांड चला सकें।" + }, "Option_keyboardParam_Control_windows": { "message": "Ctrl" }, diff --git a/packages/extension/public/_locales/id/messages.json b/packages/extension/public/_locales/id/messages.json index 74c009f3..46113497 100644 --- a/packages/extension/public/_locales/id/messages.json +++ b/packages/extension/public/_locales/id/messages.json @@ -131,6 +131,12 @@ "Option_startupMethod_keyboard_placeholder": { "message": "Pilih tombol" }, + "Option_keepMenuOpenOnTabChange": { + "message": "Pertahankan Menu Terbuka Saat Ganti Tab" + }, + "Option_keepMenuOpenOnTabChange_desc": { + "message": "Mempertahankan menu pilihan dan teks yang dipilih saat Anda berpindah tab atau jendela setelah menjalankan perintah, sehingga Anda dapat kembali dan menjalankan perintah lain pada pilihan yang sama." + }, "Option_keyboardParam_Control_windows": { "message": "Ctrl" }, diff --git a/packages/extension/public/_locales/it/messages.json b/packages/extension/public/_locales/it/messages.json index 98e1099d..db810de4 100644 --- a/packages/extension/public/_locales/it/messages.json +++ b/packages/extension/public/_locales/it/messages.json @@ -131,6 +131,12 @@ "Option_startupMethod_keyboard_placeholder": { "message": "Seleziona tasto" }, + "Option_keepMenuOpenOnTabChange": { + "message": "Mantieni il menu aperto al cambio scheda" + }, + "Option_keepMenuOpenOnTabChange_desc": { + "message": "Mantiene il menu di selezione e il testo selezionato quando si cambia scheda o finestra dopo aver eseguito un comando, così da poter tornare ed eseguire un altro comando sulla stessa selezione." + }, "Option_keyboardParam_Control_windows": { "message": "Ctrl" }, diff --git a/packages/extension/public/_locales/ja/messages.json b/packages/extension/public/_locales/ja/messages.json index dd2c9804..64e00aa0 100644 --- a/packages/extension/public/_locales/ja/messages.json +++ b/packages/extension/public/_locales/ja/messages.json @@ -131,6 +131,12 @@ "Option_startupMethod_keyboard_placeholder": { "message": "キーを選択" }, + "Option_keepMenuOpenOnTabChange": { + "message": "タブ切り替え時もメニューを維持する" + }, + "Option_keepMenuOpenOnTabChange_desc": { + "message": "コマンド実行後に別タブやウィンドウへ移動しても、選択メニューと選択テキストを維持します。戻ってきたときに続けて別のコマンドを実行できます。" + }, "Option_keyboardParam_Control_windows": { "message": "Ctrl" }, diff --git a/packages/extension/public/_locales/ko/messages.json b/packages/extension/public/_locales/ko/messages.json index fe42e38e..7121f51c 100644 --- a/packages/extension/public/_locales/ko/messages.json +++ b/packages/extension/public/_locales/ko/messages.json @@ -131,6 +131,12 @@ "Option_startupMethod_keyboard_placeholder": { "message": "키 선택" }, + "Option_keepMenuOpenOnTabChange": { + "message": "탭 전환 시에도 메뉴 유지" + }, + "Option_keepMenuOpenOnTabChange_desc": { + "message": "명령 실행 후 탭이나 창을 전환해도 선택 메뉴와 선택한 텍스트를 유지합니다. 돌아와서 동일한 선택 항목에 다른 명령을 이어서 실행할 수 있습니다." + }, "Option_keyboardParam_Control_windows": { "message": "Ctrl" }, diff --git a/packages/extension/public/_locales/ms/messages.json b/packages/extension/public/_locales/ms/messages.json index 7513188a..abcbb0a6 100644 --- a/packages/extension/public/_locales/ms/messages.json +++ b/packages/extension/public/_locales/ms/messages.json @@ -131,6 +131,12 @@ "Option_startupMethod_keyboard_placeholder": { "message": "Pilih kekunci" }, + "Option_keepMenuOpenOnTabChange": { + "message": "Kekalkan Menu Terbuka Semasa Tukar Tab" + }, + "Option_keepMenuOpenOnTabChange_desc": { + "message": "Mengekalkan menu pemilihan dan teks yang dipilih apabila anda menukar tab atau tetingkap selepas menjalankan arahan, supaya anda boleh kembali dan menjalankan arahan lain pada pilihan yang sama." + }, "Option_keyboardParam_Control_windows": { "message": "Ctrl" }, diff --git a/packages/extension/public/_locales/pt_BR/messages.json b/packages/extension/public/_locales/pt_BR/messages.json index 83fdd874..369e91e7 100644 --- a/packages/extension/public/_locales/pt_BR/messages.json +++ b/packages/extension/public/_locales/pt_BR/messages.json @@ -131,6 +131,12 @@ "Option_startupMethod_keyboard_placeholder": { "message": "Selecione uma tecla" }, + "Option_keepMenuOpenOnTabChange": { + "message": "Manter Menu Aberto ao Trocar de Aba" + }, + "Option_keepMenuOpenOnTabChange_desc": { + "message": "Mantém o menu de seleção e o texto selecionado ao trocar de aba ou janela após executar um comando, para que você possa voltar e executar outro comando na mesma seleção." + }, "Option_keyboardParam_Control_windows": { "message": "Ctrl" }, diff --git a/packages/extension/public/_locales/pt_PT/messages.json b/packages/extension/public/_locales/pt_PT/messages.json index 39110e70..a6f6fecf 100644 --- a/packages/extension/public/_locales/pt_PT/messages.json +++ b/packages/extension/public/_locales/pt_PT/messages.json @@ -131,6 +131,12 @@ "Option_startupMethod_keyboard_placeholder": { "message": "Selecione uma tecla" }, + "Option_keepMenuOpenOnTabChange": { + "message": "Manter o Menu Aberto ao Mudar de Separador" + }, + "Option_keepMenuOpenOnTabChange_desc": { + "message": "Mantém o menu de seleção e o texto selecionado ao mudar de separador ou janela depois de executar um comando, para que possa voltar e executar outro comando na mesma seleção." + }, "Option_keyboardParam_Control_windows": { "message": "Ctrl" }, diff --git a/packages/extension/public/_locales/ru/messages.json b/packages/extension/public/_locales/ru/messages.json index 219e0b4d..df94dfce 100644 --- a/packages/extension/public/_locales/ru/messages.json +++ b/packages/extension/public/_locales/ru/messages.json @@ -131,6 +131,12 @@ "Option_startupMethod_keyboard_placeholder": { "message": "Выберите клавишу" }, + "Option_keepMenuOpenOnTabChange": { + "message": "Не закрывать меню при переключении вкладок" + }, + "Option_keepMenuOpenOnTabChange_desc": { + "message": "Сохраняет меню выбора и выделенный текст при переключении вкладок или окон после выполнения команды, чтобы вы могли вернуться и выполнить другую команду для того же выделения." + }, "Option_keyboardParam_Control_windows": { "message": "Ctrl" }, diff --git a/packages/extension/public/_locales/zh_CN/messages.json b/packages/extension/public/_locales/zh_CN/messages.json index bc3541f8..4ff13d71 100644 --- a/packages/extension/public/_locales/zh_CN/messages.json +++ b/packages/extension/public/_locales/zh_CN/messages.json @@ -131,6 +131,12 @@ "Option_startupMethod_keyboard_placeholder": { "message": "选择键" }, + "Option_keepMenuOpenOnTabChange": { + "message": "切换标签页时保持菜单打开" + }, + "Option_keepMenuOpenOnTabChange_desc": { + "message": "执行命令后切换标签页或窗口时,保持选择菜单和已选文本不变,方便返回后对同一选择内容执行其他命令。" + }, "Option_keyboardParam_Control_windows": { "message": "Ctrl" }, diff --git a/packages/extension/src/background_script.ts b/packages/extension/src/background_script.ts index d246ac10..992681c4 100644 --- a/packages/extension/src/background_script.ts +++ b/packages/extension/src/background_script.ts @@ -347,8 +347,11 @@ chrome.action.onClicked.addListener(() => { }) chrome.windows.onFocusChanged.addListener(async (windowId: number) => { - // Clear selection text - await Storage.set(SESSION_STORAGE_KEY.SELECTION_TEXT, "") + const settings = await enhancedSettings.get() + if (!settings.startupMethod?.keepMenuOpenOnTabChange) { + // Clear selection text + await Storage.set(SESSION_STORAGE_KEY.SELECTION_TEXT, "") + } if (windowId === chrome.windows.WINDOW_ID_NONE) { return @@ -393,12 +396,15 @@ chrome.windows.onBoundsChanged.addListener(async (window) => { }) chrome.tabs.onActivated.addListener(async (activeInfo) => { - // Force close the menu - try { - const ret = await Ipc.sendAllTab(TabCommand.closeMenu) - ret.filter((v) => v).forEach((v) => console.debug(v)) - } catch (error) { - console.error("Failed to close menu:", error) + const settings = await enhancedSettings.get() + if (!settings.startupMethod?.keepMenuOpenOnTabChange) { + // Force close the menu + try { + const ret = await Ipc.sendAllTab(TabCommand.closeMenu) + ret.filter((v) => v).forEach((v) => console.debug(v)) + } catch (error) { + console.error("Failed to close menu:", error) + } } try { diff --git a/packages/extension/src/components/option/SettingForm.tsx b/packages/extension/src/components/option/SettingForm.tsx index 72b4517e..a214c26b 100644 --- a/packages/extension/src/components/option/SettingForm.tsx +++ b/packages/extension/src/components/option/SettingForm.tsx @@ -77,6 +77,7 @@ const formSchema = z .min(50, { message: t("zod_number_min", ["50"]) }) .max(500, { message: t("zod_number_max", ["500"]) }) .optional(), + keepMenuOpenOnTabChange: z.boolean().optional(), }) .strict(), popupPlacement: popupPlacementSchema, @@ -483,6 +484,13 @@ export function SettingForm({ className }: { className?: string }) { defaultValues={getAnimationDefaultValues()} /> )} + +
@@ -568,25 +576,25 @@ export function SettingForm({ className }: { className?: string }) { )} {linkCommandMethod === LINK_COMMAND_STARTUP_METHOD.LEFT_CLICK_HOLD && ( - - )} + + )} => { if (versionDiff(currentVersion, "0.15.1") === VersionDiff.Old) { data = migrate0_15_1(data) } + if (versionDiff(currentVersion, "1.1.1") === VersionDiff.Old) { + data = migrate1_1_1(data) + } data.settingVersion = VERSION as Version return data @@ -381,3 +384,16 @@ const migrate0_15_1 = (data: SettingsType): SettingsType => { } return data } + +const migrate1_1_1 = (data: SettingsType): SettingsType => { + // Add startupMethod.keepMenuOpenOnTabChange if not exists + if ( + data.startupMethod != null && + data.startupMethod.keepMenuOpenOnTabChange == null + ) { + data.startupMethod.keepMenuOpenOnTabChange = + DefaultSettings.startupMethod.keepMenuOpenOnTabChange + console.debug("migrate 1.1.1: added startupMethod.keepMenuOpenOnTabChange") + } + return data +} diff --git a/packages/extension/src/types/index.ts b/packages/extension/src/types/index.ts index bedbdaa7..2ab25d28 100644 --- a/packages/extension/src/types/index.ts +++ b/packages/extension/src/types/index.ts @@ -94,6 +94,8 @@ export type PopupOption = { export type CopyOption = "default" | "text" +// Settings for the behavior of windows/panels opened as a result of command execution +// (e.g. side panel, popup window). Not related to the selection menu itself. type WindowOption = { sidePanelAutoHide: boolean popupAutoCloseDelay?: number @@ -156,10 +158,13 @@ export type StyleVariable = { value: string } +// Settings for how the selection menu itself is triggered and displayed +// (e.g. trigger method, and whether it stays open across tab/window changes). export type StartupMethod = { method: STARTUP_METHOD keyboardParam?: KEYBOARD leftClickHoldParam?: number + keepMenuOpenOnTabChange?: boolean } export type Star = { From 559a317bd234ad5125b924607b6436bff8678efd Mon Sep 17 00:00:00 2001 From: ujiro99 Date: Mon, 13 Jul 2026 20:58:53 +0900 Subject: [PATCH 02/13] Refactor: reduce packages/hub to ai-services.json hosting + e2e test page The Selection Command Hub app has migrated to a new repository (selection-command-hub) with a new architecture. packages/hub now only needs to host public/data/ai-services.json for the AiPrompt command and serve the e2e test page used by packages/extension's Playwright suite, so all other pages, components, features, and data have been removed. The extension's MyCommands widget (command_hub.tsx) only worked by injecting into hub pages that are now deleted, so it has been removed along with its manifest.json content_script entry and build config references. AGENTS.md and README.md have been updated to reflect the reduced scope. Co-Authored-By: Claude Sonnet 5 --- AGENTS.md | 75 +- README.md | 2 +- package.json | 1 - packages/extension/AGENTS.md | 2 +- packages/extension/manifest.json | 9 - packages/extension/src/command_hub.css | 1 - packages/extension/src/command_hub.tsx | 74 - .../src/components/commandHub/CommandHub.tsx | 3 - .../src/components/commandHub/MyCommands.tsx | 266 --- .../extension/src/lib/vite-plugin-manifest.ts | 4 +- packages/extension/vite.config.ts | 11 +- packages/hub/AGENTS.md | 155 +- packages/hub/docs/vitest-introduction-plan.md | 215 -- packages/hub/next-sitemap.config.js | 11 - packages/hub/package.json | 24 +- packages/hub/public/bars-scale-middle.svg | 1 - packages/hub/public/data/pageActionIds.json | 19 - packages/hub/public/data/searchUrls.json | 53 - packages/hub/public/engineer_suit_simple.png | Bin 23804 -> 0 bytes packages/hub/public/ozigi_suit_man_simple.png | Bin 12705 -> 0 bytes packages/hub/scripts/fetch-ga-data.js | 117 - packages/hub/scripts/update-searchUrls.mjs | 14 - packages/hub/scripts/update-tags.mjs | 16 - packages/hub/src/app/[lang]/cookie/de.ts | 36 - packages/hub/src/app/[lang]/cookie/en.ts | 36 - packages/hub/src/app/[lang]/cookie/es.ts | 36 - packages/hub/src/app/[lang]/cookie/fr.ts | 36 - packages/hub/src/app/[lang]/cookie/hi.ts | 36 - packages/hub/src/app/[lang]/cookie/id.ts | 36 - packages/hub/src/app/[lang]/cookie/it.ts | 36 - packages/hub/src/app/[lang]/cookie/ja.ts | 34 - packages/hub/src/app/[lang]/cookie/ko.ts | 36 - packages/hub/src/app/[lang]/cookie/ms.ts | 36 - packages/hub/src/app/[lang]/cookie/page.tsx | 50 - packages/hub/src/app/[lang]/cookie/pt-BR.ts | 36 - packages/hub/src/app/[lang]/cookie/pt-PT.ts | 36 - packages/hub/src/app/[lang]/cookie/ru.ts | 36 - packages/hub/src/app/[lang]/cookie/zh-CN.ts | 36 - packages/hub/src/app/[lang]/page.tsx | 29 - packages/hub/src/app/[lang]/privacy/de.ts | 55 - packages/hub/src/app/[lang]/privacy/en.ts | 55 - packages/hub/src/app/[lang]/privacy/es.ts | 55 - packages/hub/src/app/[lang]/privacy/fr.ts | 55 - packages/hub/src/app/[lang]/privacy/hi.ts | 55 - packages/hub/src/app/[lang]/privacy/id.ts | 55 - packages/hub/src/app/[lang]/privacy/it.ts | 55 - packages/hub/src/app/[lang]/privacy/ja.ts | 55 - packages/hub/src/app/[lang]/privacy/ko.ts | 55 - packages/hub/src/app/[lang]/privacy/ms.ts | 55 - packages/hub/src/app/[lang]/privacy/page.tsx | 54 - packages/hub/src/app/[lang]/privacy/pt-BR.ts | 55 - packages/hub/src/app/[lang]/privacy/pt-PT.ts | 55 - packages/hub/src/app/[lang]/privacy/ru.ts | 55 - packages/hub/src/app/[lang]/privacy/zh-CN.ts | 55 - .../hub/src/app/[lang]/tag/[tag]/page.tsx | 40 - packages/hub/src/app/[lang]/terms/de.ts | 69 - packages/hub/src/app/[lang]/terms/en.ts | 69 - packages/hub/src/app/[lang]/terms/es.ts | 69 - packages/hub/src/app/[lang]/terms/fr.ts | 69 - packages/hub/src/app/[lang]/terms/hi.ts | 69 - packages/hub/src/app/[lang]/terms/id.ts | 69 - packages/hub/src/app/[lang]/terms/it.ts | 69 - packages/hub/src/app/[lang]/terms/ja.ts | 69 - packages/hub/src/app/[lang]/terms/ko.ts | 69 - packages/hub/src/app/[lang]/terms/ms.ts | 69 - packages/hub/src/app/[lang]/terms/page.tsx | 52 - packages/hub/src/app/[lang]/terms/pt-BR.ts | 69 - packages/hub/src/app/[lang]/terms/pt-PT.ts | 69 - packages/hub/src/app/[lang]/terms/ru.ts | 69 - packages/hub/src/app/[lang]/terms/zh-CN.ts | 69 - .../hub/src/app/[lang]/uninstall/page.tsx | 11 - packages/hub/src/app/not-found.tsx | 31 - packages/hub/src/app/page.tsx | 15 - packages/hub/src/app/uninstall/page.tsx | 24 - .../hub/src/components/CommandForm.module.css | 57 - packages/hub/src/components/CommandForm.tsx | 324 --- packages/hub/src/components/CommandShare.tsx | 33 - packages/hub/src/components/CookieConsent.tsx | 11 +- packages/hub/src/components/Details.tsx | 59 - packages/hub/src/components/InputForm.tsx | 726 ------- packages/hub/src/components/ListItem.tsx | 121 -- packages/hub/src/components/SortOrder.tsx | 111 - packages/hub/src/components/Tag.tsx | 22 - packages/hub/src/components/TagLink.tsx | 18 - packages/hub/src/components/TagPicker.tsx | 145 -- packages/hub/src/components/UninstallForm.tsx | 411 ---- .../components/layout/CommandList.module.css | 7 - .../hub/src/components/layout/CommandList.tsx | 57 - packages/hub/src/components/layout/Footer.tsx | 16 - .../components/pageAction/PageActionItem.tsx | 91 - .../src/components/pageAction/StepList.tsx | 54 - .../src/components/pageAction/TypeIcon.tsx | 39 - packages/hub/src/components/ui/badge.tsx | 36 - packages/hub/src/components/ui/checkbox.tsx | 32 - .../hub/src/components/ui/collapsible.tsx | 11 - packages/hub/src/components/ui/command.tsx | 153 -- packages/hub/src/components/ui/dialog.tsx | 122 -- packages/hub/src/components/ui/form.tsx | 219 -- packages/hub/src/components/ui/input.tsx | 22 - packages/hub/src/components/ui/label.tsx | 26 - packages/hub/src/components/ui/popover.tsx | 39 - packages/hub/src/components/ui/skeleton.tsx | 15 - packages/hub/src/components/ui/textarea.tsx | 22 - packages/hub/src/components/ui/toggle.tsx | 45 - packages/hub/src/components/ui/tooltip.tsx | 51 - packages/hub/src/data/analytics.json | 474 +--- packages/hub/src/data/command-id-history.json | 200 -- packages/hub/src/data/commands.json | 1905 ----------------- packages/hub/src/data/tags.json | 170 -- .../hub/src/features/command.actual.test.ts | 15 - packages/hub/src/features/command.test.ts | 329 --- packages/hub/src/features/command.ts | 87 - packages/hub/src/features/tag.test.ts | 139 -- packages/hub/src/features/tag.ts | 13 - packages/hub/src/hooks/useCommandSorter.tsx | 142 -- packages/hub/src/lib/utils.test.ts | 48 - packages/hub/src/lib/utils.ts | 29 - packages/hub/src/types/schema.ts | 73 - packages/hub/tailwind.config.ts | 2 +- yarn.lock | 1099 +--------- 120 files changed, 134 insertions(+), 11303 deletions(-) delete mode 100644 packages/extension/src/command_hub.css delete mode 100644 packages/extension/src/command_hub.tsx delete mode 100644 packages/extension/src/components/commandHub/CommandHub.tsx delete mode 100644 packages/extension/src/components/commandHub/MyCommands.tsx delete mode 100644 packages/hub/docs/vitest-introduction-plan.md delete mode 100644 packages/hub/next-sitemap.config.js delete mode 100644 packages/hub/public/bars-scale-middle.svg delete mode 100644 packages/hub/public/data/pageActionIds.json delete mode 100644 packages/hub/public/data/searchUrls.json delete mode 100644 packages/hub/public/engineer_suit_simple.png delete mode 100644 packages/hub/public/ozigi_suit_man_simple.png delete mode 100644 packages/hub/scripts/fetch-ga-data.js delete mode 100644 packages/hub/scripts/update-searchUrls.mjs delete mode 100644 packages/hub/scripts/update-tags.mjs delete mode 100644 packages/hub/src/app/[lang]/cookie/de.ts delete mode 100644 packages/hub/src/app/[lang]/cookie/en.ts delete mode 100644 packages/hub/src/app/[lang]/cookie/es.ts delete mode 100644 packages/hub/src/app/[lang]/cookie/fr.ts delete mode 100644 packages/hub/src/app/[lang]/cookie/hi.ts delete mode 100644 packages/hub/src/app/[lang]/cookie/id.ts delete mode 100644 packages/hub/src/app/[lang]/cookie/it.ts delete mode 100644 packages/hub/src/app/[lang]/cookie/ja.ts delete mode 100644 packages/hub/src/app/[lang]/cookie/ko.ts delete mode 100644 packages/hub/src/app/[lang]/cookie/ms.ts delete mode 100644 packages/hub/src/app/[lang]/cookie/page.tsx delete mode 100644 packages/hub/src/app/[lang]/cookie/pt-BR.ts delete mode 100644 packages/hub/src/app/[lang]/cookie/pt-PT.ts delete mode 100644 packages/hub/src/app/[lang]/cookie/ru.ts delete mode 100644 packages/hub/src/app/[lang]/cookie/zh-CN.ts delete mode 100644 packages/hub/src/app/[lang]/page.tsx delete mode 100644 packages/hub/src/app/[lang]/privacy/de.ts delete mode 100644 packages/hub/src/app/[lang]/privacy/en.ts delete mode 100644 packages/hub/src/app/[lang]/privacy/es.ts delete mode 100644 packages/hub/src/app/[lang]/privacy/fr.ts delete mode 100644 packages/hub/src/app/[lang]/privacy/hi.ts delete mode 100644 packages/hub/src/app/[lang]/privacy/id.ts delete mode 100644 packages/hub/src/app/[lang]/privacy/it.ts delete mode 100644 packages/hub/src/app/[lang]/privacy/ja.ts delete mode 100644 packages/hub/src/app/[lang]/privacy/ko.ts delete mode 100644 packages/hub/src/app/[lang]/privacy/ms.ts delete mode 100644 packages/hub/src/app/[lang]/privacy/page.tsx delete mode 100644 packages/hub/src/app/[lang]/privacy/pt-BR.ts delete mode 100644 packages/hub/src/app/[lang]/privacy/pt-PT.ts delete mode 100644 packages/hub/src/app/[lang]/privacy/ru.ts delete mode 100644 packages/hub/src/app/[lang]/privacy/zh-CN.ts delete mode 100644 packages/hub/src/app/[lang]/tag/[tag]/page.tsx delete mode 100644 packages/hub/src/app/[lang]/terms/de.ts delete mode 100644 packages/hub/src/app/[lang]/terms/en.ts delete mode 100644 packages/hub/src/app/[lang]/terms/es.ts delete mode 100644 packages/hub/src/app/[lang]/terms/fr.ts delete mode 100644 packages/hub/src/app/[lang]/terms/hi.ts delete mode 100644 packages/hub/src/app/[lang]/terms/id.ts delete mode 100644 packages/hub/src/app/[lang]/terms/it.ts delete mode 100644 packages/hub/src/app/[lang]/terms/ja.ts delete mode 100644 packages/hub/src/app/[lang]/terms/ko.ts delete mode 100644 packages/hub/src/app/[lang]/terms/ms.ts delete mode 100644 packages/hub/src/app/[lang]/terms/page.tsx delete mode 100644 packages/hub/src/app/[lang]/terms/pt-BR.ts delete mode 100644 packages/hub/src/app/[lang]/terms/pt-PT.ts delete mode 100644 packages/hub/src/app/[lang]/terms/ru.ts delete mode 100644 packages/hub/src/app/[lang]/terms/zh-CN.ts delete mode 100644 packages/hub/src/app/[lang]/uninstall/page.tsx delete mode 100644 packages/hub/src/app/not-found.tsx delete mode 100644 packages/hub/src/app/page.tsx delete mode 100644 packages/hub/src/app/uninstall/page.tsx delete mode 100644 packages/hub/src/components/CommandForm.module.css delete mode 100644 packages/hub/src/components/CommandForm.tsx delete mode 100644 packages/hub/src/components/CommandShare.tsx delete mode 100644 packages/hub/src/components/Details.tsx delete mode 100644 packages/hub/src/components/InputForm.tsx delete mode 100644 packages/hub/src/components/ListItem.tsx delete mode 100644 packages/hub/src/components/SortOrder.tsx delete mode 100644 packages/hub/src/components/Tag.tsx delete mode 100644 packages/hub/src/components/TagLink.tsx delete mode 100644 packages/hub/src/components/TagPicker.tsx delete mode 100644 packages/hub/src/components/UninstallForm.tsx delete mode 100644 packages/hub/src/components/layout/CommandList.module.css delete mode 100644 packages/hub/src/components/layout/CommandList.tsx delete mode 100644 packages/hub/src/components/pageAction/PageActionItem.tsx delete mode 100644 packages/hub/src/components/pageAction/StepList.tsx delete mode 100644 packages/hub/src/components/pageAction/TypeIcon.tsx delete mode 100644 packages/hub/src/components/ui/badge.tsx delete mode 100644 packages/hub/src/components/ui/checkbox.tsx delete mode 100644 packages/hub/src/components/ui/collapsible.tsx delete mode 100644 packages/hub/src/components/ui/command.tsx delete mode 100644 packages/hub/src/components/ui/dialog.tsx delete mode 100644 packages/hub/src/components/ui/form.tsx delete mode 100644 packages/hub/src/components/ui/input.tsx delete mode 100644 packages/hub/src/components/ui/label.tsx delete mode 100644 packages/hub/src/components/ui/popover.tsx delete mode 100644 packages/hub/src/components/ui/skeleton.tsx delete mode 100644 packages/hub/src/components/ui/textarea.tsx delete mode 100644 packages/hub/src/components/ui/toggle.tsx delete mode 100644 packages/hub/src/components/ui/tooltip.tsx delete mode 100644 packages/hub/src/data/command-id-history.json delete mode 100644 packages/hub/src/data/commands.json delete mode 100644 packages/hub/src/data/tags.json delete mode 100644 packages/hub/src/features/command.actual.test.ts delete mode 100644 packages/hub/src/features/command.test.ts delete mode 100644 packages/hub/src/features/command.ts delete mode 100644 packages/hub/src/features/tag.test.ts delete mode 100644 packages/hub/src/features/tag.ts delete mode 100644 packages/hub/src/hooks/useCommandSorter.tsx delete mode 100644 packages/hub/src/types/schema.ts diff --git a/AGENTS.md b/AGENTS.md index f680d7ca..adb5b0f3 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -22,9 +22,9 @@ - React + TypeScript + Vite 2. **packages/hub** (`@selection-command/hub`) - - コマンド共有・発見のWebプラットフォーム - - Next.js 15 + App Router - - 11言語対応の国際化 + - `ai-services.json` の静的ホスティング + Extension の e2e テストページ配信のみを担う縮小版 Next.js アプリ + - コマンド共有プラットフォームとしてのフル機能は新リポジトリ([selection-command-hub](https://github.com/ujiro99/selection-command-hub)、selection-command.com)に移行済み + - 詳細は `packages/hub/AGENTS.md` を参照 3. **packages/shared** (`@selection-command/shared`) - 共通ユーティリティと型定義 @@ -35,7 +35,7 @@ ```bash # 拡張機能の開発 yarn dev # extensionの開発モード開始 -yarn dev:hub # hubの開発モード開始 +yarn dev:hub # hub(テストページ/ai-services.json配信用)の開発モード開始 # ビルド yarn build # 全パッケージのビルド @@ -73,9 +73,6 @@ yarn zip # 配布用zip作成 ```bash yarn dev # Next.js開発サーバー(Turbo) yarn build # プロダクションビルド -yarn analytics # GA分析データ更新 -yarn tags # タグ統計更新 -yarn urls # 検索URL更新 ``` **Shared (packages/shared):** @@ -93,33 +90,35 @@ yarn dev # watch モード ``` ┌────────────────────────┐ ┌─────────────────────┐ -│ Chrome Extension │ │ Command Hub │ +│ Chrome Extension │ │ Hub(静的アセット)│ │ (packages/ext) │◄──►│ (packages/hub) │ │ │ │ │ -│ • コンテンツスクリプト │ │ • コマンド共有 │ -│ • バックグラウンド │ │ • 検索・発見 │ -│ • オプションページ │ │ • 多言語対応 │ -│ • ページアクション │ │ • 分析機能 │ +│ • コンテンツスクリプト │ │ • ai-services.json │ +│ • バックグラウンド │ │ 配信 │ +│ • オプションページ │ │ • e2eテストページ │ +│ • ページアクション │ │ │ └────────────────────────┘ └─────────────────────┘ - │ │ - └──────────┬─────────────────┘ - │ - ┌─────────────────────┐ - │ Shared Package │ - │ (packages/shared) │ - │ │ - │ • 共通型定義 │ - │ • ユーティリティ │ - │ • 型ガード │ - └─────────────────────┘ + │ + │ + ┌─────────────────────┐ + │ Shared Package │ + │ (packages/shared) │ + │ │ + │ • 共通型定義 │ + │ • ユーティリティ │ + │ • 型ガード │ + └─────────────────────┘ ``` +※ コマンド共有・検索・発見のプラットフォーム(旧 Command Hub のフル機能)は +新リポジトリ(selection-command-hub)に移行済み。上記の `packages/hub` は +その旧実装の残骸ではなく、Extension が依存する静的アセット配信専用に縮小した別物。 + ### 主要な連携ポイント 1. **型システム共有**: SharedパッケージでBaseCommandなどの基本型を定義し、ExtensionとHubで拡張 -2. **コマンドデータ**: Hubで管理するcommands.jsonをExtensionで参照 -3. **国際化**: Hubの多言語対応とExtensionのlocalesファイルが連携 -4. **ページアクション**: ExtensionのPageActionがHubで共有・発見される +2. **AIサービス定義**: `packages/hub/public/data/ai-services.json` を Extension がビルド時/実行時の両方で参照 +3. **e2eテスト**: `packages/hub` がデプロイする `/en/test` ページを Extension の Playwright テストが利用 ### Chrome拡張機能の構造 (packages/extension) @@ -139,22 +138,11 @@ yarn dev # watch モード - `src/services/pageAction/` - 自動化シーケンス処理 - `src/lib/robula-plus/` - 堅牢なXPathセレクター生成 -### Hubプラットフォームの構造 (packages/hub) - -**機能:** - -- コマンドライブラリの検索・発見 -- タグベースでのカテゴライズ -- Google Analytics統合 -- 11言語の国際化対応 +### Hub の構造 (packages/hub) -**データフロー:** - -``` -commands.json → フィルタリング・検索 → UI表示 -commands.json → scripts/update-tags.mjs → tags.json -Google Analytics → scripts/fetch-ga-data.js → analytics.json -``` +`packages/hub` は「ai-services.json の静的ホスティング」と「Extension の +e2eテストページ配信」のみを担う縮小版アプリ。詳細は `packages/hub/AGENTS.md` +を参照。 ### 型システムの設計 @@ -199,7 +187,8 @@ interface PageActionOption { **Hub開発:** -- 多言語対応時は各言語ファイルの更新が必要 +- Hub は縮小版のため新機能は追加しない。コマンド共有プラットフォームとしての機能拡張は新リポジトリ(selection-command-hub)側で行う +- `ai-services.json` とテストページの変更時は Extension 側への影響を確認すること **テスト:** @@ -210,5 +199,5 @@ interface PageActionOption { **ビルド・配布:** - Extension: `yarn zip`で配布用zipファイル作成 -- Hub: Vercel等での静的サイト配布 +- Hub: GitHub Pages(`.github/workflows/pages.yml`)で静的サイト配布 - Shared: TypeScript declarations自動生成 diff --git a/README.md b/README.md index dac32fe7..2b6885ce 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ ## Selection Command Hub You can share and obtain commands in the Selection Command Hub. -[Selection Command Hub](https://ujiro99.github.io/selection-command/) +[Selection Command Hub](https://selection-command.com/) ## Dependencies diff --git a/package.json b/package.json index cbce39b7..aa40747b 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,6 @@ "test:e2e": "yarn workspace @selection-command/extension test:e2e", "tsc": "yarn workspaces run tsc -b", "clean": "yarn workspaces run clean && rm -rf node_modules", - "add-command": "yarn workspace @selection-command/hub add-command", "pretty-quick": "pretty-quick" }, "devDependencies": { diff --git a/packages/extension/AGENTS.md b/packages/extension/AGENTS.md index ee18b721..f98499d3 100644 --- a/packages/extension/AGENTS.md +++ b/packages/extension/AGENTS.md @@ -94,7 +94,7 @@ Chrome はこの `css` フィールドに列挙されたスタイルシートを **対策**: `src/lib/vite-plugin-manifest.ts` の `removeCssFromContentScript` プラグインが、 ビルド後に全 content_script エントリーの `css` フィールドを削除する。 -CSS は各スクリプト(`content_script.tsx`, `command_hub.tsx`)の Shadow DOM 初期化時に `insertCss()` で手動注入している。 +CSS は `content_script.tsx` の Shadow DOM 初期化時に `insertCss()` で手動注入している。 > content_script に CSS import を追加する際は、manifest 経由での自動注入が抑制されていることを確認すること。 > 新たな content_script エントリーを追加した場合も同様に Shadow DOM への手動注入が必要。 diff --git a/packages/extension/manifest.json b/packages/extension/manifest.json index 15a68e3a..000b2c96 100644 --- a/packages/extension/manifest.json +++ b/packages/extension/manifest.json @@ -17,15 +17,6 @@ "src/content_script.tsx" ] }, - { - "matches": [ - "https://ujiro99.github.io/selection-command/*", - "http://localhost:3000/*" - ], - "js": [ - "src/command_hub.tsx" - ] - }, { "matches": [ "https://selection-command.com/*", diff --git a/packages/extension/src/command_hub.css b/packages/extension/src/command_hub.css deleted file mode 100644 index 98dbf883..00000000 --- a/packages/extension/src/command_hub.css +++ /dev/null @@ -1 +0,0 @@ -@import url("components/global.css"); diff --git a/packages/extension/src/command_hub.tsx b/packages/extension/src/command_hub.tsx deleted file mode 100644 index 565ac5ec..00000000 --- a/packages/extension/src/command_hub.tsx +++ /dev/null @@ -1,74 +0,0 @@ -import { createRoot } from "react-dom/client" -import { APP_ID, isDebug } from "./const" -import "./command_hub.css" -import { CommandHub } from "@/components/commandHub/CommandHub" -import { MyCommands } from "@/components/commandHub/MyCommands" - -const url = chrome.runtime.getURL("/assets/command_hub.css") -const mode = isDebug ? "open" : "closed" // 'open' for debugging - -const insertCss = (elm: ShadowRoot) => { - fetch(url) - .then((res) => res.text()) - .then((css) => { - const style = document.createElement("style") - style.append(document.createTextNode(css)) - elm.insertBefore(style, elm.firstChild) - }) -} - -const cloneCss = (from: ShadowRoot, to: ShadowRoot, selector: string) => { - const cloned = from.querySelector(selector)?.cloneNode(true) - if (cloned) { - to.insertBefore(cloned, to.firstChild) - } -} - -function setupCommandHub() { - const rootDom = document.createElement("div") - rootDom.id = `${APP_ID}-hub` - document.body.insertAdjacentElement("afterend", rootDom) - const shadow = rootDom.attachShadow({ mode }) - const root = createRoot(shadow) - root.render() - - // Putting styles into ShadowDom - if (!isDebug) insertCss(shadow) -} - -function renderMyCommands() { - const container = document.getElementById("MyCommands") - if (container) { - const shadow = container.attachShadow({ mode }) - const root = createRoot(shadow) - root.render() - container.style.display = "block" - - if (isDebug) { - const from = document.getElementById(`${APP_ID}-hub`)?.shadowRoot - from && cloneCss(from, shadow, "style") - } else { - insertCss(shadow) - } - } -} - -function setupMyCommnands() { - const observer = new MutationObserver((mutations) => { - mutations.forEach((mutation) => { - mutation.addedNodes.forEach((node) => { - // Find the CommandShare form. - if ( - node instanceof HTMLElement && - (node.id === "CommandShare" || node.id === "InputForm") - ) { - renderMyCommands() - } - }) - }) - }) - observer.observe(document.body, { childList: true, subtree: true }) -} - -setupCommandHub() -setupMyCommnands() diff --git a/packages/extension/src/components/commandHub/CommandHub.tsx b/packages/extension/src/components/commandHub/CommandHub.tsx deleted file mode 100644 index 986b1cbd..00000000 --- a/packages/extension/src/components/commandHub/CommandHub.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export const CommandHub = (): JSX.Element => { - return <> -} diff --git a/packages/extension/src/components/commandHub/MyCommands.tsx b/packages/extension/src/components/commandHub/MyCommands.tsx deleted file mode 100644 index 2576abcd..00000000 --- a/packages/extension/src/components/commandHub/MyCommands.tsx +++ /dev/null @@ -1,266 +0,0 @@ -import React, { useState, useEffect, useRef, forwardRef } from "react" -import { ChevronLeft, ChevronRight } from "lucide-react" -import ColorThief from "colorthief" -import { useSettingsWithImageCache } from "@/hooks/useSettings" -import { sendEvent, ANALYTICS_EVENTS } from "@/services/analytics" -import { t } from "@/services/i18n" -import { cn, isSearchCommand, isPageActionCommand, isBase64 } from "@/lib/utils" -import { HUB_URL, SCREEN } from "@/const" -import type { Command } from "@/types" -import { cmd2uuid } from "@/services/uuid" - -export const MyCommands = (): JSX.Element => { - const [urls, setUrls] = useState([]) - const [pageActionIds, setPageActionIds] = useState([]) - const [commands, setCommands] = useState< - Array - >([]) - const listRef = useRef(null) - const list2Ref = useRef(null) - const { - commands: allCommands, - iconUrls, - loading, - } = useSettingsWithImageCache() - const loaded = urls.length > 0 - const enableMarquee = commands.length > 3 - - useEffect(() => { - const filterCommands = async () => { - const filteredCommands = [] - for (const c of allCommands) { - if (isSearchCommand(c) && !urls.includes(c.searchUrl as string)) { - filteredCommands.push(c) - } else if (isPageActionCommand(c)) { - const uuid = await cmd2uuid({ - ...c, - iconUrl: iconUrls[c.id], - }) - if (!pageActionIds.includes(uuid)) { - filteredCommands.push(c) - } - } - } - - const commandsWithIcons = filteredCommands.map((c) => ({ - ...c, - iconDataUrl: c.iconUrl || iconUrls[c.id], - iconUrl: iconUrls[c.id], - })) - - setCommands(commandsWithIcons) - } - - if ( - !loading && - allCommands.length > 0 && - urls.length > 0 && - pageActionIds.length > 0 - ) { - filterCommands() - } - }, [allCommands, iconUrls, loading, urls, pageActionIds]) - - useEffect(() => { - fetch(`${HUB_URL}/data/searchUrls.json`) - .then((res) => res.json()) - .then((data) => { - setUrls(data) - }) - fetch(`${HUB_URL}/data/pageActionIds.json`) - .then((res) => res.json()) - .then((data) => { - setPageActionIds(data) - }) - }, []) - - const slide = (direction = true) => { - const diff = direction ? 5000 : -5000 // refer --marquee-duration. - const elm = listRef.current - const elm2 = list2Ref.current - if (elm == null || elm2 == null) return - const a = elm.getAnimations()[0] - if (a != null) { - ; (a.currentTime as number) += diff - if ((a.currentTime as number) < 0) { - a.currentTime = 0 - } - } - const a2 = elm2.getAnimations()[0] - if (a2 != null) { - ; (a2.currentTime as number) += diff - if ((a2.currentTime as number) < 0) { - a2.currentTime = 0 - } - } - } - - if (!loaded) { - return ( -
-

Loading...

-
-
- ) - } - - return ( -
-

{t("commnadHub_youcanshare")}

- {!enableMarquee ? ( -
- -
- ) : ( -
- - - - -
- )} -
- ) -} - -type CommandWithIconDataUrl = Command & { iconDataUrl: string } - -type CommandListProps = { - commands: CommandWithIconDataUrl[] - className?: string - style?: React.CSSProperties -} -const CommandList = forwardRef( - (props: CommandListProps, ref): JSX.Element => { - return ( -
    - {props.commands.map((c) => { - return - })} -
- ) - }, -) - -type ItemProps = { - command: CommandWithIconDataUrl -} -const ListItem = (props: ItemProps): JSX.Element => { - const c = props.command - const [imgElm, setImgElm] = useState(null) - const [liElm, setLiElm] = useState(null) - - const isPageAction = isPageActionCommand(c) - - useEffect(() => { - if (imgElm == null || liElm == null) return - if (!isBase64(imgElm.src)) return - imgElm.onload = () => { - const colorThief = new ColorThief() - const dominantColor = colorThief.getColor(imgElm) // [R, G, B] - const paletteColors = colorThief.getPalette(imgElm, 2) - const color1 = `rgba(${dominantColor.join(",")}, 0.04)` - const color2 = `rgba(${paletteColors[0].join(",")}, 0.1)` - liElm.style.background = `linear-gradient(160deg, white 30%, ${color1} 60%, ${color2})` - } - }, [imgElm, liElm]) - - const onClick = () => { - // Send a message to Commad Hub. - window.postMessage({ action: "InsertCommand", data: c }, "*") - sendEvent( - ANALYTICS_EVENTS.COMMAND_SHARE, - { event_label: "input-my-command" }, - SCREEN.COMMAND_FORM, - ) - } - - return ( -
  • - -
  • - ) -} diff --git a/packages/extension/src/lib/vite-plugin-manifest.ts b/packages/extension/src/lib/vite-plugin-manifest.ts index 630c7a85..82cd1e19 100644 --- a/packages/extension/src/lib/vite-plugin-manifest.ts +++ b/packages/extension/src/lib/vite-plugin-manifest.ts @@ -19,8 +19,8 @@ export default function removeCssFromContentScript(): Plugin { // Remove the css field from all content_script entries. // crxjs automatically adds CSS imports as manifest css[], but Chrome // injects those into the page document (not Shadow DOM), breaking page styles. - // Both content_script.tsx and command_hub.tsx inject CSS manually into - // their Shadow roots, so manifest-level CSS injection must be suppressed. + // content_script.tsx injects CSS manually into its Shadow root, so + // manifest-level CSS injection must be suppressed. for (const cs of content_scripts) { delete cs.css } diff --git a/packages/extension/vite.config.ts b/packages/extension/vite.config.ts index 9e57c363..99e83a00 100644 --- a/packages/extension/vite.config.ts +++ b/packages/extension/vite.config.ts @@ -95,14 +95,9 @@ export default defineConfig(({ mode }) => { typeof document != "undefined" && options.attributes != null ) { - let targetId = "selection-command" - if ( - options.attributes["data-vite-dev-id"].match(/command_hub/) - ) { - targetId = "selection-command-hub" - } const root = - document.getElementById(targetId)?.shadowRoot ?? document.head // Option page + document.getElementById("selection-command")?.shadowRoot ?? + document.head // Option page upsertCss(root) } } catch (e) { @@ -187,7 +182,7 @@ export default defineConfig(({ mode }) => { if (assetInfo.names?.[0] === "components.css") { return `assets/components.css` } - const keepNames = ["content_script.css", "command_hub.css"] + const keepNames = ["content_script.css"] if ( assetInfo.names?.length > 0 && keepNames.includes(assetInfo.names[0]) diff --git a/packages/hub/AGENTS.md b/packages/hub/AGENTS.md index 2ff84bff..5b146772 100644 --- a/packages/hub/AGENTS.md +++ b/packages/hub/AGENTS.md @@ -12,100 +12,69 @@ This file provides guidance to AI Agent when working with code in this repositor - **コードの品質**: コードは読みやすく、保守しやすいように書くこと。コメントは必要な箇所へ記載し、複雑なロジックには説明を加える。 - **テキストのエンコーディング**: UTF-8を使用すること。 +## このパッケージの役割 + +`packages/hub` は、かつて Selection Command のコマンド共有・発見プラットフォーム +(Next.js 15 フル機能アプリ)でしたが、そのアプリケーションは新しいリポジトリ +(https://github.com/ujiro99/selection-command-hub、selection-command.com へデプロイ)に移行しました。 + +このパッケージに残っているのは、以下の2つの責務のみです。 + +1. **ai-services.json の静的ホスティング** + - `public/data/ai-services.json` を GitHub Pages で静的配信する + - Extension の AiPrompt コマンドが以下の2通りで参照する + - ビルド時: `packages/extension/vite.config.ts` 等が + `fs.readFileSync("../hub/public/data/ai-services.json")` で直接読み込む + - 実行時: `packages/extension/src/services/aiPrompt.ts` が + `${HUB_URL}/data/ai-services.json` に fetch する + - このファイルを変更・削除する際は、必ず Extension 側のこれら2箇所への + 影響を確認すること + +2. **e2e テスト用ページの配信** + - `src/app/[lang]/test/page.tsx`(`/en/test` など)は、Extension の + Playwright e2e テストが実際にデプロイされたページにアクセスして + 動作確認するためのテストページ + - `packages/extension/e2e/pages/TestPage.ts` がこのページの URL を + ハードコードしており、複数の spec ファイルから利用されている + - このページ配下のコンポーネント(Header/Footer/CookieConsent/ + LocaleSelector など)は、App Router のレイアウト要件を満たすために + 最小限残っているだけで、機能的な意味は薄い + ## 開発コマンド - `yarn dev` - Next.js開発サーバーの開始(Turbopack使用) -- `yarn build` - プロダクションビルドの実行 +- `yarn build` - プロダクションビルド(GitHub Pages 用の静的エクスポート) - `yarn start` - プロダクションサーバーの開始 -- `yarn lint` - Next.js ESLintによるコード品質チェック -- `yarn analytics` - Google Analyticsからデータを取得してanalyticsファイルを更新 -- `yarn tags` - commands.jsonからタグ情報を抽出してtags.jsonを更新 -- `yarn urls` - searchUrlsファイルを更新 - -## アーキテクチャ概要 - -これは**Selection Command Hub**と呼ばれるNext.js 15アプリケーションで、 -Chrome拡張機能である、`Selection Command` のコマンド共有・発見プラットフォームとして機能します。 - -### 主要機能 - -- **コマンドライブラリ**: 検索URL、ページアクションなどの共有可能なコマンドのカタログ -- **多言語対応**: 11言語に対応した国際化機能 -- **タグベース検索**: コマンドのカテゴライズと検索機能 -- **分析機能**: Google Analytics統合による使用状況の追跡 -- **レスポンシブデザイン**: モバイル・デスクトップ対応のUI - -### プロジェクト構造 - -**App Router構造** (`src/app/`): - -- `page.tsx` - ルートページ(英語デフォルト) -- `[lang]/` - 国際化対応のページ群 - - `page.tsx` - メインコマンドリストページ - - `tag/[tag]/` - タグ別コマンド表示 - - `privacy/`, `terms/`, `cookie/` - 法的ページ(各言語対応) - - `uninstall/` - アンインストール理由収集ページ - -**機能別モジュール** (`src/features/`): - -- `command.ts` - コマンド操作とフィルタリングのビジネスロジック -- `tag.ts` - タグ関連機能 -- `locale/` - 多言語対応のメッセージファイル - -**コンポーネント** (`src/components/`): - -- `ui/` - shadcn/uiベースの再利用可能UIコンポーネント -- `layout/` - ヘッダー、フッター、コマンドリスト等のレイアウトコンポーネント -- `pageAction/` - ページアクション表示専用コンポーネント -- `CommandForm.tsx` - コマンド追加フォーム -- `CookieConsent.tsx` - Cookie同意管理 - -**データ管理** (`src/data/`): - -- `commands.json` - コマンドのマスターデータ -- `tags.json` - タグ統計(スクリプトで自動生成) -- `analytics.json` - GA分析データ(スクリプトで自動生成) - -**型定義** (`src/types/`): - -- `pageAction.ts` - ページアクション関連の詳細な型定義 -- `schema.ts` - フォームバリデーション用スキーマ - -### 技術スタック - -- **フレームワーク**: Next.js 15 with App Router -- **React**: React 19 RC -- **スタイリング**: Tailwind CSS + shadcn/ui コンポーネント -- **フォーム**: react-hook-form + zod バリデーション -- **国際化**: カスタム実装(src/features/locale) -- **分析**: Google Analytics Data API -- **アニメーション**: Tailwind CSS + カスタムキーフレーム -- **SEO**: next-sitemap による自動サイトマップ生成 - -### データフロー - -1. **コマンドデータ**: `src/data/commands.json` → フィルタリング・検索 → UI表示 -2. **タグ統計**: commands.json → `scripts/update-tags.mjs` → `src/data/tags.json` -3. **分析データ**: Google Analytics → `scripts/fetch-ga-data.js` → `src/data/analytics.json` -4. **検索URL**: 動的生成 → `scripts/update-searchUrls.mjs` → `public/data/searchUrls.json` - -### 国際化の仕組み - -- **URLベース**: `/[lang]/` 動的ルートで言語切り替え -- **メッセージファイル**: `src/features/locale/[lang].ts` で各言語の翻訳を管理 -- **フォールバック**: 英語(en)をデフォルト言語として使用 -- **法的ページ**: privacy、terms、cookieページは各言語版を個別ファイルで管理 - -### ビルド・デプロイメント - -- **ビルド後処理**: サイトマップ生成、タグ更新、検索URL更新を自動実行 -- **静的生成**: 基本的にSSGで高速化 -- **分析更新**: 手動でanalytics scriptを実行してデータ更新 - -### 開発時の注意事項 - -- このプロジェクトは拡張機能のメインコード(`../src/`)とは完全に独立 -- 新しいコマンドは`src/data/commands.json`に手動追加 -- タグ統計は`yarn tags`で自動更新される -- 多言語対応時は各言語ファイルの更新が必要 -- ページアクション型コマンドは複雑な型定義(`src/types/pageAction.ts`)を使用 +- `yarn lint` - ESLintによるコード品質チェック +- `yarn test` / `test:run` / `test:coverage` - Vitest + +## プロジェクト構造(縮小後) + +- `public/data/ai-services.json` - Extension が参照する唯一のデータファイル +- `src/app/[lang]/test/` - e2e テストページ本体(`page.tsx`, `QuillWrapper.tsx`) +- `src/app/[lang]/layout.tsx`, `src/app/layout.tsx` - App Router の + 必須レイアウト(Header/Footer/CookieConsent/LanguageProvider を保持) +- `src/features/locale/` - 14言語分の辞書ファイル(layout.tsx が + 無条件にバレルインポートするため削除できない) +- `src/components/ui/` - shadcn/ui のうち button, separator, select のみ残存 +- `src/lib/utils.ts` - 共通ユーティリティ(`cn` 等、`@shared` からの re-export) + +## 削除済みの機能 + +コマンド共有・検索・タグ・多言語ページ(privacy/terms/cookie)・ +Google Analytics 連携・お問い合わせフォーム等は、全て新リポジトリ +(selection-command-hub)に移行済みで、このパッケージには存在しない。 +関連する `commands.json`, `tags.json`, `searchUrls.json`, `pageActionIds.json` +等のデータファイルおよび生成スクリプト(旧 `scripts/update-tags.mjs` 等)も +削除済み。Footer・CookieConsent 内の法的ページへのリンクも、対応するページの +削除に合わせて除去している。 + +## 開発時の注意事項 + +- このパッケージへの新機能追加は基本的に行わない。コマンド共有プラットフォーム + としての機能拡張は新リポジトリ(selection-command-hub)側で行うこと +- `public/data/ai-services.json` を編集する場合は、Extension 側 + (vite.config.ts の `__AI_SERVICES_JSON__` define、aiPrompt.ts の fetch)が + 壊れないことを確認すること +- `src/app/[lang]/test/page.tsx` を変更する場合は、`packages/extension/e2e/` の + 対応する spec が壊れないことを確認すること(本番反映後の e2e 実行で最終確認) diff --git a/packages/hub/docs/vitest-introduction-plan.md b/packages/hub/docs/vitest-introduction-plan.md deleted file mode 100644 index 14a27528..00000000 --- a/packages/hub/docs/vitest-introduction-plan.md +++ /dev/null @@ -1,215 +0,0 @@ -# Selection Command Hub - Vitestユニットテスト導入計画 - -## 概要 - -本ドキュメントは、Selection Command Hub(Next.js 15アプリケーション)へのVitestユニットテスト導入に関する包括的な計画書です。段階的なアプローチにより、品質向上と開発効率化を実現します。 - -## 現状分析 - -### 技術構成 - -- **フレームワーク**: Next.js 15 with App Router -- **React**: React 19 RC -- **言語**: TypeScript -- **スタイリング**: Tailwind CSS + shadcn/ui -- **フォーム**: react-hook-form + zod -- **国際化**: カスタム実装(11言語対応) - -### 主要なテスト対象 - -#### 1. Pure Functions (`src/lib/utils.ts`) - -- `cn()` - classname結合 -- `generateUUIDFromObject()` - オブジェクトからUUID生成 -- `isEmpty()` - 空判定 -- `capitalize()` - 文字列の先頭大文字化 -- `sleep()` - 非同期待機 -- `sortUrlsByDomain()` - ドメイン別URL並び替え -- `isSearchCommand()`, `isPageActionCommand()` - コマンド種別判定 - -#### 2. ビジネスロジック (`src/features/`) - -- `command.ts` - - `getCommands()` - コマンド取得とフィルタリング - - `getSearchUrl()` - 検索URL生成 - - `cmd2text()`, `cmd2uuid()` - データ変換 -- `tag.ts` - タグ関連機能 - -## 段階的導入計画 - -### Phase 1: 基盤構築 (1-2週間) - -#### 目標 - -テスト環境の構築とPure Functionsのテスト実装 - -#### 作業内容 - -1. **Vitest環境構築** - - ```bash - # 依存関係インストール - yarn add -D vitest @vitejs/plugin-react jsdom - yarn add -D @testing-library/react @testing-library/jest-dom @testing-library/user-event - yarn add -D @vitest/coverage-v8 @vitest/ui - ``` - -2. **設定ファイル作成** - - `vitest.config.ts` - Vitest設定 - - `src/test/setup.ts` - テスト環境セットアップ - - `package.json` - テストスクリプト追加 - -3. **Pure Functions テスト実装** - - `src/lib/utils.test.ts` - 全ユーティリティ関数のテスト - - カバレッジ目標: 90%以上 - -#### 期待成果 - -- ✅ テスト実行環境の完成 -- ✅ 15-20個のユーティリティ関数のテスト完了 -- ✅ CI/CDパイプラインでのテスト実行 - -#### テストケース例 - -```typescript -describe("ユーティリティ関数", () => { - test("UTIL-01: cn関数でclassnameが正しく結合される", () => { - expect(cn("class1", "class2")).toBe("class1 class2") - }) - - test("UTIL-02: isEmpty関数で空文字列がtrueを返す", () => { - expect(isEmpty("")).toBe(true) - }) -}) -``` - -### Phase 2: ビジネスロジック (2-3週間) - -#### 目標 - -コアビジネスロジックの網羅的テスト実装 - -#### 作業内容 - -1. **コマンド機能テスト** - - `src/features/command.test.ts` - - フィルタリング、検索、データ変換のテスト - - Edge caseの網羅 - -2. **タグ機能テスト** - - `src/features/tag.test.ts` - - タグ統計、カテゴライズのテスト - -#### 期待成果 - -- ✅ ビジネスロジックのカバレッジ80%以上 -- ✅ 多言語機能の動作保証 -- ✅ データ変換処理の正確性確保 - -#### テストケース例 - -```typescript -describe("コマンド操作機能", () => { - test("CH-01: getCommands関数で正しくフィルタリングされる", () => { - const result = getCommands({ tag: "Search", locale: "ja" }) - expect(result).toHaveLength(expectedLength) - }) - - test("CH-02: 無効なコマンドIDでgetSearchUrlがnullを返す", () => { - expect(getSearchUrl("invalid-id")).toBeNull() - }) -}) -``` - -## 技術仕様 - -### 必要な依存関係 - -```json -{ - "devDependencies": { - "vitest": "^3.2.4", - "@vitejs/plugin-react": "^4.3.4", - "@testing-library/react": "^16.3.0", - "@testing-library/jest-dom": "^6.6.3", - "@testing-library/user-event": "^14.6.0", - "@vitest/coverage-v8": "3.2.4", - "@vitest/ui": "^3.2.4", - "jsdom": "^26.1.0" - } -} -``` - -## テスト設計ガイドライン - -### 命名規則 - -```typescript -describe("機能名", () => { - // 正常系 - test("PREFIX-01: 正常系: 期待される動作の説明", () => {}) - - // 異常系 - test("PREFIX-02: 異常系: エラーケースの説明", () => {}) - - // 境界値 - test("PREFIX-03: 境界値: 境界条件の説明", () => {}) -}) -``` - -### プレフィックス分類 - -- **UTIL-**: ユーティリティ関数 -- **CH-**: Command Hub関連ビジネスロジック -- **HOOK-**: カスタムhooks -- **UI-**: UIコンポーネント -- **FORM-**: フォーム関連 -- **I18N-**: 国際化機能 - -### テストケース設計指針 - -#### 1. Arrange-Act-Assert パターン - -```typescript -test("UTIL-01: cn関数でクラス名が正しく結合される", () => { - // Arrange: テストデータの準備 - const class1 = "btn" - const class2 = "btn-primary" - - // Act: 実行 - const result = cn(class1, class2) - - // Assert: 検証 - expect(result).toBe("btn btn-primary") -}) -``` - -#### 2. Edge Case の網羅 - -- 空値、null、undefined -- 境界値(最小、最大) -- 無効な入力値 -- 非同期処理のタイムアウト - -## CI/CD 統合 - -### GitHub Actions 設定例 - -```yaml -name: Test -on: [push, pull_request] -jobs: - test: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: "20" - cache: "yarn" - - run: yarn install --frozen-lockfile - - run: yarn test:coverage - - uses: codecov/codecov-action@v3 - with: - file: ./coverage/coverage-final.json -``` diff --git a/packages/hub/next-sitemap.config.js b/packages/hub/next-sitemap.config.js deleted file mode 100644 index 111f545c..00000000 --- a/packages/hub/next-sitemap.config.js +++ /dev/null @@ -1,11 +0,0 @@ -/** @type {import('next-sitemap').IConfig} */ -module.exports = { - siteUrl: "https://ujiro99.github.io/selection-command", // Replace with your site's URL - outDir: "./out", - generateRobotsTxt: true, // Optionally generate robots.txt - transform: async (config, path) => { - return { - loc: encodeURI(path), // Encode URLs to handle Japanese characters - } - }, -} diff --git a/packages/hub/package.json b/packages/hub/package.json index 7868f367..642237f0 100644 --- a/packages/hub/package.json +++ b/packages/hub/package.json @@ -5,52 +5,31 @@ "scripts": { "dev": "next dev --turbo", "build": "next build", - "postbuild": "next-sitemap; npm run tags; npm run urls", "start": "next start", "lint": "eslint .", "test": "vitest", "test:ui": "vitest --ui", "test:run": "vitest run", "test:coverage": "vitest --coverage", - "analytics": "node ./scripts/fetch-ga-data.js", - "tags": "node ./scripts/update-tags.mjs", - "urls": "node ./scripts/update-searchUrls.mjs", - "add-command": "yarn tags && yarn urls", "pretty-quick": "pretty-quick" }, "dependencies": { - "@hookform/resolvers": "^3.9.1", "@next/third-parties": "^15.0.4", - "@radix-ui/react-checkbox": "^1.1.4", - "@radix-ui/react-collapsible": "^1.1.2", - "@radix-ui/react-dialog": "^1.1.4", - "@radix-ui/react-label": "^2.1.1", - "@radix-ui/react-popover": "^1.1.8", "@radix-ui/react-select": "^2.1.4", "@radix-ui/react-separator": "^1.1.1", "@radix-ui/react-slot": "^1.1.2", - "@radix-ui/react-toggle": "^1.1.1", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", - "cmdk": "^1.1.1", - "dompurify": "^3.2.3", "lucide-react": "^0.468.0", "next": "^15.1.0", "quill": "^2.0.3", "react": "^19.0.0", "react-dom": "^19.0.0", - "react-hook-form": "^7.54.0", - "react-markdown": "^9.0.3", "tailwind-merge": "^2.5.5", - "tailwindcss-animate": "^1.0.7", - "tldts": "^6.1.69", - "uuid": "^11.0.3", - "zod": "^3.24.0" + "tailwindcss-animate": "^1.0.7" }, "devDependencies": { - "@google-analytics/data": "^5.2.0", "@next/eslint-plugin-next": "^15.1.0", - "@tailwindcss/typography": "^0.5.16", "@testing-library/jest-dom": "^6.7.0", "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^14.6.1", @@ -63,7 +42,6 @@ "@vitest/ui": "^3.2.4", "eslint-config-next": "^15.1.0", "jsdom": "^26.1.0", - "next-sitemap": "^4.2.3", "postcss": "^8", "pretty-quick": "^4.2.2", "tailwindcss": "^3.4.1", diff --git a/packages/hub/public/bars-scale-middle.svg b/packages/hub/public/bars-scale-middle.svg deleted file mode 100644 index 072e2867..00000000 --- a/packages/hub/public/bars-scale-middle.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/hub/public/data/pageActionIds.json b/packages/hub/public/data/pageActionIds.json deleted file mode 100644 index b6889c5b..00000000 --- a/packages/hub/public/data/pageActionIds.json +++ /dev/null @@ -1,19 +0,0 @@ -[ - "06964cb6-019d-511f-b16f-18c7bbd2c785", - "e2001b8a-a20c-5d33-983b-bf6c6d55a63c", - "b1856c00-d775-5fdc-89e9-94d1b6f786e5", - "7f11e008-c45a-504d-9ea0-2a6613d8c417", - "bf22c686-f557-558a-aa24-a619fcf9220c", - "5bd801be-edf1-5787-91e0-48df29230fed", - "6cb03d7b-2cb0-585e-b265-f7d1e9f25b50", - "342fbc4a-0e33-5d05-87e5-72e3bf7db990", - "071c7099-9b2b-52be-a135-5134807cf7d0", - "aefebed0-d031-5e05-969c-6de2c1d892ce", - "e024de34-3251-570d-9bd4-7eebb29d951d", - "0745a377-f0d3-5399-aecb-bd7561059e70", - "a2da3f09-8540-5c14-96a8-50da3582cd91", - "e2979626-96a4-5526-bc7a-17a4496eae3c", - "27aa0db5-ae34-5aaf-b293-a88b8b52bdfc", - "ad7e96eb-f2eb-547d-8263-6fa2f18bcb18", - "a9cc440b-6e07-5dbc-acab-5753c1fc8166" -] \ No newline at end of file diff --git a/packages/hub/public/data/searchUrls.json b/packages/hub/public/data/searchUrls.json deleted file mode 100644 index 18bc5934..00000000 --- a/packages/hub/public/data/searchUrls.json +++ /dev/null @@ -1,53 +0,0 @@ -[ - "https://search.yahoo.co.jp/search?p=%s", - "https://www.deepl.com/ja/translator#en/ja/%s", - "https://www.deepl.com/ja/translator#ja/en/%s", - "https://lucide.dev/icons/?search=%s", - "https://auctions.yahoo.co.jp/closedsearch/closedsearch?p=%s", - "https://support.ta.kingoftime.jp/hc/ja/search?query=%s", - "https://jp.mercari.com/search?keyword=%s&status=sold_out%7Ctrading&sort=created_time&order=desc", - "https://jp.mercari.com/search?keyword=%s&order=&item_condition_id=3&status=sold_out&item_types=mercari", - "https://jp.mercari.com/search?keyword=%s", - "https://zenn.dev/search?q=%s", - "https://www.sljfaq.org/cgi/numbers_ja.cgi?number=%s", - "https://search.rakuten.co.jp/search/mall/%s", - "https://google.com/search?q=%s", - "https://google.com/search?q=%s&tbm=isch", - "https://hn.algolia.com/?q=%s", - "https://qiita.com/search?q=%s", - "https://www.pinterest.com/search/pins/?q=%s", - "https://www.netflix.com/search?q=%s", - "https://www.nicovideo.jp/watch/%s", - "https://www.perplexity.ai/search/new?q=%s", - "https://www.youtube.com/results?search_query=%s", - "https://www.amazon.co.jp/s?k=%s", - "https://www.google.com/maps/search/%s", - "http://ja.wikipedia.org/wiki/Special:Search?search=%s&go=Go", - "https://drive.google.com/drive/search?q=%s", - "https://google.com/search?q=%s&tbm=shop", - "https://note.com/search?q=%s", - "https://x.com/search?lang=ja&q=%s", - "https://chiebukuro.yahoo.co.jp/search?p=%s", - "https://keep.google.com/#search/text%253D%s", - "https://search.naver.com/search.naver?ie=UTF-8&sm=whl_hty&query=%s", - "https://www.coupang.com/np/search?component=&q=%s", - "https://duckduckgo.com/?q=%s&t=&ia=web", - "https://www.rottentomatoes.com/search?search=%s", - "https://store.steampowered.com/search/?term=%s", - "https://calil.jp/search?q=%s", - "https://kagi.com/search?q=%s", - "https://www.bing.com/search?q=%s", - "https://www.glassdoor.com/Search/results.htm?keyword=%s", - "https://www.openstreetmap.org/search?query=%s", - "https://www.imdb.com/find?q=%s&s=all", - "https://www.oxfordlearnersdictionaries.com/definition/english/%s", - "https://search.kakaku.com/%s/", - "https://keepa.com/#!search/5-%s", - "http://localhost/?search=%s", - "https://yandex.ru/search/?text=%s", - "https://search.yahoo.co.jp/realtime/search?p=%s", - "https://news.ceek.jp/search.cgi?q=%s", - "https://greasyfork.org/en/scripts?sort=updated&q=%s", - "https://ff5ch.syoboi.jp/?q=%s", - " https://search.brave.com/search?q=%s" -] \ No newline at end of file diff --git a/packages/hub/public/engineer_suit_simple.png b/packages/hub/public/engineer_suit_simple.png deleted file mode 100644 index 86b9b36e6a42e293bb45e74124e1910c64039b71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23804 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 diff --git a/packages/hub/scripts/fetch-ga-data.js b/packages/hub/scripts/fetch-ga-data.js deleted file mode 100644 index f4d40fd9..00000000 --- a/packages/hub/scripts/fetch-ga-data.js +++ /dev/null @@ -1,117 +0,0 @@ -const fs = require("fs") -const { BetaAnalyticsDataClient } = require("@google-analytics/data") - -const propertyId = process.env.GA_PROPERTY_ID -const jsonKey = JSON.parse(process.env.GA_SERVICE_ACCOUNT_KEY) - -const analyticsDataClient = new BetaAnalyticsDataClient({ - credentials: jsonKey, -}) - -async function runReport() { - const [response] = await analyticsDataClient.runReport({ - property: `properties/${propertyId}`, - dateRanges: [ - { - startDate: "2024-12-10", - endDate: "today", - }, - ], - metrics: [ - { - name: "eventCount", - }, - ], - dimensions: [ - { - name: "eventName", - }, - { - name: "customEvent:id", - }, - ], - dimensionFilter: { - orGroup: { - expressions: [ - { - filter: { - fieldName: "eventName", - stringFilter: { - value: "command_hub_add", - matchType: "EXACT", - }, - }, - }, - { - filter: { - fieldName: "eventName", - stringFilter: { - value: "command_hub_star_add", - matchType: "EXACT", - }, - }, - }, - { - filter: { - fieldName: "eventName", - stringFilter: { - value: "command_hub_star_remove", - matchType: "EXACT", - }, - }, - }, - ], - }, - }, - }) - - const data = response.rows.reduce((acc, row) => { - const obj = { - eventName: row.dimensionValues[0].value, - eventId: row.dimensionValues[1].value, - eventCount: parseInt(row.metricValues[0].value), - } - acc.push(obj) - return acc - }, []) - - const groupped = data.reduce( - (acc, row) => { - switch (row.eventName) { - case "command_hub_add": - acc.download.push({ - eventId: row.eventId, - eventCount: row.eventCount, - }) - break - case "command_hub_star_add": - const r = acc.starred.find((a) => a.eventId === row.eventId) ?? { - eventId: row.eventId, - eventCount: 0, - } - r.eventCount += row.eventCount - acc.starred = acc.starred.filter((a) => a.eventId !== row.eventId) - acc.starred.push(r) - break - case "command_hub_star_remove": - const r2 = acc.starred.find((a) => a.eventId === row.eventId) ?? { - eventId: row.eventId, - eventCount: 0, - } - r2.eventCount -= row.eventCount - acc.starred = acc.starred.filter((a) => a.eventId !== row.eventId) - acc.starred.push(r2) - break - } - return acc - }, - { download: [], starred: [], updated: Date.now() }, - ) - - fs.writeFileSync( - "./src/data/analytics.json", - JSON.stringify(groupped, null, 2), - ) -} - -runReport().catch(console.error) diff --git a/packages/hub/scripts/update-searchUrls.mjs b/packages/hub/scripts/update-searchUrls.mjs deleted file mode 100644 index 0126febf..00000000 --- a/packages/hub/scripts/update-searchUrls.mjs +++ /dev/null @@ -1,14 +0,0 @@ -import fs from "fs" -import Commands from "../src/data/commands.json" with { type: "json" } - -const urls = Commands.map((cmd) => cmd.searchUrl).filter((url) => url != null) -fs.writeFileSync("./public/data/searchUrls.json", JSON.stringify(urls, null, 2)) - -const PAGE_ACTION = "pageAction" -const pageActionIds = Commands.filter( - (cmd) => cmd.openMode === PAGE_ACTION, -).map((cmd) => cmd.id) -fs.writeFileSync( - "./public/data/pageActionIds.json", - JSON.stringify(pageActionIds, null, 2), -) diff --git a/packages/hub/scripts/update-tags.mjs b/packages/hub/scripts/update-tags.mjs deleted file mode 100644 index 45106378..00000000 --- a/packages/hub/scripts/update-tags.mjs +++ /dev/null @@ -1,16 +0,0 @@ -import fs from "fs" -import Commands from "../src/data/commands.json" with { type: "json" } - -const tags = Commands.map((command) => command.tags) - .flat() - .reduce((acc, tag) => { - const f = acc.find((t) => t.name === tag) - if (f) { - f.count++ - } else { - acc.push({ name: tag, count: 1 }) - } - return acc - }, []) - -fs.writeFileSync("./src/data/tags.json", JSON.stringify(tags, null, 2)) diff --git a/packages/hub/src/app/[lang]/cookie/de.ts b/packages/hub/src/app/[lang]/cookie/de.ts deleted file mode 100644 index e501c707..00000000 --- a/packages/hub/src/app/[lang]/cookie/de.ts +++ /dev/null @@ -1,36 +0,0 @@ -const msg = ` -Selection Command Hub (im Folgenden als "Dienst" bezeichnet) verwendet Cookies, um Ihr Surferlebnis zu verbessern und unsere Dienste zu erweitern. Diese Cookie-Richtlinie erklärt, was Cookies sind, wie wir sie verwenden und welche Optionen Ihnen in Bezug auf ihre Verwendung zur Verfügung stehen. - -### **1. Was sind Cookies?** -Cookies sind kleine Textdateien, die von den von Ihnen besuchten Websites auf Ihrem Gerät (wie einem Computer oder Smartphone) gespeichert werden. Sie werden häufig verwendet, um Websites effizienter zu betreiben und Website-Betreibern Informationen zu liefern. - -### **2. Cookies, die wir verwenden** -Wir verwenden die folgenden Arten von Cookies in unserem Dienst: - -#### **2.1 Cookie für die Einwilligungsverwaltung** -- **cookieConsent**: Dieses Cookie wird verwendet, um Ihre Einwilligungspräferenzen bezüglich der Verwendung von Cookies in unserem Dienst zu speichern. Es stellt sicher, dass Sie, nachdem Sie Ihre Einwilligung erteilt haben, nicht wiederholt darum gebeten werden. Dieses Cookie wird normalerweise für 1 Jahr gespeichert. - -#### **2.2 Analyse-Cookies** -Wir verwenden Google Analytics, um zu verstehen, wie Benutzer mit unserem Dienst interagieren und seine Funktionalität zu verbessern. Die von Google Analytics verwendeten Cookies umfassen: - -- **_ga**: Wird verwendet, um Benutzer zu unterscheiden. Dieses Cookie läuft normalerweise nach 2 Jahren ab. -- **\\_ga\\_\\***: Wird verwendet, um den Sitzungsstatus beizubehalten. Dieses Cookie läuft normalerweise nach 2 Jahren ab. - -Die von diesen Cookies gesammelten Informationen werden aggregiert und anonymisiert, was bedeutet, dass sie keine einzelnen Benutzer identifizieren. Sie helfen uns, Trends zu analysieren, das Benutzerverhalten zu verfolgen und die Gesamtleistung des Dienstes zu verbessern. - -### **3. Wie Sie Cookies verwalten können** -Sie können Cookies über die Einstellungen Ihres Browsers steuern oder deaktivieren. Beachten Sie, dass das Deaktivieren bestimmter Cookies die Funktionalität einiger Funktionen des Dienstes beeinträchtigen kann. - -### **4. Datenverarbeitung durch Dritte** -Die über Google Analytics gesammelten Daten werden von Google gemäß deren Datenschutzrichtlinien verarbeitet. Weitere Informationen finden Sie in der [Google-Richtlinie](https://policies.google.com/technologies/cookies). - -### **5. Aktualisierungen dieser Richtlinie** -Wir können diese Cookie-Richtlinie von Zeit zu Zeit aktualisieren, um Änderungen in unseren Praktiken oder aus anderen betrieblichen, rechtlichen oder regulatorischen Gründen widerzuspiegeln. Alle Aktualisierungen werden auf dieser Seite veröffentlicht, daher empfehlen wir Ihnen, sie regelmäßig zu überprüfen. - -### **6. Kontaktieren Sie uns** -Wenn Sie Fragen zu dieser Cookie-Richtlinie oder zur Verwendung von Cookies haben, kontaktieren Sie uns bitte über: -- [Chrome Web Store Support-Seite](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -Gültig ab 10.01.2025 -` -export default msg diff --git a/packages/hub/src/app/[lang]/cookie/en.ts b/packages/hub/src/app/[lang]/cookie/en.ts deleted file mode 100644 index 0bedab5a..00000000 --- a/packages/hub/src/app/[lang]/cookie/en.ts +++ /dev/null @@ -1,36 +0,0 @@ -const msg = ` -Selection Command Hub (hereinafter referred to as "the Service") uses cookies to enhance your browsing experience and improve our services. This Cookie Policy explains what cookies are, how we use them, and the choices available to you regarding their use. - -### **1. What Are Cookies?** -Cookies are small text files stored on your device (such as a computer or smartphone) by websites you visit. They are widely used to make websites work more efficiently, as well as to provide information to the website owners. - -### **2. Cookies We Use** -We use the following types of cookies on our Service: - -#### **2.1 Consent Management Cookie** -- **cookieConsent**: This cookie is used to record your consent preferences regarding the use of cookies on our Service. It ensures that once you have provided consent, you will not be repeatedly asked to do so. This cookie is typically stored for 1 year. - -#### **2.2 Analytics Cookies** -We use Google Analytics to help us understand how users interact with our Service and to improve its functionality. The cookies used by Google Analytics include: - -- **_ga**: Used to distinguish users. This cookie typically expires after 2 years. -- **\\_ga\\_\\***: Used to persist session state. This cookie typically expires after 2 years. - -The information collected by these cookies is aggregated and anonymized, meaning it does not identify individual users. It helps us analyze trends, track user behavior, and improve the overall performance of the Service. - -### **3. How You Can Manage Cookies** -You can control or disable cookies through your browser settings. Please note that disabling certain cookies may impact the functionality of some features of the Service. - -### **4. Third-Party Data Processing** -The data collected through Google Analytics is processed by Google in accordance with their privacy policies. For more information, please review [Google's Policy](https://policies.google.com/technologies/cookies). - -### **5. Updates to This Policy** -We may update this Cookie Policy from time to time to reflect changes in our practices or for other operational, legal, or regulatory reasons. Any updates will be posted on this page, so we encourage you to review it periodically. - -### **6. Contact Us** -If you have any questions about this Cookie Policy or how we use cookies, please contact us at: -- [Chrome Web Store Support Page](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -Effective as of 01/10/2025 -` -export default msg diff --git a/packages/hub/src/app/[lang]/cookie/es.ts b/packages/hub/src/app/[lang]/cookie/es.ts deleted file mode 100644 index 4aa151af..00000000 --- a/packages/hub/src/app/[lang]/cookie/es.ts +++ /dev/null @@ -1,36 +0,0 @@ -const msg = ` -Selection Command Hub (en adelante denominado "Servicio") utiliza cookies para mejorar su experiencia de navegación y mejorar nuestros servicios. Esta Política de Cookies explica qué son las cookies, cómo las utilizamos y las opciones disponibles para usted con respecto a su uso. - -### **1. ¿Qué son las Cookies?** -Las cookies son pequeños archivos de texto almacenados en su dispositivo (como una computadora o un teléfono inteligente) por los sitios web que visita. Se utilizan ampliamente para hacer que los sitios web funcionen de manera más eficiente y para proporcionar información a los propietarios de los sitios web. - -### **2. Cookies que Utilizamos** -Utilizamos los siguientes tipos de cookies en nuestro Servicio: - -#### **2.1 Cookie de Gestión de Consentimiento** -- **cookieConsent**: Esta cookie se utiliza para registrar sus preferencias de consentimiento con respecto al uso de cookies en nuestro Servicio. Garantiza que, una vez que haya dado su consentimiento, no se le pedirá repetidamente que lo haga. Esta cookie generalmente se almacena durante 1 año. - -#### **2.2 Cookies Analíticas** -Utilizamos Google Analytics para ayudarnos a comprender cómo los usuarios interactúan con nuestro Servicio y para mejorar su funcionalidad. Las cookies utilizadas por Google Analytics incluyen: - -- **_ga**: Utilizada para distinguir usuarios. Esta cookie generalmente expira después de 2 años. -- **\\_ga\\_\\***: Utilizada para mantener el estado de la sesión. Esta cookie generalmente expira después de 2 años. - -La información recopilada por estas cookies se agrega y anonimiza, lo que significa que no identifica a usuarios individuales. Nos ayuda a analizar tendencias, rastrear el comportamiento de los usuarios y mejorar el rendimiento general del Servicio. - -### **3. Cómo Puede Gestionar las Cookies** -Puede controlar o deshabilitar las cookies a través de la configuración de su navegador. Tenga en cuenta que deshabilitar ciertas cookies puede afectar la funcionalidad de algunas características del Servicio. - -### **4. Procesamiento de Datos por Terceros** -Los datos recopilados a través de Google Analytics son procesados por Google de acuerdo con sus políticas de privacidad. Para más información, consulte la [Política de Google](https://policies.google.com/technologies/cookies). - -### **5. Actualizaciones de esta Política** -Podemos actualizar esta Política de Cookies de vez en cuando para reflejar cambios en nuestras prácticas o por otras razones operativas, legales o regulatorias. Cualquier actualización se publicará en esta página, por lo que le animamos a revisarla periódicamente. - -### **6. Contáctenos** -Si tiene alguna pregunta sobre esta Política de Cookies o sobre cómo utilizamos las cookies, contáctenos a través de: -- [Página de Soporte de Chrome Web Store](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -Efectivo a partir del 10/01/2025 -` -export default msg diff --git a/packages/hub/src/app/[lang]/cookie/fr.ts b/packages/hub/src/app/[lang]/cookie/fr.ts deleted file mode 100644 index 1c2a286c..00000000 --- a/packages/hub/src/app/[lang]/cookie/fr.ts +++ /dev/null @@ -1,36 +0,0 @@ -const msg = ` -Selection Command Hub (ci-après dénommé "Service") utilise des cookies pour améliorer votre expérience de navigation et améliorer nos services. Cette Politique de Cookies explique ce que sont les cookies, comment nous les utilisons et les options qui s'offrent à vous concernant leur utilisation. - -### **1. Qu'est-ce que les Cookies ?** -Les cookies sont de petits fichiers texte stockés sur votre appareil (comme un ordinateur ou un smartphone) par les sites web que vous visitez. Ils sont largement utilisés pour faire fonctionner les sites web plus efficacement et pour fournir des informations aux propriétaires des sites web. - -### **2. Cookies que Nous Utilisons** -Nous utilisons les types de cookies suivants dans notre Service : - -#### **2.1 Cookie de Gestion du Consentement** -- **cookieConsent** : Ce cookie est utilisé pour enregistrer vos préférences de consentement concernant l'utilisation des cookies dans notre Service. Il garantit que, une fois que vous avez donné votre consentement, vous ne serez pas invité à le faire à plusieurs reprises. Ce cookie est généralement stocké pendant 1 an. - -#### **2.2 Cookies Analytiques** -Nous utilisons Google Analytics pour nous aider à comprendre comment les utilisateurs interagissent avec notre Service et pour améliorer sa fonctionnalité. Les cookies utilisés par Google Analytics comprennent : - -- **_ga** : Utilisé pour distinguer les utilisateurs. Ce cookie expire généralement après 2 ans. -- **\\_ga\\_\\*** : Utilisé pour maintenir l'état de la session. Ce cookie expire généralement après 2 ans. - -Les informations collectées par ces cookies sont agrégées et anonymisées, ce qui signifie qu'elles n'identifient pas les utilisateurs individuels. Elles nous aident à analyser les tendances, à suivre le comportement des utilisateurs et à améliorer les performances globales du Service. - -### **3. Comment Vous Pouvez Gérer les Cookies** -Vous pouvez contrôler ou désactiver les cookies via les paramètres de votre navigateur. Notez que la désactivation de certains cookies peut affecter la fonctionnalité de certaines fonctionnalités du Service. - -### **4. Traitement des Données par des Tiers** -Les données collectées via Google Analytics sont traitées par Google conformément à leurs politiques de confidentialité. Pour plus d'informations, veuillez consulter la [Politique de Google](https://policies.google.com/technologies/cookies). - -### **5. Mises à Jour de cette Politique** -Nous pouvons mettre à jour cette Politique de Cookies de temps à autre pour refléter les changements dans nos pratiques ou pour d'autres raisons opérationnelles, légales ou réglementaires. Toute mise à jour sera publiée sur cette page, nous vous encourageons donc à la consulter périodiquement. - -### **6. Contactez-nous** -Si vous avez des questions sur cette Politique de Cookies ou sur la façon dont nous utilisons les cookies, veuillez nous contacter via : -- [Page de Support du Chrome Web Store](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -En vigueur à partir du 10/01/2025 -` -export default msg diff --git a/packages/hub/src/app/[lang]/cookie/hi.ts b/packages/hub/src/app/[lang]/cookie/hi.ts deleted file mode 100644 index f300d9e7..00000000 --- a/packages/hub/src/app/[lang]/cookie/hi.ts +++ /dev/null @@ -1,36 +0,0 @@ -const msg = ` -Selection Command Hub (जिसे इसके बाद "सेवा" कहा जाएगा) आपके ब्राउज़िंग अनुभव को बेहतर बनाने और हमारी सेवाओं को बढ़ाने के लिए कुकीज़ का उपयोग करता है। यह कुकी नीति बताती है कि कुकीज़ क्या हैं, हम उनका उपयोग कैसे करते हैं, और उनके उपयोग के संबंध में आपके लिए उपलब्ध विकल्प। - -### **1. कुकीज़ क्या हैं?** -कुकीज़ छोटी टेक्स्ट फाइलें हैं जो आपके डिवाइस (जैसे कंप्यूटर या स्मार्टफोन) पर आपके द्वारा देखी जाने वाली वेबसाइटों द्वारा संग्रहीत की जाती हैं। वे वेबसाइटों को अधिक कुशलता से काम करने और वेबसाइट मालिकों को जानकारी प्रदान करने के लिए व्यापक रूप से उपयोग की जाती हैं। - -### **2. हमारे द्वारा उपयोग की जाने वाली कुकीज़** -हम अपनी सेवा में निम्नलिखित प्रकार की कुकीज़ का उपयोग करते हैं: - -#### **2.1 सहमति प्रबंधन कुकी** -- **cookieConsent**: यह कुकी हमारी सेवा में कुकीज़ के उपयोग के संबंध में आपकी सहमति प्राथमिकताओं को रिकॉर्ड करने के लिए उपयोग की जाती है। यह सुनिश्चित करता है कि एक बार जब आप अपनी सहमति दे देते हैं, तो आपसे बार-बार ऐसा करने के लिए नहीं कहा जाएगा। यह कुकी आमतौर पर 1 वर्ष के लिए संग्रहीत की जाती है। - -#### **2.2 विश्लेषणात्मक कुकीज़** -हम Google Analytics का उपयोग यह समझने में मदद के लिए करते हैं कि उपयोगकर्ता हमारी सेवा के साथ कैसे इंटरैक्ट करते हैं और इसकी कार्यक्षमता में सुधार करते हैं। Google Analytics द्वारा उपयोग की जाने वाली कुकीज़ में शामिल हैं: - -- **_ga**: उपयोगकर्ताओं को अलग करने के लिए उपयोग किया जाता है। यह कुकी आमतौर पर 2 वर्षों के बाद समाप्त हो जाती है। -- **\\_ga\\_\\***: सत्र की स्थिति को बनाए रखने के लिए उपयोग किया जाता है। यह कुकी आमतौर पर 2 वर्षों के बाद समाप्त हो जाती है। - -इन कुकीज़ द्वारा एकत्र की गई जानकारी को एकत्रित और अनामित किया जाता है, जिसका अर्थ है कि वे व्यक्तिगत उपयोगकर्ताओं की पहचान नहीं करती हैं। वे हमें रुझानों का विश्लेषण करने, उपयोगकर्ता व्यवहार को ट्रैक करने और सेवा के समग्र प्रदर्शन में सुधार करने में मदद करती हैं। - -### **3. आप कुकीज़ को कैसे प्रबंधित कर सकते हैं** -आप अपने ब्राउज़र की सेटिंग्स के माध्यम से कुकीज़ को नियंत्रित या अक्षम कर सकते हैं। ध्यान दें कि कुछ कुकीज़ को अक्षम करने से सेवा की कुछ विशेषताओं की कार्यक्षमता प्रभावित हो सकती है। - -### **4. तृतीय-पक्ष द्वारा डेटा प्रसंस्करण** -Google Analytics के माध्यम से एकत्र किए गए डेटा को Google द्वारा उनकी गोपनीयता नीतियों के अनुसार संसाधित किया जाता है। अधिक जानकारी के लिए, कृपया [Google की नीति](https://policies.google.com/technologies/cookies) देखें। - -### **5. इस नीति के अपडेट** -हम अपनी प्रथाओं में परिवर्तन या अन्य परिचालन, कानूनी या नियामक कारणों को प्रतिबिंबित करने के लिए इस कुकी नीति को समय-समय पर अपडेट कर सकते हैं। कोई भी अपडेट इस पृष्ठ पर प्रकाशित किया जाएगा, इसलिए हम आपको इसे नियमित रूप से देखने के लिए प्रोत्साहित करते हैं। - -### **6. हमसे संपर्क करें** -यदि आपके पास इस कुकी नीति या हमारे द्वारा कुकीज़ के उपयोग के बारे में कोई प्रश्न हैं, तो कृपया हमसे संपर्क करें: -- [Chrome वेब स्टोर सपोर्ट पेज](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -10/01/2025 से प्रभावी -` -export default msg diff --git a/packages/hub/src/app/[lang]/cookie/id.ts b/packages/hub/src/app/[lang]/cookie/id.ts deleted file mode 100644 index 90a9b73b..00000000 --- a/packages/hub/src/app/[lang]/cookie/id.ts +++ /dev/null @@ -1,36 +0,0 @@ -const msg = ` -Selection Command Hub (selanjutnya disebut sebagai "Layanan") menggunakan cookie untuk meningkatkan pengalaman menjelajah Anda dan meningkatkan layanan kami. Kebijakan Cookie ini menjelaskan apa itu cookie, bagaimana kami menggunakannya, dan opsi yang tersedia untuk Anda terkait penggunaannya. - -### **1. Apa itu Cookie?** -Cookie adalah file teks kecil yang disimpan di perangkat Anda (seperti komputer atau smartphone) oleh situs web yang Anda kunjungi. Cookie banyak digunakan untuk membuat situs web berfungsi lebih efisien, serta untuk memberikan informasi kepada pemilik situs web. - -### **2. Cookie yang Kami Gunakan** -Kami menggunakan jenis cookie berikut di Layanan kami: - -#### **2.1 Cookie Manajemen Persetujuan** -- **cookieConsent**: Cookie ini digunakan untuk mencatat preferensi persetujuan Anda terkait penggunaan cookie di Layanan kami. Memastikan bahwa setelah Anda memberikan persetujuan, Anda tidak akan diminta berulang kali untuk melakukannya. Cookie ini biasanya disimpan selama 1 tahun. - -#### **2.2 Cookie Analitik** -Kami menggunakan Google Analytics untuk membantu kami memahami bagaimana pengguna berinteraksi dengan Layanan kami dan untuk meningkatkan fungsionalitasnya. Cookie yang digunakan oleh Google Analytics meliputi: - -- **_ga**: Digunakan untuk membedakan pengguna. Cookie ini biasanya kedaluwarsa setelah 2 tahun. -- **\\_ga\\_\\***: Digunakan untuk mempertahankan status sesi. Cookie ini biasanya kedaluwarsa setelah 2 tahun. - -Informasi yang dikumpulkan oleh cookie ini digabungkan dan dianonimkan, yang berarti tidak mengidentifikasi pengguna individual. Ini membantu kami menganalisis tren, melacak perilaku pengguna, dan meningkatkan kinerja keseluruhan Layanan. - -### **3. Bagaimana Anda Dapat Mengelola Cookie** -Anda dapat mengontrol atau menonaktifkan cookie melalui pengaturan browser Anda. Perhatikan bahwa menonaktifkan cookie tertentu dapat mempengaruhi fungsionalitas beberapa fitur Layanan. - -### **4. Pemrosesan Data oleh Pihak Ketiga** -Data yang dikumpulkan melalui Google Analytics diproses oleh Google sesuai dengan kebijakan privasi mereka. Untuk informasi lebih lanjut, silakan lihat [Kebijakan Google](https://policies.google.com/technologies/cookies). - -### **5. Pembaruan Kebijakan Ini** -Kami dapat memperbarui Kebijakan Cookie ini dari waktu ke waktu untuk mencerminkan perubahan dalam praktik kami atau karena alasan operasional, hukum, atau peraturan lainnya. Setiap pembaruan akan dipublikasikan di halaman ini, jadi kami mendorong Anda untuk meninjaunya secara berkala. - -### **6. Hubungi Kami** -Jika Anda memiliki pertanyaan tentang Kebijakan Cookie ini atau tentang bagaimana kami menggunakan cookie, silakan hubungi kami melalui: -- [Halaman Dukungan Chrome Web Store](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -Berlaku mulai 10/01/2025 -` -export default msg diff --git a/packages/hub/src/app/[lang]/cookie/it.ts b/packages/hub/src/app/[lang]/cookie/it.ts deleted file mode 100644 index 82a65c83..00000000 --- a/packages/hub/src/app/[lang]/cookie/it.ts +++ /dev/null @@ -1,36 +0,0 @@ -const msg = ` -Selection Command Hub (di seguito denominato "Servizio") utilizza i cookie per migliorare la tua esperienza di navigazione e migliorare i nostri servizi. Questa Informativa sui Cookie spiega cosa sono i cookie, come li utilizziamo e le opzioni disponibili per te in merito al loro utilizzo. - -### **1. Cosa sono i Cookie?** -I cookie sono piccoli file di testo memorizzati sul tuo dispositivo (come un computer o uno smartphone) dai siti web che visiti. Sono ampiamente utilizzati per far funzionare i siti web in modo più efficiente e per fornire informazioni ai proprietari dei siti web. - -### **2. Cookie che Utilizziamo** -Utilizziamo i seguenti tipi di cookie nel nostro Servizio: - -#### **2.1 Cookie di Gestione del Consenso** -- **cookieConsent**: Questo cookie viene utilizzato per registrare le tue preferenze di consenso riguardo all'utilizzo dei cookie nel nostro Servizio. Garantisce che, una volta che hai fornito il tuo consenso, non ti verrà richiesto ripetutamente di farlo. Questo cookie viene generalmente memorizzato per 1 anno. - -#### **2.2 Cookie Analitici** -Utilizziamo Google Analytics per aiutarci a capire come gli utenti interagiscono con il nostro Servizio e per migliorarne la funzionalità. I cookie utilizzati da Google Analytics includono: - -- **_ga**: Utilizzato per distinguere gli utenti. Questo cookie scade generalmente dopo 2 anni. -- **\\_ga\\_\\***: Utilizzato per mantenere lo stato della sessione. Questo cookie scade generalmente dopo 2 anni. - -Le informazioni raccolte da questi cookie sono aggregate e anonimizzate, il che significa che non identificano singoli utenti. Ci aiutano ad analizzare le tendenze, monitorare il comportamento degli utenti e migliorare le prestazioni complessive del Servizio. - -### **3. Come Puoi Gestire i Cookie** -Puoi controllare o disabilitare i cookie attraverso le impostazioni del tuo browser. Tieni presente che la disabilitazione di determinati cookie potrebbe influire sulla funzionalità di alcune caratteristiche del Servizio. - -### **4. Elaborazione dei Dati da Parte di Terzi** -I dati raccolti tramite Google Analytics vengono elaborati da Google in conformità con le loro politiche sulla privacy. Per ulteriori informazioni, consulta la [Politica di Google](https://policies.google.com/technologies/cookies). - -### **5. Aggiornamenti a questa Informativa** -Potremmo aggiornare questa Informativa sui Cookie di volta in volta per riflettere i cambiamenti nelle nostre pratiche o per altre ragioni operative, legali o normative. Eventuali aggiornamenti saranno pubblicati su questa pagina, quindi ti incoraggiamo a consultarla periodicamente. - -### **6. Contattaci** -Se hai domande su questa Informativa sui Cookie o su come utilizziamo i cookie, contattaci tramite: -- [Pagina di supporto di Chrome Web Store](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -In vigore dal 10/01/2025 -` -export default msg diff --git a/packages/hub/src/app/[lang]/cookie/ja.ts b/packages/hub/src/app/[lang]/cookie/ja.ts deleted file mode 100644 index a539cc21..00000000 --- a/packages/hub/src/app/[lang]/cookie/ja.ts +++ /dev/null @@ -1,34 +0,0 @@ -const msg = ` -Selection Command Hub(以下、「本サービス」といいます)は、お客様により良い体験を提供するため、Cookieを使用しています。本ポリシーでは、当サービスで使用しているCookieの種類、目的、お客様の選択肢について説明します。 - -### **1. Cookieとは** -Cookieとは、ウェブサイトがお客様のデバイス(パソコン、スマートフォンなど)に保存する小さなテキストファイルであり、ウェブサイトの利用状況を記録し、お客様の利便性向上やサービス改善に役立てられるものです。 - -### **2. 当サービスで使用するCookie** -当サービスでは以下のCookieを使用しています: - -#### **2.1 同意管理用Cookie** -- **cookieConsent**: 本サービスで使用されるCookieに関するお客様の同意状況を記録するためのCookie。このCookieは、お客様がCookie使用に同意したかどうかを確認し、同意済みの場合は再度確認を求めないようにするために使用されます。保存期間は通常1年間です。 - -#### **2.2 Google Analyticsによる解析用Cookie** -- **_ga**: ユーザー識別に使用されるCookie。保存期間は通常2年間です。 -- **\\_ga\\_\\***: セッション状態を維持するために使用されるCookie。保存期間は通常2年間です。 - -これらのCookieは、当サービスの利用状況を分析し、サービス改善やユーザー体験向上のために使用されます。Google Analyticsによって収集されたデータは匿名化されており、お客様個人を特定することはありません。 - -### **3. Cookieの管理方法** -お客様はブラウザ設定を変更することで、Cookieの受け入れや拒否を選択できます。ただし、Cookieを無効化すると、本サービスの一部機能が正常に動作しない場合があります。 - -### **4. 第三者によるデータ処理** -Google Analyticsによるデータ収集・処理についての詳細は、[Googleのポリシー](https://policies.google.com/technologies/cookies?hl=ja)をご確認ください。 - -### **5. ポリシーの変更について** -本ポリシーは必要に応じて更新される場合があります。変更があった場合には、本ページでお知らせしますので、定期的にご確認ください。 - -### **6. お問い合わせ先** -本ポリシーに関するご質問やご不明点がある場合は、以下までお問い合わせください: -- [Chrome Web Store サポートページ](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -発行日:2025/01/10 -` -export default msg diff --git a/packages/hub/src/app/[lang]/cookie/ko.ts b/packages/hub/src/app/[lang]/cookie/ko.ts deleted file mode 100644 index 2fd75197..00000000 --- a/packages/hub/src/app/[lang]/cookie/ko.ts +++ /dev/null @@ -1,36 +0,0 @@ -const msg = ` -Selection Command Hub(이하 "서비스")는 귀하의 브라우징 경험을 향상시키고 서비스를 개선하기 위해 쿠키를 사용합니다. 이 쿠키 정책은 쿠키가 무엇인지, 어떻게 사용하는지, 그리고 사용과 관련하여 귀하에게 제공되는 옵션에 대해 설명합니다. - -### **1. 쿠키란 무엇인가요?** -쿠키는 귀하가 방문하는 웹사이트가 귀하의 기기(컴퓨터나 스마트폰과 같은)에 저장하는 작은 텍스트 파일입니다. 웹사이트가 더 효율적으로 작동하도록 하고 웹사이트 소유자에게 정보를 제공하는 데 널리 사용됩니다. - -### **2. 우리가 사용하는 쿠키** -우리는 서비스에서 다음과 같은 유형의 쿠키를 사용합니다: - -#### **2.1 동의 관리 쿠키** -- **cookieConsent**: 이 쿠키는 서비스에서 쿠키 사용에 대한 귀하의 동의 선호도를 기록하는 데 사용됩니다. 귀하가 동의를 제공한 후에는 반복적으로 요청하지 않도록 보장합니다. 이 쿠키는 일반적으로 1년 동안 저장됩니다. - -#### **2.2 분석 쿠키** -우리는 Google Analytics를 사용하여 사용자가 서비스와 어떻게 상호작용하는지 이해하고 기능을 개선하는 데 도움을 받습니다. Google Analytics에서 사용하는 쿠키에는 다음이 포함됩니다: - -- **_ga**: 사용자를 구분하는 데 사용됩니다. 이 쿠키는 일반적으로 2년 후에 만료됩니다. -- **\\_ga\\_\\***: 세션 상태를 유지하는 데 사용됩니다. 이 쿠키는 일반적으로 2년 후에 만료됩니다. - -이러한 쿠키에 의해 수집된 정보는 집계되고 익명화되어 개별 사용자를 식별하지 않습니다. 이를 통해 트렌드를 분석하고, 사용자 행동을 추적하며, 서비스의 전반적인 성능을 향상시킬 수 있습니다. - -### **3. 쿠키 관리 방법** -브라우저 설정을 통해 쿠키를 제어하거나 비활성화할 수 있습니다. 특정 쿠키를 비활성화하면 서비스의 일부 기능에 영향을 미칠 수 있다는 점에 유의하세요. - -### **4. 제3자 데이터 처리** -Google Analytics를 통해 수집된 데이터는 Google의 개인정보 보호정책에 따라 처리됩니다. 자세한 내용은 [Google 정책](https://policies.google.com/technologies/cookies)을 참조하세요. - -### **5. 정책 업데이트** -우리는 우리의 관행이나 기타 운영, 법적 또는 규제상의 이유로 인한 변경사항을 반영하기 위해 이 쿠키 정책을 수시로 업데이트할 수 있습니다. 모든 업데이트는 이 페이지에 게시되므로 정기적으로 확인하시기 바랍니다. - -### **6. 문의하기** -이 쿠키 정책이나 쿠키 사용 방법에 대한 질문이 있으시면 다음을 통해 문의해 주세요: -- [Chrome 웹 스토어 지원 페이지](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -2025년 1월 10일부터 시행 -` -export default msg diff --git a/packages/hub/src/app/[lang]/cookie/ms.ts b/packages/hub/src/app/[lang]/cookie/ms.ts deleted file mode 100644 index 04194e12..00000000 --- a/packages/hub/src/app/[lang]/cookie/ms.ts +++ /dev/null @@ -1,36 +0,0 @@ -const msg = ` -Selection Command Hub (selepas ini dirujuk sebagai "Perkhidmatan") menggunakan kuki untuk meningkatkan pengalaman pelayaran anda dan meningkatkan perkhidmatan kami. Dasar Kuki ini menerangkan apa itu kuki, bagaimana kami menggunakannya, dan pilihan yang tersedia untuk anda berkaitan dengan penggunaannya. - -### **1. Apa itu Kuki?** -Kuki adalah fail teks kecil yang disimpan di peranti anda (seperti komputer atau telefon pintar) oleh laman web yang anda lawati. Ia digunakan secara meluas untuk membuat laman web berfungsi dengan lebih cekap, serta untuk memberikan maklumat kepada pemilik laman web. - -### **2. Kuki yang Kami Gunakan** -Kami menggunakan jenis kuki berikut dalam Perkhidmatan kami: - -#### **2.1 Kuki Pengurusan Persetujuan** -- **cookieConsent**: Kuki ini digunakan untuk merekodkan pilihan persetujuan anda berkaitan dengan penggunaan kuki dalam Perkhidmatan kami. Memastikan bahawa setelah anda memberikan persetujuan, anda tidak akan diminta berulang kali untuk melakukannya. Kuki ini biasanya disimpan selama 1 tahun. - -#### **2.2 Kuki Analitik** -Kami menggunakan Google Analytics untuk membantu kami memahami bagaimana pengguna berinteraksi dengan Perkhidmatan kami dan untuk meningkatkan fungsinya. Kuki yang digunakan oleh Google Analytics termasuk: - -- **_ga**: Digunakan untuk membezakan pengguna. Kuki ini biasanya tamat tempoh selepas 2 tahun. -- **\\_ga\\_\\***: Digunakan untuk mengekalkan status sesi. Kuki ini biasanya tamat tempoh selepas 2 tahun. - -Maklumat yang dikumpulkan oleh kuki ini digabungkan dan dianonimkan, yang bermaksud ia tidak mengenal pasti pengguna individu. Ia membantu kami menganalisis trend, menjejak tingkah laku pengguna, dan meningkatkan prestasi keseluruhan Perkhidmatan. - -### **3. Bagaimana Anda Boleh Menguruskan Kuki** -Anda boleh mengawal atau melumpuhkan kuki melalui tetapan pelayar anda. Perhatikan bahawa melumpuhkan kuki tertentu boleh menjejaskan fungsi beberapa ciri Perkhidmatan. - -### **4. Pemprosesan Data oleh Pihak Ketiga** -Data yang dikumpulkan melalui Google Analytics diproses oleh Google mengikut dasar privasi mereka. Untuk maklumat lanjut, sila lihat [Dasar Google](https://policies.google.com/technologies/cookies). - -### **5. Kemas Kini Dasar Ini** -Kami boleh mengemas kini Dasar Kuki ini dari semasa ke semasa untuk mencerminkan perubahan dalam amalan kami atau atas sebab operasi, undang-undang, atau peraturan lain. Sebarang kemas kini akan diterbitkan di halaman ini, jadi kami menggalakkan anda untuk meninjaunya secara berkala. - -### **6. Hubungi Kami** -Jika anda mempunyai sebarang pertanyaan tentang Dasar Kuki ini atau tentang bagaimana kami menggunakan kuki, sila hubungi kami melalui: -- [Halaman Sokongan Chrome Web Store](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -Berkuat kuasa mulai 10/01/2025 -` -export default msg diff --git a/packages/hub/src/app/[lang]/cookie/page.tsx b/packages/hub/src/app/[lang]/cookie/page.tsx deleted file mode 100644 index 1c102e81..00000000 --- a/packages/hub/src/app/[lang]/cookie/page.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import ReactMarkdown from "react-markdown" -import css from "@/app/page.module.css" -import { LangProps } from "@/types" -import { getDict } from "@/features/locale" - -import en from "./en" -import ja from "./ja" -import pt_PT from "./pt-PT" -import pt_BR from "./pt-BR" -import id from "./id" -import ms from "./ms" -import zh_CN from "./zh-CN" -import ru from "./ru" -import it from "./it" -import ko from "./ko" -import fr from "./fr" -import hi from "./hi" -import es from "./es" -import de from "./de" - -const LocaleMap = { - en, - ja, - "pt-PT": pt_PT, - "pt-BR": pt_BR, - id, - ms, - "zh-CN": zh_CN, - ru, - it, - ko, - fr, - hi, - es, - de, -} as const - -type Props = LangProps - -export default async function Cookie({ params }: { params: Promise }) { - const { lang } = await params - const t = getDict(lang).about - const policy = LocaleMap[lang] - return ( -
    -

    {t.cookie}

    - {policy} -
    - ) -} diff --git a/packages/hub/src/app/[lang]/cookie/pt-BR.ts b/packages/hub/src/app/[lang]/cookie/pt-BR.ts deleted file mode 100644 index 3be584f8..00000000 --- a/packages/hub/src/app/[lang]/cookie/pt-BR.ts +++ /dev/null @@ -1,36 +0,0 @@ -const msg = ` -O Selection Command Hub (doravante referido como "o Serviço") utiliza cookies para melhorar sua experiência de navegação e aprimorar nossos serviços. Esta Política de Cookies explica o que são cookies, como os utilizamos e as opções disponíveis para você em relação ao seu uso. - -### **1. O que são Cookies?** -Os cookies são pequenos arquivos de texto armazenados em seu dispositivo (como um computador ou smartphone) pelos sites que você visita. Eles são amplamente utilizados para fazer os sites funcionarem de forma mais eficiente, bem como para fornecer informações aos proprietários dos sites. - -### **2. Cookies que Utilizamos** -Utilizamos os seguintes tipos de cookies em nosso Serviço: - -#### **2.1 Cookie de Gerenciamento de Consentimento** -- **cookieConsent**: Este cookie é utilizado para registrar suas preferências de consentimento em relação ao uso de cookies em nosso Serviço. Garante que, uma vez que você tenha fornecido seu consentimento, não será solicitado repetidamente a fazê-lo. Este cookie é normalmente armazenado por 1 ano. - -#### **2.2 Cookies Analíticos** -Utilizamos o Google Analytics para nos ajudar a entender como os usuários interagem com nosso Serviço e para melhorar sua funcionalidade. Os cookies utilizados pelo Google Analytics incluem: - -- **_ga**: Utilizado para distinguir usuários. Este cookie normalmente expira após 2 anos. -- **\\_ga\\_\\***: Utilizado para manter o estado da sessão. Este cookie normalmente expira após 2 anos. - -As informações coletadas por estes cookies são agregadas e anonimizadas, o que significa que não identificam usuários individuais. Elas nos ajudam a analisar tendências, acompanhar o comportamento dos usuários e melhorar o desempenho geral do Serviço. - -### **3. Como Você Pode Gerenciar os Cookies** -Você pode controlar ou desativar cookies através das configurações do seu navegador. Observe que a desativação de certos cookies pode afetar a funcionalidade de alguns recursos do Serviço. - -### **4. Processamento de Dados por Terceiros** -Os dados coletados através do Google Analytics são processados pelo Google de acordo com suas políticas de privacidade. Para mais informações, consulte a [Política do Google](https://policies.google.com/technologies/cookies). - -### **5. Atualizações a esta Política** -Podemos atualizar esta Política de Cookies de tempos em tempos para refletir mudanças em nossas práticas ou por outras razões operacionais, legais ou regulatórias. Quaisquer atualizações serão publicadas nesta página, por isso encorajamos você a revisá-la periodicamente. - -### **6. Entre em Contato** -Se você tiver alguma dúvida sobre esta Política de Cookies ou sobre como utilizamos cookies, por favor entre em contato conosco através de: -- [Página de Suporte da Chrome Web Store](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -Efetivo a partir de 10/01/2025 -` -export default msg diff --git a/packages/hub/src/app/[lang]/cookie/pt-PT.ts b/packages/hub/src/app/[lang]/cookie/pt-PT.ts deleted file mode 100644 index 783723b6..00000000 --- a/packages/hub/src/app/[lang]/cookie/pt-PT.ts +++ /dev/null @@ -1,36 +0,0 @@ -const msg = ` -O Selection Command Hub (doravante referido como "o Serviço") utiliza cookies para melhorar a sua experiência de navegação e aprimorar os nossos serviços. Esta Política de Cookies explica o que são cookies, como os utilizamos e as opções disponíveis para si relativamente à sua utilização. - -### **1. O que são Cookies?** -Os cookies são pequenos ficheiros de texto armazenados no seu dispositivo (como um computador ou smartphone) pelos sites que visita. São amplamente utilizados para fazer os sites funcionarem de forma mais eficiente, bem como para fornecer informações aos proprietários dos sites. - -### **2. Cookies que Utilizamos** -Utilizamos os seguintes tipos de cookies no nosso Serviço: - -#### **2.1 Cookie de Gestão de Consentimento** -- **cookieConsent**: Este cookie é utilizado para registar as suas preferências de consentimento relativamente à utilização de cookies no nosso Serviço. Garante que, uma vez que tenha fornecido o seu consentimento, não será solicitado repetidamente a fazê-lo. Este cookie é normalmente armazenado durante 1 ano. - -#### **2.2 Cookies Analíticos** -Utilizamos o Google Analytics para nos ajudar a compreender como os utilizadores interagem com o nosso Serviço e para melhorar a sua funcionalidade. Os cookies utilizados pelo Google Analytics incluem: - -- **_ga**: Utilizado para distinguir utilizadores. Este cookie normalmente expira após 2 anos. -- **\\_ga\\_\\***: Utilizado para manter o estado da sessão. Este cookie normalmente expira após 2 anos. - -As informações recolhidas por estes cookies são agregadas e anonimizadas, o que significa que não identificam utilizadores individuais. Ajudam-nos a analisar tendências, acompanhar o comportamento dos utilizadores e melhorar o desempenho geral do Serviço. - -### **3. Como Pode Gerir os Cookies** -Pode controlar ou desativar cookies através das definições do seu navegador. Note que a desativação de certos cookies pode afetar a funcionalidade de algumas características do Serviço. - -### **4. Processamento de Dados por Terceiros** -Os dados recolhidos através do Google Analytics são processados pelo Google de acordo com as suas políticas de privacidade. Para mais informações, consulte a [Política do Google](https://policies.google.com/technologies/cookies). - -### **5. Atualizações a esta Política** -Podemos atualizar esta Política de Cookies de tempos a tempos para refletir alterações nas nossas práticas ou por outras razões operacionais, legais ou regulamentares. Quaisquer atualizações serão publicadas nesta página, pelo que o encorajamos a revê-la periodicamente. - -### **6. Contacte-nos** -Se tiver alguma questão sobre esta Política de Cookies ou sobre como utilizamos cookies, por favor contacte-nos através de: -- [Página de Suporte da Chrome Web Store](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -Efetivo a partir de 10/01/2025 -` -export default msg diff --git a/packages/hub/src/app/[lang]/cookie/ru.ts b/packages/hub/src/app/[lang]/cookie/ru.ts deleted file mode 100644 index c642eeed..00000000 --- a/packages/hub/src/app/[lang]/cookie/ru.ts +++ /dev/null @@ -1,36 +0,0 @@ -const msg = ` -Selection Command Hub (далее именуемый "Сервис") использует файлы cookie для улучшения вашего опыта просмотра и повышения качества наших услуг. Эта Политика использования файлов cookie объясняет, что такое файлы cookie, как мы их используем, и какие у вас есть варианты в отношении их использования. - -### **1. Что такое файлы cookie?** -Файлы cookie - это небольшие текстовые файлы, которые хранятся на вашем устройстве (например, компьютере или смартфоне) веб-сайтами, которые вы посещаете. Они широко используются для обеспечения более эффективной работы веб-сайтов, а также для предоставления информации владельцам веб-сайтов. - -### **2. Файлы cookie, которые мы используем** -Мы используем следующие типы файлов cookie в нашем Сервисе: - -#### **2.1 Файл cookie для управления согласием** -- **cookieConsent**: Этот файл cookie используется для записи ваших предпочтений согласия в отношении использования файлов cookie в нашем Сервисе. Гарантирует, что после того, как вы дали согласие, вас не будут повторно просить об этом. Этот файл cookie обычно хранится в течение 1 года. - -#### **2.2 Аналитические файлы cookie** -Мы используем Google Analytics, чтобы помочь нам понять, как пользователи взаимодействуют с нашим Сервисом и улучшить его функциональность. Файлы cookie, используемые Google Analytics, включают: - -- **_ga**: Используется для различения пользователей. Этот файл cookie обычно истекает через 2 года. -- **\\_ga\\_\\***: Используется для поддержания состояния сессии. Этот файл cookie обычно истекает через 2 года. - -Информация, собираемая этими файлами cookie, агрегируется и анонимизируется, что означает, что она не идентифицирует отдельных пользователей. Это помогает нам анализировать тенденции, отслеживать поведение пользователей и улучшать общую производительность Сервиса. - -### **3. Как вы можете управлять файлами cookie** -Вы можете контролировать или отключать файлы cookie через настройки вашего браузера. Обратите внимание, что отключение определенных файлов cookie может повлиять на функциональность некоторых функций Сервиса. - -### **4. Обработка данных третьими сторонами** -Данные, собираемые через Google Analytics, обрабатываются Google в соответствии с их политикой конфиденциальности. Для получения дополнительной информации, пожалуйста, ознакомьтесь с [Политикой Google](https://policies.google.com/technologies/cookies). - -### **5. Обновления этой Политики** -Мы можем время от времени обновлять эту Политику использования файлов cookie, чтобы отражать изменения в нашей практике или по другим операционным, юридическим или нормативным причинам. Любые обновления будут опубликованы на этой странице, поэтому мы рекомендуем вам периодически проверять ее. - -### **6. Свяжитесь с нами** -Если у вас есть какие-либо вопросы об этой Политике использования файлов cookie или о том, как мы используем файлы cookie, пожалуйста, свяжитесь с нами через: -- [Страницу поддержки Chrome Web Store](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -Действует с 10.01.2025 -` -export default msg diff --git a/packages/hub/src/app/[lang]/cookie/zh-CN.ts b/packages/hub/src/app/[lang]/cookie/zh-CN.ts deleted file mode 100644 index b361187b..00000000 --- a/packages/hub/src/app/[lang]/cookie/zh-CN.ts +++ /dev/null @@ -1,36 +0,0 @@ -const msg = ` -Selection Command Hub(以下简称"服务")使用Cookie来改善您的浏览体验并提升我们的服务。本Cookie政策说明了什么是Cookie、我们如何使用它们,以及您可用的相关选项。 - -### **1. 什么是Cookie?** -Cookie是网站存储在您设备(如电脑或智能手机)上的小型文本文件。它们被广泛用于使网站更高效地运行,并为网站所有者提供信息。 - -### **2. 我们使用的Cookie** -我们在服务中使用以下类型的Cookie: - -#### **2.1 同意管理Cookie** -- **cookieConsent**:此Cookie用于记录您对我们服务中Cookie使用的同意偏好。确保一旦您提供同意,不会重复要求您这样做。此Cookie通常存储1年。 - -#### **2.2 分析Cookie** -我们使用Google Analytics来帮助我们了解用户如何与我们的服务互动并改进其功能。Google Analytics使用的Cookie包括: - -- **_ga**:用于区分用户。此Cookie通常在2年后过期。 -- **\\_ga\\_\\***:用于维持会话状态。此Cookie通常在2年后过期。 - -这些Cookie收集的信息会被汇总和匿名化,这意味着它们不会识别个人用户。它们帮助我们分析趋势、跟踪用户行为并提高服务的整体性能。 - -### **3. 如何管理Cookie** -您可以通过浏览器设置控制或禁用Cookie。请注意,禁用某些Cookie可能会影响服务的某些功能。 - -### **4. 第三方数据处理** -通过Google Analytics收集的数据由Google根据其隐私政策进行处理。有关更多信息,请参阅[Google政策](https://policies.google.com/technologies/cookies)。 - -### **5. 政策更新** -我们可能会不时更新本Cookie政策,以反映我们做法的变化或其他运营、法律或监管原因。任何更新都将发布在本页面上,因此我们鼓励您定期查看。 - -### **6. 联系我们** -如果您对本Cookie政策或我们如何使用Cookie有任何疑问,请通过以下方式联系我们: -- [Chrome Web Store支持页面](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -自2025年1月10日起生效 -` -export default msg diff --git a/packages/hub/src/app/[lang]/page.tsx b/packages/hub/src/app/[lang]/page.tsx deleted file mode 100644 index 5a934dbd..00000000 --- a/packages/hub/src/app/[lang]/page.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { CommandList } from "@/components/layout/CommandList" -import { CommandShare } from "@/components/CommandShare" -import { - isSupportedLang, - DefaultLanguage, - type LanguageType, -} from "@/features/locale" - -import css from "@/app/page.module.css" - -export default async function Page({ - params, -}: { - params: Promise<{ lang: string }> -}) { - const { lang: langParam } = await params - const lang: LanguageType = isSupportedLang(langParam) - ? langParam - : DefaultLanguage - return ( -
    -
    -
    - -
    - -
    - ) -} diff --git a/packages/hub/src/app/[lang]/privacy/de.ts b/packages/hub/src/app/[lang]/privacy/de.ts deleted file mode 100644 index 975566de..00000000 --- a/packages/hub/src/app/[lang]/privacy/de.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { HUB_URL } from "@/const" - -const msg = ` -Diese Datenschutzerklärung beschreibt, wie Benutzerinformationen innerhalb des Selection Command Hub (im Folgenden als "der Dienst" bezeichnet) behandelt werden. Durch die Nutzung des Dienstes erklären Sie sich mit dieser Datenschutzerklärung einverstanden. - -## **1. Erfasste Informationen** - -Der Dienst erfasst folgende Arten von Informationen: - -### **1-1. Von Benutzern gepostete Befehlsinformationen** -Der Dienst erfasst Befehlsinformationen, die von Benutzern gepostet werden (z.B. Befehlsnamen, URLs, Beschreibungen). -Einzelheiten zu den Einstellungen finden Sie in den [Nutzungsbedingungen](${HUB_URL}/de/terms). -*Hinweis: Diese Informationen werden nur verwendet, wenn Benutzer Daten innerhalb des Dienstes posten oder abrufen.* - -### **1-2. Nutzungsdaten** -Der Dienst verwendet Google Analytics, um anonymisierte Nutzungsdaten zu sammeln. Diese Daten umfassen: -- Interaktionshistorie (z.B. Seitenübergänge, Klickpositionen und -anzahlen) -- Geräteinformationen (z.B. Browsertyp, Betriebssystem) -- Zugriffszeitstempel -- Quell-IP-Adressen (anonymisiert verarbeitet) -- Weitere anonymisierte statistische Daten von Google Analytics - -### **1-3. Erfassung personenbezogener Daten** -Da der Dienst keine Benutzerregistrierung oder Anmeldung bietet, werden keine personenbezogenen Daten (z.B. Namen, E-Mail-Adressen, physische Adressen) erfasst. - -## **2. Zweck der Informationsnutzung** - -Die gesammelten Informationen werden für folgende Zwecke verwendet: -1. Analyse und Verbesserung der Nutzung des Dienstes -2. Bereitstellung notwendiger Funktionen für den Betrieb des Dienstes - -## **3. Informationsverwaltung** - -Der Dienst verwaltet die gesammelten Informationen angemessen, um unbefugten Zugriff oder Datenverletzungen zu verhindern. Über Google Analytics gesammelte Daten werden gemäß der [Google-Datenschutzerklärung](https://www.google.com/analytics/terms/us.html) verwaltet. - -## **4. Weitergabe an Dritte** - -Der Dienst gibt gesammelte Informationen nicht an Dritte weiter, es sei denn, dies ist gesetzlich erforderlich. Daten, die über Google Analytics gesammelt werden, werden jedoch von Google verarbeitet. - -## **5. Verwendung von Cookies** - -Der Dienst verwendet Cookies über Google Analytics. Cookies werden in den Browsern der Benutzer gespeichert und dienen zur Verbesserung der Funktionalität und Analyse des Benutzerverhaltens innerhalb des Dienstes. Benutzer können Cookies über ihre Browsereinstellungen deaktivieren; einige Funktionen funktionieren dann möglicherweise nicht mehr ordnungsgemäß. - -## **6. Änderungen der Datenschutzerklärung** - -Diese Datenschutzerklärung kann bei Bedarf aktualisiert werden. Die überarbeitete Richtlinie tritt mit der Veröffentlichung auf dieser Seite in Kraft. - -## **7. Kontaktinformationen** - -Bei Fragen zu dieser Datenschutzerklärung kontaktieren Sie uns bitte über: -- [Chrome Web Store Support-Seite](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -Gültig ab 01/10/2025 -` -export default msg diff --git a/packages/hub/src/app/[lang]/privacy/en.ts b/packages/hub/src/app/[lang]/privacy/en.ts deleted file mode 100644 index dd7dca85..00000000 --- a/packages/hub/src/app/[lang]/privacy/en.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { HUB_URL } from "@/const" - -const msg = ` -This Privacy Policy outlines how user information is handled within Selection Command Hub (hereinafter referred to as "the Service"). By using the Service, you are deemed to have agreed to this Privacy Policy. - -## **1. Information Collected** - -The Service collects the following types of information: - -### **1-1. Command Information Posted by Users** -The Service collects command information posted by users (e.g., command names, URLs, descriptions). -For details on settings, please refer to the [Terms of Service](${HUB_URL}/en/terms). -*Note: This information is used only when users post or retrieve data within the Service.* - -### **1-2. Usage Data** -The Service uses Google Analytics to collect anonymized usage data. This data includes: -- Interaction history (e.g., page transitions, click locations and counts) -- Device information (e.g., browser type, operating system) -- Access timestamps -- Source IP addresses (processed for anonymization) -- Other anonymized statistical data provided by Google Analytics - -### **1-3. Collection of Personal Information** -Since the Service does not provide user registration or login functionality, it does not collect any personally identifiable information (e.g., names, email addresses, physical addresses). - -## **2. Purpose of Information Use** - -The collected information is used for the following purposes: -1. Analyzing and improving the usage of the Service -2. Providing necessary features for operating the Service - -## **3. Information Management** - -The Service appropriately manages collected information to prevent unauthorized access or data breaches. Data collected through Google Analytics is managed in accordance with [Google's Privacy Policy](https://www.google.com/analytics/terms/us.html). - -## **4. Provision to Third Parties** - -The Service does not provide collected information to third parties except as required by law. However, data collected through Google Analytics is processed by Google. - -## **5. Use of Cookies** - -The Service uses cookies through Google Analytics. Cookies are stored in users' browsers and are used to improve functionality and analyze user behavior within the Service. Users can disable cookies via their browser settings; however, some features may not function properly as a result. - -## **6. Changes to the Privacy Policy** - -This Privacy Policy may be updated as necessary. The revised policy will take effect upon being published on this page. - -## **7. Contact Information** - -For inquiries regarding this Privacy Policy, please contact us through: -- [Chrome Web Store Support Page](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -Effective as of 01/10/2025 -` -export default msg diff --git a/packages/hub/src/app/[lang]/privacy/es.ts b/packages/hub/src/app/[lang]/privacy/es.ts deleted file mode 100644 index 03a69aad..00000000 --- a/packages/hub/src/app/[lang]/privacy/es.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { HUB_URL } from "@/const" - -const msg = ` -Esta Política de Privacidad describe cómo se maneja la información del usuario dentro de Selection Command Hub (en adelante, "el Servicio"). Al utilizar el Servicio, se considera que ha aceptado esta Política de Privacidad. - -## **1. Información Recopilada** - -El Servicio recopila los siguientes tipos de información: - -### **1-1. Información de Comandos Publicada por Usuarios** -El Servicio recopila información de comandos publicada por usuarios (por ejemplo, nombres de comandos, URLs, descripciones). -Para más detalles sobre la configuración, consulte los [Términos de Servicio](${HUB_URL}/es/terms). -*Nota: Esta información se utiliza solo cuando los usuarios publican o recuperan datos dentro del Servicio.* - -### **1-2. Datos de Uso** -El Servicio utiliza Google Analytics para recopilar datos de uso anonimizados. Estos datos incluyen: -- Historial de interacciones (por ejemplo, transiciones de página, ubicaciones y conteos de clics) -- Información del dispositivo (por ejemplo, tipo de navegador, sistema operativo) -- Marcas de tiempo de acceso -- Direcciones IP de origen (procesadas para anonimización) -- Otros datos estadísticos anonimizados proporcionados por Google Analytics - -### **1-3. Recopilación de Información Personal** -Como el Servicio no proporciona funcionalidades de registro o inicio de sesión, no recopila información personal identificable (por ejemplo, nombres, direcciones de correo electrónico, direcciones físicas). - -## **2. Propósito del Uso de la Información** - -La información recopilada se utiliza para los siguientes propósitos: -1. Analizar y mejorar el uso del Servicio -2. Proporcionar las funciones necesarias para operar el Servicio - -## **3. Gestión de la Información** - -El Servicio gestiona adecuadamente la información recopilada para prevenir accesos no autorizados o violaciones de datos. Los datos recopilados a través de Google Analytics se gestionan de acuerdo con la [Política de Privacidad de Google](https://www.google.com/analytics/terms/us.html). - -## **4. Provisión a Terceros** - -El Servicio no proporciona la información recopilada a terceros, excepto cuando lo exige la ley. Sin embargo, los datos recopilados a través de Google Analytics son procesados por Google. - -## **5. Uso de Cookies** - -El Servicio utiliza cookies a través de Google Analytics. Las cookies se almacenan en los navegadores de los usuarios y se utilizan para mejorar la funcionalidad y analizar el comportamiento del usuario dentro del Servicio. Los usuarios pueden deshabilitar las cookies a través de la configuración de su navegador; sin embargo, algunas funciones pueden no funcionar correctamente como resultado. - -## **6. Cambios en la Política de Privacidad** - -Esta Política de Privacidad puede actualizarse según sea necesario. La política revisada entrará en vigor al ser publicada en esta página. - -## **7. Información de Contacto** - -Para consultas sobre esta Política de Privacidad, contáctenos a través de: -- [Página de Soporte de Chrome Web Store](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -Vigente a partir del 01/10/2025 -` -export default msg diff --git a/packages/hub/src/app/[lang]/privacy/fr.ts b/packages/hub/src/app/[lang]/privacy/fr.ts deleted file mode 100644 index 81da2d7d..00000000 --- a/packages/hub/src/app/[lang]/privacy/fr.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { HUB_URL } from "@/const" - -const msg = ` -Cette Politique de Confidentialité décrit comment les informations des utilisateurs sont traitées dans Selection Command Hub (ci-après dénommé "le Service"). En utilisant le Service, vous êtes réputé avoir accepté cette Politique de Confidentialité. - -## **1. Informations Collectées** - -Le Service collecte les types d'informations suivants : - -### **1-1. Informations de Commande Publiées par les Utilisateurs** -Le Service collecte les informations de commande publiées par les utilisateurs (par exemple, noms de commande, URLs, descriptions). -Pour plus de détails sur les paramètres, veuillez consulter les [Conditions d'Utilisation](${HUB_URL}/fr/terms). -*Note : Ces informations ne sont utilisées que lorsque les utilisateurs publient ou récupèrent des données dans le Service.* - -### **1-2. Données d'Utilisation** -Le Service utilise Google Analytics pour collecter des données d'utilisation anonymisées. Ces données comprennent : -- Historique des interactions (par exemple, transitions de page, emplacements et nombre de clics) -- Informations sur l'appareil (par exemple, type de navigateur, système d'exploitation) -- Horodatages d'accès -- Adresses IP source (traitées pour l'anonymisation) -- Autres données statistiques anonymisées fournies par Google Analytics - -### **1-3. Collecte d'Informations Personnelles** -Comme le Service ne propose pas de fonctionnalités d'inscription ou de connexion, il ne collecte aucune information personnellement identifiable (par exemple, noms, adresses e-mail, adresses physiques). - -## **2. Objectif de l'Utilisation des Informations** - -Les informations collectées sont utilisées aux fins suivantes : -1. Analyser et améliorer l'utilisation du Service -2. Fournir les fonctionnalités nécessaires au fonctionnement du Service - -## **3. Gestion des Informations** - -Le Service gère de manière appropriée les informations collectées pour prévenir tout accès non autorisé ou violation de données. Les données collectées via Google Analytics sont gérées conformément à la [Politique de Confidentialité de Google](https://www.google.com/analytics/terms/us.html). - -## **4. Communication à des Tiers** - -Le Service ne communique pas les informations collectées à des tiers, sauf si la loi l'exige. Cependant, les données collectées via Google Analytics sont traitées par Google. - -## **5. Utilisation des Cookies** - -Le Service utilise des cookies via Google Analytics. Les cookies sont stockés dans les navigateurs des utilisateurs et sont utilisés pour améliorer les fonctionnalités et analyser le comportement des utilisateurs dans le Service. Les utilisateurs peuvent désactiver les cookies via les paramètres de leur navigateur ; cependant, certaines fonctionnalités peuvent ne pas fonctionner correctement en conséquence. - -## **6. Modifications de la Politique de Confidentialité** - -Cette Politique de Confidentialité peut être mise à jour si nécessaire. La politique révisée entrera en vigueur dès sa publication sur cette page. - -## **7. Informations de Contact** - -Pour toute question concernant cette Politique de Confidentialité, veuillez nous contacter via : -- [Page d'Assistance du Chrome Web Store](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -En vigueur à partir du 01/10/2025 -` -export default msg diff --git a/packages/hub/src/app/[lang]/privacy/hi.ts b/packages/hub/src/app/[lang]/privacy/hi.ts deleted file mode 100644 index d84099d0..00000000 --- a/packages/hub/src/app/[lang]/privacy/hi.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { HUB_URL } from "@/const" - -const msg = ` -यह गोपनीयता नीति बताती है कि Selection Command Hub (जिसे आगे "सेवा" कहा जाएगा) में उपयोगकर्ता की जानकारी कैसे संभाली जाती है। सेवा का उपयोग करके, आप इस गोपनीयता नीति से सहमत माने जाते हैं। - -## **1. एकत्रित की गई जानकारी** - -सेवा निम्नलिखित प्रकार की जानकारी एकत्र करती है: - -### **1-1. उपयोगकर्ताओं द्वारा पोस्ट की गई कमांड जानकारी** -सेवा उपयोगकर्ताओं द्वारा पोस्ट की गई कमांड जानकारी (जैसे, कमांड नाम, URL, विवरण) एकत्र करती है। -सेटिंग्स के विवरण के लिए, कृपया [सेवा की शर्तें](${HUB_URL}/hi/terms) देखें। -*नोट: यह जानकारी केवल तभी उपयोग की जाती है जब उपयोगकर्ता सेवा के भीतर डेटा पोस्ट या प्राप्त करते हैं।* - -### **1-2. उपयोग डेटा** -सेवा Google Analytics का उपयोग करके अनामित उपयोग डेटा एकत्र करती है। इस डेटा में शामिल है: -- इंटरैक्शन इतिहास (जैसे, पेज ट्रांजिशन, क्लिक स्थान और संख्या) -- डिवाइस जानकारी (जैसे, ब्राउज़र प्रकार, ऑपरेटिंग सिस्टम) -- एक्सेस टाइमस्टैम्प -- स्रोत IP पते (अनामीकरण के लिए प्रसंस्कृत) -- Google Analytics द्वारा प्रदान किए गए अन्य अनामित सांख्यिकीय डेटा - -### **1-3. व्यक्तिगत जानकारी का संग्रह** -चूंकि सेवा उपयोगकर्ता पंजीकरण या लॉगिन कार्यक्षमता प्रदान नहीं करती है, यह किसी भी व्यक्तिगत रूप से पहचान योग्य जानकारी (जैसे, नाम, ईमेल पते, भौतिक पते) को एकत्र नहीं करती है। - -## **2. जानकारी के उपयोग का उद्देश्य** - -एकत्रित की गई जानकारी का उपयोग निम्नलिखित उद्देश्यों के लिए किया जाता है: -1. सेवा के उपयोग का विश्लेषण और सुधार -2. सेवा के संचालन के लिए आवश्यक कार्यक्षमता प्रदान करना - -## **3. जानकारी का प्रबंधन** - -सेवा अनधिकृत पहुंच या डेटा उल्लंघनों को रोकने के लिए एकत्रित की गई जानकारी का उचित प्रबंधन करती है। Google Analytics के माध्यम से एकत्रित किए गए डेटा का प्रबंधन [Google की गोपनीयता नीति](https://www.google.com/analytics/terms/us.html) के अनुसार किया जाता है। - -## **4. तृतीय पक्षों को प्रावधान** - -सेवा कानून द्वारा आवश्यक होने के अलावा एकत्रित की गई जानकारी को तृतीय पक्षों को प्रदान नहीं करती है। हालांकि, Google Analytics के माध्यम से एकत्रित किए गए डेटा को Google द्वारा संसाधित किया जाता है। - -## **5. कुकीज़ का उपयोग** - -सेवा Google Analytics के माध्यम से कुकीज़ का उपयोग करती है। कुकीज़ उपयोगकर्ताओं के ब्राउज़र में संग्रहीत की जाती हैं और सेवा के भीतर कार्यक्षमता में सुधार और उपयोगकर्ता व्यवहार का विश्लेषण करने के लिए उपयोग की जाती हैं। उपयोगकर्ता अपने ब्राउज़र सेटिंग्स के माध्यम से कुकीज़ को अक्षम कर सकते हैं; हालांकि, कुछ कार्यक्षमताएं परिणामस्वरूप ठीक से काम नहीं कर सकती हैं। - -## **6. गोपनीयता नीति में परिवर्तन** - -यह गोपनीयता नीति आवश्यकतानुसार अपडेट की जा सकती है। संशोधित नीति इस पृष्ठ पर प्रकाशित होने के बाद प्रभावी होगी। - -## **7. संपर्क जानकारी** - -इस गोपनीयता नीति के बारे में प्रश्नों के लिए, कृपया हमसे संपर्क करें: -- [Chrome वेब स्टोर सपोर्ट पेज](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -01/10/2025 से प्रभावी -` -export default msg diff --git a/packages/hub/src/app/[lang]/privacy/id.ts b/packages/hub/src/app/[lang]/privacy/id.ts deleted file mode 100644 index 4736c750..00000000 --- a/packages/hub/src/app/[lang]/privacy/id.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { HUB_URL } from "@/const" - -const msg = ` -Kebijakan Privasi ini menjelaskan bagaimana informasi pengguna ditangani dalam Selection Command Hub (selanjutnya disebut "Layanan"). Dengan menggunakan Layanan, Anda dianggap telah menyetujui Kebijakan Privasi ini. - -## **1. Informasi yang Dikumpulkan** - -Layanan mengumpulkan jenis informasi berikut: - -### **1-1. Informasi Perintah yang Diposting oleh Pengguna** -Layanan mengumpulkan informasi perintah yang diposting oleh pengguna (misalnya, nama perintah, URL, deskripsi). -Untuk detail pengaturan, silakan lihat [Ketentuan Layanan](${HUB_URL}/id/terms). -*Catatan: Informasi ini hanya digunakan ketika pengguna memposting atau mengambil data dalam Layanan.* - -### **1-2. Data Penggunaan** -Layanan menggunakan Google Analytics untuk mengumpulkan data penggunaan yang dianonimkan. Data ini meliputi: -- Riwayat interaksi (misalnya, transisi halaman, lokasi dan jumlah klik) -- Informasi perangkat (misalnya, jenis browser, sistem operasi) -- Cap waktu akses -- Alamat IP sumber (diproses untuk anonimisasi) -- Data statistik anonim lainnya yang disediakan oleh Google Analytics - -### **1-3. Pengumpulan Informasi Pribadi** -Karena Layanan tidak menyediakan fitur pendaftaran atau login pengguna, tidak mengumpulkan informasi yang dapat diidentifikasi secara pribadi (misalnya, nama, alamat email, alamat fisik). - -## **2. Tujuan Penggunaan Informasi** - -Informasi yang dikumpulkan digunakan untuk tujuan berikut: -1. Menganalisis dan meningkatkan penggunaan Layanan -2. Menyediakan fitur yang diperlukan untuk mengoperasikan Layanan - -## **3. Pengelolaan Informasi** - -Layanan mengelola informasi yang dikumpulkan dengan tepat untuk mencegah akses tidak sah atau pelanggaran data. Data yang dikumpulkan melalui Google Analytics dikelola sesuai dengan [Kebijakan Privasi Google](https://www.google.com/analytics/terms/us.html). - -## **4. Penyediaan kepada Pihak Ketiga** - -Layanan tidak menyediakan informasi yang dikumpulkan kepada pihak ketiga kecuali jika diwajibkan oleh hukum. Namun, data yang dikumpulkan melalui Google Analytics diproses oleh Google. - -## **5. Penggunaan Cookie** - -Layanan menggunakan cookie melalui Google Analytics. Cookie disimpan di browser pengguna dan digunakan untuk meningkatkan fungsionalitas dan menganalisis perilaku pengguna dalam Layanan. Pengguna dapat menonaktifkan cookie melalui pengaturan browser mereka; namun, beberapa fitur mungkin tidak berfungsi dengan baik sebagai akibatnya. - -## **6. Perubahan pada Kebijakan Privasi** - -Kebijakan Privasi ini dapat diperbarui sesuai kebutuhan. Kebijakan yang direvisi akan berlaku setelah dipublikasikan di halaman ini. - -## **7. Informasi Kontak** - -Untuk pertanyaan tentang Kebijakan Privasi ini, silakan hubungi kami melalui: -- [Halaman Dukungan Chrome Web Store](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -Berlaku mulai 01/10/2025 -` -export default msg diff --git a/packages/hub/src/app/[lang]/privacy/it.ts b/packages/hub/src/app/[lang]/privacy/it.ts deleted file mode 100644 index abfe356c..00000000 --- a/packages/hub/src/app/[lang]/privacy/it.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { HUB_URL } from "@/const" - -const msg = ` -Questa Informativa sulla Privacy descrive come le informazioni degli utenti vengono gestite all'interno di Selection Command Hub (di seguito denominato "il Servizio"). Utilizzando il Servizio, si considera che l'utente abbia accettato questa Informativa sulla Privacy. - -## **1. Informazioni Raccolte** - -Il Servizio raccoglie i seguenti tipi di informazioni: - -### **1-1. Informazioni sui Comandi Pubblicate dagli Utenti** -Il Servizio raccoglie informazioni sui comandi pubblicate dagli utenti (ad esempio, nomi dei comandi, URL, descrizioni). -Per i dettagli sulle impostazioni, consultare i [Termini di Servizio](${HUB_URL}/it/terms). -*Nota: Queste informazioni vengono utilizzate solo quando gli utenti pubblicano o recuperano dati all'interno del Servizio.* - -### **1-2. Dati di Utilizzo** -Il Servizio utilizza Google Analytics per raccogliere dati di utilizzo anonimizzati. Questi dati includono: -- Cronologia delle interazioni (ad esempio, transizioni di pagina, posizioni e conteggi dei clic) -- Informazioni sul dispositivo (ad esempio, tipo di browser, sistema operativo) -- Timestamp di accesso -- Indirizzi IP di origine (elaborati per l'anonimizzazione) -- Altri dati statistici anonimizzati forniti da Google Analytics - -### **1-3. Raccolta di Informazioni Personali** -Poiché il Servizio non fornisce funzionalità di registrazione o accesso utente, non raccoglie alcuna informazione personale identificabile (ad esempio, nomi, indirizzi email, indirizzi fisici). - -## **2. Scopo dell'Utilizzo delle Informazioni** - -Le informazioni raccolte vengono utilizzate per i seguenti scopi: -1. Analizzare e migliorare l'utilizzo del Servizio -2. Fornire le funzionalità necessarie per il funzionamento del Servizio - -## **3. Gestione delle Informazioni** - -Il Servizio gestisce adeguatamente le informazioni raccolte per prevenire accessi non autorizzati o violazioni dei dati. I dati raccolti tramite Google Analytics sono gestiti in conformità con l'[Informativa sulla Privacy di Google](https://www.google.com/analytics/terms/us.html). - -## **4. Fornitura a Terze Parti** - -Il Servizio non fornisce le informazioni raccolte a terze parti, tranne quando richiesto dalla legge. Tuttavia, i dati raccolti tramite Google Analytics sono elaborati da Google. - -## **5. Utilizzo dei Cookie** - -Il Servizio utilizza i cookie tramite Google Analytics. I cookie vengono memorizzati nei browser degli utenti e vengono utilizzati per migliorare la funzionalità e analizzare il comportamento degli utenti all'interno del Servizio. Gli utenti possono disabilitare i cookie tramite le impostazioni del loro browser; tuttavia, alcune funzionalità potrebbero non funzionare correttamente come conseguenza. - -## **6. Modifiche all'Informativa sulla Privacy** - -Questa Informativa sulla Privacy può essere aggiornata secondo necessità. La politica rivista entrerà in vigore dopo la pubblicazione su questa pagina. - -## **7. Informazioni di Contatto** - -Per domande riguardanti questa Informativa sulla Privacy, contattarci tramite: -- [Pagina di Supporto di Chrome Web Store](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -In vigore dal 01/10/2025 -` -export default msg diff --git a/packages/hub/src/app/[lang]/privacy/ja.ts b/packages/hub/src/app/[lang]/privacy/ja.ts deleted file mode 100644 index db31d0a9..00000000 --- a/packages/hub/src/app/[lang]/privacy/ja.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { HUB_URL } from "@/const" - -const msg = ` -本プライバシーポリシーは、Selection Command Hub(以下「本サービス」)におけるユーザーの情報の取り扱いについて定めたものです。本サービスをご利用いただく際には、本ポリシーに同意いただいたものとみなします。 - -## **1. 収集する情報** - -本サービスでは、以下の情報を収集します。 - -### **1-1. ユーザーが投稿するコマンド情報** -本サービスでは、ユーザーが投稿するコマンド情報(例:コマンド名、URL、説明)を収集します。 -設定値の詳細は[利用規約](${HUB_URL}/ja/terms)を参照してください。 -※これらの情報は、ユーザーがサービス内で投稿または取得する際にのみ利用されます。 - -### **1-2. 利用状況データ** -本サービスでは、Google Analyticsを使用して匿名化された利用状況データを収集します。このデータには以下が含まれます: -- 操作履歴(例:ページ遷移、クリック箇所や回数) -- デバイス情報(例:ブラウザ種類、OS) -- アクセス日時 -- アクセス元IPアドレス(匿名化処理済み) -- その他、Google Analyticsが提供する匿名化された統計データ - -### **1-3. 個人情報の収集について** -本サービスでは、ユーザー登録やログイン機能を提供していないため、個人を特定できる情報(氏名、メールアドレス、住所等)の収集は一切行いません。 - -## **2. 情報の利用目的** - -収集した情報は以下の目的で利用します: -1. サービス利用状況の分析および改善 -2. サービス運営上必要な機能の提供 - -## **3. 情報の管理** - -本サービスでは、収集した情報を適切に管理し、不正アクセスや漏洩が発生しないよう努めます。また、Google Analyticsによるデータ収集については[Google社のプライバシーポリシー](https://www.google.com/analytics/terms/jp.html)に基づいて管理されます。 - -## **4. 第三者への提供** - -本サービスでは、法令に基づく場合を除き、収集した情報を第三者に提供することはありません。ただし、Google Analyticsによるデータ収集についてはGoogle社がデータ処理を行います。 - -## **5. クッキー(Cookie)の使用** - -本サービスでは、Google Analyticsによるクッキー(Cookie)を使用しています。クッキーはユーザーのブラウザに保存され、本サービス利用時の動作改善や分析に役立てられます。ユーザーはブラウザ設定からクッキーを無効化することが可能です。ただし、一部機能が正常に動作しない場合がありますのでご了承ください。 - -## **6. プライバシーポリシーの変更** - -本プライバシーポリシーは必要に応じて変更される場合があります。変更後のポリシーは、本ページに掲載された時点で効力を発揮します。 - -## **7. お問い合わせ** - -本プライバシーポリシーに関するお問い合わせは、以下までご連絡ください: -- [Chrome Web Store サポートページ](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -発行日:2025/01/10 -` -export default msg diff --git a/packages/hub/src/app/[lang]/privacy/ko.ts b/packages/hub/src/app/[lang]/privacy/ko.ts deleted file mode 100644 index f0b4e2d0..00000000 --- a/packages/hub/src/app/[lang]/privacy/ko.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { HUB_URL } from "@/const" - -const msg = ` -이 개인정보 처리방침은 Selection Command Hub(이하 "서비스")에서 사용자 정보를 처리하는 방법을 설명합니다. 서비스를 사용함으로써 귀하는 이 개인정보 처리방침에 동의한 것으로 간주됩니다. - -## **1. 수집되는 정보** - -서비스는 다음과 같은 유형의 정보를 수집합니다: - -### **1-1. 사용자가 게시한 명령 정보** -서비스는 사용자가 게시한 명령 정보(예: 명령 이름, URL, 설명)를 수집합니다. -설정에 대한 자세한 내용은 [서비스 약관](${HUB_URL}/ko/terms)을 참조하세요. -*참고: 이 정보는 사용자가 서비스 내에서 데이터를 게시하거나 검색할 때만 사용됩니다.* - -### **1-2. 사용 데이터** -서비스는 Google Analytics를 사용하여 익명화된 사용 데이터를 수집합니다. 이 데이터에는 다음이 포함됩니다: -- 상호작용 기록(예: 페이지 전환, 클릭 위치 및 횟수) -- 기기 정보(예: 브라우저 유형, 운영 체제) -- 접근 타임스탬프 -- 원본 IP 주소(익명화 처리됨) -- Google Analytics에서 제공하는 기타 익명화된 통계 데이터 - -### **1-3. 개인정보 수집** -서비스는 사용자 등록 또는 로그인 기능을 제공하지 않으므로, 개인을 식별할 수 있는 정보(예: 이름, 이메일 주소, 물리적 주소)를 수집하지 않습니다. - -## **2. 정보 사용 목적** - -수집된 정보는 다음과 같은 목적으로 사용됩니다: -1. 서비스 사용 분석 및 개선 -2. 서비스 운영에 필요한 기능 제공 - -## **3. 정보 관리** - -서비스는 무단 접근이나 데이터 침해를 방지하기 위해 수집된 정보를 적절히 관리합니다. Google Analytics를 통해 수집된 데이터는 [Google 개인정보 처리방침](https://www.google.com/analytics/terms/us.html)에 따라 관리됩니다. - -## **4. 제3자 제공** - -서비스는 법률에 따라 요구되는 경우를 제외하고 수집된 정보를 제3자에게 제공하지 않습니다. 그러나 Google Analytics를 통해 수집된 데이터는 Google에서 처리됩니다. - -## **5. 쿠키 사용** - -서비스는 Google Analytics를 통해 쿠키를 사용합니다. 쿠키는 사용자의 브라우저에 저장되며 서비스의 기능을 개선하고 사용자 행동을 분석하는 데 사용됩니다. 사용자는 브라우저 설정을 통해 쿠키를 비활성화할 수 있습니다. 그러나 일부 기능은 그 결과로 제대로 작동하지 않을 수 있습니다. - -## **6. 개인정보 처리방침 변경** - -이 개인정보 처리방침은 필요에 따라 업데이트될 수 있습니다. 수정된 정책은 이 페이지에 게시된 후 효력이 발생합니다. - -## **7. 연락처 정보** - -이 개인정보 처리방침에 대한 문의사항은 다음을 통해 문의해 주세요: -- [Chrome 웹 스토어 지원 페이지](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -2025년 10월 1일부터 시행 -` -export default msg diff --git a/packages/hub/src/app/[lang]/privacy/ms.ts b/packages/hub/src/app/[lang]/privacy/ms.ts deleted file mode 100644 index 5c04f6ca..00000000 --- a/packages/hub/src/app/[lang]/privacy/ms.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { HUB_URL } from "@/const" - -const msg = ` -Dasar Privasi ini menerangkan bagaimana maklumat pengguna dikendalikan dalam Selection Command Hub (selepas ini dirujuk sebagai "Perkhidmatan"). Dengan menggunakan Perkhidmatan, anda dianggap telah bersetuju dengan Dasar Privasi ini. - -## **1. Maklumat yang Dikumpul** - -Perkhidmatan mengumpul jenis maklumat berikut: - -### **1-1. Maklumat Arahan yang Dihantar oleh Pengguna** -Perkhidmatan mengumpul maklumat arahan yang dihantar oleh pengguna (contohnya, nama arahan, URL, penerangan). -Untuk butiran tetapan, sila rujuk [Terma Perkhidmatan](${HUB_URL}/ms/terms). -*Nota: Maklumat ini hanya digunakan apabila pengguna menghantar atau mengambil data dalam Perkhidmatan.* - -### **1-2. Data Penggunaan** -Perkhidmatan menggunakan Google Analytics untuk mengumpul data penggunaan yang dianonimkan. Data ini termasuk: -- Sejarah interaksi (contohnya, peralihan halaman, lokasi dan bilangan klik) -- Maklumat peranti (contohnya, jenis pelayar, sistem pengendalian) -- Cap masa akses -- Alamat IP sumber (diproses untuk anonimisasi) -- Data statistik anonim lain yang disediakan oleh Google Analytics - -### **1-3. Pengumpulan Maklumat Peribadi** -Oleh kerana Perkhidmatan tidak menyediakan fungsi pendaftaran atau log masuk pengguna, ia tidak mengumpul sebarang maklumat yang boleh dikenal pasti secara peribadi (contohnya, nama, alamat e-mel, alamat fizikal). - -## **2. Tujuan Penggunaan Maklumat** - -Maklumat yang dikumpul digunakan untuk tujuan berikut: -1. Menganalisis dan meningkatkan penggunaan Perkhidmatan -2. Menyediakan ciri-ciri yang diperlukan untuk mengendalikan Perkhidmatan - -## **3. Pengurusan Maklumat** - -Perkhidmatan menguruskan maklumat yang dikumpul dengan sewajarnya untuk mencegah akses tanpa kebenaran atau pelanggaran data. Data yang dikumpul melalui Google Analytics dikendalikan mengikut [Dasar Privasi Google](https://www.google.com/analytics/terms/us.html). - -## **4. Penyediaan kepada Pihak Ketiga** - -Perkhidmatan tidak menyediakan maklumat yang dikumpul kepada pihak ketiga kecuali jika dikehendaki oleh undang-undang. Walau bagaimanapun, data yang dikumpul melalui Google Analytics diproses oleh Google. - -## **5. Penggunaan Kuki** - -Perkhidmatan menggunakan kuki melalui Google Analytics. Kuki disimpan dalam pelayar pengguna dan digunakan untuk meningkatkan fungsi dan menganalisis tingkah laku pengguna dalam Perkhidmatan. Pengguna boleh melumpuhkan kuki melalui tetapan pelayar mereka; walau bagaimanapun, beberapa ciri mungkin tidak berfungsi dengan baik sebagai akibatnya. - -## **6. Perubahan pada Dasar Privasi** - -Dasar Privasi ini mungkin dikemas kini mengikut keperluan. Dasar yang disemak akan berkuat kuasa selepas diterbitkan di halaman ini. - -## **7. Maklumat Hubungan** - -Untuk pertanyaan mengenai Dasar Privasi ini, sila hubungi kami melalui: -- [Halaman Sokongan Chrome Web Store](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -Berkuat kuasa mulai 01/10/2025 -` -export default msg diff --git a/packages/hub/src/app/[lang]/privacy/page.tsx b/packages/hub/src/app/[lang]/privacy/page.tsx deleted file mode 100644 index bdf3acdd..00000000 --- a/packages/hub/src/app/[lang]/privacy/page.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import ReactMarkdown from "react-markdown" -import css from "@/app/page.module.css" -import { LangProps } from "@/types" -import { getDict } from "@/features/locale" - -import en from "./en" -import ja from "./ja" -import de from "./de" -import es from "./es" -import fr from "./fr" -import hi from "./hi" -import id from "./id" -import it from "./it" -import ko from "./ko" -import ms from "./ms" -import pt_BR from "./pt-BR" -import pt_PT from "./pt-PT" -import ru from "./ru" -import zh_CN from "./zh-CN" - -const LocaleMap = { - en, - ja, - de, - es, - fr, - hi, - id, - it, - ko, - ms, - "pt-BR": pt_BR, - "pt-PT": pt_PT, - ru, - "zh-CN": zh_CN, -} as const - -type Props = LangProps - -export default async function PrivacyPolicy({ - params, -}: { - params: Promise -}) { - const { lang } = await params - const t = getDict(lang).about - const policy = LocaleMap[lang] - return ( -
    -

    {t.privacy}

    - {policy} -
    - ) -} diff --git a/packages/hub/src/app/[lang]/privacy/pt-BR.ts b/packages/hub/src/app/[lang]/privacy/pt-BR.ts deleted file mode 100644 index f61e8cf5..00000000 --- a/packages/hub/src/app/[lang]/privacy/pt-BR.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { HUB_URL } from "@/const" - -const msg = ` -Esta Política de Privacidade descreve como as informações dos usuários são tratadas no Selection Command Hub (doravante denominado "o Serviço"). Ao utilizar o Serviço, considera-se que você aceitou esta Política de Privacidade. - -## **1. Informações Coletadas** - -O Serviço coleta os seguintes tipos de informações: - -### **1-1. Informações de Comandos Publicadas pelos Usuários** -O Serviço coleta informações de comandos publicadas pelos usuários (por exemplo, nomes de comandos, URLs, descrições). -Para mais detalhes sobre as configurações, consulte os [Termos de Serviço](${HUB_URL}/pt-BR/terms). -*Nota: Estas informações são utilizadas apenas quando os usuários publicam ou recuperam dados dentro do Serviço.* - -### **1-2. Dados de Uso** -O Serviço utiliza o Google Analytics para coletar dados de uso anonimizados. Estes dados incluem: -- Histórico de interações (por exemplo, transições de página, localizações e contagens de cliques) -- Informações do dispositivo (por exemplo, tipo de navegador, sistema operacional) -- Carimbos de data/hora de acesso -- Endereços IP de origem (processados para anonimização) -- Outros dados estatísticos anonimizados fornecidos pelo Google Analytics - -### **1-3. Coleta de Informações Pessoais** -Como o Serviço não fornece funcionalidades de registro ou login, não coleta informações pessoais identificáveis (por exemplo, nomes, endereços de e-mail, endereços físicos). - -## **2. Finalidade do Uso das Informações** - -As informações coletadas são utilizadas para os seguintes fins: -1. Analisar e melhorar o uso do Serviço -2. Fornecer as funcionalidades necessárias para operar o Serviço - -## **3. Gerenciamento das Informações** - -O Serviço gerencia adequadamente as informações coletadas para prevenir acessos não autorizados ou violações de dados. Os dados coletados através do Google Analytics são gerenciados de acordo com a [Política de Privacidade do Google](https://www.google.com/analytics/terms/us.html). - -## **4. Fornecimento a Terceiros** - -O Serviço não fornece as informações coletadas a terceiros, exceto quando exigido por lei. No entanto, os dados coletados através do Google Analytics são processados pelo Google. - -## **5. Uso de Cookies** - -O Serviço utiliza cookies através do Google Analytics. Os cookies são armazenados nos navegadores dos usuários e são utilizados para melhorar a funcionalidade e analisar o comportamento dos usuários dentro do Serviço. Os usuários podem desativar os cookies através das configurações do seu navegador; no entanto, algumas funcionalidades podem não funcionar corretamente como resultado. - -## **6. Alterações na Política de Privacidade** - -Esta Política de Privacidade pode ser atualizada conforme necessário. A política revisada entrará em vigor após ser publicada nesta página. - -## **7. Informações de Contato** - -Para questões sobre esta Política de Privacidade, entre em contato conosco através de: -- [Página de Suporte da Chrome Web Store](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -Em vigor a partir de 01/10/2025 -` -export default msg diff --git a/packages/hub/src/app/[lang]/privacy/pt-PT.ts b/packages/hub/src/app/[lang]/privacy/pt-PT.ts deleted file mode 100644 index ab4e00b8..00000000 --- a/packages/hub/src/app/[lang]/privacy/pt-PT.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { HUB_URL } from "@/const" - -const msg = ` -Esta Política de Privacidade descreve como as informações dos utilizadores são tratadas no Selection Command Hub (doravante designado como "o Serviço"). Ao utilizar o Serviço, considera-se que aceitou esta Política de Privacidade. - -## **1. Informações Recolhidas** - -O Serviço recolhe os seguintes tipos de informações: - -### **1-1. Informações de Comandos Publicadas pelos Utilizadores** -O Serviço recolhe informações de comandos publicadas pelos utilizadores (por exemplo, nomes de comandos, URLs, descrições). -Para mais detalhes sobre as definições, consulte os [Termos de Serviço](${HUB_URL}/pt-PT/terms). -*Nota: Estas informações são utilizadas apenas quando os utilizadores publicam ou recuperam dados dentro do Serviço.* - -### **1-2. Dados de Utilização** -O Serviço utiliza o Google Analytics para recolher dados de utilização anonimizados. Estes dados incluem: -- Histórico de interações (por exemplo, transições de página, localizações e contagens de cliques) -- Informações do dispositivo (por exemplo, tipo de navegador, sistema operativo) -- Carimbos de data/hora de acesso -- Endereços IP de origem (processados para anonimização) -- Outros dados estatísticos anonimizados fornecidos pelo Google Analytics - -### **1-3. Recolha de Informações Pessoais** -Como o Serviço não fornece funcionalidades de registo ou início de sessão, não recolhe informações pessoais identificáveis (por exemplo, nomes, endereços de correio eletrónico, moradas físicas). - -## **2. Finalidade da Utilização das Informações** - -As informações recolhidas são utilizadas para os seguintes fins: -1. Analisar e melhorar a utilização do Serviço -2. Fornecer as funcionalidades necessárias para operar o Serviço - -## **3. Gestão das Informações** - -O Serviço gere adequadamente as informações recolhidas para prevenir acessos não autorizados ou violações de dados. Os dados recolhidos através do Google Analytics são geridos de acordo com a [Política de Privacidade do Google](https://www.google.com/analytics/terms/us.html). - -## **4. Fornecimento a Terceiros** - -O Serviço não fornece as informações recolhidas a terceiros, exceto quando exigido por lei. No entanto, os dados recolhidos através do Google Analytics são processados pelo Google. - -## **5. Utilização de Cookies** - -O Serviço utiliza cookies através do Google Analytics. Os cookies são armazenados nos navegadores dos utilizadores e são utilizados para melhorar a funcionalidade e analisar o comportamento dos utilizadores dentro do Serviço. Os utilizadores podem desativar os cookies através das definições do seu navegador; no entanto, algumas funcionalidades podem não funcionar corretamente como resultado. - -## **6. Alterações à Política de Privacidade** - -Esta Política de Privacidade pode ser atualizada conforme necessário. A política revista entrará em vigor após ser publicada nesta página. - -## **7. Informações de Contacto** - -Para questões sobre esta Política de Privacidade, contacte-nos através de: -- [Página de Suporte da Chrome Web Store](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -Em vigor a partir de 01/10/2025 -` -export default msg diff --git a/packages/hub/src/app/[lang]/privacy/ru.ts b/packages/hub/src/app/[lang]/privacy/ru.ts deleted file mode 100644 index b5b655c0..00000000 --- a/packages/hub/src/app/[lang]/privacy/ru.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { HUB_URL } from "@/const" - -const msg = ` -Эта Политика конфиденциальности описывает, как обрабатывается информация пользователей в Selection Command Hub (далее именуемый "Сервис"). Используя Сервис, вы считаетесь согласившимся с настоящей Политикой конфиденциальности. - -## **1. Собираемая информация** - -Сервис собирает следующие типы информации: - -### **1-1. Информация о командах, размещаемая пользователями** -Сервис собирает информацию о командах, размещаемую пользователями (например, названия команд, URL-адреса, описания). -Подробности о настройках см. в [Условиях использования](${HUB_URL}/ru/terms). -*Примечание: Эта информация используется только когда пользователи размещают или получают данные в рамках Сервиса.* - -### **1-2. Данные об использовании** -Сервис использует Google Analytics для сбора анонимизированных данных об использовании. Эти данные включают: -- Историю взаимодействий (например, переходы между страницами, местоположения и количество кликов) -- Информацию об устройстве (например, тип браузера, операционная система) -- Временные метки доступа -- Исходные IP-адреса (обработанные для анонимизации) -- Другие анонимизированные статистические данные, предоставляемые Google Analytics - -### **1-3. Сбор персональной информации** -Поскольку Сервис не предоставляет функции регистрации или входа пользователей, он не собирает никакой персональной информации (например, имена, адреса электронной почты, физические адреса). - -## **2. Цель использования информации** - -Собранная информация используется для следующих целей: -1. Анализ и улучшение использования Сервиса -2. Предоставление необходимых функций для работы Сервиса - -## **3. Управление информацией** - -Сервис надлежащим образом управляет собранной информацией для предотвращения несанкционированного доступа или утечки данных. Данные, собранные через Google Analytics, управляются в соответствии с [Политикой конфиденциальности Google](https://www.google.com/analytics/terms/us.html). - -## **4. Предоставление третьим лицам** - -Сервис не предоставляет собранную информацию третьим лицам, за исключением случаев, когда это требуется по закону. Однако данные, собранные через Google Analytics, обрабатываются Google. - -## **5. Использование файлов cookie** - -Сервис использует файлы cookie через Google Analytics. Файлы cookie хранятся в браузерах пользователей и используются для улучшения функциональности и анализа поведения пользователей в рамках Сервиса. Пользователи могут отключить файлы cookie через настройки своего браузера; однако некоторые функции могут не работать должным образом в результате. - -## **6. Изменения в Политике конфиденциальности** - -Настоящая Политика конфиденциальности может обновляться по мере необходимости. Пересмотренная политика вступает в силу после публикации на этой странице. - -## **7. Контактная информация** - -По вопросам, касающимся настоящей Политики конфиденциальности, обращайтесь к нам через: -- [Страницу поддержки Chrome Web Store](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -Действует с 01.10.2025 -` -export default msg diff --git a/packages/hub/src/app/[lang]/privacy/zh-CN.ts b/packages/hub/src/app/[lang]/privacy/zh-CN.ts deleted file mode 100644 index 8d764c2d..00000000 --- a/packages/hub/src/app/[lang]/privacy/zh-CN.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { HUB_URL } from "@/const" - -const msg = ` -本隐私政策说明了 Selection Command Hub(以下简称"服务")如何处理用户信息。使用本服务即表示您同意本隐私政策。 - -## **1. 收集的信息** - -本服务收集以下类型的信息: - -### **1-1. 用户发布的命令信息** -本服务收集用户发布的命令信息(例如,命令名称、URL、描述)。 -有关设置的详细信息,请参阅[服务条款](${HUB_URL}/zh-CN/terms)。 -*注:此信息仅在用户在服务内发布或检索数据时使用。* - -### **1-2. 使用数据** -本服务使用 Google Analytics 收集匿名使用数据。这些数据包括: -- 交互历史(例如,页面转换、点击位置和次数) -- 设备信息(例如,浏览器类型、操作系统) -- 访问时间戳 -- 源 IP 地址(经过匿名化处理) -- Google Analytics 提供的其他匿名统计数据 - -### **1-3. 个人信息的收集** -由于本服务不提供用户注册或登录功能,因此不会收集任何可识别的个人信息(例如,姓名、电子邮件地址、物理地址)。 - -## **2. 信息使用目的** - -收集的信息用于以下目的: -1. 分析和改进服务的使用 -2. 提供运营服务所需的必要功能 - -## **3. 信息管理** - -本服务适当管理收集的信息,以防止未经授权的访问或数据泄露。通过 Google Analytics 收集的数据按照[Google 隐私政策](https://www.google.com/analytics/terms/us.html)进行管理。 - -## **4. 向第三方提供** - -除非法律要求,否则本服务不会向第三方提供收集的信息。但是,通过 Google Analytics 收集的数据由 Google 处理。 - -## **5. Cookie 的使用** - -本服务通过 Google Analytics 使用 Cookie。Cookie 存储在用户的浏览器中,用于改进功能和分析用户在服务中的行为。用户可以通过浏览器设置禁用 Cookie;但是,某些功能可能因此无法正常工作。 - -## **6. 隐私政策的变更** - -本隐私政策可能会根据需要更新。修订后的政策将在本页面发布后生效。 - -## **7. 联系信息** - -有关本隐私政策的问题,请通过以下方式联系我们: -- [Chrome 网上应用店支持页面](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -自 2025 年 10 月 1 日起生效 -` -export default msg diff --git a/packages/hub/src/app/[lang]/tag/[tag]/page.tsx b/packages/hub/src/app/[lang]/tag/[tag]/page.tsx deleted file mode 100644 index ed85a840..00000000 --- a/packages/hub/src/app/[lang]/tag/[tag]/page.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import Link from "next/link" -import { House, ChevronLeft } from "lucide-react" -import { CommandList } from "@/components/layout/CommandList" -import { CommandShare } from "@/components/CommandShare" -import { cn } from "@/lib/utils" -import { LangProps } from "@/types" -import css from "@/app/page.module.css" -import commonCss from "@/lib/common.module.css" - -import { getTags } from "@/features/tag" - -export function generateStaticParams() { - const tags = getTags() - return tags.map((tag) => ({ tag: tag.name })) -} - -type Props = LangProps & { tag: string } - -export default async function Page({ params }: { params: Promise }) { - const { lang, tag } = await params - const _tag = decodeURI(tag) - return ( -
    -
    -
    - - - - Top - -

    - #{_tag} -

    -
    - -
    - -
    - ) -} diff --git a/packages/hub/src/app/[lang]/terms/de.ts b/packages/hub/src/app/[lang]/terms/de.ts deleted file mode 100644 index 968626aa..00000000 --- a/packages/hub/src/app/[lang]/terms/de.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { HUB_URL } from "@/const" - -const msg = ` -Diese Nutzungsbedingungen (im Folgenden als "Bedingungen" bezeichnet) legen die Bedingungen für die Nutzung des "Selection Command Hub" (im Folgenden als "Dienst" bezeichnet) fest, der vom Betreiber (im Folgenden als "wir" oder "uns" bezeichnet) bereitgestellt wird. Bitte lesen Sie diese Bedingungen sorgfältig durch, bevor Sie den Dienst nutzen. Durch die Nutzung des Dienstes gelten Sie als mit diesen Bedingungen einverstanden. - -## 1. Anwendung -1. Diese Bedingungen gelten für alle Beziehungen zwischen uns und Nutzern bezüglich der Nutzung des Dienstes. -2. Alle von uns separat festgelegten Regeln oder Richtlinien bezüglich des Dienstes bilden einen Teil dieser Bedingungen. - -## 2. Beschreibung des Dienstes -1. Der Dienst bezieht sich auf die Chrome-Erweiterung "Selection Command" und bietet folgende Funktionen: - - Die Möglichkeit für Nutzer, Befehle zu veröffentlichen (im Folgenden als "Veröffentlichte Daten" bezeichnet). - - Die Möglichkeit für Nutzer, von anderen Nutzern veröffentlichte Befehle anzusehen und abzurufen. -2. Veröffentlichte Daten umfassen folgende Informationen: - - Den Titel einer Webseite. - - Die URL einer Webseite. - - Das Symbol einer Webseite. - - Die Beschreibung und Klassifizierung eines Befehls. - - Andere für die Anzeige einer Webseite erforderliche Informationen. -3. Der Dienst erfordert keine Benutzerregistrierung und kann anonym genutzt werden. - -## 3. Verbotene Handlungen -Bei der Nutzung des Dienstes ist es Nutzern untersagt, folgende Aktivitäten durchzuführen: -- Handlungen, die gegen Gesetze oder die öffentliche Ordnung und Moral verstoßen. -- Handlungen, die die Rechte anderer verletzen (z.B. Urheberrechte, Markenrechte, Persönlichkeitsrechte). -- Bereitstellung falscher, ungenauer oder schädlicher Informationen als Veröffentlichte Daten. -- Handlungen, die dem Dienst oder anderen Nutzern Schaden zufügen. -- Alle anderen von uns als unangemessen erachteten Handlungen. - -## 4. Umgang mit veröffentlichten Daten -1. Nutzer sind allein verantwortlich für ihre Veröffentlichten Daten. Sobald Daten veröffentlicht wurden, können sie nicht mehr geändert oder gelöscht werden. Bitte seien Sie daher vorsichtig beim Veröffentlichen von Inhalten. -2. Wir behalten uns das Recht vor, Veröffentlichte Daten bei Bedarf zu löschen oder privat zu machen, sind dazu jedoch nicht verpflichtet. -3. Wenn Dritte Ansprüche auf Rechteverletzung bezüglich Veröffentlichter Daten erheben, können wir solche Daten nach eigenem Ermessen ändern oder löschen. -4. Unbefugte Vervielfältigung, Duplizierung oder Nutzung Veröffentlichter Daten oder eines Teils des Dienstes für andere Zwecke als die Nutzung des Dienstes ist untersagt. - -## 5. Geistige Eigentumsrechte und Nutzungsgenehmigungen -1. Alle geistigen Eigentumsrechte im Zusammenhang mit dem Dienst gehören uns oder den rechtmäßigen Eigentümern. -2. Nutzer behalten das Eigentum an ihren Veröffentlichten Daten, gelten jedoch als Einwilligung zur Nutzung durch andere unter folgenden Umständen: - - Andere Nutzer können Veröffentlichte Daten im Rahmen des Dienstes ansehen, abrufen, nutzen, bearbeiten und weiterverbreiten. - - Wir können Veröffentlichte Daten nach Bedarf für den Betrieb des Dienstes nutzen, veröffentlichen, bearbeiten und verbreiten. - -## 6. Haftungsausschluss -1. Wir garantieren nicht, dass der Dienst bestimmten Zwecken dient, Nutzen bietet oder für Nutzer sicher ist. -2. Wir haften nicht für Schäden oder Streitigkeiten, die sich aus Veröffentlichten Daten oder deren Inhalt ergeben. -3. Wir haften auch nicht für Schäden, die durch Unterbrechungen oder Beendigung des Dienstes entstehen. - -## 7. Datenschutzrichtlinie -1. Der Umgang mit personenbezogenen Daten und Cookies im Zusammenhang mit der Nutzung dieses Dienstes unterliegt der von uns separat festgelegten Datenschutzrichtlinie. -2. Einzelheiten finden Sie auf der folgenden Seite: - - [Datenschutzrichtlinie](${HUB_URL}/de/privacy) - -## 8. Aussetzung und Einschränkungen -1. Wenn ein Nutzer gegen diese Bedingungen verstößt, können wir den Zugriff auf oder die Nutzung des Dienstes ohne vorherige Ankündigung einschränken oder aussetzen. - -## 9. Änderungen und Beendigung -1. Wir behalten uns das Recht vor, diese Bedingungen und/oder den Inhalt des Dienstes ohne vorherige Ankündigung zu ändern oder zu beenden. -2. Die fortgesetzte Nutzung des Dienstes nach Änderungen gilt als Annahme der neuen Bedingungen. - -## 10. Support-Kontakt -Für Anfragen oder Support-Anfragen bezüglich dieses Dienstes kontaktieren Sie uns bitte über: -- [Chrome Web Store Support-Seite](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -## 11. Geltendes Recht und Gerichtsstand -1. Diese Bedingungen unterliegen dem japanischen Recht. -2. Im Falle von Streitigkeiten aus diesen Bedingungen oder dem Dienst liegt die ausschließliche Zuständigkeit bei Gerichten in Japan. - -Gültig ab 01/10/2025 -` -export default msg diff --git a/packages/hub/src/app/[lang]/terms/en.ts b/packages/hub/src/app/[lang]/terms/en.ts deleted file mode 100644 index 1dc239b1..00000000 --- a/packages/hub/src/app/[lang]/terms/en.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { HUB_URL } from "@/const" - -const msg = ` -These Terms of Service (hereinafter referred to as the "Terms") set forth the conditions for using the "Selection Command Hub" (hereinafter referred to as the "Service") provided by Operator (hereinafter referred to as "We" or "Us"). Please read these Terms carefully before using the Service. By using the Service, you are deemed to have agreed to these Terms. - -## 1. Application -1. These Terms apply to all relationships between Us and users regarding the use of the Service. -2. Any rules or guidelines separately established by Us concerning the Service shall constitute a part of these Terms. - -## 2. Description of the Service -1. The Service relates to the Chrome extension "Selection Command" and provides the following functionalities: - - The ability for users to post commands (hereinafter referred to as "Posted Data"). - - The ability for users to view and retrieve commands posted by other users. -2. Posted Data includes the following information: - - The title of a webpage. - - The URL of a webpage. - - The icon of a webpage. - - The description and classification of a command. - - Other information necessary for displaying a webpage. -3. The Service does not require user registration and can be used anonymously. - -## 3. Prohibited Conduct -Users are prohibited from engaging in the following activities when using the Service: -- Acts that violate laws or public order and morals. -- Acts that infringe on the rights of others (e.g., copyrights, trademark rights, privacy rights). -- Providing false, inaccurate, or harmful information as Posted Data. -- Acts that cause damage to the Service or other users. -- Any other acts deemed inappropriate by Us. - -## 4. Handling of Posted Data -1. Users are solely responsible for their Posted Data. Once Posted Data is submitted, it cannot be modified or deleted, so please exercise caution when posting content. -2. We reserve the right to delete or make Posted Data private if necessary but are not obligated to do so. -3. If a third party raises claims of rights infringement regarding Posted Data, We may modify or delete such data at our discretion. -4. Unauthorized reproduction, duplication, or use of Posted Data or any part of the Service for purposes other than using the Service is prohibited. - -## 5. Intellectual Property Rights and Usage Permissions -1. All intellectual property rights related to the Service belong to Us or rightful owners. -2. Users retain ownership of their Posted Data but are deemed to grant permission for others to use it under the following circumstances: - - Other users may view, retrieve, use, edit, and redistribute Posted Data within the scope of the Service. - - We may use, publish, edit, and distribute Posted Data as necessary for operating the Service. - -## 6. Disclaimer -1. We do not guarantee that the Service will meet specific purposes, provide utility, or ensure safety for users. -2. We are not liable for any damages or disputes arising from Posted Data or its content. -3. We are also not liable for damages resulting from interruptions or termination of the Service. - -## 7. Privacy Policy -1. The handling of personal information and cookies related to the use of this service shall be governed by the Privacy Policy separately established by us. -2. For details, please refer to the following page: - - [Privacy Policy](${HUB_URL}/en/privacy) - -## 8. Suspension and Restrictions -1. If a user violates these Terms, We may restrict access to or suspend their use of the Service without prior notice. - -## 9. Changes and Termination -1. We reserve the right to change or terminate these Terms and/or the content of the Service without prior notice. -2. Continued use of the Service after changes have been made constitutes acceptance of the new Terms. - -## 10. Support Contact -For inquiries or support requests related to this Service, please contact us via: -- [Chrome Web Store Support Page](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -## 11. Governing Law and Jurisdiction -1. These Terms shall be governed by Japanese law. -2. In case of disputes arising from these Terms or the Service, exclusive jurisdiction shall lie with courts in Japan. - -Effective as of 01/10/2025 -` -export default msg diff --git a/packages/hub/src/app/[lang]/terms/es.ts b/packages/hub/src/app/[lang]/terms/es.ts deleted file mode 100644 index 857e1956..00000000 --- a/packages/hub/src/app/[lang]/terms/es.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { HUB_URL } from "@/const" - -const msg = ` -Estos Términos de Servicio (en adelante, los "Términos") establecen las condiciones para utilizar el "Selection Command Hub" (en adelante, el "Servicio") proporcionado por el Operador (en adelante, "nosotros" o "nos"). Por favor, lea estos Términos cuidadosamente antes de utilizar el Servicio. Al utilizar el Servicio, se considera que ha aceptado estos Términos. - -## 1. Aplicación -1. Estos Términos se aplican a todas las relaciones entre nosotros y los usuarios con respecto al uso del Servicio. -2. Cualquier regla o directriz establecida por nosotros por separado con respecto al Servicio constituirá parte de estos Términos. - -## 2. Descripción del Servicio -1. El Servicio está relacionado con la extensión de Chrome "Selection Command" y proporciona las siguientes funcionalidades: - - La capacidad para que los usuarios publiquen comandos (en adelante, "Datos Publicados"). - - La capacidad para que los usuarios vean y recuperen comandos publicados por otros usuarios. -2. Los Datos Publicados incluyen la siguiente información: - - El título de una página web. - - La URL de una página web. - - El icono de una página web. - - La descripción y clasificación de un comando. - - Otra información necesaria para mostrar una página web. -3. El Servicio no requiere registro de usuario y puede utilizarse de forma anónima. - -## 3. Conductas Prohibidas -Los usuarios tienen prohibido realizar las siguientes actividades al utilizar el Servicio: -- Actos que violen las leyes o el orden público y la moral. -- Actos que infrinjan los derechos de otros (por ejemplo, derechos de autor, marcas registradas, derechos de privacidad). -- Proporcionar información falsa, inexacta o dañina como Datos Publicados. -- Actos que causen daño al Servicio o a otros usuarios. -- Cualquier otro acto que consideremos inapropiado. - -## 4. Manejo de Datos Publicados -1. Los usuarios son los únicos responsables de sus Datos Publicados. Una vez que los Datos Publicados se envían, no pueden modificarse ni eliminarse, por lo que tenga cuidado al publicar contenido. -2. Nos reservamos el derecho de eliminar o hacer privados los Datos Publicados si es necesario, pero no estamos obligados a hacerlo. -3. Si un tercero presenta reclamos de infracción de derechos con respecto a los Datos Publicados, podemos modificar o eliminar dichos datos a nuestra discreción. -4. Se prohíbe la reproducción, duplicación o uso no autorizado de los Datos Publicados o cualquier parte del Servicio para fines distintos al uso del Servicio. - -## 5. Derechos de Propiedad Intelectual y Permisos de Uso -1. Todos los derechos de propiedad intelectual relacionados con el Servicio pertenecen a nosotros o a los propietarios legítimos. -2. Los usuarios conservan la propiedad de sus Datos Publicados, pero se considera que otorgan permiso para su uso por otros en las siguientes circunstancias: - - Otros usuarios pueden ver, recuperar, usar, editar y redistribuir los Datos Publicados dentro del alcance del Servicio. - - Podemos usar, publicar, editar y distribuir los Datos Publicados según sea necesario para operar el Servicio. - -## 6. Descargo de Responsabilidad -1. No garantizamos que el Servicio cumpla con propósitos específicos, proporcione utilidad o asegure la seguridad para los usuarios. -2. No somos responsables por daños o disputas que surjan de los Datos Publicados o su contenido. -3. Tampoco somos responsables por daños resultantes de interrupciones o terminación del Servicio. - -## 7. Política de Privacidad -1. El manejo de información personal y cookies relacionadas con el uso de este servicio se regirá por la Política de Privacidad establecida por nosotros por separado. -2. Para más detalles, consulte la siguiente página: - - [Política de Privacidad](${HUB_URL}/es/privacy) - -## 8. Suspensión y Restricciones -1. Si un usuario viola estos Términos, podemos restringir el acceso o suspender su uso del Servicio sin previo aviso. - -## 9. Cambios y Terminación -1. Nos reservamos el derecho de cambiar o terminar estos Términos y/o el contenido del Servicio sin previo aviso. -2. El uso continuado del Servicio después de que se hayan realizado cambios constituye la aceptación de los nuevos Términos. - -## 10. Contacto de Soporte -Para consultas o solicitudes de soporte relacionadas con este Servicio, contáctenos a través de: -- [Página de Soporte de Chrome Web Store](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -## 11. Ley Aplicable y Jurisdicción -1. Estos Términos se regirán por la ley japonesa. -2. En caso de disputas que surjan de estos Términos o del Servicio, la jurisdicción exclusiva corresponderá a los tribunales de Japón. - -Efectivo a partir del 01/10/2025 -` -export default msg diff --git a/packages/hub/src/app/[lang]/terms/fr.ts b/packages/hub/src/app/[lang]/terms/fr.ts deleted file mode 100644 index 0d1bb0dd..00000000 --- a/packages/hub/src/app/[lang]/terms/fr.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { HUB_URL } from "@/const" - -const msg = ` -Ces Conditions d'Utilisation (ci-après dénommées les "Conditions") établissent les conditions d'utilisation du "Selection Command Hub" (ci-après dénommé le "Service") fourni par l'Opérateur (ci-après dénommé "nous"). Veuillez lire attentivement ces Conditions avant d'utiliser le Service. En utilisant le Service, vous êtes réputé avoir accepté ces Conditions. - -## 1. Application -1. Ces Conditions s'appliquent à toutes les relations entre nous et les utilisateurs concernant l'utilisation du Service. -2. Toute règle ou directive établie séparément par nous concernant le Service constituera une partie de ces Conditions. - -## 2. Description du Service -1. Le Service est lié à l'extension Chrome "Selection Command" et fournit les fonctionnalités suivantes : - - La possibilité pour les utilisateurs de publier des commandes (ci-après dénommées "Données Publiées"). - - La possibilité pour les utilisateurs de consulter et de récupérer les commandes publiées par d'autres utilisateurs. -2. Les Données Publiées comprennent les informations suivantes : - - Le titre d'une page web. - - L'URL d'une page web. - - L'icône d'une page web. - - La description et la classification d'une commande. - - Autres informations nécessaires à l'affichage d'une page web. -3. Le Service ne nécessite pas d'inscription d'utilisateur et peut être utilisé de manière anonyme. - -## 3. Conduites Interdites -Les utilisateurs sont interdits de s'engager dans les activités suivantes lors de l'utilisation du Service : -- Actes qui violent les lois ou l'ordre public et les bonnes mœurs. -- Actes qui portent atteinte aux droits d'autrui (par exemple, droits d'auteur, marques déposées, droits à la vie privée). -- Fourniture d'informations fausses, inexactes ou nuisibles comme Données Publiées. -- Actes qui causent des dommages au Service ou à d'autres utilisateurs. -- Tout autre acte jugé inapproprié par nous. - -## 4. Gestion des Données Publiées -1. Les utilisateurs sont seuls responsables de leurs Données Publiées. Une fois que les Données Publiées sont soumises, elles ne peuvent pas être modifiées ou supprimées, veuillez donc faire preuve de prudence lors de la publication de contenu. -2. Nous nous réservons le droit de supprimer ou de rendre privées les Données Publiées si nécessaire, mais n'y sommes pas obligés. -3. Si un tiers présente des réclamations pour violation de droits concernant les Données Publiées, nous pouvons modifier ou supprimer ces données à notre discrétion. -4. La reproduction, la duplication ou l'utilisation non autorisée des Données Publiées ou d'une partie du Service à des fins autres que l'utilisation du Service est interdite. - -## 5. Droits de Propriété Intellectuelle et Permissions d'Utilisation -1. Tous les droits de propriété intellectuelle liés au Service appartiennent à nous ou aux propriétaires légitimes. -2. Les utilisateurs conservent la propriété de leurs Données Publiées mais sont réputés accorder la permission pour leur utilisation par d'autres dans les circonstances suivantes : - - D'autres utilisateurs peuvent consulter, récupérer, utiliser, modifier et redistribuer les Données Publiées dans le cadre du Service. - - Nous pouvons utiliser, publier, modifier et distribuer les Données Publiées selon les besoins pour exploiter le Service. - -## 6. Clause de Non-Responsabilité -1. Nous ne garantissons pas que le Service répondra à des fins spécifiques, fournira une utilité ou assurera la sécurité pour les utilisateurs. -2. Nous ne sommes pas responsables des dommages ou des litiges découlant des Données Publiées ou de leur contenu. -3. Nous ne sommes pas non plus responsables des dommages résultant d'interruptions ou de la résiliation du Service. - -## 7. Politique de Confidentialité -1. Le traitement des informations personnelles et des cookies liés à l'utilisation de ce service sera régi par la Politique de Confidentialité établie séparément par nous. -2. Pour plus de détails, veuillez consulter la page suivante : - - [Politique de Confidentialité](${HUB_URL}/fr/privacy) - -## 8. Suspension et Restrictions -1. Si un utilisateur viole ces Conditions, nous pouvons restreindre l'accès ou suspendre son utilisation du Service sans préavis. - -## 9. Modifications et Résiliation -1. Nous nous réservons le droit de modifier ou de résilier ces Conditions et/ou le contenu du Service sans préavis. -2. L'utilisation continue du Service après que des modifications ont été apportées constitue l'acceptation des nouvelles Conditions. - -## 10. Contact Support -Pour les demandes de renseignements ou les demandes de support concernant ce Service, veuillez nous contacter via : -- [Page de Support du Chrome Web Store](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -## 11. Loi Applicable et Juridiction -1. Ces Conditions seront régies par la loi japonaise. -2. En cas de litiges découlant de ces Conditions ou du Service, la juridiction exclusive sera celle des tribunaux du Japon. - -En vigueur à partir du 01/10/2025 -` -export default msg diff --git a/packages/hub/src/app/[lang]/terms/hi.ts b/packages/hub/src/app/[lang]/terms/hi.ts deleted file mode 100644 index 3eab2bf1..00000000 --- a/packages/hub/src/app/[lang]/terms/hi.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { HUB_URL } from "@/const" - -const msg = ` -ये सेवा की शर्तें (इसके बाद "शर्तें" कहा जाएगा) "Selection Command Hub" (इसके बाद "सेवा" कहा जाएगा) का उपयोग करने की शर्तें निर्धारित करती हैं, जो ऑपरेटर (इसके बाद "हम" या "हमारा" कहा जाएगा) द्वारा प्रदान की जाती है। कृपया सेवा का उपयोग करने से पहले इन शर्तों को ध्यान से पढ़ें। सेवा का उपयोग करके, आप इन शर्तों से सहमत माने जाएंगे। - -## 1. अनुप्रयोग -1. ये शर्तें हमारे और उपयोगकर्ताओं के बीच सेवा के उपयोग के संबंध में सभी संबंधों पर लागू होती हैं। -2. सेवा के संबंध में हमारे द्वारा अलग से स्थापित कोई भी नियम या दिशानिर्देश इन शर्तों का एक हिस्सा बनेंगे। - -## 2. सेवा का विवरण -1. सेवा Chrome एक्सटेंशन "Selection Command" से संबंधित है और निम्नलिखित कार्यक्षमताएं प्रदान करती है: - - उपयोगकर्ताओं के लिए कमांड पोस्ट करने की क्षमता (इसके बाद "पोस्ट किया गया डेटा" कहा जाएगा)। - - उपयोगकर्ताओं के लिए अन्य उपयोगकर्ताओं द्वारा पोस्ट किए गए कमांड देखने और प्राप्त करने की क्षमता। -2. पोस्ट किया गया डेटा निम्नलिखित जानकारी शामिल करता है: - - वेबपेज का शीर्षक। - - वेबपेज का URL। - - वेबपेज का आइकन। - - कमांड का विवरण और वर्गीकरण। - - वेबपेज प्रदर्शित करने के लिए आवश्यक अन्य जानकारी। -3. सेवा के लिए उपयोगकर्ता पंजीकरण की आवश्यकता नहीं है और इसे बेनामी रूप से उपयोग किया जा सकता है। - -## 3. निषिद्ध आचरण -सेवा का उपयोग करते समय उपयोगकर्ताओं को निम्नलिखित गतिविधियों में संलग्न होने से प्रतिबंधित किया गया है: -- कानूनों या सार्वजनिक व्यवस्था और नैतिकता का उल्लंघन करने वाले कार्य। -- दूसरों के अधिकारों का उल्लंघन करने वाले कार्य (जैसे, कॉपीराइट, ट्रेडमार्क अधिकार, गोपनीयता अधिकार)। -- पोस्ट किए गए डेटा के रूप में गलत, अशुद्ध या हानिकारक जानकारी प्रदान करना। -- सेवा या अन्य उपयोगकर्ताओं को नुकसान पहुंचाने वाले कार्य। -- हमारे द्वारा अनुचित माने जाने वाले कोई अन्य कार्य। - -## 4. पोस्ट किए गए डेटा का प्रबंधन -1. उपयोगकर्ता अपने पोस्ट किए गए डेटा के लिए पूरी तरह से जिम्मेदार हैं। एक बार पोस्ट किया गया डेटा सबमिट होने के बाद, इसे संशोधित या हटाया नहीं जा सकता, इसलिए कृपया सामग्री पोस्ट करते समय सावधानी बरतें। -2. हम आवश्यकतानुसार पोस्ट किए गए डेटा को हटाने या निजी बनाने का अधिकार सुरक्षित रखते हैं, लेकिन ऐसा करने के लिए बाध्य नहीं हैं। -3. यदि कोई तृतीय पक्ष पोस्ट किए गए डेटा के संबंध में अधिकारों के उल्लंघन का दावा करता है, तो हम अपने विवेक पर ऐसे डेटा को संशोधित या हटा सकते हैं। -4. पोस्ट किए गए डेटा या सेवा के किसी भी हिस्से का अनधिकृत प्रजनन, प्रतिलिपि या सेवा के उपयोग के अलावा अन्य उद्देश्यों के लिए उपयोग निषिद्ध है। - -## 5. बौद्धिक संपदा अधिकार और उपयोग अनुमतियां -1. सेवा से संबंधित सभी बौद्धिक संपदा अधिकार हमारे या वैध मालिकों के हैं। -2. उपयोगकर्ता अपने पोस्ट किए गए डेटा का स्वामित्व बनाए रखते हैं, लेकिन निम्नलिखित परिस्थितियों में दूसरों द्वारा उपयोग के लिए अनुमति देने के लिए माने जाते हैं: - - अन्य उपयोगकर्ता सेवा के दायरे के भीतर पोस्ट किए गए डेटा को देख, प्राप्त, उपयोग, संपादित और पुनर्वितरित कर सकते हैं। - - हम सेवा के संचालन के लिए आवश्यकतानुसार पोस्ट किए गए डेटा का उपयोग, प्रकाशन, संपादन और वितरण कर सकते हैं। - -## 6. अस्वीकरण -1. हम यह गारंटी नहीं देते कि सेवा विशिष्ट उद्देश्यों को पूरा करेगी, उपयोगिता प्रदान करेगी या उपयोगकर्ताओं के लिए सुरक्षा सुनिश्चित करेगी। -2. हम पोस्ट किए गए डेटा या उसकी सामग्री से उत्पन्न होने वाले किसी भी नुकसान या विवाद के लिए उत्तरदायी नहीं हैं। -3. हम सेवा के व्यवधान या समाप्ति के परिणामस्वरूप होने वाले नुकसान के लिए भी उत्तरदायी नहीं हैं। - -## 7. गोपनीयता नीति -1. इस सेवा के उपयोग से संबंधित व्यक्तिगत जानकारी और कुकीज़ का प्रबंधन हमारे द्वारा अलग से स्थापित गोपनीयता नीति द्वारा नियंत्रित किया जाएगा। -2. विवरण के लिए, कृपया निम्नलिखित पृष्ठ देखें: - - [गोपनीयता नीति](${HUB_URL}/hi/privacy) - -## 8. निलंबन और प्रतिबंध -1. यदि कोई उपयोगकर्ता इन शर्तों का उल्लंघन करता है, तो हम बिना पूर्व सूचना के सेवा तक उनकी पहुंच को प्रतिबंधित या निलंबित कर सकते हैं। - -## 9. परिवर्तन और समाप्ति -1. हम बिना पूर्व सूचना के इन शर्तों और/या सेवा की सामग्री को बदलने या समाप्त करने का अधिकार सुरक्षित रखते हैं। -2. परिवर्तन किए जाने के बाद सेवा का निरंतर उपयोग नई शर्तों की स्वीकृति का गठन करता है। - -## 10. सहायता संपर्क -इस सेवा से संबंधित पूछताछ या सहायता अनुरोधों के लिए, कृपया हमसे संपर्क करें: -- [Chrome Web Store सहायता पृष्ठ](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -## 11. लागू कानून और अधिकार क्षेत्र -1. ये शर्तें जापानी कानून द्वारा शासित होंगी। -2. इन शर्तों या सेवा से उत्पन्न होने वाले विवादों के मामले में, विशेष अधिकार क्षेत्र जापान के न्यायालयों में होगा। - -01/10/2025 से प्रभावी -` -export default msg diff --git a/packages/hub/src/app/[lang]/terms/id.ts b/packages/hub/src/app/[lang]/terms/id.ts deleted file mode 100644 index 4ddc8f8d..00000000 --- a/packages/hub/src/app/[lang]/terms/id.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { HUB_URL } from "@/const" - -const msg = ` -Ketentuan Layanan ini (selanjutnya disebut "Ketentuan") menetapkan kondisi untuk menggunakan "Selection Command Hub" (selanjutnya disebut "Layanan") yang disediakan oleh Operator (selanjutnya disebut "kami"). Harap baca Ketentuan ini dengan seksama sebelum menggunakan Layanan. Dengan menggunakan Layanan, Anda dianggap telah menyetujui Ketentuan ini. - -## 1. Penerapan -1. Ketentuan ini berlaku untuk semua hubungan antara kami dan pengguna terkait penggunaan Layanan. -2. Setiap aturan atau pedoman yang ditetapkan secara terpisah oleh kami terkait Layanan akan menjadi bagian dari Ketentuan ini. - -## 2. Deskripsi Layanan -1. Layanan terkait dengan ekstensi Chrome "Selection Command" dan menyediakan fungsionalitas berikut: - - Kemampuan bagi pengguna untuk memposting perintah (selanjutnya disebut "Data yang Diposting"). - - Kemampuan bagi pengguna untuk melihat dan mengambil perintah yang diposting oleh pengguna lain. -2. Data yang Diposting mencakup informasi berikut: - - Judul halaman web. - - URL halaman web. - - Ikon halaman web. - - Deskripsi dan klasifikasi perintah. - - Informasi lain yang diperlukan untuk menampilkan halaman web. -3. Layanan tidak memerlukan pendaftaran pengguna dan dapat digunakan secara anonim. - -## 3. Perilaku yang Dilarang -Pengguna dilarang melakukan aktivitas berikut saat menggunakan Layanan: -- Tindakan yang melanggar hukum atau ketertiban umum dan moral. -- Tindakan yang melanggar hak orang lain (misalnya, hak cipta, merek dagang, hak privasi). -- Memberikan informasi palsu, tidak akurat, atau berbahaya sebagai Data yang Diposting. -- Tindakan yang menyebabkan kerusakan pada Layanan atau pengguna lain. -- Tindakan lain yang kami anggap tidak pantas. - -## 4. Penanganan Data yang Diposting -1. Pengguna sepenuhnya bertanggung jawab atas Data yang Diposting mereka. Setelah Data yang Diposting dikirimkan, tidak dapat diubah atau dihapus, jadi harap berhati-hati saat memposting konten. -2. Kami berhak untuk menghapus atau membuat Data yang Diposting menjadi pribadi jika diperlukan, tetapi tidak berkewajiban untuk melakukannya. -3. Jika pihak ketiga mengajukan klaim pelanggaran hak terkait Data yang Diposting, kami dapat memodifikasi atau menghapus data tersebut atas kebijaksanaan kami. -4. Reproduksi, duplikasi, atau penggunaan Data yang Diposting atau bagian dari Layanan yang tidak sah untuk tujuan selain menggunakan Layanan dilarang. - -## 5. Hak Kekayaan Intelektual dan Izin Penggunaan -1. Semua hak kekayaan intelektual terkait Layanan adalah milik kami atau pemilik yang sah. -2. Pengguna mempertahankan kepemilikan Data yang Diposting mereka tetapi dianggap memberikan izin untuk digunakan oleh pihak lain dalam keadaan berikut: - - Pengguna lain dapat melihat, mengambil, menggunakan, mengedit, dan mendistribusikan kembali Data yang Diposting dalam lingkup Layanan. - - Kami dapat menggunakan, mempublikasikan, mengedit, dan mendistribusikan Data yang Diposting sesuai kebutuhan untuk mengoperasikan Layanan. - -## 6. Penafian -1. Kami tidak menjamin bahwa Layanan akan memenuhi tujuan tertentu, memberikan kegunaan, atau memastikan keamanan bagi pengguna. -2. Kami tidak bertanggung jawab atas kerusakan atau sengketa yang timbul dari Data yang Diposting atau isinya. -3. Kami juga tidak bertanggung jawab atas kerusakan yang diakibatkan oleh gangguan atau penghentian Layanan. - -## 7. Kebijakan Privasi -1. Penanganan informasi pribadi dan cookie terkait penggunaan layanan ini akan diatur oleh Kebijakan Privasi yang ditetapkan secara terpisah oleh kami. -2. Untuk detailnya, silakan lihat halaman berikut: - - [Kebijakan Privasi](${HUB_URL}/id/privacy) - -## 8. Penangguhan dan Pembatasan -1. Jika pengguna melanggar Ketentuan ini, kami dapat membatasi akses atau menangguhkan penggunaan Layanan mereka tanpa pemberitahuan sebelumnya. - -## 9. Perubahan dan Pengakhiran -1. Kami berhak untuk mengubah atau mengakhiri Ketentuan ini dan/atau konten Layanan tanpa pemberitahuan sebelumnya. -2. Penggunaan Layanan yang berkelanjutan setelah perubahan dilakukan dianggap sebagai penerimaan Ketentuan baru. - -## 10. Kontak Dukungan -Untuk pertanyaan atau permintaan dukungan terkait Layanan ini, silakan hubungi kami melalui: -- [Halaman Dukungan Chrome Web Store](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -## 11. Hukum yang Berlaku dan Yurisdiksi -1. Ketentuan ini akan diatur oleh hukum Jepang. -2. Dalam hal sengketa yang timbul dari Ketentuan ini atau Layanan, yurisdiksi eksklusif akan berada di pengadilan Jepang. - -Berlaku mulai 01/10/2025 -` -export default msg diff --git a/packages/hub/src/app/[lang]/terms/it.ts b/packages/hub/src/app/[lang]/terms/it.ts deleted file mode 100644 index ef97ac04..00000000 --- a/packages/hub/src/app/[lang]/terms/it.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { HUB_URL } from "@/const" - -const msg = ` -Questi Termini di Servizio (di seguito "Termini") stabiliscono le condizioni per l'utilizzo dell'"Selection Command Hub" (di seguito "Servizio") fornito dall'Operatore (di seguito "noi"). Si prega di leggere attentamente questi Termini prima di utilizzare il Servizio. Utilizzando il Servizio, si considera che abbiate accettato questi Termini. - -## 1. Applicazione -1. Questi Termini si applicano a tutte le relazioni tra noi e gli utenti riguardo all'utilizzo del Servizio. -2. Qualsiasi regola o linea guida stabilita separatamente da noi riguardo al Servizio costituirà parte di questi Termini. - -## 2. Descrizione del Servizio -1. Il Servizio è relativo all'estensione Chrome "Selection Command" e fornisce le seguenti funzionalità: - - La possibilità per gli utenti di pubblicare comandi (di seguito "Dati Pubblicati"). - - La possibilità per gli utenti di visualizzare e recuperare comandi pubblicati da altri utenti. -2. I Dati Pubblicati includono le seguenti informazioni: - - Il titolo di una pagina web. - - L'URL di una pagina web. - - L'icona di una pagina web. - - La descrizione e la classificazione di un comando. - - Altre informazioni necessarie per visualizzare una pagina web. -3. Il Servizio non richiede registrazione utente e può essere utilizzato in modo anonimo. - -## 3. Condotte Vietate -Gli utenti sono vietati di impegnarsi nelle seguenti attività durante l'utilizzo del Servizio: -- Atti che violano le leggi o l'ordine pubblico e la morale. -- Atti che violano i diritti di altri (ad esempio, diritti d'autore, marchi registrati, diritti alla privacy). -- Fornire informazioni false, inaccurate o dannose come Dati Pubblicati. -- Atti che causano danni al Servizio o ad altri utenti. -- Qualsiasi altro atto che riteniamo inappropriato. - -## 4. Gestione dei Dati Pubblicati -1. Gli utenti sono i soli responsabili dei loro Dati Pubblicati. Una volta che i Dati Pubblicati sono stati inviati, non possono essere modificati o eliminati, quindi si prega di prestare attenzione quando si pubblica contenuto. -2. Ci riserviamo il diritto di eliminare o rendere privati i Dati Pubblicati se necessario, ma non siamo obbligati a farlo. -3. Se una terza parte presenta reclami per violazione dei diritti riguardo ai Dati Pubblicati, possiamo modificare o eliminare tali dati a nostra discrezione. -4. È vietata la riproduzione, duplicazione o utilizzo non autorizzato dei Dati Pubblicati o di qualsiasi parte del Servizio per scopi diversi dall'utilizzo del Servizio. - -## 5. Diritti di Proprietà Intellettuale e Permessi di Utilizzo -1. Tutti i diritti di proprietà intellettuale relativi al Servizio appartengono a noi o ai legittimi proprietari. -2. Gli utenti mantengono la proprietà dei loro Dati Pubblicati ma si considerano aver concesso il permesso per l'utilizzo da parte di altri nelle seguenti circostanze: - - Altri utenti possono visualizzare, recuperare, utilizzare, modificare e ridistribuire i Dati Pubblicati nell'ambito del Servizio. - - Possiamo utilizzare, pubblicare, modificare e distribuire i Dati Pubblicati secondo necessità per operare il Servizio. - -## 6. Esclusione di Responsabilità -1. Non garantiamo che il Servizio soddisfi scopi specifici, fornisca utilità o assicuri sicurezza per gli utenti. -2. Non siamo responsabili per danni o controversie derivanti dai Dati Pubblicati o dal loro contenuto. -3. Non siamo inoltre responsabili per danni derivanti da interruzioni o terminazione del Servizio. - -## 7. Informativa sulla Privacy -1. Il trattamento delle informazioni personali e dei cookie relativi all'utilizzo di questo servizio sarà regolato dall'Informativa sulla Privacy stabilita separatamente da noi. -2. Per i dettagli, si prega di consultare la seguente pagina: - - [Informativa sulla Privacy](${HUB_URL}/it/privacy) - -## 8. Sospensione e Restrizioni -1. Se un utente viola questi Termini, possiamo limitare l'accesso o sospendere l'utilizzo del Servizio senza preavviso. - -## 9. Modifiche e Terminazione -1. Ci riserviamo il diritto di modificare o terminare questi Termini e/o il contenuto del Servizio senza preavviso. -2. L'utilizzo continuato del Servizio dopo che sono state apportate modifiche costituisce accettazione dei nuovi Termini. - -## 10. Contatto Supporto -Per domande o richieste di supporto relative a questo Servizio, si prega di contattarci tramite: -- [Pagina di Supporto Chrome Web Store](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -## 11. Legge Applicabile e Giurisdizione -1. Questi Termini saranno regolati dalla legge giapponese. -2. In caso di controversie derivanti da questi Termini o dal Servizio, la giurisdizione esclusiva sarà dei tribunali giapponesi. - -Efficace dal 01/10/2025 -` -export default msg diff --git a/packages/hub/src/app/[lang]/terms/ja.ts b/packages/hub/src/app/[lang]/terms/ja.ts deleted file mode 100644 index 833c4f83..00000000 --- a/packages/hub/src/app/[lang]/terms/ja.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { HUB_URL } from "@/const" - -const msg = ` -この利用規約(以下、「本規約」といいます。)は、運営者(以下、「当方」といいます。)が提供する「Selection Command Hub」(以下、「本サービス」といいます。)の利用条件を定めるものです。本サービスをご利用いただく前に、本規約をよくお読みください。本サービスをご利用いただくことで、本規約に同意したものとみなされます。 - -## 第1条 適用 -1. 本規約は、本サービスの利用に関する当方とユーザーとの間の一切の関係に適用されます。 -2. 当方が本サービスに関して別途定めるルールやガイドライン等は、本規約の一部を構成するものとします。 - -## 第2条 サービス内容 -1. 本サービスは、Chrome拡張機能「Selection Command」に関連し、以下の機能を提供します。 - - ユーザーがコマンド(以下、「投稿データ」といいます。)を投稿する機能 - - 他のユーザーが投稿したコマンドを閲覧・取得する機能 -2. 投稿データには以下の情報が含まれます。 - - Webページのタイトル - - WebページのURL - - Webページのアイコン - - コマンドの説明、分類 - - その他、Webページを表示するための設定値 -3. 本サービスはユーザー登録を必要とせず、匿名で利用できます。 - -## 第3条 禁止事項 -ユーザーは、本サービスの利用にあたり、以下の行為をしてはなりません。 -- 法令または公序良俗に違反する行為 -- 他人の権利(著作権、商標権、プライバシー権など)を侵害する行為 -- 投稿データとして虚偽、不正確、有害な情報を提供する行為 -- 本サービスおよび他ユーザーに損害を与える行為 -- その他、当方が不適切と判断する行為 - -## 第4条 投稿データの取り扱い -1. 投稿データはユーザー自身が責任を持って投稿してください。一度投稿されたデータは修正・削除できませんので、投稿内容には十分注意してください。 -2. 当方は、必要に応じて投稿データを削除または非公開化できるものとします。ただし、その義務を負うものではありません。 -3. 投稿データについて第三者から権利侵害等の主張があった場合、当方によって修正・削除する場合があります。 -4. 本サービスおよびその投稿データについて、本サービス利用以外の目的で無断転載、複製、使用することは禁止します。 - -## 第5条 知的財産権および利用許諾 -1. 本サービスおよび関連するすべての知的財産権は当方または正当な権利者に帰属します。 -2. ユーザーが投稿したデータについて、その権利はユーザー自身に帰属します。ただし以下の場合には他者による利用を許諾したものとみなされます。 - - 他のユーザーが本サービス内で投稿データを閲覧・取得し、それらを自由に使用・編集・再配布すること - - 当方が本サービス運営上必要な範囲で投稿データを使用・公開・編集・配布すること - -## 第6条 免責事項 -1. 当方は、本サービスがユーザーの特定目的に適合すること、有用性、安全性などについて一切保証しません。 -2. 投稿データによって生じた損害やトラブルについて、当方は一切責任を負いません。また、その内容についても責任を負いません。 -3. 本サービスの提供中断や終了によって生じた損害についても同様です。 - -## 第7条 プライバシーポリシー -1. 本サービスの利用に関する個人情報やCookieの取り扱いについては、当方が別途定めるプライバシーポリシーに従うものとします。 -2. プライバシーポリシーの詳細は、以下のページをご参照ください。 - - [プライバシーポリシー](${HUB_URL}/ja/privacy) - -## 第8条 利用停止および制限 -1. 当方は、ユーザーが本規約に違反した場合、事前通知なく本サービスへのアクセス制限や利用停止措置を講じることがあります。 - -## 第9条 変更および終了 -1. 当方は、本規約および本サービス内容を事前通知なく変更または終了できるものとします。 -2. 変更後も本サービスをご利用いただいた場合、新しい規約に同意したものとみなします。 - -## 第10条 サポート窓口 -本サービスに関するお問い合わせやサポート依頼については、以下より受け付けています。 -- [Chrome Web Store サポートページ](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -## 第11条 準拠法および裁判管轄 -1. 本規約は、日本法に準拠します。 -2. 本規約または本サービスに関して紛争が生じた場合、日本国内の裁判所を専属的合意管轄とします。 - -発行日:2025/01/10 -` -export default msg diff --git a/packages/hub/src/app/[lang]/terms/ko.ts b/packages/hub/src/app/[lang]/terms/ko.ts deleted file mode 100644 index db24fe73..00000000 --- a/packages/hub/src/app/[lang]/terms/ko.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { HUB_URL } from "@/const" - -const msg = ` -이 서비스 약관(이하 "약관")은 운영자(이하 "당사")가 제공하는 "Selection Command Hub"(이하 "서비스")를 이용하기 위한 조건을 규정합니다. 서비스를 이용하기 전에 이 약관을 주의 깊게 읽어주시기 바랍니다. 서비스를 이용함으로써 귀하는 이 약관에 동의한 것으로 간주됩니다. - -## 1. 적용 -1. 이 약관은 서비스 이용과 관련하여 당사와 이용자 간의 모든 관계에 적용됩니다. -2. 당사가 서비스에 관하여 별도로 정한 규칙이나 지침은 이 약관의 일부를 구성합니다. - -## 2. 서비스 설명 -1. 서비스는 Chrome 확장 프로그램 "Selection Command"와 관련하여 다음과 같은 기능을 제공합니다: - - 이용자가 명령을 게시할 수 있는 기능(이하 "게시된 데이터"). - - 이용자가 다른 이용자가 게시한 명령을 보고 검색할 수 있는 기능. -2. 게시된 데이터는 다음 정보를 포함합니다: - - 웹페이지의 제목. - - 웹페이지의 URL. - - 웹페이지의 아이콘. - - 명령의 설명 및 분류. - - 웹페이지 표시에 필요한 기타 정보. -3. 서비스는 이용자 등록이 필요하지 않으며 익명으로 이용할 수 있습니다. - -## 3. 금지된 행위 -이용자는 서비스 이용 시 다음 활동을 금지합니다: -- 법률 또는 공공질서와 선량한 풍속을 위반하는 행위. -- 타인의 권리를 침해하는 행위(예: 저작권, 상표권, 프라이버시권). -- 게시된 데이터로 허위, 부정확 또는 유해한 정보를 제공하는 행위. -- 서비스나 다른 이용자에게 피해를 주는 행위. -- 당사가 부적절하다고 판단하는 기타 행위. - -## 4. 게시된 데이터 처리 -1. 이용자는 자신의 게시된 데이터에 대해 전적으로 책임을 집니다. 게시된 데이터가 제출되면 수정하거나 삭제할 수 없으므로, 콘텐츠를 게시할 때 주의하시기 바랍니다. -2. 당사는 필요한 경우 게시된 데이터를 삭제하거나 비공개로 설정할 권리를 보유하지만, 그렇게 할 의무는 없습니다. -3. 제3자가 게시된 데이터에 대해 권리 침해 주장을 제기하는 경우, 당사는 재량에 따라 해당 데이터를 수정하거나 삭제할 수 있습니다. -4. 게시된 데이터나 서비스의 일부를 서비스 이용 외의 목적으로 무단 복제, 복제 또는 사용하는 것은 금지됩니다. - -## 5. 지적재산권 및 사용 허가 -1. 서비스와 관련된 모든 지적재산권은 당사 또는 적법한 소유자에게 귀속됩니다. -2. 이용자는 자신의 게시된 데이터의 소유권을 유지하지만, 다음 상황에서 다른 사람의 사용을 허가한 것으로 간주됩니다: - - 다른 이용자는 서비스 범위 내에서 게시된 데이터를 보고, 검색, 사용, 편집 및 재배포할 수 있습니다. - - 당사는 서비스 운영에 필요한 범위 내에서 게시된 데이터를 사용, 게시, 편집 및 배포할 수 있습니다. - -## 6. 면책조항 -1. 당사는 서비스가 특정 목적을 달성하거나, 유용성을 제공하거나, 이용자에게 안전을 보장한다는 것을 보증하지 않습니다. -2. 당사는 게시된 데이터나 그 내용으로 인해 발생하는 손해나 분쟁에 대해 책임을 지지 않습니다. -3. 당사는 서비스 중단이나 종료로 인한 손해에 대해서도 책임을 지지 않습니다. - -## 7. 개인정보 처리방침 -1. 이 서비스 이용과 관련된 개인정보 및 쿠키 처리에 대해서는 당사가 별도로 정한 개인정보 처리방침이 적용됩니다. -2. 자세한 내용은 다음 페이지를 참조하시기 바랍니다: - - [개인정보 처리방침](${HUB_URL}/ko/privacy) - -## 8. 중단 및 제한 -1. 이용자가 이 약관을 위반하는 경우, 당사는 사전 통지 없이 서비스 이용을 제한하거나 중단할 수 있습니다. - -## 9. 변경 및 종료 -1. 당사는 사전 통지 없이 이 약관 및/또는 서비스 내용을 변경하거나 종료할 권리를 보유합니다. -2. 변경 사항이 적용된 후에도 서비스를 계속 이용하는 것은 새로운 약관에 동의한 것으로 간주됩니다. - -## 10. 지원 연락처 -이 서비스에 관한 문의나 지원 요청은 다음을 통해 연락해 주시기 바랍니다: -- [Chrome 웹 스토어 지원 페이지](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -## 11. 적용 법률 및 관할 -1. 이 약관은 일본 법률의 적용을 받습니다. -2. 이 약관이나 서비스에서 발생하는 분쟁에 대해서는 일본 법원의 전속 관할로 합니다. - -2025년 10월 1일부터 시행 -` -export default msg diff --git a/packages/hub/src/app/[lang]/terms/ms.ts b/packages/hub/src/app/[lang]/terms/ms.ts deleted file mode 100644 index 10f14da8..00000000 --- a/packages/hub/src/app/[lang]/terms/ms.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { HUB_URL } from "@/const" - -const msg = ` -Terma Perkhidmatan ini (selepas ini dirujuk sebagai "Terma") menetapkan syarat-syarat untuk menggunakan "Selection Command Hub" (selepas ini dirujuk sebagai "Perkhidmatan") yang disediakan oleh Operator (selepas ini dirujuk sebagai "kami"). Sila baca Terma ini dengan teliti sebelum menggunakan Perkhidmatan. Dengan menggunakan Perkhidmatan, anda dianggap telah bersetuju dengan Terma ini. - -## 1. Penggunaan -1. Terma ini terpakai kepada semua hubungan antara kami dan pengguna berkaitan penggunaan Perkhidmatan. -2. Sebarang peraturan atau garis panduan yang ditetapkan secara berasingan oleh kami berkaitan Perkhidmatan akan menjadi sebahagian daripada Terma ini. - -## 2. Penerangan Perkhidmatan -1. Perkhidmatan berkaitan dengan sambungan Chrome "Selection Command" dan menyediakan fungsi berikut: - - Keupayaan untuk pengguna menghantar arahan (selepas ini dirujuk sebagai "Data yang Dihantar"). - - Keupayaan untuk pengguna melihat dan mengambil arahan yang dihantar oleh pengguna lain. -2. Data yang Dihantar termasuk maklumat berikut: - - Tajuk laman web. - - URL laman web. - - Ikon laman web. - - Penerangan dan klasifikasi arahan. - - Maklumat lain yang diperlukan untuk memaparkan laman web. -3. Perkhidmatan tidak memerlukan pendaftaran pengguna dan boleh digunakan secara tanpa nama. - -## 3. Tingkah Laku yang Dilarang -Pengguna dilarang melakukan aktiviti berikut semasa menggunakan Perkhidmatan: -- Tindakan yang melanggar undang-undang atau ketenteraman awam dan moral. -- Tindakan yang melanggar hak orang lain (contohnya, hak cipta, hak tanda dagangan, hak privasi). -- Memberikan maklumat palsu, tidak tepat, atau berbahaya sebagai Data yang Dihantar. -- Tindakan yang menyebabkan kerosakan kepada Perkhidmatan atau pengguna lain. -- Sebarang tindakan lain yang kami anggap tidak sesuai. - -## 4. Pengendalian Data yang Dihantar -1. Pengguna adalah bertanggungjawab sepenuhnya terhadap Data yang Dihantar mereka. Setelah Data yang Dihantar dihantar, ia tidak boleh diubah atau dipadam, jadi sila berhati-hati semasa menghantar kandungan. -2. Kami berhak untuk memadam atau menjadikan Data yang Dihantar sebagai peribadi jika perlu, tetapi tidak berkewajipan untuk berbuat demikian. -3. Jika pihak ketiga membuat tuntutan pelanggaran hak berkaitan Data yang Dihantar, kami boleh mengubah atau memadam data tersebut mengikut budi bicara kami. -4. Dilarang menghasilkan semula, menduplikasi, atau menggunakan Data yang Dihantar atau sebahagian daripada Perkhidmatan tanpa kebenaran untuk tujuan selain daripada menggunakan Perkhidmatan. - -## 5. Hak Harta Intelek dan Kebenaran Penggunaan -1. Semua hak harta intelek berkaitan Perkhidmatan adalah milik kami atau pemilik yang sah. -2. Pengguna mengekalkan pemilikan Data yang Dihantar mereka tetapi dianggap memberikan kebenaran untuk digunakan oleh pihak lain dalam keadaan berikut: - - Pengguna lain boleh melihat, mengambil, menggunakan, mengedit, dan mengedar semula Data yang Dihantar dalam skop Perkhidmatan. - - Kami boleh menggunakan, menerbitkan, mengedit, dan mengedar Data yang Dihantar mengikut keperluan untuk mengendalikan Perkhidmatan. - -## 6. Penafian -1. Kami tidak menjamin bahawa Perkhidmatan akan memenuhi tujuan tertentu, memberikan utiliti, atau memastikan keselamatan untuk pengguna. -2. Kami tidak bertanggungjawab atas sebarang kerosakan atau pertikaian yang timbul daripada Data yang Dihantar atau kandungannya. -3. Kami juga tidak bertanggungjawab atas kerosakan yang diakibatkan oleh gangguan atau penamatan Perkhidmatan. - -## 7. Dasar Privasi -1. Pengendalian maklumat peribadi dan kuki berkaitan penggunaan perkhidmatan ini akan ditadbir oleh Dasar Privasi yang ditetapkan secara berasingan oleh kami. -2. Untuk butiran, sila rujuk halaman berikut: - - [Dasar Privasi](${HUB_URL}/ms/privacy) - -## 8. Penggantungan dan Sekatan -1. Jika pengguna melanggar Terma ini, kami boleh menyekat akses atau menggantung penggunaan Perkhidmatan mereka tanpa notis terlebih dahulu. - -## 9. Perubahan dan Penamatan -1. Kami berhak untuk mengubah atau menamatkan Terma ini dan/atau kandungan Perkhidmatan tanpa notis terlebih dahulu. -2. Penggunaan Perkhidmatan yang berterusan selepas perubahan telah dibuat dianggap sebagai penerimaan Terma baru. - -## 10. Hubungi Sokongan -Untuk pertanyaan atau permintaan sokongan berkaitan Perkhidmatan ini, sila hubungi kami melalui: -- [Halaman Sokongan Chrome Web Store](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -## 11. Undang-undang yang Digunakan dan Bidang Kuasa -1. Terma ini akan ditadbir oleh undang-undang Jepun. -2. Dalam hal pertikaian yang timbul daripada Terma ini atau Perkhidmatan, bidang kuasa eksklusif akan berada di mahkamah Jepun. - -Berkuat kuasa mulai 01/10/2025 -` -export default msg diff --git a/packages/hub/src/app/[lang]/terms/page.tsx b/packages/hub/src/app/[lang]/terms/page.tsx deleted file mode 100644 index f6fe0b1e..00000000 --- a/packages/hub/src/app/[lang]/terms/page.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import React from "react" -import ReactMarkdown from "react-markdown" -import css from "@/app/page.module.css" -import { LangProps } from "@/types" -import { getDict } from "@/features/locale" - -import en from "./en" -import ja from "./ja" -import de from "./de" -import es from "./es" -import fr from "./fr" -import hi from "./hi" -import id from "./id" -import it from "./it" -import ko from "./ko" -import ms from "./ms" -import ptBR from "./pt-BR" -import ptPT from "./pt-PT" -import ru from "./ru" -import zhCN from "./zh-CN" - -const LocaleMap = { - en, - ja, - de, - es, - fr, - hi, - id, - it, - ko, - ms, - "pt-BR": ptBR, - "pt-PT": ptPT, - ru, - "zh-CN": zhCN, -} as const - -type Props = LangProps - -export default async function Terms({ params }: { params: Promise }) { - const { lang } = await params - const t = getDict(lang).about - const terms = LocaleMap[lang] - - return ( -
    -

    {t.terms}

    - {terms} -
    - ) -} diff --git a/packages/hub/src/app/[lang]/terms/pt-BR.ts b/packages/hub/src/app/[lang]/terms/pt-BR.ts deleted file mode 100644 index 9e58a26a..00000000 --- a/packages/hub/src/app/[lang]/terms/pt-BR.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { HUB_URL } from "@/const" - -const msg = ` -Estes Termos de Serviço (doravante referidos como "Termos") estabelecem as condições para o uso do "Selection Command Hub" (doravante referido como "Serviço") fornecido pelo Operador (doravante referido como "nós"). Por favor, leia estes Termos cuidadosamente antes de usar o Serviço. Ao usar o Serviço, você é considerado como tendo concordado com estes Termos. - -## 1. Aplicação -1. Estes Termos se aplicam a todos os relacionamentos entre nós e os usuários em relação ao uso do Serviço. -2. Quaisquer regras ou diretrizes estabelecidas separadamente por nós em relação ao Serviço constituirão parte destes Termos. - -## 2. Descrição do Serviço -1. O Serviço está relacionado à extensão do Chrome "Selection Command" e fornece as seguintes funcionalidades: - - A capacidade para os usuários postarem comandos (doravante referidos como "Dados Postados"). - - A capacidade para os usuários visualizarem e recuperarem comandos postados por outros usuários. -2. Os Dados Postados incluem as seguintes informações: - - O título de uma página web. - - A URL de uma página web. - - O ícone de uma página web. - - A descrição e classificação de um comando. - - Outras informações necessárias para exibir uma página web. -3. O Serviço não requer registro de usuário e pode ser usado anonimamente. - -## 3. Condutas Proibidas -Os usuários estão proibidos de se envolver nas seguintes atividades ao usar o Serviço: -- Atos que violem leis ou ordem pública e moral. -- Atos que infrinjam os direitos de outros (por exemplo, direitos autorais, marcas registradas, direitos de privacidade). -- Fornecimento de informações falsas, imprecisas ou prejudiciais como Dados Postados. -- Atos que causem danos ao Serviço ou a outros usuários. -- Qualquer outro ato que consideremos inapropriado. - -## 4. Tratamento dos Dados Postados -1. Os usuários são os únicos responsáveis por seus Dados Postados. Uma vez que os Dados Postados são enviados, não podem ser modificados ou excluídos, então, por favor, tenha cuidado ao postar conteúdo. -2. Reservamo-nos o direito de excluir ou tornar privados os Dados Postados se necessário, mas não somos obrigados a fazê-lo. -3. Se um terceiro apresentar reivindicações de violação de direitos em relação aos Dados Postados, podemos modificar ou excluir tais dados a nosso critério. -4. É proibida a reprodução, duplicação ou uso não autorizado dos Dados Postados ou de qualquer parte do Serviço para fins diferentes do uso do Serviço. - -## 5. Direitos de Propriedade Intelectual e Permissões de Uso -1. Todos os direitos de propriedade intelectual relacionados ao Serviço pertencem a nós ou aos proprietários legítimos. -2. Os usuários mantêm a propriedade de seus Dados Postados, mas são considerados como tendo concedido permissão para uso por outros nas seguintes circunstâncias: - - Outros usuários podem visualizar, recuperar, usar, editar e redistribuir os Dados Postados dentro do escopo do Serviço. - - Podemos usar, publicar, editar e distribuir os Dados Postados conforme necessário para operar o Serviço. - -## 6. Isenção de Responsabilidade -1. Não garantimos que o Serviço atenderá a propósitos específicos, fornecerá utilidade ou assegurará segurança para os usuários. -2. Não somos responsáveis por quaisquer danos ou disputas decorrentes dos Dados Postados ou de seu conteúdo. -3. Também não somos responsáveis por danos resultantes de interrupções ou término do Serviço. - -## 7. Política de Privacidade -1. O tratamento de informações pessoais e cookies relacionados ao uso deste serviço será regido pela Política de Privacidade estabelecida separadamente por nós. -2. Para detalhes, por favor, consulte a seguinte página: - - [Política de Privacidade](${HUB_URL}/pt-BR/privacy) - -## 8. Suspensão e Restrições -1. Se um usuário violar estes Termos, podemos restringir o acesso ou suspender seu uso do Serviço sem aviso prévio. - -## 9. Alterações e Término -1. Reservamo-nos o direito de alterar ou encerrar estes Termos e/ou o conteúdo do Serviço sem aviso prévio. -2. O uso contínuo do Serviço após as alterações terem sido feitas constitui aceitação dos novos Termos. - -## 10. Contato de Suporte -Para consultas ou solicitações de suporte relacionadas a este Serviço, entre em contato conosco através de: -- [Página de Suporte da Chrome Web Store](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -## 11. Lei Aplicável e Jurisdição -1. Estes Termos serão regidos pela lei japonesa. -2. Em caso de disputas decorrentes destes Termos ou do Serviço, a jurisdição exclusiva será dos tribunais japoneses. - -Efetivo a partir de 01/10/2025 -` -export default msg diff --git a/packages/hub/src/app/[lang]/terms/pt-PT.ts b/packages/hub/src/app/[lang]/terms/pt-PT.ts deleted file mode 100644 index 8d7d7b4a..00000000 --- a/packages/hub/src/app/[lang]/terms/pt-PT.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { HUB_URL } from "@/const" - -const msg = ` -Estes Termos de Serviço (doravante designados como "Termos") estabelecem as condições para a utilização do "Selection Command Hub" (doravante designado como "Serviço") fornecido pelo Operador (doravante designado como "nós"). Por favor, leia estes Termos cuidadosamente antes de utilizar o Serviço. Ao utilizar o Serviço, considera-se que concordou com estes Termos. - -## 1. Aplicação -1. Estes Termos aplicam-se a todas as relações entre nós e os utilizadores relativas à utilização do Serviço. -2. Quaisquer regras ou diretrizes estabelecidas separadamente por nós relativas ao Serviço constituirão parte destes Termos. - -## 2. Descrição do Serviço -1. O Serviço está relacionado com a extensão do Chrome "Selection Command" e fornece as seguintes funcionalidades: - - A capacidade de os utilizadores publicarem comandos (doravante designados como "Dados Publicados"). - - A capacidade de os utilizadores visualizarem e recuperarem comandos publicados por outros utilizadores. -2. Os Dados Publicados incluem as seguintes informações: - - O título de uma página web. - - O URL de uma página web. - - O ícone de uma página web. - - A descrição e classificação de um comando. - - Outras informações necessárias para exibir uma página web. -3. O Serviço não requer registo de utilizador e pode ser utilizado anonimamente. - -## 3. Condutas Proibidas -Os utilizadores estão proibidos de se envolverem nas seguintes atividades ao utilizar o Serviço: -- Atos que violem leis ou ordem pública e moral. -- Atos que infrinjam os direitos de outros (por exemplo, direitos de autor, marcas registadas, direitos de privacidade). -- Fornecimento de informações falsas, imprecisas ou prejudiciais como Dados Publicados. -- Atos que causem danos ao Serviço ou a outros utilizadores. -- Qualquer outro ato que consideremos inapropriado. - -## 4. Tratamento dos Dados Publicados -1. Os utilizadores são os únicos responsáveis pelos seus Dados Publicados. Uma vez que os Dados Publicados são enviados, não podem ser modificados ou eliminados, pelo que, por favor, tenha cuidado ao publicar conteúdo. -2. Reservamo-nos o direito de eliminar ou tornar privados os Dados Publicados se necessário, mas não somos obrigados a fazê-lo. -3. Se um terceiro apresentar reclamações de violação de direitos relativas aos Dados Publicados, podemos modificar ou eliminar tais dados a nosso critério. -4. É proibida a reprodução, duplicação ou utilização não autorizada dos Dados Publicados ou de qualquer parte do Serviço para fins diferentes da utilização do Serviço. - -## 5. Direitos de Propriedade Intelectual e Permissões de Utilização -1. Todos os direitos de propriedade intelectual relacionados com o Serviço pertencem a nós ou aos proprietários legítimos. -2. Os utilizadores mantêm a propriedade dos seus Dados Publicados, mas são considerados como tendo concedido permissão para utilização por outros nas seguintes circunstâncias: - - Outros utilizadores podem visualizar, recuperar, utilizar, editar e redistribuir os Dados Publicados dentro do âmbito do Serviço. - - Podemos utilizar, publicar, editar e distribuir os Dados Publicados conforme necessário para operar o Serviço. - -## 6. Isenção de Responsabilidade -1. Não garantimos que o Serviço satisfará propósitos específicos, fornecerá utilidade ou assegurará segurança para os utilizadores. -2. Não somos responsáveis por quaisquer danos ou disputas decorrentes dos Dados Publicados ou do seu conteúdo. -3. Também não somos responsáveis por danos resultantes de interrupções ou terminação do Serviço. - -## 7. Política de Privacidade -1. O tratamento de informações pessoais e cookies relacionados com a utilização deste serviço será regido pela Política de Privacidade estabelecida separadamente por nós. -2. Para detalhes, por favor, consulte a seguinte página: - - [Política de Privacidade](${HUB_URL}/pt-PT/privacy) - -## 8. Suspensão e Restrições -1. Se um utilizador violar estes Termos, podemos restringir o acesso ou suspender a sua utilização do Serviço sem aviso prévio. - -## 9. Alterações e Terminação -1. Reservamo-nos o direito de alterar ou terminar estes Termos e/ou o conteúdo do Serviço sem aviso prévio. -2. A utilização contínua do Serviço após as alterações terem sido feitas constitui aceitação dos novos Termos. - -## 10. Contacto de Suporte -Para consultas ou pedidos de suporte relacionados com este Serviço, contacte-nos através de: -- [Página de Suporte da Chrome Web Store](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -## 11. Lei Aplicável e Jurisdição -1. Estes Termos serão regidos pela lei japonesa. -2. Em caso de disputas decorrentes destes Termos ou do Serviço, a jurisdição exclusiva será dos tribunais japoneses. - -Efetivo a partir de 01/10/2025 -` -export default msg diff --git a/packages/hub/src/app/[lang]/terms/ru.ts b/packages/hub/src/app/[lang]/terms/ru.ts deleted file mode 100644 index 46ca2587..00000000 --- a/packages/hub/src/app/[lang]/terms/ru.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { HUB_URL } from "@/const" - -const msg = ` -Настоящие Условия использования (далее именуемые "Условия") устанавливают условия использования "Selection Command Hub" (далее именуемого "Сервис"), предоставляемого Оператором (далее именуемым "мы"). Пожалуйста, внимательно прочитайте эти Условия перед использованием Сервиса. Используя Сервис, вы считаетесь согласившимся с этими Условиями. - -## 1. Применение -1. Настоящие Условия применяются ко всем отношениям между нами и пользователями в отношении использования Сервиса. -2. Любые правила или руководства, установленные нами отдельно в отношении Сервиса, будут составлять часть настоящих Условий. - -## 2. Описание Сервиса -1. Сервис связан с расширением Chrome "Selection Command" и предоставляет следующие функции: - - Возможность для пользователей публиковать команды (далее именуемые "Опубликованные данные"). - - Возможность для пользователей просматривать и получать команды, опубликованные другими пользователями. -2. Опубликованные данные включают следующую информацию: - - Заголовок веб-страницы. - - URL веб-страницы. - - Иконку веб-страницы. - - Описание и рейтинг команды. - - Другую информацию, необходимую для отображения веб-страницы. -3. Сервис не требует регистрации пользователя и может использоваться анонимно. - -## 3. Запрещенные действия -Пользователям запрещается совершать следующие действия при использовании Сервиса: -- Действия, нарушающие законы или общественный порядок и мораль. -- Действия, нарушающие права других лиц (например, авторские права, товарные знаки, права на неприкосновенность частной жизни). -- Предоставление ложной, неточной или вредоносной информации в качестве Опубликованных данных. -- Действия, причиняющие вред Сервису или другим пользователям. -- Любые другие действия, которые мы считаем неприемлемыми. - -## 4. Обработка Опубликованных данных -1. Пользователи несут единоличную ответственность за свои Опубликованные данные. После отправки Опубликованные данные не могут быть изменены или удалены, поэтому, пожалуйста, будьте осторожны при публикации контента. -2. Мы оставляем за собой право удалять или делать приватными Опубликованные данные при необходимости, но не обязаны это делать. -3. Если третья сторона предъявит претензии о нарушении прав в отношении Опубликованных данных, мы можем изменить или удалить такие данные по нашему усмотрению. -4. Запрещается воспроизведение, дублирование или несанкционированное использование Опубликованных данных или любой части Сервиса для целей, отличных от использования Сервиса. - -## 5. Права интеллектуальной собственности и разрешения на использование -1. Все права интеллектуальной собственности, связанные с Сервисом, принадлежат нам или законным владельцам. -2. Пользователи сохраняют право собственности на свои Опубликованные данные, но считаются предоставившими разрешение на использование другими в следующих случаях: - - Другие пользователи могут просматривать, получать, использовать, редактировать и распространять Опубликованные данные в рамках Сервиса. - - Мы можем использовать, публиковать, редактировать и распространять Опубликованные данные по мере необходимости для работы Сервиса. - -## 6. Отказ от ответственности -1. Мы не гарантируем, что Сервис будет соответствовать конкретным целям, обеспечивать полезность или безопасность для пользователей. -2. Мы не несем ответственности за любой ущерб или споры, возникающие из Опубликованных данных или их содержания. -3. Мы также не несем ответственности за ущерб, возникший в результате перебоев или прекращения работы Сервиса. - -## 7. Политика конфиденциальности -1. Обработка персональной информации и файлов cookie, связанных с использованием этого сервиса, будет регулироваться Политикой конфиденциальности, установленной нами отдельно. -2. Для получения подробной информации, пожалуйста, обратитесь к следующей странице: - - [Политика конфиденциальности](${HUB_URL}/ru/privacy) - -## 8. Приостановка и ограничения -1. Если пользователь нарушает настоящие Условия, мы можем ограничить доступ или приостановить использование Сервиса без предварительного уведомления. - -## 9. Изменения и прекращение -1. Мы оставляем за собой право изменять или прекращать настоящие Условия и/или содержание Сервиса без предварительного уведомления. -2. Продолжение использования Сервиса после внесения изменений считается принятием новых Условий. - -## 10. Контактная информация для поддержки -По вопросам или запросам поддержки, связанным с этим Сервисом, свяжитесь с нами через: -- [Страницу поддержки Chrome Web Store](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -## 11. Применимое право и юрисдикция -1. Настоящие Условия регулируются японским законодательством. -2. В случае споров, возникающих из настоящих Условий или Сервиса, исключительная юрисдикция будет принадлежать японским судам. - -Действует с 01/10/2025 -` -export default msg diff --git a/packages/hub/src/app/[lang]/terms/zh-CN.ts b/packages/hub/src/app/[lang]/terms/zh-CN.ts deleted file mode 100644 index 7080bacd..00000000 --- a/packages/hub/src/app/[lang]/terms/zh-CN.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { HUB_URL } from "@/const" - -const msg = ` -本服务条款(以下简称"条款")规定了使用运营商(以下简称"我们")提供的"Selection Command Hub"(以下简称"服务")的条件。在使用服务之前,请仔细阅读这些条款。使用服务即表示您同意这些条款。 - -## 1. 适用范围 -1. 本条款适用于我们与用户之间关于使用服务的所有关系。 -2. 我们单独制定的与服务相关的任何规则或指南将构成本条款的一部分。 - -## 2. 服务说明 -1. 本服务与Chrome扩展"Selection Command"相关,提供以下功能: - - 用户可以发布命令(以下简称"发布数据")。 - - 用户可以查看和获取其他用户发布的命令。 -2. 发布数据包括以下信息: - - 网页标题。 - - 网页URL。 - - 网页图标。 - - 命令的描述和评级。 - - 显示网页所需的其他信息。 -3. 本服务不需要用户注册,可以匿名使用。 - -## 3. 禁止行为 -用户在使用服务时禁止从事以下活动: -- 违反法律或公共秩序和道德的行为。 -- 侵犯他人权利的行为(例如,版权、商标、隐私权)。 -- 提供虚假、不准确或有害的信息作为发布数据。 -- 损害服务或其他用户的行为。 -- 我们认为不适当的任何其他行为。 - -## 4. 发布数据的处理 -1. 用户对其发布的数据负全责。发布数据一旦发送,无法修改或删除,因此发布内容时请谨慎。 -2. 我们保留在必要时删除或将发布数据设为私有的权利,但没有义务这样做。 -3. 如果第三方对发布数据提出权利侵权索赔,我们可以自行决定修改或删除此类数据。 -4. 禁止复制、复制或未经授权使用发布数据或服务的任何部分用于服务使用以外的目的。 - -## 5. 知识产权和使用许可 -1. 与服务相关的所有知识产权均归我们或合法所有者所有。 -2. 用户保留其发布数据的所有权,但在以下情况下被视为已授予他人使用许可: - - 其他用户可以在服务范围内查看、获取、使用、编辑和重新分发发布数据。 - - 我们可以根据运营服务的需要使用、发布、编辑和分发发布数据。 - -## 6. 免责声明 -1. 我们不保证服务将满足特定目的、提供实用性或确保用户安全。 -2. 我们对因发布数据或其内容引起的任何损害或争议不承担责任。 -3. 我们也不对因服务中断或终止造成的损害承担责任。 - -## 7. 隐私政策 -1. 与本服务使用相关的个人信息和Cookie的处理将受我们单独制定的隐私政策约束。 -2. 详情请参阅以下页面: - - [隐私政策](${HUB_URL}/zh-CN/privacy) - -## 8. 暂停和限制 -1. 如果用户违反本条款,我们可以在不事先通知的情况下限制访问或暂停其使用服务。 - -## 9. 变更和终止 -1. 我们保留在不事先通知的情况下更改或终止本条款和/或服务内容的权利。 -2. 在更改后继续使用服务即表示接受新条款。 - -## 10. 支持联系方式 -有关本服务的咨询或支持请求,请通过以下方式联系我们: -- [Chrome Web Store支持页面](https://chromewebstore.google.com/detail/nlnhbibaommoelemmdfnkjkgoppkohje/support) - -## 11. 适用法律和管辖权 -1. 本条款受日本法律管辖。 -2. 因本条款或服务引起的任何争议,专属管辖权归日本法院所有。 - -自2025年10月1日起生效 -` -export default msg diff --git a/packages/hub/src/app/[lang]/uninstall/page.tsx b/packages/hub/src/app/[lang]/uninstall/page.tsx deleted file mode 100644 index a21de07d..00000000 --- a/packages/hub/src/app/[lang]/uninstall/page.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { UninstallForm } from "@/components/UninstallForm" - -import css from "@/app/page.module.css" - -export default async function UninstallPage() { - return ( -
    - -
    - ) -} diff --git a/packages/hub/src/app/not-found.tsx b/packages/hub/src/app/not-found.tsx deleted file mode 100644 index 0dca27a2..00000000 --- a/packages/hub/src/app/not-found.tsx +++ /dev/null @@ -1,31 +0,0 @@ -"use client" - -import { Image } from "@/components/Image" -import { useLocale } from "@/hooks/useLocale" -import { getDict } from "@/features/locale" - -export default function NotFound() { - const { browserLang } = useLocale() - const t = getDict(browserLang).notFound - - return ( -
    -
    -

    404 {t.title}

    -
    -
    -

    - {t.message} -

    - 404 Not found -
    -
    - ) -} diff --git a/packages/hub/src/app/page.tsx b/packages/hub/src/app/page.tsx deleted file mode 100644 index 6ff7dc13..00000000 --- a/packages/hub/src/app/page.tsx +++ /dev/null @@ -1,15 +0,0 @@ -"use client" - -import { useEffect } from "react" -import { useLocale } from "@/hooks/useLocale" - -export default function Home() { - const { switchBrowserLocale } = useLocale() - - useEffect(() => { - switchBrowserLocale() - }, [switchBrowserLocale]) - - // This page is just a redirect to the browser locale - return null -} diff --git a/packages/hub/src/app/uninstall/page.tsx b/packages/hub/src/app/uninstall/page.tsx deleted file mode 100644 index c13df0bb..00000000 --- a/packages/hub/src/app/uninstall/page.tsx +++ /dev/null @@ -1,24 +0,0 @@ -"use client" - -import { useEffect } from "react" -import { useRouter } from "next/navigation" -import { useLocale } from "@/hooks/useLocale" -import { LanguageMap } from "@/features/locale" - -export default function UninstallRedirect() { - const router = useRouter() - const { browserLang } = useLocale() - - useEffect(() => { - // Get list of supported languages - const supportedLanguages = Object.keys(LanguageMap) - const preferredLanguage = supportedLanguages.includes(browserLang) - ? browserLang - : "en" - - // Redirect to the appropriate language path - router.replace(`/${preferredLanguage}/uninstall`) - }, [router, browserLang]) - - return null -} diff --git a/packages/hub/src/components/CommandForm.module.css b/packages/hub/src/components/CommandForm.module.css deleted file mode 100644 index f8e2aef6..00000000 --- a/packages/hub/src/components/CommandForm.module.css +++ /dev/null @@ -1,57 +0,0 @@ -.CollapsibleContent[data-state="open"] { - animation: slideDown 150ms ease-out; -} - -.CollapsibleContent[data-state="closed"] { - animation: slideUp 100ms ease-out; -} - -@keyframes slideDown { - from { - height: 0; - overflow: hidden; - } - - to { - height: var(--radix-collapsible-content-height); - overflow: hidden; - } -} - -@keyframes slideUp { - from { - height: var(--radix-collapsible-content-height); - overflow: hidden; - } - - to { - height: 0; - overflow: hidden; - } -} - -.collapse[data-state="open"] .iconUpDown { - display: none; -} - -.collapse[data-state="closed"] .iconDownUp { - display: none; -} - -.triangle { - position: relative; -} - -.triangle:after { - content: ""; - position: absolute; - top: 55%; - right: -15px; - width: 0; - height: 0; - border-style: solid; - border-top: 10px solid transparent; - border-bottom: 5px solid transparent; - border-left: 20px solid #e7e5e4; - border-right: 0; -} diff --git a/packages/hub/src/components/CommandForm.tsx b/packages/hub/src/components/CommandForm.tsx deleted file mode 100644 index c899fb76..00000000 --- a/packages/hub/src/components/CommandForm.tsx +++ /dev/null @@ -1,324 +0,0 @@ -"use client" - -import React, { useState } from "react" -import clsx from "clsx" -import { Send, Undo2 } from "lucide-react" - -import { InputForm, FormValues } from "@/components/InputForm" -import { Button } from "@/components/ui/button" -import { DialogDescription } from "@/components/ui/dialog" -import { Image } from "@/components/Image" -import { StepList } from "@/components/pageAction/StepList" - -import { useLocale } from "@/hooks/useLocale" -import { cmd2uuid } from "@/features/command" -import type { CommandInJson, Tag as TagType } from "@/types" -import { OPEN_MODE, OPEN_MODE_SEARCH } from "@/const" - -import css from "./CommandForm.module.css" - -const STORAGE_KEY = "CommandShareFormData" - -const toMessages = (data: FormValues) => { - const msgObj = toCommand(data) - return `\`\`\`\n${JSON.stringify(msgObj, null, 2)}` -} - -const toCommand = (data: FormValues): CommandInJson => { - const tags = data.tags.map((t) => t.name) - return { - id: cmd2uuid(data), - ...data, - addedAt: new Date().toISOString(), - tags, - } -} - -const enum STEP { - INPUT, - CONFIRM, - SENDING, - COMPLETE, - ERROR, -} - -export function CommandForm() { - const [formData, setFormData] = useState({} as FormValues) - const [step, setStep] = useState(STEP.INPUT) - - const onInputSubmit = (values: FormValues) => { - if (!values) return - setFormData(values) - setStep(STEP.CONFIRM) - } - - const onConfirmSubmit = () => { - setStep(STEP.SENDING) - // Send data to Google Apps Script - const url = - "https://script.google.com/macros/s/AKfycbwkLaCIh2xOq1fobxThzeVAE711C_z7JhXmKxh4bLIgMvHPuADTmgzndqowhStQR-nh/exec" - const submit = async () => { - try { - const ret = await fetch(url, { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - mode: "no-cors", - body: JSON.stringify({ - title: formData.title, - message: toMessages(formData), - }), - }) - console.debug(ret) - // Clear localStorage after form submission - sessionStorage.removeItem(STORAGE_KEY) - setStep(STEP.COMPLETE) - } catch (e) { - console.error(e) - setStep(STEP.ERROR) - } - } - submit() - } - - const onBack = () => { - setStep(STEP.INPUT) - } - - switch (step) { - case STEP.INPUT: - return - case STEP.CONFIRM: - return ( - - ) - case STEP.SENDING: - return - case STEP.COMPLETE: - return - case STEP.ERROR: - return - default: - return null - } -} - -const Item = ({ - label, - value, - valueClass, -}: { - label: string - value: string - valueClass?: string -}) => ( -
    - -
    - {value} -
    -
    -) - -const IconItem = ({ label, value }: { label: string; value: string }) => ( -
    - Search url's favicon - -
    -) - -type TagName = Omit -const tagNames = (tags: TagName[]) => tags.map((t) => t.name).join(", ") - -type ConfirmProps = { - data: FormValues - onFormSubmit: () => void - onBack: () => void -} - -function ConfirmForm(props: ConfirmProps) { - const { dict } = useLocale() - const t = dict.inputForm - const t2 = dict.confirmForm - const cmd = props.data - - const isSearch = cmd.openMode !== OPEN_MODE.PAGE_ACTION - const isPageAction = cmd.openMode === OPEN_MODE.PAGE_ACTION - - return ( -
    - - {t2.formDescription} - - -
    - - {isSearch && } - {isPageAction && ( - - )} - - - - {isSearch && ( - <> - - - - - )} - {isPageAction && ( -
    - - - -
    - )} -
    -

    - {t2.caution} -

    -
    - - -
    -
    - ) -} - -function SendingForm() { - const t = useLocale().dict.SendingForm - return ( -
    - - {t.sending} - - Uploading... -
    - ) -} - -function CompleteForm() { - const { dict } = useLocale() - const t = dict.completeForm - return ( -
    - - {t.formDescription} - 🎉 - -
    -

    - {t.thanks} -

    - Engineer -
    -

    {t.aboudDelete}

    - - {t.supportHub} - -
    - ) -} - -function ErrorForm() { - const t = useLocale().dict.errorForm - return ( -
    - - {t.formDescription} - -
    -

    {t.message}

    - - {t.supportHub} - -
    -
    - ) -} diff --git a/packages/hub/src/components/CommandShare.tsx b/packages/hub/src/components/CommandShare.tsx deleted file mode 100644 index 5fc6f375..00000000 --- a/packages/hub/src/components/CommandShare.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import * as React from "react" -import { - Dialog, - DialogContent, - DialogTitle, - DialogTrigger, -} from "@/components/ui/dialog" -import { ArrowUpToLine } from "lucide-react" -import { CommandForm } from "@/components/CommandForm" -import { LangProps } from "@/types" -import { getDict } from "@/features/locale" - -export function CommandShare(props: LangProps): JSX.Element { - const { lang } = props - const t = getDict(lang).commandShare - return ( - - - - - {t.title} - - - - - ✏️ - {t.formTitle} - - - - - ) -} diff --git a/packages/hub/src/components/CookieConsent.tsx b/packages/hub/src/components/CookieConsent.tsx index 6eee1334..414142e1 100644 --- a/packages/hub/src/components/CookieConsent.tsx +++ b/packages/hub/src/components/CookieConsent.tsx @@ -1,9 +1,8 @@ "use client" import { useEffect, useState } from "react" -import Link from "next/link" import Script from "next/script" -import { CookieIcon, ChevronsRight } from "lucide-react" +import { CookieIcon } from "lucide-react" import { Button } from "./ui/button" import { cn } from "@/lib/utils" import { LangProps } from "@/types" @@ -41,7 +40,6 @@ export function CookieConsent({ lang }: Props): JSX.Element { const [isOpen, setIsOpen] = useState(false) const [hide, setHide] = useState(false) const [consentMode, setConsentMode] = useState(null) - const about = getDict(lang).about const t = getDict(lang).cookieConsent const accept = () => { @@ -122,13 +120,6 @@ export function CookieConsent({ lang }: Props): JSX.Element {

    {t.message}

    - - - {about.cookie} -