Compare commits

...

31 Commits

Author SHA1 Message Date
pianissi
5c79a93c36
Merge 4be36de9f8 into 6b5125d73f 2025-06-14 02:21:35 +02:00
Jonny Buchanan
6b5125d73f Release v4.12.2
- Fixed an error restoring the Tweet source label on older Tweets which don't show a Views count
2025-06-03 10:34:11 +10:00
Jonny Buchanan
212d2dbd2a Fixed an error restoring the Tweet source label on older Tweets which don't show a Views count 2025-06-03 10:27:02 +10:00
Jonny Buchanan
09b5e7b72d Release v4.12.1
- Fixed restored Tweet source and link headlines not displaying in some browsers
2025-06-01 14:50:02 +10:00
Jonny Buchanan
17d078e639 Fixed restored Tweet sources and link headlines not displaying in some browsers 2025-06-01 14:48:39 +10:00
Jonny Buchanan
dab3344b15 Release v4.12.0
- Added an "Enabled" option to allow extension functionality to be turned off from its own options - when disabled, the icon in the toolbar will have a ⏻ badge (Safari) or be greyed out (all other browsers)
- Added an option to restore the Tweet source label in focused Tweets (enabled by default)
- Added hiding the "Upgrade to Premium+ to write longer posts" Premium upsell
- Changed the options for hiding Premium replies to all be "Show" options so they're easier to understand - if a Premium reply matches any of your "Show" options, it will be shown
- Split the option for showing Premium replies from verified orgs into separate options for Business and Government accounts
- Fixed the same Tweets being repeatedly re-checked in focused Tweet timelines when new Tweets are added - should improve performance in long Tweet threads
- Fixed flash of initial X loading logo
- Fixed verified Government accounts getting the Twitter Blue check
- Fixed the options in the Number of followers dropdown not being localised
- Fixed the desktop nav font size option applying to the notifications count
2025-05-31 19:35:38 +10:00
Jonny Buchanan
564ee7d020 Update the title of the toolbar icon when it's disabled/enabled 2025-05-31 19:35:38 +10:00
Jonny Buchanan
acd7977c3f Fix a stray ":" in the macOS Safari options popup 2025-05-31 19:35:38 +10:00
Jonny Buchanan
75423f6818 Add translation for "Enabled" 2025-05-31 19:18:46 +10:00
Jonny Buchanan
84ceb7d7b1 Fixed the desktop nav font size option applying to the notifications count 2025-05-31 19:09:20 +10:00
Jonny Buchanan
1b9b8d6296 Fixed flash of X loading logo in Safari 2025-05-31 18:15:34 +10:00
Jonny Buchanan
51d00cdcbe Use a power symbol for the badge in Safari instead 2025-05-31 17:43:07 +10:00
Jonny Buchanan
e9e68814c1 Hide the "Upgrade to Premium+ to write longer posts" Premium upsell
Added some more hook classes to help avoid false positives

Closes #481
Closes #501
2025-05-31 17:11:59 +10:00
Jonny Buchanan
bd604e4a7a Fixed verified Government accounts getting the Twitter Blue check
Reworked options for hiding Premium replies to use all "Show" options
Simplified logic for showing allowed Premium replies
Split the option for showing verified orgs into Business and Government options
Fixed the numbers in the Show accounts with over ${number} followers option not being localised
2025-05-31 16:47:04 +10:00
Jonny Buchanan
c75e01f50f Rename 'tnt' things to 'cpft' (finally) 2025-05-31 11:00:06 +10:00
Jonny Buchanan
01fa86347b Hide more custom UI elements when the extension is disabled 2025-05-31 10:53:48 +10:00
Jonny Buchanan
af58f0351c Use a badge to indicate the extension is disabled in Safari 2025-05-31 10:29:56 +10:00
Jonny Buchanan
6e52480e05 Fix invalid disabled icon 2025-05-31 10:29:25 +10:00
Jonny Buchanan
d2125632a0 Fix the current page not being processed on open Twitter pages when extension functionality is enabled 2025-05-31 10:29:11 +10:00
Jonny Buchanan
4bed7b236e Added an option to restore the Tweet source label in focused Tweets (enabled by default)
Fixed the same Tweets being repeatedly re-checked in focused Tweet timelines when new Tweets are added
Refactored focused Tweet tweaks which were previously working around being called repeatedly
Hide UI elements we add to focused tweets when the extension is disabled after adding them

Closes #737
2025-05-31 10:28:10 +10:00
Jonny Buchanan
7a54fbd193 Added an "Enabled" option to allow extension functionality to be toggled off and on without having to disable it in your browser's extension management UI
- Pulled lastFlexDirection state up so it can be reset
- Added a globalObservers scope object so global functionality can be disabled
- Refactored observeElement:
  - Use Maps of disconnectables instead of lists
  - Now handles adding disconnectables to the appropriate scope object itself
  - Automatically disconnects any observer with the same name when observing an element
  - Disconnectables are now automatically removed from their scope object when disconnected
  - A leading call of the callback is now an explicit option which must be opted into
- Made CSS functions remove their stylesheets when disabled
- Reset state in main() so initial setup runs again when re-enabled
- Extracted settings sync setup out of main() so it always runs to receive enabled status changes
- Added a background script to update the browser action icon to match enabled state

Also:

- Fixed flash of X logo on initial load by handling the logo
  - Handle this synchronously in the content script
  - Reflect enabled and replaceLogo settings in localStorage

