├── .bundle └── config ├── .gitignore ├── .travis.yml ├── Gemfile ├── Gemfile.lock ├── LICENSE ├── README.md ├── _config.yml ├── _data └── projects.yml ├── _includes ├── footer.html ├── head.html ├── header.html ├── icon-github.html ├── icon-github.svg ├── icon-twitter.html ├── icon-twitter.svg └── project.html ├── _layouts ├── default.html ├── page.html └── post.html ├── _sass ├── _base.scss ├── _layout.scss └── _syntax-highlighting.scss ├── about.md ├── css ├── computer-icon.png ├── computer-icon@2x.png ├── main.scss ├── smartphone-icon.png ├── smartphone-icon@2x.png ├── wrench.png └── wrench@2x.png ├── feed.xml ├── index.html └── script └── cibuild /.bundle/config: -------------------------------------------------------------------------------- 1 | --- {} 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | _site/ 2 | .sass-cache/ 3 | .jekyll-metadata 4 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | # https://jekyllrb.com/docs/continuous-integration/ 2 | language: ruby 3 | rvm: 4 | - 2.1 5 | 6 | script: ./script/cibuild 7 | 8 | env: 9 | global: 10 | - NOKOGIRI_USE_SYSTEM_LIBRARIES=true 11 | 12 | sudo: false -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem 'jekyll', '~> 3.1', '>= 3.1.3' 4 | gem 'html-proofer', '~> 3.0', '>= 3.0.6' -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | activesupport (4.2.6) 5 | i18n (~> 0.7) 6 | json (~> 1.7, >= 1.7.7) 7 | minitest (~> 5.1) 8 | thread_safe (~> 0.3, >= 0.3.4) 9 | tzinfo (~> 1.1) 10 | addressable (2.4.0) 11 | colorator (0.1) 12 | colored (1.2) 13 | ethon (0.9.0) 14 | ffi (>= 1.3.0) 15 | ffi (1.9.10) 16 | html-proofer (3.0.6) 17 | activesupport (~> 4.2) 18 | addressable (~> 2.3) 19 | colored (~> 1.2) 20 | mercenary (~> 0.3.2) 21 | nokogiri (~> 1.5) 22 | parallel (~> 1.3) 23 | typhoeus (~> 0.7) 24 | yell (~> 2.0) 25 | i18n (0.7.0) 26 | jekyll (3.1.3) 27 | colorator (~> 0.1) 28 | jekyll-sass-converter (~> 1.0) 29 | jekyll-watch (~> 1.1) 30 | kramdown (~> 1.3) 31 | liquid (~> 3.0) 32 | mercenary (~> 0.3.3) 33 | rouge (~> 1.7) 34 | safe_yaml (~> 1.0) 35 | jekyll-sass-converter (1.4.0) 36 | sass (~> 3.4) 37 | jekyll-watch (1.4.0) 38 | listen (~> 3.0, < 3.1) 39 | json (1.8.3) 40 | kramdown (1.11.1) 41 | liquid (3.0.6) 42 | listen (3.0.8) 43 | rb-fsevent (~> 0.9, >= 0.9.4) 44 | rb-inotify (~> 0.9, >= 0.9.7) 45 | mercenary (0.3.6) 46 | mini_portile2 (2.0.0) 47 | minitest (5.9.0) 48 | nokogiri (1.6.7.2) 49 | mini_portile2 (~> 2.0.0.rc2) 50 | parallel (1.8.0) 51 | rb-fsevent (0.9.7) 52 | rb-inotify (0.9.7) 53 | ffi (>= 0.5.0) 54 | rouge (1.10.1) 55 | safe_yaml (1.0.4) 56 | sass (3.4.22) 57 | thread_safe (0.3.5) 58 | typhoeus (0.8.0) 59 | ethon (>= 0.8.0) 60 | tzinfo (1.2.2) 61 | thread_safe (~> 0.1) 62 | yell (2.0.6) 63 | 64 | PLATFORMS 65 | ruby 66 | 67 | DEPENDENCIES 68 | html-proofer (~> 3.0, >= 3.0.6) 69 | jekyll (~> 3.1, >= 3.1.3) 70 | 71 | BUNDLED WITH 72 | 1.12.1 73 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | CC0 1.0 Universal 2 | 3 | Statement of Purpose 4 | 5 | The laws of most jurisdictions throughout the world automatically confer 6 | exclusive Copyright and Related Rights (defined below) upon the creator and 7 | subsequent owner(s) (each and all, an "owner") of an original work of 8 | authorship and/or a database (each, a "Work"). 9 | 10 | Certain owners wish to permanently relinquish those rights to a Work for the 11 | purpose of contributing to a commons of creative, cultural and scientific 12 | works ("Commons") that the public can reliably and without fear of later 13 | claims of infringement build upon, modify, incorporate in other works, reuse 14 | and redistribute as freely as possible in any form whatsoever and for any 15 | purposes, including without limitation commercial purposes. These owners may 16 | contribute to the Commons to promote the ideal of a free culture and the 17 | further production of creative, cultural and scientific works, or to gain 18 | reputation or greater distribution for their Work in part through the use and 19 | efforts of others. 20 | 21 | For these and/or other purposes and motivations, and without any expectation 22 | of additional consideration or compensation, the person associating CC0 with a 23 | Work (the "Affirmer"), to the extent that he or she is an owner of Copyright 24 | and Related Rights in the Work, voluntarily elects to apply CC0 to the Work 25 | and publicly distribute the Work under its terms, with knowledge of his or her 26 | Copyright and Related Rights in the Work and the meaning and intended legal 27 | effect of CC0 on those rights. 28 | 29 | 1. Copyright and Related Rights. A Work made available under CC0 may be 30 | protected by copyright and related or neighboring rights ("Copyright and 31 | Related Rights"). Copyright and Related Rights include, but are not limited 32 | to, the following: 33 | 34 | i. the right to reproduce, adapt, distribute, perform, display, communicate, 35 | and translate a Work; 36 | 37 | ii. moral rights retained by the original author(s) and/or performer(s); 38 | 39 | iii. publicity and privacy rights pertaining to a person's image or likeness 40 | depicted in a Work; 41 | 42 | iv. rights protecting against unfair competition in regards to a Work, 43 | subject to the limitations in paragraph 4(a), below; 44 | 45 | v. rights protecting the extraction, dissemination, use and reuse of data in 46 | a Work; 47 | 48 | vi. database rights (such as those arising under Directive 96/9/EC of the 49 | European Parliament and of the Council of 11 March 1996 on the legal 50 | protection of databases, and under any national implementation thereof, 51 | including any amended or successor version of such directive); and 52 | 53 | vii. other similar, equivalent or corresponding rights throughout the world 54 | based on applicable law or treaty, and any national implementations thereof. 55 | 56 | 2. Waiver. To the greatest extent permitted by, but not in contravention of, 57 | applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and 58 | unconditionally waives, abandons, and surrenders all of Affirmer's Copyright 59 | and Related Rights and associated claims and causes of action, whether now 60 | known or unknown (including existing as well as future claims and causes of 61 | action), in the Work (i) in all territories worldwide, (ii) for the maximum 62 | duration provided by applicable law or treaty (including future time 63 | extensions), (iii) in any current or future medium and for any number of 64 | copies, and (iv) for any purpose whatsoever, including without limitation 65 | commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes 66 | the Waiver for the benefit of each member of the public at large and to the 67 | detriment of Affirmer's heirs and successors, fully intending that such Waiver 68 | shall not be subject to revocation, rescission, cancellation, termination, or 69 | any other legal or equitable action to disrupt the quiet enjoyment of the Work 70 | by the public as contemplated by Affirmer's express Statement of Purpose. 71 | 72 | 3. Public License Fallback. Should any part of the Waiver for any reason be 73 | judged legally invalid or ineffective under applicable law, then the Waiver 74 | shall be preserved to the maximum extent permitted taking into account 75 | Affirmer's express Statement of Purpose. In addition, to the extent the Waiver 76 | is so judged Affirmer hereby grants to each affected person a royalty-free, 77 | non transferable, non sublicensable, non exclusive, irrevocable and 78 | unconditional license to exercise Affirmer's Copyright and Related Rights in 79 | the Work (i) in all territories worldwide, (ii) for the maximum duration 80 | provided by applicable law or treaty (including future time extensions), (iii) 81 | in any current or future medium and for any number of copies, and (iv) for any 82 | purpose whatsoever, including without limitation commercial, advertising or 83 | promotional purposes (the "License"). The License shall be deemed effective as 84 | of the date CC0 was applied by Affirmer to the Work. Should any part of the 85 | License for any reason be judged legally invalid or ineffective under 86 | applicable law, such partial invalidity or ineffectiveness shall not 87 | invalidate the remainder of the License, and in such case Affirmer hereby 88 | affirms that he or she will not (i) exercise any of his or her remaining 89 | Copyright and Related Rights in the Work or (ii) assert any associated claims 90 | and causes of action with respect to the Work, in either case contrary to 91 | Affirmer's express Statement of Purpose. 92 | 93 | 4. Limitations and Disclaimers. 94 | 95 | a. No trademark or patent rights held by Affirmer are waived, abandoned, 96 | surrendered, licensed or otherwise affected by this document. 97 | 98 | b. Affirmer offers the Work as-is and makes no representations or warranties 99 | of any kind concerning the Work, express, implied, statutory or otherwise, 100 | including without limitation warranties of title, merchantability, fitness 101 | for a particular purpose, non infringement, or the absence of latent or 102 | other defects, accuracy, or the present or absence of errors, whether or not 103 | discoverable, all to the greatest extent permissible under applicable law. 104 | 105 | c. Affirmer disclaims responsibility for clearing rights of other persons 106 | that may apply to the Work or any use thereof, including without limitation 107 | any person's Copyright and Related Rights in the Work. Further, Affirmer 108 | disclaims responsibility for obtaining any necessary consents, permissions 109 | or other rights required for any use of the Work. 110 | 111 | d. Affirmer understands and acknowledges that Creative Commons is not a 112 | party to this document and has no duty or obligation with respect to this 113 | CC0 or use of the Work. 114 | 115 | For more information, please see 116 | 117 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # RACurated 2 | 3 | Curated list of ReactiveCocoa projects. 4 | 5 | ## How to contribute 6 | 7 | This list is only relevant if it keeps growing. Please feel free to open a pull 8 | request to suggest an app or a framework using ReactiveCocoa. Although please 9 | note that even if we loved hitting those square-bracket keys thousands of times 10 | a day writting code using ReactiveCocoa in Objective-C, we are trying to 11 | curate a list of projects using the most recent version of the framework. 12 | 13 | 1. Fork the repository 14 | 2. Create a branch 15 | 3. Edit the _data/projects.yml, see below for an example project 16 | 4. Commit and open a pull request against the *gh-pages* branch 17 | 18 | Sample project row: 19 | 20 | ```yaml 21 | - name: Project name 22 | description: Description of the project, mostly what it does 23 | type: tool # possible values are ios, mac, tool and framework 24 | highlights: [Command line] # What's important in this project (MVVM, special pattern...) 25 | rac_version: 4 26 | repo_url: https://github.com/carthage/carthage 27 | ``` 28 | 29 | ## License 30 | 31 | Creative Commons. Set [License file](License). 32 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | # Welcome to Jekyll! 2 | # 3 | # This config file is meant for settings that affect your whole blog, values 4 | # which you are expected to set up once and rarely need to edit after that. 5 | # For technical reasons, this file is *NOT* reloaded automatically when you use 6 | # 'jekyll serve'. If you change this file, please restart the server process. 7 | 8 | # Site settings 9 | title: Curated list of ReactiveCocoa projects 10 | email: romain.pouclet@gmail.com 11 | description: > # this means to ignore newlines until "baseurl:" 12 | Write an awesome description for your new site here. You can edit this 13 | line in _config.yml. It will appear in your document head meta (for 14 | Google search results) and in your feed.xml site description. 15 | baseurl: "/racurated" # the subpath of your site, e.g. /blog 16 | url: "http://raccommunity.github.io" # the base hostname & protocol for your site 17 | twitter_username: ReactiveCocoa 18 | github_username: ReactiveCocoa 19 | 20 | # Build settings 21 | markdown: kramdown 22 | exclude: 23 | - vendor -------------------------------------------------------------------------------- /_data/projects.yml: -------------------------------------------------------------------------------- 1 | - name: Kickstarter 2 | description: "Kickstarter for iOS." 3 | highlights: [MVVM] 4 | type: ios 5 | rac_version: 4 6 | repo_url: https://github.com/kickstarter/ios-oss 7 | - name: Ksapi 8 | description: "Models and API services for the Kickstarter iOS app." 9 | type: ios 10 | rac_version: 4 11 | repo_url: https://github.com/kickstarter/ios-ksapi 12 | - name: Kickstarter-ReactiveExtensions 13 | description: A collection of extensions to the Reactive Cocoa framework. 14 | type: ios 15 | rac_version: 4 16 | repo_url: https://github.com/kickstarter/Kickstarter-ReactiveExtensions 17 | - name: Giraffe 18 | description: "iOS client for Giphy written in Swift with ReactiveCocoa." 19 | highlights: [MVVM, Networking, Protocol Extensions] 20 | type: ios 21 | rac_version: 4 22 | repo_url: https://github.com/evgeniyd/Giraffe 23 | - name: SwiftGoal 24 | description: "This project showcases the Model-View-ViewModel (MVVM) architecture with ReactiveCocoa 4, while serving as a digital logbook of FIFA matches." 25 | highlights: [MVVM, Networking] 26 | type: ios 27 | rac_version: 4 28 | repo_url: https://github.com/richeterre/SwiftGoal 29 | - name: Rewatch 30 | description: > 31 | Rewatch is an application that talks to Betaseries, a service to track the TV Shows you've watched and suggest you an episode 32 | to watch again. It uses ReactiveCocoa to talk to the Betaseries API and save content to a CoreData database. 33 | highlights: [Core Data, Networking] 34 | type: ios 35 | rac_version: 4 36 | repo_url: https://github.com/palleas/rewatch 37 | - name: Carthage 38 | description: > 39 | Carthage is a simple, decentralized dependency manager for Cocoa and is a great example of how you can use ReactiveCocoa to 40 | write command line tools with Swift. 41 | type: tool 42 | highlights: [Command line] 43 | rac_version: 4 44 | repo_url: https://github.com/carthage/carthage 45 | - name: Tropos 46 | description: Weather and Forecasts for Humans 47 | type: ios 48 | highlights: [] 49 | rac_version: 4 50 | repo_url: https://github.com/thoughtbot/Tropos 51 | - name: Tentacle 52 | description: A Swift framework for the GitHub API 53 | highlights: [3rd party client] 54 | type: framework 55 | platforms: [] 56 | rac_version: 4 57 | repo_url: https://github.com/mdiep/Tentacle 58 | - name: Reactor 59 | description: Powering your RAC architecture 60 | highlights: [] 61 | type: framework 62 | rac_version: 4 63 | repo_url: https://github.com/MailOnline/Reactor 64 | - name: Bailiff 65 | description: Mac application to create issues in GitLab 66 | highlights: [MVVM] 67 | type: mac 68 | rac_version: 4 69 | repo_url: https://github.com/Palleas/Bailiff 70 | - name: Crystal Clipboard 71 | description: Application for managing copy/paste across devices 72 | type: ios 73 | highlights: [MVVM, Networking, Core Data] 74 | rac_version: 6 75 | repo_url: https://github.com/jzzocc/crystal-clipboard-ios 76 | -------------------------------------------------------------------------------- /_includes/footer.html: -------------------------------------------------------------------------------- 1 | 13 | -------------------------------------------------------------------------------- /_includes/head.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {% if page.title %}{{ page.title | escape }}{% else %}{{ site.title | escape }}{% endif %} 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /_includes/header.html: -------------------------------------------------------------------------------- 1 | 30 | -------------------------------------------------------------------------------- /_includes/icon-github.html: -------------------------------------------------------------------------------- 1 | {% include icon-github.svg %}{{ include.username }} 2 | -------------------------------------------------------------------------------- /_includes/icon-github.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /_includes/icon-twitter.html: -------------------------------------------------------------------------------- 1 | {{ include.username }} 2 | -------------------------------------------------------------------------------- /_includes/icon-twitter.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /_includes/project.html: -------------------------------------------------------------------------------- 1 |
2 |

