chore: fix building the app (#13606)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- New Features
  - Built-in Then-style DSL for fluent configuration.
- Centralized theming via a new resources library exposing standardized
colors and icons for SwiftUI and UIKit.

- Refactor
  - Migrated color and icon accessors to the new resources provider.
  - Removed redundant imports and streamlined UI configuration.

- Dependencies
  - Updated MarkdownView to 3.4.2.
- Removed the Then third-party dependency; updated package sources;
added resources package and assets.

- Documentation
  - Added iOS Swift code style and architecture guidelines.

- Chores
  - Updated Xcode project format and repository ignore rules.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
Lakr
2025-09-19 14:05:05 +08:00
committed by GitHub
parent ee77c548ca
commit 1f228382c2
83 changed files with 484 additions and 78 deletions

View File

@@ -0,0 +1,57 @@
# Swift Code Style Guidelines
## Core Style
- **Indentation**: 2 spaces
- **Braces**: Opening brace on same line
- **Spacing**: Single space around operators and commas
- **Naming**: PascalCase for types, camelCase for properties/methods
## File Organization
- Logical directory grouping
- PascalCase files for types, `+` for extensions
- Modular design with extensions
## Modern Swift Features
- **@Observable macro**: Replace `ObservableObject`/`@Published`
- **Swift concurrency**: `async/await`, `Task`, `actor`, `@MainActor`
- **Result builders**: Declarative APIs
- **Property wrappers**: Use line breaks for long declarations
- **Opaque types**: `some` for protocol returns
## Code Structure
- Early returns to reduce nesting
- Guard statements for optional unwrapping
- Single responsibility per type/extension
- Value types over reference types
## Error Handling
- `Result` enum for typed errors
- `throws`/`try` for propagation
- Optional chaining with `guard let`/`if let`
- Typed error definitions
## Architecture
- Protocol-oriented design
- Dependency injection over singletons
- Composition over inheritance
- Factory/Repository patterns
## Debug Assertions
- Use `assert()` for development-time invariant checking
- Use `assertionFailure()` for unreachable code paths
- Assertions removed in release builds for performance
- Precondition checking with `precondition()` for fatal errors
## Memory Management
- `weak` references for cycles
- `unowned` when guaranteed non-nil
- Capture lists in closures
- `deinit` for cleanup

View File

@@ -3,7 +3,7 @@
archiveVersion = 1; archiveVersion = 1;
classes = { classes = {
}; };
objectVersion = 56; objectVersion = 77;
objects = { objects = {
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
@@ -53,6 +53,7 @@
50802D5E2D112F7D00694021 /* Intelligents */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = Intelligents; sourceTree = "<group>"; }; 50802D5E2D112F7D00694021 /* Intelligents */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = Intelligents; sourceTree = "<group>"; };
50A285D52D112A5E000D5A6D /* InfoPlist.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = InfoPlist.xcstrings; sourceTree = "<group>"; }; 50A285D52D112A5E000D5A6D /* InfoPlist.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = InfoPlist.xcstrings; sourceTree = "<group>"; };
50A285D62D112A5E000D5A6D /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = "<group>"; }; 50A285D62D112A5E000D5A6D /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = "<group>"; };
50CECF1E2E7C1084004487AA /* AffineResources */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = AffineResources; sourceTree = "<group>"; };
50FF42892D2E757E0050AA83 /* ApplicationBridgedWindowScript.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplicationBridgedWindowScript.swift; sourceTree = "<group>"; }; 50FF42892D2E757E0050AA83 /* ApplicationBridgedWindowScript.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplicationBridgedWindowScript.swift; sourceTree = "<group>"; };
50FF428B2D2E77CC0050AA83 /* AffineViewController+AIButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AffineViewController+AIButton.swift"; sourceTree = "<group>"; }; 50FF428B2D2E77CC0050AA83 /* AffineViewController+AIButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AffineViewController+AIButton.swift"; sourceTree = "<group>"; };
9D52FC422D26CDB600105D0A /* JSValueContainerExt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JSValueContainerExt.swift; sourceTree = "<group>"; }; 9D52FC422D26CDB600105D0A /* JSValueContainerExt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JSValueContainerExt.swift; sourceTree = "<group>"; };
@@ -80,8 +81,6 @@
/* Begin PBXFileSystemSynchronizedRootGroup section */ /* Begin PBXFileSystemSynchronizedRootGroup section */
9DAE85B72E7BAC3B00DB9F1D /* Plugins */ = { 9DAE85B72E7BAC3B00DB9F1D /* Plugins */ = {
isa = PBXFileSystemSynchronizedRootGroup; isa = PBXFileSystemSynchronizedRootGroup;
exceptions = (
);
path = Plugins; path = Plugins;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
@@ -137,6 +136,7 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
5039CC962D1D42C700874F32 /* AffineGraphQL */, 5039CC962D1D42C700874F32 /* AffineGraphQL */,
50CECF1E2E7C1084004487AA /* AffineResources */,
50802D5E2D112F7D00694021 /* Intelligents */, 50802D5E2D112F7D00694021 /* Intelligents */,
); );
path = Packages; path = Packages;
@@ -292,9 +292,13 @@
); );
inputFileListPaths = ( inputFileListPaths = (
); );
inputPaths = (
);
name = "[CP] Embed Pods Frameworks"; name = "[CP] Embed Pods Frameworks";
outputFileListPaths = ( outputFileListPaths = (
); );
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AFFiNE/Pods-AFFiNE-frameworks.sh\"\n"; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AFFiNE/Pods-AFFiNE-frameworks.sh\"\n";

