├── .gitignore
├── .travis.yml
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
├── Package.swift
├── RAMReel.podspec
├── RAMReel.xcodeproj
├── project.pbxproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcuserdata
│ │ └── mikhail.s.xcuserdatad
│ │ └── WorkspaceSettings.xcsettings
├── xcshareddata
│ └── xcschemes
│ │ └── RAMReel.xcscheme
└── xcuserdata
│ └── mikhail.s.xcuserdatad
│ ├── xcdebugger
│ └── Breakpoints_v2.xcbkptlist
│ └── xcschemes
│ ├── RAMReel.xcscheme
│ └── xcschememanagement.plist
├── RAMReel
├── Framework
│ ├── CollectionViewCell.swift
│ ├── CollectionViewLayout.swift
│ ├── CollectionViewWrapper.swift
│ ├── DataFlow.swift
│ ├── GradientView.swift
│ ├── RAMReel.h
│ ├── RAMReel.swift
│ ├── RAMTextField.swift
│ ├── TextFieldReactor.swift
│ └── Theme.swift
├── Info.plist
└── Roboto
│ ├── Apache License.txt
│ └── Roboto-Light.ttf
├── RAMReelExample.xcworkspace
└── contents.xcworkspacedata
├── RAMReelExample
├── RAMReelExample.xcodeproj
│ ├── project.pbxproj
│ └── project.xcworkspace
│ │ └── contents.xcworkspacedata
└── RAMReelExample
│ ├── AppDelegate.swift
│ ├── Base.lproj
│ ├── LaunchScreen.xib
│ └── Main.storyboard
│ ├── Images.xcassets
│ └── AppIcon.appiconset
│ │ └── Contents.json
│ ├── Info.plist
│ ├── ViewController.swift
│ ├── WordReader.swift
│ └── data.txt
├── README.md
├── Sources
├── docs
├── Classes.html
├── Classes
│ ├── CollectionViewWrapper.html
│ ├── RAMCell.html
│ ├── RAMReel.html
│ └── RAMTextField.html
├── Constructors.html
├── Extensions.html
├── Extensions
│ ├── String.html
│ ├── UIImage.html
│ └── UITextField.html
├── Functions.html
├── Functions
│ ├── *>(_:_:).html
│ └── <&>(_:_:).html
├── Generic Type Parameters.html
├── Protocols.html
├── Protocols
│ ├── ConfigurableCell.html
│ ├── FlowDataDestination.html
│ ├── FlowDataSource.html
│ ├── Parsable.html
│ ├── Renderable.html
│ └── Theme.html
├── Structs.html
├── Structs
│ ├── RAMTheme.html
│ └── SimplePrefixQueryDataSource.html
├── Typealiases.html
├── css
│ ├── highlight.css
│ └── jazzy.css
├── docsets
│ ├── RAMReel.docset
│ │ └── Contents
│ │ │ ├── Info.plist
│ │ │ └── Resources
│ │ │ ├── Documents
│ │ │ ├── Classes.html
│ │ │ ├── Classes
│ │ │ │ ├── CollectionViewWrapper.html
│ │ │ │ ├── RAMCell.html
│ │ │ │ ├── RAMReel.html
│ │ │ │ └── RAMTextField.html
│ │ │ ├── Constructors.html
│ │ │ ├── Extensions.html
│ │ │ ├── Extensions
│ │ │ │ ├── String.html
│ │ │ │ ├── UIImage.html
│ │ │ │ └── UITextField.html
│ │ │ ├── Functions.html
│ │ │ ├── Functions
│ │ │ │ ├── *>(_:_:).html
│ │ │ │ └── <&>(_:_:).html
│ │ │ ├── Generic Type Parameters.html
│ │ │ ├── Protocols.html
│ │ │ ├── Protocols
│ │ │ │ ├── ConfigurableCell.html
│ │ │ │ ├── FlowDataDestination.html
│ │ │ │ ├── FlowDataSource.html
│ │ │ │ ├── Parsable.html
│ │ │ │ ├── Renderable.html
│ │ │ │ └── Theme.html
│ │ │ ├── Structs.html
│ │ │ ├── Structs
│ │ │ │ ├── RAMTheme.html
│ │ │ │ └── SimplePrefixQueryDataSource.html
│ │ │ ├── Typealiases.html
│ │ │ ├── css
│ │ │ │ ├── highlight.css
│ │ │ │ └── jazzy.css
│ │ │ ├── img
│ │ │ │ ├── carat.png
│ │ │ │ ├── dash.png
│ │ │ │ └── gh.png
│ │ │ ├── index.html
│ │ │ ├── js
│ │ │ │ ├── jazzy.js
│ │ │ │ └── jquery.min.js
│ │ │ └── undocumented.json
│ │ │ └── docSet.dsidx
│ └── RAMReel.tgz
├── img
│ ├── carat.png
│ ├── dash.png
│ └── gh.png
├── index.html
├── js
│ ├── jazzy.js
│ └── jquery.min.js
└── undocumented.json
├── header.png
└── reel-search.gif
/.gitignore:
--------------------------------------------------------------------------------
1 | # Xcode
2 | #
3 | build/
4 | *.pbxuser
5 | !default.pbxuser
6 | *.mode1v3
7 | !default.mode1v3
8 | *.mode2v3
9 | !default.mode2v3
10 | *.perspectivev3
11 | !default.perspectivev3
12 | xcuserdata
13 | *.xccheckout
14 | *.moved-aside
15 | DerivedData
16 | *.hmap
17 | *.ipa
18 | *.xcuserstate
19 |
20 | # CocoaPods
21 | #
22 | # We recommend against adding the Pods directory to your .gitignore. However
23 | # you should judge for yourself, the pros and cons are mentioned at:
24 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control
25 | #
26 | Pods/
27 |
28 | # Carthage
29 | #
30 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
31 | # Carthage/Checkouts
32 |
33 | Carthage/Build
34 |
35 | # Other
36 | *.swp
37 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | osx_image: xcode9.2
2 | language: objective-c
3 | cache: cocoapods
4 |
5 | xcode_project: RAMReel.xcodeproj
6 | xcode_scheme: RAMReel
7 | xcode_sdk: iphonesimulator11.2
8 |
9 | # SWIFT_VERSION: 4.0
10 |
11 | # whitelist
12 | branches:
13 | only:
14 | - master
15 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Change Log
2 |
3 | ## [Unreleased](https://github.com/Ramotion/reel-search/tree/HEAD)
4 |
5 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/1.2.4...HEAD)
6 |
7 | **Closed issues:**
8 |
9 | - Actions when something from the list is selected. [\#7](https://github.com/Ramotion/reel-search/issues/7)
10 |
11 | ## [1.2.4](https://github.com/Ramotion/reel-search/tree/1.2.4) (2016-05-30)
12 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/1.2.3...1.2.4)
13 |
14 | ## [1.2.3](https://github.com/Ramotion/reel-search/tree/1.2.3) (2016-05-19)
15 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/1.2.2...1.2.3)
16 |
17 | ## [1.2.2](https://github.com/Ramotion/reel-search/tree/1.2.2) (2016-05-04)
18 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/1.2.1...1.2.2)
19 |
20 | ## [1.2.1](https://github.com/Ramotion/reel-search/tree/1.2.1) (2016-05-04)
21 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/1.2.0...1.2.1)
22 |
23 | **Closed issues:**
24 |
25 | - ui blocking on textfield entry defects [\#5](https://github.com/Ramotion/reel-search/issues/5)
26 |
27 | ## [1.2.0](https://github.com/Ramotion/reel-search/tree/1.2.0) (2016-05-04)
28 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/1.1.1...1.2.0)
29 |
30 | ## [1.1.1](https://github.com/Ramotion/reel-search/tree/1.1.1) (2016-04-06)
31 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/1.1.0...1.1.1)
32 |
33 | ## [1.1.0](https://github.com/Ramotion/reel-search/tree/1.1.0) (2016-04-06)
34 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/1.0.6...1.1.0)
35 |
36 | ## [1.0.6](https://github.com/Ramotion/reel-search/tree/1.0.6) (2016-02-26)
37 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/1.0.5...1.0.6)
38 |
39 | **Closed issues:**
40 |
41 | - How did you make the demo gif? [\#3](https://github.com/Ramotion/reel-search/issues/3)
42 |
43 | **Merged pull requests:**
44 |
45 | - update doc [\#4](https://github.com/Ramotion/reel-search/pull/4) ([ArtemKyslicyn](https://github.com/ArtemKyslicyn))
46 |
47 | ## [1.0.5](https://github.com/Ramotion/reel-search/tree/1.0.5) (2016-02-11)
48 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/1.0.4...1.0.5)
49 |
50 | ## [1.0.4](https://github.com/Ramotion/reel-search/tree/1.0.4) (2016-02-01)
51 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/1.0.3...1.0.4)
52 |
53 | ## [1.0.3](https://github.com/Ramotion/reel-search/tree/1.0.3) (2016-02-01)
54 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/1.0.2...1.0.3)
55 |
56 | **Closed issues:**
57 |
58 | - improve autosuggestion logic [\#1](https://github.com/Ramotion/reel-search/issues/1)
59 |
60 | ## [1.0.2](https://github.com/Ramotion/reel-search/tree/1.0.2) (2016-02-01)
61 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/1.0.1...1.0.2)
62 |
63 | **Merged pull requests:**
64 |
65 | - Docs update [\#2](https://github.com/Ramotion/reel-search/pull/2) ([Juriv](https://github.com/Juriv))
66 |
67 | ## [1.0.1](https://github.com/Ramotion/reel-search/tree/1.0.1) (2016-01-28)
68 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/1.0.0...1.0.1)
69 |
70 | ## [1.0.0](https://github.com/Ramotion/reel-search/tree/1.0.0) (2016-01-28)
71 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.10.8...1.0.0)
72 |
73 | ## [0.10.8](https://github.com/Ramotion/reel-search/tree/0.10.8) (2015-12-29)
74 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.10.7...0.10.8)
75 |
76 | ## [0.10.7](https://github.com/Ramotion/reel-search/tree/0.10.7) (2015-12-21)
77 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.10.6...0.10.7)
78 |
79 | ## [0.10.6](https://github.com/Ramotion/reel-search/tree/0.10.6) (2015-12-21)
80 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.10.5...0.10.6)
81 |
82 | ## [0.10.5](https://github.com/Ramotion/reel-search/tree/0.10.5) (2015-12-19)
83 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.10.4...0.10.5)
84 |
85 | ## [0.10.4](https://github.com/Ramotion/reel-search/tree/0.10.4) (2015-12-18)
86 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.10.3...0.10.4)
87 |
88 | ## [0.10.3](https://github.com/Ramotion/reel-search/tree/0.10.3) (2015-12-18)
89 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.10.2...0.10.3)
90 |
91 | ## [0.10.2](https://github.com/Ramotion/reel-search/tree/0.10.2) (2015-12-08)
92 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.9.11...0.10.2)
93 |
94 | ## [0.9.11](https://github.com/Ramotion/reel-search/tree/0.9.11) (2015-10-22)
95 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.9.10...0.9.11)
96 |
97 | ## [0.9.10](https://github.com/Ramotion/reel-search/tree/0.9.10) (2015-10-22)
98 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.9.9...0.9.10)
99 |
100 | ## [0.9.9](https://github.com/Ramotion/reel-search/tree/0.9.9) (2015-10-01)
101 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.9.8...0.9.9)
102 |
103 | ## [0.9.8](https://github.com/Ramotion/reel-search/tree/0.9.8) (2015-10-01)
104 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.9.7...0.9.8)
105 |
106 | ## [0.9.7](https://github.com/Ramotion/reel-search/tree/0.9.7) (2015-10-01)
107 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.10.1...0.9.7)
108 |
109 | ## [0.10.1](https://github.com/Ramotion/reel-search/tree/0.10.1) (2015-09-21)
110 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.10.0...0.10.1)
111 |
112 | ## [0.10.0](https://github.com/Ramotion/reel-search/tree/0.10.0) (2015-09-21)
113 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.9.6...0.10.0)
114 |
115 | ## [0.9.6](https://github.com/Ramotion/reel-search/tree/0.9.6) (2015-09-21)
116 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.9.5...0.9.6)
117 |
118 | ## [0.9.5](https://github.com/Ramotion/reel-search/tree/0.9.5) (2015-08-28)
119 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.9.4...0.9.5)
120 |
121 | ## [0.9.4](https://github.com/Ramotion/reel-search/tree/0.9.4) (2015-08-12)
122 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.9.3...0.9.4)
123 |
124 | ## [0.9.3](https://github.com/Ramotion/reel-search/tree/0.9.3) (2015-07-22)
125 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.9.2...0.9.3)
126 |
127 | ## [0.9.2](https://github.com/Ramotion/reel-search/tree/0.9.2) (2015-07-06)
128 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.9.1...0.9.2)
129 |
130 | ## [0.9.1](https://github.com/Ramotion/reel-search/tree/0.9.1) (2015-07-06)
131 | [Full Changelog](https://github.com/Ramotion/reel-search/compare/0.9.0...0.9.1)
132 |
133 | ## [0.9.0](https://github.com/Ramotion/reel-search/tree/0.9.0) (2015-04-24)
134 |
135 |
136 | \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing to a Project
2 | Now that you’ve found the material for understanding the project, here is how you can take action.
3 |
4 | ### Create an Issue
5 |
6 | If you find a bug in a project you’re using (and you don’t know how to fix it), have trouble following the documentation or have a question about the project – create an issue! There’s nothing to it and whatever issue you’re having, you’re likely not the only one, so others will find your issue helpful, too. For more information on how issues work, check out our Issues guide.
7 |
8 | #### Issues Pro Tips
9 |
10 | Check existing issues for your issue. Duplicating an issue is slower for both parties so search through open and closed issues to see if what you’re running into has been addressed already.
11 | Be clear about what your problem is: what was the expected outcome, what happened instead? Detail how someone else can recreate the problem.
12 | Link to demos recreating the problem on things like JSFiddle or CodePen.
13 | Include system details like what the browser, library or operating system you’re using and its version.
14 | Paste error output or logs in your issue or in a Gist. If pasting them in the issue, wrap it in three backticks: ``` so that it renders nicely.
15 |
16 | ### Pull Request
17 |
18 | If you’re able to patch the bug or add the feature yourself – fantastic, make a pull request with the code! Be sure you’ve read any documents on contributing, understand the license and have signed a CLA if required. Once you’ve submitted a pull request the maintainer(s) can compare your branch to the existing one and decide whether or not to incorporate (pull in) your changes.
19 |
20 | #### Pull Request Pro Tips
21 |
22 | Fork the repository and clone it locally. Connect your local to the original ‘upstream’ repository by adding it as a remote. Pull in changes from ‘upstream’ often so that you stay up to date so that when you submit your pull request, merge conflicts will be less likely. See more detailed instructions here.
23 | Create a branch for your edits.
24 | Be clear about what problem is occurring and how someone can recreate that problem or why your feature will help. Then be equally as clear about the steps you took to make your changes.
25 | It’s best to test. Run your changes against any existing tests if they exist and create new ones when needed. Whether tests exist or not, make sure your changes don’t break the existing project.
26 | Include screenshots of the before and after if your changes include differences in HTML/CSS. Drag and drop the images into the body of your pull request.
27 | Contribute in the style of the project to the best of your abilities. This may mean using indents, semi colons or comments differently than you would in your own repository, but makes it easier for the maintainer to merge, others to understand and maintain in the future.
28 |
29 | #### Open Pull Requests
30 |
31 | Once you’ve opened a pull request a discussion will start around your proposed changes. Other contributors and users may chime in, but ultimately the decision is made by the maintainer(s). You may be asked to make some changes to your pull request, if so, add more commits to your branch and push them – they’ll automatically go into the existing pull request.
32 |
33 | If your pull request is merged – great! If it is not, no sweat, it may not be what the project maintainer had in mind, or they were already working on it. This happens, so our recommendation is to take any feedback you’ve received and go forth and pull request again – or create your own open source project.
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015 Ramotion
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.
22 |
23 |
--------------------------------------------------------------------------------
/Package.swift:
--------------------------------------------------------------------------------
1 | // swift-tools-version:5.1
2 | //
3 | // Package.swift
4 | //
5 | // Copyright (c) Ramotion (https://www.ramotion.com/)
6 | //
7 | // Permission is hereby granted, free of charge, to any person obtaining a copy
8 | // of this software and associated documentation files (the "Software"), to deal
9 | // in the Software without restriction, including without limitation the rights
10 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 | // copies of the Software, and to permit persons to whom the Software is
12 | // furnished to do so, subject to the following conditions:
13 | //
14 | // The above copyright notice and this permission notice shall be included in
15 | // all copies or substantial portions of the Software.
16 | //
17 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23 | // THE SOFTWARE.
24 | //
25 |
26 | import PackageDescription
27 |
28 |
29 | let package = Package(
30 | name: "ReelSearch",
31 | platforms: [
32 | .iOS(.v8)
33 | ],
34 | products: [
35 | .library(name: "RAMReel",
36 | targets: ["RAMReel"]),
37 | ],
38 | targets: [
39 | .target(name: "RAMReel",
40 | path: "RAMReel")
41 | ],
42 | swiftLanguageVersions: [.v5]
43 | )
44 |
--------------------------------------------------------------------------------
/RAMReel.podspec:
--------------------------------------------------------------------------------
1 | Pod::Spec.new do |s|
2 |
3 | s.name = "RAMReel"
4 | s.version = "4.1.0"
5 | s.summary = "Live search control with reel of suggestions"
6 | s.screenshots = "https://raw.githubusercontent.com/Ramotion/reel-search/master/reel-search.gif"
7 |
8 | s.homepage = "https://github.com/Ramotion/reel-search"
9 |
10 | s.license = "MIT"
11 |
12 | s.author = { "Mikhail Stepkin, Ramotion Inc." => "mikhail.s@ramotion.com" }
13 | s.social_media_url = "https://twitter.com/Ramotion"
14 |
15 | s.platform = :ios, "9.0"
16 |
17 | s.source = { :git => "https://github.com/Ramotion/reel-search.git", :tag => "#{s.version}" }
18 |
19 | s.source_files = "RAMReel/Framework", "RAMReel/Framework/**/*.{h,m,swift}"
20 |
21 | s.resources = "RAMReel/Roboto/*.*"
22 |
23 | end
24 |
--------------------------------------------------------------------------------
/RAMReel.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/RAMReel.xcodeproj/project.xcworkspace/xcuserdata/mikhail.s.xcuserdatad/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges
6 |
7 | SnapshotAutomaticallyBeforeSignificantChanges
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/RAMReel.xcodeproj/xcshareddata/xcschemes/RAMReel.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
34 |
35 |
45 |
46 |
52 |
53 |
54 |
55 |
56 |
57 |
63 |
64 |
70 |
71 |
72 |
73 |
75 |
76 |
79 |
80 |
81 |
--------------------------------------------------------------------------------
/RAMReel.xcodeproj/xcuserdata/mikhail.s.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
8 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/RAMReel.xcodeproj/xcuserdata/mikhail.s.xcuserdatad/xcschemes/RAMReel.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
29 |
35 |
36 |
37 |
38 |
39 |
44 |
45 |
47 |
53 |
54 |
55 |
56 |
57 |
63 |
64 |
65 |
66 |
75 |
76 |
82 |
83 |
84 |
85 |
86 |
87 |
93 |
94 |
100 |
101 |
102 |
103 |
105 |
106 |
109 |
110 |
111 |
--------------------------------------------------------------------------------
/RAMReel.xcodeproj/xcuserdata/mikhail.s.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | RAMReel.xcscheme
8 |
9 | orderHint
10 | 0
11 |
12 |
13 | SuppressBuildableAutocreation
14 |
15 | 9E82B37B1AD7EEAE0063F1B0
16 |
17 | primary
18 |
19 |
20 | 9E82B3861AD7EEAE0063F1B0
21 |
22 | primary
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/RAMReel/Framework/CollectionViewCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RAMCell.swift
3 | // RAMReel
4 | //
5 | // Created by Mikhail Stepkin on 4/10/15.
6 | // Copyright (c) 2015 Ramotion. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | // MARK: - Collection view cells
12 | /**
13 | Type that implements this protocol allows configuration.
14 | As type name hints this protocol primarily targeted to UITableView and UICollectionView cells
15 | */
16 | public protocol ConfigurableCell {
17 |
18 | associatedtype DataType: Equatable
19 |
20 | /**
21 | Implementing type should use data to fill own data fields
22 |
23 | - parameter data: Data to present in the cell
24 | */
25 | func configureCell(_ data: DataType)
26 |
27 | /// Visual appearance theme
28 | var theme: Theme { get set }
29 |
30 | }
31 |
32 | /**
33 | RAMCell
34 | --
35 |
36 | Example configurable cell
37 | */
38 | open class RAMCell: UICollectionViewCell, ConfigurableCell {
39 |
40 | /**
41 | Proxy call to superclass init.
42 |
43 | - parameter coder: `NSCoder` instance proxied to superview.
44 | */
45 | required public init?(coder aDecoder: NSCoder) {
46 | super.init(coder: aDecoder)
47 |
48 | setup()
49 | }
50 |
51 | /**
52 | Proxy call to superclass init.
53 |
54 | - parameter frame: Rect of cell, proxied to superview.
55 | */
56 | public override init(frame: CGRect) {
57 | super.init(frame: frame)
58 | setup()
59 | }
60 |
61 | var textLabel: UILabel!
62 |
63 | /// Visual appearance theme
64 | open var theme: Theme = RAMTheme.sharedTheme {
65 | didSet {
66 | if theme.font != oldValue.font || theme.textColor != oldValue.textColor {
67 | updateFont()
68 | }
69 | }
70 | }
71 |
72 | func updateFont() {
73 | let theme = self.theme
74 | textLabel.font = theme.font
75 | textLabel.textColor = theme.textColor.withAlphaComponent(0.3)
76 | }
77 |
78 | fileprivate func setup() {
79 | let labelFrame = self.contentView.bounds
80 | textLabel = UILabel(frame: labelFrame)
81 | textLabel.translatesAutoresizingMaskIntoConstraints = false
82 |
83 | self.contentView.addSubview(textLabel)
84 |
85 | let attributes: [NSLayoutConstraint.Attribute] = [.left, .right, .top, .bottom]
86 | let constraints: [NSLayoutConstraint] = attributes.map {
87 | let const: CGFloat = ($0 == .left || $0 == .right) ? -20 : 0
88 | return NSLayoutConstraint(item: self,
89 | attribute: $0,
90 | relatedBy: .equal,
91 | toItem: textLabel,
92 | attribute: $0,
93 | multiplier: 1,
94 | constant: const)
95 | }
96 | addConstraints(constraints)
97 | updateFont()
98 | }
99 |
100 | /**
101 | Applies string data to the label text property
102 |
103 | - parameter string: String to show in the cell
104 | */
105 | open func configureCell(_ string: String) {
106 |
107 | self.textLabel.text = string
108 |
109 | }
110 |
111 | }
112 |
--------------------------------------------------------------------------------
/RAMReel/Framework/CollectionViewLayout.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RAMCollectionViewLayout.swift
3 | // RAMReel
4 | //
5 | // Created by Mikhail Stepkin on 4/9/15.
6 | // Copyright (c) 2015 Ramotion. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | /**
12 | Example collection view layout
13 | */
14 | @objc(RAMCollectionViewLayout)
15 | class RAMCollectionViewLayout: UICollectionViewFlowLayout {
16 |
17 | internal override func prepare() {
18 | super.prepare()
19 |
20 | updateInsets()
21 | }
22 |
23 | func updateInsets() {
24 | if let collectionView = self.collectionView {
25 | let insets = (collectionView.bounds.height - itemHeight)/2
26 | collectionView.contentInset = UIEdgeInsets(top: insets, left: 0, bottom: insets, right: 0)
27 | }
28 | }
29 |
30 | internal override func initialLayoutAttributesForAppearingItem(at itemIndexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
31 | return self.layoutAttributesForItem(at: itemIndexPath)
32 | }
33 |
34 | internal override func layoutAttributesForItem(at indexPath:IndexPath) -> UICollectionViewLayoutAttributes {
35 | let attributes = UICollectionViewLayoutAttributes(forCellWith: indexPath)
36 | self.modifyLayoutAttributes(attributes)
37 |
38 | return attributes
39 | }
40 |
41 | internal override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
42 |
43 | var allAttributesInRect = [(UICollectionViewLayoutAttributes, CGFloat)]()
44 |
45 | if let numberOfItems = collectionView?.numberOfItems(inSection: 0) {
46 | for item in 0 ..< numberOfItems {
47 | let indexPath = IndexPath(item: item, section: 0)
48 |
49 | let attributes = self.layoutAttributesForItem(at: indexPath)
50 |
51 | if rect.intersects(attributes.frame) {
52 | let intersection = rect.intersection(attributes.frame)
53 | allAttributesInRect.append((attributes, intersection.area))
54 | }
55 | }
56 | }
57 |
58 | allAttributesInRect.sort {
59 | let (_, a1) = $0
60 | let (_, a2) = $1
61 |
62 | return a1 > a2
63 | }
64 |
65 | let attributes = allAttributesInRect.map ({ (attr, _) in
66 | attr
67 | })
68 |
69 | return attributes
70 | }
71 |
72 | var itemHeight: CGFloat = 44
73 | func modifyLayoutAttributes(_ layoutattributes: UICollectionViewLayoutAttributes) {
74 |
75 | if
76 | let collectionView = self.collectionView
77 | {
78 | var frame = layoutattributes.frame
79 | frame.size.height = itemHeight
80 | frame.size.width = collectionView.bounds.width
81 | frame.origin.x = collectionView.bounds.origin.x
82 | frame.origin.y = itemHeight * CGFloat((layoutattributes.indexPath as NSIndexPath).item)
83 | layoutattributes.frame = frame
84 | }
85 |
86 | }
87 |
88 | internal override var collectionViewContentSize : CGSize {
89 |
90 | guard let collectionView = self.collectionView else {
91 | return CGSize.zero
92 | }
93 |
94 | let number = collectionView.numberOfItems(inSection: 0)
95 | let height = CGFloat(number) * itemHeight
96 |
97 | let size = CGSize(width: collectionView.bounds.width, height: height)
98 | return size
99 |
100 | }
101 | }
102 |
103 | private extension CGRect {
104 |
105 | var area: CGFloat {
106 |
107 | return self.height * self.width
108 |
109 | }
110 |
111 | }
112 |
--------------------------------------------------------------------------------
/RAMReel/Framework/GradientView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContainerView.swift
3 | // RAMReel
4 | //
5 | // Created by Mikhail Stepkin on 4/23/15.
6 | // Copyright (c) 2015 Ramotion. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import QuartzCore
11 |
12 | class GradientView: UIView {
13 |
14 | var gradientLayer: CAGradientLayer!
15 |
16 | var listBackgroundColor: UIColor? {
17 | didSet {
18 | updateGradient()
19 | }
20 | }
21 |
22 | func updateGradient() {
23 | let color = listBackgroundColor ?? UIColor.white
24 | let white = color.withAlphaComponent(1.0).cgColor
25 | let clear = color.withAlphaComponent(0.0).cgColor
26 | gradientLayer.colors = [clear, white, clear]
27 | }
28 |
29 | func setupGradientLayer() {
30 | gradientLayer = CAGradientLayer()
31 | gradientLayer.frame = self.bounds
32 | updateGradient()
33 | self.layer.insertSublayer(gradientLayer, at: 0)
34 | }
35 |
36 | required init?(coder aDecoder: NSCoder) {
37 | super.init(coder: aDecoder)
38 |
39 | setupGradientLayer()
40 | }
41 |
42 | override init(frame: CGRect) {
43 | super.init(frame: frame)
44 |
45 | setupGradientLayer()
46 | }
47 |
48 | override func layoutSubviews() {
49 | super.layoutSubviews()
50 |
51 | gradientLayer.frame = self.bounds
52 | gradientLayer.setNeedsDisplay()
53 | }
54 |
55 | override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
56 | return false
57 | }
58 |
59 | }
60 |
--------------------------------------------------------------------------------
/RAMReel/Framework/RAMReel.h:
--------------------------------------------------------------------------------
1 | //
2 | // RAMReel.h
3 | // RAMReel
4 | //
5 | // Created by Mikhail Stepkin on 4/10/15.
6 | // Copyright (c) 2015 Ramotion. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | //! Project version number for RAMReel.
12 | FOUNDATION_EXPORT double RAMReelVersionNumber;
13 |
14 | //! Project version string for RAMReel.
15 | FOUNDATION_EXPORT const unsigned char RAMReelVersionString[];
16 |
17 | // In this header, you should import all the public headers of your framework using statements like #import
18 |
19 |
20 |
--------------------------------------------------------------------------------
/RAMReel/Framework/RAMTextField.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RAMTextField.swift
3 | // RAMReel
4 | //
5 | // Created by Mikhail Stepkin on 4/22/15.
6 | // Copyright (c) 2015 Ramotion. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | // MARK: - RAMTextField
12 |
13 | /**
14 | RAMTextField
15 | --
16 |
17 | Textfield with a line in the bottom
18 | */
19 | open class RAMTextField: UITextField {
20 |
21 | /**
22 | Overriding UIView's drawRect method to add line in the bottom of the Text Field
23 |
24 | - parameter rect: Rect that should be updated. This override ignores this parameter and redraws all text field
25 | */
26 | override open func draw(_ rect: CGRect) {
27 | let rect = self.bounds
28 | let ctx = UIGraphicsGetCurrentContext()
29 |
30 | let lineColor = self.tintColor.withAlphaComponent(0.3)
31 | lineColor.set()
32 |
33 | ctx?.setLineWidth(1)
34 |
35 | let path = CGMutablePath()
36 |
37 | // var m = CGAffineTransform.identity
38 | // CGPathMoveToPoint(path, &m, 0, rect.height)
39 | path.move(to: CGPoint(x: 0, y: rect.height))
40 | path.addLine(to: CGPoint(x: rect.width, y: rect.height))
41 | // CGPathAddLineToPoint(path, &m, rect.width, rect.height)
42 |
43 | ctx?.addPath(path)
44 | ctx?.strokePath()
45 | }
46 |
47 | }
48 |
49 | // MARK: - UITextField extensions
50 |
51 | extension UITextField {
52 |
53 | /**
54 | Overriding `UITextField` `tintColor` property to make it affect close image tint color.
55 | */
56 | open override var tintColor: UIColor! {
57 | get {
58 | return super.tintColor
59 | }
60 |
61 | set {
62 | super.tintColor = newValue
63 |
64 | let subviews = self.subviews
65 | for view in subviews {
66 | guard let button = view as? UIButton else {
67 | break
68 | }
69 |
70 | let states: [UIControl.State] = [.highlighted]
71 | states.forEach { state -> Void in
72 | let image = button.image(for: state)?.tintedImage(self.tintColor)
73 | button.setImage(image, for: state)
74 | }
75 | }
76 | }
77 | }
78 |
79 | }
80 |
81 | // MARK: - UIImage extensions
82 |
83 | private extension UIImage {
84 |
85 | /**
86 | Create new image by applying a tint.
87 |
88 | - parameter color: New image tint color.
89 | */
90 | func tintedImage(_ color: UIColor) -> UIImage {
91 | let size = self.size
92 |
93 | UIGraphicsBeginImageContextWithOptions(size, false, self.scale)
94 | let context = UIGraphicsGetCurrentContext()
95 | self.draw(at: CGPoint.zero, blendMode: CGBlendMode.normal, alpha: 1.0)
96 |
97 | context?.setFillColor(color.cgColor)
98 | context?.setBlendMode(CGBlendMode.sourceIn)
99 | context?.setAlpha(1.0)
100 |
101 | let rect = CGRect(
102 | x: CGPoint.zero.x,
103 | y: CGPoint.zero.y,
104 | width: size.width,
105 | height: size.height)
106 | UIGraphicsGetCurrentContext()?.fill(rect)
107 | let tintedImage = UIGraphicsGetImageFromCurrentImageContext()
108 | UIGraphicsEndImageContext()
109 |
110 | return tintedImage ?? self
111 | }
112 |
113 | }
114 |
--------------------------------------------------------------------------------
/RAMReel/Framework/TextFieldReactor.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RAMReel.swift
3 | // RAMReel
4 | //
5 | // Created by Mikhail Stepkin on 4/2/15.
6 | // Copyright (c) 2015 Ramotion. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import UIKit
11 |
12 | // MARK: - Text field reactor operators
13 | precedencegroup RPrecedence {
14 | higherThan: BitwiseShiftPrecedence
15 | }
16 |
17 | infix operator <&> : RPrecedence
18 |
19 | /**
20 | Links text field to data flow
21 |
22 | - parameters:
23 | - left: Text field.
24 | - right: `DataFlow` object.
25 |
26 | - returns: `TextFieldReactor` object
27 | */
28 | public func <&>
29 | (left: UITextField, right: DataFlow) -> TextFieldReactor
30 | where
31 | FlowDataSource.ResultType == FlowDataDestination.DataType
32 | {
33 | return TextFieldReactor(textField: left, dataFlow: right)
34 | }
35 |
36 | // MARK: - Text field reactor
37 |
38 | /**
39 | TextFieldReactor
40 | --
41 |
42 | Implements reactive handling text field editing and passes editing changes to data flow
43 | */
44 | public struct TextFieldReactor
45 | <
46 | DS: FlowDataSource,
47 | DD: FlowDataDestination>
48 | where
49 | DS.ResultType == DD.DataType,
50 | DS.QueryType == String
51 |
52 | {
53 | let textField : UITextField
54 | let dataFlow : DataFlow
55 |
56 | fileprivate let editingTarget: TextFieldTarget
57 |
58 | fileprivate init(textField: UITextField, dataFlow: DataFlow) {
59 | self.textField = textField
60 | self.dataFlow = dataFlow
61 |
62 | self.editingTarget = TextFieldTarget(controlEvents: UIControl.Event.editingChanged, textField: textField) {
63 | if let text = $0.text {
64 | dataFlow.transport(text)
65 | }
66 | }
67 | }
68 |
69 | }
70 |
71 | final class TextFieldTarget: NSObject {
72 |
73 | static let actionSelector = #selector(TextFieldTarget.action(_:))
74 |
75 | typealias HookType = (UITextField) -> ()
76 |
77 | override init() {
78 | super.init()
79 | }
80 |
81 | init(controlEvents:UIControl.Event, textField: UITextField, hook: @escaping HookType) {
82 | super.init()
83 |
84 | self.beTargetFor(textField, controlEvents: controlEvents, hook: hook)
85 | }
86 |
87 | var hooks: [UITextField: HookType] = [:]
88 | func beTargetFor(_ textField: UITextField, controlEvents:UIControl.Event, hook: @escaping HookType) {
89 | textField.addTarget(self, action: TextFieldTarget.actionSelector, for: controlEvents)
90 | hooks[textField] = hook
91 | }
92 |
93 | deinit {
94 | for (textField, _) in hooks {
95 | textField.removeTarget(self, action: TextFieldTarget.actionSelector, for: UIControl.Event.allEvents)
96 | }
97 | }
98 |
99 | @objc func action(_ textField: UITextField) {
100 | let hook = hooks[textField]
101 | hook?(textField)
102 | }
103 |
104 | }
105 |
--------------------------------------------------------------------------------
/RAMReel/Framework/Theme.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Theme.swift
3 | // RAMReel
4 | //
5 | // Created by Mikhail Stepkin on 4/11/15.
6 | // Copyright (c) 2015 Ramotion. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | // MARK: Theme
12 | /**
13 | Theme
14 | --
15 |
16 | Protocol that allows you change visual appearance a bit.
17 | */
18 | public protocol Theme {
19 |
20 | /**
21 | Text font of both list labels and input textfield.
22 | */
23 | var font: UIFont { get }
24 | /**
25 | Color of textfield's text.
26 |
27 | Suggestion list's text color is calculated using this color by changing alpha channel value to `0.3`.
28 | */
29 | var textColor: UIColor { get }
30 |
31 | /**
32 | Color of list's background.
33 | */
34 | var listBackgroundColor: UIColor { get }
35 |
36 | }
37 |
38 | /**
39 | RAMTheme
40 | --
41 |
42 | Theme prefab.
43 | */
44 | public struct RAMTheme: Theme {
45 |
46 | /// Shared theme with default settings.
47 | public static let sharedTheme = RAMTheme()
48 |
49 | /// Theme font.
50 | public let font: UIFont
51 | /// Theme text color.
52 | public let textColor: UIColor
53 | /// Theme background color.
54 | public let listBackgroundColor: UIColor
55 |
56 | fileprivate init(
57 | textColor: UIColor = UIColor.black,
58 | listBackgroundColor: UIColor = UIColor.clear,
59 | font: UIFont = RAMTheme.defaultFont
60 | )
61 | {
62 | self.textColor = textColor
63 | self.listBackgroundColor = listBackgroundColor
64 | self.font = font
65 | }
66 |
67 | fileprivate static var defaultFont: UIFont = RAMTheme.initDefaultFont()
68 |
69 | fileprivate static func initDefaultFont() -> UIFont {
70 | do {
71 | let _ = try FontLoader.loadRobotoLight()
72 | } catch (let error) {
73 | print(error)
74 | }
75 |
76 | let font: UIFont
77 | if
78 | let robotoLoaded = FontLoader.robotoLight,
79 | let roboto = UIFont(name: robotoLoaded.name, size: 36)
80 | {
81 | font = roboto
82 | } else if #available(iOS 8.2, *) {
83 | font = UIFont.systemFont(ofSize: 36, weight: UIFont.Weight.thin)
84 | } else {
85 | font = UIFont.systemFont(ofSize: 36)
86 | }
87 | return font
88 | }
89 |
90 | /**
91 | Creates new theme with new text color.
92 |
93 | - parameter textColor: New text color.
94 | - returns: New `RAMTheme` instance.
95 | */
96 | public func textColor(_ textColor: UIColor) -> RAMTheme {
97 | return RAMTheme(textColor: textColor, listBackgroundColor: self.listBackgroundColor, font: self.font)
98 | }
99 |
100 | /**
101 | Creates new theme with new background color.
102 |
103 | - parameter listBackgroundColor: New background color.
104 | - returns: New `RAMTheme` instance.
105 | */
106 | public func listBackgroundColor(_ listBackgroundColor: UIColor) -> RAMTheme {
107 | return RAMTheme(textColor: self.textColor, listBackgroundColor: listBackgroundColor, font: self.font)
108 | }
109 |
110 | /**
111 | Creates new theme with new font.
112 |
113 | - parameter font: New font.
114 | - returns: New `RAMTheme` instance.
115 | */
116 | public func font(_ font: UIFont) -> RAMTheme {
117 | return RAMTheme(textColor: self.textColor, listBackgroundColor: self.listBackgroundColor, font: font)
118 | }
119 |
120 | }
121 |
122 | // MARK: - Font loader
123 |
124 | /**
125 | FontLoader
126 | --
127 | */
128 | final class FontLoader {
129 |
130 | enum AnError: Error {
131 | case failedToLoadFont(String)
132 | }
133 |
134 | static let robotoLight: FontLoader? = try? FontLoader.loadRobotoLight()
135 |
136 | static func loadRobotoLight() throws -> FontLoader {
137 | return try FontLoader(name: "Roboto-Light", type: "ttf")
138 | }
139 |
140 | let name: String
141 | let type: String
142 |
143 | fileprivate init(name: String, type: String) throws {
144 | self.name = name
145 | self.type = type
146 |
147 | guard FontLoader.loadedFonts[name] == nil else {
148 | return
149 | }
150 |
151 | let bundle = Bundle(for: Swift.type(of: self) as AnyClass)
152 |
153 | if
154 | let fontPath = bundle.path(forResource: name, ofType: type),
155 | let inData = try? Data(contentsOf: URL(fileURLWithPath: fontPath)),
156 | let provider = CGDataProvider(data: inData as CFData)
157 | {
158 | let font = CGFont(provider)
159 | CTFontManagerRegisterGraphicsFont(font!, nil)
160 | FontLoader.loadedFonts[self.name] = self
161 | return
162 | } else {
163 | throw AnError.failedToLoadFont(name)
164 | }
165 | }
166 |
167 | fileprivate static var loadedFonts: [String: FontLoader] = [:]
168 |
169 | }
170 |
--------------------------------------------------------------------------------
/RAMReel/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.2.1
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | $(CURRENT_PROJECT_VERSION)
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/RAMReel/Roboto/Roboto-Light.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ramotion/reel-search/fde22643b50c0b4235c3ada2b82c904f0a61d48c/RAMReel/Roboto/Roboto-Light.ttf
--------------------------------------------------------------------------------
/RAMReelExample.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/RAMReelExample/RAMReelExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/RAMReelExample/RAMReelExample/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // RAMReel
4 | //
5 | // Created by Mikhail Stepkin on 4/2/15.
6 | // Copyright (c) 2015 Ramotion. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import CoreData
11 |
12 | @UIApplicationMain
13 | class AppDelegate: UIResponder, UIApplicationDelegate {
14 |
15 | var window: UIWindow?
16 |
17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
18 |
19 | return true
20 | }
21 | }
22 |
23 |
--------------------------------------------------------------------------------
/RAMReelExample/RAMReelExample/Base.lproj/LaunchScreen.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/RAMReelExample/RAMReelExample/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/RAMReelExample/RAMReelExample/Images.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "29x29",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "29x29",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "40x40",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "40x40",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "60x60",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "60x60",
31 | "scale" : "3x"
32 | },
33 | {
34 | "idiom" : "ipad",
35 | "size" : "29x29",
36 | "scale" : "1x"
37 | },
38 | {
39 | "idiom" : "ipad",
40 | "size" : "29x29",
41 | "scale" : "2x"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "size" : "40x40",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "size" : "40x40",
51 | "scale" : "2x"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "size" : "76x76",
56 | "scale" : "1x"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "size" : "76x76",
61 | "scale" : "2x"
62 | }
63 | ],
64 | "info" : {
65 | "version" : 1,
66 | "author" : "xcode"
67 | }
68 | }
--------------------------------------------------------------------------------
/RAMReelExample/RAMReelExample/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 | LSRequiresIPhoneOS
24 |
25 | UILaunchStoryboardName
26 | LaunchScreen
27 | UIMainStoryboardFile
28 | Main
29 | UIRequiredDeviceCapabilities
30 |
31 | armv7
32 |
33 | UISupportedInterfaceOrientations
34 |
35 | UIInterfaceOrientationPortrait
36 | UIInterfaceOrientationLandscapeLeft
37 | UIInterfaceOrientationLandscapeRight
38 |
39 | UISupportedInterfaceOrientations~ipad
40 |
41 | UIInterfaceOrientationPortrait
42 | UIInterfaceOrientationPortraitUpsideDown
43 | UIInterfaceOrientationLandscapeLeft
44 | UIInterfaceOrientationLandscapeRight
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/RAMReelExample/RAMReelExample/ViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.swift
3 | // RAMReel
4 | //
5 | // Created by Mikhail Stepkin on 4/2/15.
6 | // Copyright (c) 2015 Ramotion. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import RAMReel
11 |
12 | @available(iOS 8.2, *)
13 | class ViewController: UIViewController, UICollectionViewDelegate {
14 |
15 | var dataSource: SimplePrefixQueryDataSource!
16 | var ramReel: RAMReel!
17 |
18 | override func viewDidLoad() {
19 | super.viewDidLoad()
20 |
21 | dataSource = SimplePrefixQueryDataSource(data)
22 |
23 | ramReel = RAMReel(frame: view.bounds, dataSource: dataSource, placeholder: "Start by typing…", attemptToDodgeKeyboard: true) {
24 | print("Plain:", $0)
25 | }
26 |
27 | ramReel.hooks.append {
28 | let r = Array($0.reversed())
29 | let j = String(r)
30 | print("Reversed:", j)
31 | }
32 |
33 | view.addSubview(ramReel.view)
34 | ramReel.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
35 | }
36 |
37 | fileprivate let data: [String] = {
38 | do {
39 | guard let dataPath = Bundle.main.path(forResource: "data", ofType: "txt") else {
40 | return []
41 | }
42 |
43 | let data = try WordReader(filepath: dataPath)
44 | return data.words
45 | }
46 | catch let error {
47 | print(error)
48 | return []
49 | }
50 | }()
51 | }
52 |
--------------------------------------------------------------------------------
/RAMReelExample/RAMReelExample/WordReader.swift:
--------------------------------------------------------------------------------
1 | //
2 | // WordReader.swift
3 | // RAMReelExample
4 | //
5 | // Created by Mikhail Stepkin on 01.02.16.
6 | // Copyright © 2016 Ramotion. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public final class WordReader {
12 |
13 | fileprivate(set) public var words: [String] = []
14 |
15 | init (filepath: String) throws {
16 | let fileManager = FileManager.default
17 |
18 | guard fileManager.fileExists(atPath: filepath) else {
19 | throw AnError.fileDoesntExist(filepath)
20 | }
21 |
22 | guard fileManager.isReadableFile(atPath: filepath) else {
23 | throw AnError.fileIsNotReadable(filepath)
24 | }
25 |
26 | let contents = try String(contentsOfFile: filepath)
27 |
28 | guard !contents.isEmpty else {
29 | throw AnError.fileIsEmpty(filepath)
30 | }
31 |
32 | let words = contents.split(separator: "\n")
33 | self.words = words.map(String.init)
34 | }
35 |
36 | enum AnError: Error {
37 | case fileDoesntExist(String)
38 | case fileIsNotReadable(String)
39 | case fileIsEmpty(String)
40 | }
41 |
42 | }
43 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
REEL SEARCH
7 |
8 | Reel Search is a Swift UI controller that allows you to choose options from a list
9 |
10 |
11 | ___
12 |
13 |
14 |
15 |
We specialize in the designing and coding of custom UI for Mobile Apps and Websites.
16 |
17 |
18 |
19 |
Stay tuned for the latest updates:
20 |
21 |
22 |
23 |
24 |
25 | # RAMReel
26 | [](https://developer.apple.com/swift/)
27 | [](https://cocoapods.org/pods/RAMReel)
28 | [](http://cocoapods.org/pods/RAMReel)
29 | [](https://github.com/Ramotion/reel-search)
30 | [](https://codebeat.co/projects/github-com-ramotion-reel-search)
31 | [](https://travis-ci.org/Ramotion/reel-search)
32 | [](http://twitter.com/Ramotion)
33 | [](https://paypal.me/Ramotion)
34 |
35 | ## Requirements
36 |
37 | - iOS 8.0+
38 | - Swift 4.0
39 |
40 | ## Installation
41 |
42 | We recommend using **[CocoaPods](https://cocoapods.org/)** to install our library.
43 |
44 | Just put this in your `Podfile`:
45 |
46 | ~~~ruby
47 | pod 'RAMReel'
48 | ~~~
49 |
50 | or [Carthage](https://github.com/Carthage/Carthage) users can simply add `reel-search` to their `Cartfile`:
51 | ```
52 | github "Ramotion/reel-search"
53 | ```
54 |
55 | ## Usage
56 |
57 | In order to use our control you need to implement the following:
58 |
59 | ### Types
60 | - **`CellClass`**: Your cell class must inherit from [`UICollectionViewCell`](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UICollectionViewCell_class/) and implement the [`ConfigurableCell`](https://rawgit.com/Ramotion/reel-search/master/docs/Protocols/ConfigurableCell.html) protocol. Or you can just use our predefined class [`RAMCell`](https://rawgit.com/Ramotion/reel-search/master/docs/Classes/RAMCell.html).
61 | - **`TextFieldClass`**: Any subclass of [`UITextField`](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITextField_Class/) will do.
62 | - **`DataSource`**: Your type must implement the [`FlowDataSource`](https://rawgit.com/Ramotion/reel-search/master/docs/Protocols/FlowDataSource.html) protocol, with `QueryType` being `String` and `ResultType` being [`Renderable`](https://rawgit.com/Ramotion/reel-search/master/docs/Protocols/Renderable.html) and [`Parsable`](https://rawgit.com/Ramotion/reel-search/master/docs/Protocols/Parsable.html). Or you can just use our predefined class [`SimplePrefixQueryDataSource`](https://rawgit.com/Ramotion/reel-search/master/docs/Structs/SimplePrefixQueryDataSource.html), which has its `ResultType` set to `String`.
63 |
64 | Now you can use those types as generic parameters of type declaration of `RAMReel`:
65 |
66 | ~~~swift
67 | RAMReel
68 | ~~~
69 |
70 | ### Values
71 | Next you need to create an instance of `RAMReel`, and for that you need the following:
72 |
73 | - **`frame: CGRect`**: Rect, specifying where you want to put the control.
74 | - **`dataSource: DataSource`**: the source of data for the reel.
75 | - **`placeholder: String`** (*optional*): Placeholder text; by default, an empty string is used.
76 | - **`hook: DataSource.ResultType -> Void`** (*optional*): Action to perform on element selection, `nil` by default. You can add additional hooks later, if you need multiple actions performed.
77 |
78 | Let's use it to create an instance of `RAMReel`:
79 |
80 | ~~~swift
81 | let ramReel = RAMReel(frame: frame, dataSource: dataSource, placeholder: placeholder, hook: hook)
82 | ~~~
83 |
84 | ### Adding action hooks
85 |
86 | To add extra actions you may append `DataSource.ResultType -> Void` functions to `RAMReel` object property `hooks`:
87 |
88 | ~~~swift
89 | ramReel.hooks.append { data in
90 | // your code goes here
91 | }
92 | ~~~
93 |
94 | ### Putting on the view
95 |
96 | And the final step, showing `RAMReel` on your view:
97 |
98 | ~~~swift
99 | ramReel.view.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
100 | yourView.addSubview(ramReel.view)
101 | ~~~
102 |
103 | If you have visual problems, try calling [`prepareForViewing`](https://rawgit.com/Ramotion/reel-search/master/docs/Classes/RAMReel.html#/s:FC7RAMReel7RAMReel17prepareForViewingu1_Rdq_CSo20UICollectionViewCellq_S_16ConfigurableCelldq0_CSo11UITextFieldq1_S_14FlowDataSourceqq_S2_8DataTypeS_8Parsableqq_S2_8DataTypeS_10Renderablezqq_S2_8DataTypeqq1_S4_10ResultTypezqq1_S4_9QueryTypeSS_FGS0_q_q0_q1__FT_T_) before showing your view.
104 |
105 | Like this:
106 |
107 | ~~~swift
108 | override func viewDidLayoutSubviews() {
109 | super.viewDidLayoutSubviews()
110 | ramReel.prepareForViewing()
111 | }
112 | ~~~
113 |
114 | ### Theming
115 |
116 | If you want to change `RAMReel` look and feel, you can use theming.
117 |
118 | To do so, you just to have to implement the [`Theme`](https://rawgit.com/Ramotion/reel-search/master/docs/Protocols/Theme.html) protocol in your class/structure and set your `RAMReel` object's `theme` property to your theme.
119 |
120 | Or you can just use the predefined instance of type [`RAMTheme`](https://rawgit.com/Ramotion/reel-search/master/docs/Structs/RAMTheme.html).
121 |
122 | ~~~swift
123 | let textColor: UIColor
124 | let listBackgroundColor: UIColor
125 | let font: UIFont
126 |
127 | let theme = RAMTheme(textColor: textColor, listBackgroundColor: listBackgroundColor, font: font)
128 | ~~~
129 |
130 | ### Docs
131 |
132 | [](https://rawgit.com/Ramotion/reel-search/master/docs/index.html)
133 |
134 | See more at [RAMReel docs](https://rawgit.com/Ramotion/reel-search/master/docs/index.html)
135 |
136 |
137 |
138 | ## 📄 License
139 |
140 | Reel Search is released under the MIT license.
141 | See [LICENSE](./LICENSE) for details.
142 |
143 | This library is a part of a selection of our best UI open-source projects.
144 |
145 | If you use the open-source library in your project, please make sure to credit and backlink to www.ramotion.com
146 |
147 | ## 📱 Get the Showroom App for iOS to give it a try
148 | Try this UI component and more like this in our iOS app. Contact us if interested.
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
--------------------------------------------------------------------------------
/Sources:
--------------------------------------------------------------------------------
1 | RAMReel/Framework/
--------------------------------------------------------------------------------
/docs/Extensions/UIImage.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | UIImage Extension Reference
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
20 |
21 |
22 | RAMReel Reference
23 |
24 | UIImage Extension Reference
25 |
26 |
27 |
28 |
118 |
119 |
120 |
121 | UIImage
122 | Undocumented
123 |
124 |
125 |
126 |
127 |
128 |
129 |
136 |
137 |
138 |
139 |
140 |
141 |
Undocumented
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
155 |
156 |
157 |
158 |
159 |
160 |
--------------------------------------------------------------------------------
/docs/Extensions/UITextField.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | UITextField Extension Reference
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
20 |
21 |
22 | RAMReel Reference
23 |
24 | UITextField Extension Reference
25 |
26 |
27 |
28 |
114 |
115 |
116 |
117 | UITextField
118 |
119 |
120 |
class UITextField : UIControl , UITextInput , NSCoding
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 | tintColor
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
Overriding UITextField
tintColor
property to make it affect close image tint color.
143 |
144 |
145 |
146 |
Declaration
147 |
148 |
Swift
149 |
public override var tintColor : UIColor !
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
164 |
165 |
166 |
167 |
168 |
169 |
--------------------------------------------------------------------------------
/docs/Generic Type Parameters.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Generic Type Parameters Reference
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
19 |
20 |
21 | RAMReel Reference
22 |
23 | Generic Type Parameters Reference
24 |
25 |
26 |
27 |
117 |
118 |
119 |
120 | Generic Type Parameters
121 | The following generic type parameters are available globally.
122 |
123 |
124 |
125 |
126 |
133 |
134 |
135 |
136 |
137 |
138 |
139 | DS
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
Undocumented
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
161 |
162 |
163 |
164 |
165 |
166 |
--------------------------------------------------------------------------------
/docs/Protocols/FlowDataDestination.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | FlowDataDestination Protocol Reference
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
20 |
21 |
22 | RAMReel Reference
23 |
24 | FlowDataDestination Protocol Reference
25 |
26 |
27 |
28 |
118 |
119 |
120 |
121 | FlowDataDestination
122 | Undocumented
123 |
124 |
125 |
126 |
127 |
128 |
129 |
136 |
137 |
138 |
139 |
140 |
141 |
Undocumented
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
155 |
156 |
157 |
158 |
159 |
160 |
--------------------------------------------------------------------------------
/docs/Protocols/FlowDataSource.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | FlowDataSource Protocol Reference
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
20 |
21 |
22 | RAMReel Reference
23 |
24 | FlowDataSource Protocol Reference
25 |
26 |
27 |
28 |
118 |
119 |
120 |
121 | FlowDataSource
122 | Undocumented
123 |
124 |
125 |
126 |
127 |
128 |
129 |
136 |
137 |
138 |
139 |
140 |
141 |
Undocumented
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
155 |
156 |
157 |
158 |
159 |
160 |
--------------------------------------------------------------------------------
/docs/Protocols/Renderable.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Renderable Protocol Reference
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
20 |
21 |
22 | RAMReel Reference
23 |
24 | Renderable Protocol Reference
25 |
26 |
27 |
28 |
118 |
119 |
120 |
121 | Renderable
122 |
123 |
124 |
public protocol Renderable
125 |
126 |
127 |
128 |
Renderable
129 |
130 | Types that implement this protocol are expected to have string representation.
131 | This protocol is separated from Printable and it’s description property on purpose.
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 | render()
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
Implement this method in order to be able to put data to textField field
151 | Simplest implementation may return just object description
152 |
153 |
154 |
155 |
Declaration
156 |
157 |
Swift
158 |
func render () -> String
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
173 |
174 |
175 |
176 |
177 |
178 |
--------------------------------------------------------------------------------
/docs/Structs/SimplePrefixQueryDataSource.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | SimplePrefixQueryDataSource Struct Reference
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
20 |
21 |
22 | RAMReel Reference
23 |
24 | SimplePrefixQueryDataSource Struct Reference
25 |
26 |
27 |
28 |
118 |
119 |
120 |
121 | SimplePrefixQueryDataSource
122 | Undocumented
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 | init(_:)
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
Undocumented
142 |
143 |
144 |
145 |
146 |
147 |
148 |
155 |
156 |
157 |
158 |
159 |
160 |
Undocumented
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
174 |
175 |
176 |
177 |
178 |
179 |
--------------------------------------------------------------------------------
/docs/Typealiases.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Typealiases Reference
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
19 |
20 |
21 | RAMReel Reference
22 |
23 | Typealiases Reference
24 |
25 |
26 |
27 |
117 |
118 |
119 |
120 | Typealiases
121 | The following typealiases are available globally.
122 |
123 |
124 |
125 |
126 |
133 |
134 |
135 |
136 |
137 |
138 |
139 | HookType
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
Type of selected item change callback hook
148 |
149 |
150 |
151 |
Declaration
152 |
153 |
Swift
154 |
public typealias HookType = ( DataSource . ResultType ) -> ()
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
169 |
170 |
171 |
172 |
173 |
174 |
--------------------------------------------------------------------------------
/docs/css/highlight.css:
--------------------------------------------------------------------------------
1 | /* Credit to https://gist.github.com/wataru420/2048287 */
2 | .highlight {
3 | /* Comment */
4 | /* Error */
5 | /* Keyword */
6 | /* Operator */
7 | /* Comment.Multiline */
8 | /* Comment.Preproc */
9 | /* Comment.Single */
10 | /* Comment.Special */
11 | /* Generic.Deleted */
12 | /* Generic.Deleted.Specific */
13 | /* Generic.Emph */
14 | /* Generic.Error */
15 | /* Generic.Heading */
16 | /* Generic.Inserted */
17 | /* Generic.Inserted.Specific */
18 | /* Generic.Output */
19 | /* Generic.Prompt */
20 | /* Generic.Strong */
21 | /* Generic.Subheading */
22 | /* Generic.Traceback */
23 | /* Keyword.Constant */
24 | /* Keyword.Declaration */
25 | /* Keyword.Pseudo */
26 | /* Keyword.Reserved */
27 | /* Keyword.Type */
28 | /* Literal.Number */
29 | /* Literal.String */
30 | /* Name.Attribute */
31 | /* Name.Builtin */
32 | /* Name.Class */
33 | /* Name.Constant */
34 | /* Name.Entity */
35 | /* Name.Exception */
36 | /* Name.Function */
37 | /* Name.Namespace */
38 | /* Name.Tag */
39 | /* Name.Variable */
40 | /* Operator.Word */
41 | /* Text.Whitespace */
42 | /* Literal.Number.Float */
43 | /* Literal.Number.Hex */
44 | /* Literal.Number.Integer */
45 | /* Literal.Number.Oct */
46 | /* Literal.String.Backtick */
47 | /* Literal.String.Char */
48 | /* Literal.String.Doc */
49 | /* Literal.String.Double */
50 | /* Literal.String.Escape */
51 | /* Literal.String.Heredoc */
52 | /* Literal.String.Interpol */
53 | /* Literal.String.Other */
54 | /* Literal.String.Regex */
55 | /* Literal.String.Single */
56 | /* Literal.String.Symbol */
57 | /* Name.Builtin.Pseudo */
58 | /* Name.Variable.Class */
59 | /* Name.Variable.Global */
60 | /* Name.Variable.Instance */
61 | /* Literal.Number.Integer.Long */ }
62 | .highlight .c {
63 | color: #999988;
64 | font-style: italic; }
65 | .highlight .err {
66 | color: #a61717;
67 | background-color: #e3d2d2; }
68 | .highlight .k {
69 | color: #000000;
70 | font-weight: bold; }
71 | .highlight .o {
72 | color: #000000;
73 | font-weight: bold; }
74 | .highlight .cm {
75 | color: #999988;
76 | font-style: italic; }
77 | .highlight .cp {
78 | color: #999999;
79 | font-weight: bold; }
80 | .highlight .c1 {
81 | color: #999988;
82 | font-style: italic; }
83 | .highlight .cs {
84 | color: #999999;
85 | font-weight: bold;
86 | font-style: italic; }
87 | .highlight .gd {
88 | color: #000000;
89 | background-color: #ffdddd; }
90 | .highlight .gd .x {
91 | color: #000000;
92 | background-color: #ffaaaa; }
93 | .highlight .ge {
94 | color: #000000;
95 | font-style: italic; }
96 | .highlight .gr {
97 | color: #aa0000; }
98 | .highlight .gh {
99 | color: #999999; }
100 | .highlight .gi {
101 | color: #000000;
102 | background-color: #ddffdd; }
103 | .highlight .gi .x {
104 | color: #000000;
105 | background-color: #aaffaa; }
106 | .highlight .go {
107 | color: #888888; }
108 | .highlight .gp {
109 | color: #555555; }
110 | .highlight .gs {
111 | font-weight: bold; }
112 | .highlight .gu {
113 | color: #aaaaaa; }
114 | .highlight .gt {
115 | color: #aa0000; }
116 | .highlight .kc {
117 | color: #000000;
118 | font-weight: bold; }
119 | .highlight .kd {
120 | color: #000000;
121 | font-weight: bold; }
122 | .highlight .kp {
123 | color: #000000;
124 | font-weight: bold; }
125 | .highlight .kr {
126 | color: #000000;
127 | font-weight: bold; }
128 | .highlight .kt {
129 | color: #445588; }
130 | .highlight .m {
131 | color: #009999; }
132 | .highlight .s {
133 | color: #d14; }
134 | .highlight .na {
135 | color: #008080; }
136 | .highlight .nb {
137 | color: #0086B3; }
138 | .highlight .nc {
139 | color: #445588;
140 | font-weight: bold; }
141 | .highlight .no {
142 | color: #008080; }
143 | .highlight .ni {
144 | color: #800080; }
145 | .highlight .ne {
146 | color: #990000;
147 | font-weight: bold; }
148 | .highlight .nf {
149 | color: #990000; }
150 | .highlight .nn {
151 | color: #555555; }
152 | .highlight .nt {
153 | color: #000080; }
154 | .highlight .nv {
155 | color: #008080; }
156 | .highlight .ow {
157 | color: #000000;
158 | font-weight: bold; }
159 | .highlight .w {
160 | color: #bbbbbb; }
161 | .highlight .mf {
162 | color: #009999; }
163 | .highlight .mh {
164 | color: #009999; }
165 | .highlight .mi {
166 | color: #009999; }
167 | .highlight .mo {
168 | color: #009999; }
169 | .highlight .sb {
170 | color: #d14; }
171 | .highlight .sc {
172 | color: #d14; }
173 | .highlight .sd {
174 | color: #d14; }
175 | .highlight .s2 {
176 | color: #d14; }
177 | .highlight .se {
178 | color: #d14; }
179 | .highlight .sh {
180 | color: #d14; }
181 | .highlight .si {
182 | color: #d14; }
183 | .highlight .sx {
184 | color: #d14; }
185 | .highlight .sr {
186 | color: #009926; }
187 | .highlight .s1 {
188 | color: #d14; }
189 | .highlight .ss {
190 | color: #990073; }
191 | .highlight .bp {
192 | color: #999999; }
193 | .highlight .vc {
194 | color: #008080; }
195 | .highlight .vg {
196 | color: #008080; }
197 | .highlight .vi {
198 | color: #008080; }
199 | .highlight .il {
200 | color: #009999; }
201 |
--------------------------------------------------------------------------------
/docs/css/jazzy.css:
--------------------------------------------------------------------------------
1 | html, body, div, span, h1, h3, h4, p, a, code, em, img, ul, li, table, tbody, tr, td {
2 | background: transparent;
3 | border: 0;
4 | margin: 0;
5 | outline: 0;
6 | padding: 0;
7 | vertical-align: baseline; }
8 |
9 | body {
10 | background-color: #f2f2f2;
11 | font-family: Helvetica, freesans, Arial, sans-serif;
12 | font-size: 14px;
13 | -webkit-font-smoothing: subpixel-antialiased;
14 | word-wrap: break-word; }
15 |
16 | h1, h2, h3 {
17 | margin-top: 0.8em;
18 | margin-bottom: 0.3em;
19 | font-weight: 100;
20 | color: black; }
21 |
22 | h1 {
23 | font-size: 2.5em; }
24 |
25 | h2 {
26 | font-size: 2em;
27 | border-bottom: 1px solid #e2e2e2; }
28 |
29 | h4 {
30 | font-size: 13px;
31 | line-height: 1.5;
32 | margin-top: 21px; }
33 |
34 | h5 {
35 | font-size: 1.1em; }
36 |
37 | h6 {
38 | font-size: 1.1em;
39 | color: #777; }
40 |
41 | .section-name {
42 | color: gray;
43 | display: block;
44 | font-family: Helvetica;
45 | font-size: 22px;
46 | font-weight: 100;
47 | margin-bottom: 15px; }
48 |
49 | pre, code {
50 | font: 0.95em Menlo, monospace;
51 | color: #777;
52 | word-wrap: normal; }
53 |
54 | p code, li code {
55 | background-color: #eee;
56 | padding: 2px 4px;
57 | border-radius: 4px; }
58 |
59 | a {
60 | color: #0088cc;
61 | text-decoration: none; }
62 |
63 | ul {
64 | padding-left: 15px; }
65 |
66 | li {
67 | line-height: 1.8em; }
68 |
69 | img {
70 | max-width: 100%; }
71 |
72 | blockquote {
73 | margin-left: 0;
74 | padding: 0 10px;
75 | border-left: 4px solid #ccc; }
76 |
77 | .content-wrapper {
78 | margin: 0 auto;
79 | width: 980px; }
80 |
81 | header {
82 | font-size: 0.85em;
83 | line-height: 26px;
84 | background-color: #414141;
85 | position: fixed;
86 | width: 100%;
87 | z-index: 1; }
88 | header img {
89 | padding-right: 6px;
90 | vertical-align: -4px;
91 | height: 16px; }
92 | header a {
93 | color: #fff; }
94 | header p {
95 | float: left;
96 | color: #999; }
97 | header .header-right {
98 | float: right;
99 | margin-left: 16px; }
100 |
101 | #breadcrumbs {
102 | background-color: #f2f2f2;
103 | height: 27px;
104 | padding-top: 17px;
105 | position: fixed;
106 | width: 100%;
107 | z-index: 1;
108 | margin-top: 26px; }
109 | #breadcrumbs #carat {
110 | height: 10px;
111 | margin: 0 5px; }
112 |
113 | .sidebar {
114 | background-color: #f9f9f9;
115 | border: 1px solid #e2e2e2;
116 | overflow-y: auto;
117 | overflow-x: hidden;
118 | position: fixed;
119 | top: 70px;
120 | bottom: 0;
121 | width: 230px;
122 | word-wrap: normal; }
123 |
124 | .nav-groups {
125 | list-style-type: none;
126 | background: #fff;
127 | padding-left: 0; }
128 |
129 | .nav-group-name {
130 | border-bottom: 1px solid #e2e2e2;
131 | font-size: 1.1em;
132 | font-weight: 100;
133 | padding: 15px 0 15px 20px; }
134 | .nav-group-name > a {
135 | color: #333; }
136 |
137 | .nav-group-tasks {
138 | margin-top: 5px; }
139 |
140 | .nav-group-task {
141 | font-size: 0.9em;
142 | list-style-type: none;
143 | white-space: nowrap; }
144 | .nav-group-task a {
145 | color: #888; }
146 |
147 | .main-content {
148 | background-color: #fff;
149 | border: 1px solid #e2e2e2;
150 | margin-left: 246px;
151 | position: absolute;
152 | overflow: hidden;
153 | padding-bottom: 60px;
154 | top: 70px;
155 | width: 734px; }
156 | .main-content p, .main-content a, .main-content code, .main-content em, .main-content ul, .main-content table, .main-content blockquote {
157 | margin-bottom: 1em; }
158 | .main-content p {
159 | line-height: 1.8em; }
160 | .main-content section .section:first-child {
161 | margin-top: 0;
162 | padding-top: 0; }
163 | .main-content section .task-group-section .task-group:first-of-type {
164 | padding-top: 10px; }
165 | .main-content section .task-group-section .task-group:first-of-type .section-name {
166 | padding-top: 15px; }
167 |
168 | .section {
169 | padding: 0 25px; }
170 |
171 | .highlight {
172 | background-color: #eee;
173 | padding: 10px 12px;
174 | border: 1px solid #e2e2e2;
175 | border-radius: 4px;
176 | overflow-x: auto; }
177 |
178 | .declaration .highlight {
179 | overflow-x: initial;
180 | padding: 0 40px 40px 0;
181 | margin-bottom: -25px;
182 | background-color: transparent;
183 | border: none; }
184 |
185 | .section-name {
186 | margin: 0;
187 | margin-left: 18px; }
188 |
189 | .task-group-section {
190 | padding-left: 6px;
191 | border-top: 1px solid #e2e2e2; }
192 |
193 | .task-group {
194 | padding-top: 0px; }
195 |
196 | .task-name-container a[name]:before {
197 | content: "";
198 | display: block;
199 | padding-top: 70px;
200 | margin: -70px 0 0; }
201 |
202 | .item {
203 | padding-top: 8px;
204 | width: 100%;
205 | list-style-type: none; }
206 | .item a[name]:before {
207 | content: "";
208 | display: block;
209 | padding-top: 70px;
210 | margin: -70px 0 0; }
211 | .item code {
212 | background-color: transparent;
213 | padding: 0; }
214 | .item .token {
215 | padding-left: 3px;
216 | margin-left: 15px;
217 | font-size: 11.9px; }
218 | .item .declaration-note {
219 | font-size: .85em;
220 | color: gray;
221 | font-style: italic; }
222 |
223 | .pointer-container {
224 | border-bottom: 1px solid #e2e2e2;
225 | left: -23px;
226 | padding-bottom: 13px;
227 | position: relative;
228 | width: 110%; }
229 |
230 | .pointer {
231 | background: #f9f9f9;
232 | border-left: 1px solid #e2e2e2;
233 | border-top: 1px solid #e2e2e2;
234 | height: 12px;
235 | left: 21px;
236 | top: -7px;
237 | -webkit-transform: rotate(45deg);
238 | -moz-transform: rotate(45deg);
239 | -o-transform: rotate(45deg);
240 | transform: rotate(45deg);
241 | position: absolute;
242 | width: 12px; }
243 |
244 | .height-container {
245 | display: none;
246 | left: -25px;
247 | padding: 0 25px;
248 | position: relative;
249 | width: 100%;
250 | overflow: hidden; }
251 | .height-container .section {
252 | background: #f9f9f9;
253 | border-bottom: 1px solid #e2e2e2;
254 | left: -25px;
255 | position: relative;
256 | width: 100%;
257 | padding-top: 10px;
258 | padding-bottom: 5px; }
259 |
260 | .aside, .language {
261 | padding: 6px 12px;
262 | margin: 12px 0;
263 | border-left: 5px solid #dddddd;
264 | overflow-y: hidden; }
265 | .aside .aside-title, .language .aside-title {
266 | font-size: 9px;
267 | letter-spacing: 2px;
268 | text-transform: uppercase;
269 | padding-bottom: 0;
270 | margin: 0;
271 | color: #aaa;
272 | -webkit-user-select: none; }
273 | .aside p:last-child, .language p:last-child {
274 | margin-bottom: 0; }
275 |
276 | .language {
277 | border-left: 5px solid #cde9f4; }
278 | .language .aside-title {
279 | color: #4b8afb; }
280 |
281 | .aside-warning {
282 | border-left: 5px solid #ff6666; }
283 | .aside-warning .aside-title {
284 | color: #ff0000; }
285 |
286 | .graybox {
287 | border-collapse: collapse;
288 | width: 100%; }
289 | .graybox p {
290 | margin: 0;
291 | word-break: break-word;
292 | min-width: 50px; }
293 | .graybox td {
294 | border: 1px solid #e2e2e2;
295 | padding: 5px 25px 5px 10px;
296 | vertical-align: middle; }
297 | .graybox tr td:first-of-type {
298 | text-align: right;
299 | padding: 7px;
300 | vertical-align: top;
301 | word-break: normal;
302 | width: 40px; }
303 |
304 | .slightly-smaller {
305 | font-size: 0.9em; }
306 |
307 | #footer {
308 | position: absolute;
309 | bottom: 10px;
310 | margin-left: 25px; }
311 | #footer p {
312 | margin: 0;
313 | color: #aaa;
314 | font-size: 0.8em; }
315 |
316 | html.dash header, html.dash #breadcrumbs, html.dash .sidebar {
317 | display: none; }
318 | html.dash .main-content {
319 | width: 980px;
320 | margin-left: 0;
321 | border: none;
322 | width: 100%;
323 | top: 0;
324 | padding-bottom: 0; }
325 | html.dash .height-container {
326 | display: block; }
327 | html.dash .item .token {
328 | margin-left: 0; }
329 | html.dash .content-wrapper {
330 | width: auto; }
331 | html.dash #footer {
332 | position: static; }
333 |
--------------------------------------------------------------------------------
/docs/docsets/RAMReel.docset/Contents/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleIdentifier
6 | com.jazzy.ramreel
7 | CFBundleName
8 | RAMReel
9 | DocSetPlatformFamily
10 | ramreel
11 | isDashDocset
12 |
13 | dashIndexFilePath
14 | index.html
15 | isJavaScriptEnabled
16 |
17 | DashDocSetFamily
18 | dashtoc
19 |
20 |
21 |
--------------------------------------------------------------------------------
/docs/docsets/RAMReel.docset/Contents/Resources/Documents/Extensions/UIImage.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | UIImage Extension Reference
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
20 |
21 |
22 | RAMReel Reference
23 |
24 | UIImage Extension Reference
25 |
26 |
27 |
28 |
118 |
119 |
120 |
121 | UIImage
122 | Undocumented
123 |
124 |
125 |
126 |
127 |
128 |
129 |
136 |
137 |
138 |
139 |
140 |
141 |
Undocumented
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
155 |
156 |
157 |
158 |
159 |
160 |
--------------------------------------------------------------------------------
/docs/docsets/RAMReel.docset/Contents/Resources/Documents/Extensions/UITextField.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | UITextField Extension Reference
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
20 |
21 |
22 | RAMReel Reference
23 |
24 | UITextField Extension Reference
25 |
26 |
27 |
28 |
114 |
115 |
116 |
117 | UITextField
118 |
119 |
120 |
class UITextField : UIControl , UITextInput , NSCoding
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 | tintColor
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
Overriding UITextField
tintColor
property to make it affect close image tint color.
143 |
144 |
145 |
146 |
Declaration
147 |
148 |
Swift
149 |
public override var tintColor : UIColor !
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
164 |
165 |
166 |
167 |
168 |
169 |
--------------------------------------------------------------------------------
/docs/docsets/RAMReel.docset/Contents/Resources/Documents/Generic Type Parameters.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Generic Type Parameters Reference
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
19 |
20 |
21 | RAMReel Reference
22 |
23 | Generic Type Parameters Reference
24 |
25 |
26 |
27 |
117 |
118 |
119 |
120 | Generic Type Parameters
121 | The following generic type parameters are available globally.
122 |
123 |
124 |
125 |
126 |
133 |
134 |
135 |
136 |
137 |
138 |
139 | DS
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
Undocumented
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
161 |
162 |
163 |
164 |
165 |
166 |
--------------------------------------------------------------------------------
/docs/docsets/RAMReel.docset/Contents/Resources/Documents/Protocols/FlowDataDestination.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | FlowDataDestination Protocol Reference
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
20 |
21 |
22 | RAMReel Reference
23 |
24 | FlowDataDestination Protocol Reference
25 |
26 |
27 |
28 |
118 |
119 |
120 |
121 | FlowDataDestination
122 | Undocumented
123 |
124 |
125 |
126 |
127 |
128 |
129 |
136 |
137 |
138 |
139 |
140 |
141 |
Undocumented
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
155 |
156 |
157 |
158 |
159 |
160 |
--------------------------------------------------------------------------------
/docs/docsets/RAMReel.docset/Contents/Resources/Documents/Protocols/FlowDataSource.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | FlowDataSource Protocol Reference
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
20 |
21 |
22 | RAMReel Reference
23 |
24 | FlowDataSource Protocol Reference
25 |
26 |
27 |
28 |
118 |
119 |
120 |
121 | FlowDataSource
122 | Undocumented
123 |
124 |
125 |
126 |
127 |
128 |
129 |
136 |
137 |
138 |
139 |
140 |
141 |
Undocumented
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
155 |
156 |
157 |
158 |
159 |
160 |
--------------------------------------------------------------------------------
/docs/docsets/RAMReel.docset/Contents/Resources/Documents/Protocols/Renderable.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Renderable Protocol Reference
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
20 |
21 |
22 | RAMReel Reference
23 |
24 | Renderable Protocol Reference
25 |
26 |
27 |
28 |
118 |
119 |
120 |
121 | Renderable
122 |
123 |
124 |
public protocol Renderable
125 |
126 |
127 |
128 |
Renderable
129 |
130 | Types that implement this protocol are expected to have string representation.
131 | This protocol is separated from Printable and it’s description property on purpose.
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 | render()
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
Implement this method in order to be able to put data to textField field
151 | Simplest implementation may return just object description
152 |
153 |
154 |
155 |
Declaration
156 |
157 |
Swift
158 |
func render () -> String
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
173 |
174 |
175 |
176 |
177 |
178 |
--------------------------------------------------------------------------------
/docs/docsets/RAMReel.docset/Contents/Resources/Documents/Structs/SimplePrefixQueryDataSource.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | SimplePrefixQueryDataSource Struct Reference
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
20 |
21 |
22 | RAMReel Reference
23 |
24 | SimplePrefixQueryDataSource Struct Reference
25 |
26 |
27 |
28 |
118 |
119 |
120 |
121 | SimplePrefixQueryDataSource
122 | Undocumented
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 | init(_:)
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
Undocumented
142 |
143 |
144 |
145 |
146 |
147 |
148 |
155 |
156 |
157 |
158 |
159 |
160 |
Undocumented
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
174 |
175 |
176 |
177 |
178 |
179 |
--------------------------------------------------------------------------------
/docs/docsets/RAMReel.docset/Contents/Resources/Documents/Typealiases.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Typealiases Reference
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
19 |
20 |
21 | RAMReel Reference
22 |
23 | Typealiases Reference
24 |
25 |
26 |
27 |
117 |
118 |
119 |
120 | Typealiases
121 | The following typealiases are available globally.
122 |
123 |
124 |
125 |
126 |
133 |
134 |
135 |
136 |
137 |
138 |
139 | HookType
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
Type of selected item change callback hook
148 |
149 |
150 |
151 |
Declaration
152 |
153 |
Swift
154 |
public typealias HookType = ( DataSource . ResultType ) -> ()
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
169 |
170 |
171 |
172 |
173 |
174 |
--------------------------------------------------------------------------------
/docs/docsets/RAMReel.docset/Contents/Resources/Documents/css/highlight.css:
--------------------------------------------------------------------------------
1 | /* Credit to https://gist.github.com/wataru420/2048287 */
2 | .highlight {
3 | /* Comment */
4 | /* Error */
5 | /* Keyword */
6 | /* Operator */
7 | /* Comment.Multiline */
8 | /* Comment.Preproc */
9 | /* Comment.Single */
10 | /* Comment.Special */
11 | /* Generic.Deleted */
12 | /* Generic.Deleted.Specific */
13 | /* Generic.Emph */
14 | /* Generic.Error */
15 | /* Generic.Heading */
16 | /* Generic.Inserted */
17 | /* Generic.Inserted.Specific */
18 | /* Generic.Output */
19 | /* Generic.Prompt */
20 | /* Generic.Strong */
21 | /* Generic.Subheading */
22 | /* Generic.Traceback */
23 | /* Keyword.Constant */
24 | /* Keyword.Declaration */
25 | /* Keyword.Pseudo */
26 | /* Keyword.Reserved */
27 | /* Keyword.Type */
28 | /* Literal.Number */
29 | /* Literal.String */
30 | /* Name.Attribute */
31 | /* Name.Builtin */
32 | /* Name.Class */
33 | /* Name.Constant */
34 | /* Name.Entity */
35 | /* Name.Exception */
36 | /* Name.Function */
37 | /* Name.Namespace */
38 | /* Name.Tag */
39 | /* Name.Variable */
40 | /* Operator.Word */
41 | /* Text.Whitespace */
42 | /* Literal.Number.Float */
43 | /* Literal.Number.Hex */
44 | /* Literal.Number.Integer */
45 | /* Literal.Number.Oct */
46 | /* Literal.String.Backtick */
47 | /* Literal.String.Char */
48 | /* Literal.String.Doc */
49 | /* Literal.String.Double */
50 | /* Literal.String.Escape */
51 | /* Literal.String.Heredoc */
52 | /* Literal.String.Interpol */
53 | /* Literal.String.Other */
54 | /* Literal.String.Regex */
55 | /* Literal.String.Single */
56 | /* Literal.String.Symbol */
57 | /* Name.Builtin.Pseudo */
58 | /* Name.Variable.Class */
59 | /* Name.Variable.Global */
60 | /* Name.Variable.Instance */
61 | /* Literal.Number.Integer.Long */ }
62 | .highlight .c {
63 | color: #999988;
64 | font-style: italic; }
65 | .highlight .err {
66 | color: #a61717;
67 | background-color: #e3d2d2; }
68 | .highlight .k {
69 | color: #000000;
70 | font-weight: bold; }
71 | .highlight .o {
72 | color: #000000;
73 | font-weight: bold; }
74 | .highlight .cm {
75 | color: #999988;
76 | font-style: italic; }
77 | .highlight .cp {
78 | color: #999999;
79 | font-weight: bold; }
80 | .highlight .c1 {
81 | color: #999988;
82 | font-style: italic; }
83 | .highlight .cs {
84 | color: #999999;
85 | font-weight: bold;
86 | font-style: italic; }
87 | .highlight .gd {
88 | color: #000000;
89 | background-color: #ffdddd; }
90 | .highlight .gd .x {
91 | color: #000000;
92 | background-color: #ffaaaa; }
93 | .highlight .ge {
94 | color: #000000;
95 | font-style: italic; }
96 | .highlight .gr {
97 | color: #aa0000; }
98 | .highlight .gh {
99 | color: #999999; }
100 | .highlight .gi {
101 | color: #000000;
102 | background-color: #ddffdd; }
103 | .highlight .gi .x {
104 | color: #000000;
105 | background-color: #aaffaa; }
106 | .highlight .go {
107 | color: #888888; }
108 | .highlight .gp {
109 | color: #555555; }
110 | .highlight .gs {
111 | font-weight: bold; }
112 | .highlight .gu {
113 | color: #aaaaaa; }
114 | .highlight .gt {
115 | color: #aa0000; }
116 | .highlight .kc {
117 | color: #000000;
118 | font-weight: bold; }
119 | .highlight .kd {
120 | color: #000000;
121 | font-weight: bold; }
122 | .highlight .kp {
123 | color: #000000;
124 | font-weight: bold; }
125 | .highlight .kr {
126 | color: #000000;
127 | font-weight: bold; }
128 | .highlight .kt {
129 | color: #445588; }
130 | .highlight .m {
131 | color: #009999; }
132 | .highlight .s {
133 | color: #d14; }
134 | .highlight .na {
135 | color: #008080; }
136 | .highlight .nb {
137 | color: #0086B3; }
138 | .highlight .nc {
139 | color: #445588;
140 | font-weight: bold; }
141 | .highlight .no {
142 | color: #008080; }
143 | .highlight .ni {
144 | color: #800080; }
145 | .highlight .ne {
146 | color: #990000;
147 | font-weight: bold; }
148 | .highlight .nf {
149 | color: #990000; }
150 | .highlight .nn {
151 | color: #555555; }
152 | .highlight .nt {
153 | color: #000080; }
154 | .highlight .nv {
155 | color: #008080; }
156 | .highlight .ow {
157 | color: #000000;
158 | font-weight: bold; }
159 | .highlight .w {
160 | color: #bbbbbb; }
161 | .highlight .mf {
162 | color: #009999; }
163 | .highlight .mh {
164 | color: #009999; }
165 | .highlight .mi {
166 | color: #009999; }
167 | .highlight .mo {
168 | color: #009999; }
169 | .highlight .sb {
170 | color: #d14; }
171 | .highlight .sc {
172 | color: #d14; }
173 | .highlight .sd {
174 | color: #d14; }
175 | .highlight .s2 {
176 | color: #d14; }
177 | .highlight .se {
178 | color: #d14; }
179 | .highlight .sh {
180 | color: #d14; }
181 | .highlight .si {
182 | color: #d14; }
183 | .highlight .sx {
184 | color: #d14; }
185 | .highlight .sr {
186 | color: #009926; }
187 | .highlight .s1 {
188 | color: #d14; }
189 | .highlight .ss {
190 | color: #990073; }
191 | .highlight .bp {
192 | color: #999999; }
193 | .highlight .vc {
194 | color: #008080; }
195 | .highlight .vg {
196 | color: #008080; }
197 | .highlight .vi {
198 | color: #008080; }
199 | .highlight .il {
200 | color: #009999; }
201 |
--------------------------------------------------------------------------------
/docs/docsets/RAMReel.docset/Contents/Resources/Documents/css/jazzy.css:
--------------------------------------------------------------------------------
1 | html, body, div, span, h1, h3, h4, p, a, code, em, img, ul, li, table, tbody, tr, td {
2 | background: transparent;
3 | border: 0;
4 | margin: 0;
5 | outline: 0;
6 | padding: 0;
7 | vertical-align: baseline; }
8 |
9 | body {
10 | background-color: #f2f2f2;
11 | font-family: Helvetica, freesans, Arial, sans-serif;
12 | font-size: 14px;
13 | -webkit-font-smoothing: subpixel-antialiased;
14 | word-wrap: break-word; }
15 |
16 | h1, h2, h3 {
17 | margin-top: 0.8em;
18 | margin-bottom: 0.3em;
19 | font-weight: 100;
20 | color: black; }
21 |
22 | h1 {
23 | font-size: 2.5em; }
24 |
25 | h2 {
26 | font-size: 2em;
27 | border-bottom: 1px solid #e2e2e2; }
28 |
29 | h4 {
30 | font-size: 13px;
31 | line-height: 1.5;
32 | margin-top: 21px; }
33 |
34 | h5 {
35 | font-size: 1.1em; }
36 |
37 | h6 {
38 | font-size: 1.1em;
39 | color: #777; }
40 |
41 | .section-name {
42 | color: gray;
43 | display: block;
44 | font-family: Helvetica;
45 | font-size: 22px;
46 | font-weight: 100;
47 | margin-bottom: 15px; }
48 |
49 | pre, code {
50 | font: 0.95em Menlo, monospace;
51 | color: #777;
52 | word-wrap: normal; }
53 |
54 | p code, li code {
55 | background-color: #eee;
56 | padding: 2px 4px;
57 | border-radius: 4px; }
58 |
59 | a {
60 | color: #0088cc;
61 | text-decoration: none; }
62 |
63 | ul {
64 | padding-left: 15px; }
65 |
66 | li {
67 | line-height: 1.8em; }
68 |
69 | img {
70 | max-width: 100%; }
71 |
72 | blockquote {
73 | margin-left: 0;
74 | padding: 0 10px;
75 | border-left: 4px solid #ccc; }
76 |
77 | .content-wrapper {
78 | margin: 0 auto;
79 | width: 980px; }
80 |
81 | header {
82 | font-size: 0.85em;
83 | line-height: 26px;
84 | background-color: #414141;
85 | position: fixed;
86 | width: 100%;
87 | z-index: 1; }
88 | header img {
89 | padding-right: 6px;
90 | vertical-align: -4px;
91 | height: 16px; }
92 | header a {
93 | color: #fff; }
94 | header p {
95 | float: left;
96 | color: #999; }
97 | header .header-right {
98 | float: right;
99 | margin-left: 16px; }
100 |
101 | #breadcrumbs {
102 | background-color: #f2f2f2;
103 | height: 27px;
104 | padding-top: 17px;
105 | position: fixed;
106 | width: 100%;
107 | z-index: 1;
108 | margin-top: 26px; }
109 | #breadcrumbs #carat {
110 | height: 10px;
111 | margin: 0 5px; }
112 |
113 | .sidebar {
114 | background-color: #f9f9f9;
115 | border: 1px solid #e2e2e2;
116 | overflow-y: auto;
117 | overflow-x: hidden;
118 | position: fixed;
119 | top: 70px;
120 | bottom: 0;
121 | width: 230px;
122 | word-wrap: normal; }
123 |
124 | .nav-groups {
125 | list-style-type: none;
126 | background: #fff;
127 | padding-left: 0; }
128 |
129 | .nav-group-name {
130 | border-bottom: 1px solid #e2e2e2;
131 | font-size: 1.1em;
132 | font-weight: 100;
133 | padding: 15px 0 15px 20px; }
134 | .nav-group-name > a {
135 | color: #333; }
136 |
137 | .nav-group-tasks {
138 | margin-top: 5px; }
139 |
140 | .nav-group-task {
141 | font-size: 0.9em;
142 | list-style-type: none;
143 | white-space: nowrap; }
144 | .nav-group-task a {
145 | color: #888; }
146 |
147 | .main-content {
148 | background-color: #fff;
149 | border: 1px solid #e2e2e2;
150 | margin-left: 246px;
151 | position: absolute;
152 | overflow: hidden;
153 | padding-bottom: 60px;
154 | top: 70px;
155 | width: 734px; }
156 | .main-content p, .main-content a, .main-content code, .main-content em, .main-content ul, .main-content table, .main-content blockquote {
157 | margin-bottom: 1em; }
158 | .main-content p {
159 | line-height: 1.8em; }
160 | .main-content section .section:first-child {
161 | margin-top: 0;
162 | padding-top: 0; }
163 | .main-content section .task-group-section .task-group:first-of-type {
164 | padding-top: 10px; }
165 | .main-content section .task-group-section .task-group:first-of-type .section-name {
166 | padding-top: 15px; }
167 |
168 | .section {
169 | padding: 0 25px; }
170 |
171 | .highlight {
172 | background-color: #eee;
173 | padding: 10px 12px;
174 | border: 1px solid #e2e2e2;
175 | border-radius: 4px;
176 | overflow-x: auto; }
177 |
178 | .declaration .highlight {
179 | overflow-x: initial;
180 | padding: 0 40px 40px 0;
181 | margin-bottom: -25px;
182 | background-color: transparent;
183 | border: none; }
184 |
185 | .section-name {
186 | margin: 0;
187 | margin-left: 18px; }
188 |
189 | .task-group-section {
190 | padding-left: 6px;
191 | border-top: 1px solid #e2e2e2; }
192 |
193 | .task-group {
194 | padding-top: 0px; }
195 |
196 | .task-name-container a[name]:before {
197 | content: "";
198 | display: block;
199 | padding-top: 70px;
200 | margin: -70px 0 0; }
201 |
202 | .item {
203 | padding-top: 8px;
204 | width: 100%;
205 | list-style-type: none; }
206 | .item a[name]:before {
207 | content: "";
208 | display: block;
209 | padding-top: 70px;
210 | margin: -70px 0 0; }
211 | .item code {
212 | background-color: transparent;
213 | padding: 0; }
214 | .item .token {
215 | padding-left: 3px;
216 | margin-left: 15px;
217 | font-size: 11.9px; }
218 | .item .declaration-note {
219 | font-size: .85em;
220 | color: gray;
221 | font-style: italic; }
222 |
223 | .pointer-container {
224 | border-bottom: 1px solid #e2e2e2;
225 | left: -23px;
226 | padding-bottom: 13px;
227 | position: relative;
228 | width: 110%; }
229 |
230 | .pointer {
231 | background: #f9f9f9;
232 | border-left: 1px solid #e2e2e2;
233 | border-top: 1px solid #e2e2e2;
234 | height: 12px;
235 | left: 21px;
236 | top: -7px;
237 | -webkit-transform: rotate(45deg);
238 | -moz-transform: rotate(45deg);
239 | -o-transform: rotate(45deg);
240 | transform: rotate(45deg);
241 | position: absolute;
242 | width: 12px; }
243 |
244 | .height-container {
245 | display: none;
246 | left: -25px;
247 | padding: 0 25px;
248 | position: relative;
249 | width: 100%;
250 | overflow: hidden; }
251 | .height-container .section {
252 | background: #f9f9f9;
253 | border-bottom: 1px solid #e2e2e2;
254 | left: -25px;
255 | position: relative;
256 | width: 100%;
257 | padding-top: 10px;
258 | padding-bottom: 5px; }
259 |
260 | .aside, .language {
261 | padding: 6px 12px;
262 | margin: 12px 0;
263 | border-left: 5px solid #dddddd;
264 | overflow-y: hidden; }
265 | .aside .aside-title, .language .aside-title {
266 | font-size: 9px;
267 | letter-spacing: 2px;
268 | text-transform: uppercase;
269 | padding-bottom: 0;
270 | margin: 0;
271 | color: #aaa;
272 | -webkit-user-select: none; }
273 | .aside p:last-child, .language p:last-child {
274 | margin-bottom: 0; }
275 |
276 | .language {
277 | border-left: 5px solid #cde9f4; }
278 | .language .aside-title {
279 | color: #4b8afb; }
280 |
281 | .aside-warning {
282 | border-left: 5px solid #ff6666; }
283 | .aside-warning .aside-title {
284 | color: #ff0000; }
285 |
286 | .graybox {
287 | border-collapse: collapse;
288 | width: 100%; }
289 | .graybox p {
290 | margin: 0;
291 | word-break: break-word;
292 | min-width: 50px; }
293 | .graybox td {
294 | border: 1px solid #e2e2e2;
295 | padding: 5px 25px 5px 10px;
296 | vertical-align: middle; }
297 | .graybox tr td:first-of-type {
298 | text-align: right;
299 | padding: 7px;
300 | vertical-align: top;
301 | word-break: normal;
302 | width: 40px; }
303 |
304 | .slightly-smaller {
305 | font-size: 0.9em; }
306 |
307 | #footer {
308 | position: absolute;
309 | bottom: 10px;
310 | margin-left: 25px; }
311 | #footer p {
312 | margin: 0;
313 | color: #aaa;
314 | font-size: 0.8em; }
315 |
316 | html.dash header, html.dash #breadcrumbs, html.dash .sidebar {
317 | display: none; }
318 | html.dash .main-content {
319 | width: 980px;
320 | margin-left: 0;
321 | border: none;
322 | width: 100%;
323 | top: 0;
324 | padding-bottom: 0; }
325 | html.dash .height-container {
326 | display: block; }
327 | html.dash .item .token {
328 | margin-left: 0; }
329 | html.dash .content-wrapper {
330 | width: auto; }
331 | html.dash #footer {
332 | position: static; }
333 |
--------------------------------------------------------------------------------
/docs/docsets/RAMReel.docset/Contents/Resources/Documents/img/carat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ramotion/reel-search/fde22643b50c0b4235c3ada2b82c904f0a61d48c/docs/docsets/RAMReel.docset/Contents/Resources/Documents/img/carat.png
--------------------------------------------------------------------------------
/docs/docsets/RAMReel.docset/Contents/Resources/Documents/img/dash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ramotion/reel-search/fde22643b50c0b4235c3ada2b82c904f0a61d48c/docs/docsets/RAMReel.docset/Contents/Resources/Documents/img/dash.png
--------------------------------------------------------------------------------
/docs/docsets/RAMReel.docset/Contents/Resources/Documents/img/gh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ramotion/reel-search/fde22643b50c0b4235c3ada2b82c904f0a61d48c/docs/docsets/RAMReel.docset/Contents/Resources/Documents/img/gh.png
--------------------------------------------------------------------------------
/docs/docsets/RAMReel.docset/Contents/Resources/Documents/js/jazzy.js:
--------------------------------------------------------------------------------
1 | window.jazzy = {'docset': false}
2 | if (typeof window.dash != 'undefined') {
3 | document.documentElement.className += ' dash'
4 | window.jazzy.docset = true
5 | }
6 | if (navigator.userAgent.match(/xcode/i)) {
7 | document.documentElement.className += ' xcode'
8 | window.jazzy.docset = true
9 | }
10 |
11 | // On doc load, toggle the URL hash discussion if present
12 | $(document).ready(function() {
13 | if (!window.jazzy.docset) {
14 | var linkToHash = $('a[href="' + window.location.hash +'"]');
15 | linkToHash.trigger("click");
16 | }
17 | });
18 |
19 | // On token click, toggle its discussion and animate token.marginLeft
20 | $(".token").click(function(event) {
21 | if (window.jazzy.docset) {
22 | return;
23 | }
24 | var link = $(this);
25 | var animationDuration = 300;
26 | var tokenOffset = "15px";
27 | var original = link.css('marginLeft') == tokenOffset;
28 | link.animate({'margin-left':original ? "0px" : tokenOffset}, animationDuration);
29 | $content = link.parent().parent().next();
30 | $content.slideToggle(animationDuration);
31 |
32 | // Keeps the document from jumping to the hash.
33 | var href = $(this).attr('href');
34 | if (history.pushState) {
35 | history.pushState({}, '', href);
36 | } else {
37 | location.hash = href;
38 | }
39 | event.preventDefault();
40 | });
41 |
--------------------------------------------------------------------------------
/docs/docsets/RAMReel.docset/Contents/Resources/Documents/undocumented.json:
--------------------------------------------------------------------------------
1 | {
2 | "warnings": [
3 | {
4 | "file": "/Users/juriv/tmp/reel-search/RAMReel/Framework/TextFieldReactor.swift",
5 | "line": 30,
6 | "symbol": "DS",
7 | "symbol_kind": "source.lang.swift.decl.generic_type_param",
8 | "warning": "undocumented"
9 | }
10 | ],
11 | "source_directory": "/Users/juriv/tmp/reel-search"
12 | }
--------------------------------------------------------------------------------
/docs/docsets/RAMReel.docset/Contents/Resources/docSet.dsidx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ramotion/reel-search/fde22643b50c0b4235c3ada2b82c904f0a61d48c/docs/docsets/RAMReel.docset/Contents/Resources/docSet.dsidx
--------------------------------------------------------------------------------
/docs/docsets/RAMReel.tgz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ramotion/reel-search/fde22643b50c0b4235c3ada2b82c904f0a61d48c/docs/docsets/RAMReel.tgz
--------------------------------------------------------------------------------
/docs/img/carat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ramotion/reel-search/fde22643b50c0b4235c3ada2b82c904f0a61d48c/docs/img/carat.png
--------------------------------------------------------------------------------
/docs/img/dash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ramotion/reel-search/fde22643b50c0b4235c3ada2b82c904f0a61d48c/docs/img/dash.png
--------------------------------------------------------------------------------
/docs/img/gh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ramotion/reel-search/fde22643b50c0b4235c3ada2b82c904f0a61d48c/docs/img/gh.png
--------------------------------------------------------------------------------
/docs/js/jazzy.js:
--------------------------------------------------------------------------------
1 | window.jazzy = {'docset': false}
2 | if (typeof window.dash != 'undefined') {
3 | document.documentElement.className += ' dash'
4 | window.jazzy.docset = true
5 | }
6 | if (navigator.userAgent.match(/xcode/i)) {
7 | document.documentElement.className += ' xcode'
8 | window.jazzy.docset = true
9 | }
10 |
11 | // On doc load, toggle the URL hash discussion if present
12 | $(document).ready(function() {
13 | if (!window.jazzy.docset) {
14 | var linkToHash = $('a[href="' + window.location.hash +'"]');
15 | linkToHash.trigger("click");
16 | }
17 | });
18 |
19 | // On token click, toggle its discussion and animate token.marginLeft
20 | $(".token").click(function(event) {
21 | if (window.jazzy.docset) {
22 | return;
23 | }
24 | var link = $(this);
25 | var animationDuration = 300;
26 | var tokenOffset = "15px";
27 | var original = link.css('marginLeft') == tokenOffset;
28 | link.animate({'margin-left':original ? "0px" : tokenOffset}, animationDuration);
29 | $content = link.parent().parent().next();
30 | $content.slideToggle(animationDuration);
31 |
32 | // Keeps the document from jumping to the hash.
33 | var href = $(this).attr('href');
34 | if (history.pushState) {
35 | history.pushState({}, '', href);
36 | } else {
37 | location.hash = href;
38 | }
39 | event.preventDefault();
40 | });
41 |
--------------------------------------------------------------------------------
/docs/undocumented.json:
--------------------------------------------------------------------------------
1 | {
2 | "warnings": [
3 | {
4 | "file": "/Users/juriv/tmp/reel-search/RAMReel/Framework/TextFieldReactor.swift",
5 | "line": 30,
6 | "symbol": "DS",
7 | "symbol_kind": "source.lang.swift.decl.generic_type_param",
8 | "warning": "undocumented"
9 | }
10 | ],
11 | "source_directory": "/Users/juriv/tmp/reel-search"
12 | }
--------------------------------------------------------------------------------
/header.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ramotion/reel-search/fde22643b50c0b4235c3ada2b82c904f0a61d48c/header.png
--------------------------------------------------------------------------------
/reel-search.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ramotion/reel-search/fde22643b50c0b4235c3ada2b82c904f0a61d48c/reel-search.gif
--------------------------------------------------------------------------------