Closes #514
2025-05-29 13:37:08 +10:00
Jonny Buchanan
d0e54a9d75 Release v4.11.1
- Hid another new Premium upsell in Premium user profiles
2025-05-26 16:06:46 +10:00
Jonny Buchanan
7990265348 Hide another new Premium upsell 2025-05-23 14:34:37 +10:00
Jonny Buchanan
52de4d1c19 Release v4.11.0
- Added an option to hide the Live bar in the mobile timeline when someone you follow is broadcasting
- Added an option to hide the Live with X box in the desktop sidebar
- Added an option to hide the What's happening box in the desktop sidebar
- Added an option to hide Who to follow and other suggested follow boxes in the desktop sidebar
- Moved these to a new Sidebar options group, as they don't all belong in the Remove algorithmic content group
- Added changing "Live on X" to "Live on Twitter" when Replace X branding changes is enabled
- Added hiding promoted trends
- Added hiding Install button cards in some Grok tweets
- Added hiding Ask Grok button in Tweets
- Added hiding a new premium upsell in the desktop sidebar
- Fixed a link headline restoration false positive on Install button cards in Grok tweets
- Fixed hiding the ad in What's happening when not hiding sidebar contents
- Fixed Japanese translation wording and sentence endings
- Increased timeout waiting for the "you aren't verified yet" premium upsell to appear in your own profile
- Removed the Hide Pro nav option, as it's no longer applicable
2025-05-17 03:52:39 +10:00
Jonny Buchanan
a861074949 Quick workaround for an error which stops us starting up if you refresh on a page with a broken <title>, e.g. Bookmarks 2025-05-17 03:48:27 +10:00
Jonny Buchanan
b080052f6f Fixed the Premium upsell in Home sidebar being detected as What's happening
Apply the Show Relevant people setting when using hideSuggestedFollows
Fixed hideSuggestedFollows hiding the entire sidebar in individual Tweet pages
2025-05-17 03:40:23 +10:00
Jonny Buchanan
b0a360aef6 Inceased the timeout waiting for the "you aren't verified yet" premium upsell to appear in your own profile 2025-05-17 02:29:33 +10:00
Jonny Buchanan
6f2a312cce Hide promoted trends anywhere, not just in What's happening 2025-05-11 23:34:46 +10:00
rako
45f0e5f29f
Fix Japanese translation wording and sentence endings (#725) 2025-05-08 07:39:43 +10:00
unknown
4be36de9f8 feat: Enable full-width on posts 2024-10-02 21:59:34 +10:00
unknown
8692f3f582 feat: Add full-width content to profiles 2024-10-02 21:49:51 +10:00
27 changed files with 1426 additions and 958 deletions

View File

@ -51,6 +51,9 @@
"dropdownMenuFontWeightLabel": {
"message": "Use normal font weight in dropdown menus"
},
"enabled": {
"message": "Enabled"
},
"experimentsOptionsLabel": {
"message": "Experiments"
},
@ -68,6 +71,9 @@
"extensionName": {
"message": "Control Panel for Twitter"
},
"extensionNameDisabled": {
"message": "Control Panel for Twitter (disabled)"
},
"fastBlockLabel": {
"message": "Fast blocking (skips confirm dialog)"
},
@ -101,12 +107,6 @@
"hideAllMetricsLabel": {
"message": "Hide all"
},
"hideBlueReplyFollowedByLabel": {
"message": "Hide people who follow me"
},
"hideBlueReplyFollowingLabel": {
"message": "Hide people I follow"
},
"hideBookmarkButtonLabel": {
"message": "Bookmark button under tweets"
},
@ -359,6 +359,9 @@
"restoreQuoteTweetsLinkLabel": {
"message": "Restore Quote Tweets link under Tweets"
},
"restoreTweetSourceLabel": {
"message": "Restore Tweet source label"
},
"retweetsLabel": {
"message": "Retweets"
},
@ -372,7 +375,7 @@
"message": "Number of followers"
},
"showBlueReplyFollowersCountLabel": {
"message": "Show people with over $AMOUNT$ followers",
"message": "Show accounts with over $AMOUNT$ followers",
"placeholders": {
"amount": {
"content": "$1",
@ -380,12 +383,21 @@
}
}
},
"showBlueReplyVerifiedAccountsLabel": {
"message": "Show \"verified\" accounts"
},
"showBookmarkButtonUnderFocusedTweetsLabel": {
"message": "Show under focused tweets"
},
"showPremiumReplyBusinessLabel": {
"message": "Show verified Business accounts"
},
"showPremiumReplyFollowedByLabel": {
"message": "Show accounts which follow me"
},
"showPremiumReplyFollowingLabel": {
"message": "Show accounts I follow"
},
"showPremiumReplyGovernmentLabel": {
"message": "Show verified Government accounts"
},
"showRelevantPeopleLabel": {
"message": "Show \"Relevant people\" when viewing a tweet"
},

View File

@ -50,6 +50,9 @@
"dropdownMenuFontWeightLabel": {
"message": "Usar grosor normal de fuentes en desplegables"
},
"enabled": {
"message": "Habilitado"
},
"experimentsOptionsLabel": {
"message": "Experimentos"
},
@ -65,6 +68,9 @@
"extensionName": {
"message": "Control Panel for Twitter"
},
"extensionNameDisabled": {
"message": "Control Panel for Twitter (deshabilitado)"
},
"fastBlockLabel": {
"message": "Bloqueo rápido (no muestra menú de confirmación)"
},
@ -98,12 +104,6 @@
"hideAllMetricsLabel": {
"message": "Ocultar todo"
},
"hideBlueReplyFollowedByLabel": {
"message": "Ocultar personas que me siguen"
},
"hideBlueReplyFollowingLabel": {
"message": "Ocultar personas que sigo"
},
"hideBookmarkButtonLabel": {
"message": "Botón de guardados debajo de los tweets"
},
@ -353,6 +353,9 @@
"restoreQuoteTweetsLinkLabel": {
"message": "Restaurar el enlace de Tweets citados debajo Tweets"
},
"restoreTweetSourceLabel": {
"message": "Restaurar etiqueta de fuente del Tweet"
},
"retweetsLabel": {
"message": "Retweets"
},
@ -366,19 +369,28 @@
"message": "Número de seguidores"
},
"showBlueReplyFollowersCountLabel": {
"message": "Mostrar personas con más de $AMOUNT$ seguidores",
"message": "Mostrar cuentas con más de $AMOUNT$ seguidores",
"placeholders": {
"amount": {
"content": "$1"
}
}
},
"showBlueReplyVerifiedAccountsLabel": {
"message": "Mostrar cuentas \"verificadas\""
},
"showBookmarkButtonUnderFocusedTweetsLabel": {
"message": "Mostrar debajo de los tweets destacados"
},
"showPremiumReplyBusinessLabel": {
"message": "Mostrar cuentas de empresa verificadas"
},
"showPremiumReplyFollowedByLabel": {
"message": "Mostrar cuentas que me siguen"
},
"showPremiumReplyFollowingLabel": {
"message": "Mostrar cuentas que sigo"
},
"showPremiumReplyGovernmentLabel": {
"message": "Mostrar cuentas gubernamentales verificadas"
},
"showRelevantPeopleLabel": {
"message": "Mostrar \"Personas relevantes\" al ver un tweet"
},

View File

