diff --git a/.github/workflows/run-test.yml b/.github/workflows/run-test.yml new file mode 100644 index 0000000..edc817f --- /dev/null +++ b/.github/workflows/run-test.yml @@ -0,0 +1,56 @@ +name: Xcode Build and Test + +on: + push: + branches: + - main + - develop + pull_request: + branches: + - main + - develop + workflow_dispatch: + +jobs: + test: + name: Run Xcode Tests on iPhone 16 (iOS 18.1) + # macOS-latest should ideally include Xcode 16+, but we'll ensure it. + runs-on: macos-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Select Xcode 16.x for iOS 18.1 support + uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: 'latest-stable' # Try 'latest-stable' first + + - name: Display active Xcode version after selection + run: xcodebuild -version + # Verify here that Xcode 16.x (or newer) is now active. + + - name: List available iOS Simulators and their OS versions + # Now, this should show iPhone 16 with iOS 18.x if Xcode 16 is active. + run: xcrun simctl list devices + + - name: Clean Xcode Derived Data + # Always good practice for CI to ensure a fresh build. + run: xcodebuild clean -scheme BuilderIO -destination "platform=iOS Simulator,name=iPhone 16,OS=18.1" + + - name: Build and Test Xcode Project on iPhone 16 (iOS 18.1) + run: | + SIMULATOR_NAME="iPhone 16" + # Ensure this OS version is available with your selected Xcode 16.x + OS_VERSION="18.1" + + DESTINATION="platform=iOS Simulator,name=${SIMULATOR_NAME},OS=${OS_VERSION}" + + echo "Attempting to build and test on destination: $DESTINATION" + + xcodebuild test -scheme BuilderIO \ + -destination "$DESTINATION" \ + CODE_SIGNING_ALLOWED=NO \ + CODE_SIGNING_REQUIRED=NO + # If you want to capture test results: + # -resultBundlePath "output/TestResults.xcresult" diff --git a/.github/workflows/swift-format.yml b/.github/workflows/swift-format.yml index 6c46827..ae087cc 100644 --- a/.github/workflows/swift-format.yml +++ b/.github/workflows/swift-format.yml @@ -17,19 +17,21 @@ jobs: steps: - name: Checkout Repository uses: actions/checkout@v4 - - - name: Set up Swift - uses: swift-actions/setup-swift@v1 + + - name: Select Xcode 16.x for swift-format support + uses: maxim-lobanov/setup-xcode@v1 with: - swift-version: "5.9" + xcode-version: 'latest-stable' # Aims for Xcode 16.x or newer - - name: Build swift-format + - name: Verify Xcode version and swift-format availability run: | - git clone https://github.com/apple/swift-format.git - cd swift-format - swift build -c release - echo "$(pwd)/.build/release" >> $GITHUB_PATH + echo "Active Xcode version:" + xcodebuild -version + echo "swift-format path (should be within Xcode toolchain):" + xcrun --find swift-format || echo "swift-format not found via xcrun, check Xcode version." + - name: Run swift-format lint (will fail on issues) run: | - swift-format lint --recursive Sources Tests + xcrun swift-format lint --recursive Sources Tests --ignore-unparsable-files + diff --git a/Package.resolved b/Package.resolved index 3198c98..c70d0ba 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,5 +1,41 @@ { "pins" : [ + { + "identity" : "mocker", + "kind" : "remoteSourceControl", + "location" : "https://github.com/WeTransfer/Mocker.git", + "state" : { + "revision" : "95fa785c751f6bc40c49e112d433c3acf8417a97", + "version" : "3.0.2" + } + }, + { + "identity" : "swift-custom-dump", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-custom-dump", + "state" : { + "revision" : "82645ec760917961cfa08c9c0c7104a57a0fa4b1", + "version" : "1.3.3" + } + }, + { + "identity" : "swift-snapshot-testing", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-snapshot-testing", + "state" : { + "revision" : "b198a568ad24c5a22995c5ff0ecf9667634e860e", + "version" : "1.18.5" + } + }, + { + "identity" : "swift-syntax", + "kind" : "remoteSourceControl", + "location" : "https://github.com/swiftlang/swift-syntax", + "state" : { + "revision" : "f99ae8aa18f0cf0d53481901f88a0991dc3bd4a2", + "version" : "601.0.1" + } + }, { "identity" : "swiftyjson", "kind" : "remoteSourceControl", @@ -8,6 +44,15 @@ "revision" : "b3dcd7dbd0d488e1a7077cb33b00f2083e382f07", "version" : "5.0.1" } + }, + { + "identity" : "xctest-dynamic-overlay", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/xctest-dynamic-overlay", + "state" : { + "revision" : "23e3442166b5122f73f9e3e622cd1e4bafeab3b7", + "version" : "1.6.0" + } } ], "version" : 2 diff --git a/Package.swift b/Package.swift index 296672c..ab460b1 100644 --- a/Package.swift +++ b/Package.swift @@ -4,33 +4,51 @@ import PackageDescription let package = Package( - name: "BuilderIO", + name: "BuilderIO", // Good: Clear, concise name matching the library + platforms: [ - .iOS(.v17), + .iOS(.v17), ], + + // --- Products --- products: [ - // Products define the executables and libraries a package produces, and make them visible to other packages. .library( name: "BuilderIO", targets: ["BuilderIO"] ), ], + + // --- Dependencies --- dependencies: [ - // Dependencies declare other packages that this package depends on. - // .package(url: /* package url */, from: "1.0.0"), .package(url: "https://github.com/SwiftyJSON/SwiftyJSON.git", from: "5.0.1"), + .package(url: "https://github.com/pointfreeco/swift-snapshot-testing", from: "1.17.0"), + .package(url: "https://github.com/WeTransfer/Mocker.git", .upToNextMajor(from: "3.0.0")), ], + + // --- Targets --- targets: [ - // Targets are the basic building blocks of a package. A target can define a module or a test suite. - // Targets can depend on other targets in this package, and on products in packages this package depends on. + // Main library target .target( name: "BuilderIO", dependencies: [ "SwiftyJSON", ], resources: [ - .process("Resources/Fonts") - ] + .process("Resources/Fonts") + ] + ), + + // Test target + .testTarget( + name: "BuilderIOTests", + dependencies: [ + "BuilderIO", // Dependency on the local library target + "Mocker", + .product(name: "SnapshotTesting", package: "swift-snapshot-testing") + ], + resources: [ + .process("Resources") + ] ), ] -) +) \ No newline at end of file diff --git a/Sources/BuilderIO/Components/BuilderBlock.swift b/Sources/BuilderIO/Components/BuilderBlock.swift index a9a884c..c428843 100644 --- a/Sources/BuilderIO/Components/BuilderBlock.swift +++ b/Sources/BuilderIO/Components/BuilderBlock.swift @@ -102,7 +102,9 @@ struct BuilderBlockLayout: View { // 1. Extract basic layout parameters let direction = responsiveStyles["flexDirection"] ?? "column" let wrap = responsiveStyles["flexWrap"] == "wrap" && direction == "row" - let scroll = (responsiveStyles["overflow"] == "auto" || responsiveStyles["overflow"] == "scroll") && direction == "row" + let scroll = + (responsiveStyles["overflow"] == "auto" || responsiveStyles["overflow"] == "scroll") + && direction == "row" let justify = responsiveStyles["justifyContent"] let alignItems = responsiveStyles["alignItems"] diff --git a/Sources/BuilderIO/Extensions/Font.swift b/Sources/BuilderIO/Extensions/Font.swift index 6ce438f..66e8dde 100644 --- a/Sources/BuilderIO/Extensions/Font.swift +++ b/Sources/BuilderIO/Extensions/Font.swift @@ -23,11 +23,11 @@ extension Font { _ = UIFont.registerFont(bundle: .module, fontName: "DMSans", fontExtension: "ttf") _ = UIFont.registerFont(bundle: .module, fontName: "DMSans-Italic", fontExtension: "ttf") } - + } extension UIFont { - + static func registerFont(bundle: Bundle, fontName: String, fontExtension: String) -> Bool { guard let fontURL = bundle.url(forResource: fontName, withExtension: fontExtension) else { fatalError("Couldn't find font \(fontName)") diff --git a/Tests/BuilderIOTests/BuilderIOPageViewTests.swift b/Tests/BuilderIOTests/BuilderIOPageViewTests.swift new file mode 100644 index 0000000..b2675be --- /dev/null +++ b/Tests/BuilderIOTests/BuilderIOPageViewTests.swift @@ -0,0 +1,78 @@ +import XCTest +import BuilderIO +import SnapshotTesting +import UIKit +import SwiftUI + +@MainActor +class BuilderIOPageViewTests: XCTestCase { + + static let record = false + + override func setUpWithError() throws { + BuilderIOManager.configure(apiKey: "UNITTESTINGAPIKEY", customNavigationScheme: "builderio") + + continueAfterFailure = false + } + + override func tearDownWithError() throws { + // Clear all mocks after each test + print(" 🚨 Tests deregistered") + + BuilderIOMockManager.shared.clearAllMocks() + try super.tearDownWithError() + } + + + func testTextView() throws { + BuilderIOMockManager.shared.registerMock(for: "/text", with: "text", statusCode: 200) + + let hostingController = makeHostingController(for: "/text", width: 375, height: 812) + +       let expectation = XCTestExpectation(description: "Wait for view to render") + + DispatchQueue.main.asyncAfter(deadline: .now() + 2) { + + assertSnapshot(matching: hostingController, as: .image, record: BuilderIOPageViewTests.record) + expectation.fulfill() + } + + + wait(for: [expectation], timeout: 3) + } + + func testLayoutsView() throws { + BuilderIOMockManager.shared.registerMock(for: "/layout", with: "layout", statusCode: 200) + + let hostingController = makeHostingController(for: "/layout", width: 375, height: 812) + +       let expectation = XCTestExpectation(description: "Wait for view to render") + + DispatchQueue.main.asyncAfter(deadline: .now() + 2) { + + assertSnapshot(matching: hostingController, as: .image, record: BuilderIOPageViewTests.record) + expectation.fulfill() + } + + + wait(for: [expectation], timeout: 3) + } + + /// - Returns: A UIHostingController wrapping the SwiftUI Text view. + func makeHostingController(for url: String, width: CGFloat, height: CGFloat) -> UIHostingController { + let view = BuilderIOPage(url: url, onClickEventHandler: { event in + print("Handle Event Action") + }) + + let hostingController = UIHostingController(rootView: view.frame(width: 375, height: 812)) + hostingController.view.frame = CGRect(x: 0, y: 0, width: 375, height: 812) + + let window = UIWindow(frame: hostingController.view.frame) + window.rootViewController = hostingController + window.makeKeyAndVisible() + + + return hostingController + } + +} diff --git a/Tests/BuilderIOTests/Helper/BuilderIOMockManager.swift b/Tests/BuilderIOTests/Helper/BuilderIOMockManager.swift new file mode 100644 index 0000000..ffd0215 --- /dev/null +++ b/Tests/BuilderIOTests/Helper/BuilderIOMockManager.swift @@ -0,0 +1,162 @@ +import Foundation +import Mocker +import XCTest // Import XCTest if this class is part of your test bundle + +class BuilderIOMockManager { + + static let shared = BuilderIOMockManager() + + // MARK: - Properties + private let baseURLString = + "https://cdn.builder.io/api/v3/content/page?apiKey=UNITTESTINGAPIKEY" + let mockedURLSession: URLSession // Public so your API service can use it + + // MARK: - Initialization + private init() { // Private initializer to ensure only one instance is created + // Configure URLSession to use Mocker's URLProtocol + let configuration = URLSessionConfiguration.default + configuration.protocolClasses = [MockingURLProtocol.self] + self.mockedURLSession = URLSession(configuration: configuration) + registerImageMock() + } + + /// Loads a JSON file from the test bundle and returns it as Data. + /// + /// - Parameters: + /// - fileName: The name of the JSON file (e.g., "text"). + /// - Returns: Data containing the JSON, or nil if the file is not found or cannot be loaded. + private func loadJSONData(from fileName: String) -> Data? { + guard let url = Bundle.module.url(forResource: fileName, withExtension: "json") else { + XCTFail("Missing JSON file: \(fileName).json in Tests/BuilderIO/Responses") + return nil + } + do { + let data = try Data(contentsOf: url) + return data + } catch { + XCTFail("Failed to load data from \(fileName).json: \(error)") + return nil + } + } + + private func loadImageData(from imageName: String, withExtension fileExtension: String) -> Data? { + guard + let url = Bundle.module.url( + forResource: imageName, withExtension: fileExtension) + else { + XCTFail( + "❌ Missing image file: \(imageName).\(fileExtension) in 'builderio/images' subdirectory. Check path and Package.swift." + ) + return nil + } + do { + let data = try Data(contentsOf: url) + // Optional: Verify it's a valid image (for debugging) + if UIImage(data: data) == nil { + XCTFail("❌ Data loaded from \(imageName).\(fileExtension) is not a valid image.") + } + print("✅ Successfully loaded image data from: \(url.lastPathComponent)") + return data + } catch { + XCTFail( + "❌ Failed to load image data from \(imageName).\(fileExtension): \(error.localizedDescription)" + ) + return nil + } + } + + /// Registers a mock for a specific Builder.io API URL with a local JSON response. + /// + /// - Parameters: + /// - endpoint: The specific endpoint path (e.g., "/text"). + /// - jsonFileName: The name of the JSON file (without extension) in Tests/BuilderIO/Responses. + /// - statusCode: The HTTP status code to return (default is 200). + func registerMock(for endpoint: String, with jsonFileName: String, statusCode: Int = 200) { + guard let responseData = loadJSONData(from: jsonFileName) else { + XCTFail("Failed to read file: \(jsonFileName)") + + return // loadJSONData will already have failed the test if file is missing + } + + guard let url = URL(string: "\(baseURLString)&url=\(endpoint)") else { + XCTFail("Invalid URL constructed for endpoint: \(endpoint)") + return + } + + let mock = Mock( + url: url, + dataType: .json, + statusCode: statusCode, + data: [.get: responseData] + ) + + print("✅ Mock registered successfully for endpoint: \(url) using data") + + mock.register() + } + + let images: [[String: String]] = [ + [ + "name": "grocery", + "url": + "https://nuevokart.com/wp-content/uploads/2022/11/groceries-packages-delivery-covid-19-quarantine-shopping-concept-courier-with-food-package-bring-goods-client-house-contactless-delivery-during-coronavirus-wear-face-mask-gloves-1024x683.jpg", + "extension": "png", + ], + [ + "name": "designer", + "url": + "https://cdn.builder.io/api/v1/image/assets%2FagZ9n5CUKRfbL9t6CaJOyVSK4Es2%2F8e096f01b00343dca3952d645f7ae024?width=998&height=1000", + "extension": "jpg", + ], + [ + "name": "designer2", + "url": + "https://cdn.builder.io/api/v1/image/assets%2FagZ9n5CUKRfbL9t6CaJOyVSK4Es2%2F70c33c597e9946e9a79ab99ad9a999d3?width=998&height=1000", + "extension": "jpg", + ], + [ + "name": "furniture", + "url": + "https://www.freepnglogos.com/uploads/furniture-png/furniture-png-transparent-furniture-images-pluspng-15.png", + "extension": "png", + ], + [ + "name": "laptop", + "url": + "https://pngimg.com/uploads/macbook/small/macbook_PNG65.png", + "extension": "png", + ], + ] + + func registerImageMock(statusCode: Int = 200) { + + for image in images { + + guard + let responseData = loadImageData(from: image["name"]!, withExtension: image["extension"]!) + else { + return // loadImageData will already have failed the test if file is missing + } + + guard let urlString = image["url"], let url = URL(string: urlString) else { + XCTFail("Invalid URL string for image mock: \(String(describing: image["url"]))") + return + } + + let mock = Mock( + url: url, + ignoreQuery: true, + dataType: .imagePNG, // Specify IMAGE data type + statusCode: statusCode, + data: [.get: responseData] + ) + mock.register() + } + + } + + /// Clears all registered mocks. Call this in your `tearDown` method. + func clearAllMocks() { + Mocker.removeAll() + } +} diff --git a/Tests/BuilderIOTests/Resources/designer.jpg b/Tests/BuilderIOTests/Resources/designer.jpg new file mode 100644 index 0000000..2ef22d3 Binary files /dev/null and b/Tests/BuilderIOTests/Resources/designer.jpg differ diff --git a/Tests/BuilderIOTests/Resources/designer2.jpg b/Tests/BuilderIOTests/Resources/designer2.jpg new file mode 100644 index 0000000..b4ec01f Binary files /dev/null and b/Tests/BuilderIOTests/Resources/designer2.jpg differ diff --git a/Tests/BuilderIOTests/Resources/furniture.png b/Tests/BuilderIOTests/Resources/furniture.png new file mode 100644 index 0000000..de989c8 Binary files /dev/null and b/Tests/BuilderIOTests/Resources/furniture.png differ diff --git a/Tests/BuilderIOTests/Resources/grocery.png b/Tests/BuilderIOTests/Resources/grocery.png new file mode 100644 index 0000000..79043e9 Binary files /dev/null and b/Tests/BuilderIOTests/Resources/grocery.png differ diff --git a/Tests/BuilderIOTests/Resources/images.json b/Tests/BuilderIOTests/Resources/images.json new file mode 100644 index 0000000..98bb1b8 --- /dev/null +++ b/Tests/BuilderIOTests/Resources/images.json @@ -0,0 +1 @@ +{"results":[{"createdDate":1670398563029,"id":"8782fc28623b4c3d87780293b19bc820","name":"images","modelId":"036ff29532e349df8f16f726fb33dce3","published":"published","meta":{"lastPreviewUrl":"http://localhost:3000?builder.space=e084484c0e0241579f01abba29d9be10&builder.user.permissions=read%2Ccreate%2Cpublish%2CeditCode%2CeditDesigns%2CeditLayouts%2CeditLayers%2CeditContentPriority%2CeditFolders%2CeditProjects%2CmodifyMcpServers%2CmodifyProjectSettings%2CconnectCodeRepository%2CcreateProjects&builder.user.role.name=Developer&builder.user.role.id=developer&builder.cachebust=true&builder.preview=page&builder.noCache=true&builder.allowTextEdit=true&__builder_editing__=true&builder.overrides.page=8782fc28623b4c3d87780293b19bc820&builder.overrides.8782fc28623b4c3d87780293b19bc820=8782fc28623b4c3d87780293b19bc820&builder.overrides.page:/=8782fc28623b4c3d87780293b19bc820&builder.options.locale=Default","kind":"page","hasLinks":true},"query":[{"@type":"@builder.io/core:Query","property":"urlPath","operator":"is","value":"/images"}],"data":{"title":"images","themeId":false,"blocks":[{"@type":"@builder.io/sdk:Element","@version":2,"id":"builder-f37a5bbd451142c6ae5600599d3a76fd","component":{"name":"Image","options":{"image":"https://cdn.builder.io/api/v1/image/assets%2Fe084484c0e0241579f01abba29d9be10%2F566ee87bfbfd417d92c5f72f8dbdded4","backgroundSize":"cover","backgroundPosition":"center","lazy":false,"fitContent":true,"aspectRatio":0.45,"lockAspectRatio":false,"height":1300,"width":867},"isRSC":null},"responsiveStyles":{"large":{"display":"flex","flexDirection":"column","position":"relative","flexShrink":"0","boxSizing":"border-box","marginTop":"20px","width":"100%","minHeight":"20px","minWidth":"20px","overflow":"hidden"}}},{"@type":"@builder.io/sdk:Element","@version":2,"id":"builder-04bad5186ce24f48afb340dc0b4eb793","component":{"name":"Text","options":{"text":"

