├── Procfile ├── public ├── assets │ └── .gitignore ├── images │ ├── heart.png │ ├── favicon.ico │ ├── icon-120.png │ ├── icon-152.png │ ├── icon-76.png │ ├── paddle.png │ ├── video_play.png │ ├── filter-button.png │ ├── heart_white.png │ ├── select_arrow.png │ ├── sothebys-logo.png │ ├── user_profile.png │ ├── auction-header-img.jpg │ ├── fairs-header-img.jpg │ ├── image-set.svg │ ├── chevron_submit.svg │ ├── chevron_arrow_g.svg │ ├── chevron_arrow.svg │ └── logo_square.svg └── fonts │ ├── artsy-icons.eot │ ├── artsy-icons.ttf │ ├── artsy-icons.woff │ └── artsy-icons.woff2 ├── apps ├── auctions │ ├── templates │ │ └── buyers_premium.jade │ ├── index.coffee │ └── client │ │ └── auctions.coffee ├── dev │ ├── routes.coffee │ ├── templates │ │ └── blank.jade │ ├── index.coffee │ └── test │ │ └── integrations.coffee ├── fair │ ├── test │ │ └── client │ │ │ └── trending.coffee │ ├── aggregations.coffee │ ├── stylesheets │ │ ├── search_results.styl │ │ ├── artworks.styl │ │ ├── artist.styl │ │ ├── info.styl │ │ ├── for_you.styl │ │ └── trending.styl │ ├── templates │ │ ├── programming │ │ │ ├── nav.jade │ │ │ ├── list_item.jade │ │ │ ├── event.jade │ │ │ └── index.jade │ │ ├── exhibitors_page.jade │ │ ├── primary_set.jade │ │ ├── image_nav_item.jade │ │ ├── feed.jade │ │ ├── exhibitors_subheader.jade │ │ ├── info.jade │ │ ├── sections.jade │ │ ├── for_you.jade │ │ ├── a_to_z.jade │ │ └── trending.jade │ └── client │ │ └── artworks.coffee ├── browse │ ├── aggregations.coffee │ ├── routes.coffee │ ├── index.styl │ ├── templates │ │ └── index.jade │ ├── client.coffee │ └── index.coffee ├── notifications │ ├── templates │ │ ├── empty.jade │ │ ├── index.jade │ │ └── artist.jade │ ├── client │ │ └── index.coffee │ ├── index.coffee │ └── routes.coffee ├── partners │ ├── index.styl │ └── index.coffee ├── personalize │ ├── templates │ │ ├── followed.jade │ │ ├── location.jade │ │ ├── collect.jade │ │ ├── index.jade │ │ ├── price_range.jade │ │ ├── results.jade │ │ └── artists.jade │ ├── routes.coffee │ ├── index.coffee │ ├── test │ │ └── routes.coffee │ └── client │ │ └── collect_view.coffee ├── articles │ ├── templates │ │ ├── articles_feed.jade │ │ ├── article.jade │ │ └── gallery_insights_form.jade │ ├── stylesheets │ │ ├── index.styl │ │ └── fixed_share.styl │ ├── meta │ │ └── articles.jade │ └── index.coffee ├── tag │ ├── index.styl │ ├── templates │ │ ├── header.jade │ │ └── filter.jade │ ├── index.coffee │ └── routes.coffee ├── auction │ ├── templates │ │ ├── metadata │ │ │ ├── description.jade │ │ │ ├── associated.jade │ │ │ └── event.jade │ │ └── subscribed.jade │ ├── index.coffee │ └── stylesheets │ │ └── subscribed.styl ├── how_auctions_work │ ├── public │ │ └── images │ │ │ └── mobile.jpg │ ├── index.coffee │ ├── routes.coffee │ ├── bid_increments.coffee │ └── templates │ │ ├── index.jade │ │ └── learn_more.jade ├── fair_organizer │ ├── templates │ │ ├── articles.jade │ │ └── fair.jade │ └── index.coffee ├── page │ ├── template.jade │ ├── routes.coffee │ ├── test │ │ └── integration.coffee │ └── index.styl ├── artwork │ ├── components │ │ ├── bid │ │ │ ├── query │ │ │ │ └── me.coffee │ │ │ ├── templates │ │ │ │ ├── inquiry_confirmation.jade │ │ │ │ └── bid_button.jade │ │ │ ├── query.coffee │ │ │ └── client │ │ │ │ └── bootstrap.coffee │ │ ├── meta_data │ │ │ ├── templates │ │ │ │ ├── price.jade │ │ │ │ ├── inquiry.jade │ │ │ │ └── index.jade │ │ │ └── view.coffee │ │ ├── image │ │ │ └── templates │ │ │ │ ├── image_carousel.jade │ │ │ │ └── image_module.jade │ │ ├── related_artworks │ │ │ ├── queries │ │ │ │ ├── related_query.coffee │ │ │ │ ├── fair_query.coffee │ │ │ │ ├── show_query.coffee │ │ │ │ ├── partner_query.coffee │ │ │ │ ├── artist_query.coffee │ │ │ │ ├── auction_query.coffee │ │ │ │ └── index.coffee │ │ │ └── index.styl │ │ ├── tabs │ │ │ ├── index.coffee │ │ │ └── query.coffee │ │ ├── partner │ │ │ ├── query.coffee │ │ │ ├── test │ │ │ │ └── fixture.coffee │ │ │ └── index.styl │ │ ├── artist │ │ │ └── templates │ │ │ │ ├── show.jade │ │ │ │ └── article.jade │ │ └── highlights │ │ │ └── templates │ │ │ ├── article.jade │ │ │ └── index.jade │ ├── index.coffee │ ├── templates │ │ ├── ask_specialist_page.jade │ │ └── index.jade │ └── stylesheets │ │ └── index.styl ├── fair_info │ ├── templates │ │ ├── about_fair.jade │ │ ├── event_nav.jade │ │ ├── events.jade │ │ └── armory_arts_week.jade │ ├── client │ │ └── index.coffee │ └── stylesheets │ │ ├── index.styl │ │ └── visitors.styl ├── home │ ├── client │ │ └── index.coffee │ ├── templates │ │ ├── featured_works.jade │ │ ├── featured_articles.jade │ │ └── current_shows.jade │ ├── index.coffee │ ├── stylesheets │ │ ├── index.styl │ │ └── current_shows.styl │ └── test │ │ └── integration.coffee ├── show │ ├── templates │ │ ├── description.jade │ │ ├── press_release.jade │ │ ├── full_schedule.jade │ │ ├── events.jade │ │ ├── artworks.jade │ │ ├── carousel.jade │ │ └── hours.jade │ ├── index.coffee │ └── components │ │ └── follow_artists │ │ ├── template.jade │ │ └── index.styl ├── artist │ ├── templates │ │ ├── biography.jade │ │ └── header.jade │ ├── client │ │ └── index.coffee │ └── index.coffee ├── search │ ├── index.styl │ ├── index.coffee │ ├── template.jade │ └── routes.coffee ├── auth │ └── templates │ │ ├── login.jade │ │ ├── signup_append.jade │ │ ├── forgot_password_confirmation.jade │ │ ├── signup_email.jade │ │ ├── signup.jade │ │ ├── signup_buttons.jade │ │ ├── twitter_email.jade │ │ ├── reset_password.jade │ │ ├── signup_form.jade │ │ └── forgot_password.jade ├── shortcuts │ ├── index.coffee │ └── routes.coffee ├── favorites_following │ ├── client │ │ └── index.coffee │ ├── templates │ │ ├── profiles.jade │ │ ├── placeholder.jade │ │ └── index.jade │ └── index.coffee ├── gallery_partnerships │ ├── templates │ │ ├── index.jade │ │ ├── section6.jade │ │ ├── section1.jade │ │ ├── hero_unit.jade │ │ ├── section0.jade │ │ ├── section2.jade │ │ ├── section3.jade │ │ └── section5.jade │ ├── client │ │ ├── index.coffee │ │ └── router.coffee │ ├── index.coffee │ └── routes.coffee ├── unsubscribe │ ├── routes.coffee │ ├── index.coffee │ ├── email_types.coffee │ ├── index.styl │ └── templates │ │ └── index.jade ├── art_fairs │ ├── templates │ │ ├── past-fairs.jade │ │ └── fair-details.jade │ ├── index.coffee │ └── query.coffee ├── contact │ ├── client │ │ └── index.coffee │ ├── index.coffee │ ├── routes.coffee │ └── test │ │ └── template.coffee ├── order │ ├── index.coffee │ └── routes.coffee ├── artists │ ├── index.coffee │ ├── client.coffee │ ├── templates │ │ └── index.jade │ └── index.styl ├── gene │ ├── templates │ │ ├── artist_list.jade │ │ └── header.jade │ ├── index.coffee │ └── routes.coffee ├── user │ ├── index.coffee │ ├── client │ │ └── error_handling.coffee │ └── templates │ │ └── settings.jade ├── shows │ ├── templates │ │ ├── all_cities.jade │ │ └── index.jade │ └── index.coffee ├── feature │ └── templates │ │ ├── confirm_page.jade │ │ ├── auction_detail.jade │ │ └── filter.jade ├── auction_support │ ├── templates │ │ ├── registration-error.jade │ │ └── registration.jade │ └── index.coffee ├── galleries_institutions │ ├── templates │ │ ├── partners.jade │ │ ├── partner_a_to_z.jade │ │ └── partner.jade │ └── index.coffee ├── partner_profile │ ├── templates │ │ ├── shows_page.jade │ │ ├── articles.jade │ │ ├── artworks.jade │ │ └── shows.jade │ ├── client │ │ └── articles.coffee │ └── stylesheets │ │ └── contact.styl └── profile │ ├── template.jade │ └── index.styl ├── components ├── alert │ ├── template.jade │ └── index.styl ├── modal │ ├── template.jade │ ├── index.styl │ └── view.coffee ├── auction_clock │ └── template.jade ├── deep_zoom │ ├── template.jade │ └── index.styl ├── article │ ├── templates │ │ ├── sections │ │ │ ├── text.jade │ │ │ ├── embed.jade │ │ │ ├── toc.jade │ │ │ ├── image.jade │ │ │ ├── slideshow │ │ │ │ ├── carousel.jade │ │ │ │ └── slide.jade │ │ │ ├── video.jade │ │ │ ├── image_set.jade │ │ │ └── artworks.jade │ │ ├── byline.jade │ │ └── what_to_read_next.jade │ └── stylesheets │ │ └── what_to_read_next.styl ├── layout │ ├── templates │ │ ├── json_ld.jade │ │ ├── bare.jade │ │ ├── login-signup.jade │ │ ├── footer.jade │ │ ├── ga.html │ │ └── error.jade │ └── stylesheets │ │ ├── utilities.styl │ │ ├── footer.styl │ │ ├── login_signup.styl │ │ └── spinners.styl ├── auction_artwork_list │ ├── template.jade │ └── state.coffee ├── show_more_works │ ├── template.jade │ ├── index.styl │ └── index.coffee ├── autocomplete │ └── templates │ │ ├── empty.jade │ │ └── index.jade ├── article_figure │ ├── index.styl │ ├── stylesheets │ │ └── share.styl │ ├── share.jade │ ├── contributing_authors.jade │ └── mixin.jade ├── specialist_modal │ ├── templates │ │ └── success.jade │ └── index.coffee ├── location_search │ └── template.jade ├── multi_page │ ├── index.coffee │ ├── template.jade │ └── config.coffee ├── util │ ├── markdown.coffee │ └── json.coffee ├── select │ ├── templates │ │ └── select.jade │ └── stylesheets │ │ └── index.styl ├── artist_list │ ├── hide_without_image.coffee │ ├── index.styl │ └── template.jade ├── filter2 │ ├── dropdown │ │ ├── template.jade │ │ └── view.coffee │ ├── stylesheets │ │ └── index.styl │ └── template.jade ├── featured_items │ ├── contents.jade │ └── template.jade ├── video │ └── template.jade ├── resizer │ ├── config.coffee │ └── index.coffee ├── bid_numbers │ ├── template.jade │ └── index.styl ├── a_to_z_list │ ├── template.jade │ └── index.styl ├── app_banner │ ├── excluded.coffee │ └── index.coffee ├── flickity │ └── index.jade ├── cycle │ └── README.md ├── cookies │ └── index.coffee ├── filter │ └── dropdown_mixin.jade ├── artwork_list │ └── index.styl ├── avant_garde_tabs │ └── nav.jade ├── follow_button │ └── index.styl ├── main_dropdown_menu │ ├── template.jade │ └── index.coffee ├── artwork_columns │ └── template.jade └── search_results │ └── index.styl ├── assets ├── openseadragon.coffee ├── notifications.styl ├── artists.styl ├── notifications.coffee ├── partners.styl ├── user.styl ├── favorites_following.coffee ├── favorites_following.styl ├── show.coffee ├── artists.coffee ├── articles.styl ├── artwork.coffee ├── show.styl ├── user.coffee ├── articles.coffee └── artwork.styl ├── test ├── helpers │ └── fabricate.coffee ├── mocha.opts ├── collections │ ├── partners.coffee │ └── partner_locations.coffee ├── models │ ├── image.coffee │ ├── show_event.coffee │ ├── hero_unit.coffee │ ├── fair_trend.coffee │ └── feature.coffee └── lib │ ├── setup │ ├── routes.coffee │ └── index.coffee │ └── middleware │ ├── redirect_external_links.coffee │ └── hsts.coffee ├── models ├── auction.coffee ├── install_shot.coffee ├── representative.coffee ├── user.coffee ├── follow_gene.coffee ├── follow_artist.coffee ├── marketplace.coffee ├── follow_profile.coffee ├── section.coffee ├── shortcut.coffee ├── mixins │ ├── compact_object.coffee │ ├── relations │ │ ├── fair.coffee │ │ ├── partner.coffee │ │ ├── location.coffee │ │ └── sale.coffee │ ├── eventable.coffee │ └── date.coffee ├── edition_set.coffee ├── item.coffee ├── cover_image.coffee ├── page.coffee ├── hero_unit.coffee ├── featured_set.coffee ├── show_event.coffee ├── fair_location.coffee ├── fair_organizer.coffee ├── additional_image.coffee ├── image.coffee ├── location.coffee ├── inquiry.coffee ├── fair_entry.coffee ├── video.coffee ├── filter_suggest.coffee ├── ordered_set.coffee └── feature.coffee ├── collections ├── images.coffee ├── edition_sets.coffee ├── show_events.coffee ├── genes.coffee ├── sales.coffee ├── fair_entries.coffee ├── videos.coffee ├── hero_units.coffee ├── partner_artist_artworks.coffee ├── search_results.coffee ├── profiles.coffee ├── sale_artworks.coffee ├── artists.coffee ├── available_representatives.coffee ├── representatives.coffee ├── install_shots.coffee ├── partners.coffee ├── shows_feed.coffee ├── articles.coffee ├── partner_locations.coffee └── sections.coffee ├── lib ├── mediator.coffee ├── get_script.coffee ├── analytics_hooks.coffee └── middleware │ ├── redirect_external_links.coffee │ ├── ensure_ssl.coffee │ └── hsts.coffee ├── .gitignore └── analytics ├── auth.js ├── before_ready.js ├── fairs.js └── save.js /Procfile: -------------------------------------------------------------------------------- 1 | web: make sf -------------------------------------------------------------------------------- /public/assets/.gitignore: -------------------------------------------------------------------------------- 1 | * -------------------------------------------------------------------------------- /apps/auctions/templates/buyers_premium.jade: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /components/alert/template.jade: -------------------------------------------------------------------------------- 1 | .alert= message -------------------------------------------------------------------------------- /assets/openseadragon.coffee: -------------------------------------------------------------------------------- 1 | require '../lib/vendor/openseadragon.js' 2 | -------------------------------------------------------------------------------- /apps/dev/routes.coffee: -------------------------------------------------------------------------------- 1 | @blank = (req, res) -> 2 | res.render 'blank' 3 | -------------------------------------------------------------------------------- /apps/fair/test/client/trending.coffee: -------------------------------------------------------------------------------- 1 | xdescribe 'Fair trending view', -> 2 | -------------------------------------------------------------------------------- /components/modal/template.jade: -------------------------------------------------------------------------------- 1 | .modal 2 | .modal__close 3 | .modal__content -------------------------------------------------------------------------------- /test/helpers/fabricate.coffee: -------------------------------------------------------------------------------- 1 | module.exports = require('antigravity').fabricate -------------------------------------------------------------------------------- /apps/browse/aggregations.coffee: -------------------------------------------------------------------------------- 1 | module.exports = ['medium', 'price_range', 'total'] -------------------------------------------------------------------------------- /apps/fair/aggregations.coffee: -------------------------------------------------------------------------------- 1 | module.exports = ['medium', 'price_range', 'total'] -------------------------------------------------------------------------------- /apps/fair/stylesheets/search_results.styl: -------------------------------------------------------------------------------- 1 | .artsy-search-results 2 | padding-top 15px -------------------------------------------------------------------------------- /apps/fair/stylesheets/artworks.styl: -------------------------------------------------------------------------------- 1 | .fairs-artworks-categories 2 | margin 20px 0 30px 0 3 | -------------------------------------------------------------------------------- /apps/notifications/templates/empty.jade: -------------------------------------------------------------------------------- 1 | .notifications-list-item 2 | | Nothing here yet 3 | -------------------------------------------------------------------------------- /components/auction_clock/template.jade: -------------------------------------------------------------------------------- 1 | .auction-clock 2 | h2 3 | ul.auction-clock-value -------------------------------------------------------------------------------- /apps/partners/index.styl: -------------------------------------------------------------------------------- 1 | .featured-partners-invite 2 | margin 20px 5px 3 | text-align center 4 | -------------------------------------------------------------------------------- /components/deep_zoom/template.jade: -------------------------------------------------------------------------------- 1 | a#dz-close: i.icon-close 2 | 3 | #dz-spinner.loading-spinner 4 | -------------------------------------------------------------------------------- /public/images/heart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steam/microgravity/master/public/images/heart.png -------------------------------------------------------------------------------- /components/article/templates/sections/text.jade: -------------------------------------------------------------------------------- 1 | .article-section.article-section-text 2 | != text.body 3 | -------------------------------------------------------------------------------- /components/layout/templates/json_ld.jade: -------------------------------------------------------------------------------- 1 | script#json-ld( type='application/ld+json' ) 2 | != [jsonLD] 3 | -------------------------------------------------------------------------------- /public/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steam/microgravity/master/public/images/favicon.ico -------------------------------------------------------------------------------- /public/images/icon-120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steam/microgravity/master/public/images/icon-120.png -------------------------------------------------------------------------------- /public/images/icon-152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steam/microgravity/master/public/images/icon-152.png -------------------------------------------------------------------------------- /public/images/icon-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steam/microgravity/master/public/images/icon-76.png -------------------------------------------------------------------------------- /public/images/paddle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steam/microgravity/master/public/images/paddle.png -------------------------------------------------------------------------------- /apps/personalize/templates/followed.jade: -------------------------------------------------------------------------------- 1 | .personalize-following-list 2 | strong Following: 3 | = list 4 | -------------------------------------------------------------------------------- /public/fonts/artsy-icons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steam/microgravity/master/public/fonts/artsy-icons.eot -------------------------------------------------------------------------------- /public/fonts/artsy-icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steam/microgravity/master/public/fonts/artsy-icons.ttf -------------------------------------------------------------------------------- /public/images/video_play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steam/microgravity/master/public/images/video_play.png -------------------------------------------------------------------------------- /components/layout/templates/bare.jade: -------------------------------------------------------------------------------- 1 | extends ./scaffold 2 | 3 | block body 4 | #content 5 | block content 6 | -------------------------------------------------------------------------------- /public/fonts/artsy-icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steam/microgravity/master/public/fonts/artsy-icons.woff -------------------------------------------------------------------------------- /public/fonts/artsy-icons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steam/microgravity/master/public/fonts/artsy-icons.woff2 -------------------------------------------------------------------------------- /public/images/filter-button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steam/microgravity/master/public/images/filter-button.png -------------------------------------------------------------------------------- /public/images/heart_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steam/microgravity/master/public/images/heart_white.png -------------------------------------------------------------------------------- /public/images/select_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steam/microgravity/master/public/images/select_arrow.png -------------------------------------------------------------------------------- /public/images/sothebys-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steam/microgravity/master/public/images/sothebys-logo.png -------------------------------------------------------------------------------- /public/images/user_profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steam/microgravity/master/public/images/user_profile.png -------------------------------------------------------------------------------- /models/auction.coffee: -------------------------------------------------------------------------------- 1 | Sale = require './sale.coffee' 2 | 3 | module.exports = class Auction extends Sale 4 | # Deprecated -------------------------------------------------------------------------------- /apps/articles/templates/articles_feed.jade: -------------------------------------------------------------------------------- 1 | for article in articles 2 | include ../../../components/article_figure/template 3 | -------------------------------------------------------------------------------- /apps/dev/templates/blank.jade: -------------------------------------------------------------------------------- 1 | extends ../../../components/layout/templates/main 2 | 3 | // This page is intentionally blank 4 | -------------------------------------------------------------------------------- /apps/tag/index.styl: -------------------------------------------------------------------------------- 1 | #tag-content .tag-artworks 2 | height: 85px 3 | 4 | .tag-page-large-header 5 | margin: 30px 0 12px 6 | -------------------------------------------------------------------------------- /public/images/auction-header-img.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steam/microgravity/master/public/images/auction-header-img.jpg -------------------------------------------------------------------------------- /public/images/fairs-header-img.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steam/microgravity/master/public/images/fairs-header-img.jpg -------------------------------------------------------------------------------- /test/mocha.opts: -------------------------------------------------------------------------------- 1 | --require should 2 | --reporter list 3 | --ui bdd 4 | --compilers coffee:coffee-script/register 5 | --timeout 30000 -------------------------------------------------------------------------------- /components/auction_artwork_list/template.jade: -------------------------------------------------------------------------------- 1 | .auction-artwork-list 2 | for artwork in artworks 3 | include ./templates/artwork 4 | -------------------------------------------------------------------------------- /components/show_more_works/template.jade: -------------------------------------------------------------------------------- 1 | .show-more-works__artworks-slider 2 | .circle-border-icon-button 3 | .chevron-arrow-button -------------------------------------------------------------------------------- /components/autocomplete/templates/empty.jade: -------------------------------------------------------------------------------- 1 | .search-result 2 | .search-result-info 3 | .search-result-display 4 | | No results 5 | -------------------------------------------------------------------------------- /apps/personalize/routes.coffee: -------------------------------------------------------------------------------- 1 | @index = (req, res, next) -> 2 | if req.user? 3 | res.render 'index' 4 | else 5 | res.redirect '/' 6 | -------------------------------------------------------------------------------- /apps/auction/templates/metadata/description.jade: -------------------------------------------------------------------------------- 1 | if auction.get('description') 2 | .auction-description 3 | != auction.mdToHtml('description') 4 | -------------------------------------------------------------------------------- /apps/how_auctions_work/public/images/mobile.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/steam/microgravity/master/apps/how_auctions_work/public/images/mobile.jpg -------------------------------------------------------------------------------- /models/install_shot.coffee: -------------------------------------------------------------------------------- 1 | AdditionalImage = require './additional_image.coffee' 2 | 3 | module.exports = class InstallShot extends AdditionalImage 4 | -------------------------------------------------------------------------------- /apps/personalize/templates/location.jade: -------------------------------------------------------------------------------- 1 | header.personalize-header 2 | h1.avant-garde-header-center Where do you call home? 3 | 4 | #location-search-view -------------------------------------------------------------------------------- /assets/notifications.styl: -------------------------------------------------------------------------------- 1 | @import '../components/layout/stylesheets' 2 | @import '../apps/notifications/stylesheets' 3 | @import '../components/artwork_columns' -------------------------------------------------------------------------------- /apps/fair_organizer/templates/articles.jade: -------------------------------------------------------------------------------- 1 | include ../../../components/article_figure/mixin 2 | 3 | for article in articles 4 | +article-figure(article, 300, true) -------------------------------------------------------------------------------- /apps/page/template.jade: -------------------------------------------------------------------------------- 1 | extends ../../components/layout/templates/main 2 | 3 | block content 4 | #page-markdown-content.main-side-margin!= page.mdToHtml('content') -------------------------------------------------------------------------------- /assets/artists.styl: -------------------------------------------------------------------------------- 1 | 2 | // 3 | // Stylesheet package for the artists app 4 | // 5 | 6 | @import '../components/layout/stylesheets' 7 | @import '../apps/artists/index' -------------------------------------------------------------------------------- /components/article/templates/sections/embed.jade: -------------------------------------------------------------------------------- 1 | iframe(src=section.url style="height:#{section.mobile_height || section.height }px" scrolling='no' frameborder='0') 2 | -------------------------------------------------------------------------------- /models/representative.coffee: -------------------------------------------------------------------------------- 1 | Profile = require './profile.coffee' 2 | 3 | module.exports = class Representative extends Profile 4 | idAttribute: 'default_profile_id' -------------------------------------------------------------------------------- /components/article_figure/index.styl: -------------------------------------------------------------------------------- 1 | @import '../stylus_lib' 2 | 3 | @import './stylesheets/figure' 4 | @import './stylesheets/share' 5 | @import './stylesheets/index' 6 | -------------------------------------------------------------------------------- /apps/artwork/components/bid/query/me.coffee: -------------------------------------------------------------------------------- 1 | module.exports = """ 2 | me { 3 | id 4 | bidder_positions(artwork_id: $id) { 5 | is_winning 6 | } 7 | } 8 | """ -------------------------------------------------------------------------------- /assets/notifications.coffee: -------------------------------------------------------------------------------- 1 | # 2 | # Javascript package for the notifications app 3 | # 4 | 5 | require 'jquery' 6 | $ require('../apps/notifications/client/index.coffee') 7 | -------------------------------------------------------------------------------- /assets/partners.styl: -------------------------------------------------------------------------------- 1 | 2 | // 3 | // Stylesheet package for the artwork app 4 | // 5 | 6 | @import '../components/layout/stylesheets' 7 | @import '../apps/partners/index' 8 | -------------------------------------------------------------------------------- /components/specialist_modal/templates/success.jade: -------------------------------------------------------------------------------- 1 | .format-contact-success 2 | .format-contact-success-body 3 | h1 Thank you. 4 | h1 Your message has been sent. 5 | -------------------------------------------------------------------------------- /apps/tag/templates/header.jade: -------------------------------------------------------------------------------- 1 | header#tag-page-header 2 | h1.tag-page-large-header.avant-garde-header-center= tag.get('name') 3 | h2 4 | != tag.mdToHtml('description') 5 | -------------------------------------------------------------------------------- /assets/user.styl: -------------------------------------------------------------------------------- 1 | 2 | // 3 | // Stylesheet package for the user settings app 4 | // 5 | 6 | @import '../components/layout/stylesheets' 7 | @import '../apps/user/stylesheets/index' 8 | -------------------------------------------------------------------------------- /components/location_search/template.jade: -------------------------------------------------------------------------------- 1 | .autocomplete-input-container 2 | input.autocomplete-input( type='text' name='location', placeholder='Enter your city', autocomplete='off') 3 | -------------------------------------------------------------------------------- /components/multi_page/index.coffee: -------------------------------------------------------------------------------- 1 | MultiPageView = require './view.coffee' 2 | config = require './config.coffee' 3 | 4 | module.exports = (key) -> 5 | new MultiPageView config[key] 6 | -------------------------------------------------------------------------------- /apps/fair_info/templates/about_fair.jade: -------------------------------------------------------------------------------- 1 | #page-markdown-content.main-side-margin 2 | if fair.has('about') && fair.get('about') != '' 3 | .fair-info2-content!= fair.mdToHtml('about') 4 | -------------------------------------------------------------------------------- /assets/favorites_following.coffee: -------------------------------------------------------------------------------- 1 | # 2 | # Javascript package for the favorites_following app 3 | # 4 | 5 | require 'jquery' 6 | $ require('../apps/favorites_following/client/index.coffee') 7 | -------------------------------------------------------------------------------- /collections/images.coffee: -------------------------------------------------------------------------------- 1 | Backbone = require 'backbone' 2 | Image = require '../models/image.coffee' 3 | 4 | module.exports = class Images extends Backbone.Collection 5 | 6 | model: Image -------------------------------------------------------------------------------- /components/util/markdown.coffee: -------------------------------------------------------------------------------- 1 | { Markdown } = require 'artsy-backbone-mixins' 2 | 3 | module.exports = (string) -> 4 | Markdown.mdToHtml.apply { get: -> string }, [null, sanitize: false] -------------------------------------------------------------------------------- /lib/mediator.coffee: -------------------------------------------------------------------------------- 1 | _ = require 'underscore' 2 | Backbone = require 'backbone' 3 | 4 | mediator = _.extend({}, Backbone.Events) 5 | module.exports = (window?.__mediator ?= mediator) or mediator -------------------------------------------------------------------------------- /apps/home/client/index.coffee: -------------------------------------------------------------------------------- 1 | bootstrap = require '../../../components/layout/bootstrap.coffee' 2 | HomePageView = require './view.coffee' 3 | 4 | $ -> 5 | bootstrap() 6 | new HomePageView 7 | -------------------------------------------------------------------------------- /apps/show/templates/description.jade: -------------------------------------------------------------------------------- 1 | #show-page-description 2 | .show-page-description-title 3 | | About the Show 4 | .show-page-description-content 5 | p= show.get('description') 6 | -------------------------------------------------------------------------------- /components/select/templates/select.jade: -------------------------------------------------------------------------------- 1 | .select-group__label 2 | = label 3 | 4 | select.select-group__select 5 | for val, label in options 6 | option( value= val ) 7 | = label 8 | -------------------------------------------------------------------------------- /models/user.coffee: -------------------------------------------------------------------------------- 1 | Backbone = require 'backbone' 2 | sd = require('sharify').data 3 | 4 | module.exports = class User extends Backbone.Model 5 | 6 | urlRoot: -> "#{sd.API_URL}/api/v1/user" 7 | -------------------------------------------------------------------------------- /components/artist_list/hide_without_image.coffee: -------------------------------------------------------------------------------- 1 | # 2 | # Hides any list items for artists without images. 3 | # 4 | 5 | module.exports = -> 6 | $('.artist-list img').error -> $(@).closest('li').hide() -------------------------------------------------------------------------------- /apps/artwork/components/meta_data/templates/price.jade: -------------------------------------------------------------------------------- 1 | if artwork.sale_message && !artwork.auction 2 | .artwork-meta-data-price 3 | span.price-label Price: 4 | span.listed-price= artwork.sale_message -------------------------------------------------------------------------------- /assets/favorites_following.styl: -------------------------------------------------------------------------------- 1 | 2 | // 3 | // Stylesheet package for the favorites_following app 4 | // 5 | 6 | @import '../components/layout/stylesheets' 7 | @import '../apps/favorites_following/index' 8 | -------------------------------------------------------------------------------- /apps/artist/templates/biography.jade: -------------------------------------------------------------------------------- 1 | extends ../../../components/layout/templates/main 2 | 3 | block content 4 | include header 5 | #artist-biography-page.main-side-margin 6 | != artist.mdToHtml('blurb') -------------------------------------------------------------------------------- /apps/browse/routes.coffee: -------------------------------------------------------------------------------- 1 | @to = (path) -> (req, res) -> 2 | params = url.parse req.url 3 | .search or '' 4 | res.redirect 301, path + params 5 | 6 | @index = (req, res) -> 7 | res.render 'index' 8 | -------------------------------------------------------------------------------- /apps/show/templates/press_release.jade: -------------------------------------------------------------------------------- 1 | #show-page-press-release 2 | .show-page-press-release-title 3 | | Press Release 4 | .show-page-press-release-content 5 | != show.mdToHtml('press_release') 6 | -------------------------------------------------------------------------------- /apps/search/index.styl: -------------------------------------------------------------------------------- 1 | @import '../../components/stylus_lib' 2 | 3 | .search-page-result-header 4 | padding 10px 5 | border-bottom 1px solid light-gray-border-color 6 | margin 10px 0 7 | text-align center 8 | -------------------------------------------------------------------------------- /collections/edition_sets.coffee: -------------------------------------------------------------------------------- 1 | Backbone = require 'backbone' 2 | 3 | module.exports = class EditionSets extends Backbone.Collection 4 | 5 | initialize: -> 6 | @model = require '../models/edition_set.coffee' -------------------------------------------------------------------------------- /apps/articles/stylesheets/index.styl: -------------------------------------------------------------------------------- 1 | @import '../../../components/stylus_lib' 2 | 3 | @import './section' 4 | @import './fixed_share' 5 | @import './editorial_signup_lush' 6 | 7 | .articles-feed 8 | display block 9 | -------------------------------------------------------------------------------- /models/follow_gene.coffee: -------------------------------------------------------------------------------- 1 | sd = require('sharify').data 2 | Backbone = require 'backbone' 3 | 4 | module.exports = class FollowGene extends Backbone.Model 5 | 6 | urlRoot: -> 7 | "#{sd.API_URL}/api/v1/me/follow/gene" -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | lib-cov 2 | *.seed 3 | *.log 4 | *.csv 5 | *.dat 6 | *.out 7 | *.pid 8 | *.gz 9 | *.DS_Store 10 | *.projectile 11 | .env 12 | pids 13 | logs 14 | results 15 | npm-debug.log 16 | dump.rdb 17 | /node_modules -------------------------------------------------------------------------------- /apps/auth/templates/login.jade: -------------------------------------------------------------------------------- 1 | extends ../../../components/layout/templates/scaffold 2 | 3 | block body 4 | #auth-page 5 | .artsy-logo-large 6 | .auth-page-error-message= error || "" 7 | include login_form 8 | -------------------------------------------------------------------------------- /apps/shortcuts/index.coffee: -------------------------------------------------------------------------------- 1 | # 2 | # The Shortcut redirects 3 | # 4 | 5 | express = require 'express' 6 | routes = require './routes' 7 | 8 | app = module.exports = express() 9 | app.get '/:short', routes.index 10 | -------------------------------------------------------------------------------- /components/auction_artwork_list/state.coffee: -------------------------------------------------------------------------------- 1 | Backbone = require 'backbone' 2 | 3 | module.exports = class State extends Backbone.Model 4 | sort: 'default' 5 | 6 | isActive: ({ sort } = {}) -> 7 | @get('sort') is sort 8 | -------------------------------------------------------------------------------- /components/filter2/dropdown/template.jade: -------------------------------------------------------------------------------- 1 | .select-group__label 2 | = label 3 | 4 | select.select-group__select 5 | option( value='all' ) All 6 | each val, key in options 7 | option( value= key ) 8 | = val.name 9 | -------------------------------------------------------------------------------- /models/follow_artist.coffee: -------------------------------------------------------------------------------- 1 | sd = require('sharify').data 2 | Backbone = require 'backbone' 3 | 4 | module.exports = class FollowArtist extends Backbone.Model 5 | 6 | urlRoot: -> 7 | "#{sd.API_URL}/api/v1/me/follow/artist" 8 | -------------------------------------------------------------------------------- /models/marketplace.coffee: -------------------------------------------------------------------------------- 1 | Backbone = require 'backbone' 2 | { API_URL, CURRENT_USER } = require('sharify').data 3 | 4 | module.exports = class Marketplace extends Backbone.Model 5 | 6 | url: -> "#{API_URL}/api/v1/marketplace" 7 | -------------------------------------------------------------------------------- /apps/fair_info/client/index.coffee: -------------------------------------------------------------------------------- 1 | bootstrap = require '../../../components/layout/bootstrap.coffee' 2 | Fair = require '../../../models/fair.coffee' 3 | sd = require('sharify').data 4 | 5 | module.exports.init = -> 6 | bootstrap() 7 | -------------------------------------------------------------------------------- /apps/fair_info/templates/event_nav.jade: -------------------------------------------------------------------------------- 1 | each day in days 2 | a( href="#{day.href}", data-day=day.date ).fair-info-event-nav-item 3 | span.fair-info-event-nav-day-abbr= day.dayAbbr 4 | span.fair-info-event-nav-day-num= day.dayNum -------------------------------------------------------------------------------- /components/article/templates/sections/toc.jade: -------------------------------------------------------------------------------- 1 | .article-section-toc-header Table Of Contents 2 | .article-section-toc-links 3 | each link in toc.links 4 | .article-section-toc-link 5 | a(href="##{link.value}")= link.name 6 | -------------------------------------------------------------------------------- /models/follow_profile.coffee: -------------------------------------------------------------------------------- 1 | sd = require('sharify').data 2 | Backbone = require 'backbone' 3 | 4 | module.exports = class FollowProfile extends Backbone.Model 5 | 6 | urlRoot: -> 7 | "#{sd.API_URL}/api/v1/me/follow/profile" 8 | -------------------------------------------------------------------------------- /models/section.coffee: -------------------------------------------------------------------------------- 1 | _ = require 'underscore' 2 | sd = require('sharify').data 3 | Backbone = require 'backbone' 4 | 5 | module.exports = class Section extends Backbone.Model 6 | 7 | urlRoot: "#{sd.POSITRON_URL}/api/sections" 8 | -------------------------------------------------------------------------------- /models/shortcut.coffee: -------------------------------------------------------------------------------- 1 | _ = require 'underscore' 2 | Backbone = require 'backbone' 3 | sd = require('sharify').data 4 | 5 | module.exports = class Shortcut extends Backbone.Model 6 | 7 | urlRoot: -> "#{sd.API_URL}/api/v1/shortcut" 8 | -------------------------------------------------------------------------------- /components/article/templates/sections/image.jade: -------------------------------------------------------------------------------- 1 | figure.article-section.article-section-image 2 | img( src= resize(image.url, { width: 1080 }), alt= image.caption ) 3 | if image.caption 4 | figcaption 5 | != image.caption 6 | -------------------------------------------------------------------------------- /apps/artwork/components/image/templates/image_carousel.jade: -------------------------------------------------------------------------------- 1 | section#artwork-carousel 2 | 3 | #artwork-carousel__track 4 | for img in artwork.images 5 | figure.artwork-carousel__track__image 6 | img.artwork-image(src=img.url) -------------------------------------------------------------------------------- /apps/fair/templates/programming/nav.jade: -------------------------------------------------------------------------------- 1 | each day in days 2 | a( href="#{day.href}", data-day=day.date ).fair-programming-nav-item 3 | span.fair-programming-nav-day-abbr= day.dayAbbr 4 | span.fair-programming-nav-day-num= day.dayNum 5 | -------------------------------------------------------------------------------- /apps/favorites_following/client/index.coffee: -------------------------------------------------------------------------------- 1 | bootstrap = require '../../../components/layout/bootstrap.coffee' 2 | FollowingView = require './following.coffee' 3 | 4 | module.exports = -> 5 | bootstrap() 6 | new FollowingView el: $('body') 7 | -------------------------------------------------------------------------------- /apps/notifications/client/index.coffee: -------------------------------------------------------------------------------- 1 | bootstrap = require '../../../components/layout/bootstrap.coffee' 2 | NotificationsView = require './view.coffee' 3 | 4 | module.exports = -> 5 | bootstrap() 6 | new NotificationsView el: $('body') 7 | -------------------------------------------------------------------------------- /collections/show_events.coffee: -------------------------------------------------------------------------------- 1 | _ = require 'underscore' 2 | Backbone = require 'backbone' 3 | ShowEvent = require '../models/show_event.coffee' 4 | 5 | module.exports = class ShowEvents extends Backbone.Collection 6 | 7 | model: ShowEvent 8 | -------------------------------------------------------------------------------- /models/mixins/compact_object.coffee: -------------------------------------------------------------------------------- 1 | _ = require 'underscore' 2 | 3 | module.exports = 4 | compactObject: (o) -> 5 | clone = _.clone(o) 6 | _.each clone, (v, k) -> 7 | if (!v) 8 | delete clone[k] 9 | clone 10 | -------------------------------------------------------------------------------- /apps/browse/index.styl: -------------------------------------------------------------------------------- 1 | @import '../../components/stylus_lib' 2 | 3 | #browse-page-content 4 | margin-top 50px 5 | 6 | .browse-artworks-filters 7 | width 90% 8 | clearfix() 9 | 10 | .browse-artworks-header 11 | margin-bottom 50px 12 | -------------------------------------------------------------------------------- /components/featured_items/contents.jade: -------------------------------------------------------------------------------- 1 | if item.imageUrl 2 | img( src=item.imageUrl ) 3 | if item.title || item.subtitle 4 | .featured-items-details 5 | if item.title 6 | h2!= item.title 7 | if item.subtitle 8 | h3!= item.subtitle 9 | -------------------------------------------------------------------------------- /components/util/json.coffee: -------------------------------------------------------------------------------- 1 | module.exports = 2 | # remove newlines and other characters that cannot be embedded in an html script tag 3 | stringifyJSONForWeb: (json) -> 4 | JSON.stringify(json).replace(//g, '--\\>') 5 | -------------------------------------------------------------------------------- /collections/genes.coffee: -------------------------------------------------------------------------------- 1 | _ = require 'underscore' 2 | sd = require('sharify').data 3 | Backbone = require 'backbone' 4 | 5 | module.exports = class Genes extends Backbone.Collection 6 | 7 | initialize: -> 8 | @model = require '../models/gene.coffee' 9 | -------------------------------------------------------------------------------- /components/article/templates/sections/slideshow/carousel.jade: -------------------------------------------------------------------------------- 1 | .carousel.carousel--bottom-nav 2 | .carousel-figures-clip.carousel-figures-clip--article 3 | #carousel-track.carousel-track 4 | for figure in figures.models 5 | include slide 6 | -------------------------------------------------------------------------------- /components/video/template.jade: -------------------------------------------------------------------------------- 1 | for video in items 2 | if video.get('lr_video_url') 3 | video( 4 | controls='controls', 5 | preload='auto', 6 | poster=video.posterUrl() 7 | ) 8 | source( src=video.get('lr_video_url') + '.mp4' ) -------------------------------------------------------------------------------- /apps/gallery_partnerships/templates/index.jade: -------------------------------------------------------------------------------- 1 | extends ../../../components/layout/templates/main 2 | 3 | block head 4 | title Gallery Partnerships | Artsy 5 | 6 | block content 7 | #gallery-partnerships.gallery-partnerships-container 8 | include sections 9 | -------------------------------------------------------------------------------- /apps/how_auctions_work/index.coffee: -------------------------------------------------------------------------------- 1 | express = require 'express' 2 | routes = require './routes' 3 | 4 | app = module.exports = express() 5 | app.set 'views', __dirname + '/templates' 6 | app.set 'view engine', 'jade' 7 | 8 | app.get '/how-auctions-work', routes.index -------------------------------------------------------------------------------- /apps/show/templates/full_schedule.jade: -------------------------------------------------------------------------------- 1 | #show-page-hours 2 | .show-page-hours-today 3 | p= location && location.related().daySchedules.hoursToday() + " today" 4 | .show-page-hours-full 5 | a.chevron-arrow-button(href="#{show.href()}/hours") FULL HOURS 6 | -------------------------------------------------------------------------------- /apps/unsubscribe/routes.coffee: -------------------------------------------------------------------------------- 1 | emailTypes = require './email_types' 2 | 3 | module.exports.index = (req, res, next) -> 4 | authToken = req.query.authentication_token 5 | res.locals.sd.UNSUB_TOKEN = authToken 6 | res.render 'index', emailTypes: emailTypes 7 | -------------------------------------------------------------------------------- /test/collections/partners.coffee: -------------------------------------------------------------------------------- 1 | Backbone = require 'backbone' 2 | { fabricate } = require 'antigravity' 3 | Partners = require '../../collections/partners' 4 | 5 | describe 'Articles', -> 6 | 7 | beforeEach -> 8 | @partners = new Partners [fabricate 'post'] -------------------------------------------------------------------------------- /apps/auction/templates/metadata/associated.jade: -------------------------------------------------------------------------------- 1 | - var associatedSale = auction.related().sale 2 | 3 | if associatedSale.id 4 | .auction-info-section 5 | h3 Related Sale 6 | p 7 | a( href= associatedSale.href() ) 8 | = associatedSale.get('name') 9 | -------------------------------------------------------------------------------- /collections/sales.coffee: -------------------------------------------------------------------------------- 1 | Backbone = require 'backbone' 2 | { API_URL } = require('sharify').data 3 | Sale = require '../models/sale.coffee' 4 | 5 | module.exports = class Sales extends Backbone.Collection 6 | model: Sale 7 | 8 | url: "#{API_URL}/api/v1/sales" 9 | -------------------------------------------------------------------------------- /components/article/templates/sections/slideshow/slide.jade: -------------------------------------------------------------------------------- 1 | figure.article-carousel-figure.carousel-figure 2 | img.article-carousel-figure-image( 3 | src= figure.get('url') 4 | ) 5 | if figure.get('caption') 6 | figcaption 7 | = figure.get('caption') 8 | -------------------------------------------------------------------------------- /lib/get_script.coffee: -------------------------------------------------------------------------------- 1 | module.exports = (src, callback) -> 2 | script = document.createElement 'script' 3 | script.async = 'async' 4 | script.src = src 5 | script.onload = callback if callback 6 | document.getElementsByTagName('head')[0].appendChild script 7 | -------------------------------------------------------------------------------- /components/layout/stylesheets/utilities.styl: -------------------------------------------------------------------------------- 1 | @import '../../stylus_lib' 2 | 3 | .vcenter-outer 4 | .vcenter-inner 5 | width 100% 6 | height 100% 7 | .vcenter-outer 8 | display table 9 | .vcenter-inner 10 | display table-cell 11 | vertical-align middle 12 | -------------------------------------------------------------------------------- /models/edition_set.coffee: -------------------------------------------------------------------------------- 1 | _ = require 'underscore' 2 | Backbone = require 'backbone' 3 | sd = require('sharify').data 4 | { Dimensions } = require 'artsy-backbone-mixins' 5 | 6 | module.exports = class EditionSet extends Backbone.Model 7 | 8 | _.extend @prototype, Dimensions -------------------------------------------------------------------------------- /models/item.coffee: -------------------------------------------------------------------------------- 1 | _ = require 'underscore' 2 | sd = require('sharify').data 3 | Backbone = require 'backbone' 4 | { Image } = require 'artsy-backbone-mixins' 5 | 6 | module.exports = class Item extends Backbone.Model 7 | _.extend @prototype, Image(sd.SECURE_IMAGES_URL) 8 | -------------------------------------------------------------------------------- /apps/art_fairs/templates/past-fairs.jade: -------------------------------------------------------------------------------- 1 | for fair in pastFairs 2 | //- include fair 3 | include fair-details 4 | if remainingPastFairs.length > 0 5 | button#paginate-past-fairs.avant-garde-box-button.avant-garde-box-button-white( href='#', data-state='ok' ) 6 | | Load More -------------------------------------------------------------------------------- /apps/artist/templates/header.jade: -------------------------------------------------------------------------------- 1 | header#artist-page-header 2 | h1.artist-page-large-header.avant-garde-header-center= artist.get('name') 3 | h2 4 | = artist.get('hometown') 5 | if artist.get('years') && artist.get('hometown') 6 | | , 7 | = artist.get('years') 8 | -------------------------------------------------------------------------------- /apps/artwork/components/related_artworks/queries/related_query.coffee: -------------------------------------------------------------------------------- 1 | module.exports = """ 2 | fragment related_artworks on Artwork { 3 | layer(id: "main") { 4 | name 5 | artworks { 6 | #{require('./index.coffee')} 7 | } 8 | } 9 | } 10 | """ -------------------------------------------------------------------------------- /apps/partners/index.coffee: -------------------------------------------------------------------------------- 1 | # 2 | # /partners 3 | # 4 | 5 | express = require 'express' 6 | routes = require './routes' 7 | 8 | app = module.exports = express() 9 | app.set 'views', __dirname 10 | app.set 'view engine', 'jade' 11 | 12 | app.get '/partners', routes.index 13 | -------------------------------------------------------------------------------- /apps/artwork/components/tabs/index.coffee: -------------------------------------------------------------------------------- 1 | module.exports = -> 2 | $('.js-artwork-tab-link').click (e) -> 3 | id = $(e.currentTarget).attr 'data-id' 4 | $(e.currentTarget).toggleClass('is-active') 5 | $('.js-artwork-item').filter("[data-id=#{id}]").toggleClass('is-active') 6 | -------------------------------------------------------------------------------- /apps/auth/templates/signup_append.jade: -------------------------------------------------------------------------------- 1 | .auth-page-center 2 | br 3 | span By creating your Artsy account you agree to 4 | br 5 | | our 6 | a( href='/terms', target='_blank' ) Terms of Use 7 | span= " and " 8 | a( href='/privacy', target='_blank' ) Privacy Policy 9 | span= "." -------------------------------------------------------------------------------- /apps/contact/client/index.coffee: -------------------------------------------------------------------------------- 1 | _ = require 'underscore' 2 | bootstrap = require '../../../components/layout/bootstrap.coffee' 3 | ContactView = require './view.coffee' 4 | 5 | 6 | module.exports.init = -> 7 | bootstrap() 8 | 9 | new ContactView 10 | el: $('.contact-page') -------------------------------------------------------------------------------- /apps/favorites_following/templates/profiles.jade: -------------------------------------------------------------------------------- 1 | each profile in profiles 2 | - var partner = profile.get('owner') 3 | a.profile-item( href=profile.href() ) 4 | .profile-item-image( style="background-image: url(#{profile.iconUrl()})" ) 5 | .profile-item-label= partner.name 6 | -------------------------------------------------------------------------------- /apps/order/index.coffee: -------------------------------------------------------------------------------- 1 | # 2 | # The order page 3 | # 4 | 5 | express = require 'express' 6 | routes = require './routes' 7 | 8 | app = module.exports = express() 9 | app.set 'views', __dirname 10 | app.set 'view engine', 'jade' 11 | app.get '/order/:id/resume', routes.resume 12 | -------------------------------------------------------------------------------- /apps/search/index.coffee: -------------------------------------------------------------------------------- 1 | # 2 | # The search results page 3 | # 4 | 5 | express = require 'express' 6 | routes = require './routes' 7 | 8 | app = module.exports = express() 9 | app.set 'views', __dirname 10 | app.set 'view engine', 'jade' 11 | app.get '/search', routes.index 12 | -------------------------------------------------------------------------------- /apps/tag/index.coffee: -------------------------------------------------------------------------------- 1 | # 2 | # The tag detail page 3 | # 4 | 5 | express = require 'express' 6 | routes = require './routes' 7 | 8 | app = module.exports = express() 9 | app.set 'views', __dirname + '/templates' 10 | app.set 'view engine', 'jade' 11 | app.get '/tag/:id', routes.index -------------------------------------------------------------------------------- /collections/fair_entries.coffee: -------------------------------------------------------------------------------- 1 | sd = require('sharify').data 2 | Backbone = require 'backbone' 3 | FairEntry = require '../models/fair_entry.coffee' 4 | 5 | module.exports = class FairEntries extends Backbone.Collection 6 | model: FairEntry 7 | 8 | url: -> "#{sd.EUROPA_URL}/api/entries" -------------------------------------------------------------------------------- /apps/contact/index.coffee: -------------------------------------------------------------------------------- 1 | # 2 | # Contact Page 3 | # 4 | express = require 'express' 5 | routes = require './routes' 6 | 7 | app = module.exports = express() 8 | app.set 'views', __dirname + '/templates' 9 | app.set 'view engine', 'jade' 10 | 11 | app.get '/contact', routes.index 12 | -------------------------------------------------------------------------------- /apps/contact/routes.coffee: -------------------------------------------------------------------------------- 1 | request = require 'superagent' 2 | { ARTSY_URL } = require('sharify').data 3 | 4 | @index = (req, res) -> 5 | url = "#{ARTSY_URL}/contact/data" 6 | request 7 | .get(url) 8 | .end (err, data) -> 9 | res.render 'template', data: data.body 10 | -------------------------------------------------------------------------------- /apps/dev/index.coffee: -------------------------------------------------------------------------------- 1 | # 2 | # The home page 3 | # 4 | 5 | express = require 'express' 6 | routes = require './routes' 7 | 8 | app = module.exports = express() 9 | app.set 'views', __dirname + '/templates' 10 | app.set 'view engine', 'jade' 11 | app.get '/dev/blank', routes.blank 12 | -------------------------------------------------------------------------------- /collections/videos.coffee: -------------------------------------------------------------------------------- 1 | Backbone = require 'backbone' 2 | sd = require('sharify').data 3 | 4 | module.exports = class Videos extends Backbone.Collection 5 | 6 | url: -> "#{sd.API_URL}/api/v1/videos" 7 | 8 | initialize: -> 9 | @model = require '../models/video.coffee' 10 | -------------------------------------------------------------------------------- /components/resizer/config.coffee: -------------------------------------------------------------------------------- 1 | { DISABLE_IMAGE_PROXY, IMAGE_PROXY } = require('sharify').data 2 | 3 | module.exports = 4 | enabled: DISABLE_IMAGE_PROXY isnt 'true' 5 | proxy: IMAGE_PROXY or 'EMBEDLY' # Fallback for specs (sigh) 6 | defaults: 7 | quality: 95 8 | color: 'fff' 9 | -------------------------------------------------------------------------------- /apps/artists/index.coffee: -------------------------------------------------------------------------------- 1 | # 2 | # The artist page 3 | # 4 | 5 | express = require 'express' 6 | routes = require './routes' 7 | 8 | app = module.exports = express() 9 | app.set 'views', __dirname + '/templates' 10 | app.set 'view engine', 'jade' 11 | app.get '/artists', routes.index 12 | -------------------------------------------------------------------------------- /apps/artwork/components/image/templates/image_module.jade: -------------------------------------------------------------------------------- 1 | - var artists = artwork.artists; 2 | 3 | if artwork.images.length > 1 4 | include ./image_carousel.jade 5 | else 6 | .artwork-image-module__outer 7 | .artwork-image-module__inner 8 | img.artwork-image( src=artwork.image.url ) 9 | -------------------------------------------------------------------------------- /apps/gallery_partnerships/client/index.coffee: -------------------------------------------------------------------------------- 1 | Backbone = require 'backbone' 2 | Router = require './router.coffee' 3 | bootstrap = require '../../../components/layout/bootstrap.coffee' 4 | 5 | module.exports.init = -> 6 | bootstrap() 7 | new Router 8 | Backbone.history.start pushState: true 9 | -------------------------------------------------------------------------------- /apps/notifications/index.coffee: -------------------------------------------------------------------------------- 1 | # 2 | # /user 3 | # 4 | express = require 'express' 5 | routes = require './routes' 6 | 7 | app = module.exports = express() 8 | app.set 'views', __dirname + '/templates' 9 | app.set 'view engine', 'jade' 10 | 11 | app.get '/works-for-you', routes.worksForYou 12 | -------------------------------------------------------------------------------- /apps/unsubscribe/index.coffee: -------------------------------------------------------------------------------- 1 | # 2 | # The home page 3 | # 4 | 5 | express = require 'express' 6 | routes = require './routes' 7 | 8 | app = module.exports = express() 9 | app.set 'views', __dirname + '/templates' 10 | app.set 'view engine', 'jade' 11 | app.get '/unsubscribe*', routes.index 12 | -------------------------------------------------------------------------------- /models/cover_image.coffee: -------------------------------------------------------------------------------- 1 | _ = require 'underscore' 2 | Backbone = require 'backbone' 3 | { Image } = require 'artsy-backbone-mixins' 4 | { SECURE_IMAGES_URL } = require('sharify').data 5 | 6 | module.exports = class CoverImage extends Backbone.Model 7 | _.extend @prototype, Image(SECURE_IMAGES_URL) 8 | -------------------------------------------------------------------------------- /apps/personalize/templates/collect.jade: -------------------------------------------------------------------------------- 1 | header.personalize-header 2 | h2.avant-garde-subheader 60 second sign up: 3 | h1.avant-garde-header-center Do you buy art? 4 | 5 | nav.chevron-nav-list 6 | for level, i in state.levels 7 | a( data-value=(state.levels.length - i), href='#' ) 8 | = level 9 | -------------------------------------------------------------------------------- /components/alert/index.styl: -------------------------------------------------------------------------------- 1 | @import '../components/stylus_lib' 2 | 3 | light-yellow-background-color = #feffd6 4 | 5 | .alert 6 | padding 15px 7 | text-align center 8 | background-color light-yellow-background-color 9 | color #000 10 | border-bottom 1px solid light-gray-border-color 11 | -------------------------------------------------------------------------------- /components/article/templates/byline.jade: -------------------------------------------------------------------------------- 1 | .article-byline 2 | .article-author 3 | = article.related().author.get('name') 4 | .article-contributing 5 | include ../../article_figure/contributing_authors 6 | .article-timestamp 7 | = article.date('published_at').format('MMMM D, YYYY H:mm A') 8 | -------------------------------------------------------------------------------- /apps/artwork/index.coffee: -------------------------------------------------------------------------------- 1 | express = require 'express' 2 | routes = require './routes' 3 | 4 | app = module.exports = express() 5 | app.set 'views', __dirname + '/templates' 6 | app.set 'view engine', 'jade' 7 | 8 | app.get '/artwork/:id', routes.index 9 | app.get '/artwork/:id/ask_specialist', routes.askSpecialist -------------------------------------------------------------------------------- /apps/auctions/index.coffee: -------------------------------------------------------------------------------- 1 | # 2 | # The auctions listing page 3 | # 4 | 5 | express = require 'express' 6 | routes = require './routes' 7 | 8 | app = module.exports = express() 9 | app.set 'views', __dirname + '/templates' 10 | app.set 'view engine', 'jade' 11 | app.get '/auctions', routes.index 12 | 13 | -------------------------------------------------------------------------------- /components/bid_numbers/template.jade: -------------------------------------------------------------------------------- 1 | .bid-numbers 2 | .bid-numbers-left 3 | .bid-numbers-bid-label 4 | = saleArtwork.bidLabel() 5 | | : 6 | .bid-numbers-count-reserve 7 | = saleArtwork.formatBidsAndReserve() 8 | 9 | .bid-numbers-right 10 | = saleArtwork.currentBid() 11 | -------------------------------------------------------------------------------- /apps/auction/templates/metadata/event.jade: -------------------------------------------------------------------------------- 1 | if auction.get('event_start_at') && auction.get('event_end_at') && auction.get('event_location') 2 | .auction-info-section 3 | h3 Event 4 | p 5 | = auction.formatDateRange('event_start_at', 'event_end_at') 6 | br 7 | = auction.get('event_location') 8 | -------------------------------------------------------------------------------- /apps/gene/templates/artist_list.jade: -------------------------------------------------------------------------------- 1 | nav.chevron-nav-list.gene-page-artist-chevron-nav-list 2 | each artist in artists 3 | a.nav-image-item( href="/artist/#{artist.get('id')}") 4 | img.gene-page-artist-nav-image( src="#{artist.defaultImageUrl()}") 5 | p.gene-page-artist-nav-item-label= artist.get('name') -------------------------------------------------------------------------------- /apps/personalize/templates/index.jade: -------------------------------------------------------------------------------- 1 | extends ../../../components/layout/templates/bare 2 | 3 | //- #todo - better way to do this? 4 | block head 5 | script( src='https://maps.googleapis.com/maps/api/js?libraries=places&sensor=true' ) 6 | 7 | block content 8 | #personalize-page 9 | .loading-spinner 10 | -------------------------------------------------------------------------------- /apps/user/index.coffee: -------------------------------------------------------------------------------- 1 | # 2 | # /user 3 | # 4 | express = require 'express' 5 | routes = require './routes' 6 | 7 | app = module.exports = express() 8 | app.set 'views', __dirname 9 | app.set 'view engine', 'jade' 10 | 11 | app.get '/user/edit', routes.settings 12 | app.get '/user/refresh', routes.refresh 13 | -------------------------------------------------------------------------------- /analytics/auth.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | analyticsHooks.on('auth:login', function(options) { 5 | analytics.track('Successfully logged in'); 6 | }); 7 | 8 | analyticsHooks.on('auth:signup', function(options) { 9 | analytics.track('Created account'); 10 | }); 11 | 12 | })(); 13 | -------------------------------------------------------------------------------- /apps/auctions/client/auctions.coffee: -------------------------------------------------------------------------------- 1 | _ = require 'underscore' 2 | bootstrap = require '../../../components/layout/bootstrap.coffee' 3 | AvantGardeTabsView = require '../../../components/avant_garde_tabs/view.coffee' 4 | 5 | module.exports.init = -> 6 | bootstrap() 7 | new AvantGardeTabsView 8 | el: $ '#auction-page' -------------------------------------------------------------------------------- /apps/personalize/templates/price_range.jade: -------------------------------------------------------------------------------- 1 | header.personalize-header 2 | h1.avant-garde-header-center 3 | | Price range? 4 | .personalize-subheader 5 | | (You can always see all works on Artsy) 6 | 7 | nav.chevron-nav-list 8 | for price in prices 9 | a( data-value=price.value )= price.display 10 | -------------------------------------------------------------------------------- /apps/shows/templates/all_cities.jade: -------------------------------------------------------------------------------- 1 | extends ../../../components/layout/templates/main 2 | 3 | block content 4 | #all-cities-page 5 | #all-cities-page-content.main-side-margin 6 | nav.chevron-nav-list.all-cities-page-all-cities 7 | for city in cities 8 | a(href="/shows/#{city.slug}")= city.name -------------------------------------------------------------------------------- /collections/hero_units.coffee: -------------------------------------------------------------------------------- 1 | Backbone = require 'backbone' 2 | sd = require('sharify').data 3 | 4 | module.exports = class HeroUnits extends Backbone.Collection 5 | 6 | url: -> "#{sd.API_URL}/api/v1/site_hero_units?enabled=true" 7 | 8 | initialize: -> 9 | @model = require '../models/hero_unit.coffee' 10 | -------------------------------------------------------------------------------- /models/page.coffee: -------------------------------------------------------------------------------- 1 | Backbone = require 'backbone' 2 | sd = require('sharify').data 3 | { Markdown } = require 'artsy-backbone-mixins' 4 | _ = require 'underscore' 5 | 6 | module.exports = class Page extends Backbone.Model 7 | 8 | _.extend @prototype, Markdown 9 | 10 | urlRoot: "#{sd.API_URL}/api/v1/page" 11 | -------------------------------------------------------------------------------- /apps/auth/templates/forgot_password_confirmation.jade: -------------------------------------------------------------------------------- 1 | extends ../../../components/layout/templates/main 2 | 3 | block content 4 | #forgot-password 5 | .artsy-logo-large 6 | h1.avant-garde-header-center Password Reset Instructions Sent 7 | p Please check your email for instructions on how to reset your password. 8 | -------------------------------------------------------------------------------- /apps/auth/templates/signup_email.jade: -------------------------------------------------------------------------------- 1 | extends ../../../components/layout/templates/scaffold 2 | 3 | block body 4 | #auth-page 5 | h1.avant-garde-header-center Create Your Account 6 | .auth-page-error-message 7 | if error 8 | = error 9 | include signup_form 10 | include signup_append 11 | -------------------------------------------------------------------------------- /components/featured_items/template.jade: -------------------------------------------------------------------------------- 1 | ul.featured-items 2 | for model in items 3 | - item = model.toFeaturedItem(items.length) 4 | li( class= model.layoutStyle(items.length) ) 5 | if item.href 6 | a( href=item.href ) 7 | include contents 8 | else 9 | include contents 10 | -------------------------------------------------------------------------------- /components/filter2/stylesheets/index.styl: -------------------------------------------------------------------------------- 1 | .artwork-filter-empty-message 2 | display none 3 | 4 | .artwork-filter-content 5 | min-height 300px 6 | 7 | .artwork-filter-dropdowns, .artwork-filter-counts 8 | padding-bottom 20px 9 | 10 | .artwork-filter-counts 11 | color light-gray-text-color 12 | font-style italic -------------------------------------------------------------------------------- /apps/artwork/components/tabs/query.coffee: -------------------------------------------------------------------------------- 1 | module.exports = """ 2 | series 3 | publisher 4 | manufacturer 5 | signature 6 | provenance(format: HTML) 7 | description(format: HTML) 8 | additional_information(format: HTML) 9 | exhibition_history(format: HTML) 10 | bibliography: literature(format: HTML) 11 | """ -------------------------------------------------------------------------------- /apps/gallery_partnerships/templates/section6.jade: -------------------------------------------------------------------------------- 1 | - section = sections[6] 2 | 3 | .gallery-partnerships-section-header.apply 4 | h3= section.heading 5 | a.avant-garde-box-button.avant-garde-box-button-black.apply-button( href="https://www.artsy.net/apply/" ) Apply 6 | .gallery-partnerships-contact Call us: +1 800 589 1350 7 | -------------------------------------------------------------------------------- /apps/how_auctions_work/routes.coffee: -------------------------------------------------------------------------------- 1 | request = require 'superagent' 2 | sd = require('sharify').data 3 | 4 | @index = (req, res) -> 5 | url = "#{sd.ARTSY_URL}/how-auctions-work/data" 6 | request 7 | .get(url) 8 | .end (err, data) -> 9 | res.locals.sd.HOW_AUCTIONS_WORK = data.body 10 | res.render 'index' -------------------------------------------------------------------------------- /components/article/templates/what_to_read_next.jade: -------------------------------------------------------------------------------- 1 | .wtrn-header What To Read Next 2 | for article in related 3 | a.wtrn-article-container(href=article.fullHref()) 4 | .wtrn-image 5 | img(src=crop(article.get('thumbnail_image'),{ width: 70, height: 70, quality: 90 })) 6 | .wtrn-title= article.get('thumbnail_title') 7 | -------------------------------------------------------------------------------- /models/hero_unit.coffee: -------------------------------------------------------------------------------- 1 | _ = require 'underscore' 2 | Backbone = require 'backbone' 3 | { Markdown } = require 'artsy-backbone-mixins' 4 | 5 | module.exports = class HeroUnit extends Backbone.Model 6 | 7 | _.extend @prototype, Markdown 8 | 9 | cssClass: -> 10 | 'home-page-hero-unit-' + @get('mobile_menu_color_class') -------------------------------------------------------------------------------- /apps/fair/stylesheets/artist.styl: -------------------------------------------------------------------------------- 1 | .fair-artist-info 2 | color light-gray-text-color 3 | margin-bottom 24px 4 | 5 | #fair-artist 6 | .avant-garde-box-button 7 | margin-bottom 24px 8 | 9 | .fair-artist-on-artsy-link 10 | margin-bottom 50px 11 | 12 | .fair-exhibitors-show:last-child 13 | border-bottom none 14 | -------------------------------------------------------------------------------- /apps/feature/templates/confirm_page.jade: -------------------------------------------------------------------------------- 1 | extends ../../../components/layout/templates/scaffold 2 | 3 | block body 4 | #feature-bid-page-confirm.main-side-margin.mobile-app-top-padding 5 | h1.avant-garde-header-center= h1Copy 6 | a.avant-garde-box-button.avant-garde-box-button-black( 7 | href=href 8 | )= buttonCopy 9 | -------------------------------------------------------------------------------- /apps/gene/index.coffee: -------------------------------------------------------------------------------- 1 | # 2 | # The gene detail page 3 | # 4 | 5 | express = require 'express' 6 | routes = require './routes' 7 | 8 | app = module.exports = express() 9 | app.set 'views', __dirname + '/templates' 10 | app.set 'view engine', 'jade' 11 | app.get '/gene/:id', routes.index 12 | app.get '/gene/:id/artists', routes.index -------------------------------------------------------------------------------- /apps/shortcuts/routes.coffee: -------------------------------------------------------------------------------- 1 | Shortcut = require '../../models/shortcut' 2 | 3 | @index = (req, res, next) -> 4 | next() unless req.params.short 5 | new Shortcut(id: req.params.short.toLowerCase()).fetch 6 | cache: true 7 | success: (shortcut) -> 8 | res.redirect shortcut.get('long') 9 | error: -> next() 10 | -------------------------------------------------------------------------------- /components/layout/templates/login-signup.jade: -------------------------------------------------------------------------------- 1 | mixin login-signup 2 | .login-signup 3 | .login-signup-button-container 4 | a.avant-garde-box-button.avant-garde-box-button-gray( href='/sign_up' ) Sign up 5 | .login-signup-button-container 6 | a.avant-garde-box-button.avant-garde-box-button-gray( href='/log_in' ) Log in -------------------------------------------------------------------------------- /models/featured_set.coffee: -------------------------------------------------------------------------------- 1 | _ = require 'underscore' 2 | Backbone = require 'backbone' 3 | { Markdown } = require 'artsy-backbone-mixins' 4 | 5 | module.exports = class FeaturedSet extends Backbone.Model 6 | 7 | _.extend @prototype, Markdown 8 | 9 | models: -> 10 | if @get('data')? then @get('data').models else [] 11 | -------------------------------------------------------------------------------- /apps/art_fairs/index.coffee: -------------------------------------------------------------------------------- 1 | # 2 | # The art-fairs listing page 3 | # 4 | 5 | express = require 'express' 6 | routes = require './routes' 7 | 8 | app = module.exports = express() 9 | app.set 'views', __dirname + '/templates' 10 | app.set 'view engine', 'jade' 11 | app.get '/art-fairs', routes.index 12 | app.get '/fairs', routes.index -------------------------------------------------------------------------------- /apps/auction_support/templates/registration-error.jade: -------------------------------------------------------------------------------- 1 | extends ../../../components/layout/templates/main 2 | 3 | block content 4 | #auction-registration-page 5 | .bid-registration-form.credit-card-form 6 | .bid-registration-form-header 7 | h2.avant-garde-header-center Registration for this auction is not currently open. 8 | -------------------------------------------------------------------------------- /apps/artwork/templates/ask_specialist_page.jade: -------------------------------------------------------------------------------- 1 | extends ../../../components/layout/templates/scaffold 2 | 3 | block body 4 | #ask-specialist-page.inquiry-page.main-side-margin 5 | header.ask-specialist-header 6 | h1.avant-garde-header Ask a Specialist 7 | #ask-specialist-form 8 | include ../components/bid/templates/inquiry_form -------------------------------------------------------------------------------- /apps/auction_support/index.coffee: -------------------------------------------------------------------------------- 1 | # 2 | # Auction related routes 3 | # 4 | 5 | express = require 'express' 6 | routes = require './routes' 7 | 8 | app = module.exports = express() 9 | app.set 'views', __dirname + '/templates' 10 | app.set 'view engine', 'jade' 11 | 12 | app.get '/auction-registration/:id', routes.auctionRegistration 13 | -------------------------------------------------------------------------------- /apps/fair/stylesheets/info.styl: -------------------------------------------------------------------------------- 1 | @import '../../../components/stylus_lib' 2 | 3 | .fair-page-info-map 4 | width 100% 5 | 6 | .formatted-markdown 7 | h2 8 | font-size 24px 9 | margin-bottom 12px 10 | padding-top 24px 11 | line-height: 150% 12 | p 13 | margin-bottom 24px 14 | em, i 15 | font-style italic 16 | -------------------------------------------------------------------------------- /apps/artwork/components/related_artworks/queries/fair_query.coffee: -------------------------------------------------------------------------------- 1 | module.exports = """ 2 | fragment fair_artworks on Artwork { 3 | shows(at_a_fair: true) { 4 | name 5 | href 6 | type 7 | artworks(all: true, size: 50, exclude: [$id]) { 8 | #{require('./index.coffee')} 9 | } 10 | } 11 | } 12 | """ -------------------------------------------------------------------------------- /apps/favorites_following/templates/placeholder.jade: -------------------------------------------------------------------------------- 1 | extends ../../../components/layout/templates/main 2 | 3 | append locals 4 | - assetPackage = 'favorites_following' 5 | 6 | block content 7 | #favorites-following-page.main-side-margin 8 | .page-heading 9 | h1.placeholder Login on a desktop to manage your favorites and follows 10 | -------------------------------------------------------------------------------- /apps/show/index.coffee: -------------------------------------------------------------------------------- 1 | # 2 | # The show perma-link page 3 | # 4 | 5 | express = require 'express' 6 | routes = require './routes' 7 | 8 | app = module.exports = express() 9 | app.set 'views', __dirname + '/templates' 10 | app.set 'view engine', 'jade' 11 | app.get '/show/:id/hours', routes.hours 12 | app.get '/show/:id', routes.index 13 | 14 | -------------------------------------------------------------------------------- /apps/unsubscribe/email_types.coffee: -------------------------------------------------------------------------------- 1 | # These need to be updated when a new mailing is added or one is removed from Gravity. 2 | module.exports = 3 | 'weekly_email': 'Weekly Newsletters' 4 | 'follow_users_email': 'User Follow Emails' 5 | 'offer_emails': 'Offer Emails' 6 | 'personalized_email': 'Personalized Artists and Artwork Recommendations' 7 | -------------------------------------------------------------------------------- /models/show_event.coffee: -------------------------------------------------------------------------------- 1 | _ = require 'underscore' 2 | Backbone = require 'backbone' 3 | Eventable = require './mixins/eventable.coffee' 4 | 5 | module.exports = class ShowEvent extends Backbone.Model 6 | _.extend @prototype, Eventable 7 | 8 | eventType: -> 9 | if @get('event_type') is 'Other' then 'Event' else @get('event_type') 10 | -------------------------------------------------------------------------------- /analytics/before_ready.js: -------------------------------------------------------------------------------- 1 | // 2 | // Analytics code that needs to run before page load and analytics.ready 3 | // 4 | 5 | // Disable Parsely firing on non-article/section pages 6 | if (!location.pathname.match(/^\/article/)) { 7 | PARSELY = { autotrack: false }; 8 | } 9 | 10 | // Track pageview 11 | analytics.page({path: location.pathname}); 12 | -------------------------------------------------------------------------------- /apps/unsubscribe/index.styl: -------------------------------------------------------------------------------- 1 | @import '../../components/stylus_lib' 2 | 3 | #unsubscribe-content 4 | margin 20px 5 | text-align center 6 | h1 7 | padding-bottom 20px 8 | input 9 | margin-left 50px 10 | .unsubscribe-check-all 11 | padding-top 50px 12 | button.submit 13 | margin-top 50px 14 | .unsubscribe-message 15 | padding-top 25px -------------------------------------------------------------------------------- /apps/artists/client.coffee: -------------------------------------------------------------------------------- 1 | _ = require 'underscore' 2 | Backbone = require 'backbone' 3 | bootstrap = require '../../components/layout/bootstrap.coffee' 4 | sd = require('sharify').data 5 | 6 | module.exports.ArtistsView = class ArtistsView extends Backbone.View 7 | 8 | module.exports.init = -> 9 | bootstrap() 10 | new ArtistsView 11 | el: $ 'body' -------------------------------------------------------------------------------- /apps/artwork/components/related_artworks/queries/show_query.coffee: -------------------------------------------------------------------------------- 1 | module.exports = """ 2 | fragment show_artworks on Artwork { 3 | shows(size: 1, active: true) { 4 | name 5 | href 6 | kind 7 | artworks(all: true, size: 50, exclude: [$id]) { 8 | #{require('./index.coffee')} 9 | } 10 | } 11 | } 12 | """ 13 | -------------------------------------------------------------------------------- /apps/fair_info/stylesheets/index.styl: -------------------------------------------------------------------------------- 1 | @import './events' 2 | @import './visitors' 3 | @import './article' 4 | 5 | .fair-info2-body 6 | padding-bottom 50% 7 | 8 | .fair-info2-page-header 9 | avant-garde() 10 | font-size 15px 11 | margin 20px auto 12 | text-align center 13 | 14 | .fair-info2-header 15 | avant-garde() 16 | font-size 15px 17 | -------------------------------------------------------------------------------- /apps/galleries_institutions/templates/partners.jade: -------------------------------------------------------------------------------- 1 | extends ../../../components/layout/templates/main 2 | 3 | block content 4 | .galleries-institutions-page 5 | h1.galleries-institutions-header.avant-garde-header-center 6 | = city.name 7 | 8 | .galleries-institutions-content.main-side-margin 9 | include ./partner_a_to_z.jade 10 | -------------------------------------------------------------------------------- /apps/show/templates/events.jade: -------------------------------------------------------------------------------- 1 | #show-page-events 2 | for showEvent in show.related().showEvents.models 3 | .show-page-event 4 | | #{showEvent.eventType()}: 5 | = ' ' 6 | if showEvent.get('title') 7 | em #{showEvent.get('title')}, 8 | = ' ' 9 | = showEvent.formatDateRange('start_at', 'end_at', 'MMM Do, h') 10 | -------------------------------------------------------------------------------- /components/article_figure/stylesheets/share.styl: -------------------------------------------------------------------------------- 1 | .article-share 2 | white-space nowrap 3 | 4 | .article-share-item 5 | display inline-block 6 | height 35px 7 | width @height 8 | line-height @height 9 | margin 0 5px 10 | text-align center 11 | border-radius 50% 12 | background-color black 13 | color white 14 | text-decoration none 15 | -------------------------------------------------------------------------------- /apps/artwork/components/bid/templates/inquiry_confirmation.jade: -------------------------------------------------------------------------------- 1 | .submit-inquiry-confirmation 2 | h1.avant-garde-header-center= header 3 | h2!= message 4 | a.avant-garde-box-button.avant-garde-box-button-black( href="/artwork/#{artwork.id}" ) 5 | | Back to Artwork 6 | a.avant-garde-box-button.avant-garde-box-button-black( href='/' ) 7 | | Back to Homepage -------------------------------------------------------------------------------- /apps/browse/templates/index.jade: -------------------------------------------------------------------------------- 1 | extends ../../../components/layout/templates/main 2 | include ../../../components/filter/dropdown_mixin.jade 3 | 4 | block head 5 | title Browse | Artsy 6 | 7 | block content 8 | #browse-page-content 9 | h1.browse-artworks-header.avant-garde-header-center Browse 10 | #browse-page-content--inner.artwork-filter-content -------------------------------------------------------------------------------- /apps/home/templates/featured_works.jade: -------------------------------------------------------------------------------- 1 | extends ../../../components/layout/templates/main 2 | 3 | block content 4 | br 5 | .main-side-margin 6 | h1.home-page-featured-header.avant-garde-header-center Featured Works 7 | include ../../../components/artwork_list/template 8 | a.avant-garde-header-center.home-featured-back-link( href='/' ) See Current Shows -------------------------------------------------------------------------------- /apps/artwork/components/bid/templates/bid_button.jade: -------------------------------------------------------------------------------- 1 | form.artwork-auction-bid-form.js-artwork-auction-bid-form( 2 | method="GET" 3 | action= "/auction/#{artwork.auction.id}/bid/#{artwork.id}" 4 | ) 5 | .artwork-auction-bid-module__bid-button 6 | button.auction-avant-garde-black-button( 7 | type= 'submit' 8 | disabled= false 9 | ) Bid -------------------------------------------------------------------------------- /apps/home/templates/featured_articles.jade: -------------------------------------------------------------------------------- 1 | extends ../../../components/layout/templates/main 2 | 3 | block content 4 | .main-side-margin 5 | h1.home-page-featured-header.avant-garde-header-center Featured Articles 6 | include ../../../components/featured_items/template 7 | a.avant-garde-header-center.home-featured-back-link( href='/' ) See Current Shows 8 | -------------------------------------------------------------------------------- /apps/tag/routes.coffee: -------------------------------------------------------------------------------- 1 | Tag = require '../../models/tag' 2 | 3 | module.exports.index = (req, res, next) -> 4 | tag = new Tag id: req.params.id 5 | tag.fetch 6 | cache: true 7 | success: -> 8 | res.locals.sd.TAG = tag.toJSON() 9 | res.locals.sd.PARAMS = req.query 10 | res.render 'index', tag: tag 11 | error: res.backboneError 12 | -------------------------------------------------------------------------------- /apps/show/templates/artworks.jade: -------------------------------------------------------------------------------- 1 | #show-page-artworks(data-height = 640 ,class = artworks.length > 8 ? 'with-slider' : 'without-slider' ) 2 | .show-page-artworks-title 3 | | #{artworks.length} Works 4 | +artworkColumnsTemplate(artworks.groupByColumnsInOrder()) 5 | .loading-spinner 6 | if artworks.length > 8 7 | include ../../../components/show_more_works/template 8 | -------------------------------------------------------------------------------- /components/filter2/template.jade: -------------------------------------------------------------------------------- 1 | .artwork-filter.main-side-margin 2 | .artwork-filter-dropdowns 3 | .artwork-filter-sentence 4 | .artwork-filter-counts 5 | .artwork-filter-list 6 | .artwork-filter__show-more.avant-garde-box-button.is-hidden.is-show-more-button Show More 7 | .artwork-filter-empty-message No artworks matched 8 | .artwork-filter-spinner.loading-spinner -------------------------------------------------------------------------------- /apps/auction/index.coffee: -------------------------------------------------------------------------------- 1 | express = require 'express' 2 | routes = require './routes' 3 | 4 | app = module.exports = express() 5 | app.set 'views', __dirname + '/templates' 6 | app.set 'view engine', 'jade' 7 | 8 | app.get '/auction/:id', routes.index 9 | app.get '/auction/:id/confirm-registration', routes.index 10 | app.post '/auction/:id/subscribe', routes.subscribe 11 | -------------------------------------------------------------------------------- /apps/favorites_following/index.coffee: -------------------------------------------------------------------------------- 1 | # 2 | # /favorites 3 | # /following 4 | # 5 | 6 | express = require 'express' 7 | routes = require './routes' 8 | 9 | app = module.exports = express() 10 | app.set 'views', __dirname + '/templates' 11 | app.set 'view engine', 'jade' 12 | 13 | app.get '/following/:type', routes.following 14 | app.get '/favorites', routes.favorites 15 | -------------------------------------------------------------------------------- /apps/show/components/follow_artists/template.jade: -------------------------------------------------------------------------------- 1 | .show-artists-title 2 | | Follow Artists In This Show 3 | #show-follow-artists 4 | for artist in artists 5 | .entity-with-follow 6 | a.entity-link( href= artist.href() ) 7 | = artist.get('name') 8 | a.artist-follow.follow-button.avant-garde-box-button.avant-garde-box-button-black( data-id= artist.id ) 9 | -------------------------------------------------------------------------------- /components/a_to_z_list/template.jade: -------------------------------------------------------------------------------- 1 | for row in aToZGroup 2 | .a-to-z-row 3 | .a-to-z-row-letter= row.letter 4 | for column in row.columns 5 | ul.a-to-z-column 6 | for item in column 7 | li.a-to-z-item 8 | if item.linkToPage 9 | a( href = item.href )= item.name 10 | else 11 | = item.name 12 | -------------------------------------------------------------------------------- /components/layout/templates/footer.jade: -------------------------------------------------------------------------------- 1 | include ./login-signup 2 | 3 | footer 4 | include ../../main_dropdown_menu/template 5 | mixin login-signup 6 | nav.footer__bottom-nav 7 | a.footer__bottom-nav__link(href="/about") About Artsy 8 | a.footer__bottom-nav__link(href="/terms") Terms of Use 9 | a.footer__bottom-nav__link(href="/privacy") Privacy Policy 10 | -------------------------------------------------------------------------------- /models/mixins/relations/fair.coffee: -------------------------------------------------------------------------------- 1 | module.exports = 2 | related: -> 3 | return @__related__ if @__related__? 4 | 5 | Profile = require '../../../models/profile.coffee' 6 | 7 | profile_id = @get('default_profile_id') || @get('organizer')?.profile_id 8 | 9 | profile = new Profile id: profile_id 10 | 11 | @__related__ = 12 | profile: profile 13 | -------------------------------------------------------------------------------- /apps/shows/index.coffee: -------------------------------------------------------------------------------- 1 | # 2 | # The shows listing page 3 | # 4 | 5 | express = require 'express' 6 | routes = require './routes' 7 | 8 | app = module.exports = express() 9 | app.set 'views', "#{__dirname}/templates" 10 | app.set 'view engine', 'jade' 11 | 12 | app.get '/shows', routes.index 13 | app.get '/shows/:city', routes.city 14 | app.get '/all-cities', routes.all_cities -------------------------------------------------------------------------------- /lib/analytics_hooks.coffee: -------------------------------------------------------------------------------- 1 | # 2 | # A simple meditor specifically for providing custom analytics hooks in app code, 3 | # leaving the tracking code inside /analytics. 4 | # 5 | 6 | _ = require 'underscore' 7 | Backbone = require 'backbone' 8 | 9 | analyticsHooks = _.extend {}, Backbone.Events 10 | module.exports = (window?.analyticsHooks ?= analyticsHooks) or analyticsHooks 11 | -------------------------------------------------------------------------------- /apps/auth/templates/signup.jade: -------------------------------------------------------------------------------- 1 | extends ../../../components/layout/templates/scaffold 2 | 3 | block body 4 | #auth-page 5 | h1.avant-garde-header-center Sign up using 6 | if error 7 | .auth-page-error-message= error 8 | include signup_buttons 9 | include signup_append 10 | p.auth-page-nevermind Already have an account? 11 | a( href='/log_in' ) Log in -------------------------------------------------------------------------------- /apps/partner_profile/templates/shows_page.jade: -------------------------------------------------------------------------------- 1 | extends ../../../components/layout/templates/main 2 | 3 | block content 4 | .main-side-margin 5 | nav.slash-breadcrumbs 6 | a( href='/' + profile.get('id') )= profile.get('owner').name 7 | span Shows 8 | include shows 9 | a.partner-back-link( href='/' + profile.get('id') ) Go to #{profile.get('owner').name} 10 | -------------------------------------------------------------------------------- /components/layout/templates/ga.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /models/fair_location.coffee: -------------------------------------------------------------------------------- 1 | _ = require 'underscore' 2 | sd = require('sharify').data 3 | Backbone = require 'backbone' 4 | Relations = require './mixins/relations/location.coffee' 5 | 6 | module.exports = class FairLocation extends Backbone.Model 7 | 8 | _.extend @prototype, Relations 9 | 10 | singleLine: -> 11 | @get 'display' 12 | 13 | toJSONLD: -> @singleLine() 14 | -------------------------------------------------------------------------------- /apps/artwork/components/partner/query.coffee: -------------------------------------------------------------------------------- 1 | module.exports = """ 2 | partner { 3 | id 4 | name 5 | href 6 | type 7 | contact_message 8 | counts { 9 | artworks 10 | } 11 | locations { 12 | city 13 | country 14 | } 15 | has_fair_partnership 16 | profile { 17 | id 18 | _id 19 | bio 20 | } 21 | } 22 | """ -------------------------------------------------------------------------------- /apps/auction/stylesheets/subscribed.styl: -------------------------------------------------------------------------------- 1 | .auction-subscribed-thank-you 2 | margin 40px 20px 3 | text-align center 4 | h1, p, .auction-subscribed-skip 5 | font-size 24px 6 | line-height 1.3em 7 | h1 8 | color green-color 9 | margin 40px 0 20px 0 10 | .avant-garde-box-button 11 | margin 40px 0 12 | 13 | .auction-subscribed-logo.icon-logotype 14 | font-size 42px -------------------------------------------------------------------------------- /apps/feature/templates/auction_detail.jade: -------------------------------------------------------------------------------- 1 | #feature-page-auction-clock 2 | include ../../../components/auction_clock/template 3 | 4 | unless sale.isAuctionPromo() 5 | a#feature-page-auction-register-link.avant-garde-box-button.avant-garde-box-button-black 6 | | Register to Bid 7 | a#feature-page-auction-bidding-information-link( href='/auction-info' ) 8 | | How bidding works 9 | -------------------------------------------------------------------------------- /apps/profile/template.jade: -------------------------------------------------------------------------------- 1 | extends ../../components/layout/templates/main 2 | 3 | block content 4 | header#profile-page-header.main-side-margin 5 | img( src=profile.iconUrl() ) 6 | #profile-page-header-details 7 | h1.avant-garde-header= profile.get('owner').name 8 | p!= profile.mdToHtml('bio') 9 | ul#profile-page-articles.main-side-margin 10 | .loading-spinner 11 | -------------------------------------------------------------------------------- /apps/browse/client.coffee: -------------------------------------------------------------------------------- 1 | sd = require('sharify').data 2 | bootstrap = require '../../components/layout/bootstrap.coffee' 3 | { setupFilter } = require '../../components/filter2/index.coffee' 4 | aggregationParams = require './aggregations.coffee' 5 | 6 | module.exports.init = -> 7 | bootstrap() 8 | setupFilter 9 | el: $ '#browse-page-content--inner' 10 | aggregations: aggregationParams -------------------------------------------------------------------------------- /apps/feature/templates/filter.jade: -------------------------------------------------------------------------------- 1 | include ../../../components/filter/dropdown_mixin.jade 2 | 3 | .feature-artwork-filter 4 | +filter-dropdown('Sort By','sort', { 5 | 'Artist A-Z': 'artist-a-to-z', 6 | 'Most Bids': 'most-bids', 7 | 'Least Bids': 'least-bids', 8 | 'Highest Current Bid': 'highest-current-bid', 9 | 'Lowest Current Bid': 'lowest-current-bid' 10 | }, true) 11 | -------------------------------------------------------------------------------- /apps/home/index.coffee: -------------------------------------------------------------------------------- 1 | # 2 | # The home page 3 | # 4 | 5 | express = require 'express' 6 | routes = require './routes' 7 | 8 | app = module.exports = express() 9 | app.set 'views', __dirname + '/templates' 10 | app.set 'view engine', 'jade' 11 | app.get '/', routes.index 12 | app.get '/home/featured_works', routes.featuredArtworks 13 | app.get '/home/featured_articles', routes.featuredArticles 14 | -------------------------------------------------------------------------------- /components/app_banner/excluded.coffee: -------------------------------------------------------------------------------- 1 | _ = require 'underscore' 2 | 3 | module.exports = 4 | blacklist: [ 5 | '^/personalize' 6 | ] 7 | 8 | path: -> 9 | location.pathname 10 | 11 | current: -> 12 | @path().replace /\/$/, '' 13 | 14 | test: (pattern) -> 15 | new RegExp(pattern).test @current() 16 | 17 | check: -> 18 | _.any _.map(@blacklist, _.bind(@test, this)) 19 | -------------------------------------------------------------------------------- /models/fair_organizer.coffee: -------------------------------------------------------------------------------- 1 | sd = require('sharify').data 2 | _ = require 'underscore' 3 | Backbone = require 'backbone' 4 | { Image, Markdown } = require 'artsy-backbone-mixins' 5 | 6 | module.exports = class FairOrganizer extends Backbone.Model 7 | _.extend @prototype, Image(sd.SECURE_IMAGES_URL) 8 | _.extend @prototype, Markdown 9 | 10 | urlRoot: "#{sd.API_URL}/api/v1/fair_organizer" 11 | -------------------------------------------------------------------------------- /apps/browse/index.coffee: -------------------------------------------------------------------------------- 1 | express = require 'express' 2 | routes = require './routes' 3 | 4 | app = module.exports = express() 5 | app.set 'views', __dirname + '/templates' 6 | app.set 'view engine', 'jade' 7 | 8 | app.get '/collect', routes.index 9 | app.get '/browse', routes.to '/collect' 10 | app.get '/browse/artworks', routes.to '/collect' 11 | app.get '/filter/artworks', routes.to '/collect' 12 | -------------------------------------------------------------------------------- /apps/search/template.jade: -------------------------------------------------------------------------------- 1 | extends ../../components/layout/templates/main 2 | 3 | block content 4 | .search-page-result-header 5 | | Search results for 6 | i= "\"" + mainHeaderSearchBoxValue + "\"" 7 | #search-page-results 8 | if results.length > 0 9 | for result in results 10 | include ../../components/search_results/result 11 | else 12 | b Nothing found 13 | -------------------------------------------------------------------------------- /models/additional_image.coffee: -------------------------------------------------------------------------------- 1 | _ = require 'underscore' 2 | Backbone = require 'backbone' 3 | { Image } = require 'artsy-backbone-mixins' 4 | ImageSizes = require './mixins/image_sizes.coffee' 5 | { SECURE_IMAGES_URL } = require('sharify').data 6 | 7 | module.exports = class AdditionalImage extends Backbone.Model 8 | 9 | _.extend @prototype, Image(SECURE_IMAGES_URL) 10 | _.extend @prototype, ImageSizes -------------------------------------------------------------------------------- /analytics/fairs.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 'use strict'; 3 | 4 | $('.fair-event-add-to-cal, .fair-page-heading-add-to-ical').click(function(e){ 5 | analytics.track('Fair info: "Add to calendar" clicked', { fair_id: sd.FAIR.id }); 6 | }); 7 | 8 | $('.fair-info-event-map').click(function(e){ 9 | analytics.track('Fair info: Event map link clicked', { fair_id: sd.FAIR.id }); 10 | }); 11 | 12 | })(); 13 | -------------------------------------------------------------------------------- /apps/artwork/components/related_artworks/queries/partner_query.coffee: -------------------------------------------------------------------------------- 1 | module.exports = """ 2 | fragment partner_artworks on Artwork { 3 | partner { 4 | name 5 | href 6 | counts { 7 | artworks(format: "0,0", label: "work") 8 | } 9 | artworks(size: 20, sort:published_at_desc, for_sale: true){ 10 | #{require('./index.coffee')} 11 | } 12 | } 13 | } 14 | """ -------------------------------------------------------------------------------- /assets/show.coffee: -------------------------------------------------------------------------------- 1 | # 2 | # Assets for the Show app 3 | # 4 | 5 | require 'jquery' 6 | 7 | hash = 8 | 9 | '^/show/.*': -> 10 | require('../apps/show/client/index.coffee').init() 11 | 12 | # On DOM load iterate through the hash and load that app's JS 13 | $ -> 14 | for regexStr, load of hash 15 | if location.pathname.replace(/\/$/,'').match(new RegExp regexStr) 16 | load() 17 | break 18 | -------------------------------------------------------------------------------- /collections/partner_artist_artworks.coffee: -------------------------------------------------------------------------------- 1 | _ = require 'underscore' 2 | Artworks = require './artworks.coffee' 3 | 4 | module.exports = class PartnerArtistArtworks extends Artworks 5 | 6 | parse: (response, options = {}) -> 7 | # This extracts the Artwork model from a PartnerArtistArtwork model 8 | # Consider adding a reference to the PartnerArtistArtwork position 9 | _.pluck response, 'artwork' 10 | -------------------------------------------------------------------------------- /components/article/templates/sections/video.jade: -------------------------------------------------------------------------------- 1 | .article-video-container 2 | if video.cover_image_url 3 | .article-video-cover-image( 4 | style=("background-image: url(#{crop(video.cover_image_url, { width: 700, height: 400 })})") 5 | ) 6 | button.article-video-play-button 7 | .article-video-play-button-caret 8 | .article-section.article-section-video 9 | != embed(video.url, videoOptions) -------------------------------------------------------------------------------- /assets/artists.coffee: -------------------------------------------------------------------------------- 1 | # 2 | # Assets for the Artists app 3 | # 4 | 5 | require 'jquery' 6 | 7 | hash = 8 | 9 | '^/artists.*': -> 10 | require('../apps/artists/client.coffee').init() 11 | 12 | # On DOM load iterate through the hash and load that app's JS 13 | $ -> 14 | for regexStr, load of hash 15 | if location.pathname.replace(/\/$/,'').match(new RegExp regexStr) 16 | load() 17 | break 18 | -------------------------------------------------------------------------------- /models/image.coffee: -------------------------------------------------------------------------------- 1 | _ = require 'underscore' 2 | sd = require('sharify').data 3 | Backbone = require 'backbone' 4 | DeepZoom = require '../components/deep_zoom/mixin.coffee' 5 | 6 | module.exports = class Image extends Backbone.Model 7 | _.extend @prototype, DeepZoom(sd.SECURE_IMAGES_URL) 8 | 9 | imageUrl: (version = 'small') -> 10 | @get('image_url').replace(':version', version) if @has('image_url') 11 | -------------------------------------------------------------------------------- /models/location.coffee: -------------------------------------------------------------------------------- 1 | _ = require 'underscore' 2 | Backbone = require 'backbone' 3 | Relations = require './mixins/relations/location.coffee' 4 | 5 | module.exports = class Location extends Backbone.Model 6 | 7 | _.extend @prototype, Relations 8 | 9 | cityStateCountry: -> 10 | _.compact([ 11 | @get 'city' || '' 12 | @get 'state' || '' 13 | @get 'country' || '' 14 | ]).join(', ') 15 | -------------------------------------------------------------------------------- /apps/fair_info/stylesheets/visitors.styl: -------------------------------------------------------------------------------- 1 | .fair-info-visitor-info 2 | garamond-size('s-body', true) 3 | 4 | .fair-info-visitor-info__section 5 | margin-bottom 40px 6 | 7 | .fair-info-heavy-link 8 | avant-garde-size('body', true) 9 | display inline-block 10 | text-decoration none 11 | border-bottom 2px solid black 12 | padding-top 20px 13 | 14 | .fair-info2-map 15 | width 100% 16 | margin-bottom 20px 17 | -------------------------------------------------------------------------------- /components/layout/stylesheets/footer.styl: -------------------------------------------------------------------------------- 1 | @import '../../stylus_lib' 2 | 3 | footer 4 | background-color #000 5 | position: relative 6 | z-index: 3 7 | background: black 8 | 9 | .footer__bottom-nav 10 | padding 30px 12px 11 | 12 | .footer__bottom-nav__link 13 | serif() 14 | display inline-block 15 | color white 16 | font-size default-font-size 17 | text-decoration none 18 | padding-right 12px 19 | -------------------------------------------------------------------------------- /components/resizer/index.coffee: -------------------------------------------------------------------------------- 1 | config = require './config.coffee' 2 | SERVICES = 3 | EMBEDLY: require './services/embedly.coffee' 4 | GEMINI: require './services/gemini.coffee' 5 | 6 | service = -> 7 | SERVICES[config.proxy] 8 | 9 | module.exports = 10 | resize: -> 11 | service().resize arguments... 12 | crop: -> 13 | service().crop arguments... 14 | fill: -> 15 | service().fill arguments... 16 | -------------------------------------------------------------------------------- /lib/middleware/redirect_external_links.coffee: -------------------------------------------------------------------------------- 1 | # 2 | # For the native app that tries to point to certain external links 3 | # (like m.artsy.net/http://2013.artsy.net) redirect those requests to the proper location. 4 | # 5 | 6 | module.exports = (req, res, next) -> 7 | if req.headers['user-agent']?.match(/Artsy-Mobile/) and req.url.match(/^\/http/) 8 | res.redirect req.url.replace(/^\//, '') 9 | else 10 | next() -------------------------------------------------------------------------------- /test/models/image.coffee: -------------------------------------------------------------------------------- 1 | Image = require '../../models/image' 2 | { fabricate } = require 'antigravity' 3 | 4 | describe 'Image', -> 5 | 6 | beforeEach -> 7 | @image = new Image fabricate 'artwork_image' 8 | 9 | describe '#imageUrl', -> 10 | 11 | it 'returns the small image by default', -> 12 | @image.set 'image_url', 'foo/bar/:version.jpg' 13 | @image.imageUrl().should.equal 'foo/bar/small.jpg' -------------------------------------------------------------------------------- /lib/middleware/ensure_ssl.coffee: -------------------------------------------------------------------------------- 1 | # 2 | # Makes sure that any http requests get redirected to https 3 | # 4 | 5 | { APP_URL } = require '../../config' 6 | { parse } = require 'url' 7 | 8 | module.exports = (req, res, next) -> 9 | protocol = req.get('X-Forwarded-Proto') or req.protocol 10 | if protocol isnt 'https' and parse(APP_URL).protocol is 'https:' 11 | res.redirect APP_URL + req.url 12 | else 13 | next() 14 | -------------------------------------------------------------------------------- /apps/artwork/components/related_artworks/queries/artist_query.coffee: -------------------------------------------------------------------------------- 1 | module.exports = """ 2 | fragment artist_artworks on Artwork { 3 | artist { 4 | name 5 | href 6 | counts { 7 | artworks(format: "0,0") 8 | } 9 | artworks(filter: [IS_FOR_SALE], exclude: [$id], size: 20, sort: partner_updated_at_desc) { 10 | #{require('./index.coffee')} 11 | } 12 | } 13 | } 14 | """ 15 | -------------------------------------------------------------------------------- /apps/artwork/components/related_artworks/queries/auction_query.coffee: -------------------------------------------------------------------------------- 1 | module.exports = """ 2 | fragment auction_artworks on Artwork { 3 | sale { 4 | name 5 | href 6 | name 7 | href 8 | is_open 9 | artworks(all: true, size: 50, exclude: [$id]) { 10 | sale_artwork { 11 | lot_number 12 | } 13 | #{require('./index.coffee')} 14 | } 15 | } 16 | } 17 | """ -------------------------------------------------------------------------------- /apps/gene/routes.coffee: -------------------------------------------------------------------------------- 1 | Gene = require '../../models/gene' 2 | _ = require 'underscore' 3 | 4 | module.exports.index = (req, res, next) -> 5 | gene = new Gene id: req.params.id 6 | gene.fetch 7 | cache: true 8 | success: -> 9 | res.locals.sd.GENE = gene.toJSON() 10 | res.locals.sd.PARAMS = _.extend req.query, gene_id: req.params.id 11 | res.render 'index', gene: gene 12 | error: res.backboneError 13 | -------------------------------------------------------------------------------- /collections/search_results.coffee: -------------------------------------------------------------------------------- 1 | _ = require 'underscore' 2 | sd = require('sharify').data 3 | Backbone = require 'backbone' 4 | 5 | module.exports = class SearchResults extends Backbone.Collection 6 | 7 | url: -> sd.API_URL + '/api/v1/match' 8 | 9 | initialize: -> 10 | @model = require '../models/search_result.coffee' 11 | 12 | updateLocationsForFair: (fair) -> 13 | @map (result) -> result.updateForFair fair 14 | -------------------------------------------------------------------------------- /apps/fair/templates/exhibitors_page.jade: -------------------------------------------------------------------------------- 1 | extends ../../../components/layout/templates/main 2 | 3 | block content 4 | .main-side-margin.mobile-app-top-padding 5 | .fair-page-header 6 | if title 7 | h1.fair-page-az-header.avant-garde-header-center!= title 8 | include exhibitors_subheader 9 | ul#fair-exhibitors 10 | include exhibitors 11 | if scrolling 12 | #fair-exhibitors-spinner.loading-spinner 13 | -------------------------------------------------------------------------------- /apps/gallery_partnerships/index.coffee: -------------------------------------------------------------------------------- 1 | # 2 | # Gallery Partnerships page requires different functionality from others. 3 | # 4 | 5 | express = require 'express' 6 | routes = require './routes' 7 | 8 | app = module.exports = express() 9 | app.set 'views', __dirname + '/templates' 10 | app.set 'view engine', 'jade' 11 | 12 | app.get '/gallery-partnerships', routes.index 13 | app.get /^\/gallery-partnerships\/((?!edit$).)+$/, routes.index 14 | -------------------------------------------------------------------------------- /components/bid_numbers/index.styl: -------------------------------------------------------------------------------- 1 | .bid-numbers 2 | clearfix() 3 | padding 15px 0 4 | border-top 1px dotted light-gray-border-color 5 | border-bottom @border-top 6 | margin-top 10px 7 | 8 | .bid-numbers-left 9 | float left 10 | 11 | .bid-numbers-bid-label 12 | font-weight bold 13 | 14 | .bid-numbers-count-reserve 15 | color dark-gray-text-color 16 | 17 | .bid-numbers-right 18 | garamond-size('l-body') 19 | float right 20 | -------------------------------------------------------------------------------- /public/images/image-set.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/artist/client/index.coffee: -------------------------------------------------------------------------------- 1 | bootstrap = require '../../../components/layout/bootstrap.coffee' 2 | sd = require('sharify').data 3 | Artist = require '../../../models/artist.coffee' 4 | ArtistPageView = require './view.coffee' 5 | CurrentUser = require '../../../models/current_user.coffee' 6 | 7 | $ -> 8 | bootstrap() 9 | artist = new Artist sd.ARTIST 10 | new ArtistPageView 11 | model: artist 12 | user: CurrentUser.orNull() 13 | -------------------------------------------------------------------------------- /apps/artwork/components/meta_data/templates/inquiry.jade: -------------------------------------------------------------------------------- 1 | unless artwork.auction 2 | if artwork.is_inquireable 3 | a.artwork-meta-data-black__contact-button( 4 | href="/inquiry/#{artwork.id}" 5 | ) 6 | if artwork.partner && artwork.partner.type == 'Gallery' 7 | | Contact Gallery 8 | else 9 | | Contact Seller 10 | if artwork.is_acquireable 11 | a.artwork-meta-data-black__contact-button.js-purchase Buy -------------------------------------------------------------------------------- /apps/notifications/templates/index.jade: -------------------------------------------------------------------------------- 1 | extends ../../../components/layout/templates/main 2 | 3 | append locals 4 | - assetPackage = 'notifications' 5 | 6 | block content 7 | #notifications-page.main-side-margin 8 | h1.notifications-header.avant-garde-header-center 9 | |Works by 10 | br 11 | |Artists You Follow 12 | #notifications-published-artworks 13 | #notifications-published-artworks-spinner: .loading-spinner -------------------------------------------------------------------------------- /test/models/show_event.coffee: -------------------------------------------------------------------------------- 1 | { fabricate } = require 'antigravity' 2 | Show = require '../../models/show' 3 | 4 | describe 'ShowEvent', -> 5 | beforeEach -> 6 | @show = new Show fabricate 'show' 7 | 8 | describe '#eventType', -> 9 | it 'returns correctly formatted event types', -> 10 | formattedEvents = @show.related().showEvents.invoke 'eventType' 11 | formattedEvents.should.be.match ['Opening Reception', 'Event'] 12 | -------------------------------------------------------------------------------- /apps/fair/stylesheets/for_you.styl: -------------------------------------------------------------------------------- 1 | .fair-for-you-loading 2 | #fair-page-title, #fair-page-subtitle 3 | visibility hidden 4 | 5 | #fair-page-subtitle 6 | border-bottom 1px solid light-gray-border-color 7 | 8 | .fair-for-you-exhibitors-heading 9 | sans-serf() 10 | border-bottom 1px solid light-gray-border-color 11 | font-size 20px 12 | padding 24px 0 13 | text-align center 14 | 15 | .fair-for-you-exhibitors 16 | margin-top -1px -------------------------------------------------------------------------------- /apps/fair/templates/primary_set.jade: -------------------------------------------------------------------------------- 1 | nav.chevron-nav-list.fair-page-nav-sections 2 | a( href="/#{fair.get('default_profile_id')}/for-you" ) My Guide 3 | a( href="/#{fair.get('default_profile_id')}/browse/filter" ) Exhibitors 4 | a( href="/#{fair.get('default_profile_id')}/browse/artists" ) Artists 5 | a( href="/#{fair.get('default_profile_id')}/browse/artworks" ) Artworks 6 | a( href="/#{fair.get('default_profile_id')}/info" ) Visitor Information 7 | -------------------------------------------------------------------------------- /components/artist_list/index.styl: -------------------------------------------------------------------------------- 1 | .artist-list 2 | column-count 2 3 | column-gap 25px 4 | column-width 50% 5 | font-size 12px 6 | text-align center 7 | a 8 | display block 9 | text-decoration none 10 | li 11 | display inline-block 12 | width 100% 13 | img 14 | width 100% 15 | display block 16 | h4 17 | line-height 1.3 18 | avant-garde() 19 | margin 15px 0 20 | font-size 11px 21 | -------------------------------------------------------------------------------- /apps/partner_profile/templates/articles.jade: -------------------------------------------------------------------------------- 1 | extends ../../../components/layout/templates/main 2 | 3 | block content 4 | .main-side-margin 5 | nav.slash-breadcrumbs 6 | a( href='/' + profile.get('id') )= profile.get('owner').name 7 | span= sectionLabel 8 | ul#profile-page-articles.main-side-margin 9 | .loading-spinner 10 | .main-side-margin 11 | a.partner-back-link( href='/' + profile.get('id') ) Go to #{profile.get('owner').name} -------------------------------------------------------------------------------- /collections/profiles.coffee: -------------------------------------------------------------------------------- 1 | _ = require 'underscore' 2 | sd = require('sharify').data 3 | Backbone = require 'backbone' 4 | Profile = require '../models/profile.coffee' 5 | { AToZ, Fetch } = require 'artsy-backbone-mixins' 6 | 7 | module.exports = class Profiles extends Backbone.Collection 8 | 9 | _.extend @prototype, AToZ 10 | _.extend @prototype, Fetch(sd.API_URL) 11 | 12 | model: Profile 13 | 14 | url: -> "#{sd.API_URL}/api/v1/profiles" 15 | -------------------------------------------------------------------------------- /models/mixins/relations/partner.coffee: -------------------------------------------------------------------------------- 1 | module.exports = 2 | related: -> 3 | return @__related__ if @__related__? 4 | 5 | Locations = require '../../../collections/partner_locations.coffee' 6 | Shows = require '../../../collections/partner_shows.coffee' 7 | 8 | locations = new Locations [], partnerId: @id 9 | shows = new Shows [], partnerId: @id 10 | 11 | @__related__ = 12 | locations: locations 13 | shows: shows 14 | -------------------------------------------------------------------------------- /apps/fair/templates/programming/list_item.jade: -------------------------------------------------------------------------------- 1 | .fair-programming-event-list-item 2 | .fair-programming-event-time!= event.getTime() 3 | a.fair-programming-event-list-item-link( href=event.href() ) 4 | .fair-programming-event-group-name.chevron-arrow-button= event.getEventGroups() 5 | .fair-programming-event-name= event.get('name') 6 | .fair-programming-event-venue= event.get('venue') 7 | .fair-programming-event-description!= event.mdToHtml('description') -------------------------------------------------------------------------------- /apps/page/routes.coffee: -------------------------------------------------------------------------------- 1 | Page = require '../../models/page' 2 | { ARTSY_URL } = require '../../config' 3 | 4 | @vanityUrl = (id) -> 5 | (req, res) -> 6 | new Page(id: id).fetch 7 | success: (page) -> 8 | res.render 'template', page: page 9 | error: res.backboneError 10 | 11 | @index = (req, res) -> 12 | new Page(id: req.params.id).fetch 13 | success: (page) -> res.render 'template', page: page 14 | error: res.backboneError 15 | -------------------------------------------------------------------------------- /components/app_banner/index.coffee: -------------------------------------------------------------------------------- 1 | AppBanner = require './app_banner.coffee' 2 | 3 | module.exports = -> 4 | return unless AppBanner.shouldDisplay() 5 | 6 | banner = new AppBanner $('#content') 7 | $el = banner.$el 8 | 9 | $el.find('.app-banner-close-button').on 'click', (e) -> 10 | e.preventDefault() 11 | banner.remove() 12 | 13 | $el.find('.app-banner-open-area').on 'click', (e) -> 14 | e.preventDefault() 15 | banner.launch() 16 | -------------------------------------------------------------------------------- /components/artist_list/template.jade: -------------------------------------------------------------------------------- 1 | ul.artist-list 2 | for artist in artists 3 | li 4 | if partnerArtist && partner 5 | a( href="/#{partner.get('default_profile_id')}/artist/#{artist.get('id')}" ) 6 | img( src=artist.defaultImageUrl() ) 7 | h4= artist.get('name') 8 | else 9 | a( href="/artist/#{artist.get('id')}" ) 10 | img( src=artist.defaultImageUrl() ) 11 | h4= artist.get('name') 12 | -------------------------------------------------------------------------------- /components/select/stylesheets/index.styl: -------------------------------------------------------------------------------- 1 | .select-group 2 | display inline-block 3 | margin 0 15px 4 | position relative 5 | padding-right 1em 6 | &:first-child 7 | margin-left 0 8 | &:last-child 9 | margin-right 0 10 | 11 | .select-group__label 12 | text-transform capitalize 13 | text-decoration underline 14 | 15 | .select-group__select 16 | position absolute 17 | top 0 18 | right 0 19 | bottom 0 20 | left 0 21 | opacity 0 22 | -------------------------------------------------------------------------------- /models/mixins/eventable.coffee: -------------------------------------------------------------------------------- 1 | moment = require 'moment' 2 | 3 | module.exports = 4 | date: (attr) -> 5 | moment.utc @get(attr) 6 | 7 | formatDateRange: (start_attr, end_attr, format = 'dddd, MMM. Do, h:mma') -> 8 | start = @date start_attr 9 | end = @date end_attr 10 | 11 | output = "#{start.format(format)} – " 12 | output += end.format(if start.isSame(end, 'day') then 'h:mma' else format) 13 | 14 | output.replace /:00/g, '' 15 | -------------------------------------------------------------------------------- /apps/gene/templates/header.jade: -------------------------------------------------------------------------------- 1 | header#gene-page-header 2 | h1.gene-page-large-header.avant-garde-header-center= gene.get('name') 3 | .gene-follow-button-container 4 | .follow-button.avant-garde-box-button 5 | h2 6 | .gene-description 7 | .gene-description-text 8 | p!= gene.mdToHtml('description') 9 | p.gene-read-more-fade 10 | .gene-read-more.avant-garde-subheader 11 | a.gene-read-more-button(href="#") READ MORE 12 | -------------------------------------------------------------------------------- /test/collections/partner_locations.coffee: -------------------------------------------------------------------------------- 1 | Backbone = require 'backbone' 2 | { fabricate } = require 'antigravity' 3 | PartnerLocations = require '../../collections/partner_locations' 4 | 5 | describe 'PartnerLocations', -> 6 | 7 | beforeEach -> 8 | @shows = new PartnerLocations null, partnerId: 'foobar' 9 | 10 | describe '#url', -> 11 | 12 | it 'includes the partner id', -> 13 | @shows.url().should.containEql '/api/v1/partner/foobar/locations' 14 | -------------------------------------------------------------------------------- /test/models/hero_unit.coffee: -------------------------------------------------------------------------------- 1 | HeroUnit = require '../../models/hero_unit' 2 | { fabricate } = require 'antigravity' 3 | 4 | describe 'HeroUnit', -> 5 | 6 | beforeEach -> 7 | @heroUnit = new HeroUnit fabricate 'site_hero_unit' 8 | 9 | describe '#cssClass', -> 10 | 11 | it 'namespaces some classes based off attrs', -> 12 | @heroUnit.set mobile_menu_color_class: 'black' 13 | @heroUnit.cssClass().should.containEql 'home-page-hero-unit-black' 14 | -------------------------------------------------------------------------------- /apps/art_fairs/templates/fair-details.jade: -------------------------------------------------------------------------------- 1 | .art-fairs--fair-details.past-art-fairs--border-bottom 2 | a.fairs-link(href=fair.href) 3 | .fair-logo 4 | if fair.profile && fair.profile.icon 5 | img(src="#{fair.profile.icon.url}") 6 | 7 | .fair-details 8 | h5.fair-name= fair.name 9 | p.fair-content.fair-content__location= Helpers.cityStateAndCountry(fair.location) 10 | p.fair-content.fair-content__dates= Helpers.formatDates(fair) 11 | -------------------------------------------------------------------------------- /apps/fair/templates/image_nav_item.jade: -------------------------------------------------------------------------------- 1 | .chevron-nav-list.fair-nav-item 2 | a.fair-nav-item-link( href=href ) 3 | if position 4 | .fair-nav-item-position= position 5 | .fair-nav-item-image( style="background-image: url(#{imgSrc})" ) 6 | .fair-nav-item-label 7 | if !labelInfo 8 | .fair-nav-item-label-padding 9 | .fair-nav-item-label-title!= labelTitle 10 | if labelInfo 11 | .fair-nav-item-label-subtitle!= labelInfo 12 | -------------------------------------------------------------------------------- /apps/fair/templates/feed.jade: -------------------------------------------------------------------------------- 1 | extends ../../../components/layout/templates/main 2 | 3 | block content 4 | #fair-feed.main-side-margin 5 | h1.fair-page-module-heading.fair-feed-heading Live at The Armory Show 6 | #fair-feed__caption Post your best photos from The Armory Show using the hashtag #TheArmoryShow. 7 | #fair-feed__refresh.refresh-icon 8 | 9 | #fair-feed__list 10 | #fair-feed__empty-message No entries found 11 | #fair-feed__spinner.loading-spinner -------------------------------------------------------------------------------- /apps/order/routes.coffee: -------------------------------------------------------------------------------- 1 | _ = require 'underscore' 2 | Order = require '../../models/order.coffee' 3 | { ARTSY_URL } = require('sharify').data 4 | 5 | @resume = (req, res) -> 6 | unless (token = req.query.token) and (orderId = req.params.id) 7 | return res.redirect '/' 8 | 9 | # Redirect to Force order resume url until we build in order support 10 | res.redirect "#{ARTSY_URL}/order/#{req.params.id}/resume?token=#{req.query.token}&stop_microgravity_redirect=true" 11 | -------------------------------------------------------------------------------- /components/filter2/dropdown/view.coffee: -------------------------------------------------------------------------------- 1 | _ = require 'underscore' 2 | Backbone = require 'backbone' 3 | mediator = require '../../../lib/mediator.coffee' 4 | SelectView = require '../../select/client/select_view.coffee' 5 | template = -> require('./template.jade') arguments... 6 | 7 | module.exports = class DropdownView extends SelectView 8 | render: -> 9 | @$el.html template 10 | options: @filterOptions 11 | label: @label 12 | sort: @sort 13 | this 14 | -------------------------------------------------------------------------------- /apps/fair_organizer/index.coffee: -------------------------------------------------------------------------------- 1 | # 2 | # Fair "Year-Round" / Fair Organizer app 3 | # 4 | express = require 'express' 5 | routes = require './routes' 6 | 7 | app = module.exports = express() 8 | app.set 'views', __dirname + '/templates' 9 | app.set 'view engine', 'jade' 10 | getFairOrgData = [ 11 | routes.fetchFairOrgData 12 | (req, res, next) -> next() unless req.timedout 13 | ] 14 | 15 | # just a route to for testing for now 16 | app.get '/:id', getFairOrgData, routes.overview 17 | -------------------------------------------------------------------------------- /apps/notifications/templates/artist.jade: -------------------------------------------------------------------------------- 1 | .notifications-list-item 2 | a.notifications-artist-link( href=artist.href() )= artist.get('name') 3 | span.notifications-publish-date= publishedAt 4 | .notifications-works-added 5 | = count + ' ' 6 | if count == 1 7 | | work added 8 | else 9 | | works added 10 | .notifications-published-artworks 11 | .notifications-see-more 12 | a.chevron-arrow-button( href=artist.href() + '?sort=-published_at' ) See More 13 | -------------------------------------------------------------------------------- /apps/home/stylesheets/index.styl: -------------------------------------------------------------------------------- 1 | @import './hero_units' 2 | @import './current_shows' 3 | 4 | .home-page-section.main-side-margin 5 | margin-top 20px 6 | 7 | #home-page-featured-links 8 | margin-top 20px 9 | 10 | .home-page-featured-header 11 | margin 30px 0 20px 0 12 | font-size large-avant-garde-font-size !important 13 | 14 | #home-page-featured-list 15 | margin 20px 0 16 | 17 | .home-featured-back-link 18 | margin 30px 0 19 | display block 20 | text-decoration none 21 | -------------------------------------------------------------------------------- /apps/show/templates/carousel.jade: -------------------------------------------------------------------------------- 1 | section#show-installation-shot-carousel 2 | .aspect-ratio 3 | #carousel-track 4 | for installShot in installShots.models 5 | figure.carousel-track__image 6 | img( 7 | src= installShot.imageUrlForRatio() 8 | alt= installShot.get('caption') 9 | title= installShot.get('caption') 10 | ) 11 | if installShot.get('caption') 12 | figcaption.carousel-caption= installShot.get('caption') 13 | -------------------------------------------------------------------------------- /apps/articles/stylesheets/fixed_share.styl: -------------------------------------------------------------------------------- 1 | .article-fixed-share-nav 2 | width 100% 3 | height 50px 4 | position fixed 5 | bottom 0px 6 | z-index 20 7 | background-color white 8 | border-top 1px solid gray-color 9 | 10 | .article-fixed-share-item 11 | width 33% 12 | height 50px 13 | display inline-block 14 | text-align center 15 | text-decoration none 16 | i 17 | color gray-dark-color 18 | display inline-block 19 | padding-top 13px 20 | font-size 35px 21 | -------------------------------------------------------------------------------- /apps/artwork/components/artist/templates/show.jade: -------------------------------------------------------------------------------- 1 | .aama-show 2 | .aama-show__year 3 | if show.year 4 | | #{show.year} 5 | 6 | .aama-show__details 7 | .aama-show__details__vertically-center 8 | span.aama-show__details__name #{show.name} 9 | | 10 | span.aama-show__details__partner #{show.partner.name} 11 | | 12 | if show.location && show.location.city 13 | span.aama-show__details__city-date 14 | |, #{show.location.city} -------------------------------------------------------------------------------- /apps/contact/test/template.coffee: -------------------------------------------------------------------------------- 1 | _ = require 'underscore' 2 | fs = require 'fs' 3 | template = require('jade').compileFile(require.resolve '../templates/template.jade') 4 | fixture = require '../fixtures/contact.json' 5 | data = _.extend {}, asset: (->), sd: {}, data: fixture, markdown: (->) 6 | 7 | describe '/contact', -> 8 | describe 'index', -> 9 | it 'renders correctly', -> 10 | template(data) 11 | .should.containEql '