<div class="show-filter-btn js-show-filter-btn">
<button class="btn btn--base btn--plain filter-btn js-filter-btn">
<svg class="icon icon--sort">
<use xlink:href="/assets/icons/sprite-sheet.svg#sort"></use>
</svg>
<span class="title-highlight">Show Type</span>
<svg class="icon icon--arrow-bottom">
<use xlink:href="/assets/icons/sprite-sheet.svg#arrow-bottom"></use>
</svg>
</button>
<div class="show-filter__filters js-filter js-tabIndex" aria-hidden="true" tabindex="-1">
<button class="btn btn--close js-btn-close">
<svg class="icon icon--close">
<use xlink:href="/assets/icons/sprite-sheet.svg#close"></use>
</svg>
<span class="visually-hidden">Close Filter</span>
</button>
<div class="section-title">
<svg class="icon icon--map-pin">
<use xlink:href="/assets/icons/sprite-sheet.svg#map-pin"></use>
</svg>
<h2 id="area" class="title-highlight">Area</h2>
</div>
<ul class="show-filter__list js-tabIndex" aria-labelledby="area" tabindex="-1">
<li class="show-filter-list-item js-tabIndex" tabindex="-1">
<div class="form-input">
<div class="validation validation--radio">
<input type="radio" id="all-nyc" name="location" class="radio validation" checked>
<div class="radio-label-container">
<label for="all-nyc" class="label label--radio">All NYC Shows (157)</label>
</div>
</div>
</div>
</li>
<li class="show-filter-list-item js-tabIndex" tabindex="-1">
<div class="form-input">
<div class="validation validation--radio">
<input type="radio" id="broadway" name="location" class="radio validation">
<div class="radio-label-container">
<label for="broadway" class="label label--radio">Broadway (112)</label>
</div>
</div>
</div>
</li>
<li class="show-filter-list-item js-tabIndex" tabindex="-1">
<div class="form-input">
<div class="validation validation--radio">
<input type="radio" id="off-broadway" name="location" class="radio validation">
<div class="radio-label-container">
<label for="off-broadway" class="label label--radio">Off-Broadway (32)</label>
</div>
</div>
</div>
</li>
<li class="show-filter-list-item js-tabIndex" tabindex="-1">
<div class="form-input">
<div class="validation validation--radio">
<input type="radio" id="off-off-broadway" name="location" class="radio validation">
<div class="radio-label-container">
<label for="off-off-broadway" class="label label--radio">Off-Off-Broadway (13)</label>
</div>
</div>
</div>
</li>
</ul>
<div class="section-title">
<svg class="icon icon--sort">
<use xlink:href="/assets/icons/sprite-sheet.svg#sort"></use>
</svg>
<h2 id="genre" class="title-highlight">Genre</h2>
</div>
<ul class="show-filter__list js-tabIndex" aria-labelledby="genre" tabindex="-1">
<li class="show-filter-list-item js-tabIndex" tabindex="-1">
<div class="form-input">
<div class="validation validation--radio">
<input type="radio" id="all-genres" name="genre" class="radio validation" checked>
<div class="radio-label-container">
<label for="all-genres" class="label label--radio">All Genres</label>
</div>
</div>
</div>
</li>
<li class="show-filter-list-item js-tabIndex" tabindex="-1">
<div class="form-input">
<div class="validation validation--radio">
<input type="radio" id="benefit" name="genre" class="radio validation">
<div class="radio-label-container">
<label for="benefit" class="label label--radio">Benefit (1)</label>
</div>
</div>
</div>
</li>
<li class="show-filter-list-item js-tabIndex" tabindex="-1">
<div class="form-input">
<div class="validation validation--radio">
<input type="radio" id="cabaret" name="genre" class="radio validation">
<div class="radio-label-container">
<label for="cabaret" class="label label--radio">Cabaret (2)</label>
</div>
</div>
</div>
</li>
<li class="show-filter-list-item js-tabIndex" tabindex="-1">
<div class="form-input">
<div class="validation validation--radio">
<input type="radio" id="comedy" name="genre" class="radio validation">
<div class="radio-label-container">
<label for="comedy" class="label label--radio">Comedy (5)</label>
</div>
</div>
</div>
</li>
<li class="show-filter-list-item js-tabIndex" tabindex="-1">
<div class="form-input">
<div class="validation validation--radio">
<input type="radio" id="drama" name="genre" class="radio validation">
<div class="radio-label-container">
<label for="drama" class="label label--radio">Drama (20)</label>
</div>
</div>
</div>
</li>
<li class="show-filter-list-item js-tabIndex" tabindex="-1">
<div class="form-input">
<div class="validation validation--radio">
<input type="radio" id="family-kids" name="genre" class="radio validation">
<div class="radio-label-container">
<label for="family-kids" class="label label--radio">Family (10)</label>
</div>
</div>
</div>
</li>
<li class="show-filter-list-item js-tabIndex" tabindex="-1">
<div class="form-input">
<div class="validation validation--radio">
<input type="radio" id="festival" name="genre" class="radio validation">
<div class="radio-label-container">
<label for="festival" class="label label--radio">Festival (2)</label>
</div>
</div>
</div>
</li>
<li class="show-filter-list-item js-tabIndex" tabindex="-1">
<div class="form-input">
<div class="validation validation--radio">
<input type="radio" id="magic-show" name="genre" class="radio validation">
<div class="radio-label-container">
<label for="magic-show" class="label label--radio">Magic Show (1)</label>
</div>
</div>
</div>
</li>
<li class="show-filter-list-item js-tabIndex" tabindex="-1">
<div class="form-input">
<div class="validation validation--radio">
<input type="radio" id="musical" name="genre" class="radio validation">
<div class="radio-label-container">
<label for="musical" class="label label--radio">Musical (30)</label>
</div>
</div>
</div>
</li>
<li class="show-filter-list-item js-tabIndex" tabindex="-1">
<div class="form-input">
<div class="validation validation--radio">
<input type="radio" id="mature" name="genre" class="radio validation">
<div class="radio-label-container">
<label for="mature" class="label label--radio">Mature (5)</label>
</div>
</div>
</div>
</li>
<li class="show-filter-list-item js-tabIndex" tabindex="-1">
<div class="form-input">
<div class="validation validation--radio">
<input type="radio" id="opera" name="genre" class="radio validation">
<div class="radio-label-container">
<label for="opera" class="label label--radio">Opera (3)</label>
</div>
</div>
</div>
</li>
<li class="show-filter-list-item js-tabIndex" tabindex="-1">
<div class="form-input">
<div class="validation validation--radio">
<input type="radio" id="play" name="genre" class="radio validation">
<div class="radio-label-container">
<label for="play" class="label label--radio">Play (42)</label>
</div>
</div>
</div>
</li>
</ul>
<button class="btn btn--base btn--primary show-filter-apply">
Apply
</button>
</div>
</div>
<div class="show-filter-btn js-show-filter-btn">
<button class="btn btn--base btn--plain filter-btn{{#if class}} {{class}}{{/if}}"{{#if disabled}} disabled{{/if}}>
{{render '@icons--calendar' modifiers merge=true}}
<span class="title-highlight">{{btn-text}}</span>
{{#if filter}}
{{render '@icons--arrow-bottom'}}
{{/if}}
</button>
{{#if filter}}
<div class="show-filter__filters js-filter js-tabIndex" aria-hidden="true" tabindex="-1">
{{render '@buttons--close' close-button-modifiers merge=true}}
{{#if list}}
{{#each list}}
{{render '@section-title' list-title merge=true}}
<ul class="show-filter__list js-tabIndex"{{#if list-title.aria-id}} aria-labelledby="{{list-title.aria-id}}"{{/if}} tabindex="-1">
{{#each list-item}}
{{#if list-item}}
<li class="show-filter-list-item js-tabIndex" tabindex="-1">
{{render '@radio' list-modifiers merge=true}}
</li>
{{/if}}
{{/each}}
</ul>
{{/each}}
{{/if}}
{{#if date}}
{{render '@section-title' date-title merge=true}}
<div class="date-filters js-tabIndex" tabindex="-1">
<div class="date-filters__user">
<div class="date-filters__pickers">
{{render '@input' date-from-modifiers merge=true}}
{{render '@input' date-to-modifiers merge=true}}
</div>
<ul class="show-filter__list js-tabIndex"{{#if aria-label}} aria-label="{{aria-label}}"{{/if}} tabindex="-1">
{{#each date-list-item}}
<li class="show-filter-list-item show-filter-list-item--full js-tabIndex" tabindex="-1">
{{render '@radio' date-modifiers merge=true}}
</li>
{{/each}}
</ul>
</div>
<div class="date-picker">
{{render '@date-picker'}}
</div>
</div>
{{/if}}
{{render '@buttons' btn-apply-modifiers merge=true}}
</div>
{{/if}}
</div>
{
"filter": true,
"class": "js-filter-btn",
"btn-text": "Show Type",
"modifiers": {
"modifier": "sort"
},
"close-button-modifiers": {
"label-menu-close": "Close Filter"
},
"btn-apply-modifiers": {
"modifier": "primary show-filter-apply",
"buttonValue": "Apply"
},
"list": [
{
"list-title": {
"title": "Area",
"aria-id": "area",
"icon": {
"modifier": "map-pin"
}
},
"list-item": [
{
"list-item": true,
"list-modifiers": {
"label": "All NYC Shows (157)",
"name": "location",
"id": "all-nyc",
"type-active": "checked"
}
},
{
"list-item": true,
"list-modifiers": {
"label": "Broadway (112)",
"name": "location",
"id": "broadway"
}
},
{
"list-item": true,
"list-modifiers": {
"label": "Off-Broadway (32)",
"name": "location",
"id": "off-broadway"
}
},
{
"list-item": true,
"list-modifiers": {
"label": "Off-Off-Broadway (13)",
"name": "location",
"id": "off-off-broadway"
}
}
]
},
{
"list-title": {
"title": "Genre",
"aria-id": "genre",
"icon": {
"modifier": "sort"
}
},
"list-item": [
{
"list-item": true,
"list-modifiers": {
"label": "All Genres",
"name": "genre",
"id": "all-genres",
"type-active": "checked"
}
},
{
"list-item": true,
"list-modifiers": {
"label": "Benefit (1)",
"name": "genre",
"id": "benefit"
}
},
{
"list-item": true,
"list-modifiers": {
"label": "Cabaret (2)",
"name": "genre",
"id": "cabaret"
}
},
{
"list-item": true,
"list-modifiers": {
"label": "Comedy (5)",
"name": "genre",
"id": "comedy"
}
},
{
"list-item": true,
"list-modifiers": {
"label": "Drama (20)",
"name": "genre",
"id": "drama"
}
},
{
"list-item": true,
"list-modifiers": {
"label": "Family (10)",
"name": "genre",
"id": "family-kids"
}
},
{
"list-item": true,
"list-modifiers": {
"label": "Festival (2)",
"name": "genre",
"id": "festival"
}
},
{
"list-item": true,
"list-modifiers": {
"label": "Magic Show (1)",
"name": "genre",
"id": "magic-show"
}
},
{
"list-item": true,
"list-modifiers": {
"label": "Musical (30)",
"name": "genre",
"id": "musical"
}
},
{
"list-item": true,
"list-modifiers": {
"label": "Mature (5)",
"name": "genre",
"id": "mature"
}
},
{
"list-item": true,
"list-modifiers": {
"label": "Opera (3)",
"name": "genre",
"id": "opera"
}
},
{
"list-item": true,
"list-modifiers": {
"label": "Play (42)",
"name": "genre",
"id": "play"
}
}
]
}
]
}
/**
* @overview Show Filter interactions. Currently used on the Guide Page.
* @module Show Filter.js
*/
const showFilter = document.querySelector(`.js-show-filter-btn`);
const open = {'aria-hidden':'false', 'tabIndex': '1'};
const close = {'aria-hidden':'true', 'tabIndex': '-1'};
if (showFilter) {
const showFilterContainer = showFilter.parentElement;
const showFilterBtns = document.querySelectorAll(`.js-filter-btn`);
const showFilterCloseBtns = document.querySelectorAll(`.js-btn-close`);
showFilterBtns.forEach((showFilterBtn) => {
const filterPanel = showFilterBtn.nextElementSibling;
const indexChildren = filterPanel.querySelectorAll(`.js-tabIndex`);
const firstInput = filterPanel.getElementsByTagName(`input`)[0];
showFilterBtn.addEventListener(`click`, () => {
if (showFilterBtn.classList.contains(`is-open`)) {
closePanels(showFilterContainer);
}
else {
closePanels(showFilterContainer);
setAttributes(filterPanel, open);
alterIndex(indexChildren, `0`);
showFilterBtn.classList.add(`is-open`);
firstInput.focus();
}
});
});
const alterIndex = (els, index) => {
els.forEach((el) => {
el.setAttribute(`tabIndex`, index);
});
};
const setAttributes = (el, state) => {
Object.keys(state).forEach((key) => {
el.setAttribute(key,state[key]);
});
};
const closePanels = (el) => {
const openedPanel = el.querySelector(`.is-open`);
if (openedPanel) {
const filterPanel = openedPanel.nextElementSibling;
const indexChildren = filterPanel.querySelectorAll(`.js-tabIndex`);
openedPanel.classList.remove(`is-open`);
setAttributes(filterPanel, close);
alterIndex(indexChildren, `-1`);
openedPanel.focus();
}
};
document.addEventListener(`click`, (e) => {
if (!e.target.closest(`.js-show-filter-btn`)) {
closePanels(showFilterContainer);
}
});
showFilterCloseBtns.forEach((showFilterCloseBtn) => {
showFilterCloseBtn.addEventListener(`click`, (e) => {
closePanels(showFilterContainer);
});
});
}
.section-title {
.show-filter__filters & {
margin-bottom: 1.5rem;
}
}
.filter-btn {
.show-filter-btn & {
position: relative;
padding: 0.63rem 0.13rem;
width: 100%;
background: $color-white;
&:focus {
outline: none;
border-color: $color-header-light;
color: $color-header-light;
.icon {
stroke: $color-header-light;
}
}
&[disabled] {
color: $color-gray-lighter;
border-color: $color-gray-lightest;
&:hover {
background: $color-white;
}
.icon {
stroke: $color-gray-lighter;
}
}
&.is-open {
z-index: 2;
border-bottom-color: $color-white;
border-radius: $border-radius $border-radius 0 0;
&:hover {
border-color: $color-gray-light;
border-bottom-color: $color-white;
}
}
@include breakpoint($break-medium) {
padding: 0.63rem 0.5rem;
}
}
}
.date-filters__pickers {
position: relative;
}
.date-filters {
@include breakpoint($break-small) {
display: flex;
justify-content: space-between;
}
}
.date-filters__user {
display: flex;
flex-wrap: wrap;
@include breakpoint($break-small) {
flex: 0 1 42%;
}
}
.date-filters__pickers {
display: flex;
justify-content: space-between;
margin-bottom: 0.5rem;
width: 100%;
@include breakpoint($break-small) {
flex-direction: column;
}
}
.date-filter__list {
margin: 0;
padding: 0;
list-style: none;
}
.date-filter-list-item {
padding: 0;
}
.form-input {
.date-filters__pickers & {
flex: 0 1 48%;
margin-top: 0;
}
.date-filter-list-item:last-child & {
margin-bottom: 0;
}
.show-filter__filters & {
margin-top: 0;
}
}
.label {
.date-filters__pickers & {
line-height: 1;
}
.filter-item & {
align-self: center;
margin: 0 1rem 0 0;
}
.show-filter-list-item & {
margin-bottom: 0;
line-height: 1;
font-weight: $font-normal;
}
.discount-filter & {
order: 1;
align-self: center;
margin-bottom: 0;
margin-left: 0.75rem;
}
}
.btn {
.show-filter__results & {
padding: 0.25rem 0.25rem 0.25rem 0.75rem;
min-width: 5.63rem;
}
.clear-filters & {
display: block;
margin: 0 auto;
padding: 0.5rem 0.75rem;
font-size: $ms-neg-1;
@include breakpoint($break-xsmall) {
padding: 0.25rem 0.75rem;
}
}
}
.btn--close {
.show-filter__filters & {
align-self: flex-end;
margin-bottom: 0.25rem;
top: 0;
right: 0;
left: 0.5rem;
}
}
.show-filter-btn {
flex: 0 1 100%;
position: relative;
margin-bottom: 4%;
&:last-child {
margin-bottom: 0;
}
@include breakpoint($break-small) {
flex: 0 1 32%;
margin-bottom: 0;
}
&:first-child {
.show-filter__filters {
left: 0;
}
}
&:last-child {
.show-filter__filters {
right: 0;
@include breakpoint($break-small) {
border-top-left-radius: $border-radius;
}
}
}
}
.icon {
.filter-btn & {
margin-right: 0.19rem;
width: 1.5rem;
height: 1.5rem;
transition: $transition;
@include breakpoint($break-xsmall) {
margin-right: 0.25rem;
}
@include breakpoint($break-small) {
width: 1rem;
height: 1rem;
}
@include breakpoint($break-medium) {
margin-right: 0.5rem;
width: 1.5rem;
height: 1.5rem;
}
}
.filter-btn.is-open & {
stroke: $color-header-light;
}
.filter-btn--active & {
stroke: $color-header-light;
}
}
.icon--grid {
.filter-item & {
width: 1.5rem;
height: 1.5rem;
}
}
.icon--arrow-bottom {
.filter-btn & {
margin-right: 0;
width: 1rem;
height: 1rem;
stroke-width: 0.31rem;
transition: $transition;
}
.filter-btn.is-open & {
transform: rotate(-90deg);
}
}
.title-highlight {
.filter-btn & {
margin-right: 0.13rem;
@include breakpoint($break-small) {
letter-spacing: 0;
}
@include breakpoint($break-medium) {
margin-right: 0.25rem;
letter-spacing: 1px;
}
.guide-page--results & {
@include breakpoint($break-large) {
margin-right: 0;
}
}
}
.filter-btn.is-open & {
color: $color-header-light;
}
}
.show-filter__filters {
display: flex;
flex-direction: column;
position: absolute;
margin-top: -1rem;
padding: 0.5rem 1rem 1rem;
z-index: 1;
opacity: 0;
pointer-events: none;
box-sizing: border-box;
width: 100%;
min-width: 18.94rem;
background: $color-white;
border: 1px solid $color-gray-lighter;
border-radius: 0 0 $border-radius $border-radius;
transition: $transition;
transform: rotateX(-7deg);
@include breakpoint($break-small) {
margin-top: -1px;
min-width: 32.63rem;
}
}
.is-open {
&:hover + .show-filter__filters {
border-color: $color-gray-light;
}
& + .show-filter__filters {
opacity: 1;
pointer-events: auto;
transform: none;
}
}
.show-filter__list {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
margin: 0 0 1rem;
padding: 0;
width: 100%;
list-style: none;
.date-filters__user & {
@include breakpoint($break-small) {
flex-direction: column;
flex-wrap: nowrap;
margin-bottom: 0;
}
}
}
.show-filter-list-item {
flex: 0 1 100%;
margin: 0;
padding: 0;
@include breakpoint($break-xsmall) {
flex: 0 1 48%;
}
}
.show-filter-list-item--full {
@include breakpoint($break-xsmall) {
margin-bottom: 0.5rem;
}
@include breakpoint($break-small) {
flex: 1;
margin-bottom: 0;
}
}
.show-filter-apply {
@include breakpoint($break-small) {
align-self: flex-end;
}
}
.validation {
.show-type-filters & {
display: flex;
}
}
.filter-btn--active {
border-color: $color-header-light;
color: $color-header-light;
}
There are no notes for this item.