Above image with a different aspect ratio

"},"isRSC":null},"responsiveStyles":{"large":{"display":"flex","flexDirection":"column","position":"relative","flexShrink":"0","boxSizing":"border-box","marginTop":"20px","lineHeight":"normal","height":"auto"}}},{"@type":"@builder.io/sdk:Element","@version":2,"id":"builder-a9b6f533bda74155a2e9e3d59adfa721","component":{"name":"Image","options":{"image":"https://cdn.builder.io/api/v1/image/assets%2Fe084484c0e0241579f01abba29d9be10%2Fc468db4a60164469982fdbef43a2d752","backgroundSize":"cover","backgroundPosition":"center","lazy":false,"fitContent":true,"aspectRatio":0.646,"lockAspectRatio":false,"height":1214,"width":1880,"altText":"Cover Center Image"},"isRSC":null},"responsiveStyles":{"large":{"display":"flex","flexDirection":"column","position":"relative","flexShrink":"0","boxSizing":"border-box","marginTop":"20px","width":"100%","minHeight":"20px","minWidth":"20px","overflow":"hidden"}}},{"@type":"@builder.io/sdk:Element","@version":2,"id":"builder-a88cf4c703bc492fa8445c2e0079213f","component":{"name":"Text","options":{"text":"

Cover Center fill-width Image above

"},"isRSC":null},"responsiveStyles":{"large":{"display":"flex","flexDirection":"column","position":"relative","flexShrink":"0","boxSizing":"border-box","marginTop":"20px","lineHeight":"normal","height":"auto"}}},{"@type":"@builder.io/sdk:Element","@version":2,"id":"builder-c831059edecf44d99aab81acb5964583","component":{"name":"Image","options":{"image":"https://cdn.builder.io/api/v1/image/assets%2Fe084484c0e0241579f01abba29d9be10%2Fc468db4a60164469982fdbef43a2d752","backgroundSize":"contain","backgroundPosition":"center","lazy":false,"fitContent":true,"aspectRatio":0.646,"lockAspectRatio":false,"height":1214,"width":1880,"altText":"Contain Center"},"isRSC":null},"responsiveStyles":{"large":{"display":"flex","flexDirection":"column","position":"relative","flexShrink":"0","boxSizing":"border-box","marginTop":"20px","width":"100%","minHeight":"20px","minWidth":"20px","overflow":"hidden"},"small":{"marginLeft":"auto","marginRight":"auto","width":"100%","maxWidth":"289px"}}},{"@type":"@builder.io/sdk:Element","@version":2,"id":"builder-7537b0726c494205b2d8240620d89829","component":{"name":"Text","options":{"text":"

Center Contain center horizontally image