View File

@@ -41,8 +41,8 @@
"kind" : "remoteSourceControl", "kind" : "remoteSourceControl",
"location" : "https://github.com/Lakr233/MarkdownView", "location" : "https://github.com/Lakr233/MarkdownView",
"state" : { "state" : {
"revision" : "1b0267f115274260d7cc875c4e9043f976f003a2", "revision" : "c052f57768436212c91e4369d76181c38eaa3ba3",
"version" : "3.4.1" "version" : "3.4.2"
} }
}, },
{ {
@@ -107,15 +107,6 @@
"revision" : "cfd646dcac0c5553e21ebf1ee05f9078277518bc", "revision" : "cfd646dcac0c5553e21ebf1ee05f9078277518bc",
"version" : "1.7.2" "version" : "1.7.2"
} }
},
{
"identity" : "then",
"kind" : "remoteSourceControl",
"location" : "https://github.com/devxoul/Then",
"state" : {
"revision" : "d41ef523faef0f911369f79c0b96815d9dbb6d7a",
"version" : "3.0.0"
}
} }
], ],
"version" : 2 "version" : 2

View File

@@ -8,8 +8,8 @@
import ApolloAPI import ApolloAPI
public enum SchemaConfiguration: ApolloAPI.SchemaConfiguration { public enum SchemaConfiguration: ApolloAPI.SchemaConfiguration {
public static func cacheKeyInfo(for _: ApolloAPI.Object, object _: ApolloAPI.ObjectData) -> CacheKeyInfo? { public static func cacheKeyInfo(for type: ApolloAPI.Object, object: ApolloAPI.ObjectData) -> CacheKeyInfo? {
// Implement this function to configure cache key resolution for your schema types. // Implement this function to configure cache key resolution for your schema types.
nil return nil
} }
} }

View File

@@ -0,0 +1,8 @@
.DS_Store
/.build
/Packages
xcuserdata/
DerivedData/
.swiftpm/configuration/registries.json
.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
.netrc

View File

@@ -0,0 +1,23 @@
// swift-tools-version: 5.9
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "AffineResources",
products: [
.library(
name: "AffineResources",
targets: ["AffineResources"]
),
],
targets: [
.target(
name: "AffineResources",
resources: [
.process("Resources/Icons.xcassets"),
.process("Resources/Colors.xcassets"),
]
),
]
)

View File

