added files via upload

This commit is contained in:
Balackburn
2023-06-27 09:54:41 +02:00
commit 2ff6aac218
1420 changed files with 88898 additions and 0 deletions

86
.github/ISSUE_TEMPLATE/bug.yaml vendored Normal file
View File

@@ -0,0 +1,86 @@
name: Bug
description: Make sure you complete the template. Otherwise, it will be closed without further explanation!
title: "[Bug] Replace this with your title"
labels: bug
body:
- type: checkboxes
attributes:
label: Is there an existing issue for this?
description: _Please search to see if an issue already exists for the bug you encountered_
options:
- label: I have searched the existing issues
required: true
- type: checkboxes
attributes:
label: Have you read the FAQ?
description: _Make sure you visit the [**FAQ**](https://github.com/qnblackcat/CercubePlus/wiki/FAQ) page first!_
options:
- label: Yes, I read the FAQ
required: true
- type: textarea
attributes:
label: Device info
description:
value: |
- iOS/iPadOS version:
- Device model:
- Sideload tool (AltStore, Sideloadly, TrollStore,...):
- The specific version of CercubePlus (**latest** or **newest** is **NOT** a version number!):
validations:
required: true
- type: textarea
attributes:
label: Describe the bug
description: _Please attach videos or screenshots if possible_
validations:
required: true
- type: textarea
attributes:
label: Steps to reproduce the issue
description: _Please attach videos or screenshots if possible_
value: |
1.
2.
3.
validations:
required: true
- type: textarea
id: logs
attributes:
label: Crash log (if the app crashes)
description: _If somehow the app crashes, **you must provide the crash log**. It can be found in your device's Settings App > Privacy > Analytics & Improvements > Analytics Data > Youtube-xxx-xxx.ips_
render: shell
- type: dropdown
attributes:
label: Are you using the newest version of CercubePlus? If not, why?
description: _Developers spend time and effort to fix bugs & add improvements with every release. Why don't you update to the [latest version](https://github.com/Balackburn/CercubePlusExtra/releases/latest) before reporting about an issue?_
multiple: false
options:
- ✅ Yes, I'm using the latest version of CercubePlus right now
- ❌ No, I'll explain at the end of the template
validations:
required: true
- type: dropdown
attributes:
label: Does the issue happen with the official YouTube from AppStore?
description: _Well, YouTube itself is buggy sometimes..._
multiple: false
options:
- ❌ No, It doesn't
- ✅ Yes, It does
validations:
required: true
- type: textarea
attributes:
label: Additional context
description: _Um, anything else you want to say?_
validations:
required: false

37
.github/ISSUE_TEMPLATE/question-help.md vendored Normal file
View File

@@ -0,0 +1,37 @@
name: Question
description: Have question(s)?
title: "[Questions] Replace with your question"
labels: question
body:
- type: checkboxes
attributes:
label: Is there an existing issue/question for this?
description: _Please search to see if an issue already exists for the bug you encountered. **I DON\'T MAKE THIS TICK BOX FOR COSMETIC.**_
options:
- label: I have searched the existing issues
required: true
- type: dropdown
attributes:
label: Do you think this is a bug?
description: _If you think this is a bug, please open a new issue with the bug template_
multiple: false
options:
- ✅ Yes, I believe this is a bug. I will open a new issue with the bug template
- ❌ No, I don't think this is a bug. I will explain below
validations:
required: true
- type: textarea
attributes:
label: My question
description: _Please enter your question here_
validations:
required: true
- type: textarea
attributes:
label: Additional context
description: _Um, anything else you want to say?_
validations:
required: false

42
.github/RELEASE_TEMPLATE/Release.md vendored Normal file
View File

@@ -0,0 +1,42 @@
# [YOUR_TWEAK_NAME] Features
CercubePlus but adds Additional Features that shouldve been added to the native CercubePlus which were probably not added.
**LowContrastMode:** This tweak helps remove the new contrasty looking UI that was first introducted way back in 2020 August/September. (Tweak made by arichorn)
<details>
<summary>More Features...</summary>
**LowContrastModeColors:** for users who doesnt use gray will get a set of colors to switch which changes and improves the UI Customization. (Add-on added for LowContrastMode)
**YTNoHeatwaves:** Turns off the Heatwaves Feature in the video player. `(CercubePlus/VideoPlayerOverlayControls)`
**YTNoUpgradeDialog:** Disables the Upgrade Dialog so you wont be prompt to update the app.
**YouMute:** Mute/unmute videos in YouTube directly.
**iPadLayout:** Gives iPhone users the ability to use the iPads Interface and the ability to use the some of the YouTube features that are not on iPhone.
**iPhoneLayout:** Gives iPad users the ability to use Community Posts, to create Shorts and the ability to use the buggy iPhone layout. but using it in split view mode fixes the ui.
**HideSponsorBlockButton:** Hide the SponsorBlock Button shown on the Nav Bar. Added by Dayanch96
**DisableWifiRelatedOptions:** want to remove sections that are only shown when internet is on? You can toggle this to remove all of those sections. Well not all but toggling the option will remove some of the annoying sections that may not be used.
**HideShadowOverlayButtons:** want to remove shadow overlay on the buttons used in the video player? Then toggle this to remove the Shadow Overlay on the buttons Previous, Next, Rewind, Forward.
**etc..**
</details>
# [YOUR_TWEAK_NAME] Release Information
Current YouTube IPA: `TEMPLATE`
Current Cercube Version: `v5.3.13`
Current App Compatibility: `iOS/iPadOS 14.0` or later
**RELEASE F1:**
[THIS IS WHERE YOU PUT YOUR CHANGES BELOW, also F1 indicates First Release on the same YouTube Version in case you needed to know]
- [<-- this subtract symbol makes the changelog look cool]
- [this right here shows you added additonal changes on a certain tweak like this for example, below]
- Improvements
- Fixed Sign-in Issue
- Fixed Ads Not Working Issue
[THIS IS HOW YOU DO IT! YOU CAN DELETE ALL OF THE TEXT I'VE SAID!]

159
.github/workflows/buildapp.yml vendored Normal file
View File

@@ -0,0 +1,159 @@
# Original idea by @ISnackable. Many thanks to him for handling the most hardest parts!
# https://github.com/ISnackable/CercubePlus/blob/main/.github/workflows/Build.yml
name: Build and Release YTLitePlus
on:
workflow_dispatch:
inputs:
decrypted_youtube_url:
description: "The direct URL to the decrypted YouTube ipa"
default: ""
required: true
type: string
youtube_version:
description: "The version of YouTube"
default: ""
required: true
type: string
ytliteplus_version:
description: "The version of YTLitePlus"
default: "2.0"
required: true
type: string
bundle_id:
description: "Modify the bundle ID. Not recommended"
default: "com.google.ios.youtube"
required: true
type: string
app_name:
description: "Modify the name of the app on the Home Screen. Not recommended"
default: "YouTube"
required: true
type: string
create_release:
description: "Create a draft release"
default: true
required: false
type: boolean
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
name: Build YTLitePlus
runs-on: macos-latest
permissions:
contents: write
steps:
- name: Checkout Main
uses: actions/checkout@v3.5.2
with:
path: main
submodules: recursive
- name: Install Dependencies
run: brew install ldid dpkg make
- name: Setup Theos
uses: actions/checkout@v3.5.2
with:
repository: theos/theos
ref: master
path: theos
submodules: recursive
- name: Caching
id: SDK
uses: actions/cache@v3.3.1
env:
cache-name: iOS-15.5-SDK
with:
path: theos/sdks/
key: ${{ env.cache-name }}
- name: Download iOS 15.5 SDK
if: steps.SDK.outputs.cache-hit != 'true'
run: |
svn checkout -q https://github.com/chrisharper22/sdks/trunk/iPhoneOS15.5.sdk
mv *.sdk $THEOS/sdks
env:
THEOS: ${{ github.workspace }}/theos
- name: Setup Theos Jailed
uses: actions/checkout@v3.5.2
with:
repository: qnblackcat/theos-jailed
ref: master
path: theos-jailed
submodules: recursive
- name: Install Theos Jailed
run: |
./theos-jailed/install
env:
THEOS: ${{ github.workspace }}/theos
- name: Prepare YouTube iPA
run: |
wget "$YOUTUBE_URL" --no-verbose -O main/YouTube.ipa
echo -e "==> \033[1mYouTube v${{ inputs.youtube_version }} downloaded! \033[0m"
unzip -q main/YouTube.ipa -d main/tmp
rm -rf main/tmp/Payload/YouTube.app/_CodeSignature/CodeResources
rm -rf main/tmp/Payload/YouTube.app/PlugIns/*
cp -R main/Extensions/*.appex main/tmp/Payload/YouTube.app/PlugIns
echo -e "==> \033[1mYouTube v${{ inputs.youtube_version }} unpacked! \033[0m"
env:
THEOS: ${{ github.workspace }}/theos
YOUTUBE_VERSION: ${{ inputs.youtube_version }}
YOUTUBE_URL: ${{ inputs.decrypted_youtube_url }}
- name: Fix Compiling & Build Package
id: build_package
run: |
(echo PATH=\"$(brew --prefix make)/libexec/gnubin:\$PATH\" >> ~/.zprofile)
cd ${{ github.workspace }}/main
sed -i '' "12s#.*#BUNDLE_ID = ${{ env.BUNDLE_ID }}#g" Makefile
sed -i '' "11s#.*#DISPLAY_NAME = ${{ env.APP_NAME }}#g" Makefile
make package FINALPACKAGE=1
(mv "packages/$(ls -t packages | head -n1)" "packages/YTLitePlus_${{ env.YOUTUBE_VERSION }}.ipa")
echo "package=$(ls -t packages | head -n1)" >>$GITHUB_OUTPUT
echo -e "==> \033[1mSHASUM256: $(shasum -a 256 packages/*.ipa | cut -f1 -d' ')\033[0m"
echo -e "==> \033[1mBundle ID: ${{ env.BUNDLE_ID }}\033[0m"
env:
THEOS: ${{ github.workspace }}/theos
ytliteplus_version: ${{ inputs.ytliteplus_version }}
YOUTUBE_VERSION: ${{ inputs.youtube_version }}
BUNDLE_ID: ${{ inputs.bundle_id }}
APP_NAME: ${{ inputs.app_name }}
- name: Upload Artifact
uses: actions/upload-artifact@v3.1.2
env:
ytliteplus_version: ${{ inputs.ytliteplus_version }}
YOUTUBE_VERSION: ${{ inputs.youtube_version }}
with:
name: YTLitePlus_${{ env.YOUTUBE_VERSION }}_${{ env.ytliteplus_version }}
path: ${{ github.workspace }}/main/packages/${{ steps.build_package.outputs.package }}
if-no-files-found: error
- name: Create Release
id: create_release
uses: softprops/action-gh-release@v0.1.15
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ytliteplus_version: ${{ inputs.ytliteplus_version }}
YOUTUBE_VERSION: ${{ inputs.youtube_version }}
DRAFT: ${{ inputs.create_release }}
with:
tag_name: v${{ env.YOUTUBE_VERSION }}-${{ env.ytliteplus_version }}-(${{ github.run_number }})
name: v${{ env.YOUTUBE_VERSION }}-${{ env.ytliteplus_version }}-(${{ github.run_number }})
files: main/packages/*.ipa
draft: ${{ env.DRAFT }}

7
.gitignore vendored Normal file
View File

@@ -0,0 +1,7 @@
.DS_Store
.theos/
packages/
tmp/
Tweaks/Cercube/*
!Tweaks/Cercube/.gitkeep
Resources/

45
.gitmodules vendored Normal file
View File

@@ -0,0 +1,45 @@
[submodule "Tweaks/YTUHD"]
path = Tweaks/YTUHD
url = https://github.com/PoomSmart/YTUHD.git
[submodule "Tweaks/YouPiP"]
path = Tweaks/YouPiP
url = https://github.com/PoomSmart/YouPiP.git
[submodule "Tweaks/Return-YouTube-Dislikes"]
path = Tweaks/Return-YouTube-Dislikes
url = https://github.com/PoomSmart/Return-YouTube-Dislikes.git
[submodule "Tweaks/YouTubeHeader"]
path = Tweaks/YouTubeHeader
url = https://github.com/PoomSmart/YouTubeHeader.git
[submodule "Tweaks/Alderis"]
path = Tweaks/Alderis
url = https://github.com/qnblackcat/Alderis.git
[submodule "Tweaks/PSHeader"]
path = Tweaks/PSHeader
url = https://github.com/PoomSmart/PSHeader.git
[submodule "Tweaks/YTABConfig"]
path = Tweaks/YTABConfig
url = https://github.com/PoomSmart/YTABConfig.git
[submodule "Tweaks/YouMute"]
path = Tweaks/YouMute
url = https://github.com/PoomSmart/YouMute.git
[submodule "Tweaks/RemoteLog"]
path = Tweaks/RemoteLog
url = https://github.com/Muirey03/RemoteLog.git
[submodule "Tweaks/FLEX"]
path = Tweaks/FLEX
url = https://github.com/qnblackcat/FLEX-Classes.git
[submodule "Tweaks/iSponsorBlock"]
path = Tweaks/iSponsorBlock
url = https://github.com/Galactic-Dev/iSponsorBlock.git
[submodule "Extensions"]
path = Extensions
url = https://github.com/CokePokes/YoutubeExtensions.git
[submodule "Tweaks/YTHoldForSpeed"]
path = Tweaks/YTHoldForSpeed
url = https://github.com/arichorn/YTHoldForSpeed.git
[submodule "Tweaks/DontEatMyContent"]
path = Tweaks/DontEatMyContent
url = https://github.com/therealFoxster/DontEatMyContent.git
[submodule "Tweaks/YTLite"]
path = Tweaks/YTLite
url = https://github.com/dayanch96/YTLite.git

2
Extensions/.gitattributes vendored Normal file
View File

@@ -0,0 +1,2 @@
# Auto detect text files and perform LF normalization
* text=auto

1
Extensions/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
.DS_Store

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,333 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Info.plist</key>
<data>
5KaPBsMVTGZfcc05Od8nGW6/EyQ=
</data>
<key>_locales/en/messages.json</key>
<data>
8cPkszxzYFSjhRWsf34A0AiHaPM=
</data>
<key>background.js</key>
<data>
tClFxbnUm0L65Qj+Qu8Fk9asL2o=
</data>
<key>content.js</key>
<data>
a6o4B4PMlrIOBXlniU2NS4D9SJE=
</data>
<key>embedded.mobileprovision</key>
<data>
dVGLS8Qpu/eCI1J5VCu9IfYq3Z4=
</data>
<key>images/cat_1.0.gif</key>
<data>
DtSTnvB7wRt647kM1b38KLfDfXA=
</data>
<key>images/icon-128.png</key>
<data>
rYa1lv1LgkO3fkP9h6gRSjlQgqk=
</data>
<key>images/icon-256.png</key>
<data>
05xbekvTg28KsH9RRIKQRL8tqQs=
</data>
<key>images/icon-48.png</key>
<data>
BWUZe8raKzOzA2cDWIYFoBPxxw8=
</data>
<key>images/icon-512.png</key>
<data>
shzpVHJMsAu4q820Fb+YzByiFhc=
</data>
<key>images/icon-64.png</key>
<data>
HZC4YIb4ZLg4lpjNAKFqSaka6r0=
</data>
<key>images/icon-96.png</key>
<data>
IPAOd1HfCtCI7ybhVhwA5TU/BZ8=
</data>
<key>images/toolbar-icon-16.png</key>
<data>
Bkb2Cy8VYIcWl7wFZ2HcWZcCoyA=
</data>
<key>images/toolbar-icon-19.png</key>
<data>
XLkdODJ73CVbwn/1LCAsfB6scPg=
</data>
<key>images/toolbar-icon-32.png</key>
<data>
0cQgf/z3urGdzsmtmc2Wnim1+lg=
</data>
<key>images/toolbar-icon-38.png</key>
<data>
eas7Tl3/r2JMZf6nK84ZjoBJrZo=
</data>
<key>images/toolbar-icon-48.png</key>
<data>
fxyz1xgkIR877Cf/7uYNUqXrxoM=
</data>
<key>images/toolbar-icon-72.png</key>
<data>
pHL3CJwjPY30T9sFvvcA2qlraBw=
</data>
<key>manifest.json</key>
<data>
b37QyqMYHlvlfOjbvJLOKeAM5Y4=
</data>
<key>popup.css</key>
<data>
mXR2qQxu+ceMOItNpc4aImux5wY=
</data>
<key>popup.html</key>
<data>
zTk6QImmvcZjMYLQY8ek+cqSEWg=
</data>
<key>popup.js</key>
<data>
grmSQBg1aRbGzHHjd3TWHS/HbOY=
</data>
</dict>
<key>files2</key>
<dict>
<key>_locales/en/messages.json</key>
<dict>
<key>hash2</key>
<data>
4pOaVgBrOGGIoI81XdEOZidIyW9peYtz85HIYX7d1QE=
</data>
</dict>
<key>background.js</key>
<dict>
<key>hash2</key>
<data>
2S7ONYvdkGsryEavyrR7nMCTwsjNGqMV2BSWIxWLSYg=
</data>
</dict>
<key>content.js</key>
<dict>
<key>hash2</key>
<data>
9CYz6yZ8bRI2JRzRwnn4DOGuPuy2GSsOudXSZU6s1po=
</data>
</dict>
<key>embedded.mobileprovision</key>
<dict>
<key>hash2</key>
<data>
4TQyzTTz0VYUTM0IXf2PMSufVEkzd4WlPWbwKMyfKfQ=
</data>
</dict>
<key>images/cat_1.0.gif</key>
<dict>
<key>hash2</key>
<data>
65Ql3FhfivRMoMifbuY5KK8I/1rZx/Zmmwsx1La4OyI=
</data>
</dict>
<key>images/icon-128.png</key>
<dict>
<key>hash2</key>
<data>
TV8I8bcVP9rAnVA4AJRAWtkJveIenMpYsd/7+rsMLzo=
</data>
</dict>
<key>images/icon-256.png</key>
<dict>
<key>hash2</key>
<data>
kksdsW0Y1svz0bT0i3UzQGBmBDxJGr2eTCZmaqTS+XM=
</data>
</dict>
<key>images/icon-48.png</key>
<dict>
<key>hash2</key>
<data>
mBNPpZ78p0eH4WsNdF/EXw/sFHq5f8PqERARlLulYbY=
</data>
</dict>
<key>images/icon-512.png</key>
<dict>
<key>hash2</key>
<data>
waQn18oFc3GbhXXm2HEn6xFQk3HKehp9crGljWAMsGQ=
</data>
</dict>
<key>images/icon-64.png</key>
<dict>
<key>hash2</key>
<data>
CJwxajQk49Cd0RfR22yEPO6pjDbg+Aa4Ocxi+812CiM=
</data>
</dict>
<key>images/icon-96.png</key>
<dict>
<key>hash2</key>
<data>
zuzRjCepizxOWXh9ftCPth38GUxy1Ea/4zS3dw19OXo=
</data>
</dict>
<key>images/toolbar-icon-16.png</key>
<dict>
<key>hash2</key>
<data>
xmXH4YHb+Pq/YuC1e8JLIun93LuM3+/8MvB3r8oTKls=
</data>
</dict>
<key>images/toolbar-icon-19.png</key>
<dict>
<key>hash2</key>
<data>
qSX/1Ux4BOUIhixJK5NkvyTomLwp0yISfsQ97uF8/5g=
</data>
</dict>
<key>images/toolbar-icon-32.png</key>
<dict>
<key>hash2</key>
<data>
pGDg4NcSdD5EQaZgaiwxNosbSEXmZnpRc79RfitKc1c=
</data>
</dict>
<key>images/toolbar-icon-38.png</key>
<dict>
<key>hash2</key>
<data>
BUU3dwrCSvNOiFkBQWdPkrwASjUvxSxbizW+Izt3LBA=
</data>
</dict>
<key>images/toolbar-icon-48.png</key>
<dict>
<key>hash2</key>
<data>
JLZV5da+fZkfw0m2KfMqHSixWBCJvZoUNlt3la7gm54=
</data>
</dict>
<key>images/toolbar-icon-72.png</key>
<dict>
<key>hash2</key>
<data>
TwM7A1Bkuv4C3SWorFNwG+w38mWo3TaMtglLdDXxcFw=
</data>
</dict>
<key>manifest.json</key>
<dict>
<key>hash2</key>
<data>
+nWdvS9ap7YzpjqKSWsGUHP5K2irkTGozQX/tI4WrYc=
</data>
</dict>
<key>popup.css</key>
<dict>
<key>hash2</key>
<data>
LIfF3an8mzKIMD8PDhKILnrZBhxxSTzoZQKyRiyWuB0=
</data>
</dict>
<key>popup.html</key>
<dict>
<key>hash2</key>
<data>
9Ro1fCC5Meq0eSNrYab7V3uc4tNvmwRqMsCb1757M6Q=
</data>
</dict>
<key>popup.js</key>
<dict>
<key>hash2</key>
<data>
ruLXAORE+vDoLKPGBSkl7hnXv8V+ZexCoX3KvJyHxBk=
</data>
</dict>
</dict>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>

View File

@@ -0,0 +1,10 @@
{
"extension_name": {
"message": "OpenYoutube",
"description": "The display name for the extension."
},
"extension_description": {
"message": "Displays an Open in Youtube alert for sideloaded YT",
"description": "Description of what the extension does."
}
}

View File

@@ -0,0 +1,6 @@
browser.runtime.onMessage.addListener((request, sender, sendResponse) => {
console.log("Received request: ", request);
if (request.greeting === "hello")
sendResponse({ farewell: "goodbye" });
});

View File

@@ -0,0 +1,25 @@
browser.runtime.sendMessage({ greeting: "hello" }).then((response) => {
console.log("Received response: ", response);
});
browser.runtime.onMessage.addListener((request, sender, sendResponse) => {
console.log("Received request: ", request);
});
function afterNavigate() {
if ('/watch' === location.pathname) {
window.location.href = `youtube://${window.location.pathname.slice(1)}${
window.location.search
}${window.location.hash}`;
}
}
(document.body || document.documentElement).addEventListener('transitionend',
function(/*TransitionEvent*/ event) {
if (event.propertyName === 'width' && event.target.id === 'progress') {
afterNavigate();
}
}, true);
// After page load
afterNavigate();

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 454 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 569 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 919 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -0,0 +1,40 @@
{
"manifest_version": 2,
"default_locale": "en",
"name": "__MSG_extension_name__",
"description": "__MSG_extension_description__",
"version": "1.0",
"icons": {
"48": "images/icon-48.png",
"96": "images/icon-96.png",
"128": "images/icon-128.png",
"256": "images/icon-256.png",
"512": "images/icon-512.png"
},
"background": {
"scripts": [ "background.js" ],
"persistent": false
},
"content_scripts": [{
"js": [ "content.js" ],
"matches": [ "*://*.youtube.com/*" ]
}],
"browser_action": {
"default_popup": "popup.html",
"default_icon": {
"16": "images/toolbar-icon-16.png",
"19": "images/toolbar-icon-19.png",
"32": "images/toolbar-icon-32.png",
"38": "images/toolbar-icon-38.png",
"48": "images/toolbar-icon-48.png",
"72": "images/toolbar-icon-72.png"
}
},
"permissions": [ ]
}