"},"isRSC":null},"responsiveStyles":{"large":{"display":"flex","flexDirection":"column","position":"relative","flexShrink":"0","boxSizing":"border-box","marginTop":"20px","lineHeight":"normal","height":"auto"}}},{"@type":"@builder.io/sdk:Element","@version":2,"tagName":"a","id":"builder-d3957a307e8c4b24b513f2c97f5ba532","properties":{"href":"https://www.google.com","target":"_blank"},"linkUrl":"https://www.google.com","component":{"name":"Image","options":{"image":"https://cdn.builder.io/api/v1/image/assets%2Fe084484c0e0241579f01abba29d9be10%2Fc468db4a60164469982fdbef43a2d752","backgroundSize":"cover","backgroundPosition":"left","lazy":false,"fitContent":true,"aspectRatio":0.646,"lockAspectRatio":false,"height":1214,"width":1880},"isRSC":null},"responsiveStyles":{"large":{"display":"flex","flexDirection":"column","position":"relative","flexShrink":"0","boxSizing":"border-box","marginTop":"20px","width":"100%","minHeight":"20px","minWidth":"20px","overflow":"hidden"},"small":{"marginRight":"auto","width":"100%","maxWidth":"289px"}}},{"@type":"@builder.io/sdk:Element","@version":2,"id":"builder-9460b0c708904962ab7466f4a4437983","component":{"name":"Text","options":{"text":"

Left aligned image with a link to g

"},"isRSC":null},"responsiveStyles":{"large":{"display":"flex","flexDirection":"column","position":"relative","flexShrink":"0","boxSizing":"border-box","marginTop":"20px","lineHeight":"normal","height":"auto"}}},{"@type":"@builder.io/sdk:Element","@version":2,"id":"builder-444ca089880c42668afb280e7bd5cfaf","component":{"name":"Image","options":{"image":"https://cdn.builder.io/api/v1/image/assets%2Fe084484c0e0241579f01abba29d9be10%2F566ee87bfbfd417d92c5f72f8dbdded4","backgroundSize":"cover","backgroundPosition":"center","lazy":false,"fitContent":true,"aspectRatio":1.499,"lockAspectRatio":false,"height":1300,"width":867},"isRSC":null},"responsiveStyles":{"large":{"display":"flex","flexDirection":"column","position":"relative","flexShrink":"0","boxSizing":"border-box","marginTop":"20px","width":"100%","minHeight":"20px","minWidth":"20px","overflow":"hidden"}}},{"@type":"@builder.io/sdk:Element","@version":2,"id":"builder-f282bb1051274364bd9d4e3cb1cdb735","component":{"name":"Text","options":{"text":"

Longer Image, different aspect ratio

"},"isRSC":null},"responsiveStyles":{"large":{"display":"flex","flexDirection":"column","position":"relative","flexShrink":"0","boxSizing":"border-box","marginTop":"20px","lineHeight":"normal","height":"auto"}}},{"id":"builder-pixel-hv5a73c1mqi","@type":"@builder.io/sdk:Element","tagName":"img","properties":{"src":"https://cdn.builder.io/api/v1/pixel?apiKey=e084484c0e0241579f01abba29d9be10","aria-hidden":"true","alt":"","role":"presentation","width":"0","height":"0"},"responsiveStyles":{"large":{"height":"0","width":"0","display":"inline-block","opacity":"0","overflow":"hidden","pointerEvents":"none"}}}],"url":"/images","state":{"deviceSize":"large","location":{"pathname":"/images","path":["images"],"query":{}}}},"variations":{},"lastUpdated":1752223665856,"firstPublished":1670399161999,"testRatio":1,"createdBy":"QYeiBq9XQFgTLKJsB0zOJLTAWOs1","lastUpdatedBy":"Fx9FxTq1Wyds3RU8GJIMOIDp25i2","folders":[],"rev":"fkvwnwcs6e"}]} \ No newline at end of file diff --git a/Tests/BuilderIOTests/Resources/laptop.png b/Tests/BuilderIOTests/Resources/laptop.png new file mode 100644 index 0000000..c1a754f Binary files /dev/null and b/Tests/BuilderIOTests/Resources/laptop.png differ diff --git a/Tests/BuilderIOTests/Resources/layout.json b/Tests/BuilderIOTests/Resources/layout.json new file mode 100644 index 0000000..cf7af54 --- /dev/null +++ b/Tests/BuilderIOTests/Resources/layout.json @@ -0,0 +1,1734 @@ +{ + "results": + [ + { + "createdDate": 1752581874375, + "id": "55dbef0a753c4c378af60624fd0e7bb1", + "name": "layout", + "modelId": "036ff29532e349df8f16f726fb33dce3", + "published": "published", + "meta": + { + "kind": "page", + "lastPreviewUrl": "http://localhost:3000?builder.space=e084484c0e0241579f01abba29d9be10&builder.user.permissions=read%2Ccreate%2Cpublish%2CeditCode%2CeditDesigns%2CeditLayouts%2CeditLayers%2CeditContentPriority%2CeditFolders%2CeditProjects%2CmodifyMcpServers%2CmodifyProjectSettings%2CconnectCodeRepository%2CcreateProjects&builder.user.role.name=Developer&builder.user.role.id=developer&builder.cachebust=true&builder.preview=page&builder.noCache=true&builder.allowTextEdit=true&__builder_editing__=true&builder.overrides.page=55dbef0a753c4c378af60624fd0e7bb1&builder.overrides.55dbef0a753c4c378af60624fd0e7bb1=55dbef0a753c4c378af60624fd0e7bb1&builder.overrides.page:/=55dbef0a753c4c378af60624fd0e7bb1&builder.options.locale=Default", + "hasLinks": true + }, + "query": + [ + { + "@type": "@builder.io/core:Query", + "property": "urlPath", + "operator": "is", + "value": "/layout" + } + ], + "data": + { + "themeId": false, + "customFonts": + [ + { + "lastModified": "2023-09-14", + "variants": + [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "family": "Montserrat", + "subsets": + [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "category": "sans-serif", + "menu": "https://fonts.gstatic.com/s/montserrat/v26/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCtr6Hw_aX8.ttf", + "kind": "webfonts#webfont", + "version": "v26", + "files": + { + "100": "https://fonts.gstatic.com/s/montserrat/v26/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCtr6Uw-Y3tcoqK5.ttf", + "200": "https://fonts.gstatic.com/s/montserrat/v26/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCvr6Ew-Y3tcoqK5.ttf", + "300": "https://fonts.gstatic.com/s/montserrat/v26/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCs16Ew-Y3tcoqK5.ttf", + "500": "https://fonts.gstatic.com/s/montserrat/v26/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCtZ6Ew-Y3tcoqK5.ttf", + "600": "https://fonts.gstatic.com/s/montserrat/v26/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCu170w-Y3tcoqK5.ttf", + "700": "https://fonts.gstatic.com/s/montserrat/v26/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCuM70w-Y3tcoqK5.ttf", + "800": "https://fonts.gstatic.com/s/montserrat/v26/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCvr70w-Y3tcoqK5.ttf", + "900": "https://fonts.gstatic.com/s/montserrat/v26/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCvC70w-Y3tcoqK5.ttf", + "600italic": "https://fonts.gstatic.com/s/montserrat/v26/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jq3p6aX9-p7K5ILg.ttf", + "900italic": "https://fonts.gstatic.com/s/montserrat/v26/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jqw16aX9-p7K5ILg.ttf", + "100italic": "https://fonts.gstatic.com/s/montserrat/v26/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jq6R8aX9-p7K5ILg.ttf", + "regular": "https://fonts.gstatic.com/s/montserrat/v26/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCtr6Ew-Y3tcoqK5.ttf", + "800italic": "https://fonts.gstatic.com/s/montserrat/v26/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jqyR6aX9-p7K5ILg.ttf", + "500italic": "https://fonts.gstatic.com/s/montserrat/v26/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jq5Z9aX9-p7K5ILg.ttf", + "italic": "https://fonts.gstatic.com/s/montserrat/v26/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jq6R9aX9-p7K5ILg.ttf", + "700italic": "https://fonts.gstatic.com/s/montserrat/v26/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jq0N6aX9-p7K5ILg.ttf", + "200italic": "https://fonts.gstatic.com/s/montserrat/v26/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jqyR9aX9-p7K5ILg.ttf", + "300italic": "https://fonts.gstatic.com/s/montserrat/v26/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jq_p9aX9-p7K5ILg.ttf" + } + } + ], + "title": "layout", + "blocks": + [ + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "id": "builder-7e7af1649508433093758dd3bff0080f", + "children": + [ + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "id": "builder-13eb017175494688961889d6bb190a47", + "meta": + { + "previousId": "builder-d2a52f951a2a4f83aa45833d884573c5" + }, + "component": + { + "name": "Text", + "options": + { + "text": "

Top Categories

" + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "20px", + "lineHeight": "normal", + "height": "auto", + "textAlign": "center" + } + } + }, + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "layerName": "Categories", + "id": "builder-adf46d10b6434ba7a13743be0ca223bb", + "meta": + { + "previousId": "builder-596855760c4048e7be3d91ad09d1a54e" + }, + "component": + { + "name": "Core:Section", + "options": + { + "maxWidth": 1440, + "lazyLoad": false + }, + "isRSC": null + }, + "children": + [ + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "id": "builder-058fbf078f6548fb9f3dff5569705228", + "children": + [ + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "layerName": "Category5", + "tagName": "a", + "id": "builder-0b6dfd790875471c82a5b20baaa34499", + "properties": + { + "href": "#" + }, + "linkUrl": "#", + "meta": + { + "previousId": "builder-5e344b82fb7f47129bf97e8bd53b99a2" + }, + "children": + [ + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "layerName": "Background Color", + "id": "builder-7f7fcf6be9614c24a055fafb4c776784", + "meta": + { + "previousId": "builder-aaf91851114541738aa7a36ad714ece7" + }, + "children": + [ + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "id": "builder-6b2de3c645c9453087d9756b74d5334d", + "meta": + { + "previousId": "builder-037938187f654e3eafecc7c74ab23aa8" + }, + "component": + { + "name": "Image", + "options": + { + "image": "https://nuevokart.com/wp-content/uploads/2022/11/groceries-packages-delivery-covid-19-quarantine-shopping-concept-courier-with-food-package-bring-goods-client-house-contactless-delivery-during-coronavirus-wear-face-mask-gloves-1024x683.jpg", + "backgroundSize": "cover", + "backgroundPosition": "center", + "lazy": false, + "fitContent": true, + "aspectRatio": 1, + "lockAspectRatio": false, + "height": 683, + "width": 1024 + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "auto", + "width": "90%", + "minHeight": "20px", + "minWidth": "20px", + "overflow": "hidden", + "borderRadius": "300px", + "height": "90%", + "flexGrow": "0", + "marginRight": "auto", + "marginLeft": "auto" + } + } + } + ], + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "0px", + "height": "180px", + "backgroundColor": "#dfe1e7", + "width": "180px", + "borderRadius": "300px", + "marginLeft": "auto", + "marginRight": "auto", + "paddingBottom": "0px" + } + } + }, + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "layerName": "Category Label", + "id": "builder-a30e4c9ef8c3464b9a1d6c85df044d64", + "meta": + { + "previousId": "builder-7c73b2ad04d845baa5c53120311d7838" + }, + "component": + { + "name": "Text", + "options": + { + "text": "Grocery" + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "20px", + "lineHeight": "normal", + "height": "auto", + "textAlign": "center", + "fontSize": "16px", + "marginLeft": "auto", + "marginRight": "auto" + } + } + } + ], + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "row", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "gap": "16px" + }, + "medium": + { + "paddingTop": "18px", + "paddingBottom": "18px", + "gap": "8px", + "marginTop": "auto", + "marginBottom": "auto" + }, + "small": + { + "display": "flex", + "flexDirection": "column", + "alignItems": "stretch" + } + } + }, + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "layerName": "Category4", + "tagName": "a", + "id": "builder-df93ad7ec4024011b1aaaad230476ada", + "properties": + { + "href": "#" + }, + "linkUrl": "#", + "meta": + { + "previousId": "builder-bf3a69a2f6574fd497924a21bbacaea4" + }, + "children": + [ + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "layerName": "Background Color", + "id": "builder-ec3b030b1dc541d8a854adb576cf24a3", + "meta": + { + "previousId": "builder-e3c67731ebce4eafa39074bf7d9e5e87" + }, + "children": + [ + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "id": "builder-60cd78c9bca944569b38abfff516efa1", + "meta": + { + "previousId": "builder-7d61213dd5464e1b8a2defca51ae054c" + }, + "component": + { + "name": "Image", + "options": + { + "image": "https://www.freepnglogos.com/uploads/furniture-png/furniture-png-transparent-furniture-images-pluspng-15.png", + "backgroundSize": "cover", + "backgroundPosition": "top", + "lazy": false, + "fitContent": true, + "aspectRatio": 1.325, + "lockAspectRatio": false, + "height": 1024, + "width": 773 + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "auto", + "width": "90%", + "minHeight": "20px", + "minWidth": "20px", + "overflow": "hidden", + "borderRadius": "300px", + "height": "90%", + "flexGrow": "0", + "marginRight": "auto", + "marginLeft": "auto" + } + } + } + ], + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "0px", + "height": "180px", + "backgroundColor": "rgba(239, 108, 65, 1)", + "width": "180px", + "borderRadius": "300px", + "marginLeft": "auto", + "marginRight": "auto", + "paddingBottom": "0px" + } + } + }, + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "layerName": "Category Label", + "id": "builder-bb0f505249bd4f8e97bbb217c5cbd551", + "meta": + { + "previousId": "builder-4cac6fd615844460a297d1776d7d7935" + }, + "component": + { + "name": "Text", + "options": + { + "text": "Furnitures" + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "20px", + "lineHeight": "normal", + "height": "auto", + "textAlign": "center", + "fontSize": "16px", + "marginLeft": "auto", + "marginRight": "auto" + } + } + } + ], + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "row", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "gap": "16px" + }, + "medium": + { + "paddingTop": "18px", + "paddingBottom": "18px", + "gap": "8px", + "marginTop": "auto", + "marginBottom": "auto" + }, + "small": + { + "display": "flex", + "flexDirection": "column", + "alignItems": "stretch" + } + } + }, + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "layerName": "Category3", + "tagName": "a", + "id": "builder-1004c920582d4e26814b16c86adb6e42", + "properties": + { + "href": "#" + }, + "linkUrl": "#", + "meta": + { + "previousId": "builder-53dd8e21aa2941a792d35fab2bc25136" + }, + "children": + [ + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "layerName": "Background Color", + "id": "builder-082cacc0b275462ea4a5c854e257c0ed", + "meta": + { + "previousId": "builder-a37b40d0dd924f30bdb93c1be0957e77" + }, + "children": + [ + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "id": "builder-5352bcdfc9e3497aa21b91e2ef2361d3", + "meta": + { + "previousId": "builder-731cbaed2446405ebb50858a8da18e49" + }, + "component": + { + "name": "Image", + "options": + { + "image": "https://pngimg.com/uploads/macbook/small/macbook_PNG65.png", + "backgroundSize": "cover", + "backgroundPosition": "top", + "lazy": false, + "fitContent": true, + "aspectRatio": 1, + "lockAspectRatio": false, + "height": 200, + "width": 200 + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "auto", + "width": "90%", + "minHeight": "20px", + "minWidth": "20px", + "overflow": "hidden", + "borderRadius": "300px", + "height": "90%", + "flexGrow": "0", + "marginRight": "auto", + "marginLeft": "auto" + } + } + } + ], + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "0px", + "height": "180px", + "backgroundColor": "rgba(0, 108, 233, 1)", + "width": "180px", + "borderRadius": "300px", + "marginLeft": "auto", + "marginRight": "auto", + "paddingBottom": "0px" + } + } + }, + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "layerName": "Category Label", + "id": "builder-aaa554a6bcce496da0c2c482e7bc9a9f", + "meta": + { + "previousId": "builder-30f8a0c0656842b4ba6dcebf744667c0" + }, + "component": + { + "name": "Text", + "options": + { + "text": "Electronics" + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "20px", + "lineHeight": "normal", + "height": "auto", + "textAlign": "center", + "fontSize": "16px", + "marginLeft": "auto", + "marginRight": "auto" + } + } + } + ], + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "row", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "gap": "16px" + }, + "medium": + { + "paddingTop": "18px", + "paddingBottom": "18px", + "gap": "8px", + "marginTop": "auto", + "marginBottom": "auto" + }, + "small": + { + "display": "flex", + "flexDirection": "column", + "alignItems": "stretch" + } + } + }, + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "layerName": "Category 2", + "tagName": "a", + "id": "builder-c1322191f3e74b09b1ca17d8596cb7c6", + "properties": + { + "href": "#" + }, + "linkUrl": "#", + "meta": + { + "previousId": "builder-22d7947a37ec46f69cf36bbb6db27da5" + }, + "children": + [ + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "layerName": "Background Color", + "id": "builder-b15b4a887f8b434c9f4c5aeb0af650c1", + "meta": + { + "previousId": "builder-5a0e4c0da69d434cbf7f7e9668aeae0e" + }, + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "0px", + "height": "180px", + "backgroundColor": "rgba(238, 177, 202, 1)", + "width": "180px", + "borderRadius": "300px", + "marginLeft": "auto", + "marginRight": "auto", + "paddingBottom": "0px" + } + } + }, + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "layerName": "Category Label", + "id": "builder-a21e568f6cd54ef9ab3f1795b9578098", + "meta": + { + "previousId": "builder-13edcaa059f44cc59eeefe2e73e4875a" + }, + "component": + { + "name": "Text", + "options": + { + "text": "Women" + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "20px", + "lineHeight": "normal", + "height": "auto", + "textAlign": "center", + "fontSize": "16px", + "marginLeft": "auto", + "marginRight": "auto" + } + } + } + ], + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "row", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "gap": "16px" + }, + "medium": + { + "paddingTop": "18px", + "paddingBottom": "18px", + "gap": "8px", + "marginTop": "auto", + "marginBottom": "auto" + }, + "small": + { + "display": "flex", + "flexDirection": "column", + "alignItems": "stretch" + } + } + }, + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "layerName": "Category1", + "tagName": "a", + "id": "builder-0153a41ce06f4848b1c976ec4453d928", + "properties": + { + "href": "#" + }, + "linkUrl": "#", + "meta": + { + "previousId": "builder-97cc24ff9e2a4f29ad8b7ade7b01f542" + }, + "children": + [ + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "layerName": "Background Color", + "id": "builder-310daeb331cc4bbca37d22106253e6b5", + "meta": + { + "previousId": "builder-b4f99306b0a146469a3842bf748e2e47" + }, + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "0px", + "height": "180px", + "backgroundColor": "rgba(247, 201, 46, 1)", + "width": "180px", + "borderRadius": "300px", + "marginLeft": "auto", + "marginRight": "auto", + "paddingBottom": "0px" + } + } + }, + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "layerName": "Category Label", + "id": "builder-b6c86cc52a034ccaa692556f497c0990", + "meta": + { + "previousId": "builder-49ae795a09474e86b41a9599240a2ba8" + }, + "component": + { + "name": "Text", + "options": + { + "text": "Home Decor" + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "20px", + "lineHeight": "normal", + "height": "auto", + "textAlign": "center", + "fontSize": "16px", + "marginLeft": "auto", + "marginRight": "auto" + } + } + } + ], + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "row", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "gap": "16px" + }, + "medium": + { + "paddingTop": "18px", + "paddingBottom": "18px", + "gap": "8px", + "marginTop": "auto", + "marginBottom": "auto" + }, + "small": + { + "display": "flex", + "flexDirection": "column", + "alignItems": "stretch" + } + } + } + ], + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "row", + "gap": "10px", + "paddingLeft": "10px", + "marginRight": "10px", + "overflow": "scroll" + } + } + } + ], + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "0px", + "paddingLeft": "12px", + "paddingRight": "12px", + "paddingTop": "12px", + "paddingBottom": "12px", + "minHeight": "100px" + } + } + }, + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "layerName": "Columns", + "id": "builder-1c2bbeec075946ae9e7e003da5f0520d", + "meta": + { + "previousId": "builder-bb97b3bdc53546e291d6d020e42acb1e" + }, + "component": + { + "name": "Columns", + "options": + { + "columns": + [ + { + "blocks": + [ + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "id": "builder-211519e03d4b44fdae7b43ac737f2860", + "children": + [ + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "id": "builder-77a8b560c42a4446a805167c66fa3f15", + "component": + { + "name": "Image", + "options": + { + "image": "https://cdn.builder.io/api/v1/image/assets%2FagZ9n5CUKRfbL9t6CaJOyVSK4Es2%2F8e096f01b00343dca3952d645f7ae024?width=998&height=1000", + "backgroundPosition": "center", + "backgroundSize": "contain", + "aspectRatio": 0.7004048582995948, + "lazy": true, + "srcset": "https://cdn.builder.io/api/v1/image/assets%2FagZ9n5CUKRfbL9t6CaJOyVSK4Es2%2F8e096f01b00343dca3952d645f7ae024?width=100&height=1000 100w, https://cdn.builder.io/api/v1/image/assets%2FagZ9n5CUKRfbL9t6CaJOyVSK4Es2%2F8e096f01b00343dca3952d645f7ae024?width=200&height=1000 200w, https://cdn.builder.io/api/v1/image/assets%2FagZ9n5CUKRfbL9t6CaJOyVSK4Es2%2F8e096f01b00343dca3952d645f7ae024?width=400&height=1000 400w, https://cdn.builder.io/api/v1/image/assets%2FagZ9n5CUKRfbL9t6CaJOyVSK4Es2%2F8e096f01b00343dca3952d645f7ae024?width=800&height=1000 800w, https://cdn.builder.io/api/v1/image/assets%2FagZ9n5CUKRfbL9t6CaJOyVSK4Es2%2F8e096f01b00343dca3952d645f7ae024?width=1200&height=1000 1200w, https://cdn.builder.io/api/v1/image/assets%2FagZ9n5CUKRfbL9t6CaJOyVSK4Es2%2F8e096f01b00343dca3952d645f7ae024?width=1600&height=1000 1600w, https://cdn.builder.io/api/v1/image/assets%2FagZ9n5CUKRfbL9t6CaJOyVSK4Es2%2F8e096f01b00343dca3952d645f7ae024?width=2000&height=1000 2000w, https://cdn.builder.io/api/v1/image/assets%2FagZ9n5CUKRfbL9t6CaJOyVSK4Es2%2F8e096f01b00343dca3952d645f7ae024?width=998&height=1000 998w, https://cdn.builder.io/api/v1/image/assets%2FagZ9n5CUKRfbL9t6CaJOyVSK4Es2%2F8e096f01b00343dca3952d645f7ae024?width=638&height=1000 638w, https://cdn.builder.io/api/v1/image/assets%2FagZ9n5CUKRfbL9t6CaJOyVSK4Es2%2F8e096f01b00343dca3952d645f7ae024?width=376&height=1000 376w", + "sizes": "(max-width: 638px) 100vw, 27vw" + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "alignItems": "stretch", + "flexShrink": "0", + "position": "relative", + "textAlign": "center", + "lineHeight": "normal", + "height": "auto" + } + } + }, + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "layerName": "Centered Box", + "id": "builder-15b6376baabb4837aeb05a88f2c9de0c", + "children": + [ + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "layerName": "Title", + "id": "builder-5645624894ff4f0f976ddaa87b00fbd2", + "component": + { + "name": "Text", + "options": + { + "text": "