@@ -0,0 +1,63 @@
// The Swift Programming Language
// https://docs.swift.org/swift-book
import SwiftUI
import UIKit
public enum AffineColors: String, CaseIterable {
case buttonPrimary = "affine.button.primary"
case iconActivated = "affine.icon.activated"
case iconPrimary = "affine.icon.primary"
case layerBackgroundPrimary = "affine.layer.background.primary"
case layerBackgroundSecondary = "affine.layer.background.secondary"
case layerBorder = "affine.layer.border"
case layerPureWhite = "affine.layer.pureWhite"
case textEmphasis = "affine.text.emphasis"
case textLink = "affine.text.link"
case textListDotAndNumber = "affine.text.listDotAndNumber"
case textPlaceholder = "affine.text.placeholder"
case textPrimary = "affine.text.primary"
case textPureWhite = "affine.text.pureWhite"
case textSecondary = "affine.text.secondary"
case textTertiary = "affine.text.tertiary"
@available(iOS 13.0, *)
public var color: Color {
Color(rawValue, bundle: .module)
}
public var uiColor: UIColor {
UIColor(named: rawValue, in: .module, compatibleWith: nil) ?? .clear
}
}
public enum AffineIcons: String, CaseIterable {
case arrowDown = "ArrowDown"
case arrowUpBig = "ArrowUpBig"
case box = "Box"
case broom = "Broom"
case bubble = "Bubble"
case calendar = "Calendar"
case camera = "Camera"
case checkCircle = "CheckCircle"
case close = "Close"
case image = "Image"
case more = "More"
case page = "Page"
case plus = "Plus"
case settings = "Settings"
case think = "Think"
case tools = "Tools"
case upload = "Upload"
case web = "Web"
@available(iOS 13.0, *)
public var image: Image {
Image(rawValue, bundle: .module)
}
@available(iOS 13.0, *)
public var uiImage: UIImage {
UIImage(named: rawValue, in: .module, with: .none) ?? UIImage()
}
}

View File