3 | {{ project.name }} 4 | {% if project.highlights | size > 0 %} 5 | {{ project.highlights | join: ", " }} 6 | {% endif %} 7 |

8 | 9 |

{{ project.description }}

10 | 11 | 12 |
-------------------------------------------------------------------------------- /_layouts/default.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {% include head.html %} 5 | 6 | 7 | 8 | {% include header.html %} 9 | 10 |
11 |
12 | {{ content }} 13 |
14 |
15 | 16 | {% include footer.html %} 17 | 18 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /_layouts/page.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 |
5 | 6 |
7 |

{{ page.title }}

8 |
9 | 10 |
11 | {{ content }} 12 |
13 | 14 |
15 | -------------------------------------------------------------------------------- /_layouts/post.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 |
5 | 6 |
7 |

{{ page.title }}

8 | 9 |
10 | 11 |
12 | {{ content }} 13 |
14 | 15 |
16 | -------------------------------------------------------------------------------- /_sass/_base.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Reset some basic elements 3 | */ 4 | body, h1, h2, h3, h4, h5, h6, 5 | p, blockquote, pre, hr, 6 | dl, dd, ol, ul, figure { 7 | margin: 0; 8 | padding: 0; 9 | } 10 | 11 | 12 | 13 | /** 14 | * Basic styling 15 | */ 16 | body { 17 | font: $base-font-weight #{$base-font-size}/#{$base-line-height} $base-font-family; 18 | color: $text-color; 19 | background-color: $background-color; 20 | -webkit-text-size-adjust: 100%; 21 | -webkit-font-feature-settings: "kern" 1; 22 | -moz-font-feature-settings: "kern" 1; 23 | -o-font-feature-settings: "kern" 1; 24 | font-feature-settings: "kern" 1; 25 | font-kerning: normal; 26 | } 27 | 28 | 29 | 30 | /** 31 | * Set `margin-bottom` to maintain vertical rhythm 32 | */ 33 | h1, h2, h3, h4, h5, h6, 34 | p, blockquote, pre, 35 | ul, ol, dl, figure, 36 | %vertical-rhythm { 37 | margin-bottom: $spacing-unit / 2; 38 | } 39 | 40 | 41 | 42 | /** 43 | * Images 44 | */ 45 | img { 46 | max-width: 100%; 47 | vertical-align: middle; 48 | } 49 | 50 | 51 | 52 | /** 53 | * Figures 54 | */ 55 | figure > img { 56 | display: block; 57 | } 58 | 59 | figcaption { 60 | font-size: $small-font-size; 61 | } 62 | 63 | 64 | 65 | /** 66 | * Lists 67 | */ 68 | ul, ol { 69 | margin-left: $spacing-unit; 70 | } 71 | 72 | li { 73 | > ul, 74 | > ol { 75 | margin-bottom: 0; 76 | } 77 | } 78 | 79 | 80 | 81 | /** 82 | * Headings 83 | */ 84 | h1, h2, h3, h4, h5, h6 { 85 | font-weight: $base-font-weight; 86 | } 87 | 88 | 89 | 90 | /** 91 | * Links 92 | */ 93 | a { 94 | color: $brand-color; 95 | text-decoration: none; 96 | 97 | &:visited { 98 | color: darken($brand-color, 15%); 99 | } 100 | 101 | &:hover { 102 | color: $text-color; 103 | text-decoration: underline; 104 | } 105 | } 106 | 107 | 108 | 109 | /** 110 | * Blockquotes 111 | */ 112 | blockquote { 113 | color: $grey-color; 114 | border-left: 4px solid $grey-color-light; 115 | padding-left: $spacing-unit / 2; 116 | font-size: 18px; 117 | letter-spacing: -1px; 118 | font-style: italic; 119 | 120 | > :last-child { 121 | margin-bottom: 0; 122 | } 123 | } 124 | 125 | 126 | 127 | /** 128 | * Code formatting 129 | */ 130 | pre, 131 | code { 132 | font-size: 15px; 133 | border: 1px solid $grey-color-light; 134 | border-radius: 3px; 135 | background-color: #eef; 136 | } 137 | 138 | code { 139 | padding: 1px 5px; 140 | } 141 | 142 | pre { 143 | padding: 8px 12px; 144 | overflow-x: auto; 145 | 146 | > code { 147 | border: 0; 148 | padding-right: 0; 149 | padding-left: 0; 150 | } 151 | } 152 | 153 | 154 | 155 | /** 156 | * Wrapper 157 | */ 158 | .wrapper { 159 | max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit} * 2)); 160 | max-width: calc(#{$content-width} - (#{$spacing-unit} * 2)); 161 | margin-right: auto; 162 | margin-left: auto; 163 | padding-right: $spacing-unit; 164 | padding-left: $spacing-unit; 165 | @extend %clearfix; 166 | 167 | @include media-query($on-laptop) { 168 | max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit})); 169 | max-width: calc(#{$content-width} - (#{$spacing-unit})); 170 | padding-right: $spacing-unit / 2; 171 | padding-left: $spacing-unit / 2; 172 | } 173 | } 174 | 175 | 176 | 177 | /** 178 | * Clearfix 179 | */ 180 | %clearfix { 181 | 182 | &:after { 183 | content: ""; 184 | display: table; 185 | clear: both; 186 | } 187 | } 188 | 189 | 190 | 191 | /** 192 | * Icons 193 | */ 194 | .icon { 195 | 196 | > svg { 197 | display: inline-block; 198 | width: 16px; 199 | height: 16px; 200 | vertical-align: middle; 201 | 202 | path { 203 | fill: $grey-color; 204 | } 205 | } 206 | } 207 | -------------------------------------------------------------------------------- /_sass/_layout.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Site header 3 | */ 4 | .site-header { 5 | border-top: 5px solid $grey-color-dark; 6 | border-bottom: 1px solid $grey-color-light; 7 | min-height: 56px; 8 | 9 | // Positioning context for the mobile navigation icon 10 | position: relative; 11 | } 12 | 13 | .site-title { 14 | font-size: 26px; 15 | font-weight: 300; 16 | line-height: 56px; 17 | letter-spacing: -1px; 18 | margin-bottom: 0; 19 | float: left; 20 | 21 | &, 22 | &:visited { 23 | color: $grey-color-dark; 24 | } 25 | } 26 | 27 | .site-nav { 28 | float: right; 29 | line-height: 56px; 30 | 31 | .menu-icon { 32 | display: none; 33 | } 34 | 35 | .page-link { 36 | color: $text-color; 37 | line-height: $base-line-height; 38 | 39 | // Gaps between nav items, but not on the last one 40 | &:not(:last-child) { 41 | margin-right: 20px; 42 | } 43 | } 44 | 45 | @include media-query($on-palm) { 46 | position: absolute; 47 | top: 9px; 48 | right: $spacing-unit / 2; 49 | background-color: $background-color; 50 | border: 1px solid $grey-color-light; 51 | border-radius: 5px; 52 | text-align: right; 53 | 54 | .menu-icon { 55 | display: block; 56 | float: right; 57 | width: 36px; 58 | height: 26px; 59 | line-height: 0; 60 | padding-top: 10px; 61 | text-align: center; 62 | 63 | > svg { 64 | width: 18px; 65 | height: 15px; 66 | 67 | path { 68 | fill: $grey-color-dark; 69 | } 70 | } 71 | } 72 | 73 | .trigger { 74 | clear: both; 75 | display: none; 76 | } 77 | 78 | &:hover .trigger { 79 | display: block; 80 | padding-bottom: 5px; 81 | } 82 | 83 | .page-link { 84 | display: block; 85 | padding: 5px 10px; 86 | 87 | &:not(:last-child) { 88 | margin-right: 0; 89 | } 90 | margin-left: 20px; 91 | } 92 | } 93 | } 94 | 95 | 96 | 97 | /** 98 | * Site footer 99 | */ 100 | .site-footer { 101 | border-top: 1px solid $grey-color-light; 102 | padding: $spacing-unit 0; 103 | } 104 | 105 | .footer-heading { 106 | font-size: 18px; 107 | margin-bottom: $spacing-unit / 2; 108 | } 109 | 110 | .contact-list, 111 | .social-media-list { 112 | list-style: none; 113 | margin-left: 0; 114 | } 115 | 116 | .footer-col-wrapper { 117 | font-size: 15px; 118 | color: $grey-color; 119 | margin-left: -$spacing-unit / 2; 120 | @extend %clearfix; 121 | } 122 | 123 | .footer-col { 124 | float: left; 125 | margin-bottom: $spacing-unit / 2; 126 | padding-left: $spacing-unit / 2; 127 | } 128 | 129 | .footer-col-1 { 130 | width: -webkit-calc(35% - (#{$spacing-unit} / 2)); 131 | width: calc(35% - (#{$spacing-unit} / 2)); 132 | } 133 | 134 | .footer-col-2 { 135 | width: -webkit-calc(20% - (#{$spacing-unit} / 2)); 136 | width: calc(20% - (#{$spacing-unit} / 2)); 137 | } 138 | 139 | .footer-col-3 { 140 | width: -webkit-calc(45% - (#{$spacing-unit} / 2)); 141 | width: calc(45% - (#{$spacing-unit} / 2)); 142 | } 143 | 144 | @include media-query($on-laptop) { 145 | .footer-col-1, 146 | .footer-col-2 { 147 | width: -webkit-calc(50% - (#{$spacing-unit} / 2)); 148 | width: calc(50% - (#{$spacing-unit} / 2)); 149 | } 150 | 151 | .footer-col-3 { 152 | width: -webkit-calc(100% - (#{$spacing-unit} / 2)); 153 | width: calc(100% - (#{$spacing-unit} / 2)); 154 | } 155 | } 156 | 157 | @include media-query($on-palm) { 158 | .footer-col { 159 | float: none; 160 | width: -webkit-calc(100% - (#{$spacing-unit} / 2)); 161 | width: calc(100% - (#{$spacing-unit} / 2)); 162 | } 163 | } 164 | 165 | 166 | 167 | /** 168 | * Page content 169 | */ 170 | .page-content { 171 | padding: $spacing-unit 0; 172 | } 173 | 174 | .page-heading { 175 | font-size: 20px; 176 | } 177 | 178 | .post-list { 179 | margin-left: 0; 180 | list-style: none; 181 | 182 | > li { 183 | margin-bottom: $spacing-unit; 184 | } 185 | } 186 | 187 | .post-meta { 188 | font-size: $small-font-size; 189 | color: $grey-color; 190 | } 191 | 192 | .post-link { 193 | display: block; 194 | font-size: 24px; 195 | } 196 | 197 | 198 | 199 | /** 200 | * Posts 201 | */ 202 | .post-header { 203 | margin-bottom: $spacing-unit; 204 | } 205 | 206 | .post-title { 207 | font-size: 42px; 208 | letter-spacing: -1px; 209 | line-height: 1; 210 | 211 | @include media-query($on-laptop) { 212 | font-size: 36px; 213 | } 214 | } 215 | 216 | .post-content { 217 | margin-bottom: $spacing-unit; 218 | 219 | h2 { 220 | font-size: 32px; 221 | 222 | @include media-query($on-laptop) { 223 | font-size: 28px; 224 | } 225 | } 226 | 227 | h3 { 228 | font-size: 26px; 229 | 230 | @include media-query($on-laptop) { 231 | font-size: 22px; 232 | } 233 | } 234 | 235 | h4 { 236 | font-size: 20px; 237 | 238 | @include media-query($on-laptop) { 239 | font-size: 18px; 240 | } 241 | } 242 | } 243 | -------------------------------------------------------------------------------- /_sass/_syntax-highlighting.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Syntax highlighting styles 3 | */ 4 | .highlight { 5 | background: #fff; 6 | @extend %vertical-rhythm; 7 | 8 | .highlighter-rouge & { 9 | background: #eef; 10 | } 11 | 12 | .c { color: #998; font-style: italic } // Comment 13 | .err { color: #a61717; background-color: #e3d2d2 } // Error 14 | .k { font-weight: bold } // Keyword 15 | .o { font-weight: bold } // Operator 16 | .cm { color: #998; font-style: italic } // Comment.Multiline 17 | .cp { color: #999; font-weight: bold } // Comment.Preproc 18 | .c1 { color: #998; font-style: italic } // Comment.Single 19 | .cs { color: #999; font-weight: bold; font-style: italic } // Comment.Special 20 | .gd { color: #000; background-color: #fdd } // Generic.Deleted 21 | .gd .x { color: #000; background-color: #faa } // Generic.Deleted.Specific 22 | .ge { font-style: italic } // Generic.Emph 23 | .gr { color: #a00 } // Generic.Error 24 | .gh { color: #999 } // Generic.Heading 25 | .gi { color: #000; background-color: #dfd } // Generic.Inserted 26 | .gi .x { color: #000; background-color: #afa } // Generic.Inserted.Specific 27 | .go { color: #888 } // Generic.Output 28 | .gp { color: #555 } // Generic.Prompt 29 | .gs { font-weight: bold } // Generic.Strong 30 | .gu { color: #aaa } // Generic.Subheading 31 | .gt { color: #a00 } // Generic.Traceback 32 | .kc { font-weight: bold } // Keyword.Constant 33 | .kd { font-weight: bold } // Keyword.Declaration 34 | .kp { font-weight: bold } // Keyword.Pseudo 35 | .kr { font-weight: bold } // Keyword.Reserved 36 | .kt { color: #458; font-weight: bold } // Keyword.Type 37 | .m { color: #099 } // Literal.Number 38 | .s { color: #d14 } // Literal.String 39 | .na { color: #008080 } // Name.Attribute 40 | .nb { color: #0086B3 } // Name.Builtin 41 | .nc { color: #458; font-weight: bold } // Name.Class 42 | .no { color: #008080 } // Name.Constant 43 | .ni { color: #800080 } // Name.Entity 44 | .ne { color: #900; font-weight: bold } // Name.Exception 45 | .nf { color: #900; font-weight: bold } // Name.Function 46 | .nn { color: #555 } // Name.Namespace 47 | .nt { color: #000080 } // Name.Tag 48 | .nv { color: #008080 } // Name.Variable 49 | .ow { font-weight: bold } // Operator.Word 50 | .w { color: #bbb } // Text.Whitespace 51 | .mf { color: #099 } // Literal.Number.Float 52 | .mh { color: #099 } // Literal.Number.Hex 53 | .mi { color: #099 } // Literal.Number.Integer 54 | .mo { color: #099 } // Literal.Number.Oct 55 | .sb { color: #d14 } // Literal.String.Backtick 56 | .sc { color: #d14 } // Literal.String.Char 57 | .sd { color: #d14 } // Literal.String.Doc 58 | .s2 { color: #d14 } // Literal.String.Double 59 | .se { color: #d14 } // Literal.String.Escape 60 | .sh { color: #d14 } // Literal.String.Heredoc 61 | .si { color: #d14 } // Literal.String.Interpol 62 | .sx { color: #d14 } // Literal.String.Other 63 | .sr { color: #009926 } // Literal.String.Regex 64 | .s1 { color: #d14 } // Literal.String.Single 65 | .ss { color: #990073 } // Literal.String.Symbol 66 | .bp { color: #999 } // Name.Builtin.Pseudo 67 | .vc { color: #008080 } // Name.Variable.Class 68 | .vg { color: #008080 } // Name.Variable.Global 69 | .vi { color: #008080 } // Name.Variable.Instance 70 | .il { color: #099 } // Literal.Number.Integer.Long 71 | } 72 | -------------------------------------------------------------------------------- /about.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: About 4 | permalink: /about/ 5 | --- 6 | 7 | ReactiveCocoa is a framework that's been around for a few years now and you can see it 8 | powered awesome tools like [Tentacle](https://github.com/mdiep/Tentacle) or [Carthage](https://github.com/Carthage/Carthage). This framework can do a lot but sometimes newcommers as well as 9 | RAC experts can fell puzzled and the documentation will not necessarilly help. Sometimes it's not 10 | about how to do something with the framework as much as how to do it right or even how did other 11 | developers achieve it. 12 | 13 | Project discoverability is hard, even where the place to look at is Github. That's why this list 14 | is born. More and more people are choosing to open source their projects. When these projects 15 | are relying on ReactiveCocoa to organize Network calls, to bind values to UI components or even 16 | talk to a CoreData database, they become great source of knowledge that should be easier to find. 17 | 18 | This list is not about trying to make a statement about how ReactiveCocoa is the best framework 19 | to do functional reactive programing. There are other great frameworks out there and it would be 20 | awesome to see lists just like this one. 21 | 22 | ## How to contribute 23 | 24 | This list has been initially curated by [Romain Pouclet](https://romain-pouclet.com). Everything 25 | is open-source though, so feel free to open a pull request to suggest an app or a framework using ReactiveCocoa. Although please note that even if we loved hitting those square-bracket keys 26 | thousands of times a day writting code using ReactiveCocoa in Objective-C, we are trying to curate a list of projects using the most recent version of the framework. 27 | -------------------------------------------------------------------------------- /css/computer-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RACCommunity/racurated/0339ddb477c50e3d41dbb23aea4ce44983982d43/css/computer-icon.png -------------------------------------------------------------------------------- /css/computer-icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RACCommunity/racurated/0339ddb477c50e3d41dbb23aea4ce44983982d43/css/computer-icon@2x.png -------------------------------------------------------------------------------- /css/main.scss: -------------------------------------------------------------------------------- 1 | --- 2 | # Only the main Sass file needs front matter (the dashes are enough) 3 | --- 4 | @charset "utf-8"; 5 | 6 | 7 | 8 | // Our variables 9 | $base-font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 10 | $base-font-size: 15px; 11 | $base-font-weight: 300; 12 | $small-font-size: $base-font-size * 0.875; 13 | $base-line-height: 1.5; 14 | 15 | $spacing-unit: 30px; 16 | 17 | $text-color: #111; 18 | $background-color: #fdfdfd; 19 | $brand-color: #2a7ae2; 20 | 21 | $grey-color: #828282; 22 | $grey-color-light: lighten($grey-color, 40%); 23 | $grey-color-dark: darken($grey-color, 25%); 24 | 25 | // Width of the content area 26 | $content-width: 800px; 27 | 28 | $on-palm: 600px; 29 | $on-laptop: 800px; 30 | 31 | // Use media queries like this: 32 | // @include media-query($on-palm) { 33 | // .wrapper { 34 | // padding-right: $spacing-unit / 2; 35 | // padding-left: $spacing-unit / 2; 36 | // } 37 | // } 38 | @mixin media-query($device) { 39 | @media screen and (max-width: $device) { 40 | @content; 41 | } 42 | } 43 | 44 | 45 | // Import partials from `sass_dir` (defaults to `_sass`) 46 | @import 47 | "base", 48 | "layout", 49 | "syntax-highlighting" 50 | ; 51 | a { 52 | &:visited { 53 | color: $brand-color; 54 | } 55 | } 56 | 57 | .project { 58 | padding-left: 40px; 59 | margin-bottom: 10px; 60 | h1, p { 61 | margin-bottom: 0; 62 | } 63 | 64 | } 65 | 66 | .repo-link { 67 | margin-top:10px; 68 | } 69 | 70 | .ios { 71 | background: url(smartphone-icon.png) no-repeat 10px 10px; 72 | } 73 | 74 | .mac { 75 | background: url(computer-icon.png) no-repeat 0 10px; 76 | } 77 | 78 | .tool, .framework { 79 | background: url(wrench.png) no-repeat 10px 10px; 80 | } 81 | 82 | .highlights { 83 | color: #424242; 84 | font-size: 0.5em; 85 | } 86 | 87 | .site-footer { 88 | text-align: center; 89 | } 90 | -------------------------------------------------------------------------------- /css/smartphone-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RACCommunity/racurated/0339ddb477c50e3d41dbb23aea4ce44983982d43/css/smartphone-icon.png -------------------------------------------------------------------------------- /css/smartphone-icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RACCommunity/racurated/0339ddb477c50e3d41dbb23aea4ce44983982d43/css/smartphone-icon@2x.png -------------------------------------------------------------------------------- /css/wrench.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RACCommunity/racurated/0339ddb477c50e3d41dbb23aea4ce44983982d43/css/wrench.png -------------------------------------------------------------------------------- /css/wrench@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RACCommunity/racurated/0339ddb477c50e3d41dbb23aea4ce44983982d43/css/wrench@2x.png -------------------------------------------------------------------------------- /feed.xml: -------------------------------------------------------------------------------- 1 | --- 2 | layout: null 3 | --- 4 | 5 | 6 | 7 | {{ site.title | xml_escape }} 8 | {{ site.description | xml_escape }} 9 | {{ site.url }}{{ site.baseurl }}/ 10 | 11 | {{ site.time | date_to_rfc822 }} 12 | {{ site.time | date_to_rfc822 }} 13 | Jekyll v{{ jekyll.version }} 14 | {% for post in site.posts limit:10 %} 15 | 16 | {{ post.title | xml_escape }} 17 | {{ post.content | xml_escape }} 18 | {{ post.date | date_to_rfc822 }} 19 | {{ post.url | prepend: site.baseurl | prepend: site.url }} 20 | {{ post.url | prepend: site.baseurl | prepend: site.url }} 21 | {% for tag in post.tags %} 22 | {{ tag | xml_escape }} 23 | {% endfor %} 24 | {% for cat in post.categories %} 25 | {{ cat | xml_escape }} 26 | {% endfor %} 27 | 28 | {% endfor %} 29 | 30 | 31 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 | 5 |
6 | {% for project in site.data.projects %} 7 | {% include project.html project=project %} 8 | {% endfor %} 9 |
10 | -------------------------------------------------------------------------------- /script/cibuild: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -e # halt script on error 3 | 4 | bundle exec jekyll build -d ./_site/racurated 5 | bundle exec htmlproofer ./_site 6 | --------------------------------------------------------------------------------