Something Great to Say

" + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "alignItems": "stretch", + "flexShrink": "0", + "position": "relative", + "marginTop": "-1.65625px", + "textAlign": "center", + "lineHeight": "normal", + "height": "auto", + "fontSize": "24px" + }, + "medium": + { + "marginTop": "1.34375px", + "textAlign": "center" + }, + "small": + { + "fontSize": "25px" + } + } + }, + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "layerName": "Subtitle", + "id": "builder-41c57a6b422d436e86972a16c1255efb", + "component": + { + "name": "Text", + "options": + { + "text": "

Some more great things to elaborate on that wonderful things you have to tell your audience

" + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "alignItems": "stretch", + "flexShrink": "0", + "position": "relative", + "marginTop": "14.59375px", + "textAlign": "center", + "lineHeight": "normal", + "height": "auto", + "fontSize": "15px", + "color": "rgba(86, 86, 86, 1)" + }, + "medium": + { + "textAlign": "center" + }, + "small": + { + "fontSize": "15px" + } + } + } + ], + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "alignItems": "stretch", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "9px", + "marginBottom": "auto", + "paddingBottom": "17px", + "paddingTop": "17px" + }, + "medium": + { + "paddingBottom": "20px", + "paddingTop": "20px" + }, + "small": + { + "paddingBottom": "20px", + "paddingTop": "20px" + } + } + } + ], + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "20px", + "marginLeft": "0px", + "marginBottom": "20px", + "marginRight": "0px" + }, + "medium": + { + "marginBottom": "40px" + } + } + } + ] + }, + { + "blocks": + [ + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "id": "builder-826d3cd02784438d8a173b78fd96b549", + "children": + [ + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "id": "builder-9c41a306d7454667b2775eac28edfb05", + "component": + { + "name": "Image", + "options": + { + "image": "https://cdn.builder.io/api/v1/image/assets%2FagZ9n5CUKRfbL9t6CaJOyVSK4Es2%2F70c33c597e9946e9a79ab99ad9a999d3?width=998&height=1000", + "backgroundPosition": "center", + "backgroundSize": "contain", + "aspectRatio": 0.7004048582995948, + "lazy": true, + "srcset": "https://cdn.builder.io/api/v1/image/assets%2FagZ9n5CUKRfbL9t6CaJOyVSK4Es2%2F70c33c597e9946e9a79ab99ad9a999d3?width=100&height=1000 100w, https://cdn.builder.io/api/v1/image/assets%2FagZ9n5CUKRfbL9t6CaJOyVSK4Es2%2F70c33c597e9946e9a79ab99ad9a999d3?width=200&height=1000 200w, https://cdn.builder.io/api/v1/image/assets%2FagZ9n5CUKRfbL9t6CaJOyVSK4Es2%2F70c33c597e9946e9a79ab99ad9a999d3?width=400&height=1000 400w, https://cdn.builder.io/api/v1/image/assets%2FagZ9n5CUKRfbL9t6CaJOyVSK4Es2%2F70c33c597e9946e9a79ab99ad9a999d3?width=800&height=1000 800w, https://cdn.builder.io/api/v1/image/assets%2FagZ9n5CUKRfbL9t6CaJOyVSK4Es2%2F70c33c597e9946e9a79ab99ad9a999d3?width=1200&height=1000 1200w, https://cdn.builder.io/api/v1/image/assets%2FagZ9n5CUKRfbL9t6CaJOyVSK4Es2%2F70c33c597e9946e9a79ab99ad9a999d3?width=1600&height=1000 1600w, https://cdn.builder.io/api/v1/image/assets%2FagZ9n5CUKRfbL9t6CaJOyVSK4Es2%2F70c33c597e9946e9a79ab99ad9a999d3?width=2000&height=1000 2000w, https://cdn.builder.io/api/v1/image/assets%2FagZ9n5CUKRfbL9t6CaJOyVSK4Es2%2F70c33c597e9946e9a79ab99ad9a999d3?width=998&height=1000 998w, https://cdn.builder.io/api/v1/image/assets%2FagZ9n5CUKRfbL9t6CaJOyVSK4Es2%2F70c33c597e9946e9a79ab99ad9a999d3?width=638&height=1000 638w, https://cdn.builder.io/api/v1/image/assets%2FagZ9n5CUKRfbL9t6CaJOyVSK4Es2%2F70c33c597e9946e9a79ab99ad9a999d3?width=376&height=1000 376w", + "sizes": "(max-width: 638px) 100vw, 27vw" + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "alignItems": "stretch", + "flexShrink": "0", + "position": "relative", + "textAlign": "center", + "lineHeight": "normal", + "height": "auto" + } + } + }, + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "layerName": "Centered Box", + "id": "builder-80e74584758c43aab93e21480ee24f7f", + "children": + [ + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "layerName": "Title", + "id": "builder-bb5c72bae0e24686bda9cd0222fd3bdb", + "component": + { + "name": "Text", + "options": + { + "text": "

Something Great to Say

" + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "alignItems": "stretch", + "flexShrink": "0", + "position": "relative", + "marginTop": "-1.65625px", + "textAlign": "center", + "lineHeight": "normal", + "height": "auto", + "fontSize": "24px" + }, + "medium": + { + "marginTop": "1.34375px", + "textAlign": "center" + }, + "small": + { + "fontSize": "25px" + } + } + }, + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "layerName": "Subtitle", + "id": "builder-8707a6552ba447cfb94f58320fcd364b", + "component": + { + "name": "Text", + "options": + { + "text": "

Some more great things to elaborate on that wonderful things you have to tell your audience

" + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "alignItems": "stretch", + "flexShrink": "0", + "position": "relative", + "marginTop": "14.59375px", + "textAlign": "center", + "lineHeight": "normal", + "height": "auto", + "fontSize": "15px", + "color": "rgba(86, 86, 86, 1)" + }, + "medium": + { + "textAlign": "center" + }, + "small": + { + "fontSize": "15px" + } + } + } + ], + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "alignItems": "stretch", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "9px", + "marginBottom": "auto", + "paddingBottom": "17px", + "paddingTop": "17px" + }, + "medium": + { + "paddingBottom": "20px", + "paddingTop": "20px" + }, + "small": + { + "paddingBottom": "20px", + "paddingTop": "20px" + } + } + } + ], + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "20px", + "marginLeft": "0px", + "marginBottom": "20px", + "marginRight": "0px" + }, + "medium": + { + "marginBottom": "40px" + } + } + } + ] + } + ], + "space": 24, + "stackColumnsAt": "never", + "reverseColumnsWhenStacked": false + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "alignItems": "stretch", + "paddingLeft": "0px", + "paddingRight": "0px", + "marginTop": "12px" + } + } + } + ], + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "20px" + } + } + }, + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "id": "builder-1e394cf1056d4a109db467494246a5cb", + "meta": + { + "previousId": "builder-d4e07e8d89ad4e5090d45ad29498a005" + }, + "component": + { + "name": "Image", + "options": + { + "image": "https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F4c0ff0da35b24347bb87443f268979bd?width=2000", + "backgroundSize": "cover", + "backgroundPosition": "center", + "aspectRatio": 1, + "height": 1253, + "width": 1880, + "lazy": false, + "srcset": "https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F4c0ff0da35b24347bb87443f268979bd?width=100 100w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F4c0ff0da35b24347bb87443f268979bd?width=200 200w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F4c0ff0da35b24347bb87443f268979bd?width=400 400w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F4c0ff0da35b24347bb87443f268979bd?width=800 800w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F4c0ff0da35b24347bb87443f268979bd?width=1200 1200w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F4c0ff0da35b24347bb87443f268979bd?width=1600 1600w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F4c0ff0da35b24347bb87443f268979bd?width=2000 2000w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F4c0ff0da35b24347bb87443f268979bd?width=638 638w, https://cdn.builder.io/api/v1/image/assets%2F89d6bbb44070475d9580fd22f21ef8f1%2F4c0ff0da35b24347bb87443f268979bd?width=998 998w", + "sizes": "(max-width: 638px) 100vw, 100vw" + }, + "isRSC": null + }, + "children": + [ + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "id": "builder-50d4838eb62c44539e28fabff0a6b0ab", + "meta": + { + "previousId": "builder-97aa0bf752b7431bbb74256cff642a45" + }, + "children": + [ + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "id": "builder-dd4b4e977dd64a4c914ee5e1032f682e", + "meta": + { + "previousId": "builder-395e1f2c3b684ce097850d03b00f2cb9" + }, + "component": + { + "name": "Text", + "options": + { + "text": "

Lip Gloss

" + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "alignItems": "stretch", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "20px", + "lineHeight": "normal", + "height": "auto", + "textAlign": "center", + "color": "rgba(0, 0, 0, 1)" + } + } + }, + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "id": "builder-f2733d01f8f646f9bed617b1ea0130d8", + "meta": + { + "previousId": "builder-29ab607488c7418e8ae26f6ef761f4da" + }, + "component": + { + "name": "Text", + "options": + { + "text": "

Lorem ipsum dolor sit amet, eu duo veri legendos, te eum dolorum pertinacia.

" + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "alignItems": "stretch", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "20px", + "lineHeight": "normal", + "height": "auto", + "textAlign": "center", + "paddingLeft": "10px", + "paddingRight": "10px", + "backgroundColor": "rgba(144, 19, 254, 1)" + } + } + } + ], + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "alignItems": "stretch", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "auto", + "width": "250px", + "backgroundColor": "rgba(255, 255, 255, 1)", + "marginLeft": "auto", + "marginRight": "auto", + "paddingBottom": "30px", + "justifyContent": "space-around", + "marginBottom": "12px" + } + } + } + ], + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "alignItems": "stretch", + "minHeight": "20px", + "minWidth": "20px", + "overflow": "hidden" + } + } + }, + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "layerName": "Description", + "id": "builder-250f730147834143be4737756865c807", + "meta": + { + "figmaLayerId": "54:8937", + "previousId": "builder-c5d675d8e4c248d78e2d2aa84ceeb898" + }, + "children": + [ + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "id": "builder-c1cc3805627e49069cdacb1a604fc675", + "meta": + { + "figmaLayerId": "54:8938", + "previousId": "builder-787b93eb89ac41fe87ffecf552b982b6" + }, + "component": + { + "name": "Text", + "options": + { + "text": "Customisable Hero Layout" + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "maxWidth": "860px", + "fontSize": "48px", + "letterSpacing": "-0.5px", + "textAlign": "center", + "width": "100%", + "fontWeight": "700" + }, + "small": + { + "fontSize": "36px", + "maxWidth": "370px" + } + } + }, + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "layerName": "Describe your product value he...", + "id": "builder-ee2952a2732949eeaafd68ee1ce5cc16", + "meta": + { + "figmaLayerId": "54:8939", + "previousId": "builder-7e5ce4c96043428195960631387d4a1b" + }, + "component": + { + "name": "Text", + "options": + { + "text": "Describe your product value here. Also, customise the colors as per your brand guidelines." + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "maxWidth": "860px", + "marginTop": "8px", + "color": "rgba(195, 195, 195, 1)", + "fontSize": "24px", + "letterSpacing": "0px", + "textAlign": "center", + "fontWeight": "300" + }, + "medium": + { + "fontSize": "16px", + "maxWidth": "370px" + } + } + }, + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "layerName": "Call to actions", + "id": "builder-2d0335c594fb4916a3ca3c4719017d09", + "meta": + { + "previousId": "builder-2d7eee2d4c164e2e8baff930b31a0e28" + }, + "children": + [ + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "layerName": "CTA 1", + "id": "builder-09b3afb804ac4909a778ab1cc305c4bc", + "meta": + { + "previousId": "builder-fdd2e3d549444363b097c0f9572a9af6" + }, + "component": + { + "name": "Core:Button", + "options": + { + "text": "Click me!", + "openLinkInNewTab": false + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "20px", + "paddingTop": "15px", + "paddingBottom": "15px", + "paddingLeft": "25px", + "paddingRight": "25px", + "backgroundColor": "rgba(74, 144, 226, 1)", + "borderRadius": "4px", + "textAlign": "center", + "cursor": "pointer" + } + } + }, + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "layerName": "CTA 2", + "id": "builder-264515c082c84f68a11d79387076a499", + "meta": + { + "previousId": "builder-185fd7b54d3d478890f2579926d8fc8f" + }, + "component": + { + "name": "Core:Button", + "options": + { + "text": "Click me!", + "openLinkInNewTab": false + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "20px", + "paddingTop": "15px", + "paddingBottom": "15px", + "paddingLeft": "25px", + "paddingRight": "25px", + "color": "rgba(255, 255, 255, 1)", + "borderRadius": "4px", + "textAlign": "center", + "cursor": "pointer", + "borderStyle": "solid", + "borderWidth": "1px", + "borderColor": "rgba(80, 227, 194, 1)", + "backgroundColor": "rgba(80, 227, 194, 1)" + }, + "medium": + { + "paddingBottom": "8px" + } + } + } + ], + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "row", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "gap": "16px", + "width": "auto", + "marginLeft": "auto", + "marginRight": "auto", + "alignSelf": "center" + } + } + } + ], + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "justifyContent": "flex-start", + "alignItems": "flex-start", + "marginLeft": "auto", + "marginRight": "auto", + "marginTop": "36px", + "marginBottom": "36px" + } + } + }, + { + "id": "builder-pixel-uhjs9hgdxf9", + "@type": "@builder.io/sdk:Element", + "tagName": "img", + "properties": + { + "src": "https://cdn.builder.io/api/v1/pixel?apiKey=e084484c0e0241579f01abba29d9be10", + "aria-hidden": "true", + "alt": "", + "role": "presentation", + "width": "0", + "height": "0" + }, + "responsiveStyles": + { + "large": + { + "height": "0", + "width": "0", + "display": "inline-block", + "opacity": "0", + "overflow": "hidden", + "pointerEvents": "none" + } + } + } + ], + "url": "/layout", + "state": + { + "deviceSize": "large", + "location": + { + "pathname": "/layout", + "path": + [ + "layout" + ], + "query": + {} + } + } + }, + "variations": + {}, + "lastUpdated": 1752657812589, + "firstPublished": 1752593045218, + "testRatio": 1, + "screenshot": "https://cdn.builder.io/api/v1/image/assets%2Fe084484c0e0241579f01abba29d9be10%2Fb1bd762e9e264476a6dbad09c3b2c2d8", + "createdBy": "Fx9FxTq1Wyds3RU8GJIMOIDp25i2", + "lastUpdatedBy": "Fx9FxTq1Wyds3RU8GJIMOIDp25i2", + "folders": + [], + "rev": "51v7aa7g8tj" + } + ] +} \ No newline at end of file diff --git a/Tests/BuilderIOTests/Resources/text.json b/Tests/BuilderIOTests/Resources/text.json new file mode 100644 index 0000000..2dabf4f --- /dev/null +++ b/Tests/BuilderIOTests/Resources/text.json @@ -0,0 +1,858 @@ +{ + "results": + [ + { + "createdDate": 1669990626614, + "id": "8e2aae7a28904de6b5bdd9b84bcabe98", + "name": "text without html ", + "modelId": "036ff29532e349df8f16f726fb33dce3", + "published": "published", + "meta": + { + "kind": "page", + "hasLinks": true, + "lastPreviewUrl": "http://localhost:3000?builder.space=e084484c0e0241579f01abba29d9be10&builder.user.permissions=read%2Ccreate%2Cpublish%2CeditCode%2CeditDesigns%2CeditLayouts%2CeditLayers%2CeditContentPriority%2CeditFolders%2CeditProjects%2CmodifyMcpServers%2CmodifyProjectSettings%2CconnectCodeRepository%2CcreateProjects&builder.user.role.name=Developer&builder.user.role.id=developer&builder.cachebust=true&builder.preview=page&builder.noCache=true&builder.allowTextEdit=true&__builder_editing__=true&builder.overrides.page=8e2aae7a28904de6b5bdd9b84bcabe98&builder.overrides.8e2aae7a28904de6b5bdd9b84bcabe98=8e2aae7a28904de6b5bdd9b84bcabe98&builder.overrides.page:/=8e2aae7a28904de6b5bdd9b84bcabe98&builder.options.locale=Default", + "originalContentId": "ec2631727d344986a6a72d53b68d17dd", + "winningTest": null + }, + "query": + [ + { + "@type": "@builder.io/core:Query", + "property": "urlPath", + "operator": "is", + "value": "/text" + } + ], + "data": + { + "themeId": false, + "title": "text", + "customFonts": + [ + { + "category": "sans-serif", + "family": "Raleway", + "files": + { + "100": "https://fonts.gstatic.com/s/raleway/v29/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvao4CPNLA3JC9c.ttf", + "200": "https://fonts.gstatic.com/s/raleway/v29/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVtaooCPNLA3JC9c.ttf", + "300": "https://fonts.gstatic.com/s/raleway/v29/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVuEooCPNLA3JC9c.ttf", + "500": "https://fonts.gstatic.com/s/raleway/v29/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvoooCPNLA3JC9c.ttf", + "600": "https://fonts.gstatic.com/s/raleway/v29/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVsEpYCPNLA3JC9c.ttf", + "700": "https://fonts.gstatic.com/s/raleway/v29/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVs9pYCPNLA3JC9c.ttf", + "800": "https://fonts.gstatic.com/s/raleway/v29/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVtapYCPNLA3JC9c.ttf", + "900": "https://fonts.gstatic.com/s/raleway/v29/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVtzpYCPNLA3JC9c.ttf", + "100italic": "https://fonts.gstatic.com/s/raleway/v29/1Pt_g8zYS_SKggPNyCgSQamb1W0lwk4S4WjNPrQVIT9c2c8.ttf", + "200italic": "https://fonts.gstatic.com/s/raleway/v29/1Pt_g8zYS_SKggPNyCgSQamb1W0lwk4S4ejMPrQVIT9c2c8.ttf", + "300italic": "https://fonts.gstatic.com/s/raleway/v29/1Pt_g8zYS_SKggPNyCgSQamb1W0lwk4S4TbMPrQVIT9c2c8.ttf", + "500italic": "https://fonts.gstatic.com/s/raleway/v29/1Pt_g8zYS_SKggPNyCgSQamb1W0lwk4S4VrMPrQVIT9c2c8.ttf", + "600italic": "https://fonts.gstatic.com/s/raleway/v29/1Pt_g8zYS_SKggPNyCgSQamb1W0lwk4S4bbLPrQVIT9c2c8.ttf", + "700italic": "https://fonts.gstatic.com/s/raleway/v29/1Pt_g8zYS_SKggPNyCgSQamb1W0lwk4S4Y_LPrQVIT9c2c8.ttf", + "800italic": "https://fonts.gstatic.com/s/raleway/v29/1Pt_g8zYS_SKggPNyCgSQamb1W0lwk4S4ejLPrQVIT9c2c8.ttf", + "900italic": "https://fonts.gstatic.com/s/raleway/v29/1Pt_g8zYS_SKggPNyCgSQamb1W0lwk4S4cHLPrQVIT9c2c8.ttf", + "italic": "https://fonts.gstatic.com/s/raleway/v29/1Pt_g8zYS_SKggPNyCgSQamb1W0lwk4S4WjMPrQVIT9c2c8.ttf", + "regular": "https://fonts.gstatic.com/s/raleway/v29/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaooCPNLA3JC9c.ttf" + }, + "kind": "webfonts#webfont", + "lastModified": "2023-09-14", + "menu": "https://fonts.gstatic.com/s/raleway/v29/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCOPrQ.ttf", + "subsets": + [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "variants": + [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "version": "v29" + }, + { + "category": "sans-serif", + "family": "DM Sans", + "files": + { + "100": "https://fonts.gstatic.com/s/dmsans/v14/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAop1hTmf3ZGMZpg.ttf", + "200": "https://fonts.gstatic.com/s/dmsans/v14/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAIpxhTmf3ZGMZpg.ttf", + "300": "https://fonts.gstatic.com/s/dmsans/v14/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwA_JxhTmf3ZGMZpg.ttf", + "500": "https://fonts.gstatic.com/s/dmsans/v14/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAkJxhTmf3ZGMZpg.ttf", + "600": "https://fonts.gstatic.com/s/dmsans/v14/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAfJthTmf3ZGMZpg.ttf", + "700": "https://fonts.gstatic.com/s/dmsans/v14/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwARZthTmf3ZGMZpg.ttf", + "800": "https://fonts.gstatic.com/s/dmsans/v14/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAIpthTmf3ZGMZpg.ttf", + "900": "https://fonts.gstatic.com/s/dmsans/v14/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAC5thTmf3ZGMZpg.ttf", + "100italic": "https://fonts.gstatic.com/s/dmsans/v14/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat-JDG3zRmYJpso5.ttf", + "200italic": "https://fonts.gstatic.com/s/dmsans/v14/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat8JDW3zRmYJpso5.ttf", + "300italic": "https://fonts.gstatic.com/s/dmsans/v14/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat_XDW3zRmYJpso5.ttf", + "500italic": "https://fonts.gstatic.com/s/dmsans/v14/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat-7DW3zRmYJpso5.ttf", + "600italic": "https://fonts.gstatic.com/s/dmsans/v14/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat9XCm3zRmYJpso5.ttf", + "700italic": "https://fonts.gstatic.com/s/dmsans/v14/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat9uCm3zRmYJpso5.ttf", + "800italic": "https://fonts.gstatic.com/s/dmsans/v14/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat8JCm3zRmYJpso5.ttf", + "900italic": "https://fonts.gstatic.com/s/dmsans/v14/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat8gCm3zRmYJpso5.ttf", + "italic": "https://fonts.gstatic.com/s/dmsans/v14/rP2rp2ywxg089UriCZaSExd86J3t9jz86Mvy4qCRAL19DksVat-JDW3zRmYJpso5.ttf", + "regular": "https://fonts.gstatic.com/s/dmsans/v14/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAopxhTmf3ZGMZpg.ttf" + }, + "kind": "webfonts#webfont", + "lastModified": "2023-07-13", + "menu": "https://fonts.gstatic.com/s/dmsans/v14/rP2tp2ywxg089UriI5-g4vlH9VoD8CmcqZG40F9JadbnoEwAopxRT23z.ttf", + "subsets": + [ + "latin", + "latin-ext" + ], + "variants": + [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "version": "v14" + }, + { + "category": "sans-serif", + "family": "Lato", + "files": + { + "100": "https://fonts.gstatic.com/s/lato/v24/S6u8w4BMUTPHh30wWyWrFCbw7A.ttf", + "300": "https://fonts.gstatic.com/s/lato/v24/S6u9w4BMUTPHh7USew-FGC_p9dw.ttf", + "700": "https://fonts.gstatic.com/s/lato/v24/S6u9w4BMUTPHh6UVew-FGC_p9dw.ttf", + "900": "https://fonts.gstatic.com/s/lato/v24/S6u9w4BMUTPHh50Xew-FGC_p9dw.ttf", + "100italic": "https://fonts.gstatic.com/s/lato/v24/S6u-w4BMUTPHjxsIPy-vNiPg7MU0.ttf", + "300italic": "https://fonts.gstatic.com/s/lato/v24/S6u_w4BMUTPHjxsI9w2PHA3s5dwt7w.ttf", + "700italic": "https://fonts.gstatic.com/s/lato/v24/S6u_w4BMUTPHjxsI5wqPHA3s5dwt7w.ttf", + "900italic": "https://fonts.gstatic.com/s/lato/v24/S6u_w4BMUTPHjxsI3wiPHA3s5dwt7w.ttf", + "italic": "https://fonts.gstatic.com/s/lato/v24/S6u8w4BMUTPHjxswWyWrFCbw7A.ttf", + "regular": "https://fonts.gstatic.com/s/lato/v24/S6uyw4BMUTPHvxk6XweuBCY.ttf" + }, + "kind": "webfonts#webfont", + "lastModified": "2023-05-02", + "menu": "https://fonts.gstatic.com/s/lato/v24/S6uyw4BMUTPHjxgwWw.ttf", + "subsets": + [ + "latin", + "latin-ext" + ], + "variants": + [ + "100", + "100italic", + "300", + "300italic", + "regular", + "italic", + "700", + "700italic", + "900", + "900italic" + ], + "version": "v24" + }, + { + "category": "monospace", + "family": "Source Code Pro", + "files": + { + "200": "https://fonts.gstatic.com/s/sourcecodepro/v23/HI_diYsKILxRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DEyQhM5hTXUcdJg.ttf", + "300": "https://fonts.gstatic.com/s/sourcecodepro/v23/HI_diYsKILxRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DJKQhM5hTXUcdJg.ttf", + "500": "https://fonts.gstatic.com/s/sourcecodepro/v23/HI_diYsKILxRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DP6QhM5hTXUcdJg.ttf", + "600": "https://fonts.gstatic.com/s/sourcecodepro/v23/HI_diYsKILxRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DBKXhM5hTXUcdJg.ttf", + "700": "https://fonts.gstatic.com/s/sourcecodepro/v23/HI_diYsKILxRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DCuXhM5hTXUcdJg.ttf", + "800": "https://fonts.gstatic.com/s/sourcecodepro/v23/HI_diYsKILxRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DEyXhM5hTXUcdJg.ttf", + "900": "https://fonts.gstatic.com/s/sourcecodepro/v23/HI_diYsKILxRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DGWXhM5hTXUcdJg.ttf", + "200italic": "https://fonts.gstatic.com/s/sourcecodepro/v23/HI_jiYsKILxRpg3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTT7I1rSVcZZJiGpw.ttf", + "300italic": "https://fonts.gstatic.com/s/sourcecodepro/v23/HI_jiYsKILxRpg3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTTMo1rSVcZZJiGpw.ttf", + "500italic": "https://fonts.gstatic.com/s/sourcecodepro/v23/HI_jiYsKILxRpg3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTTXo1rSVcZZJiGpw.ttf", + "600italic": "https://fonts.gstatic.com/s/sourcecodepro/v23/HI_jiYsKILxRpg3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTTsoprSVcZZJiGpw.ttf", + "700italic": "https://fonts.gstatic.com/s/sourcecodepro/v23/HI_jiYsKILxRpg3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTTi4prSVcZZJiGpw.ttf", + "800italic": "https://fonts.gstatic.com/s/sourcecodepro/v23/HI_jiYsKILxRpg3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTT7IprSVcZZJiGpw.ttf", + "900italic": "https://fonts.gstatic.com/s/sourcecodepro/v23/HI_jiYsKILxRpg3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTTxYprSVcZZJiGpw.ttf", + "italic": "https://fonts.gstatic.com/s/sourcecodepro/v23/HI_jiYsKILxRpg3hIP6sJ7fM7PqlOPHYvDP_W9O7GQTTbI1rSVcZZJiGpw.ttf", + "regular": "https://fonts.gstatic.com/s/sourcecodepro/v23/HI_diYsKILxRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DMyQhM5hTXUcdJg.ttf" + }, + "kind": "webfonts#webfont", + "lastModified": "2023-09-14", + "menu": "https://fonts.gstatic.com/s/sourcecodepro/v23/HI_diYsKILxRpg3hIP6sJ7fM7PqPMcMnZFqUwX28DMyQtM9rSQ.ttf", + "subsets": + [ + "cyrillic", + "cyrillic-ext", + "greek", + "greek-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "variants": + [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "version": "v23" + }, + { + "category": "sans-serif", + "family": "Nunito", + "files": + { + "200": "https://fonts.gstatic.com/s/nunito/v26/XRXI3I6Li01BKofiOc5wtlZ2di8HDDshRTM9jo7eTWk.ttf", + "300": "https://fonts.gstatic.com/s/nunito/v26/XRXI3I6Li01BKofiOc5wtlZ2di8HDOUhRTM9jo7eTWk.ttf", + "500": "https://fonts.gstatic.com/s/nunito/v26/XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhRTM9jo7eTWk.ttf", + "600": "https://fonts.gstatic.com/s/nunito/v26/XRXI3I6Li01BKofiOc5wtlZ2di8HDGUmRTM9jo7eTWk.ttf", + "700": "https://fonts.gstatic.com/s/nunito/v26/XRXI3I6Li01BKofiOc5wtlZ2di8HDFwmRTM9jo7eTWk.ttf", + "800": "https://fonts.gstatic.com/s/nunito/v26/XRXI3I6Li01BKofiOc5wtlZ2di8HDDsmRTM9jo7eTWk.ttf", + "900": "https://fonts.gstatic.com/s/nunito/v26/XRXI3I6Li01BKofiOc5wtlZ2di8HDBImRTM9jo7eTWk.ttf", + "200italic": "https://fonts.gstatic.com/s/nunito/v26/XRXK3I6Li01BKofIMPyPbj8d7IEAGXNiLXA3iqzbXWnoeg.ttf", + "300italic": "https://fonts.gstatic.com/s/nunito/v26/XRXK3I6Li01BKofIMPyPbj8d7IEAGXNi83A3iqzbXWnoeg.ttf", + "500italic": "https://fonts.gstatic.com/s/nunito/v26/XRXK3I6Li01BKofIMPyPbj8d7IEAGXNin3A3iqzbXWnoeg.ttf", + "600italic": "https://fonts.gstatic.com/s/nunito/v26/XRXK3I6Li01BKofIMPyPbj8d7IEAGXNic3c3iqzbXWnoeg.ttf", + "700italic": "https://fonts.gstatic.com/s/nunito/v26/XRXK3I6Li01BKofIMPyPbj8d7IEAGXNiSnc3iqzbXWnoeg.ttf", + "800italic": "https://fonts.gstatic.com/s/nunito/v26/XRXK3I6Li01BKofIMPyPbj8d7IEAGXNiLXc3iqzbXWnoeg.ttf", + "900italic": "https://fonts.gstatic.com/s/nunito/v26/XRXK3I6Li01BKofIMPyPbj8d7IEAGXNiBHc3iqzbXWnoeg.ttf", + "italic": "https://fonts.gstatic.com/s/nunito/v26/XRXK3I6Li01BKofIMPyPbj8d7IEAGXNirXA3iqzbXWnoeg.ttf", + "regular": "https://fonts.gstatic.com/s/nunito/v26/XRXI3I6Li01BKofiOc5wtlZ2di8HDLshRTM9jo7eTWk.ttf" + }, + "kind": "webfonts#webfont", + "lastModified": "2023-09-14", + "menu": "https://fonts.gstatic.com/s/nunito/v26/XRXI3I6Li01BKofiOc5wtlZ2di8HDLshdTI3ig.ttf", + "subsets": + [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "variants": + [ + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "version": "v26" + }, + { + "category": "sans-serif", + "family": "Aldrich", + "files": + { + "regular": "https://fonts.gstatic.com/s/aldrich/v21/MCoTzAn-1s3IGyJMZaAS3pP5H_E.ttf" + }, + "kind": "webfonts#webfont", + "lastModified": "2023-08-25", + "menu": "https://fonts.gstatic.com/s/aldrich/v21/MCoTzAn-1s3IGyJMVaEY2g.ttf", + "subsets": + [ + "latin" + ], + "variants": + [ + "regular" + ], + "version": "v21" + }, + { + "category": "sans-serif", + "family": "Montserrat", + "files": + { + "100": "https://fonts.gstatic.com/s/montserrat/v26/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCtr6Uw-Y3tcoqK5.ttf", + "200": "https://fonts.gstatic.com/s/montserrat/v26/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCvr6Ew-Y3tcoqK5.ttf", + "300": "https://fonts.gstatic.com/s/montserrat/v26/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCs16Ew-Y3tcoqK5.ttf", + "500": "https://fonts.gstatic.com/s/montserrat/v26/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCtZ6Ew-Y3tcoqK5.ttf", + "600": "https://fonts.gstatic.com/s/montserrat/v26/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCu170w-Y3tcoqK5.ttf", + "700": "https://fonts.gstatic.com/s/montserrat/v26/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCuM70w-Y3tcoqK5.ttf", + "800": "https://fonts.gstatic.com/s/montserrat/v26/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCvr70w-Y3tcoqK5.ttf", + "900": "https://fonts.gstatic.com/s/montserrat/v26/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCvC70w-Y3tcoqK5.ttf", + "100italic": "https://fonts.gstatic.com/s/montserrat/v26/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jq6R8aX9-p7K5ILg.ttf", + "200italic": "https://fonts.gstatic.com/s/montserrat/v26/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jqyR9aX9-p7K5ILg.ttf", + "300italic": "https://fonts.gstatic.com/s/montserrat/v26/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jq_p9aX9-p7K5ILg.ttf", + "500italic": "https://fonts.gstatic.com/s/montserrat/v26/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jq5Z9aX9-p7K5ILg.ttf", + "600italic": "https://fonts.gstatic.com/s/montserrat/v26/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jq3p6aX9-p7K5ILg.ttf", + "700italic": "https://fonts.gstatic.com/s/montserrat/v26/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jq0N6aX9-p7K5ILg.ttf", + "800italic": "https://fonts.gstatic.com/s/montserrat/v26/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jqyR6aX9-p7K5ILg.ttf", + "900italic": "https://fonts.gstatic.com/s/montserrat/v26/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jqw16aX9-p7K5ILg.ttf", + "italic": "https://fonts.gstatic.com/s/montserrat/v26/JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jq6R9aX9-p7K5ILg.ttf", + "regular": "https://fonts.gstatic.com/s/montserrat/v26/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCtr6Ew-Y3tcoqK5.ttf" + }, + "kind": "webfonts#webfont", + "lastModified": "2023-09-14", + "menu": "https://fonts.gstatic.com/s/montserrat/v26/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCtr6Hw_aX8.ttf", + "subsets": + [ + "cyrillic", + "cyrillic-ext", + "latin", + "latin-ext", + "vietnamese" + ], + "variants": + [ + "100", + "200", + "300", + "regular", + "500", + "600", + "700", + "800", + "900", + "100italic", + "200italic", + "300italic", + "italic", + "500italic", + "600italic", + "700italic", + "800italic", + "900italic" + ], + "version": "v26" + } + ], + "blocks": + [ + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "id": "builder-b9dcbf73806f4d44b0417af731d60d99", + "meta": + { + "previousId": "builder-4e3e54937f1d4834b8b97e5af023412a" + }, + "component": + { + "name": "Text", + "options": + { + "text": "