@ -50,6 +50,9 @@
"dropdownMenuFontWeightLabel": {
"message": "Utiliser une taille de police normale dans les menus déroulants"
},
"enabled": {
"message": "Activé"
},
"experimentsOptionsLabel": {
"message": "Fonctionnalités expérimentales"
},
@ -65,6 +68,9 @@
"extensionName": {
"message": "Control Panel for Twitter"
},
"extensionNameDisabled": {
"message": "Control Panel for Twitter (désactivé)"
},
"fastBlockLabel": {
"message": "Blocage rapide (ignore la boîte de dialogue de confirmation)"
},
@ -98,12 +104,6 @@
"hideAllMetricsLabel": {
"message": "Masquer tous les paramètres"
},
"hideBlueReplyFollowedByLabel": {
"message": "Masquer les personnes qui me suivent"
},
"hideBlueReplyFollowingLabel": {
"message": "Masquer les personnes que je suis"
},
"hideBookmarkButtonLabel": {
"message": "Bouton de signet sous les tweets"
},
@ -353,6 +353,9 @@
"restoreQuoteTweetsLinkLabel": {
"message": "Restaurer les liens des Tweets cités sous les Tweets"
},
"restoreTweetSourceLabel": {
"message": "Restaurer l'étiquette de source du Tweet"
},
"retweetsLabel": {
"message": "Retweets"
},
@ -366,19 +369,28 @@
"message": "Nombre d'abonnés"
},
"showBlueReplyFollowersCountLabel": {
"message": "Afficher les personnes avec plus de $AMOUNT$ abonnés",
"message": "Afficher les comptes ayant plus de $AMOUNT$ abonnés",
"placeholders": {
"amount": {
"content": "$1"
}
}
},
"showBlueReplyVerifiedAccountsLabel": {
"message": "Afficher les comptes \"certifiés\""
},
"showBookmarkButtonUnderFocusedTweetsLabel": {
"message": "Afficher sous les tweets mis en avant"
},
"showPremiumReplyBusinessLabel": {
"message": "Afficher les comptes professionnels vérifiés"
},
"showPremiumReplyFollowedByLabel": {
"message": "Afficher les comptes qui me suivent"
},
"showPremiumReplyFollowingLabel": {
"message": "Afficher les comptes que je suis"
},
"showPremiumReplyGovernmentLabel": {
"message": "Afficher les comptes gouvernementaux vérifiés"
},
"showRelevantPeopleLabel": {
"message": "Afficher \"Personnes pertinentes\" lors de l'affichage d'un tweet"
},

View File

@ -50,6 +50,9 @@
"dropdownMenuFontWeightLabel": {
"message": "Usa il peso normale per il font dei menu a tendina"
},
"enabled": {
"message": "Abilitato"
},
"experimentsOptionsLabel": {
"message": "Esperimenti"
},
@ -65,6 +68,9 @@
"extensionName": {
"message": "Control Panel for Twitter"
},
"extensionNameDisabled": {
"message": "Control Panel for Twitter (disabilitato)"
},
"fastBlockLabel": {
"message": "Blocco rapido (salta la conferma)"
},
@ -98,12 +104,6 @@
"hideAllMetricsLabel": {
"message": "Nascondi tutte"
},
"hideBlueReplyFollowedByLabel": {
"message": "Nascondi i miei seguaci"
},
"hideBlueReplyFollowingLabel": {
"message": "Nascondi i miei seguiti"
},
"hideBookmarkButtonLabel": {
"message": "Tasto segnalibro sotto i tweet"
},
@ -353,6 +353,9 @@
"restoreQuoteTweetsLinkLabel": {
"message": "Ripristina link dei tweet di citazione sotto ai tweet"
},
"restoreTweetSourceLabel": {
"message": "Ripristina etichetta della fonte del Tweet"
},
"retweetsLabel": {
"message": "Retweet"
},
@ -366,7 +369,7 @@
"message": "Numero di seguaci"
},
"showBlueReplyFollowersCountLabel": {
"message": "Mostra persone con più di $AMOUNT$ seguaci",
"message": "Mostra account con più di $AMOUNT$ follower",
"placeholders": {
"amount": {
"content": "$1",
@ -374,12 +377,21 @@
}
}
},
"showBlueReplyVerifiedAccountsLabel": {
"message": "Mostra account \"verificati\""
},
"showBookmarkButtonUnderFocusedTweetsLabel": {
"message": "Mostra sotto ai tweet selezionati"
},
"showPremiumReplyBusinessLabel": {
"message": "Mostra account aziendali verificati"
},
"showPremiumReplyFollowedByLabel": {
"message": "Mostra account che mi seguono"
},
"showPremiumReplyFollowingLabel": {
"message": "Mostra account che seguo"
},
"showPremiumReplyGovernmentLabel": {
"message": "Mostra account governativi verificati"
},
"showRelevantPeopleLabel": {
"message": "Mostra \"Persone rilevanti\" quando visualizzi un tweet"
},

View File

@ -50,6 +50,9 @@
"dropdownMenuFontWeightLabel": {
"message": "ドロップダウンメニューを通常のフォントの太さにする"
},
"enabled": {
"message": "有効"
},
"experimentsOptionsLabel": {
"message": "実験的機能"
},
@ -65,6 +68,9 @@
"extensionName": {
"message": "Control Panel for Twitter"
},
"extensionNameDisabled": {
"message": "Control Panel for Twitter (無効)"
},
"fastBlockLabel": {
"message": "即ブロック(確認画面をスキップする)"
},
@ -98,12 +104,6 @@
"hideAllMetricsLabel": {
"message": "すべて非表示"
},
"hideBlueReplyFollowedByLabel": {
"message": "私をフォローしている人を非表示にします"
},
"hideBlueReplyFollowingLabel": {
"message": "フォローしている人を非表示にする"
},
"hideBookmarkButtonLabel": {
"message": "ツイート下部のブックマークボタン"
},
@ -150,7 +150,7 @@
"message": "タイムライン内のインラインプロンプトを非表示にする"
},
"hideJobsLabel": {
"message": "募集を隠す"
"message": "募集を非表示にする"
},
"hideLikeMetricsLabel": {
"message": "いいね件数"
@ -222,7 +222,7 @@
"message": "スペースを作成"
},
"hideSubscriptionsLabel": {
"message": "サブスクリプションを非表示"
"message": "サブスクリプションを非表示にする"
},
"hideSuggestedFollowsLabel": {
"message": "おすすめのフォローを非表示"
@ -345,13 +345,16 @@
"message": "X のブランド変更を置き換える"
},
"restoreLinkHeadlinesLabel": {
"message": "外部リンクの下に見出しを復元"
"message": "外部リンクの下に見出しを復元する"
},
"restoreOtherInteractionLinksLabel": {
"message": "ツイートの下の他のリンクを復元する"
},
"restoreQuoteTweetsLinkLabel": {
"message": "ツイートの下にある「引用ツイート」リンクを復元し"
"message": "ツイートの下にある「引用ツイート」リンクを復元する"
},
"restoreTweetSourceLabel": {
"message": "ツイートのソースラベルを復元"
},
"retweetsLabel": {
"message": "リツイート"
@ -366,19 +369,28 @@
"message": "フォロワー数"
},
"showBlueReplyFollowersCountLabel": {
"message": "$AMOUNT$ 人以上のフォロワーを表示する",
"message": "フォロワー数が$AMOUNT$人を超えるアカウントを表示",
"placeholders": {
"amount": {
"content": "$1"
}
}
},
"showBlueReplyVerifiedAccountsLabel": {
"message": "「認証済み」アカウントを表示"
},
"showBookmarkButtonUnderFocusedTweetsLabel": {
"message": "フォーカスされたツイートの下に表示"
},
"showPremiumReplyBusinessLabel": {
"message": "認証済みビジネスアカウントを表示"
},
"showPremiumReplyFollowedByLabel": {
"message": "自分をフォローしているアカウントを表示"
},
"showPremiumReplyFollowingLabel": {
"message": "フォロー中のアカウントを表示"
},
"showPremiumReplyGovernmentLabel": {
"message": "認証済み政府機関アカウントを表示"
},
"showRelevantPeopleLabel": {
"message": "ツイート閲覧時に「おすすめユーザー」を表示する"
},

