From 833a0f986554530288dd1cb64460db3091c30cab Mon Sep 17 00:00:00 2001 From: Chrissy LeMaire Date: Mon, 9 Dec 2024 07:09:06 +0100 Subject: [PATCH] new fixes --- .gitignore | 1 + README.md | 6 +- css/base.css | 8 +- css/components/auth.css | 186 +++--------- css/components/buttons.css | 1 - css/components/cards.css | 220 -------------- css/components/cards/base.css | 29 ++ css/components/cards/category.css | 60 ++++ css/components/cards/components.css | 46 +++ css/components/cards/index.css | 5 + css/components/cards/landing-feature.css | 68 +++++ css/components/footer.css | 2 +- css/components/forms.css | 205 +------------ css/components/forms/category-links.css | 10 + css/components/forms/checkboxes.css | 66 ++++ css/components/forms/handle-input.css | 53 ++++ css/components/forms/radio.css | 28 ++ css/components/forms/search.css | 21 ++ css/components/forms/select.css | 16 + css/components/index.css | 2 +- css/components/landing.css | 173 +---------- css/components/landing/auth.landing.css | 35 +++ css/components/landing/branding.landing.css | 77 +++++ css/components/landing/features.landing.css | 178 +++++++++++ css/components/landing/layout.landing.css | 21 ++ css/components/landing/responsive.landing.css | 159 ++++++++++ .../landing/theme-toggle.landing.css | 71 +++++ css/components/media.css | 1 - css/components/nav/user-menu-base.css | 41 +++ css/components/nav/user-menu-dropdown.css | 66 ++++ css/components/nav/user-menu-items.css | 69 +++++ css/components/nav/user-menu-responsive.css | 18 ++ css/components/nav/user-menu.css | 196 +----------- css/components/scrollbars.css | 142 +++++---- .../settings/appearance-controls.css | 53 ++++ css/components/settings/search-controls.css | 67 ++++ css/components/settings/settings-sidebar.css | 227 +------------- css/components/settings/settings-tabs.css | 47 +++ css/components/settings/sidebar-layout.css | 52 ++++ css/components/slider.css | 4 +- css/components/toggles.css | 247 +-------------- .../toggles/appearance-settings.css | 46 +++ css/components/toggles/checkboxes.css | 47 +++ css/components/toggles/index.css | 6 + css/components/toggles/mode-toggle.css | 35 +++ css/components/toggles/radio-buttons.css | 73 +++++ css/components/toggles/settings-groups.css | 11 + css/components/toggles/toggle-all.css | 29 ++ docs/1-architecture/1-core-concepts.md | 16 +- docs/1-architecture/11-simple-mode.md | 28 +- docs/1-architecture/4-mode-system.md | 47 ++- docs/2-development/1-known-issues.md | 45 ++- docs/migration.md | 203 ++----------- images/screenshots/dark-advanced-mode.png | Bin 0 -> 99573 bytes images/screenshots/dark-search.png | Bin 0 -> 49118 bytes images/screenshots/dark-simple-mode.png | Bin 0 -> 82085 bytes images/screenshots/light-advanced-mode.png | Bin 0 -> 93166 bytes images/screenshots/light-search.png | Bin 0 -> 45899 bytes images/screenshots/light-simple-mode.png | Bin 0 -> 79023 bytes js/api.js | 250 +-------------- js/api/cache.js | 17 ++ js/api/fetchers.js | 79 +++++ js/api/github.js | 102 +++++++ js/api/index.js | 50 +++ js/bluesky.js | 11 +- js/categoryManager.js | 2 +- js/components/landing-page.js | 111 +------ js/components/landing/auth-handler.js | 24 ++ js/components/landing/image-handler.js | 80 +++++ js/components/landing/landing-page.js | 37 +++ js/components/landing/template.js | 131 ++++++++ js/components/modals.js | 231 +------------- js/components/modals/index.js | 1 + js/components/modals/settings-appearance.js | 41 +++ js/components/modals/settings-modal.js | 24 ++ js/components/modals/settings-tabs.js | 32 ++ js/components/modals/settings-template.js | 137 +++++++++ js/events.js | 170 +++++++++++ js/handlers/context/contextCache.js | 6 +- js/handlers/context/contextHandlers.js | 226 +------------- js/handlers/context/contextState.js | 204 +------------ js/handlers/context/contextToggleHandler.js | 132 ++++++++ js/handlers/context/contextUtils.js | 17 +- js/handlers/context/exceptionToggleHandler.js | 91 ++++++ js/handlers/context/keywordManager.js | 10 + js/handlers/context/simpleModeManager.js | 90 ++++++ js/handlers/context/stateInitializer.js | 118 +++++++ js/handlers/keywordHandlers.js | 287 +----------------- js/handlers/keywords/bulk-handlers.js | 101 ++++++ js/handlers/keywords/cache.js | 27 ++ js/handlers/keywords/core-handlers.js | 57 ++++ js/handlers/keywords/index.js | 20 ++ js/handlers/keywords/keyword-utils.js | 51 ++++ js/handlers/keywords/ui-utils.js | 57 ++++ js/handlers/mute/index.js | 10 + js/handlers/mute/muteCache.js | 44 +++ js/handlers/mute/muteOperations.js | 123 ++++++++ js/handlers/mute/muteUIUtils.js | 39 +++ js/handlers/muteHandlers.js | 199 +----------- js/handlers/themeHandlers.js | 62 +++- js/initialization.js | 93 ++++++ js/keywordState.js | 10 - js/main.js | 272 +---------------- js/settings/appearanceSettings.js | 29 +- js/state.js | 6 +- js/statePersistence.js | 6 - js/themeInit.js | 16 +- js/utils/categoryUtils.js | 13 +- js/utils/weightManager.js | 35 ++- 109 files changed, 4060 insertions(+), 3484 deletions(-) delete mode 100644 css/components/cards.css create mode 100644 css/components/cards/base.css create mode 100644 css/components/cards/category.css create mode 100644 css/components/cards/components.css create mode 100644 css/components/cards/index.css create mode 100644 css/components/cards/landing-feature.css create mode 100644 css/components/forms/category-links.css create mode 100644 css/components/forms/checkboxes.css create mode 100644 css/components/forms/handle-input.css create mode 100644 css/components/forms/radio.css create mode 100644 css/components/forms/search.css create mode 100644 css/components/forms/select.css create mode 100644 css/components/landing/auth.landing.css create mode 100644 css/components/landing/branding.landing.css create mode 100644 css/components/landing/features.landing.css create mode 100644 css/components/landing/layout.landing.css create mode 100644 css/components/landing/responsive.landing.css create mode 100644 css/components/landing/theme-toggle.landing.css create mode 100644 css/components/nav/user-menu-base.css create mode 100644 css/components/nav/user-menu-dropdown.css create mode 100644 css/components/nav/user-menu-items.css create mode 100644 css/components/nav/user-menu-responsive.css create mode 100644 css/components/settings/appearance-controls.css create mode 100644 css/components/settings/search-controls.css create mode 100644 css/components/settings/settings-tabs.css create mode 100644 css/components/settings/sidebar-layout.css create mode 100644 css/components/toggles/appearance-settings.css create mode 100644 css/components/toggles/checkboxes.css create mode 100644 css/components/toggles/index.css create mode 100644 css/components/toggles/mode-toggle.css create mode 100644 css/components/toggles/radio-buttons.css create mode 100644 css/components/toggles/settings-groups.css create mode 100644 css/components/toggles/toggle-all.css create mode 100644 images/screenshots/dark-advanced-mode.png create mode 100644 images/screenshots/dark-search.png create mode 100644 images/screenshots/dark-simple-mode.png create mode 100644 images/screenshots/light-advanced-mode.png create mode 100644 images/screenshots/light-search.png create mode 100644 images/screenshots/light-simple-mode.png create mode 100644 js/api/cache.js create mode 100644 js/api/fetchers.js create mode 100644 js/api/github.js create mode 100644 js/api/index.js create mode 100644 js/components/landing/auth-handler.js create mode 100644 js/components/landing/image-handler.js create mode 100644 js/components/landing/landing-page.js create mode 100644 js/components/landing/template.js create mode 100644 js/components/modals/index.js create mode 100644 js/components/modals/settings-appearance.js create mode 100644 js/components/modals/settings-modal.js create mode 100644 js/components/modals/settings-tabs.js create mode 100644 js/components/modals/settings-template.js create mode 100644 js/events.js create mode 100644 js/handlers/context/contextToggleHandler.js create mode 100644 js/handlers/context/exceptionToggleHandler.js create mode 100644 js/handlers/context/keywordManager.js create mode 100644 js/handlers/context/simpleModeManager.js create mode 100644 js/handlers/context/stateInitializer.js create mode 100644 js/handlers/keywords/bulk-handlers.js create mode 100644 js/handlers/keywords/cache.js create mode 100644 js/handlers/keywords/core-handlers.js create mode 100644 js/handlers/keywords/index.js create mode 100644 js/handlers/keywords/keyword-utils.js create mode 100644 js/handlers/keywords/ui-utils.js create mode 100644 js/handlers/mute/index.js create mode 100644 js/handlers/mute/muteCache.js create mode 100644 js/handlers/mute/muteOperations.js create mode 100644 js/handlers/mute/muteUIUtils.js create mode 100644 js/initialization.js diff --git a/.gitignore b/.gitignore index 039c111..4f4c46c 100644 --- a/.gitignore +++ b/.gitignore @@ -137,3 +137,4 @@ bundle.js *.crx *.zip /keywords/categories +repomix-output.txt diff --git a/README.md b/README.md index ab0709a..4dd7e5d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # Mutesky - Bulk manage Bluesky mutes with pre-populated keyword lists -Mutesky gives you control over what appears in your Bluesky feed through curated keyword collections. It works directly with Bluesky's native mute system to filter out content you'd rather not see. +Mutesky Logo Mutesky is a web app that gives you granular control over what appears in your Bluesky feed through curated keyword collections. Working directly with Bluesky's native mute system, it provides an intuitive interface to filter out content you'd rather not see. With over 1,400 pre-populated keywords organized into 20+ smart categories, Mutesky makes content filtering both easy and effective. + +  ## Key Features @@ -46,4 +48,4 @@ Check out [US Politician Labeler](https://bsky.app/profile/did:plc:bxnuth7kms5l5 ## Coming Soon -AI-powered dynamic keyword updates: An optional service that automatically identifies and updates mute keywords hourly based on emerging trends and topics. \ No newline at end of file +AI-powered dynamic keyword updates: An optional service that automatically identifies and updates mute keywords hourly based on emerging trends and topics. diff --git a/css/base.css b/css/base.css index 33454e2..2172b69 100644 --- a/css/base.css +++ b/css/base.css @@ -9,7 +9,7 @@ --primary-hover: #0066cc; --primary-light: #e6f3ff; --surface: #ffffff; - --background: #f8fafc; + --background: #eef2f6; --background-light: #ffffff; --text: #000000; --text-secondary: #536471; @@ -55,8 +55,8 @@ --button-transition: 200ms ease-in-out; } -/* Dark Theme (Dim) */ -[data-theme="dim"] { +/* Dark Theme */ +[data-theme="dark"] { --surface: #15202b; --background: #1e2732; --background-light: #1a2634; @@ -154,7 +154,7 @@ a:hover { /* System Theme Detection */ @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) { - /* Default to dim theme when system prefers dark */ + /* Default to dark theme when system prefers dark */ --surface: #15202b; --background: #1e2732; --background-light: #1a2634; diff --git a/css/components/auth.css b/css/components/auth.css index 5150f67..8d9674e 100644 --- a/css/components/auth.css +++ b/css/components/auth.css @@ -1,12 +1,11 @@ /* Auth Container */ .bsky-connect { - background: var(--background); - border-radius: 16px; + background: var(--surface); + border-radius: 20px; padding: 24px; - margin-top: 24px; border: 1px solid var(--border); position: relative; - overflow: hidden; + overflow: visible; } .bsky-connect::before { @@ -15,195 +14,94 @@ inset: 0; background: var(--surface-gradient); opacity: 0; - transition: opacity 0.3s ease; + transition: opacity 0.2s ease-in-out; + border-radius: inherit; + pointer-events: none; /* Add this to fix click blocking */ } .bsky-connect:hover::before { opacity: 1; } +/* Sign In Header */ .sign-in-title { - font-size: 22px; + font-size: 20px; font-weight: 800; - color: var(--text); - margin: 0 0 4px 0; - letter-spacing: -0.02em; - position: relative; + margin: 0; + letter-spacing: -0.01em; + line-height: 1.3; } +/* Auth Container Layout */ .bsky-auth-container { display: flex; flex-direction: column; - gap: 16px; - position: relative; - margin-top: 12px; + margin-top: 24px; + gap: 24px; } +/* Auth Section */ .auth-section { width: 100%; } -/* Input Styling */ -.input-wrapper { - position: relative; - width: 100%; - margin-top: 16px; -} - -.input-wrapper::before { - content: '@'; - position: absolute; - left: 16px; - top: 50%; - transform: translateY(-50%); - color: var(--text-secondary); - font-size: 15px; - z-index: 1; - opacity: 0.7; - pointer-events: none; -} - -.bsky-handle-input { - width: 100%; - padding: 12px 16px 12px 36px; - font-size: 15px; - border: 1px solid var(--border); - border-radius: 12px; - background: var(--surface); - color: var(--text); - transition: var(--transition); -} - -.bsky-handle-input:hover:not(:disabled) { - border-color: var(--text-secondary); - background: var(--background); -} - -.bsky-handle-input:focus:not(:disabled) { - outline: none; - border-color: var(--primary); - background: var(--background); - box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.15); -} - -.bsky-handle-input.error { - border-color: var(--error); - background: rgba(var(--error-rgb), 0.05); -} - -.bsky-handle-input.error:focus { - box-shadow: 0 0 0 3px rgba(var(--error-rgb), 0.15); -} - -.bsky-handle-input:disabled { - opacity: 0.6; - cursor: not-allowed; - background: var(--surface); - border-color: var(--border); -} - -.bsky-handle-input::placeholder { +/* Explanatory Text */ +.bsky-auth-message { color: var(--text-secondary); - opacity: 0.7; + line-height: 1.5; + margin-bottom: 16px; } -/* Auth Button */ +/* Input & Button Overrides */ +.bsky-handle-input, .btn-auth { - width: 100%; - padding: 12px 16px; - font-size: 15px; - font-weight: 700; - color: #ffffff; - background: var(--primary); - border: none; + min-height: 48px; + height: auto; + padding: 14px 16px; + line-height: 1.3; border-radius: 12px; - cursor: pointer; - transition: var(--transition); - position: relative; - overflow: hidden; -} - -.btn-auth::before { - content: ''; - position: absolute; - inset: 0; - background: linear-gradient(90deg, - rgba(255, 255, 255, 0) 0%, - rgba(255, 255, 255, 0.1) 50%, - rgba(255, 255, 255, 0) 100%); - opacity: 0; - transition: opacity 0.3s ease; -} - -.btn-auth:hover:not(:disabled) { - background: var(--primary-hover); - transform: translateY(-1px); -} - -.btn-auth:hover:not(:disabled)::before { - opacity: 1; -} - -.btn-auth:active:not(:disabled) { - transform: translateY(0); -} - -.btn-auth:disabled { - opacity: 0.6; - cursor: not-allowed; - background: var(--primary); + width: 100%; } -/* Auth Message */ -.bsky-auth-message { - margin-top: 4px; - font-size: 14px; - color: var(--text-secondary); - padding: 0 4px; - transition: all 0.3s ease; +.bsky-handle-input { + background: var(--background); + padding-left: 36px; + border: 1px solid rgba(0, 122, 255, 0.15); + transition: border-color 0.2s ease-in-out; } +/* Error States */ .bsky-auth-message.error { color: var(--error); background: rgba(var(--error-rgb), 0.1); - border-radius: 8px; + border-radius: 12px; padding: 12px; margin: 8px 0; } -.auth-error { - font-weight: 500; - line-height: 1.5; - padding: 4px 0; -} - @media (max-width: 768px) { .bsky-connect { - margin-top: 20px; padding: 20px; + border-radius: 16px; } - .sign-in-title { - font-size: 20px; + .bsky-auth-container { + gap: 20px; } } @media (max-width: 480px) { .bsky-connect { padding: 16px; - margin-top: 16px; - } - - .sign-in-title { - font-size: 18px; + border-radius: 12px; } - .bsky-handle-input, - .btn-auth { - padding: 10px 14px 10px 32px; + .bsky-auth-container { + gap: 16px; + margin-top: 20px; } - .input-wrapper::before { - left: 14px; + .bsky-auth-message { + font-size: 14px; } } diff --git a/css/components/buttons.css b/css/components/buttons.css index e3c45bb..ed1adf2 100644 --- a/css/components/buttons.css +++ b/css/components/buttons.css @@ -18,7 +18,6 @@ .btn-auth { background: var(--primary); color: #ffffff; - margin: 0 auto; padding: 12px 24px; min-width: 120px; } diff --git a/css/components/cards.css b/css/components/cards.css deleted file mode 100644 index 70dfe29..0000000 --- a/css/components/cards.css +++ /dev/null @@ -1,220 +0,0 @@ -/* Card Base Styles */ -.feature-card, -.context-card, -.category-section { - background: var(--surface); - padding: 16px; - border: 1px solid var(--border); - border-radius: 16px; - transition: var(--transition); -} - -/* Landing Page Feature Cards - Specific class */ -.landing-feature-card { - background: var(--surface); - padding: 24px; - border: 1px solid var(--border); - border-radius: 20px; - transition: all 0.2s ease-in-out; - display: flex; - align-items: flex-start; - gap: 16px; - position: relative; - overflow: hidden; -} - -.landing-feature-card .feature-icon { - font-size: 28px; - flex-shrink: 0; - display: flex; - align-items: center; - justify-content: center; - width: 48px; - height: 48px; - background: var(--background); - border-radius: 14px; - transition: transform 0.2s ease; -} - -.landing-feature-card .feature-text { - flex: 1; - min-width: 0; -} - -.landing-feature-card .feature-text h3 { - font-size: 20px; - font-weight: 700; - color: var(--primary); - margin: 0 0 8px 0; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - letter-spacing: -0.01em; -} - -.landing-feature-card .feature-text p { - font-size: 15px; - line-height: 1.5; - color: var(--text-secondary); - margin: 0; -} - -/* Landing Feature Card Hover Effects */ -.landing-feature-card:hover { - transform: translateY(-2px); - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); - border-color: var(--primary); - background: linear-gradient(to bottom right, var(--surface), var(--background)); -} - -.landing-feature-card:hover .feature-icon { - transform: scale(1.1); -} - -/* Hover state for other cards */ -.feature-card:hover, -.context-card:hover { - background: var(--background); -} - -/* Category Section Specific */ -.category-section { - margin-bottom: 16px; -} - -.category-section .category-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 12px; -} - -.category-section .category-title { - display: flex; - align-items: center; - gap: 8px; -} - -.category-section .category-title h3 { - margin: 0; - font-size: 20px; - font-weight: 700; - color: var(--text); -} - -.category-section .count { - color: var(--text-secondary); - font-size: 15px; -} - -.category-section .keywords-container { - columns: 3; - column-gap: 24px; - padding: 8px 0; -} - -/* Content Section */ -.content-section { - padding: 16px; - border-bottom: 1px solid var(--border); -} - -.content-section:last-child { - border-bottom: none; -} - -/* List Items */ -.list-item { - padding: 12px 16px; - border-bottom: 1px solid var(--border); - transition: var(--transition); -} - -.list-item:last-child { - border-bottom: none; -} - -.list-item:hover { - background: var(--background); -} - -/* Card Header */ -.card-header { - display: flex; - align-items: center; - gap: 12px; - margin-bottom: 12px; -} - -.card-title { - font-size: 15px; - font-weight: 700; - color: var(--text); - margin: 0; -} - -.card-subtitle { - font-size: 13px; - color: var(--text-secondary); - margin: 0; -} - -/* Card Content */ -.card-content { - font-size: 15px; - line-height: 1.5; - color: var(--text); -} - -/* Card Footer */ -.card-footer { - display: flex; - align-items: center; - gap: 16px; - margin-top: 12px; - padding-top: 12px; - border-top: 1px solid var(--border); -} - -/* Stats Display */ -.stats { - display: flex; - align-items: center; - gap: 4px; - color: var(--text-secondary); - font-size: 13px; -} - -/* Avatar */ -.avatar { - width: 48px; - height: 48px; - border-radius: 50%; - object-fit: cover; -} - -.avatar-small { - width: 32px; - height: 32px; -} - -/* Media Queries */ -@media (max-width: 768px) { - .landing-feature-card { - padding: 20px; - } - - .landing-feature-card .feature-icon { - width: 40px; - height: 40px; - font-size: 24px; - } - - .landing-feature-card .feature-text h3 { - font-size: 18px; - } - - .landing-feature-card .feature-text p { - font-size: 14px; - } -} diff --git a/css/components/cards/base.css b/css/components/cards/base.css new file mode 100644 index 0000000..56257bd --- /dev/null +++ b/css/components/cards/base.css @@ -0,0 +1,29 @@ +/* Card Base Styles */ +.feature-card, +.context-card, +.category-section { + background: var(--surface); + padding: 16px; + border: 1px solid var(--border); + border-radius: 16px; + transition: var(--transition); +} + +/* Hover state for cards */ +.feature-card:hover, +.context-card:hover { + background: var(--background); +} + +/* Avatar */ +.avatar { + width: 48px; + height: 48px; + border-radius: 50%; + object-fit: cover; +} + +.avatar-small { + width: 32px; + height: 32px; +} diff --git a/css/components/cards/category.css b/css/components/cards/category.css new file mode 100644 index 0000000..5f60fbd --- /dev/null +++ b/css/components/cards/category.css @@ -0,0 +1,60 @@ +/* Category Section Specific */ +.category-section { + margin-bottom: 16px; +} + +.category-section .category-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 12px; +} + +.category-section .category-title { + display: flex; + align-items: center; + gap: 8px; +} + +.category-section .category-title h3 { + margin: 0; + font-size: 20px; + font-weight: 700; + color: var(--text); +} + +.category-section .count { + color: var(--text-secondary); + font-size: 15px; +} + +.category-section .keywords-container { + columns: 3; + column-gap: 24px; + padding: 8px 0; +} + +/* Content Section */ +.content-section { + padding: 16px; + border-bottom: 1px solid var(--border); +} + +.content-section:last-child { + border-bottom: none; +} + +/* List Items */ +.list-item { + padding: 12px 16px; + border-bottom: 1px solid var(--border); + transition: var(--transition); +} + +.list-item:last-child { + border-bottom: none; +} + +.list-item:hover { + background: var(--background); +} diff --git a/css/components/cards/components.css b/css/components/cards/components.css new file mode 100644 index 0000000..b431a9c --- /dev/null +++ b/css/components/cards/components.css @@ -0,0 +1,46 @@ +/* Card Header */ +.card-header { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 12px; +} + +.card-title { + font-size: 15px; + font-weight: 700; + color: var(--text); + margin: 0; +} + +.card-subtitle { + font-size: 13px; + color: var(--text-secondary); + margin: 0; +} + +/* Card Content */ +.card-content { + font-size: 15px; + line-height: 1.5; + color: var(--text); +} + +/* Card Footer */ +.card-footer { + display: flex; + align-items: center; + gap: 16px; + margin-top: 12px; + padding-top: 12px; + border-top: 1px solid var(--border); +} + +/* Stats Display */ +.stats { + display: flex; + align-items: center; + gap: 4px; + color: var(--text-secondary); + font-size: 13px; +} diff --git a/css/components/cards/index.css b/css/components/cards/index.css new file mode 100644 index 0000000..49157ad --- /dev/null +++ b/css/components/cards/index.css @@ -0,0 +1,5 @@ +/* Import all card-related styles */ +@import 'base.css'; +@import 'landing-feature.css'; +@import 'category.css'; +@import 'components.css'; diff --git a/css/components/cards/landing-feature.css b/css/components/cards/landing-feature.css new file mode 100644 index 0000000..53308fd --- /dev/null +++ b/css/components/cards/landing-feature.css @@ -0,0 +1,68 @@ +/* Landing Page Feature Cards */ +.landing-feature-card { + background: var(--surface); + padding: 24px; + border: 1px solid var(--border); + border-radius: 20px; + display: flex; + align-items: flex-start; + gap: 16px; + position: relative; + overflow: hidden; +} + +.landing-feature-card .feature-icon { + font-size: 28px; + flex-shrink: 0; + display: flex; + align-items: center; + justify-content: center; + width: 48px; + height: 48px; + background: var(--background); + border-radius: 14px; +} + +.landing-feature-card .feature-text { + flex: 1; + min-width: 0; +} + +.landing-feature-card .feature-text h3 { + font-size: 20px; + font-weight: 700; + color: var(--primary); + margin: 0 0 8px 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + letter-spacing: -0.01em; +} + +.landing-feature-card .feature-text p { + font-size: 15px; + line-height: 1.5; + color: var(--text-secondary); + margin: 0; +} + +/* Media Queries */ +@media (max-width: 768px) { + .landing-feature-card { + padding: 20px; + } + + .landing-feature-card .feature-icon { + width: 40px; + height: 40px; + font-size: 24px; + } + + .landing-feature-card .feature-text h3 { + font-size: 18px; + } + + .landing-feature-card .feature-text p { + font-size: 14px; + } +} diff --git a/css/components/footer.css b/css/components/footer.css index 42b606b..931a3bd 100644 --- a/css/components/footer.css +++ b/css/components/footer.css @@ -111,7 +111,7 @@ .theme-toggle .moon-icon { margin-left: auto; - transform: translateX(2px); + transform: translateX(1px); } /* Hide emoji in dark mode */ diff --git a/css/components/forms.css b/css/components/forms.css index 930bf37..1cb2ee0 100644 --- a/css/components/forms.css +++ b/css/components/forms.css @@ -1,198 +1,7 @@ -/* Search Input */ -.sidebar-search { - width: 100%; - padding: 12px; - border: 1px solid var(--border); - border-radius: 9999px; - font-size: 15px; - background: transparent; - color: var(--text); - transition: var(--transition); -} - -.sidebar-search::placeholder { - color: var(--text-secondary); -} - -.sidebar-search:focus { - outline: none; - border-color: var(--primary); - background: transparent; -} - -/* Bluesky Handle Input */ -.input-wrapper { - position: relative; - width: 100%; -} - -.input-wrapper::before { - content: '@'; - position: absolute; - left: 16px; - top: 50%; - transform: translateY(-50%); - color: var(--text-secondary); - font-size: 15px; - z-index: 1; - pointer-events: none; -} - -.bsky-handle-input { - width: 100%; - height: 48px; - padding: 0 16px 0 36px; - border: none; - border-radius: 8px; - font-size: 15px; - background: var(--background); - color: var(--text); - transition: var(--transition); -} - -.bsky-handle-input::placeholder { - color: var(--text-secondary); - opacity: 0.7; -} - -.bsky-handle-input:focus { - outline: none; - background: var(--background); - box-shadow: 0 0 0 2px var(--primary); -} - -.bsky-handle-input.error { - background: rgba(220, 53, 69, 0.1); - box-shadow: 0 0 0 2px var(--danger); - animation: shake 0.5s; -} - -/* Checkbox */ -.keyword-checkbox { - display: flex; - align-items: center; - break-inside: avoid; - padding: 8px 0; - cursor: pointer; - color: var(--text); - font-size: 15px; - gap: 8px; -} - -.keyword-checkbox input[type="checkbox"] { - appearance: none; - -webkit-appearance: none; - width: 18px; - height: 18px; - border: 1px solid var(--text-secondary); - border-radius: 4px; - background: transparent; - cursor: pointer; - position: relative; - transition: var(--transition); -} - -.keyword-checkbox input[type="checkbox"]:checked { - background: var(--primary); - border-color: var(--primary); -} - -.keyword-checkbox input[type="checkbox"]:checked::after { - content: ''; - position: absolute; - left: 5px; - top: 2px; - width: 4px; - height: 8px; - border: solid white; - border-width: 0 2px 2px 0; - transform: rotate(45deg); -} - -.keyword-checkbox input[type="checkbox"]:indeterminate { - background: transparent; - border-color: var(--primary); -} - -.keyword-checkbox input[type="checkbox"]:indeterminate::after { - content: ''; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - width: 10px; - height: 2px; - background: var(--primary); -} - -.keyword-checkbox input[type="checkbox"]:focus { - outline: none; - border-color: var(--primary); -} - -.keyword-checkbox:hover input[type="checkbox"]:not(:checked) { - border-color: var(--text); -} - -/* Category Links */ -.category-name { - color: var(--text); - text-decoration: none; - cursor: pointer; -} - -.category-name:hover { - color: var(--primary); -} - -/* Select Inputs */ -select { - padding: 12px; - border: 1px solid var(--border); - border-radius: 4px; - font-size: 15px; - background: transparent; - color: var(--text); - cursor: pointer; - transition: var(--transition); -} - -select:focus { - outline: none; - border-color: var(--primary); -} - -/* Radio Buttons */ -input[type="radio"] { - appearance: none; - -webkit-appearance: none; - width: 18px; - height: 18px; - border: 2px solid var(--border); - border-radius: 50%; - background: transparent; - cursor: pointer; - position: relative; - transition: var(--transition); -} - -input[type="radio"]:checked { - border-color: var(--primary); -} - -input[type="radio"]:checked::after { - content: ''; - position: absolute; - left: 3px; - top: 3px; - width: 8px; - height: 8px; - border-radius: 50%; - background: var(--primary); -} - -@keyframes shake { - 0%, 100% { transform: translateX(0); } - 25% { transform: translateX(-5px); } - 75% { transform: translateX(5px); } -} +/* Import split form components */ +@import './forms/search.css'; +@import './forms/handle-input.css'; +@import './forms/checkboxes.css'; +@import './forms/category-links.css'; +@import './forms/select.css'; +@import './forms/radio.css'; diff --git a/css/components/forms/category-links.css b/css/components/forms/category-links.css new file mode 100644 index 0000000..6211b3b --- /dev/null +++ b/css/components/forms/category-links.css @@ -0,0 +1,10 @@ +/* Category Links */ +.category-name { + color: var(--text); + text-decoration: none; + cursor: pointer; +} + +.category-name:hover { + color: var(--primary); +} diff --git a/css/components/forms/checkboxes.css b/css/components/forms/checkboxes.css new file mode 100644 index 0000000..0a25000 --- /dev/null +++ b/css/components/forms/checkboxes.css @@ -0,0 +1,66 @@ +/* Checkbox */ +.keyword-checkbox { + display: flex; + align-items: center; + break-inside: avoid; + padding: 8px 0; + cursor: pointer; + color: var(--text); + font-size: 15px; + gap: 8px; +} + +.keyword-checkbox input[type="checkbox"] { + appearance: none; + -webkit-appearance: none; + width: 18px; + height: 18px; + border: 1px solid var(--text-secondary); + border-radius: 4px; + background: transparent; + cursor: pointer; + position: relative; + transition: var(--transition); +} + +.keyword-checkbox input[type="checkbox"]:checked { + background: var(--primary); + border-color: var(--primary); +} + +.keyword-checkbox input[type="checkbox"]:checked::after { + content: ''; + position: absolute; + left: 5px; + top: 2px; + width: 4px; + height: 8px; + border: solid white; + border-width: 0 2px 2px 0; + transform: rotate(45deg); +} + +.keyword-checkbox input[type="checkbox"]:indeterminate { + background: transparent; + border-color: var(--primary); +} + +.keyword-checkbox input[type="checkbox"]:indeterminate::after { + content: ''; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 10px; + height: 2px; + background: var(--primary); +} + +.keyword-checkbox input[type="checkbox"]:focus { + outline: none; + border-color: var(--primary); +} + +.keyword-checkbox:hover input[type="checkbox"]:not(:checked) { + border-color: var(--text); +} diff --git a/css/components/forms/handle-input.css b/css/components/forms/handle-input.css new file mode 100644 index 0000000..f16ca19 --- /dev/null +++ b/css/components/forms/handle-input.css @@ -0,0 +1,53 @@ +/* Bluesky Handle Input */ +.input-wrapper { + position: relative; + width: 100%; +} + +.input-wrapper::before { + content: '@'; + position: absolute; + left: 16px; + top: 50%; + transform: translateY(-50%); + color: var(--text-secondary); + font-size: 15px; + z-index: 1; + pointer-events: none; +} + +.bsky-handle-input { + width: 100%; + height: 48px; + padding: 0 16px 0 36px; + border: none; + border-radius: 8px; + font-size: 15px; + background: var(--background); + color: var(--text); + transition: var(--transition); +} + +.bsky-handle-input::placeholder { + color: var(--text-secondary); + opacity: 0.7; +} + +.bsky-handle-input:focus { + outline: none; + background: var(--background); + box-shadow: 0 0 0 2px var(--primary); +} + +.bsky-handle-input.error { + background: rgba(220, 53, 69, 0.1); + box-shadow: 0 0 0 2px var(--danger); + animation: shake 0.5s; +} + +/* Animation for error state */ +@keyframes shake { + 0%, 100% { transform: translateX(0); } + 25% { transform: translateX(-5px); } + 75% { transform: translateX(5px); } +} diff --git a/css/components/forms/radio.css b/css/components/forms/radio.css new file mode 100644 index 0000000..1d95741 --- /dev/null +++ b/css/components/forms/radio.css @@ -0,0 +1,28 @@ +/* Radio Buttons */ +input[type="radio"] { + appearance: none; + -webkit-appearance: none; + width: 18px; + height: 18px; + border: 2px solid var(--border); + border-radius: 50%; + background: transparent; + cursor: pointer; + position: relative; + transition: var(--transition); +} + +input[type="radio"]:checked { + border-color: var(--primary); +} + +input[type="radio"]:checked::after { + content: ''; + position: absolute; + left: 3px; + top: 3px; + width: 8px; + height: 8px; + border-radius: 50%; + background: var(--primary); +} diff --git a/css/components/forms/search.css b/css/components/forms/search.css new file mode 100644 index 0000000..a8ab937 --- /dev/null +++ b/css/components/forms/search.css @@ -0,0 +1,21 @@ +/* Search Input */ +.sidebar-search { + width: 100%; + padding: 12px; + border: 1px solid var(--border); + border-radius: 9999px; + font-size: 15px; + background: transparent; + color: var(--text); + transition: var(--transition); +} + +.sidebar-search::placeholder { + color: var(--text-secondary); +} + +.sidebar-search:focus { + outline: none; + border-color: var(--primary); + background: transparent; +} diff --git a/css/components/forms/select.css b/css/components/forms/select.css new file mode 100644 index 0000000..36270c8 --- /dev/null +++ b/css/components/forms/select.css @@ -0,0 +1,16 @@ +/* Select Inputs */ +select { + padding: 12px; + border: 1px solid var(--border); + border-radius: 4px; + font-size: 15px; + background: transparent; + color: var(--text); + cursor: pointer; + transition: var(--transition); +} + +select:focus { + outline: none; + border-color: var(--primary); +} diff --git a/css/components/index.css b/css/components/index.css index 8d290a7..bb604d2 100644 --- a/css/components/index.css +++ b/css/components/index.css @@ -1,7 +1,7 @@ /* Component Styles */ @import 'buttons.css'; @import 'forms.css'; -@import 'cards.css'; +@import 'cards/index.css'; @import 'toggles.css'; @import 'auth.css'; @import 'media.css'; diff --git a/css/components/landing.css b/css/components/landing.css index d7cb1d1..4235a52 100644 --- a/css/components/landing.css +++ b/css/components/landing.css @@ -1,166 +1,7 @@ -/* Split Layout for Landing Page */ -.split-layout { - display: flex; - height: 100vh; - background: var(--surface); - overflow: hidden; -} - -/* Branding Section (Left) */ -.branding-section { - flex: 0 0 var(--branding-width); - background: var(--background); - display: flex; - align-items: center; - justify-content: center; - padding: 32px; -} - -.branding-content { - text-align: center; - max-width: 420px; -} - -.logo { - margin-bottom: 24px; - filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.1)); -} - -.logo img { - width: 245px; /* Half of original 490px width */ - height: auto; - display: block; - margin: 0 auto; -} - -.branding-content h1 { - font-size: 48px; - font-weight: 800; - color: var(--text); - margin-bottom: 16px; - letter-spacing: -0.02em; -} - -.tagline { - font-size: 20px; - line-height: 1.4; - color: var(--text-secondary); - margin: 0 auto; - max-width: 360px; -} - -/* Content Section (Right) */ -.content-section { - flex: 0 0 var(--content-width); - background: var(--surface); - display: flex; - flex-direction: column; - height: 100vh; -} - -.content-wrapper { - max-width: 720px; - margin: 0 auto; - padding: 32px; - width: 100%; - display: flex; - flex-direction: column; - justify-content: center; - height: 100%; - gap: 32px; -} - -/* Landing Content */ -.landing-content { - max-width: 800px; - margin: 0 auto; - padding: var(--spacing-xl); - text-align: center; - min-height: 100vh; - display: flex; - flex-direction: column; - justify-content: center; - gap: var(--spacing-xl); -} - -.landing-header h1 { - font-size: 2.5rem; - margin-bottom: var(--spacing-md); -} - -.feature-card h3 { - color: var(--primary); - margin-bottom: var(--spacing-sm); -} - -/* Responsive Layout */ -@media (max-width: 1200px) { - .content-wrapper { - padding: 24px; - } -} - -@media (max-width: 1024px) { - .split-layout { - flex-direction: column; - height: auto; - min-height: 100vh; - } - - .branding-section, - .content-section { - flex: 0 0 auto; - width: 100%; - height: auto; - } - - .branding-section { - padding: 48px 24px; - } - - .content-wrapper { - padding: 32px 24px; - gap: 32px; - } - - .branding-content { - max-width: 100%; - } - - .tagline { - max-width: 480px; - } -} - -@media (max-width: 768px) { - .landing-content { - padding: var(--spacing-md); - } - - .logo img { - width: 200px; - } -} - -@media (max-width: 480px) { - .branding-section { - padding: 32px 20px; - } - - .content-wrapper { - padding: 24px 20px; - } - - .logo img { - width: 160px; - } - - .branding-content h1 { - font-size: 36px; - margin-bottom: 12px; - } - - .tagline { - font-size: 18px; - } -} +/* Landing Page Styles - Split into modular files */ +@import 'landing/layout.landing.css'; +@import 'landing/branding.landing.css'; +@import 'landing/features.landing.css'; +@import 'landing/auth.landing.css'; +@import 'landing/theme-toggle.landing.css'; +@import 'landing/responsive.landing.css'; diff --git a/css/components/landing/auth.landing.css b/css/components/landing/auth.landing.css new file mode 100644 index 0000000..fe6a71a --- /dev/null +++ b/css/components/landing/auth.landing.css @@ -0,0 +1,35 @@ +/* Auth Section */ +.bsky-connect { + padding: 32px; + background: var(--background); + border-radius: 12px; + margin-bottom: 96px; + position: relative; +} + +.bsky-connect:after { + content: ""; + position: absolute; + bottom: -48px; + left: 50%; + transform: translateX(-50%); + width: 64px; + height: 4px; + background: var(--primary); + border-radius: 2px; + opacity: 0.3; +} + +.sign-in-title { + font-size: 24px; + font-weight: 700; + margin-bottom: 24px; + color: var(--text); +} + +.bsky-auth-message { + color: var(--text-secondary); + margin-bottom: 16px; + font-size: 16px; + line-height: 1.5; +} diff --git a/css/components/landing/branding.landing.css b/css/components/landing/branding.landing.css new file mode 100644 index 0000000..fb04d39 --- /dev/null +++ b/css/components/landing/branding.landing.css @@ -0,0 +1,77 @@ +/* Branding Section (Left) */ +.branding-section { + flex: 0 0 var(--branding-width); + background: var(--background); + position: sticky; + top: 0; + height: 100vh; + display: flex; + align-items: center; + justify-content: center; + padding: 32px; +} + +.branding-content { + text-align: center; + max-width: 420px; +} + +.logo { + margin-bottom: 24px; + filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.1)); +} + +.logo img { + width: 245px; + height: auto; + display: block; + margin: 0 auto; +} + +.branding-content h1 { + font-size: 48px; + font-weight: 800; + color: var(--text); + margin-bottom: 16px; + letter-spacing: -0.02em; +} + +.tagline { + font-size: 20px; + line-height: 1.4; + color: var(--text-secondary); + margin: 0 auto; + max-width: 360px; +} + +/* Built by Section */ +.built-by-section { + text-align: center; + margin-top: 64px; + padding-top: 32px; + border-top: 1px solid var(--border); +} + +.built-by-content { + display: flex; + align-items: center; + justify-content: center; + gap: 16px; +} + +.built-by-content p { + font-size: 16px; + line-height: 1.5; + color: var(--text-secondary); + margin: 0; +} + +.built-by-content a { + color: var(--primary); + text-decoration: none; + transition: color 0.2s ease; +} + +.built-by-content a:hover { + color: var(--primary-hover); +} diff --git a/css/components/landing/features.landing.css b/css/components/landing/features.landing.css new file mode 100644 index 0000000..e534131 --- /dev/null +++ b/css/components/landing/features.landing.css @@ -0,0 +1,178 @@ +/* Feature Grid */ +.feature-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 24px; + margin-bottom: 32px; +} + +.landing-feature-card { + background: var(--background); + padding: 24px; + border-radius: 12px; + display: flex; + align-items: flex-start; + gap: 16px; +} + +.feature-icon { + font-size: 24px; + line-height: 1; +} + +.feature-text h3 { + font-size: 18px; + font-weight: 600; + margin-bottom: 8px; + color: var(--text); +} + +.feature-text p { + font-size: 14px; + line-height: 1.5; + color: var(--text-secondary); + margin: 0; +} + +/* Detailed Features Section */ +.detailed-features { + padding-top: 0; +} + +.section-intro { + text-align: center; + margin-bottom: 48px; + max-width: 600px; + margin-left: auto; + margin-right: auto; +} + +.section-intro h2 { + font-size: 36px; + font-weight: 800; + color: var(--text); + margin-bottom: 16px; + letter-spacing: -0.02em; +} + +.section-intro p { + font-size: 18px; + line-height: 1.6; + color: var(--text-secondary); +} + +.feature-blocks { + display: flex; + flex-direction: column; + gap: 48px; +} + +.feature-block { + display: flex; + flex-direction: column; + gap: 32px; + opacity: 0; + transform: translateY(20px); + animation: fadeInUp 0.6s ease forwards; +} + +.feature-block:nth-child(1) { animation-delay: 0.1s; } +.feature-block:nth-child(2) { animation-delay: 0.2s; } +.feature-block:nth-child(3) { animation-delay: 0.3s; } +.feature-block:nth-child(4) { animation-delay: 0.4s; } + +@keyframes fadeInUp { + to { + opacity: 1; + transform: translateY(0); + } +} + +.feature-image { + border-radius: 12px; + overflow: hidden; + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1); + background: var(--background); + aspect-ratio: 16 / 9; + background-size: cover; + background-position: center; + background-repeat: no-repeat; + transition: background-image 0.3s ease; + position: relative; +} + +/* Add loading state */ +.feature-image.loading::before { + content: ''; + position: absolute; + inset: 0; + background-color: var(--background); + animation: pulse 1.5s ease-in-out infinite; +} + +@keyframes pulse { + 0% { opacity: 0.6; } + 50% { opacity: 0.8; } + 100% { opacity: 0.6; } +} + +/* Error state styling */ +.feature-image.image-load-error { + background-color: var(--background); + border: 2px dashed var(--border-color); +} + +.feature-image.image-load-error::after { + content: '⚠️ Image failed to load'; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + color: var(--text); + font-size: 14px; + text-align: center; + padding: 8px 16px; + background-color: var(--background); + border-radius: 6px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); +} + +.feature-description { + color: var(--text); +} + +.feature-description h3 { + font-size: 24px; + font-weight: 700; + margin-bottom: 16px; + color: var(--text); +} + +.feature-description p { + font-size: 16px; + line-height: 1.6; + color: var(--text-secondary); + margin-bottom: 16px; +} + +.feature-description ul { + list-style: none; + padding: 0; + margin: 16px 0; +} + +.feature-description li { + font-size: 16px; + line-height: 1.6; + color: var(--text-secondary); + margin-bottom: 8px; + padding-left: 24px; + position: relative; +} + +.feature-description li:before { + content: "•"; + position: absolute; + left: 8px; + color: var(--primary); +} diff --git a/css/components/landing/layout.landing.css b/css/components/landing/layout.landing.css new file mode 100644 index 0000000..1dc978e --- /dev/null +++ b/css/components/landing/layout.landing.css @@ -0,0 +1,21 @@ +/* Split Layout for Landing Page */ +.split-layout { + display: flex; + min-height: 100vh; + background: var(--surface); +} + +/* Content Section (Right) */ +.content-section { + flex: 0 0 var(--content-width); + background: var(--surface); + min-height: 100vh; + overflow-y: auto; +} + +.content-wrapper { + max-width: 720px; + margin: 0 auto; + padding: 24px 32px; + width: 100%; +} diff --git a/css/components/landing/responsive.landing.css b/css/components/landing/responsive.landing.css new file mode 100644 index 0000000..00277bd --- /dev/null +++ b/css/components/landing/responsive.landing.css @@ -0,0 +1,159 @@ +/* Responsive Layout */ +@media (max-width: 1200px) { + .content-wrapper { + padding: 32px 24px; + } +} + +@media (max-width: 1024px) { + .split-layout { + flex-direction: column; + } + + .branding-section { + position: relative; + flex: 0 0 auto; + width: 100%; + height: auto; + min-height: 50vh; + padding: 48px 24px; + } + + .content-section { + flex: 0 0 auto; + width: 100%; + } + + .content-wrapper { + padding: 32px 24px; + } + + .branding-content { + max-width: 100%; + } + + .tagline { + max-width: 480px; + } + + .feature-grid { + grid-template-columns: 1fr; + } + + .feature-blocks { + gap: 64px; + } + + .section-intro { + margin-bottom: 48px; + } + + .bsky-connect { + margin-bottom: 80px; + } + + .bsky-connect:after { + bottom: -40px; + width: 48px; + } + + .built-by-section { + margin-top: 48px; + } +} + +@media (max-width: 768px) { + .logo img { + width: 200px; + } + + .section-intro h2 { + font-size: 32px; + } + + .section-intro p { + font-size: 16px; + } + + .feature-description h3 { + font-size: 20px; + } + + .feature-description p, + .feature-description li { + font-size: 15px; + } + + .feature-blocks { + gap: 48px; + } + + .feature-block { + gap: 24px; + } + + .built-by-section { + margin-top: 40px; + padding-top: 24px; + } + + .built-by-content { + flex-direction: column; + gap: 12px; + } +} + +@media (max-width: 480px) { + .branding-section { + padding: 32px 20px; + min-height: auto; + } + + .content-wrapper { + padding: 24px 20px; + } + + .logo img { + width: 160px; + } + + .branding-content h1 { + font-size: 36px; + margin-bottom: 12px; + } + + .tagline { + font-size: 18px; + } + + .feature-blocks { + gap: 40px; + } + + .section-intro { + margin-bottom: 40px; + } + + .section-intro h2 { + font-size: 28px; + } + + .bsky-connect { + margin-bottom: 64px; + padding: 24px; + } + + .bsky-connect:after { + bottom: -32px; + width: 40px; + } + + .built-by-section { + margin-top: 32px; + padding-top: 20px; + } + + .built-by-content p { + font-size: 14px; + } +} diff --git a/css/components/landing/theme-toggle.landing.css b/css/components/landing/theme-toggle.landing.css new file mode 100644 index 0000000..938eabb --- /dev/null +++ b/css/components/landing/theme-toggle.landing.css @@ -0,0 +1,71 @@ +/* Theme Toggle Switch */ +.theme-toggle { + position: relative; + width: 64px; + height: 32px; + border-radius: 50px; + border: none; + background: none; + cursor: pointer; + display: inline-flex; + align-items: center; + justify-content: space-between; + padding: 4px 8px; + outline: none; + background-color: var(--background); + border: 2px solid var(--border); + transition: all 0.3s ease; + margin-left: 8px; +} + +.theme-toggle:hover { + border-color: var(--primary); +} + +.theme-toggle::before { + content: ""; + position: absolute; + left: 4px; + width: 24px; + height: 24px; + border-radius: 50%; + background: var(--primary); + transition: transform 0.3s ease, background-color 0.3s ease; +} + +.theme-toggle.dark::before { + transform: translateX(28px); +} + +.theme-toggle .toggle-icon { + display: flex; + align-items: center; + justify-content: center; + z-index: 1; + color: var(--text); + font-size: 14px; + line-height: 1; + width: 20px; + height: 20px; + position: relative; +} + +.theme-toggle .sun-icon { + margin-right: auto; + transform: translateX(-2px); +} + +.theme-toggle .moon-icon { + margin-left: auto; + transform: translateX(1px); +} + +/* Hide emoji in dark mode */ +.theme-toggle.dark .sun-icon { + opacity: 0.5; +} + +/* Hide emoji in light mode */ +.theme-toggle:not(.dark) .moon-icon { + opacity: 0.5; +} diff --git a/css/components/media.css b/css/components/media.css index f494dce..57d03ca 100644 --- a/css/components/media.css +++ b/css/components/media.css @@ -19,7 +19,6 @@ .bsky-connect { flex-direction: column; width: 100%; - padding: 0 var(--spacing-md); } .bsky-auth-container { diff --git a/css/components/nav/user-menu-base.css b/css/components/nav/user-menu-base.css new file mode 100644 index 0000000..b0cd31e --- /dev/null +++ b/css/components/nav/user-menu-base.css @@ -0,0 +1,41 @@ +/* User Menu Base Styles */ +.user-menu { + position: relative; +} + +.profile-button { + display: flex; + align-items: center; + gap: var(--spacing-sm); + padding: 8px; + border: none; + background: none; + color: var(--text); + cursor: pointer; + border-radius: var(--border-radius); + transition: var(--transition); +} + +.profile-button:hover { + background: var(--background); +} + +.profile-pic { + width: 32px; + height: 32px; + border-radius: 50%; + background: var(--background); + overflow: hidden; +} + +.profile-pic img { + width: 100%; + height: 100%; + object-fit: cover; +} + +/* Override any parent constraints */ +.nav-group:last-child .user-menu { + min-width: auto !important; + width: auto !important; +} diff --git a/css/components/nav/user-menu-dropdown.css b/css/components/nav/user-menu-dropdown.css new file mode 100644 index 0000000..7f6c628 --- /dev/null +++ b/css/components/nav/user-menu-dropdown.css @@ -0,0 +1,66 @@ +/* User Menu Dropdown Styles */ + +/* Overlay background when menu is open */ +.user-menu::before { + content: ''; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.3); + display: none; + z-index: 100; +} + +.user-menu.active::before { + display: block; +} + +.user-menu-dropdown { + position: absolute; + top: calc(100% + 8px); + right: 0; + background: var(--surface); + border: 1px solid var(--border); + border-radius: var(--border-radius-lg); + box-shadow: var(--card-shadow); + width: 320px !important; + min-width: 320px !important; + max-width: calc(100vw - 32px) !important; + display: none; + z-index: 101; + flex-shrink: 0; +} + +.user-menu.active .user-menu-dropdown { + display: block; +} + +.user-menu-header { + padding: var(--spacing-md) var(--spacing-lg); + border-bottom: 1px solid var(--border); + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--spacing-md); +} + +.user-handle { + font-size: 1.1rem; + color: var(--text); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + flex: 1; +} + +.total-mutes { + font-size: 0.9rem; + color: var(--text-secondary); + padding: 2px 8px; + background: var(--background); + border-radius: var(--border-radius); + white-space: nowrap; + flex-shrink: 0; +} diff --git a/css/components/nav/user-menu-items.css b/css/components/nav/user-menu-items.css new file mode 100644 index 0000000..3d3464e --- /dev/null +++ b/css/components/nav/user-menu-items.css @@ -0,0 +1,69 @@ +/* User Menu Items Styles */ +.user-menu-item { + padding: var(--spacing-md) var(--spacing-lg); + color: var(--text); + cursor: pointer; + transition: var(--transition); + display: flex; + align-items: center; + gap: var(--spacing-md); + font-size: 0.95rem; + min-height: 44px; +} + +.user-menu-item svg { + color: var(--text-secondary); + flex-shrink: 0; + position: relative; + top: 1px; + width: 20px; + height: 20px; +} + +#refresh-data { + min-width: 160px; + justify-content: flex-start; +} + +#refresh-data svg { + transform-origin: center; + flex-shrink: 0; + width: 20px; +} + +#refresh-data span { + flex: 1; + text-align: left; + white-space: nowrap; +} + +.user-menu-item:hover { + background: var(--background); + text-decoration: none; +} + +.user-menu-item:hover svg { + color: var(--text); +} + +.user-menu-item.logout { + color: var(--text); + margin-top: var(--spacing-sm); + border-top: 1px solid var(--border); + padding-top: calc(var(--spacing-md) + 4px); + gap: calc(var(--spacing-md) + 16px); +} + +.user-menu-item.logout svg { + color: var(--text-secondary); + position: relative; + top: 4px; + margin-left: 3px; +} + +.mobile-mode-switches { + display: none; + border-bottom: 1px solid var(--border); + padding-bottom: var(--spacing-sm); + margin-bottom: var(--spacing-sm); +} diff --git a/css/components/nav/user-menu-responsive.css b/css/components/nav/user-menu-responsive.css new file mode 100644 index 0000000..45b7779 --- /dev/null +++ b/css/components/nav/user-menu-responsive.css @@ -0,0 +1,18 @@ +/* User Menu Responsive Styles */ +@media (max-width: 768px) { + .mobile-mode-switches { + display: block; + } +} + +@media (max-width: 400px) { + .total-mutes { + display: none; + } + + .user-menu-dropdown { + width: calc(100vw - 32px) !important; + min-width: auto !important; + right: -8px; + } +} diff --git a/css/components/nav/user-menu.css b/css/components/nav/user-menu.css index c579797..3f13f86 100644 --- a/css/components/nav/user-menu.css +++ b/css/components/nav/user-menu.css @@ -1,193 +1,5 @@ /* User Menu Styles */ -.user-menu { - position: relative; -} - -.profile-button { - display: flex; - align-items: center; - gap: var(--spacing-sm); - padding: 8px; - border: none; - background: none; - color: var(--text); - cursor: pointer; - border-radius: var(--border-radius); - transition: var(--transition); -} - -.profile-button:hover { - background: var(--background); -} - -.profile-pic { - width: 32px; - height: 32px; - border-radius: 50%; - background: var(--background); - overflow: hidden; -} - -.profile-pic img { - width: 100%; - height: 100%; - object-fit: cover; -} - -/* Overlay background when menu is open */ -.user-menu::before { - content: ''; - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: rgba(0, 0, 0, 0.3); - display: none; - z-index: 100; -} - -.user-menu.active::before { - display: block; -} - -.user-menu-dropdown { - position: absolute; - top: calc(100% + 8px); - right: 0; - background: var(--surface); - border: 1px solid var(--border); - border-radius: var(--border-radius-lg); - box-shadow: var(--card-shadow); - width: 320px !important; - min-width: 320px !important; - max-width: calc(100vw - 32px) !important; - display: none; - z-index: 101; - flex-shrink: 0; -} - -.user-menu.active .user-menu-dropdown { - display: block; -} - -.user-menu-header { - padding: var(--spacing-md) var(--spacing-lg); - border-bottom: 1px solid var(--border); - display: flex; - align-items: center; - justify-content: space-between; - gap: var(--spacing-md); -} - -.user-handle { - font-size: 1.1rem; - color: var(--text); - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - flex: 1; -} - -.total-mutes { - font-size: 0.9rem; - color: var(--text-secondary); - padding: 2px 8px; - background: var(--background); - border-radius: var(--border-radius); - white-space: nowrap; - flex-shrink: 0; -} - -.user-menu-item { - padding: var(--spacing-md) var(--spacing-lg); - color: var(--text); - cursor: pointer; - transition: var(--transition); - display: flex; - align-items: center; - gap: var(--spacing-md); - font-size: 0.95rem; - min-height: 44px; -} - -.user-menu-item svg { - color: var(--text-secondary); - flex-shrink: 0; - position: relative; - top: 1px; - width: 20px; - height: 20px; -} - -#refresh-data { - min-width: 160px; - justify-content: flex-start; -} - -#refresh-data svg { - transform-origin: center; - flex-shrink: 0; - width: 20px; -} - -#refresh-data span { - flex: 1; - text-align: left; - white-space: nowrap; -} - -.user-menu-item:hover { - background: var(--background); - text-decoration: none; -} - -.user-menu-item:hover svg { - color: var(--text); -} - -.user-menu-item.logout { - color: var(--text); - margin-top: var(--spacing-sm); - border-top: 1px solid var(--border); - padding-top: calc(var(--spacing-md) + 4px); - gap: calc(var(--spacing-md) + 16px); -} - -.user-menu-item.logout svg { - color: var(--text-secondary); - position: relative; - top: 4px; - margin-left: 3px; -} - -.mobile-mode-switches { - display: none; - border-bottom: 1px solid var(--border); - padding-bottom: var(--spacing-sm); - margin-bottom: var(--spacing-sm); -} - -/* Override any parent constraints */ -.nav-group:last-child .user-menu { - min-width: auto !important; - width: auto !important; -} - -@media (max-width: 768px) { - .mobile-mode-switches { - display: block; - } -} - -@media (max-width: 400px) { - .total-mutes { - display: none; - } - - .user-menu-dropdown { - width: calc(100vw - 32px) !important; - min-width: auto !important; - right: -8px; - } -} +@import url('./user-menu-base.css'); +@import url('./user-menu-dropdown.css'); +@import url('./user-menu-items.css'); +@import url('./user-menu-responsive.css'); diff --git a/css/components/scrollbars.css b/css/components/scrollbars.css index be332e4..efcface 100644 --- a/css/components/scrollbars.css +++ b/css/components/scrollbars.css @@ -1,57 +1,89 @@ -/* Dark mode scrollbar styles */ -[data-theme="dark"] .categories-sidebar, -[data-theme="dark"] .categories-grid, -[data-theme="dark"] .keywords-section, -[data-theme="dark"] .context-builder, -[data-theme="dim"] .categories-sidebar, -[data-theme="dim"] .categories-grid, -[data-theme="dim"] .keywords-section, -[data-theme="dim"] .context-builder { +/* Light theme scrollbar colors */ +:root { + --scrollbar-track: #f0f0f0; + --scrollbar-thumb: #a8a8a8; + --scrollbar-thumb-hover: #8b98a5; +} + +/* Dark theme scrollbar colors */ +[data-theme="dark"] { + --scrollbar-track: #1e2732; + --scrollbar-thumb: #38444d; + --scrollbar-thumb-hover: #536471; +} + +/* Firefox scrollbar styles */ +* { + scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track); scrollbar-width: auto; - scrollbar-color: #3f3f4f #1e1e2e; -} - -[data-theme="dark"] .categories-sidebar::-webkit-scrollbar, -[data-theme="dark"] .categories-grid::-webkit-scrollbar, -[data-theme="dark"] .keywords-section::-webkit-scrollbar, -[data-theme="dark"] .context-builder::-webkit-scrollbar, -[data-theme="dim"] .categories-sidebar::-webkit-scrollbar, -[data-theme="dim"] .categories-grid::-webkit-scrollbar, -[data-theme="dim"] .keywords-section::-webkit-scrollbar, -[data-theme="dim"] .context-builder::-webkit-scrollbar { - width: 14px; -} - -[data-theme="dark"] .categories-sidebar::-webkit-scrollbar-track, -[data-theme="dark"] .categories-grid::-webkit-scrollbar-track, -[data-theme="dark"] .keywords-section::-webkit-scrollbar-track, -[data-theme="dark"] .context-builder::-webkit-scrollbar-track, -[data-theme="dim"] .categories-sidebar::-webkit-scrollbar-track, -[data-theme="dim"] .categories-grid::-webkit-scrollbar-track, -[data-theme="dim"] .keywords-section::-webkit-scrollbar-track, -[data-theme="dim"] .context-builder::-webkit-scrollbar-track { - background: #1e1e2e; -} - -[data-theme="dark"] .categories-sidebar::-webkit-scrollbar-thumb, -[data-theme="dark"] .categories-grid::-webkit-scrollbar-thumb, -[data-theme="dark"] .keywords-section::-webkit-scrollbar-thumb, -[data-theme="dark"] .context-builder::-webkit-scrollbar-thumb, -[data-theme="dim"] .categories-sidebar::-webkit-scrollbar-thumb, -[data-theme="dim"] .categories-grid::-webkit-scrollbar-thumb, -[data-theme="dim"] .keywords-section::-webkit-scrollbar-thumb, -[data-theme="dim"] .context-builder::-webkit-scrollbar-thumb { - background: #3f3f4f; - border-radius: 4px; -} - -[data-theme="dark"] .categories-sidebar::-webkit-scrollbar-thumb:hover, -[data-theme="dark"] .categories-grid::-webkit-scrollbar-thumb:hover, -[data-theme="dark"] .keywords-section::-webkit-scrollbar-thumb:hover, -[data-theme="dark"] .context-builder::-webkit-scrollbar-thumb:hover, -[data-theme="dim"] .categories-sidebar::-webkit-scrollbar-thumb:hover, -[data-theme="dim"] .categories-grid::-webkit-scrollbar-thumb:hover, -[data-theme="dim"] .keywords-section::-webkit-scrollbar-thumb:hover, -[data-theme="dim"] .context-builder::-webkit-scrollbar-thumb:hover { - background: #57576a; +} + +/* Webkit scrollbar styles */ +::-webkit-scrollbar { + width: 12px; + height: 12px; +} + +::-webkit-scrollbar-track { + background: var(--scrollbar-track); + border-radius: 6px; +} + +::-webkit-scrollbar-thumb { + background: var(--scrollbar-thumb); + border-radius: 6px; +} + +::-webkit-scrollbar-thumb:hover { + background: var(--scrollbar-thumb-hover); +} + +/* Ensure styles apply to specific components */ +.categories-sidebar, +.categories-grid, +.keywords-section, +.context-builder, +.simple-mode-container, +.advanced-mode-container { + scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track); + scrollbar-width: auto; +} + +.categories-sidebar::-webkit-scrollbar, +.categories-grid::-webkit-scrollbar, +.keywords-section::-webkit-scrollbar, +.context-builder::-webkit-scrollbar, +.simple-mode-container::-webkit-scrollbar, +.advanced-mode-container::-webkit-scrollbar { + width: 12px; + height: 12px; +} + +.categories-sidebar::-webkit-scrollbar-track, +.categories-grid::-webkit-scrollbar-track, +.keywords-section::-webkit-scrollbar-track, +.context-builder::-webkit-scrollbar-track, +.simple-mode-container::-webkit-scrollbar-track, +.advanced-mode-container::-webkit-scrollbar-track { + background: var(--scrollbar-track); + border-radius: 6px; +} + +.categories-sidebar::-webkit-scrollbar-thumb, +.categories-grid::-webkit-scrollbar-thumb, +.keywords-section::-webkit-scrollbar-thumb, +.context-builder::-webkit-scrollbar-thumb, +.simple-mode-container::-webkit-scrollbar-thumb, +.advanced-mode-container::-webkit-scrollbar-thumb { + background: var(--scrollbar-thumb); + border-radius: 6px; +} + +.categories-sidebar::-webkit-scrollbar-thumb:hover, +.categories-grid::-webkit-scrollbar-thumb:hover, +.keywords-section::-webkit-scrollbar-thumb:hover, +.context-builder::-webkit-scrollbar-thumb:hover, +.simple-mode-container::-webkit-scrollbar-thumb:hover, +.advanced-mode-container::-webkit-scrollbar-thumb:hover { + background: var(--scrollbar-thumb-hover); } diff --git a/css/components/settings/appearance-controls.css b/css/components/settings/appearance-controls.css new file mode 100644 index 0000000..7863962 --- /dev/null +++ b/css/components/settings/appearance-controls.css @@ -0,0 +1,53 @@ +/* Appearance Settings */ +.settings-option { + display: flex; + gap: 8px; + margin-bottom: 8px; +} + +.settings-option:last-child { + margin-bottom: 0; +} + +/* Color Mode Selection */ +.mode-switch, +.theme-switch, +.font-switch { + flex: 1; + padding: 12px; + border: 2px solid var(--border); + border-radius: var(--border-radius); + background: var(--background-light); + color: var(--text); + font-size: 14px; + cursor: pointer; + transition: var(--transition); + text-align: center; + font-weight: 500; + position: relative; + display: flex; + align-items: center; + justify-content: center; +} + +.mode-switch:hover, +.theme-switch:hover, +.font-switch:hover { + background: var(--background); + border-color: var(--border-hover); +} + +.mode-switch.active, +.theme-switch.active, +.font-switch.active { + background: var(--primary-light); + border-color: var(--primary); + color: var(--primary); +} + +.mode-switch.active:hover, +.theme-switch.active:hover, +.font-switch.active:hover { + background: var(--primary-light); + border-color: var(--primary); +} diff --git a/css/components/settings/search-controls.css b/css/components/settings/search-controls.css new file mode 100644 index 0000000..e8d94d1 --- /dev/null +++ b/css/components/settings/search-controls.css @@ -0,0 +1,67 @@ +/* Search and Toggle Controls */ +.search-controls { + padding: var(--spacing-md); + display: flex; + flex-direction: column; + gap: var(--spacing-sm); +} + +.search-input { + width: 100%; + height: 36px; + padding: 0 var(--spacing-md); + border: 2px solid var(--border); + border-radius: var(--border-radius); + background: var(--background-light); + color: var(--text); + font-size: 14px; + transition: var(--transition); +} + +.search-input:focus { + outline: none; + border-color: var(--primary); + background: var(--surface); + box-shadow: 0 0 0 1px var(--primary-light); +} + +.search-input:focus::placeholder { + color: transparent; +} + +.search-input::placeholder { + color: var(--text-secondary); +} + +.toggle-controls { + display: flex; + gap: var(--spacing-sm); + height: 36px; +} + +.toggle-button { + flex: 1; + padding: 0 var(--spacing-md); + border: 2px solid var(--border); + border-radius: var(--border-radius); + background: var(--background-light); + color: var(--text); + font-size: 14px; + cursor: pointer; + transition: var(--transition); + text-align: center; + font-weight: 500; + height: 100%; + display: flex; + align-items: center; + justify-content: center; +} + +.toggle-button:hover { + background: var(--background); + border-color: var(--primary); +} + +.toggle-button:active { + background: var(--primary-light); +} diff --git a/css/components/settings/settings-sidebar.css b/css/components/settings/settings-sidebar.css index 2f21bdf..9b7f744 100644 --- a/css/components/settings/settings-sidebar.css +++ b/css/components/settings/settings-sidebar.css @@ -1,222 +1,5 @@ -/* Sidebar Layout */ -.categories-sidebar { - width: 320px; - background: var(--surface); - border-right: 1px solid var(--border); - display: flex; - flex-direction: column; - height: 100%; - border-top-left-radius: var(--border-radius); - border-bottom-left-radius: var(--border-radius); - margin: var(--spacing-xs) 0 var(--spacing-xs) var(--spacing-xs); - box-shadow: 1px 0 2px rgba(0, 0, 0, 0.05); -} - -/* Search and Toggle Controls */ -.search-controls { - padding: var(--spacing-md); - display: flex; - flex-direction: column; - gap: var(--spacing-sm); -} - -.search-input { - width: 100%; - height: 36px; - padding: 0 var(--spacing-md); - border: 2px solid var(--border); - border-radius: var(--border-radius); - background: var(--background-light); - color: var(--text); - font-size: 14px; - transition: var(--transition); -} - -.search-input:focus { - outline: none; - border-color: var(--primary); - background: var(--surface); - box-shadow: 0 0 0 1px var(--primary-light); -} - -.search-input:focus::placeholder { - color: transparent; -} - -.search-input::placeholder { - color: var(--text-secondary); -} - -.toggle-controls { - display: flex; - gap: var(--spacing-sm); - height: 36px; -} - -.toggle-button { - flex: 1; - padding: 0 var(--spacing-md); - border: 2px solid var(--border); - border-radius: var(--border-radius); - background: var(--background-light); - color: var(--text); - font-size: 14px; - cursor: pointer; - transition: var(--transition); - text-align: center; - font-weight: 500; - height: 100%; - display: flex; - align-items: center; - justify-content: center; -} - -.toggle-button:hover { - background: var(--background); - border-color: var(--primary); -} - -.toggle-button:active { - background: var(--primary-light); -} - -.sidebar-header { - padding: 24px; - border-bottom: 1px solid var(--border); - display: flex; - flex-direction: column; - gap: 16px; -} - -.category-list { - flex: 1; - overflow-y: auto; - padding: 16px; -} - -/* Settings Groups */ -.settings-group { - margin-bottom: 24px; -} - -.settings-group:last-child { - margin-bottom: 0; -} - -.settings-group h3 { - margin-bottom: 16px; - font-size: 15px; - font-weight: 500; - color: var(--text); -} - -/* Settings Tabs */ -.settings-tabs { - display: flex; - gap: 0; - border-bottom: 1px solid var(--border); - background: var(--surface); - padding: 0 16px; -} - -.settings-tab { - padding: 16px 24px; - border: none; - background: none; - color: var(--text-secondary); - cursor: pointer; - font-size: 18px; - font-weight: 600; - position: relative; - transition: var(--transition); -} - -.settings-tab:hover { - color: var(--text); -} - -.settings-tab.active { - color: var(--primary); -} - -.settings-tab.active::after { - content: ''; - position: absolute; - bottom: -1px; - left: 0; - right: 0; - height: 2px; - background: var(--primary); -} - -.settings-content { - display: none; - padding: 24px; -} - -.settings-content.active { - display: block; -} - -/* Appearance Settings */ -.settings-option { - display: flex; - gap: 8px; - margin-bottom: 8px; -} - -.settings-option:last-child { - margin-bottom: 0; -} - -/* Color Mode Selection */ -.mode-switch, -.theme-switch, -.font-switch { - flex: 1; - padding: 12px; - border: 2px solid var(--border); - border-radius: var(--border-radius); - background: var(--background-light); - color: var(--text); - font-size: 14px; - cursor: pointer; - transition: var(--transition); - text-align: center; - font-weight: 500; - position: relative; - display: flex; - align-items: center; - justify-content: center; -} - -.mode-switch:hover, -.theme-switch:hover, -.font-switch:hover { - background: var(--background); - border-color: var(--border-hover); -} - -.mode-switch.active, -.theme-switch.active, -.font-switch.active { - background: var(--primary-light); - border-color: var(--primary); - color: var(--primary); -} - -.mode-switch.active:hover, -.theme-switch.active:hover, -.font-switch.active:hover { - background: var(--primary-light); - border-color: var(--primary); -} - -@media (max-width: 768px) { - .categories-sidebar { - width: 100%; - height: auto; - margin: var(--spacing-xs); - border-radius: var(--border-radius); - } -} +/* Settings Sidebar Component - Split into modular files */ +@import 'sidebar-layout.css'; +@import 'search-controls.css'; +@import 'settings-tabs.css'; +@import 'appearance-controls.css'; diff --git a/css/components/settings/settings-tabs.css b/css/components/settings/settings-tabs.css new file mode 100644 index 0000000..7a245cf --- /dev/null +++ b/css/components/settings/settings-tabs.css @@ -0,0 +1,47 @@ +/* Settings Tabs */ +.settings-tabs { + display: flex; + gap: 0; + border-bottom: 1px solid var(--border); + background: var(--surface); + padding: 0 16px; +} + +.settings-tab { + padding: 16px 24px; + border: none; + background: none; + color: var(--text-secondary); + cursor: pointer; + font-size: 18px; + font-weight: 600; + position: relative; + transition: var(--transition); +} + +.settings-tab:hover { + color: var(--text); +} + +.settings-tab.active { + color: var(--primary); +} + +.settings-tab.active::after { + content: ''; + position: absolute; + bottom: -1px; + left: 0; + right: 0; + height: 2px; + background: var(--primary); +} + +.settings-content { + display: none; + padding: 24px; +} + +.settings-content.active { + display: block; +} diff --git a/css/components/settings/sidebar-layout.css b/css/components/settings/sidebar-layout.css new file mode 100644 index 0000000..f187971 --- /dev/null +++ b/css/components/settings/sidebar-layout.css @@ -0,0 +1,52 @@ +/* Sidebar Layout */ +.categories-sidebar { + width: 320px; + background: var(--surface); + border-right: 1px solid var(--border); + display: flex; + flex-direction: column; + height: 100%; + border-top-left-radius: var(--border-radius); + border-bottom-left-radius: var(--border-radius); + margin: var(--spacing-xs) 0 var(--spacing-xs) var(--spacing-xs); + box-shadow: 1px 0 2px rgba(0, 0, 0, 0.05); +} + +.sidebar-header { + padding: 24px; + border-bottom: 1px solid var(--border); + display: flex; + flex-direction: column; + gap: 16px; +} + +.category-list { + flex: 1; + overflow-y: auto; + padding: 16px; +} + +/* Settings Groups */ +.settings-group { + margin-bottom: 24px; +} + +.settings-group:last-child { + margin-bottom: 0; +} + +.settings-group h3 { + margin-bottom: 16px; + font-size: 15px; + font-weight: 500; + color: var(--text); +} + +@media (max-width: 768px) { + .categories-sidebar { + width: 100%; + height: auto; + margin: var(--spacing-xs); + border-radius: var(--border-radius); + } +} diff --git a/css/components/slider.css b/css/components/slider.css index 410a8ac..5526b30 100644 --- a/css/components/slider.css +++ b/css/components/slider.css @@ -81,11 +81,11 @@ } /* Dark Theme Adjustments */ -[data-theme="dim"] .filter-card:hover { +[data-theme="dark"] .filter-card:hover { background: var(--background); } -[data-theme="dim"] .filter-card.active { +[data-theme="dark"] .filter-card.active { background: var(--primary); border-color: var(--primary); } diff --git a/css/components/toggles.css b/css/components/toggles.css index 92cac50..8a64ece 100644 --- a/css/components/toggles.css +++ b/css/components/toggles.css @@ -1,246 +1 @@ -/* Mode Toggle in Top Nav */ -.top-nav .mode-toggle { - display: flex; - gap: 4px; - background: var(--background); - padding: 4px; - border-radius: 9999px; - border: 1px solid var(--border); - width: auto; -} - -.top-nav .mode-switch { - padding: 8px 24px; - border: none; - border-radius: 9999px; - background: transparent; - cursor: pointer; - transition: var(--transition); - color: var(--text-secondary); - font-size: 15px; - font-weight: 400; - text-align: center; - white-space: nowrap; -} - -/* Common hover and active states */ -.mode-switch:hover { - color: var(--text); -} - -.mode-switch.active { - background: var(--surface); - color: var(--text); - font-weight: 600; -} - -/* Toggle All Controls */ -.toggle-all-controls { - display: flex; - gap: 8px; - padding: 4px; -} - -.toggle-all-btn { - flex: 1; - padding: 8px 16px; - border: 1px solid var(--border); - border-radius: 9999px; - background: var(--surface); - font-size: 13px; - font-weight: 500; - color: var(--text); - cursor: pointer; - transition: var(--transition); -} - -.toggle-all-btn:hover { - background: var(--background); -} - -.toggle-all-btn.active { - background: var(--primary); - color: white; - border-color: var(--primary); -} - -/* Muting Settings Radio Buttons */ -.settings-option { - position: relative; - display: flex; - align-items: center; - padding: 10px 14px; - margin: 6px 0; - border-radius: 12px; - transition: var(--transition); - cursor: pointer; - background: var(--background); - border: 1px solid transparent; -} - -.settings-option:hover { - border-color: var(--border); -} - -.settings-option input[type="radio"] { - position: absolute; - opacity: 0; - width: 20px; - height: 20px; - margin: 0; - cursor: pointer; - z-index: 1; -} - -.settings-option .radio-circle { - position: relative; - width: 20px; - height: 20px; - border: 2px solid var(--text-secondary); - border-radius: 50%; - margin-right: 10px; - transition: all 0.2s ease; - pointer-events: none; - flex-shrink: 0; - background: var(--surface); -} - -.settings-option input[type="radio"]:checked + .radio-circle { - border-color: var(--primary); - border-width: 2px; -} - -.settings-option .radio-circle:after { - content: ''; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%) scale(0); - width: 10px; - height: 10px; - border-radius: 50%; - background: var(--primary); - transition: transform 0.2s ease; - pointer-events: none; -} - -.settings-option input[type="radio"]:checked + .radio-circle:after { - transform: translate(-50%, -50%) scale(1); -} - -.settings-option label { - flex: 1; - font-size: 15px; - font-weight: 500; - color: var(--text); - margin-left: 8px; - cursor: pointer; - user-select: none; -} - -/* Checkbox Styling */ -.settings-option input[type="checkbox"] { - position: absolute; - opacity: 0; - width: 20px; - height: 20px; - margin: 0; - cursor: pointer; - z-index: 1; -} - -.settings-option .checkbox-box { - position: relative; - width: 20px; - height: 20px; - border: 2px solid var(--text-secondary); - border-radius: 6px; - margin-right: 10px; - transition: all 0.2s ease; - pointer-events: none; - flex-shrink: 0; - background: var(--surface); -} - -.settings-option input[type="checkbox"]:checked + .checkbox-box { - background: var(--primary); - border-color: var(--primary); -} - -.settings-option .checkbox-box:after { - content: ''; - position: absolute; - top: 45%; - left: 50%; - width: 10px; - height: 6px; - border-left: 2px solid white; - border-bottom: 2px solid white; - transform-origin: center; - transform: translate(-50%, -50%) scale(0) rotate(-45deg); - transition: transform 0.2s ease; - pointer-events: none; -} - -.settings-option input[type="checkbox"]:checked + .checkbox-box:after { - transform: translate(-50%, -50%) scale(1) rotate(-45deg); -} - -/* Settings Groups */ -.settings-group { - margin-bottom: 16px; -} - -.settings-group h3 { - font-size: 15px; - font-weight: 600; - color: var(--text); - margin-bottom: 12px; -} - -/* Appearance Settings */ -#appearance-modal .settings-option { - display: flex; - background: var(--background); - padding: 3px; - border-radius: 9999px; - border: 1px solid var(--border); - margin-top: 8px; -} - -#appearance-modal .mode-switch, -#appearance-modal .theme-switch, -#appearance-modal .font-switch { - flex: 1; - padding: 6px 16px; - border: none; - border-radius: 9999px; - background: transparent; - color: var(--text-secondary); - font-size: 15px; - font-weight: 400; - cursor: pointer; - transition: var(--transition); - text-align: center; -} - -#appearance-modal .mode-switch:hover, -#appearance-modal .theme-switch:hover, -#appearance-modal .font-switch:hover { - color: var(--text); -} - -#appearance-modal .mode-switch.active, -#appearance-modal .theme-switch.active, -#appearance-modal .font-switch.active { - background: var(--surface); - color: var(--text); - font-weight: 600; -} - -#appearance-modal p { - color: var(--text-secondary); - font-size: 14px; - margin: 6px 0; - line-height: 1.4; -} +@import './toggles/index.css'; diff --git a/css/components/toggles/appearance-settings.css b/css/components/toggles/appearance-settings.css new file mode 100644 index 0000000..7473be1 --- /dev/null +++ b/css/components/toggles/appearance-settings.css @@ -0,0 +1,46 @@ +/* Appearance Settings */ +#appearance-modal .settings-option { + display: flex; + background: var(--background); + padding: 3px; + border-radius: 9999px; + border: 1px solid var(--border); + margin-top: 8px; +} + +#appearance-modal .mode-switch, +#appearance-modal .theme-switch, +#appearance-modal .font-switch { + flex: 1; + padding: 6px 16px; + border: none; + border-radius: 9999px; + background: transparent; + color: var(--text-secondary); + font-size: 15px; + font-weight: 400; + cursor: pointer; + transition: var(--transition); + text-align: center; +} + +#appearance-modal .mode-switch:hover, +#appearance-modal .theme-switch:hover, +#appearance-modal .font-switch:hover { + color: var(--text); +} + +#appearance-modal .mode-switch.active, +#appearance-modal .theme-switch.active, +#appearance-modal .font-switch.active { + background: var(--surface); + color: var(--text); + font-weight: 600; +} + +#appearance-modal p { + color: var(--text-secondary); + font-size: 14px; + margin: 6px 0; + line-height: 1.4; +} diff --git a/css/components/toggles/checkboxes.css b/css/components/toggles/checkboxes.css new file mode 100644 index 0000000..9c200d6 --- /dev/null +++ b/css/components/toggles/checkboxes.css @@ -0,0 +1,47 @@ +/* Checkbox Styling */ +.settings-option input[type="checkbox"] { + position: absolute; + opacity: 0; + width: 20px; + height: 20px; + margin: 0; + cursor: pointer; + z-index: 1; +} + +.settings-option .checkbox-box { + position: relative; + width: 20px; + height: 20px; + border: 2px solid var(--text-secondary); + border-radius: 6px; + margin-right: 10px; + transition: all 0.2s ease; + pointer-events: none; + flex-shrink: 0; + background: var(--surface); +} + +.settings-option input[type="checkbox"]:checked + .checkbox-box { + background: var(--primary); + border-color: var(--primary); +} + +.settings-option .checkbox-box:after { + content: ''; + position: absolute; + top: 45%; + left: 50%; + width: 10px; + height: 6px; + border-left: 2px solid white; + border-bottom: 2px solid white; + transform-origin: center; + transform: translate(-50%, -50%) scale(0) rotate(-45deg); + transition: transform 0.2s ease; + pointer-events: none; +} + +.settings-option input[type="checkbox"]:checked + .checkbox-box:after { + transform: translate(-50%, -50%) scale(1) rotate(-45deg); +} diff --git a/css/components/toggles/index.css b/css/components/toggles/index.css new file mode 100644 index 0000000..7547be9 --- /dev/null +++ b/css/components/toggles/index.css @@ -0,0 +1,6 @@ +@import './mode-toggle.css'; +@import './toggle-all.css'; +@import './radio-buttons.css'; +@import './checkboxes.css'; +@import './settings-groups.css'; +@import './appearance-settings.css'; diff --git a/css/components/toggles/mode-toggle.css b/css/components/toggles/mode-toggle.css new file mode 100644 index 0000000..f84c09b --- /dev/null +++ b/css/components/toggles/mode-toggle.css @@ -0,0 +1,35 @@ +/* Mode Toggle in Top Nav */ +.top-nav .mode-toggle { + display: flex; + gap: 4px; + background: var(--background); + padding: 4px; + border-radius: 9999px; + border: 1px solid var(--border); + width: auto; +} + +.top-nav .mode-switch { + padding: 8px 24px; + border: none; + border-radius: 9999px; + background: transparent; + cursor: pointer; + transition: var(--transition); + color: var(--text-secondary); + font-size: 15px; + font-weight: 400; + text-align: center; + white-space: nowrap; +} + +/* Common hover and active states */ +.mode-switch:hover { + color: var(--text); +} + +.mode-switch.active { + background: var(--surface); + color: var(--text); + font-weight: 600; +} diff --git a/css/components/toggles/radio-buttons.css b/css/components/toggles/radio-buttons.css new file mode 100644 index 0000000..3c4f1f4 --- /dev/null +++ b/css/components/toggles/radio-buttons.css @@ -0,0 +1,73 @@ +/* Muting Settings Radio Buttons */ +.settings-option { + position: relative; + display: flex; + align-items: center; + padding: 10px 14px; + margin: 6px 0; + border-radius: 12px; + transition: var(--transition); + cursor: pointer; + background: var(--background); + border: 1px solid transparent; +} + +.settings-option:hover { + border-color: var(--border); +} + +.settings-option input[type="radio"] { + position: absolute; + opacity: 0; + width: 20px; + height: 20px; + margin: 0; + cursor: pointer; + z-index: 1; +} + +.settings-option .radio-circle { + position: relative; + width: 20px; + height: 20px; + border: 2px solid var(--text-secondary); + border-radius: 50%; + margin-right: 10px; + transition: all 0.2s ease; + pointer-events: none; + flex-shrink: 0; + background: var(--surface); +} + +.settings-option input[type="radio"]:checked + .radio-circle { + border-color: var(--primary); + border-width: 2px; +} + +.settings-option .radio-circle:after { + content: ''; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%) scale(0); + width: 10px; + height: 10px; + border-radius: 50%; + background: var(--primary); + transition: transform 0.2s ease; + pointer-events: none; +} + +.settings-option input[type="radio"]:checked + .radio-circle:after { + transform: translate(-50%, -50%) scale(1); +} + +.settings-option label { + flex: 1; + font-size: 15px; + font-weight: 500; + color: var(--text); + margin-left: 8px; + cursor: pointer; + user-select: none; +} diff --git a/css/components/toggles/settings-groups.css b/css/components/toggles/settings-groups.css new file mode 100644 index 0000000..2e72978 --- /dev/null +++ b/css/components/toggles/settings-groups.css @@ -0,0 +1,11 @@ +/* Settings Groups */ +.settings-group { + margin-bottom: 16px; +} + +.settings-group h3 { + font-size: 15px; + font-weight: 600; + color: var(--text); + margin-bottom: 12px; +} diff --git a/css/components/toggles/toggle-all.css b/css/components/toggles/toggle-all.css new file mode 100644 index 0000000..7140743 --- /dev/null +++ b/css/components/toggles/toggle-all.css @@ -0,0 +1,29 @@ +/* Toggle All Controls */ +.toggle-all-controls { + display: flex; + gap: 8px; + padding: 4px; +} + +.toggle-all-btn { + flex: 1; + padding: 8px 16px; + border: 1px solid var(--border); + border-radius: 9999px; + background: var(--surface); + font-size: 13px; + font-weight: 500; + color: var(--text); + cursor: pointer; + transition: var(--transition); +} + +.toggle-all-btn:hover { + background: var(--background); +} + +.toggle-all-btn.active { + background: var(--primary); + color: white; + border-color: var(--primary); +} diff --git a/docs/1-architecture/1-core-concepts.md b/docs/1-architecture/1-core-concepts.md index 70a95a1..0985954 100644 --- a/docs/1-architecture/1-core-concepts.md +++ b/docs/1-architecture/1-core-concepts.md @@ -39,8 +39,7 @@ export const state = { lastModified: null, // Last-Modified header from keywords file // Filter Settings - targetKeywordCount: 100, // Target number of keywords (default: minimal) - filterLevel: 0, // Current filter level (0-3) + filterLevel: 0, // Current filter level (0=Minimal to 3=Complete) lastBulkAction: null // Track when enable/disable all is used } ``` @@ -67,7 +66,6 @@ const saveData = { manuallyUnchecked: Array.from(state.manuallyUnchecked), mode: state.mode, lastModified: state.lastModified, - targetKeywordCount: state.targetKeywordCount, filterLevel: state.filterLevel, lastBulkAction: state.lastBulkAction } @@ -103,7 +101,7 @@ try { - Mode (returns to 'simple') - Selections (contexts, exceptions, categories) - UI state (search, filter, menu) - - Filter settings (level, target count) + - Filter level (returns to 0) ### Cache Management @@ -145,10 +143,14 @@ const debouncedUpdate = (() => { ## Mode System ### Simple Mode -- Context-based filtering with filter levels +- Context-based filtering with filter levels (0-3) - Keywords derived from selected contexts - Exceptions for granular control -- Filter levels determine target keyword count +- Filter levels determine keyword thresholds: + * Level 0 (Minimal) = Most restrictive + * Level 1 (Moderate) = Balanced filtering + * Level 2 (Extensive) = Broader inclusion + * Level 3 (Complete) = Most inclusive ### Advanced Mode - Direct keyword management @@ -179,7 +181,7 @@ const debouncedUpdate = (() => { 3. Performance - Use cache for expensive calculations - Throttle rapid updates (50ms threshold) - - Clear cache when target count changes + - Clear cache on filter level changes - Batch process large operations 4. Mode Management diff --git a/docs/1-architecture/11-simple-mode.md b/docs/1-architecture/11-simple-mode.md index d9224e3..8fe4c01 100644 --- a/docs/1-architecture/11-simple-mode.md +++ b/docs/1-architecture/11-simple-mode.md @@ -10,25 +10,33 @@ Simple mode provides an intuitive interface for content filtering through contex ```javascript class SimpleMode extends HTMLElement { constructor() { - this.currentLevel = 0; // Default level - this.levelTargets = { - 0: 100, // Minimal - 1: 300, // Moderate - 2: 500, // Extensive - 3: 2000 // Complete - }; + this.currentLevel = 0; // Default level (Minimal/most restrictive) } updateLevel(level) { if (level === this.currentLevel) return; this.currentLevel = level; + state.filterLevel = level; this.updateFilterUI(); - setTargetKeywordCount(this.levelTargets[level]); } } ``` -### 2. Context Management System +### 2. Weight Threshold System +```javascript +function getWeightThreshold(filterLevel) { + // Map levels to thresholds (0-3) + switch(filterLevel) { + case 0: return 3; // Minimal (most restrictive) + case 1: return 2; // Moderate + case 2: return 1; // Extensive + case 3: return 0; // Complete (most inclusive) + default: return 3; // Default to most restrictive + } +} +``` + +### 3. Context Management System #### Context Selection Handler ```javascript @@ -94,7 +102,7 @@ export function handleContextToggle(contextId) { } ``` -### 3. Exception System +### 4. Exception System #### Exception Toggle Handler ```javascript diff --git a/docs/1-architecture/4-mode-system.md b/docs/1-architecture/4-mode-system.md index 860fd82..008012c 100644 --- a/docs/1-architecture/4-mode-system.md +++ b/docs/1-architecture/4-mode-system.md @@ -3,11 +3,56 @@ ## Overview MuteSky operates in two distinct modes: -- Simple Mode: Context-based filtering with filter levels +- Simple Mode: Context-based filtering with filter levels (0-3) - Advanced Mode: Direct keyword management The system maintains consistency between these modes while preserving user preferences. +## Weight System Implementation + +### 1. Filter Level System +```javascript +// Map filter levels to thresholds +function getWeightThreshold(filterLevel) { + switch(filterLevel) { + case 0: return 3; // Minimal (most restrictive) + case 1: return 2; // Moderate + case 2: return 1; // Extensive + case 3: return 0; // Complete (most inclusive) + default: return 3; + } +} +``` + +### 2. Filter Level Handler +```javascript +export function handleFilterLevelChange(event) { + const level = event.detail.level; + state.filterLevel = level; + + // Store current exceptions + const currentExceptions = new Set(state.selectedExceptions); + + // Clear and rebuild active keywords + state.activeKeywords.clear(); + state.selectedContexts.forEach(contextId => { + const context = state.contextGroups[contextId]; + if (context?.categories) { + context.categories.forEach(category => { + if (!currentExceptions.has(category)) { + const keywords = getAllKeywordsForCategory(category, true); + keywords.forEach(keyword => state.activeKeywords.add(keyword)); + } + }); + } + }); + + // Restore exceptions and update UI + state.selectedExceptions = currentExceptions; + renderInterface(); +} +``` + ## Context System Implementation ### 1. Context Toggle Handler diff --git a/docs/2-development/1-known-issues.md b/docs/2-development/1-known-issues.md index f117d72..d1d7995 100644 --- a/docs/2-development/1-known-issues.md +++ b/docs/2-development/1-known-issues.md @@ -69,30 +69,51 @@ export async function updateSimpleModeState() { ### 1. Duplicate Keywords -**Problem**: Keywords like "Paris Agreement" appearing multiple times with different cases. +**Problem**: Keywords like "Paris Agreement" appearing multiple times with different cases, particularly when switching between modes. -**Root Cause**: Case-sensitive keyword storage causing duplicates. +**Root Cause**: Inconsistent case handling across different parts of the codebase, especially during mode transitions and context handling. -**Solution**: Implemented case-insensitive storage with original case preservation: +**Solution**: Implemented comprehensive case-insensitive handling across all keyword operations: ```javascript -// Store lowercase for comparison -const lowerKeyword = keyword.toLowerCase(); -state.originalMutedKeywords.add(lowerKeyword); - -// Preserve original case for display -const originalCase = ourKeywordsMap.get(lowerKeyword); -if (originalCase) { - state.activeKeywords.add(originalCase); +// Helper function for case-insensitive removal +export function removeKeyword(keyword) { + const lowerKeyword = keyword.toLowerCase(); + for (const activeKeyword of state.activeKeywords) { + if (activeKeyword.toLowerCase() === lowerKeyword) { + state.activeKeywords.delete(activeKeyword); + break; + } + } +} + +// Helper function for case-sensitive addition with deduplication +function addKeywordWithCase(keyword) { + // First remove any existing case variations + removeKeyword(keyword); + // Then add with original case + state.activeKeywords.add(keyword); } ``` +**Implementation Details**: +- Case-insensitive checks using isKeywordActive() +- Case-insensitive removal using removeKeyword() +- Case-preserving addition using addKeywordWithCase() +- Consistent handling across mode switches and context changes + +**Result**: +- No more duplicate keywords with different cases +- Maintains proper keyword counts during mode switches +- Preserves original case for display purposes +- Consistent behavior across all operations + ### 2. Payload Size Issues **Problem**: "413 Payload Too Large" error when sending to Bluesky. **Root Cause**: Duplicate keywords with different cases inflating payload size. -**Solution**: Case-insensitive deduplication before API calls. +**Solution**: Case-insensitive deduplication is now handled consistently across all operations, preventing duplicates from being added in the first place. ## Authentication Issues diff --git a/docs/migration.md b/docs/migration.md index be94300..d46fb09 100644 --- a/docs/migration.md +++ b/docs/migration.md @@ -1,172 +1,31 @@ -# Keyword Weighting System Migration - -## Current System - -The current system uses weights 1-10 for both categories and keywords, with higher numbers being more significant. - -### Category Weights -- 9-10: Most significant categories (e.g., Economic Policy, Education) -- 7-8: Important categories (e.g., Climate and Environment, Healthcare) -- 5-6: Extended coverage categories -- 1-4: Basic coverage categories - -### Keyword Weights -- 7-8: Highly frequent/significant terms -- 5-6: Common/regular terms -- 3-4: Occasional/moderate terms -- 1-2: Rare/basic terms - -### Distribution Levels -The system currently has four distribution levels with actual keyword counts: -- Minimal: 190 highest weighted keywords -- Moderate: 413 keywords -- Extensive: 815 keywords -- Complete: All remaining keywords (~2000+ total keywords) - -## Weight Threshold Algorithm - -The current algorithm in weightManager.js determines which keywords to include based on both category and keyword weights: - -```javascript -case 190: // Minimal - return categoryWeight >= 9 ? 8 : // For highest categories (9), include keywords weighted 8+ - categoryWeight >= 8 ? 9 : // For high categories (8), only include keywords weighted 9 - 11; // For others, exclude all - -case 413: // Moderate - return categoryWeight >= 9 ? 7 : // For highest categories, include keywords weighted 7+ - categoryWeight >= 8 ? 8 : // For high categories, include keywords weighted 8+ - 9; // For others, only highest weighted keywords - -case 815: // Extensive - return categoryWeight >= 9 ? 6 : // For highest categories, include keywords weighted 6+ - categoryWeight >= 8 ? 7 : // For high categories, include keywords weighted 7+ - 8; // For others, include keywords weighted 8+ -``` - -## New Scale (0-3) - -The new scale inverts the power relationship, with 0 being least significant and 3 being most significant. This aligns with common programming practices where array indices and enums typically start at 0. - -### Category Weights -- 3: Most significant categories (previously 9-10) -- 2: Important categories (previously 7-8) -- 1: Extended coverage categories (previously 5-6) -- 0: Basic coverage categories (previously 1-4) - -### Keyword Weights -- 3: Highly frequent/significant terms (previously 7-8) -- 2: Common/regular terms (previously 5-6) -- 1: Occasional/moderate terms (previously 3-4) -- 0: Rare/basic terms (previously 1-2) - -### Distribution Levels -The distribution levels remain the same but with inverted significance: -- Level 0 (Complete): All keywords (~2000+) -- Level 1 (Extensive): 815 keywords -- Level 2 (Moderate): 413 keywords -- Level 3 (Minimal): 190 keywords - -### Keyword Distribution - -The actual distribution of keywords across levels: -- Level 3 (Minimal): Top 190 keywords from highest weighted categories - * Category weight 3: Keywords weighted 3 - * Category weight 2: Keywords weighted 3 - * Others: None included -- Level 2 (Moderate): 413 keywords - * Category weight 3: Keywords weighted 2-3 - * Category weight 2: Keywords weighted 3 - * Others: Keywords weighted 3 only -- Level 1 (Extensive): 815 keywords - * Category weight 3: Keywords weighted 1-3 - * Category weight 2: Keywords weighted 2-3 - * Others: Keywords weighted 3 -- Level 0 (Complete): All 2000+ keywords included - -### Examples - -#### Economic Policy (Category Weight 3, previously 9) -- "recession" (Weight 3, previously 9): Highly frequent economic term -- "debt ceiling" (Weight 3, previously 8): Highly frequent policy crisis -- "banking crisis" (Weight 2, previously 7): Frequent financial term -- "tax cut" (Weight 1, previously 6): Common policy term -- "capital gains" (Weight 0, previously 4): Technical tax term - -#### Climate and Environment (Category Weight 2, previously 8) -- "climate change" (Weight 3, previously 9): Highly frequent environmental term -- "extreme heat" (Weight 3, previously 8): Frequent weather crisis term -- "drought" (Weight 2, previously 7): Frequent weather crisis term -- "carbon footprint" (Weight 1, previously 5): Regular environmental impact term -- "desertification" (Weight 0, previously 4): Occasional environmental term - -## Migration Benefits - -1. **Intuitive Scaling**: 0-3 provides a clearer, more concise range compared to 1-10 -2. **Programming Alignment**: Starts at 0, matching common programming patterns -3. **Simplified Logic**: Four distinct levels make the weighting system more straightforward -4. **Maintained Relationships**: Preserves the existing keyword distribution and category importance while using a cleaner scale - -## Implementation Steps - -1. **Update Category Files** - - Convert category weights: - * 9-10 → 3 - * 7-8 → 2 - * 5-6 → 1 - * 1-4 → 0 - - Convert keyword weights: - * 8-10 → 3 - * 7-6 → 2 - * 3-4 → 1 - * 1-2 → 0 - -2. **Update weightManager.js** - ```javascript - case 190: // Level 3 (Minimal) - return categoryWeight === 3 ? 3 : // For highest categories, include keywords weighted 3 - categoryWeight === 2 ? 3 : // For high categories, include keywords weighted 3 - 4; // For others, exclude all - - case 413: // Level 2 (Moderate) - return categoryWeight === 3 ? 2 : // For highest categories, include keywords weighted 2+ - categoryWeight === 2 ? 3 : // For high categories, include keywords weighted 3 - 3; // For others, only highest weighted keywords - - case 815: // Level 1 (Extensive) - return categoryWeight === 3 ? 1 : // For highest categories, include keywords weighted 1+ - categoryWeight === 2 ? 2 : // For high categories, include keywords weighted 2+ - 3; // For others, include keywords weighted 3 - ``` - -3. **Update UI Components** - - Modify any UI elements that display weight values - - Update any sorting logic that depends on weights - - Ensure filtering mechanisms reflect the new scale - -4. **Update Tests** - - Modify test cases to use new weight values - - Update expected results in keyword filtering tests - - Add migration-specific tests to verify correct weight conversion - -5. **Documentation Updates** - - Update API documentation - - Update user guides - - Add migration notes for developers - -## Migration Safety - -### Validation Steps -1. **Pre-migration Validation** - - Count total keywords at each level - - Generate distribution report for each category - - Verify current keyword inclusion patterns - -2. **Post-migration Validation** - - Verify total keyword counts match pre-migration - - Confirm keyword inclusion patterns are preserved - - Check category distribution matches expected patterns - - Validate that Level 3 (Minimal) still contains the same 190 most significant keywords - -### Rollback Procedure -1. Don't worry about it, we use source control. \ No newline at end of file +# Migration Notes + +## Weight System Simplification (January 2024) + +### Changes Made +1. Simplified weight system from complex thresholds to 0-3 scale: + - Level 0 (Minimal) = threshold 3 (most restrictive) + - Level 1 (Moderate) = threshold 2 + - Level 2 (Extensive) = threshold 1 + - Level 3 (Complete) = threshold 0 (most inclusive) + +2. Removed targetKeywordCount: + - Removed from state + - Removed setTargetKeywordCount function + - Updated state persistence + - Simplified filterLevel handling + +3. Removed category weights: + - Weight thresholds now based only on keyword weights + - Simplified filtering logic + - Maintained case sensitivity handling + +### Future Considerations +1. Categories will be removed in a future update +2. Current category-related code is maintained for backwards compatibility +3. New features should use filterLevel and keyword weights only + +### Migration Path +- Old state using targetKeywordCount will default to filterLevel 0 +- Existing keyword weights (0-3) work directly with new thresholds +- Category weights are ignored but preserved in data structure for now diff --git a/images/screenshots/dark-advanced-mode.png b/images/screenshots/dark-advanced-mode.png new file mode 100644 index 0000000000000000000000000000000000000000..2e59244afafb1d6c623840efdd687b4f4898f9cb GIT binary patch literal 99573 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
    e4kXWX$a5xy(W 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 literal 0 HcmV?d00001 diff --git a/images/screenshots/dark-search.png b/images/screenshots/dark-search.png new file mode 100644 index 0000000000000000000000000000000000000000..67b8f97d869c7eb6d3fa9385a03960eea8e37c98 GIT binary patch literal 49118 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 Ky!f5L*Z%<|k;H2N literal 0 HcmV?d00001 diff --git a/images/screenshots/dark-simple-mode.png b/images/screenshots/dark-simple-mode.png new file mode 100644 index 0000000000000000000000000000000000000000..39545239345a19c3ca1ca6283f04927057dc1367 GIT binary patch literal 82085 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�*jw(go?f;#@KoOkOsp-+EmjMQAE&x_&QtST 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 literal 0 HcmV?d00001 diff --git a/images/screenshots/light-advanced-mode.png b/images/screenshots/light-advanced-mode.png new file mode 100644 index 0000000000000000000000000000000000000000..8f8cb26959019c888603456158ec0961d1c3f135 GIT binary patch literal 93166 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 literal 0 HcmV?d00001 diff --git a/images/screenshots/light-simple-mode.png b/images/screenshots/light-simple-mode.png new file mode 100644 index 0000000000000000000000000000000000000000..0545148847e08f610a7c7e4d0b7735742698f33a GIT binary patch literal 79023 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 E0Y#wYF#rGn literal 0 HcmV?d00001 diff --git a/js/api.js b/js/api.js index e2aff02..8459324 100644 --- a/js/api.js +++ b/js/api.js @@ -1,246 +1,4 @@ -import { KEYWORDS_BASE_URL, CONTEXT_GROUPS_URL, DISPLAY_CONFIG_URL, getWeightThreshold } from './config.js'; -import { state, forceRefresh } from './state.js'; - -// Backup category files list -const BACKUP_CATEGORY_FILES = [ - 'climate-and-environment.json', - 'economic-policy.json', - 'education.json', - 'gun-policy.json', - 'healthcare-and-public-health.json', - 'immigration.json', - 'international-coverage.json', - 'lgbtq.json', - 'media-personalities.json', - 'military-and-defense.json', - 'new-developments.json', - 'political-organizations.json', - 'political-rhetoric.json', - 'political-violence-and-security-threats.json', - 'race-relations.json', - 'relational-violence.json', - 'religion.json', - 'reproductive-health.json', - 'social-policy.json', - 'us-government-institutions.json', - 'us-political-figures-full-name.json', - 'us-political-figures-single-name.json', - 'vaccine-policy.json', - 'world-leaders.json' -]; - -const BACKUP_LAST_MODIFIED = 'Dec 1, 2023 9:00 PM'; - -// Cache implementation -const cache = { - data: new Map(), - getItem: function(key) { - const item = this.data.get(key); - if (!item) return null; - if (Date.now() > item.expiry) { - this.data.delete(key); - return null; - } - return item.value; - }, - setItem: function(key, value, ttl = 3600000) { // 1 hour default TTL - const expiry = Date.now() + ttl; - this.data.set(key, { value, expiry }); - } -}; - -async function getLastModifiedDate() { - const repoOwner = 'potatoqualitee'; - const repoName = 'calm-the-chaos'; - const filePath = 'keywords/categories'; - const cacheKey = `lastModified_${repoOwner}_${repoName}_${filePath}`; - - try { - // Check cache first - const cachedDate = cache.getItem(cacheKey); - if (cachedDate) return cachedDate; - - const apiUrl = `https://api.github.com/repos/${repoOwner}/${repoName}/commits?path=${filePath}&per_page=1`; - const response = await fetch(apiUrl, { - headers: { - 'User-Agent': 'MuteSky-App' - } - }); - const data = await response.json(); - - if (data && data[0] && data[0].commit && data[0].commit.committer.date) { - const date = new Date(data[0].commit.committer.date); - const formattedDate = date.toLocaleDateString('en-US', { - month: 'short', - day: 'numeric', - year: 'numeric', - hour: 'numeric', - minute: '2-digit', - hour12: true - }); - cache.setItem(cacheKey, formattedDate); - return formattedDate; - } - } catch (error) { - console.error('Failed to fetch last modified date:', error); - } - return BACKUP_LAST_MODIFIED; -} - -async function listCategoryFiles() { - const repoOwner = 'potatoqualitee'; - const repoName = 'calm-the-chaos'; - const path = 'keywords/categories'; - const cacheKey = `categoryFiles_${repoOwner}_${repoName}_${path}`; - - try { - // Check cache first - const cachedFiles = cache.getItem(cacheKey); - if (cachedFiles) return cachedFiles; - - const apiUrl = `https://api.github.com/repos/${repoOwner}/${repoName}/contents/${path}`; - const response = await fetch(apiUrl, { - headers: { - 'User-Agent': 'MuteSky-App' - } - }); - - if (response.status === 403) { - console.debug('GitHub API rate limit reached, using backup files'); - return BACKUP_CATEGORY_FILES; - } - - const data = await response.json(); - const files = data.filter(file => file.name.endsWith('.json')).map(file => file.name); - cache.setItem(cacheKey, files); - return files; - } catch (error) { - console.error('Failed to list category files:', error); - return BACKUP_CATEGORY_FILES; - } -} - -export async function fetchKeywordGroups(forceFresh = false) { - try { - // Get list of category files - const categoryFiles = await listCategoryFiles(); - console.debug('Found category files:', categoryFiles); - - // Get the target count from state or default to 2000 - const targetCount = state.targetKeywordCount || 2000; - - // Fetch and process each category file - const keywordGroups = {}; - const results = await Promise.allSettled(categoryFiles.map(async (fileName) => { - try { - const url = `${KEYWORDS_BASE_URL}/${fileName}`; - const response = await fetch(url, { cache: 'no-store' }); - if (!response.ok) return; - - const categoryData = await response.json(); - const categoryName = Object.keys(categoryData)[0]; - - // Store the entire category data structure - keywordGroups[categoryName] = categoryData; - - console.debug(`Loaded ${categoryName} with weight ${categoryData[categoryName].weight} and ${Object.keys(categoryData[categoryName].keywords).length} keywords`); - } catch (error) { - console.error(`Failed to load category ${fileName}:`, error); - } - })); - - // Sort categories alphabetically and create a new ordered object - const orderedKeywordGroups = {}; - Object.keys(keywordGroups) - .sort((a, b) => a.localeCompare(b)) - .forEach(key => { - orderedKeywordGroups[key] = keywordGroups[key]; - }); - - // Update state with ordered groups - state.lastModified = await getLastModifiedDate(); - state.keywordGroups = orderedKeywordGroups; - - // Initialize selected categories if empty - if (state.selectedCategories.size === 0) { - Object.keys(orderedKeywordGroups).forEach(category => { - state.selectedCategories.add(category); - }); - } - - console.debug('Keyword groups loaded:', Object.keys(orderedKeywordGroups).length, 'categories'); - } catch (error) { - console.error('Error fetching keyword groups:', error); - throw error; - } -} - -export async function fetchContextGroups(forceFresh = false) { - try { - const url = forceFresh ? forceRefresh().contextGroupsUrl : CONTEXT_GROUPS_URL; - const response = await fetch(url, { cache: 'no-store' }); - if (!response.ok) throw new Error('Failed to fetch context groups'); - state.contextGroups = await response.json(); - } catch (error) { - console.error('Error fetching context groups:', error); - throw error; - } -} - -export async function fetchDisplayConfig(forceFresh = false) { - try { - const url = forceFresh ? forceRefresh().displayConfigUrl : DISPLAY_CONFIG_URL; - const response = await fetch(url, { cache: 'no-store' }); - if (!response.ok) throw new Error('Failed to fetch display config'); - state.displayConfig = await response.json(); - } catch (error) { - console.error('Error fetching display config:', error); - throw error; - } -} - -export async function refreshAllData() { - try { - // Store current state before refresh - const activeKeywords = new Set(state.activeKeywords); - const selectedContexts = new Set(state.selectedContexts); - const selectedExceptions = new Set(state.selectedExceptions); - const selectedCategories = new Set(state.selectedCategories); - const currentMode = state.mode; - const menuOpen = state.menuOpen; - const targetCount = state.targetKeywordCount; - // Preserve auth state - const did = state.did; - const authenticated = state.authenticated; - // Preserve mute state - const originalMutedKeywords = new Set(state.originalMutedKeywords); - const sessionMutedKeywords = new Set(state.sessionMutedKeywords); - - // Fetch fresh data - await Promise.all([ - fetchKeywordGroups(true), - fetchContextGroups(true), - fetchDisplayConfig(true) - ]); - - // Restore previous state - state.activeKeywords = activeKeywords; - state.selectedContexts = selectedContexts; - state.selectedExceptions = selectedExceptions; - state.selectedCategories = selectedCategories; - state.mode = currentMode; - state.menuOpen = menuOpen; - state.targetKeywordCount = targetCount; - // Restore auth state - state.did = did; - state.authenticated = authenticated; - // Restore mute state - state.originalMutedKeywords = originalMutedKeywords; - state.sessionMutedKeywords = sessionMutedKeywords; - - console.debug('Data refreshed successfully'); - } catch (error) { - console.error('Failed to refresh data:', error); - throw error; - } -} +// Re-export everything from the new modular structure +export { cache } from './api/cache.js'; +export { getLastModifiedDate, listCategoryFiles } from './api/github.js'; +export { fetchKeywordGroups, fetchContextGroups, fetchDisplayConfig, refreshAllData } from './api/index.js'; diff --git a/js/api/cache.js b/js/api/cache.js new file mode 100644 index 0000000..61c3a70 --- /dev/null +++ b/js/api/cache.js @@ -0,0 +1,17 @@ +// Cache implementation +export const cache = { + data: new Map(), + getItem: function(key) { + const item = this.data.get(key); + if (!item) return null; + if (Date.now() > item.expiry) { + this.data.delete(key); + return null; + } + return item.value; + }, + setItem: function(key, value, ttl = 3600000) { // 1 hour default TTL + const expiry = Date.now() + ttl; + this.data.set(key, { value, expiry }); + } +}; diff --git a/js/api/fetchers.js b/js/api/fetchers.js new file mode 100644 index 0000000..361dafc --- /dev/null +++ b/js/api/fetchers.js @@ -0,0 +1,79 @@ +import { KEYWORDS_BASE_URL, CONTEXT_GROUPS_URL, DISPLAY_CONFIG_URL } from '../config.js'; +import { state, forceRefresh } from '../state.js'; +import { listCategoryFiles, getLastModifiedDate } from './github.js'; + +export async function fetchKeywordGroups(forceFresh = false) { + try { + // Get list of category files + const categoryFiles = await listCategoryFiles(); + console.debug('Found category files:', categoryFiles); + + // Fetch and process each category file + const keywordGroups = {}; + const results = await Promise.allSettled(categoryFiles.map(async (fileName) => { + try { + const url = `${KEYWORDS_BASE_URL}/${fileName}`; + const response = await fetch(url, { cache: 'no-store' }); + if (!response.ok) return; + + const categoryData = await response.json(); + const categoryName = Object.keys(categoryData)[0]; + + // Store the entire category data structure + keywordGroups[categoryName] = categoryData; + + console.debug(`Loaded ${categoryName} with ${Object.keys(categoryData[categoryName].keywords).length} keywords`); + } catch (error) { + console.error(`Failed to load category ${fileName}:`, error); + } + })); + + // Sort categories alphabetically and create a new ordered object + const orderedKeywordGroups = {}; + Object.keys(keywordGroups) + .sort((a, b) => a.localeCompare(b)) + .forEach(key => { + orderedKeywordGroups[key] = keywordGroups[key]; + }); + + // Update state with ordered groups + state.lastModified = await getLastModifiedDate(); + state.keywordGroups = orderedKeywordGroups; + + // Initialize selected categories if empty + if (state.selectedCategories.size === 0) { + Object.keys(orderedKeywordGroups).forEach(category => { + state.selectedCategories.add(category); + }); + } + + console.debug('Keyword groups loaded:', Object.keys(orderedKeywordGroups).length, 'categories'); + } catch (error) { + console.error('Error fetching keyword groups:', error); + throw error; + } +} + +export async function fetchContextGroups(forceFresh = false) { + try { + const url = forceFresh ? forceRefresh().contextGroupsUrl : CONTEXT_GROUPS_URL; + const response = await fetch(url, { cache: 'no-store' }); + if (!response.ok) throw new Error('Failed to fetch context groups'); + state.contextGroups = await response.json(); + } catch (error) { + console.error('Error fetching context groups:', error); + throw error; + } +} + +export async function fetchDisplayConfig(forceFresh = false) { + try { + const url = forceFresh ? forceRefresh().displayConfigUrl : DISPLAY_CONFIG_URL; + const response = await fetch(url, { cache: 'no-store' }); + if (!response.ok) throw new Error('Failed to fetch display config'); + state.displayConfig = await response.json(); + } catch (error) { + console.error('Error fetching display config:', error); + throw error; + } +} diff --git a/js/api/github.js b/js/api/github.js new file mode 100644 index 0000000..e52df9b --- /dev/null +++ b/js/api/github.js @@ -0,0 +1,102 @@ +import { cache } from './cache.js'; + +// Backup category files list +const BACKUP_CATEGORY_FILES = [ + 'climate-and-environment.json', + 'economic-policy.json', + 'education.json', + 'gun-policy.json', + 'healthcare-and-public-health.json', + 'immigration.json', + 'international-coverage.json', + 'lgbtq.json', + 'media-personalities.json', + 'military-and-defense.json', + 'new-developments.json', + 'political-organizations.json', + 'political-rhetoric.json', + 'political-violence-and-security-threats.json', + 'race-relations.json', + 'relational-violence.json', + 'religion.json', + 'reproductive-health.json', + 'social-policy.json', + 'us-government-institutions.json', + 'us-political-figures-full-name.json', + 'us-political-figures-single-name.json', + 'vaccine-policy.json', + 'world-leaders.json' +]; + +const BACKUP_LAST_MODIFIED = 'Dec 1, 2023 9:00 PM'; + +export async function getLastModifiedDate() { + const repoOwner = 'potatoqualitee'; + const repoName = 'calm-the-chaos'; + const filePath = 'keywords/categories'; + const cacheKey = `lastModified_${repoOwner}_${repoName}_${filePath}`; + + try { + // Check cache first + const cachedDate = cache.getItem(cacheKey); + if (cachedDate) return cachedDate; + + const apiUrl = `https://api.github.com/repos/${repoOwner}/${repoName}/commits?path=${filePath}&per_page=1`; + const response = await fetch(apiUrl, { + headers: { + 'User-Agent': 'MuteSky-App' + } + }); + const data = await response.json(); + + if (data && data[0] && data[0].commit && data[0].commit.committer.date) { + const date = new Date(data[0].commit.committer.date); + const formattedDate = date.toLocaleDateString('en-US', { + month: 'short', + day: 'numeric', + year: 'numeric', + hour: 'numeric', + minute: '2-digit', + hour12: true + }); + cache.setItem(cacheKey, formattedDate); + return formattedDate; + } + } catch (error) { + console.error('Failed to fetch last modified date:', error); + } + return BACKUP_LAST_MODIFIED; +} + +export async function listCategoryFiles() { + const repoOwner = 'potatoqualitee'; + const repoName = 'calm-the-chaos'; + const path = 'keywords/categories'; + const cacheKey = `categoryFiles_${repoOwner}_${repoName}_${path}`; + + try { + // Check cache first + const cachedFiles = cache.getItem(cacheKey); + if (cachedFiles) return cachedFiles; + + const apiUrl = `https://api.github.com/repos/${repoOwner}/${repoName}/contents/${path}`; + const response = await fetch(apiUrl, { + headers: { + 'User-Agent': 'MuteSky-App' + } + }); + + if (response.status === 403) { + console.debug('GitHub API rate limit reached, using backup files'); + return BACKUP_CATEGORY_FILES; + } + + const data = await response.json(); + const files = data.filter(file => file.name.endsWith('.json')).map(file => file.name); + cache.setItem(cacheKey, files); + return files; + } catch (error) { + console.error('Failed to list category files:', error); + return BACKUP_CATEGORY_FILES; + } +} diff --git a/js/api/index.js b/js/api/index.js new file mode 100644 index 0000000..ef946a2 --- /dev/null +++ b/js/api/index.js @@ -0,0 +1,50 @@ +import { state, forceRefresh } from '../state.js'; +import { fetchKeywordGroups, fetchContextGroups, fetchDisplayConfig } from './fetchers.js'; + +export { fetchKeywordGroups, fetchContextGroups, fetchDisplayConfig }; + +export async function refreshAllData() { + try { + // Store current state before refresh + const activeKeywords = new Set(state.activeKeywords); + const selectedContexts = new Set(state.selectedContexts); + const selectedExceptions = new Set(state.selectedExceptions); + const selectedCategories = new Set(state.selectedCategories); + const currentMode = state.mode; + const menuOpen = state.menuOpen; + const filterLevel = state.filterLevel; + // Preserve auth state + const did = state.did; + const authenticated = state.authenticated; + // Preserve mute state + const originalMutedKeywords = new Set(state.originalMutedKeywords); + const sessionMutedKeywords = new Set(state.sessionMutedKeywords); + + // Fetch fresh data + await Promise.all([ + fetchKeywordGroups(true), + fetchContextGroups(true), + fetchDisplayConfig(true) + ]); + + // Restore previous state + state.activeKeywords = activeKeywords; + state.selectedContexts = selectedContexts; + state.selectedExceptions = selectedExceptions; + state.selectedCategories = selectedCategories; + state.mode = currentMode; + state.menuOpen = menuOpen; + state.filterLevel = filterLevel; + // Restore auth state + state.did = did; + state.authenticated = authenticated; + // Restore mute state + state.originalMutedKeywords = originalMutedKeywords; + state.sessionMutedKeywords = sessionMutedKeywords; + + console.debug('Data refreshed successfully'); + } catch (error) { + console.error('Failed to refresh data:', error); + throw error; + } +} diff --git a/js/bluesky.js b/js/bluesky.js index 4eba254..cb240af 100644 --- a/js/bluesky.js +++ b/js/bluesky.js @@ -127,7 +127,16 @@ class BlueskyService { await this.auth.signIn(handle); } catch (error) { console.error('[Bluesky] Sign in failed:', error); - this.ui.updateLoginState(false, `Sign in failed: ${error.message || 'Please try again'}`); + + // Check for common service availability errors + if (error.message && ( + error.message.includes('invalid_client_metadata') || + error.message.includes('Failed to resolve OAuth server metadata for issuer: bsky.social') + )) { + this.ui.updateLoginState(false, 'Bluesky service appears to be down. Please try again in a few minutes.'); + } else { + this.ui.updateLoginState(false, `Sign in failed: ${error.message || 'Please try again'}`); + } } } diff --git a/js/categoryManager.js b/js/categoryManager.js index e6ff0dd..4ab2ee4 100644 --- a/js/categoryManager.js +++ b/js/categoryManager.js @@ -11,7 +11,7 @@ function calculateKeywordsToMute() { if (context && context.categories) { context.categories.forEach(category => { if (!state.selectedExceptions.has(category)) { - // Get keywords sorted by weight and limited by target count + // Get keywords sorted and filtered by weight based on current filter level const keywords = getAllKeywordsForCategory(category, true); console.debug(`Adding ${keywords.length} keywords from ${category} to mute list`); keywords.forEach(keyword => keywordsToMute.add(keyword)); diff --git a/js/components/landing-page.js b/js/components/landing-page.js index 53d8c57..0b01c63 100644 --- a/js/components/landing-page.js +++ b/js/components/landing-page.js @@ -1,110 +1 @@ -class LandingPage extends HTMLElement { - constructor() { - super(); - } - - connectedCallback() { - this.innerHTML = ` -
    - -
    -
    - -

    Mutesky

    -

    Bulk manage Bluesky mutes with
    pre-populated keyword lists

    -
    -
    - - -
    -
    - -
    -
    - -
    -

    1,400+ Keywords

    -

    Continuously updated by AI to reflect current events

    -
    -
    -
    - 🎯 -
    -

    20+ Categories

    -

    From politics to climate, choose what you want to see

    -
    -
    -
    - 🎚️ -
    -

    Easy Management

    -

    Simple toggles or advanced keyword controls

    -
    -
    -
    - -
    -

    Instant Updates

    -

    Changes take effect immediately on your feed

    -
    -
    -
    - - -
    - - -
    -
    -
    The next page will prompt for your username and Bluesky account password, not your app password. Your credentials are securely handled by Bluesky's official authentication service.
    -
    - -
    -
    - -
    - -
    -
    -
    -
    -
    -
    - `; - - // Check for auth errors after component is mounted - this.checkAuthErrors(); - } - - checkAuthErrors() { - const error = sessionStorage.getItem('auth_error'); - const errorDescription = sessionStorage.getItem('auth_error_description'); - - if (error) { - const messageEl = document.getElementById('bsky-auth-message'); - const errorText = errorDescription || error; - - messageEl.innerHTML = ` -
    - Authentication failed: ${errorText} -
    - Please try again. -
    - `; - messageEl.classList.add('error'); - - // Clear error state - sessionStorage.removeItem('auth_error'); - sessionStorage.removeItem('auth_error_description'); - } - } -} - -customElements.define('landing-page', LandingPage); - -export default LandingPage; +export { default } from './landing/landing-page.js'; diff --git a/js/components/landing/auth-handler.js b/js/components/landing/auth-handler.js new file mode 100644 index 0000000..a18d002 --- /dev/null +++ b/js/components/landing/auth-handler.js @@ -0,0 +1,24 @@ +export class AuthHandler { + static checkAuthErrors() { + const error = sessionStorage.getItem('auth_error'); + const errorDescription = sessionStorage.getItem('auth_error_description'); + + if (error) { + const messageEl = document.getElementById('bsky-auth-message'); + const errorText = errorDescription || error; + + messageEl.innerHTML = ` +
    + Authentication failed: ${errorText} +
    + Please try again. +
    + `; + messageEl.classList.add('error'); + + // Clear error state + sessionStorage.removeItem('auth_error'); + sessionStorage.removeItem('auth_error_description'); + } + } +} diff --git a/js/components/landing/image-handler.js b/js/components/landing/image-handler.js new file mode 100644 index 0000000..55a851e --- /dev/null +++ b/js/components/landing/image-handler.js @@ -0,0 +1,80 @@ +export class ImageHandler { + constructor() { + this.imageCache = new Map(); + this.themeObserver = null; + } + + async initThemeAwareImages(component) { + const images = component.querySelectorAll('.theme-aware-image'); + const preloadPromises = []; + + // Preload all images + images.forEach(img => { + const lightSrc = img.dataset.lightSrc; + const darkSrc = img.dataset.darkSrc; + + if (lightSrc && !this.imageCache.has(lightSrc)) { + preloadPromises.push(this.preloadImage(lightSrc)); + } + if (darkSrc && !this.imageCache.has(darkSrc)) { + preloadPromises.push(this.preloadImage(darkSrc)); + } + }); + + try { + await Promise.all(preloadPromises); + this.updateThemeAwareImages(component); + } catch (error) { + console.error('Error preloading images:', error); + } + } + + async preloadImage(src) { + if (!src || this.imageCache.has(src)) return; + + try { + const img = new Image(); + const loadPromise = new Promise((resolve, reject) => { + img.onload = () => resolve(src); + img.onerror = () => reject(new Error(`Failed to load image: ${src}`)); + }); + + img.src = src; + await loadPromise; + this.imageCache.set(src, true); + } catch (error) { + console.error(`Error preloading image ${src}:`, error); + // Cache the failure to avoid repeated attempts + this.imageCache.set(src, false); + } + } + + updateThemeAwareImages(component, theme = null) { + if (!theme) { + theme = document.documentElement.getAttribute('data-theme'); + } + const isDarkMode = theme === 'dark'; + + requestAnimationFrame(() => { + component.querySelectorAll('.theme-aware-image').forEach(async (img) => { + const src = isDarkMode ? img.dataset.darkSrc : img.dataset.lightSrc; + + // Skip if image hasn't been preloaded or failed to preload + if (!this.imageCache.has(src)) { + await this.preloadImage(src); + } + + if (this.imageCache.get(src)) { + img.style.backgroundImage = `url('${src}')`; + } else { + // Use fallback image or add error class + img.classList.add('image-load-error'); + } + }); + }); + } + + cleanup() { + this.imageCache.clear(); + } +} diff --git a/js/components/landing/landing-page.js b/js/components/landing/landing-page.js new file mode 100644 index 0000000..e56b2e8 --- /dev/null +++ b/js/components/landing/landing-page.js @@ -0,0 +1,37 @@ +import { ImageHandler } from './image-handler.js'; +import { AuthHandler } from './auth-handler.js'; +import { landingPageTemplate } from './template.js'; + +class LandingPage extends HTMLElement { + constructor() { + super(); + this.imageHandler = new ImageHandler(); + this.themeObserver = null; + } + + connectedCallback() { + this.innerHTML = landingPageTemplate; + + // Initialize theme-aware images after component is mounted + this.imageHandler.initThemeAwareImages(this); + + // Listen for theme changes + this.themeObserver = (event) => this.imageHandler.updateThemeAwareImages(this, event?.detail?.theme); + document.addEventListener('themeChanged', this.themeObserver); + + // Check for auth errors after component is mounted + AuthHandler.checkAuthErrors(); + } + + disconnectedCallback() { + // Clean up event listeners and cache + if (this.themeObserver) { + document.removeEventListener('themeChanged', this.themeObserver); + } + this.imageHandler.cleanup(); + } +} + +customElements.define('landing-page', LandingPage); + +export default LandingPage; diff --git a/js/components/landing/template.js b/js/components/landing/template.js new file mode 100644 index 0000000..5d247bb --- /dev/null +++ b/js/components/landing/template.js @@ -0,0 +1,131 @@ +export const landingPageTemplate = ` +
    + +
    +
    + +

    Mutesky

    +

    Bulk manage Bluesky mutes with
    pre-populated keyword lists

    +
    +
    + + +
    +
    + +
    +
    + +
    +

    1,400+ Keywords

    +

    Continuously updated by AI to reflect current events

    +
    +
    +
    + 🎯 +
    +

    20+ Categories

    +

    From politics to climate, choose what you want to see

    +
    +
    +
    + 🎚️ +
    +

    Easy Management

    +

    Simple toggles or advanced keyword controls

    +
    +
    +
    + +
    +

    Instant Updates

    +

    Changes take effect immediately on your feed

    +
    +
    +
    + + +
    + + +
    +
    +
    The next page will prompt for your username and Bluesky account password, not your app password. Your credentials are securely handled by Bluesky's official authentication service.
    +
    + +
    +
    + +
    + +
    +
    +
    + + +
    +
    +

    How It Works

    +

    Take control of your Bluesky experience with Mutesky's intuitive filtering system

    +
    + +
    +
    +
    +
    +

    Start with Simple Mode

    +

    Quickly filter content across major topics like politics, healthcare, and global affairs. Choose what you don't want to see with just a few clicks.

    +
    +
    + +
    +
    +
    +

    Extensive Categories

    +

    Select from over 20 content categories, from climate to international coverage. Each category comes pre-populated with carefully curated keywords, continuously updated to reflect current events.

    +
    +
    + +
    +
    +
    +

    Advanced Control

    +

    Need more control? Switch to Advanced Mode for direct access to over 1,400 keywords. Fine-tune your filters with individual toggles or bulk actions.

    +
    +
    + +
    +
    +

    Perfect Balance

    +

    Choose your perfect balance with four filtering levels:

    +
      +
    • Minimal for light touch filtering
    • +
    • Moderate for balanced content management
    • +
    • Extensive for comprehensive filtering
    • +
    • Complete for maximum control
    • +
    +

    Changes take effect instantly on your feed, and you can adjust your settings anytime.

    +
    +
    +
    +
    + + +
    +
    +

    Made with 🤖 and Sponsor on GitHub by Chrissy LeMaire

    + +
    +
    +
    +
    +
    +`; diff --git a/js/components/modals.js b/js/components/modals.js index 40c8947..e18ff0a 100644 --- a/js/components/modals.js +++ b/js/components/modals.js @@ -1,230 +1 @@ -import { updateWarningVisibility } from '../handlers/modalHandlers.js'; -import { loadAppearanceSettings, saveAppearanceSettings } from '../settings/appearanceSettings.js'; - -class SettingsModal extends HTMLElement { - constructor() { - super(); - } - - connectedCallback() { - this.innerHTML = ` - - `; - - // Add tab switching functionality - this.setupTabs(); - // Add appearance settings handlers - this.setupAppearanceHandlers(); - } - - setupTabs() { - const tabs = this.querySelectorAll('.settings-tab'); - tabs.forEach(tab => { - tab.addEventListener('click', () => { - // Remove active class from all tabs and contents - this.querySelectorAll('.settings-tab').forEach(t => t.classList.remove('active')); - this.querySelectorAll('.settings-content').forEach(c => c.classList.remove('active')); - - // Add active class to clicked tab and corresponding content - tab.classList.add('active'); - const content = this.querySelector(`[data-content="${tab.dataset.tab}"]`); - content.classList.add('active'); - - // Show/hide warning based on active tab and duration - const warningElement = this.querySelector('.settings-warning'); - if (tab.dataset.tab === 'muting') { - const duration = document.querySelector('input[name="duration"]:checked')?.value; - warningElement.style.display = duration && duration !== 'forever' ? 'flex' : 'none'; - } else { - warningElement.style.display = 'none'; - } - - // Lazy load the creator image when about tab is clicked - if (tab.dataset.tab === 'about') { - const img = this.querySelector('.creator-image'); - if (img) { - img.loading = 'eager'; // Switch to eager loading when tab is active - } - } - }); - }); - } - - setupAppearanceHandlers() { - // Load current settings from localStorage - const settings = loadAppearanceSettings(); - - // Set initial active states - this.querySelector(`.theme-mode-switch[data-theme="${settings.colorMode}"]`)?.classList.add('active'); - this.querySelector(`.font-switch[data-font="${settings.font}"]`)?.classList.add('active'); - this.querySelector(`.font-switch[data-size="${settings.fontSize}"]`)?.classList.add('active'); - - // Theme buttons - this.querySelectorAll('.theme-mode-switch[data-theme]').forEach(button => { - button.addEventListener('click', () => { - this.querySelectorAll('.theme-mode-switch[data-theme]').forEach(btn => btn.classList.remove('active')); - button.classList.add('active'); - settings.colorMode = button.dataset.theme; - saveAppearanceSettings(settings); - }); - }); - - // Font buttons - this.querySelectorAll('.font-switch[data-font]').forEach(button => { - button.addEventListener('click', () => { - this.querySelectorAll('.font-switch[data-font]').forEach(btn => btn.classList.remove('active')); - button.classList.add('active'); - settings.font = button.dataset.font; - saveAppearanceSettings(settings); - }); - }); - - // Font size buttons - this.querySelectorAll('.font-switch[data-size]').forEach(button => { - button.addEventListener('click', () => { - this.querySelectorAll('.font-switch[data-size]').forEach(btn => btn.classList.remove('active')); - button.classList.add('active'); - settings.fontSize = button.dataset.size; - saveAppearanceSettings(settings); - }); - }); - } -} - -customElements.define('settings-modal', SettingsModal); - -export { SettingsModal }; +export { SettingsModal } from './modals/index.js'; diff --git a/js/components/modals/index.js b/js/components/modals/index.js new file mode 100644 index 0000000..5c400d0 --- /dev/null +++ b/js/components/modals/index.js @@ -0,0 +1 @@ +export { SettingsModal } from './settings-modal.js'; diff --git a/js/components/modals/settings-appearance.js b/js/components/modals/settings-appearance.js new file mode 100644 index 0000000..7195787 --- /dev/null +++ b/js/components/modals/settings-appearance.js @@ -0,0 +1,41 @@ +import { loadAppearanceSettings, saveAppearanceSettings } from '../../settings/appearanceSettings.js'; + +export function setupAppearanceHandlers() { + // Load current settings from localStorage + const settings = loadAppearanceSettings(); + + // Set initial active states + this.querySelector(`.theme-mode-switch[data-theme="${settings.colorMode}"]`)?.classList.add('active'); + this.querySelector(`.font-switch[data-font="${settings.font}"]`)?.classList.add('active'); + this.querySelector(`.font-switch[data-size="${settings.fontSize}"]`)?.classList.add('active'); + + // Theme buttons + this.querySelectorAll('.theme-mode-switch[data-theme]').forEach(button => { + button.addEventListener('click', () => { + this.querySelectorAll('.theme-mode-switch[data-theme]').forEach(btn => btn.classList.remove('active')); + button.classList.add('active'); + settings.colorMode = button.dataset.theme; + saveAppearanceSettings(settings); + }); + }); + + // Font buttons + this.querySelectorAll('.font-switch[data-font]').forEach(button => { + button.addEventListener('click', () => { + this.querySelectorAll('.font-switch[data-font]').forEach(btn => btn.classList.remove('active')); + button.classList.add('active'); + settings.font = button.dataset.font; + saveAppearanceSettings(settings); + }); + }); + + // Font size buttons + this.querySelectorAll('.font-switch[data-size]').forEach(button => { + button.addEventListener('click', () => { + this.querySelectorAll('.font-switch[data-size]').forEach(btn => btn.classList.remove('active')); + button.classList.add('active'); + settings.fontSize = button.dataset.size; + saveAppearanceSettings(settings); + }); + }); +} diff --git a/js/components/modals/settings-modal.js b/js/components/modals/settings-modal.js new file mode 100644 index 0000000..50aec15 --- /dev/null +++ b/js/components/modals/settings-modal.js @@ -0,0 +1,24 @@ +import { updateWarningVisibility } from '../../handlers/modalHandlers.js'; +import { loadAppearanceSettings, saveAppearanceSettings } from '../../settings/appearanceSettings.js'; +import { settingsTemplate } from './settings-template.js'; +import { setupAppearanceHandlers } from './settings-appearance.js'; +import { setupTabHandlers } from './settings-tabs.js'; + +class SettingsModal extends HTMLElement { + constructor() { + super(); + } + + connectedCallback() { + this.innerHTML = settingsTemplate; + + // Add tab switching functionality + setupTabHandlers.call(this); + // Add appearance settings handlers + setupAppearanceHandlers.call(this); + } +} + +customElements.define('settings-modal', SettingsModal); + +export { SettingsModal }; diff --git a/js/components/modals/settings-tabs.js b/js/components/modals/settings-tabs.js new file mode 100644 index 0000000..243c172 --- /dev/null +++ b/js/components/modals/settings-tabs.js @@ -0,0 +1,32 @@ +export function setupTabHandlers() { + const tabs = this.querySelectorAll('.settings-tab'); + tabs.forEach(tab => { + tab.addEventListener('click', () => { + // Remove active class from all tabs and contents + this.querySelectorAll('.settings-tab').forEach(t => t.classList.remove('active')); + this.querySelectorAll('.settings-content').forEach(c => c.classList.remove('active')); + + // Add active class to clicked tab and corresponding content + tab.classList.add('active'); + const content = this.querySelector(`[data-content="${tab.dataset.tab}"]`); + content.classList.add('active'); + + // Show/hide warning based on active tab and duration + const warningElement = this.querySelector('.settings-warning'); + if (tab.dataset.tab === 'muting') { + const duration = document.querySelector('input[name="duration"]:checked')?.value; + warningElement.style.display = duration && duration !== 'forever' ? 'flex' : 'none'; + } else { + warningElement.style.display = 'none'; + } + + // Lazy load the creator image when about tab is clicked + if (tab.dataset.tab === 'about') { + const img = this.querySelector('.creator-image'); + if (img) { + img.loading = 'eager'; // Switch to eager loading when tab is active + } + } + }); + }); +} diff --git a/js/components/modals/settings-template.js b/js/components/modals/settings-template.js new file mode 100644 index 0000000..37ad62c --- /dev/null +++ b/js/components/modals/settings-template.js @@ -0,0 +1,137 @@ +export const settingsTemplate = ` + +`; diff --git a/js/events.js b/js/events.js new file mode 100644 index 0000000..4cacb53 --- /dev/null +++ b/js/events.js @@ -0,0 +1,170 @@ +import { elements } from './dom.js'; +import { state, loadState } from './state.js'; +import { renderInterface } from './renderer.js'; +import { debounce } from './utils.js'; +import { getAllKeywordsForCategory } from './categoryManager.js'; +import { blueskyService } from './bluesky.js'; +import { + handleAuth, + handleLogout, + handleMuteSubmit, + switchMode, + handleEnableAll, + handleDisableAll, + handleRefreshData, + showApp, + initializeKeywordState, + applyAppearanceSettings +} from './handlers/index.js'; + +// Event Listeners +export function setupEventListeners() { + elements.authButton?.addEventListener('click', handleAuth); + elements.logoutButton?.addEventListener('click', handleLogout); + elements.muteButton?.addEventListener('click', handleMuteSubmit); + elements.navMuteButton?.addEventListener('click', handleMuteSubmit); + elements.enableAllBtn?.addEventListener('click', handleEnableAll); + elements.disableAllBtn?.addEventListener('click', handleDisableAll); + elements.refreshButton?.addEventListener('click', handleRefreshData); + + // Add Enter key handler for login input + const handleInput = document.getElementById('bsky-handle-input'); + if (handleInput) { + handleInput.addEventListener('keypress', (event) => { + if (event.key === 'Enter') { + event.preventDefault(); + handleAuth(); + } + }); + } + + // Set up intersection observer for auth button visibility + if (elements.authButton) { + const observer = new IntersectionObserver( + (entries) => { + entries.forEach(entry => { + // Check if the button is being intersected (covered) by other elements + const isVisible = entry.intersectionRatio === 1.0; + elements.authButton.style.visibility = isVisible ? 'visible' : 'hidden'; + }); + }, + { + threshold: 1.0, // Only trigger when button is fully visible/invisible + root: null // Use viewport as root + } + ); + + observer.observe(elements.authButton); + } + + // Helper function to notify keyword changes + function notifyKeywordChanges() { + document.dispatchEvent(new CustomEvent('keywordsUpdated', { + detail: { count: state.activeKeywords.size } + })); + } + + // Handle filter level changes from simple mode + document.addEventListener('filterLevelChange', (event) => { + const level = event.detail.level; + + // Update filter level in state + state.filterLevel = level; + + // Store current exceptions + const currentExceptions = new Set(state.selectedExceptions); + + // Clear and rebuild active keywords while preserving exceptions + state.activeKeywords.clear(); + state.selectedContexts.forEach(contextId => { + const context = state.contextGroups[contextId]; + if (context && context.categories) { + context.categories.forEach(category => { + if (!currentExceptions.has(category)) { + // Get keywords sorted by weight + const keywords = getAllKeywordsForCategory(category, true); + keywords.forEach(keyword => state.activeKeywords.add(keyword)); + } + }); + } + }); + + // Notify about keyword changes + notifyKeywordChanges(); + + // Restore exceptions + state.selectedExceptions = currentExceptions; + + // Update interface with new filtered keywords + renderInterface(); + }); + + elements.profileButton?.addEventListener('click', () => { + state.menuOpen = !state.menuOpen; + elements.userMenuDropdown?.classList.toggle('visible', state.menuOpen); + }); + + document.addEventListener('click', (event) => { + if (!event.target.closest('.user-menu') && state.menuOpen && elements.userMenuDropdown) { + state.menuOpen = false; + elements.userMenuDropdown.classList.remove('visible'); + } + }); + + elements.sidebarSearch?.addEventListener('input', debounce((e) => { + state.searchTerm = e.target.value.toLowerCase(); + renderInterface(); + }, 300)); + + // Listen for system theme changes + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => { + applyAppearanceSettings(); + }); + + // Handle visibility change to restore state when page becomes visible + document.addEventListener('visibilitychange', () => { + if (document.visibilityState === 'visible' && state.did) { + loadState(); + + // Re-render interface with restored state + renderInterface(); + // Re-apply mode + switchMode(state.mode); + + // Update SimpleMode component with current state + const simpleMode = document.querySelector('simple-mode'); + if (simpleMode) { + simpleMode.updateLevel(state.filterLevel); + simpleMode.updateExceptions(state.selectedExceptions); + } + } + }); + + // Listen for Bluesky login state changes + window.addEventListener('blueskyLoginStateChanged', async (event) => { + state.authenticated = event.detail.isLoggedIn; + if (state.authenticated) { + // Set DID in state when user logs in + state.did = blueskyService.auth.session?.did; + await showApp(); + // Initialize keyword state after authentication + await initializeKeywordState(); + // Re-render interface to show checked keywords + renderInterface(); + + // Update SimpleMode component with current state + const simpleMode = document.querySelector('simple-mode'); + if (simpleMode) { + simpleMode.updateLevel(state.filterLevel); + simpleMode.updateExceptions(state.selectedExceptions); + } + } else { + // Clear DID when user logs out + state.did = null; + if (elements.landingPage && elements.appInterface) { + elements.landingPage.classList.remove('hidden'); + elements.appInterface.classList.add('hidden'); + } + } + }); +} diff --git a/js/handlers/context/contextCache.js b/js/handlers/context/contextCache.js index 2241f4a..d29d1b9 100644 --- a/js/handlers/context/contextCache.js +++ b/js/handlers/context/contextCache.js @@ -13,7 +13,7 @@ export const cache = { updateThreshold: 16, getKeywords(category, sortByWeight = false) { - const key = `${category}-${sortByWeight}-${state.targetKeywordCount}`; + const key = `${category}-${sortByWeight}-${state.filterLevel}`; if (!this.keywords.has(key)) { this.manageCache(this.keywords); const keywords = getAllKeywordsForCategory(category, sortByWeight); @@ -23,7 +23,7 @@ export const cache = { }, getActiveKeywordsForCategory(category) { - const key = `active-${category}-${state.targetKeywordCount}`; + const key = `active-${category}-${state.filterLevel}`; if (!this.activeKeywordsByCategory.has(key)) { this.manageCache(this.activeKeywordsByCategory); const keywords = this.getKeywords(category, true); @@ -46,7 +46,7 @@ export const cache = { }, getContextKeywords(contextId) { - const key = `${contextId}-${state.targetKeywordCount}`; + const key = `${contextId}-${state.filterLevel}`; if (!this.contextKeywords.has(key)) { this.manageCache(this.contextKeywords); const context = state.contextGroups[contextId]; diff --git a/js/handlers/context/contextHandlers.js b/js/handlers/context/contextHandlers.js index 85c28e1..a1461d5 100644 --- a/js/handlers/context/contextHandlers.js +++ b/js/handlers/context/contextHandlers.js @@ -1,220 +1,10 @@ -import { renderInterface } from '../../renderer.js'; -import { state, saveState } from '../../state.js'; -import { cache } from './contextCache.js'; -import { - activateContextKeywords, - createDebouncedUpdate, - notifyKeywordChanges -} from './contextUtils.js'; +import { handleContextToggle } from './contextToggleHandler.js'; +import { handleExceptionToggle } from './exceptionToggleHandler.js'; import { updateSimpleModeState, initializeState } from './contextState.js'; -export async function handleContextToggle(contextId) { - console.debug('[handleContextToggle] Starting toggle for context:', contextId); - console.debug('[handleContextToggle] Initial state:', { - isAuthenticated: state.authenticated, - mode: state.mode, - selectedContextsCount: state.selectedContexts.size, - activeKeywordsCount: state.activeKeywords.size, - manuallyUncheckedCount: state.manuallyUnchecked.size - }); - - if (!state.authenticated) { - console.debug('[handleContextToggle] Not authenticated, returning'); - return; - } - - const isSelected = state.selectedContexts.has(contextId); - console.debug('[handleContextToggle] Context currently selected:', isSelected); - - const context = state.contextGroups[contextId]; - console.debug('[handleContextToggle] Context categories:', context?.categories); - - // Store currently unchecked keywords before context change - const uncheckedKeywords = new Set(state.manuallyUnchecked); - console.debug('[handleContextToggle] Stored unchecked keywords count:', uncheckedKeywords.size); - - if (isSelected) { - console.debug('[handleContextToggle] Unchecking context'); - - // 1. Update UI state first - state.selectedContexts.delete(contextId); - console.debug('[handleContextToggle] Removed context from selectedContexts'); - - if (context?.categories) { - context.categories.forEach(category => { - state.selectedExceptions.delete(category); - cache.invalidateCategory(category); - console.debug('[handleContextToggle] Removed exception and invalidated cache for category:', category); - }); - } - - // 2. Keep keywords in activeKeywords temporarily so getMuteUnmuteCounts works - const keywordsToRemove = new Set(); - if (context?.categories) { - for (const category of context.categories) { - if (!state.selectedExceptions.has(category)) { - const keywords = cache.getKeywords(category, true); - console.debug(`[handleContextToggle] Found ${keywords.size} keywords in category:`, category); - - for (const keyword of keywords) { - if (!uncheckedKeywords.has(keyword)) { - keywordsToRemove.add(keyword); - console.debug('[handleContextToggle] Marking keyword for removal:', keyword); - } - } - } - } - } - - console.debug('[handleContextToggle] Total keywords marked for removal:', keywordsToRemove.size); - console.debug('[handleContextToggle] Active keywords before removal:', state.activeKeywords.size); - - // 3. Now remove from activeKeywords after getMuteUnmuteCounts has run - for (const keyword of keywordsToRemove) { - state.activeKeywords.delete(keyword); - console.debug('[handleContextToggle] Removed keyword from activeKeywords:', keyword); - } - - console.debug('[handleContextToggle] Active keywords after removal:', state.activeKeywords.size); - - } else { - console.debug('[handleContextToggle] Checking context'); - - // 1. Update UI state - state.selectedContexts.add(contextId); - console.debug('[handleContextToggle] Added context to selectedContexts'); - - if (context?.categories) { - context.categories.forEach(category => { - cache.invalidateCategory(category); - console.debug('[handleContextToggle] Invalidated cache for category:', category); - }); - } - - // 2. Add keywords to activeKeywords - if (context?.categories) { - for (const category of context.categories) { - if (!state.selectedExceptions.has(category)) { - const keywords = cache.getKeywords(category, true); - console.debug(`[handleContextToggle] Found ${keywords.size} keywords in category:`, category); - - for (const keyword of keywords) { - if (!uncheckedKeywords.has(keyword)) { - state.activeKeywords.add(keyword); - console.debug('[handleContextToggle] Added keyword to activeKeywords:', keyword); - } - } - } - } - } - - console.debug('[handleContextToggle] Active keywords after additions:', state.activeKeywords.size); - } - - // Notify of keyword changes to update mute button - console.debug('[handleContextToggle] Notifying of keyword changes'); - notifyKeywordChanges(); - - // Create a new debounced update for this call - console.debug('[handleContextToggle] Creating debounced update'); - const debouncedUpdate = createDebouncedUpdate(); - await debouncedUpdate(async () => { - console.debug('[handleContextToggle] Executing debounced update'); - console.debug('[handleContextToggle] Final state:', { - selectedContextsCount: state.selectedContexts.size, - activeKeywordsCount: state.activeKeywords.size, - manuallyUncheckedCount: state.manuallyUnchecked.size - }); - renderInterface(); - await saveState(); - console.debug('[handleContextToggle] Completed interface render and state save'); - }); - - console.debug('[handleContextToggle] Toggle operation complete'); -} - -export async function handleExceptionToggle(category) { - console.debug('[handleExceptionToggle] Starting toggle for category:', category); - if (!state.authenticated) return; - - // Store currently unchecked keywords before exception change - const uncheckedKeywords = new Set(state.manuallyUnchecked); - - const wasException = state.selectedExceptions.has(category); - console.debug('[handleExceptionToggle] Was exception:', wasException); - - if (wasException) { - state.selectedExceptions.delete(category); - console.debug('[handleExceptionToggle] Removed exception'); - } else { - state.selectedExceptions.add(category); - console.debug('[handleExceptionToggle] Added exception'); - - // Check if any keywords in this category are currently muted - if (state.mode === 'simple') { - const categoryKeywords = cache.getKeywords(category, true); - for (const keyword of categoryKeywords) { - if (state.originalMutedKeywords.has(keyword)) { - state.activeKeywords.delete(keyword); - } - } - // Notify immediately of keyword changes to update mute button - notifyKeywordChanges(); - } - } - - cache.invalidateCategory(category); - console.debug('[handleExceptionToggle] Invalidated category cache'); - - // Only rebuild keywords in simple mode - if (state.mode === 'simple') { - console.debug('[handleExceptionToggle] Rebuilding keywords in simple mode'); - - // Clear and rebuild active keywords - state.activeKeywords.clear(); - for (const contextId of state.selectedContexts) { - activateContextKeywords(contextId, cache); - } - - // Add only original muted keywords that aren't in excepted categories - for (const keyword of state.originalMutedKeywords) { - if (!state.activeKeywords.has(keyword)) { - let isExcepted = false; - for (const exceptedCategory of state.selectedExceptions) { - const exceptedKeywords = cache.getKeywords(exceptedCategory, true); - if (exceptedKeywords.has(keyword)) { - isExcepted = true; - break; - } - } - if (!isExcepted) { - state.activeKeywords.add(keyword); - } - } - } - - // Re-apply unchecked status - for (const keyword of uncheckedKeywords) { - state.activeKeywords.delete(keyword); - state.manuallyUnchecked.add(keyword); - } - - console.debug('[handleExceptionToggle] Keyword counts after rebuild:', { - activeKeywords: state.activeKeywords.size, - manuallyUnchecked: state.manuallyUnchecked.size - }); - } - - // Create a new debounced update for this call - console.debug('[handleExceptionToggle] Creating debounced update'); - const debouncedUpdate = createDebouncedUpdate(); - await debouncedUpdate(async () => { - console.debug('[handleExceptionToggle] Executing debounced update'); - renderInterface(); - await saveState(); - console.debug('[handleExceptionToggle] Completed interface render and state save'); - }); -} - -// Re-export core functions -export { updateSimpleModeState, initializeState }; +export { + handleContextToggle, + handleExceptionToggle, + updateSimpleModeState, + initializeState +}; diff --git a/js/handlers/context/contextState.js b/js/handlers/context/contextState.js index 23d8f86..777b9ae 100644 --- a/js/handlers/context/contextState.js +++ b/js/handlers/context/contextState.js @@ -1,200 +1,4 @@ -import { state, saveState, getStorageKey } from '../../state.js'; -import { renderInterface } from '../../renderer.js'; -import { cache } from './contextCache.js'; -import { isKeywordActive } from '../keywordHandlers.js'; -import { - rebuildActiveKeywords, - createDebouncedUpdate, - activateContextKeywords, - notifyKeywordChanges -} from './contextUtils.js'; - -export async function updateSimpleModeState() { - if (!state.authenticated) return; - - // Store currently unchecked keywords - const uncheckedKeywords = new Set(state.manuallyUnchecked); - - if (state.mode === 'simple') { - // First derive context selections from advanced mode state - for (const contextId in state.contextGroups) { - const context = state.contextGroups[contextId]; - if (!context?.categories) continue; - - // Check if all non-excepted categories in this context are fully selected - let allCategoriesActive = true; - for (const category of context.categories) { - if (state.selectedExceptions.has(category)) continue; - - // Get keywords considering filter level - const keywords = cache.getKeywords(category, true); - let allActive = true; - - // Check if all keywords at current filter level are active - for (const keyword of keywords) { - if (!isKeywordActive(keyword)) { - allActive = false; - break; - } - } - - if (!allActive) { - allCategoriesActive = false; - break; - } - } - - // Update context selection based on category states - if (allCategoriesActive) { - state.selectedContexts.add(contextId); - } else { - state.selectedContexts.delete(contextId); - } - } - - // Then check if any selected contexts should be deselected - for (const contextId of Array.from(state.selectedContexts)) { - const contextState = cache.getContextState(contextId); - if (contextState === 'none') { - state.selectedContexts.delete(contextId); - } - } - - cache.clear(); - - // Clear and rebuild active keywords from derived contexts - state.activeKeywords.clear(); - for (const contextId of state.selectedContexts) { - activateContextKeywords(contextId, cache); - } - - // Add only original muted keywords that aren't already active and weren't manually unchecked - for (const keyword of state.originalMutedKeywords) { - if (!state.activeKeywords.has(keyword) && !state.manuallyUnchecked.has(keyword)) { - state.activeKeywords.add(keyword); - } - } - - // Re-apply unchecked status - for (const keyword of uncheckedKeywords) { - state.activeKeywords.delete(keyword); - state.manuallyUnchecked.add(keyword); - } - } - - // Create a new debounced update for this call with state - const debouncedUpdate = createDebouncedUpdate(); - await debouncedUpdate(async () => { - renderInterface(); - await saveState(); - }); -} - -export async function initializeState() { - if (!state.authenticated) return; - - state.selectedContexts.clear(); - state.selectedExceptions.clear(); - state.activeKeywords.clear(); - cache.clear(); - - const saved = localStorage.getItem(getStorageKey()); - if (saved) { - try { - const data = JSON.parse(saved); - - if (data.selectedContexts) { - state.selectedContexts = new Set(data.selectedContexts); - } - - if (data.selectedExceptions) { - const validExceptions = new Set(); - for (const contextId of state.selectedContexts) { - const context = state.contextGroups[contextId]; - if (context?.categories) { - context.categories.forEach(category => { - if (data.selectedExceptions.includes(category)) { - validExceptions.add(category); - } - }); - } - } - state.selectedExceptions = validExceptions; - } - - if (data.manuallyUnchecked) { - state.manuallyUnchecked = new Set(data.manuallyUnchecked); - } - - if (state.mode === 'simple') { - // First derive context selections from advanced mode state - for (const contextId in state.contextGroups) { - const context = state.contextGroups[contextId]; - if (!context?.categories) continue; - - // Check if all non-excepted categories in this context are fully selected - let allCategoriesActive = true; - for (const category of context.categories) { - if (state.selectedExceptions.has(category)) continue; - - // Get keywords considering filter level - const keywords = cache.getKeywords(category, true); - let allActive = true; - - // Check if all keywords at current filter level are active - for (const keyword of keywords) { - if (!isKeywordActive(keyword)) { - allActive = false; - break; - } - } - - if (!allActive) { - allCategoriesActive = false; - break; - } - } - - // Update context selection based on category states - if (allCategoriesActive) { - state.selectedContexts.add(contextId); - } else { - state.selectedContexts.delete(contextId); - } - } - - // Clear and rebuild active keywords from derived contexts - state.activeKeywords.clear(); - for (const contextId of state.selectedContexts) { - activateContextKeywords(contextId, cache); - } - - // Add only original muted keywords that aren't already active and weren't manually unchecked - for (const keyword of state.originalMutedKeywords) { - if (!state.activeKeywords.has(keyword) && !state.manuallyUnchecked.has(keyword)) { - state.activeKeywords.add(keyword); - } - } - - // Re-apply unchecked status - for (const keyword of Array.from(state.manuallyUnchecked)) { - state.activeKeywords.delete(keyword); - } - } - - // Create a new debounced update for this call with state - const debouncedUpdate = createDebouncedUpdate(); - await debouncedUpdate(async () => { - renderInterface(); - await saveState(); - }); - } catch (error) { - console.error('Error initializing state:', error); - state.selectedContexts.clear(); - state.selectedExceptions.clear(); - state.activeKeywords.clear(); - // Don't clear manuallyUnchecked on error - await saveState(); - } - } -} +// Re-export functionality from split files +export { addKeywordWithCase } from './keywordManager.js'; +export { updateSimpleModeState } from './simpleModeManager.js'; +export { initializeState } from './stateInitializer.js'; diff --git a/js/handlers/context/contextToggleHandler.js b/js/handlers/context/contextToggleHandler.js new file mode 100644 index 0000000..d9078d0 --- /dev/null +++ b/js/handlers/context/contextToggleHandler.js @@ -0,0 +1,132 @@ +import { renderInterface } from '../../renderer.js'; +import { state, saveState } from '../../state.js'; +import { cache } from './contextCache.js'; +import { + createDebouncedUpdate, + notifyKeywordChanges +} from './contextUtils.js'; + +export async function handleContextToggle(contextId) { + console.debug('[handleContextToggle] Starting toggle for context:', contextId); + console.debug('[handleContextToggle] Initial state:', { + isAuthenticated: state.authenticated, + mode: state.mode, + selectedContextsCount: state.selectedContexts.size, + activeKeywordsCount: state.activeKeywords.size, + manuallyUncheckedCount: state.manuallyUnchecked.size + }); + + if (!state.authenticated) { + console.debug('[handleContextToggle] Not authenticated, returning'); + return; + } + + const isSelected = state.selectedContexts.has(contextId); + console.debug('[handleContextToggle] Context currently selected:', isSelected); + + const context = state.contextGroups[contextId]; + console.debug('[handleContextToggle] Context categories:', context?.categories); + + // Store currently unchecked keywords before context change + const uncheckedKeywords = new Set(state.manuallyUnchecked); + console.debug('[handleContextToggle] Stored unchecked keywords count:', uncheckedKeywords.size); + + if (isSelected) { + console.debug('[handleContextToggle] Unchecking context'); + + // 1. Update UI state first + state.selectedContexts.delete(contextId); + console.debug('[handleContextToggle] Removed context from selectedContexts'); + + if (context?.categories) { + context.categories.forEach(category => { + state.selectedExceptions.delete(category); + cache.invalidateCategory(category); + console.debug('[handleContextToggle] Removed exception and invalidated cache for category:', category); + }); + } + + // 2. Keep keywords in activeKeywords temporarily so getMuteUnmuteCounts works + const keywordsToRemove = new Set(); + if (context?.categories) { + for (const category of context.categories) { + if (!state.selectedExceptions.has(category)) { + const keywords = cache.getKeywords(category, true); + console.debug(`[handleContextToggle] Found ${keywords.size} keywords in category:`, category); + + for (const keyword of keywords) { + if (!uncheckedKeywords.has(keyword)) { + keywordsToRemove.add(keyword); + console.debug('[handleContextToggle] Marking keyword for removal:', keyword); + } + } + } + } + } + + console.debug('[handleContextToggle] Total keywords marked for removal:', keywordsToRemove.size); + console.debug('[handleContextToggle] Active keywords before removal:', state.activeKeywords.size); + + // 3. Now remove from activeKeywords after getMuteUnmuteCounts has run + for (const keyword of keywordsToRemove) { + state.activeKeywords.delete(keyword); + console.debug('[handleContextToggle] Removed keyword from activeKeywords:', keyword); + } + + console.debug('[handleContextToggle] Active keywords after removal:', state.activeKeywords.size); + + } else { + console.debug('[handleContextToggle] Checking context'); + + // 1. Update UI state + state.selectedContexts.add(contextId); + console.debug('[handleContextToggle] Added context to selectedContexts'); + + if (context?.categories) { + context.categories.forEach(category => { + cache.invalidateCategory(category); + console.debug('[handleContextToggle] Invalidated cache for category:', category); + }); + } + + // 2. Add keywords to activeKeywords + if (context?.categories) { + for (const category of context.categories) { + if (!state.selectedExceptions.has(category)) { + const keywords = cache.getKeywords(category, true); + console.debug(`[handleContextToggle] Found ${keywords.size} keywords in category:`, category); + + for (const keyword of keywords) { + if (!uncheckedKeywords.has(keyword)) { + state.activeKeywords.add(keyword); + console.debug('[handleContextToggle] Added keyword to activeKeywords:', keyword); + } + } + } + } + } + + console.debug('[handleContextToggle] Active keywords after additions:', state.activeKeywords.size); + } + + // Notify of keyword changes to update mute button + console.debug('[handleContextToggle] Notifying of keyword changes'); + notifyKeywordChanges(); + + // Create a new debounced update for this call + console.debug('[handleContextToggle] Creating debounced update'); + const debouncedUpdate = createDebouncedUpdate(); + await debouncedUpdate(async () => { + console.debug('[handleContextToggle] Executing debounced update'); + console.debug('[handleContextToggle] Final state:', { + selectedContextsCount: state.selectedContexts.size, + activeKeywordsCount: state.activeKeywords.size, + manuallyUncheckedCount: state.manuallyUnchecked.size + }); + renderInterface(); + await saveState(); + console.debug('[handleContextToggle] Completed interface render and state save'); + }); + + console.debug('[handleContextToggle] Toggle operation complete'); +} diff --git a/js/handlers/context/contextUtils.js b/js/handlers/context/contextUtils.js index 0bf43a9..4486eab 100644 --- a/js/handlers/context/contextUtils.js +++ b/js/handlers/context/contextUtils.js @@ -1,4 +1,5 @@ import { state } from '../../state.js'; +import { isKeywordActive, removeKeyword } from '../keywordHandlers.js'; // Helper function to notify keyword changes export function notifyKeywordChanges() { @@ -45,6 +46,14 @@ export function processBatchKeywords(keywords, operation) { processChunk(); } +// Helper function to add keyword with case handling +function addKeywordWithCase(keyword) { + // First remove any existing case variations + removeKeyword(keyword); + // Then add with original case + state.activeKeywords.add(keyword); +} + // Helper function to activate context keywords export function activateContextKeywords(contextId, cache) { const context = state.contextGroups[contextId]; @@ -57,7 +66,7 @@ export function activateContextKeywords(contextId, cache) { processBatchKeywords(keywords, keyword => { // Only activate if not manually unchecked if (!state.manuallyUnchecked.has(keyword)) { - state.activeKeywords.add(keyword); + addKeywordWithCase(keyword); } }); } @@ -78,14 +87,14 @@ export function rebuildActiveKeywords(cache) { // Add only original muted keywords that aren't already active and weren't manually unchecked for (const keyword of state.originalMutedKeywords) { - if (!state.activeKeywords.has(keyword) && !state.manuallyUnchecked.has(keyword)) { - state.activeKeywords.add(keyword); + if (!isKeywordActive(keyword) && !state.manuallyUnchecked.has(keyword)) { + addKeywordWithCase(keyword); } } // Re-apply unchecked status for (const keyword of uncheckedKeywords) { - state.activeKeywords.delete(keyword); + removeKeyword(keyword); state.manuallyUnchecked.add(keyword); } } diff --git a/js/handlers/context/exceptionToggleHandler.js b/js/handlers/context/exceptionToggleHandler.js new file mode 100644 index 0000000..57c9d05 --- /dev/null +++ b/js/handlers/context/exceptionToggleHandler.js @@ -0,0 +1,91 @@ +import { renderInterface } from '../../renderer.js'; +import { state, saveState } from '../../state.js'; +import { cache } from './contextCache.js'; +import { + activateContextKeywords, + createDebouncedUpdate, + notifyKeywordChanges +} from './contextUtils.js'; + +export async function handleExceptionToggle(category) { + console.debug('[handleExceptionToggle] Starting toggle for category:', category); + if (!state.authenticated) return; + + // Store currently unchecked keywords before exception change + const uncheckedKeywords = new Set(state.manuallyUnchecked); + + const wasException = state.selectedExceptions.has(category); + console.debug('[handleExceptionToggle] Was exception:', wasException); + + if (wasException) { + state.selectedExceptions.delete(category); + console.debug('[handleExceptionToggle] Removed exception'); + } else { + state.selectedExceptions.add(category); + console.debug('[handleExceptionToggle] Added exception'); + + // Check if any keywords in this category are currently muted + if (state.mode === 'simple') { + const categoryKeywords = cache.getKeywords(category, true); + for (const keyword of categoryKeywords) { + if (state.originalMutedKeywords.has(keyword)) { + state.activeKeywords.delete(keyword); + } + } + // Notify immediately of keyword changes to update mute button + notifyKeywordChanges(); + } + } + + cache.invalidateCategory(category); + console.debug('[handleExceptionToggle] Invalidated category cache'); + + // Only rebuild keywords in simple mode + if (state.mode === 'simple') { + console.debug('[handleExceptionToggle] Rebuilding keywords in simple mode'); + + // Clear and rebuild active keywords + state.activeKeywords.clear(); + for (const contextId of state.selectedContexts) { + activateContextKeywords(contextId, cache); + } + + // Add only original muted keywords that aren't in excepted categories + for (const keyword of state.originalMutedKeywords) { + if (!state.activeKeywords.has(keyword)) { + let isExcepted = false; + for (const exceptedCategory of state.selectedExceptions) { + const exceptedKeywords = cache.getKeywords(exceptedCategory, true); + if (exceptedKeywords.has(keyword)) { + isExcepted = true; + break; + } + } + if (!isExcepted) { + state.activeKeywords.add(keyword); + } + } + } + + // Re-apply unchecked status + for (const keyword of uncheckedKeywords) { + state.activeKeywords.delete(keyword); + state.manuallyUnchecked.add(keyword); + } + + console.debug('[handleExceptionToggle] Keyword counts after rebuild:', { + activeKeywords: state.activeKeywords.size, + manuallyUnchecked: state.manuallyUnchecked.size + }); + } + + // Create a new debounced update for this call + console.debug('[handleExceptionToggle] Creating debounced update'); + const debouncedUpdate = createDebouncedUpdate(); + await debouncedUpdate(async () => { + console.debug('[handleExceptionToggle] Executing debounced update'); + renderInterface(); + await saveState(); + console.debug('[handleExceptionToggle] Completed interface render and state save'); + }); +} diff --git a/js/handlers/context/keywordManager.js b/js/handlers/context/keywordManager.js new file mode 100644 index 0000000..ed94680 --- /dev/null +++ b/js/handlers/context/keywordManager.js @@ -0,0 +1,10 @@ +import { state } from '../../state.js'; +import { removeKeyword } from '../keywordHandlers.js'; + +// Helper function to add keyword with case handling +export function addKeywordWithCase(keyword) { + // First remove any existing case variations + removeKeyword(keyword); + // Then add with original case + state.activeKeywords.add(keyword); +} diff --git a/js/handlers/context/simpleModeManager.js b/js/handlers/context/simpleModeManager.js new file mode 100644 index 0000000..4592407 --- /dev/null +++ b/js/handlers/context/simpleModeManager.js @@ -0,0 +1,90 @@ +import { state, saveState } from '../../state.js'; +import { renderInterface } from '../../renderer.js'; +import { cache } from './contextCache.js'; +import { isKeywordActive, removeKeyword } from '../keywordHandlers.js'; +import { + createDebouncedUpdate, + activateContextKeywords +} from './contextUtils.js'; +import { addKeywordWithCase } from './keywordManager.js'; + +export async function updateSimpleModeState() { + if (!state.authenticated) return; + + // Store currently unchecked keywords + const uncheckedKeywords = new Set(state.manuallyUnchecked); + + if (state.mode === 'simple') { + // First derive context selections from advanced mode state + for (const contextId in state.contextGroups) { + const context = state.contextGroups[contextId]; + if (!context?.categories) continue; + + // Check if all non-excepted categories in this context are fully selected + let allCategoriesActive = true; + for (const category of context.categories) { + if (state.selectedExceptions.has(category)) continue; + + // Get keywords considering filter level + const keywords = cache.getKeywords(category, true); + let allActive = true; + + // Check if all keywords at current filter level are active + for (const keyword of keywords) { + if (!isKeywordActive(keyword)) { + allActive = false; + break; + } + } + + if (!allActive) { + allCategoriesActive = false; + break; + } + } + + // Update context selection based on category states + if (allCategoriesActive) { + state.selectedContexts.add(contextId); + } else { + state.selectedContexts.delete(contextId); + } + } + + // Then check if any selected contexts should be deselected + for (const contextId of Array.from(state.selectedContexts)) { + const contextState = cache.getContextState(contextId); + if (contextState === 'none') { + state.selectedContexts.delete(contextId); + } + } + + cache.clear(); + + // Clear and rebuild active keywords from derived contexts + state.activeKeywords.clear(); + for (const contextId of state.selectedContexts) { + activateContextKeywords(contextId, cache); + } + + // Add only original muted keywords that aren't already active and weren't manually unchecked + for (const keyword of state.originalMutedKeywords) { + if (!isKeywordActive(keyword) && !state.manuallyUnchecked.has(keyword)) { + addKeywordWithCase(keyword); + } + } + + // Re-apply unchecked status + for (const keyword of uncheckedKeywords) { + removeKeyword(keyword); + state.manuallyUnchecked.add(keyword); + } + } + + // Create a new debounced update for this call with state + const debouncedUpdate = createDebouncedUpdate(); + await debouncedUpdate(async () => { + renderInterface(); + await saveState(); + }); +} diff --git a/js/handlers/context/stateInitializer.js b/js/handlers/context/stateInitializer.js new file mode 100644 index 0000000..8984acc --- /dev/null +++ b/js/handlers/context/stateInitializer.js @@ -0,0 +1,118 @@ +import { state, saveState, getStorageKey } from '../../state.js'; +import { renderInterface } from '../../renderer.js'; +import { cache } from './contextCache.js'; +import { isKeywordActive, removeKeyword } from '../keywordHandlers.js'; +import { + createDebouncedUpdate, + activateContextKeywords +} from './contextUtils.js'; +import { addKeywordWithCase } from './keywordManager.js'; + +export async function initializeState() { + if (!state.authenticated) return; + + state.selectedContexts.clear(); + state.selectedExceptions.clear(); + state.activeKeywords.clear(); + cache.clear(); + + const saved = localStorage.getItem(getStorageKey()); + if (saved) { + try { + const data = JSON.parse(saved); + + if (data.selectedContexts) { + state.selectedContexts = new Set(data.selectedContexts); + } + + if (data.selectedExceptions) { + const validExceptions = new Set(); + for (const contextId of state.selectedContexts) { + const context = state.contextGroups[contextId]; + if (context?.categories) { + context.categories.forEach(category => { + if (data.selectedExceptions.includes(category)) { + validExceptions.add(category); + } + }); + } + } + state.selectedExceptions = validExceptions; + } + + if (data.manuallyUnchecked) { + state.manuallyUnchecked = new Set(data.manuallyUnchecked); + } + + if (state.mode === 'simple') { + // First derive context selections from advanced mode state + for (const contextId in state.contextGroups) { + const context = state.contextGroups[contextId]; + if (!context?.categories) continue; + + // Check if all non-excepted categories in this context are fully selected + let allCategoriesActive = true; + for (const category of context.categories) { + if (state.selectedExceptions.has(category)) continue; + + // Get keywords considering filter level + const keywords = cache.getKeywords(category, true); + let allActive = true; + + // Check if all keywords at current filter level are active + for (const keyword of keywords) { + if (!isKeywordActive(keyword)) { + allActive = false; + break; + } + } + + if (!allActive) { + allCategoriesActive = false; + break; + } + } + + // Update context selection based on category states + if (allCategoriesActive) { + state.selectedContexts.add(contextId); + } else { + state.selectedContexts.delete(contextId); + } + } + + // Clear and rebuild active keywords from derived contexts + state.activeKeywords.clear(); + for (const contextId of state.selectedContexts) { + activateContextKeywords(contextId, cache); + } + + // Add only original muted keywords that aren't already active and weren't manually unchecked + for (const keyword of state.originalMutedKeywords) { + if (!isKeywordActive(keyword) && !state.manuallyUnchecked.has(keyword)) { + addKeywordWithCase(keyword); + } + } + + // Re-apply unchecked status + for (const keyword of Array.from(state.manuallyUnchecked)) { + removeKeyword(keyword); + } + } + + // Create a new debounced update for this call with state + const debouncedUpdate = createDebouncedUpdate(); + await debouncedUpdate(async () => { + renderInterface(); + await saveState(); + }); + } catch (error) { + console.error('Error initializing state:', error); + state.selectedContexts.clear(); + state.selectedExceptions.clear(); + state.activeKeywords.clear(); + // Don't clear manuallyUnchecked on error + await saveState(); + } + } +} diff --git a/js/handlers/keywordHandlers.js b/js/handlers/keywordHandlers.js index ec40bca..94374b6 100644 --- a/js/handlers/keywordHandlers.js +++ b/js/handlers/keywordHandlers.js @@ -1,272 +1,15 @@ -import { state, saveState } from '../state.js'; -import { getAllKeywordsForCategory, filterKeywordGroups } from '../categoryManager.js'; -import { renderInterface } from '../renderer.js'; -import { updateSimpleModeState } from './contextHandlers.js'; - -// Enhanced keyword cache with shorter timeout -const keywordCache = { - categoryKeywords: new Map(), - lastUpdate: 0, - updateThreshold: 16, // Reduced to one frame to match state.js - - shouldUpdate() { - const now = Date.now(); - if (now - this.lastUpdate < this.updateThreshold) return false; - this.lastUpdate = now; - return true; - }, - - getKeywordsForCategory(category) { - if (!this.categoryKeywords.has(category) || this.shouldUpdate()) { - this.categoryKeywords.set(category, new Set(getAllKeywordsForCategory(category))); - } - return this.categoryKeywords.get(category); - }, - - clear() { - this.categoryKeywords.clear(); - this.lastUpdate = 0; - } -}; - -// Debounced UI updates with frame timing -const debouncedUpdate = (() => { - let timeout; - let frameRequest; - return (fn) => { - if (timeout) clearTimeout(timeout); - if (frameRequest) cancelAnimationFrame(frameRequest); - - timeout = setTimeout(() => { - frameRequest = requestAnimationFrame(() => { - fn(); - notifyKeywordChanges(); - }); - }, 16); - }; -})(); - -// Batch process keywords -function processBatchKeywords(keywords, operation) { - const chunkSize = 100; - const chunks = Array.from(keywords); - - let index = 0; - function processChunk() { - const chunk = chunks.slice(index, index + chunkSize); - if (chunk.length === 0) { - // Save state after all chunks are processed - saveState(); - return; - } - - chunk.forEach(operation); - index += chunkSize; - - if (index < chunks.length) { - requestAnimationFrame(processChunk); - } else { - // Save state after final chunk - saveState(); - } - } - - processChunk(); -} - -// Helper function to notify keyword changes -function notifyKeywordChanges() { - document.dispatchEvent(new CustomEvent('keywordsUpdated', { - detail: { count: state.activeKeywords.size } - })); -} - -// Optimized checkbox update with proper CSS escaping -function updateCheckboxes(category, enabled) { - requestAnimationFrame(() => { - const escapedCategory = CSS.escape(category.replace(/\s+/g, '-').toLowerCase()); - // Use more specific selectors for better performance - const sidebarCheckbox = document.querySelector(`.category-item[data-category="${CSS.escape(category)}"] > input[type="checkbox"]`); - const mainCheckbox = document.querySelector(`#category-${escapedCategory} > input[type="checkbox"]`); - const keywordCheckboxes = document.querySelectorAll(`#category-${escapedCategory} .keywords-container input[type="checkbox"]`); - - if (sidebarCheckbox) { - sidebarCheckbox.checked = enabled; - sidebarCheckbox.indeterminate = false; - } - if (mainCheckbox) { - mainCheckbox.checked = enabled; - mainCheckbox.indeterminate = false; - } - keywordCheckboxes.forEach(checkbox => { - checkbox.checked = enabled; - }); - }); -} - -// Helper to check if keyword is active (case-insensitive) -export function isKeywordActive(keyword) { - const lowerKeyword = keyword.toLowerCase(); - for (const activeKeyword of state.activeKeywords) { - if (activeKeyword.toLowerCase() === lowerKeyword) { - return true; - } - } - return false; -} - -// Helper to remove keyword (case-insensitive) -function removeKeyword(keyword) { - const lowerKeyword = keyword.toLowerCase(); - for (const activeKeyword of state.activeKeywords) { - if (activeKeyword.toLowerCase() === lowerKeyword) { - state.activeKeywords.delete(activeKeyword); - break; - } - } -} - -export function handleKeywordToggle(keyword, enabled) { - if (enabled) { - // If manually checking, remove from unchecked list - state.manuallyUnchecked.delete(keyword); - // First remove any existing case variations - removeKeyword(keyword); - // Then add with original case - state.activeKeywords.add(keyword); - } else { - // If manually unchecking, add to unchecked list - state.manuallyUnchecked.add(keyword); - removeKeyword(keyword); - } - - debouncedUpdate(() => { - updateSimpleModeState(); - renderInterface(); - saveState(); - }); -} - -export function handleCategoryToggle(category, currentState) { - const keywords = keywordCache.getKeywordsForCategory(category); - const shouldEnable = currentState !== 'all'; - - processBatchKeywords(keywords, keyword => { - if (shouldEnable) { - // If enabling category, remove keywords from unchecked list - state.manuallyUnchecked.delete(keyword); - // First remove any existing case variations - removeKeyword(keyword); - // Then add with original case if not already active - if (!isKeywordActive(keyword)) { - state.activeKeywords.add(keyword); - } - } else { - // If disabling category, add keywords to unchecked list - state.manuallyUnchecked.add(keyword); - removeKeyword(keyword); - } - }); - - updateCheckboxes(category, shouldEnable); - - debouncedUpdate(() => { - updateSimpleModeState(); - renderInterface(); - saveState(); - }); -} - -export function handleEnableAll() { - // Clear manually unchecked since this is an explicit enable all - state.manuallyUnchecked.clear(); - // Set flag to indicate enable all was used - state.lastBulkAction = 'enable'; - - if (state.searchTerm) { - // When searching, only enable filtered keywords - const filteredGroups = filterKeywordGroups(); - processBatchKeywords(Object.values(filteredGroups).flat(), keyword => { - // First remove any existing case variations - removeKeyword(keyword); - // Then add with original case if not already active - if (!isKeywordActive(keyword)) { - state.activeKeywords.add(keyword); - } - }); - } else { - // When not searching, enable all keywords from all categories - const allCategories = [ - ...Object.keys(state.keywordGroups), - ...Object.keys(state.displayConfig.combinedCategories || {}) - ]; - - // Enable all contexts first - Object.keys(state.contextGroups).forEach(contextId => { - state.selectedContexts.add(contextId); - }); - - let processedCount = 0; - function processNextCategory() { - if (processedCount >= allCategories.length) { - debouncedUpdate(() => { - updateSimpleModeState(); - renderInterface(); - saveState(); - }); - return; - } - - const category = allCategories[processedCount++]; - const keywords = keywordCache.getKeywordsForCategory(category); - processBatchKeywords(keywords, keyword => { - // First remove any existing case variations - removeKeyword(keyword); - // Then add with original case if not already active - if (!isKeywordActive(keyword)) { - state.activeKeywords.add(keyword); - } - }); - - requestAnimationFrame(processNextCategory); - } - - processNextCategory(); - return; // Early return since updates are handled in processNextCategory - } - - debouncedUpdate(() => { - updateSimpleModeState(); - renderInterface(); - saveState(); - }); -} - -export function handleDisableAll() { - // Clear manually unchecked since this is an explicit disable all - state.manuallyUnchecked.clear(); - // Set flag to indicate disable all was used - state.lastBulkAction = 'disable'; - - if (state.searchTerm) { - // When searching, only disable filtered keywords - const filteredGroups = filterKeywordGroups(); - processBatchKeywords(Object.values(filteredGroups).flat(), keyword => { - removeKeyword(keyword); - }); - } else { - // Clear all contexts first - state.selectedContexts.clear(); - state.selectedExceptions.clear(); - - // When not searching, disable all keywords - state.activeKeywords.clear(); - keywordCache.clear(); - } - - debouncedUpdate(() => { - updateSimpleModeState(); - renderInterface(); - saveState(); - }); -} +// Re-export everything from the new modular structure +export { + keywordCache, + debouncedUpdate, + notifyKeywordChanges, + updateCheckboxes, + standardUpdate, + isKeywordActive, + removeKeyword, + processBatchKeywords, + handleKeywordToggle, + handleCategoryToggle, + handleEnableAll, + handleDisableAll +} from './keywords/index.js'; diff --git a/js/handlers/keywords/bulk-handlers.js b/js/handlers/keywords/bulk-handlers.js new file mode 100644 index 0000000..eb6437d --- /dev/null +++ b/js/handlers/keywords/bulk-handlers.js @@ -0,0 +1,101 @@ +import { state, saveState } from '../../state.js'; +import { filterKeywordGroups } from '../../categoryManager.js'; +import { debouncedUpdate } from './ui-utils.js'; +import { keywordCache } from './cache.js'; +import { removeKeyword, isKeywordActive, processBatchKeywords } from './keyword-utils.js'; +import { updateSimpleModeState } from '../contextHandlers.js'; +import { renderInterface } from '../../renderer.js'; + +export function handleEnableAll() { + // Clear manually unchecked since this is an explicit enable all + state.manuallyUnchecked.clear(); + // Set flag to indicate enable all was used + state.lastBulkAction = 'enable'; + + if (state.searchTerm) { + // When searching, only enable filtered keywords + const filteredGroups = filterKeywordGroups(); + processBatchKeywords(Object.values(filteredGroups).flat(), keyword => { + // First remove any existing case variations + removeKeyword(keyword); + // Then add with original case if not already active + if (!isKeywordActive(keyword)) { + state.activeKeywords.add(keyword); + } + }); + } else { + // When not searching, enable all keywords from all categories + const allCategories = [ + ...Object.keys(state.keywordGroups), + ...Object.keys(state.displayConfig.combinedCategories || {}) + ]; + + // Enable all contexts first + Object.keys(state.contextGroups).forEach(contextId => { + state.selectedContexts.add(contextId); + }); + + let processedCount = 0; + function processNextCategory() { + if (processedCount >= allCategories.length) { + debouncedUpdate(() => { + updateSimpleModeState(); + renderInterface(); + saveState(); + }); + return; + } + + const category = allCategories[processedCount++]; + const keywords = keywordCache.getKeywordsForCategory(category); + processBatchKeywords(keywords, keyword => { + // First remove any existing case variations + removeKeyword(keyword); + // Then add with original case if not already active + if (!isKeywordActive(keyword)) { + state.activeKeywords.add(keyword); + } + }); + + requestAnimationFrame(processNextCategory); + } + + processNextCategory(); + return; // Early return since updates are handled in processNextCategory + } + + debouncedUpdate(() => { + updateSimpleModeState(); + renderInterface(); + saveState(); + }); +} + +export function handleDisableAll() { + // Clear manually unchecked since this is an explicit disable all + state.manuallyUnchecked.clear(); + // Set flag to indicate disable all was used + state.lastBulkAction = 'disable'; + + if (state.searchTerm) { + // When searching, only disable filtered keywords + const filteredGroups = filterKeywordGroups(); + processBatchKeywords(Object.values(filteredGroups).flat(), keyword => { + removeKeyword(keyword); + }); + } else { + // Clear all contexts first + state.selectedContexts.clear(); + state.selectedExceptions.clear(); + + // When not searching, disable all keywords + state.activeKeywords.clear(); + keywordCache.clear(); + } + + debouncedUpdate(() => { + updateSimpleModeState(); + renderInterface(); + saveState(); + }); +} diff --git a/js/handlers/keywords/cache.js b/js/handlers/keywords/cache.js new file mode 100644 index 0000000..485c28e --- /dev/null +++ b/js/handlers/keywords/cache.js @@ -0,0 +1,27 @@ +import { getAllKeywordsForCategory } from '../../categoryManager.js'; + +// Enhanced keyword cache with shorter timeout +export const keywordCache = { + categoryKeywords: new Map(), + lastUpdate: 0, + updateThreshold: 16, // Reduced to one frame to match state.js + + shouldUpdate() { + const now = Date.now(); + if (now - this.lastUpdate < this.updateThreshold) return false; + this.lastUpdate = now; + return true; + }, + + getKeywordsForCategory(category) { + if (!this.categoryKeywords.has(category) || this.shouldUpdate()) { + this.categoryKeywords.set(category, new Set(getAllKeywordsForCategory(category))); + } + return this.categoryKeywords.get(category); + }, + + clear() { + this.categoryKeywords.clear(); + this.lastUpdate = 0; + } +}; diff --git a/js/handlers/keywords/core-handlers.js b/js/handlers/keywords/core-handlers.js new file mode 100644 index 0000000..3ca50e0 --- /dev/null +++ b/js/handlers/keywords/core-handlers.js @@ -0,0 +1,57 @@ +import { state, saveState } from '../../state.js'; +import { debouncedUpdate, updateCheckboxes } from './ui-utils.js'; +import { keywordCache } from './cache.js'; +import { removeKeyword, isKeywordActive, processBatchKeywords } from './keyword-utils.js'; +import { updateSimpleModeState } from '../contextHandlers.js'; +import { renderInterface } from '../../renderer.js'; + +export function handleKeywordToggle(keyword, enabled) { + if (enabled) { + // If manually checking, remove from unchecked list + state.manuallyUnchecked.delete(keyword); + // First remove any existing case variations + removeKeyword(keyword); + // Then add with original case + state.activeKeywords.add(keyword); + } else { + // If manually unchecking, add to unchecked list + state.manuallyUnchecked.add(keyword); + removeKeyword(keyword); + } + + debouncedUpdate(() => { + updateSimpleModeState(); + renderInterface(); + saveState(); + }); +} + +export function handleCategoryToggle(category, currentState) { + const keywords = keywordCache.getKeywordsForCategory(category); + const shouldEnable = currentState !== 'all'; + + processBatchKeywords(keywords, keyword => { + if (shouldEnable) { + // If enabling category, remove keywords from unchecked list + state.manuallyUnchecked.delete(keyword); + // First remove any existing case variations + removeKeyword(keyword); + // Then add with original case if not already active + if (!isKeywordActive(keyword)) { + state.activeKeywords.add(keyword); + } + } else { + // If disabling category, add keywords to unchecked list + state.manuallyUnchecked.add(keyword); + removeKeyword(keyword); + } + }); + + updateCheckboxes(category, shouldEnable); + + debouncedUpdate(() => { + updateSimpleModeState(); + renderInterface(); + saveState(); + }); +} diff --git a/js/handlers/keywords/index.js b/js/handlers/keywords/index.js new file mode 100644 index 0000000..160e63a --- /dev/null +++ b/js/handlers/keywords/index.js @@ -0,0 +1,20 @@ +export { keywordCache } from './cache.js'; +export { + debouncedUpdate, + notifyKeywordChanges, + updateCheckboxes, + standardUpdate +} from './ui-utils.js'; +export { + isKeywordActive, + removeKeyword, + processBatchKeywords +} from './keyword-utils.js'; +export { + handleKeywordToggle, + handleCategoryToggle +} from './core-handlers.js'; +export { + handleEnableAll, + handleDisableAll +} from './bulk-handlers.js'; diff --git a/js/handlers/keywords/keyword-utils.js b/js/handlers/keywords/keyword-utils.js new file mode 100644 index 0000000..bcd56ea --- /dev/null +++ b/js/handlers/keywords/keyword-utils.js @@ -0,0 +1,51 @@ +import { state, saveState } from '../../state.js'; + +// Helper to check if keyword is active (case-insensitive) +export function isKeywordActive(keyword) { + const lowerKeyword = keyword.toLowerCase(); + for (const activeKeyword of state.activeKeywords) { + if (activeKeyword.toLowerCase() === lowerKeyword) { + return true; + } + } + return false; +} + +// Helper to remove keyword (case-insensitive) +export function removeKeyword(keyword) { + const lowerKeyword = keyword.toLowerCase(); + for (const activeKeyword of state.activeKeywords) { + if (activeKeyword.toLowerCase() === lowerKeyword) { + state.activeKeywords.delete(activeKeyword); + break; + } + } +} + +// Batch process keywords +export function processBatchKeywords(keywords, operation) { + const chunkSize = 100; + const chunks = Array.from(keywords); + + let index = 0; + function processChunk() { + const chunk = chunks.slice(index, index + chunkSize); + if (chunk.length === 0) { + // Save state after all chunks are processed + saveState(); + return; + } + + chunk.forEach(operation); + index += chunkSize; + + if (index < chunks.length) { + requestAnimationFrame(processChunk); + } else { + // Save state after final chunk + saveState(); + } + } + + processChunk(); +} diff --git a/js/handlers/keywords/ui-utils.js b/js/handlers/keywords/ui-utils.js new file mode 100644 index 0000000..2d05c89 --- /dev/null +++ b/js/handlers/keywords/ui-utils.js @@ -0,0 +1,57 @@ +import { state, saveState } from '../../state.js'; +import { updateSimpleModeState } from '../contextHandlers.js'; +import { renderInterface } from '../../renderer.js'; + +// Debounced UI updates with frame timing +export const debouncedUpdate = (() => { + let timeout; + let frameRequest; + return (fn) => { + if (timeout) clearTimeout(timeout); + if (frameRequest) cancelAnimationFrame(frameRequest); + + timeout = setTimeout(() => { + frameRequest = requestAnimationFrame(() => { + fn(); + notifyKeywordChanges(); + }); + }, 16); + }; +})(); + +// Helper function to notify keyword changes +export function notifyKeywordChanges() { + document.dispatchEvent(new CustomEvent('keywordsUpdated', { + detail: { count: state.activeKeywords.size } + })); +} + +// Optimized checkbox update with proper CSS escaping +export function updateCheckboxes(category, enabled) { + requestAnimationFrame(() => { + const escapedCategory = CSS.escape(category.replace(/\s+/g, '-').toLowerCase()); + // Use more specific selectors for better performance + const sidebarCheckbox = document.querySelector(`.category-item[data-category="${CSS.escape(category)}"] > input[type="checkbox"]`); + const mainCheckbox = document.querySelector(`#category-${escapedCategory} > input[type="checkbox"]`); + const keywordCheckboxes = document.querySelectorAll(`#category-${escapedCategory} .keywords-container input[type="checkbox"]`); + + if (sidebarCheckbox) { + sidebarCheckbox.checked = enabled; + sidebarCheckbox.indeterminate = false; + } + if (mainCheckbox) { + mainCheckbox.checked = enabled; + mainCheckbox.indeterminate = false; + } + keywordCheckboxes.forEach(checkbox => { + checkbox.checked = enabled; + }); + }); +} + +// Standard update function used by handlers +export function standardUpdate() { + updateSimpleModeState(); + renderInterface(); + saveState(); +} diff --git a/js/handlers/mute/index.js b/js/handlers/mute/index.js new file mode 100644 index 0000000..6e433df --- /dev/null +++ b/js/handlers/mute/index.js @@ -0,0 +1,10 @@ +import { handleMuteSubmit, initializeKeywordState } from './muteOperations.js'; +import { getButtonText } from './muteUIUtils.js'; +import { muteCache } from './muteCache.js'; + +export { + handleMuteSubmit, + initializeKeywordState, + getButtonText, + muteCache +}; diff --git a/js/handlers/mute/muteCache.js b/js/handlers/mute/muteCache.js new file mode 100644 index 0000000..e4103c4 --- /dev/null +++ b/js/handlers/mute/muteCache.js @@ -0,0 +1,44 @@ +// Enhanced keyword cache for mute operations +const muteCache = { + ourKeywordsMap: null, + lastUpdate: 0, + updateThreshold: 50, + + shouldUpdate() { + const now = Date.now(); + if (now - this.lastUpdate < this.updateThreshold) return false; + this.lastUpdate = now; + return true; + }, + + getOurKeywordsMap() { + if (this.ourKeywordsMap && !this.shouldUpdate()) { + console.debug('[muteCache] Returning cached keyword map'); + return this.ourKeywordsMap; + } + + console.debug('[muteCache] Building new keyword map'); + const map = new Map(); + Object.entries(state.keywordGroups).forEach(([category, categoryData]) => { + const categoryInfo = categoryData[category]; + if (categoryInfo?.keywords) { + Object.keys(categoryInfo.keywords).forEach(keyword => { + map.set(keyword.toLowerCase(), keyword); + }); + } + }); + this.ourKeywordsMap = map; + console.debug('[muteCache] New keyword map size:', map.size); + return map; + }, + + clear() { + console.debug('[muteCache] Clearing cache'); + this.ourKeywordsMap = null; + this.lastUpdate = 0; + } +}; + +import { state } from '../../state.js'; + +export { muteCache }; diff --git a/js/handlers/mute/muteOperations.js b/js/handlers/mute/muteOperations.js new file mode 100644 index 0000000..9d2ac8e --- /dev/null +++ b/js/handlers/mute/muteOperations.js @@ -0,0 +1,123 @@ +import { state, saveState, getMuteUnmuteCounts } from '../../state.js'; +import { blueskyService } from '../../bluesky.js'; +import { renderInterface } from '../../renderer.js'; +import { showNotification } from '../../utils/notifications.js'; +import { muteCache } from './muteCache.js'; +import { debouncedUpdate } from './muteUIUtils.js'; + +// Process all keywords immediately without batching +function processKeywords(keywords, operation) { + console.debug('[processKeywords] Processing', keywords.length, 'keywords'); + keywords.forEach(operation); + console.debug('[processKeywords] Finished processing all keywords'); +} + +export async function handleMuteSubmit() { + try { + console.debug('[handleMuteSubmit] Starting mute operation'); + + // Get selected keywords efficiently + const selectedKeywords = Array.from(state.activeKeywords); + console.debug('[handleMuteSubmit] Selected keywords:', selectedKeywords.length); + + // Use cached keyword map + const ourKeywordsMap = muteCache.getOurKeywordsMap(); + const ourKeywords = new Set(Array.from(ourKeywordsMap.keys())); + console.debug('[handleMuteSubmit] Our keywords total:', ourKeywords.size); + + // Get the counts before update + const { toMute, toUnmute } = getMuteUnmuteCounts(); + console.debug('[handleMuteSubmit] To mute:', toMute, 'To unmute:', toUnmute); + + // Update muted keywords + console.debug('[handleMuteSubmit] Updating keywords on Bluesky'); + await blueskyService.mute.updateMutedKeywords(selectedKeywords, Array.from(ourKeywords)); + console.debug('[handleMuteSubmit] Bluesky update complete'); + + // If this mute/unmute follows an enable/disable all action, clear exceptions + if (state.lastBulkAction) { + console.debug('[handleMuteSubmit] Clearing exceptions after bulk action'); + state.selectedExceptions.clear(); + state.lastBulkAction = null; // Reset the flag + } + + // Clear all caches and update counts + console.debug('[handleMuteSubmit] Clearing caches'); + muteCache.clear(); + console.debug('[handleMuteSubmit] Updating mute count in BlueskyService'); + await blueskyService.updateMuteCount(); + + // Get fresh muted keywords from Bluesky + console.debug('[handleMuteSubmit] Reinitializing keyword state'); + await initializeKeywordState(); + + // Save state after successful mute/unmute + console.debug('[handleMuteSubmit] Saving state'); + await saveState(); + + // Update UI with debouncing + console.debug('[handleMuteSubmit] Scheduling UI update'); + debouncedUpdate(async () => { + console.debug('[handleMuteSubmit] Rendering interface'); + renderInterface(); + + // Show appropriate notification + if (toMute > 0 && toUnmute > 0) { + showNotification(`Successfully muted ${toMute} and unmuted ${toUnmute} keywords`); + } else if (toMute > 0) { + showNotification(`Successfully muted ${toMute} ${toMute === 1 ? 'keyword' : 'keywords'}`); + } else if (toUnmute > 0) { + showNotification(`Successfully unmuted ${toUnmute} ${toUnmute === 1 ? 'keyword' : 'keywords'}`); + } + console.debug('[handleMuteSubmit] UI update complete'); + }); + } catch (error) { + console.error('[handleMuteSubmit] Failed to process mutes:', error); + + // Convert technical errors into user-friendly messages + let userMessage = 'Failed to update mutes. '; + if (error.message.includes('not logged in')) { + userMessage += 'Please log in and try again.'; + } else if (error.message.includes('401')) { + userMessage += 'Your session has expired. Please log in again.'; + } else if (error.message.includes('429')) { + userMessage += 'Too many requests. Please wait a moment and try again.'; + } else if (error.message.includes('503')) { + userMessage += 'Bluesky service is temporarily unavailable. Please try again later.'; + } else { + userMessage += error.message; + } + + showNotification(userMessage, 'error'); + } +} + +export async function initializeKeywordState() { + try { + console.debug('[initializeKeywordState] Starting initialization'); + + // Get user's muted keywords from Bluesky with force refresh + const userKeywords = await blueskyService.mute.getMutedKeywords(true); + console.debug('[initializeKeywordState] Fetched', userKeywords.length, 'keywords from Bluesky'); + + // Only clear mute tracking state, leave contexts alone + console.debug('[initializeKeywordState] Clearing state'); + const beforeOriginal = state.originalMutedKeywords.size; + const beforeSession = state.sessionMutedKeywords.size; + state.originalMutedKeywords.clear(); + state.sessionMutedKeywords.clear(); + console.debug('[initializeKeywordState] Cleared originalMutedKeywords (was:', beforeOriginal, ') and sessionMutedKeywords (was:', beforeSession, ')'); + + // Track which keywords are muted in Bluesky + console.debug('[initializeKeywordState] Processing user keywords'); + processKeywords(userKeywords, keyword => { + const lowerKeyword = keyword.toLowerCase(); + state.originalMutedKeywords.add(lowerKeyword); + }); + console.debug('[initializeKeywordState] Final originalMutedKeywords size:', state.originalMutedKeywords.size); + + } catch (error) { + console.error('[initializeKeywordState] Failed to initialize keyword state:', error); + showNotification('Failed to load your muted keywords. Please refresh the page.', 'error'); + } +} diff --git a/js/handlers/mute/muteUIUtils.js b/js/handlers/mute/muteUIUtils.js new file mode 100644 index 0000000..02091a3 --- /dev/null +++ b/js/handlers/mute/muteUIUtils.js @@ -0,0 +1,39 @@ +import { getMuteUnmuteCounts } from '../../state.js'; +import { renderInterface } from '../../renderer.js'; + +// Debounced UI updates with frame timing +const debouncedUpdate = (() => { + let timeout; + let frameRequest; + return (fn) => { + if (timeout) clearTimeout(timeout); + if (frameRequest) cancelAnimationFrame(frameRequest); + + timeout = setTimeout(() => { + frameRequest = requestAnimationFrame(() => { + console.debug('[debouncedUpdate] Executing update'); + fn(); + }); + }, 16); + }; +})(); + +// Helper to update button text +function getButtonText() { + const { toMute, toUnmute } = getMuteUnmuteCounts(); + console.debug('[getButtonText] To mute:', toMute, 'To unmute:', toUnmute); + const parts = []; + + if (toMute > 0) { + parts.push(`Mute ${toMute} new`); + } + if (toUnmute > 0) { + parts.push(`Unmute ${toUnmute} existing`); + } + + const text = parts.length > 0 ? parts.join(', ') : 'No changes'; + console.debug('[getButtonText] Button text:', text); + return text; +} + +export { debouncedUpdate, getButtonText }; diff --git a/js/handlers/muteHandlers.js b/js/handlers/muteHandlers.js index d68d462..56c4390 100644 --- a/js/handlers/muteHandlers.js +++ b/js/handlers/muteHandlers.js @@ -1,197 +1,2 @@ -import { state, canUnmuteKeyword, getMuteUnmuteCounts, saveState } from '../state.js'; -import { blueskyService } from '../bluesky.js'; -import { renderInterface } from '../renderer.js'; -import { showNotification } from '../utils/notifications.js'; - -// Enhanced keyword cache for mute operations -const muteCache = { - ourKeywordsMap: null, - lastUpdate: 0, - updateThreshold: 50, - - shouldUpdate() { - const now = Date.now(); - if (now - this.lastUpdate < this.updateThreshold) return false; - this.lastUpdate = now; - return true; - }, - - getOurKeywordsMap() { - if (this.ourKeywordsMap && !this.shouldUpdate()) { - console.debug('[muteCache] Returning cached keyword map'); - return this.ourKeywordsMap; - } - - console.debug('[muteCache] Building new keyword map'); - const map = new Map(); - Object.entries(state.keywordGroups).forEach(([category, categoryData]) => { - const categoryInfo = categoryData[category]; - if (categoryInfo?.keywords) { - Object.keys(categoryInfo.keywords).forEach(keyword => { - map.set(keyword.toLowerCase(), keyword); - }); - } - }); - this.ourKeywordsMap = map; - console.debug('[muteCache] New keyword map size:', map.size); - return map; - }, - - clear() { - console.debug('[muteCache] Clearing cache'); - this.ourKeywordsMap = null; - this.lastUpdate = 0; - } -}; - -// Debounced UI updates with frame timing -const debouncedUpdate = (() => { - let timeout; - let frameRequest; - return (fn) => { - if (timeout) clearTimeout(timeout); - if (frameRequest) cancelAnimationFrame(frameRequest); - - timeout = setTimeout(() => { - frameRequest = requestAnimationFrame(() => { - console.debug('[debouncedUpdate] Executing update'); - fn(); - }); - }, 16); - }; -})(); - -// Process all keywords immediately without batching -function processKeywords(keywords, operation) { - console.debug('[processKeywords] Processing', keywords.length, 'keywords'); - keywords.forEach(operation); - console.debug('[processKeywords] Finished processing all keywords'); -} - -export async function handleMuteSubmit() { - try { - console.debug('[handleMuteSubmit] Starting mute operation'); - - // Get selected keywords efficiently - const selectedKeywords = Array.from(state.activeKeywords); - console.debug('[handleMuteSubmit] Selected keywords:', selectedKeywords.length); - - // Use cached keyword map - const ourKeywordsMap = muteCache.getOurKeywordsMap(); - const ourKeywords = new Set(Array.from(ourKeywordsMap.keys())); - console.debug('[handleMuteSubmit] Our keywords total:', ourKeywords.size); - - // Get the counts before update - const { toMute, toUnmute } = getMuteUnmuteCounts(); - console.debug('[handleMuteSubmit] To mute:', toMute, 'To unmute:', toUnmute); - - // Update muted keywords - console.debug('[handleMuteSubmit] Updating keywords on Bluesky'); - await blueskyService.mute.updateMutedKeywords(selectedKeywords, Array.from(ourKeywords)); - console.debug('[handleMuteSubmit] Bluesky update complete'); - - // If this mute/unmute follows an enable/disable all action, clear exceptions - if (state.lastBulkAction) { - console.debug('[handleMuteSubmit] Clearing exceptions after bulk action'); - state.selectedExceptions.clear(); - state.lastBulkAction = null; // Reset the flag - } - - // Clear all caches and update counts - console.debug('[handleMuteSubmit] Clearing caches'); - muteCache.clear(); - console.debug('[handleMuteSubmit] Updating mute count in BlueskyService'); - await blueskyService.updateMuteCount(); - - // Get fresh muted keywords from Bluesky - console.debug('[handleMuteSubmit] Reinitializing keyword state'); - await initializeKeywordState(); - - // Save state after successful mute/unmute - console.debug('[handleMuteSubmit] Saving state'); - await saveState(); - - // Update UI with debouncing - console.debug('[handleMuteSubmit] Scheduling UI update'); - debouncedUpdate(async () => { - console.debug('[handleMuteSubmit] Rendering interface'); - renderInterface(); - - // Show appropriate notification - if (toMute > 0 && toUnmute > 0) { - showNotification(`Successfully muted ${toMute} and unmuted ${toUnmute} keywords`); - } else if (toMute > 0) { - showNotification(`Successfully muted ${toMute} ${toMute === 1 ? 'keyword' : 'keywords'}`); - } else if (toUnmute > 0) { - showNotification(`Successfully unmuted ${toUnmute} ${toUnmute === 1 ? 'keyword' : 'keywords'}`); - } - console.debug('[handleMuteSubmit] UI update complete'); - }); - } catch (error) { - console.error('[handleMuteSubmit] Failed to process mutes:', error); - - // Convert technical errors into user-friendly messages - let userMessage = 'Failed to update mutes. '; - if (error.message.includes('not logged in')) { - userMessage += 'Please log in and try again.'; - } else if (error.message.includes('401')) { - userMessage += 'Your session has expired. Please log in again.'; - } else if (error.message.includes('429')) { - userMessage += 'Too many requests. Please wait a moment and try again.'; - } else if (error.message.includes('503')) { - userMessage += 'Bluesky service is temporarily unavailable. Please try again later.'; - } else { - userMessage += error.message; - } - - showNotification(userMessage, 'error'); - } -} - -export async function initializeKeywordState() { - try { - console.debug('[initializeKeywordState] Starting initialization'); - - // Get user's muted keywords from Bluesky with force refresh - const userKeywords = await blueskyService.mute.getMutedKeywords(true); - console.debug('[initializeKeywordState] Fetched', userKeywords.length, 'keywords from Bluesky'); - - // Only clear mute tracking state, leave contexts alone - console.debug('[initializeKeywordState] Clearing state'); - const beforeOriginal = state.originalMutedKeywords.size; - const beforeSession = state.sessionMutedKeywords.size; - state.originalMutedKeywords.clear(); - state.sessionMutedKeywords.clear(); - console.debug('[initializeKeywordState] Cleared originalMutedKeywords (was:', beforeOriginal, ') and sessionMutedKeywords (was:', beforeSession, ')'); - - // Track which keywords are muted in Bluesky - console.debug('[initializeKeywordState] Processing user keywords'); - processKeywords(userKeywords, keyword => { - const lowerKeyword = keyword.toLowerCase(); - state.originalMutedKeywords.add(lowerKeyword); - }); - console.debug('[initializeKeywordState] Final originalMutedKeywords size:', state.originalMutedKeywords.size); - - } catch (error) { - console.error('[initializeKeywordState] Failed to initialize keyword state:', error); - showNotification('Failed to load your muted keywords. Please refresh the page.', 'error'); - } -} - -// Helper to update button text -export function getButtonText() { - const { toMute, toUnmute } = getMuteUnmuteCounts(); - console.debug('[getButtonText] To mute:', toMute, 'To unmute:', toUnmute); - const parts = []; - - if (toMute > 0) { - parts.push(`Mute ${toMute} new`); - } - if (toUnmute > 0) { - parts.push(`Unmute ${toUnmute} existing`); - } - - const text = parts.length > 0 ? parts.join(', ') : 'No changes'; - console.debug('[getButtonText] Button text:', text); - return text; -} +// Re-export everything from the new mute module +export { handleMuteSubmit, initializeKeywordState, getButtonText, muteCache } from './mute/index.js'; diff --git a/js/handlers/themeHandlers.js b/js/handlers/themeHandlers.js index 2d76dd3..f6522cc 100644 --- a/js/handlers/themeHandlers.js +++ b/js/handlers/themeHandlers.js @@ -2,21 +2,63 @@ import { loadAppearanceSettings, saveAppearanceSettings } from '../settings/appe export function handleFooterThemeToggle() { const settings = loadAppearanceSettings(); - const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches; - const isDark = settings.colorMode === 'dark' || (settings.colorMode === 'system' && prefersDark); const html = document.documentElement; const currentTheme = html.getAttribute('data-theme'); - // Toggle between light and dark - const newColorMode = currentTheme === 'dim' ? 'light' : 'dark'; - settings.colorMode = newColorMode; + // Toggle between light and dark themes + const newTheme = currentTheme === 'light' ? 'dark' : 'light'; + settings.colorMode = newTheme; // Save and apply the new settings saveAppearanceSettings(settings); - // Update footer toggle state - const toggle = document.getElementById('footer-theme-toggle'); - if (toggle) { - toggle.classList.toggle('dark', newColorMode === 'dark'); - } + // Apply theme immediately + html.setAttribute('data-theme', newTheme); + + // Update all theme toggles + const toggles = document.querySelectorAll('.theme-toggle'); + toggles.forEach(toggle => { + toggle.classList.toggle('dark', newTheme === 'dark'); + }); + + // Dispatch theme change event + document.dispatchEvent(new CustomEvent('themeChanged', { + detail: { theme: newTheme } + })); } + +// Initialize theme on page load +document.addEventListener('DOMContentLoaded', () => { + const settings = loadAppearanceSettings(); + const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches; + const theme = settings.colorMode === 'dark' || (settings.colorMode === 'system' && prefersDark) ? 'dark' : 'light'; + + document.documentElement.setAttribute('data-theme', theme); + + // Update toggle states + const toggles = document.querySelectorAll('.theme-toggle'); + toggles.forEach(toggle => { + toggle.classList.toggle('dark', theme === 'dark'); + }); +}); + +// Add system theme change listener +const systemThemeQuery = window.matchMedia('(prefers-color-scheme: dark)'); +systemThemeQuery.addEventListener('change', (e) => { + const settings = loadAppearanceSettings(); + if (settings.colorMode === 'system') { + const theme = e.matches ? 'dark' : 'light'; + document.documentElement.setAttribute('data-theme', theme); + + // Update toggle states + const toggles = document.querySelectorAll('.theme-toggle'); + toggles.forEach(toggle => { + toggle.classList.toggle('dark', theme === 'dark'); + }); + + // Dispatch theme change event + document.dispatchEvent(new CustomEvent('themeChanged', { + detail: { theme } + })); + } +}); diff --git a/js/initialization.js b/js/initialization.js new file mode 100644 index 0000000..ed853e3 --- /dev/null +++ b/js/initialization.js @@ -0,0 +1,93 @@ +import { elements } from './dom.js'; +import { state, loadState } from './state.js'; +import { fetchKeywordGroups, fetchContextGroups, fetchDisplayConfig } from './api.js'; +import { renderInterface } from './renderer.js'; +import { blueskyService } from './bluesky.js'; +import { + showApp, + updateSimpleModeState, + initializeKeywordState, + switchMode, + applyAppearanceSettings +} from './handlers/index.js'; + +// Initialize Application +export async function init() { + try { + // Show loading state + const loadingOverlay = document.getElementById('loading-state'); + + // Apply appearance settings first + applyAppearanceSettings(); + + // Check if we're on the callback page + const isCallbackPage = window.location.pathname.includes('callback.html'); + if (isCallbackPage) { + // Only do auth setup on callback page + await blueskyService.setup(); + return; + } + + // Initialize Bluesky service and handle auth first + const result = await blueskyService.setup(); + if (result?.session) { + // Set DID in state before loading saved state + state.did = result.session.did; + state.authenticated = true; + + // Now load saved state + loadState(); + + // Load all required data + await Promise.all([ + fetchDisplayConfig(), + fetchKeywordGroups(), + fetchContextGroups() + ]); + + await showApp(); + // Initialize keyword state after authentication + await initializeKeywordState(); + } + + // Now that all data is loaded, initialize the UI + if (state.authenticated) { + // First update simple mode state if needed + if (state.mode === 'simple') { + updateSimpleModeState(); + } + // Then switch to the correct mode + switchMode(state.mode); + // Finally render the interface + renderInterface(); + + // Update SimpleMode component with loaded state + const simpleMode = document.querySelector('simple-mode'); + if (simpleMode) { + simpleMode.updateLevel(state.filterLevel); + simpleMode.updateExceptions(state.selectedExceptions); + } + } else if (elements.landingPage && elements.appInterface) { + elements.landingPage.classList.remove('hidden'); + elements.appInterface.classList.add('hidden'); + } + + // Hide loading state + if (loadingOverlay) { + loadingOverlay.classList.add('hidden'); + // Remove from DOM after transition + setTimeout(() => loadingOverlay.remove(), 300); + } + + // Add js-loaded class to body to show content + document.body.classList.add('js-loaded'); + } catch (error) { + console.error('Initialization failed:', error); + // Hide loading state even on error + const loadingOverlay = document.getElementById('loading-state'); + if (loadingOverlay) { + loadingOverlay.classList.add('hidden'); + setTimeout(() => loadingOverlay.remove(), 300); + } + } +} diff --git a/js/keywordState.js b/js/keywordState.js index 5593186..a490566 100644 --- a/js/keywordState.js +++ b/js/keywordState.js @@ -84,13 +84,3 @@ export function getMuteUnmuteCounts() { return { toMute, toUnmute }; } - -// Helper to set target keyword count and trigger refresh -export function setTargetKeywordCount(count) { - const validCounts = new Set([100, 300, 500, 2000]); - if (!validCounts.has(count)) { - throw new Error('Invalid target keyword count. Must be one of: 100, 300, 500, 2000'); - } - state.targetKeywordCount = count; - keywordCache.clear(); // Clear cache when count changes -} diff --git a/js/main.js b/js/main.js index c4a0e7a..4b241b0 100644 --- a/js/main.js +++ b/js/main.js @@ -1,276 +1,15 @@ -import { elements } from './dom.js'; -import { state, loadState, setTargetKeywordCount } from './state.js'; -import { fetchKeywordGroups, fetchContextGroups, fetchDisplayConfig } from './api.js'; -import { renderInterface } from './renderer.js'; -import { debounce } from './utils.js'; -import { blueskyService } from './bluesky.js'; -import { getAllKeywordsForCategory } from './categoryManager.js'; +import { init } from './initialization.js'; +import { setupEventListeners } from './events.js'; import { - handleAuth, - handleLogout, - handleMuteSubmit, - switchMode, - handleEnableAll, - handleDisableAll, handleContextToggle, handleExceptionToggle, handleCategoryToggle, handleKeywordToggle, - handleRefreshData, - showApp, - updateSimpleModeState, - initializeKeywordState, handleSettingsModalToggle, handleFooterThemeToggle, - applyAppearanceSettings + switchMode } from './handlers/index.js'; -// Initialize Application -async function init() { - try { - // Show loading state - const loadingOverlay = document.getElementById('loading-state'); - - // Apply appearance settings first - applyAppearanceSettings(); - - // Check if we're on the callback page - const isCallbackPage = window.location.pathname.includes('callback.html'); - if (isCallbackPage) { - // Only do auth setup on callback page - await blueskyService.setup(); - return; - } - - // Initialize Bluesky service and handle auth first - const result = await blueskyService.setup(); - if (result?.session) { - // Set DID in state before loading saved state - state.did = result.session.did; - state.authenticated = true; - - // Now load saved state - loadState(); - - // Load all required data - await Promise.all([ - fetchDisplayConfig(), - fetchKeywordGroups(), - fetchContextGroups() - ]); - - await showApp(); - // Initialize keyword state after authentication - await initializeKeywordState(); - } - - // Now that all data is loaded, initialize the UI - if (state.authenticated) { - // First update simple mode state if needed - if (state.mode === 'simple') { - updateSimpleModeState(); - } - // Then switch to the correct mode - switchMode(state.mode); - // Finally render the interface - renderInterface(); - - // Update SimpleMode component with loaded state - const simpleMode = document.querySelector('simple-mode'); - if (simpleMode) { - simpleMode.updateLevel(state.filterLevel); - simpleMode.updateExceptions(state.selectedExceptions); - } - } else if (elements.landingPage && elements.appInterface) { - elements.landingPage.classList.remove('hidden'); - elements.appInterface.classList.add('hidden'); - } - - setupEventListeners(); - - // Listen for Bluesky login state changes - window.addEventListener('blueskyLoginStateChanged', async (event) => { - state.authenticated = event.detail.isLoggedIn; - if (state.authenticated) { - // Set DID in state when user logs in - state.did = blueskyService.auth.session?.did; - await showApp(); - // Initialize keyword state after authentication - await initializeKeywordState(); - // Re-render interface to show checked keywords - renderInterface(); - - // Update SimpleMode component with current state - const simpleMode = document.querySelector('simple-mode'); - if (simpleMode) { - simpleMode.updateLevel(state.filterLevel); - simpleMode.updateExceptions(state.selectedExceptions); - } - } else { - // Clear DID when user logs out - state.did = null; - if (elements.landingPage && elements.appInterface) { - elements.landingPage.classList.remove('hidden'); - elements.appInterface.classList.add('hidden'); - } - } - }); - - // Hide loading state - if (loadingOverlay) { - loadingOverlay.classList.add('hidden'); - // Remove from DOM after transition - setTimeout(() => loadingOverlay.remove(), 300); - } - - // Add js-loaded class to body to show content - document.body.classList.add('js-loaded'); - } catch (error) { - console.error('Initialization failed:', error); - // Hide loading state even on error - const loadingOverlay = document.getElementById('loading-state'); - if (loadingOverlay) { - loadingOverlay.classList.add('hidden'); - setTimeout(() => loadingOverlay.remove(), 300); - } - } -} - -// Event Listeners -function setupEventListeners() { - elements.authButton?.addEventListener('click', handleAuth); - elements.logoutButton?.addEventListener('click', handleLogout); - elements.muteButton?.addEventListener('click', handleMuteSubmit); - elements.navMuteButton?.addEventListener('click', handleMuteSubmit); - elements.enableAllBtn?.addEventListener('click', handleEnableAll); - elements.disableAllBtn?.addEventListener('click', handleDisableAll); - elements.refreshButton?.addEventListener('click', handleRefreshData); - - // Add Enter key handler for login input - const handleInput = document.getElementById('bsky-handle-input'); - if (handleInput) { - handleInput.addEventListener('keypress', (event) => { - if (event.key === 'Enter') { - event.preventDefault(); - handleAuth(); - } - }); - } - - // Set up intersection observer for auth button visibility - if (elements.authButton) { - const observer = new IntersectionObserver( - (entries) => { - entries.forEach(entry => { - // Check if the button is being intersected (covered) by other elements - const isVisible = entry.intersectionRatio === 1.0; - elements.authButton.style.visibility = isVisible ? 'visible' : 'hidden'; - }); - }, - { - threshold: 1.0, // Only trigger when button is fully visible/invisible - root: null // Use viewport as root - } - ); - - observer.observe(elements.authButton); - } - - // Helper function to notify keyword changes - function notifyKeywordChanges() { - document.dispatchEvent(new CustomEvent('keywordsUpdated', { - detail: { count: state.activeKeywords.size } - })); - } - - // Handle filter level changes from simple mode - document.addEventListener('filterLevelChange', (event) => { - const level = event.detail.level; - - // Map intensity levels to keyword counts based on performance thresholds - const levelToCount = { - 0: 100, // Minimal: ~100 highest weighted keywords - 1: 300, // Moderate: ~300 keywords - 2: 500, // Extensive: ~500 keywords - 3: 2000 // Complete: All keywords - }; - - // Update filter level in state to match event - state.filterLevel = level; - - // Store current exceptions - const currentExceptions = new Set(state.selectedExceptions); - - // Update target keyword count based on intensity level - setTargetKeywordCount(levelToCount[level]); - - // Clear and rebuild active keywords while preserving exceptions - state.activeKeywords.clear(); - state.selectedContexts.forEach(contextId => { - const context = state.contextGroups[contextId]; - if (context && context.categories) { - context.categories.forEach(category => { - if (!currentExceptions.has(category)) { - // Get keywords sorted by weight and limited by new target count - const keywords = getAllKeywordsForCategory(category, true); - keywords.forEach(keyword => state.activeKeywords.add(keyword)); - } - }); - } - }); - - // Notify about keyword changes - notifyKeywordChanges(); - - // Restore exceptions - state.selectedExceptions = currentExceptions; - - // Update interface with new filtered keywords - renderInterface(); - }); - - elements.profileButton?.addEventListener('click', () => { - state.menuOpen = !state.menuOpen; - elements.userMenuDropdown?.classList.toggle('visible', state.menuOpen); - }); - - document.addEventListener('click', (event) => { - if (!event.target.closest('.user-menu') && state.menuOpen && elements.userMenuDropdown) { - state.menuOpen = false; - elements.userMenuDropdown.classList.remove('visible'); - } - }); - - elements.sidebarSearch?.addEventListener('input', debounce((e) => { - state.searchTerm = e.target.value.toLowerCase(); - renderInterface(); - }, 300)); - - // Listen for system theme changes - window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => { - applyAppearanceSettings(); - }); - - // Handle visibility change to restore state when page becomes visible - document.addEventListener('visibilitychange', () => { - if (document.visibilityState === 'visible' && state.did) { - loadState(); - - // Re-render interface with restored state - renderInterface(); - // Re-apply mode - switchMode(state.mode); - - // Update SimpleMode component with current state - const simpleMode = document.querySelector('simple-mode'); - if (simpleMode) { - simpleMode.updateLevel(state.filterLevel); - simpleMode.updateExceptions(state.selectedExceptions); - } - } - }); -} - // Make handlers available globally window.handleContextToggle = handleContextToggle; window.handleExceptionToggle = handleExceptionToggle; @@ -283,6 +22,7 @@ window.settingsHandlers = { window.switchMode = switchMode; // Initialize app -document.addEventListener('DOMContentLoaded', () => { - init(); +document.addEventListener('DOMContentLoaded', async () => { + await init(); + setupEventListeners(); }); diff --git a/js/settings/appearanceSettings.js b/js/settings/appearanceSettings.js index d7bae35..c045e4e 100644 --- a/js/settings/appearanceSettings.js +++ b/js/settings/appearanceSettings.js @@ -1,6 +1,5 @@ const DEFAULT_APPEARANCE = { colorMode: 'system', - darkTheme: 'dim', font: 'system', fontSize: 'default' }; @@ -45,29 +44,22 @@ export function applyAppearanceSettings(settings = null) { const html = document.documentElement; const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches; - // Store current UI state - const advancedMode = document.getElementById('advanced-mode'); - const wasAdvancedHidden = advancedMode ? advancedMode.classList.contains('hidden') : true; - // Apply theme - let theme = 'light'; - if (settings.colorMode === 'dark' || (settings.colorMode === 'system' && prefersDark)) { - theme = 'dim'; - } + const theme = settings.colorMode === 'dark' || (settings.colorMode === 'system' && prefersDark) ? 'dark' : 'light'; // Apply theme immediately html.setAttribute('data-theme', theme); - // Update UI state - if (advancedMode) { - advancedMode.classList.toggle('hidden', wasAdvancedHidden); - } - // Update footer toggle state const footerToggle = document.getElementById('footer-theme-toggle'); if (footerToggle) { - const isDark = theme === 'dim'; - footerToggle.classList.toggle('dark', isDark); + footerToggle.classList.toggle('dark', theme === 'dark'); + } + + // Update landing page toggle state + const landingToggle = document.getElementById('landing-theme-toggle'); + if (landingToggle) { + landingToggle.classList.toggle('dark', theme === 'dark'); } // Apply font settings @@ -78,6 +70,11 @@ export function applyAppearanceSettings(settings = null) { // Apply font scale using CSS variable html.style.setProperty('--font-scale', FONT_SCALES[settings.fontSize]); + // Dispatch theme change event + document.dispatchEvent(new CustomEvent('themeChanged', { + detail: { theme } + })); + updateAppearanceUI(settings); } diff --git a/js/state.js b/js/state.js index bee5eb5..dcc3664 100644 --- a/js/state.js +++ b/js/state.js @@ -1,6 +1,6 @@ import { loadState, saveState, resetState, forceRefresh, getStorageKey } from './statePersistence.js'; import { setUser } from './userState.js'; -import { canUnmuteKeyword, getMuteUnmuteCounts, setTargetKeywordCount } from './keywordState.js'; +import { canUnmuteKeyword, getMuteUnmuteCounts } from './keywordState.js'; // Core state object export const state = { @@ -21,8 +21,7 @@ export const state = { filterMode: 'all', menuOpen: false, lastModified: null, // Last-Modified header from keywords file - targetKeywordCount: 100, // Default to minimal keywords since default mode is simple - filterLevel: 0, // Track current filter level + filterLevel: 0, // Track current filter level (0=Minimal to 3=Complete) lastBulkAction: null // Track when enable/disable all is used }; @@ -35,6 +34,5 @@ export { setUser, canUnmuteKeyword, getMuteUnmuteCounts, - setTargetKeywordCount, getStorageKey }; diff --git a/js/statePersistence.js b/js/statePersistence.js index 8b2ce0a..aaad525 100644 --- a/js/statePersistence.js +++ b/js/statePersistence.js @@ -25,7 +25,6 @@ const debouncedSave = (() => { manuallyUnchecked: Array.from(state.manuallyUnchecked), mode: state.mode, lastModified: state.lastModified, - targetKeywordCount: state.targetKeywordCount, filterLevel: state.filterLevel, lastBulkAction: state.lastBulkAction }; @@ -78,15 +77,11 @@ export function loadState() { // Load other state properties state.mode = data.mode || 'simple'; state.lastModified = data.lastModified || null; - state.targetKeywordCount = data.targetKeywordCount || (state.mode === 'simple' ? 100 : 2000); state.filterLevel = typeof data.filterLevel === 'number' ? data.filterLevel : 0; state.lastBulkAction = data.lastBulkAction || null; // Force cache refresh keywordCache.clear(); - } else { - // If no saved state, ensure targetKeywordCount matches mode - state.targetKeywordCount = state.mode === 'simple' ? 100 : 2000; } } catch (error) { console.error('Error loading saved state:', error); @@ -118,7 +113,6 @@ export function resetState() { state.filterMode = 'all'; state.menuOpen = false; state.lastModified = null; - state.targetKeywordCount = 100; state.filterLevel = 0; state.lastBulkAction = null; keywordCache.clear(); diff --git a/js/themeInit.js b/js/themeInit.js index aa23e67..4f19f90 100644 --- a/js/themeInit.js +++ b/js/themeInit.js @@ -11,12 +11,12 @@ const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches; if (settings.colorMode === 'system') { - theme = prefersDark ? 'dim' : 'light'; + theme = prefersDark ? 'dark' : 'light'; } else if (settings.colorMode === 'dark') { - theme = 'dim'; + theme = 'dark'; } } else if (window.matchMedia('(prefers-color-scheme: dark)').matches) { - theme = 'dim'; + theme = 'dark'; } // Apply theme immediately @@ -29,7 +29,7 @@ // Set initial footer toggle state const footerToggle = document.getElementById('footer-theme-toggle'); if (footerToggle) { - footerToggle.classList.toggle('dark', theme === 'dim'); + footerToggle.classList.toggle('dark', theme === 'dark'); } }); @@ -39,7 +39,7 @@ if (currentSettings) { const settings = JSON.parse(currentSettings); if (settings.colorMode === 'system') { - const newTheme = e.matches ? 'dim' : 'light'; + const newTheme = e.matches ? 'dark' : 'light'; html.setAttribute('data-theme', newTheme); // Update footer toggle @@ -59,9 +59,9 @@ let newTheme = 'light'; if (settings.colorMode === 'system') { - newTheme = prefersDark ? 'dim' : 'light'; + newTheme = prefersDark ? 'dark' : 'light'; } else if (settings.colorMode === 'dark') { - newTheme = 'dim'; + newTheme = 'dark'; } html.setAttribute('data-theme', newTheme); @@ -69,7 +69,7 @@ // Update footer toggle const footerToggle = document.getElementById('footer-theme-toggle'); if (footerToggle) { - footerToggle.classList.toggle('dark', newTheme === 'dim'); + footerToggle.classList.toggle('dark', newTheme === 'dark'); } } }); diff --git a/js/utils/categoryUtils.js b/js/utils/categoryUtils.js index 32cf354..87d7e52 100644 --- a/js/utils/categoryUtils.js +++ b/js/utils/categoryUtils.js @@ -30,7 +30,6 @@ export function extractKeywordsFromCategory(category, categoryData) { return Object.entries(categoryInfo.keywords).map(([keyword, data]) => ({ keyword, weight: data.weight || 0, - categoryWeight: categoryInfo.weight || 0, category })); } @@ -60,7 +59,7 @@ export function getAllKeywordsForCategory(category, sortByWeight = false) { if (sortByWeight) { keywords.sort((a, b) => b.weight - a.weight); - if (state.targetKeywordCount) { + if (state.filterLevel !== undefined) { const before = keywords.length; keywords = filterByWeight(keywords, category); logFilterResults(category, keywords, before); @@ -73,19 +72,19 @@ export function getAllKeywordsForCategory(category, sortByWeight = false) { function filterByWeight(keywords, category) { return keywords.filter(k => { - const threshold = getWeightThreshold(k.categoryWeight, state.targetKeywordCount); + const threshold = getWeightThreshold(state.filterLevel); const passes = k.weight >= threshold; if (passes) { - console.debug(`Including ${k.keyword} (weight: ${k.weight}) from ${k.category} (weight: ${k.categoryWeight})`); + console.debug(`Including ${k.keyword} (weight: ${k.weight}) from ${k.category}`); } return passes; }); } function logFilterResults(category, keywords, beforeCount) { - console.debug(`Category ${category} (weight ${keywords[0]?.categoryWeight || 'unknown'}): - - Target count: ${state.targetKeywordCount} - - Threshold: ${getWeightThreshold(keywords[0]?.categoryWeight, state.targetKeywordCount)} + console.debug(`Category ${category}: + - Filter level: ${state.filterLevel} + - Threshold: ${getWeightThreshold(state.filterLevel)} - Filtered from ${beforeCount} to ${keywords.length} keywords - Remaining keywords: ${keywords.map(k => `${k.keyword} (${k.weight})`).join(', ')}`); } diff --git a/js/utils/weightManager.js b/js/utils/weightManager.js index a8943c4..850fb11 100644 --- a/js/utils/weightManager.js +++ b/js/utils/weightManager.js @@ -1,22 +1,21 @@ -function getWeightThreshold(categoryWeight, targetCount) { - switch(targetCount) { - case 100: - return categoryWeight === 10 ? 8 : - categoryWeight === 9 ? 8 : - categoryWeight === 8 ? 8 : - categoryWeight === 7 ? 10 : 11; - case 300: - return categoryWeight === 10 ? 7 : - categoryWeight === 9 ? 7 : - categoryWeight === 8 ? 8 : - categoryWeight === 7 ? 9 : 11; - case 500: - return categoryWeight === 10 ? 4 : - categoryWeight === 9 ? 5 : - categoryWeight === 8 ? 6 : - categoryWeight === 7 ? 7 : 11; - default: +import { state } from '../state.js'; + +function getWeightThreshold(filterLevel) { + // Get filter level from state if not provided + const level = filterLevel ?? state?.filterLevel ?? 0; + + // Map levels to thresholds based on keyword weight of 3 + switch(level) { + case 0: // Minimal (most restrictive) + return 3; + case 1: // Moderate + return 2; + case 2: // Extensive + return 1; + case 3: // Complete (most inclusive) return 0; + default: + return 3; // Default to most restrictive } }