henry-search 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,28 +1,18 @@
1
1
  <script setup>
2
2
 
3
3
  import { ref, onMounted, onUnmounted, computed } from 'vue'
4
- import {
5
- AisClearRefinements,
6
- AisConfigure,
7
- AisCurrentRefinements,
8
- AisHighlight,
9
- AisHits,
10
- AisInstantSearch,
11
- AisPagination,
12
- AisRangeInput,
13
- AisRefinementList,
14
- AisSearchBox,
15
- AisStats
16
- } from 'vue-instantsearch/vue3/es'
17
- import TypesenseInstantSearchAdapter from 'typesense-instantsearch-adapter'
4
+
18
5
  import VueDatePicker from '@vuepic/vue-datepicker';
19
6
  import '@vuepic/vue-datepicker/dist/main.css'
20
7
  import VueSelect from 'vue-select'
21
- import { history as historyRouter } from 'instantsearch.js/es/lib/routers'
22
- import { simple as simpleStateMapping } from 'instantsearch.js/es/lib/stateMappings'
8
+
23
9
  import Typesense from 'typesense'
24
10
 
25
- import PAccordion from './PAccordion.vue'
11
+
12
+ import PTabs from './PTabs.vue'
13
+ import SearchTab from "./SearchTab.vue"
14
+
15
+ import formatDate from '../composables/formatDate'
26
16
 
27
17
  const props = defineProps({
28
18
  indexName: {
@@ -31,22 +21,7 @@
31
21
  }
32
22
  })
33
23
 
34
- const mainRefinements = [
35
- {attribute: 'work.composer', title: 'Composer', placeholder: 'Search Composers'},
36
- {attribute: 'work.title', title: 'Work', placeholder: 'Search Works'},
37
- {attribute: 'conductor', title: 'Conductor', placeholder: 'Search Conductors'},
38
- {attribute: 'orchestra', title: 'Orchestra/Ensemble', placeholder: 'Search Orchestras/Ensembles'},
39
- {attribute: 'work.artist.artist_name', title: 'Artist', placeholder: 'Search Artists'}
40
- ]
41
-
42
- const routing = ref({
43
- router: historyRouter({
44
- // Disable scroll restoration to prevent erratic behavior
45
- writeDelay: 0
46
- }),
47
- stateMapping: simpleStateMapping()
48
- })
49
- const byDate = ref(true)
24
+
50
25
  const displayDate = ref(null)
51
26
  const datepicker = ref(null)
52
27
  const rangeInput = ref(null)
@@ -56,152 +31,41 @@
56
31
  const today = Date.now()
57
32
  const date = ref([today, today])
58
33
 
34
+
35
+
36
+
59
37
  // Modal state management
60
38
  let isCreatingModal = false
61
39
  let modalCreated = false
62
40
 
63
- function slugify(str) {
64
- return String(str)
65
- .normalize('NFKD') // split accented characters into their base characters and diacritical marks
66
- .replace(/[\u0300-\u036f]/g, '') // remove all the accents, which happen to be all in the \u03xx UNICODE block.
67
- .trim() // trim leading or trailing whitespace
68
- .toLowerCase() // convert to lowercase
69
- .replace(/[^a-z0-9 -]/g, '') // remove non-alphanumeric characters
70
- .replace(/\s+/g, '-') // replace spaces with hyphens
71
- .replace(/-+/g, '-'); // remove consecutive hyphens
72
- }
73
-
74
- // Reusable multi-select modal template function
75
- function createMultiSelectModalHTML(options = {}) {
76
- const {
77
- modalId = 'multi-select-modal',
78
- title = 'Make Selection',
79
- description = 'Choose your options',
80
- cancelText = 'Cancel',
81
- selectText = 'Select',
82
- cancelButtonClass = 'js-modal-cancel',
83
- selectButtonClass = 'js-modal-select',
84
- contentContainerClass = 'eventsModal__contentContainer'
85
- } = options
86
-
87
- return `
88
- <div class="modal-container">
89
- <div class="eventsModal js--modal -full menu-is-open ${modalId}" aria-hidden="false">
90
- <div class="eventsModal__headerGrid">
91
- <div class="event__performance-wrapper">
92
- <span class="event__performance-name">${title}</span>
93
- </div>
94
- <button class="js--modal-close" aria-label="Close modal">
95
- <svg xmlns="http://www.w3.org/2000/svg" width="18" height="17" fill="none">
96
- <path stroke="#686F73" d="m1.354.646 16 16m-16.708 0 16-16"/>
97
- </svg>
98
- </button>
99
- </div>
100
-
101
- <div class="eventsModal__content -full">
102
- <div class="eventsModal__dropdown -isMultiSelect">
103
- <span class="eventsModal__numberOfPerformances">${description}</span>
104
- <div class="${contentContainerClass}">
105
- <!-- Dynamic content will be inserted here -->
106
- </div>
107
- </div>
108
- </div>
109
-
110
- <div class="eventsModal__actions-container js-performance-actions" data-performance-id="${modalId}">
111
- <div class="performance__buttons">
112
- <div class="event__buttons">
113
- <div class="event__buy-button-wrapper js-event-buttons" data-where="modal" data-performance-id="${modalId}" style="display: flex; gap: 1rem; justify-content: center; width: 100%;">
114
- <button type="button" class="event__buy-button event__buy-button--secondary ${cancelButtonClass}" style="background: #F5F5F5; color: #333; border: 1px solid #ddd;">
115
- <strong>${cancelText}</strong>
116
- </button>
117
- <button type="button" class="event__buy-button ${selectButtonClass}">
118
- <strong>${selectText}</strong>
119
- </button>
120
- </div>
121
- </div>
122
- </div>
123
- </div>
124
- </div>
125
- </div>
126
- `
127
- }
128
-
129
- // Handle date picker opened event
130
- function onDatePickerOpened() {
131
- const windowWidth = typeof window !== 'undefined' ? window.innerWidth : 1024
132
- // Only create modal on mobile and if not already created or in progress
133
- if (windowWidth <= 767 && !modalCreated && !isCreatingModal) {
134
- isCreatingModal = true
135
- setTimeout(() => {
136
- createMobileDatePickerModal()
137
- isCreatingModal = false
138
- }, 150) // Timeout to ensure menu is fully rendered
139
- }
140
- }
141
-
142
- // Handle date picker closed event
143
- function onDatePickerClosed(value) {
144
- const windowWidth = typeof window !== 'undefined' ? window.innerWidth : 1024
145
-
146
- // Process the date selection
147
- if (value && Array.isArray(value) && value.length >= 2) {
148
- console.log('Processing date selection:', Math.floor(value[0]/1000), Math.floor(value[1]/1000))
149
- } else {
150
- console.log('No date selection or incomplete selection:', value)
151
- }
152
-
153
- // Clean up mobile fullscreen styling
154
- if (windowWidth <= 767) {
155
- const menu = document.querySelector('.dp__menu')
156
- if (menu) {
157
- // Reset styles
158
- menu.style.position = ''
159
- menu.style.top = ''
160
- menu.style.left = ''
161
- menu.style.right = ''
162
- menu.style.bottom = ''
163
- menu.style.width = ''
164
- menu.style.height = ''
165
- menu.style.zIndex = ''
166
- menu.style.background = ''
167
- menu.style.padding = ''
168
- }
169
-
170
- // Remove body class
171
- document.body.classList.remove('menu-is-open')
172
- }
173
- }
174
-
175
-
41
+ const mainRefinements = [
42
+ {attribute: 'work.composer', title: 'Composer', placeholder: 'Search Composers'},
43
+ {attribute: 'work.title', title: 'Work', placeholder: 'Search Works'},
44
+ {attribute: 'conductor', title: 'Conductor', placeholder: 'Search Conductors'},
45
+ {attribute: 'orchestra', title: 'Orchestra/Ensemble', placeholder: 'Search Orchestras/Ensembles'},
46
+ {attribute: 'work.artist.artist_name', title: 'Artist', placeholder: 'Search Artists'},
47
+ ]
176
48
 
177
- const typesenseInstantsearchAdapter = new TypesenseInstantSearchAdapter({
178
- server: {
179
- connectionTimeoutSeconds: 20,
180
- apiKey: 'qoWHCTjesGfIaxdXbw9vOgod1VToEXNI', // Be sure to use an API key that only allows search operations
181
- nodes: [
182
- {
183
- host: 'go8f04wi19tuvlyrp-1.a1.typesense.net',
184
- path: '', // Optional. Example: If you have your typesense mounted in localhost:8108/typesense, path should be equal to '/typesense'
185
- port: '443',
186
- protocol: 'https',
187
- },
188
- ],
189
- cacheSearchResultsForSeconds: 0, // Cache search results from server. Defaults to 2 minutes. Set to 0 to disable caching.
190
- },
191
- // The following parameters are directly passed to Typesense's search API endpoint.
192
- // So you can pass any parameters supported by the search endpoint below.
193
- // query_by is required.
194
- additionalSearchParameters: {
195
- query_by: 'work.artist.artist_name',
196
- sort_by: 'performance_date:asc',
197
- // group_by: 'work',
198
- // group_limit: 1
199
- },
200
- })
49
+ const addlRefinements = [
50
+ {attribute: 'work.artist.artist_role', title: 'Instrument', placeholder: 'Search Instruments', type: 'list'},
51
+ {attribute: 'work.creator.creator_name', title: 'Additional Creator', placeholder: 'Search Creators', type: 'list'},
52
+ {attribute: 'work.creator.creator_role', title: 'Additional Creator Role', placeholder: 'Search Creator Roles', type: 'list'},
53
+ {attribute: 'season', title: 'Season', placeholder: 'Search Seasons', type: 'list'},
54
+ {attribute: 'event_title', title: 'Event Title', placeholder: 'Search Event Titles', type: 'list'},
55
+ {attribute: 'event_types', title: 'Series', placeholder: 'Search Event Types', type: 'list'},
56
+ {attribute: 'venue', title: 'Venue', placeholder: 'Search Venues', type: 'list'},
57
+ {attribute: 'location', title: 'Location', type: 'location'},
58
+ {attribute: 'media', title: 'Media', placeholder: 'Select Media', type: 'list', hideSearch: 'false'},
59
+ {attribute: 'premiere', title: 'Premiere', placeholder: 'Select Premiere', type: 'list', hideSearch: 'false'},
60
+ {attribute: 'work.commission', title: 'Commission', placeholder: 'Select Premiere', type: 'list', hideSearch: 'false'}
61
+ ]
201
62
 