H1 Fill width

" + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "20px", + "lineHeight": "normal", + "height": "auto", + "fontSize": "32px", + "fontWeight": "600", + "fontFamily": "Raleway, sans-serif" + } + } + }, + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "id": "builder-119c6e6d8a944db994ebcc94d3180d9a", + "meta": + { + "previousId": "builder-12e92e0f0fc74418ad65653adb472d0f" + }, + "component": + { + "name": "Text", + "options": + { + "text": "

H2 Center

" + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "20px", + "lineHeight": "normal", + "height": "auto", + "marginLeft": "auto", + "marginRight": "auto", + "fontSize": "24px", + "fontWeight": "600", + "fontFamily": "DM Sans, sans-serif" + } + } + }, + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "id": "builder-afd68d61520f4a0c9549d703b83a944e", + "meta": + { + "previousId": "builder-466e88f164464e1b8e53bb78d652f62c" + }, + "component": + { + "name": "Text", + "options": + { + "text": "
H6 Right
" + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "20px", + "lineHeight": "normal", + "height": "auto", + "marginLeft": "auto", + "fontSize": "11px" + } + } + }, + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "id": "builder-fa6ad4c170ad40af832d2461cd17f684", + "meta": + { + "previousId": "builder-fb39da098187488098724d7a540538ab" + }, + "component": + { + "name": "Text", + "options": + { + "text": "

