├── .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] - '
5 | labels: ["task"]
6 | assignees: ''
7 |
8 | ---
9 |
10 | ## Description
11 |
12 |
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 |
10 |
11 | ## Testing steps
12 |
13 |
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 |
24 |
25 | | iPhone Portrait | iPhone Landscape |
26 | |---|---|
27 | | | |
28 |
29 | | iPad Portrait | iPad Landscape |
30 | |---|---|
31 | | | |
32 |
33 | ## Appendix
34 |
35 |
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 |
2 |
3 |
4 |
5 | FILEHEADER
6 |
7 | // Copyright © nthState Ltd ___YEAR___. All rights reserved.
8 | //
9 |
10 |
11 |
--------------------------------------------------------------------------------
/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
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 | -
13 | -
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: 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 {
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 {
44 | Binding(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 {
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
6 | #include
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
9 | #include
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 | 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:[].concat(w,h,b,[u,{begin:e.IDENT_RE+"::",keywords:f},{className:"class",beginKeywords:"enum class struct union",end:/[{;:<>=]/,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:"",contains:[n,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.C_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{className:"string",variants:[{begin:'@"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]}]},{className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{keyword:"if else elif endif define undef warning error line pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(e.QUOTE_STRING_MODE,{className:"string"}),{className:"string",begin:/<.*?>/,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]?,end:/>/},{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]+;|[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:/,relevance:0,contains:[{className:"attr",begin:s,relevance:0},{begin:/=\s*/,relevance:0,contains:[{className:"string",endsParent:!0,variants:[{begin:/"/,end:/"/,contains:[t]},{begin:/'/,end:/'/,contains:[t]},{begin:/[^\s"'=<>`]+/}]}]}]};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:/This page requires JavaScript.
Please turn on JavaScript in your browser and refresh the page to view its content.