diff --git a/VERSION b/VERSION index 225453ec83..f5e19dd525 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -6.15 +6.16 diff --git a/app/Helpers/ImageHelpers.php b/app/Helpers/ImageHelpers.php index f35510c90a..95603549a9 100644 --- a/app/Helpers/ImageHelpers.php +++ b/app/Helpers/ImageHelpers.php @@ -653,3 +653,8 @@ function aic_gridListingImageSizes($data) { return $sizes; } + +function aic_getIconClass($key = 0) { + $icons = \App\Models\Page::getIconTypes(); + return Str::kebab($icons[$key]); +} diff --git a/app/Helpers/StringHelpers.php b/app/Helpers/StringHelpers.php index 11793e0788..b08fd2311a 100644 --- a/app/Helpers/StringHelpers.php +++ b/app/Helpers/StringHelpers.php @@ -225,3 +225,28 @@ function rightTrim($string, $needle) { return $string; } } + +if (!function_exists('summation')) { + + /** + * Helper method that converts `['item', 'hey', 'wow']` to `item, hey, and wow`. + * Per request from communications, we use the Oxford comma. + * + * @return string + */ + function summation(array $array = []) { + switch (count($array)) { + case 0; + return null; + case 1; + return array_pop($array); + break; + case 2; + return implode(' and ', $array); + break; + default; + $last = array_pop($array); + return implode(', ', $array) . ', and ' . $last; + } + } +} diff --git a/app/Http/Controllers/Admin/PageController.php b/app/Http/Controllers/Admin/PageController.php index c8043b0119..885542bb61 100644 --- a/app/Http/Controllers/Admin/PageController.php +++ b/app/Http/Controllers/Admin/PageController.php @@ -89,13 +89,13 @@ public function visit(PageRepository $pages) $additionalFieldsets = [ ['fieldset' => 'hours', 'label' => 'Hours'], + ['fieldset' => 'call-to-action', 'label' => 'CTA'], + ['fieldset' => 'expect', 'label' => 'What to Expect'], ['fieldset' => 'admissions', 'label' => 'Admissions'], - ['fieldset' => 'featured_offer', 'label' => 'Featured offer'], - ['fieldset' => 'directions', 'label' => 'Museum address'], - ['fieldset' => 'dining_hours', 'label' => 'Dining'], ['fieldset' => 'faq', 'label' => 'FAQ'], - ['fieldset' => 'tourpages', 'label' => 'Tours'], - ['fieldset' => 'families', 'label' => 'Families, teens and educators'], + ['fieldset' => 'accessibility', 'label' => 'Accessibility'], + ['fieldset' => 'directions', 'label' => 'Directions'], + ['fieldset' => 'explore', 'label' => 'Ways to Explore'], ]; $fields = $this->form($page->id); diff --git a/app/Http/Controllers/SearchController.php b/app/Http/Controllers/SearchController.php index 02e3b2e7ec..d345207a20 100644 --- a/app/Http/Controllers/SearchController.php +++ b/app/Http/Controllers/SearchController.php @@ -161,7 +161,7 @@ public function autocomplete() break; case 'Artist': $item->url = route('artists.show', $item); - $item->section = 'Artists'; + $item->section = 'Artists/Cultures'; break; case 'Event': $item->url = route('events.show', $item); @@ -405,7 +405,7 @@ protected function buildSearchLinks($all, $active = 'all') array_push($links, $this->buildLabel('All', $all->getMetadata('pagination')->total, route('search', ['q' => request('q')]), $active == 'all')); if (extractAggregation($aggregations, 'agents')) { - array_push($links, $this->buildLabel('Artist', extractAggregation($aggregations, 'agents'), route('search.artists', ['q' => request('q')]), $active == 'artists')); + array_push($links, $this->buildLabel('Artists/Cultures', extractAggregation($aggregations, 'agents'), route('search.artists', ['q' => request('q')]), $active == 'artists')); } if (extractAggregation($aggregations, 'generic-pages')) { array_push($links, $this->buildLabel('Pages', extractAggregation($aggregations, 'generic-pages'), route('search.pages', ['q' => request('q')]), $active == 'generic-pages')); diff --git a/app/Http/Controllers/VisitController.php b/app/Http/Controllers/VisitController.php index dd0f24c6ba..27cc5aec67 100644 --- a/app/Http/Controllers/VisitController.php +++ b/app/Http/Controllers/VisitController.php @@ -61,6 +61,20 @@ public function index() 'primary' => $page->visit_hour_header, 'secondary' => $page->visit_hour_subheader, 'sections' => $page->featured_hours, + 'intro' => $page->visit_hour_intro + ); + + $expects = array(); + foreach ($page->whatToExpects as $item) { + array_push($expects, array( + 'iconType' => $item->icon_type, + 'text' => $item->text, + )); + }; + $whatToExpect = array( + 'more_link' => $page->visit_what_to_expect_more_link, + 'more_text' => $page->visit_what_to_expect_more_text, + 'items' => $expects, ); // Get prices grid for admissions @@ -109,14 +123,6 @@ public function index() 'link' => $page->visit_buy_tickets_link, ), ); - $dining = array(); - foreach ($page->dining_hours as $hour) { - array_push($dining, array( - 'image' => $hour->imageFront('dining_cover'), - 'title' => $hour->name, - 'text' => $hour->accessible_hours, - )); - }; $directions = array( 'intro' => __('Located in the heart of Chicago—across from Millennium Park and steps from Lake Michigan—the Art Institute welcomes visitors at two entrances.'), @@ -126,6 +132,10 @@ public function index() 'href' => $page->visit_parking_link, 'label' => __('Directions, Parking, and Public Transportation'), ), + 'accessibility_link' => array( + 'href' => $page->visit_parking_accessibility_link, + 'label' => __('Visitors with Mobility Needs'), + ), ); $questions = array(); @@ -142,9 +152,16 @@ public function index() 'questions' => $questions, ); - $families = array(); + $accessibility = array( + 'image' => $page->imageFront('visit_accessibility'), + 'text' => $page->visit_accessibility_text, + 'link_text' => $page->visit_accessibility_link_text, + 'link_url' => $page->visit_accessibility_link_url, + ); + + $explore = array(); foreach ($page->families as $item) { - array_push($families, array( + array_push($explore, array( 'image' => $item->imageFront('family_cover'), 'title' => $item->title, 'text' => $item->text, @@ -156,23 +173,6 @@ public function index() )); }; - $tours = []; - foreach ($page->visitTourPages as $item) { - $links = []; - foreach ($item->children()->orderBy('position')->published()->get() as $child) { - array_push($links, array( - 'href' => $child->url, - 'label' => $child->title, - )); - } - array_push($tours, array( - 'title' => $item->title, - 'titleLink' => $item->url, - 'image' => $item->imageFront('listing'), - 'links' => $links, - )); - } - $itemprops = [ 'name' => 'Art Institute of Chicago', 'telephone' => '+13124433600', @@ -187,12 +187,12 @@ public function index() 'filledLogo' => true, 'headerMedia' => $headerMedia, 'hours' => $hours, + 'whatToExpect' => $whatToExpect, 'admission' => $admission, - 'dining' => $dining, 'directions' => $directions, 'faq' => $faq, - 'families' => $families, - 'tours' => $tours, + 'accessibility' => $accessibility, + 'explore' => $explore, 'itemprops' => $itemprops, ]); } diff --git a/app/Models/Behaviors/HasApiRelations.php b/app/Models/Behaviors/HasApiRelations.php index 5eaef7f699..d9ef9caba3 100644 --- a/app/Models/Behaviors/HasApiRelations.php +++ b/app/Models/Behaviors/HasApiRelations.php @@ -78,8 +78,10 @@ public function loadRelatedWithApiModels($browser_name, $apiModelsDefinitions, $ return $items->map(function ($relatedElement) { $element = $relatedElement->related; $element->position = $relatedElement->position; - - if (!$element->isListed ?? false) { + if ($element->isListed === false) { + return false; + } + if ($element->isPublished === false) { return false; } diff --git a/app/Models/MagazineIssue.php b/app/Models/MagazineIssue.php index 24cd618b6c..cbf8afa070 100644 --- a/app/Models/MagazineIssue.php +++ b/app/Models/MagazineIssue.php @@ -14,8 +14,8 @@ class MagazineIssue extends AbstractModel { use HasSlug, HasRevisions, HasBlocks, HasMedias, HasMediasEloquent, HasRelated; - protected $presenter = 'App\Presenters\Admin\GenericPresenter'; - protected $presenterAdmin = 'App\Presenters\Admin\GenericPresenter'; + protected $presenter = 'App\Presenters\Admin\MagazineIssuePresenter'; + protected $presenterAdmin = 'App\Presenters\Admin\MagazineIssuePresenter'; protected $fillable = [ 'title', diff --git a/app/Models/Page.php b/app/Models/Page.php index bbc9d9913b..ac2154d345 100644 --- a/app/Models/Page.php +++ b/app/Models/Page.php @@ -80,20 +80,17 @@ class Page extends AbstractModel 'resources_landing_title', 'resources_landing_intro', + // Visit page 'visit_dining_link', - 'visit_transportation_link', - 'visit_parking_link', - 'visit_buy_tickets_link', - 'visit_become_member_link', - 'visit_faq_accessibility_link', - 'visit_faq_more_link', - + 'visit_accessibility_link_url', + 'visit_cta_module_action_url', + 'visit_what_to_expect_more_link', ]; public $translatedAttributes = [ @@ -101,6 +98,7 @@ class Page extends AbstractModel 'visit_intro', 'visit_hour_header', 'visit_hour_subheader', + 'visit_hour_intro', 'visit_city_pass_title', 'visit_city_pass_text', 'visit_city_pass_button_label', @@ -108,6 +106,12 @@ class Page extends AbstractModel 'visit_admission_description', 'visit_buy_tickets_label', 'visit_become_member_label', + 'visit_accessibility_text', + 'visit_accessibility_link_text', + 'visit_cta_module_header', + 'visit_cta_module_body', + 'visit_cta_module_button_text', + 'visit_what_to_expect_more_text', 'active' ]; @@ -142,6 +146,14 @@ class Page extends AbstractModel ], ], ], + 'visit_accessibility' => [ + 'default' => [ + [ + 'name' => 'default', + 'ratio' => 16 / 9, + ], + ], + ], 'visit_map' => [ 'default' => [ [ @@ -199,6 +211,18 @@ class Page extends AbstractModel ]; public $filesParams = ['video']; // a list of file roles + public static $iconTypes = [ + 0 => 'Face Coverings', + 1 => 'Physical Distancing', + 2 => 'Mobile Ticket', + 3 => 'Showing Symptoms', + 4 => 'No Checkroom', + 5 => 'No Dining', + 6 => 'Caution', + 7 => 'Floor Icon', + 8 => 'Virtual Queue', + ]; + public function scopeForType($query, $type) { return $query->where('type', array_flip(self::$types)[$type]); @@ -302,6 +326,11 @@ public function featured_hours() return $this->hasMany(FeaturedHour::class)->orderBy('position'); } + public function whatToExpects() + { + return $this->hasMany(WhatToExpect::class)->orderBy('position'); + } + public function articlesCategories() { return $this->belongsToMany('App\Models\Category', 'page_article_category')->withPivot('position')->orderBy('position'); @@ -357,6 +386,11 @@ public function researchResourcesStudyRoomMore() return $this->belongsToMany('App\Models\GenericPage', 'research_resource_study_room_more_pages')->withPivot('position')->orderBy('research_resource_study_room_more_pages.position', 'asc'); } + public static function getIconTypes() + { + return collect(self::$iconTypes); + } + protected function transformMappingInternal() { return [ diff --git a/app/Models/Revisions/WhatToExpectRevision.php b/app/Models/Revisions/WhatToExpectRevision.php new file mode 100644 index 0000000000..4b3765e31d --- /dev/null +++ b/app/Models/Revisions/WhatToExpectRevision.php @@ -0,0 +1,10 @@ +entity->author_display) { + return $this->entity->author_display; + } + if ($this->entity->authors->isNotEmpty()) { - $array = $this->entity->authors->pluck('title')->all(); - return join(' and ', array_filter(array_merge(array(join(', ', array_slice($array, 0, -1))), array_slice($array, -1)), 'strlen')); + $names = $this->entity->authors->pluck('title')->all(); + + return summation($names); } - return $this->entity->author_display; } } diff --git a/app/Presenters/Admin/ArtworkPresenter.php b/app/Presenters/Admin/ArtworkPresenter.php index 6ac4b6ad5c..c1f201c1d4 100644 --- a/app/Presenters/Admin/ArtworkPresenter.php +++ b/app/Presenters/Admin/ArtworkPresenter.php @@ -142,7 +142,6 @@ private function getArtistLink($pivot) 'label' => $label, 'href' => $href, 'gtmAttributes' => 'data-gtm-event="'. $pivot->artist_title . '"' - . ' data-gtm-event-action="' . $this->entity->title . '"' . ' data-gtm-event-category="collection-nav"', ]; } diff --git a/app/Presenters/Admin/AuthorPresenter.php b/app/Presenters/Admin/AuthorPresenter.php index 0c9d701461..60fc747104 100644 --- a/app/Presenters/Admin/AuthorPresenter.php +++ b/app/Presenters/Admin/AuthorPresenter.php @@ -47,7 +47,10 @@ private function _prepWriting($element, $type = 'article') { $element->date = $element->date ?? $element->publish_start_date ?? $element->updated_at; $element->writingType = $type; - if (!$element->isListed ?? false) { + if ($element->isListed === false) { + return false; + } + if ($element->isPublished === false) { return false; } diff --git a/app/Presenters/Admin/MagazineIssuePresenter.php b/app/Presenters/Admin/MagazineIssuePresenter.php new file mode 100644 index 0000000000..77f4525f74 --- /dev/null +++ b/app/Presenters/Admin/MagazineIssuePresenter.php @@ -0,0 +1,24 @@ +]*)>([^<]*)}i"; + + return preg_replace_callback($p, [$this, 'hero_text_callback'], $this->entity->hero_text); + } + + private function hero_text_callback($matches) + { + return '' . $matches[2] .''; + } + +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 870b6953a4..31c9586ad8 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -163,7 +163,7 @@ private function composeTemplatesViews() $view->with([ '_pages' => [ - 'visit' => '/visit-us-virtually' + 'visit' => route('visit') , 'hours' => route('visit') . '#hours' , 'directions' => route('visit') . '#directions' diff --git a/app/Repositories/PageRepository.php b/app/Repositories/PageRepository.php index b569720e3e..a41f1e35f7 100644 --- a/app/Repositories/PageRepository.php +++ b/app/Repositories/PageRepository.php @@ -65,6 +65,7 @@ public function afterSave($object, $fields) $this->updateRepeater($object, $fields, 'dining_hours', 'DiningHour'); $this->updateRepeater($object, $fields, 'faqs', 'Faq'); $this->updateRepeater($object, $fields, 'families', 'Family'); + $this->updateRepeater($object, $fields, 'whatToExpects', 'WhatToExpect'); $this->updateBrowser($object, $fields, 'visitTourPages'); // Article Categories @@ -119,6 +120,7 @@ public function getFormFields($object) $fields = $this->getFormFieldsForRepeater($object, $fields, 'dining_hours', 'DiningHour'); $fields = $this->getFormFieldsForRepeater($object, $fields, 'faqs', 'Faq'); $fields = $this->getFormFieldsForRepeater($object, $fields, 'families', 'Family'); + $fields = $this->getFormFieldsForRepeater($object, $fields, 'whatToExpects', 'WhatToExpect'); $fields['browsers']['visitTourPages'] = $this->getFormFieldsForBrowser($object, 'visitTourPages', 'generic', 'title', 'genericPages'); // Article Categories diff --git a/app/Repositories/WhatToExpectRepository.php b/app/Repositories/WhatToExpectRepository.php new file mode 100644 index 0000000000..28b95c6d52 --- /dev/null +++ b/app/Repositories/WhatToExpectRepository.php @@ -0,0 +1,18 @@ +model = $model; + } +} diff --git a/config/twill/block_editor.php b/config/twill/block_editor.php index ed4c8f20b2..f945316a94 100644 --- a/config/twill/block_editor.php +++ b/config/twill/block_editor.php @@ -244,11 +244,17 @@ 'max' => 5, ], 'families' => [ - 'title' => 'Families, teens and educators', + 'title' => 'Explore on your own', 'trigger' => 'Add item', 'component' => 'a17-block-families', 'max' => 3, ], + 'whatToExpects' => [ + 'title' => 'What to Expect', + 'trigger' => 'Add item', + 'component' => 'a17-block-what_to_expect', + 'max' => 9, + ], 'accordion_item' => [ 'title' => 'Accordion Item', 'trigger' => 'Add accordion item', diff --git a/database/migrations/2020_07_06_160517_add_visit_intro_column_to_pages_table.php b/database/migrations/2020_07_06_160517_add_visit_intro_column_to_pages_table.php new file mode 100644 index 0000000000..de07cc789b --- /dev/null +++ b/database/migrations/2020_07_06_160517_add_visit_intro_column_to_pages_table.php @@ -0,0 +1,32 @@ +text('visit_hour_intro')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('page_translations', function (Blueprint $table) { + $table->dropColumn('visit_hour_intro'); + }); + } +} diff --git a/database/migrations/2020_07_07_111814_remove_featured_hours_records.php b/database/migrations/2020_07_07_111814_remove_featured_hours_records.php new file mode 100644 index 0000000000..37a4b8e468 --- /dev/null +++ b/database/migrations/2020_07_07_111814_remove_featured_hours_records.php @@ -0,0 +1,80 @@ +first(); + + if ($visitPage) { + $visitPage->featured_hours()->delete(); + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + $visitPage = \App\Models\Page::where('type', 3)->first(); + + $data = [ + 'external_link' => '/learn-with-us/ryan-learning-center', + 'position' => 1, + 'page_id' => 6, + 'published' => false, + 'de' => ['title' => 'The Ryan Learning Center', 'copy' => '
10:30-17:00 und donnerstags bis 20:00 Uhr
Freier Eintritt
10:30–5:00 and Wednesday, Thursday, and Friday until 8:00
Access is currently limited. Learn more.
Free admission
De 10:30 a.m. a 5:00 p.m. y los jueves hasta las 8:00 p.m.
Entrada libre
10h30-17h et les jeudis jusqu\'à 20h
Entrée libre
AM 10:30–PM 5:00、木曜日のみPM 8:00まで
入場無料
das 10h30 às 17h e quintas-feiras até às 20h.
Entrada gratuita
每天上午10:30至下午5:00,周四开放至晚上8:00
RLC 免费入馆
Montag–Freitag 13:00–17:00
Samstag–Sonntag GESCHLOSSEN
Monday–Friday 1:00–5:00
Saturday–Sunday CLOSED
De lunes a viernes de 1:00 p.m. a 5:00 p.m.
Sábado y domingo CERRADO
Lundi–vendredi 13h–17h
Samedi-dimanche FERMÉ
月曜-金曜 PM1:00–5:00
土曜-日曜 閉館
Segundas e sextas-feiras das 13 às 17h
Sábados e domingos - FECHADO
周一至周五下午1:00至5:00
周六至周日闭馆休息
10:30-17:00 und donnerstags bis 20:00 Uhr
', 'active' => true], + 'en' => ['title' => 'Museum Shops', 'copy' => '10:30–5:00 and Wednesday, Thursday, and Friday until 8:00
', 'active' => true], + 'es' => ['title' => 'Tiendas del museo', 'copy' => 'De 10:30 a.m. a 5:00 p.m. y los jueves hasta las 08:00 p.m.
', 'active' => true], + 'fr' => ['title' => 'Magasins du musée', 'copy' => '10h30-17h30 et le jeudi jusqu\'à 20h00
', 'active' => true], + 'ja' => ['title' => '館内売店', 'copy' => 'AM 10:30–PM 5:30、木曜日のみPM 8:00まで
', 'active' => true], + 'pt' => ['title' => 'Lojas do Museu', 'copy' => 'das 10h30 às 17h30 e quintas-feiras até às 20h
', 'active' => true], + 'zh' => ['title' => '博物馆商店', 'copy' => '上午10:30至下午5:30,周四开放至晚上8:00
', 'active' => true], + ]; + $hour = FeaturedHour::create($data); + } +} diff --git a/database/migrations/2020_07_07_131910_change_hours_header_and_description_copy.php b/database/migrations/2020_07_07_131910_change_hours_header_and_description_copy.php new file mode 100644 index 0000000000..f31c638570 --- /dev/null +++ b/database/migrations/2020_07_07_131910_change_hours_header_and_description_copy.php @@ -0,0 +1,36 @@ +first(); + + $visitPage->translate('en')->visit_hour_header = '* The first hour of each day is accessible to museum members only'; + $visitPage->translate('en')->visit_hour_subheader = 'All dining spaces, libraries, meeting halls, and the Ryan Learning Center are closed until further notice.
'; + $visitPage->save(); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + $visitPage = \App\Models\Page::where('type', 3)->first(); + + $visitPage->translate('en')->visit_hour_header = 'The museum is temporarily closed.'; + $visitPage->translate('en')->visit_hour_subheader = 'Learn more about the museum\'s response to COVID-19.
'; + $visitPage->save(); + } +} diff --git a/database/migrations/2020_07_07_153848_add_visit_parking_accessibility_link_to_pages_table.php b/database/migrations/2020_07_07_153848_add_visit_parking_accessibility_link_to_pages_table.php new file mode 100644 index 0000000000..aeedf3bba5 --- /dev/null +++ b/database/migrations/2020_07_07_153848_add_visit_parking_accessibility_link_to_pages_table.php @@ -0,0 +1,38 @@ +string('visit_parking_accessibility_link')->nullable(); + }); + + $visitPage = \App\Models\Page::where('type', 3)->first(); + + $visitPage->visit_parking_accessibility_link = '/visit/accessibility/visitors-with-mobility-needs'; + $visitPage->save(); + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('pages', function (Blueprint $table) { + $table->dropColumn('visit_parking_accessibility_link'); + }); + } +} diff --git a/database/migrations/2020_07_08_090827_add_accessibility_fields_to_pages_table.php b/database/migrations/2020_07_08_090827_add_accessibility_fields_to_pages_table.php new file mode 100644 index 0000000000..4b8d75f82e --- /dev/null +++ b/database/migrations/2020_07_08_090827_add_accessibility_fields_to_pages_table.php @@ -0,0 +1,41 @@ +text('visit_accessibility_text')->nullable(); + $table->text('visit_accessibility_link_text')->nullable(); + }); + + Schema::table('pages', function (Blueprint $table) { + $table->text('visit_accessibility_link_url')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('page_translations', function (Blueprint $table) { + $table->dropColumn(['visit_accessibility_text', 'visit_accessibility_link_text']); + }); + + Schema::table('pages', function (Blueprint $table) { + $table->dropColumn('visit_accessibility_link_url'); + }); + } +} diff --git a/database/migrations/2020_07_08_160948_add_cta_fields_to_pages_table.php b/database/migrations/2020_07_08_160948_add_cta_fields_to_pages_table.php new file mode 100644 index 0000000000..2c526b1de5 --- /dev/null +++ b/database/migrations/2020_07_08_160948_add_cta_fields_to_pages_table.php @@ -0,0 +1,46 @@ +text('visit_cta_module_header')->nullable(); + $table->text('visit_cta_module_body')->nullable(); + $table->text('visit_cta_module_button_text')->nullable(); + }); + + Schema::table('pages', function (Blueprint $table) { + $table->text('visit_cta_module_action_url')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('page_translations', function (Blueprint $table) { + $table->dropColumn([ + 'visit_cta_module_header', + 'visit_cta_module_body', + 'visit_cta_module_button_text', + ]); + }); + + Schema::table('pages', function (Blueprint $table) { + $table->dropColumn('visit_cta_module_action_url'); + }); + } +} diff --git a/database/migrations/2020_07_09_090656_apply_additional_visit_updates.php b/database/migrations/2020_07_09_090656_apply_additional_visit_updates.php new file mode 100644 index 0000000000..32b9ba5632 --- /dev/null +++ b/database/migrations/2020_07_09_090656_apply_additional_visit_updates.php @@ -0,0 +1,45 @@ +first(); + + $visitPage->translate('en')->visit_hour_intro = 'The Art Institute reopens on July 30, and we\'re so happy to welcome you back to our galleries. Please see below for new hours—including member-only hours—and updated safety policies.'; + $visitPage->translate('en')->visit_hour_header = 'Member-Only Hours'; + $visitPage->translate('en')->visit_hour_subheader = 'Monday 10–11 a.m.
Thursday–Friday 12-1 p.m.
Saturday–Sunday 10–11 a.m.
The Art Institute of Chicago provides free access to children under 14, Chicago teens under 18, Link and WIC cardholders, and Illinois educators every day, and to Illinois residents on certain days throughout the year. Learn more about free access.
'; + $visitPage->translate('en')->visit_accessibility_text = 'The Art Institute of Chicago welcomes all visitors and is committed to making its services accessible to everyone. We offer a range of resources for both adults and children with disabilities.'; + $visitPage->translate('en')->visit_accessibility_link_text = 'Learn more about accessibility'; + $visitPage->save(); + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + $visitPage = \App\Models\Page::where('type', 3)->first(); + + $visitPage->translate('en')->visit_hour_intro = ''; + $visitPage->translate('en')->visit_hour_header = ''; + $visitPage->translate('en')->visit_hour_subheader = ''; + $visitPage->translate('en')->visit_admission_description = 'The Art Institute of Chicago provides free access to children under 14, Chicago teens under 18, Link and WIC cardholders, and Illinois educators every day, and to Illinois residents every Wednesday evening from 5:00 to 8:00 p.m. Learn more.
Visiting with a group? Learn more about group admission rates.
'; + $visitPage->translate('en')->visit_accessibility_text = ''; + $visitPage->translate('en')->visit_accessibility_link_text = ''; + $visitPage->save(); + } +} diff --git a/database/migrations/2020_07_09_115513_create_what_to_expects_tables.php b/database/migrations/2020_07_09_115513_create_what_to_expects_tables.php new file mode 100644 index 0000000000..a8b886d72a --- /dev/null +++ b/database/migrations/2020_07_09_115513_create_what_to_expects_tables.php @@ -0,0 +1,35 @@ +integer('icon_type')->unsigned()->nullable(); + $table->integer('position')->unsigned()->nullable(); + + $table->integer('page_id')->unsigned()->nullable(); + $table->foreign('page_id')->references('id')->on('pages')->onDelete('cascade'); + }); + + Schema::create('what_to_expect_translations', function (Blueprint $table) { + createDefaultTranslationsTableFields($table, 'what_to_expect'); + $table->text('text')->nullable(); + }); + + Schema::create('what_to_expect_revisions', function (Blueprint $table) { + createDefaultRevisionsTableFields($table, 'what_to_expect'); + }); + } + + public function down() + { + Schema::dropIfExists('what_to_expect_revisions'); + Schema::dropIfExists('what_to_expect_translations'); + Schema::dropIfExists('what_to_expects'); + } +} diff --git a/database/migrations/2020_07_09_153354_add_visit_what_to_expect_more_link_column_to_pages_table.php b/database/migrations/2020_07_09_153354_add_visit_what_to_expect_more_link_column_to_pages_table.php new file mode 100644 index 0000000000..cdb9b1bc94 --- /dev/null +++ b/database/migrations/2020_07_09_153354_add_visit_what_to_expect_more_link_column_to_pages_table.php @@ -0,0 +1,40 @@ +text('visit_what_to_expect_more_link')->nullable(); + }); + + Schema::table('page_translations', function (Blueprint $table) { + $table->text('visit_what_to_expect_more_text')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('pages', function (Blueprint $table) { + $table->dropColumn('visit_what_to_expect_more_link'); + }); + + Schema::table('page_translations', function (Blueprint $table) { + $table->dropColumn('visit_what_to_expect_more_text'); + }); + } +} diff --git a/database/migrations/2020_07_14_092914_update_ways_to_explore_content.php b/database/migrations/2020_07_14_092914_update_ways_to_explore_content.php new file mode 100644 index 0000000000..39b290b06e --- /dev/null +++ b/database/migrations/2020_07_14_092914_update_ways_to_explore_content.php @@ -0,0 +1,98 @@ +first(); + + $visitPage->families()->delete(); + + $family = new \App\Models\Family; + $family->translateOrNew('en')->title = 'Art Institute Mobile App'; + $family->translateOrNew('en')->text = 'The Art Institute\'s free app offers the stories behind the art through conversations with artists, experts, and community members. Download it via the App Store or Google Play.'; + $family->translateOrNew('en')->link_label = 'Learn more'; + $family->translateOrNew('en')->active = true; + $family->published = true; + $family->external_link = '/visit/explore-on-your-own/mobile-app-audio-tours'; + $family->position = 1; + $family->page_id = $visitPage->id; + $family->save(); + + $family = new \App\Models\Family; + $family->translateOrNew('en')->title = 'What to See in an Hour'; + $family->translateOrNew('en')->text = 'Short on time? Check out this must-see guide to the collection.'; + $family->translateOrNew('en')->link_label = 'More custom tours'; + $family->translateOrNew('en')->active = true; + $family->published = true; + $family->external_link = '/highlights'; + $family->position = 2; + $family->page_id = $visitPage->id; + $family->save(); + + $family = new \App\Models\Family; + $family->translateOrNew('en')->title = 'Visit Us Virtually'; + $family->translateOrNew('en')->text = 'Even from afar, there\'s a host of ways to connect to our collection of art from around the world—whether you\'re seeking inspiration, community, or a little adventure.'; + $family->translateOrNew('en')->link_label = 'Learn more'; + $family->translateOrNew('en')->active = true; + $family->published = true; + $family->external_link = '/visit-us-virtually'; + $family->position = 3; + $family->page_id = $visitPage->id; + $family->save(); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + $visitPage = \App\Models\Page::where('type', 3)->first(); + + $visitPage->families()->delete(); + + $family = new \App\Models\Family; + $family->translateOrNew('en')->title = 'Families'; + $family->translateOrNew('en')->text = 'Explore family-friendly art-making activities and interactive spaces.'; + $family->translateOrNew('en')->link_label = 'See upcoming family events'; + $family->translateOrNew('en')->active = true; + $family->published = true; + $family->external_link = '/events?audience=1'; + $family->position = 1; + $family->page_id = $visitPage->id; + $family->save(); + + $family = new \App\Models\Family; + $family->translateOrNew('en')->title = 'Teens'; + $family->translateOrNew('en')->text = 'Find yourself here. Look at art. Make art. Talk about life. Meet new people. Be inspired.'; + $family->translateOrNew('en')->link_label = 'See upcoming teen events'; + $family->translateOrNew('en')->active = true; + $family->published = true; + $family->external_link = '/events?audience=4'; + $family->position = 2; + $family->page_id = $visitPage->id; + $family->save(); + + $family = new \App\Models\Family; + $family->translateOrNew('en')->title = 'Educators'; + $family->translateOrNew('en')->text = 'Explore diverse resources and dynamic professional development offerings for K–12 educators.'; + $family->translateOrNew('en')->link_label = 'See upcoming events for educators'; + $family->translateOrNew('en')->active = true; + $family->published = true; + $family->external_link = '/events?audience=6'; + $family->position = 3; + $family->page_id = $visitPage->id; + $family->save(); + } +} diff --git a/database/migrations/2020_07_14_152133_update_what_to_expect_content.php b/database/migrations/2020_07_14_152133_update_what_to_expect_content.php new file mode 100644 index 0000000000..6911414cf6 --- /dev/null +++ b/database/migrations/2020_07_14_152133_update_what_to_expect_content.php @@ -0,0 +1,113 @@ +first(); + + $visitPage->whatToExpects()->delete(); + + $whatToExpect = new \App\Models\WhatToExpect; + $whatToExpect->icon_type = 0; + $whatToExpect->translateOrNew('en')->text = 'Face coverings will be required for your entire museum visit.'; + $whatToExpect->translateOrNew('en')->active = true; + $whatToExpect->published = true; + $whatToExpect->position = 1; + $whatToExpect->page_id = $visitPage->id; + $whatToExpect->save(); + + $whatToExpect = new \App\Models\WhatToExpect; + $whatToExpect->icon_type = 1; + $whatToExpect->translateOrNew('en')->text = 'Maintain a physical distance of six-feet from staff and visitors.'; + $whatToExpect->translateOrNew('en')->active = true; + $whatToExpect->published = true; + $whatToExpect->position = 2; + $whatToExpect->page_id = $visitPage->id; + $whatToExpect->save(); + + $whatToExpect = new \App\Models\WhatToExpect; + $whatToExpect->icon_type = 2; + $whatToExpect->translateOrNew('en')->text = 'Advance ticket purchase is required. Members will be required to display digital member card using the Art Institute of Chicago mobile app.'; + $whatToExpect->translateOrNew('en')->active = true; + $whatToExpect->published = true; + $whatToExpect->position = 3; + $whatToExpect->page_id = $visitPage->id; + $whatToExpect->save(); + + $whatToExpect = new \App\Models\WhatToExpect; + $whatToExpect->icon_type = 3; + $whatToExpect->translateOrNew('en')->text = 'Anyone feeling unwell should postpone their visit for another time.'; + $whatToExpect->translateOrNew('en')->active = true; + $whatToExpect->published = true; + $whatToExpect->position = 4; + $whatToExpect->page_id = $visitPage->id; + $whatToExpect->save(); + + $whatToExpect = new \App\Models\WhatToExpect; + $whatToExpect->icon_type = 4; + $whatToExpect->translateOrNew('en')->text = 'Our checkrooms are currently closed. Pack light, and remember some items are not allowed in the galleries.'; + $whatToExpect->translateOrNew('en')->active = true; + $whatToExpect->published = true; + $whatToExpect->position = 5; + $whatToExpect->page_id = $visitPage->id; + $whatToExpect->save(); + + $whatToExpect = new \App\Models\WhatToExpect; + $whatToExpect->icon_type = 5; + $whatToExpect->translateOrNew('en')->text = 'Our amenities are temporarily limited. Service and spaces currently unavailable include restaurants, auditoria, valet service, and the Member Lounge.'; + $whatToExpect->translateOrNew('en')->active = true; + $whatToExpect->published = true; + $whatToExpect->position = 6; + $whatToExpect->page_id = $visitPage->id; + $whatToExpect->save(); + + $whatToExpect = new \App\Models\WhatToExpect; + $whatToExpect->icon_type = 6; + $whatToExpect->translateOrNew('en')->text = 'Some galleries may have limited capacity or be temporarily closed.'; + $whatToExpect->translateOrNew('en')->active = true; + $whatToExpect->published = true; + $whatToExpect->position = 7; + $whatToExpect->page_id = $visitPage->id; + $whatToExpect->save(); + + $whatToExpect = new \App\Models\WhatToExpect; + $whatToExpect->icon_type = 7; + $whatToExpect->translateOrNew('en')->text = 'Be mindful to abide by directional signage, including designated entrances and exits.'; + $whatToExpect->translateOrNew('en')->active = true; + $whatToExpect->published = true; + $whatToExpect->position = 8; + $whatToExpect->page_id = $visitPage->id; + $whatToExpect->save(); + + $whatToExpect = new \App\Models\WhatToExpect; + $whatToExpect->icon_type = 8; + $whatToExpect->translateOrNew('en')->text = 'Special exhibitions may use timed queueing systems. Check in at exhibition entrances to reserve your spot in line.'; + $whatToExpect->translateOrNew('en')->active = true; + $whatToExpect->published = true; + $whatToExpect->position = 9; + $whatToExpect->page_id = $visitPage->id; + $whatToExpect->save(); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + $visitPage = \App\Models\Page::where('type', 3)->first(); + + $visitPage->whatToExpects()->delete(); + } +} diff --git a/frontend/icons/caution.svg b/frontend/icons/caution.svg new file mode 100644 index 0000000000..cfe43eb51a --- /dev/null +++ b/frontend/icons/caution.svg @@ -0,0 +1,3 @@ + diff --git a/frontend/icons/face-coverings.svg b/frontend/icons/face-coverings.svg new file mode 100644 index 0000000000..e236b2401c --- /dev/null +++ b/frontend/icons/face-coverings.svg @@ -0,0 +1,14 @@ + diff --git a/frontend/icons/floor-icon.svg b/frontend/icons/floor-icon.svg new file mode 100644 index 0000000000..c9884ad873 --- /dev/null +++ b/frontend/icons/floor-icon.svg @@ -0,0 +1,3 @@ + diff --git a/frontend/icons/mobile-ticket.svg b/frontend/icons/mobile-ticket.svg new file mode 100644 index 0000000000..6a670c4cf8 --- /dev/null +++ b/frontend/icons/mobile-ticket.svg @@ -0,0 +1,3 @@ + diff --git a/frontend/icons/no-checkroom.svg b/frontend/icons/no-checkroom.svg new file mode 100644 index 0000000000..3940cfe3df --- /dev/null +++ b/frontend/icons/no-checkroom.svg @@ -0,0 +1,30 @@ + diff --git a/frontend/icons/no-dining.svg b/frontend/icons/no-dining.svg new file mode 100644 index 0000000000..27845e074b --- /dev/null +++ b/frontend/icons/no-dining.svg @@ -0,0 +1,18 @@ + diff --git a/frontend/icons/physical-distancing.svg b/frontend/icons/physical-distancing.svg new file mode 100644 index 0000000000..fdbc172cd4 --- /dev/null +++ b/frontend/icons/physical-distancing.svg @@ -0,0 +1,9 @@ + diff --git a/frontend/icons/showing-symptoms.svg b/frontend/icons/showing-symptoms.svg new file mode 100644 index 0000000000..ebecd85c4d --- /dev/null +++ b/frontend/icons/showing-symptoms.svg @@ -0,0 +1,29 @@ + diff --git a/frontend/icons/virtual-queue.svg b/frontend/icons/virtual-queue.svg new file mode 100644 index 0000000000..5279d1694f --- /dev/null +++ b/frontend/icons/virtual-queue.svg @@ -0,0 +1,6 @@ + diff --git a/frontend/js/app.js b/frontend/js/app.js index aec7dc7ab7..4d9511b36d 100755 --- a/frontend/js/app.js +++ b/frontend/js/app.js @@ -135,9 +135,12 @@ if (typeof console === 'undefined') { }; } -if ('scrollRestoration' in history) { - history.scrollRestoration = 'manual'; -} +document.addEventListener('ajaxPageLoad:complete', function _setScrollRestoration(){ + if ('scrollRestoration' in history) { + history.scrollRestoration = 'manual'; + document.removeEventListener('ajaxPageLoad:complete', _setScrollRestoration); + } +}, false); // polyfil .closest if (window.Element && !Element.prototype.closest) { diff --git a/frontend/js/behaviors/magazineHeader.js b/frontend/js/behaviors/magazineHeader.js index 6f67bbd7b9..34e0f0c6dc 100644 --- a/frontend/js/behaviors/magazineHeader.js +++ b/frontend/js/behaviors/magazineHeader.js @@ -19,7 +19,7 @@ const magazineHeader = function(container){ let idleTimeout = 2000; let autoTimer; - let autoTimeout = 4000; + let autoTimeout = 5000; let activeClass = 'is-slideshow-active'; diff --git a/frontend/js/behaviors/triggerMediaModal.js b/frontend/js/behaviors/triggerMediaModal.js index 2eb9a7f3a5..48ca7b8a2e 100644 --- a/frontend/js/behaviors/triggerMediaModal.js +++ b/frontend/js/behaviors/triggerMediaModal.js @@ -25,13 +25,20 @@ const triggerMediaModal = function(container) { 'eventAction': container.dataset.title+' - Modal 3D' }); } - if(container.parentNode.dataset.type == 'module360' && container.dataset.title) { + else if (container.parentNode.dataset.type == 'module360' && container.dataset.title) { triggerCustomEvent(document, 'gtm:push', { 'event': '360-open-modal', 'eventCategory': 'in-page', 'eventAction': container.dataset.title+' - Modal 360' }); } + else { + triggerCustomEvent(document, 'gtm:push', { + 'event': container.parentNode.dataset.gtmEvent || (container.parentNode.dataset.type + '-open-modal'), + 'eventCategory': container.parentNode.dataset.gtmEventCategory || 'in-page', + 'eventAction': container.parentNode.dataset.gtmEventAction || (container.parentNode.dataset.title+' - ' + container.parentNode.dataset.type) + }); + } } } } diff --git a/frontend/scss/molecules/_m-article-header.scss b/frontend/scss/molecules/_m-article-header.scss index 4ea32df4f6..d22e71e3d1 100644 --- a/frontend/scss/molecules/_m-article-header.scss +++ b/frontend/scss/molecules/_m-article-header.scss @@ -760,6 +760,7 @@ .f-subheading-1, .f-subheading-2, + .f-subheading-3, a { // text-shadow: 0 0 1px rgba(0, 0, 0, 0.5); color: $color__text--title-contrast; @@ -784,7 +785,7 @@ left: 0; right: 0; bottom: 0; - background-color: rgba(0,0,0,0.3); + background-color: rgba(0,0,0,0.2); z-index: 2; } @@ -955,10 +956,6 @@ transition: opacity .25s; opacity: 0; - &:first-child { - opacity: 1; - } - &.is-slideshow-active { opacity: 1; } @@ -989,13 +986,13 @@ .m-article-header__pip { display: inline-block; - color: $color__text--title-contrast; + color: $color__black--40; cursor: pointer; margin-right: 4px; &.is-slideshow-active { - color: $color__black--40; + color: $color__text--title-contrast; } .icon--circle { @@ -1016,10 +1013,21 @@ color: white; } + $magazine-intro-width-basis: ( + // derived from .o-grid-listing--2-col\@foobar + xsmall: colspan(grid-cols-to-colspan(2, 58, 6), 'xsmall'), + small: colspan(grid-cols-to-colspan(2), 'small'), + medium: colspan(grid-cols-to-colspan(2), 'medium'), + // derived from .o-grid-listing--2-col\@foobar + large: colspan(20.5, 'large'), + xlarge: colspan(20.5, 'xlarge'), + ); + .m-article-header__intro { @each $name, $point in $breakpoints { @include breakpoint('#{$name}') { width: map-get($magazine-intro-width, $name); + margin-right: calc(#{map-get($magazine-intro-width-basis, $name)} - #{map-get($magazine-intro-width, $name)}); } } @@ -1045,7 +1053,7 @@ @each $name, $point in ('small', 'medium', 'large', 'xlarge') { @include breakpoint('#{$name}') { - left: #{100% - map-get($magazine-intro-width, $name)}; + left: calc(100% - #{map-get($magazine-intro-width-basis, $name)}); bottom: #{map-get($journal-header-padding, $name) + $magazine-controls-offset}; } } @@ -1089,7 +1097,6 @@ .m-article-header__info-trigger { @each $name, $point in $breakpoints { @include breakpoint('#{$name}') { - right: colspan(1, $name); bottom: #{map-get($journal-header-padding, $name) + 20px}; } } @@ -1100,7 +1107,6 @@ @each $name, $point in $breakpoints { @include breakpoint('#{$name}') { - right: colspan(1, $name); bottom: #{map-get($journal-header-padding, $name) + 20px + $button-vertical-offset}; } } diff --git a/frontend/scss/molecules/_m-author.scss b/frontend/scss/molecules/_m-author.scss index 4342ebeb1e..8142e16ca8 100644 --- a/frontend/scss/molecules/_m-author.scss +++ b/frontend/scss/molecules/_m-author.scss @@ -62,6 +62,11 @@ .m-author .f-secondary { @include tucked-margin-top($f-secondary, ('xsmall': 12, 'medium+': 12)); flex: 0 0 auto; + max-width: 100%; +} + +.m-author .m-author__img + .f-secondary { + max-width: calc(100% - 52px); } .m-author a { diff --git a/frontend/scss/molecules/_m-cta-banner.scss b/frontend/scss/molecules/_m-cta-banner.scss index 6805e14556..7775d9b680 100644 --- a/frontend/scss/molecules/_m-cta-banner.scss +++ b/frontend/scss/molecules/_m-cta-banner.scss @@ -1,5 +1,9 @@ - .m-cta-banner { + display: block; + position: relative; + height: 240px; + overflow: hidden; + margin-top: 36px; & + * { @@ -15,146 +19,166 @@ } @include breakpoint('medium+') { + height: 200px; margin-top: 60px; & + * { margin-top: 60px; } } -} -.m-cta-banner__link { - display: block; - position: relative; - height: 240px; - overflow: hidden; + .m-cta-banner__txt { + position: absolute; + top: 46px; + left: 0; + right: 0; + z-index: 3; + + display: flex; + flex-direction: column; + justify-content: center; + + @include breakpoint('medium+') { + top: 0; + bottom: 0; + padding-right: colspan(20, medium); + } - @include breakpoint('small+') { - height: 200px; + @include breakpoint('large+') { + padding-right: colspan(13, large); + } + + @include breakpoint('xlarge') { + padding-right: colspan(11, xlarge); + } } -} -.m-cta-banner__link::after { - content: ''; - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - z-index: 2; - background-color: rgba(0,0,0,0.2); -} + .m-cta-banner__action { + position: absolute; + right: 0; + bottom: 0; + left: auto; + bottom: auto; + top: 96px; + width: 100%; -.m-cta-banner__img { - z-index: 1; -} + @include breakpoint('medium+') { + top: 76px; + width: colspan(14, medium); + } -.m-cta-banner__img, -.m-cta-banner__img img, -.m-cta-banner__img video { - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - width: 100%; - height: 100%; -} + @include breakpoint('large+') { + width: colspan(10, large); + } -.m-cta-banner--parallax .m-cta-banner__img { - top: -100px; - height: 340px; + @include breakpoint('xlarge') { + width: colspan(8, xlarge); + } - @include breakpoint('small+') { - height: 300px; + .btn { + display: block; + width: 100%; + + .m-cta-banner__link:hover &, + .m-cta-banner__link:focus:hover & { + border-color: $color__link--accent-hover; + background-color: $color__link--accent-hover; + color: $color__white; + } + } } -} -.m-cta-banner__img img, -.m-cta-banner__img video { - @include objectFitFix; - object-fit: cover; -} + .m-cta-banner__title.f-module-title-2 { + @include untuck(); + } -.m-cta-banner__txt { - position: absolute; - left: 20px; - right: 20px; - top: 0; - bottom: 20px; - z-index: 3; + .m-cta-banner__msg.f-list-2 { + @include untuck(); - @include breakpoint('small+') { - top: 20px; - left: colspan(3, small); - right: colspan(3, small); - padding-right: colspan(17, small); - } + margin-top: 16px; - @include breakpoint('medium+') { - left: colspan(3, medium); - right: colspan(3, medium); - padding-right: colspan(20, medium); + @include breakpoint('large+') { + margin-top: 24x + } } +} - @include breakpoint('large+') { - left: colspan(3, large); - right: colspan(3, large); - padding-right: colspan(13, large); +.m-cta-banner--with-image { + &::after { + content: ''; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: 2; + background-color: rgba(0,0,0,0.2); } - @include breakpoint('xlarge') { - left: colspan(3, xlarge); - right: colspan(3, xlarge); - padding-right: colspan(11, xlarge); - } -} + .m-cta-banner__img { + z-index: 1; -.m-cta-banner__title, -.m-cta-banner__msg { - color: $color__text--title-contrast; -} + left: 0; + right: 0; + bottom: 0; + width: 100%; + height: 100%; -.m-cta-banner__title.f-module-title-2 { - @include tucked-margin-top($f-module-title-2, ('xsmall': 40, 'small+': 48, 'large+': 60)); -} + // Position for parallax: + position: absolute; -.m-cta-banner__msg.f-list-2 { - @include tucked-margin-top($f-list-2, ('xsmall': 40, 'small+': 40, 'large+': 48)); -} + top: -100px; + height: 340px; -.m-cta-banner__action { - position: absolute; - left: 0; - right: 0; - bottom: 0; + @include breakpoint('small+') { + height: 300px; + } - @include breakpoint('small+') { - left: auto; - top: 56px; - bottom: auto; - width: colspan(14, small); - } + img, video { + left: 0; + right: 0; + top: 0; + bottom: 0; + width: 100%; + height: 100%; - @include breakpoint('medium+') { - width: colspan(14, medium); + @include objectFitFix; + object-fit: cover; + } } - @include breakpoint('large+') { - width: colspan(10, large); - } + .m-cta-banner__txt { + left: 20px; + right: 20px; + + @include breakpoint('small+') { + left: colspan(3, small); + right: colspan(3, small); + } - @include breakpoint('xlarge') { - width: colspan(8, xlarge); + @include breakpoint('medium+') { + left: colspan(3, medium); + right: colspan(3, medium); + } + + @include breakpoint('large+') { + left: colspan(3, large); + right: colspan(3, large); + } + + @include breakpoint('xlarge') { + left: colspan(3, xlarge); + right: colspan(3, xlarge); + } } -} -.m-cta-banner__action .btn { - display: block; - width: 100%; + .m-cta-banner__title, + .m-cta-banner__msg { + color: $color__text--title-contrast; + } - .m-cta-banner__link:hover &, - .m-cta-banner__link:focus:hover & { + .m-cta-banner__link:hover .btn, + .m-cta-banner__link:focus:hover .btn { border-color: $color__link--accent-hover; background-color: $color__link--accent-hover; color: $color__white; diff --git a/frontend/scss/molecules/_m-directions-block.scss b/frontend/scss/molecules/_m-directions-block.scss index 7c9ca64bdd..038a93b195 100644 --- a/frontend/scss/molecules/_m-directions-block.scss +++ b/frontend/scss/molecules/_m-directions-block.scss @@ -49,6 +49,18 @@ width: colspan(18, xlarge); margin-left: colspan(2, xlarge); } + + h3 { + @include breakpoint('small+') { + margin-top: 11px; + } + @include breakpoint('medium+') { + margin-top: 16px; + } + @include breakpoint('large+') { + margin-top: 0; + } + } } .m-directions-block__links { diff --git a/frontend/scss/molecules/_m-listing.scss b/frontend/scss/molecules/_m-listing.scss index 36bbfe1d31..41ad326037 100644 --- a/frontend/scss/molecules/_m-listing.scss +++ b/frontend/scss/molecules/_m-listing.scss @@ -122,6 +122,10 @@ padding-bottom: percentage(4 / 3); // 3:4 } +.m-listing__img--icon::before { + padding-bottom: 0; // 16:9 +} + .m-listing--hover-bar .m-listing__img::after { content: ''; position: absolute; @@ -1991,9 +1995,7 @@ $f-audio-subtitle: generate-font-obj( @include untuck; margin-bottom: 20px; - .f-tag { - text-transform: initial; - letter-spacing: 0.04em; + .f-secondary { color: $color__black--54; } } @@ -2195,6 +2197,7 @@ $f-audio-subtitle: generate-font-obj( // variant for Member Magazine .m-listing--magazine { + border-color: $color__rules--primary; .m-listing__meta > .f-tag { color: $color__plum; } @@ -2202,14 +2205,49 @@ $f-audio-subtitle: generate-font-obj( // variant for author pages .m-listing--author { - .m-listing__img img { - transition: none; + border-color: $color__rules--primary; + .m-listing__link:hover, + .m-listing__link:focus { + .m-listing__img img { + transform: none; + } } } -.m-listing--author:hover, -.m-listing--author:focus { - .m-listing__img img { - transform: none; +// variant for visit page +.m-listing--icon { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + align-items: center; + + .m-listing__img { + @include breakpoint('small+') { + width: initial; + align-self: initial; + } + } + + svg { + width: 100px; + height: 100px; + margin-right: 20px; + + @include breakpoint('large') { + width: 120px; + height: 120px; + margin-right: 40px; + } + } + + .m-listing__meta { + flex-basis: 0; + min-height: initial; + padding: 20px 0; + + .f-body { + @include untuck(); + margin-top: 0; + } } } diff --git a/frontend/scss/molecules/_m-mini-promo.scss b/frontend/scss/molecules/_m-mini-promo.scss index e9f7f801a3..5d79249d0c 100644 --- a/frontend/scss/molecules/_m-mini-promo.scss +++ b/frontend/scss/molecules/_m-mini-promo.scss @@ -4,14 +4,11 @@ display: flex; flex-flow: row-reverse wrap; align-items: flex-start; - margin-top: 60px; + margin-top: 30px; padding-top: .2px; - @include breakpoint('small') { - margin-top: 40px; - } - @include breakpoint('small+') { + margin-top: 40px; flex-flow: row wrap; } @@ -82,9 +79,7 @@ padding-left: 0; @include breakpoint('small+') { - width: colspan(13, small); margin-top: 40px; - margin-left: colspan(2, small); } @include breakpoint('medium+') { diff --git a/frontend/scss/molecules/_m-table.scss b/frontend/scss/molecules/_m-table.scss index 6fc3f79884..13f4ecbe79 100644 --- a/frontend/scss/molecules/_m-table.scss +++ b/frontend/scss/molecules/_m-table.scss @@ -67,7 +67,6 @@ Intended for very simple m-tables.. .m-table table { width: 100%; - min-width: 500px; border-collapse: collapse; } @@ -83,6 +82,15 @@ Intended for very simple m-tables.. font-weight: normal; text-align: left; white-space: nowrap; + + @include breakpoint('xsmall') { + padding-right: 7px; + } +} + +.m-table.m-table--minimal th, +.m-table.m-table--minimal td { + border-top: 0; } .m-table th:first-child, @@ -90,6 +98,12 @@ Intended for very simple m-tables.. padding-left: 0; } +.m-table.m-table--minimal tr:last-child th, +.m-table.m-table--minimal tr:last-child td{ + border-bottom: 0; +} + + .m-table td[rowspan], .m-table td[colspan] { background: $color__bg--primary; diff --git a/frontend/scss/organisms/_o-artist-bio.scss b/frontend/scss/organisms/_o-artist-bio.scss index 9ff52b1703..5b0654880d 100644 --- a/frontend/scss/organisms/_o-artist-bio.scss +++ b/frontend/scss/organisms/_o-artist-bio.scss @@ -6,14 +6,12 @@ $bioBreakpoints: ( .o-artist-bio { position: relative; margin-top: 24px; + padding-top: 24px; @include breakpoint('small+') { margin-top: 40px; } - @include breakpoint('large+') { - padding-top: 40px; - } } .o-artist-bio::before { @@ -29,15 +27,22 @@ $bioBreakpoints: ( .o-artist-bio__inner { display: flex; position: relative; - flex-flow: row wrap; + flex-flow: column wrap; @each $name, $point in $bioBreakpoints { @include breakpoint('#{$name}') { + flex-flow: row wrap; margin-left: colspan(2, $name, 0, true); } } } +.o-author-bio .o-artist-bio__inner { + @include breakpoint('medium') { + flex-flow: row wrap; + } +} + .o-artist-bio__main, .o-artist-bio__image { width: 100%; @@ -50,17 +55,34 @@ $bioBreakpoints: ( } .o-author-bio .o-artist-bio__image { - @each $name, $point in $bioBreakpoints { + @each $name, $point in ('xsmall', 'small') { + @include breakpoint('#{$name}') { + width: 300px; + align-self: center; + } + } + + @each $name, $point in ('medium', 'large', 'xlarge') { @include breakpoint('#{$name}') { - width: calc(#{colspan(grid-cols-to-colspan(2), $name)} * .5); + // width: calc(#{colspan(grid-cols-to-colspan(2), $name)} * .5); + width: 300px; } } + + .m-media__img { + background: none; + } + + img { + border-radius: 50%; + } } .o-author-bio .o-artist-bio__main { - @each $name, $point in $bioBreakpoints { + @each $name, $point in ('medium', 'large', 'xlarge') { @include breakpoint('#{$name}') { - width: calc(#{colspan(grid-cols-to-colspan(2), $name)} * 1.5); + width: calc(#{colspan(58, $name)} - 300px - #{colspan(2, $name)}); + margin-left: colspan(2, #{$name}); } } } @@ -68,7 +90,7 @@ $bioBreakpoints: ( .o-author-bio .o-artist-bio__main .o-artist-bio__body { margin-top: 24px; - @include breakpoint('large+') { + @include breakpoint('medium+') { margin-top: 0; } } @@ -96,6 +118,17 @@ $bioBreakpoints: ( @extend %f-caption; margin-top: 8px; color: $color__text--secondary; + + p a { + @include text-underline(20px, $color__rules--primary); + padding-bottom: 1px; + color: $color__text--accent; + } + + p a:hover, + p a:focus { + @include text-underline(20px, $color__rules--brand); + } } .o-artist-bio__main { diff --git a/frontend/scss/organisms/_o-grid-listing.scss b/frontend/scss/organisms/_o-grid-listing.scss index da11639fe2..2519fe2f12 100644 --- a/frontend/scss/organisms/_o-grid-listing.scss +++ b/frontend/scss/organisms/_o-grid-listing.scss @@ -80,7 +80,8 @@ Basic flexed set up } @else { margin-left: colspan(2, #{$name}); } - border-top: 0 none; + border-top-style: none; + border-top-width: 0; } } } @@ -902,7 +903,8 @@ Draws boxes around each grid item @each $name, $point in $breakpoints { @include breakpoint('#{$name}') { &[class*="col@#{$name}"] > * { - border-top: thin solid; + border-top-style: solid; + border-top-width: thin; } } } diff --git a/frontend/scss/organisms/_o-visit.scss b/frontend/scss/organisms/_o-visit.scss index a69d98b4c0..35b6057ec3 100644 --- a/frontend/scss/organisms/_o-visit.scss +++ b/frontend/scss/organisms/_o-visit.scss @@ -10,6 +10,38 @@ } } +.o-visit .m-cta-banner { + margin-top: 0; + + & + * { + margin-top: 0; + } + + @include breakpoint('small+') { + margin-top: 0; + + & + * { + margin-top: 0; + } + } + + @include breakpoint('medium+') { + margin-top: 0; + + & + * { + margin-top: 0; + } + } + + + .m-title-bar { + margin-top: 0; + } +} + +.o-visit hr { + border-top: 1px solid $color__rules--quaternary; +} + .o-visit .m-title-bar { margin-top: 52px; diff --git a/frontend/scss/setup/_icons.scss b/frontend/scss/setup/_icons.scss index b49b6709ea..453cd91d73 100755 --- a/frontend/scss/setup/_icons.scss +++ b/frontend/scss/setup/_icons.scss @@ -34,6 +34,9 @@ More variants maybe added later, so anything thats not a 16px square SVG needs a + @@ -64,9 +67,15 @@ More variants maybe added later, so anything thats not a 16px square SVG needs a + + @@ -124,9 +133,18 @@ More variants maybe added later, so anything thats not a 16px square SVG needs a + + + @@ -136,6 +154,9 @@ More variants maybe added later, so anything thats not a 16px square SVG needs a + @@ -175,6 +196,9 @@ More variants maybe added later, so anything thats not a 16px square SVG needs a + @@ -187,6 +211,9 @@ More variants maybe added later, so anything thats not a 16px square SVG needs a + @@ -264,6 +291,11 @@ The cloud front server caches icons, if you add a new icon, or edit an icon, you height: 24px; } +.icon--caution { + width: 200px; + height: 200px; +} + .icon--check { width: 16px; height: 16px; @@ -314,11 +346,21 @@ The cloud front server caches icons, if you add a new icon, or edit an icon, you height: 24px; } +.icon--face-coverings { + width: 200px; + height: 200px; +} + .icon--filter--24 { width: 24px; height: 24px; } +.icon--floor-icon { + width: 200px; + height: 200px; +} + .icon--footer_map_120x92 { width: 120px; height: 92px; @@ -414,11 +456,26 @@ The cloud front server caches icons, if you add a new icon, or edit an icon, you height: 56.9px; } +.icon--mobile-ticket { + width: 200px; + height: 200px; +} + .icon--new-window { width: 16px; height: 16px; } +.icon--no-checkroom { + width: 200px; + height: 200px; +} + +.icon--no-dining { + width: 200px; + height: 200px; +} + .icon--no-image { width: 80px; height: 56px; @@ -434,6 +491,11 @@ The cloud front server caches icons, if you add a new icon, or edit an icon, you height: 16px; } +.icon--physical-distancing { + width: 200px; + height: 200px; +} + .icon--play { width: 16px; height: 16px; @@ -499,6 +561,11 @@ The cloud front server caches icons, if you add a new icon, or edit an icon, you height: 24px; } +.icon--showing-symptoms { + width: 200px; + height: 200px; +} + .icon--slideshow--24 { width: 24px; height: 24px; @@ -519,6 +586,11 @@ The cloud front server caches icons, if you add a new icon, or edit an icon, you height: 24px; } +.icon--virtual-queue { + width: 200px; + height: 200px; +} + .icon--zoom--24 { width: 24px; height: 24px; diff --git a/frontend/scss/setup/_typography.scss b/frontend/scss/setup/_typography.scss index 5c80c38aac..d0b14b3a0d 100755 --- a/frontend/scss/setup/_typography.scss +++ b/frontend/scss/setup/_typography.scss @@ -393,6 +393,42 @@ $f-subheading-1: generate-font-obj( /*** +f-subheading-3 + +``` +The quick brown fox,
jumps over the lazy dog
The Member Magazine is a curated selection of exhibitions, events, and behind-the-scenes at the Art Institute of Chicago. The magazine comes out 6 times a year.
+The Art Institute magazine is a quarterly publication offering members an in-depth look at our collection, exhibitions, and ongoing initiatives.
Become a member or renew your membership.
+Become a member or renew your membership.