View File

@ -50,6 +50,9 @@
"dropdownMenuFontWeightLabel": {
"message": "드롭다운 메뉴에서 일반 글꼴 두께 사용"
},
"enabled": {
"message": "활성화됨"
},
"experimentsOptionsLabel": {
"message": "실험"
},
@ -65,6 +68,9 @@
"extensionName": {
"message": "Control Panel for Twitter"
},
"extensionNameDisabled": {
"message": "Control Panel for Twitter (비활성화됨)"
},
"fastBlockLabel": {
"message": "빠른 차단 (확인 대화상자 생략)"
},
@ -98,12 +104,6 @@
"hideAllMetricsLabel": {
"message": "모두 숨기기"
},
"hideBlueReplyFollowedByLabel": {
"message": "나를 팔로우하는 사람 숨기기"
},
"hideBlueReplyFollowingLabel": {
"message": "내가 팔로우한 사람 숨기기"
},
"hideBookmarkButtonLabel": {
"message": "트윗 아래 북마크 버튼 숨기기"
},
@ -353,6 +353,9 @@
"restoreQuoteTweetsLinkLabel": {
"message": "트윗 아래의 \"트윗 인용\" 링크 복원"
},
"restoreTweetSourceLabel": {
"message": "트윗 출처 라벨 복원"
},
"retweetsLabel": {
"message": "리트윗"
},
@ -366,19 +369,28 @@
"message": "팔로워 수"
},
"showBlueReplyFollowersCountLabel": {
"message": "$AMOUNT$명 이상의 팔로워 보기",
"message": "팔로워 수가 $AMOUNT$명을 초과하는 계정 표시",
"placeholders": {
"amount": {
"content": "$1"
}
}
},
"showBlueReplyVerifiedAccountsLabel": {
"message": "\"인증됨\" 계정 표시"
},
"showBookmarkButtonUnderFocusedTweetsLabel": {
"message": "집중된 트윗 아래에 표시"
},
"showPremiumReplyBusinessLabel": {
"message": "인증된 비즈니스 계정 표시"
},
"showPremiumReplyFollowedByLabel": {
"message": "나를 팔로우하는 계정 표시"
},
"showPremiumReplyFollowingLabel": {
"message": "내가 팔로우하는 계정 표시"
},
"showPremiumReplyGovernmentLabel": {
"message": "인증된 정부 계정 표시"
},
"showRelevantPeopleLabel": {
"message": "트윗 보기 시 \"연관된 사람\" 표시"
},

View File

@ -50,6 +50,9 @@
"dropdownMenuFontWeightLabel": {
"message": "在下拉菜单中使用正常的字体大小"
},
"enabled": {
"message": "已启用"
},
"experimentsOptionsLabel": {
"message": "试验"
},
@ -65,6 +68,9 @@
"extensionName": {
"message": "Control Panel for Twitter"
},
"extensionNameDisabled": {
"message": "Control Panel for Twitter (已禁用)"
},
"fastBlockLabel": {
"message": "快速屏蔽(跳过确认对话框)"
},
@ -98,12 +104,6 @@
"hideAllMetricsLabel": {
"message": "全部隐藏"
},
"hideBlueReplyFollowedByLabel": {
"message": "隐藏关注我的人"
},
"hideBlueReplyFollowingLabel": {
"message": "隐藏我关注的人"
},
"hideBookmarkButtonLabel": {
"message": "推文下方的书签按钮"
},
@ -362,6 +362,9 @@
"restoreQuoteTweetsLinkLabel": {
"message": "恢复推文下的“引用推文”链接"
},
"restoreTweetSourceLabel": {
"message": "恢复推文来源标签"
},
"retweetsLabel": {
"message": "转发"
},
@ -375,19 +378,28 @@
"message": "粉丝数"
},
"showBlueReplyFollowersCountLabel": {
"message": "显示拥有超过 $AMOUNT$ 个粉丝的人",
"message": "显示粉丝数超过$AMOUNT$的账户",
"placeholders": {
"amount": {
"content": "$1"
}
}
},
"showBlueReplyVerifiedAccountsLabel": {
"message": "显示\"已验证\"账号"
},
"showBookmarkButtonUnderFocusedTweetsLabel": {
"message": "在焦点推文下显示"
},
"showPremiumReplyBusinessLabel": {
"message": "显示已验证的企业账户"
},
"showPremiumReplyFollowedByLabel": {
"message": "显示关注我的账户"
},
"showPremiumReplyFollowingLabel": {
"message": "显示我关注的账户"
},
"showPremiumReplyGovernmentLabel": {
"message": "显示已验证的政府账户"
},
"showRelevantPeopleLabel": {
"message": "查看推文时显示\"相关人员\""
},

45
background.js Normal file
View File

@ -0,0 +1,45 @@
const isSafari = location.protocol.startsWith('safari-web-extension:')
const enabledIcons = {
16: 'icons/icon16.png',
32: 'icons/icon32.png',
48: 'icons/icon48.png',
64: 'icons/icon64.png',
96: 'icons/icon96.png',
128: 'icons/icon128.png',
}
const disabledIcons = {
16: 'icons/icon16-disabled.png',
32: 'icons/icon32-disabled.png',
48: 'icons/icon48-disabled.png',
64: 'icons/icon64-disabled.png',
96: 'icons/icon96-disabled.png',
128: 'icons/icon128-disabled.png',
}
function updateToolbarIcon(enabled) {
let title = chrome.i18n.getMessage(enabled ? 'extensionName' : 'extensionNameDisabled')
if (chrome.runtime.getManifest().manifest_version == 3) {
chrome.action.setTitle({title})
if (!isSafari) {
chrome.action.setIcon({path: enabled ? enabledIcons : disabledIcons})
} else {
chrome.action.setBadgeText({text: enabled ? '' : '⏻'})
}
} else {
chrome.browserAction.setTitle({title})
chrome.browserAction.setIcon({path: enabled ? enabledIcons : disabledIcons})
}
}
// Update browser action icon to reflect enabled state
chrome.storage.local.get({enabled: true}, ({enabled}) => {
updateToolbarIcon(enabled)
})
chrome.storage.local.onChanged.addListener((changes) => {
if (changes.enabled) {
updateToolbarIcon(changes.enabled.newValue)
}
})

View File