202
- const searchClient = typesenseInstantsearchAdapter.searchClient
63
+ const artistRefinements = [
64
+ {attribute: 'artist_name', title: 'Artist/Ensemble', placeholder: 'Search Artists/Ensembles'},
65
+ {attribute: 'artist_role', title: 'Instrument/Role', placeholder: 'Instruments/Roles'}
66
+ ]
203
67
 
204
- const perPage = computed(() => byDate.value ? 10 : 8)
68
+
205
69
 
206
70
  // Check if we're on mobile
207
71
  const isMobile = ref(false)
@@ -213,30 +77,7 @@
213
77
  }
214
78
  }
215
79
 
216
- onMounted(() => {
217
-
218
- // let client = new Typesense.Client({
219
- // 'nodes': [{
220
- // 'host': 'go8f04wi19tuvlyrp-1.a1.typesense.net',
221
- // 'port': '443',
222
- // 'protocol': 'https'
223
- // }],
224
- // 'apiKey': 'qoWHCTjesGfIaxdXbw9vOgod1VToEXNI',
225
- // 'connectionTimeoutSeconds': 2
226
- // })
227
-
228
- // let searchParameters = {
229
- // 'q' : 'john williams',
230
- // 'filter_by' : 'work.artist.{artist_name:=John Williams}',
231
- // 'query_by' : 'work',
232
- // 'group_by' : 'work',
233
- // 'group_limit' : '1'
234
- // }
235
-
236
- // client.collections('archived_performances').documents().search(searchParameters).then(function (searchResults) {
237
- // console.log('searchResults', searchResults)
238
- // })
239
-
80
+ onMounted(() => {
240
81
 
241
82
  // Disable browser scroll restoration
242
83
  if ('scrollRestoration' in history) {
@@ -291,6 +132,40 @@
291
132
  }
292
133
  })
293
134
 
135
+
136
+
137
+
138
+
139
+ function artistView(items) {
140
+ let artistItems = {}
141
+ items.forEach((item) => {
142
+ item.work.forEach((work) => {
143
+ work.artist.forEach((artist) => {
144
+ let artistFound = true
145
+ if (currentQuery.value) {
146
+ if (!artist.artist_name.toLowerCase().includes(currentQuery.value.toLowerCase())) {
147
+ console.log(artist.artist_name.toLowerCase(), currentQuery.value.toLowerCase(), artist.artist_name.toLowerCase().includes(currentQuery.value.toLowerCase()))
148
+ artistFound = false
149
+ }
150
+ }
151
+ if (artistFound) {
152
+ const workRoleArtist = slugify(`${artist.artist_name} ${artist.artist_role} ${work.composer} ${work.title}`)
153
+ if (workRoleArtist in artistItems) {
154
+ artistItems[workRoleArtist]['numPerformances']++
155
+ } else {
156
+ artistItems[workRoleArtist] = {}
157
+ artistItems[workRoleArtist]['artist'] = artist.artist_name
158
+ artistItems[workRoleArtist]['role'] = artist.artist_role
159
+ artistItems[workRoleArtist]['work'] = `${work.composer} / ${work.title}`
160
+ artistItems[workRoleArtist]['numPerformances'] = 1
161
+ }
162
+ }
163
+ })
164
+ })
165
+ })
166
+ return artistItems
167
+ }
168
+
294
169
  function setupPaginationScrollFix() {
295
170
  // Use event delegation to catch pagination clicks
296
171
  document.addEventListener('click', (event) => {
@@ -307,7 +182,7 @@
307
182
  }
308
183
 
309
184
  function scrollToResults() {
310
- const resultsSection = document.querySelector('.eventsCalendar__results')
185
+ const resultsSection = document.querySelector('.eventsSearch__results')
311
186
  if (resultsSection) {
312
187
  const rect = resultsSection.getBoundingClientRect()
313
188
  const scrollTop = window.pageYOffset + rect.top - 20 // 20px offset from top
@@ -335,60 +210,16 @@
335
210
 
336
211
  }
337
212
 
338
- function formatDate(unix_timestamp, display = true) {
339
- // multiplied by 1000 so that the argument is in milliseconds, not seconds
340
- const date = new Date(unix_timestamp * 1000)
341
- const days = ["Sun", "Mon", "Tues", "Weds", "Thurs", "Fri", "Sat"]
342
- const months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
343
- const hour = date.getHours() + 1 > 12 ? date.getHours() - 11 : date.getHours() + 1
344
- const amPm = date.getHours() + 1 > 12 ? "pm" : "am"
345
- const minutes = "0" + date.getMinutes()
346
-
347
- if (display) {
348
- return `${days[date.getDay()]}, ${(months[date.getMonth()]).substring(0, 3)} ${date.getDate()}, ${hour}:${minutes.substr(-2)}${amPm} EDT`
349
- } else {
350
- return `${months[date.getMonth()]}, ${date.getFullYear()}`
351
- }
352
- }
353
-
354
- function groupItemsByMonth(items) {
355
- console.log(items)
356
- let groupedItems = {}
357
- let currentMonth = null
358
- items.forEach(item => {
359
- if (currentMonth != formatDate(item.performance_date, false)) {
360
- currentMonth = formatDate(item.performance_date, false)
361
- groupedItems[currentMonth] = []
362
- }
363
- groupedItems[currentMonth].push(item)
364
- })
365
- return groupedItems
366
- }
367
-
213
+
368
214
  function toValue(value, range) {
369
215
  return [
370
216
  typeof value.min === "number" ? value.min * 1000 : range.min * 1000,
371
217
  typeof value.max === "number" ? value.max * 1000 : range.max * 1000,
372
218
  ];
373
- }
374
-
375
- function setView(viewType) {
376
- byDate.value = viewType === 'date'
377
- if (byDate.value) {
378
- typesenseInstantsearchAdapter.updateConfiguration({...typesenseInstantsearchAdapter.configuration, additionalSearchParameters: {
379
- query_by: 'title, excerpt, subhead, content_keywords',
380
- sort_by: 'performance_date:asc'
381
- }})
382
- } else {
383
- typesenseInstantsearchAdapter.updateConfiguration({...typesenseInstantsearchAdapter.configuration, additionalSearchParameters: {
384
- query_by: 'title, excerpt, subhead, content_keywords',
385
- sort_by: 'performance_date:asc',
386
- group_by: 'event_id',
387
- group_limit: 1
388
- }})
389
- }
390
219
  }
391
220
 
221
+
222
+
392
223
  const setDate = (value) => {
393
224
  date.value = value
394
225
  displayDate.value = value
@@ -720,1801 +551,118 @@
720
551
  </script>
721
552
 
722
553
  <template>
723
- <div class="eventsCalendar">
724
-
725
- <ais-instant-search
726
- :search-client="searchClient"
727
- :index-name="props.indexName"
728
- :routing="routing"
729
- class="eventsCalendar__search"
730
- >
731
- <ais-configure
732
- :hits-per-page.camel="perPage"
733
- />
734
-
735
- <!-- Header and Search Section -->
736
- <div class="eventsCalendar__topSection">
737
- <!-- Search Filters Section -->
738
- <section class="eventsCalendar__filters">
739
- <header class="eventsCalendar__header">
740
- <h1 class="eventsCalendar__title">Find Concerts & Events</h1>
741
- </header>
742
- <div class="eventsCalendar__filtersRow">
743
- <!-- Search Box -->
744
- <div class="eventsCalendar__filterGroup eventsCalendar__filterGroup--search">
745
- <ais-search-box
746
- placeholder="Performance name, artist, work, or category"
747
- class="eventsCalendar__searchBox"
748
- />
749
- </div>
750
- </div>
751
- </section>
752
- </div>
753
-
754
- <!-- View Toggle and Active Filters -->
755
- <section class="eventsCalendar__filterRail">
756
- <div style="display: grid;">
757
- <ais-refinement-list v-for="refinement in mainRefinements" :attribute="refinement.attribute" operator="and">
758
- <template v-slot="{items, refine, searchForItems}">
759
- <p-accordion name="example" class="accordion">
760
- <summary class="accordion__summary">
761
- <h6 class="accordion__heading">{{ refinement.title }}</h6>
762
- <div class="accordion__iconWrapper">
763
- <svg class="accordion__icon icon icon--chevron-right" aria-hidden="true" role="presentation">
764
- <use href="../assets/main-icons-sprite.svg#chevron-right" />
554
+ <div class="eventsSearch">
555
+ <p-tabs :titles="['Performances', 'Artists', 'Works']">
556
+ <template #tabpanel-1>
557
+ <search-tab
558
+ :index-name="'archived_performances'"
559
+ :main-refinements="mainRefinements"
560
+ :addl-refinements="addlRefinements"
561
+ :sort-field="'performance_date'"
562
+ :query-by-fields="'work, season, orchestra, venue, event_types, notes, event_title'"
563
+ search-placeholder="Search by composer, work, conductor, orchestra, and more"
564
+ results-title="Performances"
565
+ >
566
+ <template v-slot="{ items, showByWorks }">
567
+ <div class="eventsSearch__resultsGrid">
568
+ <template v-for="item, index in items">
569
+ <template v-for="w, i in item.work.slice(0, 6)">
570
+ <!-- Header Row -->
571
+ <template v-if="index == 0 && i == 0">
572
+ <div class="eventsSearch__resultCell -header -first">Date/Season/Title</div>
573
+ <div class="eventsSearch__resultCell -header">Venue</div>
574
+ <div class="eventsSearch__resultCell -header">Orchestra</div>
575
+ <div class="eventsSearch__resultCell -header">Conductor</div>
576
+ <div class="eventsSearch__resultCell -header">Composer/Work</div>
577
+ <div class="eventsSearch__resultCell -header">Artist/Role</div>
578
+ <div class="eventsSearch__resultCell -header">View</div>
579
+ </template>
580
+ <!-- First row of an event -->
581
+ <template v-if="i == 0">
582
+ <div :class="`eventsSearch__resultCell -first ${index % 2 == 0 ? '-even' : '-odd'} ${(index + 1 == items.length && (i + 1 == item.work.length || i == 5)) ? '-last' : ''}`">{{ formatDate(item.performance_date) }} / {{ item.season + (item.event_title ? " / " + item.event_title : "")}}</div>
583
+ <div :class="`eventsSearch__resultCell ${index % 2 == 0 ? '-even' : '-odd'} ${((index + 1 == items.length && (i + 1 == item.work.length || i == 5)) && (i + 1 == item.work.length || i == 5)) ? '-last' : ''}`">{{ item.venue }} {{ item.location.city }}, {{ item.location.state }}, {{ item.location.country }}</div>
584
+ <div :class="`eventsSearch__resultCell ${index % 2 == 0 ? '-even' : '-odd'} ${(index + 1 == items.length && (i + 1 == item.work.length || i == 5)) ? '-last' : ''}`">{{ item.orchestra.join('; ')}}</div>
585
+ <div :class="`eventsSearch__resultCell ${index % 2 == 0 ? '-even' : '-odd'} ${(index + 1 == items.length && (i + 1 == item.work.length || i == 5)) ? '-last' : ''}`">{{ w.artist.filter((artist) => artist.artist_role == 'Conductor').map((artist) => artist.artist_name).join('; ') }}</div>
586
+ <div :class="`eventsSearch__resultCell ${index % 2 == 0 ? '-even' : '-odd'} ${(index + 1 == items.length && (i + 1 == item.work.length || i == 5)) ? '-last' : ''}`">{{ w.composer }} / {{ w.title }}</div>
587
+ <div :class="`eventsSearch__resultCell ${index % 2 == 0 ? '-even' : '-odd'} ${(index + 1 == items.length && (i + 1 == item.work.length || i == 5)) ? '-last' : ''}`">{{ w.artist.filter((artist) => artist.artist_role != 'Conductor').map((artist) => artist.artist_name + '/' + artist.artist_role).join('; ') }}</div>
588
+ <div :class="`eventsSearch__resultCell ${index % 2 == 0 ? '-even' : '-odd'} ${(index + 1 == items.length && (i + 1 == item.work.length || i == 5)) ? '-last' : ''}`">
589
+ <a :href="`/details?performanceId=${item.id}`">Details</a>
590
+ <a v-if="item.program_link" :href="item.program_link">Program</a>
591
+ <a v-if="item.media && item.media.includes('Audio')">Audio</a>
592
+ </div>
593
+ </template>
594
+ <!-- Additional event rows -->
595
+ <template v-else-if="i > 0 && i <= 4">
596
+ <div :class="`eventsSearch__resultCell -first ${index % 2 == 0 ? '-even' : '-odd'} ${(index + 1 == items.length && (i + 1 == item.work.length || i == 5)) ? '-last' : ''}`"></div>
597
+ <div :class="`eventsSearch__resultCell ${index % 2 == 0 ? '-even' : '-odd'} ${(index + 1 == items.length && (i + 1 == item.work.length || i == 5)) ? '-last' : ''}`"></div>
598
+ <div :class="`eventsSearch__resultCell ${index % 2 == 0 ? '-even' : '-odd'} ${(index + 1 == items.length && (i + 1 == item.work.length || i == 5)) ? '-last' : ''}`"></div>
599
+ <div :class="`eventsSearch__resultCell ${index % 2 == 0 ? '-even' : '-odd'} ${(index + 1 == items.length && (i + 1 == item.work.length || i == 5)) ? '-last' : ''}`">{{ w.artist.filter((artist) => artist.artist_role == 'Conductor').map((artist) => artist.artist_name).join('; ') }}</div>
600
+ <div :class="`eventsSearch__resultCell ${index % 2 == 0 ? '-even' : '-odd'} ${(index + 1 == items.length && (i + 1 == item.work.length || i == 5)) ? '-last' : ''}`">{{ w.composer }} / {{ w.title }}</div>
601
+ <div :class="`eventsSearch__resultCell ${index % 2 == 0 ? '-even' : '-odd'} ${(index + 1 == items.length && (i + 1 == item.work.length || i == 5)) ? '-last' : ''}`" v-if="w.artist.filter((artist) => artist.artist_role != 'Conductor').length < 3">{{ w.artist.filter((artist) => artist.artist_role != 'Conductor').map((artist) => artist.artist_name + '/' + artist.artist_role).join('; ') }}
602
+ <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg" v-if="w.has_recording">
603
+ <path d="M9.81086 5L6.92983 7.30483H4.625V10.7621H6.92983L9.81086 13.0669V5Z" stroke="#01ABE6" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
604
+ <path d="M12.4268 6.99365C12.9669 7.53393 13.2703 8.2666 13.2703 9.03054C13.2703 9.79449 12.9669 10.5272 12.4268 11.0674" stroke="#01ABE6" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
765
605
  </svg>
766
- </div>
767
- </summary>
768
- <div class="accordion__content">
769
- <div class="ais-SearchBox eventsCalendar__searchBox -filter">
770
- <input @input="searchForItems($event.currentTarget.value)" :placeholder="refinement.placeholder" class="ais-SearchBox-input -filter">
771
- </div>
772
- <div class="eventsCalendar__checkBoxes">
773
- <label v-for="item in items" class="eventsCalendar__boxLabel" :for="slugify(refinement.title + ' ' + item.value)">
774
- <input class="checkbox" type="checkbox" :id="slugify(refinement.title + ' ' + item.value)" :value="item.value" :checked="item.isRefined" @click="refine(item.value)">
775
- <span>{{ item.isRefined + ' ' + item.value }}</span><span>{{ item.count }}</span>
776
- </label>
777
- </div>
778
- </div>
779
- </p-accordion>
606
+ </div>
607
+ <div :class="`eventsSearch__resultCell ${index % 2 == 0 ? '-even' : '-odd'} ${(index + 1 == items.length && (i + 1 == item.work.length || i == 5)) ? '-last' : ''}`" v-else>{{ w.artist.filter((artist) => artist.artist_role != 'Conductor').map((artist) => artist.artist_name + '/' + artist.artist_role).slice(0, 2).join('; ') }}
608
+ <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg" v-if="w.has_recording">
609
+ <path d="M9.81086 5L6.92983 7.30483H4.625V10.7621H6.92983L9.81086 13.0669V5Z" stroke="#01ABE6" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
610
+ <path d="M12.4268 6.99365C12.9669 7.53393 13.2703 8.2666 13.2703 9.03054C13.2703 9.79449 12.9669 10.5272 12.4268 11.0674" stroke="#01ABE6" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
611
+ </svg>
612
+ <br/><a :href="`/details?performanceId=${item.id}`">More...</a></div>
613
+ <div :class="`eventsSearch__resultCell ${index % 2 == 0 ? '-even' : '-odd'} ${(index + 1 == items.length && (i + 1 == item.work.length || i == 5)) ? '-last' : ''}`"></div>
614
+ </template>
615
+ <template v-else-if="i > 4">
616
+ <div :class="`eventsSearch__resultCell -first ${index % 2 == 0 ? '-even' : '-odd'} ${(index + 1 == items.length && (i + 1 == item.work.length || i == 5)) ? '-last' : ''}`"></div>
617
+ <div :class="`eventsSearch__resultCell ${index % 2 == 0 ? '-even' : '-odd'} ${(index + 1 == items.length && (i + 1 == item.work.length || i == 5)) ? '-last' : ''}`"></div>
618
+ <div :class="`eventsSearch__resultCell ${index % 2 == 0 ? '-even' : '-odd'} ${(index + 1 == items.length && (i + 1 == item.work.length || i == 5)) ? '-last' : ''}`"></div>
619
+ <div :class="`eventsSearch__resultCell ${index % 2 == 0 ? '-even' : '-odd'} ${(index + 1 == items.length && (i + 1 == item.work.length || i == 5)) ? '-last' : ''}`"></div>
620
+ <div :class="`eventsSearch__resultCell ${index % 2 == 0 ? '-even' : '-odd'} ${(index + 1 == items.length && (i + 1 == item.work.length || i == 5)) ? '-last' : ''}`"><a :href="`/details?performanceId=${item.id}`">More...</a></div>
621
+ <div :class="`eventsSearch__resultCell ${index % 2 == 0 ? '-even' : '-odd'} ${(index + 1 == items.length && (i + 1 == item.work.length || i == 5)) ? '-last' : ''}`"></div>
622
+ <div :class="`eventsSearch__resultCell ${index % 2 == 0 ? '-even' : '-odd'} ${(index + 1 == items.length && (i + 1 == item.work.length || i == 5)) ? '-last' : ''}`"></div>
623
+ </template>
624
+ </template>
780
625
  </template>
781
- </ais-refinement-list>
782
- </div>
783
- </section>
784
-
785
- <!-- Search Results Section -->
786
- <section class="eventsCalendar__results">
787
- <ais-current-refinements></ais-current-refinements>
788
- <ais-hits class="eventsCalendar__hits">
626
+ </div>
627
+ </template>
628
+ </search-tab>
629
+ </template>
630
+ <template #tabpanel-2>
631
+ <!-- <search-tab
632
+ :index-name="'archived_artists'"
633
+ :main-refinements="artistRefinements"
634
+ :sort-field="'last_performance_date'"
635
+ :query-by-fields="'artist_name, artist_role, work_title'"
636
+ search-placeholder="Search by conductor, soloist, ensemble, instruument, or role"
637
+ results-title="Artists"
638
+ >
789
639
  <template v-slot="{ items }">
790
- <h2>Hits: {{ items.length }}</h2>
791
- <div v-for="item in items">{{ JSON.stringify(item) }}</div>
640
+ <div class="eventsSearch__artistGrid">
641
+ <div>Artist</div>
642
+ <div>Instrument/Role</div>
643
+ <div>Composer/Work</div>
644
+ <div># of Performances</div>
645
+ </div>
646
+ <div v-for="item, index in items">
647
+ <div :class="`eventsSearch__artistGrid ${index % 2 == 0 ? '-even' : '-odd'}`">
648
+ <div>{{ item.artist_name }}</div>
649
+ <div>{{ item.artist_role }}</div>
650
+ <div>{{ item.work_title }}</div>
651
+ <div>{{ item.num_performances }}</div>
652
+ </div>
653
+ </div>
792
654
  </template>
793
- </ais-hits>
794
-
795
- <!-- Pagination -->
796
- <nav class="eventsCalendar__pagination">
797
- <ais-pagination
798
- :show-first="true"
799
- :show-previous="true"
800
- :show-next="true"
801
- :show-last="true"
802
- class="eventsCalendar__paginationComponent"
803
- />
804
- </nav>
805
- </section>
806
- </ais-instant-search>
655
+ </search-tab> -->
656
+ </template>
657
+
658
+ <template #tabpanel-3>
659
+ <h3>Consectetur odit distinctio beatae!</h3>
660
+ <p>Ipsum eaque ipsam asperiores consequatur est libero. Incidunt distinctio non quae veniam illum Laborum est harum sapiente vel suscipit maiores? Dicta quo velit eos ab distinctio, delectus! Autem sunt aperiam!</p>
661
+ </template>
662
+ </p-tabs>
807
663
  </div>
808
-
809
664
 
810
665
 
811
666
  </template>
812
667
 
813
- <style lang="scss">
814
- .eventsCalendar {
815
- // Ensure full width in responsive design mode
816
- width: 100%;
817
- max-width: 100%;
818
- overflow-x: hidden;
819
-
820
- &__boxLabel {
821
- align-items: center;
822
- display: grid;
823
- grid-template-columns: 10% 80% 10%;
824
- padding-bottom: .5rem;
825
- color: var(--color-dark-blue);
826
- }
827
-
828
- &__checkBoxes {
829
- margin: 1rem 0;
830
- height: 10rem;
831
- overflow-y: scroll;
832
- // input[type=checkbox] {
833
- // border: thin solid #AFAFAF;
834
- // background-color: var(--color-white);
835
- // border-radius: 0;
836
- // height: 1rem;
837
- // width: 1rem;
838
- // }
839
- // input[type=checkbox]:checked {
840
- // color:#AFAFAF;
841
- // }
842
- }
843
-
844
- &__topSection {
845
- background-color: #FBF4EF;
846
- display: flex;
847
- align-items: flex-start;
848
- gap: 2rem;
849
- grid-column: 1 / span 2;
850
- padding: 2rem 20px;
851
- width: 100%;
852
- box-sizing: border-box;
853
-
854
- @media screen and (min-width: 768px) {
855
- padding: 2rem 80px;
856
- }
857
-
858
- @media screen and (max-width: 768px) {
859
- flex-direction: column;
860
- gap: 1rem;
861
- }
862
-
863
- @media screen and (min-width: 1070px) {
864
- padding: 2rem 80px 2rem 140px;
865
- }
866
- }
867
-
868
- &__header {
869
- flex-shrink: 0;
870
- min-width: 200px;
871
- margin-bottom: .5rem;
872
- }
873
-
874
- &__title {
875
- font-weight: var(--font-weight-bold);
876
- font-size: var(--font-size-2);
877
- line-height: var(--line-height-heading);
878
- letter-spacing: -0.01em;
879
- color: var(--c-theme-800);
880
- margin-bottom: 0;
881
- }
882
-
883
- &__search {
884
- display: grid;
885
- grid-template-columns: 25% 75%;
886
- gap: 2rem;
887
- background-color: var(--color-white);
888
- }
889
-
890
- &__searchBox {
891
- border: 1px solid #D7D7D7;
892
- border-radius: 5px;
893
- width: 100%;
894
- background-color: #FDF9F7;
895
- padding: .5rem;
896
- height: 40px;
897
- display: flex;
898
- align-items: center;
899
- box-sizing: border-box;
900
-
901
- &.-filter {
902
- background-color:#ffffff;
903
- }
904
-
905
- .ais-SearchBox-form {
906
- display: flex;
907
- align-items: center;
908
- justify-content: start;
909
- flex-direction: row-reverse;
910
- gap: .5rem;
911
- height: 100%;
912
- width: 100%;
913
- }
914
-
915
- .ais-SearchBox-input {
916
- font-size: var(--font-size-2);
917
- width: 90%;
918
- height: 100%;
919
- background-color: #FDF9F7;
920
- border: none;
921
- outline: none;
922
- &.-filter {
923
- width: 100%;
924
- border: none;
925
- background-color:#ffffff;
926
- color:var(--color-dark-blue);
927
- }
928
- &.-filter::placeholder {
929
- color:#AFAFAF;
930
- }
931
- }
932
-
933
- .ais-SearchBox-submitIcon {
934
- width: 16px;
935
- height: 16px;
936
- }
937
-
938
- .ais-SearchBox-reset, .ais-SearchBox-submit {
939
- align-self: center !important;
940
- border: none;
941
- background-color: #FDF9F7;
942
- display: flex;
943
- align-items: center !important;
944
- justify-content: center !important;
945
- line-height: 1 !important;
946
- vertical-align: middle !important;
947
- }
948
- }
949
-
950
- &__filters,
951
- &__filtersControlsInner {
952
- flex: 1;
953
- min-width: 0;
954
- }
955
-
956
- &__filtersControlsInner {
957
- display: grid;
958
- grid-template-columns: 1fr auto;
959
- grid-template-areas:
960
- "title actions"
961
- "filters filters";
962
-
963
- @media screen and (min-width: 1070px) {
964
- grid-template-columns: 1fr auto;
965
- grid-template-rows: auto auto;
966
- grid-template-areas:
967
- "title actions"
968
- "filters filters";
969
- }
970
-
971
- // Add border-bottom when Event view is active
972
- &.-eventView {
973
- border-bottom: 1px solid #D3D0CD;
974
- padding-bottom: 1rem;
975
- margin-bottom: 1rem;
976
- }
977
- }
978
-
979
- &__filtersRow {
980
- display: grid;
981
- gap: 1rem;
982
- grid-template-columns: 1fr 1fr 1fr;
983
- grid-template-areas:
984
- "search search search"
985
- "date venue ensemble";
986
-
987
- @media screen and (min-width: 768px) {
988
- grid-template-columns: 1fr 1fr;
989
- grid-template-areas:
990
- "search search"
991
- "date date"
992
- "venue ensemble";
993
- }
994
-
995
- @media screen and (min-width: 1070px) {
996
- grid-template-columns: 1fr 200px 200px 200px;
997
- grid-template-areas:
998
- "search date venue ensemble";
999
- }
1000
- }
1001
-
1002
- &__filterRail {
1003
- grid-column-start: 1;
1004
- background-color:#ffffff;
1005
- @media screen and (min-width: 768px) {
1006
- padding-left: 80px;
1007
- }
1008
-
1009
- @media screen and (max-width: 768px) {
1010
- flex-direction: column;
1011
- gap: 1rem;
1012
- }
1013
668
 
1014
- @media screen and (min-width: 1070px) {
1015
- padding-left: 140px;
1016
- }
1017
- }
1018
-
1019
- &__filterGroup {
1020
- flex: 1;
1021
-
1022
- &--search {
1023
- grid-area: search;
1024
- }
1025
-
1026
- &--date {
1027
- grid-area: date;
1028
- .dp__input_wrap {
1029
- height: 40px !important;
1030
- }
1031
-
1032
- .dp__input {
1033
- height: 40px !important;
1034
- border: 1px solid #D6D6D6 !important;
1035
- border-radius: 5px !important;
1036
- background: #FDF9F7 !important;
1037
- padding: 0 2.5rem !important;
1038
- font-size: 14px !important;
1039
- box-sizing: border-box !important;
1040
- display: flex !important;
1041
- align-items: center !important;
1042
-
1043
- &::placeholder {
1044
- color: #666;
1045
- }
1046
-
1047
- @media screen and (min-width: 1070px) {
1048
- font-size: 16px !important;
1049
- padding: 0 2.75rem !important;
1050
- }
1051
- }
1052
-
1053
- .dp__input_icon {
1054
- margin-left: 8px !important;
1055
- flex-shrink: 0 !important;
1056
- }
1057
-
1058
- // Mobile fullscreen date picker styles
1059
- @media screen and (max-width: 767px) {
1060
- .dp__menu {
1061
- position: fixed !important;
1062
- top: 60px !important; // Leave space for custom header
1063
- left: 0 !important;
1064
- right: 0 !important;
1065
- bottom: 0 !important;
1066
- width: 100vw !important;
1067
- height: calc(100vh - 60px) !important; // Adjust for header
1068
- max-width: none !important;
1069
- max-height: none !important;
1070
- border-radius: 0 !important;
1071
- z-index: 9999 !important;
1072
- background: white !important;
1073
- box-shadow: none !important;
1074
- border: none !important;
1075
- margin: 0 !important;
1076
- padding: 0 !important;
1077
- display: flex !important;
1078
- flex-direction: column !important;
1079
- }
1080
-
1081
-
1082
- .dp__menu_inner {
1083
- flex: 1 !important;
1084
- display: flex !important;
1085
- flex-direction: column !important;
1086
- padding: 1rem !important;
1087
- height: 100% !important;
1088
- box-sizing: border-box !important;
1089
- }
1090
-
1091
- .dp__calendar_header {
1092
- padding: 1rem 0 !important;
1093
- border-bottom: 1px solid #e0e0e0 !important;
1094
- margin-bottom: 1rem !important;
1095
- }
1096
-
1097
- .dp__calendar_header_item {
1098
- font-size: 18px !important;
1099
- font-weight: 600 !important;
1100
- }
1101
-
1102
- .dp__calendar_wrap {
1103
- flex: 1 !important;
1104
- display: flex !important;
1105
- flex-direction: column !important;
1106
- justify-content: flex-start !important;
1107
- overflow: hidden !important;
1108
- }
1109
-
1110
- .dp__calendar {
1111
- width: 100% !important;
1112
- max-width: none !important;
1113
- }
1114
-
1115
- // Force single month display
1116
- .dp__instance_calendar {
1117
- width: 100% !important;
1118
-
1119
- &:not(:first-child) {
1120
- display: none !important;
1121
- }
1122
- }
1123
-
1124
- // Hide multi-calendar controls if they exist
1125
- .dp__calendar_header_separator,
1126
- .dp__calendar_next,
1127
- .dp__calendar_prev {
1128
- display: none !important;
1129
- }
1130
-
1131
- .dp__calendar_row {
1132
- margin-bottom: 0.5rem !important;
1133
- }
1134
-
1135
- .dp__calendar_item {
1136
- height: 48px !important;
1137
- width: 48px !important;
1138
- font-size: 16px !important;
1139
- margin: 2px !important;
1140
- }
1141
-
1142
- // Essential dp__ button styles for functionality
1143
- .dp__action_button {
1144
- cursor: pointer !important;
1145
- border: none !important;
1146
- padding: 0.75rem 1.5rem !important;
1147
- border-radius: 0.375rem !important;
1148
- font-weight: 500 !important;
1149
- transition: all 0.2s ease !important;
1150
- }
1151
-
1152
- .dp__action_select,
1153
- .dp__select {
1154
- background: var(--c-brand, #007bff) !important;
1155
- color: white !important;
1156
- border: none !important;
1157
-
1158
- &:hover {
1159
- background: var(--c-brand-dark, #0056b3) !important;
1160
- }
1161
- }
1162
-
1163
- .dp__action_cancel {
1164
- background: #f5f5f5 !important;
1165
- color: #333 !important;
1166
- border: 1px solid #ddd !important;
1167
-
1168
- &:hover {
1169
- background: #e8e8e8 !important;
1170
- }
1171
- }
1172
-
1173
- // Hide original action row positioning to prevent flash
1174
- .dp__action_row {
1175
- &:not(.dp__action_row--repositioned) {
1176
- opacity: 0 !important;
1177
- transition: opacity 0.1s ease !important;
1178
- }
1179
- }
1180
-
1181
- // Note: CSS styles don't work for modals inserted outside component scope
1182
- // Using inline styles in JavaScript instead
1183
-
1184
- // Add overlay backdrop
1185
- .dp__overlay {
1186
- position: fixed !important;
1187
- top: 0 !important;
1188
- left: 0 !important;
1189
- right: 0 !important;
1190
- bottom: 0 !important;
1191
- background: rgba(0, 0, 0, 0.5) !important;
1192
- z-index: 9998 !important;
1193
- }
1194
- }
1195
- }
1196
-
1197
- &--venue {
1198
- grid-area: venue;
1199
- }
1200
-
1201
- &--ensemble {
1202
- grid-area: ensemble;
1203
- }
1204
- }
1205
-
1206
- &__filtersControls {
1207
- display: flex;
1208
- align-items: center;
1209
- gap: 1rem;
1210
- margin-top: 1rem;
1211
- flex-wrap: wrap;
1212
- font-size: 14px;
1213
- padding: 0 20px;
1214
-
1215
- @media screen and (min-width: 768px) {
1216
- padding: 0 80px;
1217
- }
1218
-
1219
- @media screen and (min-width: 1070px) {
1220
- margin-top: 3rem;
1221
- margin-left: 60px;
1222
- padding: 0 80px;
1223
- }
1224
- }
1225
-
1226
- &__filtersTitle {
1227
- font-size: 32px;
1228
- font-weight: 700;
1229
- color: var(--c-theme-800);
1230
- grid-area: title;
1231
- margin-bottom: .5rem;
1232
-
1233
- @media screen and (min-width: 1070px) {
1234
- font-size: 50px;
1235
- margin-bottom: 0;
1236
- }
1237
- }
1238
-
1239
- .ais-CurrentRefinements {
1240
- grid-area: filters;
1241
- }
1242
-
1243
- &__filtersArea {
1244
- grid-area: filters;
1245
- border-top: 1px solid #D3D0CD;
1246
- margin-top: .5rem;
1247
- padding: .75rem 0;
1248
- }
1249
-
1250
- &__activeFilters {
1251
- display: grid;
1252
- grid-template-columns: 1fr auto;
1253
- gap: 0.5rem;
1254
- align-items: center;
1255
- }
1256
-
1257
- &__activeFiltersList {
1258
- display: flex;
1259
- flex-direction: column;
1260
- gap: .75rem;
1261
- }
1262
-
1263
- &__activeFiltersItems {
1264
- display: flex;
1265
- flex-wrap: wrap;
1266
- align-items: center;
1267
- gap: 0.5rem;
1268
- }
1269
-
1270
- &__activeFilterItem {
1271
- background-color: #f5f5f5;
1272
- border-radius: 4px;
1273
- padding: .25rem .5rem;
1274
- }
1275
-
1276
- &__activeFilterRemove {
1277
- .eventLocation {
1278
- margin-left: 0.25rem;
1279
- }
1280
- }
1281
-
1282
- &__filtersActions {
1283
- display: flex;
1284
- align-items: center;
1285
- gap: 1rem;
1286
- grid-area: actions;
1287
- }
1288
-
1289
- &__printButton {
1290
- background: none;
1291
- border: none;
1292
- cursor: pointer;
1293
- padding: 8px 12px;
1294
- border-radius: 4px;
1295
- display: none;
1296
- color: #686F73;
1297
- font-size: 14px;
1298
- transition: background-color 0.2s, color 0.2s;
1299
-
1300
- @media screen and (min-width: 1070px) {
1301
- display: flex;
1302
- align-items: center;
1303
- justify-content: center;
1304
- gap: 6px;
1305
- }
1306
-
1307
- &:hover {
1308
- background-color: #f0f0f0;
1309
- color: var(--c-theme-800);
1310
- }
1311
-
1312
- svg {
1313
- display: block;
1314
- flex-shrink: 0;
1315
- }
1316
-
1317
- span {
1318
- white-space: nowrap;
1319
- }
1320
- }
1321
-
1322
- &__viewToggle {
1323
- display: flex;
1324
- gap: 0;
1325
- border: 1px solid var(--brand-200, var(--c-theme-200));
1326
- border-radius: 4px;
1327
- overflow: hidden;
1328
- background: white;
1329
- }
1330
-
1331
- &__radioOption {
1332
- position: relative;
1333
- cursor: pointer;
1334
- display: flex;
1335
- align-items: center;
1336
- justify-content: center;
1337
- padding: 8px 16px;
1338
- background: white;
1339
- color: #686F73;
1340
- font-size: 14px;
1341
- font-weight: 500;
1342
- transition: all 0.2s ease;
1343
- border: none;
1344
- min-width: 80px;
1345
-
1346
- &:first-child {
1347
- border-right: 1px solid var(--brand-200, var(--c-theme-200));
1348
- }
1349
-
1350
- &:hover {
1351
- background-color: #f8f8f8;
1352
- color: var(--c-theme-800);
1353
- }
1354
-
1355
- &.-selected {
1356
- background-color: var(--brand-200, var(--c-theme-200));
1357
- color: var(--brand-800, var(--c-theme-800));
1358
-
1359
- &:hover {
1360
- background-color: var(--brand-200, var(--c-theme-200));
1361
- color: var(--brand-800, var(--c-theme-800));
1362
- }
1363
- }
1364
- }
1365
-
1366
- &__results {
1367
- grid-column-start: 2;
1368
- }
1369
-
1370
- &__radioInput {
1371
- position: absolute;
1372
- opacity: 0;
1373
- width: 0;
1374
- height: 0;
1375
- pointer-events: none;
1376
- }
1377
-
1378
- &__radioLabel {
1379
- white-space: nowrap;
1380
- user-select: none;
1381
- }
1382
-
1383
- &__printButton {
1384
- color: #686F73;
1385
- }
1386
-
1387
- // Dropdown styles
1388
- &__vueSelectWrapper {
1389
- position: relative;
1390
-
1391
- // On mobile, add pointer cursor to indicate clickability
1392
- @media screen and (max-width: 767px) {
1393
- cursor: pointer;
1394
-
1395
- // Add a pseudo-element to capture clicks
1396
- &::before {
1397
- content: '';
1398
- position: absolute;
1399
- top: 0;
1400
- left: 0;
1401
- right: 0;
1402
- bottom: 0;
1403
- z-index: 10;
1404
- background: transparent;
1405
- }
1406
- }
1407
- }
1408
-
1409
- &__vueSelect {
1410
- &.v-select {
1411
- min-height: auto;
1412
- border: 0;
1413
- padding: 0;
1414
- }
1415
-
1416
- // On mobile, style disabled state to look normal and clickable
1417
- @media screen and (max-width: 767px) {
1418
- &.vs--disabled {
1419
- opacity: 1 !important;
1420
-
1421
- .vs__dropdown-toggle {
1422
- cursor: pointer !important;
1423
- background: #FDF9F7 !important;
1424
- border-color: #D6D6D6 !important;
1425
- }
1426
-
1427
- .vs__selected {
1428
- display: none !important;
1429
- }
1430
-
1431
- .vs__search {
1432
- cursor: pointer !important;
1433
- }
1434
- }
1435
- }
1436
-
1437
- .vs__dropdown-toggle {
1438
- border-radius: 5px !important;
1439
- border: 1px solid #D6D6D6 !important;
1440
- background: #FDF9F7 !important;
1441
- padding: 0 12px 0 12px !important;
1442
- height: 40px !important;
1443
- min-height: 40px !important;
1444
- max-height: 40px !important;
1445
- max-width: 100% !important;
1446
- display: flex !important;
1447
- align-items: center !important;
1448
- box-sizing: border-box !important;
1449
- outline: none !important;
1450
- overflow: hidden !important;
1451
- }
1452
-
1453
- &.vs--focused .vs__dropdown-toggle {
1454
- border: 1px solid var(--c-brand) !important; // Keep original border
1455
- outline: none !important;
1456
- box-sizing: border-box !important;
1457
- }
1458
-
1459
- &.vs--open .vs__dropdown-toggle {
1460
- border: 1px solid var(--c-brand) !important; // Keep original border
1461
- outline: none !important;
1462
- box-sizing: border-box !important;
1463
- }
1464
-
1465
- .vs__selected-options {
1466
- padding: 0;
1467
- flex-wrap: wrap;
1468
- gap: 4px;
1469
- max-width: calc(100% - 32px) !important; // Reserve space for dropdown arrow
1470
- overflow: hidden !important;
1471
- }
1472
-
1473
- .vs__search {
1474
- margin: 0 !important;
1475
- padding: 0 !important;
1476
- border: none !important;
1477
- font-size: 14px !important;
1478
- flex: 1 !important;
1479
- position: relative !important;
1480
- top: 0 !important;
1481
- left: 0 !important;
1482
-
1483
- @media screen and (min-width: 1070px) {
1484
- font-size: 16px !important;
1485
- }
1486
-
1487
- &::placeholder {
1488
- color: #666;
1489
- position: relative !important;
1490
- top: 0 !important;
1491
- left: 0 !important;
1492
- }
1493
- }
1494
-
1495
- &.vs--open {
1496
- border: none !important;
1497
- .vs__search {
1498
- margin: 0 !important;
1499
- padding: 0 !important;
1500
- position: relative !important;
1501
- top: 0 !important;
1502
- left: 0 !important;
1503
-
1504
- &::placeholder {
1505
- position: relative !important;
1506
- top: 0 !important;
1507
- left: 0 !important;
1508
- }
1509
- }
1510
-
1511
- .vs__dropdown-toggle {
1512
- padding: 0 12px 0 12px !important;
1513
- }
1514
-
1515
- .vs__selected-options {
1516
- padding: 0 !important;
1517
- }
1518
- }
1519
-
1520
- .vs__selected {
1521
- display: none !important;
1522
-
1523
- .vs__deselect {
1524
- color: white;
1525
- position: absolute !important;
1526
- right: 4px !important;
1527
- top: 50% !important;
1528
- transform: translateY(-50%) !important;
1529
- margin: 0 !important;
1530
- display: flex !important;
1531
- align-items: center !important;
1532
- justify-content: center !important;
1533
- width: 16px !important;
1534
- height: 16px !important;
1535
- }
1536
- }
1537
-
1538
- .vs__dropdown-menu {
1539
- border: 1px solid #D6D6D6;
1540
- border-radius: 5px;
1541
- box-shadow: 0px 4px 16px 0px rgba(0, 0, 0, 0.12);
1542
- max-height: 200px;
1543
- overflow-y: auto;
1544
- padding: 8px 0;
1545
- display: grid;
1546
- gap: 0.75rem;
1547
- }
1548
-
1549
- .vs__dropdown-option {
1550
- padding: 12px 16px;
1551
- cursor: pointer;
1552
- font-size: 17px !important;
1553
- margin: 0 16px;
1554
- border-radius: 4px;
1555
- white-space: normal !important;
1556
- word-wrap: break-word !important;
1557
- overflow-wrap: break-word !important;
1558
- line-height: 1.4 !important;
1559
-
1560
- &:hover,
1561
- &--highlight {
1562
- color: var(--c-theme-400) !important;
1563
- }
1564
- }
1565
-
1566
- .vs__actions {
1567
- padding: 0 12px 0 8px !important;
1568
- margin: 0 !important;
1569
- display: flex !important;
1570
- position: relative !important;
1571
- align-items: center !important;
1572
- justify-content: center !important;
1573
- height: 38px !important;
1574
- min-width: 32px !important;
1575
- flex-shrink: 0 !important;
1576
-
1577
- &::after {
1578
- content: '' !important;
1579
- border: 1px solid var(--c-theme-800) !important;
1580
- border-width: 0 1.5px 1.5px 0 !important;
1581
- display: inline-block !important;
1582
- padding: 4px !important;
1583
- transform: rotate(45deg) !important;
1584
- transition: transform 0.3s ease !important;
1585
- position: absolute !important;
1586
- top: 50% !important;
1587
- right: 0 !important;
1588
- margin-top: -6px !important;
1589
- z-index: 10 !important;
1590
- pointer-events: none !important;
1591
-
1592
- @media screen and (min-width: 768px) {
1593
- right: 12px !important;
1594
- }
1595
- }
1596
- }
1597
-
1598
- .vs__open-indicator {
1599
- display: none !important;
1600
- opacity: 0 !important;
1601
- visibility: hidden !important;
1602
- }
1603
-
1604
- &.vs--open .vs__actions::after {
1605
- transform: rotate(-135deg) !important;
1606
- }
1607
-
1608
- }
1609
-
1610
- &__selectOption {
1611
- display: flex;
1612
- justify-content: space-between;
1613
- align-items: center;
1614
- width: 100%;
1615
- gap: 4px;
1616
-
1617
- span {
1618
- white-space: normal;
1619
- word-wrap: break-word;
1620
- overflow-wrap: break-word;
1621
- line-height: 1.4;
1622
- min-width: 0; // Important for flex wrapping
1623
- max-width: calc(100% - 30px); // Reserve minimal space for count
1624
- }
1625
- }
1626
-
1627
- &__selectCount {
1628
- color: #999;
1629
- font-size: 11px;
1630
- margin-left: 2px;
1631
- padding: 0 2px;
1632
- flex-shrink: 0;
1633
- align-self: flex-start;
1634
- min-width: 0;
1635
- width: fit-content;
1636
- white-space: nowrap;
1637
- line-height: 1.2;
1638
- }
1639
-
1640
- &__searchWithIcon {
1641
- display: flex;
1642
- align-items: center;
1643
- gap: 8px;
1644
- width: 100%;
1645
- padding: 0;
1646
- }
1647
-
1648
- &__venueIcon,
1649
- &__ensembleIcon {
1650
- flex-shrink: 0;
1651
- color: #666;
1652
- width: 19px;
1653
- height: 18px;
1654
- max-height: 18px;
1655
- }
1656
-
1657
- // Search Results
1658
- &__resultsByDate,
1659
- &__resultsByEvent {
1660
- padding: 0 20px;
1661
-
1662
- @media screen and (min-width: 768px) {
1663
- padding: 0 80px;
1664
- }
1665
-
1666
- @media screen and (min-width: 1070px) {
1667
- margin-left: 60px;
1668
- padding: 0 80px;
1669
- }
1670
- }
1671
-
1672
-
1673
- &__resultsCount {
1674
- color: #686F73;
1675
- display: inline-block;
1676
- font-size: var(--font-size-3);
1677
- font-weight: var(--font-weight-bold);
1678
- margin-bottom: .75rem;
1679
- }
1680
-
1681
- // Results by Date View
1682
- &__resultsByDate {
1683
- .eventsCalendar__eventImage {
1684
- width: 222px;
1685
- height: 139px;
1686
- margin-left: 0;
1687
-
1688
- @media screen and (min-width: 768px) {
1689
- margin-left: auto;
1690
- }
1691
- }
1692
-
1693
- .eventsCalendar__eventTitle {
1694
- font-size: 18px;
1695
-
1696
- @media screen and (min-width: 1070px) {
1697
- font-size: 22px;
1698
- }
1699
- }
1700
-
1701
- .eventsCalendar__eventDate,
1702
- .eventsCalendar__eventVenue,
1703
- .eventsCalendar__eventActions {
1704
- font-size: var(--font-size-1);
1705
-
1706
- @media screen and (min-width: 1070px) {
1707
- font-size: var(--font-size-2);
1708
- }
1709
- }
1710
-
1711
- .eventsCalendar__eventCard {
1712
- @media screen and (min-width: 1070px) {
1713
- grid-template-columns: 1fr 2fr 1fr;
1714
- grid-template-areas: "status content image";
1715
- }
1716
- }
1717
-
1718
- .eventsCalendar__eventDetails {
1719
- margin-top: .5rem;
1720
-
1721
- @media screen and (min-width: 1070px) {
1722
- margin-top: 1rem;
1723
- }
1724
- }
1725
- }
1726
-
1727
- // Results by Event View
1728
- &__resultsByEvent {
1729
- .eventsCalendar__eventImage {
1730
- width: 100%;
1731
- max-width: 100%;
1732
- height: auto;
1733
- margin-left: 0;
1734
-
1735
- @media screen and (min-width: 768px) {
1736
- max-width: 580px;
1737
- height: 360px;
1738
- margin-left: auto;
1739
- }
1740
- }
1741
-
1742
- .eventsCalendar__eventImg {
1743
- height: auto;
1744
- aspect-ratio: 16 / 10;
1745
-
1746
- @media screen and (min-width: 768px) {
1747
- height: 360px;
1748
- aspect-ratio: 580 / 360;
1749
- }
1750
- }
1751
-
1752
- .eventsCalendar__eventTitle {
1753
- font-size: var(--font-size-3);
1754
-
1755
- @media screen and (min-width: 1070px) {
1756
- font-size: 40px;
1757
- }
1758
- }
1759
-
1760
- .eventsCalendar__eventDetails {
1761
- margin-top: 1rem;
1762
-
1763
- @media screen and (min-width: 1070px) {
1764
- margin-top: 1.5rem;
1765
- }
1766
- }
1767
-
1768
- .eventsCalendar__eventDate,
1769
- .eventsCalendar__eventVenue,
1770
- .eventsCalendar__eventActions {
1771
- font-size: var(--font-size-2);
1772
-
1773
- @media screen and (min-width: 1070px) {
1774
- font-size: 22px;
1775
- }
1776
- }
1777
-
1778
- .eventsCalendar__eventCard {
1779
- .eventsCalendar__eventMeta {
1780
- display: none;
1781
- }
1782
-
1783
- @media screen and (min-width: 1070px) {
1784
- grid-template-columns: 1fr 1fr;
1785
- grid-template-areas: "content image";
1786
- }
1787
- }
1788
- }
1789
-
1790
- &__eventDetails {
1791
- display: flex;
1792
- flex-direction: column;
1793
- gap: 0.5rem;
1794
- }
1795
-
1796
- &__eventActions {
1797
- margin-top: 1rem;
1798
- display: flex;
1799
- gap: 1rem;
1800
-
1801
- @media screen and (min-width: 1070px) {
1802
- margin-top: 1.5rem;
1803
- }
1804
- }
1805
-
1806
- &__ticketLink {
1807
- color: var(--brand-600, var(--c-theme-600));
1808
- font-weight: 700;
1809
- display: flex;
1810
- align-items: center;
1811
- gap: 0.5rem;
1812
- transition: color 0.2s, text-decoration 0.2s;
1813
-
1814
- &:hover {
1815
- color: var(--brand-800, var(--c-theme-800));
1816
- text-decoration: underline;
1817
- }
1818
- }
1819
-
1820
- &__eventLink {
1821
- color: #686F73;
1822
- transition: color 0.2s, text-decoration 0.2s;
1823
-
1824
- &:hover {
1825
- color: var(--c-theme-800);
1826
- text-decoration: underline;
1827
- }
1828
- }
1829
-
1830
- &__monthTitle {
1831
- font-size: var(--font-size-3);
1832
- font-weight: 700;
1833
- border-bottom: 1px solid #D3D0CD;
1834
- border-top: 1px solid #D3D0CD;
1835
- padding-top: .5rem;
1836
- padding-bottom: .5rem;
1837
- margin-bottom: .5rem;
1838
- }
1839
-
1840
- &__eventCard {
1841
- display: grid;
1842
- grid-template-columns: 1fr;
1843
- gap: 1rem;
1844
- margin-top: 1rem;
1845
- border-bottom: 1px solid #D3D0CD;
1846
- padding-bottom: 1rem;
1847
- margin-bottom: 1rem;
1848
-
1849
- @media screen and (min-width: 1070px) {
1850
- gap: 2rem;
1851
- align-items: start;
1852
- margin-top: 1.5rem;
1853
- padding-bottom: 1.5rem;
1854
- margin-bottom: 1.5rem;
1855
- }
1856
-
1857
- &:last-child {
1858
- border-bottom: none;
1859
- margin-bottom: 0;
1860
- }
1861
- }
1862
-
1863
- &__eventMeta {
1864
- justify-self: start;
1865
-
1866
- @media screen and (min-width: 1070px) {
1867
- grid-area: status;
1868
- }
1869
- }
1870
-
1871
- &__eventStatus {
1872
- font-size: var(--font-size-1);
1873
- padding: 9px 12px;
1874
- border-radius: 5px;
1875
- border: 1px solid var(--status-border-default);
1876
- background-color: transparent;
1877
- color: var(--status-color-default);
1878
-
1879
- // Import status styles from Dropdown component
1880
- &.-status {
1881
- background-color: var(--status-border-default);
1882
- color: var(--status-color-default);
1883
- }
1884
-
1885
- &.-cancelled {
1886
- background-color: transparent;
1887
- border: 1px solid var(--status-border-cancelled);
1888
- color: var(--status-color-cancelled);
1889
- }
1890
-
1891
- &.-rescheduled {
1892
- background-color: transparent;
1893
- border: 1px solid var(--status-border-rescheduled);
1894
- color: var(--status-color-rescheduled);
1895
- }
1896
-
1897
- &.-postponed {
1898
- background-color: transparent;
1899
- border: 1px solid var(--status-border-postponed);
1900
- color: var(--status-color-postponed);
1901
- }
1902
-
1903
- &.-sold-out {
1904
- background-color: transparent;
1905
- border: 1px solid var(--status-border-sold-out);
1906
- color: var(--status-color-sold-out);
1907
- }
1908
-
1909
- &.-best-availability {
1910
- background-color: transparent;
1911
- border-color: var(--status-border-best-availability);
1912
- color: var(--status-color-best-availability);
1913
- }
1914
-
1915
- &.-limited-availability {
1916
- background-color: transparent;
1917
- border: 1px solid var(--status-border-limited-availability);
1918
- color: var(--status-color-limited-availability);
1919
- }
1920
-
1921
- &.-coming-soon {
1922
- background-color: transparent;
1923
- border: 1px solid var(--status-border-coming-soon);
1924
- color: var(--status-color-coming-soon);
1925
- }
1926
-
1927
- &.-past-date {
1928
- background-color: transparent;
1929
- border: 1px solid var(--status-border-default);
1930
- color: var(--status-color-default);
1931
- }
1932
-
1933
- &.-free {
1934
- background-color: transparent;
1935
- border: 1px solid var(--c-theme-400);
1936
- color: var(--c-theme-600);
1937
- }
1938
- }
1939
-
1940
- &__eventContent {
1941
- @media screen and (min-width: 1070px) {
1942
- grid-area: content;
1943
- }
1944
- }
1945
-
1946
- &__eventImage {
1947
- width: 222px;
1948
- height: 139px;
1949
- overflow: hidden;
1950
- border-radius: 4px;
1951
- flex-shrink: 0;
1952
-
1953
- @media screen and (min-width: 1070px) {
1954
- grid-area: image;
1955
- }
1956
-
1957
- @media screen and (max-width: 767px) {
1958
- width: 100%;
1959
- max-width: 222px;
1960
- height: 139px;
1961
- }
1962
- }
1963
-
1964
- &__eventImg {
1965
- border-radius: 4px;
1966
- width: 100%;
1967
- height: 139px;
1968
- object-fit: cover;
1969
- object-position: center;
1970
- aspect-ratio: 222 / 139;
1971
- }
1972
-
1973
- &__eventTitle {
1974
- font-weight: 700;
1975
- }
1976
-
1977
- &__eventNotice {
1978
- display: flex;
1979
- align-items: center;
1980
- gap: 0.5rem;
1981
- margin-top: 0.75rem;
1982
- font-weight: 500;
1983
- }
1984
-
1985
- &__eventNote {
1986
- margin-top: 0.75rem;
1987
- }
1988
-
1989
- &__noticeIcon {
1990
- display: flex;
1991
- align-items: center;
1992
- justify-content: center;
1993
- flex-shrink: 0;
1994
- width: 16px;
1995
- height: 16px;
1996
- }
1997
-
1998
- &__noticeIconSvg {
1999
- width: 100%;
2000
- height: 100%;
2001
- display: block;
2002
- fill: currentColor;
2003
- stroke: currentColor;
2004
-
2005
- use {
2006
- fill: inherit;
2007
- stroke: inherit;
2008
- }
2009
- }
2010
-
2011
- &__eventNote,
2012
- &__noticeText {
2013
- font-size: var(--font-size-1);
2014
- font-weight: var(--font-weight-bold);
2015
- line-height: 1.4;
2016
- }
2017
-
2018
- &__noticeText {
2019
- flex: 1;
2020
- }
2021
-
2022
- &__categories {
2023
- display: flex;
2024
- gap: 0.5rem;
2025
- margin-bottom: 1.5rem;
2026
- flex-wrap: wrap;
2027
- }
2028
-
2029
- &__category {
2030
- background-color: var(--brand-600, var(--c-theme-600));
2031
- color: white;
2032
- padding: .5rem .75rem;
2033
- border-radius: 3px;
2034
- font-size: var(--font-size-1);
2035
- font-weight: 500;
2036
-
2037
- // Second sibling and beyond get lighter styling
2038
- &:nth-child(n+2) {
2039
- background-color: var(--brand-200, var(--c-theme-200));
2040
- color: var(--brand-800, var(--c-theme-800));
2041
- }
2042
- }
2043
-
2044
- &__eventDate {
2045
- display: flex;
2046
- align-items: center;
2047
- gap: 0.5rem;
2048
- font-size: var(--font-size-1);
2049
-
2050
- @media screen and (min-width: 1070px) {
2051
- font-size: var(--font-size-2);
2052
- }
2053
- }
2054
-
2055
- &__eventVenue {
2056
- display: flex;
2057
- align-items: center;
2058
- gap: 0.5rem;
2059
- font-size: var(--font-size-1);
2060
-
2061
- @media screen and (min-width: 1070px) {
2062
- font-size: var(--font-size-2);
2063
- }
2064
- }
2065
-
2066
- &__venueLink {
2067
- text-decoration: underline;
2068
- transition: text-decoration 0.2s, color 0.2s;
2069
-
2070
- &:hover {
2071
- color: var(--c-brand);
2072
- text-decoration: underline;
2073
- }
2074
- }
2075
-
2076
- // Pagination styles
2077
- &__pagination {
2078
- margin-top: 2rem;
2079
- display: flex;
2080
- justify-content: center;
2081
- padding: 0 20px;
2082
-
2083
- @media screen and (min-width: 768px) {
2084
- padding: 0 80px;
2085
- }
2086
-
2087
- @media screen and (min-width: 1070px) {
2088
- margin-left: 60px;
2089
- padding: 0 80px;
2090
- }
2091
- }
2092
-
2093
- &__paginationComponent {
2094
- .ais-Pagination {
2095
- &-list {
2096
- display: flex;
2097
- align-items: center;
2098
- gap: 0.5rem;
2099
- list-style: none;
2100
- margin: 0;
2101
- padding: 0;
2102
- }
2103
-
2104
- &-item {
2105
- &--firstPage,
2106
- &--previousPage,
2107
- &--page,
2108
- &--nextPage,
2109
- &--lastPage {
2110
- .ais-Pagination-link {
2111
- display: flex;
2112
- align-items: center;
2113
- justify-content: center;
2114
- min-width: 40px;
2115
- height: 40px;
2116
- padding: 0 12px;
2117
- border: 1px solid #D6D6D6;
2118
- border-radius: 4px;
2119
- background: white;
2120
- color: #333;
2121
- text-decoration: none;
2122
- font-size: var(--font-size-1);
2123
- transition: all 0.2s;
2124
-
2125
- &:hover {
2126
- background: #f5f5f5;
2127
- border-color: #999;
2128
- }
2129
- }
2130
- }
2131
-
2132
- &--selected {
2133
- .ais-Pagination-link {
2134
- background: var(--c-brand, #007bff);
2135
- color: white;
2136
- border-color: var(--c-brand, #007bff);
2137
- }
2138
- }
2139
-
2140
- &--disabled {
2141
- .ais-Pagination-link {
2142
- opacity: 0.5;
2143
- cursor: not-allowed;
2144
-
2145
- &:hover {
2146
- background: white;
2147
- border-color: #D6D6D6;
2148
- }
2149
- }
2150
- }
2151
- }
2152
- }
2153
- }
2154
-
2155
- // Mobile date picker modal styles
2156
- .dp__mobile_modal {
2157
- .dp__menu {
2158
- position: static !important;
2159
- top: auto !important;
2160
- left: auto !important;
2161
- right: auto !important;
2162
- bottom: auto !important;
2163
- width: 100% !important;
2164
- height: auto !important;
2165
- max-width: none !important;
2166
- max-height: none !important;
2167
- border-radius: 0 !important;
2168
- z-index: auto !important;
2169
- background: transparent !important;
2170
- box-shadow: none !important;
2171
- border: none !important;
2172
- margin: 0 !important;
2173
- padding: 0 !important;
2174
- }
2175
-
2176
- .dp__modal_body {
2177
- padding: 1rem !important;
2178
- flex: 1 !important;
2179
- display: flex !important;
2180
- flex-direction: column !important;
2181
- }
2182
- }
2183
-
2184
- // Filter modal styles (venue and ensemble)
2185
- .venue__mobile_modal,
2186
- .ensemble__mobile_modal {
2187
- .eventsModal__venueContainer,
2188
- .eventsModal__ensembleContainer {
2189
- padding: 1rem;
2190
- max-height: 60vh;
2191
- overflow-y: auto;
2192
- }
2193
-
2194
- // Ensure checkboxes are visible in modals
2195
- // input[type="checkbox"] {
2196
- // display: block !important;
2197
- // opacity: 1 !important;
2198
- // visibility: visible !important;
2199
- // width: 20px !important;
2200
- // height: 20px !important;
2201
- // margin: 0 !important;
2202
- // padding: 0 !important;
2203
- // border: 2px solid #ccc !important;
2204
- // border-radius: 3px !important;
2205
- // background: white !important;
2206
- // appearance: checkbox !important;
2207
- // -webkit-appearance: checkbox !important;
2208
- // -moz-appearance: checkbox !important;
2209
-
2210
- // &:checked {
2211
- // background: var(--c-brand, #007bff) !important;
2212
- // border-color: var(--c-brand, #007bff) !important;
2213
- // }
2214
- // }
2215
- }
2216
-
2217
- // Desktop dropdown checkbox styles (matching mobile modal)
2218
- // .eventsCalendar__checkbox {
2219
- // margin: 0 12px 0 0 !important;
2220
- // flex-shrink: 0;
2221
- // width: 20px !important;
2222
- // height: 20px !important;
2223
- // min-width: 20px !important;
2224
- // min-height: 20px !important;
2225
- // accent-color: var(--c-brand, #007bff) !important;
2226
- // appearance: checkbox !important;
2227
- // -webkit-appearance: checkbox !important;
2228
- // -moz-appearance: checkbox !important;
2229
- // display: block !important;
2230
- // opacity: 1 !important;
2231
- // visibility: visible !important;
2232
- // position: relative !important;
2233
- // z-index: 1 !important;
2234
- // background: white !important;
2235
- // border: 2px solid #ccc !important;
2236
- // border-radius: 3px !important;
2237
- // cursor: pointer;
2238
-
2239
- // &:checked {
2240
- // background: var(--c-brand, #007bff) !important;
2241
- // border-color: var(--c-brand, #007bff) !important;
2242
- // }
2243
- // }
2244
-
2245
- // Desktop venue dropdown styles
2246
- .eventsCalendar__selectOption--venue {
2247
- display: flex;
2248
- align-items: center;
2249
- gap: 12px;
2250
-
2251
- .eventsCalendar__venueInfo {
2252
- flex: 1;
2253
- }
2254
-
2255
- .eventsCalendar__venueName {
2256
- display: block;
2257
- font-weight: 500;
2258
- }
2259
-
2260
- .eventsCalendar__venueCity {
2261
- display: block;
2262
- font-size: 14px;
2263
- color: #686F73;
2264
- font-weight: 400;
2265
- }
2266
- }
2267
-
2268
- // Desktop ensemble dropdown styles
2269
- .eventsCalendar__selectOption--ensemble {
2270
- display: flex;
2271
- align-items: center;
2272
- gap: 12px;
2273
-
2274
- span:not(.eventsCalendar__selectCount) {
2275
- flex: 1;
2276
- }
2277
- }
2278
-
2279
- // Make dropdown menus span across both venue and ensemble filters
2280
- .eventsCalendar__filtersRow {
2281
- position: relative;
2282
- }
2283
-
2284
- .eventsCalendar__filterGroup--venue,
2285
- .eventsCalendar__filterGroup--ensemble {
2286
- .vs__dropdown-menu {
2287
- position: absolute;
2288
- left: 0;
2289
- right: 0;
2290
- width: auto !important;
2291
- min-width: 100%;
2292
- z-index: 1000;
2293
-
2294
- // Calculate width to span both filter groups plus gap
2295
- // Assuming the filters row has the two filter groups side by side
2296
- @media (min-width: 768px) {
2297
- width: calc(200% + 1rem) !important; // 200% for both filters + gap between them
2298
- }
2299
- }
2300
- }
2301
-
2302
- // Ensure the ensemble dropdown menu aligns to the left edge of the filters row
2303
- .eventsCalendar__filterGroup--ensemble {
2304
- .vs__dropdown-menu {
2305
- // Position the ensemble dropdown to start from the venue filter position
2306
- left: calc(-100% - 1rem); // Move left by the width of venue filter + gap
2307
- }
2308
- }
2309
-
2310
- // Modal styles moved outside .eventsCalendar scope
2311
-
2312
- // Ensure modal button styles are applied globally
2313
- .event__buy-button-wrapper {
2314
- display: flex !important;
2315
- gap: 1rem !important;
2316
- justify-content: center !important;
2317
- width: 100% !important;
2318
- }
2319
-
2320
- .event__buy-button--secondary {
2321
- background: #F5F5F5 !important;
2322
- color: #333 !important;
2323
- border: 1px solid #ddd !important;
2324
-
2325
- &:hover {
2326
- background: #e5e5e5 !important;
2327
- }
2328
- }
2329
- }
2330
-
2331
- /* Filter modal styles - outside eventsCalendar scope since modals are in document.body */
2332
- .eventsModal .filterModal__items {
2333
- display: flex;
2334
- flex-direction: column;
2335
- gap: 0.75rem;
2336
- }
2337
-
2338
- .eventsModal .filterModal__item:has(input:checked) {
2339
- border-color: var(--c-brand, #007bff);
2340
- background-color: #f0f8ff;
2341
- }
2342
-
2343
- .eventsModal .filterModal__itemLabel {
2344
- display: flex;
2345
- align-items: center;
2346
- cursor: pointer;
2347
- gap: 0.75rem;
2348
- width: 100%;
2349
- margin: 0;
2350
- }
2351
-
2352
- // .eventsModal .filterModal__itemLabel input[type="checkbox"] {
2353
- // margin: 0 !important;
2354
- // flex-shrink: 0;
2355
- // width: 20px !important;
2356
- // height: 20px !important;
2357
- // min-width: 20px !important;
2358
- // min-height: 20px !important;
2359
- // accent-color: var(--c-brand, #007bff) !important;
2360
- // appearance: checkbox !important;
2361
- // -webkit-appearance: checkbox !important;
2362
- // -moz-appearance: checkbox !important;
2363
- // display: block !important;
2364
- // opacity: 1 !important;
2365
- // visibility: visible !important;
2366
- // position: relative !important;
2367
- // z-index: 1 !important;
2368
- // background: white !important;
2369
- // border: 2px solid #ccc !important;
2370
- // border-radius: 3px !important;
2371
- // }
2372
-
2373
- // .eventsModal .filterModal__itemLabel input[type="checkbox"]:checked {
2374
- // background: var(--c-brand, #007bff) !important;
2375
- // border-color: var(--c-brand, #007bff) !important;
2376
- // }
2377
-
2378
- .eventsModal .filterModal__itemText {
2379
- flex: 1;
2380
- font-size: 16px;
2381
- line-height: 1.4;
2382
- color: var(--c-theme-800, #333);
2383
- }
2384
-
2385
- .eventsModal .filterModal__venueName {
2386
- display: block;
2387
- }
2388
-
2389
- .eventsModal .filterModal__venueCity {
2390
- display: block;
2391
- font-size: 14px;
2392
- color: #686F73;
2393
- font-weight: 400;
2394
- }
2395
-
2396
- // Calendar styles
2397
- .dp__menu {
2398
- @media (max-width: 768px) {
2399
- border: none !important;
2400
- }
2401
- }
2402
-
2403
- // Desktop positioning for date picker to span across Date and Venue inputs
2404
- .eventsCalendar__filterGroup--date {
2405
- @media (min-width: 769px) {
2406
- position: relative;
2407
- }
2408
-
2409
- .dp__outer_menu_wrap {
2410
- @media (min-width: 769px) {
2411
- position: absolute !important;
2412
- left: 0 !important;
2413
- top: calc(100% + .5rem) !important;
2414
- width: calc(200% + 1rem) !important;
2415
- z-index: 1000 !important;
2416
- }
2417
-
2418
- .dp__menu {
2419
- @media (min-width: 769px) {
2420
- width: 100% !important;
2421
- left: 0 !important;
2422
- }
2423
- }
2424
- }
2425
- }
2426
-
2427
- .dp__menu_inner {
2428
- --dp-menu-padding: 16px 8px;
2429
- @media (max-width: 769px) {
2430
- --dp-menu-padding: 0 !important;
2431
- }
2432
- }
2433
-
2434
- .dp__cell_inner.dp__today {
2435
- border-radius: 50% !important;
2436
- border-color: var(--c-brand) !important;
2437
- color: var(--c-brand) !important;
2438
- }
2439
-
2440
- .dp__cell_inner {
2441
- --dp-cell-border-radius: 16px !important;
2442
- --dp-font-size: 14px !important;
2443
- --dp-cell-size: 48px;
2444
- font-size: var(--dp-font-size);
2445
- }
2446
-
2447
- .dp__range_start,
2448
- .dp__range_end {
2449
- --dp-cell-border-radius: 32px !important;
2450
- --dp-primary-color: var(--c-brand) !important;
2451
- }
2452
-
2453
- .dp__range_between {
2454
- --dp-range-between-dates-background-color: var(--c-theme-200) !important;
2455
- --dp-range-between-dates-text-color: var(--c-theme-400) !important;
2456
- border: none !important;
2457
- }
2458
-
2459
- .dp__calendar_item,
2460
- .dp__calendar_header_item {
2461
- flex-grow: 0 !important;
2462
- --dp-cell-size: 48px;
2463
- }
2464
-
2465
- .dp--year-select, .dp__month_year_select {
2466
- font-size: 22px !important;
2467
- font-weight: 800 !important;
2468
- --dp-text-color: var(--c-theme-800) !important;
2469
- }
2470
-
2471
- .dp__calendar_header_item {
2472
- color: #686F73 !important;
2473
- }
2474
-
2475
- // Date picker action buttons to match mobile modal buttons
2476
- .dp__action_buttons {
2477
- gap: 12px !important;
2478
- }
2479
-
2480
- .dp__action_button {
2481
- padding: 16px 24px !important;
2482
- border-radius: 8px !important;
2483
- font-weight: 600 !important;
2484
- font-size: 17px !important;
2485
- border: none !important;
2486
- cursor: pointer !important;
2487
- transition: all 0.2s ease !important;
2488
-
2489
- &.dp__action_select {
2490
- background: var(--c-brand, #007bff) !important;
2491
- color: white !important;
2492
-
2493
- &:hover {
2494
- background: var(--c-brand-dark, #0056b3) !important;
2495
- }
2496
- }
2497
-
2498
- &.dp__action_cancel {
2499
- background: #F5F5F5 !important;
2500
- color: #333 !important;
2501
- border: none !important;
2502
- font-weight: 400 !important;
2503
-
2504
- &:hover {
2505
- background: #e8e8e8 !important;
2506
- }
2507
- }
2508
- }
2509
- .dp__calendar_header_separator{
2510
- height: 0 !important;
2511
- }
2512
-
2513
- .dp__month_year_wrap {
2514
- margin-bottom: .5rem !important;
2515
- }
2516
-
2517
- .dp__action_row {
2518
- border-top: 1px solid #D6D6D6 !important;
2519
- }
2520
- </style>