@getmicdrop/svelte-components 5.5.1 → 5.5.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.
- package/dist/calendar/AboutShow/AboutShow.svelte +172 -172
- package/dist/calendar/Calendar/MiniMonthCalendar.svelte +782 -782
- package/dist/calendar/FAQs/FAQs.svelte +75 -75
- package/dist/calendar/MonthSwitcher/MonthSwitcher.svelte +126 -126
- package/dist/calendar/OrderSummary/OrderSummary.svelte +367 -367
- package/dist/calendar/PublicCard/PublicCard.svelte +134 -134
- package/dist/calendar/ShowCard/ShowCard.svelte +157 -157
- package/dist/calendar/ShowTimeCard/ShowTimeCard.svelte +61 -61
- package/dist/components/Layout/Grid.svelte +4 -4
- package/dist/components/Layout/Section.svelte +80 -80
- package/dist/components/Layout/Sidebar.svelte +108 -108
- package/dist/components/Layout/Stack.svelte +6 -6
- package/dist/constants/validation.js +91 -91
- package/dist/constants/validation.spec.js +64 -64
- package/dist/index.d.ts +1 -0
- package/dist/index.js +223 -222
- package/dist/patterns/data/DataGrid.svelte +45 -45
- package/dist/patterns/data/DataList.svelte +24 -24
- package/dist/patterns/data/DataTable.svelte +36 -36
- package/dist/patterns/forms/FormActions.spec.js +88 -88
- package/dist/patterns/forms/FormActions.stories.svelte +97 -97
- package/dist/patterns/forms/FormActions.svelte +46 -46
- package/dist/patterns/forms/FormGrid.svelte +33 -33
- package/dist/patterns/forms/FormSection.svelte +32 -32
- package/dist/patterns/forms/FormValidationSummary.stories.svelte +83 -83
- package/dist/patterns/forms/FormValidationSummary.svelte +33 -33
- package/dist/patterns/layout/Sidebar.svelte +39 -39
- package/dist/patterns/navigation/BottomNav.stories.svelte +117 -117
- package/dist/patterns/navigation/BottomNav.svelte +20 -20
- package/dist/patterns/navigation/Header.stories.svelte +77 -77
- package/dist/patterns/navigation/Header.svelte +193 -193
- package/dist/patterns/page/PageHeader.svelte +18 -18
- package/dist/patterns/page/PageLayout.svelte +40 -40
- package/dist/patterns/page/PageLoader.spec.js +54 -54
- package/dist/patterns/page/PageLoader.stories.svelte +137 -137
- package/dist/patterns/page/PageLoader.svelte +24 -24
- package/dist/patterns/page/SectionHeader.svelte +29 -29
- package/dist/presets/badges.js +112 -112
- package/dist/presets/buttons.js +76 -76
- package/dist/presets/index.js +9 -9
- package/dist/primitives/Accordion/Accordion.stories.svelte +75 -75
- package/dist/primitives/Accordion/Accordion.svelte +42 -42
- package/dist/primitives/Accordion/AccordionItem.svelte +95 -95
- package/dist/primitives/Alert/Alert.spec.js +170 -170
- package/dist/primitives/Alert/Alert.stories.svelte +88 -88
- package/dist/primitives/Alert/Alert.svelte +27 -27
- package/dist/primitives/Avatar/Avatar.stories.svelte +94 -94
- package/dist/primitives/Avatar/Avatar.svelte +66 -66
- package/dist/primitives/Badges/Badge.spec.js +103 -103
- package/dist/primitives/Badges/Badge.stories.svelte +86 -86
- package/dist/primitives/Badges/Badge.svelte +79 -79
- package/dist/primitives/BottomSheet/BottomSheet.spec.js +127 -127
- package/dist/primitives/BottomSheet/BottomSheet.stories.svelte +83 -83
- package/dist/primitives/BottomSheet/BottomSheet.svelte +100 -100
- package/dist/primitives/Breadcrumb/Breadcrumb.spec.js +120 -120
- package/dist/primitives/Breadcrumb/Breadcrumb.stories.svelte +23 -23
- package/dist/primitives/Breadcrumb/Breadcrumb.svelte +89 -89
- package/dist/primitives/Button/Button.spec.js +211 -211
- package/dist/primitives/Button/Button.stories.svelte +76 -76
- package/dist/primitives/Button/Button.svelte +270 -270
- package/dist/primitives/Button/ButtonSaveDemo.spec.js +48 -48
- package/dist/primitives/Button/ButtonSaveDemo.svelte +25 -25
- package/dist/primitives/Button/ButtonVariantShowcase.svelte +129 -129
- package/dist/primitives/Card.spec.js +49 -49
- package/dist/primitives/Card.stories.svelte +22 -22
- package/dist/primitives/Card.svelte +28 -28
- package/dist/primitives/Checkbox/Checkbox.stories.svelte +84 -84
- package/dist/primitives/Checkbox/Checkbox.svelte +88 -88
- package/dist/primitives/DarkModeToggle.spec.js +357 -357
- package/dist/primitives/DarkModeToggle.stories.svelte +57 -57
- package/dist/primitives/DarkModeToggle.svelte +136 -136
- package/dist/primitives/Drawer/Drawer.stories.svelte +80 -80
- package/dist/primitives/Drawer/Drawer.svelte +120 -120
- package/dist/primitives/Dropdown/Dropdown.stories.svelte +137 -137
- package/dist/primitives/Dropdown/Dropdown.svelte +14 -14
- package/dist/primitives/Dropdown/DropdownItem.svelte +80 -80
- package/dist/primitives/Icons/ArrowLeft.svelte +8 -8
- package/dist/primitives/Icons/ArrowRight.svelte +8 -8
- package/dist/primitives/Icons/Availability.svelte +14 -14
- package/dist/primitives/Icons/Back.svelte +14 -14
- package/dist/primitives/Icons/CheckCircle.svelte +6 -6
- package/dist/primitives/Icons/CheckCircleOutline.svelte +15 -15
- package/dist/primitives/Icons/ChevronLeft.svelte +4 -4
- package/dist/primitives/Icons/ChevronRight.svelte +4 -4
- package/dist/primitives/Icons/Copy.svelte +15 -15
- package/dist/primitives/Icons/Cross.svelte +5 -5
- package/dist/primitives/Icons/DownArrow.svelte +8 -8
- package/dist/primitives/Icons/ErrorCircle.svelte +6 -6
- package/dist/primitives/Icons/FacebookIcon.svelte +2 -2
- package/dist/primitives/Icons/Home.svelte +15 -15
- package/dist/primitives/Icons/Icon.spec.js +169 -169
- package/dist/primitives/Icons/Icon.stories.svelte +100 -100
- package/dist/primitives/Icons/Icon.svelte +52 -52
- package/dist/primitives/Icons/IconGallery.stories.svelte +235 -235
- package/dist/primitives/Icons/Info.svelte +7 -7
- package/dist/primitives/Icons/InstagramIcon.svelte +4 -4
- package/dist/primitives/Icons/LogoInstagram.svelte +2 -2
- package/dist/primitives/Icons/Message.svelte +15 -15
- package/dist/primitives/Icons/MoonIcon.svelte +5 -5
- package/dist/primitives/Icons/More.svelte +21 -21
- package/dist/primitives/Icons/MoreHori.spec.js +61 -61
- package/dist/primitives/Icons/MoreHori.svelte +22 -22
- package/dist/primitives/Icons/Notification.svelte +14 -14
- package/dist/primitives/Icons/Payment.svelte +14 -14
- package/dist/primitives/Icons/Profile.svelte +21 -21
- package/dist/primitives/Icons/Reload.svelte +29 -29
- package/dist/primitives/Icons/Shows.svelte +21 -21
- package/dist/primitives/Icons/Signout.svelte +21 -21
- package/dist/primitives/Icons/SunIcon.svelte +8 -8
- package/dist/primitives/Icons/TiktokIcon.svelte +2 -2
- package/dist/primitives/Icons/TwitterIcon.svelte +2 -2
- package/dist/primitives/Icons/WarningIcon.spec.js +18 -18
- package/dist/primitives/Icons/WarningIcon.svelte +5 -5
- package/dist/primitives/Input/Input.spec.js +573 -573
- package/dist/primitives/Input/Input.stories.svelte +139 -139
- package/dist/primitives/Input/Input.svelte +392 -392
- package/dist/primitives/Input/Select.spec.js +218 -218
- package/dist/primitives/Input/Select.stories.svelte +112 -112
- package/dist/primitives/Input/Select.svelte +128 -128
- package/dist/primitives/Input/Textarea.stories.svelte +137 -137
- package/dist/primitives/Input/Textarea.svelte +35 -35
- package/dist/primitives/Label/Label.svelte +37 -37
- package/dist/primitives/Modal/Modal.spec.js +95 -95
- package/dist/primitives/Modal/Modal.stories.svelte +86 -86
- package/dist/primitives/Modal/Modal.svelte +158 -158
- package/dist/primitives/NumberInput/NumberInput.svelte +106 -106
- package/dist/primitives/Pagination/Pagination.stories.svelte +76 -76
- package/dist/primitives/Pagination/Pagination.svelte +261 -261
- package/dist/primitives/Radio/Radio.stories.svelte +80 -80
- package/dist/primitives/Radio/Radio.svelte +67 -67
- package/dist/primitives/Skeleton/CardPlaceholder.svelte +87 -87
- package/dist/primitives/Skeleton/ImagePlaceholder.svelte +59 -59
- package/dist/primitives/Skeleton/ListPlaceholder.svelte +76 -76
- package/dist/primitives/Skeleton/Skeleton.stories.svelte +151 -151
- package/dist/primitives/Skeleton/Skeleton.svelte +26 -26
- package/dist/primitives/Spinner/Spinner.spec.js +75 -75
- package/dist/primitives/Spinner/Spinner.stories.svelte +29 -29
- package/dist/primitives/Spinner/Spinner.svelte +20 -20
- package/dist/primitives/Tabs/TabItem.svelte +49 -49
- package/dist/primitives/Tabs/Tabs.stories.svelte +112 -112
- package/dist/primitives/Tabs/Tabs.svelte +123 -123
- package/dist/primitives/Toggle.spec.js +127 -127
- package/dist/primitives/Toggle.stories.svelte +92 -92
- package/dist/primitives/Toggle.svelte +71 -71
- package/dist/primitives/Typography/Typography.svelte +53 -53
- package/dist/primitives/ValidationError.spec.js +103 -103
- package/dist/primitives/ValidationError.stories.svelte +69 -69
- package/dist/primitives/ValidationError.svelte +29 -29
- package/dist/recipes/CropImage/CropImage.spec.js +216 -216
- package/dist/recipes/CropImage/CropImage.stories.svelte +104 -104
- package/dist/recipes/CropImage/CropImage.svelte +238 -238
- package/dist/recipes/ImageUploader/ImageUploader.stories.svelte +125 -125
- package/dist/recipes/ImageUploader/ImageUploader.svelte +804 -804
- package/dist/recipes/SuperLogin/SuperLogin.svelte +7 -6
- package/dist/recipes/SuperLogin/SuperLogin.svelte.d.ts.map +1 -1
- package/dist/recipes/Toaster/Toaster.stories.svelte +62 -62
- package/dist/recipes/feedback/EmptyState/EmptyState.svelte +1 -1
- package/dist/recipes/feedback/ErrorDisplay.spec.js +69 -69
- package/dist/recipes/feedback/ErrorDisplay.stories.svelte +101 -101
- package/dist/recipes/feedback/ErrorDisplay.svelte +1 -1
- package/dist/recipes/feedback/StatusIndicator/StatusIndicator.spec.js +129 -129
- package/dist/recipes/feedback/StatusIndicator/StatusIndicator.svelte +157 -157
- package/dist/recipes/fields/CheckboxField.svelte +85 -85
- package/dist/recipes/fields/FormField.svelte +58 -58
- package/dist/recipes/fields/RadioGroup.svelte +95 -95
- package/dist/recipes/fields/SelectField.svelte +80 -80
- package/dist/recipes/fields/TextareaField.svelte +97 -97
- package/dist/recipes/fields/ToggleField.svelte +60 -60
- package/dist/recipes/fields/index.js +7 -7
- package/dist/recipes/inputs/MultiSelect.spec.js +257 -257
- package/dist/recipes/inputs/MultiSelect.stories.svelte +133 -133
- package/dist/recipes/inputs/MultiSelect.svelte +249 -249
- package/dist/recipes/inputs/OTPInput.spec.js +238 -238
- package/dist/recipes/inputs/OTPInput.stories.svelte +162 -162
- package/dist/recipes/inputs/OTPInput.svelte +29 -29
- package/dist/recipes/inputs/PasswordInput.svelte +22 -22
- package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.spec.js +173 -173
- package/dist/recipes/inputs/PasswordStrengthIndicator/PasswordStrengthIndicator.svelte +43 -43
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.spec.js +300 -300
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.stories.svelte +123 -123
- package/dist/recipes/inputs/PlaceAutocomplete/PlaceAutocomplete.svelte +326 -326
- package/dist/recipes/inputs/Search.svelte +37 -37
- package/dist/recipes/inputs/SelectDropdown.svelte +57 -57
- package/dist/recipes/modals/AlertModal.svelte +130 -130
- package/dist/recipes/modals/ConfirmationModal.spec.js +191 -191
- package/dist/recipes/modals/ConfirmationModal.stories.svelte +119 -119
- package/dist/recipes/modals/ConfirmationModal.svelte +152 -152
- package/dist/recipes/modals/InputModal.svelte +182 -182
- package/dist/recipes/modals/ModalStateManager.spec.js +100 -100
- package/dist/recipes/modals/ModalStateManager.svelte +77 -77
- package/dist/recipes/modals/ModalTestWrapper.svelte +65 -65
- package/dist/recipes/modals/StatusModal.svelte +206 -206
- package/dist/services/EventService.js +75 -75
- package/dist/services/EventService.spec.js +217 -217
- package/dist/services/ShowService.spec.js +342 -342
- package/dist/stores/auth.js +36 -36
- package/dist/stores/auth.spec.js +139 -139
- package/dist/stores/toaster.js +13 -13
- package/dist/stories/ButtonAuditReview.stories.svelte +14 -14
- package/dist/stories/ButtonAuditReview.svelte +427 -427
- package/dist/stories/PatternsGallery.stories.svelte +19 -19
- package/dist/stories/PatternsGallery.svelte +206 -206
- package/dist/stories/PrimitivesGallery.stories.svelte +19 -19
- package/dist/stories/PrimitivesGallery.svelte +725 -725
- package/dist/stories/RecipesGallery.stories.svelte +19 -19
- package/dist/stories/RecipesGallery.svelte +271 -271
- package/dist/stories/button-audit-manifest.json +11186 -11186
- package/dist/tailwind/preset.cjs +82 -82
- package/dist/tokens/tokens.css +87 -87
- package/dist/utils/transitions.d.ts +24 -0
- package/dist/utils/transitions.d.ts.map +1 -0
- package/dist/utils/transitions.js +62 -0
- package/dist/utils/utils.js +354 -354
- package/package.json +283 -283
|
@@ -1,172 +1,172 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
import { CloseOutline, LogoInstagram } from '../../primitives/Icons';
|
|
3
|
-
import { typography } from '../../tokens/typography';
|
|
4
|
-
|
|
5
|
-
let {
|
|
6
|
-
performers = [],
|
|
7
|
-
ShowImage = '',
|
|
8
|
-
description = '',
|
|
9
|
-
showTitle = true,
|
|
10
|
-
title = "About the Show",
|
|
11
|
-
showReadMore = true,
|
|
12
|
-
getImageUrl = (url) => url,
|
|
13
|
-
} = $props();
|
|
14
|
-
|
|
15
|
-
let activePerformer = $state(null);
|
|
16
|
-
let characterLimit = 1500;
|
|
17
|
-
let showFullDescription = $state(false);
|
|
18
|
-
|
|
19
|
-
let validPerformers = $derived(performers.filter(performer => {
|
|
20
|
-
const isConfirmed = performer.acceptedState === 2;
|
|
21
|
-
const isNotHidden = !performer.shouldBeHidden;
|
|
22
|
-
const profile = performer.RosterPerformer?.User?.performerProfile;
|
|
23
|
-
const hasName = profile?.firstName || profile?.lastName || profile?.stageName;
|
|
24
|
-
return isConfirmed && isNotHidden && hasName;
|
|
25
|
-
}));
|
|
26
|
-
|
|
27
|
-
function togglePerformer(id) {
|
|
28
|
-
if (activePerformer === id) {
|
|
29
|
-
activePerformer = null;
|
|
30
|
-
} else {
|
|
31
|
-
activePerformer = id;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
function closePerformer() {
|
|
36
|
-
activePerformer = null;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
function toggleDescription() {
|
|
40
|
-
showFullDescription = !showFullDescription;
|
|
41
|
-
}
|
|
42
|
-
</script>
|
|
43
|
-
|
|
44
|
-
<div class="flex flex-col gap-3">
|
|
45
|
-
{#if showTitle}
|
|
46
|
-
<h2 class="{typography.h2} text-xl">{title}</h2>
|
|
47
|
-
{/if}
|
|
48
|
-
|
|
49
|
-
{#if ShowImage && description}
|
|
50
|
-
<div>
|
|
51
|
-
<img src={ShowImage} alt="" class="rounded-lg object-contain w-full bg-gray-50 dark:bg-gray-800" />
|
|
52
|
-
</div>
|
|
53
|
-
{/if}
|
|
54
|
-
|
|
55
|
-
{#if description}
|
|
56
|
-
{#if showFullDescription || description.length <= characterLimit || !showReadMore}
|
|
57
|
-
<p class={`${typography.sm} leading-relaxed whitespace-pre-line`}>{description}</p>
|
|
58
|
-
{#if showReadMore && description.length > characterLimit}
|
|
59
|
-
<button
|
|
60
|
-
onclick={toggleDescription}
|
|
61
|
-
class={`${typography.label} text-left hover:underline text-blue-700 dark:text-blue-500`}
|
|
62
|
-
>
|
|
63
|
-
Show less
|
|
64
|
-
</button>
|
|
65
|
-
{/if}
|
|
66
|
-
{:else}
|
|
67
|
-
<p class={`${typography.sm} leading-relaxed whitespace-pre-line`}>
|
|
68
|
-
{description.slice(0, characterLimit)}...
|
|
69
|
-
</p>
|
|
70
|
-
<button
|
|
71
|
-
onclick={toggleDescription}
|
|
72
|
-
class={`${typography.label} text-left hover:underline text-blue-700 dark:text-blue-500`}
|
|
73
|
-
>
|
|
74
|
-
Show more
|
|
75
|
-
</button>
|
|
76
|
-
{/if}
|
|
77
|
-
{/if}
|
|
78
|
-
|
|
79
|
-
{#if validPerformers.length > 0}
|
|
80
|
-
<div class="py-2">
|
|
81
|
-
{#if activePerformer !== null}
|
|
82
|
-
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
83
|
-
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
84
|
-
<div class="fixed inset-0 z-40" onclick={closePerformer}></div>
|
|
85
|
-
{/if}
|
|
86
|
-
|
|
87
|
-
<div class="flex flex-wrap justify-start gap-4">
|
|
88
|
-
{#each validPerformers as performer, index}
|
|
89
|
-
{@const profile = performer.RosterPerformer?.User?.performerProfile}
|
|
90
|
-
{@const displayName = profile?.useStageName && profile?.stageName
|
|
91
|
-
? profile.stageName
|
|
92
|
-
: `${profile?.firstName || ''} ${profile?.lastName || ''}`.trim()}
|
|
93
|
-
{@const firstName = profile?.firstName || displayName.split(' ')[0] || displayName}
|
|
94
|
-
<div class="relative">
|
|
95
|
-
{#if activePerformer === performer.ID && !performer.shouldBeHidden}
|
|
96
|
-
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
97
|
-
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
98
|
-
<div
|
|
99
|
-
class="w-72 sm:w-80 absolute bottom-full mb-2.5 rounded-lg p-4 z-50 shadow-xl transition-all duration-300 bg-white dark:bg-gray-800 border-2 border-blue-700 dark:border-blue-500 {index === 0 ? 'left-[190%]' : 'left-1/2 -translate-x-1/2'}"
|
|
100
|
-
onclick={(e) => e.stopPropagation()}
|
|
101
|
-
>
|
|
102
|
-
<div
|
|
103
|
-
class="absolute w-3 h-3 bg-white dark:bg-gray-800 rotate-45 border-r-2 border-b-2 border-blue-700 dark:border-blue-500 -bottom-1.5 {index === 0 ? 'left-[20%]' : 'left-1/2'} -ml-1.5"
|
|
104
|
-
></div>
|
|
105
|
-
|
|
106
|
-
<button
|
|
107
|
-
class="absolute top-2 right-2 p-1 rounded-full transition-colors text-gray-500 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-700"
|
|
108
|
-
onclick={closePerformer}
|
|
109
|
-
aria-label="Close"
|
|
110
|
-
>
|
|
111
|
-
<CloseOutline class="w-5 h-5" />
|
|
112
|
-
</button>
|
|
113
|
-
|
|
114
|
-
<p class="{typography.sm} leading-relaxed pr-6">
|
|
115
|
-
{profile?.biography || ''}
|
|
116
|
-
</p>
|
|
117
|
-
|
|
118
|
-
{#if profile?.instagram || profile?.twitter}
|
|
119
|
-
<div class="flex gap-2 items-center {typography.smMuted} mt-3 pt-3 border-t border-gray-200 dark:border-gray-600">
|
|
120
|
-
<span>Follow {firstName}:</span>
|
|
121
|
-
{#if profile?.instagram}
|
|
122
|
-
<a
|
|
123
|
-
href={profile.instagram}
|
|
124
|
-
target="_blank"
|
|
125
|
-
rel="noopener noreferrer"
|
|
126
|
-
class="text-blue-700 dark:text-blue-500 hover:opacity-70 transition-opacity"
|
|
127
|
-
aria-label="Instagram profile"
|
|
128
|
-
>
|
|
129
|
-
<LogoInstagram size={20} />
|
|
130
|
-
</a>
|
|
131
|
-
{/if}
|
|
132
|
-
{#if profile?.twitter}
|
|
133
|
-
<a
|
|
134
|
-
href={profile.twitter}
|
|
135
|
-
target="_blank"
|
|
136
|
-
rel="noopener noreferrer"
|
|
137
|
-
class="text-blue-700 dark:text-blue-500 hover:opacity-70 transition-opacity"
|
|
138
|
-
aria-label="Twitter profile"
|
|
139
|
-
>
|
|
140
|
-
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
|
|
141
|
-
<path d="M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z"/>
|
|
142
|
-
</svg>
|
|
143
|
-
</a>
|
|
144
|
-
{/if}
|
|
145
|
-
</div>
|
|
146
|
-
{/if}
|
|
147
|
-
</div>
|
|
148
|
-
{/if}
|
|
149
|
-
|
|
150
|
-
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
151
|
-
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
152
|
-
<div
|
|
153
|
-
class="rounded-lg flex flex-col gap-2 p-2 items-center w-24 cursor-pointer transition-all bg-white dark:bg-gray-800 border hover:shadow {activePerformer === performer.ID ? 'border-blue-700 dark:border-blue-500 shadow' : 'border-gray-200 dark:border-gray-600 hover:border-blue-700 dark:hover:border-blue-500'}"
|
|
154
|
-
onclick={() => togglePerformer(performer.ID)}
|
|
155
|
-
>
|
|
156
|
-
<img
|
|
157
|
-
src={performer.shouldBeHidden ? '' : profile?.profileImage ? getImageUrl(profile.profileImage) : ''}
|
|
158
|
-
alt={displayName || 'Performer'}
|
|
159
|
-
class="size-16 rounded object-cover {!profile?.profileImage || performer.shouldBeHidden ? 'bg-gray-50 dark:bg-gray-700' : ''}"
|
|
160
|
-
/>
|
|
161
|
-
<p class="{typography.xs} text-center leading-tight line-clamp-2">
|
|
162
|
-
{#if !performer.shouldBeHidden}
|
|
163
|
-
{displayName}
|
|
164
|
-
{/if}
|
|
165
|
-
</p>
|
|
166
|
-
</div>
|
|
167
|
-
</div>
|
|
168
|
-
{/each}
|
|
169
|
-
</div>
|
|
170
|
-
</div>
|
|
171
|
-
{/if}
|
|
172
|
-
</div>
|
|
1
|
+
<script>
|
|
2
|
+
import { CloseOutline, LogoInstagram } from '../../primitives/Icons';
|
|
3
|
+
import { typography } from '../../tokens/typography';
|
|
4
|
+
|
|
5
|
+
let {
|
|
6
|
+
performers = [],
|
|
7
|
+
ShowImage = '',
|
|
8
|
+
description = '',
|
|
9
|
+
showTitle = true,
|
|
10
|
+
title = "About the Show",
|
|
11
|
+
showReadMore = true,
|
|
12
|
+
getImageUrl = (url) => url,
|
|
13
|
+
} = $props();
|
|
14
|
+
|
|
15
|
+
let activePerformer = $state(null);
|
|
16
|
+
let characterLimit = 1500;
|
|
17
|
+
let showFullDescription = $state(false);
|
|
18
|
+
|
|
19
|
+
let validPerformers = $derived(performers.filter(performer => {
|
|
20
|
+
const isConfirmed = performer.acceptedState === 2;
|
|
21
|
+
const isNotHidden = !performer.shouldBeHidden;
|
|
22
|
+
const profile = performer.RosterPerformer?.User?.performerProfile;
|
|
23
|
+
const hasName = profile?.firstName || profile?.lastName || profile?.stageName;
|
|
24
|
+
return isConfirmed && isNotHidden && hasName;
|
|
25
|
+
}));
|
|
26
|
+
|
|
27
|
+
function togglePerformer(id) {
|
|
28
|
+
if (activePerformer === id) {
|
|
29
|
+
activePerformer = null;
|
|
30
|
+
} else {
|
|
31
|
+
activePerformer = id;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function closePerformer() {
|
|
36
|
+
activePerformer = null;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function toggleDescription() {
|
|
40
|
+
showFullDescription = !showFullDescription;
|
|
41
|
+
}
|
|
42
|
+
</script>
|
|
43
|
+
|
|
44
|
+
<div class="flex flex-col gap-3">
|
|
45
|
+
{#if showTitle}
|
|
46
|
+
<h2 class="{typography.h2} text-xl">{title}</h2>
|
|
47
|
+
{/if}
|
|
48
|
+
|
|
49
|
+
{#if ShowImage && description}
|
|
50
|
+
<div>
|
|
51
|
+
<img src={ShowImage} alt="" class="rounded-lg object-contain w-full bg-gray-50 dark:bg-gray-800" />
|
|
52
|
+
</div>
|
|
53
|
+
{/if}
|
|
54
|
+
|
|
55
|
+
{#if description}
|
|
56
|
+
{#if showFullDescription || description.length <= characterLimit || !showReadMore}
|
|
57
|
+
<p class={`${typography.sm} leading-relaxed whitespace-pre-line`}>{description}</p>
|
|
58
|
+
{#if showReadMore && description.length > characterLimit}
|
|
59
|
+
<button
|
|
60
|
+
onclick={toggleDescription}
|
|
61
|
+
class={`${typography.label} text-left hover:underline text-blue-700 dark:text-blue-500`}
|
|
62
|
+
>
|
|
63
|
+
Show less
|
|
64
|
+
</button>
|
|
65
|
+
{/if}
|
|
66
|
+
{:else}
|
|
67
|
+
<p class={`${typography.sm} leading-relaxed whitespace-pre-line`}>
|
|
68
|
+
{description.slice(0, characterLimit)}...
|
|
69
|
+
</p>
|
|
70
|
+
<button
|
|
71
|
+
onclick={toggleDescription}
|
|
72
|
+
class={`${typography.label} text-left hover:underline text-blue-700 dark:text-blue-500`}
|
|
73
|
+
>
|
|
74
|
+
Show more
|
|
75
|
+
</button>
|
|
76
|
+
{/if}
|
|
77
|
+
{/if}
|
|
78
|
+
|
|
79
|
+
{#if validPerformers.length > 0}
|
|
80
|
+
<div class="py-2">
|
|
81
|
+
{#if activePerformer !== null}
|
|
82
|
+
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
83
|
+
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
84
|
+
<div class="fixed inset-0 z-40" onclick={closePerformer}></div>
|
|
85
|
+
{/if}
|
|
86
|
+
|
|
87
|
+
<div class="flex flex-wrap justify-start gap-4">
|
|
88
|
+
{#each validPerformers as performer, index}
|
|
89
|
+
{@const profile = performer.RosterPerformer?.User?.performerProfile}
|
|
90
|
+
{@const displayName = profile?.useStageName && profile?.stageName
|
|
91
|
+
? profile.stageName
|
|
92
|
+
: `${profile?.firstName || ''} ${profile?.lastName || ''}`.trim()}
|
|
93
|
+
{@const firstName = profile?.firstName || displayName.split(' ')[0] || displayName}
|
|
94
|
+
<div class="relative">
|
|
95
|
+
{#if activePerformer === performer.ID && !performer.shouldBeHidden}
|
|
96
|
+
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
97
|
+
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
98
|
+
<div
|
|
99
|
+
class="w-72 sm:w-80 absolute bottom-full mb-2.5 rounded-lg p-4 z-50 shadow-xl transition-all duration-300 bg-white dark:bg-gray-800 border-2 border-blue-700 dark:border-blue-500 {index === 0 ? 'left-[190%]' : 'left-1/2 -translate-x-1/2'}"
|
|
100
|
+
onclick={(e) => e.stopPropagation()}
|
|
101
|
+
>
|
|
102
|
+
<div
|
|
103
|
+
class="absolute w-3 h-3 bg-white dark:bg-gray-800 rotate-45 border-r-2 border-b-2 border-blue-700 dark:border-blue-500 -bottom-1.5 {index === 0 ? 'left-[20%]' : 'left-1/2'} -ml-1.5"
|
|
104
|
+
></div>
|
|
105
|
+
|
|
106
|
+
<button
|
|
107
|
+
class="absolute top-2 right-2 p-1 rounded-full transition-colors text-gray-500 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-700"
|
|
108
|
+
onclick={closePerformer}
|
|
109
|
+
aria-label="Close"
|
|
110
|
+
>
|
|
111
|
+
<CloseOutline class="w-5 h-5" />
|
|
112
|
+
</button>
|
|
113
|
+
|
|
114
|
+
<p class="{typography.sm} leading-relaxed pr-6">
|
|
115
|
+
{profile?.biography || ''}
|
|
116
|
+
</p>
|
|
117
|
+
|
|
118
|
+
{#if profile?.instagram || profile?.twitter}
|
|
119
|
+
<div class="flex gap-2 items-center {typography.smMuted} mt-3 pt-3 border-t border-gray-200 dark:border-gray-600">
|
|
120
|
+
<span>Follow {firstName}:</span>
|
|
121
|
+
{#if profile?.instagram}
|
|
122
|
+
<a
|
|
123
|
+
href={profile.instagram}
|
|
124
|
+
target="_blank"
|
|
125
|
+
rel="noopener noreferrer"
|
|
126
|
+
class="text-blue-700 dark:text-blue-500 hover:opacity-70 transition-opacity"
|
|
127
|
+
aria-label="Instagram profile"
|
|
128
|
+
>
|
|
129
|
+
<LogoInstagram size={20} />
|
|
130
|
+
</a>
|
|
131
|
+
{/if}
|
|
132
|
+
{#if profile?.twitter}
|
|
133
|
+
<a
|
|
134
|
+
href={profile.twitter}
|
|
135
|
+
target="_blank"
|
|
136
|
+
rel="noopener noreferrer"
|
|
137
|
+
class="text-blue-700 dark:text-blue-500 hover:opacity-70 transition-opacity"
|
|
138
|
+
aria-label="Twitter profile"
|
|
139
|
+
>
|
|
140
|
+
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
|
|
141
|
+
<path d="M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z"/>
|
|
142
|
+
</svg>
|
|
143
|
+
</a>
|
|
144
|
+
{/if}
|
|
145
|
+
</div>
|
|
146
|
+
{/if}
|
|
147
|
+
</div>
|
|
148
|
+
{/if}
|
|
149
|
+
|
|
150
|
+
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
151
|
+
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
152
|
+
<div
|
|
153
|
+
class="rounded-lg flex flex-col gap-2 p-2 items-center w-24 cursor-pointer transition-all bg-white dark:bg-gray-800 border hover:shadow {activePerformer === performer.ID ? 'border-blue-700 dark:border-blue-500 shadow' : 'border-gray-200 dark:border-gray-600 hover:border-blue-700 dark:hover:border-blue-500'}"
|
|
154
|
+
onclick={() => togglePerformer(performer.ID)}
|
|
155
|
+
>
|
|
156
|
+
<img
|
|
157
|
+
src={performer.shouldBeHidden ? '' : profile?.profileImage ? getImageUrl(profile.profileImage) : ''}
|
|
158
|
+
alt={displayName || 'Performer'}
|
|
159
|
+
class="size-16 rounded object-cover {!profile?.profileImage || performer.shouldBeHidden ? 'bg-gray-50 dark:bg-gray-700' : ''}"
|
|
160
|
+
/>
|
|
161
|
+
<p class="{typography.xs} text-center leading-tight line-clamp-2">
|
|
162
|
+
{#if !performer.shouldBeHidden}
|
|
163
|
+
{displayName}
|
|
164
|
+
{/if}
|
|
165
|
+
</p>
|
|
166
|
+
</div>
|
|
167
|
+
</div>
|
|
168
|
+
{/each}
|
|
169
|
+
</div>
|
|
170
|
+
</div>
|
|
171
|
+
{/if}
|
|
172
|
+
</div>
|