View File

@@ -0,0 +1,15 @@
:root {
color-scheme: light dark;
}
body {
width: 100px;
padding: 10px;
font-family: system-ui;
text-align: center;
}
@media (prefers-color-scheme: dark) {
/* Dark Mode styles go here. */
}

View File

@@ -0,0 +1,21 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="popup.css">
<script type="module" src="popup.js"></script>
</head>
<style>
body {
background-image:url('images/cat_1.0.gif');
background-size:100%;
background-repeat: repeat-y;
background-attachment: fixed;
height:100%;
width:100%;
}
</style>
<body>
<strong>Extension made by @CokePokes</strong>
</body>
</html>

View File

@@ -0,0 +1 @@
console.log("Hello World!", browser);

20
Extensions/README.md Normal file
View File

@@ -0,0 +1,20 @@
# YoutubeExtensions
appex extensions for sideloaded YT
What is this?
These plugins enable "Open In" for sideloaded Youtube without any need to download other Opener apps /Shortcuts.
How to install:
1. Download the .appex files here
2. Unzip Youtube.ipa & copy them to /Payload/Youtube.app/Plugins
3. Compress Payload folder & rename .zip to .ipa
4. Sign & Install onto device
5. Open YouTube once & then open Safari to enable the iOS 15 safari plugin [prompted always allow - do it]
6. Press the Share icon in Safari scroll app list > More > Enable Youtube
Done!

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,157 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Base.lproj/MainInterface.storyboardc/Info.plist</key>
<data>
Bgt43YuQd48Y7NBkKAH/I1Nd+7Q=
</data>
<key>Base.lproj/MainInterface.storyboardc/UIViewController-j1y-V4-xli.nib</key>
<data>
t/rVTMy59WLCl0e0ydlT2JlJKIs=
</data>
<key>Base.lproj/MainInterface.storyboardc/j1y-V4-xli-view-wbc-yd-nQP.nib</key>
<data>
56s4vIzFNrq5HEvB3Mr6qnqVRFg=
</data>
<key>Info.plist</key>
<data>
7+n2S5sS/Ngeoe21gJMc6iC6+ac=
</data>
<key>embedded.mobileprovision</key>
<data>
dVGLS8Qpu/eCI1J5VCu9IfYq3Z4=
</data>
<key>icon.png</key>
<data>
/pip+c1EETgjhxNcOhgiyQxxzyU=
</data>
</dict>
<key>files2</key>
<dict>
<key>Base.lproj/MainInterface.storyboardc/Info.plist</key>
<dict>
<key>hash2</key>
<data>
Qnp5pVqL/lRCSEISDYZs1VBLxfcEnfpOzHg6WgcgLgk=
</data>
</dict>
<key>Base.lproj/MainInterface.storyboardc/UIViewController-j1y-V4-xli.nib</key>
<dict>
<key>hash2</key>
<data>
VpQww1vK2BoM0RIaiw/B/8JZ3kp5Pks5bM8Sjtjju9w=
</data>
</dict>
<key>Base.lproj/MainInterface.storyboardc/j1y-V4-xli-view-wbc-yd-nQP.nib</key>
<dict>
<key>hash2</key>
<data>
C87FO0vFlvhG8vp7+3v+EcR9kbOeu9v+mDLy/iU+6e8=
</data>
</dict>
<key>embedded.mobileprovision</key>
<dict>
<key>hash2</key>
<data>
4TQyzTTz0VYUTM0IXf2PMSufVEkzd4WlPWbwKMyfKfQ=
</data>
</dict>
<key>icon.png</key>
<dict>
<key>hash2</key>
<data>
mfufJ0CJyFLUpRnLC8q8awHkGqmWeQtRDgF5EBXKUQs=
</data>
</dict>
</dict>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>

View File

@@ -0,0 +1,7 @@
var GetURL = function() {};
GetURL.prototype = {
run: function(arguments) {
arguments.completionFunction({"URL": document.URL});
}
};
var ExtensionPreprocessingJS = new GetURL;

165
Header.h Normal file
View File