Some red text left aligned

" + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "20px", + "lineHeight": "normal", + "height": "auto", + "color": "rgba(208, 2, 27, 1)", + "marginRight": "auto" + } + } + }, + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "id": "builder-77a9b0ef9ed5493a9720f3b40f7e3a84", + "meta": + { + "previousId": "builder-11b42b565e45431796dfafa4867fe394" + }, + "component": + { + "name": "Text", + "options": + { + "text": "

Some white text on a black background

" + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "20px", + "lineHeight": "normal", + "height": "auto", + "backgroundColor": "rgba(0, 0, 0, 1)", + "color": "rgba(255, 255, 255, 1)", + "fontFamily": "Lato, sans-serif", + "fontSize": "24px" + }, + "small": + { + "color": "rgba(255, 255, 255, 1)" + } + } + }, + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "id": "builder-482b376b6c764b6d9d5054e33dacca43", + "meta": + { + "previousId": "builder-733b2c11821743fba31b237a9e8c94ef" + }, + "component": + { + "name": "Text", + "options": + { + "text": "

Some custom font of size 24px

" + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "20px", + "lineHeight": "normal", + "height": "auto", + "fontSize": "24px", + "fontFamily": "Source Code Pro, monospace" + } + } + }, + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "tagName": "a", + "id": "builder-3450396755464b1c9a3501ab418118ca", + "properties": + { + "href": "http://www.google.com" + }, + "linkUrl": "http://www.google.com", + "meta": + { + "previousId": "builder-67f7eac89f384896b4e740bfdbcef454" + }, + "component": + { + "name": "Text", + "options": + { + "text": "

This whole block is clickable

" + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "20px", + "lineHeight": "normal", + "height": "auto", + "fontFamily": "Courier New, monospace" + } + } + }, + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "layerName": "Describe your product value he...", + "id": "builder-69f1ca8ab8b04e209d7542d845bf3398", + "meta": + { + "figmaLayerId": "54:8939", + "previousId": "builder-ee2952a2732949eeaafd68ee1ce5cc16" + }, + "component": + { + "name": "Text", + "options": + { + "text": "Fonts are the visual representation of text, playing a crucial role in both readability and aesthetic appeal. They come in a variety of styles, such as serif, sans-serif, script, and monospace, each conveying a different tone or personality. Serif fonts like Times New Roman are often seen as traditional and formal." + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "maxWidth": "860px", + "marginTop": "8px", + "fontSize": "35px", + "letterSpacing": "0px", + "textAlign": "center", + "fontWeight": "300", + "marginLeft": "auto", + "marginRight": "auto", + "fontFamily": "Lato, sans-serif" + }, + "medium": + { + "fontSize": "24px", + "maxWidth": "370px" + } + } + }, + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "id": "builder-261ce352437a4f00a794dea204bce23b", + "meta": + { + "previousId": "builder-e8da4929479a4abf9cd8e3959a1e6699" + }, + "component": + { + "name": "Text", + "options": + { + "text": "

Left Align Text

" + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "20px", + "lineHeight": "normal", + "height": "auto", + "marginRight": "auto", + "paddingLeft": "20px", + "paddingRight": "20px", + "color": "rgba(221, 23, 23, 1)", + "fontFamily": "Nunito, sans-serif" + }, + "small": + { + "backgroundColor": "rgba(144, 19, 254, 1)", + "fontSize": "12px" + } + } + }, + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "id": "builder-54d67576377d4a9293c6f8d2efcda0ef", + "meta": + { + "previousId": "builder-ad756879bc6c4ee3ac7977d5af0b6811" + }, + "component": + { + "name": "Text", + "options": + { + "text": "

Right Align Text

" + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "display": "flex", + "flexDirection": "column", + "position": "relative", + "flexShrink": "0", + "boxSizing": "border-box", + "marginTop": "20px", + "lineHeight": "normal", + "height": "auto", + "marginLeft": "auto", + "paddingLeft": "20px", + "marginRight": "20px" + }, + "medium": + { + "display": "none" + }, + "small": + { + "borderWidth": "2px", + "borderStyle": "solid", + "borderColor": "rgba(219, 20, 20, 1)", + "backgroundColor": "rgba(80, 227, 194, 1)", + "backgroundRepeat": "no-repeat", + "backgroundPosition": "center", + "backgroundSize": "cover", + "display": "flex", + "fontSize": "14px", + "fontWeight": "600", + "fontFamily": "Aldrich, sans-serif" + } + } + }, + { + "@type": "@builder.io/sdk:Element", + "@version": 2, + "layerName": "Describe your product value he...", + "id": "builder-3f806eb007af4592a53f57ebb18f4169", + "meta": + { + "figmaLayerId": "54:8939", + "previousId": "builder-440e8183265f4bd6861b845b799b7a9f" + }, + "component": + { + "name": "Text", + "options": + { + "text": "Fonts are the visual representation of text, playing a crucial role in both readability and aesthetic appeal. They come in a variety of styles, such as serif, sans-serif, script, and monospace, each conveying a different tone or personality. Serif fonts like Times New Roman are often seen as traditional and formal." + }, + "isRSC": null + }, + "responsiveStyles": + { + "large": + { + "maxWidth": "860px", + "marginTop": "8px", + "fontSize": "35px", + "letterSpacing": "0px", + "textAlign": "left", + "fontWeight": "300", + "fontFamily": "Montserrat, sans-serif" + }, + "medium": + { + "fontSize": "24px", + "maxWidth": "370px" + } + } + }, + { + "id": "builder-pixel-6mp7omjjyfl", + "@type": "@builder.io/sdk:Element", + "tagName": "img", + "properties": + { + "src": "https://cdn.builder.io/api/v1/pixel?apiKey=e084484c0e0241579f01abba29d9be10", + "aria-hidden": "true", + "alt": "", + "role": "presentation", + "width": "0", + "height": "0" + }, + "responsiveStyles": + { + "large": + { + "height": "0", + "width": "0", + "display": "inline-block", + "opacity": "0", + "overflow": "hidden", + "pointerEvents": "none" + } + } + } + ], + "url": "/text", + "state": + { + "deviceSize": "large", + "location": + { + "pathname": "/text", + "path": + [ + "text" + ], + "query": + {} + } + } + }, + "variations": + {}, + "lastUpdated": 1752755335205, + "firstPublished": 1667368417884, + "testRatio": 1, + "screenshot": "https://cdn.builder.io/api/v1/image/assets%2Fe084484c0e0241579f01abba29d9be10%2F990ed8386473436187215d616a9f4fcc", + "createdBy": "QYeiBq9XQFgTLKJsB0zOJLTAWOs1", + "lastUpdatedBy": "Fx9FxTq1Wyds3RU8GJIMOIDp25i2", + "folders": + [], + "rev": "a3sml3sucac" + } + ] +} \ No newline at end of file diff --git a/Tests/BuilderIOTests/__Snapshots__/BuilderIOPageViewTests/testLayoutsView.1.png b/Tests/BuilderIOTests/__Snapshots__/BuilderIOPageViewTests/testLayoutsView.1.png new file mode 100644 index 0000000..965f881 Binary files /dev/null and b/Tests/BuilderIOTests/__Snapshots__/BuilderIOPageViewTests/testLayoutsView.1.png differ diff --git a/Tests/BuilderIOTests/__Snapshots__/BuilderIOPageViewTests/testTextView.1.png b/Tests/BuilderIOTests/__Snapshots__/BuilderIOPageViewTests/testTextView.1.png new file mode 100644 index 0000000..806a3de Binary files /dev/null and b/Tests/BuilderIOTests/__Snapshots__/BuilderIOPageViewTests/testTextView.1.png differ diff --git a/format.sh b/format.sh index bb1a795..8dfde0d 100644 --- a/format.sh +++ b/format.sh @@ -1 +1 @@ -swift-format format --in-place --recursive Sources \ No newline at end of file +swift-format format --in-place --recursive Sources Tests