├── .swift-version ├── .swiftlint-ci.yml ├── Sources ├── KSuite │ ├── Resources │ │ └── Assets.xcassets │ │ │ ├── Contents.json │ │ │ ├── Colors │ │ │ ├── Contents.json │ │ │ └── menuBackgroundColor.colorset │ │ │ │ └── Contents.json │ │ │ ├── euria.imageset │ │ │ ├── euria.pdf │ │ │ └── Contents.json │ │ │ ├── microsoft.imageset │ │ │ ├── Contents.json │ │ │ └── microsoft.svg │ │ │ ├── background.imageset │ │ │ └── Contents.json │ │ │ ├── drive.imageset │ │ │ └── Contents.json │ │ │ ├── folder.imageset │ │ │ ├── Contents.json │ │ │ └── folder.svg │ │ │ ├── kchat.imageset │ │ │ ├── Contents.json │ │ │ └── kchat.svg │ │ │ ├── rocket.imageset │ │ │ └── Contents.json │ │ │ ├── stair.imageset │ │ │ ├── Contents.json │ │ │ └── stair.svg │ │ │ ├── envelope.imageset │ │ │ ├── Contents.json │ │ │ └── envelope.svg │ │ │ ├── plus.circle.imageset │ │ │ ├── Contents.json │ │ │ └── plus.circle.svg │ │ │ ├── shield.lock.imageset │ │ │ └── Contents.json │ │ │ └── chevron.right.imageset │ │ │ ├── Contents.json │ │ │ └── chevron.right.svg │ ├── swiftgen.yml │ ├── KSuiteProUpgradeChip.swift │ ├── KSuitePanelModifier.swift │ └── KSuiteView.swift ├── MyKSuite │ ├── Resources │ │ └── Assets.xcassets │ │ │ ├── Contents.json │ │ │ ├── Icons │ │ │ ├── Contents.json │ │ │ ├── drive.imageset │ │ │ │ └── Contents.json │ │ │ ├── gift.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── gift.svg │ │ │ ├── lock.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── lock.svg │ │ │ ├── plane.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── plane.svg │ │ │ ├── person.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── person.svg │ │ │ ├── envelope.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── envelope.svg │ │ │ ├── information.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── information.svg │ │ │ ├── folder.arrow.up.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── folder.arrow.up.svg │ │ │ ├── gradient.imageset │ │ │ │ └── Contents.json │ │ │ ├── myKSuite.logo.imageset │ │ │ │ └── Contents.json │ │ │ └── myKSuitePlus.logo.imageset │ │ │ │ └── Contents.json │ │ │ └── Illustrations │ │ │ ├── Contents.json │ │ │ └── background.imageset │ │ │ ├── background.svg │ │ │ ├── background dark.svg │ │ │ └── Contents.json │ ├── Sources │ │ ├── Utils │ │ │ ├── Formatters.swift │ │ │ ├── OSLog+Extension.swift │ │ │ └── Product.swift │ │ ├── Networking │ │ │ ├── ApiFetcher+Extension.swift │ │ │ └── MyKSuite.swift │ │ ├── MyKSuiteView.swift │ │ ├── MyKSuitePanelModifier.swift │ │ ├── Components │ │ │ ├── CardModifier.swift │ │ │ └── CustomProgressBar.swift │ │ ├── Dashboard │ │ │ ├── ProductProgressView.swift │ │ │ ├── SubscriptionProductsView.swift │ │ │ ├── HeaderView.swift │ │ │ ├── SubscriptionCardView.swift │ │ │ ├── SubscriptionBenefitsView.swift │ │ │ └── FreeTrialView.swift │ │ └── MyKSuiteConfiguration.swift │ └── swiftgen.yml ├── KSuiteUtils │ ├── Resources │ │ ├── Colors.xcassets │ │ │ ├── Contents.json │ │ │ ├── Gradient │ │ │ │ ├── Contents.json │ │ │ │ ├── gradient.color.1.colorset │ │ │ │ │ └── Contents.json │ │ │ │ ├── gradient.color.2.colorset │ │ │ │ │ └── Contents.json │ │ │ │ ├── gradient.color.3.colorset │ │ │ │ │ └── Contents.json │ │ │ │ ├── gradient.color.4.colorset │ │ │ │ │ └── Contents.json │ │ │ │ └── gradient.color.5.colorset │ │ │ │ │ └── Contents.json │ │ │ ├── bat.colorset │ │ │ │ └── Contents.json │ │ │ ├── mouse.colorset │ │ │ │ └── Contents.json │ │ │ ├── orca.colorset │ │ │ │ └── Contents.json │ │ │ ├── rabbit.colorset │ │ │ │ └── Contents.json │ │ │ ├── shark.colorset │ │ │ │ └── Contents.json │ │ │ ├── sky.colorset │ │ │ │ └── Contents.json │ │ │ ├── swan.colorset │ │ │ │ └── Contents.json │ │ │ ├── elephant.colorset │ │ │ │ └── Contents.json │ │ │ ├── polar.bear.colorset │ │ │ │ └── Contents.json │ │ │ ├── product.mail.colorset │ │ │ │ └── Contents.json │ │ │ └── product.drive.colorset │ │ │ │ └── Contents.json │ │ └── Localizable │ │ │ ├── en.lproj │ │ │ └── Localizable.strings │ │ │ ├── es.lproj │ │ │ └── Localizable.strings │ │ │ ├── fr.lproj │ │ │ └── Localizable.strings │ │ │ ├── it.lproj │ │ │ └── Localizable.strings │ │ │ └── de.lproj │ │ │ └── Localizable.strings │ ├── Utils │ │ ├── KSuiteLabel.swift │ │ └── FontHelper.swift │ ├── swiftgen.yml │ └── Generated │ │ └── Strings+Generated.swift ├── InterAppLogin │ ├── Resources │ │ ├── Assets.xcassets │ │ │ ├── Colors │ │ │ │ ├── Contents.json │ │ │ │ ├── Grey Elephant.colorset │ │ │ │ │ └── Contents.json │ │ │ │ ├── Grey Mouse.colorset │ │ │ │ │ └── Contents.json │ │ │ │ ├── Grey Orca.colorset │ │ │ │ │ └── Contents.json │ │ │ │ ├── Grey Rabbit.colorset │ │ │ │ │ └── Contents.json │ │ │ │ ├── Grey Shark.colorset │ │ │ │ │ └── Contents.json │ │ │ │ └── backgroundSecondaryColor.colorset │ │ │ │ │ └── Contents.json │ │ │ ├── Images │ │ │ │ ├── Contents.json │ │ │ │ ├── check.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── check.svg │ │ │ │ ├── chevron-down.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── chevron-down.svg │ │ │ │ └── person-circle-plus-filled.imageset │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── person-circle-plus-filled.svg │ │ │ └── Contents.json │ │ └── Localizable │ │ │ ├── en.lproj │ │ │ ├── Localizable.strings │ │ │ └── Localizable.stringsdict │ │ │ ├── it.lproj │ │ │ ├── Localizable.strings │ │ │ └── Localizable.stringsdict │ │ │ ├── de.lproj │ │ │ ├── Localizable.strings │ │ │ └── Localizable.stringsdict │ │ │ ├── es.lproj │ │ │ ├── Localizable.strings │ │ │ └── Localizable.stringsdict │ │ │ └── fr.lproj │ │ │ ├── Localizable.strings │ │ │ └── Localizable.stringsdict │ ├── swiftgen.yml │ └── Sources │ │ ├── Extensions │ │ ├── Font+Extension.swift │ │ └── Color+Extension.swift │ │ └── UI │ │ ├── CenteringPlaceholderAvatarStackView.swift │ │ ├── ConnectedAccountView.swift │ │ ├── ConnectedAccountCellView.swift │ │ └── OutlinedButtonStyle.swift └── InAppTwoFactorAuthentication │ ├── Resources │ ├── Assets.xcassets │ │ ├── Colors │ │ │ ├── Contents.json │ │ │ ├── Grey Elephant.colorset │ │ │ │ └── Contents.json │ │ │ ├── Grey Mouse.colorset │ │ │ │ └── Contents.json │ │ │ ├── Grey Orca.colorset │ │ │ │ └── Contents.json │ │ │ ├── Grey Rabbit.colorset │ │ │ │ └── Contents.json │ │ │ ├── Grey Shark.colorset │ │ │ │ └── Contents.json │ │ │ ├── IKRed.colorset │ │ │ │ └── Contents.json │ │ │ ├── IKOrange.colorset │ │ │ │ └── Contents.json │ │ │ ├── Feature Primary.colorset │ │ │ │ └── Contents.json │ │ │ ├── Background Primary.colorset │ │ │ │ └── Contents.json │ │ │ ├── Background Secondary.colorset │ │ │ │ └── Contents.json │ │ │ ├── Feature Disabled.colorset │ │ │ │ └── Contents.json │ │ │ ├── Feature Tertiary.colorset │ │ │ │ └── Contents.json │ │ │ └── Feature Secondary Disabled.colorset │ │ │ │ └── Contents.json │ │ ├── Images │ │ │ ├── Contents.json │ │ │ ├── Background Light Source.imageset │ │ │ │ ├── background-light-source-light.png │ │ │ │ └── Contents.json │ │ │ ├── clock.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── clock.svg │ │ │ ├── xmark.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── xmark.svg │ │ │ ├── shield.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── shield.svg │ │ │ ├── wifi-slash.imageset │ │ │ │ └── Contents.json │ │ │ ├── stop-hand-slash.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── stop-hand-slash.svg │ │ │ └── device-arrow-rotate.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── device-arrow-rotate.svg │ │ └── Contents.json │ └── Localizable │ │ ├── en.lproj │ │ ├── Localizable.stringsdict │ │ └── Localizable.strings │ │ ├── it.lproj │ │ ├── Localizable.stringsdict │ │ └── Localizable.strings │ │ ├── de.lproj │ │ ├── Localizable.stringsdict │ │ └── Localizable.strings │ │ ├── es.lproj │ │ ├── Localizable.stringsdict │ │ └── Localizable.strings │ │ └── fr.lproj │ │ ├── Localizable.stringsdict │ │ └── Localizable.strings │ ├── swiftgen.yml │ └── Sources │ ├── Core │ ├── Models │ │ ├── Capability+Extension.swift │ │ ├── InAppTwoFactorAuthenticationSession.swift │ │ ├── RemoteChallenge.swift │ │ └── PreviewHelper.swift │ └── NotificationConstants.swift │ └── UI │ ├── ConnectionConfirmationView │ ├── FittingConnectionConfirmationView.swift │ ├── MainContentView │ │ ├── TimeAgoView.swift │ │ ├── RowView.swift │ │ └── UserRowView.swift │ └── InformationContentView.swift │ ├── Extensions │ ├── Font+Extension.swift │ └── Color+Extension.swift │ └── CheckConnectionAttemptsViewModifier.swift ├── .mise.toml ├── .github ├── workflows │ ├── auto-author-assign.yml │ ├── dependent-issues.yml │ ├── swiftformat.yml │ ├── semantic-commit.yml │ ├── swiftlint.yml │ └── ci.yml └── ISSUE_TEMPLATE │ ├── feature_request.md │ └── bug_report.md ├── .sonarcloud.properties ├── file-header-template.txt ├── .gitignore ├── .swiftlint.yml └── .swiftformat /.swift-version: -------------------------------------------------------------------------------- 1 | 5.10 -------------------------------------------------------------------------------- /.swiftlint-ci.yml: -------------------------------------------------------------------------------- 1 | disabled_rules: 2 | - todo 3 | strict: true 4 | -------------------------------------------------------------------------------- /Sources/KSuite/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Sources/KSuite/Resources/Assets.xcassets/Colors/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Sources/KSuiteUtils/Resources/Colors.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Resources/Assets.xcassets/Icons/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /.mise.toml: -------------------------------------------------------------------------------- 1 | [tools] 2 | swiftformat = '0.57.2' 3 | swiftlint = '0.59.1' 4 | swiftgen = "latest" 5 | pipx = "latest" 6 | "pipx:infomaniak/importloco" = "1.1.0" -------------------------------------------------------------------------------- /Sources/InterAppLogin/Resources/Assets.xcassets/Colors/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Sources/InterAppLogin/Resources/Assets.xcassets/Images/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Sources/KSuiteUtils/Resources/Colors.xcassets/Gradient/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Resources/Assets.xcassets/Illustrations/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Colors/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Images/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Sources/KSuite/Resources/Assets.xcassets/euria.imageset/euria.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infomaniak/ios-features/main/Sources/KSuite/Resources/Assets.xcassets/euria.imageset/euria.pdf -------------------------------------------------------------------------------- /Sources/InterAppLogin/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "properties" : { 7 | "generate-swift-asset-symbol-extensions" : "enabled" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "properties" : { 7 | "generate-swift-asset-symbol-extensions" : "enabled" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Resources/Assets.xcassets/Illustrations/background.imageset/background.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Resources/Assets.xcassets/Illustrations/background.imageset/background dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Images/Background Light Source.imageset/background-light-source-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infomaniak/ios-features/main/Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Images/Background Light Source.imageset/background-light-source-light.png -------------------------------------------------------------------------------- /.github/workflows/auto-author-assign.yml: -------------------------------------------------------------------------------- 1 | name: Auto Author Assign 2 | 3 | on: 4 | pull_request_target: 5 | types: [ opened, reopened ] 6 | 7 | permissions: 8 | pull-requests: write 9 | 10 | jobs: 11 | assign-author: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: toshimaru/auto-author-assign@v1.6.2 15 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Images/Background Light Source.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "background-light-source-light.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Sources/KSuite/Resources/Assets.xcassets/euria.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "euria.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Sources/KSuite/Resources/Assets.xcassets/microsoft.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "microsoft.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Sources/KSuite/Resources/Assets.xcassets/background.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ksuite-header.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Images/clock.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "clock.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Images/xmark.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "xmark.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Images/shield.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "shield.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Images/wifi-slash.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "wifi-slash.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Images/stop-hand-slash.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "stop-hand-slash.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Images/xmark.imageset/xmark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /Sources/KSuite/Resources/Assets.xcassets/drive.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "drive.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Sources/KSuite/Resources/Assets.xcassets/folder.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "folder.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Sources/KSuite/Resources/Assets.xcassets/kchat.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "kchat.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Sources/KSuite/Resources/Assets.xcassets/rocket.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "rocket.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Sources/KSuite/Resources/Assets.xcassets/stair.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "stair.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Images/device-arrow-rotate.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "device-arrow-rotate.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Sources/KSuite/Resources/Assets.xcassets/envelope.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "envelope.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Resources/Assets.xcassets/Icons/drive.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "drive.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Resources/Assets.xcassets/Icons/gift.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "gift.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Resources/Assets.xcassets/Icons/lock.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "lock.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Resources/Assets.xcassets/Icons/plane.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "plane.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Sources/KSuite/Resources/Assets.xcassets/plus.circle.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "plus.circle.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Sources/KSuite/Resources/Assets.xcassets/shield.lock.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "shield.lock.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Resources/Assets.xcassets/Icons/person.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "person.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Sources/InterAppLogin/Resources/Assets.xcassets/Images/check.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "check.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Sources/KSuite/Resources/Assets.xcassets/chevron.right.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "chevron.right.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Resources/Assets.xcassets/Icons/envelope.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "envelope.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Resources/Assets.xcassets/Icons/information.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "information.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Sources/InterAppLogin/Resources/Assets.xcassets/Images/chevron-down.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "chevron-down.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Resources/Assets.xcassets/Icons/folder.arrow.up.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "folder.arrow.up.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /.sonarcloud.properties: -------------------------------------------------------------------------------- 1 | ## Path to sources 2 | sonar.sources=Sources 3 | sonar.exclusions=Sources/MyKSuite/Generated/*,Sources/KSuite/Generated/*,Sources/KSuiteUtils/Generated/* 4 | # sonar.inclusions= 5 | 6 | ## Path to tests 7 | # sonar.tests=Tests 8 | # sonar.test.exclusions= 9 | # sonar.test.inclusions= 10 | 11 | ## Source encoding 12 | # sonar.sourceEncoding= 13 | 14 | # Exclusions for copy-paste detection 15 | # sonar.cpd.exclusions= 16 | -------------------------------------------------------------------------------- /Sources/KSuiteUtils/Resources/Localizable/en.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* 2 | * Loco ios export: Xcode Strings (legacy) 3 | * Project: CoreUI 4 | * Locale: en, English 5 | * Tagged: ios, !common, !emoji-reaction, !interapplogin, !ios-stringsdict, !kSuite, !my kSuite, !privacy 6 | * Exported by: Ambroise Decouttere 7 | * Exported at: Tue, 19 Aug 2025 09:11:18 +0200 8 | */ 9 | 10 | /* loco:679237f6daa3807fa008b175 */ 11 | "buttonClose" = "Close"; 12 | -------------------------------------------------------------------------------- /Sources/KSuiteUtils/Resources/Localizable/es.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* 2 | * Loco ios export: Xcode Strings (legacy) 3 | * Project: CoreUI 4 | * Locale: es, Spanish 5 | * Tagged: ios, !common, !emoji-reaction, !interapplogin, !ios-stringsdict, !kSuite, !my kSuite, !privacy 6 | * Exported by: Ambroise Decouttere 7 | * Exported at: Tue, 19 Aug 2025 09:11:18 +0200 8 | */ 9 | 10 | /* loco:679237f6daa3807fa008b175 */ 11 | "buttonClose" = "Cerrar"; 12 | -------------------------------------------------------------------------------- /Sources/KSuiteUtils/Resources/Localizable/fr.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* 2 | * Loco ios export: Xcode Strings (legacy) 3 | * Project: CoreUI 4 | * Locale: fr, French 5 | * Tagged: ios, !common, !emoji-reaction, !interapplogin, !ios-stringsdict, !kSuite, !my kSuite, !privacy 6 | * Exported by: Ambroise Decouttere 7 | * Exported at: Tue, 19 Aug 2025 09:11:18 +0200 8 | */ 9 | 10 | /* loco:679237f6daa3807fa008b175 */ 11 | "buttonClose" = "Fermer"; 12 | -------------------------------------------------------------------------------- /Sources/KSuiteUtils/Resources/Localizable/it.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* 2 | * Loco ios export: Xcode Strings (legacy) 3 | * Project: CoreUI 4 | * Locale: it, Italian 5 | * Tagged: ios, !common, !emoji-reaction, !interapplogin, !ios-stringsdict, !kSuite, !my kSuite, !privacy 6 | * Exported by: Ambroise Decouttere 7 | * Exported at: Tue, 19 Aug 2025 09:11:18 +0200 8 | */ 9 | 10 | /* loco:679237f6daa3807fa008b175 */ 11 | "buttonClose" = "Chiudere"; 12 | -------------------------------------------------------------------------------- /Sources/InterAppLogin/Resources/Assets.xcassets/Images/person-circle-plus-filled.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "person-circle-plus-filled.svg", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "preserves-vector-representation" : true, 14 | "template-rendering-intent" : "template" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Sources/KSuiteUtils/Resources/Localizable/de.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* 2 | * Loco ios export: Xcode Strings (legacy) 3 | * Project: CoreUI 4 | * Locale: de, German 5 | * Tagged: ios, !common, !emoji-reaction, !interapplogin, !ios-stringsdict, !kSuite, !my kSuite, !privacy 6 | * Exported by: Ambroise Decouttere 7 | * Exported at: Tue, 19 Aug 2025 09:11:18 +0200 8 | */ 9 | 10 | /* loco:679237f6daa3807fa008b175 */ 11 | "buttonClose" = "Schliessen"; 12 | -------------------------------------------------------------------------------- /Sources/KSuiteUtils/Resources/Colors.xcassets/bat.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x1A", 9 | "green" : "0x1A", 10 | "red" : "0x1A" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/KSuiteUtils/Resources/Colors.xcassets/mouse.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xE0", 9 | "green" : "0xE0", 10 | "red" : "0xE0" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/KSuiteUtils/Resources/Colors.xcassets/orca.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x33", 9 | "green" : "0x33", 10 | "red" : "0x33" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/KSuiteUtils/Resources/Colors.xcassets/rabbit.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xF1", 9 | "green" : "0xF1", 10 | "red" : "0xF1" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/KSuiteUtils/Resources/Colors.xcassets/shark.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x9F", 9 | "green" : "0x9F", 10 | "red" : "0x9F" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/KSuiteUtils/Resources/Colors.xcassets/sky.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xFD", 9 | "green" : "0xF6", 10 | "red" : "0xF4" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/KSuiteUtils/Resources/Colors.xcassets/swan.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xFA", 9 | "green" : "0xFA", 10 | "red" : "0xFA" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/KSuiteUtils/Resources/Colors.xcassets/elephant.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x66", 9 | "green" : "0x66", 10 | "red" : "0x66" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/KSuiteUtils/Resources/Colors.xcassets/polar.bear.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xF5", 9 | "green" : "0xF5", 10 | "red" : "0xF5" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/KSuiteUtils/Resources/Colors.xcassets/product.mail.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x7A", 9 | "green" : "0x35", 10 | "red" : "0xF2" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/KSuiteUtils/Resources/Colors.xcassets/product.drive.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xF7", 9 | "green" : "0x89", 10 | "red" : "0x5C" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/InterAppLogin/Resources/Assets.xcassets/Colors/Grey Elephant.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x66", 9 | "green" : "0x66", 10 | "red" : "0x66" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/InterAppLogin/Resources/Assets.xcassets/Colors/Grey Mouse.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xE0", 9 | "green" : "0xE0", 10 | "red" : "0xE0" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/InterAppLogin/Resources/Assets.xcassets/Colors/Grey Orca.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x33", 9 | "green" : "0x33", 10 | "red" : "0x33" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/InterAppLogin/Resources/Assets.xcassets/Colors/Grey Rabbit.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xF1", 9 | "green" : "0xF1", 10 | "red" : "0xF1" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/InterAppLogin/Resources/Assets.xcassets/Colors/Grey Shark.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x9F", 9 | "green" : "0x9F", 10 | "red" : "0x9F" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/KSuite/Resources/Assets.xcassets/Colors/menuBackgroundColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x3D", 9 | "green" : "0x2E", 10 | "red" : "0x29" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/KSuiteUtils/Resources/Colors.xcassets/Gradient/gradient.color.1.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xFD", 9 | "green" : "0xDD", 10 | "red" : "0x1D" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/KSuiteUtils/Resources/Colors.xcassets/Gradient/gradient.color.2.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xFF", 9 | "green" : "0x7C", 10 | "red" : "0x33" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/KSuiteUtils/Resources/Colors.xcassets/Gradient/gradient.color.3.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xFC", 9 | "green" : "0x55", 10 | "red" : "0xA0" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/KSuiteUtils/Resources/Colors.xcassets/Gradient/gradient.color.4.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xBB", 9 | "green" : "0x4B", 10 | "red" : "0xF3" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/KSuiteUtils/Resources/Colors.xcassets/Gradient/gradient.color.5.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x3D", 9 | "green" : "0x8C", 10 | "red" : "0xFD" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Colors/Grey Elephant.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x66", 9 | "green" : "0x66", 10 | "red" : "0x66" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Colors/Grey Mouse.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xE0", 9 | "green" : "0xE0", 10 | "red" : "0xE0" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Colors/Grey Orca.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x33", 9 | "green" : "0x33", 10 | "red" : "0x33" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Colors/Grey Rabbit.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xF1", 9 | "green" : "0xF1", 10 | "red" : "0xF1" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Colors/Grey Shark.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x9F", 9 | "green" : "0x9F", 10 | "red" : "0x9F" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Resources/Assets.xcassets/Illustrations/background.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "background.svg", 5 | "idiom" : "universal" 6 | }, 7 | { 8 | "appearances" : [ 9 | { 10 | "appearance" : "luminosity", 11 | "value" : "dark" 12 | } 13 | ], 14 | "filename" : "background dark.svg", 15 | "idiom" : "universal" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | }, 22 | "properties" : { 23 | "preserves-vector-representation" : true 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Resources/Assets.xcassets/Icons/person.imageset/person.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Resources/Assets.xcassets/Icons/gradient.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "gradient.svg", 5 | "idiom" : "universal" 6 | }, 7 | { 8 | "appearances" : [ 9 | { 10 | "appearance" : "luminosity", 11 | "value" : "dark" 12 | } 13 | ], 14 | "filename" : "gradient.dark.svg", 15 | "idiom" : "universal" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | }, 22 | "properties" : { 23 | "preserves-vector-representation" : true, 24 | "template-rendering-intent" : "original" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Resources/Assets.xcassets/Icons/myKSuite.logo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "myKSuite.logo.svg", 5 | "idiom" : "universal" 6 | }, 7 | { 8 | "appearances" : [ 9 | { 10 | "appearance" : "luminosity", 11 | "value" : "dark" 12 | } 13 | ], 14 | "filename" : "myKSuite.logo.dark.svg", 15 | "idiom" : "universal" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | }, 22 | "properties" : { 23 | "preserves-vector-representation" : true, 24 | "template-rendering-intent" : "original" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Resources/Assets.xcassets/Icons/myKSuitePlus.logo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "myKSuitePlus.logo.svg", 5 | "idiom" : "universal" 6 | }, 7 | { 8 | "appearances" : [ 9 | { 10 | "appearance" : "luminosity", 11 | "value" : "dark" 12 | } 13 | ], 14 | "filename" : "myKSuitePlus.logo.dark.svg", 15 | "idiom" : "universal" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | }, 22 | "properties" : { 23 | "preserves-vector-representation" : true, 24 | "template-rendering-intent" : "original" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Sources/KSuite/Resources/Assets.xcassets/chevron.right.imageset/chevron.right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Sources/InterAppLogin/Resources/Assets.xcassets/Images/chevron-down.imageset/chevron-down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.github/workflows/dependent-issues.yml: -------------------------------------------------------------------------------- 1 | name: Dependent Issues 2 | 3 | on: 4 | issues: 5 | types: 6 | - opened 7 | - edited 8 | - closed 9 | - reopened 10 | pull_request_target: 11 | types: 12 | - opened 13 | - edited 14 | - closed 15 | - reopened 16 | # Makes sure we always add status check for PRs. Useful only if 17 | # this action is required to pass before merging. Otherwise, it 18 | # can be removed. 19 | - synchronize 20 | 21 | jobs: 22 | check: 23 | runs-on: ubuntu-latest 24 | steps: 25 | - uses: z0al/dependent-issues@v1 26 | env: 27 | # (Required) The token to use to make API calls to GitHub. 28 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 29 | -------------------------------------------------------------------------------- /Sources/InterAppLogin/Resources/Assets.xcassets/Images/check.imageset/check.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /file-header-template.txt: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | Infomaniak Features - iOS 4 | Copyright (C) 2025 Infomaniak Network SA 5 | 6 | This program is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | This program is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with this program. If not, see . 18 | */ 19 | -------------------------------------------------------------------------------- /.github/workflows/swiftformat.yml: -------------------------------------------------------------------------------- 1 | name: SwiftFormat 2 | 3 | on: 4 | pull_request: 5 | branches: [ main, 'protected/**' ] 6 | 7 | concurrency: 8 | group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} 9 | cancel-in-progress: true 10 | 11 | jobs: 12 | build: 13 | name: SwiftFormat 14 | runs-on: [ self-hosted, iOS ] 15 | 16 | steps: 17 | - name: Cancel Previous Runs 18 | uses: styfle/cancel-workflow-action@0.12.1 19 | with: 20 | access_token: ${{ github.token }} 21 | - uses: jdx/mise-action@v2 22 | with: 23 | cache: false 24 | - name: Checkout 25 | uses: actions/checkout@v4 26 | with: 27 | fetch-depth: 0 28 | - name: SwiftFormat 29 | run: swiftformat --lint . --reporter github-actions-log 30 | -------------------------------------------------------------------------------- /.github/workflows/semantic-commit.yml: -------------------------------------------------------------------------------- 1 | name: 'PR and Commit Message Check' 2 | on: 3 | pull_request_target: 4 | types: 5 | - opened 6 | - edited 7 | - reopened 8 | - synchronize 9 | 10 | jobs: 11 | check-commit-message: 12 | name: Check Commit Message 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Check Commit Message 16 | uses: gsactions/commit-message-checker@v2 17 | with: 18 | pattern: '^(Merge .+|((feat|fix|chore|docs|style|refactor|perf|ci|test)(\(.+\))?: [A-Z0-9].+[^.\s])$)' 19 | error: 'Commit messages and PR title should match conventional commit convention and start with an uppercase.' 20 | excludeDescription: 'true' 21 | excludeTitle: 'false' 22 | checkAllCommitMessages: 'true' 23 | accessToken: ${{ secrets.GITHUB_TOKEN }} 24 | -------------------------------------------------------------------------------- /Sources/InterAppLogin/Resources/Localizable/en.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* 2 | * Loco ios export: Xcode Strings (legacy) 3 | * Project: CoreUI 4 | * Locale: en, English 5 | * Tagged: ios, !common, !emoji-reaction, !inapp2fa, !ios-stringsdict, !kSuite, !kSuiteUtils, !my kSuite, !privacy 6 | * Exported by: Philippe Weidmann 7 | * Exported at: Tue, 28 Oct 2025 09:34:38 +0100 8 | */ 9 | 10 | /* loco:684003a81687be54da004145 */ 11 | "buttonCreateAccount" = "Create an account"; 12 | 13 | /* loco:6840035e1687be54da004142 */ 14 | "buttonLogin" = "Login"; 15 | 16 | /* loco:68404629d6574c876e05b382 */ 17 | "buttonUseOtherAccount" = "Use another account"; 18 | 19 | /* loco:684044c80031d880680d8e12 */ 20 | "selectAccountPanelTitle" = "Select one or multiple accounts"; 21 | 22 | /* loco:69007f6a2a2aa4b5eb0d4632 */ 23 | "selectSingleAccountPanelTitle" = "Select one account"; 24 | -------------------------------------------------------------------------------- /.github/workflows/swiftlint.yml: -------------------------------------------------------------------------------- 1 | name: SwiftLint 2 | 3 | on: 4 | pull_request: 5 | branches: [ main, 'protected/**' ] 6 | 7 | concurrency: 8 | group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} 9 | cancel-in-progress: true 10 | 11 | jobs: 12 | build: 13 | name: SwiftLint 14 | runs-on: [ self-hosted, iOS ] 15 | 16 | steps: 17 | - name: Cancel Previous Runs 18 | uses: styfle/cancel-workflow-action@0.12.1 19 | with: 20 | access_token: ${{ github.token }} 21 | - uses: jdx/mise-action@v2 22 | with: 23 | cache: false 24 | - name: Checkout 25 | uses: actions/checkout@v4 26 | with: 27 | fetch-depth: 0 28 | - name: SwiftLint 29 | run: swiftlint --config .swiftlint.yml --config .swiftlint-ci.yml --reporter github-actions-logging . 30 | -------------------------------------------------------------------------------- /Sources/InterAppLogin/Resources/Localizable/it.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* 2 | * Loco ios export: Xcode Strings (legacy) 3 | * Project: CoreUI 4 | * Locale: it, Italian 5 | * Tagged: ios, !common, !emoji-reaction, !inapp2fa, !ios-stringsdict, !kSuite, !kSuiteUtils, !my kSuite, !privacy 6 | * Exported by: Philippe Weidmann 7 | * Exported at: Tue, 28 Oct 2025 09:34:38 +0100 8 | */ 9 | 10 | /* loco:684003a81687be54da004145 */ 11 | "buttonCreateAccount" = "Crea un account"; 12 | 13 | /* loco:6840035e1687be54da004142 */ 14 | "buttonLogin" = "Accesso"; 15 | 16 | /* loco:68404629d6574c876e05b382 */ 17 | "buttonUseOtherAccount" = "Utilizza un altro account"; 18 | 19 | /* loco:684044c80031d880680d8e12 */ 20 | "selectAccountPanelTitle" = "Seleziona uno o più account"; 21 | 22 | /* loco:69007f6a2a2aa4b5eb0d4632 */ 23 | "selectSingleAccountPanelTitle" = "Selezionare un account"; 24 | -------------------------------------------------------------------------------- /Sources/InterAppLogin/Resources/Localizable/de.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* 2 | * Loco ios export: Xcode Strings (legacy) 3 | * Project: CoreUI 4 | * Locale: de, German 5 | * Tagged: ios, !common, !emoji-reaction, !inapp2fa, !ios-stringsdict, !kSuite, !kSuiteUtils, !my kSuite, !privacy 6 | * Exported by: Philippe Weidmann 7 | * Exported at: Tue, 28 Oct 2025 09:34:38 +0100 8 | */ 9 | 10 | /* loco:684003a81687be54da004145 */ 11 | "buttonCreateAccount" = "Ein Konto erstellen"; 12 | 13 | /* loco:6840035e1687be54da004142 */ 14 | "buttonLogin" = "Anmeldung"; 15 | 16 | /* loco:68404629d6574c876e05b382 */ 17 | "buttonUseOtherAccount" = "Ein anderes Konto verwenden"; 18 | 19 | /* loco:684044c80031d880680d8e12 */ 20 | "selectAccountPanelTitle" = "Wählen Sie ein oder mehrere Konten"; 21 | 22 | /* loco:69007f6a2a2aa4b5eb0d4632 */ 23 | "selectSingleAccountPanelTitle" = "Wählen Sie ein Konto"; 24 | -------------------------------------------------------------------------------- /Sources/InterAppLogin/Resources/Localizable/es.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* 2 | * Loco ios export: Xcode Strings (legacy) 3 | * Project: CoreUI 4 | * Locale: es, Spanish 5 | * Tagged: ios, !common, !emoji-reaction, !inapp2fa, !ios-stringsdict, !kSuite, !kSuiteUtils, !my kSuite, !privacy 6 | * Exported by: Philippe Weidmann 7 | * Exported at: Tue, 28 Oct 2025 09:34:38 +0100 8 | */ 9 | 10 | /* loco:684003a81687be54da004145 */ 11 | "buttonCreateAccount" = "Crear una cuenta"; 12 | 13 | /* loco:6840035e1687be54da004142 */ 14 | "buttonLogin" = "Inicio de sesión"; 15 | 16 | /* loco:68404629d6574c876e05b382 */ 17 | "buttonUseOtherAccount" = "Utilizar otra cuenta"; 18 | 19 | /* loco:684044c80031d880680d8e12 */ 20 | "selectAccountPanelTitle" = "Seleccione una o varias cuentas"; 21 | 22 | /* loco:69007f6a2a2aa4b5eb0d4632 */ 23 | "selectSingleAccountPanelTitle" = "Seleccione una cuenta"; 24 | -------------------------------------------------------------------------------- /Sources/InterAppLogin/Resources/Localizable/fr.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* 2 | * Loco ios export: Xcode Strings (legacy) 3 | * Project: CoreUI 4 | * Locale: fr, French 5 | * Tagged: ios, !common, !emoji-reaction, !inapp2fa, !ios-stringsdict, !kSuite, !kSuiteUtils, !my kSuite, !privacy 6 | * Exported by: Philippe Weidmann 7 | * Exported at: Tue, 28 Oct 2025 09:34:38 +0100 8 | */ 9 | 10 | /* loco:684003a81687be54da004145 */ 11 | "buttonCreateAccount" = "Créer un compte"; 12 | 13 | /* loco:6840035e1687be54da004142 */ 14 | "buttonLogin" = "Se connecter"; 15 | 16 | /* loco:68404629d6574c876e05b382 */ 17 | "buttonUseOtherAccount" = "Utiliser un autre compte"; 18 | 19 | /* loco:684044c80031d880680d8e12 */ 20 | "selectAccountPanelTitle" = "Sélectionner un ou plusieurs comptes"; 21 | 22 | /* loco:69007f6a2a2aa4b5eb0d4632 */ 23 | "selectSingleAccountPanelTitle" = "Sélectionner un compte"; 24 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI workflow 2 | 3 | on: 4 | pull_request: 5 | branches: [ main ] 6 | 7 | concurrency: 8 | group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} 9 | cancel-in-progress: true 10 | 11 | jobs: 12 | build_and_test_iOS: 13 | name: Build and Test project on iOS 14 | runs-on: [ self-hosted, iOS ] 15 | 16 | steps: 17 | - name: Cancel Previous Runs 18 | uses: styfle/cancel-workflow-action@0.12.1 19 | with: 20 | access_token: ${{ github.token }} 21 | - name: Checkout 22 | uses: actions/checkout@v4 23 | - name: Build 24 | run: xcodebuild -scheme ios-features-Package build -sdk iphonesimulator -destination "generic/platform=iOS" 25 | - name: Test 26 | run: xcodebuild -scheme ios-features-Package test -destination "platform=iOS Simulator,name=iPhone 17,OS=latest" 27 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: enhancement 6 | assignees: '' 7 | 8 | --- 9 | 10 | 12 | 13 | **Is your feature request related to a problem? Please describe.** 14 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 15 | 16 | **Describe the solution you'd like** 17 | A clear and concise description of what you want to happen. 18 | 19 | **Describe alternatives you've considered** 20 | A clear and concise description of any alternative solutions or features you've considered. 21 | 22 | **Additional context** 23 | Add any other context or screenshots about the feature request here. 24 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Colors/IKRed.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x36", 9 | "green" : "0x43", 10 | "red" : "0xF4" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0x78", 27 | "green" : "0x88", 28 | "red" : "0xFC" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Colors/IKOrange.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x00", 9 | "green" : "0x85", 10 | "red" : "0xFF" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0x4C", 27 | "green" : "0xAA", 28 | "red" : "0xFF" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Sources/InterAppLogin/Resources/Assets.xcassets/Colors/backgroundSecondaryColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xFF", 9 | "green" : "0xFF", 10 | "red" : "0xFF" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0x1A", 27 | "green" : "0x1A", 28 | "red" : "0x1A" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Colors/Feature Primary.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xAE", 9 | "green" : "0x43", 10 | "red" : "0x32" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0xF7", 27 | "green" : "0x7C", 28 | "red" : "0x69" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Colors/Background Primary.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xFD", 9 | "green" : "0xF6", 10 | "red" : "0xF4" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0x19", 27 | "green" : "0x19", 28 | "red" : "0x19" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Colors/Background Secondary.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xFF", 9 | "green" : "0xFF", 10 | "red" : "0xFF" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0x19", 27 | "green" : "0x19", 28 | "red" : "0x19" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Colors/Feature Disabled.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xEF", 9 | "green" : "0xD9", 10 | "red" : "0xD6" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0x2B", 27 | "green" : "0x15", 28 | "red" : "0x12" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Colors/Feature Tertiary.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xF5", 9 | "green" : "0xE8", 10 | "red" : "0xE6" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0x34", 27 | "green" : "0x19", 28 | "red" : "0x15" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Colors/Feature Secondary Disabled.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xF9", 9 | "green" : "0xF0", 10 | "red" : "0xEF" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0x6B", 27 | "green" : "0x5B", 28 | "red" : "0x59" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Sources/Utils/Formatters.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import SwiftUI 20 | 21 | extension FormatStyle where Self == ByteCountFormatStyle { 22 | static var defaultByteCount: ByteCountFormatStyle { 23 | return .byteCount(style: .binary) 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Images/shield.imageset/shield.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | 12 | 13 | **Description** 14 | A clear and concise description of what the bug is. 15 | 16 | **Steps to reproduce** 17 | Steps to reproduce the behavior: 18 | 1. Go to '...' 19 | 2. Click on '....' 20 | 3. Scroll down to '....' 21 | 4. See error 22 | 23 | **Expected behavior** 24 | A clear and concise description of what you expected to happen. 25 | 26 | **Screenshots** 27 | If applicable, add screenshots to help explain your problem. 28 | 29 | **Smartphone (please complete the following information):** 30 | - Device: [e.g. iPhone 12] 31 | - iOS version: [e.g. iOS 14.0] 32 | - App version: [e.g. 4.0.1] 33 | 34 | **Additional context** 35 | Add any other context about the problem here. 36 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/swiftgen.yml: -------------------------------------------------------------------------------- 1 | # iOS Features - iOS 2 | # Copyright (C) 2025 Infomaniak Network SA 3 | # 4 | # This program is free software: you can redistribute it and/or modify 5 | # it under the terms of the GNU General Public License as published by 6 | # the Free Software Foundation, either version 3 of the License, or 7 | # (at your option) any later version. 8 | # 9 | # This program is distributed in the hope that it will be useful, 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | # GNU General Public License for more details. 13 | # 14 | # You should have received a copy of the GNU General Public License 15 | # along with this program. If not, see . 16 | 17 | output_dir: Generated/ 18 | 19 | strings: 20 | inputs: Resources/Localizable/en.lproj 21 | outputs: 22 | - templateName: structured-swift5 23 | output: Strings+Generated.swift 24 | params: 25 | enumName: Localizable 26 | -------------------------------------------------------------------------------- /Sources/InterAppLogin/swiftgen.yml: -------------------------------------------------------------------------------- 1 | # iOS Features - iOS 2 | # Copyright (C) 2025 Infomaniak Network SA 3 | # 4 | # This program is free software: you can redistribute it and/or modify 5 | # it under the terms of the GNU General Public License as published by 6 | # the Free Software Foundation, either version 3 of the License, or 7 | # (at your option) any later version. 8 | # 9 | # This program is distributed in the hope that it will be useful, 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | # GNU General Public License for more details. 13 | # 14 | # You should have received a copy of the GNU General Public License 15 | # along with this program. If not, see . 16 | 17 | output_dir: Generated/ 18 | 19 | strings: 20 | inputs: Resources/Localizable/en.lproj 21 | outputs: 22 | - templateName: structured-swift5 23 | output: Strings+Generated.swift 24 | params: 25 | enumName: InterAppLoginLocalizable 26 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Sources/Utils/OSLog+Extension.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import OSLog 20 | 21 | extension Logger { 22 | private static let subsystem = Bundle.main.bundleIdentifier ?? "com.infomaniak.myKSuite" 23 | 24 | static let general = Logger(subsystem: subsystem, category: "general") 25 | } 26 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Sources/Core/Models/Capability+Extension.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import DeviceAssociation 20 | import Foundation 21 | 22 | public extension Capability { 23 | static let twoFactorAuthenticationChallengeApproval = Capability(rawValue: "2fa:push_challenge:approval") 24 | } 25 | -------------------------------------------------------------------------------- /Sources/KSuite/Resources/Assets.xcassets/envelope.imageset/envelope.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Sources/Core/NotificationConstants.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import Foundation 20 | 21 | enum NotificationUserInfoKeys { 22 | static let userId = "user_id" 23 | static let type = "type" 24 | } 25 | 26 | enum NotificationType { 27 | static let challengeApproval = "2fa:push_challenge:approval" 28 | } 29 | -------------------------------------------------------------------------------- /Sources/KSuiteUtils/Utils/KSuiteLabel.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import SwiftUI 20 | 21 | public struct KSuiteLabel: Identifiable { 22 | public let id: String 23 | 24 | public let icon: Image 25 | public let text: String 26 | 27 | public init(icon: Image, text: String) { 28 | self.icon = icon 29 | self.text = text 30 | id = text 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Localizable/en.lproj/Localizable.stringsdict: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | 12 | 13 | twoFactorAuthMinutesAgoLabel 14 | 15 | NSStringLocalizedFormatKey 16 | %#@value@ 17 | value 18 | 19 | NSStringFormatSpecTypeKey 20 | NSStringPluralRuleType 21 | NSStringFormatValueTypeKey 22 | d 23 | one 24 | A minute ago 25 | other 26 | %d minutes ago 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Localizable/it.lproj/Localizable.stringsdict: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | 12 | 13 | twoFactorAuthMinutesAgoLabel 14 | 15 | NSStringLocalizedFormatKey 16 | %#@value@ 17 | value 18 | 19 | NSStringFormatSpecTypeKey 20 | NSStringPluralRuleType 21 | NSStringFormatValueTypeKey 22 | d 23 | one 24 | un minuto fa 25 | other 26 | %d minuti fa 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Localizable/de.lproj/Localizable.stringsdict: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | 12 | 13 | twoFactorAuthMinutesAgoLabel 14 | 15 | NSStringLocalizedFormatKey 16 | %#@value@ 17 | value 18 | 19 | NSStringFormatSpecTypeKey 20 | NSStringPluralRuleType 21 | NSStringFormatValueTypeKey 22 | d 23 | one 24 | vor einer Minute 25 | other 26 | vor %d Minuten 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Localizable/es.lproj/Localizable.stringsdict: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | 12 | 13 | twoFactorAuthMinutesAgoLabel 14 | 15 | NSStringLocalizedFormatKey 16 | %#@value@ 17 | value 18 | 19 | NSStringFormatSpecTypeKey 20 | NSStringPluralRuleType 21 | NSStringFormatValueTypeKey 22 | d 23 | one 24 | hace un minuto 25 | other 26 | hace %d minutos 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Localizable/fr.lproj/Localizable.stringsdict: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | 12 | 13 | twoFactorAuthMinutesAgoLabel 14 | 15 | NSStringLocalizedFormatKey 16 | %#@value@ 17 | value 18 | 19 | NSStringFormatSpecTypeKey 20 | NSStringPluralRuleType 21 | NSStringFormatValueTypeKey 22 | d 23 | one 24 | il y a une minute 25 | other 26 | il y a %d minutes 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Resources/Assets.xcassets/Icons/information.imageset/information.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /Sources/InterAppLogin/Sources/Extensions/Font+Extension.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import SwiftUI 20 | 21 | extension Font { 22 | enum Custom { 23 | /// Figma name: *Body Medium* 24 | static let headline = Font.dynamicTypeSizeFont(size: 16, weight: .medium, relativeTo: .headline) 25 | 26 | /// Figma name: *Body Regular* 27 | static let body = Font.dynamicTypeSizeFont(size: 16, weight: .regular, relativeTo: .body) 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Sources/KSuite/swiftgen.yml: -------------------------------------------------------------------------------- 1 | # iOS Features - iOS 2 | # Copyright (C) 2025 Infomaniak Network SA 3 | # 4 | # This program is free software: you can redistribute it and/or modify 5 | # it under the terms of the GNU General Public License as published by 6 | # the Free Software Foundation, either version 3 of the License, or 7 | # (at your option) any later version. 8 | # 9 | # This program is distributed in the hope that it will be useful, 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | # GNU General Public License for more details. 13 | # 14 | # You should have received a copy of the GNU General Public License 15 | # along with this program. If not, see . 16 | 17 | output_dir: Generated/ 18 | 19 | strings: 20 | inputs: Resources/Localizable/en.lproj 21 | outputs: 22 | - templateName: structured-swift5 23 | output: Strings+Generated.swift 24 | params: 25 | enumName: KSuiteLocalizable 26 | publicAccess: true 27 | xcassets: 28 | inputs: 29 | - Resources/Assets.xcassets 30 | outputs: 31 | - templateName: swift5 32 | output: Resources+Generated.swift 33 | params: 34 | enumName: KSuiteResources 35 | publicAccess: true 36 | -------------------------------------------------------------------------------- /Sources/MyKSuite/swiftgen.yml: -------------------------------------------------------------------------------- 1 | # iOS Features - iOS 2 | # Copyright (C) 2025 Infomaniak Network SA 3 | # 4 | # This program is free software: you can redistribute it and/or modify 5 | # it under the terms of the GNU General Public License as published by 6 | # the Free Software Foundation, either version 3 of the License, or 7 | # (at your option) any later version. 8 | # 9 | # This program is distributed in the hope that it will be useful, 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | # GNU General Public License for more details. 13 | # 14 | # You should have received a copy of the GNU General Public License 15 | # along with this program. If not, see . 16 | 17 | output_dir: Generated/ 18 | 19 | strings: 20 | inputs: Resources/Localizable/en.lproj 21 | outputs: 22 | - templateName: structured-swift5 23 | output: Strings+Generated.swift 24 | params: 25 | enumName: MyKSuiteLocalizable 26 | publicAccess: true 27 | xcassets: 28 | inputs: 29 | - Resources/Assets.xcassets 30 | outputs: 31 | - templateName: swift5 32 | output: Resources+Generated.swift 33 | params: 34 | enumName: MyKSuiteResources 35 | publicAccess: true 36 | -------------------------------------------------------------------------------- /Sources/KSuiteUtils/swiftgen.yml: -------------------------------------------------------------------------------- 1 | # iOS Features - iOS 2 | # Copyright (C) 2025 Infomaniak Network SA 3 | # 4 | # This program is free software: you can redistribute it and/or modify 5 | # it under the terms of the GNU General Public License as published by 6 | # the Free Software Foundation, either version 3 of the License, or 7 | # (at your option) any later version. 8 | # 9 | # This program is distributed in the hope that it will be useful, 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | # GNU General Public License for more details. 13 | # 14 | # You should have received a copy of the GNU General Public License 15 | # along with this program. If not, see . 16 | 17 | output_dir: Generated/ 18 | 19 | strings: 20 | inputs: Resources/Localizable/en.lproj 21 | outputs: 22 | - templateName: structured-swift5 23 | output: Strings+Generated.swift 24 | params: 25 | enumName: KSuiteUtilsLocalizable 26 | publicAccess: true 27 | xcassets: 28 | inputs: 29 | - Resources/Colors.xcassets 30 | outputs: 31 | - templateName: swift5 32 | output: Resources+Generated.swift 33 | params: 34 | enumName: KSuiteUtilsResources 35 | publicAccess: true 36 | -------------------------------------------------------------------------------- /Sources/KSuite/Resources/Assets.xcassets/plus.circle.imageset/plus.circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Sources/Utils/Product.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import KSuiteUtils 20 | import SwiftUI 21 | 22 | enum Product { 23 | case mail 24 | case drive 25 | 26 | var title: String { 27 | switch self { 28 | case .mail: 29 | return "Mail" 30 | case .drive: 31 | return "kDrive" 32 | } 33 | } 34 | 35 | var color: Color { 36 | switch self { 37 | case .mail: 38 | return KSuiteUtilsResources.productMail.swiftUIColor 39 | case .drive: 40 | return KSuiteUtilsResources.productDrive.swiftUIColor 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Sources/UI/ConnectionConfirmationView/FittingConnectionConfirmationView.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import SwiftUI 20 | 21 | struct FittingView: View { 22 | @ViewBuilder let content: (Bool) -> Content 23 | 24 | var body: some View { 25 | if #available(iOS 16.0, *) { 26 | ViewThatFits(in: .vertical) { 27 | content(false) 28 | 29 | ScrollView { 30 | content(true) 31 | } 32 | } 33 | } else { 34 | ScrollView { 35 | content(true) 36 | } 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Sources/Core/Models/InAppTwoFactorAuthenticationSession.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import InfomaniakCore 20 | 21 | public struct InAppTwoFactorAuthenticationSession { 22 | let user: InfomaniakUser 23 | let apiFetcher: any InAppTwoFactorAuthenticationFetchable 24 | 25 | public init(user: InfomaniakUser, apiFetcher: ApiFetcher) { 26 | self.user = user 27 | self.apiFetcher = InAppTwoFactorAuthenticationFetcher(apiFetcher: apiFetcher) 28 | } 29 | 30 | init(user: InfomaniakUser, apiFetcher: MockInAppTwoFactorAuthenticationFetcher) { 31 | self.user = user 32 | self.apiFetcher = apiFetcher 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Sources/KSuite/Resources/Assets.xcassets/folder.imageset/folder.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Sources/InterAppLogin/Sources/Extensions/Color+Extension.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import SwiftUI 20 | 21 | extension Color { 22 | enum Custom { 23 | /// light: greyOrca / dark: greyRabbit 24 | static let textPrimary = Color( 25 | light: UIColor.greyOrca, 26 | dark: UIColor.greyRabbit 27 | ) 28 | /// light: greyElephant / dark: greyShark 29 | static let textSecondary = Color( 30 | light: UIColor.greyElephant, 31 | dark: UIColor.greyShark 32 | ) 33 | 34 | /// light: greyMouse / dark: greyOrca 35 | static let divider = Color( 36 | light: UIColor.greyMouse, 37 | dark: UIColor.greyOrca 38 | ) 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Sources/Networking/ApiFetcher+Extension.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import Alamofire 20 | import Foundation 21 | import InfomaniakCore 22 | 23 | public protocol KSuiteApiFetchable { 24 | func myKSuite() async throws -> MyKSuite 25 | } 26 | 27 | extension Endpoint { 28 | static func myKSuite() -> Endpoint { 29 | return Endpoint(path: "/1/my_ksuite/current", 30 | queryItems: [ 31 | URLQueryItem(name: "with", value: "drive,mail") 32 | ]) 33 | } 34 | } 35 | 36 | extension ApiFetcher: KSuiteApiFetchable { 37 | public func myKSuite() async throws -> MyKSuite { 38 | return try await perform(request: authenticatedRequest(.myKSuite())) 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Sources/UI/Extensions/Font+Extension.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import SwiftUI 20 | 21 | extension Font { 22 | enum Custom { 23 | /// Figma name: *Titre H2* 24 | static let title2 = Font.dynamicTypeSizeFont(size: 18, weight: .semibold, relativeTo: .title2) 25 | 26 | /// Figma name: *Body Medium* 27 | static let headline = Font.dynamicTypeSizeFont(size: 16, weight: .medium, relativeTo: .headline) 28 | 29 | /// Figma name: *Body Regular* 30 | static let body = Font.dynamicTypeSizeFont(size: 16, weight: .regular, relativeTo: .body) 31 | 32 | /// Figma name: *Body Small Regular* 33 | static let callout = Font.dynamicTypeSizeFont(size: 14, weight: .regular, relativeTo: .callout) 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Sources/InterAppLogin/Sources/UI/CenteringPlaceholderAvatarStackView.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import SwiftUI 20 | 21 | struct CenteringPlaceholderAvatarStackView: View { 22 | let width: CGFloat 23 | 24 | init( 25 | accounts: [ConnectedAccount], 26 | size: CGFloat = ConnectedAccountAvatarStackView.defaultSize, 27 | maxStackSize: Int = ConnectedAccountAvatarStackView.defaultMaxStackSize 28 | ) { 29 | width = 0.6 * size * CGFloat(min(maxStackSize, accounts.count)) 30 | } 31 | 32 | var body: some View { 33 | Color.clear 34 | .frame(width: width, height: 1) 35 | } 36 | } 37 | 38 | #Preview { 39 | CenteringPlaceholderAvatarStackView( 40 | accounts: PreviewHelper.allAccounts, 41 | size: 40, 42 | maxStackSize: 3 43 | ) 44 | } 45 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Sources/UI/ConnectionConfirmationView/MainContentView/TimeAgoView.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import SwiftUI 20 | 21 | struct TimeAgoView: View { 22 | let challengeCreatedAt: Date 23 | 24 | var body: some View { 25 | TimelineView(.periodic(from: challengeCreatedAt, by: 60)) { context in 26 | Text(text(for: context.date)) 27 | } 28 | } 29 | 30 | func text(for date: Date) -> String { 31 | let secondsAgo = Int(date.timeIntervalSince(challengeCreatedAt)) 32 | 33 | if secondsAgo >= 60 { 34 | return Localizable.twoFactorAuthMinutesAgoLabel(secondsAgo / 60) 35 | } else { 36 | return Localizable.twoFactorAuthJustNowLabel 37 | } 38 | } 39 | } 40 | 41 | #Preview { 42 | TimeAgoView(challengeCreatedAt: Date()) 43 | } 44 | -------------------------------------------------------------------------------- /Sources/KSuiteUtils/Generated/Strings+Generated.swift: -------------------------------------------------------------------------------- 1 | // swiftlint:disable all 2 | // Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen 3 | 4 | import Foundation 5 | 6 | // swiftlint:disable superfluous_disable_command file_length implicit_return prefer_self_in_static_references 7 | 8 | // MARK: - Strings 9 | 10 | // swiftlint:disable explicit_type_interface function_parameter_count identifier_name line_length 11 | // swiftlint:disable nesting type_body_length type_name vertical_whitespace_opening_braces 12 | public enum KSuiteUtilsLocalizable { 13 | /// loco:679237f6daa3807fa008b175 14 | public static let buttonClose = KSuiteUtilsLocalizable.tr("Localizable", "buttonClose", fallback: "Close") 15 | } 16 | // swiftlint:enable explicit_type_interface function_parameter_count identifier_name line_length 17 | // swiftlint:enable nesting type_body_length type_name vertical_whitespace_opening_braces 18 | 19 | // MARK: - Implementation Details 20 | 21 | extension KSuiteUtilsLocalizable { 22 | private static func tr(_ table: String, _ key: String, _ args: CVarArg..., fallback value: String) -> String { 23 | let format = BundleToken.bundle.localizedString(forKey: key, value: value, table: table) 24 | return String(format: format, locale: Locale.current, arguments: args) 25 | } 26 | } 27 | 28 | // swiftlint:disable convenience_type 29 | private final class BundleToken { 30 | static let bundle: Bundle = { 31 | #if SWIFT_PACKAGE 32 | return Bundle.module 33 | #else 34 | return Bundle(for: BundleToken.self) 35 | #endif 36 | }() 37 | } 38 | // swiftlint:enable convenience_type 39 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Sources/Core/Models/RemoteChallenge.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import Foundation 20 | 21 | enum DeviceType: String, Decodable { 22 | case computer 23 | case phone 24 | case tablet 25 | } 26 | 27 | struct Device: Decodable { 28 | let name: String 29 | let type: DeviceType 30 | } 31 | 32 | enum ChallengeType: String, Decodable { 33 | case approval 34 | case unknown 35 | 36 | init(from decoder: any Decoder) throws { 37 | let singleKeyContainer = try decoder.singleValueContainer() 38 | let value = try singleKeyContainer.decode(String.self) 39 | 40 | self = ChallengeType(rawValue: value) ?? .unknown 41 | } 42 | } 43 | 44 | struct RemoteChallenge: Decodable { 45 | let uuid: String 46 | let type: ChallengeType 47 | let device: Device 48 | let location: String 49 | let createdAt: Date 50 | let expiresAt: Date 51 | } 52 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Sources/UI/Extensions/Color+Extension.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import SwiftUI 20 | 21 | extension Color { 22 | enum Custom { 23 | /// light: greyOrca / dark: greyRabbit 24 | static let textPrimary = Color( 25 | light: UIColor.greyOrca, 26 | dark: UIColor.greyRabbit 27 | ) 28 | /// light: greyElephant / dark: greyShark 29 | static let textSecondary = Color( 30 | light: UIColor.greyElephant, 31 | dark: UIColor.greyMouse 32 | ) 33 | 34 | /// light: greyMouse / dark: greyOrca 35 | static let divider = Color( 36 | light: UIColor.greyMouse, 37 | dark: UIColor.greyOrca 38 | ) 39 | 40 | /// light: greyMouse / dark: greyOrca 41 | static let cardOutline = Color( 42 | light: UIColor.clear, 43 | dark: UIColor.greyOrca 44 | ) 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /Sources/InterAppLogin/Resources/Localizable/de.lproj/Localizable.stringsdict: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | 12 | 13 | buttonContinueWithAccounts 14 | 15 | NSStringLocalizedFormatKey 16 | %#@value@ 17 | value 18 | 19 | NSStringFormatSpecTypeKey 20 | NSStringPluralRuleType 21 | NSStringFormatValueTypeKey 22 | d 23 | one 24 | Weiter mit diesem Konto 25 | other 26 | Weiter mit diesen Konten 27 | 28 | 29 | selectedAccountCountLabel 30 | 31 | NSStringLocalizedFormatKey 32 | %#@value@ 33 | value 34 | 35 | NSStringFormatSpecTypeKey 36 | NSStringPluralRuleType 37 | NSStringFormatValueTypeKey 38 | d 39 | one 40 | %d Konto ausgewählt 41 | other 42 | %d Konten ausgewählt 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /Sources/InterAppLogin/Resources/Localizable/it.lproj/Localizable.stringsdict: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | 12 | 13 | buttonContinueWithAccounts 14 | 15 | NSStringLocalizedFormatKey 16 | %#@value@ 17 | value 18 | 19 | NSStringFormatSpecTypeKey 20 | NSStringPluralRuleType 21 | NSStringFormatValueTypeKey 22 | d 23 | one 24 | Continua con questo account 25 | other 26 | Continua con questi conti 27 | 28 | 29 | selectedAccountCountLabel 30 | 31 | NSStringLocalizedFormatKey 32 | %#@value@ 33 | value 34 | 35 | NSStringFormatSpecTypeKey 36 | NSStringPluralRuleType 37 | NSStringFormatValueTypeKey 38 | d 39 | one 40 | %d conto selezionato 41 | other 42 | %d conti selezionati 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /Sources/InterAppLogin/Resources/Localizable/en.lproj/Localizable.stringsdict: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | 12 | 13 | buttonContinueWithAccounts 14 | 15 | NSStringLocalizedFormatKey 16 | %#@value@ 17 | value 18 | 19 | NSStringFormatSpecTypeKey 20 | NSStringPluralRuleType 21 | NSStringFormatValueTypeKey 22 | d 23 | one 24 | Continue with this account 25 | other 26 | Continue with these accounts 27 | 28 | 29 | selectedAccountCountLabel 30 | 31 | NSStringLocalizedFormatKey 32 | %#@value@ 33 | value 34 | 35 | NSStringFormatSpecTypeKey 36 | NSStringPluralRuleType 37 | NSStringFormatValueTypeKey 38 | d 39 | one 40 | %d account selected 41 | other 42 | %d accounts selected 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /Sources/InterAppLogin/Resources/Localizable/fr.lproj/Localizable.stringsdict: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | 12 | 13 | buttonContinueWithAccounts 14 | 15 | NSStringLocalizedFormatKey 16 | %#@value@ 17 | value 18 | 19 | NSStringFormatSpecTypeKey 20 | NSStringPluralRuleType 21 | NSStringFormatValueTypeKey 22 | d 23 | one 24 | Continuer avec ce compte 25 | other 26 | Continuer avec ces comptes 27 | 28 | 29 | selectedAccountCountLabel 30 | 31 | NSStringLocalizedFormatKey 32 | %#@value@ 33 | value 34 | 35 | NSStringFormatSpecTypeKey 36 | NSStringPluralRuleType 37 | NSStringFormatValueTypeKey 38 | d 39 | one 40 | %d compte sélectionné 41 | other 42 | %d comptes sélectionnés 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Resources/Assets.xcassets/Icons/plane.imageset/plane.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Sources/InterAppLogin/Resources/Localizable/es.lproj/Localizable.stringsdict: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | 12 | 13 | buttonContinueWithAccounts 14 | 15 | NSStringLocalizedFormatKey 16 | %#@value@ 17 | value 18 | 19 | NSStringFormatSpecTypeKey 20 | NSStringPluralRuleType 21 | NSStringFormatValueTypeKey 22 | d 23 | one 24 | Continuar con esta cuenta 25 | other 26 | Continuar con estas cuentas 27 | 28 | 29 | selectedAccountCountLabel 30 | 31 | NSStringLocalizedFormatKey 32 | %#@value@ 33 | value 34 | 35 | NSStringFormatSpecTypeKey 36 | NSStringPluralRuleType 37 | NSStringFormatValueTypeKey 38 | d 39 | one 40 | %d cuenta seleccionada 41 | other 42 | %d cuentas seleccionadas 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Sources/MyKSuiteView.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import DesignSystem 20 | import InfomaniakCoreSwiftUI 21 | import KSuiteUtils 22 | import SwiftUI 23 | 24 | public struct MyKSuiteView: View { 25 | @Environment(\.dismiss) private var dismiss 26 | 27 | private let configuration: MyKSuiteConfiguration 28 | 29 | public init(configuration: MyKSuiteConfiguration) { 30 | self.configuration = configuration 31 | } 32 | 33 | public var body: some View { 34 | UpSalePanelView( 35 | headerImage: MyKSuiteResources.gradient.swiftUIImage, 36 | title: MyKSuiteLocalizable.myKSuiteUpgradeTitle, 37 | description: MyKSuiteLocalizable.myKSuiteUpgradeDescription, 38 | labels: configuration.labels, 39 | additionalText: MyKSuiteLocalizable.myKSuiteUpgradeDetails 40 | ) 41 | } 42 | } 43 | 44 | #Preview("kDrive") { 45 | MyKSuiteView(configuration: .kDrive) 46 | } 47 | 48 | #Preview("Mail") { 49 | MyKSuiteView(configuration: .mail) 50 | } 51 | -------------------------------------------------------------------------------- /Sources/KSuite/Resources/Assets.xcassets/microsoft.imageset/microsoft.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Resources/Assets.xcassets/Icons/envelope.imageset/envelope.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Sources/MyKSuitePanelModifier.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import InfomaniakCoreSwiftUI 20 | import SwiftUI 21 | 22 | struct MyKSuitePanelModifier: ViewModifier { 23 | @Binding var isPresented: Bool 24 | let backgroundColor: Color 25 | let configuration: MyKSuiteConfiguration 26 | 27 | func body(content: Content) -> some View { 28 | content 29 | .floatingPanel(isPresented: $isPresented, 30 | closeButtonHidden: true, 31 | backgroundColor: backgroundColor) { 32 | MyKSuiteView(configuration: configuration) 33 | } 34 | } 35 | } 36 | 37 | public extension View { 38 | func myKSuitePanel(isPresented: Binding, backgroundColor: Color, configuration: MyKSuiteConfiguration) -> some View { 39 | modifier(MyKSuitePanelModifier(isPresented: isPresented, backgroundColor: backgroundColor, configuration: configuration)) 40 | } 41 | } 42 | 43 | #Preview { 44 | Text("Hello world!") 45 | .myKSuitePanel(isPresented: .constant(true), backgroundColor: .white, configuration: .kDrive) 46 | } 47 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.toptal.com/developers/gitignore/api/swiftpackagemanager,macos,xcode 2 | # Edit at https://www.toptal.com/developers/gitignore?templates=swiftpackagemanager,macos,xcode 3 | 4 | ### macOS ### 5 | # General 6 | .DS_Store 7 | .AppleDouble 8 | .LSOverride 9 | 10 | # Icon must end with two \r 11 | Icon 12 | 13 | # Thumbnails 14 | ._* 15 | 16 | # Files that might appear in the root of a volume 17 | .DocumentRevisions-V100 18 | .fseventsd 19 | .Spotlight-V100 20 | .TemporaryItems 21 | .Trashes 22 | .VolumeIcon.icns 23 | .com.apple.timemachine.donotpresent 24 | 25 | # Directories potentially created on remote AFP share 26 | .AppleDB 27 | .AppleDesktop 28 | Network Trash Folder 29 | Temporary Items 30 | .apdisk 31 | 32 | ### SwiftPackageManager ### 33 | Packages 34 | .build/ 35 | xcuserdata 36 | DerivedData/ 37 | *.xcodeproj 38 | 39 | 40 | ### Xcode ### 41 | # Xcode 42 | # 43 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 44 | 45 | ## User settings 46 | xcuserdata/ 47 | 48 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) 49 | *.xcscmblueprint 50 | *.xccheckout 51 | 52 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) 53 | build/ 54 | *.moved-aside 55 | *.pbxuser 56 | !default.pbxuser 57 | *.mode1v3 58 | !default.mode1v3 59 | *.mode2v3 60 | !default.mode2v3 61 | *.perspectivev3 62 | !default.perspectivev3 63 | 64 | ## Gcc Patch 65 | /*.gcno 66 | 67 | ### Xcode Patch ### 68 | *.xcodeproj/* 69 | !*.xcodeproj/project.pbxproj 70 | !*.xcodeproj/xcshareddata/ 71 | !*.xcworkspace/contents.xcworkspacedata 72 | **/xcshareddata/WorkspaceSettings.xcsettings 73 | 74 | # End of https://www.toptal.com/developers/gitignore/api/swiftpackagemanager,macos,xcode% 75 | -------------------------------------------------------------------------------- /Sources/KSuiteUtils/Utils/FontHelper.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import SwiftUI 20 | 21 | public enum FontHelper { 22 | private static func dynamicTypeSizeFont(size: CGFloat, weight: Font.Weight, relativeTo textStyle: Font.TextStyle) -> Font { 23 | let fontFamily = UIFont.preferredFont(forTextStyle: .body).familyName 24 | return Font.custom(fontFamily, size: size, relativeTo: textStyle).weight(weight) 25 | } 26 | 27 | public static let title: Font = dynamicTypeSizeFont(size: 18, weight: .semibold, relativeTo: .title2) 28 | 29 | // MARK: - Regular 30 | 31 | public static let body: Font = dynamicTypeSizeFont(size: 16, weight: .regular, relativeTo: .body) 32 | public static let bodySmall: Font = dynamicTypeSizeFont(size: 14, weight: .regular, relativeTo: .callout) 33 | 34 | // MARK: - Medium 35 | 36 | public static let bodyMedium: Font = dynamicTypeSizeFont(size: 16, weight: .medium, relativeTo: .headline) 37 | 38 | public static let bodySmallMedium: Font = dynamicTypeSizeFont(size: 14, weight: .medium, relativeTo: .callout) 39 | public static let labelMedium: Font = dynamicTypeSizeFont(size: 12, weight: .medium, relativeTo: .caption) 40 | } 41 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Sources/UI/CheckConnectionAttemptsViewModifier.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import InfomaniakCore 20 | import InfomaniakDI 21 | import SwiftUI 22 | 23 | public extension View { 24 | func checkConnectionAttempts(using sessions: [InAppTwoFactorAuthenticationSession]) -> some View { 25 | modifier(CheckConnectionAttemptsViewModifier(sessions: sessions)) 26 | } 27 | } 28 | 29 | struct CheckConnectionAttemptsViewModifier: ViewModifier { 30 | let sessions: [InAppTwoFactorAuthenticationSession] 31 | 32 | func body(content: Content) -> some View { 33 | content 34 | .sceneLifecycle(willEnterForeground: fetchPendingConnectionAttempts) 35 | } 36 | 37 | func fetchPendingConnectionAttempts() { 38 | @InjectService var twoFactorAuthenticationManager: InAppTwoFactorAuthenticationManagerable 39 | twoFactorAuthenticationManager.checkConnectionAttempts(using: sessions) 40 | } 41 | } 42 | 43 | @available(iOS 17.0, *) 44 | #Preview { 45 | @Previewable @State var assembly = PreviewTargetAssembly() 46 | Text("Some app") 47 | .checkConnectionAttempts(using: [InAppTwoFactorAuthenticationSession.preview]) 48 | } 49 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Sources/Components/CardModifier.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import DesignSystem 20 | import KSuiteUtils 21 | import SwiftUI 22 | 23 | struct CardModifier: ViewModifier { 24 | @Environment(\.colorScheme) private var colorScheme 25 | 26 | let withStroke: Bool 27 | 28 | private var strokeOpacity: Double { 29 | if withStroke { 30 | return colorScheme == .light ? 0 : 1 31 | } 32 | return 0 33 | } 34 | 35 | private var shadowOpacity: Double { 36 | colorScheme == .light ? 0.3 : 0 37 | } 38 | 39 | func body(content: Content) -> some View { 40 | content 41 | .clipShape(.rect(cornerRadius: IKRadius.large)) 42 | .overlay { 43 | RoundedRectangle(cornerRadius: IKRadius.large) 44 | .strokeBorder(KSuiteUtilsResources.elephant.swiftUIColor.opacity(strokeOpacity), lineWidth: 1) 45 | } 46 | .shadow(color: KSuiteUtilsResources.shark.swiftUIColor.opacity(shadowOpacity), radius: 10) 47 | } 48 | } 49 | 50 | extension View { 51 | func cardStyle(withStroke: Bool = true) -> some View { 52 | modifier(CardModifier(withStroke: withStroke)) 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /Sources/KSuite/KSuiteProUpgradeChip.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import DesignSystem 20 | import InfomaniakCoreSwiftUI 21 | import KSuiteUtils 22 | import SwiftUI 23 | 24 | public struct KSuiteProUpgradeChip: View { 25 | public init() {} 26 | 27 | public var body: some View { 28 | HStack { 29 | Text(KSuiteLocalizable.kSuiteUpgradeButton) 30 | .font(.system(size: 10)) 31 | .foregroundStyle(ColorHelper.primary) 32 | 33 | KSuiteResources.rocket.swiftUIImage 34 | .resizable() 35 | .scaledToFit() 36 | .frame(width: 12) 37 | .foregroundStyle(ColorHelper.gradient) 38 | } 39 | .padding(.horizontal, value: .mini) 40 | .padding(.vertical, 6) 41 | .background( 42 | ZStack { 43 | ColorHelper.chipBackground 44 | .clipShape(Capsule()) 45 | 46 | Capsule() 47 | .strokeBorder( 48 | ColorHelper.gradient, 49 | lineWidth: 1 50 | ) 51 | } 52 | ) 53 | } 54 | } 55 | 56 | #Preview { 57 | KSuiteProUpgradeChip() 58 | } 59 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Sources/Networking/MyKSuite.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import SwiftUI 20 | 21 | public struct MyKSuite: Codable, Sendable { 22 | let id: Int 23 | let drive: Drive 24 | let mail: Mail 25 | let trialExpiryAt: Int? 26 | 27 | public let isFree: Bool 28 | 29 | var icon: Image { 30 | if isFree { 31 | return MyKSuiteResources.myKSuiteLogo.swiftUIImage 32 | } 33 | return MyKSuiteResources.myKSuitePlusLogo.swiftUIImage 34 | } 35 | 36 | var formattedTrialExpiryDate: String? { 37 | guard let trialExpiryAt else { return nil } 38 | let date = Date(timeIntervalSince1970: TimeInterval(trialExpiryAt)) 39 | 40 | let formatter = DateFormatter() 41 | formatter.dateStyle = .short 42 | return formatter.string(from: date) 43 | } 44 | 45 | public var email: String { 46 | mail.email 47 | } 48 | } 49 | 50 | struct Drive: Codable { 51 | let id: Int 52 | let name: String 53 | let size: Int64 54 | let usedSize: Int64 55 | } 56 | 57 | struct Mail: Codable { 58 | let id: Int 59 | let dailyLimitSent: Int 60 | let storageSizeLimit: Int64 61 | let email: String 62 | let usedSize: Int64 63 | } 64 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Sources/Dashboard/ProductProgressView.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import DesignSystem 20 | import KSuiteUtils 21 | import SwiftUI 22 | 23 | struct ProductProgressView: View { 24 | @Environment(\.colorScheme) private var colorScheme 25 | let product: Product 26 | let usedValue: Int64 27 | let totalValue: Int64 28 | 29 | var body: some View { 30 | VStack(spacing: IKPadding.mini) { 31 | HStack { 32 | Text(product.title) 33 | .frame(maxWidth: .infinity, alignment: .leading) 34 | .foregroundStyle(ColorHelper.primary) 35 | .font(FontHelper.body) 36 | 37 | Text("\(usedValue.formatted(.defaultByteCount)) / \(totalValue.formatted(.defaultByteCount))") 38 | .foregroundStyle(ColorHelper.secondary) 39 | .font(FontHelper.bodySmall) 40 | } 41 | 42 | ProgressView(value: Double(usedValue), total: Double(totalValue)) 43 | .progressViewStyle(CustomProgressBar()) 44 | .foregroundStyle(product.color) 45 | } 46 | } 47 | } 48 | 49 | #Preview { 50 | ProductProgressView(product: .mail, usedValue: 2300, totalValue: 20) 51 | } 52 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Sources/UI/ConnectionConfirmationView/MainContentView/RowView.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import DesignSystem 20 | import SwiftUI 21 | 22 | struct RowView: View { 23 | let title: String 24 | @ViewBuilder let description: Content 25 | 26 | var body: some View { 27 | VStack(alignment: .leading, spacing: IKPadding.micro) { 28 | Text(title) 29 | .font(.Custom.callout) 30 | .foregroundStyle(Color.Custom.textSecondary) 31 | description 32 | .font(.Custom.headline) 33 | .foregroundStyle(Color.Custom.textPrimary) 34 | } 35 | .frame(maxWidth: .infinity, alignment: .leading) 36 | } 37 | } 38 | 39 | extension RowView where Content == Text { 40 | init(title: String, description: String) { 41 | self.title = title 42 | self.description = Text(description) 43 | } 44 | } 45 | 46 | #Preview { 47 | VStack { 48 | RowView(title: "Device") { 49 | HStack { 50 | Text("iPhone 17") 51 | Image(systemName: "iphone.gen2") 52 | } 53 | } 54 | RowView(title: "Place", description: "Switzerland") 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Resources/Assets.xcassets/Icons/gift.imageset/gift.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Sources/KSuite/KSuitePanelModifier.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import InfomaniakCoreSwiftUI 20 | import SwiftUI 21 | 22 | struct KSuitePanelModifier: ViewModifier { 23 | @Binding var isPresented: Bool 24 | let backgroundColor: Color 25 | let configuration: KSuiteConfiguration 26 | let isAdmin: Bool 27 | 28 | func body(content: Content) -> some View { 29 | content 30 | .floatingPanel(isPresented: $isPresented, closeButtonHidden: true, backgroundColor: backgroundColor, topPadding: 0) { 31 | KSuiteView(configuration: configuration, isAdmin: isAdmin) 32 | } 33 | } 34 | } 35 | 36 | public extension View { 37 | func kSuitePanel( 38 | isPresented: Binding, 39 | backgroundColor: Color = .clear, 40 | configuration: KSuiteConfiguration, 41 | isAdmin: Bool 42 | ) -> some View { 43 | modifier(KSuitePanelModifier( 44 | isPresented: isPresented, 45 | backgroundColor: backgroundColor, 46 | configuration: configuration, 47 | isAdmin: isAdmin 48 | )) 49 | } 50 | } 51 | 52 | #Preview { 53 | Text("Hello world!") 54 | .kSuitePanel(isPresented: .constant(true), configuration: .business, isAdmin: true) 55 | } 56 | -------------------------------------------------------------------------------- /Sources/KSuite/KSuiteView.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import DesignSystem 20 | import InfomaniakCoreSwiftUI 21 | import KSuiteUtils 22 | import SwiftUI 23 | 24 | public struct KSuiteView: View { 25 | @Environment(\.dismiss) private var dismiss 26 | 27 | private let configuration: KSuiteConfiguration 28 | private let isAdmin: Bool 29 | 30 | public init(configuration: KSuiteConfiguration, isAdmin: Bool) { 31 | self.configuration = configuration 32 | self.isAdmin = isAdmin 33 | } 34 | 35 | public var body: some View { 36 | UpSalePanelView( 37 | headerImage: KSuiteResources.background.swiftUIImage, 38 | title: configuration.title, 39 | description: configuration.description, 40 | labels: configuration.labels, 41 | additionalText: isAdmin ? 42 | KSuiteLocalizable.kSuiteUpgradeDetails : KSuiteLocalizable.kSuiteUpgradeDetailsContactAdmin 43 | ) 44 | } 45 | } 46 | 47 | #Preview("Standard") { 48 | KSuiteView(configuration: .standard, isAdmin: false) 49 | } 50 | 51 | #Preview("Business") { 52 | KSuiteView(configuration: .business, isAdmin: false) 53 | } 54 | 55 | #Preview("Entreprise") { 56 | KSuiteView(configuration: .enterprise, isAdmin: false) 57 | } 58 | -------------------------------------------------------------------------------- /.swiftlint.yml: -------------------------------------------------------------------------------- 1 | disabled_rules: 2 | - line_length 3 | - identifier_name 4 | - type_body_length 5 | - function_body_length 6 | - file_length 7 | - type_name 8 | - force_cast 9 | - cyclomatic_complexity 10 | - inclusive_language 11 | - for_where 12 | - optional_data_string_conversion 13 | opt_in_rules: 14 | - closure_end_indentation 15 | - closure_spacing 16 | - collection_alignment 17 | - contains_over_filter_count 18 | - contains_over_first_not_nil 19 | - contains_over_range_nil_comparison 20 | - empty_collection_literal 21 | - empty_count 22 | - empty_string 23 | - first_where 24 | - identical_operands 25 | - last_where 26 | - operator_usage_whitespace 27 | - overridden_super_call 28 | - prefer_zero_over_explicit_init 29 | - prohibited_super_call 30 | - redundant_type_annotation 31 | - toggle_bool 32 | - trailing_closure 33 | - unneeded_parentheses_in_closure_argument 34 | analyzer_rules: 35 | - unused_import 36 | excluded: 37 | - Derived/Sources/* 38 | - DerivedData/ 39 | - Derived/ 40 | - Tuist/.build/ 41 | - Tests/* 42 | - Sources/MyKSuite/Generated 43 | - Sources/InterAppLogin/Generated 44 | - Sources/KSuiteUtils/Generated 45 | - Sources/KSuite/Generated 46 | - Sources/InAppTwoFactorAuthentication/Generated 47 | custom_rules: 48 | private_state: 49 | included: 50 | - ".*\\.swift" 51 | regex: "(?. 17 | */ 18 | 19 | import DesignSystem 20 | import KSuiteUtils 21 | import SwiftUI 22 | 23 | struct SubscriptionProductsView: View { 24 | let myKSuite: MyKSuite 25 | 26 | var body: some View { 27 | VStack(spacing: IKPadding.medium) { 28 | if myKSuite.isFree { 29 | ProductProgressView( 30 | product: .mail, 31 | usedValue: myKSuite.mail.usedSize, 32 | totalValue: myKSuite.mail.storageSizeLimit 33 | ) 34 | } else { 35 | HStack { 36 | Text(Product.mail.title) 37 | .frame(maxWidth: .infinity, alignment: .leading) 38 | .foregroundStyle(ColorHelper.primary) 39 | .font(FontHelper.body) 40 | 41 | Text(MyKSuiteLocalizable.myKSuiteDashboardDataUnlimited) 42 | .foregroundStyle(ColorHelper.secondary) 43 | .font(FontHelper.bodySmall) 44 | } 45 | } 46 | 47 | ProductProgressView(product: .drive, usedValue: myKSuite.drive.usedSize, totalValue: myKSuite.drive.size) 48 | } 49 | } 50 | } 51 | 52 | #Preview { 53 | SubscriptionProductsView(myKSuite: PreviewHelper.sampleMyKSuite) 54 | } 55 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Resources/Assets.xcassets/Icons/folder.arrow.up.imageset/folder.arrow.up.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Sources/InterAppLogin/Resources/Assets.xcassets/Images/person-circle-plus-filled.imageset/person-circle-plus-filled.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Sources/Dashboard/HeaderView.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import DesignSystem 20 | import InfomaniakCoreSwiftUI 21 | import KSuiteUtils 22 | import SwiftUI 23 | 24 | struct HeaderView: View { 25 | let myKSuite: MyKSuite 26 | let avatarView: () -> Content 27 | 28 | var body: some View { 29 | HStack { 30 | ZStack { 31 | MyKSuiteResources.person.swiftUIImage 32 | .iconSize(.medium) 33 | .foregroundStyle(ColorHelper.secondary) 34 | 35 | avatarView() 36 | .frame(width: 24, height: 24) 37 | } 38 | .frame(width: 24, height: 24) 39 | .overlay { 40 | Circle() 41 | .strokeBorder(ColorHelper.gradient, lineWidth: 1) 42 | } 43 | .background(KSuiteUtilsResources.polarBear.swiftUIColor) 44 | .clipShape(.circle) 45 | 46 | Text(myKSuite.mail.email) 47 | .frame(maxWidth: .infinity, alignment: .leading) 48 | .foregroundStyle(ColorHelper.primary) 49 | .font(FontHelper.body) 50 | 51 | myKSuite.icon 52 | .padding(.horizontal, value: .mini) 53 | .padding(.vertical, value: .micro) 54 | .background(ColorHelper.reversedPrimary) 55 | .clipShape(Capsule()) 56 | } 57 | } 58 | } 59 | 60 | #Preview { 61 | HeaderView(myKSuite: PreviewHelper.sampleMyKSuite) { EmptyView() } 62 | } 63 | -------------------------------------------------------------------------------- /Sources/KSuite/Resources/Assets.xcassets/stair.imageset/stair.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Sources/Dashboard/SubscriptionCardView.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import DesignSystem 20 | import InfomaniakCoreSwiftUI 21 | import KSuiteUtils 22 | import SwiftUI 23 | 24 | struct SubscriptionCardView: View { 25 | let myKSuite: MyKSuite 26 | let avatarView: () -> Content 27 | 28 | var body: some View { 29 | VStack(spacing: IKPadding.large) { 30 | HeaderView(myKSuite: myKSuite, avatarView: avatarView) 31 | 32 | Divider() 33 | .overlay(ColorHelper.divider) 34 | 35 | SubscriptionProductsView(myKSuite: myKSuite) 36 | 37 | Divider() 38 | .overlay(ColorHelper.divider) 39 | 40 | if myKSuite.isFree { 41 | SubscriptionFreeDetailsView(dailyLimit: myKSuite.mail.dailyLimitSent) 42 | } else { 43 | SubscriptionPlusDetailsView(myKSuite: myKSuite) 44 | } 45 | } 46 | .padding(value: .medium) 47 | .frame(maxWidth: .infinity, alignment: .leading) 48 | .background(ColorHelper.backgroundPrimary) 49 | .cardStyle() 50 | } 51 | } 52 | 53 | #Preview { 54 | SubscriptionCardView(myKSuite: PreviewHelper.sampleMyKSuite) { 55 | EmptyView() 56 | } 57 | .padding() 58 | .frame(maxHeight: .infinity, alignment: .top) 59 | .background { 60 | MyKSuiteResources.background.swiftUIImage 61 | .resizable() 62 | .scaledToFit() 63 | .frame(maxHeight: .infinity, alignment: .top) 64 | .ignoresSafeArea() 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Sources/UI/ConnectionConfirmationView/InformationContentView.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import DesignSystem 20 | import InfomaniakCoreUIResources 21 | import SwiftUI 22 | 23 | struct InformationAction { 24 | let title: String 25 | let action: () -> Void 26 | } 27 | 28 | struct InformationContentView: View { 29 | let text: String 30 | var additionalAction: InformationAction? 31 | let onClose: () -> Void 32 | 33 | var body: some View { 34 | VStack { 35 | Text(text) 36 | .multilineTextAlignment(.center) 37 | .font(.Custom.body) 38 | .foregroundStyle(Color.Custom.textSecondary) 39 | 40 | VStack(spacing: IKPadding.small) { 41 | if let additionalAction { 42 | Button(additionalAction.title, action: additionalAction.action) 43 | .buttonStyle(.ikBorderedProminent) 44 | .ikButtonFullWidth(true) 45 | .controlSize(.large) 46 | } 47 | 48 | Button(CoreUILocalizable.buttonClose, action: onClose) 49 | .buttonStyle(.ikBordered) 50 | .ikButtonFullWidth(true) 51 | .controlSize(.large) 52 | } 53 | .frame(maxHeight: .infinity, alignment: .bottom) 54 | } 55 | .padding(.horizontal, value: .large) 56 | } 57 | } 58 | 59 | #Preview { 60 | InformationContentView(text: "An error occurred", additionalAction: InformationAction(title: "Retry") {}) {} 61 | } 62 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Sources/Dashboard/SubscriptionBenefitsView.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import DesignSystem 20 | import InfomaniakCoreSwiftUI 21 | import KSuiteUtils 22 | import SwiftUI 23 | 24 | struct SubscriptionBenefitsView: View { 25 | var body: some View { 26 | VStack(alignment: .leading, spacing: IKPadding.large) { 27 | Text(MyKSuiteLocalizable.myKSuiteUpgradeBenefitsTitle) 28 | .foregroundStyle(ColorHelper.secondary) 29 | .font(FontHelper.bodySmall) 30 | 31 | Label { 32 | Text(MyKSuiteLocalizable.myKSuiteUpgradeDriveLabel) 33 | } icon: { 34 | Image("drive", bundle: .module) 35 | .iconSize(.medium) 36 | } 37 | 38 | Label { 39 | Text(MyKSuiteLocalizable.myKSuiteUpgradeUnlimitedMailLabel) 40 | } icon: { 41 | Image("plane", bundle: .module) 42 | .iconSize(.medium) 43 | } 44 | 45 | Label { 46 | Text(MyKSuiteLocalizable.myKSuiteUpgradeLabel) 47 | } icon: { 48 | Image("gift", bundle: .module) 49 | .iconSize(.medium) 50 | } 51 | } 52 | .foregroundStyle(ColorHelper.primary) 53 | .font(FontHelper.body) 54 | .padding(value: .medium) 55 | .frame(maxWidth: .infinity, alignment: .leading) 56 | .background(ColorHelper.backgroundPrimary) 57 | .cardStyle() 58 | } 59 | } 60 | 61 | #Preview { 62 | SubscriptionBenefitsView() 63 | .padding() 64 | } 65 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Sources/MyKSuiteConfiguration.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import KSuiteUtils 20 | import SwiftUI 21 | 22 | public enum MyKSuiteConfiguration { 23 | case mail 24 | case kDrive 25 | 26 | var labels: [KSuiteUtils.KSuiteLabel] { 27 | switch self { 28 | case .mail: 29 | [ 30 | KSuiteLabel( 31 | icon: MyKSuiteResources.plane.swiftUIImage, 32 | text: MyKSuiteLocalizable.myKSuiteUpgradeUnlimitedMailLabel 33 | ), 34 | KSuiteLabel( 35 | icon: MyKSuiteResources.envelope.swiftUIImage, 36 | text: MyKSuiteLocalizable.myKSuiteUpgradeRedirectLabel 37 | ), 38 | KSuiteLabel( 39 | icon: MyKSuiteResources.gift.swiftUIImage, 40 | text: MyKSuiteLocalizable.myKSuiteUpgradeLabel 41 | ) 42 | ] 43 | case .kDrive: 44 | [ 45 | KSuiteLabel( 46 | icon: MyKSuiteResources.drive.swiftUIImage, 47 | text: MyKSuiteLocalizable.myKSuiteUpgradeDriveLabel 48 | ), 49 | KSuiteLabel( 50 | icon: MyKSuiteResources.folderArrowUp.swiftUIImage, 51 | text: MyKSuiteLocalizable.myKSuiteUpgradePdfEditionLabel 52 | ), 53 | KSuiteLabel( 54 | icon: MyKSuiteResources.gift.swiftUIImage, 55 | text: MyKSuiteLocalizable.myKSuiteUpgradeLabel 56 | ) 57 | ] 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Sources/Components/CustomProgressBar.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import KSuiteUtils 20 | import SwiftUI 21 | 22 | struct CustomProgressBar: ProgressViewStyle { 23 | let barHeight: CGFloat = 14 24 | 25 | func makeBody(configuration: Configuration) -> some View { 26 | ZStack(alignment: .leading) { 27 | RoundedRectangle(cornerRadius: barHeight / 2) 28 | .frame(height: barHeight) 29 | .foregroundStyle(ColorHelper.reversedPrimary) 30 | .overlay { 31 | GeometryReader { geometry in 32 | RoundedRectangle(cornerRadius: barHeight / 2) 33 | .frame( 34 | width: filledProgressBarWidth( 35 | progressBarWidth: geometry.size.width, 36 | fractionCompleted: configuration.fractionCompleted ?? 0 37 | ), 38 | height: barHeight 39 | ) 40 | } 41 | } 42 | } 43 | } 44 | 45 | func filledProgressBarWidth(progressBarWidth: CGFloat, fractionCompleted: CGFloat) -> CGFloat { 46 | max(barHeight, progressBarWidth * CGFloat(fractionCompleted)) 47 | } 48 | } 49 | 50 | #Preview { 51 | VStack { 52 | ProgressView(value: 2.3, total: 15) 53 | .progressViewStyle(CustomProgressBar()) 54 | .foregroundStyle(.blue) 55 | ProgressView(value: 1, total: 1000) 56 | .progressViewStyle(CustomProgressBar()) 57 | .foregroundStyle(.blue) 58 | } 59 | .padding() 60 | } 61 | -------------------------------------------------------------------------------- /Sources/InterAppLogin/Sources/UI/ConnectedAccountView.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import InfomaniakCore 20 | import InfomaniakCoreSwiftUI 21 | import Nuke 22 | import NukeUI 23 | import SwiftUI 24 | 25 | struct ConnectedAccountAvatarView: View { 26 | let connectedAccount: ConnectedAccount 27 | var size: CGFloat = 40 28 | 29 | var body: some View { 30 | Group { 31 | if let rawAvatarURL = connectedAccount.userProfile.avatar, 32 | let avatarURL = URL(string: rawAvatarURL) { 33 | LazyImage(request: ImageRequest(url: avatarURL)) { state in 34 | if let image = state.image { 35 | AvatarImage(image: image, size: size) 36 | } else { 37 | initialsView 38 | } 39 | } 40 | } else { 41 | initialsView 42 | } 43 | } 44 | .clipShape(Circle()) 45 | .background( 46 | Circle() 47 | .stroke(Color.greyMouse) 48 | ) 49 | } 50 | 51 | private var initialsView: some View { 52 | InitialsView( 53 | initials: NameFormatter(fullName: connectedAccount.userProfile.displayName).initials, 54 | backgroundColor: Color.backgroundColor(from: connectedAccount.userProfile.email.hash), 55 | foregroundColor: Color.backgroundSecondary, 56 | size: size 57 | ) 58 | } 59 | } 60 | 61 | #Preview { 62 | VStack { 63 | ConnectedAccountAvatarView(connectedAccount: PreviewHelper.connectedAccount) 64 | ConnectedAccountAvatarView(connectedAccount: PreviewHelper.connectedAccount2) 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Resources/Assets.xcassets/Icons/lock.imageset/lock.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Localizable/en.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* 2 | * Loco ios export: Xcode Strings (legacy) 3 | * Project: CoreUI 4 | * Locale: en, English 5 | * Tagged: ios, !common, !emoji-reaction, !interapplogin, !ios-stringsdict, !kSuite, !kSuiteUtils, !my kSuite, !privacy 6 | * Exported by: Philippe Weidmann 7 | * Exported at: Thu, 09 Oct 2025 08:30:37 +0200 8 | */ 9 | 10 | /* loco:68d52770d78cd0b5b102a952 */ 11 | " twoFactorAuthJustNowLabel" = "Just now"; 12 | 13 | /* loco:68d4f859fceae6b843046de7 */ 14 | "buttonApprove" = "Approve"; 15 | 16 | /* loco:68d4f873098af73894089853 */ 17 | "buttonDeny" = "Deny"; 18 | 19 | /* loco:68d4f8d82bc1b93265068752 */ 20 | "buttonEditPassword" = "Edit password"; 21 | 22 | /* loco:68da784d25d05d451b04f663 */ 23 | "twoFactorAuthAlreadyProcessedErrorTitle" = "This request has already been processed"; 24 | 25 | /* loco:68da78cbe3aba64d960ff0c2 */ 26 | "twoFactorAuthCheckOriginDescription" = "You didn’t initiate this action?\nCheck your active devices, and disconnect the ones you don’t recognize."; 27 | 28 | /* loco:68c04f14ec33731be0018cb8 */ 29 | "twoFactorAuthConfirmationDescription" = "Confirming this login attempt will allow that device to access your Infomaniak account"; 30 | 31 | /* loco:68d5248990faa534e505f204 */ 32 | "twoFactorAuthConnectionRejectedDescription" = "You have refused a login attempt. To secure your account, change your password.\nIf you are the source of this attempt, try logging in again."; 33 | 34 | /* loco:68d5247e90faa534e505f202 */ 35 | "twoFactorAuthConnectionRejectedTitle" = "Connection Rejected"; 36 | 37 | /* loco:68c04d95fa5d09365f02c055 */ 38 | "twoFactorAuthDeviceLabel" = "Device"; 39 | 40 | /* loco:68da77e9a0c5c4a1d809d4c4 */ 41 | "twoFactorAuthExpiredErrorTitle" = "This login request has expired"; 42 | 43 | /* loco:68de2abbe02b752bd80f2782 */ 44 | "twoFactorAuthGenericErrorDescription" = "Unable to complete the operation.\nPlease try again."; 45 | 46 | /* loco:68c04e0aec33731be0018cb4 */ 47 | "twoFactorAuthLocationLabel" = "Location"; 48 | 49 | /* loco:68de26e7e0ead3ef030b71f2 */ 50 | "twoFactorAuthNoNetworkErrorDescription" = "Unable to complete the operation.\nCheck your connection and try again."; 51 | 52 | /* loco:68de2516c411b0f8b20a4832 */ 53 | "twoFactorAuthNoNetworkErrorTitle" = "No network connection"; 54 | 55 | /* loco:68c053c71ea34fd57a062325 */ 56 | "twoFactorAuthTryingToLogInTitle" = "Are you trying to login?"; 57 | 58 | /* loco:68c04d446368e16b82076535 */ 59 | "twoFactorAuthWhenLabel" = "When"; 60 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Localizable/es.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* 2 | * Loco ios export: Xcode Strings (legacy) 3 | * Project: CoreUI 4 | * Locale: es, Spanish 5 | * Tagged: ios, !common, !emoji-reaction, !interapplogin, !ios-stringsdict, !kSuite, !kSuiteUtils, !my kSuite, !privacy 6 | * Exported by: Philippe Weidmann 7 | * Exported at: Thu, 09 Oct 2025 08:30:37 +0200 8 | */ 9 | 10 | /* loco:68d52770d78cd0b5b102a952 */ 11 | " twoFactorAuthJustNowLabel" = "Ahora"; 12 | 13 | /* loco:68d4f859fceae6b843046de7 */ 14 | "buttonApprove" = "Aprobar"; 15 | 16 | /* loco:68d4f873098af73894089853 */ 17 | "buttonDeny" = "Denegar"; 18 | 19 | /* loco:68d4f8d82bc1b93265068752 */ 20 | "buttonEditPassword" = "Cambiar contraseña"; 21 | 22 | /* loco:68da784d25d05d451b04f663 */ 23 | "twoFactorAuthAlreadyProcessedErrorTitle" = "Esta solicitud ya ha sido tramitada"; 24 | 25 | /* loco:68da78cbe3aba64d960ff0c2 */ 26 | "twoFactorAuthCheckOriginDescription" = "¿No has iniciado esta acción?\nComprueba tus dispositivos activos y desconecta los que no reconozcas."; 27 | 28 | /* loco:68c04f14ec33731be0018cb8 */ 29 | "twoFactorAuthConfirmationDescription" = "Al confirmar esta conexión, autorizas a este dispositivo a acceder a tu cuenta Infomaniak."; 30 | 31 | /* loco:68d5248990faa534e505f204 */ 32 | "twoFactorAuthConnectionRejectedDescription" = "Ha rechazado un intento de conexión. Para asegurar su cuenta, cambie su contraseña.\nSi usted es el origen de este intento, intente conectarse de nuevo."; 33 | 34 | /* loco:68d5247e90faa534e505f202 */ 35 | "twoFactorAuthConnectionRejectedTitle" = "Conexión rechazada"; 36 | 37 | /* loco:68c04d95fa5d09365f02c055 */ 38 | "twoFactorAuthDeviceLabel" = "Dispositivo"; 39 | 40 | /* loco:68da77e9a0c5c4a1d809d4c4 */ 41 | "twoFactorAuthExpiredErrorTitle" = "Esta solicitud de conexión ha expirado"; 42 | 43 | /* loco:68de2abbe02b752bd80f2782 */ 44 | "twoFactorAuthGenericErrorDescription" = "No se pudo completar la operación.\nVuelve a intentarlo."; 45 | 46 | /* loco:68c04e0aec33731be0018cb4 */ 47 | "twoFactorAuthLocationLabel" = "Lugar"; 48 | 49 | /* loco:68de26e7e0ead3ef030b71f2 */ 50 | "twoFactorAuthNoNetworkErrorDescription" = "No se ha podido completar la operación.\nCompruebe su conexión e inténtelo de nuevo."; 51 | 52 | /* loco:68de2516c411b0f8b20a4832 */ 53 | "twoFactorAuthNoNetworkErrorTitle" = "No hay red"; 54 | 55 | /* loco:68c053c71ea34fd57a062325 */ 56 | "twoFactorAuthTryingToLogInTitle" = "¿Está intentando conectarse?"; 57 | 58 | /* loco:68c04d446368e16b82076535 */ 59 | "twoFactorAuthWhenLabel" = "En"; 60 | -------------------------------------------------------------------------------- /Sources/InterAppLogin/Sources/UI/ConnectedAccountCellView.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import DesignSystem 20 | import SwiftUI 21 | 22 | struct ConnectedAccountCellView: View { 23 | let connectedAccount: ConnectedAccount 24 | @Binding var isSelected: Bool 25 | 26 | var body: some View { 27 | Button { 28 | isSelected.toggle() 29 | } label: { 30 | HStack { 31 | ConnectedAccountAvatarView(connectedAccount: connectedAccount) 32 | VStack(alignment: .leading, spacing: 0) { 33 | Text(connectedAccount.userProfile.displayName) 34 | .font(.Custom.headline) 35 | .foregroundStyle(Color.Custom.textPrimary) 36 | Text(connectedAccount.userProfile.email) 37 | .font(.Custom.body) 38 | .foregroundStyle(Color.Custom.textSecondary) 39 | } 40 | .lineLimit(1) 41 | .frame(maxWidth: .infinity, alignment: .leading) 42 | 43 | Image(.check) 44 | .iconSize(.medium) 45 | .foregroundStyle(.tint) 46 | .opacity(isSelected ? 1 : 0) 47 | .animation(nil, value: isSelected) 48 | } 49 | .padding(.vertical, value: .mini) 50 | } 51 | } 52 | } 53 | 54 | @available(iOS 17.0, *) 55 | #Preview { 56 | @Previewable @State var isFirstSelected = true 57 | @Previewable @State var isSecondSelected = false 58 | VStack { 59 | ConnectedAccountCellView(connectedAccount: PreviewHelper.connectedAccount, isSelected: $isFirstSelected) 60 | ConnectedAccountCellView(connectedAccount: PreviewHelper.connectedAccount, isSelected: $isSecondSelected) 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Images/device-arrow-rotate.imageset/device-arrow-rotate.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.swiftformat: -------------------------------------------------------------------------------- 1 | --acronyms ID,URL,UUID 2 | --allman false 3 | --assetliterals visual-width 4 | --asynccapturing 5 | --beforemarks 6 | --binarygrouping 4,8 7 | --categorymark "MARK: %c" 8 | --classthreshold 0 9 | --closingparen balanced 10 | --closurevoid remove 11 | --commas always 12 | --conflictmarkers reject 13 | --decimalgrouping 3,6 14 | --elseposition same-line 15 | --emptybraces no-space 16 | --enumnamespaces always 17 | --enumthreshold 0 18 | --exponentcase lowercase 19 | --exponentgrouping disabled 20 | --extensionacl on-extension 21 | --extensionlength 0 22 | --extensionmark "MARK: - %t + %c" 23 | --fractiongrouping disabled 24 | --fragment false 25 | --funcattributes preserve 26 | --generictypes 27 | --groupedextension "MARK: %c" 28 | --guardelse auto 29 | --header ignore 30 | --hexgrouping 4,8 31 | --hexliteralcase uppercase 32 | --ifdef no-indent 33 | --importgrouping alpha 34 | --indent 4 35 | --indentcase false 36 | --indentstrings false 37 | --lifecycle 38 | --lineaftermarks true 39 | --linebreaks lf 40 | --markcategories true 41 | --markextensions always 42 | --marktypes always 43 | --maxwidth 130 44 | --modifierorder 45 | --nevertrailing 46 | --nospaceoperators 47 | --nowrapoperators 48 | --octalgrouping 4,8 49 | --operatorfunc spaced 50 | --organizetypes actor,class,enum,struct 51 | --patternlet inline 52 | --ranges spaced 53 | --redundanttype inferred 54 | --self remove 55 | --selfrequired 56 | --semicolons inline 57 | --shortoptionals always 58 | --smarttabs enabled 59 | --someany true 60 | --stripunusedargs unnamed-only 61 | --structthreshold 0 62 | --tabwidth unspecified 63 | --throwcapturing 64 | --trailingclosures 65 | --trimwhitespace always 66 | --typeattributes preserve 67 | --typeblanklines remove 68 | --typemark "MARK: - %t" 69 | --varattributes preserve 70 | --voidtype void 71 | --wraparguments preserve 72 | --wrapcollections preserve 73 | --wrapconditions preserve 74 | --wrapeffects preserve 75 | --wrapenumcases always 76 | --wrapparameters default 77 | --wrapreturntype preserve 78 | --wrapternary default 79 | --wraptypealiases preserve 80 | --xcodeindentation disabled 81 | --yodaswap always 82 | --disable andOperator,opaqueGenericParameters,preferKeyPath,redundantReturn,strongOutlets,trailingCommas,unusedArguments,wrapMultilineStatementBraces,conditionalAssignment 83 | --enable blankLineAfterImports,blankLinesBetweenImports 84 | --exclude DerivedData,Derived,Tuist,Project.swift,Build,.build,Sources/MyKSuite/Generated/,Sources/InterAppLogin/Generated/,Sources/KSuiteUtils/Generated/,Sources/KSuite/Generated/,Sources/InAppTwoFactorAuthentication/Generated 85 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Localizable/it.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* 2 | * Loco ios export: Xcode Strings (legacy) 3 | * Project: CoreUI 4 | * Locale: it, Italian 5 | * Tagged: ios, !common, !emoji-reaction, !interapplogin, !ios-stringsdict, !kSuite, !kSuiteUtils, !my kSuite, !privacy 6 | * Exported by: Philippe Weidmann 7 | * Exported at: Thu, 09 Oct 2025 08:30:37 +0200 8 | */ 9 | 10 | /* loco:68d52770d78cd0b5b102a952 */ 11 | " twoFactorAuthJustNowLabel" = "Ora"; 12 | 13 | /* loco:68d4f859fceae6b843046de7 */ 14 | "buttonApprove" = "Approvare"; 15 | 16 | /* loco:68d4f873098af73894089853 */ 17 | "buttonDeny" = "Negare"; 18 | 19 | /* loco:68d4f8d82bc1b93265068752 */ 20 | "buttonEditPassword" = "Modifica della password"; 21 | 22 | /* loco:68da784d25d05d451b04f663 */ 23 | "twoFactorAuthAlreadyProcessedErrorTitle" = "Questa richiesta è già stata elaborata"; 24 | 25 | /* loco:68da78cbe3aba64d960ff0c2 */ 26 | "twoFactorAuthCheckOriginDescription" = "Non hai avviato tu questa azione?\nControlla i tuoi dispositivi attivi e disconnetti quelli che non riconosci."; 27 | 28 | /* loco:68c04f14ec33731be0018cb8 */ 29 | "twoFactorAuthConfirmationDescription" = "Confermando questa connessione, autorizzi questo dispositivo ad accedere al tuo account Infomaniak."; 30 | 31 | /* loco:68d5248990faa534e505f204 */ 32 | "twoFactorAuthConnectionRejectedDescription" = "È stato rifiutato un tentativo di connessione. Per proteggere il vostro account, cambiate la password.\nSe siete voi la fonte di questo tentativo, provate ad accedere di nuovo."; 33 | 34 | /* loco:68d5247e90faa534e505f202 */ 35 | "twoFactorAuthConnectionRejectedTitle" = "Connessione rifiutata"; 36 | 37 | /* loco:68c04d95fa5d09365f02c055 */ 38 | "twoFactorAuthDeviceLabel" = "Dispositivo"; 39 | 40 | /* loco:68da77e9a0c5c4a1d809d4c4 */ 41 | "twoFactorAuthExpiredErrorTitle" = "Questa richiesta di connessione è scaduta"; 42 | 43 | /* loco:68de2abbe02b752bd80f2782 */ 44 | "twoFactorAuthGenericErrorDescription" = "Impossibile completare l’operazione.\nRiprova."; 45 | 46 | /* loco:68c04e0aec33731be0018cb4 */ 47 | "twoFactorAuthLocationLabel" = "Luogo"; 48 | 49 | /* loco:68de26e7e0ead3ef030b71f2 */ 50 | "twoFactorAuthNoNetworkErrorDescription" = "Impossibile completare l’operazione.\nControllare la connessione e riprovare."; 51 | 52 | /* loco:68de2516c411b0f8b20a4832 */ 53 | "twoFactorAuthNoNetworkErrorTitle" = "Nessuna rete"; 54 | 55 | /* loco:68c053c71ea34fd57a062325 */ 56 | "twoFactorAuthTryingToLogInTitle" = "Stai cercando di accedere?"; 57 | 58 | /* loco:68c04d446368e16b82076535 */ 59 | "twoFactorAuthWhenLabel" = "Quando"; 60 | -------------------------------------------------------------------------------- /Sources/InterAppLogin/Sources/UI/OutlinedButtonStyle.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import DesignSystem 20 | import Foundation 21 | import InfomaniakCoreSwiftUI 22 | import SwiftUI 23 | 24 | extension ButtonStyle where Self == OutlinedButtonStyle { 25 | static var outlined: OutlinedButtonStyle { 26 | return OutlinedButtonStyle() 27 | } 28 | } 29 | 30 | struct OutlinedButtonStyle: ButtonStyle { 31 | @Environment(\.isEnabled) private var isEnabled 32 | 33 | @Environment(\.ikButtonLoading) private var isLoading 34 | 35 | private var foreground: Color { 36 | if isEnabled { 37 | return .Custom.textPrimary 38 | } else { 39 | return .Custom.textSecondary 40 | } 41 | } 42 | 43 | func makeBody(configuration: Configuration) -> some View { 44 | configuration.label 45 | .labelStyle(.ikLabel) 46 | .foregroundStyle(foreground) 47 | .modifier(IKButtonLoadingModifier(isFilled: false)) 48 | .modifier(IKButtonControlSizeModifier()) 49 | .padding(.horizontal, value: .medium) 50 | .padding(.horizontal, value: .small) 51 | .frame(minHeight: IKButtonHeight.large) 52 | .modifier(IKButtonExpandableModifier()) 53 | .contentShape(Rectangle()) 54 | .modifier(IKButtonOpacityAnimationModifier(isPressed: configuration.isPressed)) 55 | .allowsHitTesting(!isLoading) 56 | .background( 57 | RoundedRectangle(cornerRadius: IKRadius.large) 58 | .stroke(Color.Custom.divider, lineWidth: 0.5) 59 | ) 60 | } 61 | } 62 | 63 | #Preview { 64 | VStack { 65 | Button("Hello, World!") {} 66 | 67 | Button("Hello, World!") {} 68 | .ikButtonFullWidth(true) 69 | } 70 | .buttonStyle(.outlined) 71 | } 72 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Sources/Core/Models/PreviewHelper.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import Foundation 20 | import InfomaniakCore 21 | import InfomaniakDI 22 | 23 | struct PreviewTargetAssembly { 24 | init() { 25 | SimpleResolver.sharedResolver.store(factory: Factory(type: PlatformDetectable.self) { _, _ in 26 | PlatformDetector() 27 | }) 28 | SimpleResolver.sharedResolver.store(factory: Factory(type: InAppTwoFactorAuthenticationManagerable.self) { _, _ in 29 | InAppTwoFactorAuthenticationManager() 30 | }) 31 | } 32 | } 33 | 34 | extension RemoteChallenge { 35 | static let preview = RemoteChallenge( 36 | uuid: "aa", 37 | type: .approval, 38 | device: Device(name: "iPhone 17", type: .phone), 39 | location: "Switzerland", 40 | createdAt: Date(timeIntervalSinceNow: -2 * 60), 41 | expiresAt: Date(timeIntervalSinceNow: 10 * 60) 42 | ) 43 | } 44 | 45 | struct PreviewUser: InfomaniakUser { 46 | var id: Int 47 | var email: String 48 | var displayName: String 49 | var avatar: String? 50 | 51 | static let preview = PreviewUser( 52 | id: 1, 53 | email: "CraigFederighi@ik.me", 54 | displayName: "Craig Federighi", 55 | avatar: "https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Fphotos5.appleinsider.com%2Farchive%2F12.08.27-Federighi.png&f=1&nofb=1&ipt=2283edd37fadae2e14e2f083e6f98b91a42d828845c5babd601bd8082fd9a9f4" 56 | ) 57 | static let previewNoAvatar = PreviewUser(id: 2, email: "tcook@apple.com", displayName: "Tim Cook", avatar: nil) 58 | } 59 | 60 | extension InAppTwoFactorAuthenticationSession { 61 | static let preview = InAppTwoFactorAuthenticationSession( 62 | user: PreviewUser.preview, 63 | apiFetcher: MockInAppTwoFactorAuthenticationFetcher() 64 | ) 65 | } 66 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Localizable/fr.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* 2 | * Loco ios export: Xcode Strings (legacy) 3 | * Project: CoreUI 4 | * Locale: fr, French 5 | * Tagged: ios, !common, !emoji-reaction, !interapplogin, !ios-stringsdict, !kSuite, !kSuiteUtils, !my kSuite, !privacy 6 | * Exported by: Philippe Weidmann 7 | * Exported at: Thu, 09 Oct 2025 08:30:37 +0200 8 | */ 9 | 10 | /* loco:68d52770d78cd0b5b102a952 */ 11 | " twoFactorAuthJustNowLabel" = "À l’instant"; 12 | 13 | /* loco:68d4f859fceae6b843046de7 */ 14 | "buttonApprove" = "Approuver"; 15 | 16 | /* loco:68d4f873098af73894089853 */ 17 | "buttonDeny" = "Refuser"; 18 | 19 | /* loco:68d4f8d82bc1b93265068752 */ 20 | "buttonEditPassword" = "Modifier le mot de passe"; 21 | 22 | /* loco:68da784d25d05d451b04f663 */ 23 | "twoFactorAuthAlreadyProcessedErrorTitle" = "Cette demande a déjà été traitée"; 24 | 25 | /* loco:68da78cbe3aba64d960ff0c2 */ 26 | "twoFactorAuthCheckOriginDescription" = "Vous n’êtes pas à l’origine de cette action ?\nVérifiez vos appareils actifs et déconnectez ceux que vous ne reconnaissez pas."; 27 | 28 | /* loco:68c04f14ec33731be0018cb8 */ 29 | "twoFactorAuthConfirmationDescription" = "Confirmer cette connexion autorisera cet appareil à accéder à votre compte Infomaniak"; 30 | 31 | /* loco:68d5248990faa534e505f204 */ 32 | "twoFactorAuthConnectionRejectedDescription" = "Vous avez refusé une tentative de connexion. Pour sécuriser votre compte, changez votre mot de passe.\nSi vous êtes à l’origine de cette tentative, réessayez de vous connecter."; 33 | 34 | /* loco:68d5247e90faa534e505f202 */ 35 | "twoFactorAuthConnectionRejectedTitle" = "Connexion Refusée"; 36 | 37 | /* loco:68c04d95fa5d09365f02c055 */ 38 | "twoFactorAuthDeviceLabel" = "Appareil"; 39 | 40 | /* loco:68da77e9a0c5c4a1d809d4c4 */ 41 | "twoFactorAuthExpiredErrorTitle" = "Cette demande de connexion a expiré"; 42 | 43 | /* loco:68de2abbe02b752bd80f2782 */ 44 | "twoFactorAuthGenericErrorDescription" = "Impossible de terminer l’opération.\nRelancez la demande."; 45 | 46 | /* loco:68c04e0aec33731be0018cb4 */ 47 | "twoFactorAuthLocationLabel" = "Lieu"; 48 | 49 | /* loco:68de26e7e0ead3ef030b71f2 */ 50 | "twoFactorAuthNoNetworkErrorDescription" = "Impossible de terminer l’opération.\nVérifiez votre connexion et réessayez."; 51 | 52 | /* loco:68de2516c411b0f8b20a4832 */ 53 | "twoFactorAuthNoNetworkErrorTitle" = "Pas de connexion internet"; 54 | 55 | /* loco:68c053c71ea34fd57a062325 */ 56 | "twoFactorAuthTryingToLogInTitle" = "Êtes-vous en train d’essayer de vous connecter ?"; 57 | 58 | /* loco:68c04d446368e16b82076535 */ 59 | "twoFactorAuthWhenLabel" = "Quand"; 60 | -------------------------------------------------------------------------------- /Sources/KSuite/Resources/Assets.xcassets/kchat.imageset/kchat.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Localizable/de.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* 2 | * Loco ios export: Xcode Strings (legacy) 3 | * Project: CoreUI 4 | * Locale: de, German 5 | * Tagged: ios, !common, !emoji-reaction, !interapplogin, !ios-stringsdict, !kSuite, !kSuiteUtils, !my kSuite, !privacy 6 | * Exported by: Philippe Weidmann 7 | * Exported at: Thu, 09 Oct 2025 08:30:37 +0200 8 | */ 9 | 10 | /* loco:68d52770d78cd0b5b102a952 */ 11 | " twoFactorAuthJustNowLabel" = "Jetzt"; 12 | 13 | /* loco:68d4f859fceae6b843046de7 */ 14 | "buttonApprove" = "Genehmigen Sie"; 15 | 16 | /* loco:68d4f873098af73894089853 */ 17 | "buttonDeny" = "Verweigern"; 18 | 19 | /* loco:68d4f8d82bc1b93265068752 */ 20 | "buttonEditPassword" = "Passwort ändern"; 21 | 22 | /* loco:68da784d25d05d451b04f663 */ 23 | "twoFactorAuthAlreadyProcessedErrorTitle" = "Diese Anfrage wurde bereits bearbeitet"; 24 | 25 | /* loco:68da78cbe3aba64d960ff0c2 */ 26 | "twoFactorAuthCheckOriginDescription" = "Sie haben diese Validierung nicht veranlasst?\nÜberprüfen Sie Ihre aktiven Geräte, und trennen Sie die, die Sie nicht erkennen."; 27 | 28 | /* loco:68c04f14ec33731be0018cb8 */ 29 | "twoFactorAuthConfirmationDescription" = "Durch die Bestätigung dieser Verbindung wird diesem Gerät der Zugriff auf Ihr Infomaniak-Konto gestattet."; 30 | 31 | /* loco:68d5248990faa534e505f204 */ 32 | "twoFactorAuthConnectionRejectedDescription" = "Sie haben einen Anmeldeversuch abgelehnt. Um Ihr Konto zu sichern, ändern Sie Ihr Passwort.\nWenn Sie diesen Versuch veranlasst haben, versuchen Sie es erneut, sich anzumelden."; 33 | 34 | /* loco:68d5247e90faa534e505f202 */ 35 | "twoFactorAuthConnectionRejectedTitle" = "Verbindung Abgelehnt"; 36 | 37 | /* loco:68c04d95fa5d09365f02c055 */ 38 | "twoFactorAuthDeviceLabel" = "Gerät"; 39 | 40 | /* loco:68da77e9a0c5c4a1d809d4c4 */ 41 | "twoFactorAuthExpiredErrorTitle" = "Diese Verbindungsanfrage ist abgelaufen"; 42 | 43 | /* loco:68de2abbe02b752bd80f2782 */ 44 | "twoFactorAuthGenericErrorDescription" = "Der Vorgang konnte nicht abgeschlossen werden.\nBitte versuchen Sie es erneut."; 45 | 46 | /* loco:68c04e0aec33731be0018cb4 */ 47 | "twoFactorAuthLocationLabel" = "Ort"; 48 | 49 | /* loco:68de26e7e0ead3ef030b71f2 */ 50 | "twoFactorAuthNoNetworkErrorDescription" = "Der Vorgang kann nicht abgeschlossen werden.\nÜberprüfen Sie Ihre Verbindung und versuchen Sie es erneut."; 51 | 52 | /* loco:68de2516c411b0f8b20a4832 */ 53 | "twoFactorAuthNoNetworkErrorTitle" = "Kein Netz"; 54 | 55 | /* loco:68c053c71ea34fd57a062325 */ 56 | "twoFactorAuthTryingToLogInTitle" = "Versuchen Sie, sich anzumelden?"; 57 | 58 | /* loco:68c04d446368e16b82076535 */ 59 | "twoFactorAuthWhenLabel" = "Wenn"; 60 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Images/stop-hand-slash.imageset/stop-hand-slash.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Sources/MyKSuite/Sources/Dashboard/FreeTrialView.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import DesignSystem 20 | import InfomaniakCoreSwiftUI 21 | import KSuiteUtils 22 | import SwiftUI 23 | 24 | struct FreeTrialView: View { 25 | private let skyBackground = Color( 26 | light: KSuiteUtilsResources.sky.color, 27 | dark: KSuiteUtilsResources.bat.color 28 | ) 29 | private let chipColor = Color(light: .white, dark: KSuiteUtilsResources.orca.color) 30 | 31 | var body: some View { 32 | VStack(alignment: .leading, spacing: IKPadding.medium) { 33 | HStack { 34 | MyKSuiteResources.myKSuitePlusLogo.swiftUIImage 35 | .resizable() 36 | .scaledToFit() 37 | .frame(maxWidth: 90) 38 | 39 | Spacer() 40 | 41 | Text(MyKSuiteLocalizable.myKSuiteDashboardFreeTrialTitle) 42 | .font(FontHelper.labelMedium) 43 | .foregroundStyle(ColorHelper.primary) 44 | .padding(.vertical, 2) 45 | .padding(.horizontal, value: .mini) 46 | .background(chipColor, in: .capsule) 47 | } 48 | Text(MyKSuiteLocalizable.myKSuiteDashboardFreeTrialDescription) 49 | .font(FontHelper.bodySmall) 50 | .foregroundStyle(ColorHelper.primary) 51 | 52 | Button { 53 | // Start trial 54 | } label: { 55 | Text(MyKSuiteLocalizable.myKSuiteDashboardFreeTrialButton) 56 | } 57 | .controlSize(.large) 58 | .ikButtonFullWidth(true) 59 | .buttonStyle(.ikBorderedProminent) 60 | } 61 | .padding(value: .medium) 62 | .background { 63 | RoundedRectangle(cornerRadius: IKRadius.large) 64 | .strokeBorder(ColorHelper.gradient, lineWidth: 1) 65 | } 66 | .background(skyBackground, in: .rect(cornerRadius: IKRadius.large)) 67 | .cardStyle(withStroke: false) 68 | } 69 | } 70 | 71 | #Preview { 72 | FreeTrialView() 73 | } 74 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Sources/UI/ConnectionConfirmationView/MainContentView/UserRowView.swift: -------------------------------------------------------------------------------- 1 | /* 2 | Infomaniak Features - iOS 3 | Copyright (C) 2025 Infomaniak Network SA 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | 19 | import DesignSystem 20 | import InfomaniakCore 21 | import InfomaniakCoreSwiftUI 22 | import NukeUI 23 | import SwiftUI 24 | 25 | struct UserRowView: View { 26 | let user: InfomaniakUser 27 | let avatarSize: CGFloat = 40 28 | 29 | var body: some View { 30 | HStack(spacing: IKPadding.mini) { 31 | Group { 32 | if let rawAvatarURL = user.avatar, 33 | let avatarURL = URL(string: rawAvatarURL) { 34 | LazyImage(request: ImageRequest(url: avatarURL)) { state in 35 | if let image = state.image { 36 | AvatarImage(image: image, size: avatarSize) 37 | } else { 38 | initialsView 39 | } 40 | } 41 | } else { 42 | initialsView 43 | } 44 | } 45 | .clipShape(Circle()) 46 | .background( 47 | Circle() 48 | .stroke(Color.gray) 49 | ) 50 | 51 | VStack(alignment: .leading) { 52 | Text(user.displayName) 53 | .font(.Custom.headline) 54 | .foregroundStyle(Color.Custom.textPrimary) 55 | Text(user.email) 56 | .font(.Custom.body) 57 | .foregroundStyle(Color.Custom.textSecondary) 58 | } 59 | } 60 | } 61 | 62 | private var initialsView: some View { 63 | InitialsView( 64 | initials: NameFormatter(fullName: user.displayName).initials, 65 | backgroundColor: Color.backgroundColor(from: user.email.hash), 66 | foregroundColor: Color.white, 67 | size: avatarSize 68 | ) 69 | } 70 | } 71 | 72 | #Preview { 73 | VStack(alignment: .leading) { 74 | UserRowView(user: PreviewUser.preview) 75 | UserRowView(user: PreviewUser.previewNoAvatar) 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /Sources/InAppTwoFactorAuthentication/Resources/Assets.xcassets/Images/clock.imageset/clock.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | --------------------------------------------------------------------------------