@@ -0,0 +1,165 @@
#import "Tweaks/YouTubeHeader/YTPlayerViewController.h" // Header.h
#import "Tweaks/YouTubeHeader/YTQTMButton.h" // Header.h
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <CaptainHook/CaptainHook.h>
#import <objc/runtime.h>
#import <dlfcn.h>
#import <sys/utsname.h>
#import <substrate.h>
#import <rootless.h>
#import "Tweaks/FLEX/FLEX.h"
#import "Tweaks/YouTubeHeader/YTVideoQualitySwitchOriginalController.h"
#import "Tweaks/YouTubeHeader/YTPlayerViewController.h"
#import "Tweaks/YouTubeHeader/YTWatchController.h"
#import "Tweaks/YouTubeHeader/YTIGuideResponse.h"
#import "Tweaks/YouTubeHeader/YTIGuideResponseSupportedRenderers.h"
#import "Tweaks/YouTubeHeader/YTIPivotBarSupportedRenderers.h"
#import "Tweaks/YouTubeHeader/YTIPivotBarRenderer.h"
#import "Tweaks/YouTubeHeader/YTIBrowseRequest.h"
#import "Tweaks/YouTubeHeader/YTCommonColorPalette.h"
#import "Tweaks/YouTubeHeader/ASCollectionView.h"
#import "Tweaks/YouTubeHeader/YTPlayerOverlay.h"
#import "Tweaks/YouTubeHeader/YTPlayerOverlayProvider.h"
#import "Tweaks/YouTubeHeader/YTReelWatchPlaybackOverlayView.h"
#import "Tweaks/YouTubeHeader/YTReelPlayerBottomButton.h"
#import "Tweaks/YouTubeHeader/YTReelPlayerViewController.h"
#import "Tweaks/YouTubeHeader/YTAlertView.h"
#import "Tweaks/YouTubeHeader/YTISectionListRenderer.h"
#import "Tweaks/YouTubeHeader/YTPivotBarItemView.h"
#define LOC(x) [tweakBundle localizedStringForKey:x value:nil table:nil]
#define YT_BUNDLE_ID @"com.google.ios.youtube"
#define YT_NAME @"YouTube"
// YTSpeed
@interface YTVarispeedSwitchControllerOption : NSObject
- (id)initWithTitle:(id)title rate:(float)rate;
@end
@interface MLHAMQueuePlayer : NSObject
@property id playerEventCenter;
@property id delegate;
- (void)setRate:(float)rate;
- (void)internalSetRate;
@end
@interface MLPlayerStickySettings : NSObject
- (void)setRate:(float)rate;
@end
@interface MLPlayerEventCenter : NSObject
- (void)broadcastRateChange:(float)rate;
@end
@interface HAMPlayerInternal : NSObject
- (void)setRate:(float)rate;
@end
// YTLitePlus
@interface YTChipCloudCell : UIView
@end
@interface YTPlayabilityResolutionUserActionUIController : NSObject // Skips content warning before playing *some videos - @PoomSmart
- (void)confirmAlertDidPressConfirm;
@end
@interface YTMainAppControlsOverlayView: UIView
@end
@interface YTTransportControlsButtonView : UIView
@end
@interface YTPlaybackButton : UIControl
@end
@interface YTSegmentableInlinePlayerBarView
@property (nonatomic, assign, readwrite) BOOL enableSnapToChapter;
@end
// Cercube button in Nav bar
@interface MDCButton : UIButton
@end
@interface YTRightNavigationButtons : UIView
@property (nonatomic, strong, readwrite) MDCButton *cercubeButton;
@property YTQTMButton *notificationButton;
@property YTQTMButton *sponsorBlockButton;
@end
// IAmYouTube
@interface SSOConfiguration : NSObject
@end
// BigYTMiniPlayer
@interface YTMainAppVideoPlayerOverlayView : UIView
- (UIViewController *)_viewControllerForAncestor;
@end
@interface YTWatchMiniBarView : UIView
@end
// YTAutoFullscreen
@interface YTPlayerViewController (YTAFS)
- (void)autoFullscreen;
@end
// YTNoShorts
@interface ELMCellNode
@end
@interface _ASCollectionViewCell : UICollectionViewCell
- (id)node;
@end
@interface YTAsyncCollectionView : UICollectionView
- (void)removeShortsCellAtIndexPath:(NSIndexPath *)indexPath;
@end
@interface YTPlayerView : UIView
- (void)downloadVideo;
@end
// App Theme
@interface YCHLiveChatView : UIView
@end
@interface YTFullscreenEngagementOverlayView : UIView
@end
@interface YTRelatedVideosView : UIView
@end
@interface ELMView: UIView
@end
@interface ASWAppSwitcherCollectionViewCell: UIView
@end
@interface ASScrollView : UIView
@end
@interface UIKeyboardLayoutStar : UIView
@end
@interface UIKeyboardDockView : UIView
@end
@interface _ASDisplayView : UIView
@end
@interface YTCommentDetailHeaderCell : UIView
@end
@interface SponsorBlockSettingsController : UITableViewController
@end
@interface SponsorBlockViewController : UIViewController
@end
@interface UICandidateViewController : UIViewController
@end
@interface UIPredictionViewController : UIViewController
@end

42
Makefile Normal file
View File

@@ -0,0 +1,42 @@
TARGET = iphone:clang:15.5:14.0
YTLitePlus_USE_FISHHOOK = 0
ARCHS = arm64
MODULES = jailed
FINALPACKAGE = 1
CODESIGN_IPA = 0
PACKAGE_VERSION = 18.23.3-2.0
TWEAK_NAME = YTLitePlus
DISPLAY_NAME = YouTube
BUNDLE_ID = com.google.ios.youtube
EXTRA_CFLAGS := $(addprefix -I,$(shell find Tweaks/FLEX -name '*.h' -exec dirname {} \;))
YTLitePlus_INJECT_DYLIBS = .theos/obj/libcolorpicker.dylib .theos/obj/iSponsorBlock.dylib .theos/obj/YTUHD.dylib .theos/obj/YouPiP.dylib .theos/obj/YouTubeDislikesReturn.dylib .theos/obj/YTABConfig.dylib .theos/obj/YouMute.dylib .theos/obj/DontEatMyContent.dylib .theos/obj/YTHoldForSpeed.dylib .theos/obj/YTLite.dylib
YTLitePlus_FILES = YTLitePlus.xm $(shell find Source -name '*.xm' -o -name '*.x' -o -name '*.m') $(shell find Tweaks/FLEX -type f \( -iname \*.c -o -iname \*.m -o -iname \*.mm \))
YTLitePlus_IPA = ./tmp/Payload/YouTube.app
YTLitePlus_CFLAGS = -fobjc-arc -Wno-deprecated-declarations -Wno-unsupported-availability-guard -Wno-unused-but-set-variable -DTWEAK_VERSION=$(PACKAGE_VERSION) $(EXTRA_CFLAGS)
YTLitePlus_FRAMEWORKS = UIKit Security
include $(THEOS)/makefiles/common.mk
include $(THEOS_MAKE_PATH)/tweak.mk
SUBPROJECTS += Tweaks/Alderis Tweaks/iSponsorBlock Tweaks/YTUHD Tweaks/YouPiP Tweaks/Return-YouTube-Dislikes Tweaks/YTABConfig Tweaks/YouMute Tweaks/DontEatMyContent Tweaks/YTLite Tweaks/YTHoldForSpeed
include $(THEOS_MAKE_PATH)/aggregate.mk
before-package::
@echo -e "==> \033[1mMoving tweak's bundle to Resources/...\033[0m"
@mkdir -p Resources/Frameworks/Alderis.framework && find .theos/obj/install/Library/Frameworks/Alderis.framework -maxdepth 1 -type f -exec cp {} Resources/Frameworks/Alderis.framework/ \;
@cp -R Tweaks/YTLite/layout/Library/Application\ Support/YTLite.bundle Resources/
@cp -R Tweaks/YTUHD/layout/Library/Application\ Support/YTUHD.bundle Resources/
@cp -R Tweaks/YouPiP/layout/Library/Application\ Support/YouPiP.bundle Resources/
@cp -R Tweaks/Return-YouTube-Dislikes/layout/Library/Application\ Support/RYD.bundle Resources/
@cp -R Tweaks/YTABConfig/layout/Library/Application\ Support/YTABC.bundle Resources/
@cp -R Tweaks/YouMute/layout/Library/Application\ Support/YouMute.bundle Resources/
@cp -R Tweaks/DontEatMyContent/layout/Library/Application\ Support/DontEatMyContent.bundle Resources/
@cp -R Tweaks/YTHoldForSpeed/layout/Library/Application\ Support/YTHoldForSpeed.bundle Resources/
@cp -R Tweaks/iSponsorBlock/layout/Library/Application\ Support/iSponsorBlock.bundle Resources/
@cp -R lang/YTLitePlus.bundle Resources/
@echo -e "==> \033[1mChanging the installation path of dylibs...\033[0m"
@ldid -r .theos/obj/iSponsorBlock.dylib && install_name_tool -change /usr/lib/libcolorpicker.dylib @rpath/libcolorpicker.dylib .theos/obj/iSponsorBlock.dylib
@codesign --remove-signature .theos/obj/libcolorpicker.dylib && install_name_tool -change /Library/Frameworks/Alderis.framework/Alderis @rpath/Alderis.framework/Alderis .theos/obj/libcolorpicker.dylib

302
README.md Normal file
View File