@ -1,6 +1,38 @@
/** @type {HTMLScriptElement} */
let $settings
const isSafari = navigator.userAgent.includes('Safari/') && !/Chrom(e|ium)\//.test(navigator.userAgent)
const twitterBlue = 'rgb(29, 155, 240)'
const twitterLogoPath = 'M23.643 4.937c-.835.37-1.732.62-2.675.733.962-.576 1.7-1.49 2.048-2.578-.9.534-1.897.922-2.958 1.13-.85-.904-2.06-1.47-3.4-1.47-2.572 0-4.658 2.086-4.658 4.66 0 .364.042.718.12 1.06-3.873-.195-7.304-2.05-9.602-4.868-.4.69-.63 1.49-.63 2.342 0 1.616.823 3.043 2.072 3.878-.764-.025-1.482-.234-2.11-.583v.06c0 2.257 1.605 4.14 3.737 4.568-.392.106-.803.162-1.227.162-.3 0-.593-.028-.877-.082.593 1.85 2.313 3.198 4.352 3.234-1.595 1.25-3.604 1.995-5.786 1.995-.376 0-.747-.022-1.112-.065 2.062 1.323 4.51 2.093 7.14 2.093 8.57 0 13.255-7.098 13.255-13.254 0-.2-.005-.402-.014-.602.91-.658 1.7-1.477 2.323-2.41z'
const xLogoPath = 'M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z'
if (localStorage.cpftEnabled != 'false' && localStorage.cpftReplaceLogo != 'false') {
if (!isSafari) {
let $style = document.createElement('style')
$style.id = 'cpftLoading'
$style.textContent = `
svg path[d="${xLogoPath}"] {
fill: ${twitterBlue};
d: path("${twitterLogoPath}");
}
`
document.documentElement.append($style)
} else {
let startTime = Date.now()
new MutationObserver((_, observer) => {
let $logoPath = document.querySelector(`svg path[d="${xLogoPath}"]`)
if ($logoPath) {
$logoPath.setAttribute('d', twitterLogoPath)
$logoPath.setAttribute('fill', twitterBlue)
observer.disconnect()
}
else if (Date.now() - startTime > 1000) {
observer.disconnect()
}
}).observe(document.documentElement, {childList: true, subtree: true})
}
}
// Get initial config and inject it and the main script into the Twitter page
chrome.storage.local.get((/** @type {Partial<import("./types").Config>} */ storedConfig) => {
// Update deprecated config values
@ -11,7 +43,7 @@ chrome.storage.local.get((/** @type {Partial<import("./types").Config>} */ store
$settings = document.createElement('script')
$settings.type = 'text/json'
$settings.id = 'tnt_settings'
$settings.id = 'cpftSettings'
document.documentElement.appendChild($settings)
$settings.innerText = JSON.stringify(storedConfig)
@ -27,6 +59,8 @@ chrome.storage.local.get((/** @type {Partial<import("./types").Config>} */ store
// Inject config changes from options pages into the settings <script>
function onConfigChange(changes) {
if (changes.enabled) localStorage.cpftEnabled = changes.enabled.newValue
if (changes.replaceLogo) localStorage.cpftReplaceLogo = changes.replaceLogo.newValue
let configChanges = Object.fromEntries(
Object.entries(changes).map(([key, {newValue}]) => [key, newValue])
)
@ -36,7 +70,7 @@ function onConfigChange(changes) {
// Store config changes sent from the injected script
window.addEventListener('message', (event) => {
if (event.source !== window) return
if (event.data.type === 'tntConfigChange' && event.data.changes) {
if (event.data.type === 'cpftConfigChange' && event.data.changes) {
chrome.storage.onChanged.removeListener(onConfigChange)
chrome.storage.local.set(event.data.changes, () => {
chrome.storage.onChanged.addListener(onConfigChange)

BIN
icons/icon128-disabled.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
icons/icon16-disabled.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 318 B

BIN
icons/icon32-disabled.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 616 B

BIN
icons/icon48-disabled.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 938 B

BIN
icons/icon64-disabled.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
icons/icon96-disabled.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -1,7 +1,10 @@
{
"compilerOptions": {
"checkJs": true,
"target": "es2020"
"module": "NodeNext",
"moduleDetection": "force",
"moduleResolution": "nodenext",
"target": "ES2022"
},
"exclude": [
"node_modules",

View File

@ -4,7 +4,7 @@
"name": "__MSG_extensionName__",
"description": "__MSG_extensionDescription__",
"homepage_url": "https://soitis.dev/control-panel-for-twitter",
"version": "4.10.1",
"version": "4.12.2",
"icons": {
"16": "icons/icon16.png",
"32": "icons/icon32.png",
@ -13,6 +13,13 @@
"96": "icons/icon96.png",
"128": "icons/icon128.png"
},
"background": {
"scripts": [
"background.js"
],
"persistent": false,
"type": "module"
},
"content_scripts": [
{
"matches": [

View File

@ -4,7 +4,7 @@
"name": "__MSG_extensionName__",
"description": "__MSG_extensionDescription__",
"homepage_url": "https://soitis.dev/control-panel-for-twitter",
"version": "4.10.1",
"version": "4.12.2",
"icons": {
"16": "icons/icon16.png",
"32": "icons/icon32.png",
@ -13,6 +13,10 @@
"96": "icons/icon96.png",
"128": "icons/icon128.png"
},
"background": {
"service_worker": "background.js",
"type": "module"
},
"content_scripts": [
{
"matches": [

BIN
options-icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 662 B

View File

@ -30,7 +30,7 @@ body:not(.hidingBookmarkButton) .hidingBookmarkButton,
body:not(.hidingExploreNav) .hidingExploreNav,
body:not(.hidingMetrics) .hidingMetrics,
body:not(.hidingQuotesFrom) #hideQuotesFromDetails,
body:not(.hidingSidebarContent) .hidingSidebarContent,
body:not(.hidingSuggestedFollows) .hidingSuggestedFollows,
body:not(.hidingTwitterBlueReplies) .hidingTwitterBlueReplies,
body:not(.iOS.safari) .toggle,
body:not(.mutingQuotes) #mutedQuotesDetails,
@ -41,6 +41,30 @@ body:not(.uninvertedFollowButtons) .uninvertedFollowButtons {
display: none;
}
.icon {
height: 1.25rem;
}
body.macOS.safari .icon {
display: none;
}
body.iOS.safari .icon {
height: 1.75rem;
}
body.disabled .icon {
filter: grayscale(100%);
}
body.disabled form > section ~ section {
visibility: hidden;
}
body.disabled:not(.safari) form > section {
border-bottom: 1px solid var(--border-color);
}
label:not([for]) {
display: flex;
justify-content: space-between;
@ -194,7 +218,7 @@ body.macOS.safari form > section:not(:first-of-type) {
margin-top: 20px;
}
/* Add colons to option group labels */
body.macOS.safari section.group > label:not(.checkbox)::after {
body.macOS.safari form > section.group > label:not(.checkbox)::after {
content: ":";
}
body.macOS.safari form > section.group > label {

View File

@ -8,6 +8,16 @@
</head>
<body>
<form>
<section class="group">
<label class="checkbox" style="align-items: center;">
<span style="display: flex; align-items: center; gap: .5em;">
<img src="options-icon.png" class="icon">
<span id="enabled">Enabled</span>
</span>
<input type="checkbox" name="enabled">
<span class="toggle"></span>
</label>
</section>
<section class="group labelled">
<label id="homeTimelineOptionsLabel">
Home timeline
@ -221,6 +231,13 @@
<span class="toggle"></span>
</label>
</section>
<section class="checkbox">
<label>
<span id="restoreTweetSourceLabel">Restore Tweet source label</span>
<input type="checkbox" name="restoreTweetSource">
<span class="toggle"></span>
</label>
</section>
<section class="checkbox">
<label>
<span id="restoreLinkHeadlinesLabel">Restore headlines under external links</span>
@ -270,21 +287,35 @@
</label>
<section class="checkbox hidingTwitterBlueReplies">
<label>
<span id="hideBlueReplyFollowingLabel">Hide people I follow</span>
<input type="checkbox" name="hideBlueReplyFollowing">
<span id="showPremiumReplyFollowingLabel">Show accounts I follow</span>
<input type="checkbox" name="showPremiumReplyFollowing">
<span class="toggle"></span>
</label>
</section>
<section class="checkbox hidingTwitterBlueReplies">
<label>
<span id="hideBlueReplyFollowedByLabel">Hide people who follow me</span>
<input type="checkbox" name="hideBlueReplyFollowedBy">
<span id="showPremiumReplyFollowedByLabel">Show accounts which follow me</span>
<input type="checkbox" name="showPremiumReplyFollowedBy">
<span class="toggle"></span>
</label>
</section>
<section class="checkbox hidingTwitterBlueReplies">
<label>
<span id="showPremiumReplyBusinessLabel">Show verified Business accounts</span>
<input type="checkbox" name="showPremiumReplyBusiness">
<span class="toggle"></span>
</label>
</section>
<section class="checkbox hidingTwitterBlueReplies">
<label>
<span id="showPremiumReplyGovernmentLabel">Show verified Government accounts</span>
<input type="checkbox" name="showPremiumReplyGovernment">
<span class="toggle"></span>
</label>
</section>
<section class="checkbox group hidingTwitterBlueReplies">
<label>
<span id="showBlueReplyFollowersCountLabel">Show people with over 1 million followers</span>
<span id="showBlueReplyFollowersCountLabel">Show accounts with over 1 million followers</span>
<input type="checkbox" name="showBlueReplyFollowersCount">
<span class="toggle"></span>
</label>
@ -300,13 +331,6 @@
</label>
</section>
</section>
<section class="checkbox hidingTwitterBlueReplies">
<label>
<span id="showBlueReplyVerifiedAccountsLabel">Show "verified" accounts</span>
<input type="checkbox" name="showBlueReplyVerifiedAccounts">
<span class="toggle"></span>
</label>
</section>
</section>
<section class="checkbox">
<label>
@ -420,13 +444,6 @@
<input type="checkbox" name="hideSidebarContent">
<span class="toggle"></span>
</label>
<section class="checkbox hidingSidebarContent">
<label>
<span id="showRelevantPeopleLabel">Show "Relevant people" when viewing a tweet</span>
<input type="checkbox" name="showRelevantPeople">
<span class="toggle"></span>
</label>
</section>
<section class="checkbox showingSidebarContent">
<label>
<span id="hideLiveBroadcastsLabel">Hide Live broadcasts</span>
@ -448,6 +465,13 @@
<span class="toggle"></span>
</label>
</section>
<section class="checkbox hidingSuggestedFollows">
<label>
<span id="showRelevantPeopleLabel">Show "Relevant people" when viewing a tweet</span>
<input type="checkbox" name="showRelevantPeople">
<span class="toggle"></span>
</label>
</section>
</section>
</section>
@ -769,7 +793,7 @@
</section>
</section>
<div id="version">v4.10.1<span id="debugCountdown"></span></div>
<div id="version">v4.12.2<span id="debugCountdown"></span></div>
</form>
<script src="options.js"></script>
</body>

View File

@ -1,5 +1,16 @@
document.title = chrome.i18n.getMessage(`extensionName`)
for (let optionValue of [
'1000',
'10000',
'100000',
'1000000',
]) {
for (let $option of document.querySelectorAll(`option[value="${optionValue}"]`)) {
$option.textContent = formatFollowerCount(Number(optionValue))
}
}
for (let optionValue of [
'badges',
'comfortable',
@ -35,6 +46,7 @@ for (let translationId of [
'disabledHomeTimelineRedirectOption_messages',
'dontUseChirpFontLabel',
'dropdownMenuFontWeightLabel',
'enabled',
'experimentsOptionsLabel',
'exportConfigLabel',
'fastBlockLabel',
@ -47,8 +59,6 @@ for (let translationId of [
'hideAccountSwitcherLabel',
'hideAdsNavLabel',
'hideAllMetricsLabel',
'hideBlueReplyFollowedByLabel',
'hideBlueReplyFollowingLabel',
'hideBookmarkButtonLabel',
'hideBookmarkMetricsLabel',
'hideComposeTweetLabel',
@ -110,12 +120,16 @@ for (let translationId of [
'restoreLinkHeadlinesLabel',
'restoreOtherInteractionLinksLabel',
'restoreQuoteTweetsLinkLabel',
'restoreTweetSourceLabel',
'retweetsLabel',
'sidebarLabel',
'showBlueReplyFollowersCountAmountLabel',
'showBlueReplyVerifiedAccountsLabel',
'showBookmarkButtonUnderFocusedTweetsLabel',
'showPremiumReplyBusinessLabel',
'showPremiumReplyFollowedByLabel',
'showPremiumReplyFollowingLabel',
'showPremiumReplyGovernmentLabel',
'showRelevantPeopleLabel',
'sidebarLabel',
'sortRepliesLabel',
'tweakNewLayoutInfo',
'tweakNewLayoutLabel',
@ -164,6 +178,7 @@ if (navigator.userAgent.includes('Safari/') && !/Chrom(e|ium)\//.test(navigator.
//#region Default config
/** @type {import("./types").Config} */
const defaultConfig = {
enabled: true,
debug: false,
debugLogTimelineStats: false,
// Default based on the platform if the main script hasn't run on Twitter yet
@ -180,8 +195,6 @@ const defaultConfig = {
fastBlock: true,
followButtonStyle: 'monochrome',
hideAdsNav: true,
hideBlueReplyFollowedBy: false,
hideBlueReplyFollowing: false,
hideBookmarkButton: false,
hideBookmarkMetrics: true,
hideBookmarksNav: false,
@ -226,11 +239,15 @@ const defaultConfig = {
restoreLinkHeadlines: true,
restoreOtherInteractionLinks: false,
restoreQuoteTweetsLink: true,
restoreTweetSource: true,
retweets: 'separate',
showBlueReplyFollowersCountAmount: '1000000',
showBlueReplyFollowersCount: false,
showBlueReplyVerifiedAccounts: false,
showBlueReplyFollowersCountAmount: '1000000',
showBookmarkButtonUnderFocusedTweets: true,
showPremiumReplyBusiness: true,
showPremiumReplyFollowedBy: true,
showPremiumReplyFollowing: true,
showPremiumReplyGovernment: true,
sortReplies: 'relevant',
tweakNewLayout: false,
tweakQuoteTweetsPage: true,
@ -293,7 +310,7 @@ let $showBlueReplyFollowersCountLabel = /** @type {HTMLElement} */ (document.que
//#region Utility functions
function exportConfig() {
let $a = document.createElement('a')
$a.download = 'control-panel-for-twitter-v4.10.1.config.txt'
$a.download = 'control-panel-for-twitter-v4.12.2.config.txt'
$a.href = URL.createObjectURL(new Blob([
JSON.stringify(optionsConfig, null, 2)
], {type: 'text/plain'}))
@ -450,6 +467,7 @@ function updateCheckboxGroups() {
function updateDisplay() {
$body.classList.toggle('debugging', optionsConfig.debug)
$body.classList.toggle('chronological', optionsConfig.alwaysUseLatestTweets)
$body.classList.toggle('disabled', !optionsConfig.enabled)
$body.classList.toggle('disabledHomeTimeline', optionsConfig.disableHomeTimeline)
$body.classList.toggle('fullWidthContent', optionsConfig.fullWidthContent)
$body.classList.toggle('hidingBookmarkButton', optionsConfig.hideBookmarkButton)
@ -457,7 +475,7 @@ function updateDisplay() {
$body.classList.toggle('hidingMetrics', optionsConfig.hideMetrics)
$body.classList.toggle('hidingNotifications', optionsConfig.hideNotifications == 'hide')
$body.classList.toggle('hidingQuotesFrom', shouldDisplayHideQuotesFrom())
$body.classList.toggle('hidingSidebarContent', optionsConfig.hideSidebarContent)
$body.classList.toggle('hidingSuggestedFollows', optionsConfig.hideSidebarContent || optionsConfig.hideSuggestedFollows)
$body.classList.toggle('hidingTwitterBlueReplies', optionsConfig.hideTwitterBlueReplies)
$body.classList.toggle('mutingQuotes', shouldDisplayMutedQuotes())
$body.classList.toggle('showingBlueReplyFollowersCount', optionsConfig.showBlueReplyFollowersCount)

View File

@ -67,6 +67,10 @@
FB38F986298CF4DA00F9AA54 /* script.js in Resources */ = {isa = PBXBuildFile; fileRef = FB38F984298CF4DA00F9AA54 /* script.js */; };
FB5703372983C50800E44D21 /* _locales in Resources */ = {isa = PBXBuildFile; fileRef = FB5703362983C50800E44D21 /* _locales */; };
FB5703382983C50800E44D21 /* _locales in Resources */ = {isa = PBXBuildFile; fileRef = FB5703362983C50800E44D21 /* _locales */; };
FBB23FE32DE93E27007886FC /* background.js in Resources */ = {isa = PBXBuildFile; fileRef = FBB23FE22DE93E27007886FC /* background.js */; };
FBB23FE42DE93E27007886FC /* background.js in Resources */ = {isa = PBXBuildFile; fileRef = FBB23FE22DE93E27007886FC /* background.js */; };
FBB23FE62DE96642007886FC /* options-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = FBB23FE52DE96642007886FC /* options-icon.png */; };
FBB23FE72DE96642007886FC /* options-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = FBB23FE52DE96642007886FC /* options-icon.png */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@ -153,6 +157,8 @@
A598E1D8297B46C300BF2F25 /* options.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; name = options.css; path = ../../../options.css; sourceTree = "<group>"; };
FB38F984298CF4DA00F9AA54 /* script.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = script.js; path = ../../../script.js; sourceTree = "<group>"; };
FB5703362983C50800E44D21 /* _locales */ = {isa = PBXFileReference; lastKnownFileType = folder; name = _locales; path = ../../../_locales; sourceTree = "<group>"; };
FBB23FE22DE93E27007886FC /* background.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; name = background.js; path = ../../../background.js; sourceTree = "<group>"; };
FBB23FE52DE96642007886FC /* options-icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "options-icon.png"; path = "../../../options-icon.png"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -234,6 +240,7 @@
isa = PBXGroup;
children = (
FB5703362983C50800E44D21 /* _locales */,
FBB23FE22DE93E27007886FC /* background.js */,
A598E1D5297B467D00BF2F25 /* browser_action.html */,
A598E1AA297B441300BF2F25 /* content.js */,
A598E1BB297B444700BF2F25 /* icon48.png */,
@ -245,6 +252,7 @@
A598E1D8297B46C300BF2F25 /* options.css */,
A598E1A9297B441300BF2F25 /* options.html */,
A598E1AB297B441300BF2F25 /* options.js */,
FBB23FE52DE96642007886FC /* options-icon.png */,
FB38F984298CF4DA00F9AA54 /* script.js */,
A598E1BD297B444700BF2F25 /* toolbar-icon16.png */,
A598E1BA297B444700BF2F25 /* toolbar-icon19.png */,
@ -389,7 +397,7 @@
attributes = {
BuildIndependentTargetsInParallel = 1;
LastSwiftUpdateCheck = 1420;
LastUpgradeCheck = 1620;
LastUpgradeCheck = 1630;
TargetAttributes = {
A598E14A297B3E9300BF2F25 = {
CreatedOnToolsVersion = 14.2;
@ -459,9 +467,11 @@
buildActionMask = 2147483647;
files = (
A598E1CB297B444700BF2F25 /* toolbar-icon19.png in Resources */,
FBB23FE72DE96642007886FC /* options-icon.png in Resources */,
A598E1C7297B444700BF2F25 /* icon256.png in Resources */,
A598E1D9297B46C300BF2F25 /* options.css in Resources */,
FB5703372983C50800E44D21 /* _locales in Resources */,
FBB23FE42DE93E27007886FC /* background.js in Resources */,
A598E1B0297B441300BF2F25 /* content.js in Resources */,
A598E1CF297B444700BF2F25 /* toolbar-icon32.png in Resources */,
FB38F985298CF4DA00F9AA54 /* script.js in Resources */,
@ -485,9 +495,11 @@
buildActionMask = 2147483647;
files = (
A598E1CC297B444700BF2F25 /* toolbar-icon19.png in Resources */,
FBB23FE62DE96642007886FC /* options-icon.png in Resources */,
A598E1C8297B444700BF2F25 /* icon256.png in Resources */,
A598E1DA297B46C300BF2F25 /* options.css in Resources */,
FB5703382983C50800E44D21 /* _locales in Resources */,
FBB23FE32DE93E27007886FC /* background.js in Resources */,
A598E1B1297B441300BF2F25 /* content.js in Resources */,
A598E1D0297B444700BF2F25 /* toolbar-icon32.png in Resources */,
FB38F986298CF4DA00F9AA54 /* script.js in Resources */,
@ -628,9 +640,10 @@
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 89;
CURRENT_PROJECT_VERSION = 94;
DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = 2RDKJDLNY8;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
@ -648,7 +661,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MARKETING_VERSION = 4.10.1;
MARKETING_VERSION = 4.12.2;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
@ -690,9 +703,10 @@
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 89;
CURRENT_PROJECT_VERSION = 94;
DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = 2RDKJDLNY8;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
@ -704,7 +718,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MARKETING_VERSION = 4.10.1;
MARKETING_VERSION = 4.12.2;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SWIFT_COMPILATION_MODE = wholemodule;
@ -716,7 +730,6 @@
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = 2RDKJDLNY8;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "iOS (Extension)/Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = "Control Panel for Twitter Extension";
@ -745,7 +758,6 @@
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = 2RDKJDLNY8;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "iOS (Extension)/Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = "Control Panel for Twitter Extension";
@ -778,7 +790,6 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = 2RDKJDLNY8;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "iOS (App)/Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = "Control Panel for Twitter";
@ -816,7 +827,6 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = 2RDKJDLNY8;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "iOS (App)/Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = "Control Panel for Twitter";
@ -854,7 +864,6 @@
CODE_SIGN_ENTITLEMENTS = "macOS (Extension)/Tweak New Twitter.entitlements";
CODE_SIGN_STYLE = Automatic;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = 2RDKJDLNY8;
ENABLE_HARDENED_RUNTIME = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "macOS (Extension)/Info.plist";
@ -885,7 +894,6 @@
CODE_SIGN_ENTITLEMENTS = "macOS (Extension)/Tweak New Twitter.entitlements";
CODE_SIGN_STYLE = Automatic;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = 2RDKJDLNY8;
ENABLE_HARDENED_RUNTIME = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "macOS (Extension)/Info.plist";
@ -919,7 +927,6 @@
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
CODE_SIGN_STYLE = Automatic;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = 2RDKJDLNY8;
ENABLE_HARDENED_RUNTIME = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_CFBundleDisplayName = "Control Panel for Twitter";
@ -954,7 +961,6 @@
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
CODE_SIGN_STYLE = Automatic;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_TEAM = 2RDKJDLNY8;
ENABLE_HARDENED_RUNTIME = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_CFBundleDisplayName = "Control Panel for Twitter";

View File

@ -4,7 +4,7 @@
"name": "__MSG_extensionName__",
"description": "__MSG_extensionDescriptionShort__",
"homepage_url": "https://soitis.dev/control-panel-for-twitter",
"version": "4.10.1",
"version": "4.12.2",
"icons": {
"48": "icon48.png",
"96": "icon96.png",
@ -12,6 +12,10 @@
"256": "icon256.png",
"512": "icon512.png"
},
"background": {
"service_worker": "background.js",
"type": "module"
},
"content_scripts": [
{
"matches": [

1852
script.js

File diff suppressed because it is too large Load Diff

View File

@ -74,6 +74,7 @@ ${messages.xFixesLabel}
${messages.replaceLogoLabel}
${messages.hideViewsLabel}
${messages.hideVerifiedNotificationsTabLabel}
${messages.restoreTweetSourceLabel}
${messages.restoreLinkHeadlinesLabel}
${messages.restoreQuoteTweetsLinkLabel}
${messages.restoreOtherInteractionLinksLabel}

28
types.d.ts vendored
View File

@ -1,4 +1,5 @@
export type Config = {
enabled: boolean
debug: boolean
debugLogTimelineStats: boolean
version?: 'desktop' | 'mobile'
@ -15,8 +16,6 @@ export type Config = {
fastBlock: boolean
followButtonStyle: 'monochrome' | 'themed'
hideAdsNav: boolean
hideBlueReplyFollowedBy: boolean
hideBlueReplyFollowing: boolean
hideBookmarkButton: boolean
hideBookmarkMetrics: boolean
hideBookmarksNav: boolean
@ -66,11 +65,15 @@ export type Config = {
restoreLinkHeadlines: boolean
restoreQuoteTweetsLink: boolean
restoreOtherInteractionLinks: boolean
restoreTweetSource: boolean
retweets: SharedTweetsConfig
showBlueReplyFollowersCountAmount: string
showBlueReplyFollowersCount: boolean
showBlueReplyVerifiedAccounts: boolean
showBlueReplyFollowersCountAmount: string
showBookmarkButtonUnderFocusedTweets: boolean
showPremiumReplyBusiness: boolean
showPremiumReplyFollowedBy: boolean
showPremiumReplyFollowing: boolean
showPremiumReplyGovernment: boolean
sortReplies: 'relevant' | 'recent' | 'liked'
tweakNewLayout: boolean
tweakQuoteTweetsPage: boolean
@ -144,9 +147,9 @@ export type LocaleKey =
| 'VIEW'
| 'WHATS_HAPPENING'
export type NamedMutationObserver = MutationObserver & {name?: string}
export type NamedMutationObserver = MutationObserver & {name: string}
export type Disconnectable = NamedMutationObserver|{disconnect(): void}
export type Disconnectable = {name: string, disconnect(): void}
export type QuotedTweet = {
quotedBy: string
@ -171,10 +174,11 @@ export type TweetType =
export type TimelineItemType =
| TweetType
| 'BLUE_REPLY'
| 'VERIFIED_ORG_REPLY'
| 'BUSINESS_REPLY'
| 'DISCOVER_MORE_HEADING'
| 'DISCOVER_MORE_TWEET'
| 'FOCUSED_TWEET'
| 'GOVERNMENT_REPLY'
| 'HEADING'
| 'INLINE_PROMPT'
| 'SHOW_MORE'
@ -193,7 +197,13 @@ export type TimelineOptions = {
}
export type IndividualTweetTimelineOptions = {
observers: Disconnectable[]
observers: Map<string, Disconnectable>
seen: WeakMap<Element, IndividualTweetDetails>
}
export type IndividualTweetDetails = {
itemType: TimelineItemType,
hidden: boolean | null,
}
export type UserInfo = {
@ -204,4 +214,4 @@ export type UserInfo = {
export type UserInfoObject = {[index: string]: UserInfo}
export type VerifiedType = 'BLUE' | 'VERIFIED_ORG'
export type VerifiedType = 'BLUE' | 'BUSINESS' | 'GOVERNMENT'