├── .github ├── ISSUE_TEMPLATE │ ├── bug-report.md │ └── task.md ├── pull_request_template.md └── workflows │ ├── auto-assignee.yml │ ├── build-bump-versions.yml │ ├── build.yml │ ├── check-pr-title.yml │ ├── lint.yml │ └── workflow-cleanup.yml ├── .gitignore ├── .pre-commit-config.yaml ├── .swiftlint.yml ├── .swiftpm └── xcode │ └── package.xcworkspace │ └── xcshareddata │ ├── IDETemplateMacros.plist │ └── IDEWorkspaceChecks.plist ├── CODEOWNERS ├── Configuration └── Version.xcconfig ├── LICENSE ├── Package.resolved ├── Package.swift ├── README.md ├── Scripts └── new-developer.sh ├── Sources └── CurtainRaiser │ ├── CurtainRaiser.docc │ ├── CurtainRaiser.md │ ├── Resources │ │ ├── Chapter1 │ │ │ ├── Chapter1_01.png │ │ │ ├── Chapter1_02.png │ │ │ ├── Chapter1_03.swift │ │ │ ├── Chapter1_04.swift │ │ │ ├── Chapter1_Background.png │ │ │ └── Chapter1_TOC.png │ │ ├── Chapter2 │ │ │ ├── Chapter2_01.png │ │ │ ├── Chapter2_01.swift │ │ │ ├── Chapter2_02.swift │ │ │ ├── Chapter2_03.png │ │ │ ├── Chapter2_03.swift │ │ │ ├── Chapter2_04.swift │ │ │ ├── Chapter2_05.swift │ │ │ ├── Chapter2_06.swift │ │ │ ├── Chapter2_07.swift │ │ │ ├── Chapter2_08.png │ │ │ ├── Chapter2_08.swift │ │ │ ├── Chapter2_09.png │ │ │ ├── Chapter2_09.swift │ │ │ ├── Chapter2_10.png │ │ │ ├── Chapter2_10.swift │ │ │ ├── Chapter2_Background.png │ │ │ └── Chapter2_TOC.png │ │ └── Images │ │ │ └── projection-card@2x.png │ ├── Tutorial Table of Contents.tutorial │ └── Tutorials │ │ ├── Adding Curtain Raiser to your project.tutorial │ │ └── Getting Started with Curtain Raiser.tutorial │ ├── CurtainRaiser.swift │ ├── Examples │ ├── AnimatingCircle.swift │ ├── Controls │ │ ├── ControlViewModel.swift │ │ └── ControlsView.swift │ ├── ExampleGestureView.swift │ └── ExampleView.swift │ ├── Extensions │ └── Comparable+.swift │ ├── Resources │ └── en.lproj │ │ └── Localizable.strings │ └── Shaders │ ├── LayerShader.metal │ └── Shared.metal ├── Tests └── CurtainRaiserTests │ └── CurtainRaiserTests.swift └── docs ├── css ├── chunk-c0335d80.10a2f091.css ├── documentation-topic.39312a88.css ├── documentation-topic~topic.b6287bcf.css ├── documentation-topic~topic~tutorials-overview.61ab0ea5.css ├── index.2eb9c3a4.css ├── topic.d8c126f3.css └── tutorials-overview.c249c765.css ├── data ├── documentation │ ├── curtainraiser.json │ └── curtainraiser │ │ ├── curtainraiser.json │ │ ├── curtainraiser │ │ ├── animatabledata.json │ │ ├── animation(_:).json │ │ ├── body(content:).json │ │ ├── concat(_:).json │ │ ├── init(view:sections:maxshadow:pleatheight:lift:offset:enabled:).json │ │ ├── transaction(_:).json │ │ └── viewmodifier-implementations.json │ │ ├── swiftui.json │ │ └── swiftui │ │ ├── view.json │ │ └── view │ │ └── curtainraiser(sections:maxshadow:pleatheight:lift:offset:enabled:).json └── tutorials │ ├── curtainraiser │ ├── adding-curtain-raiser-to-your-project.json │ └── getting-started-with-curtain-raiser.json │ └── tutorial-table-of-contents.json ├── developer-og-twitter.jpg ├── developer-og.jpg ├── documentation └── curtainraiser │ ├── curtainraiser │ ├── animatabledata │ │ └── index.html │ ├── animation(_:) │ │ └── index.html │ ├── body(content:) │ │ └── index.html │ ├── concat(_:) │ │ └── index.html │ ├── index.html │ ├── init(view:sections:maxshadow:pleatheight:lift:offset:enabled:) │ │ └── index.html │ ├── transaction(_:) │ │ └── index.html │ └── viewmodifier-implementations │ │ └── index.html │ ├── index.html │ └── swiftui │ ├── index.html │ └── view │ ├── curtainraiser(sections:maxshadow:pleatheight:lift:offset:enabled:) │ └── index.html │ └── index.html ├── favicon.ico ├── favicon.svg ├── images ├── Chapter1_01.png ├── Chapter1_02.png ├── Chapter1_Background.png ├── Chapter1_TOC.png ├── Chapter2_01.png ├── Chapter2_03.png ├── Chapter2_08.png ├── Chapter2_09.png ├── Chapter2_10.png ├── Chapter2_Background.png ├── Chapter2_TOC.png └── projection-card@2x.png ├── img ├── added-icon.d6f7e47d.svg ├── deprecated-icon.015b4f17.svg ├── modified-icon.f496e73d.svg └── no-image@2x.df2a0a50.png ├── index.html ├── index └── index.json ├── js ├── chunk-2d0d3105.cd72cc8e.js ├── chunk-c0335d80.76a68cc5.js ├── chunk-vendors.ba2dd0cb.js ├── documentation-topic.f4e2212c.js ├── documentation-topic~topic.1679ec90.js ├── documentation-topic~topic~tutorials-overview.94e92f99.js ├── highlight-js-bash.1b52852f.js ├── highlight-js-c.d1db3f17.js ├── highlight-js-cpp.eaddddbe.js ├── highlight-js-css.75eab1fe.js ├── highlight-js-custom-markdown.7cffc4b3.js ├── highlight-js-custom-swift.5cda5c20.js ├── highlight-js-diff.62d66733.js ├── highlight-js-http.163e45b6.js ├── highlight-js-java.8326d9d8.js ├── highlight-js-javascript.acb8a8eb.js ├── highlight-js-json.471128d2.js ├── highlight-js-llvm.6100b125.js ├── highlight-js-markdown.90077643.js ├── highlight-js-objectivec.bcdf5156.js ├── highlight-js-perl.757d7b6f.js ├── highlight-js-php.cc8d6c27.js ├── highlight-js-python.c214ed92.js ├── highlight-js-ruby.f889d392.js ├── highlight-js-scss.62ee18da.js ├── highlight-js-shell.dd7f411f.js ├── highlight-js-swift.84f3e88c.js ├── highlight-js-xml.9c3688c7.js ├── index.8883f267.js ├── topic.8cd0c0c4.js └── tutorials-overview.2a32cd6f.js ├── metadata.json └── tutorials ├── curtainraiser ├── adding-curtain-raiser-to-your-project │ └── index.html └── getting-started-with-curtain-raiser │ └── index.html └── tutorial-table-of-contents └── index.html /.github/ISSUE_TEMPLATE/bug-report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 🐞 Bug 3 | about: Create a report to log an issue found 4 | title: '[Bug] - ' 5 | labels: ["bug"] 6 | assignees: '' 7 | 8 | --- 9 | 10 | ## Description 11 | 12 | A brief description of what the bug is. 13 | 14 | ## To Reproduce 15 | 16 | Steps to reproduce the behavior: 17 | 1. 18 | 2. 19 | 3. 20 | 21 | ## Expected behavior 22 | 23 | A clear and concise description of what you **expected** to happen. 24 | 25 | ## Observed behavior 26 | 27 | A clear and concise description of what you **observed** happening. Please include screenshots/video if that helps explain the issue. 28 | 29 | ## Environment (please complete the following information): 30 | 31 | - OS: [e.g. iOS 17.0] 32 | - Device: [e.g. iPhone 13] 33 | - Version [e.g. 22] 34 | 35 | ## Additional information 36 | 37 | Add any other context or potentially relevant information about the problem here. 38 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/task.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 🛠️ Task 3 | about: Create a general Task 4 | title: '[Task] - <title>' 5 | labels: ["task"] 6 | assignees: '' 7 | 8 | --- 9 | 10 | ## Description 11 | 12 | <!---Description of the task--> 13 | 14 | ## Acceptance criteria 15 | 16 | - [ ] Code has been tested 17 | - [ ] ...Add more acceptance criteria here if needed 18 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | # Pull request 2 | 3 | ## Ticket 4 | 5 | Closes # 6 | 7 | ## Description 8 | 9 | <!--A description of the work completed. Could be long-form, a list, etc.--> 10 | 11 | ## Testing steps 12 | 13 | <!--Optional list of project specific testing (directed at QA)--> 14 | 15 | ## Checklist: 16 | 17 | - [ ] Automation Tests Pass 18 | - [ ] Has been tested 19 | - [ ] Code has been linted via swiftlint --fix 20 | 21 | ## Screen shots 22 | 23 | <!--Optional screen shots--> 24 | 25 | | iPhone Portrait | iPhone Landscape | 26 | |---|---| 27 | | | | 28 | 29 | | iPad Portrait | iPad Landscape | 30 | |---|---| 31 | | | | 32 | 33 | ## Appendix 34 | 35 | <!--links to documentation etc --> 36 | -------------------------------------------------------------------------------- /.github/workflows/auto-assignee.yml: -------------------------------------------------------------------------------- 1 | name: Auto Author Assign 2 | 3 | on: 4 | pull_request_target: 5 | types: [ opened, reopened ] 6 | 7 | permissions: 8 | pull-requests: write 9 | 10 | jobs: 11 | assign-author: 12 | runs-on: ubuntu-latest 13 | timeout-minutes: 3 14 | steps: 15 | - uses: toshimaru/auto-author-assign@v1.6.0 16 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Commit Workflow 2 | 3 | on: 4 | push: 5 | paths: 6 | - '.github/workflows/build.yml' 7 | - "*.swift" 8 | 9 | concurrency: 10 | group: "${{ github.ref }}_build" 11 | cancel-in-progress: true 12 | 13 | env: 14 | GITHUB_EMAIL: "bot@nthstate.com" 15 | GITHUB_USERNAME: "nthState-bot" 16 | PACKAGE_NAME: CurtainRaiser 17 | REPOSITORY_NAME: CurtainRaiser 18 | OUTPUT_PATH: ./docs 19 | DEVELOPER_DIR: /Applications/Xcode_15.0.app/Contents/Developer 20 | 21 | jobs: 22 | build: 23 | name: Build 24 | runs-on: macos-13 25 | timeout-minutes: 5 26 | steps: 27 | 28 | - name: Checkout 29 | uses: actions/checkout@v3 30 | 31 | - name: Build Package 32 | run: swift build 33 | 34 | - name: Test Package 35 | run: swift test 36 | 37 | buildDocs: 38 | name: Build Docs 39 | needs: build 40 | runs-on: macos-13 41 | if: github.ref != 'refs/heads/main' 42 | timeout-minutes: 5 43 | steps: 44 | 45 | - name: Checkout 46 | uses: actions/checkout@v3 47 | with: 48 | fetch-depth: 0 49 | token: ${{ secrets.ORG_BOT_PAT }} 50 | 51 | - name: Generate Documentation 52 | run: | 53 | swift package --allow-writing-to-directory ${{ env.OUTPUT_PATH }} \ 54 | generate-documentation --target ${{ env.PACKAGE_NAME }} \ 55 | --disable-indexing \ 56 | --transform-for-static-hosting \ 57 | --hosting-base-path ${{ env.REPOSITORY_NAME }} \ 58 | --output-path ${{ env.OUTPUT_PATH }} 59 | 60 | - name: Commit Documentation 61 | run: | 62 | git config --global user.email "${{ env.GITHUB_EMAIL }}" 63 | git config --global user.name "${{ env.GITHUB_USERNAME }}" 64 | git add "${{ env.OUTPUT_PATH }}" 65 | git commit -m "docs: Update docs [skip ci]" || echo "No changes to commit" 66 | git push -------------------------------------------------------------------------------- /.github/workflows/check-pr-title.yml: -------------------------------------------------------------------------------- 1 | name: PR Title Checker 2 | 3 | on: 4 | pull_request: 5 | types: [opened, edited, synchronize, labeled, unlabeled] 6 | 7 | concurrency: 8 | group: "${{ github.ref }}_title" 9 | cancel-in-progress: true 10 | 11 | jobs: 12 | check: 13 | runs-on: ubuntu-latest 14 | timeout-minutes: 3 15 | steps: 16 | - name: Check PR Title 17 | uses: naveenk1223/action-pr-title@master 18 | with: 19 | regex: '.+' # Regex the title should match. 20 | allowed_prefixes: 'feat,fix,ci,build,chore,style,docs,refactor,perf,test' 21 | prefix_case_sensitive: false 22 | 23 | - name: Check for invalid words 24 | run: | 25 | if [[ "${{ github.event.pull_request.title }}" =~ "issue" ]] 26 | then 27 | echo "The PR title contains an invalid word: issue - can you be more specific?" 28 | exit 1 29 | fi -------------------------------------------------------------------------------- /.github/workflows/lint.yml: -------------------------------------------------------------------------------- 1 | name: Lint 2 | 3 | on: 4 | push: 5 | paths: 6 | - '.github/workflows/lint.yml' 7 | - "ios/**" 8 | 9 | concurrency: 10 | group: "${{ github.ref }}_lint" 11 | cancel-in-progress: true 12 | 13 | env: 14 | DEVELOPER_DIR: /Applications/Xcode_15.0.app/Contents/Developer 15 | 16 | jobs: 17 | lint: 18 | name: SwiftLint 19 | runs-on: macos-13 20 | timeout-minutes: 5 21 | steps: 22 | 23 | - name: Checkout 24 | uses: actions/checkout@v3 25 | 26 | - name: Run linter 27 | run: swiftlint --strict 28 | -------------------------------------------------------------------------------- /.github/workflows/workflow-cleanup.yml: -------------------------------------------------------------------------------- 1 | name: Workflow Cleanup 2 | 3 | on: 4 | workflow_dispatch: 5 | schedule: 6 | - cron: '0 01 * * 1-5' # UTC time 7 | 8 | concurrency: 9 | group: "${{ github.ref }}_cleanup" 10 | cancel-in-progress: true 11 | 12 | jobs: 13 | cleanup: 14 | name: Clean up Workflows 15 | runs-on: ubuntu-latest 16 | timeout-minutes: 15 17 | steps: 18 | 19 | - name: Delete old workflow runs 20 | uses: MajorScruffy/delete-old-workflow-runs@v0.3.0 21 | with: 22 | repository: ${{ github.repository }} 23 | older-than-seconds: 259200 # 3 days 24 | env: 25 | GITHUB_TOKEN: ${{ secrets.ORG_BOT_PAT }} 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /.build 3 | /Packages 4 | xcuserdata/ 5 | DerivedData/ 6 | .swiftpm/configuration/registries.json 7 | .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata 8 | .netrc 9 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | # pre-commit install --hook-type commit-msg --hook-type pre-push; pre-commit autoupdate 2 | # pre-commit run 3 | # pre-commit run --hook-stage commit-msg --commit-msg-filename .git/COMMIT_EDITMSG 4 | --- 5 | repos: 6 | - repo: https://github.com/commitizen-tools/commitizen 7 | rev: 3.5.2 8 | hooks: 9 | - id: commitizen 10 | 11 | - repo: local 12 | hooks: 13 | - id: Swift-Lint 14 | name: Swift-Lint 15 | entry: /opt/homebrew/bin/swiftlint . --strict --quiet true 16 | language: script 17 | pass_filenames: false 18 | 19 | - repo: local 20 | hooks: 21 | - id: commit-message-check 22 | name: Commit Message Check Shouldn't contain issue 23 | language: pygrep 24 | entry: '^.*issue.*$' 25 | args: [--multiline] 26 | stages: [commit-msg] -------------------------------------------------------------------------------- /.swiftlint.yml: -------------------------------------------------------------------------------- 1 | disabled_rules: 2 | - line_length 3 | opt_in_rules: 4 | - sorted_imports 5 | - indentation: 6 | spaces: 2 7 | excluded: 8 | - .build -------------------------------------------------------------------------------- /.swiftpm/xcode/package.xcworkspace/xcshareddata/IDETemplateMacros.plist: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 | <plist version="1.0"> 4 | <dict> 5 | <key>FILEHEADER</key> 6 | <string> 7 | // Copyright © nthState Ltd ___YEAR___. All rights reserved. 8 | //</string> 9 | </dict> 10 | </plist> 11 | -------------------------------------------------------------------------------- /.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3 | <plist version="1.0"> 4 | <dict> 5 | <key>IDEDidComputeMac32BitWarning</key> 6 | <true/> 7 | </dict> 8 | </plist> 9 | -------------------------------------------------------------------------------- /CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @nthState-Chris -------------------------------------------------------------------------------- /Configuration/Version.xcconfig: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright © nthState Ltd 2023. All rights reserved. 3 | // 4 | 5 | CURRENT_PROJECT_VERSION = 0 6 | MARKETING_VERSION = 0.0.0 7 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 nthState Ltd 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /Package.resolved: -------------------------------------------------------------------------------- 1 | { 2 | "pins" : [ 3 | { 4 | "identity" : "swift-docc-plugin", 5 | "kind" : "remoteSourceControl", 6 | "location" : "https://github.com/apple/swift-docc-plugin", 7 | "state" : { 8 | "revision" : "26ac5758409154cc448d7ab82389c520fa8a8247", 9 | "version" : "1.3.0" 10 | } 11 | }, 12 | { 13 | "identity" : "swift-docc-symbolkit", 14 | "kind" : "remoteSourceControl", 15 | "location" : "https://github.com/apple/swift-docc-symbolkit", 16 | "state" : { 17 | "revision" : "b45d1f2ed151d057b54504d653e0da5552844e34", 18 | "version" : "1.0.0" 19 | } 20 | } 21 | ], 22 | "version" : 2 23 | } 24 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version: 5.9 2 | 3 | import PackageDescription 4 | 5 | let package = Package( 6 | name: "CurtainRaiser", 7 | defaultLocalization: "en", 8 | platforms: [.iOS(.v17), .macOS(.v14)], 9 | products: [ 10 | .library( 11 | name: "CurtainRaiser", 12 | targets: ["CurtainRaiser"]) 13 | ], dependencies: [ 14 | .package(url: "https://github.com/apple/swift-docc-plugin", from: "1.1.0") 15 | ], 16 | targets: [ 17 | .target( 18 | name: "CurtainRaiser"), 19 | .testTarget( 20 | name: "CurtainRaiserTests", 21 | dependencies: ["CurtainRaiser"]) 22 | ] 23 | ) 24 | -------------------------------------------------------------------------------- /Scripts/new-developer.sh: -------------------------------------------------------------------------------- 1 | echo "Let's get started installing dependencies..." 2 | 3 | 4 | # https://git-scm.com/ 5 | echo "Do you want to enable auto-signing your commits?" 6 | echo "Note: Will use key `id_ed25519`" 7 | echo "Note: Remember to upload your key as a signing key" 8 | select yn in "Yes" "No"; do 9 | case $yn in 10 | Yes ) git config --global gpg.format ssh; git config --global user.signingkey ~/.ssh/id_ed25519.pub; git config --global commit.gpgsign true 11 | No ) break;; 12 | esac 13 | done 14 | 15 | 16 | # https://xcodereleases.com/ 17 | echo "Do you want to install xcode command line tools?" 18 | echo "Generally if you have Xcode these are already installed" 19 | select yn in "Yes" "No"; do 20 | case $yn in 21 | Yes ) xcode-select --install; break;; 22 | No ) break;; 23 | esac 24 | done 25 | 26 | 27 | # https://brew.sh/ 28 | echo "Do you want to install Homebrew?" 29 | select yn in "Yes" "No"; do 30 | case $yn in 31 | Yes ) /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"; break;; 32 | No ) break;; 33 | esac 34 | done 35 | 36 | 37 | # https://github.com/realm/SwiftLint 38 | echo "Do you want to install SwiftLint?" 39 | select yn in "Yes" "No"; do 40 | case $yn in 41 | Yes ) brew install swiftlint; break;; 42 | No ) break;; 43 | esac 44 | done 45 | 46 | 47 | # https://commitizen-tools.github.io/commitizen/ 48 | echo "Do you want to install Commitizen?" 49 | select yn in "Yes" "No"; do 50 | case $yn in 51 | Yes ) brew install commitizen; break;; 52 | No ) break;; 53 | esac 54 | done 55 | 56 | 57 | # https://pre-commit.com/ 58 | echo "Do you want to install pre-commit?" 59 | select yn in "Yes" "No"; do 60 | case $yn in 61 | Yes ) brew install pre-commit; break;; 62 | No ) break;; 63 | esac 64 | done 65 | 66 | 67 | echo "Do you want to configure pre-commit?" 68 | select yn in "Yes" "No"; do 69 | case $yn in 70 | Yes ) pre-commit install --hook-type commit-msg --hook-type pre-push; pre-commit autoupdate; break;; 71 | No ) break;; 72 | esac 73 | done 74 | -------------------------------------------------------------------------------- /Sources/CurtainRaiser/CurtainRaiser.docc/CurtainRaiser.md: -------------------------------------------------------------------------------- 1 | # ``CurtainRaiser`` 2 | 3 | Curtain Raiser is an iOS17 View Modifier to animate a foreground view to reveal the background view beneath 4 | 5 | ## Overview 6 | 7 | Curtain Raiser uses SwiftUI's `.layerEffect` and a shader to create the illusion of a view folding. 8 | 9 | ### Featured 10 | 11 | @Links(visualStyle: detailedGrid) { 12 | - <doc:Adding-Curtain-Raiser-to-your-project> 13 | - <doc:Getting-Started-with-Curtain-Raiser> 14 | } 15 | -------------------------------------------------------------------------------- /Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter1/Chapter1_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nthState/CurtainRaiser/785b450f4ef8e90a1248ff5f2187167bd49e5b5e/Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter1/Chapter1_01.png -------------------------------------------------------------------------------- /Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter1/Chapter1_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nthState/CurtainRaiser/785b450f4ef8e90a1248ff5f2187167bd49e5b5e/Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter1/Chapter1_02.png -------------------------------------------------------------------------------- /Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter1/Chapter1_03.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version: 5.9 2 | 3 | import PackageDescription 4 | 5 | let package = Package( 6 | name: "YourProject", 7 | platforms: [.iOS(.v17), .macOS(.v14)], 8 | products: [ 9 | .library( 10 | name: "YourProject", 11 | targets: ["YourProject"]) 12 | ], dependencies: [ 13 | ], 14 | targets: [ 15 | .target( 16 | name: "YourProject"), 17 | .testTarget( 18 | name: "YourProjectTests", 19 | dependencies: ["YourProject"]) 20 | ] 21 | ) 22 | -------------------------------------------------------------------------------- /Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter1/Chapter1_04.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version: 5.9 2 | 3 | import PackageDescription 4 | 5 | let package = Package( 6 | name: "YourProject", 7 | platforms: [.iOS(.v17), .macOS(.v14)], 8 | products: [ 9 | .library( 10 | name: "YourProject", 11 | targets: ["YourProject"]) 12 | ], dependencies: [ 13 | .package(url: "https://github.com/nthState/CurtainRaiser", branch: "master") 14 | ], 15 | targets: [ 16 | .target( 17 | name: "YourProject"), 18 | .testTarget( 19 | name: "YourProjectTests", 20 | dependencies: ["YourProject"]) 21 | ] 22 | ) 23 | -------------------------------------------------------------------------------- /Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter1/Chapter1_Background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nthState/CurtainRaiser/785b450f4ef8e90a1248ff5f2187167bd49e5b5e/Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter1/Chapter1_Background.png -------------------------------------------------------------------------------- /Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter1/Chapter1_TOC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nthState/CurtainRaiser/785b450f4ef8e90a1248ff5f2187167bd49e5b5e/Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter1/Chapter1_TOC.png -------------------------------------------------------------------------------- /Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter2/Chapter2_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nthState/CurtainRaiser/785b450f4ef8e90a1248ff5f2187167bd49e5b5e/Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter2/Chapter2_01.png -------------------------------------------------------------------------------- /Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter2/Chapter2_01.swift: -------------------------------------------------------------------------------- 1 | import SwiftUI 2 | 3 | struct ContentView {} 4 | 5 | extension ContentView: View { 6 | 7 | var body: some View { 8 | ZStack { 9 | backgroundView 10 | foregroundView 11 | } 12 | } 13 | 14 | private var backgroundView: some View { 15 | Color.red 16 | .edgesIgnoringSafeArea(.all) 17 | } 18 | 19 | private var foregroundView: some View { 20 | Color.blue 21 | .edgesIgnoringSafeArea(.all) 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter2/Chapter2_02.swift: -------------------------------------------------------------------------------- 1 | import CurtainRaiser 2 | import SwiftUI 3 | 4 | struct ContentView {} 5 | 6 | extension ContentView: View { 7 | 8 | var body: some View { 9 | ZStack { 10 | backgroundView 11 | foregroundView 12 | } 13 | } 14 | 15 | private var backgroundView: some View { 16 | Color.red 17 | .edgesIgnoringSafeArea(.all) 18 | } 19 | 20 | private var foregroundView: some View { 21 | Color.blue 22 | .edgesIgnoringSafeArea(.all) 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter2/Chapter2_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nthState/CurtainRaiser/785b450f4ef8e90a1248ff5f2187167bd49e5b5e/Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter2/Chapter2_03.png -------------------------------------------------------------------------------- /Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter2/Chapter2_03.swift: -------------------------------------------------------------------------------- 1 | import CurtainRaiser 2 | import SwiftUI 3 | 4 | struct ContentView {} 5 | 6 | extension ContentView: View { 7 | 8 | var body: some View { 9 | ZStack { 10 | backgroundView 11 | foregroundView 12 | .curtainRaiser(offset: CGPoint(x: 0, y: 0.2)) 13 | } 14 | } 15 | 16 | private var backgroundView: some View { 17 | Color.red 18 | .edgesIgnoringSafeArea(.all) 19 | } 20 | 21 | private var foregroundView: some View { 22 | Color.blue 23 | .edgesIgnoringSafeArea(.all) 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter2/Chapter2_04.swift: -------------------------------------------------------------------------------- 1 | import CurtainRaiser 2 | import SwiftUI 3 | 4 | struct ContentView {} 5 | 6 | extension ContentView: View { 7 | 8 | var body: some View { 9 | 10 | let drag = DragGesture() 11 | .onChanged { _ in 12 | 13 | } 14 | .onEnded { _ in 15 | 16 | } 17 | 18 | ZStack { 19 | backgroundView 20 | foregroundView 21 | .curtainRaiser(offset: CGPoint(x: 0, y: 0.2)) 22 | } 23 | } 24 | 25 | private var backgroundView: some View { 26 | Color.red 27 | .edgesIgnoringSafeArea(.all) 28 | } 29 | 30 | private var foregroundView: some View { 31 | Color.blue 32 | .edgesIgnoringSafeArea(.all) 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter2/Chapter2_05.swift: -------------------------------------------------------------------------------- 1 | import CurtainRaiser 2 | import SwiftUI 3 | 4 | struct ContentView { 5 | @State var touchOffset: CGPoint = .zero 6 | } 7 | 8 | extension ContentView: View { 9 | 10 | var body: some View { 11 | 12 | let drag = DragGesture() 13 | .onChanged { _ in 14 | 15 | } 16 | .onEnded { _ in 17 | 18 | } 19 | 20 | ZStack { 21 | backgroundView 22 | foregroundView 23 | .curtainRaiser(offset: CGPoint(x: 0, y: 0.2)) 24 | } 25 | } 26 | 27 | private var backgroundView: some View { 28 | Color.red 29 | .edgesIgnoringSafeArea(.all) 30 | } 31 | 32 | private var foregroundView: some View { 33 | Color.blue 34 | .edgesIgnoringSafeArea(.all) 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter2/Chapter2_06.swift: -------------------------------------------------------------------------------- 1 | import CurtainRaiser 2 | import SwiftUI 3 | 4 | struct ContentView { 5 | @State var touchOffset: CGPoint = .zero 6 | } 7 | 8 | extension ContentView: View { 9 | 10 | var body: some View { 11 | 12 | let drag = DragGesture() 13 | .onChanged { gesture in 14 | touchOffset = CGPoint(x: (gesture.location.x / UIScreen.main.bounds.width), 15 | y: 1.0 - (gesture.location.y / UIScreen.main.bounds.height)) 16 | } 17 | .onEnded { _ in 18 | 19 | } 20 | 21 | ZStack { 22 | backgroundView 23 | foregroundView 24 | .curtainRaiser(offset: CGPoint(x: 0, y: 0.2)) 25 | } 26 | } 27 | 28 | private var backgroundView: some View { 29 | Color.red 30 | .edgesIgnoringSafeArea(.all) 31 | } 32 | 33 | private var foregroundView: some View { 34 | Color.blue 35 | .edgesIgnoringSafeArea(.all) 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter2/Chapter2_07.swift: -------------------------------------------------------------------------------- 1 | import CurtainRaiser 2 | import SwiftUI 3 | 4 | struct ContentView { 5 | @State var touchOffset: CGPoint = .zero 6 | } 7 | 8 | extension ContentView: View { 9 | 10 | var body: some View { 11 | 12 | let drag = DragGesture() 13 | .onChanged { gesture in 14 | touchOffset = CGPoint(x: (gesture.location.x / UIScreen.main.bounds.width), 15 | y: 1.0 - (gesture.location.y / UIScreen.main.bounds.height)) 16 | } 17 | .onEnded { _ in 18 | 19 | } 20 | 21 | ZStack { 22 | backgroundView 23 | foregroundView 24 | .curtainRaiser(offset: touchOffset) 25 | } 26 | } 27 | 28 | private var backgroundView: some View { 29 | Color.red 30 | .edgesIgnoringSafeArea(.all) 31 | } 32 | 33 | private var foregroundView: some View { 34 | Color.blue 35 | .edgesIgnoringSafeArea(.all) 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter2/Chapter2_08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nthState/CurtainRaiser/785b450f4ef8e90a1248ff5f2187167bd49e5b5e/Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter2/Chapter2_08.png -------------------------------------------------------------------------------- /Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter2/Chapter2_08.swift: -------------------------------------------------------------------------------- 1 | import CurtainRaiser 2 | import SwiftUI 3 | 4 | struct ContentView { 5 | @State var touchOffset: CGPoint = .zero 6 | } 7 | 8 | extension ContentView: View { 9 | 10 | var body: some View { 11 | 12 | let drag = DragGesture() 13 | .onChanged { gesture in 14 | touchOffset = CGPoint(x: (gesture.location.x / UIScreen.main.bounds.width), 15 | y: 1.0 - (gesture.location.y / UIScreen.main.bounds.height)) 16 | } 17 | .onEnded { _ in 18 | 19 | } 20 | 21 | ZStack { 22 | backgroundView 23 | foregroundView 24 | .curtainRaiser(offset: touchOffset) 25 | .gesture(drag) 26 | } 27 | } 28 | 29 | private var backgroundView: some View { 30 | Color.red 31 | .edgesIgnoringSafeArea(.all) 32 | } 33 | 34 | private var foregroundView: some View { 35 | Color.blue 36 | .edgesIgnoringSafeArea(.all) 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter2/Chapter2_09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nthState/CurtainRaiser/785b450f4ef8e90a1248ff5f2187167bd49e5b5e/Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter2/Chapter2_09.png -------------------------------------------------------------------------------- /Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter2/Chapter2_09.swift: -------------------------------------------------------------------------------- 1 | import CurtainRaiser 2 | import SwiftUI 3 | 4 | struct ContentView { 5 | @State var touchOffset: CGPoint = .zero 6 | } 7 | 8 | extension ContentView: View { 9 | 10 | var body: some View { 11 | 12 | let drag = DragGesture() 13 | .onChanged { gesture in 14 | touchOffset = CGPoint(x: (gesture.location.x / UIScreen.main.bounds.width), 15 | y: 1.0 - (gesture.location.y / UIScreen.main.bounds.height)) 16 | } 17 | .onEnded { _ in 18 | 19 | } 20 | 21 | ZStack { 22 | backgroundView 23 | foregroundView 24 | .curtainRaiser( 25 | sections: 5, 26 | offset: touchOffset 27 | ) 28 | .gesture(drag) 29 | } 30 | } 31 | 32 | private var backgroundView: some View { 33 | Color.red 34 | .edgesIgnoringSafeArea(.all) 35 | } 36 | 37 | private var foregroundView: some View { 38 | Color.blue 39 | .edgesIgnoringSafeArea(.all) 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter2/Chapter2_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nthState/CurtainRaiser/785b450f4ef8e90a1248ff5f2187167bd49e5b5e/Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter2/Chapter2_10.png -------------------------------------------------------------------------------- /Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter2/Chapter2_10.swift: -------------------------------------------------------------------------------- 1 | import CurtainRaiser 2 | import SwiftUI 3 | 4 | struct ContentView { 5 | @State var touchOffset: CGPoint = .zero 6 | } 7 | 8 | extension ContentView: View { 9 | 10 | var body: some View { 11 | 12 | let drag = DragGesture() 13 | .onChanged { gesture in 14 | touchOffset = CGPoint(x: (gesture.location.x / UIScreen.main.bounds.width), 15 | y: 1.0 - (gesture.location.y / UIScreen.main.bounds.height)) 16 | } 17 | .onEnded { _ in 18 | 19 | } 20 | 21 | ZStack { 22 | backgroundView 23 | foregroundView 24 | .curtainRaiser( 25 | sections: 5, 26 | lift: 0.2, 27 | offset: touchOffset 28 | ) 29 | .gesture(drag) 30 | } 31 | } 32 | 33 | private var backgroundView: some View { 34 | Color.red 35 | .edgesIgnoringSafeArea(.all) 36 | } 37 | 38 | private var foregroundView: some View { 39 | Color.blue 40 | .edgesIgnoringSafeArea(.all) 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter2/Chapter2_Background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nthState/CurtainRaiser/785b450f4ef8e90a1248ff5f2187167bd49e5b5e/Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter2/Chapter2_Background.png -------------------------------------------------------------------------------- /Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter2/Chapter2_TOC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nthState/CurtainRaiser/785b450f4ef8e90a1248ff5f2187167bd49e5b5e/Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Chapter2/Chapter2_TOC.png -------------------------------------------------------------------------------- /Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Images/projection-card@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nthState/CurtainRaiser/785b450f4ef8e90a1248ff5f2187167bd49e5b5e/Sources/CurtainRaiser/CurtainRaiser.docc/Resources/Images/projection-card@2x.png -------------------------------------------------------------------------------- /Sources/CurtainRaiser/CurtainRaiser.docc/Tutorial Table of Contents.tutorial: -------------------------------------------------------------------------------- 1 | @Tutorials(name: "Curtain Raiser Tutorials") { 2 | @Intro(title: "Introduction") { 3 | How to get the most out of the Curtain Raiser View Modifier in iOS17 4 | } 5 | 6 | @Chapter(name: "Adding Curtain Raiser to your project") { 7 | How to add Curtain Raiser to your App or Swift Package 8 | 9 | @Image(source: "Chapter1_TOC.png", alt: "accessible description") 10 | 11 | @TutorialReference(tutorial: "doc:Adding-Curtain-Raiser-to-your-project") 12 | } 13 | 14 | @Chapter(name: "Getting Started with Curtain Raiser") { 15 | Configure parameters 16 | 17 | @Image(source: "Chapter2_TOC.png", alt: "accessible description") 18 | 19 | @TutorialReference(tutorial: "doc:Getting-Started-with-Curtain-Raiser") 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /Sources/CurtainRaiser/CurtainRaiser.docc/Tutorials/Adding Curtain Raiser to your project.tutorial: -------------------------------------------------------------------------------- 1 | @Tutorial(time: 1) { 2 | 3 | @Intro(title: "Add Curtain Raiser to your Project") { 4 | CurtainRaiser is delivered as a Swift Package, whether you want to include in an App, or Swift Package yourself, it's straight forward to do. 5 | @Image(source: "Chapter1_Background.png", alt: "accessible description") 6 | } 7 | 8 | @Section(title: "Option A: Add to an App") { 9 | @ContentAndMedia { 10 | Add to your App 11 | } 12 | 13 | @Steps { 14 | @Step { 15 | Navigate to Project > Package Dependencies 16 | @Image(source: "Chapter1_01.png", alt: "Importing the Swift Package") 17 | } 18 | @Step { 19 | Add `https://github.com/nthState/CurtainRaiser` as a Package Dependency 20 | @Image(source: "Chapter1_02.png", alt: "Importing the Swift Package") 21 | } 22 | 23 | } 24 | } 25 | 26 | @Section(title: "Option B: Adding to a Swift Package") { 27 | @ContentAndMedia { 28 | Extend your existing Swift Package by adding the Curtain Raiser Package 29 | } 30 | 31 | @Steps { 32 | @Step { 33 | Open your `Package.swift` file and find the `dependencies` section 34 | 35 | @Code(name: "Package.swift", file: "Chapter1_03.swift") { 36 | 37 | } 38 | } 39 | 40 | @Step { 41 | 42 | Add ``CurtainRaiser`` to the `dependencies`, I host this project on GitHub. 43 | 44 | @Code(name: "Package.swift", file: "Chapter1_04.swift") { 45 | 46 | } 47 | } 48 | 49 | } 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /Sources/CurtainRaiser/CurtainRaiser.docc/Tutorials/Getting Started with Curtain Raiser.tutorial: -------------------------------------------------------------------------------- 1 | @Tutorial(time: 5) { 2 | @Intro(title: "Getting Started with Curtain Raiser") { 3 | Curtain Raiser is a faux effect that makes it look like your view is scrunching up much like 4 | a curtain does in real life. 5 | 6 | @Image(source: "Chapter2_Background.png", alt: "accessible description") 7 | } 8 | 9 | @Section(title: "Add it to your View") { 10 | @ContentAndMedia { 11 | We'll need a view that has two views, one on top of the other, so we can reveal the one underneath. 12 | } 13 | 14 | @Steps { 15 | 16 | @Step { 17 | Start with the following setup 18 | @Code(name: "ContentView.swift", file: "Chapter2_01.swift") { 19 | @Image(source: "Chapter2_01.png", alt: "Default ContentView, blue screen") 20 | } 21 | } 22 | 23 | @Step { 24 | Import Curtain Raiser 25 | @Code(name: "ContentView.swift", file: "Chapter2_02.swift") { 26 | @Image(source: "Chapter2_01.png", alt: "Default ContentView, blue screen") 27 | } 28 | } 29 | 30 | @Step { 31 | Add the curtain raiser to the foreground view, that's the view we want to move up. 32 | @Code(name: "ContentView.swift", file: "Chapter2_03.swift") { 33 | @Image(source: "Chapter2_01.png", alt: "Default ContentView, blue screen") 34 | } 35 | } 36 | 37 | @Step { 38 | Run the code, note the bottom has moved up 39 | @Code(name: "ContentView.swift", file: "Chapter2_03.swift") { 40 | @Image(source: "Chapter2_03.png", alt: "Slight movement at the bottom") 41 | } 42 | } 43 | 44 | } 45 | } 46 | 47 | @Section(title: "Let's make it dynamic") { 48 | @ContentAndMedia { 49 | Next we'll learn how to control the effect with a DragGesture. 50 | } 51 | @Steps { 52 | @Step { 53 | Add the barebones DragGesture 54 | @Code(name: "ContentView.swift", file: "Chapter2_04.swift") { 55 | 56 | } 57 | } 58 | 59 | @Step { 60 | Add a @State to save the offset of the users touch 61 | @Code(name: "ContentView.swift", file: "Chapter2_05.swift") { 62 | 63 | } 64 | } 65 | 66 | @Step { 67 | Calculate a touchOffset and save it to the touchOffset @State 68 | @Code(name: "ContentView.swift", file: "Chapter2_06.swift") { 69 | 70 | } 71 | } 72 | 73 | @Step { 74 | Supply the touchOffset to the Curtain Raiser Effect 75 | @Code(name: "ContentView.swift", file: "Chapter2_07.swift") { 76 | 77 | } 78 | } 79 | @Step { 80 | Add the drag gesture to the view 81 | @Code(name: "ContentView.swift", file: "Chapter2_08.swift") { 82 | @Image(source: "Chapter2_08.png", alt: "Moving with a gesture") 83 | } 84 | } 85 | 86 | 87 | } 88 | } 89 | 90 | @Section(title: "Other ") { 91 | @ContentAndMedia { 92 | There are other parameters that we can use 93 | } 94 | @Steps { 95 | @Step { 96 | Change the number of sections 97 | @Code(name: "ContentView.swift", file: "Chapter2_09.swift") { 98 | @Image(source: "Chapter2_09.png", alt: "Changing section count") 99 | } 100 | } 101 | 102 | @Step { 103 | Change how high the bottom pleat raises, default is 0 104 | @Code(name: "ContentView.swift", file: "Chapter2_10.swift") { 105 | @Image(source: "Chapter2_10.png", alt: "Changing bottom lift height") 106 | } 107 | } 108 | } 109 | } 110 | 111 | } 112 | } 113 | -------------------------------------------------------------------------------- /Sources/CurtainRaiser/CurtainRaiser.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright © nthState Ltd 2023. All rights reserved. 3 | // 4 | 5 | import SwiftUI 6 | 7 | public extension View { 8 | 9 | /// Animate a foreground view over a background view 10 | /// - Parameters: 11 | /// - sections: The number of sections/pleats 12 | /// - maxShadow: How much shadow to apply 13 | /// - pleatHeight: The height of the pleat 14 | /// - lift: How much lift the bottom pleat raises, in relation to the x position 15 | /// - offset: 0 = no effect applied, 1 = full effect applied. Animate inbetween for the effect. 16 | /// - enabled: Should the shader be enabled? 17 | /// - Returns: A modified view 18 | func curtainRaiser(sections: Int = 10, 19 | maxShadow: Float = 0.1, 20 | pleatHeight: Float = 4.0, 21 | lift: Float = 0, 22 | offset: CGPoint = CGPoint(x: 0.5, y: 0), 23 | enabled: Bool = true) -> some View { 24 | modifier(CurtainRaiser(view: self, 25 | sections: sections, 26 | maxShadow: maxShadow, 27 | pleatHeight: pleatHeight, 28 | lift: lift, 29 | offset: offset, 30 | enabled: enabled)) 31 | } 32 | 33 | } 34 | 35 | public struct CurtainRaiser<V>: ViewModifier, Animatable where V: View { 36 | 37 | private let view: V 38 | private let enabled: Bool 39 | private let library: ShaderLibrary 40 | private var offset: CGPoint 41 | private let sections: Int 42 | @State private var sampleOffset: CGSize = .zero 43 | 44 | private let maxShadow: Float 45 | private let pleatHeight: Float 46 | private let lift: Float 47 | 48 | public var animatableData: AnimatablePair<CGFloat, CGFloat> { 49 | get { AnimatablePair(offset.x, offset.y) } 50 | set { offset = CGPoint(x: newValue.first, y: newValue.second) } 51 | } 52 | 53 | public init(view: V, 54 | sections: Int, 55 | maxShadow: Float, 56 | pleatHeight: Float, 57 | lift: Float, 58 | offset: CGPoint, 59 | enabled: Bool = true) { 60 | self.view = view 61 | self.enabled = enabled 62 | self.offset = offset 63 | self.sections = sections 64 | 65 | self.maxShadow = maxShadow 66 | self.pleatHeight = pleatHeight 67 | self.lift = lift 68 | 69 | library = .bundle(.module) 70 | } 71 | 72 | private var layerShader: Shader { 73 | let function = ShaderFunction(library: library, name: "layerShader") 74 | return Shader(function: function, arguments: [ 75 | .floatArray([Float(sections), 76 | Float(offset.x.clamped(to: 0.0...1.0)), 77 | Float(offset.y.clamped(to: 0.0...1.0)), 78 | maxShadow, 79 | pleatHeight, 80 | lift 81 | ]), 82 | .boundingRect 83 | ]) 84 | } 85 | 86 | public func body(content: Content) -> some View { 87 | ZStack(alignment: .bottomTrailing) { 88 | view 89 | .layerEffect(layerShader, maxSampleOffset: self.sampleOffset, isEnabled: enabled) 90 | .overlay(GeometryReader { geometry in 91 | Color.clear 92 | .preference(key: SizePreferenceKey.self, value: geometry.size) 93 | }) 94 | .onPreferenceChange(SizePreferenceKey.self) { size in 95 | self.sampleOffset = size 96 | } 97 | } 98 | } 99 | 100 | } 101 | 102 | struct SizePreferenceKey: PreferenceKey { 103 | static var defaultValue: CGSize = .zero 104 | 105 | static func reduce(value: inout CGSize, nextValue: () -> CGSize) { 106 | value = CGSize(width: max(value.width, nextValue().width), 107 | height: max(value.height, nextValue().height)) 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /Sources/CurtainRaiser/Examples/AnimatingCircle.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright © nthState Ltd 2023. All rights reserved. 3 | // 4 | 5 | import SwiftUI 6 | 7 | internal struct AnimatingCircle: View { 8 | @State private var drawingStroke = false 9 | 10 | private let animation = Animation 11 | .linear(duration: 3) 12 | .repeatForever(autoreverses: false) 13 | 14 | var body: some View { 15 | circle 16 | .frame(width: 150) 17 | .animation(animation, value: drawingStroke) 18 | .onAppear { 19 | drawingStroke.toggle() 20 | } 21 | } 22 | 23 | private var circle: some View { 24 | Circle() 25 | .stroke(Color.blue, style: StrokeStyle(lineWidth: 16)) 26 | .overlay { 27 | Circle() 28 | .trim(from: 0, to: drawingStroke ? 1 : 0) 29 | .stroke(Color.red, style: StrokeStyle(lineWidth: 16, lineCap: .round)) 30 | } 31 | .rotationEffect(.degrees(-90)) 32 | } 33 | } 34 | 35 | #if DEBUG 36 | #Preview("AnimatingCircle") { 37 | AnimatingCircle() 38 | } 39 | #endif 40 | -------------------------------------------------------------------------------- /Sources/CurtainRaiser/Examples/Controls/ControlViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright © nthState Ltd 2023. All rights reserved. 3 | // 4 | 5 | import SwiftUI 6 | import Observation 7 | 8 | @Observable 9 | internal class ControlViewModel { 10 | var offset: CGPoint = CGPoint(x: 0.5, y: 0) 11 | var sections: Int = 10 12 | var maxShadow: Float = 0.1 13 | var pleatHeight: Float = 4.0 14 | var lift: Float = 0 15 | var enable: Bool = true 16 | 17 | internal init(offset: CGPoint = CGPoint(x: 0.5, y: 0), sections: Int = 10, maxShadow: Float = 0.1, pleatHeight: Float = 4.0, lift: Float = 0.5, enable: Bool = true) { 18 | self.offset = offset 19 | self.sections = sections 20 | self.maxShadow = maxShadow 21 | self.pleatHeight = pleatHeight 22 | self.lift = lift 23 | self.enable = enable 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Sources/CurtainRaiser/Examples/Controls/ControlsView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright © nthState Ltd 2023. All rights reserved. 3 | // 4 | 5 | import SwiftUI 6 | 7 | internal struct ControlsView { 8 | @Binding var control: ControlViewModel 9 | } 10 | 11 | extension ControlsView: View { 12 | 13 | var body: some View { 14 | content 15 | } 16 | 17 | private var content: some View { 18 | Form { 19 | Section { 20 | offsetSlider 21 | } 22 | Section { 23 | sectionCount 24 | maxShadow 25 | pleatHeight 26 | lift 27 | } 28 | Section { 29 | enableButton 30 | } 31 | } 32 | .font(.subheadline.monospaced()) 33 | .padding() 34 | } 35 | 36 | private var offsetSlider: some View { 37 | HStack { 38 | Text("control.offset \(control.offset.y)", bundle: .module) 39 | Slider(value: $control.offset.y, in: 0...1) 40 | } 41 | } 42 | 43 | private var sectionsDouble: Binding<Double> { 44 | Binding<Double>(get: { 45 | return Double(control.sections) 46 | }, set: { 47 | control.sections = Int($0) 48 | }) 49 | } 50 | 51 | private var sectionCount: some View { 52 | HStack { 53 | Text("control.sections \(control.sections)", bundle: .module) 54 | Slider(value: sectionsDouble, in: 0...15, step: 1.0) 55 | } 56 | } 57 | 58 | private var maxShadow: some View { 59 | HStack { 60 | Text("control.maxShadow \(control.maxShadow)", bundle: .module) 61 | Slider(value: $control.maxShadow, in: 0...2) 62 | } 63 | } 64 | 65 | private var pleatHeight: some View { 66 | HStack { 67 | Text("control.pleatHeight \(control.pleatHeight)", bundle: .module) 68 | Slider(value: $control.pleatHeight, in: 0...5) 69 | } 70 | } 71 | 72 | private var lift: some View { 73 | HStack { 74 | Text("control.lift \(control.lift)", bundle: .module) 75 | Slider(value: $control.lift, in: 0...1) 76 | } 77 | } 78 | 79 | private var enableButton: some View { 80 | HStack { 81 | Button { 82 | control.enable.toggle() 83 | } label: { 84 | Text("control.shaderEnabled \(control.enable.description)", bundle: .module) 85 | } 86 | } 87 | } 88 | 89 | } 90 | 91 | #if DEBUG 92 | #Preview("Controls View") { 93 | ControlsView(control: .constant(ControlViewModel())) 94 | } 95 | #endif 96 | -------------------------------------------------------------------------------- /Sources/CurtainRaiser/Examples/ExampleGestureView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright © nthState Ltd 2023. All rights reserved. 3 | // 4 | 5 | import SwiftUI 6 | 7 | private struct ExampleGestureView { 8 | @State private var control = ControlViewModel() 9 | } 10 | 11 | extension ExampleGestureView: View { 12 | 13 | var body: some View { 14 | VStack { 15 | 16 | ZStack(alignment: .center) { 17 | backgroundView 18 | foregroundView 19 | .gesture( 20 | DragGesture() 21 | .onChanged { gesture in 22 | control.offset = CGPoint(x: (gesture.location.x / 300), 23 | y: 1.0 - (gesture.location.y / 300)) 24 | } 25 | .onEnded { _ in 26 | withAnimation(.spring()) { 27 | control.offset = CGPoint(x: 0.5, y: 0) 28 | } 29 | } 30 | ) 31 | .curtainRaiser(sections: control.sections, 32 | maxShadow: control.maxShadow, 33 | pleatHeight: control.pleatHeight, 34 | lift: control.lift, 35 | offset: control.offset, 36 | enabled: control.enable) 37 | } 38 | 39 | ControlsView(control: $control) 40 | } 41 | } 42 | 43 | private var foregroundView: some View { 44 | ZStack { 45 | Text("Hello") 46 | .font(.headline) 47 | 48 | AnimatingCircle() 49 | } 50 | // fix this ControlsView(control: $control) 51 | .frame(width: 300, height: 300) 52 | .background( 53 | LinearGradient(gradient: Gradient(colors: [.green, .orange]), startPoint: .top, endPoint: .bottom) 54 | ) 55 | } 56 | 57 | private var backgroundView: some View { 58 | Rectangle() 59 | .fill(Color.purple) 60 | .frame(width: 300, height: 300) 61 | } 62 | } 63 | 64 | #if DEBUG 65 | #Preview("Example Gesture View") { 66 | ExampleGestureView() 67 | } 68 | #endif 69 | -------------------------------------------------------------------------------- /Sources/CurtainRaiser/Examples/ExampleView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright © nthState Ltd 2023. All rights reserved. 3 | // 4 | 5 | import AVKit 6 | import SwiftUI 7 | 8 | private struct ExampleView { 9 | @State private var control = ControlViewModel() 10 | } 11 | 12 | extension ExampleView: View { 13 | 14 | public var body: some View { 15 | VStack { 16 | 17 | ZStack { 18 | backgroundView 19 | foregroundView 20 | .curtainRaiser(sections: control.sections, 21 | maxShadow: control.maxShadow, 22 | pleatHeight: control.pleatHeight, 23 | lift: control.lift, 24 | offset: control.offset, 25 | enabled: control.enable) 26 | } 27 | 28 | ControlsView(control: $control) 29 | } 30 | } 31 | 32 | private var foregroundView: some View { 33 | ZStack { 34 | Text("Hello") 35 | .font(.headline) 36 | 37 | AnimatingCircle() 38 | } 39 | .frame(width: 300, height: 300) 40 | .background( 41 | LinearGradient(gradient: Gradient(colors: [.green, .orange]), startPoint: .top, endPoint: .bottom) 42 | ) 43 | } 44 | 45 | private var backgroundView: some View { 46 | Rectangle() 47 | .fill(Color.purple) 48 | .frame(width: 300, height: 300) 49 | } 50 | 51 | } 52 | 53 | #if DEBUG 54 | #Preview("Example View") { 55 | ExampleView() 56 | } 57 | #endif 58 | -------------------------------------------------------------------------------- /Sources/CurtainRaiser/Extensions/Comparable+.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright © nthState Ltd 2023. All rights reserved. 3 | // 4 | 5 | import Foundation 6 | 7 | internal extension Comparable { 8 | func clamped(to limits: ClosedRange<Self>) -> Self { 9 | return min(max(self, limits.lowerBound), limits.upperBound) 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Sources/CurtainRaiser/Resources/en.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "control.offset %lf" = "Offset %l.3f"; 2 | "control.sections %lld" = "Sections %lld"; 3 | "control.maxShadow %f" = "Max Shadow %.2f"; 4 | "control.pleatHeight %f" = "Pleat Height %.2f"; 5 | "control.lift %f" = "Lift %.2f"; 6 | "control.shaderEnabled %@" = "Shader Enabled %@"; 7 | -------------------------------------------------------------------------------- /Sources/CurtainRaiser/Shaders/LayerShader.metal: -------------------------------------------------------------------------------- 1 | // 2 | // Adapted from https://www.shadertoy.com/user/mrboggieman 3 | // 4 | 5 | #include <metal_stdlib> 6 | #include <SwiftUI/SwiftUI_Metal.h> 7 | #include "Shared.metal" 8 | using namespace metal; 9 | 10 | [[ stitchable ]] half4 layerShader(float2 position, 11 | SwiftUI::Layer layer, 12 | device const float *data, 13 | int count, 14 | float4 viewPort) { 15 | 16 | 17 | // MARK: Convert data in array to properties 18 | 19 | const float sections = data[0]; 20 | const float2 offset = float2(data[1], data[2]); 21 | const float maxShadow = data[3]; 22 | const float pleatHeight = data[4]; 23 | const float grabAmount = data[5]; 24 | const float2 viewSize = float2(viewPort.z, viewPort.w); 25 | const float TWO_PI = 2 * M_PI_F; 26 | 27 | // MARK: Conversion 28 | 29 | float2 iMouse = float2(lerp(0, viewSize.x, offset.x), 30 | lerp(0, viewSize.y, offset.y)); 31 | 32 | float2 grabPos = iMouse / viewSize; 33 | 34 | float xNormalized = (position.x / viewSize.x) * 2.0 - 1.0; 35 | float yNormalized = 1.0 - (position.y / viewSize.y) * 2.0; 36 | 37 | float normalizedGrabPosX = (iMouse.x / viewSize.x) * 2.0 - 1.0; 38 | 39 | float2 uv = float2(xNormalized, yNormalized); 40 | 41 | // MARK: Main 42 | 43 | uv.y = (uv.y - grabPos.y) / (1.0 - grabPos.y); 44 | 45 | uv.y += abs(uv.x - normalizedGrabPosX) * (1.0 - uv.y) * grabAmount * grabPos.y; 46 | 47 | float pleatZ = (cos(uv.y * TWO_PI * sections) + 1.0) / 2.0; 48 | 49 | uv.x += pleatZ * pleatHeight * grabPos.y / viewSize.x; 50 | 51 | if (uv.x < -1.0 || uv.y < -1.0 || uv.x > 1.0 || uv.y > 1.0) { 52 | return half4(0.0); 53 | } 54 | 55 | float3 shadow = pleatZ * maxShadow * clamp(grabPos.y * 2.0, 0.0, 1.0); 56 | shadow = mix(shadow, float3(maxShadow), grabPos.y); 57 | 58 | float xPosition = ((uv.x + 1.0) / 2.0) * viewSize.x; 59 | float yPosition = ((1.0 - uv.y) / 2.0) * viewSize.y; 60 | uv = float2(xPosition, yPosition); 61 | 62 | half4 color = layer.sample(uv); 63 | color -= half4(shadow.x, shadow.y, shadow.z, 0.0); 64 | 65 | return color; 66 | } 67 | -------------------------------------------------------------------------------- /Sources/CurtainRaiser/Shaders/Shared.metal: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright © nthState Ltd 2023. All rights reserved. 3 | // 4 | 5 | #ifndef UTILS_METAL 6 | #define UTILS_METAL 7 | 8 | #include <metal_stdlib> 9 | #include <SwiftUI/SwiftUI_Metal.h> 10 | using namespace metal; 11 | 12 | inline float lerp(float a, float b, float t) { 13 | return (1.0 - t) * a + t * b; 14 | } 15 | 16 | #endif 17 | -------------------------------------------------------------------------------- /Tests/CurtainRaiserTests/CurtainRaiserTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright © nthState Ltd 2023. All rights reserved. 3 | // 4 | 5 | import XCTest 6 | @testable import CurtainRaiser 7 | 8 | final class CurtainRaiserTests: XCTestCase { 9 | 10 | func test_clamp_lowerbounds() throws { 11 | 12 | let value = -1.0 13 | 14 | let result = value.clamped(to: 0...1) 15 | 16 | XCTAssertEqual(result, 0, "Value should be clamped to 0") 17 | } 18 | 19 | func test_clamp_upperbounds() throws { 20 | 21 | let value = 2.0 22 | 23 | let result = value.clamped(to: 0...1) 24 | 25 | XCTAssertEqual(result, 1, "Value should be clamped to 1") 26 | } 27 | 28 | func test_clamp_midbounds() throws { 29 | 30 | let value = 0.5 31 | 32 | let result = value.clamped(to: 0...1) 33 | 34 | XCTAssertEqual(result, 0.5, "Value should be clamped to 0.5") 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /docs/css/documentation-topic~topic.b6287bcf.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * This source file is part of the Swift.org open source project 3 | * 4 | * Copyright (c) 2021 Apple Inc. and the Swift project authors 5 | * Licensed under Apache License v2.0 with Runtime Library Exception 6 | * 7 | * See https://swift.org/LICENSE.txt for license information 8 | * See https://swift.org/CONTRIBUTORS.txt for Swift project authors 9 | */.generic-modal[data-v-795f7b59]{position:fixed;top:0;left:0;right:0;bottom:0;margin:0;z-index:11000;display:flex;align-items:center;justify-content:center;flex-wrap:wrap;background:none;overflow:auto}.modal-fullscreen[data-v-795f7b59]{align-items:stretch}.modal-fullscreen .container[data-v-795f7b59]{margin:0;flex:1;width:100%;height:100%;padding-top:env(safe-area-inset-top);padding-right:env(safe-area-inset-right);padding-bottom:env(safe-area-inset-bottom);padding-left:env(safe-area-inset-left)}.modal-standard[data-v-795f7b59]{padding:20px}.modal-standard .container[data-v-795f7b59]{padding:60px;border-radius:var(--border-radius,4px)}@media screen{[data-color-scheme=dark] .modal-standard .container[data-v-795f7b59]{background:#1d1d1f}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .modal-standard .container[data-v-795f7b59]{background:#1d1d1f}}@media only screen and (max-width:735px){.modal-standard[data-v-795f7b59]{padding:0;align-items:stretch}.modal-standard .container[data-v-795f7b59]{margin:20px 0 0;padding:50px 30px;flex:1;width:100%;border-bottom-left-radius:0;border-bottom-right-radius:0}}.backdrop[data-v-795f7b59]{overflow:auto;background:var(--backdrop-background,rgba(0,0,0,.4));-webkit-overflow-scrolling:touch;width:100%;height:100%;position:fixed}.container[data-v-795f7b59]{margin-left:auto;margin-right:auto;width:980px;background:var(--colors-generic-modal-background,var(--color-generic-modal-background));z-index:1;position:relative;overflow:auto;max-width:100%}@media only screen and (max-width:1250px){.container[data-v-795f7b59]{width:692px}}@media only screen and (max-width:735px){.container[data-v-795f7b59]{width:87.5%}}@media only screen and (max-width:320px){.container[data-v-795f7b59]{width:215px}}.close[data-v-795f7b59]{position:absolute;z-index:9999;top:22px;left:22px;width:17px;height:17px;color:#666;cursor:pointer;background:none;border:0;display:flex;align-items:center}.close .close-icon[data-v-795f7b59]{fill:currentColor;width:100%;height:100%}.theme-dark .container[data-v-795f7b59]{background:#000}.theme-dark .container .close[data-v-795f7b59]{color:#b0b0b0}.theme-code .container[data-v-795f7b59]{background-color:var(--code-background,var(--color-code-background))} -------------------------------------------------------------------------------- /docs/data/documentation/curtainraiser.json: -------------------------------------------------------------------------------- 1 | {"primaryContentSections":[{"kind":"content","content":[{"anchor":"Overview","level":2,"type":"heading","text":"Overview"},{"type":"paragraph","inlineContent":[{"type":"text","text":"Curtain Raiser uses SwiftUI’s "},{"type":"codeVoice","code":".layerEffect"},{"type":"text","text":" and a shader to create the illusion of a view folding."}]},{"anchor":"Featured","level":3,"type":"heading","text":"Featured"},{"type":"links","style":"detailedGrid","items":["doc:\/\/CurtainRaiser\/tutorials\/CurtainRaiser\/Adding-Curtain-Raiser-to-your-project","doc:\/\/CurtainRaiser\/tutorials\/CurtainRaiser\/Getting-Started-with-Curtain-Raiser"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/curtainraiser"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Curtain Raiser is an iOS17 View Modifier to animate a foreground view to reveal the background view beneath"}],"kind":"symbol","metadata":{"roleHeading":"Framework","externalID":"CurtainRaiser","title":"CurtainRaiser","symbolKind":"module","role":"collection","modules":[{"name":"CurtainRaiser"}]},"hierarchy":{"paths":[[]]},"topicSections":[{"title":"Structures","identifiers":["doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser"]},{"title":"Extended Modules","identifiers":["doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/SwiftUI"]}],"references":{"doc://CurtainRaiser/documentation/CurtainRaiser/CurtainRaiser":{"role":"symbol","title":"CurtainRaiser","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"CurtainRaiser"}],"abstract":[],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"CurtainRaiser"}],"url":"\/documentation\/curtainraiser\/curtainraiser"},"doc://CurtainRaiser/documentation/CurtainRaiser":{"role":"collection","title":"CurtainRaiser","abstract":[{"type":"text","text":"Curtain Raiser is an iOS17 View Modifier to animate a foreground view to reveal the background view beneath"}],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser","kind":"symbol","type":"topic","url":"\/documentation\/curtainraiser"},"doc://CurtainRaiser/tutorials/CurtainRaiser/Getting-Started-with-Curtain-Raiser":{"role":"project","title":"Getting Started with Curtain Raiser","estimatedTime":"5min","abstract":[{"type":"text","text":"Curtain Raiser is a faux effect that makes it look like your view is scrunching up much like"},{"type":"text","text":" "},{"type":"text","text":"a curtain does in real life."}],"identifier":"doc:\/\/CurtainRaiser\/tutorials\/CurtainRaiser\/Getting-Started-with-Curtain-Raiser","kind":"project","type":"topic","url":"\/tutorials\/curtainraiser\/getting-started-with-curtain-raiser"},"doc://CurtainRaiser/documentation/CurtainRaiser/SwiftUI":{"role":"collection","title":"SwiftUI","abstract":[],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/SwiftUI","kind":"symbol","type":"topic","url":"\/documentation\/curtainraiser\/swiftui"},"doc://CurtainRaiser/tutorials/CurtainRaiser/Adding-Curtain-Raiser-to-your-project":{"role":"project","title":"Add Curtain Raiser to your Project","estimatedTime":"1min","abstract":[{"type":"text","text":"CurtainRaiser is delivered as a Swift Package, whether you want to include in an App, or Swift Package yourself, it’s straight forward to do."}],"identifier":"doc:\/\/CurtainRaiser\/tutorials\/CurtainRaiser\/Adding-Curtain-Raiser-to-your-project","kind":"project","type":"topic","url":"\/tutorials\/curtainraiser\/adding-curtain-raiser-to-your-project"}}} -------------------------------------------------------------------------------- /docs/data/documentation/curtainraiser/curtainraiser/animatabledata.json: -------------------------------------------------------------------------------- 1 | {"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"animatableData"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"AnimatablePair","preciseIdentifier":"s:7SwiftUI14AnimatablePairV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"CGFloat","preciseIdentifier":"s:14CoreFoundation7CGFloatV"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"CGFloat","preciseIdentifier":"s:14CoreFoundation7CGFloatV"},{"kind":"text","text":"> { "},{"kind":"keyword","text":"get"},{"kind":"text","text":" "},{"kind":"keyword","text":"set"},{"kind":"text","text":" }"}],"languages":["swift"],"platforms":["macOS"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/curtainraiser\/curtainraiser\/animatabledata"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser\/animatableData","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Inherited from "},{"type":"codeVoice","code":"Animatable.animatableData"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"animatableData"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"AnimatablePair","preciseIdentifier":"s:7SwiftUI14AnimatablePairV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"CGFloat","preciseIdentifier":"s:14CoreFoundation7CGFloatV"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"CGFloat","preciseIdentifier":"s:14CoreFoundation7CGFloatV"},{"kind":"text","text":">"}],"title":"animatableData","roleHeading":"Instance Property","role":"symbol","symbolKind":"property","externalID":"s:13CurtainRaiserAAV14animatableData7SwiftUI14AnimatablePairVy14CoreFoundation7CGFloatVAIGvp","modules":[{"name":"CurtainRaiser"}]},"hierarchy":{"paths":[["doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser","doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser"]]},"references":{"doc://CurtainRaiser/documentation/CurtainRaiser/CurtainRaiser/animatableData":{"role":"symbol","title":"animatableData","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"animatableData"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"AnimatablePair","preciseIdentifier":"s:7SwiftUI14AnimatablePairV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"CGFloat","preciseIdentifier":"s:14CoreFoundation7CGFloatV"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"CGFloat","preciseIdentifier":"s:14CoreFoundation7CGFloatV"},{"kind":"text","text":">"}],"abstract":[],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser\/animatableData","kind":"symbol","type":"topic","url":"\/documentation\/curtainraiser\/curtainraiser\/animatabledata"},"doc://CurtainRaiser/documentation/CurtainRaiser":{"role":"collection","title":"CurtainRaiser","abstract":[{"type":"text","text":"Curtain Raiser is an iOS17 View Modifier to animate a foreground view to reveal the background view beneath"}],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser","kind":"symbol","type":"topic","url":"\/documentation\/curtainraiser"},"doc://CurtainRaiser/documentation/CurtainRaiser/CurtainRaiser":{"role":"symbol","title":"CurtainRaiser","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"CurtainRaiser"}],"abstract":[],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"CurtainRaiser"}],"url":"\/documentation\/curtainraiser\/curtainraiser"}}} -------------------------------------------------------------------------------- /docs/data/documentation/curtainraiser/curtainraiser/animation(_:).json: -------------------------------------------------------------------------------- 1 | {"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"animation"},{"kind":"text","text":"("},{"kind":"externalParam","text":"_"},{"kind":"text","text":" "},{"kind":"internalParam","text":"animation"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Animation","preciseIdentifier":"s:7SwiftUI9AnimationV"},{"kind":"text","text":"?) -> "},{"kind":"keyword","text":"some"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"ViewModifier","preciseIdentifier":"s:7SwiftUI12ViewModifierP"},{"kind":"text","text":"\n"}],"languages":["swift"],"platforms":["macOS"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/curtainraiser\/curtainraiser\/animation(_:)"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser\/animation(_:)","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Inherited from "},{"type":"codeVoice","code":"ViewModifier.animation(_:)"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"modules":[{"name":"CurtainRaiser","relatedModules":["SwiftUI"]}],"role":"symbol","title":"animation(_:)","roleHeading":"Instance Method","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"animation"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Animation","preciseIdentifier":"s:7SwiftUI9AnimationV"},{"kind":"text","text":"?) -> "},{"kind":"keyword","text":"some"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"ViewModifier","preciseIdentifier":"s:7SwiftUI12ViewModifierP"}],"symbolKind":"method","externalID":"s:7SwiftUI12ViewModifierPAAE9animationyQrAA9AnimationVSgF::SYNTHESIZED::s:13CurtainRaiserAAV","extendedModule":"SwiftUI","platforms":[{"beta":false,"unavailable":false,"name":"iOS","introducedAt":"13.0","deprecated":false},{"beta":false,"unavailable":false,"name":"macOS","introducedAt":"10.15","deprecated":false},{"beta":false,"unavailable":false,"name":"tvOS","introducedAt":"13.0","deprecated":false},{"beta":false,"unavailable":false,"name":"watchOS","introducedAt":"6.0","deprecated":false}]},"hierarchy":{"paths":[["doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser","doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser","doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser\/ViewModifier-Implementations"]]},"references":{"doc://CurtainRaiser/documentation/CurtainRaiser/CurtainRaiser/animation(_:)":{"role":"symbol","title":"animation(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"animation"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Animation","preciseIdentifier":"s:7SwiftUI9AnimationV"},{"kind":"text","text":"?) -> "},{"kind":"keyword","text":"some"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"ViewModifier","preciseIdentifier":"s:7SwiftUI12ViewModifierP"}],"abstract":[],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser\/animation(_:)","kind":"symbol","type":"topic","url":"\/documentation\/curtainraiser\/curtainraiser\/animation(_:)"},"doc://CurtainRaiser/documentation/CurtainRaiser/CurtainRaiser/ViewModifier-Implementations":{"role":"collectionGroup","title":"ViewModifier Implementations","abstract":[],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser\/ViewModifier-Implementations","kind":"article","type":"topic","url":"\/documentation\/curtainraiser\/curtainraiser\/viewmodifier-implementations"},"doc://CurtainRaiser/documentation/CurtainRaiser":{"role":"collection","title":"CurtainRaiser","abstract":[{"type":"text","text":"Curtain Raiser is an iOS17 View Modifier to animate a foreground view to reveal the background view beneath"}],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser","kind":"symbol","type":"topic","url":"\/documentation\/curtainraiser"},"doc://CurtainRaiser/documentation/CurtainRaiser/CurtainRaiser":{"role":"symbol","title":"CurtainRaiser","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"CurtainRaiser"}],"abstract":[],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"CurtainRaiser"}],"url":"\/documentation\/curtainraiser\/curtainraiser"}}} -------------------------------------------------------------------------------- /docs/data/documentation/curtainraiser/curtainraiser/body(content:).json: -------------------------------------------------------------------------------- 1 | {"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"body"},{"kind":"text","text":"("},{"kind":"externalParam","text":"content"},{"kind":"text","text":": "},{"kind":"typeIdentifier","identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser","preciseIdentifier":"s:13CurtainRaiserAAV","text":"CurtainRaiser"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"V"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Content"},{"kind":"text","text":") -> "},{"kind":"keyword","text":"some"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"View","preciseIdentifier":"s:7SwiftUI4ViewP"},{"kind":"text","text":"\n"}],"languages":["swift"],"platforms":["macOS"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/curtainraiser\/curtainraiser\/body(content:)"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser\/body(content:)","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Inherited from "},{"type":"codeVoice","code":"ViewModifier.body(content:)"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"body"},{"kind":"text","text":"("},{"kind":"externalParam","text":"content"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"CurtainRaiser","preciseIdentifier":"s:13CurtainRaiserAAV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"V"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Content"},{"kind":"text","text":") -> "},{"kind":"keyword","text":"some"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"View","preciseIdentifier":"s:7SwiftUI4ViewP"}],"title":"body(content:)","roleHeading":"Instance Method","role":"symbol","symbolKind":"method","externalID":"s:13CurtainRaiserAAV4body7contentQr7SwiftUI21_ViewModifier_ContentVyAByxGG_tF","modules":[{"name":"CurtainRaiser"}]},"hierarchy":{"paths":[["doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser","doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser"]]},"references":{"doc://CurtainRaiser/documentation/CurtainRaiser/CurtainRaiser":{"role":"symbol","title":"CurtainRaiser","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"CurtainRaiser"}],"abstract":[],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"CurtainRaiser"}],"url":"\/documentation\/curtainraiser\/curtainraiser"},"doc://CurtainRaiser/documentation/CurtainRaiser/CurtainRaiser/body(content:)":{"role":"symbol","title":"body(content:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"body"},{"kind":"text","text":"("},{"kind":"externalParam","text":"content"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"CurtainRaiser","preciseIdentifier":"s:13CurtainRaiserAAV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"V"},{"kind":"text","text":">."},{"kind":"typeIdentifier","text":"Content"},{"kind":"text","text":") -> "},{"kind":"keyword","text":"some"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"View","preciseIdentifier":"s:7SwiftUI4ViewP"}],"abstract":[],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser\/body(content:)","kind":"symbol","type":"topic","url":"\/documentation\/curtainraiser\/curtainraiser\/body(content:)"},"doc://CurtainRaiser/documentation/CurtainRaiser":{"role":"collection","title":"CurtainRaiser","abstract":[{"type":"text","text":"Curtain Raiser is an iOS17 View Modifier to animate a foreground view to reveal the background view beneath"}],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser","kind":"symbol","type":"topic","url":"\/documentation\/curtainraiser"}}} -------------------------------------------------------------------------------- /docs/data/documentation/curtainraiser/curtainraiser/concat(_:).json: -------------------------------------------------------------------------------- 1 | {"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"concat"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"T"},{"kind":"text","text":">("},{"kind":"externalParam","text":"_"},{"kind":"text","text":" "},{"kind":"internalParam","text":"modifier"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"T"},{"kind":"text","text":") -> "},{"kind":"typeIdentifier","text":"ModifiedContent","preciseIdentifier":"s:7SwiftUI15ModifiedContentV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Self"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"T"},{"kind":"text","text":">"}],"languages":["swift"],"platforms":["macOS"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/curtainraiser\/curtainraiser\/concat(_:)"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser\/concat(_:)","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Inherited from "},{"type":"codeVoice","code":"ViewModifier.concat(_:)"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"modules":[{"name":"CurtainRaiser","relatedModules":["SwiftUI"]}],"role":"symbol","title":"concat(_:)","roleHeading":"Instance Method","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"concat"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"T"},{"kind":"text","text":">("},{"kind":"typeIdentifier","text":"T"},{"kind":"text","text":") -> "},{"kind":"typeIdentifier","text":"ModifiedContent","preciseIdentifier":"s:7SwiftUI15ModifiedContentV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Self"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"T"},{"kind":"text","text":">"}],"symbolKind":"method","externalID":"s:7SwiftUI12ViewModifierPAAE6concatyAA15ModifiedContentVyxqd__Gqd__lF::SYNTHESIZED::s:13CurtainRaiserAAV","extendedModule":"SwiftUI","platforms":[{"beta":false,"unavailable":false,"name":"iOS","introducedAt":"13.0","deprecated":false},{"beta":false,"unavailable":false,"name":"macOS","introducedAt":"10.15","deprecated":false},{"beta":false,"unavailable":false,"name":"tvOS","introducedAt":"13.0","deprecated":false},{"beta":false,"unavailable":false,"name":"watchOS","introducedAt":"6.0","deprecated":false}]},"hierarchy":{"paths":[["doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser","doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser","doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser\/ViewModifier-Implementations"]]},"references":{"doc://CurtainRaiser/documentation/CurtainRaiser/CurtainRaiser/ViewModifier-Implementations":{"role":"collectionGroup","title":"ViewModifier Implementations","abstract":[],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser\/ViewModifier-Implementations","kind":"article","type":"topic","url":"\/documentation\/curtainraiser\/curtainraiser\/viewmodifier-implementations"},"doc://CurtainRaiser/documentation/CurtainRaiser":{"role":"collection","title":"CurtainRaiser","abstract":[{"type":"text","text":"Curtain Raiser is an iOS17 View Modifier to animate a foreground view to reveal the background view beneath"}],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser","kind":"symbol","type":"topic","url":"\/documentation\/curtainraiser"},"doc://CurtainRaiser/documentation/CurtainRaiser/CurtainRaiser":{"role":"symbol","title":"CurtainRaiser","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"CurtainRaiser"}],"abstract":[],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"CurtainRaiser"}],"url":"\/documentation\/curtainraiser\/curtainraiser"},"doc://CurtainRaiser/documentation/CurtainRaiser/CurtainRaiser/concat(_:)":{"role":"symbol","title":"concat(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"concat"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"T"},{"kind":"text","text":">("},{"kind":"typeIdentifier","text":"T"},{"kind":"text","text":") -> "},{"kind":"typeIdentifier","text":"ModifiedContent","preciseIdentifier":"s:7SwiftUI15ModifiedContentV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Self"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"T"},{"kind":"text","text":">"}],"abstract":[],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser\/concat(_:)","kind":"symbol","type":"topic","url":"\/documentation\/curtainraiser\/curtainraiser\/concat(_:)"}}} -------------------------------------------------------------------------------- /docs/data/documentation/curtainraiser/curtainraiser/transaction(_:).json: -------------------------------------------------------------------------------- 1 | {"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"transaction"},{"kind":"text","text":"("},{"kind":"externalParam","text":"_"},{"kind":"text","text":" "},{"kind":"internalParam","text":"transform"},{"kind":"text","text":": "},{"kind":"keyword","text":"@escaping"},{"kind":"text","text":" ("},{"kind":"keyword","text":"inout"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"Transaction","preciseIdentifier":"s:7SwiftUI11TransactionV"},{"kind":"text","text":") -> "},{"kind":"typeIdentifier","text":"Void","preciseIdentifier":"s:s4Voida"},{"kind":"text","text":") -> "},{"kind":"keyword","text":"some"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"ViewModifier","preciseIdentifier":"s:7SwiftUI12ViewModifierP"},{"kind":"text","text":"\n"}],"languages":["swift"],"platforms":["macOS"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/curtainraiser\/curtainraiser\/transaction(_:)"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser\/transaction(_:)","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"Inherited from "},{"type":"codeVoice","code":"ViewModifier.transaction(_:)"},{"type":"text","text":"."}],"kind":"symbol","metadata":{"modules":[{"name":"CurtainRaiser","relatedModules":["SwiftUI"]}],"role":"symbol","title":"transaction(_:)","roleHeading":"Instance Method","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"transaction"},{"kind":"text","text":"(("},{"kind":"keyword","text":"inout"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"Transaction","preciseIdentifier":"s:7SwiftUI11TransactionV"},{"kind":"text","text":") -> "},{"kind":"typeIdentifier","text":"Void","preciseIdentifier":"s:s4Voida"},{"kind":"text","text":") -> "},{"kind":"keyword","text":"some"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"ViewModifier","preciseIdentifier":"s:7SwiftUI12ViewModifierP"}],"symbolKind":"method","externalID":"s:7SwiftUI12ViewModifierPAAE11transactionyQryAA11TransactionVzcF::SYNTHESIZED::s:13CurtainRaiserAAV","extendedModule":"SwiftUI","platforms":[{"beta":false,"unavailable":false,"name":"iOS","introducedAt":"13.0","deprecated":false},{"beta":false,"unavailable":false,"name":"macOS","introducedAt":"10.15","deprecated":false},{"beta":false,"unavailable":false,"name":"tvOS","introducedAt":"13.0","deprecated":false},{"beta":false,"unavailable":false,"name":"watchOS","introducedAt":"6.0","deprecated":false}]},"hierarchy":{"paths":[["doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser","doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser","doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser\/ViewModifier-Implementations"]]},"references":{"doc://CurtainRaiser/documentation/CurtainRaiser/CurtainRaiser":{"role":"symbol","title":"CurtainRaiser","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"CurtainRaiser"}],"abstract":[],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"CurtainRaiser"}],"url":"\/documentation\/curtainraiser\/curtainraiser"},"doc://CurtainRaiser/documentation/CurtainRaiser/CurtainRaiser/ViewModifier-Implementations":{"role":"collectionGroup","title":"ViewModifier Implementations","abstract":[],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser\/ViewModifier-Implementations","kind":"article","type":"topic","url":"\/documentation\/curtainraiser\/curtainraiser\/viewmodifier-implementations"},"doc://CurtainRaiser/documentation/CurtainRaiser/CurtainRaiser/transaction(_:)":{"role":"symbol","title":"transaction(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"transaction"},{"kind":"text","text":"(("},{"kind":"keyword","text":"inout"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"Transaction","preciseIdentifier":"s:7SwiftUI11TransactionV"},{"kind":"text","text":") -> "},{"kind":"typeIdentifier","text":"Void","preciseIdentifier":"s:s4Voida"},{"kind":"text","text":") -> "},{"kind":"keyword","text":"some"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"ViewModifier","preciseIdentifier":"s:7SwiftUI12ViewModifierP"}],"abstract":[],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser\/transaction(_:)","kind":"symbol","type":"topic","url":"\/documentation\/curtainraiser\/curtainraiser\/transaction(_:)"},"doc://CurtainRaiser/documentation/CurtainRaiser":{"role":"collection","title":"CurtainRaiser","abstract":[{"type":"text","text":"Curtain Raiser is an iOS17 View Modifier to animate a foreground view to reveal the background view beneath"}],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser","kind":"symbol","type":"topic","url":"\/documentation\/curtainraiser"}}} -------------------------------------------------------------------------------- /docs/data/documentation/curtainraiser/curtainraiser/viewmodifier-implementations.json: -------------------------------------------------------------------------------- 1 | {"variants":[{"paths":["\/documentation\/curtainraiser\/curtainraiser\/viewmodifier-implementations"],"traits":[{"interfaceLanguage":"swift"}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"identifier":{"url":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser\/ViewModifier-Implementations","interfaceLanguage":"swift"},"topicSections":[{"title":"Instance Methods","identifiers":["doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser\/animation(_:)","doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser\/concat(_:)","doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser\/transaction(_:)"],"generated":true}],"kind":"article","metadata":{"modules":[{"name":"CurtainRaiser"}],"role":"collectionGroup","title":"ViewModifier Implementations"},"hierarchy":{"paths":[["doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser","doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser"]]},"references":{"doc://CurtainRaiser/documentation/CurtainRaiser/CurtainRaiser":{"role":"symbol","title":"CurtainRaiser","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"CurtainRaiser"}],"abstract":[],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"CurtainRaiser"}],"url":"\/documentation\/curtainraiser\/curtainraiser"},"doc://CurtainRaiser/documentation/CurtainRaiser/CurtainRaiser/animation(_:)":{"role":"symbol","title":"animation(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"animation"},{"kind":"text","text":"("},{"kind":"typeIdentifier","text":"Animation","preciseIdentifier":"s:7SwiftUI9AnimationV"},{"kind":"text","text":"?) -> "},{"kind":"keyword","text":"some"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"ViewModifier","preciseIdentifier":"s:7SwiftUI12ViewModifierP"}],"abstract":[],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser\/animation(_:)","kind":"symbol","type":"topic","url":"\/documentation\/curtainraiser\/curtainraiser\/animation(_:)"},"doc://CurtainRaiser/documentation/CurtainRaiser/CurtainRaiser/transaction(_:)":{"role":"symbol","title":"transaction(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"transaction"},{"kind":"text","text":"(("},{"kind":"keyword","text":"inout"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"Transaction","preciseIdentifier":"s:7SwiftUI11TransactionV"},{"kind":"text","text":") -> "},{"kind":"typeIdentifier","text":"Void","preciseIdentifier":"s:s4Voida"},{"kind":"text","text":") -> "},{"kind":"keyword","text":"some"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"ViewModifier","preciseIdentifier":"s:7SwiftUI12ViewModifierP"}],"abstract":[],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser\/transaction(_:)","kind":"symbol","type":"topic","url":"\/documentation\/curtainraiser\/curtainraiser\/transaction(_:)"},"doc://CurtainRaiser/documentation/CurtainRaiser":{"role":"collection","title":"CurtainRaiser","abstract":[{"type":"text","text":"Curtain Raiser is an iOS17 View Modifier to animate a foreground view to reveal the background view beneath"}],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser","kind":"symbol","type":"topic","url":"\/documentation\/curtainraiser"},"doc://CurtainRaiser/documentation/CurtainRaiser/CurtainRaiser/concat(_:)":{"role":"symbol","title":"concat(_:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"concat"},{"kind":"text","text":"<"},{"kind":"genericParameter","text":"T"},{"kind":"text","text":">("},{"kind":"typeIdentifier","text":"T"},{"kind":"text","text":") -> "},{"kind":"typeIdentifier","text":"ModifiedContent","preciseIdentifier":"s:7SwiftUI15ModifiedContentV"},{"kind":"text","text":"<"},{"kind":"typeIdentifier","text":"Self"},{"kind":"text","text":", "},{"kind":"typeIdentifier","text":"T"},{"kind":"text","text":">"}],"abstract":[],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/CurtainRaiser\/concat(_:)","kind":"symbol","type":"topic","url":"\/documentation\/curtainraiser\/curtainraiser\/concat(_:)"}}} -------------------------------------------------------------------------------- /docs/data/documentation/curtainraiser/swiftui.json: -------------------------------------------------------------------------------- 1 | {"variants":[{"paths":["\/documentation\/curtainraiser\/swiftui"],"traits":[{"interfaceLanguage":"swift"}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"identifier":{"url":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/SwiftUI","interfaceLanguage":"swift"},"topicSections":[{"title":"Extended Protocols","identifiers":["doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/SwiftUI\/View"]}],"kind":"symbol","metadata":{"roleHeading":"Extended Module","externalID":"s:m:s:e:s:7SwiftUI4ViewP13CurtainRaiserE07curtainE08sections9maxShadow11pleatHeight4lift6offset7enabledQrSi_S3fSo7CGPointVSbtF","title":"SwiftUI","symbolKind":"extension","role":"collection","modules":[{"name":"CurtainRaiser"}]},"hierarchy":{"paths":[["doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser"]]},"references":{"doc://CurtainRaiser/documentation/CurtainRaiser/SwiftUI":{"role":"collection","title":"SwiftUI","abstract":[],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/SwiftUI","kind":"symbol","type":"topic","url":"\/documentation\/curtainraiser\/swiftui"},"doc://CurtainRaiser/documentation/CurtainRaiser":{"role":"collection","title":"CurtainRaiser","abstract":[{"type":"text","text":"Curtain Raiser is an iOS17 View Modifier to animate a foreground view to reveal the background view beneath"}],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser","kind":"symbol","type":"topic","url":"\/documentation\/curtainraiser"},"doc://CurtainRaiser/documentation/CurtainRaiser/SwiftUI/View":{"role":"symbol","title":"View","fragments":[{"kind":"keyword","text":"extension"},{"kind":"text","text":" "},{"kind":"identifier","text":"View","preciseIdentifier":"s:7SwiftUI4ViewP"}],"abstract":[],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/SwiftUI\/View","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"View"}],"url":"\/documentation\/curtainraiser\/swiftui\/view"}}} -------------------------------------------------------------------------------- /docs/data/documentation/curtainraiser/swiftui/view.json: -------------------------------------------------------------------------------- 1 | {"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"extension"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"View","preciseIdentifier":"s:7SwiftUI4ViewP"}],"languages":["swift"],"platforms":["macOS"]}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"variants":[{"paths":["\/documentation\/curtainraiser\/swiftui\/view"],"traits":[{"interfaceLanguage":"swift"}]}],"identifier":{"url":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/SwiftUI\/View","interfaceLanguage":"swift"},"topicSections":[{"title":"Instance Methods","identifiers":["doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/SwiftUI\/View\/curtainRaiser(sections:maxShadow:pleatHeight:lift:offset:enabled:)"]}],"kind":"symbol","metadata":{"navigatorTitle":[{"kind":"identifier","text":"View"}],"role":"symbol","title":"View","roleHeading":"Extended Protocol","fragments":[{"kind":"keyword","text":"extension"},{"kind":"text","text":" "},{"kind":"identifier","text":"View","preciseIdentifier":"s:7SwiftUI4ViewP"}],"symbolKind":"extension","externalID":"s:e:s:7SwiftUI4ViewP13CurtainRaiserE07curtainE08sections9maxShadow11pleatHeight4lift6offset7enabledQrSi_S3fSo7CGPointVSbtF","extendedModule":"SwiftUI","modules":[{"name":"CurtainRaiser","relatedModules":["SwiftUI"]}]},"hierarchy":{"paths":[["doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser","doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/SwiftUI"]]},"references":{"doc://CurtainRaiser/documentation/CurtainRaiser/SwiftUI/View/curtainRaiser(sections:maxShadow:pleatHeight:lift:offset:enabled:)":{"role":"symbol","title":"curtainRaiser(sections:maxShadow:pleatHeight:lift:offset:enabled:)","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"curtainRaiser"},{"kind":"text","text":"("},{"kind":"externalParam","text":"sections"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Int","preciseIdentifier":"s:Si"},{"kind":"text","text":", "},{"kind":"externalParam","text":"maxShadow"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Float","preciseIdentifier":"s:Sf"},{"kind":"text","text":", "},{"kind":"externalParam","text":"pleatHeight"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Float","preciseIdentifier":"s:Sf"},{"kind":"text","text":", "},{"kind":"externalParam","text":"lift"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Float","preciseIdentifier":"s:Sf"},{"kind":"text","text":", "},{"kind":"externalParam","text":"offset"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"CGPoint","preciseIdentifier":"c:@S@CGPoint"},{"kind":"text","text":", "},{"kind":"externalParam","text":"enabled"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Bool","preciseIdentifier":"s:Sb"},{"kind":"text","text":") -> "},{"kind":"keyword","text":"some"},{"kind":"text","text":" "},{"kind":"typeIdentifier","text":"View","preciseIdentifier":"s:7SwiftUI4ViewP"}],"abstract":[{"type":"text","text":"Animate a foreground view over a background view"}],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/SwiftUI\/View\/curtainRaiser(sections:maxShadow:pleatHeight:lift:offset:enabled:)","kind":"symbol","type":"topic","url":"\/documentation\/curtainraiser\/swiftui\/view\/curtainraiser(sections:maxshadow:pleatheight:lift:offset:enabled:)"},"doc://CurtainRaiser/documentation/CurtainRaiser":{"role":"collection","title":"CurtainRaiser","abstract":[{"type":"text","text":"Curtain Raiser is an iOS17 View Modifier to animate a foreground view to reveal the background view beneath"}],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser","kind":"symbol","type":"topic","url":"\/documentation\/curtainraiser"},"doc://CurtainRaiser/documentation/CurtainRaiser/SwiftUI/View":{"role":"symbol","title":"View","fragments":[{"kind":"keyword","text":"extension"},{"kind":"text","text":" "},{"kind":"identifier","text":"View","preciseIdentifier":"s:7SwiftUI4ViewP"}],"abstract":[],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/SwiftUI\/View","kind":"symbol","type":"topic","navigatorTitle":[{"kind":"identifier","text":"View"}],"url":"\/documentation\/curtainraiser\/swiftui\/view"},"doc://CurtainRaiser/documentation/CurtainRaiser/SwiftUI":{"role":"collection","title":"SwiftUI","abstract":[],"identifier":"doc:\/\/CurtainRaiser\/documentation\/CurtainRaiser\/SwiftUI","kind":"symbol","type":"topic","url":"\/documentation\/curtainraiser\/swiftui"}}} -------------------------------------------------------------------------------- /docs/data/tutorials/tutorial-table-of-contents.json: -------------------------------------------------------------------------------- 1 | {"variants":[{"paths":["\/tutorials\/tutorial-table-of-contents"],"traits":[{"interfaceLanguage":"swift"}]}],"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[{"kind":"hero","title":"Introduction","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"How to get the most out of the Curtain Raiser View Modifier in iOS17"}]}],"action":{"overridingTitleInlineContent":[{"type":"text","text":"Get started"}],"isActive":true,"type":"reference","identifier":"doc:\/\/CurtainRaiser\/tutorials\/CurtainRaiser\/Adding-Curtain-Raiser-to-your-project","overridingTitle":"Get started"}},{"kind":"volume","content":[],"name":null,"image":null,"chapters":[{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"How to add Curtain Raiser to your App or Swift Package"}]}],"name":"Adding Curtain Raiser to your project","tutorials":["doc:\/\/CurtainRaiser\/tutorials\/CurtainRaiser\/Adding-Curtain-Raiser-to-your-project"],"image":"Chapter1_TOC.png"},{"content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"Configure parameters"}]}],"name":"Getting Started with Curtain Raiser","tutorials":["doc:\/\/CurtainRaiser\/tutorials\/CurtainRaiser\/Getting-Started-with-Curtain-Raiser"],"image":"Chapter2_TOC.png"}]}],"identifier":{"url":"doc:\/\/CurtainRaiser\/tutorials\/Tutorial-Table-of-Contents","interfaceLanguage":"swift"},"kind":"overview","metadata":{"role":"overview","title":"Introduction","categoryPathComponent":"Tutorial-Table-of-Contents","category":"Curtain Raiser Tutorials","estimatedTime":"6min"},"hierarchy":{"paths":[],"reference":"doc:\/\/CurtainRaiser\/tutorials\/Tutorial-Table-of-Contents"},"references":{"doc://CurtainRaiser/tutorials/CurtainRaiser/Getting-Started-with-Curtain-Raiser":{"role":"project","title":"Getting Started with Curtain Raiser","estimatedTime":"5min","abstract":[{"type":"text","text":"Curtain Raiser is a faux effect that makes it look like your view is scrunching up much like"},{"type":"text","text":" "},{"type":"text","text":"a curtain does in real life."}],"identifier":"doc:\/\/CurtainRaiser\/tutorials\/CurtainRaiser\/Getting-Started-with-Curtain-Raiser","kind":"project","type":"topic","url":"\/tutorials\/curtainraiser\/getting-started-with-curtain-raiser"},"Chapter1_TOC.png":{"alt":"accessible description","type":"image","identifier":"Chapter1_TOC.png","variants":[{"url":"\/images\/Chapter1_TOC.png","traits":["1x","light"]}]},"doc://CurtainRaiser/tutorials/Tutorial-Table-of-Contents":{"role":"overview","title":"Introduction","abstract":[{"type":"text","text":"How to get the most out of the Curtain Raiser View Modifier in iOS17"}],"identifier":"doc:\/\/CurtainRaiser\/tutorials\/Tutorial-Table-of-Contents","kind":"overview","type":"topic","url":"\/tutorials\/tutorial-table-of-contents"},"doc://CurtainRaiser/tutorials/CurtainRaiser/Adding-Curtain-Raiser-to-your-project":{"role":"project","title":"Add Curtain Raiser to your Project","estimatedTime":"1min","abstract":[{"type":"text","text":"CurtainRaiser is delivered as a Swift Package, whether you want to include in an App, or Swift Package yourself, it’s straight forward to do."}],"identifier":"doc:\/\/CurtainRaiser\/tutorials\/CurtainRaiser\/Adding-Curtain-Raiser-to-your-project","kind":"project","type":"topic","url":"\/tutorials\/curtainraiser\/adding-curtain-raiser-to-your-project"},"Chapter2_TOC.png":{"alt":"accessible description","type":"image","identifier":"Chapter2_TOC.png","variants":[{"url":"\/images\/Chapter2_TOC.png","traits":["1x","light"]}]}}} -------------------------------------------------------------------------------- /docs/developer-og-twitter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nthState/CurtainRaiser/785b450f4ef8e90a1248ff5f2187167bd49e5b5e/docs/developer-og-twitter.jpg -------------------------------------------------------------------------------- /docs/developer-og.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nthState/CurtainRaiser/785b450f4ef8e90a1248ff5f2187167bd49e5b5e/docs/developer-og.jpg -------------------------------------------------------------------------------- /docs/documentation/curtainraiser/curtainraiser/animatabledata/index.html: -------------------------------------------------------------------------------- 1 | <!DOCTYPE html><html lang="en-US"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover"><link rel="icon" href="/CurtainRaiser/favicon.ico"><link rel="mask-icon" href="/CurtainRaiser/favicon.svg" color="#333333"><title>Documentation
-------------------------------------------------------------------------------- /docs/documentation/curtainraiser/curtainraiser/animation(_:)/index.html: -------------------------------------------------------------------------------- 1 | Documentation
-------------------------------------------------------------------------------- /docs/documentation/curtainraiser/curtainraiser/body(content:)/index.html: -------------------------------------------------------------------------------- 1 | Documentation
-------------------------------------------------------------------------------- /docs/documentation/curtainraiser/curtainraiser/concat(_:)/index.html: -------------------------------------------------------------------------------- 1 | Documentation
-------------------------------------------------------------------------------- /docs/documentation/curtainraiser/curtainraiser/index.html: -------------------------------------------------------------------------------- 1 | Documentation
-------------------------------------------------------------------------------- /docs/documentation/curtainraiser/curtainraiser/init(view:sections:maxshadow:pleatheight:lift:offset:enabled:)/index.html: -------------------------------------------------------------------------------- 1 | Documentation
-------------------------------------------------------------------------------- /docs/documentation/curtainraiser/curtainraiser/transaction(_:)/index.html: -------------------------------------------------------------------------------- 1 | Documentation
-------------------------------------------------------------------------------- /docs/documentation/curtainraiser/curtainraiser/viewmodifier-implementations/index.html: -------------------------------------------------------------------------------- 1 | Documentation
-------------------------------------------------------------------------------- /docs/documentation/curtainraiser/index.html: -------------------------------------------------------------------------------- 1 | Documentation
-------------------------------------------------------------------------------- /docs/documentation/curtainraiser/swiftui/index.html: -------------------------------------------------------------------------------- 1 | Documentation
-------------------------------------------------------------------------------- /docs/documentation/curtainraiser/swiftui/view/curtainraiser(sections:maxshadow:pleatheight:lift:offset:enabled:)/index.html: -------------------------------------------------------------------------------- 1 | Documentation
-------------------------------------------------------------------------------- /docs/documentation/curtainraiser/swiftui/view/index.html: -------------------------------------------------------------------------------- 1 | Documentation
-------------------------------------------------------------------------------- /docs/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nthState/CurtainRaiser/785b450f4ef8e90a1248ff5f2187167bd49e5b5e/docs/favicon.ico -------------------------------------------------------------------------------- /docs/favicon.svg: -------------------------------------------------------------------------------- 1 | 10 | 11 | -------------------------------------------------------------------------------- /docs/images/Chapter1_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nthState/CurtainRaiser/785b450f4ef8e90a1248ff5f2187167bd49e5b5e/docs/images/Chapter1_01.png -------------------------------------------------------------------------------- /docs/images/Chapter1_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nthState/CurtainRaiser/785b450f4ef8e90a1248ff5f2187167bd49e5b5e/docs/images/Chapter1_02.png -------------------------------------------------------------------------------- /docs/images/Chapter1_Background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nthState/CurtainRaiser/785b450f4ef8e90a1248ff5f2187167bd49e5b5e/docs/images/Chapter1_Background.png -------------------------------------------------------------------------------- /docs/images/Chapter1_TOC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nthState/CurtainRaiser/785b450f4ef8e90a1248ff5f2187167bd49e5b5e/docs/images/Chapter1_TOC.png -------------------------------------------------------------------------------- /docs/images/Chapter2_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nthState/CurtainRaiser/785b450f4ef8e90a1248ff5f2187167bd49e5b5e/docs/images/Chapter2_01.png -------------------------------------------------------------------------------- /docs/images/Chapter2_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nthState/CurtainRaiser/785b450f4ef8e90a1248ff5f2187167bd49e5b5e/docs/images/Chapter2_03.png -------------------------------------------------------------------------------- /docs/images/Chapter2_08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nthState/CurtainRaiser/785b450f4ef8e90a1248ff5f2187167bd49e5b5e/docs/images/Chapter2_08.png -------------------------------------------------------------------------------- /docs/images/Chapter2_09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nthState/CurtainRaiser/785b450f4ef8e90a1248ff5f2187167bd49e5b5e/docs/images/Chapter2_09.png -------------------------------------------------------------------------------- /docs/images/Chapter2_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nthState/CurtainRaiser/785b450f4ef8e90a1248ff5f2187167bd49e5b5e/docs/images/Chapter2_10.png -------------------------------------------------------------------------------- /docs/images/Chapter2_Background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nthState/CurtainRaiser/785b450f4ef8e90a1248ff5f2187167bd49e5b5e/docs/images/Chapter2_Background.png -------------------------------------------------------------------------------- /docs/images/Chapter2_TOC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nthState/CurtainRaiser/785b450f4ef8e90a1248ff5f2187167bd49e5b5e/docs/images/Chapter2_TOC.png -------------------------------------------------------------------------------- /docs/images/projection-card@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nthState/CurtainRaiser/785b450f4ef8e90a1248ff5f2187167bd49e5b5e/docs/images/projection-card@2x.png -------------------------------------------------------------------------------- /docs/img/added-icon.d6f7e47d.svg: -------------------------------------------------------------------------------- 1 | 10 | 11 | -------------------------------------------------------------------------------- /docs/img/deprecated-icon.015b4f17.svg: -------------------------------------------------------------------------------- 1 | 10 | 11 | -------------------------------------------------------------------------------- /docs/img/modified-icon.f496e73d.svg: -------------------------------------------------------------------------------- 1 | 10 | 11 | -------------------------------------------------------------------------------- /docs/img/no-image@2x.df2a0a50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nthState/CurtainRaiser/785b450f4ef8e90a1248ff5f2187167bd49e5b5e/docs/img/no-image@2x.df2a0a50.png -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | Documentation
-------------------------------------------------------------------------------- /docs/index/index.json: -------------------------------------------------------------------------------- 1 | {"interfaceLanguages":{"swift":[{"children":[{"title":"Structures","type":"groupMarker"},{"children":[{"title":"Initializers","type":"groupMarker"},{"path":"\/documentation\/curtainraiser\/curtainraiser\/init(view:sections:maxshadow:pleatheight:lift:offset:enabled:)","title":"init(view: V, sections: Int, maxShadow: Float, pleatHeight: Float, lift: Float, offset: CGPoint, enabled: Bool)","type":"init"},{"title":"Instance Properties","type":"groupMarker"},{"path":"\/documentation\/curtainraiser\/curtainraiser\/animatabledata","title":"var animatableData: AnimatablePair","type":"property"},{"title":"Instance Methods","type":"groupMarker"},{"path":"\/documentation\/curtainraiser\/curtainraiser\/body(content:)","title":"func body(content: CurtainRaiser.Content) -> some View","type":"method"},{"title":"Default Implementations","type":"groupMarker"},{"children":[{"title":"Instance Methods","type":"groupMarker"},{"path":"\/documentation\/curtainraiser\/curtainraiser\/animation(_:)","title":"func animation(Animation?) -> some ViewModifier","type":"method"},{"path":"\/documentation\/curtainraiser\/curtainraiser\/concat(_:)","title":"func concat(T) -> ModifiedContent","type":"method"},{"path":"\/documentation\/curtainraiser\/curtainraiser\/transaction(_:)","title":"func transaction((inout Transaction) -> Void) -> some ViewModifier","type":"method"}],"path":"\/documentation\/curtainraiser\/curtainraiser\/viewmodifier-implementations","title":"ViewModifier Implementations","type":"symbol"}],"path":"\/documentation\/curtainraiser\/curtainraiser","title":"CurtainRaiser","type":"struct"},{"title":"Extended Modules","type":"groupMarker"},{"children":[{"title":"Extended Protocols","type":"groupMarker"},{"children":[{"title":"Instance Methods","type":"groupMarker"},{"path":"\/documentation\/curtainraiser\/swiftui\/view\/curtainraiser(sections:maxshadow:pleatheight:lift:offset:enabled:)","title":"func curtainRaiser(sections: Int, maxShadow: Float, pleatHeight: Float, lift: Float, offset: CGPoint, enabled: Bool) -> some View","type":"method"}],"path":"\/documentation\/curtainraiser\/swiftui\/view","title":"View","type":"extension"}],"path":"\/documentation\/curtainraiser\/swiftui","title":"SwiftUI","type":"extension"}],"path":"\/documentation\/curtainraiser","title":"CurtainRaiser","type":"module"},{"children":[{"title":"Adding Curtain Raiser to your project","type":"groupMarker"},{"path":"\/tutorials\/curtainraiser\/adding-curtain-raiser-to-your-project","title":"Add Curtain Raiser to your Project","type":"project"},{"title":"Getting Started with Curtain Raiser","type":"groupMarker"},{"path":"\/tutorials\/curtainraiser\/getting-started-with-curtain-raiser","title":"Getting Started with Curtain Raiser","type":"project"}],"path":"\/tutorials\/tutorial-table-of-contents","title":"Introduction","type":"overview"}]},"schemaVersion":{"major":0,"minor":1,"patch":1}} -------------------------------------------------------------------------------- /docs/js/highlight-js-bash.1b52852f.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * This source file is part of the Swift.org open source project 3 | * 4 | * Copyright (c) 2021 Apple Inc. and the Swift project authors 5 | * Licensed under Apache License v2.0 with Runtime Library Exception 6 | * 7 | * See https://swift.org/LICENSE.txt for license information 8 | * See https://swift.org/CONTRIBUTORS.txt for Swift project authors 9 | */ 10 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["highlight-js-bash"],{f0f8:function(e,s){function t(e){const s=e.regex,t={},n={begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[t]}]};Object.assign(t,{className:"variable",variants:[{begin:s.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},n]});const a={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},i={begin:/<<-?\s*(?=\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"})]}},c={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,t,a]};a.contains.push(c);const o={className:"",begin:/\\"/},r={className:"string",begin:/'/,end:/'/},l={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,t]},p=["fish","bash","zsh","sh","csh","ksh","tcsh","dash","scsh"],d=e.SHEBANG({binary:`(${p.join("|")})`,relevance:10}),h={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0},m=["if","then","else","elif","fi","for","while","in","do","done","case","esac","function"],u=["true","false"],b={match:/(\/[a-z._-]+)+/},g=["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset"],f=["alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","type","typeset","ulimit","unalias"],w=["autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp"],k=["chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes"];return{name:"Bash",aliases:["sh"],keywords:{$pattern:/\b[a-z._-]+\b/,keyword:m,literal:u,built_in:[...g,...f,"set","shopt",...w,...k]},contains:[d,e.SHEBANG(),h,l,e.HASH_COMMENT_MODE,i,b,c,o,r,t]}}e.exports=t}}]); -------------------------------------------------------------------------------- /docs/js/highlight-js-c.d1db3f17.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * This source file is part of the Swift.org open source project 3 | * 4 | * Copyright (c) 2021 Apple Inc. and the Swift project authors 5 | * Licensed under Apache License v2.0 with Runtime Library Exception 6 | * 7 | * See https://swift.org/LICENSE.txt for license information 8 | * See https://swift.org/CONTRIBUTORS.txt for Swift project authors 9 | */ 10 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["highlight-js-c"],{"1fe5":function(e,n){function s(e){const n=e.regex,s=e.COMMENT("//","$",{contains:[{begin:/\\\n/}]}),t="decltype\\(auto\\)",a="[a-zA-Z_]\\w*::",i="<[^<>]+>",r="("+t+"|"+n.optional(a)+"[a-zA-Z_]\\w*"+n.optional(i)+")",l={className:"type",variants:[{begin:"\\b[a-z\\d_]*_t\\b"},{match:/\batomic_[a-z]{3,6}\b/}]},o="\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)",c={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'("+o+"|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},d={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},u={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(c,{className:"string"}),{className:"string",begin:/<.*?>/},s,e.C_BLOCK_COMMENT_MODE]},g={className:"title",begin:n.optional(a)+e.IDENT_RE,relevance:0},p=n.optional(a)+e.IDENT_RE+"\\s*\\(",m=["asm","auto","break","case","continue","default","do","else","enum","extern","for","fortran","goto","if","inline","register","restrict","return","sizeof","struct","switch","typedef","union","volatile","while","_Alignas","_Alignof","_Atomic","_Generic","_Noreturn","_Static_assert","_Thread_local","alignas","alignof","noreturn","static_assert","thread_local","_Pragma"],_=["float","double","signed","unsigned","int","short","long","char","void","_Bool","_Complex","_Imaginary","_Decimal32","_Decimal64","_Decimal128","const","static","complex","bool","imaginary"],f={keyword:m,type:_,literal:"true false NULL",built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr"},b=[u,l,s,e.C_BLOCK_COMMENT_MODE,d,c],w={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:f,contains:b.concat([{begin:/\(/,end:/\)/,keywords:f,contains:b.concat(["self"]),relevance:0}]),relevance:0},h={begin:"("+r+"[\\*&\\s]+)+"+p,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:f,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:t,keywords:f,relevance:0},{begin:p,returnBegin:!0,contains:[e.inherit(g,{className:"title.function"})],relevance:0},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/,keywords:f,relevance:0,contains:[s,e.C_BLOCK_COMMENT_MODE,c,d,l,{begin:/\(/,end:/\)/,keywords:f,relevance:0,contains:["self",s,e.C_BLOCK_COMMENT_MODE,c,d,l]}]},l,s,e.C_BLOCK_COMMENT_MODE,u]};return{name:"C",aliases:["h"],keywords:f,disableAutodetect:!0,illegal:"=]/,contains:[{beginKeywords:"final class struct"},e.TITLE_MODE]}]),exports:{preprocessor:u,strings:c,keywords:f}}}e.exports=s}}]); -------------------------------------------------------------------------------- /docs/js/highlight-js-custom-markdown.7cffc4b3.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * This source file is part of the Swift.org open source project 3 | * 4 | * Copyright (c) 2021 Apple Inc. and the Swift project authors 5 | * Licensed under Apache License v2.0 with Runtime Library Exception 6 | * 7 | * See https://swift.org/LICENSE.txt for license information 8 | * See https://swift.org/CONTRIBUTORS.txt for Swift project authors 9 | */ 10 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["highlight-js-custom-markdown","highlight-js-markdown"],{"04b0":function(n,e){function a(n){const e=n.regex,a={begin:/<\/?[A-Za-z_]/,end:">",subLanguage:"xml",relevance:0},i={begin:"^[-\\*]{3,}",end:"$"},s={className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},t={className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},c={begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]},d=/[A-Za-z][A-Za-z0-9+.-]*/,l={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/,relevance:2},{begin:e.concat(/\[.+?\]\(/,d,/:\/\/.*?\)/),relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}]},g={className:"strong",contains:[],variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},o={className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{begin:/_(?!_)/,end:/_/,relevance:0}]};g.contains.push(o),o.contains.push(g);let r=[a,l];g.contains=g.contains.concat(r),o.contains=o.contains.concat(r),r=r.concat(g,o);const b={className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:r},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:r}]}]},u={className:"quote",begin:"^>\\s+",contains:r,end:"$"};return{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[b,a,t,g,o,u,s,i,l,c]}}n.exports=a},"84cb":function(n,e,a){"use strict";a.r(e);var i=a("04b0"),s=a.n(i);const t={begin:"",returnBegin:!0,contains:[{className:"link",begin:"doc:",end:">",excludeEnd:!0}]},c={className:"link",begin:/`{2}(?!`)/,end:/`{2}(?!`)/,excludeBegin:!0,excludeEnd:!0},d={begin:"^>\\s+[Note:|Tip:|Important:|Experiment:|Warning:]",end:"$",returnBegin:!0,contains:[{className:"quote",begin:"^>",end:"\\s+"},{className:"type",begin:"Note|Tip|Important|Experiment|Warning",end:":"},{className:"quote",begin:".*",end:"$",endsParent:!0}]},l={begin:"@",end:"[{\\)\\s]",returnBegin:!0,contains:[{className:"title",begin:"@",end:"[\\s+(]",excludeEnd:!0},{begin:":",end:"[,\\)\n\t]",excludeBegin:!0,keywords:{literal:"true false null undefined"},contains:[{className:"number",begin:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",endsWithParent:!0,excludeEnd:!0},{className:"string",variants:[{begin:/"""/,end:/"""/},{begin:/"/,end:/"/}],endsParent:!0},{className:"link",begin:"http|https",endsWithParent:!0,excludeEnd:!0}]}]};e["default"]=function(n){const e=s()(n),a=e.contains.find(({className:n})=>"code"===n);a.variants=a.variants.filter(({begin:n})=>!n.includes("( {4}|\\t)"));const i=[...e.contains.filter(({className:n})=>"code"!==n),a];return{...e,contains:[c,t,d,l,...i]}}}}]); -------------------------------------------------------------------------------- /docs/js/highlight-js-diff.62d66733.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * This source file is part of the Swift.org open source project 3 | * 4 | * Copyright (c) 2021 Apple Inc. and the Swift project authors 5 | * Licensed under Apache License v2.0 with Runtime Library Exception 6 | * 7 | * See https://swift.org/LICENSE.txt for license information 8 | * See https://swift.org/CONTRIBUTORS.txt for Swift project authors 9 | */ 10 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["highlight-js-diff"],{"48b8":function(e,n){function a(e){const n=e.regex;return{name:"Diff",aliases:["patch"],contains:[{className:"meta",relevance:10,match:n.either(/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/,/^\*\*\* +\d+,\d+ +\*\*\*\*$/,/^--- +\d+,\d+ +----$/)},{className:"comment",variants:[{begin:n.either(/Index: /,/^index/,/={3,}/,/^-{3}/,/^\*{3} /,/^\+{3}/,/^diff --git/),end:/$/},{match:/^\*{15}$/}]},{className:"addition",begin:/^\+/,end:/$/},{className:"deletion",begin:/^-/,end:/$/},{className:"addition",begin:/^!/,end:/$/}]}}e.exports=a}}]); -------------------------------------------------------------------------------- /docs/js/highlight-js-http.163e45b6.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * This source file is part of the Swift.org open source project 3 | * 4 | * Copyright (c) 2021 Apple Inc. and the Swift project authors 5 | * Licensed under Apache License v2.0 with Runtime Library Exception 6 | * 7 | * See https://swift.org/LICENSE.txt for license information 8 | * See https://swift.org/CONTRIBUTORS.txt for Swift project authors 9 | */ 10 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["highlight-js-http"],{c01d:function(e,n){function a(e){const n=e.regex,a="HTTP/(2|1\\.[01])",s=/[A-Za-z][A-Za-z0-9-]*/,t={className:"attribute",begin:n.concat("^",s,"(?=\\:\\s)"),starts:{contains:[{className:"punctuation",begin:/: /,relevance:0,starts:{end:"$",relevance:0}}]}},i=[t,{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}];return{name:"HTTP",aliases:["https"],illegal:/\S/,contains:[{begin:"^(?="+a+" \\d{3})",end:/$/,contains:[{className:"meta",begin:a},{className:"number",begin:"\\b\\d{3}\\b"}],starts:{end:/\b\B/,illegal:/\S/,contains:i}},{begin:"(?=^[A-Z]+ (.*?) "+a+"$)",end:/$/,contains:[{className:"string",begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{className:"meta",begin:a},{className:"keyword",begin:"[A-Z]+"}],starts:{end:/\b\B/,illegal:/\S/,contains:i}},e.inherit(t,{relevance:0})]}}e.exports=a}}]); -------------------------------------------------------------------------------- /docs/js/highlight-js-java.8326d9d8.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * This source file is part of the Swift.org open source project 3 | * 4 | * Copyright (c) 2021 Apple Inc. and the Swift project authors 5 | * Licensed under Apache License v2.0 with Runtime Library Exception 6 | * 7 | * See https://swift.org/LICENSE.txt for license information 8 | * See https://swift.org/CONTRIBUTORS.txt for Swift project authors 9 | */ 10 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["highlight-js-java"],{"332f":function(e,a){var n="[0-9](_*[0-9])*",s=`\\.(${n})`,i="[0-9a-fA-F](_*[0-9a-fA-F])*",t={className:"number",variants:[{begin:`(\\b(${n})((${s})|\\.)?|(${s}))[eE][+-]?(${n})[fFdD]?\\b`},{begin:`\\b(${n})((${s})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{begin:`(${s})[fFdD]?\\b`},{begin:`\\b(${n})[fFdD]\\b`},{begin:`\\b0[xX]((${i})\\.?|(${i})?\\.(${i}))[pP][+-]?(${n})[fFdD]?\\b`},{begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${i})[lL]?\\b`},{begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}],relevance:0};function r(e,a,n){return-1===n?"":e.replace(a,s=>r(e,a,n-1))}function c(e){e.regex;const a="[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",n=a+r("(?:<"+a+"~~~(?:\\s*,\\s*"+a+"~~~)*>)?",/~~~/g,2),s=["synchronized","abstract","private","var","static","if","const ","for","while","strictfp","finally","protected","import","native","final","void","enum","else","break","transient","catch","instanceof","volatile","case","assert","package","default","public","try","switch","continue","throws","protected","public","private","module","requires","exports","do"],i=["super","this"],c=["false","true","null"],l=["char","boolean","long","float","int","byte","short","double"],o={keyword:s,literal:c,type:l,built_in:i},b={className:"meta",begin:"@"+a,contains:[{begin:/\(/,end:/\)/,contains:["self"]}]},_={className:"params",begin:/\(/,end:/\)/,keywords:o,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE],endsParent:!0};return{name:"Java",aliases:["jsp"],keywords:o,illegal:/<\/|#/,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),{begin:/import java\.[a-z]+\./,keywords:"import",relevance:2},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{begin:/"""/,end:/"""/,className:"string",contains:[e.BACKSLASH_ESCAPE]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{match:[/\b(?:class|interface|enum|extends|implements|new)/,/\s+/,a],className:{1:"keyword",3:"title.class"}},{begin:[a,/\s+/,a,/\s+/,/=/],className:{1:"type",3:"variable",5:"operator"}},{begin:[/record/,/\s+/,a],className:{1:"keyword",3:"title.class"},contains:[_,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"new throw return else",relevance:0},{begin:["(?:"+n+"\\s+)",e.UNDERSCORE_IDENT_RE,/\s*(?=\()/],className:{2:"title.function"},keywords:o,contains:[{className:"params",begin:/\(/,end:/\)/,keywords:o,relevance:0,contains:[b,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,t,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},t,b]}}e.exports=c}}]); -------------------------------------------------------------------------------- /docs/js/highlight-js-json.471128d2.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * This source file is part of the Swift.org open source project 3 | * 4 | * Copyright (c) 2021 Apple Inc. and the Swift project authors 5 | * Licensed under Apache License v2.0 with Runtime Library Exception 6 | * 7 | * See https://swift.org/LICENSE.txt for license information 8 | * See https://swift.org/CONTRIBUTORS.txt for Swift project authors 9 | */ 10 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["highlight-js-json"],{"5ad2":function(n,e){function a(n){const e={className:"attr",begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},a={match:/[{}[\],:]/,className:"punctuation",relevance:0},s={beginKeywords:["true","false","null"].join(" ")};return{name:"JSON",contains:[e,a,n.QUOTE_STRING_MODE,s,n.C_NUMBER_MODE,n.C_LINE_COMMENT_MODE,n.C_BLOCK_COMMENT_MODE],illegal:"\\S"}}n.exports=a}}]); -------------------------------------------------------------------------------- /docs/js/highlight-js-llvm.6100b125.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * This source file is part of the Swift.org open source project 3 | * 4 | * Copyright (c) 2021 Apple Inc. and the Swift project authors 5 | * Licensed under Apache License v2.0 with Runtime Library Exception 6 | * 7 | * See https://swift.org/LICENSE.txt for license information 8 | * See https://swift.org/CONTRIBUTORS.txt for Swift project authors 9 | */ 10 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["highlight-js-llvm"],{"7c30":function(e,n){function a(e){const n=e.regex,a=/([-a-zA-Z$._][\w$.-]*)/,t={className:"type",begin:/\bi\d+(?=\s|\b)/},i={className:"operator",relevance:0,begin:/=/},c={className:"punctuation",relevance:0,begin:/,/},l={className:"number",variants:[{begin:/0[xX][a-fA-F0-9]+/},{begin:/-?\d+(?:[.]\d+)?(?:[eE][-+]?\d+(?:[.]\d+)?)?/}],relevance:0},r={className:"symbol",variants:[{begin:/^\s*[a-z]+:/}],relevance:0},s={className:"variable",variants:[{begin:n.concat(/%/,a)},{begin:/%\d+/},{begin:/#\d+/}]},o={className:"title",variants:[{begin:n.concat(/@/,a)},{begin:/@\d+/},{begin:n.concat(/!/,a)},{begin:n.concat(/!\d+/,a)},{begin:/!\d+/}]};return{name:"LLVM IR",keywords:"begin end true false declare define global constant private linker_private internal available_externally linkonce linkonce_odr weak weak_odr appending dllimport dllexport common default hidden protected extern_weak external thread_local zeroinitializer undef null to tail target triple datalayout volatile nuw nsw nnan ninf nsz arcp fast exact inbounds align addrspace section alias module asm sideeffect gc dbg linker_private_weak attributes blockaddress initialexec localdynamic localexec prefix unnamed_addr ccc fastcc coldcc x86_stdcallcc x86_fastcallcc arm_apcscc arm_aapcscc arm_aapcs_vfpcc ptx_device ptx_kernel intel_ocl_bicc msp430_intrcc spir_func spir_kernel x86_64_sysvcc x86_64_win64cc x86_thiscallcc cc c signext zeroext inreg sret nounwind noreturn noalias nocapture byval nest readnone readonly inlinehint noinline alwaysinline optsize ssp sspreq noredzone noimplicitfloat naked builtin cold nobuiltin noduplicate nonlazybind optnone returns_twice sanitize_address sanitize_memory sanitize_thread sspstrong uwtable returned type opaque eq ne slt sgt sle sge ult ugt ule uge oeq one olt ogt ole oge ord uno ueq une x acq_rel acquire alignstack atomic catch cleanup filter inteldialect max min monotonic nand personality release seq_cst singlethread umax umin unordered xchg add fadd sub fsub mul fmul udiv sdiv fdiv urem srem frem shl lshr ashr and or xor icmp fcmp phi call trunc zext sext fptrunc fpext uitofp sitofp fptoui fptosi inttoptr ptrtoint bitcast addrspacecast select va_arg ret br switch invoke unwind unreachable indirectbr landingpad resume malloc alloca free load store getelementptr extractelement insertelement shufflevector getresult extractvalue insertvalue atomicrmw cmpxchg fence argmemonly double",contains:[t,e.COMMENT(/;\s*$/,null,{relevance:0}),e.COMMENT(/;/,/$/),e.QUOTE_STRING_MODE,{className:"string",variants:[{begin:/"/,end:/[^\\]"/}]},o,c,i,s,r,l]}}e.exports=a}}]); -------------------------------------------------------------------------------- /docs/js/highlight-js-markdown.90077643.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * This source file is part of the Swift.org open source project 3 | * 4 | * Copyright (c) 2021 Apple Inc. and the Swift project authors 5 | * Licensed under Apache License v2.0 with Runtime Library Exception 6 | * 7 | * See https://swift.org/LICENSE.txt for license information 8 | * See https://swift.org/CONTRIBUTORS.txt for Swift project authors 9 | */ 10 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["highlight-js-markdown"],{"04b0":function(n,e){function a(n){const e=n.regex,a={begin:/<\/?[A-Za-z_]/,end:">",subLanguage:"xml",relevance:0},i={begin:"^[-\\*]{3,}",end:"$"},s={className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},c={className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},t={begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]},g=/[A-Za-z][A-Za-z0-9+.-]*/,d={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/,relevance:2},{begin:e.concat(/\[.+?\]\(/,g,/:\/\/.*?\)/),relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}]},l={className:"strong",contains:[],variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},o={className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{begin:/_(?!_)/,end:/_/,relevance:0}]};l.contains.push(o),o.contains.push(l);let b=[a,d];l.contains=l.contains.concat(b),o.contains=o.contains.concat(b),b=b.concat(l,o);const r={className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:b},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:b}]}]},m={className:"quote",begin:"^>\\s+",contains:b,end:"$"};return{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[r,a,c,l,o,m,s,i,d,t]}}n.exports=a}}]); -------------------------------------------------------------------------------- /docs/js/highlight-js-objectivec.bcdf5156.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * This source file is part of the Swift.org open source project 3 | * 4 | * Copyright (c) 2021 Apple Inc. and the Swift project authors 5 | * Licensed under Apache License v2.0 with Runtime Library Exception 6 | * 7 | * See https://swift.org/LICENSE.txt for license information 8 | * See https://swift.org/CONTRIBUTORS.txt for Swift project authors 9 | */ 10 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["highlight-js-objectivec"],{"9bf2":function(e,n){function _(e){const n={className:"built_in",begin:"\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+"},_=/[a-zA-Z@][a-zA-Z0-9_]*/,i=["int","float","while","char","export","sizeof","typedef","const","struct","for","union","unsigned","long","volatile","static","bool","mutable","if","do","return","goto","void","enum","else","break","extern","asm","case","short","default","double","register","explicit","signed","typename","this","switch","continue","wchar_t","inline","readonly","assign","readwrite","self","@synchronized","id","typeof","nonatomic","super","unichar","IBOutlet","IBAction","strong","weak","copy","in","out","inout","bycopy","byref","oneway","__strong","__weak","__block","__autoreleasing","@private","@protected","@public","@try","@property","@end","@throw","@catch","@finally","@autoreleasepool","@synthesize","@dynamic","@selector","@optional","@required","@encode","@package","@import","@defs","@compatibility_alias","__bridge","__bridge_transfer","__bridge_retained","__bridge_retain","__covariant","__contravariant","__kindof","_Nonnull","_Nullable","_Null_unspecified","__FUNCTION__","__PRETTY_FUNCTION__","__attribute__","getter","setter","retain","unsafe_unretained","nonnull","nullable","null_unspecified","null_resettable","class","instancetype","NS_DESIGNATED_INITIALIZER","NS_UNAVAILABLE","NS_REQUIRES_SUPER","NS_RETURNS_INNER_POINTER","NS_INLINE","NS_AVAILABLE","NS_DEPRECATED","NS_ENUM","NS_OPTIONS","NS_SWIFT_UNAVAILABLE","NS_ASSUME_NONNULL_BEGIN","NS_ASSUME_NONNULL_END","NS_REFINED_FOR_SWIFT","NS_SWIFT_NAME","NS_SWIFT_NOTHROW","NS_DURING","NS_HANDLER","NS_ENDHANDLER","NS_VALUERETURN","NS_VOIDRETURN"],t=["false","true","FALSE","TRUE","nil","YES","NO","NULL"],a=["BOOL","dispatch_once_t","dispatch_queue_t","dispatch_sync","dispatch_async","dispatch_once"],o={$pattern:_,keyword:i,literal:t,built_in:a},s={$pattern:_,keyword:["@interface","@class","@protocol","@implementation"]};return{name:"Objective-C",aliases:["mm","objc","obj-c","obj-c++","objective-c++"],keywords:o,illegal:"/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class",begin:"("+s.keyword.join("|")+")\\b",end:/(\{|$)/,excludeEnd:!0,keywords:s,contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}e.exports=_}}]); -------------------------------------------------------------------------------- /docs/js/highlight-js-perl.757d7b6f.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * This source file is part of the Swift.org open source project 3 | * 4 | * Copyright (c) 2021 Apple Inc. and the Swift project authors 5 | * Licensed under Apache License v2.0 with Runtime Library Exception 6 | * 7 | * See https://swift.org/LICENSE.txt for license information 8 | * See https://swift.org/CONTRIBUTORS.txt for Swift project authors 9 | */ 10 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["highlight-js-perl"],{"6a51":function(e,n){function t(e){const n=e.regex,t=["abs","accept","alarm","and","atan2","bind","binmode","bless","break","caller","chdir","chmod","chomp","chop","chown","chr","chroot","close","closedir","connect","continue","cos","crypt","dbmclose","dbmopen","defined","delete","die","do","dump","each","else","elsif","endgrent","endhostent","endnetent","endprotoent","endpwent","endservent","eof","eval","exec","exists","exit","exp","fcntl","fileno","flock","for","foreach","fork","format","formline","getc","getgrent","getgrgid","getgrnam","gethostbyaddr","gethostbyname","gethostent","getlogin","getnetbyaddr","getnetbyname","getnetent","getpeername","getpgrp","getpriority","getprotobyname","getprotobynumber","getprotoent","getpwent","getpwnam","getpwuid","getservbyname","getservbyport","getservent","getsockname","getsockopt","given","glob","gmtime","goto","grep","gt","hex","if","index","int","ioctl","join","keys","kill","last","lc","lcfirst","length","link","listen","local","localtime","log","lstat","lt","ma","map","mkdir","msgctl","msgget","msgrcv","msgsnd","my","ne","next","no","not","oct","open","opendir","or","ord","our","pack","package","pipe","pop","pos","print","printf","prototype","push","q|0","qq","quotemeta","qw","qx","rand","read","readdir","readline","readlink","readpipe","recv","redo","ref","rename","require","reset","return","reverse","rewinddir","rindex","rmdir","say","scalar","seek","seekdir","select","semctl","semget","semop","send","setgrent","sethostent","setnetent","setpgrp","setpriority","setprotoent","setpwent","setservent","setsockopt","shift","shmctl","shmget","shmread","shmwrite","shutdown","sin","sleep","socket","socketpair","sort","splice","split","sprintf","sqrt","srand","stat","state","study","sub","substr","symlink","syscall","sysopen","sysread","sysseek","system","syswrite","tell","telldir","tie","tied","time","times","tr","truncate","uc","ucfirst","umask","undef","unless","unlink","unpack","unshift","untie","until","use","utime","values","vec","wait","waitpid","wantarray","warn","when","while","write","x|0","xor","y|0"],s=/[dualxmsipngr]{0,12}/,r={$pattern:/[\w.]+/,keyword:t.join(" ")},i={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:r},a={begin:/->\{/,end:/\}/},o={variants:[{begin:/\$\d/},{begin:n.concat(/[$%@](\^\w\b|#\w+(::\w+)*|\{\w+\}|\w+(::\w*)*)/,"(?![A-Za-z])(?![@$%])")},{begin:/[$%@][^\s\w{]/,relevance:0}]},c=[e.BACKSLASH_ESCAPE,i,o],g=[/!/,/\//,/\|/,/\?/,/'/,/"/,/#/],l=(e,t,r="\\1")=>{const i="\\1"===r?r:n.concat(r,t);return n.concat(n.concat("(?:",e,")"),t,/(?:\\.|[^\\\/])*?/,i,/(?:\\.|[^\\\/])*?/,r,s)},d=(e,t,r)=>n.concat(n.concat("(?:",e,")"),t,/(?:\\.|[^\\\/])*?/,r,s),p=[o,e.HASH_COMMENT_MODE,e.COMMENT(/^=\w/,/=cut/,{endsWithParent:!0}),a,{className:"string",contains:c,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*<",end:">",relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE]},{begin:/\{\w+\}/,relevance:0},{begin:"-?\\w+\\s*=>",relevance:0}]},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",keywords:"split return print reverse grep",relevance:0,contains:[e.HASH_COMMENT_MODE,{className:"regexp",variants:[{begin:l("s|tr|y",n.either(...g,{capture:!0}))},{begin:l("s|tr|y","\\(","\\)")},{begin:l("s|tr|y","\\[","\\]")},{begin:l("s|tr|y","\\{","\\}")}],relevance:2},{className:"regexp",variants:[{begin:/(m|qr)\/\//,relevance:0},{begin:d("(?:m|qr)?",/\//,/\//)},{begin:d("m|qr",n.either(...g,{capture:!0}),/\1/)},{begin:d("m|qr",/\(/,/\)/)},{begin:d("m|qr",/\[/,/\]/)},{begin:d("m|qr",/\{/,/\}/)}]}]},{className:"function",beginKeywords:"sub",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]}];return i.contains=p,a.contains=p,{name:"Perl",aliases:["pl","pm"],keywords:r,contains:p}}e.exports=t}}]); -------------------------------------------------------------------------------- /docs/js/highlight-js-php.cc8d6c27.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * This source file is part of the Swift.org open source project 3 | * 4 | * Copyright (c) 2021 Apple Inc. and the Swift project authors 5 | * Licensed under Apache License v2.0 with Runtime Library Exception 6 | * 7 | * See https://swift.org/LICENSE.txt for license information 8 | * See https://swift.org/CONTRIBUTORS.txt for Swift project authors 9 | */ 10 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["highlight-js-php"],{2907:function(e,r){function t(e){const r={className:"variable",begin:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*(?![A-Za-z0-9])(?![$])"},t={className:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?[=]?/},{begin:/\?>/}]},a={className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]},n=e.inherit(e.APOS_STRING_MODE,{illegal:null}),i=e.inherit(e.QUOTE_STRING_MODE,{illegal:null,contains:e.QUOTE_STRING_MODE.contains.concat(a)}),o=e.END_SAME_AS_BEGIN({begin:/<<<[ \t]*(\w+)\n/,end:/[ \t]*(\w+)\b/,contains:e.QUOTE_STRING_MODE.contains.concat(a)}),l={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[e.inherit(n,{begin:"b'",end:"'"}),e.inherit(i,{begin:'b"',end:'"'}),i,n,o]},c={className:"number",variants:[{begin:"\\b0b[01]+(?:_[01]+)*\\b"},{begin:"\\b0o[0-7]+(?:_[0-7]+)*\\b"},{begin:"\\b0x[\\da-f]+(?:_[\\da-f]+)*\\b"},{begin:"(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:e[+-]?\\d+)?"}],relevance:0},s={keyword:"__CLASS__ __DIR__ __FILE__ __FUNCTION__ __LINE__ __METHOD__ __NAMESPACE__ __TRAIT__ die echo exit include include_once print require require_once array abstract and as binary bool boolean break callable case catch class clone const continue declare default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile enum eval extends final finally float for foreach from global goto if implements instanceof insteadof int integer interface isset iterable list match|0 mixed new object or private protected public real return string switch throw trait try unset use var void while xor yield",literal:"false null true",built_in:"Error|0 AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIterator OutOfBoundsException OutOfRangeException OuterIterator OverflowException ParentIterator ParseError RangeException RecursiveArrayIterator RecursiveCachingIterator RecursiveCallbackFilterIterator RecursiveDirectoryIterator RecursiveFilterIterator RecursiveIterator RecursiveIteratorIterator RecursiveRegexIterator RecursiveTreeIterator RegexIterator RuntimeException SeekableIterator SplDoublyLinkedList SplFileInfo SplFileObject SplFixedArray SplHeap SplMaxHeap SplMinHeap SplObjectStorage SplObserver SplObserver SplPriorityQueue SplQueue SplStack SplSubject SplSubject SplTempFileObject TypeError UnderflowException UnexpectedValueException UnhandledMatchError ArrayAccess Closure Generator Iterator IteratorAggregate Serializable Stringable Throwable Traversable WeakReference WeakMap Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass"};return{case_insensitive:!0,keywords:s,contains:[e.HASH_COMMENT_MODE,e.COMMENT("//","$",{contains:[t]}),e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0,keywords:"__halt_compiler"}),t,{className:"keyword",begin:/\$this\b/},r,{begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function",relevance:0,beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[{beginKeywords:"use"},e.UNDERSCORE_TITLE_MODE,{begin:"=>",endsParent:!0},{className:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:s,contains:["self",r,e.C_BLOCK_COMMENT_MODE,l,c]}]},{className:"class",variants:[{beginKeywords:"enum",illegal:/[($"]/},{beginKeywords:"class interface trait",illegal:/[:($"]/}],relevance:0,end:/\{/,excludeEnd:!0,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",relevance:0,end:";",illegal:/[.']/,contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",relevance:0,end:";",contains:[e.UNDERSCORE_TITLE_MODE]},l,c]}}e.exports=t}}]); -------------------------------------------------------------------------------- /docs/js/highlight-js-python.c214ed92.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * This source file is part of the Swift.org open source project 3 | * 4 | * Copyright (c) 2021 Apple Inc. and the Swift project authors 5 | * Licensed under Apache License v2.0 with Runtime Library Exception 6 | * 7 | * See https://swift.org/LICENSE.txt for license information 8 | * See https://swift.org/CONTRIBUTORS.txt for Swift project authors 9 | */ 10 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["highlight-js-python"],{9510:function(e,n){function a(e){const n=e.regex,a=/[\p{XID_Start}_]\p{XID_Continue}*/u,i=["and","as","assert","async","await","break","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],s=["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"],t=["__debug__","Ellipsis","False","None","NotImplemented","True"],r=["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"],l={$pattern:/[A-Za-z]\w+|__\w+__/,keyword:i,built_in:s,literal:t,type:r},o={className:"meta",begin:/^(>>>|\.\.\.) /},b={className:"subst",begin:/\{/,end:/\}/,keywords:l,illegal:/#/},c={begin:/\{\{/,relevance:0},d={className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,o],relevance:10},{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,o],relevance:10},{begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,o,c,b]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,o,c,b]},{begin:/([uU]|[rR])'/,end:/'/,relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/,end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,c,b]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,c,b]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},p="[0-9](_?[0-9])*",g=`(\\b(${p}))?\\.(${p})|\\b(${p})\\.`,m={className:"number",relevance:0,variants:[{begin:`(\\b(${p})|(${g}))[eE][+-]?(${p})[jJ]?\\b`},{begin:`(${g})[jJ]?`},{begin:"\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?\\b"},{begin:"\\b0[bB](_?[01])+[lL]?\\b"},{begin:"\\b0[oO](_?[0-7])+[lL]?\\b"},{begin:"\\b0[xX](_?[0-9a-fA-F])+[lL]?\\b"},{begin:`\\b(${p})[jJ]\\b`}]},_={className:"comment",begin:n.lookahead(/# type:/),end:/$/,keywords:l,contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},u={className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:l,contains:["self",o,m,d,e.HASH_COMMENT_MODE]}]};return b.contains=[d,m,o],{name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:l,illegal:/(<\/|->|\?)|=>/,contains:[o,m,{begin:/\bself\b/},{beginKeywords:"if",relevance:0},d,_,e.HASH_COMMENT_MODE,{match:[/def/,/\s+/,a],scope:{1:"keyword",3:"title.function"},contains:[u]},{variants:[{match:[/class/,/\s+/,a,/\s*/,/\(\s*/,a,/\s*\)/]},{match:[/class/,/\s+/,a]}],scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[m,u,d]}]}}e.exports=a}}]); -------------------------------------------------------------------------------- /docs/js/highlight-js-ruby.f889d392.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * This source file is part of the Swift.org open source project 3 | * 4 | * Copyright (c) 2021 Apple Inc. and the Swift project authors 5 | * Licensed under Apache License v2.0 with Runtime Library Exception 6 | * 7 | * See https://swift.org/LICENSE.txt for license information 8 | * See https://swift.org/CONTRIBUTORS.txt for Swift project authors 9 | */ 10 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["highlight-js-ruby"],{"82cb":function(e,n){function a(e){const n=e.regex,a="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",i={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor __FILE__",built_in:"proc lambda",literal:"true false nil"},s={className:"doctag",begin:"@[A-Za-z]+"},b={begin:"#<",end:">"},c=[e.COMMENT("#","$",{contains:[s]}),e.COMMENT("^=begin","^=end",{contains:[s],relevance:10}),e.COMMENT("^__END__","\\n$")],r={className:"subst",begin:/#\{/,end:/\}/,keywords:i},d={className:"string",contains:[e.BACKSLASH_ESCAPE,r],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:/%[qQwWx]?\(/,end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{begin:/%[qQwWx]?\{/,end:/\}/},{begin:/%[qQwWx]?/},{begin:/%[qQwWx]?\//,end:/\//},{begin:/%[qQwWx]?%/,end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{begin:/%[qQwWx]?\|/,end:/\|/},{begin:/\B\?(\\\d{1,3})/},{begin:/\B\?(\\x[A-Fa-f0-9]{1,2})/},{begin:/\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/},{begin:/\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/},{begin:/\B\?\\(c|C-)[\x20-\x7e]/},{begin:/\B\?\\?\S/},{begin:n.concat(/<<[-~]?'?/,n.lookahead(/(\w+)(?=\W)[^\n]*\n(?:[^\n]*\n)*?\s*\1\b/)),contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,contains:[e.BACKSLASH_ESCAPE,r]})]}]},t="[1-9](_?[0-9])*|0",o="[0-9](_?[0-9])*",g={className:"number",relevance:0,variants:[{begin:`\\b(${t})(\\.(${o}))?([eE][+-]?(${o})|r)?i?\\b`},{begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{begin:"\\b0(_?[0-7])+r?i?\\b"}]},l={className:"params",begin:"\\(",end:"\\)",endsParent:!0,keywords:i},_=[d,{className:"class",beginKeywords:"class module",end:"$|;",illegal:/=/,contains:[e.inherit(e.TITLE_MODE,{begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|!)?"}),{begin:"<\\s*",contains:[{begin:"("+e.IDENT_RE+"::)?"+e.IDENT_RE,relevance:0}]}].concat(c)},{className:"function",begin:n.concat(/def\s+/,n.lookahead(a+"\\s*(\\(|;|$)")),relevance:0,keywords:"def",end:"$|;",contains:[e.inherit(e.TITLE_MODE,{begin:a}),l].concat(c)},{begin:e.IDENT_RE+"::"},{className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[d,{begin:a}],relevance:0},g,{className:"variable",begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{className:"params",begin:/\|/,end:/\|/,relevance:0,keywords:i},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[{className:"regexp",contains:[e.BACKSLASH_ESCAPE,r],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(b,c),relevance:0}].concat(b,c);r.contains=_,l.contains=_;const w="[>?]>",E="[\\w#]+\\(\\w+\\):\\d+:\\d+>",u="(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>",N=[{begin:/^\s*=>/,starts:{end:"$",contains:_}},{className:"meta",begin:"^("+w+"|"+E+"|"+u+")(?=[ ])",starts:{end:"$",contains:_}}];return c.unshift(b),{name:"Ruby",aliases:["rb","gemspec","podspec","thor","irb"],keywords:i,illegal:/\/\*/,contains:[e.SHEBANG({binary:"ruby"})].concat(N).concat(c).concat(_)}}e.exports=a}}]); -------------------------------------------------------------------------------- /docs/js/highlight-js-shell.dd7f411f.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * This source file is part of the Swift.org open source project 3 | * 4 | * Copyright (c) 2021 Apple Inc. and the Swift project authors 5 | * Licensed under Apache License v2.0 with Runtime Library Exception 6 | * 7 | * See https://swift.org/LICENSE.txt for license information 8 | * See https://swift.org/CONTRIBUTORS.txt for Swift project authors 9 | */ 10 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["highlight-js-shell"],{b65b:function(s,n){function e(s){return{name:"Shell Session",aliases:["console","shellsession"],contains:[{className:"meta",begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\](?=\s*$)/,subLanguage:"bash"}}]}}s.exports=e}}]); -------------------------------------------------------------------------------- /docs/js/highlight-js-xml.9c3688c7.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * This source file is part of the Swift.org open source project 3 | * 4 | * Copyright (c) 2021 Apple Inc. and the Swift project authors 5 | * Licensed under Apache License v2.0 with Runtime Library Exception 6 | * 7 | * See https://swift.org/LICENSE.txt for license information 8 | * See https://swift.org/CONTRIBUTORS.txt for Swift project authors 9 | */ 10 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["highlight-js-xml"],{"8dcb":function(e,n){function a(e){const n=e.regex,a=n.concat(/[A-Z_]/,n.optional(/[A-Z0-9_.-]*:/),/[A-Z0-9_.-]*/),s=/[A-Za-z0-9._:-]+/,t={className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},i={begin:/\s/,contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},c=e.inherit(i,{begin:/\(/,end:/\)/}),l=e.inherit(e.APOS_STRING_MODE,{className:"string"}),r=e.inherit(e.QUOTE_STRING_MODE,{className:"string"}),g={endsWithParent:!0,illegal:/`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin://,relevance:10,contains:[i,r,l,c,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin://,contains:[i,c,r,l]}]}]},e.COMMENT(//,{relevance:10}),{begin://,relevance:10},t,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:/)/,end:/>/,keywords:{name:"style"},contains:[g],starts:{end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:/)/,end:/>/,keywords:{name:"script"},contains:[g],starts:{end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:/<>|<\/>/},{className:"tag",begin:n.concat(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name",begin:a,relevance:0,starts:g}]},{className:"tag",begin:n.concat(/<\//,n.lookahead(n.concat(a,/>/))),contains:[{className:"name",begin:a,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}}e.exports=a}}]); -------------------------------------------------------------------------------- /docs/metadata.json: -------------------------------------------------------------------------------- 1 | {"bundleDisplayName":"CurtainRaiser","bundleIdentifier":"CurtainRaiser","schemaVersion":{"major":0,"minor":1,"patch":0}} -------------------------------------------------------------------------------- /docs/tutorials/curtainraiser/adding-curtain-raiser-to-your-project/index.html: -------------------------------------------------------------------------------- 1 | Documentation
-------------------------------------------------------------------------------- /docs/tutorials/curtainraiser/getting-started-with-curtain-raiser/index.html: -------------------------------------------------------------------------------- 1 | Documentation
-------------------------------------------------------------------------------- /docs/tutorials/tutorial-table-of-contents/index.html: -------------------------------------------------------------------------------- 1 | Documentation
--------------------------------------------------------------------------------