@@ -0,0 +1,302 @@
## Cercube with extra features!
![IMAGE_CERCUBEPLUS_PREVIEW](https://gcdnb.pbrd.co/images/PnpTdZf0IXbd.png)
<p align="center">
<img src="https://img.shields.io/badge/Platform-iOS%20%7C%20iPadOS%2014.0%2B-yellow" alt="Badge"/>
</p>
<p align="center">
<a href="https://github.com/Balackburn/CercubePlusExtra/releases/latest"><img src="https://custom-icon-badges.demolab.com/github/v/release/arichorn/CercubePlusExtra?color=brightgreen&label=Latest%20release" alt="Badge"></img></a>
<a href="https://github.com/Balackburn/CercubePlusExtra/releases/latest"><img src="https://img.shields.io/github/downloads/arichorn/CercubePlusExtra/total?label=Download" alt="Badge"></img></a>
<a href="https://github.com/Balackburn/CercubePlusExtra/commit"><img src="https://custom-icon-badges.demolab.com/github/last-commit/arichorn/CercubePlusExtra?logo=history&logoColor=white&label=Last commit" alt="Badge"></img></a>
</p>
<p align="center">
<img src="https://img.shields.io/github/stars/arichorn/CercubePlusExtra?style=social" alt="Badge"/>
<img src="https://img.shields.io/github/forks/arichorn/CercubePlusExtra?style=social" alt="Badge"/>
<a href="https://github.com/qnblackcat/uYouPlus#support-the-developers"><img src="https://img.shields.io/badge/-Support-lightgrey?style=social&logo=paypal" alt="Badge"></img></a>
</p>
# Table of Contents
* [Credits](#credits)
* [Features](#features)
* [Known issues](#known-issues)
* [Download (IPA)](#download-ipa)
* [Support the developers!](#support-the-developers)
* [Building (optional)](#building-optional)
# Credits
<table id='maintainer credit'>
Special thanks to these developer(s) for maintaining and improving CercubePlus (@qnblackcat is the OG dev)
<tr>
<td id='arichorn'>
<a href='https://github.com/arichorn'>
<img src='https://github.com/arichorn.png' width='140px;'>
</a>
<h4 align='center'><a href='https://github.com/arichorn'>arichorn</a></h4>
</td>
<td id='qnblackcat'>
<a href='https://github.com/qnblackcat'>
<img src='https://github.com/qnblackcat.png' width='140px;'>
</a>
<h4 align='center'><a href='https://github.com/qnblackcat'>Qnblackcat</a></h4>
</td>
<td id='dayanch96'>
<a href='https://github.com/dayanch96'>
<img src='https://github.com/dayanch96.png' width='140px;'>
</a>
<h4 align='center'><a href='https://github.com/dayanch96'>dayanch96</a></h4>
</td>
<td id='ssuesskind'>
<a href='https://github.com/ssuesskind'>
<img src='https://github.com/ssuesskind.png' width='140px;'>
</a>
<h4 align='center'><a href='https://github.com/ssuesskind'>ssuesskind</a></h4>
</td>
<table id='credit'>
Special thanks to all the developers who have contributed to CercubePlus/CercubePlusExtra!
(Cercube is an original tweak by Majd Alfhaily @majd)
<tr>
<td id='majd'>
<a href='https://github.com/majd'>
<img src='https://github.com/majd.png' width='140px;'>
</a>
<h4 align='center'><a href='https://github.com/majd'>Majd Alfhaily</a></h4>
</td>
<td id='PoomSmart'>
<a href='https://github.com/PoomSmart'>
<img src='https://github.com/PoomSmart.png' width='140px;'>
</a>
<h4 align='center'><a href='https://github.com/PoomSmart'>PoomSmart</a></h4>
</td>
<td id='miro92'>
<a href='https://github.com/MiRO92'>
<img src='https://github.com/MiRO92.png' width='140px;'>
</a>
<h4 align='center'><a href='https://twitter.com/miro92'>MiRO92</a></h4>
</td>
<td id='level3tjg'>
<a href='https://github.com/level3tjg'>
<img src='https://github.com/level3tjg.png' width='140px;'>
</a>
<h4 align='center'><a href='https://twitter.com/level3tjg'>level3tjg</a></h4>
</td>
<td id='bandarHL'>
<a href='https://github.com/BandarHL'>
<img src='https://github.com/BandarHL.png' width='140px;'>
</a>
<h4 align='center'><a href='https://twitter.com/bandarhl'>BandarHelal</a></h4>
</td>
<td id='galactic-dev'>
<a href='https://github.com/Galactic-Dev'>
<img src='https://github.com/Galactic-Dev.png' width='140px;'>
</a>
<h4 align='center'><a href='https://twitter.com/dev_galactic'>galactic</a></h4>
</td>
</tr>
<tr>
<td id='hbang'>
<a href='https://github.com/hbang'>
<img src='https://github.com/hbang.png' width='140px;'>
</a>
<h4 align='center'><a href='https://twitter.com/hashbang'>HASHBANG</a></h4>
</td>
<td id='lyvendia'>
<a href='https://github.com/Lyvendia'>
<img src='https://github.com/Lyvendia.png' width='140px;'>
</a>
<h4 align='center'><a href='https://github.com/Lyvendia'>Lyvendia</a></h4>
</td>
<td id='foxster'>
<a href='https://github.com/therealFoxster'>
<img src='https://github.com/therealFoxster.png' width='140px;'>
</a>
<h4 align='center'><a href='https://twitter.com/therealFoxster'>Foxster</a></h4>
</td>
<td id='julioverne'>
<a href='https://github.com/julioverne'>
<img src='https://github.com/julioverne.png' width='140px;'>
</a>
<h4 align='center'><a href='https://twitter.com/ijulioverne'>julioverne</a></h4>
</td>
<td id='ichitaso'>
<a href='https://github.com/ichitaso'>
<img src='https://github.com/ichitaso.png' width='140px;'>
</a>
<h4 align='center'><a href='https://twitter.com/ichitaso'>ichitaso</a></h4>
</td>
</tr>
<tr>
<td id='ahmed-bafkir'>
<a href='https://github.com/AhmedBafkir'>
<img src='https://github.com/AhmedBafkir.png' width='140px;'>
</a>
<h4 align='center'><a href='https://twitter.com/Peaceful_0'>Ahmed Bafkir</a></h4>
</td>
<td id='cokepokes'>
<a href='https://github.com/CokePokes'>
<img src='https://github.com/CokePokes.png' width='140px;'>
</a>
<h4 align='center'><a href='https://twitter.com/cokepokes'>CokePokes</a></h4>
</td>
<td id='isnackable'>
<a href='https://github.com/ISnackable'>
<img src='https://github.com/ISnackable.png' width='140px;'>
</a>
<h4 align='center'><a href='https://isnackable.me/'>Tommy Teo</a></h4>
</td>
<td id='SKIEDs'>
<a href='https://github.com/SKEIDs'>
<img src='https://github.com/SKEIDs.png' width='140px;'>
</a>
<h4 align='center'><a href='https://github.com/SKEIDs'>SKIEDs</a></h4>
</td>
<td id='theos-team'>
<a href='https://github.com/theos/theos'>
<img src='https://github.com/theos.png' width='140px;'>
</a>
<h4 align='center'><a href='https://theos.dev'>theos</a></h4>
</td>
</tr>
</table>
# Features
1. **Cercube:**
- Block all advertisements & Enable background playback.
- Set default player quality on WiFi & Celullar.
- Save videos in high resolution, save videos as audio-only, save public playlists (beta).
- And many more...
2. **iSponsorBlock:** Skips annoying sponsor ads inside videos. iSponsorBlock is based on [SponsorBlock engine](https://sponsor.ajay.app/). Basically, this is the iOS version of the SponsorBlock extension.
3. **YouPiP:** enable YouTube's **native PiP**. More options are in YouTube Settings => General.
4. **YTUHD:** unlock VP9 codec and in effect, enables video quality of 2K and 4K. You can configure YTUHD in YouTube's Settings - Video quality preferences.
5. **YouTube Dislike Return:** brings back Dislike counts under YouTube videos using **ReturnYoutubeDislike**'s API.
<details>
<summary>and many more...!</summary>
6. **YTClassicVideoQuality:** since YouTube v16.xx, you need one more step to change the video quality. YTClassicVideoQuality brings back the old video quality selector, which is a lot better than the new one.
7. **YTNoHoverCards:** offer an option to enable/disable the annoying suggested videos show up at the end of the videos.
8. **YTABGoodies:** allow you to disable some YouTube A/B testing features. It is a combination of several tweaks, such as:
- YouAreThere: disable "Video paused. Continue watching?" popup in the YouTube app when you play a long video.
- YouRememberCaption: make YouTube remember your video caption setting (if not already).
- YTNoCheckLocalNetwork: block the Local Network permission popup.
9. **NOYTPremium:** remove YouTube Premium upsell alerts.
10. **YTSpeed**: a toggleable tweak to add 2.25x, 2.5x, 2.75x, 3x, 3.25x, 3.5x, 3.75x, 4x & 5x playback speed options in the video player.
11. **YTMiniplayerEnabler**: enable Miniplayer for all YouTube videos.
12. **DontEatMyContent**: prevent the notch/Dynamic Island from munching on 2:1 video content in YouTube.
13. **YTShortsProgress**: always enable progress bar and scrubbing in YouTube Shorts (iPhone only).
14. **YTABConfig**: allow user to control over YouTube A/B testing flags.
15. **YouMute**: Mute/unmute videos in the YouTube Video Player directly.
16. **LowContrastMode**: makes the YouTube Interface Low Contrast as possible to make it easier on the eyes.
any many more...
</details>
# Known issues
1. **Cercube**:
- Hide Cast button is not working. (Workaround: Hide cast button in CercubePlus settings)
- The Updated Dark Mode in the YouTube App is not Present or Working in Cercube v5.3.13 & older versions
2. **LowContrastMode**: this tweak doesn't work everywhere with every ui element on the YouTube App.
3. **YTUHD**: [Stuttering on 4K videos](https://github.com/qnblackcat/uYouPlus/issues/6).
4. **YouPiP** (iOS 14.0 - 14.4.2): due to Apple's fault, you may encounter the *speedup-bug* as described [here](https://drive.google.com/file/d/1NKdv1fr_KRWgD8nhkMDfG2eLBnbdeVtX/view?usp=sharing). The bug also happens when you try to play multi-sources of sound at the same time. Enable **LegacyPiP** is a workaround. Keep in mind that LegacyPiP also removes UHD quality and breaks YouTube Autoplay next. Use it at your own risk!
5. **Not a bug**:
- The app won't be able to receive push notifications if you use a free developer account to sideload it.
- It's impossible to fix deep-link (a.k.a Open in the YouTube app). However, you can use this [Shortcuts](https://shortcutsgallery.com/shortcuts/open-in-youtube/) as a workaround (tested on iOS 14). **Credit:** RandomAccessMemories#5025
# Download (IPA)
- **CercubePlus** (or you can call it Cercube+) requires iOS & iPadOS 14.0 and later. The latest version of **CercubePlus** can be found in the [Release tab](https://github.com/Balackburn/CercubePlusExtra/releases/latest).
- For AltStore user: [Open in AltStore (v18.18.2-5.3.11)](https://tinyurl.com/5a5jn7ra) - It will take a while to install because AltStore needs to download the IPA first.
<details>
<summary>Alternative Download</summary>
[Open in AltStore (v18.14.1-5.3.11-F2)](https://tinyurl.com/4exxknn8) - This is the **v18.14.1-5.3.11-F2** release. only use this to resolve the OLED/OLD Dark Mode Problem.
</details>
- Version info: _(May 9 2023)_
<details>
<summary>Expand!</summary>
| **Tweaks/App** | **Developer** | **Version** | **Open source** |
| - | - | :-: | :-: |
| **YouTube** | Google Inc | 18.21.3 | ✖︎ |
| **Cercube** | Majd Alfhaily | 5.3.11 | ✖︎ |
| **Open in YouTube** | [CokePokes](https://github.com/CokePokes/) | 1.2 | ✖︎ |
| **YTNoShorts** | [MiRO92](https://twitter.com/miro92) | 1.0.2 | [✔︎](https://github.com/MiRO92/YTNoShorts) |
| **iSponsorBlock** | [Galactic-Dev](https://github.com/Galactic-Dev) | 1.0-15 | [✔︎](https://github.com/Galactic-Dev/iSponsorBlock) |
| **BigYTMiniPlayer** | [Galactic-Dev](https://github.com/Galactic-Dev) | 1.0-1 | [✔︎](https://github.com/Galactic-Dev/BigYTMiniPlayer) |
| **YTNoHoverCards** | [level3tjg](https://twitter.com/level3tjg) | 0.0.3 | [✔︎](https://github.com/level3tjg/YTNoHoverCards) |
| **YTMiniplayerEnabler** | [level3tjg](https://twitter.com/level3tjg) | 0.0.2 | [✔︎](https://github.com/level3tjg/YTMiniplayerEnabler) |
| **DontEatMyContent** | [therealFoxster](https://github.com/therealFoxster) | 1.0.6 | [✔︎](https://github.com/therealFoxster/DontEatMyContent) |
| **LowContrastMode** | arichorn | 1.2.3 | [✔︎](https://github.com/arichorn/LowContrastMode) |
| **YTUHD** | PoomSmart | 1.4.0 | [✔︎](https://github.com/PoomSmart/YTUHD) |
| **YouPiP** | PoomSmart | 1.7.19-2 | [✔︎](https://github.com/PoomSmart/YouPiP) |
| **YouMute** | PoomSmart | 1.1.1-1 | [✔︎](https://github.com/PoomSmart/YouMute) |
| **YTABConfig** | PoomSmart | 1.5.0-1 | [✔︎](https://github.com/PoomSmart/YTABConfig) |
| **IAmYouTube** | PoomSmart | 1.2.0 | [✔︎](https://github.com/PoomSmart/IAmYouTube) |
| **YTReExplore** | PoomSmart | 1.0.2 | [✔︎](https://github.com/PoomSmart/YTReExplore) |
| **NoYTPremium** | PoomSmart | 1.0.4 | [✔︎](https://github.com/PoomSmart/NoYTPremium) |
| **YTNoPaidPromo** | PoomSmart | 1.0.0 | [✔︎](https://github.com/PoomSmart/YTNoPaidPromo) |
| **YTAutoFullScreen** | PoomSmart | 1.0.3 | [✔︎](https://github.com/PoomSmart/YTAutoFullScreen) |
| **YTShortsProgress** | PoomSmart | 1.0.2 | [✔︎](https://github.com/PoomSmart/YTShortsProgress) |
| **Return YouTube Dislike** | PoomSmart | 1.11.3 | [✔︎](https://github.com/PoomSmart/Return-YouTube-Dislikes) |
</details>
# Support the developers
- [**MiRO92**](https://twitter.com/miro92): https://github.com/MiRO92/uYou-for-YouTube#support
- [**level3tjg**](https://twitter.com/level3tjg): https://ko-fi.com/level3tjg
- [**BandarHL**](https://twitter.com/bandarhl): https://www.paypal.com/paypalme/BandarHL
- [**julioverne**](https://twitter.com/ijulioverne): https://www.patreon.com/julioverne
- [**Galactic-dev**](https://twitter.com/dev_galactic):
- Paypal: https://www.paypal.com/paypalme/DBrett684
- Venmo: https://venmo.com/u/DavidBrett
# Building(s) (optional)
See [CercubePlusExtra/Building - Wiki](https://github.com/Balackburn/CercubePlusExtra/wiki/Building)
or Another Version [uYouPlus/Building - Wiki](https://github.com/qnblackcat/uYouPlus/wiki/Building)

42
Source/Download.xm.bak Normal file
View File

@@ -0,0 +1,42 @@
// Code has been disabled due to some compiling errors.
#import "../Header.h"
%ctor {
void $YTPlayerView_downloadVideo_register();
void $YTPlayerView_layoutSubviews$_register();
}
#ifndef YTPLAYERVIEW_DOWNLOADVIDEO_REGISTER
#ifndef YTPLAYERVIEW_LAYOUTSUBVIEWS_REGISTER
#define YTPLAYERVIEW_DOWNLOADVIDEO_REGISTER
#define YTPLAYERVIEW_LAYOUTSUBVIEWS_REGISTER
void $YTPlayerView_downloadVideo_register();
void $YTPlayerView_layoutSubviews$_register();
#endif
// YouTube Video Downloading
CHDeclareClass(YTPlayerView);
CHOptimizedMethod1(self, void, YTPlayerView, layoutSubviews, BOOL, arg1)
{
CHSuper1(YTPlayerView, layoutSubviews, arg1);
CGRect downloadButtonFrame = CGRectMake(0, 0, 100, 50);
UIButton *downloadButton = [[UIButton alloc] initWithFrame:downloadButtonFrame];
[downloadButton setTitle:@"Download" forState:UIControlStateNormal];
[downloadButton addTarget:self action:@selector(downloadVideo) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:downloadButton];
}
CHOptimizedMethod0(self, void, YTPlayerView, downloadVideo)
{
NSString *videoUrlString = @"[Insert YouTube video URL here]";
NSURL *videoUrl = [NSURL URLWithString:videoUrlString];
NSData *videoData = [NSData dataWithContentsOfURL:videoUrl];
// Save the video data to a file
NSString *filePath = @"[Insert file path here]";
[videoData writeToFile:filePath atomically:YES];
}

1160
Source/LowContrastMode.xm Normal file

File diff suppressed because it is too large Load Diff

746
Source/Settings.xm Normal file
View File

@@ -0,0 +1,746 @@
#import "../Tweaks/YouTubeHeader/YTSettingsViewController.h"
#import "../Tweaks/YouTubeHeader/YTSearchableSettingsViewController.h"
#import "../Tweaks/YouTubeHeader/YTSettingsSectionItem.h"
#import "../Tweaks/YouTubeHeader/YTSettingsSectionItemManager.h"
#import "../Tweaks/YouTubeHeader/YTUIUtils.h"
#import "../Tweaks/YouTubeHeader/YTSettingsPickerViewController.h"
#import "../Header.h"
static BOOL IsEnabled(NSString *key) {
return [[NSUserDefaults standardUserDefaults] boolForKey:key];
}
static int GetSelection(NSString *key) {
return [[NSUserDefaults standardUserDefaults] integerForKey:key];
}
static int colorContrastMode() {
return [[NSUserDefaults standardUserDefaults] integerForKey:@"lcmColor"];
}
static const NSInteger YTLitePlusSection = 500;
@interface YTSettingsSectionItemManager (YTLitePlus)
- (void)updateYTLitePlusSectionWithEntry:(id)entry;
@end
extern NSBundle *YTLitePlusBundle();
// Settings
%hook YTAppSettingsPresentationData
+ (NSArray *)settingsCategoryOrder {
NSArray *order = %orig;
NSMutableArray *mutableOrder = [order mutableCopy];
NSUInteger insertIndex = [order indexOfObject:@(1)];
if (insertIndex != NSNotFound)
[mutableOrder insertObject:@(YTLitePlusSection) atIndex:insertIndex + 1];
return mutableOrder;
}
%end
%hook YTSettingsSectionController
- (void)setSelectedItem:(NSUInteger)selectedItem {
if (selectedItem != NSNotFound) %orig;
}
%end
%hook YTSettingsSectionItemManager
%new(v@:@)
- (void)updateYTLitePlusSectionWithEntry:(id)entry {
NSMutableArray *sectionItems = [NSMutableArray array];
NSBundle *tweakBundle = YTLitePlusBundle();
Class YTSettingsSectionItemClass = %c(YTSettingsSectionItem);
YTSettingsViewController *settingsViewController = [self valueForKey:@"_settingsViewControllerDelegate"];
YTSettingsSectionItem *main = [%c(YTSettingsSectionItem)
itemWithTitle:[NSString stringWithFormat:LOC(@"VERSION"), @(OS_STRINGIFY(TWEAK_VERSION))]
titleDescription:LOC(@"VERSION_CHECK")
accessibilityIdentifier:nil
detailTextBlock:nil
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/Balackburn/YTLitePlusExtra/releases/latest"]];
}];
[sectionItems addObject:main];
# pragma mark - VideoPlayer
YTSettingsSectionItem *videoPlayerGroup = [YTSettingsSectionItemClass itemWithTitle:LOC(@"VIDEO_PLAYER_OPTIONS") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
NSArray <YTSettingsSectionItem *> *rows = @[
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"AUTO_FULLSCREEN")
titleDescription:LOC(@"AUTO_FULLSCREEN_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"autoFull_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"autoFull_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"TAP_TO_SKIP")
titleDescription:LOC(@"TAP_TO_SKIP_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"tapToSkip_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"tapToSkip_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"SNAP_TO_CHAPTER")
titleDescription:LOC(@"SNAP_TO_CHAPTER_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"snapToChapter_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"snapToChapter_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"PINCH_TO_ZOOM")
titleDescription:LOC(@"PINCH_TO_ZOOM_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"pinchToZoom_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"pinchToZoom_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"YT_MINIPLAYER")
titleDescription:LOC(@"YT_MINIPLAYER_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"ytMiniPlayer_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"ytMiniPlayer_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"STOCK_VOLUME_HUD")
titleDescription:LOC(@"STOCK_VOLUME_HUD_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"stockVolumeHUD_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"stockVolumeHUD_enabled"];
return YES;
}
settingItemId:0]
];
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"VIDEO_PLAYER_OPTIONS") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
[settingsViewController pushViewController:picker];
return YES;
}];
[sectionItems addObject:videoPlayerGroup];
# pragma mark - Video Controls Overlay Options
YTSettingsSectionItem *videoControlOverlayGroup = [YTSettingsSectionItemClass itemWithTitle:LOC(@"VIDEO_CONTROLS_OVERLAY_OPTIONS") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
NSArray <YTSettingsSectionItem *> *rows = @[
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"ENABLE_SHARE_BUTTON")
titleDescription:LOC(@"ENABLE_SHARE_BUTTON_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"enableShareButton_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"enableShareButton_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"ENABLE_SAVE_TO_PLAYLIST_BUTTON")
titleDescription:LOC(@"ENABLE_SAVE_TO_PLAYLIST_BUTTON_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"enableSaveToButton_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"enableSaveToButton_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_AUTOPLAY_SWITCH")
titleDescription:LOC(@"HIDE_AUTOPLAY_SWITCH_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"hideAutoplaySwitch_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideAutoplaySwitch_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_SUBTITLES_BUTTON")
titleDescription:LOC(@"HIDE_SUBTITLES_BUTTON_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"hideCC_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideCC_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_HUD_MESSAGES")
titleDescription:LOC(@"HIDE_HUD_MESSAGES_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"hideHUD_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideHUD_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_PAID_PROMOTION_CARDS")
titleDescription:LOC(@"HIDE_PAID_PROMOTION_CARDS_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"hidePaidPromotionCard_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hidePaidPromotionCard_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_CHANNEL_WATERMARK")
titleDescription:LOC(@"HIDE_CHANNEL_WATERMARK_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"hideChannelWatermark_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideChannelWatermark_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_SHADOW_OVERLAY_BUTTONS")
titleDescription:LOC(@"HIDE_SHADOW_OVERLAY_BUTTONS_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"hideVideoPlayerShadowOverlayButtons_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideVideoPlayerShadowOverlayButtons_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_PREVIOUS_AND_NEXT_BUTTON")
titleDescription:LOC(@"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"hidePreviousAndNextButton_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hidePreviousAndNextButton_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"REPLACE_PREVIOUS_NEXT_BUTTON")
titleDescription:LOC(@"REPLACE_PREVIOUS_NEXT_BUTTON_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"replacePreviousAndNextButton_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"replacePreviousAndNextButton_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"RED_PROGRESS_BAR")
titleDescription:LOC(@"RED_PROGRESS_BAR_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"redProgressBar_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"redProgressBar_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"DISABLE_VIDEO_PLAYER_ZOOM")
titleDescription:LOC(@"DISABLE_VIDEO_PLAYER_ZOOM")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"disableVideoPlayerZoom_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"disableVideoPlayerZoom_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_HOVER_CARD")
titleDescription:LOC(@"HIDE_HOVER_CARD_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"hideHoverCards_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideHoverCards_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_RIGHT_PANEL")
titleDescription:LOC(@"HIDE_RIGHT_PANEL_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"hideRightPanel_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideRightPanel_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_HEATWAVES")
titleDescription:LOC(@"HIDE_HEATWAVES_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"hideHeatwaves_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideHeatwaves_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_DARK_OVERLAY_BACKGROUND")
titleDescription:LOC(@"HIDE_DARK_OVERLAY_BACKGROUND_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"hideOverlayDarkBackground_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideOverlayDarkBackground_enabled"];
return YES;
}
settingItemId:0]
];
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"VIDEO_CONTROLS_OVERLAY_OPTIONS") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
[settingsViewController pushViewController:picker];
return YES;
}];
[sectionItems addObject:videoControlOverlayGroup];
# pragma mark - Shorts Controls Overlay Options
YTSettingsSectionItem *shortsControlOverlayGroup = [YTSettingsSectionItemClass itemWithTitle:LOC(@"SHORTS_CONTROLS_OVERLAY_OPTIONS") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
NSArray <YTSettingsSectionItem *> *rows = @[
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_SHORTS_VIDEOS")
titleDescription:LOC(@"HIDE_SHORTS_VIDEOS_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"hideShorts_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideShorts_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_SHORTS_CHANNEL_AVATAR")
titleDescription:LOC(@"HIDE_SHORTS_CHANNEL_AVATAR_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"hideShortsChannelAvatar_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideShortsChannelAvatar_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_SHORTS_LIKE_BUTTON")
titleDescription:LOC(@"HIDE_SHORTS_LIKE_BUTTON_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"hideShortsLikeButton_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideShortsLikeButton_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_SHORTS_DISLIKE_BUTTON")
titleDescription:LOC(@"HIDE_SHORTS_DISLIKE_BUTTON_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"hideShortsDislikeButton_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideShortsDislikeButton_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_SHORTS_COMMENT_BUTTON")
titleDescription:LOC(@"HIDE_SHORTS_COMMENT_BUTTON_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"hideShortsCommentButton_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideShortsCommentButton_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_SHORTS_REMIX_BUTTON")
titleDescription:LOC(@"HIDE_SHORTS_REMIX_BUTTON_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"hideShortsRemixButton_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideShortsRemixButton_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_SHORTS_SHARE_BUTTON")
titleDescription:LOC(@"HIDE_SHORTS_SHARE_BUTTON_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"hideShortsShareButton_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideShortsShareButton_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_SUPER_THANKS")
titleDescription:LOC(@"HIDE_SUPER_THANKS_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"hideBuySuperThanks_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideBuySuperThanks_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_SUBSCRIPTIONS")
titleDescription:LOC(@"HIDE_SUBSCRIPTIONS_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"hideSubscriptions_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideSubscriptions_enabled"];
return YES;
}
settingItemId:0]
];
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"SHORTS_CONTROLS_OVERLAY_OPTIONS") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
[settingsViewController pushViewController:picker];
return YES;
}];
[sectionItems addObject:shortsControlOverlayGroup];
# pragma mark - LowContrastMode
YTSettingsSectionItem *lowContrastModeSection = [YTSettingsSectionItemClass itemWithTitle:LOC(@"LCM_CHOOSE_COLOR")
accessibilityIdentifier:nil
detailTextBlock:^NSString *() {
switch (colorContrastMode()) {
case 1:
return LOC(@"RED_UI");
case 2:
return LOC(@"BLUE_UI");
case 3:
return LOC(@"GREEN_UI");
case 4:
return LOC(@"YELLOW_UI");
case 5:
return LOC(@"ORANGE_UI");
case 6:
return LOC(@"PURPLE_UI");
case 7:
return LOC(@"VIOLET_UI");
case 8:
return LOC(@"PINK_UI");
case 0:
default:
return LOC(@"DEFAULT_UI");
}
}
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
NSArray <YTSettingsSectionItem *> *rows = @[
[YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"DEFAULT_UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
[[NSUserDefaults standardUserDefaults] setInteger:0 forKey:@"lcmColor"];
[settingsViewController reloadData];
return YES;
}],
[YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"RED_UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
[[NSUserDefaults standardUserDefaults] setInteger:1 forKey:@"lcmColor"];
[settingsViewController reloadData];
return YES;
}],
[YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"BLUE_UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
[[NSUserDefaults standardUserDefaults] setInteger:2 forKey:@"lcmColor"];
[settingsViewController reloadData];
return YES;
}],
[YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"GREEN_UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
[[NSUserDefaults standardUserDefaults] setInteger:3 forKey:@"lcmColor"];
[settingsViewController reloadData];
return YES;
}],
[YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"YELLOW_UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
[[NSUserDefaults standardUserDefaults] setInteger:4 forKey:@"lcmColor"];
[settingsViewController reloadData];
return YES;
}],
[YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"ORANGE_UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
[[NSUserDefaults standardUserDefaults] setInteger:5 forKey:@"lcmColor"];
[settingsViewController reloadData];
return YES;
}],
[YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"PURPLE_UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
[[NSUserDefaults standardUserDefaults] setInteger:6 forKey:@"lcmColor"];
[settingsViewController reloadData];
return YES;
}],
[YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"VIOLET_UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
[[NSUserDefaults standardUserDefaults] setInteger:7 forKey:@"lcmColor"];
[settingsViewController reloadData];
return YES;
}],
[YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"PINK_UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
[[NSUserDefaults standardUserDefaults] setInteger:8 forKey:@"lcmColor"];
[settingsViewController reloadData];
return YES;
}]
];
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"LCM_CHOOSE_COLOR") pickerSectionTitle:nil rows:rows selectedItemIndex:colorContrastMode() parentResponder:[self parentResponder]];
[settingsViewController pushViewController:picker];
return YES;
}];
# pragma mark - Theme
YTSettingsSectionItem *themeGroup = [YTSettingsSectionItemClass itemWithTitle:LOC(@"THEME_OPTIONS")
accessibilityIdentifier:nil
detailTextBlock:^NSString *() {
switch (GetSelection(@"appTheme")) {
case 1:
return LOC(@"OLED_DARK_THEME_2");
case 2:
return LOC(@"OLD_DARK_THEME");
case 0:
default:
return LOC(@"DEFAULT_THEME");
}
}
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
NSArray <YTSettingsSectionItem *> *rows = @[
[YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"DEFAULT_THEME") titleDescription:LOC(@"DEFAULT_THEME_DESC") selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
[[NSUserDefaults standardUserDefaults] setInteger:0 forKey:@"appTheme"];
[settingsViewController reloadData];
return YES;
}],
[YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"OLED_DARK_THEME") titleDescription:LOC(@"OLED_DARK_THEME_DESC") selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
[[NSUserDefaults standardUserDefaults] setInteger:1 forKey:@"appTheme"];
[settingsViewController reloadData];
return YES;
}],
[YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"OLD_DARK_THEME") titleDescription:LOC(@"OLD_DARK_THEME_DESC") selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
[[NSUserDefaults standardUserDefaults] setInteger:2 forKey:@"appTheme"];
[settingsViewController reloadData];
return YES;
}],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"OLED_KEYBOARD")
titleDescription:LOC(@"OLED_KEYBOARD_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"oledKeyBoard_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"oledKeyBoard_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"LOW_CONTRAST_MODE")
titleDescription:LOC(@"LOW_CONTRAST_MODE_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"lowContrastMode_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"lowContrastMode_enabled"];
return YES;
}
settingItemId:0], lowContrastModeSection];
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"THEME_OPTIONS") pickerSectionTitle:nil rows:rows selectedItemIndex:GetSelection(@"appTheme") parentResponder:[self parentResponder]];
[settingsViewController pushViewController:picker];
return YES;
}];
[sectionItems addObject:themeGroup];
# pragma mark - Miscellaneous
YTSettingsSectionItem *miscellaneousGroup = [YTSettingsSectionItemClass itemWithTitle:LOC(@"MISCELLANEOUS") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
NSArray <YTSettingsSectionItem *> *rows = @[
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"ENABLE_YT_STARTUP_ANIMATION")
titleDescription:LOC(@"ENABLE_YT_STARTUP_ANIMATION_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"ytStartupAnimation_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"ytStartupAnimation_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_YOUTUBE_LOGO")
titleDescription:LOC(@"HIDE_YOUTUBE_LOGO_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"hideYouTubeLogo_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideYouTubeLogo_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_CHIP_BAR")
titleDescription:LOC(@"HIDE_CHIP_BAR_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"hideChipBar_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideChipBar_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_MODERN_INTERFACE")
titleDescription:LOC(@"HIDE_MODERN_INTERFACE_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"ytNoModernUI_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"ytNoModernUI_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"IPAD_LAYOUT")
titleDescription:LOC(@"IPAD_LAYOUT_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"iPadLayout_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"iPadLayout_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"IPHONE_LAYOUT")
titleDescription:LOC(@"IPHONE_LAYOUT_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"iPhoneLayout_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"iPhoneLayout_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"CAST_CONFIRM")
titleDescription:LOC(@"CAST_CONFIRM_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"castConfirm_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"castConfirm_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"DISABLE_HINTS")
titleDescription:LOC(@"DISABLE_HINTS_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"disableHints_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"disableHints_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"NEW_MINIPLAYER_STYLE")
titleDescription:LOC(@"NEW_MINIPLAYER_STYLE_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"bigYTMiniPlayer_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"bigYTMiniPlayer_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_CAST_BUTTON")
titleDescription:LOC(@"HIDE_CAST_BUTTON_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"hideCastButton_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideCastButton_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_NOTIFICATION_BUTTON")
titleDescription:LOC(@"HIDE_NOTIFICATION_BUTTON_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"hideNotificationButton_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideNotificationButton_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_SPONSORBLOCK_BUTTON")
titleDescription:LOC(@"HIDE_SPONSORBLOCK_BUTTON_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"hideSponsorBlockButton_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideSponsorBlockButton_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_CERCUBE_BUTTON")
titleDescription:LOC(@"")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"hideCercubeButton_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideCercubeButton_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_CERCUBE_PIP_BUTTON")
titleDescription:LOC(@"HIDE_CERCUBE_PIP_BUTTON_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"hideCercubePiP_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideCercubePiP_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_CERCUBE_DOWNLOAD_BUTTON")
titleDescription:LOC(@"HIDE_CERCUBE_DOWNLOAD_BUTTON_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"hideCercubeDownload_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL disabled) {
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"hideCercubeDownload_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"DISABLE_WIFI_RELATED_SETTINGS")
titleDescription:LOC(@"DISABLE_WIFI_RELATED_SETTINGS_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"disableWifiRelatedSettings_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"disableWifiRelatedSettings_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"YT_RE_EXPLORE")
titleDescription:LOC(@"YT_RE_EXPLORE_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"reExplore_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"reExplore_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"YT_SPEED")
titleDescription:LOC(@"YT_SPEED_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"ytSpeed_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"ytSpeed_enabled"];
return YES;
}
settingItemId:0],
[YTSettingsSectionItemClass switchItemWithTitle:LOC(@"ENABLE_FLEX")
titleDescription:LOC(@"ENABLE_FLEX_DESC")
accessibilityIdentifier:nil
switchOn:IsEnabled(@"flex_enabled")
switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"flex_enabled"];
return YES;
}
settingItemId:0]
];
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"MISCELLANEOUS") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]];
[settingsViewController pushViewController:picker];
return YES;
}];
[sectionItems addObject:miscellaneousGroup];
[settingsViewController setSectionItems:sectionItems forCategory:YTLitePlusSection title:@"YTLitePlus" titleDescription:LOC(@"TITLE DESCRIPTION") headerHidden:YES];
}
- (void)updateSectionForCategory:(NSUInteger)category withEntry:(id)entry {
if (category == YTLitePlusSection) {
[self updateYTLitePlusSectionWithEntry:entry];
return;
}
%orig;
}
%end

466
Source/Themes.xm Normal file
View File

@@ -0,0 +1,466 @@
#import "../Header.h"
static BOOL IsEnabled(NSString *key) {
return [[NSUserDefaults standardUserDefaults] boolForKey:key];
}
static BOOL isDarkMode() {
return ([[NSUserDefaults standardUserDefaults] integerForKey:@"page_style"] == 1);
}
static BOOL oledDarkTheme() {
return ([[NSUserDefaults standardUserDefaults] integerForKey:@"appTheme"] == 1);
}
static BOOL oldDarkTheme() {
return ([[NSUserDefaults standardUserDefaults] integerForKey:@"appTheme"] == 2);
}
// Themes.xm - Theme Options
// Old dark theme (gray)
%group gOldDarkTheme
%hook YTAsyncCollectionView
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
return pageStyle == 1 ? [UIColor colorWithRed:0.129 green:0.129 blue:0.129 alpha:1.0] : %orig;
}
- (UIColor *)darkBackgroundColor {
return [UIColor colorWithRed:0.129 green:0.129 blue:0.129 alpha:1.0];
}
%end
%hook YTAppView
- (void)setBackgroundColor:(UIColor *)color {
%orig([UIColor colorWithRed:0.129 green:0.129 blue:0.129 alpha:1.0]);
}
%end
%hook YTPivotBarView
- (void)setBackgroundColor:(UIColor *)color {
%orig([UIColor colorWithRed:0.129 green:0.129 blue:0.129 alpha:1.0]);
}
%end
%hook YTAsyncCollectionView
- (void)setBackgroundColor:(UIColor *)color {
%orig([UIColor colorWithRed:0.129 green:0.129 blue:0.129 alpha:1.0]);
}
%end
%hook YTAppViewController
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
return pageStyle == 1 ? [UIColor colorWithRed:0.129 green:0.129 blue:0.129 alpha:1.0] : %orig;
}
%end
%hook YTNavigationBar
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
return pageStyle == 1 ? [UIColor colorWithRed:0.129 green:0.129 blue:0.129 alpha:1.0] : %orig;
}
%end
%hook YTInnerTubeCollectionViewController
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
return pageStyle == 1 ? [UIColor colorWithRed:0.129 green:0.129 blue:0.129 alpha:1.0] : %orig;
}
%end
%hook YTColdConfig
- (BOOL)uiSystemsClientGlobalConfigUseDarkerPaletteBgColorForNative { return NO; }
- (BOOL)uiSystemsClientGlobalConfigUseDarkerPaletteTextColorForNative { return NO; }
- (BOOL)enableCinematicContainerOnClient { return NO; }
%end
%hook _ASDisplayView
- (void)didMoveToWindow {
%orig;
if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.comment_composer"]) { self.backgroundColor = [UIColor clearColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.video_list_entry"]) { self.backgroundColor = [UIColor clearColor]; }
}
%end
%hook ASCollectionView
- (void)didMoveToWindow {
%orig;
self.superview.backgroundColor = [UIColor colorWithRed:0.129 green:0.129 blue:0.129 alpha:1.0];
}
%end
%hook YTFullscreenEngagementOverlayView
- (void)didMoveToWindow {
%orig;
self.subviews[0].backgroundColor = [UIColor clearColor];
}
%end
%hook YTRelatedVideosView
- (void)didMoveToWindow {
%orig;
self.subviews[0].backgroundColor = [UIColor clearColor];
}
%end
%end
// OLED dark mode by BandarHL
UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha:1.0];
%group gOLED
%hook YTCommonColorPalette
- (UIColor *)brandBackgroundSolid {
return self.pageStyle == 1 ? [UIColor blackColor] : %orig;
}
- (UIColor *)brandBackgroundPrimary {
return self.pageStyle == 1 ? [UIColor blackColor] : %orig;
}
- (UIColor *)brandBackgroundSecondary {
return self.pageStyle == 1 ? [[UIColor blackColor] colorWithAlphaComponent:0.9] : %orig;
}
- (UIColor *)raisedBackground {
return self.pageStyle == 1 ? [UIColor blackColor] : %orig;
}
- (UIColor *)staticBrandBlack {
return self.pageStyle == 1 ? [UIColor blackColor] : %orig;
}
- (UIColor *)generalBackgroundA {
return self.pageStyle == 1 ? [UIColor blackColor] : %orig;
}
%end
%hook YTAppView
- (void)setBackgroundColor:(UIColor *)color {
%orig([UIColor blackColor]);
}
%end
%hook YTPivotBarView
- (void)setBackgroundColor:(UIColor *)color {
%orig([UIColor blackColor]);
}
%end
%hook YTAsyncCollectionView
- (void)setBackgroundColor:(UIColor *)color {
%orig([UIColor blackColor]);
}
%end
%hook YTAppViewController
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
return pageStyle == 1 ? [UIColor blackColor] : %orig;
}
%end
%hook YTNavigationBar
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
return pageStyle == 1 ? [UIColor blackColor] : %orig;
}
%end
BOOL areColorsEqual(UIColor *color1, UIColor *color2, CGFloat tolerance) {
CGFloat r1, g1, b1, a1, r2, g2, b2, a2;
[color1 getRed:&r1 green:&g1 blue:&b1 alpha:&a1];
[color2 getRed:&r2 green:&g2 blue:&b2 alpha:&a2];
return (fabs(r1 - r2) <= tolerance) &&
(fabs(g1 - g2) <= tolerance) &&
(fabs(b1 - b2) <= tolerance) &&
(fabs(a1 - a2) <= tolerance);
}
%hook UIView
- (void)setBackgroundColor:(UIColor *)color {
UIColor *targetColor = [UIColor colorWithRed:0.0588235 green:0.0588235 blue:0.0588235 alpha:1];
CGFloat tolerance = 0.01; // Adjust this value as needed
if (areColorsEqual(color, targetColor, tolerance)) {
color = [UIColor blackColor];
}
%orig(color);
}
%end
%hook YTCollectionViewController
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
return pageStyle == 1 ? [UIColor blackColor] : %orig;
}
%end
%hook YTChannelMobileHeaderViewController
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
return pageStyle == 1 ? [UIColor blackColor] : %orig;
}
%end
%hook YTELMView
- (UIColor *)backgroundColor {
return [UIColor blackColor];
}
%end
%hook YTHeaderViewController
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
return pageStyle == 1 ? [UIColor blackColor] : %orig;
}
- (UIColor *)barTintColor:(NSInteger)pageStyle {
return pageStyle == 1 ? [UIColor blackColor] : %orig;
}
%end
%hook YTInnerTubeCollectionViewController
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
return pageStyle == 1 ? [UIColor blackColor] : %orig;
}
%end
%hook YTSettingsCell
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
return pageStyle == 1 ? [UIColor blackColor] : %orig;
}
%end
%hook YTSearchViewController
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
return pageStyle == 1 ? [UIColor blackColor] : %orig;
}
%end
%hook YTSectionListViewController
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
return pageStyle == 1 ? [UIColor blackColor] : %orig;
}
%end
%hook YTWatchMiniBarViewController
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
return pageStyle == 1 ? [UIColor blackColor] : %orig;
}
%end
%hook YTWrapperSplitViewController
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
return pageStyle == 1 ? [UIColor blackColor] : %orig;
}
%end
// Explore
%hook ASScrollView
- (void)didMoveToWindow {
%orig;
if (isDarkMode()) {
self.backgroundColor = [UIColor clearColor];
}
}
%end
// Your videos
%hook ASCollectionView
- (void)didMoveToWindow {
%orig;
if (isDarkMode() && [self.nextResponder isKindOfClass:%c(_ASDisplayView)]) {
self.superview.backgroundColor = [UIColor blackColor];
}
}
%end
// Sub?
%hook ELMView
- (void)didMoveToWindow {
%orig;
if (isDarkMode()) {
self.subviews[0].backgroundColor = [UIColor blackColor];
}
}
%end
// iSponsorBlock
%hook SponsorBlockSettingsController
- (void)viewDidLoad {
if (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
%orig;
self.tableView.backgroundColor = [UIColor blackColor];
} else { return %orig; }
}
%end
%hook SponsorBlockViewController
- (void)viewDidLoad {
if (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
%orig;
self.view.backgroundColor = [UIColor blackColor];
} else { return %orig; }
}
%end
// Search View
%hook YTSearchBarView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig([UIColor blackColor]) : %orig;
}
%end
// History Search view
%hook YTSearchBoxView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig([UIColor blackColor]) : %orig;
}
%end
// Comment view
%hook YTCommentView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig([UIColor blackColor]) : %orig;
}
%end
%hook YTCreateCommentAccessoryView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig([UIColor blackColor]) : %orig;
}
%end
%hook YTCreateCommentTextView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig([UIColor blackColor]) : %orig;
}
- (void)setTextColor:(UIColor *)color { // fix black text in #Shorts video's comment
return isDarkMode() ? %orig([UIColor whiteColor]) : %orig;
}
%end
%hook YTCommentDetailHeaderCell
- (void)didMoveToWindow {
%orig;
if (isDarkMode()) {
self.subviews[2].backgroundColor = [UIColor blackColor];
}
}
%end
%hook YTFormattedStringLabel // YT is werid...
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig([UIColor clearColor]) : %orig;
}
%end
// Live chat comment
%hook YCHLiveChatActionPanelView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig([UIColor blackColor]) : %orig;
}
%end
%hook YTEmojiTextView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig([UIColor blackColor]) : %orig;
}
%end
%hook YCHLiveChatView
- (void)didMoveToWindow {
%orig;
if (isDarkMode()) {
self.subviews[1].backgroundColor = [UIColor blackColor];
}
}
%end
//
%hook YTBackstageCreateRepostDetailView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig([UIColor blackColor]) : %orig;
}
%end
// Others
%hook _ASDisplayView
- (void)didMoveToWindow {
%orig;
if (isDarkMode()) {
if ([self.nextResponder isKindOfClass:%c(ASScrollView)]) { self.backgroundColor = [UIColor clearColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"eml.cvr"]) { self.backgroundColor = [UIColor blackColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"rich_header"]) { self.backgroundColor = [UIColor blackColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"id.ui.comment_cell"]) { self.backgroundColor = [UIColor blackColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"id.ui.cancel.button"]) { self.superview.backgroundColor = [UIColor clearColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.comment_composer"]) { self.backgroundColor = [UIColor blackColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.video_list_entry"]) { self.backgroundColor = [UIColor blackColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"id.comment.guidelines_text"]) { self.superview.backgroundColor = [UIColor blackColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"id.comment.channel_guidelines_bottom_sheet_container"]) { self.backgroundColor = [UIColor blackColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"id.comment.channel_guidelines_entry_banner_container"]) { self.backgroundColor = [UIColor blackColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"id.comment.comment_group_detail_container"]) { self.backgroundColor = [UIColor clearColor]; }
}
}
%end
// Open link with...
%hook ASWAppSwitchingSheetHeaderView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig(raisedColor) : %orig;
}
%end
%hook ASWAppSwitchingSheetFooterView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig(raisedColor) : %orig;
}
%end
%hook ASWAppSwitcherCollectionViewCell
- (void)didMoveToWindow {
%orig;
if (isDarkMode()) {
self.backgroundColor = raisedColor;
self.subviews[1].backgroundColor = raisedColor;
self.superview.backgroundColor = raisedColor;
}
}
%end
// Incompatibility with the new YT Dark theme
%hook YTColdConfig
- (BOOL)uiSystemsClientGlobalConfigUseDarkerPaletteBgColorForNative { return NO; }
%end
%end
// OLED keyboard by @ichitaso <3 - http://gist.github.com/ichitaso/935100fd53a26f18a9060f7195a1be0e
%group gOLEDKB
%hook UIPredictionViewController
- (void)loadView {
%orig;
[self.view setBackgroundColor:[UIColor blackColor]];
}
%end
%hook UICandidateViewController
- (void)loadView {
%orig;
[self.view setBackgroundColor:[UIColor blackColor]];
}
%end
%hook UIKeyboardDockView
- (void)didMoveToWindow {
%orig;
self.backgroundColor = [UIColor blackColor];
}
%end
%hook UIKeyboardLayoutStar
- (void)didMoveToWindow {
%orig;
self.backgroundColor = [UIColor blackColor];
}
%end
%hook UIKBRenderConfig // Prediction text color
- (void)setLightKeyboard:(BOOL)arg1 { %orig(NO); }
%end
%end
# pragma mark - ctor
%ctor {
%init;
if (IsEnabled(@"oledKeyBoard_enabled")) {
%init(gOLEDKB);
}
if (oledDarkTheme()) {
%init(gOLED);
}
if (oldDarkTheme()) {
%init(gOldDarkTheme);
}
}

16
Tweaks/Alderis/.gitignore vendored Normal file
View File

@@ -0,0 +1,16 @@
# Crap
.DS_Store
# Xcode
*.pbxuser
!default.pbxuser
xcuserdata
*.xccheckout
*.xcuserstate
# Carthage
Carthage/
# Theos
.theos
packages/

View File

@@ -0,0 +1,36 @@
clean: true
author: HASHBANG Productions
author_url: https://hbang.github.io/
github_url: https://github.com/hbang/Alderis
root_url: https://hbang.github.io/Alderis/
dash_url: https://hbang.github.io/Alderis/docsets/Alderis.xml
documentation: info/*.md
hide_documentation_coverage: true
custom_categories:
- name: "Guides"
children:
- "Preference Bundles"
- "Migrating to 1.1"
- name: "Color Picker"
children:
- ColorPickerViewController
- ColorPickerConfiguration
- ColorPickerDelegate
- ColorPickerTab
- name: "UI Components"
children:
- ColorWell
- name: "Extensions"
children:
- UIColor
- ColorPropertyListValue
- String
- Array
- name: "Deprecated"
children:
- ColorPickerCircleView

View File

@@ -0,0 +1,61 @@
disabled_rules:
- trailing_comma
- nesting
- fallthrough
- shorthand_operator
- todo
- large_tuple
- identifier_name
- type_name
- type_body_length
# TODO: Why is vertical_parameter_alignment giving false positives?
- vertical_parameter_alignment
- vertical_parameter_alignment_on_call
# TODO: Enable when removing support for older Swift versions (<5.6)
- unavailable_condition
opt_in_rules:
- closure_end_indentation
- closure_spacing
- contains_over_first_not_nil
- empty_count
- explicit_init
- fatal_error_message
- first_where
- joined_default_parameter
- literal_expression_end_indentation
- overridden_super_call
- prohibited_super_call
- sorted_first_last
- unneeded_parentheses_in_closure_argument
- vertical_parameter_alignment_on_call
- yoda_condition
- nslocalizedstring_key
- unused_setter_value
custom_rules:
comment_whitespace:
name: "Comment Whitespace"
regex: //\S
match_kinds: comment
message: "Comments must begin with a whitespace character"
spaces_not_tabs:
name: "Tabs not Spaces"
regex: ^( )
message: "Use tabs instead of spaces"
point_zero:
name: "Point Zero"
regex: '(?<!iOS\s)(?<!macOS\s)(?<!\.)\b[\d_]+\.0\b'
match_kinds:
- number
- attribute.builtin
message: "Don't add a .0 to the end of floating point literals"
color_init:
name: "Color Initializer"
regex: 'UIColor\(red: (.+), green: \1, blue: \1, alpha: .+\)'
message: "Use UIColor(white:alpha:)"
force_try: warning
force_cast: warning
function_body_length: 200
line_length: 200
file_length: 450
cyclomatic_complexity: 12
function_parameter_count: 7

View File

@@ -0,0 +1,30 @@
Pod::Spec.new do |spec|
spec.name = "Alderis"
spec.version = "1.2.0"
spec.summary = "A fresh new color picker, with a gentle, fun, and dead simple user interface."
spec.description = <<-DESC
Alderis is a fresh new color picker, with a gentle, fun, and dead simple user
interface. It aims to incorporate the usual elements of a color picker, in a way
that users will find easy and fun to use.
The user can start by selecting a color they like on the initial color palette
tab, and either accept it, or refine it using the color wheel and adjustment
sliders found on the two other tabs.
DESC
spec.homepage = "https://github.com/hbang/Alderis"
spec.screenshots = "https://github.com/hbang/Alderis/raw/main/screenshots/alderis-1.jpg",
"https://github.com/hbang/Alderis/raw/main/screenshots/alderis-2.jpg",
"https://github.com/hbang/Alderis/raw/main/screenshots/alderis-3.jpg",
"https://github.com/hbang/Alderis/raw/main/screenshots/alderis-4.jpg"
spec.license = "Apache License, Version 2.0"
spec.author = "HASHBANG Productions"
spec.social_media_url = "https://twitter.com/hashbang"
spec.swift_versions = "5.0"
spec.platform = :ios, "12.0"
spec.source = { :git => "https://github.com/hbang/Alderis.git", :tag => "#{spec.version}" }
spec.requires_arc = true
spec.source_files = [ "Alderis/*.swift", "Alderis/*.h" ]
spec.resource_bundles = { "Alderis" => "Alderis/Assets-ios12.xcassets" }
end

View File

@@ -0,0 +1,482 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 52;
objects = {
/* Begin PBXBuildFile section */
4E1C741328266C5900227EC3 /* UIFontDescriptorAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E1C741228266C5900227EC3 /* UIFontDescriptorAdditions.swift */; };
4E1C74172826C1F100227EC3 /* ColorPickerAccessibilityViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E1C74162826C1F100227EC3 /* ColorPickerAccessibilityViewController.swift */; };
4E1C741928276D5600227EC3 /* TextViewLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E1C741828276D5600227EC3 /* TextViewLabel.swift */; };
4E1C741B2827829E00227EC3 /* AccessibilityComplianceLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E1C741A2827829E00227EC3 /* AccessibilityComplianceLabel.swift */; };
4E1C741D2827882600227EC3 /* AccessibilityContrastSelector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E1C741C2827882600227EC3 /* AccessibilityContrastSelector.swift */; };
4E1C741F2827B3C800227EC3 /* UIFloat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E1C741E2827B3C800227EC3 /* UIFloat.swift */; };
4E1C74212827B8F800227EC3 /* NSBeep.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E1C74202827B8F800227EC3 /* NSBeep.swift */; };
4E2E6C06282BD5990089E4FB /* GradientView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E2E6C05282BD5990089E4FB /* GradientView.swift */; };
569C25522427F57000022C60 /* ColorPickerTabViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 569C25512427F57000022C60 /* ColorPickerTabViewController.swift */; };
569C25582428346900022C60 /* ColorPickerMapSlider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 569C25572428346900022C60 /* ColorPickerMapSlider.swift */; };
56C74667242F722A003ED00A /* ColorPickerSlider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56C74666242F722A003ED00A /* ColorPickerSlider.swift */; };
56C74669242F75E3003ED00A /* ColorPickerNumericSlider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56C74668242F75E3003ED00A /* ColorPickerNumericSlider.swift */; };
94A2368C252B5951002B5D0B /* UIColorAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94A2368B252B5951002B5D0B /* UIColorAdditions.swift */; };
CF73D33A241F9C23000B1B10 /* Alderis.h in Headers */ = {isa = PBXBuildFile; fileRef = CF73D338241F9C23000B1B10 /* Alderis.h */; settings = {ATTRIBUTES = (Public, ); }; };
CF73D344241F9C31000B1B10 /* ColorWell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF73D32D241E49EE000B1B10 /* ColorWell.swift */; };
CF73D345241F9C31000B1B10 /* ColorPickerMapViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFE70280241CBDE700083903 /* ColorPickerMapViewController.swift */; };
CF73D346241F9C31000B1B10 /* ColorPickerSlidersViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFE70282241CC88D00083903 /* ColorPickerSlidersViewController.swift */; };
CF73D347241F9C31000B1B10 /* ColorPickerWheelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFE70288241D0E7300083903 /* ColorPickerWheelView.swift */; };
CF73D348241F9C31000B1B10 /* ColorPickerInnerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFE7027B241A62ED00083903 /* ColorPickerInnerViewController.swift */; };
CF73D34A241F9C31000B1B10 /* ColorPickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFE70273241A4C5500083903 /* ColorPickerViewController.swift */; };
CF73D34B241F9C31000B1B10 /* ColorPickerSwatchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFE7027E241B984600083903 /* ColorPickerSwatchViewController.swift */; };
CF73D34C241F9C4D000B1B10 /* Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF73D32B241E4720000B1B10 /* Color.swift */; };
CF73D351241F9FB3000B1B10 /* ColorPickerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF73D350241F9FB3000B1B10 /* ColorPickerDelegate.swift */; };
CF7750B72520D3B50069CC57 /* Assets.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF7750B62520D3B50069CC57 /* Assets.swift */; };
CF7750BE252203630069CC57 /* DialogButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF7750BD252203630069CC57 /* DialogButton.swift */; };
CF7750CF252433680069CC57 /* ColorPickerConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF7750CE252433680069CC57 /* ColorPickerConfiguration.swift */; };
CF7750D62524615D0069CC57 /* SeparatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF7750D52524615D0069CC57 /* SeparatorView.swift */; };
CF775122252852460069CC57 /* AlderisSDKCompatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = CF775121252852110069CC57 /* AlderisSDKCompatibility.h */; settings = {ATTRIBUTES = (Public, ); }; };
CF79DA31251723C500F17BCB /* BottomSheetTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF79DA30251723C500F17BCB /* BottomSheetTransition.swift */; };
CFAFFC9124277CEE005AD4C1 /* Assets-ios12.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CFAFFC9024277CEE005AD4C1 /* Assets-ios12.xcassets */; platformFilter = ios; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
4E1C741228266C5900227EC3 /* UIFontDescriptorAdditions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIFontDescriptorAdditions.swift; sourceTree = "<group>"; };
4E1C74162826C1F100227EC3 /* ColorPickerAccessibilityViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerAccessibilityViewController.swift; sourceTree = "<group>"; };
4E1C741828276D5600227EC3 /* TextViewLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextViewLabel.swift; sourceTree = "<group>"; };
4E1C741A2827829E00227EC3 /* AccessibilityComplianceLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessibilityComplianceLabel.swift; sourceTree = "<group>"; };
4E1C741C2827882600227EC3 /* AccessibilityContrastSelector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessibilityContrastSelector.swift; sourceTree = "<group>"; };
4E1C741E2827B3C800227EC3 /* UIFloat.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIFloat.swift; sourceTree = "<group>"; };
4E1C74202827B8F800227EC3 /* NSBeep.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSBeep.swift; sourceTree = "<group>"; };
4E2E6C05282BD5990089E4FB /* GradientView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GradientView.swift; sourceTree = "<group>"; };
569C25512427F57000022C60 /* ColorPickerTabViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerTabViewController.swift; sourceTree = "<group>"; };
569C25572428346900022C60 /* ColorPickerMapSlider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerMapSlider.swift; sourceTree = "<group>"; };
56C74666242F722A003ED00A /* ColorPickerSlider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerSlider.swift; sourceTree = "<group>"; };
56C74668242F75E3003ED00A /* ColorPickerNumericSlider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerNumericSlider.swift; sourceTree = "<group>"; };
94A2368B252B5951002B5D0B /* UIColorAdditions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIColorAdditions.swift; sourceTree = "<group>"; };
CF73D32B241E4720000B1B10 /* Color.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Color.swift; sourceTree = "<group>"; };
CF73D32D241E49EE000B1B10 /* ColorWell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorWell.swift; sourceTree = "<group>"; };
CF73D336241F9C23000B1B10 /* Alderis.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alderis.framework; sourceTree = BUILT_PRODUCTS_DIR; };
CF73D338241F9C23000B1B10 /* Alderis.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Alderis.h; sourceTree = "<group>"; };
CF73D339241F9C23000B1B10 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
CF73D350241F9FB3000B1B10 /* ColorPickerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerDelegate.swift; sourceTree = "<group>"; };
CF7750B62520D3B50069CC57 /* Assets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Assets.swift; sourceTree = "<group>"; };
CF7750BD252203630069CC57 /* DialogButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DialogButton.swift; sourceTree = "<group>"; };
CF7750CE252433680069CC57 /* ColorPickerConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ColorPickerConfiguration.swift; sourceTree = "<group>"; };
CF7750D52524615D0069CC57 /* SeparatorView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SeparatorView.swift; sourceTree = "<group>"; };
CF775121252852110069CC57 /* AlderisSDKCompatibility.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AlderisSDKCompatibility.h; sourceTree = "<group>"; };
CF79DA30251723C500F17BCB /* BottomSheetTransition.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomSheetTransition.swift; sourceTree = "<group>"; };
CFAFFC9024277CEE005AD4C1 /* Assets-ios12.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Assets-ios12.xcassets"; sourceTree = "<group>"; };
CFE70273241A4C5500083903 /* ColorPickerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerViewController.swift; sourceTree = "<group>"; };
CFE7027B241A62ED00083903 /* ColorPickerInnerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerInnerViewController.swift; sourceTree = "<group>"; };
CFE7027E241B984600083903 /* ColorPickerSwatchViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerSwatchViewController.swift; sourceTree = "<group>"; };
CFE70280241CBDE700083903 /* ColorPickerMapViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerMapViewController.swift; sourceTree = "<group>"; };
CFE70282241CC88D00083903 /* ColorPickerSlidersViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerSlidersViewController.swift; sourceTree = "<group>"; };
CFE70288241D0E7300083903 /* ColorPickerWheelView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerWheelView.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
CF73D333241F9C23000B1B10 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
CF39D435222BC07C001EF57F = {
isa = PBXGroup;
children = (
CF73D337241F9C23000B1B10 /* Alderis */,
CF39D43F222BC07C001EF57F /* Products */,
);
indentWidth = 2;
sourceTree = "<group>";
tabWidth = 2;
usesTabs = 1;
};
CF39D43F222BC07C001EF57F /* Products */ = {
isa = PBXGroup;
children = (
CF73D336241F9C23000B1B10 /* Alderis.framework */,
);
name = Products;
sourceTree = "<group>";
};
CF73D337241F9C23000B1B10 /* Alderis */ = {
isa = PBXGroup;
children = (
CF73D338241F9C23000B1B10 /* Alderis.h */,
CF775121252852110069CC57 /* AlderisSDKCompatibility.h */,
CF7750B62520D3B50069CC57 /* Assets.swift */,
CF79DA30251723C500F17BCB /* BottomSheetTransition.swift */,
CF73D32B241E4720000B1B10 /* Color.swift */,
CFE70273241A4C5500083903 /* ColorPickerViewController.swift */,
CF7750CE252433680069CC57 /* ColorPickerConfiguration.swift */,
CF73D350241F9FB3000B1B10 /* ColorPickerDelegate.swift */,
CFE7027B241A62ED00083903 /* ColorPickerInnerViewController.swift */,
569C25512427F57000022C60 /* ColorPickerTabViewController.swift */,
56C74666242F722A003ED00A /* ColorPickerSlider.swift */,
CFE7027E241B984600083903 /* ColorPickerSwatchViewController.swift */,
569C25572428346900022C60 /* ColorPickerMapSlider.swift */,
CFE70280241CBDE700083903 /* ColorPickerMapViewController.swift */,
CFE70288241D0E7300083903 /* ColorPickerWheelView.swift */,
CFE70282241CC88D00083903 /* ColorPickerSlidersViewController.swift */,
56C74668242F75E3003ED00A /* ColorPickerNumericSlider.swift */,
4E1C74162826C1F100227EC3 /* ColorPickerAccessibilityViewController.swift */,
4E1C741A2827829E00227EC3 /* AccessibilityComplianceLabel.swift */,
4E1C741C2827882600227EC3 /* AccessibilityContrastSelector.swift */,
CF73D32D241E49EE000B1B10 /* ColorWell.swift */,
CF7750BD252203630069CC57 /* DialogButton.swift */,
CF7750D52524615D0069CC57 /* SeparatorView.swift */,
4E2E6C05282BD5990089E4FB /* GradientView.swift */,
94A2368B252B5951002B5D0B /* UIColorAdditions.swift */,
4E1C741228266C5900227EC3 /* UIFontDescriptorAdditions.swift */,
4E1C741E2827B3C800227EC3 /* UIFloat.swift */,
4E1C741828276D5600227EC3 /* TextViewLabel.swift */,
4E1C74202827B8F800227EC3 /* NSBeep.swift */,
CF73D339241F9C23000B1B10 /* Info.plist */,
CFAFFC9024277CEE005AD4C1 /* Assets-ios12.xcassets */,
);
path = Alderis;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
CF73D331241F9C23000B1B10 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
CF73D33A241F9C23000B1B10 /* Alderis.h in Headers */,
CF775122252852460069CC57 /* AlderisSDKCompatibility.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
CF73D335241F9C23000B1B10 /* Alderis */ = {
isa = PBXNativeTarget;
buildConfigurationList = CF73D340241F9C23000B1B10 /* Build configuration list for PBXNativeTarget "Alderis" */;
buildPhases = (
CF73D331241F9C23000B1B10 /* Headers */,
CF73D332241F9C23000B1B10 /* Sources */,
CF73D333241F9C23000B1B10 /* Frameworks */,
CF73D334241F9C23000B1B10 /* Resources */,
CF77511225281F7E0069CC57 /* SwiftLint */,
);
buildRules = (
);
dependencies = (
);
name = Alderis;
productName = Alderis;
productReference = CF73D336241F9C23000B1B10 /* Alderis.framework */;
productType = "com.apple.product-type.framework";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
CF39D436222BC07C001EF57F /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 1330;
ORGANIZATIONNAME = "HASHBANG Productions";
TargetAttributes = {
CF73D335241F9C23000B1B10 = {
CreatedOnToolsVersion = 11.3.1;
};
};
};
buildConfigurationList = CF39D439222BC07C001EF57F /* Build configuration list for PBXProject "Alderis" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = CF39D435222BC07C001EF57F;
productRefGroup = CF39D43F222BC07C001EF57F /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
CF73D335241F9C23000B1B10 /* Alderis */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
CF73D334241F9C23000B1B10 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
CFAFFC9124277CEE005AD4C1 /* Assets-ios12.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
CF77511225281F7E0069CC57 /* SwiftLint */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = SwiftLint;
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "export PATH=$PATH:/opt/homebrew/bin\nif which swiftlint >/dev/null; then\n\tswiftlint\nelse\n\techo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
CF73D332241F9C23000B1B10 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
CF73D34B241F9C31000B1B10 /* ColorPickerSwatchViewController.swift in Sources */,
CF7750BE252203630069CC57 /* DialogButton.swift in Sources */,
4E1C741928276D5600227EC3 /* TextViewLabel.swift in Sources */,
CF73D347241F9C31000B1B10 /* ColorPickerWheelView.swift in Sources */,
CF7750D62524615D0069CC57 /* SeparatorView.swift in Sources */,
CF73D34C241F9C4D000B1B10 /* Color.swift in Sources */,
94A2368C252B5951002B5D0B /* UIColorAdditions.swift in Sources */,
569C25582428346900022C60 /* ColorPickerMapSlider.swift in Sources */,
4E2E6C06282BD5990089E4FB /* GradientView.swift in Sources */,
CF73D344241F9C31000B1B10 /* ColorWell.swift in Sources */,
CF7750B72520D3B50069CC57 /* Assets.swift in Sources */,
CF73D348241F9C31000B1B10 /* ColorPickerInnerViewController.swift in Sources */,
56C74667242F722A003ED00A /* ColorPickerSlider.swift in Sources */,
4E1C74212827B8F800227EC3 /* NSBeep.swift in Sources */,
4E1C74172826C1F100227EC3 /* ColorPickerAccessibilityViewController.swift in Sources */,
4E1C741D2827882600227EC3 /* AccessibilityContrastSelector.swift in Sources */,
CF73D345241F9C31000B1B10 /* ColorPickerMapViewController.swift in Sources */,
CF79DA31251723C500F17BCB /* BottomSheetTransition.swift in Sources */,
4E1C741328266C5900227EC3 /* UIFontDescriptorAdditions.swift in Sources */,
CF73D34A241F9C31000B1B10 /* ColorPickerViewController.swift in Sources */,
CF7750CF252433680069CC57 /* ColorPickerConfiguration.swift in Sources */,
56C74669242F75E3003ED00A /* ColorPickerNumericSlider.swift in Sources */,
569C25522427F57000022C60 /* ColorPickerTabViewController.swift in Sources */,
4E1C741F2827B3C800227EC3 /* UIFloat.swift in Sources */,
CF73D351241F9FB3000B1B10 /* ColorPickerDelegate.swift in Sources */,
CF73D346241F9C31000B1B10 /* ColorPickerSlidersViewController.swift in Sources */,
4E1C741B2827829E00227EC3 /* AccessibilityComplianceLabel.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
CF39D452222BC07E001EF57F /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
};
name = Debug;
};
CF39D453222BC07E001EF57F /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
VALIDATE_PRODUCT = YES;
};
name = Release;
};
CF73D341241F9C23000B1B10 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
APPLICATION_EXTENSION_API_ONLY = YES;
BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
CURRENT_PROJECT_VERSION = 3;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = Alderis/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MARKETING_VERSION = 1.2;
PRODUCT_BUNDLE_IDENTIFIER = ws.hbang.Alderis;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SKIP_INSTALL = NO;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Debug;
};
CF73D342241F9C23000B1B10 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
APPLICATION_EXTENSION_API_ONLY = YES;
BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
CURRENT_PROJECT_VERSION = 3;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = Alderis/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MARKETING_VERSION = 1.2;
PRODUCT_BUNDLE_IDENTIFIER = ws.hbang.Alderis;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SKIP_INSTALL = NO;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
CF39D439222BC07C001EF57F /* Build configuration list for PBXProject "Alderis" */ = {
isa = XCConfigurationList;
buildConfigurations = (
CF39D452222BC07E001EF57F /* Debug */,
CF39D453222BC07E001EF57F /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
CF73D340241F9C23000B1B10 /* Build configuration list for PBXNativeTarget "Alderis" */ = {
isa = XCConfigurationList;
buildConfigurations = (
CF73D341241F9C23000B1B10 /* Debug */,
CF73D342241F9C23000B1B10 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = CF39D436222BC07C001EF57F /* Project object */;
}

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:Alderis Demo.xcodeproj">
</FileRef>
</Workspace>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

View File

@@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1330"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "CF73D335241F9C23000B1B10"
BuildableName = "Alderis.framework"
BlueprintName = "Alderis"
ReferencedContainer = "container:Alderis.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "CF73D335241F9C23000B1B10"
BuildableName = "Alderis.framework"
BlueprintName = "Alderis"
ReferencedContainer = "container:Alderis.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@@ -0,0 +1,77 @@
//
// AccessibilityComplianceLabel.swift
// Alderis
//
// Created by Adam Demasi on 8/5/2022.
// Copyright © 2022 HASHBANG Productions. All rights reserved.
//
import UIKit
internal class AccessibilityComplianceLabel: UIView {
var text: String {
get { label.text! }
set { label.text = newValue }
}
var isCompliant = false {
didSet { updateState() }
}
private let tickImage = Assets.systemImage(named: "checkmark.circle.fill")
private let crossImage = Assets.systemImage(named: "xmark.circle.fill")
private var imageView: UIImageView!
private var label: UILabel!
override init(frame: CGRect) {
super.init(frame: frame)
let font = UIFont.systemFont(ofSize: UIFloat(16), weight: .medium)
imageView = UIImageView()
if #available(iOS 13, *) {
imageView.preferredSymbolConfiguration = UIImage.SymbolConfiguration(font: font, scale: .small)
}
label = UILabel()
label.font = font
let stackView = UIStackView(arrangedSubviews: [imageView, label])
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.alignment = .center
stackView.spacing = UIFloat(6)
addSubview(stackView)
NSLayoutConstraint.activate([
stackView.topAnchor.constraint(equalTo: self.topAnchor),
stackView.bottomAnchor.constraint(equalTo: self.bottomAnchor),
stackView.leadingAnchor.constraint(equalTo: self.leadingAnchor),
stackView.trailingAnchor.constraint(equalTo: self.trailingAnchor)
])
}
convenience init(text: String) {
self.init(frame: .zero)
self.text = text
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func updateState() {
let color = isCompliant ? Assets.green : Assets.red
tintColor = color
accessibilityLabel = "\(text): \(isCompliant ? "Compliant" : "Not compliant")"
imageView.image = isCompliant ? tickImage : crossImage
}
override func tintColorDidChange() {
super.tintColorDidChange()
label.textColor = tintColor
}
}

View File

@@ -0,0 +1,91 @@
//
// AccessibilityContrastSelector.swift
// Alderis
//
// Created by Adam Demasi on 8/5/2022.
// Copyright © 2022 HASHBANG Productions. All rights reserved.
//
import UIKit
internal class AccessibilityContrastSelector: UIView {
enum Mode: Int, CaseIterable {
case color, black, white
var label: String {
switch self {
case .color: return "Color"
case .black: return "Black"
case .white: return "White"
}
}
func color(withColor color: Color) -> Color {
switch self {
case .color: return color
case .black: return .black
case .white: return .white
}
}
}
var text: String {
get { label.text! }
set { label.text = newValue }
}
var value: Mode = .white {
didSet {
if segmentedControl.selectedSegmentIndex != value.rawValue {
segmentedControl.selectedSegmentIndex = value.rawValue
handleChange?(value)
}
}
}
var handleChange: ((Mode) -> Void)?
private var label: UILabel!
private var segmentedControl: UISegmentedControl!
override init(frame: CGRect) {
super.init(frame: frame)
label = UILabel()
label.font = UIFont.systemFont(ofSize: UIFloat(16), weight: .medium)
segmentedControl = UISegmentedControl(items: Mode.allCases.map(\.label))
segmentedControl.addTarget(self, action: #selector(handleValueChanged), for: .valueChanged)
let stackView = UIStackView(arrangedSubviews: [label, UIView(), segmentedControl])
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.alignment = .center
stackView.distribution = .fill
stackView.spacing = UIFloat(5)
addSubview(stackView)
NSLayoutConstraint.activate([
stackView.topAnchor.constraint(equalTo: self.topAnchor),
stackView.bottomAnchor.constraint(equalTo: self.bottomAnchor),
stackView.leadingAnchor.constraint(equalTo: self.leadingAnchor),
stackView.trailingAnchor.constraint(equalTo: self.trailingAnchor)
])
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
convenience init(text: String, value: Mode) {
self.init(frame: .zero)
self.text = text
self.value = value
}
@objc private func handleValueChanged() {
value = Mode(rawValue: segmentedControl.selectedSegmentIndex)!
handleChange?(value)
}
}

View File

@@ -0,0 +1,11 @@
//
// Alderis.h
// Alderis
//
// Created by Adam Demasi on 16/3/20.
// Copyright © 2020 HASHBANG Productions. All rights reserved.
//
@import UIKit;
#import "AlderisSDKCompatibility.h"

View File

@@ -0,0 +1,21 @@
//
// AlderisSDKCompatibility.h
// Alderis
//
// Created by Adam Demasi on 3/10/20.
// Copyright © 2020 HASHBANG Productions. All rights reserved.
//
@import UIKit;
#ifndef __IPHONE_14_0
// Allows building with the iOS 13 SDK while retaining iOS 14 compatibility.
@interface UIControl ()
- (void)addAction:(UIAction *)action forControlEvents:(UIControlEvents)controlEvents NS_SWIFT_NAME(addAction(_:for:)) API_AVAILABLE(ios(14.0));
- (void)removeAction:(UIAction *)action forControlEvents:(UIControlEvents)controlEvents NS_SWIFT_NAME(removeAction(_:for:)) API_AVAILABLE(ios(14.0));
- (void)removeActionForIdentifier:(UIActionIdentifier)actionIdentifier forControlEvents:(UIControlEvents)controlEvents NS_SWIFT_NAME(removeAction(identifiedBy:for:)) API_AVAILABLE(ios(14.0));
@end
#endif

View File

@@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View File

@@ -0,0 +1,26 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "sun.max.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "sun.max@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "sun.max@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "template"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 661 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 942 B

View File

@@ -0,0 +1,26 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "sun.min.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "sun.min@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "sun.min@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "template"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 307 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 606 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 909 B

View File

@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,26 @@
{
"images" : [
{
"filename" : "checkmark.circle.fill.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "checkmark.circle.fill@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "checkmark.circle.fill@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 287 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 B

View File

@@ -0,0 +1,26 @@
{
"images" : [
{
"filename" : "sparkles.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "sparkles@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "sparkles@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

View File

@@ -0,0 +1,26 @@
{
"images" : [
{
"filename" : "xmark.circle.fill.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "xmark.circle.fill@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "xmark.circle.fill@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 383 B

View File

@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,26 @@
{
"images" : [
{
"filename" : "circle.righthalf.fill.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "circle.righthalf.fill@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "circle.righthalf.fill@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 229 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 385 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 574 B

View File

@@ -0,0 +1,26 @@
{
"images" : [
{
"filename" : "slider.horizontal.3.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "slider.horizontal.3@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "slider.horizontal.3@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 507 B

View File

@@ -0,0 +1,26 @@
{
"images" : [
{
"filename" : "slider.horizontal.below.rectangle.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "slider.horizontal.below.rectangle@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "slider.horizontal.below.rectangle@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}

View File

@@ -0,0 +1,26 @@
{
"images" : [
{
"filename" : "square.grid.4x3.fill.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "square.grid.4x3.fill@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "square.grid.4x3.fill@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 419 B

View File

@@ -0,0 +1,135 @@
//
// Assets.swift
// Alderis
//
// Created by Adam Demasi on 27/9/20.
// Copyright © 2020 HASHBANG Productions. All rights reserved.
//
import UIKit
internal struct Assets {
internal enum SymbolScale: Int {
case `default` = -1
case unspecified, small, medium, large
@available(iOS 13, *)
var uiImageSymbolScale: UIImage.SymbolScale { UIImage.SymbolScale(rawValue: rawValue)! }
}
private static let bundle: Bundle = {
let myBundle = Bundle(for: ColorPickerViewController.self)
if let resourcesURL = myBundle.url(forResource: "Alderis", withExtension: "bundle"),
let resourcesBundle = Bundle(url: resourcesURL) {
return resourcesBundle
}
return myBundle
}()
private static let uikitBundle = Bundle(for: UIView.self)
// MARK: - Localization
static func uikitLocalize(_ key: String) -> String {
uikitBundle.localizedString(forKey: key, value: nil, table: nil)
}
// MARK: - Images
static func systemImage(named name: String, font: UIFont? = nil, scale: SymbolScale = .default) -> UIImage? {
if #available(iOS 13, *) {
var configuration: UIImage.SymbolConfiguration?
if let font = font {
configuration = UIImage.SymbolConfiguration(font: font, scale: scale.uiImageSymbolScale)
}
return UIImage(systemName: name, withConfiguration: configuration)
}
return UIImage(named: name, in: bundle, compatibleWith: nil)
}
// MARK: - Fonts
static func niceMonospaceDigitFont(ofSize size: CGFloat) -> UIFont {
// Take the monospace digit font and enable stylistic alternative 6, which provides a
// high-legibility, monospace-looking style of the system font.
let font = UIFont.monospacedDigitSystemFont(ofSize: size, weight: .regular)
let fontDescriptor = font.fontDescriptor.addingAttributes([
.featureSettings: [
[
.alderisFeature: kStylisticAlternativesType,
.alderisSelector: kStylisticAltSixOnSelector
]
] as [[UIFontDescriptor.FeatureKey: Int]]
])
return UIFont(descriptor: fontDescriptor, size: 0)
}
// MARK: - Colors
private static func color(userInterfaceStyles colors: [UIUserInterfaceStyle: UIColor], fallback: UIUserInterfaceStyle = .light) -> UIColor {
if #available(iOS 13, *) {
return UIColor { colors[$0.userInterfaceStyle] ?? colors[fallback] ?? colors.values.first! }
}
return colors[fallback] ?? colors.values.first!
}
static let backdropColor = UIColor(white: 0, alpha: 0.2)
static let separatorColor = UIColor(white: 1, alpha: 0.15)
static let labelColor: UIColor = {
if #available(iOS 13, *) {
return .label
}
return .black
}()
static let secondaryLabelColor: UIColor = {
if #available(iOS 13, *) {
return .secondaryLabel
}
return UIColor(white: 60 / 255, alpha: 0.6)
}()
static let borderColor: UIColor = {
if #available(iOS 13, *) {
return .separator
}
return UIColor(white: 1, alpha: 0.35)
}()
@available(iOS 13, *)
static let macTabBarSelectionColor = color(userInterfaceStyles: [
.light: .black,
.dark: .label
])
static let red = UIColor.systemRed
// .systemGreen adjusted to be more consistent / easier to read
static let green = color(userInterfaceStyles: [
.light: UIColor(red: 15 / 255, green: 189 / 255, blue: 59 / 255, alpha: 1),
// swiftlint:disable:next colon
.dark: UIColor(red: 41 / 255, green: 179 / 255, blue: 76 / 255, alpha: 1)
])
static let checkerboardPatternColor = color(userInterfaceStyles: [
.light: renderCheckerboardPattern(colors: (UIColor(white: 200 / 255, alpha: 1),
UIColor(white: 255 / 255, alpha: 1))),
// swiftlint:disable:next colon
.dark: renderCheckerboardPattern(colors: (UIColor(white: 140 / 255, alpha: 1),
UIColor(white: 186 / 255, alpha: 1)))
])
private static func renderCheckerboardPattern(colors: (dark: UIColor, light: UIColor)) -> UIColor {
let size = 11
let image = UIGraphicsImageRenderer(size: CGSize(width: size * 2, height: size * 2)).image { context in
colors.dark.setFill()
context.fill(CGRect(x: 0, y: 0, width: size * 2, height: size * 2))
colors.light.setFill()
context.fill(CGRect(x: size, y: 0, width: size, height: size))
context.fill(CGRect(x: 0, y: size, width: size, height: size))
}
return UIColor(patternImage: image)
}
}

Some files were not shown because too many files have changed in this diff Show More