@@ -14,28 +14,29 @@ let package = Package(
], ],
dependencies: [ dependencies: [
.package(path: "../AffineGraphQL"), .package(path: "../AffineGraphQL"),
.package(path: "../AffineResources"),
.package(url: "https://github.com/apollographql/apollo-ios.git", from: "1.22.0"), .package(url: "https://github.com/apollographql/apollo-ios.git", from: "1.22.0"),
.package(url: "https://github.com/apple/swift-collections", from: "1.2.0"), .package(url: "https://github.com/apple/swift-collections.git", from: "1.2.0"),
.package(url: "https://github.com/devxoul/Then", from: "3.0.0"),
.package(url: "https://github.com/SnapKit/SnapKit.git", from: "5.7.1"), .package(url: "https://github.com/SnapKit/SnapKit.git", from: "5.7.1"),
.package(url: "https://github.com/SwifterSwift/SwifterSwift.git", from: "6.0.0"), .package(url: "https://github.com/SwifterSwift/SwifterSwift.git", from: "6.0.0"),
.package(url: "https://github.com/Recouse/EventSource", from: "0.1.4"), .package(url: "https://github.com/Recouse/EventSource.git", from: "0.1.4"),
.package(url: "https://github.com/Lakr233/ListViewKit", from: "1.1.6"), .package(url: "https://github.com/Lakr233/ListViewKit.git", from: "1.1.6"),
.package(url: "https://github.com/Lakr233/MarkdownView", from: "3.4.1"), .package(url: "https://github.com/Lakr233/MarkdownView.git", from: "3.4.2"),
], ],
targets: [ targets: [
.target(name: "Intelligents", dependencies: [ .target(name: "Intelligents", dependencies: [
"AffineGraphQL", "AffineGraphQL",
"AffineResources",
"SnapKit", "SnapKit",
"Then",
"SwifterSwift", "SwifterSwift",
.product(name: "Apollo", package: "apollo-ios"), .product(name: "Apollo", package: "apollo-ios"),
.product(name: "OrderedCollections", package: "swift-collections"), .product(name: "OrderedCollections", package: "swift-collections"),
"ListViewKit", "ListViewKit",
"MarkdownView", "MarkdownView",
"EventSource", "EventSource",
], resources: [ ], resources: [
.process("Resources/main.metal"),
.process("Resources/Media.xcassets"),
.process("Interface/View/InputBox/InputBox.xcassets"), .process("Interface/View/InputBox/InputBox.xcassets"),
.process("Interface/Controller/AttachmentManagementController/AttachmentIcon.xcassets"), .process("Interface/Controller/AttachmentManagementController/AttachmentIcon.xcassets"),
]), ]),

View File

@@ -0,0 +1,79 @@
import AffineResources
import SwiftUI
extension Color {
/// Primary icon color
static var affineIconPrimary: Color {
AffineColors.iconPrimary.color
}
/// Primary background layer color
static var affineLayerBackgroundPrimary: Color {
AffineColors.layerBackgroundPrimary.color
}
/// Secondary background layer color
static var affineLayerBackgroundSecondary: Color {
AffineColors.layerBackgroundSecondary.color
}
/// Border layer color
static var affineLayerBorder: Color {
AffineColors.layerBorder.color
}
/// Pure white layer color
static var affineLayerPureWhite: Color {
AffineColors.layerPureWhite.color
}
/// Primary button color
static var affineButtonPrimary: Color {
AffineColors.buttonPrimary.color
}
/// Activated icon color
static var affineIconActivated: Color {
AffineColors.iconActivated.color
}
/// Text emphasis color
static var affineTextEmphasis: Color {
AffineColors.textEmphasis.color
}
/// Text link color
static var affineTextLink: Color {
AffineColors.textLink.color
}
/// List dot and number color
static var affineTextListDotAndNumber: Color {
AffineColors.textListDotAndNumber.color
}
/// Placeholder text color
static var affineTextPlaceholder: Color {
AffineColors.textPlaceholder.color
}
/// Primary text color
static var affineTextPrimary: Color {
AffineColors.textPrimary.color
}
/// Pure white text color
static var affineTextPureWhite: Color {
AffineColors.textPureWhite.color
}
/// Secondary text color
static var affineTextSecondary: Color {
AffineColors.textSecondary.color
}
/// Tertiary text color
static var affineTextTertiary: Color {
AffineColors.textTertiary.color
}
}

View File

@@ -0,0 +1,94 @@
import AffineResources
import SwiftUI
extension Image {
/// Check circle icon
static var affineCheckCircle: Image {
AffineIcons.checkCircle.image
}
/// More options icon
static var affineMore: Image {
AffineIcons.more.image
}
/// Arrow down icon
static var affineArrowDown: Image {
AffineIcons.arrowDown.image
}
/// Tools icon
static var affineTools: Image {
AffineIcons.tools.image
}
/// Box icon
static var affineBox: Image {
AffineIcons.box.image
}
/// Think icon
static var affineThink: Image {
AffineIcons.think.image
}
/// Web icon
static var affineWeb: Image {
AffineIcons.web.image
}
/// Calendar icon
static var affineCalendar: Image {
AffineIcons.calendar.image
}
/// Camera icon
static var affineCamera: Image {
AffineIcons.camera.image
}
/// Close icon
static var affineClose: Image {
AffineIcons.close.image
}
/// Big arrow up icon
static var affineArrowUpBig: Image {
AffineIcons.arrowUpBig.image
}
/// Broom icon
static var affineBroom: Image {
AffineIcons.broom.image
}
/// Bubble icon
static var affineBubble: Image {
AffineIcons.bubble.image
}
/// Image icon
static var affineImage: Image {
AffineIcons.image.image
}
/// Page icon
static var affinePage: Image {
AffineIcons.page.image
}
/// Plus icon
static var affinePlus: Image {
AffineIcons.plus.image
}
/// Settings icon
static var affineSettings: Image {
AffineIcons.settings.image
}
/// Upload icon
static var affineUpload: Image {
AffineIcons.upload.image
}
}

View File

@@ -0,0 +1,100 @@
// The MIT License (MIT)
//
// Copyright (c) 2015 Suyeol Jeon (xoul.kr)
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
// this package uses swift version 5.0 which is currently broken
import Foundation
#if !os(Linux)
import CoreGraphics
#endif
#if os(iOS) || os(tvOS)
import UIKit.UIGeometry
#endif
public protocol Then {}
extension Then where Self: Any {
/// Makes it available to set properties with closures just after initializing and copying the value types.
///
/// let frame = CGRect().with {
/// $0.origin.x = 10
/// $0.size.width = 100
/// }
@inlinable
public func with(_ block: (inout Self) throws -> Void) rethrows -> Self {
var copy = self
try block(&copy)
return copy
}
/// Makes it available to execute something with closures.
///
/// UserDefaults.standard.do {
/// $0.set("devxoul", forKey: "username")
/// $0.set("devxoul@gmail.com", forKey: "email")
/// $0.synchronize()
/// }
@inlinable
public func `do`(_ block: (Self) throws -> Void) rethrows {
try block(self)
}
}
extension Then where Self: AnyObject {
/// Makes it available to set properties with closures just after initializing.
///
/// let label = UILabel().then {
/// $0.textAlignment = .center
/// $0.textColor = UIColor.black
/// $0.text = "Hello, World!"
/// }
@inlinable
public func then(_ block: (Self) throws -> Void) rethrows -> Self {
try block(self)
return self
}
}
extension NSObject: Then {}
#if !os(Linux)
extension CGPoint: Then {}
extension CGRect: Then {}
extension CGSize: Then {}
extension CGVector: Then {}
#endif
extension Array: Then {}
extension Dictionary: Then {}
extension Set: Then {}
extension JSONDecoder: Then {}
extension JSONEncoder: Then {}
#if os(iOS) || os(tvOS)
extension UIEdgeInsets: Then {}
extension UIOffset: Then {}
extension UIRectEdge: Then {}
#endif

View File

@@ -1,78 +1,79 @@
import AffineResources
import UIKit import UIKit
extension UIColor { extension UIColor {
/// Primary icon color /// Primary icon color
static var affineIconPrimary: UIColor { static var affineIconPrimary: UIColor {
UIColor(named: "affine.icon.primary", in: .module, compatibleWith: nil) ?? .black AffineColors.iconPrimary.uiColor
} }
/// Primary background layer color /// Primary background layer color
static var affineLayerBackgroundPrimary: UIColor { static var affineLayerBackgroundPrimary: UIColor {
UIColor(named: "affine.layer.background.primary", in: .module, compatibleWith: nil) ?? .white AffineColors.layerBackgroundPrimary.uiColor
} }
/// Secondary background layer color /// Secondary background layer color
static var affineLayerBackgroundSecondary: UIColor { static var affineLayerBackgroundSecondary: UIColor {
UIColor(named: "affine.layer.background.secondary", in: .module, compatibleWith: nil) ?? .systemGray6 AffineColors.layerBackgroundSecondary.uiColor
} }
/// Border layer color /// Border layer color
static var affineLayerBorder: UIColor { static var affineLayerBorder: UIColor {
UIColor(named: "affine.layer.border", in: .module, compatibleWith: nil) ?? .gray AffineColors.layerBorder.uiColor
} }
/// Pure white layer color /// Pure white layer color
static var affineLayerPureWhite: UIColor { static var affineLayerPureWhite: UIColor {
UIColor(named: "affine.layer.pureWhite", in: .module, compatibleWith: nil) ?? .white AffineColors.layerPureWhite.uiColor
} }
/// Primary button color /// Primary button color
static var affineButtonPrimary: UIColor { static var affineButtonPrimary: UIColor {
UIColor(named: "affine.button.primary", in: .module, compatibleWith: nil) ?? .blue AffineColors.buttonPrimary.uiColor
} }
/// Activated icon color /// Activated icon color
static var affineIconActivated: UIColor { static var affineIconActivated: UIColor {
UIColor(named: "affine.icon.activated", in: .module, compatibleWith: nil) ?? .blue AffineColors.iconActivated.uiColor
} }
/// Text emphasis color /// Text emphasis color
static var affineTextEmphasis: UIColor { static var affineTextEmphasis: UIColor {
UIColor(named: "affine.text.emphasis", in: .module, compatibleWith: nil) ?? .blue AffineColors.textEmphasis.uiColor
} }
/// Text link color /// Text link color
static var affineTextLink: UIColor { static var affineTextLink: UIColor {
UIColor(named: "affine.text.link", in: .module, compatibleWith: nil) ?? .blue AffineColors.textLink.uiColor
} }
/// List dot and number color /// List dot and number color
static var affineTextListDotAndNumber: UIColor { static var affineTextListDotAndNumber: UIColor {
UIColor(named: "affine.text.listDotAndNumber", in: .module, compatibleWith: nil) ?? .blue AffineColors.textListDotAndNumber.uiColor
} }
/// Placeholder text color /// Placeholder text color
static var affineTextPlaceholder: UIColor { static var affineTextPlaceholder: UIColor {
UIColor(named: "affine.text.placeholder", in: .module, compatibleWith: nil) ?? .gray AffineColors.textPlaceholder.uiColor
} }
/// Primary text color /// Primary text color
static var affineTextPrimary: UIColor { static var affineTextPrimary: UIColor {
UIColor(named: "affine.text.primary", in: .module, compatibleWith: nil) ?? .black AffineColors.textPrimary.uiColor
} }
/// Pure white text color /// Pure white text color
static var affineTextPureWhite: UIColor { static var affineTextPureWhite: UIColor {
UIColor(named: "affine.text.pureWhite", in: .module, compatibleWith: nil) ?? .white AffineColors.textPureWhite.uiColor
} }
/// Secondary text color /// Secondary text color
static var affineTextSecondary: UIColor { static var affineTextSecondary: UIColor {
UIColor(named: "affine.text.secondary", in: .module, compatibleWith: nil) ?? .gray AffineColors.textSecondary.uiColor
} }
/// Tertiary text color /// Tertiary text color
static var affineTextTertiary: UIColor { static var affineTextTertiary: UIColor {
UIColor(named: "affine.text.tertiary", in: .module, compatibleWith: nil) ?? .gray AffineColors.textTertiary.uiColor
} }
} }

View File

@@ -1,93 +1,94 @@
import AffineResources
import UIKit import UIKit
extension UIImage { extension UIImage {
/// Check circle icon /// Check circle icon
static var affineCheckCircle: UIImage { static var affineCheckCircle: UIImage {
UIImage(named: "CheckCircle", in: .module, compatibleWith: nil) ?? UIImage() AffineIcons.checkCircle.uiImage
} }
/// More options icon /// More options icon
static var affineMore: UIImage { static var affineMore: UIImage {
UIImage(named: "More", in: .module, compatibleWith: nil) ?? UIImage() AffineIcons.more.uiImage
} }
/// Arrow down icon /// Arrow down icon
static var affineArrowDown: UIImage { static var affineArrowDown: UIImage {
UIImage(named: "ArrowDown", in: .module, compatibleWith: nil) ?? UIImage() AffineIcons.arrowDown.uiImage
} }
/// Tools icon /// Tools icon
static var affineTools: UIImage { static var affineTools: UIImage {
UIImage(named: "Tools", in: .module, compatibleWith: nil) ?? UIImage() AffineIcons.tools.uiImage
} }
/// Box icon /// Box icon
static var affineBox: UIImage { static var affineBox: UIImage {
UIImage(named: "Box", in: .module, compatibleWith: nil) ?? UIImage() AffineIcons.box.uiImage
} }
/// Think icon /// Think icon
static var affineThink: UIImage { static var affineThink: UIImage {
UIImage(named: "Think", in: .module, compatibleWith: nil) ?? UIImage() AffineIcons.think.uiImage
} }
/// Web icon /// Web icon
static var affineWeb: UIImage { static var affineWeb: UIImage {
UIImage(named: "Web", in: .module, compatibleWith: nil) ?? UIImage() AffineIcons.web.uiImage
} }
/// Calendar icon /// Calendar icon
static var affineCalendar: UIImage { static var affineCalendar: UIImage {
UIImage(named: "Calendar", in: .module, compatibleWith: nil) ?? UIImage() AffineIcons.calendar.uiImage
} }
/// Camera icon /// Camera icon
static var affineCamera: UIImage { static var affineCamera: UIImage {
UIImage(named: "Camera", in: .module, compatibleWith: nil) ?? UIImage() AffineIcons.camera.uiImage
} }
/// Close icon /// Close icon
static var affineClose: UIImage { static var affineClose: UIImage {
UIImage(named: "Close", in: .module, compatibleWith: nil) ?? UIImage() AffineIcons.close.uiImage
} }
/// Big arrow up icon /// Big arrow up icon
static var affineArrowUpBig: UIImage { static var affineArrowUpBig: UIImage {
UIImage(named: "ArrowUpBig", in: .module, compatibleWith: nil) ?? UIImage() AffineIcons.arrowUpBig.uiImage
} }
/// Broom icon /// Broom icon
static var affineBroom: UIImage { static var affineBroom: UIImage {
UIImage(named: "Broom", in: .module, compatibleWith: nil) ?? UIImage() AffineIcons.broom.uiImage
} }
/// Bubble icon /// Bubble icon
static var affineBubble: UIImage { static var affineBubble: UIImage {
UIImage(named: "Bubble", in: .module, compatibleWith: nil) ?? UIImage() AffineIcons.bubble.uiImage
} }
/// Image icon /// Image icon
static var affineImage: UIImage { static var affineImage: UIImage {
UIImage(named: "Image", in: .module, compatibleWith: nil) ?? UIImage() AffineIcons.image.uiImage
} }
/// Page icon /// Page icon
static var affinePage: UIImage { static var affinePage: UIImage {
UIImage(named: "Page", in: .module, compatibleWith: nil) ?? UIImage() AffineIcons.page.uiImage
} }
/// Plus icon /// Plus icon
static var affinePlus: UIImage { static var affinePlus: UIImage {
UIImage(named: "Plus", in: .module, compatibleWith: nil) ?? UIImage() AffineIcons.plus.uiImage
} }
/// Settings icon /// Settings icon
static var affineSettings: UIImage { static var affineSettings: UIImage {
UIImage(named: "Settings", in: .module, compatibleWith: nil) ?? UIImage() AffineIcons.settings.uiImage
} }
/// Upload icon /// Upload icon
static var affineUpload: UIImage { static var affineUpload: UIImage {
UIImage(named: "Upload", in: .module, compatibleWith: nil) ?? UIImage() AffineIcons.upload.uiImage
} }
} }

View File

@@ -6,7 +6,6 @@
// //
import SnapKit import SnapKit
import Then
import UIKit import UIKit
class AttachmentManagementController: UINavigationController { class AttachmentManagementController: UINavigationController {

View File

@@ -1,6 +1,5 @@
import Combine import Combine
import SnapKit import SnapKit
import Then
import UIKit import UIKit
class MainViewController: UIViewController { class MainViewController: UIViewController {

View File

@@ -8,7 +8,6 @@
import Litext import Litext
import MarkdownView import MarkdownView
import SnapKit import SnapKit
import Then
import UIKit import UIKit
private let markdownViewForSizeCalculation: MarkdownTextView = .init() private let markdownViewForSizeCalculation: MarkdownTextView = .init()

View File

@@ -9,7 +9,6 @@ import ListViewKit
import Litext import Litext
import MarkdownView import MarkdownView
import SnapKit import SnapKit
import Then
import UIKit import UIKit
class ChatBaseCell: ListRowView { class ChatBaseCell: ListRowView {

View File

@@ -7,7 +7,6 @@
import Litext import Litext
import SnapKit import SnapKit
import Then
import UIKit import UIKit
class ErrorCell: ChatBaseCell { class ErrorCell: ChatBaseCell {

View File

@@ -7,7 +7,6 @@
import Litext import Litext
import SnapKit import SnapKit
import Then
import UIKit import UIKit
class LoadingCell: ChatBaseCell { class LoadingCell: ChatBaseCell {

View File

@@ -7,7 +7,6 @@
import Litext import Litext
import SnapKit import SnapKit
import Then
import UIKit import UIKit
private let labelForSizeCalculation = LTXLabel() private let labelForSizeCalculation = LTXLabel()

View File

@@ -7,7 +7,6 @@
import Litext import Litext
import SnapKit import SnapKit
import Then
import UIKit import UIKit
private let labelForSizeCalculation = LTXLabel() private let labelForSizeCalculation = LTXLabel()

View File

@@ -7,7 +7,6 @@
import AffineGraphQL import AffineGraphQL
import SnapKit import SnapKit
import Then
import UIKit import UIKit
class DocumentPickerView: UIView { class DocumentPickerView: UIView {

View File

@@ -6,7 +6,6 @@
// //
import SnapKit import SnapKit
import Then
import UIKit import UIKit
class DocumentTableViewCell: UITableViewCell { class DocumentTableViewCell: UITableViewCell {

View File

@@ -1,5 +1,4 @@
import SnapKit import SnapKit
import Then
import UIKit import UIKit
final class FileAttachmentHeaderView: UIView { final class FileAttachmentHeaderView: UIView {

View File

@@ -6,7 +6,6 @@
// //
import SnapKit import SnapKit
import Then
import UIKit import UIKit
class ImageAttachmentBar: UICollectionView { class ImageAttachmentBar: UICollectionView {

View File

@@ -1,6 +1,5 @@
import Combine import Combine
import SnapKit import SnapKit
import Then
import UIKit import UIKit
class InputBox: UIView { class InputBox: UIView {

View File

@@ -1,5 +1,4 @@
import SnapKit import SnapKit
import Then
import UIKit import UIKit
private let unselectedColor: UIColor = .affineIconPrimary private let unselectedColor: UIColor = .affineIconPrimary

View File

@@ -7,7 +7,6 @@
import SnapKit import SnapKit
import SwifterSwift import SwifterSwift
import Then
import UIKit import UIKit
// floating button to open intelligent panel // floating button to open intelligent panel

View File

@@ -1,5 +1,4 @@
import SnapKit import SnapKit
import Then
import UIKit import UIKit
class MainHeaderView: UIView { class MainHeaderView: UIView {

View File

@@ -45,13 +45,13 @@ EXTERNAL SOURCES:
:path: "../../../../../node_modules/capacitor-plugin-app-tracking-transparency" :path: "../../../../../node_modules/capacitor-plugin-app-tracking-transparency"
SPEC CHECKSUMS: SPEC CHECKSUMS:
Capacitor: 106e7a4205f4618d582b886a975657c61179138d Capacitor: 03bc7cbdde6a629a8b910a9d7d78c3cc7ed09ea7
CapacitorApp: d63334c052278caf5d81585d80b21905c6f93f39 CapacitorApp: febecbb9582cb353aed037e18ec765141f880fe9
CapacitorBrowser: 081852cf532acf77b9d2953f3a88fe5b9711fb06 CapacitorBrowser: 6299776d496e968505464884d565992faa20444a
CapacitorCordova: 5967b9ba03915ef1d585469d6e31f31dc49be96f CapacitorCordova: 5967b9ba03915ef1d585469d6e31f31dc49be96f
CapacitorHaptics: 70e47470fa1a6bd6338cd102552e3846b7f9a1b3 CapacitorHaptics: 1f1e17041f435d8ead9ff2a34edd592c6aa6a8d6
CapacitorKeyboard: 969647d0ca2e5c737d7300088e2517aa832434e2 CapacitorKeyboard: 09fd91dcde4f8a37313e7f11bde553ad1ed52036
CapacitorPluginAppTrackingTransparency: 2a2792623a5a72795f2e8f9ab3f1147573732fd8 CapacitorPluginAppTrackingTransparency: 92ae9c1cfb5cf477753db9269689332a686f675a
CryptoSwift: 967f37cea5a3294d9cce358f78861652155be483 CryptoSwift: 967f37cea5a3294d9cce358f78861652155be483
PODFILE CHECKSUM: 2c1e4be82121f2d9724ecf7e31dd14e165aeb082 PODFILE CHECKSUM: 2c1e4be82121f2d9724ecf7e31dd14e165aeb082